diff --git a/Device3Dfx/3dfx_driver.c b/Device3Dfx/3dfx_driver.c deleted file mode 100644 index 90bd855..0000000 --- a/Device3Dfx/3dfx_driver.c +++ /dev/null @@ -1,804 +0,0 @@ -/* - - /dev/3dfx device for 2.x kernels with MTRR settings enabled. - - Compile with : - - gcc -O2 -DMODULE -D__KERNEL__ -I/usr/src/linux/include -pipe - -fno-strength-reduce -malign-loops=2 -malign-jumps=2 - -malign-functions=2 -c -o 3dfx.o 3dfx_driver.c - - Add -D__SMP__ if you're running of an multi-processor system. - Add -DHAVE_MTRR if you have and want MTRR settings. - Add -g -Wall -Wstrict-prototypes -DDEBUG, if you are debugging. - - Original by Daryll Straus. - Port to 2.1 kernel by Jon Taylor. - setmtrr_3dfx() added by Jens Axboe. - Combining 2.0 and 2.1/2.2 kernels into one rpm, - resetmtrr_3df(), and using correct pci calls for - 2.1/2.2 kernels by Carlo Wood. - - ChangeLog - - 2000/02/04 Joseph Kain - - * Updated Carlo Woord's email address. - - 1999/12/22 Joseph Kain - - * 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 - - * Made cards static to remove conflict with hisax ISDN driver. - - 1998/10/30 Carlo Wood - - * 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 - - * Fixed compile bugs related to 2.0 kernels. - - 1998/10/21 Carlo Wood - - * `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 . - - 1998/10/20 Carlo Wood - - * 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 - - * 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 - - * 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(). - - */ - -/* Include this first as it defines things that affect the kernel headers */ -#include "kinfo.h" -#include - -#ifndef KERNEL_VERSION -#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c)) -#endif - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 1, 0) -#define KERNEL_VER_2_1 -#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 1, 115) -/* It might work with smaller kernels, but I never tested that */ -#error "Upgrade your kernel" -#endif -#else -#define copy_to_user memcpy_tofs -#define copy_from_user memcpy_fromfs -#define pci_present pcibios_present -#endif - -#ifdef MODULE -#include -#include -#if defined(CONFIG_MODVERSIONS) && !defined(MODVERSIONS) -#define MODVERSIONS -#endif -#ifdef MODVERSIONS -#include -#endif -#else -#define MOD_INC_USE_COUNT -#define MOD_DEC_USE_COUNT -#endif - -#include -#include -#include -#include -#include -#ifndef KERNEL_VER_2_1 -#include -#endif -#include -#include -#include -#include -#include - -#ifdef KERNEL_VER_2_1 -#include -#endif -#ifdef HAVE_MTRR -#ifdef KERNEL_VER_2_1 -#include -#else -extern int mtrr_add(unsigned long base, unsigned long size, unsigned int type, char increment); -extern int mtrr_del(int reg, unsigned long base, unsigned long size); -#define MTRR_TYPE_UNCACHABLE 0 -#define MTRR_TYPE_WRCOMB 1 -#endif -#endif - -#define MAJOR_3DFX 107 -#define DEVICE_VOODOO 0 - -#define PCI_VENDOR_ID_LINUX 0x0 -#define PCI_DEVICE_ID_LINUX 0x2 -#define PCI_COMMAND_LINUX 0x4 -#define PCI_REVISION_ID_LINUX 0x8 -#define PCI_BASE_ADDRESS_0_LINUX 0x10 -#define PCI_BASE_ADDRESS_1_LINUX 0x14 -#define SST1_PCI_SPECIAL1_LINUX 0x40 -#define SST1_PCI_SPECIAL2_LINUX 0x44 -#define SST1_PCI_SPECIAL3_LINUX 0x48 -#define SST1_PCI_SPECIAL4_LINUX 0x54 - -#define VGA_INPUT_STATUS_1C 0x3DA -#define VGA_MISC_OUTPUT_READ 0x3cc -#define VGA_MISC_OUTPUT_WRITE 0x3c2 -#define SC_INDEX 0x3c4 -#define SC_DATA 0x3c5 - -#ifndef PCI_VENDOR_ID_3DFX -#define PCI_VENDOR_ID_3DFX 0x121a -#endif - -#ifndef PCI_VENDOR_ID_ALLIANCE -#define PCI_VENDOR_ID_ALLIANCE 0x1142 -#endif - -#ifndef PCI_DEVICE_ID_3DFX_VOODOO2 -#define PCI_DEVICE_ID_3DFX_VOODOO2 2 -#endif - -#ifndef PCI_DEVICE_ID_ALLIANCE_AT3D -#define PCI_DEVICE_ID_ALLIANCE_AT3D 0x643d -#endif - -#ifndef PCI_DEVICE_ID_3DFX_BANSHEE -#define PCI_DEVICE_ID_3DFX_BANSHEE 3 -#endif - -#ifndef PCI_DEVICE_ID_3DFX_VOODOO3 -#define PCI_DEVICE_ID_3DFX_VOODOO3 5 -#endif - -#ifdef DEBUG -#define DEBUGMSG(x) printk x -#else -#define DEBUGMSG(x) -#endif - -/* This macro is for accessing vma->vm_offset or vma->vm_pgoff depending - * on kernel version */ -#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 3, 14) -#define VM_OFFSET(vma) (vma->vm_offset) -#else -#define VM_OFFSET(vma) (vma->vm_pgoff << PAGE_SHIFT) -#endif - -struct pioData_t { - short port; - short size; - int device; - void *value; -}; - -struct cardInfo_t { - int vendor; - int type; - int addr0; - int addr1; - unsigned char bus; - unsigned char dev; - struct file *curFile; -#ifdef HAVE_MTRR - int mtrr_buf; - int mtrr_ctl; -#endif -}; - -typedef struct pioData_t pioData; -typedef struct cardInfo_t cardInfo; - -#ifdef MODULE -void cleanup_module(void); -#endif - -#define MAXCARDS 16 - -static cardInfo cards[MAXCARDS]; -static int numCards = 0; - -static void findCardType(int vendor, int device) -{ -#ifdef KERNEL_VER_2_1 - struct pci_dev *dev = NULL; - while (numCards < MAXCARDS && (dev = pci_find_device(vendor, device, dev))) { - pci_read_config_dword(dev, PCI_BASE_ADDRESS_0, &cards[numCards].addr0); - pci_read_config_dword(dev, PCI_BASE_ADDRESS_1, &cards[numCards].addr1); - cards[numCards].bus = dev->bus->number; - cards[numCards].dev = dev->devfn; -#else - int i; - for (i = 0; numCards < MAXCARDS; i++) { - if (pcibios_find_device(vendor, device, i, &cards[numCards].bus, &cards[numCards].dev)) - return; - pcibios_read_config_dword(cards[numCards].bus, cards[numCards].dev, PCI_BASE_ADDRESS_0, &cards[numCards].addr0); - pcibios_read_config_dword(cards[numCards].bus, cards[numCards].dev, PCI_BASE_ADDRESS_1, &cards[numCards].addr1); -#endif - - cards[numCards].addr0 &= ~0xF; - cards[numCards].addr1 &= ~0xF; - cards[numCards].vendor = vendor; - cards[numCards].type = device; - cards[numCards].curFile = 0; - - DEBUGMSG(("3dfx: board vendor %d type %d located at %x/%x bus %d dev %d\n", - vendor, device, cards[numCards].addr0, cards[numCards].addr1, cards[numCards].bus, cards[numCards].dev)); - - ++numCards; - } -} - -static int findCards(void) -{ - if (!pci_present()) - return 0; - numCards = 0; - findCardType(PCI_VENDOR_ID_3DFX, PCI_DEVICE_ID_3DFX_VOODOO); - findCardType(PCI_VENDOR_ID_3DFX, PCI_DEVICE_ID_3DFX_VOODOO2); - findCardType(PCI_VENDOR_ID_ALLIANCE, 0x643d); - findCardType(PCI_VENDOR_ID_3DFX, PCI_DEVICE_ID_3DFX_BANSHEE); - findCardType(PCI_VENDOR_ID_3DFX, PCI_DEVICE_ID_3DFX_VOODOO3); - return numCards; -} - -static int open_3dfx(struct inode *inode, struct file *file) -{ - DEBUGMSG(("3dfx: Entering open_3dfx\n")); - if (!numCards) { - printk("3dfx: No 3Dfx cards found\n"); - return -ENODEV; - } - MOD_INC_USE_COUNT; - return 0; -} - -#ifdef KERNEL_VER_2_1 -static int release_3dfx(struct inode *inode, struct file *file) -#else -static void release_3dfx(struct inode *inode, struct file *file) -#endif -{ - int i; - - DEBUGMSG(("3dfx: Entering release_3dfx\n")); - for (i = 0; i < numCards; ++i) - if (cards[i].curFile == file) - cards[i].curFile = 0; - MOD_DEC_USE_COUNT; - -#ifdef KERNEL_VER_2_1 - return 0; -#endif -} - -#ifdef KERNEL_VER_2_1 -static int mmap_3dfx(struct file *file, struct vm_area_struct *vma) -#else -static int mmap_3dfx(struct inode *inode, struct file *file, struct vm_area_struct *vma) -#endif -{ - size_t len; - int i; - - DEBUGMSG(("3dfx: Entering mmap_3dfx\n")); - for (i = 0; i < numCards; ++i) { - if ((cards[i].addr0 == VM_OFFSET(vma)) || - (cards[i].addr1 == VM_OFFSET(vma))) - break; - } - if (i == numCards) { - DEBUGMSG(("3dfx: Couldn't match address %lx to a card\n", - VM_OFFSET(vma))); - return -EPERM; - } - /* This one is a special case, the macro doesn't help */ -#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 3, 14) - if ((vma->vm_offset) & ~PAGE_MASK) { - DEBUGMSG(("3dfx: Map request not page aligned\n")); - return -ENXIO; - } -#else - if ((vma->vm_pgoff) & ~PAGE_MASK) { - DEBUGMSG(("3dfx: Map request not page aligned\n")); - return -ENXIO; - } -#endif - len = vma->vm_end - vma->vm_start; - if ((len < 0) || (len > 0x2000000)) { - DEBUGMSG(("3dfx: Invalid mapping size requested\n")); - return -EINVAL; - } -#if defined(__i386__) - pgprot_val(vma->vm_page_prot) |= _PAGE_PCD; -#endif - if (remap_page_range(vma->vm_start, VM_OFFSET(vma), len, - vma->vm_page_prot)) { - DEBUGMSG(("3dfx: Page remap failed\n")); - return -EAGAIN; - } -#ifndef KERNEL_VER_2_1 - vma->vm_inode = inode; - inode->i_count++; -#endif - return 0; -} - -static int doQueryBoards(void) -{ - return numCards; -} - -static int doQueryFetch(pioData *desc) -{ - int retval; - char retchar; - short retword; - int retlong; - - if (desc->device < 0 || desc->device >= numCards) - return -EINVAL; - if ((retval = verify_area(VERIFY_WRITE, desc->value, desc->size))) - return retval; - switch (desc->port) { - case PCI_VENDOR_ID_LINUX: - if (desc->size != 2) - return -EINVAL; - copy_to_user(desc->value, &cards[desc->device].vendor, desc->size); - return 0; - case PCI_DEVICE_ID_LINUX: - if (desc->size != 2) - return -EINVAL; - copy_to_user(desc->value, &cards[desc->device].type, desc->size); - return 0; - case PCI_BASE_ADDRESS_0_LINUX: - if (desc->size != 4) - return -EINVAL; - copy_to_user(desc->value, &cards[desc->device].addr0, desc->size); - return 0; - case PCI_BASE_ADDRESS_1_LINUX: - if (desc->size != 4) - return -EINVAL; - copy_to_user(desc->value, &cards[desc->device].addr1, desc->size); - return 0; - case SST1_PCI_SPECIAL1_LINUX: - if (desc->size != 4) - return -EINVAL; - break; - case PCI_REVISION_ID: - if (desc->size != 1) - return -EINVAL; - break; - case SST1_PCI_SPECIAL4_LINUX: - if (desc->size != 4) - return -EINVAL; - break; - default: - return -EINVAL; - } - switch (desc->size) { - case 1: - pcibios_read_config_byte(cards[desc->device].bus, cards[desc->device].dev, desc->port, &retchar); - copy_to_user(desc->value, &retchar, 1); - break; - case 2: - pcibios_read_config_word(cards[desc->device].bus, cards[desc->device].dev, desc->port, &retword); - copy_to_user(desc->value, &retword, 2); - break; - case 4: - pcibios_read_config_dword(cards[desc->device].bus, cards[desc->device].dev, desc->port, &retlong); - copy_to_user(desc->value, &retlong, 4); - break; - default: - return -EINVAL; - } - return 0; -} - -static int doQueryUpdate(pioData *desc) -{ - int retval; - int preval; - int mask; - char retchar; - short retword; - int retlong; - - if (desc->device < 0 || desc->device >= numCards) - return -EINVAL; - if ((retval = verify_area(VERIFY_WRITE, desc->value, desc->size))) - return retval; - switch (desc->port) { - case PCI_COMMAND_LINUX: - if (desc->size != 2) - return -EINVAL; - break; - case SST1_PCI_SPECIAL1_LINUX: - if (desc->size != 4) - return -EINVAL; - break; - case SST1_PCI_SPECIAL2_LINUX: - if (desc->size != 4) - return -EINVAL; - break; - case SST1_PCI_SPECIAL3_LINUX: - if (desc->size != 4) - return -EINVAL; - break; - case SST1_PCI_SPECIAL4_LINUX: - if (desc->size != 4) - return -EINVAL; - break; - default: - return -EINVAL; - } - pcibios_read_config_dword(cards[desc->device].bus, cards[desc->device].dev, desc->port & ~0x3, &retval); - switch (desc->size) { - case 1: - copy_from_user(&retchar, desc->value, 1); - preval = retchar << (8 * (desc->port & 0x3)); - mask = 0xFF << (8 * (desc->port & 0x3)); - break; - case 2: - copy_from_user(&retword, desc->value, 2); - preval = retword << (8 * (desc->port & 0x3)); - mask = 0xFFFF << (8 * (desc->port & 0x3)); - break; - case 4: - copy_from_user(&retlong, desc->value, 4); - preval = retlong; - mask = ~0; - break; - default: - return -EINVAL; - } - retval = (retval & ~mask) | preval; - pcibios_write_config_dword(cards[desc->device].bus, cards[desc->device].dev, desc->port, retval); - return 0; -} - -static int doQuery(unsigned int cmd, unsigned long arg) -{ - pioData desc; - int retval; - - if (_IOC_NR(cmd) == 2) - return doQueryBoards(); - if ((retval = verify_area(VERIFY_READ, (void *)arg, sizeof(pioData)))) - return retval; - copy_from_user(&desc, (void *)arg, sizeof(pioData)); - if (_IOC_NR(cmd) == 3) - return doQueryFetch(&desc); - if (_IOC_NR(cmd) == 4) - return doQueryUpdate(&desc); - return -EINVAL; -} - -static int doPIORead(pioData *desc) -{ - int retval; - char retchar; - - if ((retval = verify_area(VERIFY_WRITE, desc->value, desc->size))) - return retval; - switch (desc->port) { - case VGA_INPUT_STATUS_1C: - break; - case SC_INDEX: - break; - case SC_DATA: - break; - case VGA_MISC_OUTPUT_READ: - break; - default: - return -EPERM; - } - - if (desc->size != 1) - return -EINVAL; - - retchar = inb(desc->port); - copy_to_user(desc->value, &retchar, sizeof(char)); - - return 0; -} - -static int doPIOWrite(pioData *desc) -{ - int retval; - char retchar; - - if ((retval = verify_area(VERIFY_READ, desc->value, desc->size))) - return retval; - - switch (desc->port) { - case SC_INDEX: - break; - case SC_DATA: - break; - case VGA_MISC_OUTPUT_WRITE: - break; - default: - return -EPERM; - } - - if (desc->size != 1) - return -EINVAL; - - copy_from_user(&retchar, desc->value, sizeof(char)); - outb(retchar, desc->port); - - return 0; -} - -static int doPIO(unsigned int cmd, unsigned long arg) -{ - pioData desc; - int retval; - - if ((retval = verify_area(VERIFY_READ, (void *)arg, sizeof(pioData)))) - return retval; - copy_from_user(&desc, (void *)arg, sizeof(pioData)); - if (_IOC_DIR(cmd) == _IOC_READ) - return doPIORead(&desc); - if (_IOC_DIR(cmd) == _IOC_WRITE) - return doPIOWrite(&desc); - - return -EINVAL; -} - -static int ioctl_3dfx(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) -{ - DEBUGMSG(("3dfx: Entering ioctl_3dfx, inode %p file %p cmd %x arg %lx\n", inode, file, cmd, arg)); - switch (_IOC_TYPE(cmd)) { - case '3': - return doQuery(cmd, arg); - case 0: - return doPIO(cmd, arg); - default: - DEBUGMSG(("3dfx: Unknown 3dfx request made\n")); - return -EINVAL; - } -} - -#ifdef HAVE_MTRR -int setmtrr_3dfx(void) -{ - int i = 0, retval = -2; - unsigned char dlc; - - /* First do a bios fixup if this system has a 82441FX chipset */ -#ifdef KERNEL_VER_2_1 - struct pci_dev *dev = NULL; - if ((dev = pci_find_device(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371SB_0, dev))) { - pci_read_config_byte(dev, 0x82, &dlc); - if (!(dlc & 1 << 1)) { - dlc |= 1 << 1; - pci_write_config_byte(dev, 0x82, dlc); - printk("3dfx: PIIX3: Enabling Passive Release\n"); - } - } -#else - unsigned char bus, dev_fn; - if (!pcibios_find_device(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371SB_0, i, &bus, &dev_fn)) { - pcibios_read_config_byte(bus, dev_fn, 0x82, &dlc); - if (!(dlc & 1 << 1)) { - dlc |= 1 << 1; - pcibios_write_config_byte(bus, dev_fn, 0x82, dlc); - printk("3dfx: PIIX3: Enabling Passive Release\n"); - } - } -#endif - - /* Set up the mtrr's */ - if (numCards == 0) - return -EIO; - for (i = 0; i < numCards; i++) { - if ((cards[i].vendor != PCI_VENDOR_ID_3DFX) || - (cards[i].type>PCI_DEVICE_ID_3DFX_VOODOO3)) - { - cards[i].mtrr_buf = -1; /* Used as flag in resetmtrr_3dfx() */ - continue; - } - switch (cards[i].type) { - case PCI_DEVICE_ID_3DFX_VOODOO: - case PCI_DEVICE_ID_3DFX_VOODOO2: - /* Frame buffer to write combining */ - retval = cards[i].mtrr_buf = mtrr_add(cards[i].addr0, 0x400000, MTRR_TYPE_WRCOMB, 1); - if (retval>=0) { - retval = cards[i].mtrr_ctl = mtrr_add(cards[i].addr0, 0x1000, MTRR_TYPE_UNCACHABLE, 1); - if (retval<0) { - mtrr_del(cards[i].mtrr_buf, 0, 0); - cards[i].mtrr_buf=-1; - } - } - if (retval < 0) { - printk("3dfx: Could not set MTRR for Voodoo card\n"); - /* Can still run */ - return 0; - } - break; - case PCI_DEVICE_ID_3DFX_BANSHEE: - case PCI_DEVICE_ID_3DFX_VOODOO3: - retval = cards[i].mtrr_buf = mtrr_add(cards[i].addr1, 0x1000000, MTRR_TYPE_WRCOMB, 1); - if (retval < 0) { - printk("3dfx: Could not set MTRR for Voodoo card\n"); - /* Can still run */ - return 0; - } - cards[i].mtrr_ctl=-1; - break; - default: - /* We should never hit this */ - } - } - if (retval == -2) - { - DEBUGMSG(("3dfx: Could not set MTRR for this graphics card\n")); - retval = 0; /* Can still run */ - } -#ifdef DEBUG - else if (retval >= 0) - DEBUGMSG(("3dfx: Successfully set MTRR, mtrr register: %d\n", retval)); -#endif - - return retval; -} - -int resetmtrr_3dfx(void) -{ - int i, ret, retval = 0; - for (i = 0; i < numCards; i++) { - if (cards[i].mtrr_buf >= 0) { - ret = mtrr_del(cards[i].mtrr_buf, 0, 0); - if (ret < 0) - retval = ret; - cards[i].mtrr_buf = -1; - if (cards[i].mtrr_ctl >= 0) { - ret = mtrr_del(cards[i].mtrr_ctl, 0, 0); - if (ret < 0) - retval = ret; - cards[i].mtrr_ctl = -1; - } - } - } - return retval; -} - -#endif /* HAVE_MTRR */ - -static struct file_operations fops_3dfx = { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 4, 0) - owner: THIS_MODULE, -#endif - ioctl: ioctl_3dfx, /* ioctl */ - mmap: mmap_3dfx, /* mmap */ - open: open_3dfx, /* open */ - release: release_3dfx, /* release */ -}; - -#ifdef MODULE -int init_module(void) -{ - int ret; - DEBUGMSG(("3dfx: Entering init_module()\n")); - - if ((ret = register_chrdev(MAJOR_3DFX, "3dfx", &fops_3dfx)) < 0) { - printk("3dfx: Unable to register character device with major %d\n", MAJOR_3DFX); - return ret; - } - DEBUGMSG(("3dfx: Successfully registered device 3dfx\n")); - findCards(); - -#ifdef HAVE_MTRR - ret = setmtrr_3dfx(); - if (ret < 0) - { - DEBUGMSG(("setmtrr_3dfx() failed, returned %d\n", ret)); - unregister_chrdev(MAJOR_3DFX, "3dfx"); - return ret; - } -#endif - - return 0; -} - -void cleanup_module(void) -{ - DEBUGMSG(("3dfx: Entering cleanup_module\n")); - -#ifdef HAVE_MTRR - resetmtrr_3dfx(); -#endif - if (unregister_chrdev(MAJOR_3DFX, "3dfx")) - { - DEBUGMSG(("3dfx: unregister_chrdev failed\n")); - return; - } -} -#else /* !MODULE */ - -long init_3dfx(long mem_start, long mem_end) -{ - if (register_chrdev(MAJOR_3DFX, "3dfx", &fops_3dfx)) - { - DEBUGMSG(("3dfx: Unable to register_chrdev with major %d\n", MAJOR_3DFX)); - return 0; - } - findCards(); - - return mem_start; -} -#endif /* !MODULE */ - - -#if defined(DEBUG) && defined(KERNEL_VER_2_1) -/* - * Kludge to get rid of: - * ./3dfx.o: unresolved symbol inb - * ./3dfx.o: unresolved symbol inl - * ./3dfx.o: unresolved symbol inw - * ./3dfx.o: unresolved symbol outb - * ./3dfx.o: unresolved symbol outl - * ./3dfx.o: unresolved symbol outw - * when compiling this module with -g during debugging. - */ -#undef __KERNEL__ -#define extern -#undef _ASM_IO_H -#include -/* - * And this is copied from asm/uaccess.h - * in order to get rid of - * ./3dfx.o: unresolved symbol verify_area - * when compiling this module with -g during debugging. - */ -inline int verify_area(int type, const void * addr, unsigned long size) -{ - return access_ok(type,addr,size) ? 0 : -EFAULT; -} - -int a_last_dummy_function(int a) -{ - return a; -} -#endif diff --git a/Device3Dfx/Device3Dfx.spec b/Device3Dfx/Device3Dfx.spec deleted file mode 100644 index 14bbf56..0000000 --- a/Device3Dfx/Device3Dfx.spec +++ /dev/null @@ -1,160 +0,0 @@ -Summary: Device driver for 3Dfx boards for 2.x 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 - Release 2.3-5 -- Check both the kernel and the processor for MTRR support before enabling. - -* Wed Jan 04 2000 Joseph Kain - 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 - 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 - 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 - 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 - - 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 - - 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 - - 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 - - Release 2.5-2: - -- Fixed for 2.2.3 kernels because of an mmap() update - -* Fri Oct 30 1998 Carlo Wood - - 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 - - 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 - - Release 1.2-4: - -- Upped source to Dev3Dfx-2.3.tar.gz - -* Mon Oct 19 1998 Carlo Wood - - 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 - - Release 1.2-2: - -- Added OPT_CFLAGS stuff. - -* Sun Oct 18 1998 Carlo Wood - - 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 both -2.0 and 2.1/2.2 kernels and set the MTRR settings correctly. It should -also work with SMP kernels (2.1/2.2). - -%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 - diff --git a/Device3Dfx/Makefile b/Device3Dfx/Makefile deleted file mode 100644 index d08c283..0000000 --- a/Device3Dfx/Makefile +++ /dev/null @@ -1,127 +0,0 @@ -############################################################################### -# Makefile by Carlo Wood (and others) - -ifeq ($(OPT_CFLAGS),) - -# 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) -OPT_CFLAGS = -O2 -m486 -fomit-frame-pointer \ - -fno-strength-reduce \ - -malign-loops=2 -malign-jumps=2 -malign-functions=2 -endif - -ifeq ($(ARCH), alpha) -OPT_CFLAGS = -O2 -mno-fp-regs -mcpu=ev4 \ - -ffixed-8 \ - -Wa,-mev6 \ - -fomit-frame-pointer -fno-strict-aliasing -endif - -endif # ifeq ($OPT_CFLAGS),) - -CFLAGS := -DMODULE -D__KERNEL__ -I/usr/src/linux/include $(OPT_CFLAGS) - -############################################################################### -# You should never need to change anything below. - -all: sanity 3dfx.o - -# Sanity checks -sanity: - @( \ - if [ ! -e /usr/src/linux ]; then \ - echo "Expect kernel source at location /usr/src/linux"; \ - echo "Sym.link /usr/src/linux -> where you have your sources"; \ - exit -1; \ - fi; \ - if [ ! -r /usr/src/linux/include ]; then \ - echo "Expect readable headers in /usr/src/linux/include"; \ - exit -1; \ - fi; \ - if [ ! -r /usr/src/linux/include/linux/version.h ]; then \ - echo "Missing /usr/src/linux/include/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; \ - ) - -kinfo: kinfo.c - $(CC) -o kinfo kinfo.c - -kinfo.h: kinfo - ./kinfo - -ifneq ($(KERNEL_VERSION_MAJOR),2.0) - -############################################################################### -# kernel 2.1+ - -3dfx.o: kinfo.h 3dfx_driver.c Makefile - $(CC) $(CFLAGS) -c -o $@ 3dfx_driver.c - -else - -############################################################################### -# Kernel 2.0 - -OBJS = 3dfx_driver.o -ifneq ($(HAVE_MTRR),) -OBJS += mtrrs.o -endif - -3dfx.o: kinfo.h $(OBJS) Makefile - $(LD) -r -o $@ $(OBJS) - -endif - -############################################################################### - -install: - mkdir -p /lib/modules/$(shell ./kinfo --UTS)/misc - cp 3dfx.o /lib/modules/$(shell ./kinfo --UTS)/misc/3dfx.o - @( \ - if [ -e /lib/modules/$(shell ./kinfo --UTS)/modules.dep ]; then \ - indep=`grep 'misc/3dfx.o:' /lib/modules/$(shell ./kinfo --UTS)/modules.dep`; \ - if [ -z "$$indep" ]; then \ - echo "/lib/modules/$(shell ./kinfo --UTS)/misc/3dfx.o:" >> /lib/modules/$(shell ./kinfo --UTS)/modules.dep; \ - echo "" >> /lib/modules/$(shell ./kinfo --UTS)/modules.dep; \ - fi; \ - fi; \ - if [ ! -c /dev/3dfx ]; then \ - mknod /dev/3dfx c 107 0; \ - chmod go+w /dev/3dfx; \ - fi; \ - if [ "$(RPM_INSTALL)" = "1" ]; then \ - echo "/lib/modules/$(shell ./kinfo --UTS)/misc/3dfx.o"; \ - else \ - inconf=`grep 'alias char-major-107 3dfx' /etc/conf.modules`; \ - if [ -z "$$inconf" ]; then \ - echo "alias char-major-107 3dfx" >> /etc/conf.modules; \ - fi; \ - fi; \ - ) - -############################################################################### -# This is for debugging purposes by the developers: - -clean: - rm -f *.o *.s kinfo kinfo.h - -3dfx.s: 3dfx_driver.c Makefile - $(CC) $(CFLAGS) -S -c 3dfx_driver.c - -tar: - tar czf ../../SOURCES/Dev3Dfx-2.5.tar.gz 3dfx_driver.c mtrrs.c Makefile - - -debug: - make OPT_CFLAGS="-g -Wall -Wstrict-prototypes -DDEBUG" - diff --git a/Device3Dfx/kinfo.c b/Device3Dfx/kinfo.c deleted file mode 100644 index 908c65c..0000000 --- a/Device3Dfx/kinfo.c +++ /dev/null @@ -1,67 +0,0 @@ -/* - kinfo.c: A small program that includes several kernel heades - and builds a header defining options for 3dfx_driver.c. - - 1999/12/22 Joseph Kain - - * Initial version -*/ - -#include - -/* These include files will bring in the information we need */ -#include -#include - - -int -main (int argc, char **argv) -{ - /* Here is the strategy. The old Makefile would have grepped the kernel - * headers and put these defines on the command line. Now we include - * the kernel headers and extract the information. Then we create a - * new header with all of the options we need. */ - - if (argc == 1) - { - FILE *f = fopen ("kinfo.h", "w"); - FILE *p = NULL; - int result; - char temp[1000]; - -#ifdef CONFIG_MTRR - /* It is not enough to just check if the kernel supports MTRRs, if the - * processor doesn't have MTRRs then its possible (and likely) that - * the kernel was still compiled with MTRR support. So we also have to - * check the processor has MTRRs. */ - - result = system ("grep mtrr /proc/cpuinfo > /dev/null"); - - /* See if grep found anything */ - if (result == 0) /* Grep reported a match */ - { - fprintf (f, "#define HAVE_MTRR\n"); - } - -#endif - -#ifdef CONFIG_SMP - fprintf (f, "#define __SMP__\n"); -#endif - -#ifdef CONFIG_MODVERSIONS - fprintf (f, "#define MODVERSIONS\n"); -#endif - - fclose (f); - } - else - { - if (strcmp (argv[1], "--UTS") == 0) - { - printf ("%s", UTS_RELEASE); - } - } -} - - diff --git a/Device3Dfx/mtrrs.c b/Device3Dfx/mtrrs.c deleted file mode 100644 index 3ffa1bd..0000000 --- a/Device3Dfx/mtrrs.c +++ /dev/null @@ -1,935 +0,0 @@ -/* Generic MTRR (Memory Type Range Register) driver. - - Copyright (C) 1997-1998 Richard Gooch - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the Free - Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - Richard Gooch may be reached by email at rgooch@atnf.csiro.au - The postal address is: - Richard Gooch, c/o ATNF, P. O. Box 76, Epping, N.S.W., 2121, Australia. - - Source: "Pentium Pro Family Developer's Manual, Volume 3: - Operating System Writer's Guide" (Intel document number 242692), - section 11.11.7 - - ChangeLog - - Prehistory Martin Tischhäuser - Initial register-setting code (from proform-1.0). - 19971216 Richard Gooch - Original version for /proc/mtrr interface, SMP-safe. - v1.0 - 19971217 Richard Gooch - Bug fix for ioctls()'s. - Added sample code in Documentation/mtrr.txt - v1.1 - 19971218 Richard Gooch - Disallow overlapping regions. - 19971219 Jens Maurer - Register-setting fixups. - v1.2 - 19971222 Richard Gooch - Fixups for kernel 2.1.75. - v1.3 - 19971229 David Wragg - Register-setting fixups and conformity with Intel conventions. - 19971229 Richard Gooch - Cosmetic changes and wrote this ChangeLog ;-) - 19980106 Richard Gooch - Fixups for kernel 2.1.78. - v1.4 - 19980119 David Wragg - Included passive-release enable code (elsewhere in PCI setup). - v1.5 - 19980131 Richard Gooch - Replaced global kernel lock with private spinlock. - v1.6 - 19980201 Richard Gooch - Added wait for other CPUs to complete changes. - v1.7 - 19980202 Richard Gooch - Bug fix in definition of for UP. - v1.8 - 19980319 Richard Gooch - Fixups for kernel 2.1.90. - 19980323 Richard Gooch - Move SMP BIOS fixup before secondary CPUs call - v1.9 - 19980325 Richard Gooch - Fixed test for overlapping regions: confused by adjacent regions - 19980326 Richard Gooch - Added wbinvd in . - 19980401 Richard Gooch - Bug fix for non-SMP compilation. - 19980418 David Wragg - Fixed-MTRR synchronisation for SMP and use atomic operations - instead of spinlocks. - 19980418 Richard Gooch - Differentiate different MTRR register classes for BIOS fixup. - v1.10 - 19980419 David Wragg - Bug fix in variable MTRR synchronisation. - v1.11 - 19980419 Richard Gooch - Fixups for kernel 2.1.97. - v1.12 - 19980421 Richard Gooch - Safer synchronisation across CPUs when changing MTRRs. - v1.13 - 19980423 Richard Gooch - Bugfix for SMP systems without MTRR support. - v1.14 - 19980427 Richard Gooch - Trap calls to and on non-MTRR machines. - v1.15 - 19980427 Richard Gooch - Use atomic bitops for setting SMP change mask. - v1.16 - 19980428 Richard Gooch - Removed spurious diagnostic message. - v1.17 - 19980429 Richard Gooch - Moved register-setting macros into this file. - Moved setup code from init/main.c to i386-specific areas. - v1.18 - 19980502 Richard Gooch - Moved MTRR detection outside conditionals in . - v1.19 - 19980502 Richard Gooch - Documentation improvement: mention Pentium II and AGP. - v1.20 - 19980521 Richard Gooch - Only manipulate interrupt enable flag on local CPU. - Allow enclosed uncachable regions. - v1.21 - - v1.21-- Emil Briggs - Backported to 2.0.x kernels, /proc and ioctl - interfaces removed and the result incorporated - into the 3dfx device driver. Not SMP safe. If - you have an SMP use the 2.2 series kernels. - - v1.22 - 19991222 Joseph Kain - Do kernel version checks here instead of in - Makefile. The Makefile now only needs the - kernel version for install. -*/ - - -/* Include this first as it defines things that affect the kernel headers */ -#include "kinfo.h" - -/* MTRR support is only available in kerenls versioned 2.1.0 or higher. - * For earlier kernels this code compiles to nothing. */ -#include - -#ifndef KERNEL_VERSION -#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c)) -#endif - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 1, 0) - - -#ifndef _LINUX_MTRR_H -#define _LINUX_MTRR_H - -struct mtrr_sentry -{ - unsigned long base; /* Base address */ - unsigned long size; /* Size of region */ - unsigned int type; /* Type of region */ -}; - -struct mtrr_gentry -{ - unsigned int regnum; /* Register number */ - unsigned long base; /* Base address */ - unsigned long size; /* Size of region */ - unsigned int type; /* Type of region */ -}; - - -/* These are the region types */ -#define MTRR_TYPE_UNCACHABLE 0 -#define MTRR_TYPE_WRCOMB 1 -/*#define MTRR_TYPE_ 2*/ -/*#define MTRR_TYPE_ 3*/ -#define MTRR_TYPE_WRTHROUGH 4 -#define MTRR_TYPE_WRPROT 5 -#define MTRR_TYPE_WRBACK 6 -#define MTRR_NUM_TYPES 7 - -static char *mtrr_strings[MTRR_NUM_TYPES] = -{ - "uncachable", /* 0 */ - "write-combining", /* 1 */ - "?", /* 2 */ - "?", /* 3 */ - "write-through", /* 4 */ - "write-protect", /* 5 */ - "write-back", /* 6 */ -}; - -#ifdef __KERNEL__ - -/* The following functions are for use by other drivers */ -extern int mtrr_add (unsigned long base, unsigned long size, - unsigned int type, char increment); -extern int mtrr_del (int reg, unsigned long base, unsigned long size); - -#endif - -#endif /* _LINUX_MTRR_H */ - -#ifdef MODULE -#include -#if defined(CONFIG_MODVERSIONS) && !defined(MODVERSIONS) -#define MODVERSIONS -#endif -#ifdef MODVERSIONS -#include -#endif -#endif -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#define MTRR_NEED_STRINGS - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#undef __SMP__ - -#define MTRR_VERSION "1.21 (19980521)" - -#define TRUE 1 -#define FALSE 0 - -#define X86_FEATURE_MTRR 0x1000 /* memory type registers */ - -#define MTRRcap_MSR 0x0fe -#define MTRRdefType_MSR 0x2ff - -#define MTRRphysBase_MSR(reg) (0x200 + 2 * (reg)) -#define MTRRphysMask_MSR(reg) (0x200 + 2 * (reg) + 1) - -#define NUM_FIXED_RANGES 88 -#define MTRRfix64K_00000_MSR 0x250 -#define MTRRfix16K_80000_MSR 0x258 -#define MTRRfix16K_A0000_MSR 0x259 -#define MTRRfix4K_C0000_MSR 0x268 -#define MTRRfix4K_C8000_MSR 0x269 -#define MTRRfix4K_D0000_MSR 0x26a -#define MTRRfix4K_D8000_MSR 0x26b -#define MTRRfix4K_E0000_MSR 0x26c -#define MTRRfix4K_E8000_MSR 0x26d -#define MTRRfix4K_F0000_MSR 0x26e -#define MTRRfix4K_F8000_MSR 0x26f - - -#ifdef __SMP__ -# define MTRR_CHANGE_MASK_FIXED 0x01 -# define MTRR_CHANGE_MASK_VARIABLE 0x02 -# define MTRR_CHANGE_MASK_DEFTYPE 0x04 -#endif - -/* In the processor's MTRR interface, the MTRR type is always held in - an 8 bit field: */ -typedef u8 mtrr_type; - -#define LINE_SIZE 80 -#define JIFFIE_TIMEOUT 100 - -#define set_mtrr(reg,base,size,type) set_mtrr_up (reg, base, size, type,TRUE) - - -static unsigned int *usage_table = NULL; - - -struct set_mtrr_context -{ - unsigned long flags; - unsigned long deftype_lo; - unsigned long deftype_hi; - unsigned long cr4val; -}; - -/* - * Access to machine-specific registers (available on 586 and better only) - * Note: the rd* operations modify the parameters directly (without using - * pointer indirection), this allows gcc to optimize better - */ -#define rdmsr(msr,val1,val2) \ - __asm__ __volatile__("rdmsr" \ - : "=a" (val1), "=d" (val2) \ - : "c" (msr)) - -#define wrmsr(msr,val1,val2) \ - __asm__ __volatile__("wrmsr" \ - : /* no outputs */ \ - : "c" (msr), "a" (val1), "d" (val2)) - -#define rdtsc(low,high) \ - __asm__ __volatile__("rdtsc" : "=a" (low), "=d" (high)) - -#define rdpmc(counter,low,high) \ - __asm__ __volatile__("rdpmc" \ - : "=a" (low), "=d" (high) \ - : "c" (counter)) - - -/* Put the processor into a state where MTRRs can be safely set. */ -static void set_mtrr_prepare(struct set_mtrr_context *ctxt) -{ - unsigned long tmp; - - /* disable interrupts locally */ - save_flags (ctxt->flags); cli (); - - /* save value of CR4 and clear Page Global Enable (bit 7) */ - asm volatile ("movl %%cr4, %0\n\t" - "movl %0, %1\n\t" - "andb $0x7f, %b1\n\t" - "movl %1, %%cr4\n\t" - : "=r" (ctxt->cr4val), "=q" (tmp) : : "memory"); - - /* disable and flush caches. Note that wbinvd flushes the TLBs as - a side-effect. */ - asm volatile ("movl %%cr0, %0\n\t" - "orl $0x40000000, %0\n\t" - "wbinvd\n\t" - "movl %0, %%cr0\n\t" - "wbinvd\n\t" - : "=r" (tmp) : : "memory"); - - /* disable MTRRs, and set the default type to uncached. */ - rdmsr(MTRRdefType_MSR, ctxt->deftype_lo, ctxt->deftype_hi); - wrmsr(MTRRdefType_MSR, ctxt->deftype_lo & 0xf300UL, ctxt->deftype_hi); -} /* End Function set_mtrr_prepare */ - - -/* Restore the processor after a set_mtrr_prepare */ -static void set_mtrr_done(struct set_mtrr_context *ctxt) -{ - unsigned long tmp; - - /* flush caches and TLBs */ - asm volatile ("wbinvd" : : : "memory" ); - - /* restore MTRRdefType */ - wrmsr(MTRRdefType_MSR, ctxt->deftype_lo, ctxt->deftype_hi); - - /* enable caches */ - asm volatile ("movl %%cr0, %0\n\t" - "andl $0xbfffffff, %0\n\t" - "movl %0, %%cr0\n\t" - : "=r" (tmp) : : "memory"); - - /* restore value of CR4 */ - asm volatile ("movl %0, %%cr4" - : : "r" (ctxt->cr4val) : "memory"); - - /* re-enable interrupts locally (if enabled previously) */ - restore_flags (ctxt->flags); -} /* End Function set_mtrr_done */ - - -/* this function returns the number of variable MTRRs */ -static unsigned int get_num_var_ranges (void) -{ - unsigned long config, dummy; - - rdmsr(MTRRcap_MSR, config, dummy); - return (config & 0xff); -} /* End Function get_num_var_ranges */ - - -/* non-zero if we have the write-combining memory type. */ -static int have_wrcomb (void) -{ - unsigned long config, dummy; - - rdmsr(MTRRcap_MSR, config, dummy); - return (config & (1<<10)); -} - - -static void get_mtrr (unsigned int reg, unsigned long *base, - unsigned long *size, mtrr_type *type) -{ - unsigned long dummy, mask_lo, base_lo; - - rdmsr(MTRRphysMask_MSR(reg), mask_lo, dummy); - if ((mask_lo & 0x800) == 0) { - /* Invalid (i.e. free) range. */ - *base = 0; - *size = 0; - *type = 0; - return; - } - - rdmsr(MTRRphysBase_MSR(reg), base_lo, dummy); - - /* We ignore the extra address bits (32-35). If someone wants to - run x86 Linux on a machine with >4GB memory, this will be the - least of their problems. */ - - /* Clean up mask_lo so it gives the real address mask. */ - mask_lo = (mask_lo & 0xfffff000UL); - - /* This works correctly if size is a power of two, i.e. a - contiguous range. */ - *size = ~(mask_lo - 1); - - *base = (base_lo & 0xfffff000UL); - *type = (base_lo & 0xff); -} /* End Function get_mtrr */ - - -static void set_mtrr_up (unsigned int reg, unsigned long base, - unsigned long size, mtrr_type type, int do_safe) -/* [SUMMARY] Set variable MTRR register on the local CPU. - The register to set. - The base address of the region. - The size of the region. If this is 0 the region is disabled. - The type of the region. - If TRUE, do the change safely. If FALSE, safety measures should - be done externally. -*/ -{ - struct set_mtrr_context ctxt; - - if (do_safe) set_mtrr_prepare (&ctxt); - if (size == 0) - { - /* The invalid bit is kept in the mask, so we simply clear the - relevant mask register to disable a range. */ - wrmsr (MTRRphysMask_MSR (reg), 0, 0); - } - else - { - wrmsr (MTRRphysBase_MSR (reg), base | type, 0); - wrmsr (MTRRphysMask_MSR (reg), ~(size - 1) | 0x800, 0); - } - if (do_safe) set_mtrr_done (&ctxt); -} /* End Function set_mtrr_up */ - - -#ifdef __SMP__ - -struct mtrr_var_range -{ - unsigned long base_lo; - unsigned long base_hi; - unsigned long mask_lo; - unsigned long mask_hi; -}; - - -/* Get the MSR pair relating to a var range. */ -static void get_mtrr_var_range (unsigned int index, - struct mtrr_var_range *vr) -{ - rdmsr (MTRRphysBase_MSR (index), vr->base_lo, vr->base_hi); - rdmsr (MTRRphysMask_MSR (index), vr->mask_lo, vr->mask_hi); -} /* End Function get_mtrr_var_range */ - - -/* Set the MSR pair relating to a var range. Returns TRUE if - changes are made. */ -static int set_mtrr_var_range_testing (unsigned int index, - struct mtrr_var_range *vr) -{ - unsigned int lo, hi; - int changed = FALSE; - - rdmsr(MTRRphysBase_MSR(index), lo, hi); - - if ((vr->base_lo & 0xfffff0ffUL) != (lo & 0xfffff0ffUL) - || (vr->base_hi & 0xfUL) != (hi & 0xfUL)) { - wrmsr(MTRRphysBase_MSR(index), vr->base_lo, vr->base_hi); - changed = TRUE; - } - - rdmsr(MTRRphysMask_MSR(index), lo, hi); - - if ((vr->mask_lo & 0xfffff800UL) != (lo & 0xfffff800UL) - || (vr->mask_hi & 0xfUL) != (hi & 0xfUL)) { - wrmsr(MTRRphysMask_MSR(index), vr->mask_lo, vr->mask_hi); - changed = TRUE; - } - - return changed; -} - - -static void get_fixed_ranges(mtrr_type *frs) -{ - unsigned long *p = (unsigned long *)frs; - int i; - - rdmsr(MTRRfix64K_00000_MSR, p[0], p[1]); - - for (i = 0; i < 2; i++) - rdmsr(MTRRfix16K_80000_MSR + i, p[2 + i*2], p[3 + i*2]); - - for (i = 0; i < 8; i++) - rdmsr(MTRRfix4K_C0000_MSR + i, p[6 + i*2], p[7 + i*2]); -} - - -static int set_fixed_ranges_testing(mtrr_type *frs) -{ - unsigned long *p = (unsigned long *)frs; - int changed = FALSE; - int i; - unsigned long lo, hi; - - rdmsr(MTRRfix64K_00000_MSR, lo, hi); - if (p[0] != lo || p[1] != hi) { - wrmsr(MTRRfix64K_00000_MSR, p[0], p[1]); - changed = TRUE; - } - - for (i = 0; i < 2; i++) { - rdmsr(MTRRfix16K_80000_MSR + i, lo, hi); - if (p[2 + i*2] != lo || p[3 + i*2] != hi) { - wrmsr(MTRRfix16K_80000_MSR + i, p[2 + i*2], p[3 + i*2]); - changed = TRUE; - } - } - - for (i = 0; i < 8; i++) { - rdmsr(MTRRfix4K_C0000_MSR + i, lo, hi); - if (p[6 + i*2] != lo || p[7 + i*2] != hi) { - wrmsr(MTRRfix4K_C0000_MSR + i, p[6 + i*2], p[7 + i*2]); - changed = TRUE; - } - } - - return changed; -} - - -struct mtrr_state -{ - unsigned int num_var_ranges; - struct mtrr_var_range *var_ranges; - mtrr_type fixed_ranges[NUM_FIXED_RANGES]; - unsigned char enabled; - mtrr_type def_type; -}; - - -/* Grab all of the MTRR state for this CPU into *state. */ -static void get_mtrr_state(struct mtrr_state *state) -{ - unsigned int nvrs, i; - struct mtrr_var_range *vrs; - unsigned long lo, dummy; - - nvrs = state->num_var_ranges = get_num_var_ranges(); - vrs = state->var_ranges - = kmalloc(nvrs * sizeof(struct mtrr_var_range), GFP_KERNEL); - if (vrs == NULL) - nvrs = state->num_var_ranges = 0; - - for (i = 0; i < nvrs; i++) - get_mtrr_var_range(i, &vrs[i]); - - get_fixed_ranges(state->fixed_ranges); - - rdmsr(MTRRdefType_MSR, lo, dummy); - state->def_type = (lo & 0xff); - state->enabled = (lo & 0xc00) >> 10; -} /* End Function get_mtrr_state */ - - -/* Free resources associated with a struct mtrr_state */ -static void finalize_mtrr_state(struct mtrr_state *state) -{ - if (state->var_ranges) kfree (state->var_ranges); -} /* End Function finalize_mtrr_state */ - - -static unsigned long set_mtrr_state (struct mtrr_state *state, - struct set_mtrr_context *ctxt) -/* [SUMMARY] Set the MTRR state for this CPU. - The MTRR state information to read. - Some relevant CPU context. - [NOTE] The CPU must already be in a safe state for MTRR changes. - [RETURNS] 0 if no changes made, else a mask indication what was changed. -*/ -{ - unsigned int i; - unsigned long change_mask = 0; - - for (i = 0; i < state->num_var_ranges; i++) - if (set_mtrr_var_range_testing(i, &state->var_ranges[i])) - change_mask |= MTRR_CHANGE_MASK_VARIABLE; - - if (set_fixed_ranges_testing(state->fixed_ranges)) - change_mask |= MTRR_CHANGE_MASK_FIXED; - - /* set_mtrr_restore restores the old value of MTRRdefType, - so to set it we fiddle with the saved value. */ - if ((ctxt->deftype_lo & 0xff) != state->def_type - || ((ctxt->deftype_lo & 0xc00) >> 10) != state->enabled) - { - ctxt->deftype_lo |= (state->def_type | state->enabled << 10); - change_mask |= MTRR_CHANGE_MASK_DEFTYPE; - } - - return change_mask; -} /* End Function set_mtrr_state */ - - -static atomic_t undone_count; -static void (*handler_func) (struct set_mtrr_context *ctxt, void *info); -static void *handler_info; -static volatile int wait_barrier_execute = FALSE; -static volatile int wait_barrier_cache_enable = FALSE; - -static void sync_handler (void) -/* [SUMMARY] Synchronisation handler. Executed by "other" CPUs. - [RETURNS] Nothing. -*/ -{ - struct set_mtrr_context ctxt; - - set_mtrr_prepare (&ctxt); - /* Notify master CPU that I'm at the barrier and then wait */ - atomic_dec (&undone_count); - while (wait_barrier_execute) barrier (); - /* The master has cleared me to execute */ - (*handler_func) (&ctxt, handler_info); - /* Notify master CPU that I've executed the function */ - atomic_dec (&undone_count); - /* Wait for master to clear me to enable cache and return */ - while (wait_barrier_cache_enable) barrier (); - set_mtrr_done (&ctxt); -} /* End Function sync_handler */ - -static void do_all_cpus (void (*handler) (struct set_mtrr_context *ctxt, - void *info), - void *info, int local) -/* [SUMMARY] Execute a function on all CPUs, with caches flushed and disabled. - [PURPOSE] This function will synchronise all CPUs, flush and disable caches - on all CPUs, then call a specified function. When the specified function - finishes on all CPUs, caches are enabled on all CPUs. - The function to execute. - An arbitrary information pointer which is passed to <>. - If TRUE <> is executed locally. - [RETURNS] Nothing. -*/ -{ - unsigned long timeout; - struct set_mtrr_context ctxt; - - mtrr_hook = sync_handler; - handler_func = handler; - handler_info = info; - wait_barrier_execute = TRUE; - wait_barrier_cache_enable = TRUE; - /* Send a message to all other CPUs and wait for them to enter the - barrier */ - atomic_set (&undone_count, smp_num_cpus - 1); - smp_message_pass (MSG_ALL_BUT_SELF, MSG_MTRR_CHANGE, 0, 0); - /* Wait for it to be done */ - timeout = jiffies + JIFFIE_TIMEOUT; - while ( (atomic_read (&undone_count) > 0) && (jiffies < timeout) ) - barrier (); - if (atomic_read (&undone_count) > 0) - { - panic ("mtrr: timed out waiting for other CPUs\n"); - } - mtrr_hook = NULL; - /* All other CPUs should be waiting for the barrier, with their caches - already flushed and disabled. Prepare for function completion - notification */ - atomic_set (&undone_count, smp_num_cpus - 1); - /* Flush and disable the local CPU's cache and release the barier, which - should cause the other CPUs to execute the function. Also execute it - locally if required */ - set_mtrr_prepare (&ctxt); - wait_barrier_execute = FALSE; - if (local) (*handler) (&ctxt, info); - /* Now wait for other CPUs to complete the function */ - while (atomic_read (&undone_count) > 0) barrier (); - /* Now all CPUs should have finished the function. Release the barrier to - allow them to re-enable their caches and return from their interrupt, - then enable the local cache and return */ - wait_barrier_cache_enable = FALSE; - set_mtrr_done (&ctxt); - handler_func = NULL; - handler_info = NULL; -} /* End Function do_all_cpus */ - - -struct set_mtrr_data -{ - unsigned long smp_base; - unsigned long smp_size; - unsigned int smp_reg; - mtrr_type smp_type; -}; - -static void set_mtrr_handler (struct set_mtrr_context *ctxt, void *info) -{ - struct set_mtrr_data *data = info; - - set_mtrr_up (data->smp_reg, data->smp_base, data->smp_size, data->smp_type, - FALSE); -} /* End Function set_mtrr_handler */ - - - -/* A warning that is common to the module and non-module cases. */ -/* Some BIOS's are fucked and don't set all MTRRs the same! */ -#ifdef MODULE -static void mtrr_state_warn (unsigned long mask) -#else -static void mtrr_state_warn (unsigned long mask) -#endif -{ - if (!mask) return; - if (mask & MTRR_CHANGE_MASK_FIXED) - printk ("mtrr: your CPUs had inconsistent fixed MTRR settings\n"); - if (mask & MTRR_CHANGE_MASK_VARIABLE) - printk ("mtrr: your CPUs had inconsistent variable MTRR settings\n"); - if (mask & MTRR_CHANGE_MASK_DEFTYPE) - printk ("mtrr: your CPUs had inconsistent MTRRdefType settings\n"); - printk ("mtrr: probably your BIOS does not setup all CPUs\n"); -} /* End Function mtrr_state_warn */ - -#ifdef MODULE -/* As a module, copy the MTRR state using an IPI handler. */ - -static volatile unsigned long smp_changes_mask = 0; - -static void copy_mtrr_state_handler (struct set_mtrr_context *ctxt, void *info) -{ - unsigned long mask, count; - struct mtrr_state *smp_mtrr_state = info; - - mask = set_mtrr_state (smp_mtrr_state, ctxt); - /* Use the atomic bitops to update the global mask */ - for (count = 0; count < sizeof mask * 8; ++count) - { - if (mask & 0x01) set_bit (count, &smp_changes_mask); - mask >>= 1; - } -} /* End Function copy_mtrr_state_handler */ - -/* Copies the entire MTRR state of this CPU to all the others. */ -static void copy_mtrr_state (void) -{ - struct mtrr_state ms; - - get_mtrr_state (&ms); - do_all_cpus (copy_mtrr_state_handler, &ms, FALSE); - finalize_mtrr_state (&ms); - mtrr_state_warn (smp_changes_mask); -} /* End Function copy_mtrr_state */ - -#endif /* MODULE */ -#endif /* __SMP__ */ - -static char *attrib_to_str (int x) -{ - return (x <= 6) ? mtrr_strings[x] : "?"; -} /* End Function attrib_to_str */ - -static void init_table (void) -{ - int i, max; - - max = get_num_var_ranges (); - if ( ( usage_table = kmalloc (max * sizeof *usage_table, GFP_KERNEL) ) - == NULL ) - { - printk ("mtrr: could not allocate\n"); - return; - } - for (i = 0; i < max; i++) usage_table[i] = 1; - -} /* End Function init_table */ - -int mtrr_add (unsigned long base, unsigned long size, unsigned int type, - char increment) -/* [SUMMARY] Add an MTRR entry. - The starting (base) address of the region. - The size (in bytes) of the region. - The type of the new region. - If true and the region already exists, the usage count will be - incremented. - [RETURNS] The MTRR register on success, else a negative number indicating - the error code. - [NOTE] This routine uses a spinlock. -*/ -{ - int i, max; - mtrr_type ltype; - unsigned long lbase, lsize, last; - - if (!usage_table) init_table(); - if ( (base & 0xfff) || (size & 0xfff) ) - { - printk ("mtrr: size and base must be multiples of 4kB\n"); - printk ("mtrr: size: %lx base: %lx\n", size, base); - return -EINVAL; - } - if (base + size < 0x100000) - { - printk ("mtrr: cannot set region below 1 MByte (0x%lx,0x%lx)\n", - base, size); - return -EINVAL; - } - /* Check upper bits of base and last are equal and lower bits are 0 for - base and 1 for last */ - last = base + size - 1; - for (lbase = base; !(lbase & 1) && (last & 1); - lbase = lbase >> 1, last = last >> 1); - if (lbase != last) - { - printk ("mtrr: base(0x%lx) is not aligned on a size(0x%lx) boundary\n", - base, size); - return -EINVAL; - } - if (type >= MTRR_NUM_TYPES) - { - printk ("mtrr: type: %u illegal\n", type); - return -EINVAL; - } - /* If the type is WC, check that this processor supports it */ - if ( (type == MTRR_TYPE_WRCOMB) && !have_wrcomb () ) - { - printk ("mtrr: your processor doesn't support write-combining\n"); - return -ENOSYS; - } - increment = increment ? 1 : 0; - max = get_num_var_ranges (); - /* Search for existing MTRR */ - - for (i = 0; i < max; ++i) - { - get_mtrr (i, &lbase, &lsize, <ype); - if (base >= lbase + lsize) continue; - if ( (base < lbase) && (base + size <= lbase) ) continue; - /* At this point we know there is some kind of overlap/enclosure */ - if ( (base < lbase) || (base + size > lbase + lsize) ) - { - printk ("mtrr: 0x%lx,0x%lx overlaps existing 0x%lx,0x%lx\n", - base, size, lbase, lsize); - return -EINVAL; - } - /* New region is enclosed by an existing region */ - if (ltype != type) - { - if (type == MTRR_TYPE_UNCACHABLE) continue; - printk ( "mtrr: type mismatch for %lx,%lx old: %s new: %s\n", - base, size, attrib_to_str (ltype), attrib_to_str (type) ); - return -EINVAL; - } - if (increment) ++usage_table[i]; - return i; - } - /* Search for an empty MTRR */ - for (i = 0; i < max; ++i) - { - get_mtrr (i, &lbase, &lsize, <ype); - if (lsize > 0) continue; - set_mtrr (i, base, size, type); - usage_table[i] = 1; - return i; - } - printk ("mtrr: no more MTRRs available\n"); - return -ENOSPC; -} /* End Function mtrr_add */ - -int mtrr_del (int reg, unsigned long base, unsigned long size) -/* [SUMMARY] Delete MTRR/decrement usage count. - The register. If this is less than 0 then <> and <> must - be supplied. - The base address of the region. This is ignored if <> is >= 0. - The size of the region. This is ignored if <> is >= 0. - [RETURNS] The register on success, else a negative number indicating - the error code. - [NOTE] This routine uses a spinlock. -*/ -{ - int i, max; - mtrr_type ltype; - unsigned long lbase, lsize; - - if (!usage_table) init_table(); - max = get_num_var_ranges (); - if (reg < 0) - { - /* Search for existing MTRR */ - for (i = 0; i < max; ++i) - { - get_mtrr (i, &lbase, &lsize, <ype); - if ( (lbase == base) && (lsize == size) ) - { - reg = i; - break; - } - } - if (reg < 0) - { - printk ("mtrr: no MTRR for %lx,%lx found\n", base, size); - return -EINVAL; - } - } - if (reg >= max) - { - printk ("mtrr: register: %d too big\n", reg); - return -EINVAL; - } - get_mtrr (reg, &lbase, &lsize, <ype); - if (lsize < 1) - { - printk ("mtrr: MTRR %d not used\n", reg); - return -EINVAL; - } - if (usage_table[reg] < 1) - { - printk ("mtrr: reg: %d has count=0\n", reg); - return -EINVAL; - } - if (--usage_table[reg] < 1) set_mtrr (reg, 0, 0, 0); - return reg; -} /* End Function mtrr_del */ - -#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(2, 1, 0) */ diff --git a/glide2x/README b/glide2x/README deleted file mode 100644 index 51d3443..0000000 --- a/glide2x/README +++ /dev/null @@ -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. diff --git a/glide2x/cvg/bin/makefile b/glide2x/cvg/bin/makefile deleted file mode 100644 index 4d5c26f..0000000 --- a/glide2x/cvg/bin/makefile +++ /dev/null @@ -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 = *.exe *.dll *.bat - -!include $(BUILD_ROOT_SWLIBS)/include/nmake/3dfx.mak diff --git a/glide2x/cvg/bin/makefile.linux b/glide2x/cvg/bin/makefile.linux deleted file mode 100644 index 360d40d..0000000 --- a/glide2x/cvg/bin/makefile.linux +++ /dev/null @@ -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 diff --git a/glide2x/cvg/binsrc/makefile b/glide2x/cvg/binsrc/makefile deleted file mode 100644 index d4ac1a6..0000000 --- a/glide2x/cvg/binsrc/makefile +++ /dev/null @@ -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$ -# - -INSTALL_DESTINATION=$(BUILD_ROOT)\cvg - -!include $(BUILD_ROOT_SWLIBS)\include\nmake\3dfx.mak - diff --git a/glide2x/cvg/binsrc/makefile.linux b/glide2x/cvg/binsrc/makefile.linux deleted file mode 100644 index 7316f8b..0000000 --- a/glide2x/cvg/binsrc/makefile.linux +++ /dev/null @@ -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$ -# - - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak - diff --git a/glide2x/cvg/cmd/makefile.linux b/glide2x/cvg/cmd/makefile.linux deleted file mode 100644 index 84a17c5..0000000 --- a/glide2x/cvg/cmd/makefile.linux +++ /dev/null @@ -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 diff --git a/glide2x/cvg/cmd/pass/makefile.linux b/glide2x/cvg/cmd/pass/makefile.linux deleted file mode 100644 index 9d984bb..0000000 --- a/glide2x/cvg/cmd/pass/makefile.linux +++ /dev/null @@ -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 - diff --git a/glide2x/cvg/cmd/pass/pass.c b/glide2x/cvg/cmd/pass/pass.c deleted file mode 100644 index b2fb77a..0000000 --- a/glide2x/cvg/cmd/pass/pass.c +++ /dev/null @@ -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 -#include - -#include <3dfx.h> -#include -#include - -/* 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; -} diff --git a/glide2x/cvg/glide/makefile b/glide2x/cvg/glide/makefile deleted file mode 100644 index 755f9b1..0000000 --- a/glide2x/cvg/glide/makefile +++ /dev/null @@ -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 diff --git a/glide2x/cvg/glide/makefile.linux b/glide2x/cvg/glide/makefile.linux deleted file mode 100644 index 8857efa..0000000 --- a/glide2x/cvg/glide/makefile.linux +++ /dev/null @@ -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 diff --git a/glide2x/cvg/glide/makefile.unix b/glide2x/cvg/glide/makefile.unix deleted file mode 100644 index 8857efa..0000000 --- a/glide2x/cvg/glide/makefile.unix +++ /dev/null @@ -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 diff --git a/glide2x/cvg/glide/oem/fxbldno.c b/glide2x/cvg/glide/oem/fxbldno.c deleted file mode 100644 index c4e86bb..0000000 --- a/glide2x/cvg/glide/oem/fxbldno.c +++ /dev/null @@ -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 -#include -#include - -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() */ diff --git a/glide2x/cvg/glide/oem/makefile b/glide2x/cvg/glide/oem/makefile deleted file mode 100644 index 8214e20..0000000 --- a/glide2x/cvg/glide/oem/makefile +++ /dev/null @@ -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 diff --git a/glide2x/cvg/glide/oem/makefile.linux b/glide2x/cvg/glide/oem/makefile.linux deleted file mode 100644 index c7d8c70..0000000 --- a/glide2x/cvg/glide/oem/makefile.linux +++ /dev/null @@ -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 - diff --git a/glide2x/cvg/glide/oem/oeminit.c b/glide2x/cvg/glide/oem/oeminit.c deleted file mode 100644 index 18b1d58..0000000 --- a/glide2x/cvg/glide/oem/oeminit.c +++ /dev/null @@ -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 -#include -#include - -#ifndef __linux__ -#include -#endif - -#define FX_DLL_DEFINITION -#include <3dfx.h> -#include -#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 */ - - diff --git a/glide2x/cvg/glide/oem/oeminit.h b/glide2x/cvg/glide/oem/oeminit.h deleted file mode 100644 index 6bf4ffc..0000000 --- a/glide2x/cvg/glide/oem/oeminit.h +++ /dev/null @@ -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__ - diff --git a/glide2x/cvg/glide/oem/oeminit.rc b/glide2x/cvg/glide/oem/oeminit.rc deleted file mode 100644 index b966d82..0000000 --- a/glide2x/cvg/glide/oem/oeminit.rc +++ /dev/null @@ -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 -#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 diff --git a/glide2x/cvg/glide/oem/rcver.h b/glide2x/cvg/glide/oem/rcver.h deleted file mode 100644 index 3230db0..0000000 --- a/glide2x/cvg/glide/oem/rcver.h +++ /dev/null @@ -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 diff --git a/glide2x/cvg/glide/src/banner.inc b/glide2x/cvg/glide/src/banner.inc deleted file mode 100644 index 5a5f972..0000000 --- a/glide2x/cvg/glide/src/banner.inc +++ /dev/null @@ -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 diff --git a/glide2x/cvg/glide/src/cpudetect.c b/glide2x/cvg/glide/src/cpudetect.c deleted file mode 100644 index e1db725..0000000 --- a/glide2x/cvg/glide/src/cpudetect.c +++ /dev/null @@ -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 - */ - -#include -#include - -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"); -} - diff --git a/glide2x/cvg/glide/src/cpudtect.S b/glide2x/cvg/glide/src/cpudtect.S deleted file mode 100644 index 7a1febd..0000000 --- a/glide2x/cvg/glide/src/cpudtect.S +++ /dev/null @@ -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 - - diff --git a/glide2x/cvg/glide/src/cpudtect.asm b/glide2x/cvg/glide/src/cpudtect.asm deleted file mode 100644 index ca5ee68..0000000 --- a/glide2x/cvg/glide/src/cpudtect.asm +++ /dev/null @@ -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 diff --git a/glide2x/cvg/glide/src/ddgump.c b/glide2x/cvg/glide/src/ddgump.c deleted file mode 100644 index f52e8b4..0000000 --- a/glide2x/cvg/glide/src/ddgump.c +++ /dev/null @@ -1,575 +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. -** -** -** 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 -#include -#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(); -} - diff --git a/glide2x/cvg/glide/src/diglide.c b/glide2x/cvg/glide/src/diglide.c deleted file mode 100644 index a3ed20f..0000000 --- a/glide2x/cvg/glide/src/diglide.c +++ /dev/null @@ -1,407 +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$ -** -** 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 -#include <3dfx.h> -#include - -#define FX_DLL_DEFINITION -#include -#include -#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 & 0x00ff; - blue = (*color >> 16) & 0xff; - *color &= 0xff00ff00; - *color |= ((red << 16) | blue); - break; - - case GR_COLORFORMAT_RGBA: - blue = (*color & 0x0000ff00) >> 8; - green = (*color & 0x00ff0000) >> 16; - red = (*color & 0xff000000) >> 24; - alpha = (*color & 0x000000ff); - *color = (alpha << 24) | (red << 16) | (green << 8) | blue; - break; - - case GR_COLORFORMAT_BGRA: - blue = (*color & 0xff000000) >> 24; - green = (*color & 0x00ff0000) >> 16; - red = (*color & 0x0000ff00) >> 8; - alpha = (*color & 0x000000ff); - *color = (alpha << 24) | (red << 16) | (green << 8) | blue; - 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; -} diff --git a/glide2x/cvg/glide/src/digutex.c b/glide2x/cvg/glide/src/digutex.c deleted file mode 100644 index bde2ddf..0000000 --- a/glide2x/cvg/glide/src/digutex.c +++ /dev/null @@ -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 -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include -#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 */ - diff --git a/glide2x/cvg/glide/src/disst.c b/glide2x/cvg/glide/src/disst.c deleted file mode 100644 index f7872b0..0000000 --- a/glide2x/cvg/glide/src/disst.c +++ /dev/null @@ -1,213 +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 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 -#include -#include <3dfx.h> - -#include - -#define FX_DLL_DEFINITION -#include -#include -#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 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 */ diff --git a/glide2x/cvg/glide/src/distate.c b/glide2x/cvg/glide/src/distate.c deleted file mode 100644 index e5ac0e8..0000000 --- a/glide2x/cvg/glide/src/distate.c +++ /dev/null @@ -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 - -#define FX_DLL_DEFINITION -#include -#include -#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 */ diff --git a/glide2x/cvg/glide/src/distrip.c b/glide2x/cvg/glide/src/distrip.c deleted file mode 100644 index 06deb3a..0000000 --- a/glide2x/cvg/glide/src/distrip.c +++ /dev/null @@ -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 - -#define FX_DLL_DEFINITION -#include -#include -#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 */ diff --git a/glide2x/cvg/glide/src/ditex.c b/glide2x/cvg/glide/src/ditex.c deleted file mode 100644 index 78aae7c..0000000 --- a/glide2x/cvg/glide/src/ditex.c +++ /dev/null @@ -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 -#include -#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)) */ diff --git a/glide2x/cvg/glide/src/fifo.c b/glide2x/cvg/glide/src/fifo.c deleted file mode 100644 index 0ff7591..0000000 --- a/glide2x/cvg/glide/src/fifo.c +++ /dev/null @@ -1,730 +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 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 -#include - -#if defined(__WIN32__) -#include -#endif - -#include <3dfx.h> -#include - -#define FX_DLL_DEFINITION -#include -#include -#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 GR_CDECL -_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 */ diff --git a/glide2x/cvg/glide/src/fxbldno.c b/glide2x/cvg/glide/src/fxbldno.c deleted file mode 100644 index c4e86bb..0000000 --- a/glide2x/cvg/glide/src/fxbldno.c +++ /dev/null @@ -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 -#include -#include - -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() */ diff --git a/glide2x/cvg/glide/src/fxgasm.c b/glide2x/cvg/glide/src/fxgasm.c deleted file mode 100644 index 51c51b4..0000000 --- a/glide2x/cvg/glide/src/fxgasm.c +++ /dev/null @@ -1,208 +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 -#include -#include - -#include <3dfx.h> -#include - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -/*---------------------------------------------------------------------- - * macros for creating assembler offset files - *----------------------------------------------------------------------*/ - -#ifndef __linux__ -#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\t= %08xh\n",pname,((int)&p.o)-(int)&p); \ - else printf("%s\t= %10d\n",pname,((int)&p.o)-(int)&p) - -#define OFFSET2(p,o,pname) if (hex) \ - printf("%s\t= %08xh\n",pname,((int)&o)-(int)&p); \ - else printf("%s\t= %10d\n",pname,((int)&o)-(int)&p) - -#define SIZEOF(p,pname) if (hex) \ - printf("SIZEOF_%s\t= %08xh\n",pname,sizeof(p)); \ - else printf("SIZEOF_%s\t= %10d\n",pname,sizeof(p)) - -#else - -#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\t .EQU %08x\n",pname,((int)&p.o)-(int)&p); \ - else printf("%s\t .EQU %10d\n",pname,((int)&p.o)-(int)&p) - -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) -#define HWOFFSET(p, o, pname) if (hex) \ - printf("%s\t .EQU %08x\n",pname,(((int) &p.o)-(int)&p)>>2);\ - else printf("%s\t .EQU %10d\n",pname,(((int)&p.o)-(int)&p)) -#endif /* (GLIDE_PLATFORM & GLIDE_HW_SST96) */ - -#define OFFSET2(p,o,pname) if (hex) \ - printf("%s\t .EQU %08x\n",pname,((int)&o)-(int)&p); \ - else printf("%s\t .EQU %10d\n",pname,((int)&o)-(int)&p) - -#define SIZEOF(p,pname) if (hex) \ - printf("SIZEOF_%s\t .EQU %08x\n",pname,sizeof(p)); \ - else printf("SIZEOF_%s\t .EQU %10d\n",pname,sizeof(p)) -#endif - -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%XUL\n", - offsetof(struct _GlideRoot_s, curGC)); - - printf("#define kTriProcOffset 0x%XUL\n", - offsetof(struct GrGC_s, cmdTransportInfo.triSetupProc)); - printf("#define kTriProcOffsetClean %d\n", - offsetof(struct GrGC_s, cmdTransportInfo.triSetupProc)); -#endif /* GLIDE_DISPATCH_SETUP */ - - printf("/* The # of 2-byte entries in the hw fog table */\n"); - printf("#define kInternalFogTableEntryCount 0x%XUL\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,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"); - - 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; -} diff --git a/glide2x/cvg/glide/src/fxglide.h b/glide2x/cvg/glide/src/fxglide.h deleted file mode 100644 index 06160e2..0000000 --- a/glide2x/cvg/glide/src/fxglide.h +++ /dev/null @@ -1,2391 +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$ -** -** 206 6/06/98 12:06p Peter -** gmt's trilinear hell bug -** -** 205 5/20/98 4:26p Peter -** one more direct register write fix -** -** 204 5/20/98 3:51p Peter -** no fifo glide -** -** 203 5/18/98 12:16p Peter -** culling enabling -** -** 202 4/01/98 2:57p Peter -** removed voodoo^2 strings -** -** 201 4/01/98 1:51p Peter -** fixed resetting unused tmu muckage -** -** 200 3/31/98 6:09p Peter -** sli origin everywhere (I think) and grLfbReadRegion/grRenderBuffer vs -** triple buffering -** -** 199 3/23/98 5:57p Peter -** fixed FX_CALL -** -** 198 3/17/98 6:50p Peter -** sli paired vs active -** -** 197 3/17/98 3:00p Peter -** removed unused stats -** -** 196 3/17/98 1:57p Atai -** added boardid and requireoemdll registry -** -** 195 3/14/98 1:07p Peter -** mac port happiness -** -** 194 3/13/98 2:56p Atai -** added oeminfo in GC -** -** 193 3/13/98 1:26p Peter -** re-fixed shadowing -** -** 192 3/09/98 3:16p Peter -** removed debugging code accidentally checked in -** -** 191 3/09/98 2:24p Peter -** change for new pci passthrough interface -** -** 190 3/03/98 9:37p Peter -** more sli origin fun -** -** 189 3/02/98 7:22p Peter -** more crybaby stuff -** -** 188 2/24/98 10:15a Peter -** oem dll muckage -** -** 187 2/20/98 5:31p Peter -** crybaby glide -** -** 186 2/20/98 11:00a Peter -** removed glide3 from glid2 tree -** -** 185 2/20/98 9:05a Peter -** removed remnants of comdex grot -** -** 184 2/19/98 5:53p Peter -** moved structure def for hanson -** -** 183 2/17/98 12:39p Peter -** sli monitor detect thing -** -** 182 2/12/98 3:40p Peter -** single buffering for opengl -** -** 181 2/11/98 5:26p Peter -** new write edge stuff -** -** 180 2/04/98 6:57p Atai -** added fxoem2x.dll for cvg -** -** 179 2/01/98 7:52p Peter -** grLfbWriteRegion byte count problems -** -** 178 1/30/98 4:23p Peter -** renamed curSwapBuf->curRenderBuf for clarity -** -** 177 1/20/98 11:03a Peter -** env var to force triple buffering - * - * 176 1/16/98 7:03p Peter - * fixed volatile - * - * 175 1/16/98 10:47a Peter - * fixed idle muckage - * - * 174 1/15/98 1:12p Peter - * dispatch w/o packing - * - * 173 1/13/98 12:42p Atai - * fixed grtexinfo, grVertexLayout, and draw triangle - * - * 172 1/10/98 4:01p Atai - * inititialize vertex layout, viewport, added defines - * - * 168 1/07/98 11:18a Atai - * remove GrMipMapInfo and GrGC.mm_table in glide3 - * - * 167 1/07/98 10:22a Peter - * lod dithering env var - * - * 166 1/06/98 6:47p Atai - * undo grSplash and remove gu routines - * - * 165 1/05/98 6:06p Atai - * glide extension stuff - * - * 164 12/18/97 10:52a Atai - * fixed grGet(GR_VIDEO_POS) - * - * 163 12/17/97 4:45p Peter - * groundwork for CrybabyGlide - * - * 162 12/17/97 4:05p Atai - * added grChromaRange(), grGammaCorrecionRGB(), grRest(), and grGet() - * functions - * - * 160 12/15/97 5:52p Atai - * disable obsolete glide2 api for glide3 - * - * 156 12/09/97 12:20p Peter - * mac glide port - * - * 155 12/09/97 10:28a Peter - * cleaned up some frofanity - * - * 154 12/09/97 9:46a Atai - * added viewport varibales - * - * 152 11/25/97 12:09p Peter - * nested calls to grLfbLock vs init code locking on v2 - * - * 151 11/21/97 6:05p Atai - * use one datalist (tsuDataList) in glide3 - * - * 150 11/21/97 3:20p Peter - * direct writes tsu registers - * - * 149 11/19/97 4:33p Atai - * #define GLIDE3_VERTEX_LAYOUT 1 - * - * 148 11/19/97 3:51p Dow - * Tex stuff for h3, def of GETENV when using fxHal - * - * 147 11/18/97 6:11p Peter - * fixed glide3 muckage - * - * 146 11/18/97 4:36p Peter - * chipfield stuff cleanup and w/ direct writes - * - * 145 11/18/97 3:25p Atai - * redefine vData - * - * 144 11/17/97 4:55p Peter - * watcom warnings/chipfield stuff - * - * 143 11/15/97 7:43p Peter - * more comdex silliness - * - * 142 11/14/97 11:10p Peter - * open vs hw init confusion - * - * 141 11/14/97 5:02p Peter - * more comdex stuff - * - * 140 11/14/97 12:09a Peter - * comdex thing and some other stuff - * - * 139 11/12/97 2:35p Peter - * fixed braino - * - * 138 11/12/97 2:27p Peter - * - * 137 11/12/97 11:38a Dow - * - * 136 11/12/97 11:15a Peter - * fixed tri/strip param send and used cvgdef.h constant - * - * 135 11/12/97 9:21a Dow - * Changed offset defs to those in h3defs.h - * - * 134 11/07/97 11:22a Atai - * remove GR_*_SMOOTH. use GR_SMOOTH - * - * 133 11/06/97 3:46p Peter - * dos ovl build problem - * - * 132 11/06/97 3:38p Dow - * More banshee stuff - * - * 131 11/04/97 6:35p Atai - * 1. sync with data structure changes - * 2. break up aa triangle routine - * - * 130 11/04/97 5:04p Peter - * cataclysm part deux - * - * 129 11/04/97 4:00p Dow - * Banshee Mods - * - * 128 11/03/97 3:43p Peter - * h3/cvg cataclysm - * - * 127 10/29/97 2:45p Peter - * C version of Taco's packing code - * -** -*/ - -/* -** fxglide.h -** -** Internal declarations for use inside Glide. -** -** GLIDE_LIB: Defined if building the Glide Library. This macro -** should ONLY be defined by a makefile intended to build -** GLIDE.LIB or glide.a. -** -** GLIDE_NUM_TMU: Number of physical TMUs installed. Valid values are 1 -** and 2. If this macro is not defined by the application -** it is automatically set to the value 2. -** -*/ - -#ifndef __FXGLIDE_H__ -#define __FXGLIDE_H__ - -/* -** ----------------------------------------------------------------------- -** INCLUDE FILES -** ----------------------------------------------------------------------- -*/ -#include -#include -#include -#include -#include - -#include <3dfx.h> -#include -#include - -#if (GLIDE_PLATFORM & GLIDE_HW_H3) -#include - -/* Compilation hacks for h3 */ - -/* Reserved fbzMode bits */ -#define SST_DRAWBUFFER_SHIFT 14 -#define SST_DRAWBUFFER (0x3 << SST_DRAWBUFFER_SHIFT) -#define SST_DRAWBUFFER_FRONT (0 << SST_DRAWBUFFER_SHIFT) -#define SST_DRAWBUFFER_BACK (1 << SST_DRAWBUFFER_SHIFT) - -/* Reserved lfbMode bits */ -#define SST_LFB_WRITEBUFSELECT_SHIFT 4 -#define SST_LFB_WRITEBUFSELECT (0x3< -#else -#error "Unknown HAL hw layer" -#endif - -#if GLIDE_INIT_HAL - -#include - -#ifdef GETENV -#undef GETENV -#endif -#define GETENV getenv - -/* - * P6 Fence - * - * Here's the stuff to do P6 Fencing. This is required for the - * certain things on the P6 - * - * dpc - 21 may 1997 - FixMe! - * This was yoinked from sst1/include/sst1init.h, and should be - * merged back into something if we decide that we need it later. - */ -extern FxU32 p6FenceVar; - -/* dpc - 2 june 1997 - * Moved the fence check out to avoid empty if body warning w/ gcc. - * This only applies to systems that require the p6 fencing. - */ -#define P6FENCE_CHECK if (i & 2) P6FENCE - -#if defined(__WATCOMC__) -void -p6Fence(void); -#pragma aux p6Fence = \ - "xchg eax, p6FenceVar" \ - modify [eax]; - -#define P6FENCE p6Fence() -#elif defined(__MSC__) -#define P6FENCE {_asm xchg eax, p6FenceVar} -#else -#error "P6 Fencing in-line assembler code needs to be added for this compiler" -#endif /* Compiler specific fence commands */ -#else /* !defined(GLIDE_INIT_HAL) */ - -/* All sst1init refs need to be protected inside - GLIDE_PLATFORM & GLIDE_HW_CVG - */ - -#include -/* dpc - 5 sep 1997 - FixMe! - * Currently we're mapping directly to the init code layer - * through the sst1XXX calls. - * - * #include - */ -#endif /* !defined(GLIDE_INIT_HAL) */ - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) -typedef sst1VideoTimingStruct FxVideoTimingInfo; -#endif - -#if GLIDE_INIT_HAL -#define PLATFORM_IDLE_HW(__hwPtr) fxHalIdleNoNOP(__hwPtr) -#define IDLE_HW(__hwPtr) \ -do { \ - { \ - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); \ - GR_SET(BROADCAST_ID, __hwPtr, nopCMD, 0); \ - GR_CHECK_SIZE(); \ - } \ - PLATFORM_IDLE_HW(__hwPtr); \ -} while(0) -#else /* !GLIDE_INIT_HAL */ -#define IDLE_HW(__hwPtr) sst1InitIdle((FxU32*)__hwPtr) -#endif /* !GLIDE_INIT_HAL */ - -#if GLIDE_MULTIPLATFORM -#include "gcfuncs.h" -#endif - -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) -#include "oeminit.h" -#endif - -#define GR_SKIP_OEMDLL 0xee1feef -#define GR_NO_OEMDLL 0xee1feed - -/* isolate this 'hack' here so as to make the code look cleaner */ -#ifdef __WATCOMC__ -#define GR_CDECL __cdecl -#else -#define GR_CDECL -#endif - -/* Make sure GR_FLUSH_STATE is a noop if not Glide 3 */ -#define GR_FLUSH_STATE() - -/*==========================================================================*/ -/* -** GrState -** -** If something changes in here, then go into glide.h, and look for a -** declaration of the following form: -** -** #define GLIDE_STATE_PAD_SIZE N -** #ifndef GLIDE_LIB -** typedef struct { -** char pad[GLIDE_STATE_PAD_SIZE]; -** } GrState; -** #endif -** -** Then change N to sizeof(GrState) AS DECLARED IN THIS FILE! -** -*/ - -struct _GrState_s -{ - GrCullMode_t /* these go in front for cache hits */ - cull_mode; /* cull neg, cull pos, don't cull */ - - GrHint_t - paramHints; /* Tells us if we need to pointcast a - parameter to a specific chip */ - FxI32 - fifoFree; /* # free entries in FIFO */ - FxU32 - paramIndex, /* Index into array containing - parameter indeces to be sent ot the - triangle setup code */ - tmuMask; /* Tells the paramIndex updater which - TMUs need values */ - struct{ - FxU32 fbzColorPath; - FxU32 fogMode; - FxU32 alphaMode; - FxU32 fbzMode; - FxU32 lfbMode; - FxU32 clipLeftRight; - FxU32 clipBottomTop; - - FxU32 fogColor; - FxU32 zaColor; - FxU32 chromaKey; - FxU32 chromaRange; - - FxU32 stipple; - FxU32 color0; - FxU32 color1; - } fbi_config; /* fbi register shadow */ - - struct tmu_config_t { - FxU32 textureMode; - FxU32 tLOD; - FxU32 tDetail; - FxU32 texBaseAddr; - FxU32 texBaseAddr_1; - FxU32 texBaseAddr_2; - FxU32 texBaseAddr_3_8; - GrMipMapMode_t mmMode; /* saved to allow MM en/dis */ - GrLOD_t smallLod, largeLod; /* saved to allow MM en/dis */ - FxU32 evenOdd; - GrNCCTable_t nccTable; - } tmu_config[GLIDE_NUM_TMU]; /* tmu register shadow */ - - FxBool /* Values needed to determine which */ - ac_requires_it_alpha, /* parameters need gradients computed */ - ac_requires_texture, /* when drawing triangles */ - cc_requires_it_rgb, - cc_requires_texture, - cc_delta0mode, /* Use constants for flat shading */ - allowLODdither, /* allow LOD dithering */ - checkFifo; /* Check fifo status as specified by hints */ - - FxU32 - lfb_constant_depth; /* Constant value for depth buffer (LFBs) */ - GrAlpha_t - lfb_constant_alpha; /* Constant value for alpha buffer (LFBs) */ - - FxU32 - num_buffers; /* 2 or 3 */ - - GrColorFormat_t - color_format; /* ARGB, RGBA, etc. */ - - GrMipMapId_t - current_mm[GLIDE_NUM_TMU]; /* Which guTex** thing is the TMU set - up for? THIS NEEDS TO GO!!! */ - - float - clipwindowf_xmin, clipwindowf_ymin, /* Clipping info */ - clipwindowf_xmax, clipwindowf_ymax; - FxU32 - screen_width, screen_height; /* Screen width and height */ - float - a, r, g, b; /* Constant color values for Delta0 mode */ -}; - -typedef struct GrGC_s -{ - FxU32 - *base_ptr, /* base address of SST */ - *reg_ptr, /* pointer to base of SST registers */ - *tex_ptr, /* texture memory address */ - *lfb_ptr, /* linear frame buffer address */ - *slave_ptr; /* Scanline Interleave Slave address */ - -#if GLIDE_MULTIPLATFORM - GrGCFuncs - gcFuncs; -#endif - -#define kMaxVertexParam (20 + (12 * GLIDE_NUM_TMU) + 3) - struct dataList_s { - int i; - FxFloat* addr; - } regDataList[kMaxVertexParam]; - int tsuDataList[kMaxVertexParam]; - - GrState - state; /* state of Glide/SST */ - - struct cmdTransportInfo { - FxU32 triPacketHdr; /* Pre-computed packet header for - * independent triangles. - */ - - FxU32 cullStripHdr; /* Pre-computed packet header for generic - * case of packet 3 triangles. This needs - * command type and # of vertices to be complete. - */ - - FxU32 paramMask; /* Mask for specifying parameters of - * non-triangle packets. The parameter - * bits[21:10] mimic the packet3 header - * controlling which fields are sent, and - * pc[28] controls whether any color - * information is sent as packed. - */ - - /* Basic command fifo characteristics. These should be - * considered logically const after their initialization. - */ - FxU32* fifoStart; /* Virtual address of start of fifo */ - FxU32* fifoEnd; /* Virtual address of fba fifo */ - FxU32 fifoOffset; /* Offset from hw base to fifo start */ - FxU32 fifoSize; /* Size in bytes of the fifo */ - FxU32 fifoJmpHdr; /* Type0 packet for jmp to fifo start */ - - FxU32* fifoPtr; /* Current write pointer into fifo */ - FxU32 fifoRead; /* Last known hw read ptr. - * This is the sli master, if enabled. - */ - - /* Fifo checking information. In units of usuable bytes until - * the appropriate condition. - */ - FxI32 fifoRoom; /* Space until next fifo check */ - FxI32 roomToReadPtr;/* Bytes until last known hw ptr */ - FxI32 roomToEnd; /* # of bytes until last usable address before fifoEnd */ - - FxBool fifoLfbP; /* Do we expect lfb writes to go through the fifo? */ - FxBool lfbLockCount; /* Have we done an lfb lock? Count of the locks. */ - -#if GLIDE_DISPATCH_SETUP - FxI32 (FX_CALL *triSetupProc)(const GrVertex* a, const GrVertex* b, const GrVertex* c); -#endif /* GLIDE_DISPATCH_SETUP */ - -#if GLIDE_USE_SHADOW_FIFO - FxU32* fifoShadowBase; /* Buffer that shadows the hw fifo for debugging */ - FxU32* fifoShadowPtr; -#endif /* GLIDE_USE_SHADOW_FIFO */ - } cmdTransportInfo; - - union hwDep_u { - FxU32 noHwDep; - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) - struct cvgDep_s { -#if GLIDE_BLIT_CLEAR - /* xTilePages, yTileShift, tileSlopP, and numBufferPages are set - * in grSstWinOpen, and should be considered logically const - * until grSstWinClose at which point they are invalid. - * - * NB: The calculation of these values etc should really be - * moved into the init code at some point in my near future. - */ - FxU32 xTilePages; /* # of pages for video tiles in the x direction, - * the x-dimension of a tile is alwasy 32 pixels. - * Cons-ed up from fbiInit1[24], fbiInit1[7:4], and - * fbiInit6[30] in grSstWinOpen after all of the - * buffers etc are allocated. - */ - - FxBool tileSlopP; /* Set if the actual # of video tiles in the x - * direction will not evenly fit into a page. - * - * FixMe: Will this ever happen? - */ - - FxU32 yTileShift; /* (0x01UL << yTileShift) is the # of lines in a - * tile. This is dependent on the sli-ness of the - * board. - */ - - FxU32 numBufferPages;/* The number of pages used for an entire - * buffer (color or aux). - */ -#endif /* GLIDE_BLIT_CLEAR */ - - FxU32 renderBuf; /* Cached value of the current buffer swapped by the - * user via grBufferSwap. Legal values are - * [0 .. gc->state.num_buffers - 1]. - * - * NB: We need this because the current buffer - * availible in the status register lags the actual - * value due to the command fifo asynchrony (is that - * a word?). - */ - - FxU32 frontBuf; - FxU32 backBuf; - - /* CVG cannot really do single buffering */ - FxBool singleBufferP; - - /* Sli has an 'interesting' feature where the physical scanlines - * that are being rendered is dependent on the location of the y - * origin. There is some ugliness now in grSstOrigin and grSwapBuffer - * to deal w/ this correctly. - * - * Origin_Lower_Left: 0:Black [1 .. screenRezY]:Rendered screenRez+1:Black - * Origin_Upper_Left: [0 .. screenRezY - 1]:Rendered [screenRez-screenRez+1]:Black - */ - FxU32 sliOriginBufCount; - - /* Keep track of which tmu's we have set the lod to be the - * minimum possible to avoid texture thrashing. - */ - FxBool tmuLodDisable[GLIDE_NUM_TMU]; - } cvgDep; -#endif /* (GLIDE_PLATFORM & GLIDE_HW_CVG) */ - } hwDep; - - /* lfb config */ - FxU32 lockPtrs[2]; /* pointers to locked buffers */ - FxU32 fbStride; - - struct { - FxU32 freemem_base; - FxU32 total_mem; - FxU32 next_ncc_table; - GrMipMapId_t ncc_mmids[2]; - const GuNccTable *ncc_table[2]; - } tmu_state[GLIDE_NUM_TMU]; - - int - grSstRez, /* Video Resolution of board */ - grSstRefresh, /* Video Refresh of board */ - fbuf_size, /* in MB */ - num_tmu, /* number of TMUs attached */ - grColBuf, - grAuxBuf; - - /* sli config */ - FxBool sliPairP; /* Part of an sli pair? */ - FxBool scanline_interleaved; /* Enable sli for this pair */ - FxBool swapMasterSenseP; /* Swapped master and slave pointers */ - - struct { - GrMipMapInfo data[MAX_MIPMAPS_PER_SST]; - GrMipMapId_t free_mmid; - } mm_table; /* mip map table */ - - /* DEBUG and SANITY variables */ - FxI32 myLevel; /* debug level */ - FxI32 counter; /* counts bytes sent to HW */ - FxI32 expected_counter; /* the number of bytes expected to be sent */ - - FxU32 checkCounter; - FxU32 checkPtr; - - FxVideoTimingInfo* vidTimings;/* init code overrides */ - - FxBool open; /* Has GC Been Opened? */ - FxBool hwInitP; /* Has the hw associated w/ GC been initted and mapped? - * This is managed in _grDetectResources:gpci.c the first - * time that the board is detected, and in grSstWinOpen:gsst.c - * if the hw has been shutdown in a call to grSstWinClose. - */ - /* Oem Dll data */ -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) - void *oemInit; - OemInitInfo oemi; -#endif -} GrGC; - -/* NOTE: this changes the P6FENCE macro expansion from sst1init.h !!! */ -#define p6FenceVar _GlideRoot.p6Fencer - -/* if we are debugging, call a routine so we can trace fences */ -#ifdef GLIDE_DEBUG -#define GR_P6FENCE _grFence(); -#else -#define GR_P6FENCE P6FENCE -#endif - -/* -** The root of all Glide data, all global data is in here -** stuff near the top is accessed a lot -*/ -struct _GlideRoot_s { - int p6Fencer; /* xchg to here to keep this in cache!!! */ - int current_sst; - FxU32 CPUType; - GrGC *curGC; /* point to the current GC */ - FxU32 packerFixAddress; /* address to write packer fix to */ - FxBool windowsInit; /* Is the Windows part of glide initialized? */ - - FxI32 curTriSize; /* the size in bytes of the current triangle */ -#if GLIDE_HW_TRI_SETUP - FxI32 curVertexSize; /* Size in bytes of a single vertex's parameters */ -#endif - -#if !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP - FxU32 paramCount; - FxI32 curTriSizeNoGradient; /* special for _trisetup_nogradients */ -#endif /* !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP */ - -#if GLIDE_MULTIPLATFORM - GrGCFuncs - curGCFuncs; /* Current dd Function pointer table */ -#endif - int initialized; - - struct { /* constant pool (minimizes cache misses) */ - float f0; - float fHalf; - float f1; - float f255; - float ftemp1, ftemp2; /* temps to convert floats to ints */ - -#if GLIDE_PACKED_RGB -#define kPackBiasA _GlideRoot.pool.fBiasHi -#define kPackBiasR _GlideRoot.pool.fBiasHi -#define kPackBiasG _GlideRoot.pool.fBiasHi -#define kPackBiasB _GlideRoot.pool.fBiasLo - -#define kPackShiftA 16UL -#define kPackShiftR 8UL -#define kPackShiftG 0UL -#define kPackShiftB 0UL - -#define kPackMaskA 0x00FF00UL -#define kPackMaskR 0x00FF00UL -#define kPackMaskG 0x00FF00UL -#define kPackMaskB 0x00FFUL - - float fBiasHi; - float fBiasLo; -#endif /* GLIDE_PACKED_RGB */ - } pool; - - struct { /* environment data */ - FxBool ignoreReopen; - FxBool triBoundsCheck; /* check triangle bounds */ - FxBool noSplash; /* don't draw it */ - FxBool shamelessPlug; /* translucent 3Dfx logo in lower right */ - FxI32 swapInterval; /* swapinterval override */ - FxI32 swFifoLWM; - FxU32 snapshot; /* register trace snapshot */ - FxBool disableDitherSub; /* Turn off dither subtraction? */ - FxBool texLodDither; /* Always do lod-dithering */ - - /* Force alternate buffer strategy */ - FxI32 nColorBuffer; - FxI32 nAuxBuffer; - } environment; - - struct { - FxU32 bufferSwaps; /* number of buffer swaps */ - FxU32 pointsDrawn; - FxU32 linesDrawn; - FxU32 trisProcessed; - FxU32 trisDrawn; - - FxU32 texDownloads; /* number of texDownload calls */ - FxU32 texBytes; /* number of texture bytes downloaded */ - - FxU32 palDownloads; /* number of palette download calls */ - FxU32 palBytes; /* number of palette bytes downloaded */ - - FxU32 nccDownloads; /* # of NCC palette download calls */ - FxU32 nccBytes; /* # of NCC palette bytes downloaded */ - -#if USE_PACKET_FIFO - FxU32 fifoWraps; - FxU32 fifoWrapDepth; - FxU32 fifoStalls; - FxU32 fifoStallDepth; -#endif /* USE_PACKET_FIFO */ - } stats; - - GrHwConfiguration hwConfig; - - FxU32 gcNum; /* # of actual boards mapped */ - FxU32 gcMap[MAX_NUM_SST]; /* Logical mapping between selectable - * sst's and actual boards. - */ - GrGC GCs[MAX_NUM_SST]; /* one GC per board */ -}; - -extern struct _GlideRoot_s GR_CDECL _GlideRoot; -#if GLIDE_MULTIPLATFORM -extern GrGCFuncs _curGCFuncs; -#endif -/*==========================================================================*/ -/* Macros for declaring functions */ -#define GR_DDFUNC(name, type, args) \ - type FX_CSTYLE name args - -#define GR_ENTRY(name, type, args) \ - FX_EXPORT type FX_CSTYLE name args - -#define GR_DIENTRY(name, type, args) \ - FX_EXPORT type FX_CSTYLE name args - -#define GR_STATE_ENTRY(name, type, args) \ - GR_ENTRY(name, type, args) - -/*==========================================================================*/ - -#define STATE_REQUIRES_IT_DRGB FXBIT(0) -#define STATE_REQUIRES_IT_ALPHA FXBIT(1) -#define STATE_REQUIRES_OOZ FXBIT(2) -#define STATE_REQUIRES_OOW_FBI FXBIT(3) -#define STATE_REQUIRES_W_TMU0 FXBIT(4) -#define STATE_REQUIRES_ST_TMU0 FXBIT(5) -#define STATE_REQUIRES_W_TMU1 FXBIT(6) -#define STATE_REQUIRES_ST_TMU1 FXBIT(7) -#define STATE_REQUIRES_W_TMU2 FXBIT(8) -#define STATE_REQUIRES_ST_TMU2 FXBIT(9) - -#define GR_TMUMASK_TMU0 FXBIT(GR_TMU0) -#define GR_TMUMASK_TMU1 FXBIT(GR_TMU1) -#define GR_TMUMASK_TMU2 FXBIT(GR_TMU2) - -/* -** Parameter gradient offsets -** -** These are the offsets (in bytes)of the DPDX and DPDY registers from -** from the P register -*/ -#ifdef GLIDE_USE_ALT_REGMAP -#define DPDX_OFFSET 0x4 -#define DPDY_OFFSET 0x8 -#else -#define DPDX_OFFSET 0x20 -#define DPDY_OFFSET 0x40 -#endif - -#if (GLIDE_PLATFORM & GLIDE_HW_SST1) -#define GLIDE_DRIVER_NAME "Voodoo Graphics" -#elif (GLIDE_PLATFORM & GLIDE_HW_SST96) -#define GLIDE_DRIVER_NAME "Voodoo Rush" -#elif (GLIDE_PLATFORM & GLIDE_HW_CVG) -#define GLIDE_DRIVER_NAME "Voodoo" -#else -#define GLIDE_DRIVER_NAME "Unknown" -#endif - -/*==========================================================================*/ -#ifndef FX_GLIDE_NO_FUNC_PROTO - -void _grMipMapInit(void); - -#if GLIDE_DISPATCH_SETUP -FxI32 FX_CSTYLE -_trisetup_cull(const GrVertex *va, const GrVertex *vb, const GrVertex *vc); -FxI32 FX_CSTYLE -_trisetup(const GrVertex *va, const GrVertex *vb, const GrVertex *vc); - -#define TRISETUP_NORGB(__cullMode) (((__cullMode) == GR_CULL_DISABLE) \ - ? _trisetup \ - : _trisetup_cull) - -#if GLIDE_PACKED_RGB -FxI32 FX_CSTYLE -_trisetup_cull_rgb(const GrVertex *va, const GrVertex *vb, const GrVertex *vc); -FxI32 FX_CSTYLE -_trisetup_cull_argb(const GrVertex *va, const GrVertex *vb, const GrVertex *vc); -FxI32 FX_CSTYLE -_trisetup_rgb(const GrVertex *va, const GrVertex *vb, const GrVertex *vc); -FxI32 FX_CSTYLE -_trisetup_argb(const GrVertex *va, const GrVertex *vb, const GrVertex *vc); - -#define TRISETUP_RGB(__cullMode) (((__cullMode) == GR_CULL_DISABLE) \ - ? _trisetup_rgb \ - : _trisetup_cull_rgb) -#define TRISETUP_ARGB(__cullMode) (((__cullMode) == GR_CULL_DISABLE) \ - ? _trisetup_argb \ - : _trisetup_cull_argb) - -#else /* !GLIDE_PACKED_RGB */ -#define TRISETUP_RGB(__cullMode) TRISETUP_NORGB(__cullMode) -#define TRISETUP_ARGB(__cullMode) TRISETUP_NORGB(__cullMode) -#endif /* !GLIDE_PACKED_RGB */ -#define TRISETUP (*gc->cmdTransportInfo.triSetupProc) -#else /* !GLIDE_DISPATCH_SETUP */ -FxI32 FX_CSTYLE -_trisetup_asm(const GrVertex *va, const GrVertex *vb, const GrVertex *vc); -FxI32 FX_CSTYLE -_trisetup(const GrVertex *va, const GrVertex *vb, const GrVertex *vc); -FxI32 FX_CSTYLE -_trisetup_nogradients(const GrVertex *va, const GrVertex *vb, const GrVertex *vc); - -/* GMT: BUG need to make this dynamically switchable - That is not a bug. It is an opinion! - */ -#if GLIDE_USE_C_TRISETUP -# if (GLIDE_PLATFORM & GLIDE_HW_CVG) && USE_PACKET_FIFO -# define TRISETUP _trisetup_nogradients -# else /* !((GLIDE_PLATFORM & GLIDE_HW_CVG) && USE_PACKET_FIFO) */ -# define TRISETUP _trisetup_nogradients -# endif /* !((GLIDE_PLATFORM & GLIDE_HW_CVG) && USE_PACKET_FIFO) */ -#else /* !GLIDE_USE_C_TRISETUP */ -# define TRISETUP _trisetup_asm -#endif /* !GLIDE_USE_C_TRISETUP */ -#endif /* !GLIDE_DISPATCH_SETUP */ -#endif /* FX_GLIDE_NO_FUNC_PROTO */ - -/*==========================================================================*/ -/* -** Function Prototypes -*/ -#ifdef GLIDE_DEBUG -FxBool -_grCanSupportDepthBuffer(void); -#endif - -void -_grClipNormalizeAndGenerateRegValues(FxU32 minx, FxU32 miny, FxU32 maxx, - FxU32 maxy, FxU32 *clipLeftRight, - FxU32 *clipBottomTop); - -void -_grSwizzleColor(GrColor_t *color); - -void -_grDisplayStats(void); - -void -_GlideInitEnvironment(void); - -void FX_CSTYLE -_grColorCombineDelta0Mode(FxBool delta0Mode); - -void -_doGrErrorCallback(const char *name, const char *msg, FxBool fatal); - -void _grErrorDefaultCallback(const char *s, FxBool fatal); - -#ifdef __WIN32__ -void _grErrorWindowsCallback(const char *s, FxBool fatal); -#endif /* __WIN32__ */ - -extern void -(*GrErrorCallback)(const char *string, FxBool fatal); - -void GR_CDECL -_grFence(void); - -int -_guHeapCheck(void); - -void FX_CSTYLE -_grRebuildDataList(void); - -void -_grReCacheFifo(FxI32 n); - -FxI32 GR_CDECL -_grSpinFifo(FxI32 n); - -void -_grShamelessPlug(void); - -FxBool -_grSstDetectResources(void); - -FxU16 -_grTexFloatLODToFixedLOD(float value); - -void FX_CSTYLE -_grTexDetailControl(GrChipID_t tmu, FxU32 detail); - -void FX_CSTYLE -_grTexDownloadNccTable(GrChipID_t tmu, FxU32 which, - const GuNccTable *ncc_table, - int start, int end); - -void FX_CSTYLE -_grTexDownloadPalette(GrChipID_t tmu, - GuTexPalette *pal, - int start, int end); - -FxU32 -_grTexCalcBaseAddress( - FxU32 start_address, GrLOD_t largeLod, - GrAspectRatio_t aspect, GrTextureFormat_t fmt, - FxU32 odd_even_mask); - -void -_grTexForceLod(GrChipID_t tmu, int value); - -FxU32 -_grTexTextureMemRequired(GrLOD_t small_lod, GrLOD_t large_lod, - GrAspectRatio_t aspect, GrTextureFormat_t format, - FxU32 evenOdd); - -void FX_CSTYLE -_grUpdateParamIndex(void); - -/* ddgump.c */ -void FX_CSTYLE -_gumpTexCombineFunction(int virtual_tmu); - -/* disst.c - this is an un-documented external for arcade developers */ -extern FX_ENTRY void FX_CALL -grSstVidMode(FxU32 whichSst, FxVideoTimingInfo* vidTimings); - -/* glfb.c */ -extern FxBool -_grLfbWriteRegion(FxBool pixPipelineP, - GrBuffer_t dst_buffer, FxU32 dst_x, FxU32 dst_y, - GrLfbSrcFmt_t src_format, - FxU32 src_width, FxU32 src_height, - FxI32 src_stride, void *src_data); - -/* gglide.c - Flushes the current state in gc->state.fbi_config to the hw. - */ -extern void -_grFlushCommonStateRegs(void); - -#if USE_PACKET_FIFO -/* cvg.c */ -extern void -_grSet32(volatile FxU32* const sstAddr, const FxU32 val); - -extern FxU32 -_grGet32(volatile FxU32* const sstAddr); - -typedef struct cmdTransportInfo GrCmdTransportInfo; -extern void -_grGetCommandTransportInfo(GrCmdTransportInfo*); -#endif /* USE_PACKET_FIFO */ - -/*==========================================================================*/ -/* GMT: have to figure out when to include this and when not to -*/ -#if GLIDE_DEBUG || GLIDE_ASSERT || GLIDE_SANITY_ASSERT || GLIDE_SANITY_SIZE -#define DEBUG_MODE 1 -// #include -#endif - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) || (GLIDE_PLATFORM & GLIDE_HW_H3) - -#if ASSERT_FAULT -#define ASSERT_FAULT_IMMED(__x) if (!(__x)) { \ - *(FxU32*)NULL = 0; \ - _grAssert(#__x, __FILE__, __LINE__); \ - } -#else -#define ASSERT_FAULT_IMMED(__x) GR_ASSERT(__x) -#endif - -#if !USE_PACKET_FIFO -/* NOTE: fifoFree is the number of entries, each is 8 bytes */ -#define GR_CHECK_FOR_ROOM(n,p) \ -{ \ - FxI32 fifoFree = gc->state.fifoFree - (n); \ - if (fifoFree < 0) \ - fifoFree = _grSpinFifo(n); \ - gc->state.fifoFree = fifoFree;\ -} -#elif USE_PACKET_FIFO -/* Stuff to manage the command fifo on cvg - * - * NB: All of the addresses are in 'virtual' address space, and the - * sizes are in bytes. - */ - -/* The Voodoo^2 fifo is 4 byte aligned */ -#define FIFO_ALIGN_MASK 0x03 - -/* We claim space at the end of the fifo for: - * 1 nop (2 32-bit words) - * 1 jmp (1 32-bit word) - * 1 pad word - */ -#define FIFO_END_ADJUST (sizeof(FxU32) << 3) - -/* NB: This should be used sparingly because it does a 'real' hw read - * which is *SLOW*. - * - * NB: This address is always in sli master relative coordinates. - */ -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) -#define HW_FIFO_PTR(__masterP)\ -((FxU32)gc->cmdTransportInfo.fifoStart + \ - (GET(((SstRegs*)((__masterP) \ - ? gc->reg_ptr \ - : gc->slave_ptr))->cmdFifoReadPtr) - \ - gc->cmdTransportInfo.fifoOffset)) -#elif (GLIDE_PLATFORM & GLIDE_HW_H3) -# define HW_FIFO_PTR(__masterP) \ - ((FxU32)gc->cmdTransportInfo.fifoStart +\ - (GET(((SstCRegs*)(gc->hwDep.h3Dep.cRegs))->cmdFifo0.readPtrL)) - \ - gc->cmdTransportInfo.fifoOffset) -#else -# error "Define HW_FIFO_PTR for this hardware!" -#endif - -#if FIFO_ASSERT_FULL -extern const FxU32 kFifoCheckMask; -extern FxU32 gFifoCheckCount; - -#define FIFO_ASSERT() \ -if ((gFifoCheckCount++ & kFifoCheckMask) == 0) { \ - const FxU32 cmdFifoDepth = GR_GET(((SstRegs*)(gc->reg_ptr))->cmdFifoDepth); \ - const FxU32 maxFifoDepth = ((gc->cmdTransportInfo.fifoSize - FIFO_END_ADJUST) >> 2); \ - if(cmdFifoDepth > maxFifoDepth) { \ - gdbg_printf(__FILE__"(%ld): cmdFifoDepth > size: 0x%X : 0x%X : (0x%X : 0x%X)\n", \ - __LINE__, cmdFifoDepth, maxFifoDepth, \ - HW_FIFO_PTR(FXTRUE), gc->cmdTransportInfo.fifoPtr); \ - ASSERT_FAULT_IMMED(cmdFifoDepth <= maxFifoDepth); \ - } else if (cmdFifoDepth + (gc->cmdTransportInfo.fifoRoom >> 2) > maxFifoDepth) { \ - gdbg_printf(__FILE__"(%ld): cmdFifoDepth + fifoRoom > size: (0x%X : 0x%X) : 0x%X\n", \ - __LINE__, cmdFifoDepth, (gc->cmdTransportInfo.fifoRoom >> 2), maxFifoDepth); \ - ASSERT_FAULT_IMMED(cmdFifoDepth + (gc->cmdTransportInfo.fifoRoom >> 2) <= maxFifoDepth); \ - } \ -} \ -ASSERT_FAULT_IMMED(HW_FIFO_PTR(FXTRUE) >= (FxU32)gc->cmdTransportInfo.fifoStart); \ -ASSERT_FAULT_IMMED(HW_FIFO_PTR(FXTRUE) < (FxU32)gc->cmdTransportInfo.fifoEnd); \ -ASSERT_FAULT_IMMED((FxU32)gc->cmdTransportInfo.fifoRoom < gc->cmdTransportInfo.fifoSize); \ -ASSERT_FAULT_IMMED((FxU32)gc->cmdTransportInfo.fifoPtr < (FxU32)gc->cmdTransportInfo.fifoEnd) -#else /* !FIFO_ASSERT_FULL */ -#define FIFO_ASSERT() \ -ASSERT_FAULT_IMMED((FxU32)gc->cmdTransportInfo.fifoRoom < gc->cmdTransportInfo.fifoSize); \ -ASSERT_FAULT_IMMED((FxU32)gc->cmdTransportInfo.fifoPtr < (FxU32)gc->cmdTransportInfo.fifoEnd) -#endif /* !FIFO_ASSERT_FULL */ - -void GR_CDECL -_FifoMakeRoom(const FxI32 blockSize, const char* fName, const int fLine); - -#define GR_CHECK_FOR_ROOM(__n, __p) \ -do { \ - const FxU32 writeSize = (__n) + ((__p) * sizeof(FxU32)); /* Adjust for size of hdrs */ \ - ASSERT(((FxU32)(gc->cmdTransportInfo.fifoPtr) & FIFO_ALIGN_MASK) == 0); /* alignment */ \ - ASSERT(writeSize < gc->cmdTransportInfo.fifoSize - sizeof(FxU32)); \ - FIFO_ASSERT(); \ - if (gc->cmdTransportInfo.fifoRoom < (FxI32)writeSize) { \ - GDBG_INFO(280, "Fifo Addr Check: (0x%X : 0x%X)\n", \ - gc->cmdTransportInfo.fifoRoom, writeSize); \ - _FifoMakeRoom(writeSize, __FILE__, __LINE__); \ - } \ - ASSERT((FxU32)gc->cmdTransportInfo.fifoRoom >= writeSize); \ - FIFO_ASSERT(); \ -} while(0) -#else -#error "GR_CHECK_FOR_ROOM not defined" -#endif - -#elif (GLIDE_PLATFORM & GLIDE_HW_H3) - -#define GR_CHECK_FOR_ROOM(__n, __p) - -#endif /* GLIDE_PLATFORM & GLIDE_HW_?? */ - -#if GLIDE_SANITY_SIZE -#if USE_PACKET_FIFO - -#if GLIDE_USE_SHADOW_FIFO -#define GR_CHECK_SHADOW_FIFO \ - if ((gc != NULL) && (gc->cmdTransportInfo.fifoShadowPtr != NULL)) \ - ASSERT_FAULT_IMMED((((FxU32)gc->cmdTransportInfo.fifoPtr) & (kDebugFifoSize - 1)) == \ - (((FxU32)gc->cmdTransportInfo.fifoShadowPtr) & (kDebugFifoSize - 1))) -#else /* !GLIDE_USE_SHADOW_FIFO */ -#define GR_CHECK_SHADOW_FIFO -#endif /* !GLIDE_USE_SHADOW_FIFO */ - -#define GR_CHECK_FIFO_PTR() \ - if((FxU32)gc->cmdTransportInfo.fifoPtr != gc->checkPtr + gc->checkCounter) \ - GDBG_ERROR("GR_ASSERT_FIFO", "(%s : %d) : " \ - "fifoPtr should be 0x%X (0x%X : 0x%X) but is 0x%X\n", \ - __FILE__, __LINE__, \ - gc->checkPtr + gc->checkCounter, gc->checkPtr, gc->checkCounter, \ - gc->cmdTransportInfo.fifoPtr); \ - GR_CHECK_SHADOW_FIFO; \ - ASSERT_FAULT_IMMED((FxU32)gc->cmdTransportInfo.fifoPtr == gc->checkPtr + gc->checkCounter) -#define GR_SET_FIFO_PTR(__n, __p) \ - gc->checkPtr = (FxU32)gc->cmdTransportInfo.fifoPtr; \ - gc->checkCounter = ((__n) + ((__p) << 2)) -#else -#define GR_CHECK_FIFO_PTR() -#define GR_SET_FIFO_PTR(__n, __p) -#endif - -#define GR_CHECK_SIZE() \ - if(gc->counter != gc->expected_counter) \ - GDBG_ERROR("GR_ASSERT_SIZE","byte counter should be %d but is %d\n", \ - gc->expected_counter,gc->counter); \ - GR_CHECK_FIFO_PTR(); \ - gc->checkPtr = (FxU32)gc->cmdTransportInfo.fifoPtr; \ - gc->checkCounter = 0; \ - ASSERT(gc->counter == gc->expected_counter); \ - gc->counter = gc->expected_counter = 0 - -#define GR_SET_EXPECTED_SIZE(n,p) \ - ASSERT(gc->counter == 0); \ - ASSERT(gc->expected_counter == 0); \ - GR_CHECK_FOR_ROOM(n,p); \ - gc->expected_counter = n; \ - GR_SET_FIFO_PTR(n, p) - -#define GR_INC_SIZE(n) gc->counter += n -#else - /* define to do nothing */ - #define GR_CHECK_SIZE() - #define GR_SET_EXPECTED_SIZE(n,p) GR_CHECK_FOR_ROOM(n,p) - #define GR_INC_SIZE(n) -#endif - -#define GR_DCL_GC GrGC *gc = _GlideRoot.curGC -#define GR_DCL_HW SstRegs *hw = (SstRegs *)gc->reg_ptr - -#ifdef DEBUG_MODE -#define ASSERT(exp) GR_ASSERT(exp) - -#define GR_BEGIN_NOFIFOCHECK(name,level) \ - GR_DCL_GC; \ - GR_DCL_HW; \ - const FxI32 saveLevel = gc->myLevel; \ - static char myName[] = name; \ - GR_ASSERT(gc != NULL); \ - GR_ASSERT(hw != NULL); \ - gc->myLevel = level; \ - gc->checkPtr = (FxU32)gc->cmdTransportInfo.fifoPtr; \ - GDBG_INFO(gc->myLevel,myName); \ - FXUNUSED(saveLevel); \ - FXUNUSED(hw) -#define GR_TRACE_EXIT(__n) \ - gc->myLevel = saveLevel; \ - GDBG_INFO(281, "%s --done---------------------------------------\n", __n) -#define GR_TRACE_RETURN(__l, __n, __v) \ - gc->myLevel = saveLevel; \ - GDBG_INFO((__l), "%s() => 0x%x---------------------\n", (__n), (__v), (__v)) -#else /* !DEBUG_MODE */ -#define ASSERT(exp) -#define GR_BEGIN_NOFIFOCHECK(name,level) \ - GR_DCL_GC; \ - GR_DCL_HW; \ - FXUNUSED(hw) -#define GR_TRACE_EXIT(__n) -#define GR_TRACE_RETURN(__l, __n, __v) -#endif /* !DEBUG_MODE */ - -#define GR_BEGIN(name,level,size, packetNum) \ - GR_BEGIN_NOFIFOCHECK(name,level); \ - GR_SET_EXPECTED_SIZE(size, packetNum) - -#define GR_END() {GR_CHECK_SIZE(); GR_TRACE_EXIT(myName);} - -#define GR_RETURN(val) \ - if (GDBG_GET_DEBUGLEVEL(gc->myLevel)) { \ - GR_CHECK_SIZE(); \ - } \ - else \ - GR_END(); \ - GR_TRACE_RETURN(gc->myLevel, myName, val); \ - return val - -#if defined(GLIDE_SANITY_ASSERT) -#define GR_ASSERT(exp) ((void)((!(exp)) ? (_grAssert(#exp, __FILE__, __LINE__),0) : 0xFFFFFFFF)) -#else -#define GR_ASSERT(exp) ((void)(0 && ((FxU32)(exp)))) -#endif - -#define INTERNAL_CHECK(__name, __cond, __msg, __fatalP) \ - if (__cond) _doGrErrorCallback(__name, __msg, __fatalP) - -#if defined(GLIDE_DEBUG) -#define GR_CHECK_F(name,condition,msg) INTERNAL_CHECK(name, condition, msg, FXTRUE) -#define GR_CHECK_W(name,condition,msg) INTERNAL_CHECK(name, condition, msg, FXFALSE) -#else -#define GR_CHECK_F(name,condition,msg) -#define GR_CHECK_W(name,condition,msg) -#endif - -#if GLIDE_CHECK_COMPATABILITY -#define GR_CHECK_COMPATABILITY(__name, __cond, __msg) INTERNAL_CHECK(__name, __cond, __msg, FXTRUE) -#else -#define GR_CHECK_COMPATABILITY(__name, __cond, __msg) GR_CHECK_F(__name, __cond, __msg) -#endif /* !GLIDE_CHECK_COMPATABILITY */ - -/* macro define some basic and common GLIDE debug checks */ -#define GR_CHECK_TMU(name,tmu) \ - GR_CHECK_COMPATABILITY(name, tmu < GR_TMU0 || tmu >= gc->num_tmu , "invalid TMU specified") - -void -_grAssert(char *, char *, int); - -#if USE_PACKET_FIFO -#ifdef GDBG_INFO_ON -void _grFifoWriteDebug(FxU32 addr, FxU32 val, FxU32 fifoPtr); -#define DEBUGFIFOWRITE(a,b,c) \ -_grFifoWriteDebug((FxU32) a, (FxU32) b, (FxU32) c) -void _grFifoFWriteDebug(FxU32 addr, float val, FxU32 fifoPtr); -#define DEBUGFIFOFWRITE(a,b,c) \ -_grFifoFWriteDebug((FxU32) a, (float) b, (FxU32) c) -#else /* ~GDBG_INFO_ON */ -#define DEBUGFIFOWRITE(a,b,c) -#define DEBUGFIFOFWRITE(a,b,c) -#endif /* !GDBG_INFO_ON */ -#endif /* USE_PACKET_FIFO */ - -#if USE_PACKET_FIFO && GLIDE_USE_SHADOW_FIFO - -#undef SET -#define SET(d, s) \ -do { \ - GR_DCL_GC; \ - GR_DCL_HW; \ - volatile FxU32* __u32P = (volatile FxU32*)&(d); \ - const FxU32 __u32Val = (s); \ - if ((__u32P != &hw->swapbufferCMD) && (gc->cmdTransportInfo.fifoShadowPtr != NULL)) { \ - *gc->cmdTransportInfo.fifoShadowPtr++ = __u32Val; \ - } \ - *__u32P = __u32Val; \ -} while(0) - -#undef SETF -#define SETF(d, s) \ -do { \ - volatile float* __floatP = (volatile float*)(&(d)); \ - const float __floatVal = (s); \ - GR_DCL_GC; \ - if (gc->cmdTransportInfo.fifoShadowPtr != NULL) { \ - *(float*)gc->cmdTransportInfo.fifoShadowPtr = __floatVal; \ - gc->cmdTransportInfo.fifoShadowPtr++; \ - } \ - *__floatP = __floatVal; \ -} while(0) - -#undef SET16 -#define SET16(d, s) SET(d, (FxU32)s) -#endif /* USE_PACKET_FIFO && GLIDE_USE_DEBUG_FIFO */ - -#if SET_BSWAP -#undef GET -#undef GET16 -#undef SET -#undef SET16 -#undef SETF - -#if __POWERPC__ && defined(__MWERKS__) -#define GET(s) __lwbrx( (void*)&(s), 0 ) -#define GET16(s) __lwbrx( (void*)&(s), 0 ) -#define SET(d, s) __stwbrx((s), (void*)&(d), 0) -#define SET16(d, s) __sthbrx((s), (void*)&(d), 0 ) -#define SETF(d, s) \ - { \ - const float temp = (s); \ - __stwbrx( *((FxU32*)&temp), (void*)&(d), 0 ); \ - } -#define SET_LINEAR(d, s) SET((d), (s)) -#define SET_LINEAR_16(d, s) SET((d), ((((FxU32)(s)) >> 16UL) | \ - (((FxU32)(s)) << 16UL))) -#define SET_LINEAR_8(d, s) ((d) = (s)) -#else /* !defined(__MWERKS__) && POWERPC */ -#error "Define byte swapped macros for GET/SET" -#endif /* !defined(__MWERKS__) && POWERPC */ -#endif /* SET_BSWAP */ - -#if GLIDE_USE_DEBUG_FIFO -#define kDebugFifoSize 0x1000UL -#endif /* GLIDE_USE_DEBUG_FIFO */ - -#ifndef SET_LINEAR -#define SET_LINEAR(__addr, __val) SET(__addr, __val) -#define SET_LINEAR_16(__addr, __val) SET(__addr, __val) -#define SET_LINEAR_8(__addr, __val) SET(__addr, __val) -#endif /* !defined(SET_LINEAR) */ - -/* Extract the fp exponent from a floating point value. - * NB: The value passed to this macro must be convertable - * into an l-value. - */ -#define kFPExpMask 0x7F800000UL -#define kFPZeroMask 0x80000000UL -#define kFPExpShift 0x17UL -#define FP_FLOAT_EXP(__fpVal) ((FxU32)(((*(const FxU32*)(&(__fpVal))) & kFPExpMask) >> kFPExpShift)) -#define FP_FLOAT_ZERO(__fpVal) (((*(const FxU32*)(&(__fpVal))) & ~kFPZeroMask) == 0x00) - -/* The two most commonly defined macros in the known universe */ -#define MIN(__x, __y) (((__x) < (__y)) ? (__x) : (__y)) -#define MAX(__x, __y) (((__x) < (__y)) ? (__y) : (__x)) - -/* Simple macro to make selecting a value against a boolean flag - * simpler w/o a conditional. - * - * NB: This requires that the boolean value being passed in be the - * result of one of the standard relational operators. - */ -#define MaskSelect(__b, __val) (~(((FxU32)(__b)) - 1UL) & (__val)) - -/* Chipfield ids that glide uses. */ -#define kChipFieldShift (8UL + 3UL) -typedef enum { - eChipBroadcast = 0x00UL, - eChipFBI = 0x01UL, - eChipTMU0 = 0x02UL, - eChipTMU1 = 0x04UL, - eChipTMU2 = 0x08UL, - eChipAltBroadcast = 0x0FUL, -} FifoChipField; - -#if GLIDE_CHIP_BROADCAST && (GLIDE_PLATFORM & GLIDE_HW_CVG) -#define BROADCAST_ID eChipAltBroadcast -#else -#define BROADCAST_ID eChipBroadcast -#endif - -/* Although these are named reg_group_xxx they are generic options for - * grouping register writes and should be fine w/ and w/o the fifo - * being enabled. - */ -#if GDBG_INFO_ON -#define REG_GROUP_DCL(__regMask, __regBase, __groupNum, __checkP) \ -const FxBool _checkP = (__checkP); \ -const FxU32 _regMask = (__regMask); \ -const FxU32 _groupNum = (__groupNum); \ -FxU32 _regCheckMask = (__regMask); \ -FxU32 _regBase = offsetof(SstRegs, __regBase) - -#define REG_GROUP_ASSERT(__regAddr, __val, __floatP) \ -{ \ - const FxU32 curRegAddr = offsetof(SstRegs, __regAddr); \ - const FxU32 curRegIndex = (curRegAddr - _regBase) >> 2; \ - const FxU32 curRegBit = (0x01UL << curRegIndex); \ - const float floatVal = (const float)(__val); \ - GDBG_INFO(gc->myLevel + 200, "\t(0x%X : 0x%X) : 0x%X\n", \ - curRegIndex, curRegAddr, *(const FxU32*)&floatVal); \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - !gc->open, \ - "Called before grSstWinOpen()"); \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - (gc->cmdTransportInfo.lfbLockCount != 0), \ - "Called within grLfbLock/grLfbUnlockPair"); \ - GR_ASSERT((_regMask & curRegBit) == curRegBit); /* reg allocated in mask */ \ - if (curRegIndex > 0) \ - GR_ASSERT(((0xFFFFFFFFUL >> (32 - curRegIndex)) & _regCheckMask) == 0x00); /* All previous regs done */ \ - _regCheckMask ^= curRegBit; /* Mark current reg */ \ -} -#else /* !GDBG_INFO_ON */ -#define REG_GROUP_DCL(__regMask, __regBase, __groupNum, __checkP) -#define REG_GROUP_ASSERT(__regAddr, __val, __floatP) -#endif /* !GDBG_INFO_ON */ - -#if GLIDE_HW_TRI_SETUP -enum { - kSetupStrip = 0x00, - kSetupFan = 0x01, - kSetupCullDisable = 0x00, - kSetupCullEnable = 0x02, - kSetupCullPositive = 0x00, - kSetupCullNegative = 0x04, - kSetupPingPongNorm = 0x00, - kSetupPingPongDisable = 0x08 -}; -#endif /* GLIDE_HW_TRI_SETUP */ - -#if USE_PACKET_FIFO - -/* CVG has a problem when using the chipfield to address multiple - * tmu's and using the tsu which does not send things to different - * tmu's. We work around this by using broadcast 0xF rather than 0x0 - * in the chipfield. This macro should build a compile-time constant - * bit value that can be or-ed w/ any dynamic data. - */ -#define FIFO_REG(__chipField, __field) \ - ((((FxU32)offsetof(SstRegs, __field)) << 1) | \ - (((FxU32)(__chipField)) << kChipFieldShift)) - -/* The REG_GROUP_XXX macros do writes to a monotonically increasing - * set of registers. There are three flavors of the macros w/ - * different restrictions etc. - * - * NB: Care must be taken to order the REG_GROUP_SET macro uses to - * match the actual register order, otherwise all hell breaks loose. - */ - -/* Write to __groupNum registers (max 14) starting at __regBase under - * the control of __groupMask (lsb->msb). - */ -#define REG_GROUP_BEGIN(__chipId, __regBase, __groupNum, __groupMask) \ -GR_ASSERT(((__groupNum) >= 1) && ((__groupNum) <= 21)); \ -GR_ASSERT(((__groupMask) & (SSTCP_PKT4_MASK >> SSTCP_PKT4_MASK_SHIFT)) != 0x00); \ -GR_SET_EXPECTED_SIZE(sizeof(FxU32) * (__groupNum), 1); \ -REG_GROUP_BEGIN_INTERNAL(__chipId, __regBase, __groupNum, \ - __groupMask, (((__groupMask) << SSTCP_PKT4_MASK_SHIFT) | \ - FIFO_REG(__chipId, __regBase) | \ - SSTCP_PKT4), \ - FXTRUE) - -/* Same as the non-NO_CHECK variant, but GR_SET_EXPECTED_SIZE must - * have already been called to allocate space for this write. - */ -#define REG_GROUP_NO_CHECK_BEGIN(__chipId, __regBase, __groupNum, __groupMask) \ -GR_ASSERT(((__groupNum) >= 1) && ((__groupNum) <= 21)); \ -GR_ASSERT(((__groupMask) & (SSTCP_PKT4_MASK >> SSTCP_PKT4_MASK_SHIFT)) != 0x00); \ -GR_ASSERT(gc->expected_counter >= (FxI32)((__groupNum) * sizeof(FxU32))); \ -REG_GROUP_BEGIN_INTERNAL(__chipId, __regBase, __groupNum, \ - __groupMask, \ - (((__groupMask) << SSTCP_PKT4_MASK_SHIFT) | \ - FIFO_REG(__chipId, __regBase) | \ - SSTCP_PKT4), \ - FXFALSE) - -/* Register writes (<= 32) sequentially starting at __regBase */ -#define REG_GROUP_LONG_BEGIN(__chipId, __regBase, __groupNum) \ -GR_ASSERT(((__groupNum) >= 1) && ((__groupNum) <= 32)); \ -GR_SET_EXPECTED_SIZE(sizeof(FxU32) * (__groupNum), 1); \ -REG_GROUP_BEGIN_INTERNAL(__chipId, __regBase, __groupNum, \ - (0xFFFFFFFF >> (32 - (__groupNum))), \ - (((__groupNum) << SSTCP_PKT1_NWORDS_SHIFT) | \ - FIFO_REG(__chipId, __regBase) | \ - SSTCP_INC | \ - SSTCP_PKT1), \ - FXTRUE) - -#define REG_GROUP_BEGIN_INTERNAL(__chipId, __regBase, __groupNum, __groupMask, __pktHdr, __checkP) \ -{ \ - GR_DCL_GC; \ - volatile FxU32* _regGroupFifoPtr = gc->cmdTransportInfo.fifoPtr; \ - REG_GROUP_DCL(__groupMask, __regBase, __groupNum, __checkP); \ - GR_ASSERT(((__pktHdr) & 0xE0000000UL) == 0x00UL); \ - FIFO_ASSERT(); \ - GDBG_INFO(120, "REG_GROUP_BEGIN: (0x%X : 0x%X) : (0x%X - 0x%X : 0x%X) : (0x%X : 0x%X)\n", \ - (__pktHdr), (__groupMask), \ - FIFO_REG(__chipId, __regBase), __chipId, offsetof(SstRegs, __regBase), \ - (FxU32)gc->cmdTransportInfo.fifoPtr, gc->cmdTransportInfo.fifoRoom); \ - SET(*_regGroupFifoPtr++, (__pktHdr)) - -#define REG_GROUP_SET(__regBase, __regAddr, __val) \ -do { \ - REG_GROUP_ASSERT(__regAddr, __val, FXFALSE); \ - FXUNUSED(__regBase); \ - SET(*_regGroupFifoPtr++, (__val)); \ - GR_INC_SIZE(sizeof(FxU32)); \ -} while(0) - -#define REG_GROUP_SETF(__regBase, __regAddr, __val) \ -do { \ - REG_GROUP_ASSERT(__regAddr, __val, FXTRUE); \ - FXUNUSED(__regBase); \ - SETF(*(FxFloat*)_regGroupFifoPtr++, (__val)); \ - GR_INC_SIZE(sizeof(FxFloat)); \ -} while(0) - -#if GLIDE_FP_CLAMP -#define REG_GROUP_SETF_CLAMP(__regBase, __regAddr, __val) \ -do { \ - const FxU32 fpClampVal = FP_FLOAT_CLAMP(__val); \ - REG_GROUP_ASSERT(__regAddr, fpClampVal, FXTRUE); \ - FXUNUSED(__regBase); \ - SETF(*(FxFloat*)_regGroupFifoPtr++, fpClampVal); \ - GR_INC_SIZE(sizeof(FxU32)); \ -} while(0) -#else -#define REG_GROUP_SETF_CLAMP(__regBase, __regAddr, __val) \ - REG_GROUP_SETF(__regBase, __regAddr, __val) -#endif - -#define REG_GROUP_NO_CHECK_END() \ - ASSERT(!_checkP); \ - ASSERT((((FxU32)_regGroupFifoPtr - (FxU32)gc->cmdTransportInfo.fifoPtr) >> 2) == _groupNum + 1); \ - gc->cmdTransportInfo.fifoRoom -= ((FxU32)_regGroupFifoPtr - (FxU32)gc->cmdTransportInfo.fifoPtr); \ - gc->cmdTransportInfo.fifoPtr = (FxU32*)_regGroupFifoPtr; \ - FIFO_ASSERT(); \ -} - -#define REG_GROUP_END() \ - ASSERT(_checkP); \ - ASSERT((((FxU32)_regGroupFifoPtr - (FxU32)gc->cmdTransportInfo.fifoPtr) >> 2) == _groupNum + 1); \ - gc->cmdTransportInfo.fifoRoom -= ((FxU32)_regGroupFifoPtr - (FxU32)gc->cmdTransportInfo.fifoPtr); \ - gc->cmdTransportInfo.fifoPtr = (FxU32*)_regGroupFifoPtr; \ - GDBG_INFO(gc->myLevel + 200, "\tGroupEnd: (0x%X : 0x%X) : (0x%X : 0x%X)\n", \ - _regGroupFifoPtr, gc->cmdTransportInfo.fifoRoom, \ - HW_FIFO_PTR(FXTRUE), gc->cmdTransportInfo.fifoPtr); \ - FIFO_ASSERT(); \ -} \ -GR_CHECK_SIZE() - -#if !GLIDE_HW_TRI_SETUP || HOOPTI_TRI_SETUP_COMPARE -/* Send all of the triangle parameters in a single cmd fifo packet to - * the chip until the tsu is fixed. - */ -#define kNumTriParam 0x1FUL - -#define TRI_NO_TSU_BEGIN(__floatP) \ -GR_CHECK_COMPATABILITY(FN_NAME, \ - !gc->open, \ - "Called before grSstWinOpen()"); \ -GR_CHECK_COMPATABILITY(FN_NAME, \ - (gc->cmdTransportInfo.lfbLockCount != 0), \ - "Called within grLfbLock/grLfbUnlockPair"); \ -GR_SET_EXPECTED_SIZE(sizeof(FxU32) * kNumTriParam, 1); \ -{ \ - FxU32* noTsuFifoPtr = gc->cmdTransportInfo.fifoPtr; \ - volatile FxU32* regBaseAddr = &hw->FvA.x; \ - FIFO_ASSERT(); \ - GR_ASSERT(__floatP); \ - SET(*noTsuFifoPtr++, ((kNumTriParam << SSTCP_PKT1_NWORDS_SHIFT) | /* size (32bit words) */ \ - SSTCP_INC | /* sequential writes */ \ - FIFO_REG(BROADCAST_ID, FvA.x) | /* chip[14:10] num[9:3] */ \ - SSTCP_PKT1)); /* type (1) */ \ - GDBG_INFO(gc->myLevel, "TRI_NO_TSU_BEGIN: (fbiRegs->%svA : 0x%X)\n", \ - ((__floatP) ? "F" : ""), (FxU32)noTsuFifoPtr) - -#define TRI_NO_TSU_SET(__addr, __val) \ -do { \ - const FxU32 hwWriteAddr = (FxU32)(__addr); \ - ASSERT(hwWriteAddr == (FxU32)regBaseAddr); \ - SET(*noTsuFifoPtr++, (__val)); \ - GR_INC_SIZE(sizeof(FxU32)); \ - regBaseAddr++; \ -} while(0) - -#define TRI_NO_TSU_SETF(__addr, __val) \ -do { \ - const FxU32 hwWriteAddr = (FxU32)(__addr); \ - const FxFloat hwFloatVal = __val; \ - ASSERT(hwWriteAddr == (FxU32)regBaseAddr); \ - GDBG_INFO(gc->myLevel + 200, FN_NAME": FloatVal 0x%X : (0x%X : %g)\n", \ - ((FxU32)hwWriteAddr - (FxU32)hw) >> 2, \ - *(const FxU32*)&hwFloatVal, hwFloatVal); \ - SETF(*noTsuFifoPtr++, hwFloatVal); \ - GR_INC_SIZE(sizeof(FxU32)); \ - regBaseAddr++; \ -} while(0) - -#define TRI_NO_TSU_END() \ - gc->cmdTransportInfo.fifoRoom -= ((FxU32)noTsuFifoPtr - \ - (FxU32)gc->cmdTransportInfo.fifoPtr); \ - gc->cmdTransportInfo.fifoPtr = noTsuFifoPtr; \ - FIFO_ASSERT(); \ -} -#endif /* !GLIDE_HW_TRI_SETUP || HOOPTI_TRI_SETUP_COMPARE */ - -#define STORE_FIFO(__chipId, __base, __field, __val) \ -do { \ - FxU32* curFifoPtr = gc->cmdTransportInfo.fifoPtr; \ - FXUNUSED(__base); \ - GR_ASSERT(((FxU32)(curFifoPtr) & FIFO_ALIGN_MASK) == 0); /* alignment */ \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - !gc->open, \ - "Called before grSstWinOpen()"); \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - (gc->cmdTransportInfo.lfbLockCount != 0), \ - "Called within grLfbLock/grLfbUnlockPair"); \ - DEBUGFIFOWRITE(&((SstRegs*)(__base))->__field, __val, curFifoPtr); \ - SET(*curFifoPtr++, ((0x01 << SSTCP_PKT1_NWORDS_SHIFT) | /* size (32bit words) */ \ - FIFO_REG(__chipId, __field) | /* chip[14:10] num[9:3] */ \ - SSTCP_PKT1)); /* type (1) */ \ - SET(*curFifoPtr++, __val); \ - gc->cmdTransportInfo.fifoPtr += 2; \ - gc->cmdTransportInfo.fifoRoom -= (sizeof(FxU32) << 1); \ - FIFO_ASSERT(); \ - GR_INC_SIZE(sizeof(FxU32)); /* Size of actual write not including header */ \ -} while(0) - -#define STORE_FIFO_INDEX(__chipId, __base, __regIndex, __val) \ -do { \ - FxU32* curFifoPtr = gc->cmdTransportInfo.fifoPtr; \ - FXUNUSED(__base); \ - GR_ASSERT(((FxU32)(curFifoPtr) & FIFO_ALIGN_MASK) == 0); /* alignment */ \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - !gc->open, \ - "Called before grSstWinOpen()"); \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - (gc->cmdTransportInfo.lfbLockCount != 0), \ - "Called within grLfbLock/grLfbUnlockPair"); \ - DEBUGFIFOWRITE(&((FxU32*)(__base))[__regIndex], __val, curFifoPtr); \ - SET(*curFifoPtr++, ((0x01 << SSTCP_PKT1_NWORDS_SHIFT) | /* size (32bit words) */ \ - ((__chipId) << kChipFieldShift) | /* chip[14:10] */ \ - ((__regIndex) << 3) | /* Reg Num[9:3] */ \ - SSTCP_PKT1)); /* type (1) */ \ - SET(*curFifoPtr++, __val); \ - gc->cmdTransportInfo.fifoPtr += 2; \ - gc->cmdTransportInfo.fifoRoom -= (sizeof(FxU32) << 1); \ - FIFO_ASSERT(); \ - GR_INC_SIZE(sizeof(FxU32)); /* Size of actual write not including header */ \ -} while(0) - -#define STOREF_FIFO_INDEX(__chipId, __base, __regIndex, __val) \ -do { \ - FxU32* curFifoPtr = gc->cmdTransportInfo.fifoPtr; \ - FXUNUSED(__base); \ - GR_ASSERT(((FxU32)(curFifoPtr) & FIFO_ALIGN_MASK) == 0); /* alignment */ \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - !gc->open, \ - "Called before grSstWinOpen()"); \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - (gc->cmdTransportInfo.lfbLockCount != 0), \ - "Called within grLfbLock/grLfbUnlockPair"); \ - DEBUGFIFOFWRITE(&((FxU32*)(__base))[__regIndex], __val, curFifoPtr); \ - SET(*curFifoPtr++, ((0x01 << SSTCP_PKT1_NWORDS_SHIFT) | /* size (32bit words) */ \ - ((__chipId) << kChipFieldShift) | /* chip[14:10] */ \ - ((__regIndex) << 3) | /* Reg Num[9:3] */ \ - SSTCP_PKT1)); /* type (1) */ \ - SETF(*curFifoPtr++, __val); \ - gc->cmdTransportInfo.fifoPtr += 2; \ - gc->cmdTransportInfo.fifoRoom -= (sizeof(FxU32) << 1); \ - FIFO_ASSERT(); \ - GR_INC_SIZE(sizeof(FxU32)); /* Size of actual write not including header */ \ -} while(0) - -#define STORE16_FIFO(__chipId, __base, __field, __val) \ -do { \ - FxU32* curFifoPtr = gc->cmdTransportInfo.fifoPtr; \ - const FxU32 temp32 = (((FxU32)(__val)) & 0x0000FFFF); \ - FXUNUSED(__base); \ - ASSERT(((FxU32)(curFifoPtr) & FIFO_ALIGN_MASK) == 0); /* alignment */ \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - !gc->open, \ - "Called before grSstWinOpen()"); \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - (gc->cmdTransportInfo.lfbLockCount != 0), \ - "Called within grLfbLock/grLfbUnlockPair"); \ - DEBUGFIFOWRITE(&((SstRegs*)(__base))->__field, __val, curFifoPtr); \ - SET(*curFifoPtr++, ((0x01 << SSTCP_PKT1_NWORDS_SHIFT) | /* size (32bit words) */ \ - FIFO_REG(__chipId, __field) | /* chip[14:10] num[9:3] */ \ - SSTCP_PKT1)); /* type (1) */ \ - SET(*curFifoPtr++, temp32); \ - gc->cmdTransportInfo.fifoPtr += 2; \ - gc->cmdTransportInfo.fifoRoom -= (sizeof(FxU32) << 1); \ - FIFO_ASSERT(); \ - GR_INC_SIZE(sizeof(FxU32)); /* Size of actual write not including header */ \ -} while(0) - -#define STOREF_FIFO(__chipId, __base, __field, __val) \ -do { \ - FxU32* curFifoPtr = gc->cmdTransportInfo.fifoPtr; \ - FXUNUSED(__base); \ - ASSERT(((FxU32)(curFifoPtr) & FIFO_ALIGN_MASK) == 0); /* alignment */ \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - !gc->open, \ - "Called before grSstWinOpen()"); \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - (gc->cmdTransportInfo.lfbLockCount != 0), \ - "Called within grLfbLock/grLfbUnlockPair"); \ - DEBUGFIFOFWRITE(&((SstRegs*)(__base))->__field, __val, curFifoPtr); \ - SET(*curFifoPtr++, ((0x01 << SSTCP_PKT1_NWORDS_SHIFT) | /* size (32bit words) */ \ - FIFO_REG(__chipId, __field) | /* chip[14:10] num[9:3] */ \ - SSTCP_PKT1)); /* type (1) */ \ - SETF(*(FxFloat*)curFifoPtr, __val); \ - curFifoPtr++; \ - gc->cmdTransportInfo.fifoPtr += 2; \ - gc->cmdTransportInfo.fifoRoom -= (sizeof(FxU32) << 1); \ - FIFO_ASSERT(); \ - GR_INC_SIZE(sizeof(FxU32)); /* Size of actual write not including header */ \ -} while(0) - -/* There are now three different flavors of the packet 3 macros for - * your coding pleasure. In increasing order of complexity and control - * they are TRI_BEGIN, TRI_STRIP_BEGIN, TRI_PACKET_BEGIN. - * - * NB: All of these macros must be terminated w/ a matching invocation of - * TRI_END otherwise all sorts of hell will break loose. - * - * TRI_BEGIN: - * The simplest form that draws a single indepependent triangle whose - * parameters and culling are all the glide defaults for grDrawTriangle. - * - * TRI_STRIP_BEGIN: - * setupMode: [kSetupStrip | kSetupFan]. Culling defaults to the current - * glide setting, w/ strips/fans defaulting to ping-pong culling - * nVertex: The number of vertices for the current packet (max 15). - * vertexSize: Size in bytes of the parameters for the vertices making up - * the current packet. - * cmd: [SSTCP_PKT3_BDDBDD (Independent) - * SSTCP_PKT3_BDDDDD (Start strip/fan) - * SSTCP_PKT3_DDDDDD (Continue strip)] - * - * TRI_PACKET_BEGIN: - * setupMode: The same as with TRI_STRIP_BEGIN, except that the caller - * needs to specify the culling bits kSetupCullXXX/kSetupPingPongXXX. - * params: Bits matching the descriptin of the sMode register describing - * which parameters are specified in the packet. - * nVertex: See TRI_STRIP_BEGIN. - * vertexSize: See TRI_STRIP_BEGIN. - * cmd: See TRI_STRIP_BEGIN. - */ -#define TRI_PACKET_BEGIN(__setupMode, __params, __nVertex, __vertexSize, __cmd) \ -{ \ - FxU32* tPackPtr = gc->cmdTransportInfo.fifoPtr; \ - const FxU32 packetVal = (((__setupMode) << SSTCP_PKT3_SMODE_SHIFT) | /* [27:22] */ \ - (__params) | /* pack[28] params[21:10] */ \ - ((__nVertex) << SSTCP_PKT3_NUMVERTEX_SHIFT) | /* [9:6] */ \ - (__cmd) | /* command [5:3] */ \ - SSTCP_PKT3); /* type [2:0] */ \ - TRI_ASSERT_DECL(__nVertex, __vertexSize, packetVal); \ - SET(*tPackPtr++, packetVal) - -#define TRI_STRIP_BEGIN(__setupMode, __nVertex, __vertexSize, __cmd) \ -{ \ - FxU32* tPackPtr = gc->cmdTransportInfo.fifoPtr; \ - const FxU32 packetVal = (((__setupMode) << SSTCP_PKT3_SMODE_SHIFT) | /* [27:22] */ \ - ((__nVertex) << SSTCP_PKT3_NUMVERTEX_SHIFT) | /* [9:6] */ \ - (__cmd) | /* command [5:3] */ \ - gc->cmdTransportInfo.cullStripHdr); \ - TRI_ASSERT_DECL(__nVertex, __vertexSize, packetVal); \ - SET(*tPackPtr++, packetVal) - -#define TRI_BEGIN() \ -{ \ - FxU32* tPackPtr = gc->cmdTransportInfo.fifoPtr; \ - TRI_ASSERT_DECL(3, _GlideRoot.curVertexSize, gc->cmdTransportInfo.triPacketHdr); \ - SET(*tPackPtr++, gc->cmdTransportInfo.triPacketHdr) - -#if GDBG_INFO_ON -extern void -_grCVGFifoDump_TriHdr(const FxU32 triPacketHdr); -extern void -_grCVGFifoDump_Linear(const FxU32* const linearPacketAddr); - -#define DEBUGFIFODUMP_TRI(__packetAddr) _grCVGFifoDump_TriHdr(__packetAddr) -#define DEBUGFIFODUMP_LINEAR(__packetAddr) _grCVGFifoDump_Linear(__packetAddr) - -#define TRI_ASSERT_DECL(__nVerts, __vertSize, __packetHdr) \ - const FxU32 nVertex = (__nVerts); \ - const FxU32 sVertex = (__vertSize); \ - FxU32 pCount = 0; \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - !gc->open, \ - "Called before grSstWinOpen()"); \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - (gc->cmdTransportInfo.lfbLockCount != 0), \ - "Called within grLfbLock/grLfbUnlockPair"); \ - GR_ASSERT(((FxU32)(tPackPtr) & FIFO_ALIGN_MASK) == 0); /* alignment */ \ - GR_ASSERT((((__nVerts) * (__vertSize)) + sizeof(FxU32)) <= (FxU32)gc->cmdTransportInfo.fifoRoom); \ - GR_ASSERT((((FxU32)tPackPtr) + ((__nVerts) * (__vertSize)) + sizeof(FxU32)) < \ - (FxU32)gc->cmdTransportInfo.fifoEnd); \ - GR_ASSERT(nVertex < 0x10); \ - GR_ASSERT(nVertex > 0x00); \ - GR_ASSERT(((__packetHdr) & 0xE0000000UL) == 0x00UL); \ - FIFO_ASSERT(); \ - GDBG_INFO(120, "Triangle(0x%X): (0x%X : 0x%X)\n", (__packetHdr), __nVerts, __vertSize); \ - DEBUGFIFODUMP_TRI(__packetHdr) -#define CLAMP_DUMP(__val, __floatVal) \ - pCount++; \ - GDBG_INFO(gc->myLevel + 200, "\t(0x%X) : V#: 0x%X - P#: 0x%X - ParamVal: (%f : 0x%X)\n", \ - (FxU32)tPackPtr, \ - ((FxU32)tPackPtr - ((FxU32)gc->cmdTransportInfo.fifoPtr + sizeof(FxU32))) / sVertex, \ - (((FxU32)tPackPtr - ((FxU32)gc->cmdTransportInfo.fifoPtr + sizeof(FxU32))) % sVertex) >> 2, \ - (((__val) < 786432.875) ? (__val) : ((__val) - 786432.875)), \ - (__floatVal)) -#define SETF_DUMP(__val) \ - pCount++; \ - GDBG_INFO(gc->myLevel + 200, "\t(0x%X) : V#: 0x%X - P#: 0x%X - ParamVal: %f\n", \ - (FxU32)tPackPtr, \ - ((FxU32)tPackPtr - ((FxU32)gc->cmdTransportInfo.fifoPtr + sizeof(FxU32))) / sVertex, \ - (((FxU32)tPackPtr - ((FxU32)gc->cmdTransportInfo.fifoPtr + sizeof(FxU32))) % sVertex) >> 2, \ - (((__val) < 786432.875) ? (__val) : ((__val) - 786432.875))) -#define SET_DUMP(__val) \ - pCount++; \ - GDBG_INFO(gc->myLevel + 200, "\t(0x%X) : V#: 0x%X - P#: 0x%X - ParamVal: 0x%X\n", \ - (FxU32)tPackPtr, \ - ((FxU32)tPackPtr - ((FxU32)gc->cmdTransportInfo.fifoPtr + sizeof(FxU32))) / sVertex, \ - (((FxU32)tPackPtr - ((FxU32)gc->cmdTransportInfo.fifoPtr + sizeof(FxU32))) % sVertex) >> 2, \ - (__val)) -#define TRI_ASSERT() \ - GR_ASSERT(pCount == (nVertex * (sVertex >> 2))); \ - ASSERT(((FxU32)tPackPtr - (FxU32)gc->cmdTransportInfo.fifoPtr) == (nVertex * sVertex) + sizeof(FxU32)) -#else /* !GDBG_INFO_ON */ -#define DEBUGFIFODUMP_TRI(__packetAddr) -#define DEBUGFIFODUMP_LINEAR(__packetAddr) - -#define CLAMP_DUMP(__val, __floatVal) -#define SETF_DUMP(__val) -#define SET_DUMP(__val) - -#define TRI_ASSERT_DECL(__nVerts, __vertSize, __packetHdr) -#define TRI_ASSERT() -#endif /* !GDBG_INFO_ON */ - -/* Get the integer representation of the color component. Currently, - * following in the 'Glide is not an API for kids' tradition we'll - * probably do something silly like wrap around zero. - */ -#if GLIDE_PACKED_RGB -#define RGBA_COMP(__fpVal, __fpBias, __fpShift, __fpMask) \ -((_GlideRoot.pool.ftemp1 = (float)((float)(__fpVal) + (float)(__fpBias))), \ - GR_ASSERT((__fpVal) >= 0.0f), \ - GR_ASSERT((__fpVal) < 256.0f), \ - (((*(const FxU32*)&_GlideRoot.pool.ftemp1) & (__fpMask)) << (__fpShift))) - -#define RGBA_COMP_CLAMP(__fpVal, __compToken) \ - RGBA_COMP(__fpVal, kPackBias##__compToken, kPackShift##__compToken, kPackMask##__compToken) -#endif /* GLIDE_PACKED_RGB */ - -/* First stage tsu-subtractor chec/fix. - * Mmm..... sequence operator. - */ -#if GLIDE_FP_CLAMP -#define kFPClampThreshold 0x20UL -#define FP_FLOAT_CLAMP(__fpVal) ((FP_FLOAT_EXP(__fpVal) < kFPClampThreshold) \ - ? (_GlideRoot.stats.tsuValClamp++, 0x00UL) \ - : *(const FxU32*)(&(__fpVal))) - -#define TRI_SETF_CLAMP(__val) \ -do { \ - const FxU32 floatCastVal = FP_FLOAT_CLAMP(__val); \ - CLAMP_DUMP(__val, floatCastVal); \ - SET(*tPackPtr++, floatCastVal); \ - GR_INC_SIZE(sizeof(FxFloat)); \ -} while(0) -#else -#define TRI_SETF_CLAMP(__val) \ - TRI_SETF(__val) -#endif - -#define TRI_SETF(__val) \ -do { \ - SETF_DUMP(__val); \ - SETF(*tPackPtr++, (__val)); \ - GR_INC_SIZE(sizeof(FxFloat)); \ -} while(0) - -#define TRI_SET(__val) \ -do { \ - SET_DUMP(__val); \ - SET(*tPackPtr++, (__val)); \ - GR_INC_SIZE(sizeof(FxU32)); \ -} while(0) - -#define TRI_END \ - TRI_ASSERT(); \ - gc->cmdTransportInfo.fifoRoom -= ((FxU32)tPackPtr - (FxU32)gc->cmdTransportInfo.fifoPtr); \ - gc->cmdTransportInfo.fifoPtr = tPackPtr; \ - GDBG_INFO(gc->myLevel + 200, "\tTriEnd: (0x%X : 0x%X)\n", tPackPtr, gc->cmdTransportInfo.fifoRoom); \ - FIFO_ASSERT(); \ -} - -#define FIFO_LINEAR_WRITE_BEGIN(__numWords, __type, __addr, __maskW2, __maskWN, __f, __l) \ -{ \ - FxU32* packetPtr = gc->cmdTransportInfo.fifoPtr; \ - const FxU32 __writeSize = (__numWords); /* Add size of packet header */ \ - const FxU32 hdr1 = ((__type) | \ - (((FxU32)(__maskW2)) << SSTCP_PKT5_BYTEN_W2_SHIFT) | \ - (((FxU32)(__maskWN)) << SSTCP_PKT5_BYTEN_WN_SHIFT) | \ - (__writeSize << SSTCP_PKT5_NWORDS_SHIFT) | \ - SSTCP_PKT5); \ - const FxU32 hdr2 = ((FxU32)(__addr)) & SSTCP_PKT5_BASEADDR; \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - !gc->open, \ - "Called before grSstWinOpen()"); \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - (gc->cmdTransportInfo.lfbLockCount != 0), \ - "Called within grLfbLock/grLfbUnlockPair"); \ - GR_ASSERT(((FxU32)(packetPtr) & FIFO_ALIGN_MASK) == 0); /* alignment */ \ - GR_ASSERT((__numWords) > 0); /* packet size */ \ - GR_ASSERT((__numWords) < ((0x01 << 19) - 2)); \ - GR_ASSERT((((__numWords) + 2) << 2) <= (FxU32)gc->cmdTransportInfo.fifoRoom); \ - GR_ASSERT(((FxU32)packetPtr + (((__numWords) + 2) << 2)) < \ - (FxU32)gc->cmdTransportInfo.fifoEnd); \ - GR_ASSERT((hdr2 & 0xE0000000UL) == 0x00UL); \ - GR_ASSERT((((FxU32)(__type)) >= ((FxU32)kLinearWriteLFB)) && /* packet type */ \ - (((FxU32)(__type)) <= ((FxU32)kLinearWriteTex))); \ - FIFO_ASSERT(); \ - GDBG_INFO(120, "LinearWrite(0x%X : 0x%X)\n", hdr1, hdr2); \ - GDBG_INFO(gc->myLevel + 200, "\tFile: %s - Line: %ld\n", __f, __l); \ - GDBG_INFO(gc->myLevel + 200, "\tType: 0x%X\n", (FxU32)(__type)); \ - GDBG_INFO(gc->myLevel + 200, "\tAddr: 0x%X\n", (FxU32)(__addr)); \ - GDBG_INFO(gc->myLevel + 200, "\tMaskW2: 0x%X\n", (FxU32)(__maskW2)); \ - GDBG_INFO(gc->myLevel + 200, "\tMaskWN: 0x%X\n", (FxU32)(__maskWN)); \ - GDBG_INFO(gc->myLevel + 200, "\twriteSize: 0x%X\n", __writeSize); \ - GDBG_INFO(gc->myLevel + 200, "\thdr 1: 0x%X\n", hdr1); \ - GDBG_INFO(gc->myLevel + 200, "\thdr 2: 0x%X\n", hdr2); \ - SET(*packetPtr++, hdr1); \ - SET(*packetPtr++, hdr2); \ - GR_INC_SIZE(sizeof(FxU32)) - -#define FIFO_LINEAR_WRITE_SET(__val) \ -do { \ - GDBG_INFO(gc->myLevel + 205, "\t0x%X : 0x%X\n", packetPtr, (__val)); \ - SET_LINEAR(*packetPtr++, (__val)); \ - GR_INC_SIZE(sizeof(FxU32)); \ -} while(0) - -#define FIFO_LINEAR_WRITE_SET_16(__val) \ -do { \ - GDBG_INFO(gc->myLevel + 205, "\t0x%X : 0x%X\n", packetPtr, (__val)); \ - SET_LINEAR_16(*packetPtr++, (__val)); \ - GR_INC_SIZE(sizeof(FxU32)); \ -} while(0) - -#define FIFO_LINEAR_WRITE_SET_8(__val) \ -do { \ - GDBG_INFO(gc->myLevel + 205, "\t0x%X : 0x%X\n", packetPtr, (__val)); \ - SET_LINEAR_8(*packetPtr++, (__val)); \ - GR_INC_SIZE(sizeof(FxU32)); \ -} while(0) - -#define FIFO_LINEAR_WRITE_END \ - DEBUGFIFODUMP_LINEAR(gc->cmdTransportInfo.fifoPtr); \ - GR_ASSERT((((FxU32)packetPtr - (FxU32)gc->cmdTransportInfo.fifoPtr) >> 2) == __writeSize + 2); \ - gc->cmdTransportInfo.fifoRoom -= ((FxU32)packetPtr - (FxU32)gc->cmdTransportInfo.fifoPtr); \ - gc->cmdTransportInfo.fifoPtr = packetPtr; \ - GDBG_INFO(gc->myLevel + 200, "\tLinearEnd: (0x%X : 0x%X)\n", \ - packetPtr, gc->cmdTransportInfo.fifoRoom); \ - FIFO_ASSERT(); \ -} - -# define GR_GET(s) GET(s) -# define GR_GET16(s) ((FxU16)GET16(s)) -# define GR_SET(c, h, f, s) STORE_FIFO(c, h, f, s) -# define GR_SET_INDEX(c, h, r, s) STORE_FIFO_INDEX(c, h, r, s) -# define GR_SET16(c, h, f, s) STORE16_FIFO(c, h, f, s) -# define GR_SETF(c, h, f, s) STOREF_FIFO(c, h, f, s) -# define GR_SETF_INDEX(c, h, r, s) STOREF_FIFO_INDEX(c, h, r, s) -#else /* !USE_PACKET_FIFO */ -# define GR_GET(s) GET(s) -# define GR_GET16(s) ((FxU16)GET16(s)) -# define GR_SET(c, h, f, s) do {SET((h)->f, s); GR_INC_SIZE(4);} while(0) -# define GR_SET_INDEX(c, h, r, s) do {SET(((FxU32*)(h))[r], s); GR_INC_SIZE(sizeof(FxU32));} while(0) -# define GR_SETF(c, h, f, s) do {SETF(h->f, s); GR_INC_SIZE(4);} while(0) -# define GR_SETF_INDEX(c, h, r, s) do {SETF(((FxU32*)(h))[r], s); GR_INC_SIZE(sizeof(FxU32));} while(0) -# define GR_SET16(c, h, f, s) do {SET16((h)->f, s); GR_INC_SIZE(2);} while(0) -#endif /* !USE_PACKET_FIFO */ - -/* Macros to do linear writes to lfb/tex memory. - * - * LINEAR_WRITE_BEGIN - Setup stuff for the linear write. - * - * numWords: The number of words to actually write to the destination - * address. This does *NOT* include the packet headers etc for any - * command fifos etc. - * - * type: One of the kLinearWriteXXX enum values above. This can - * control what the legal values for addr and maskXX are. - * - * addr: Base address to the start the write. - * - * maskXX: Control what bytes in a write are active, these are active - * low. W2 controls the masking of the first 32bit word written, and - * WN controls all of the other writes. - * - * LINEAR_WRITE_SET - Writes are done in 32-bit increments, and must - * be properly aligned etc. This can only be used inside of a - * LINEAR_WRITE_BEGIN/LINEAR_WRITE_END pair. - * - * LINEAR_WRITE_EDGE - Write to a 16-bit value to an address. The - * address must be aligned for at 16-bit access, and should not appear - * within a LINEAR_WRITE_BEGIN/LINEAR_WRITE_END pair. - * - * LINEAR_WRITE_END - Finish off any stuff for the linear write. - */ - -enum { - kLinearWriteLFB = SSTCP_PKT5_3DLFB, - kLinearWriteTex = SSTCP_PKT5_TEXPORT -}; - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) -#define TEX_ROW_ADDR_INCR(__t, __lod) ((__t) << 9) -#elif (GLIDE_PLATFORM & GLIDE_HW_H3) -#define TEX_ROW_ADDR_INCR(__t, __lod) ((__t) << 7) -#else -#error "Need to define TEX_ROW_ADDR_INCR for this hw." -#endif - -#if USE_PACKET_FIFO - -#define LINEAR_WRITE_BEGIN(__numWords, __type, __addr, __maskW2, __maskWN) \ -{ \ - GR_SET_EXPECTED_SIZE(((FxU32)((__numWords) + 1UL) << 2UL), 1); \ - FIFO_LINEAR_WRITE_BEGIN(__numWords, __type, __addr, __maskW2, __maskWN, __FILE__, __LINE__) -#define LINEAR_WRITE_SET(__addr, __val) \ - FIFO_LINEAR_WRITE_SET(__val) -#define LINEAR_WRITE_SET_16(__addr, __val) \ - FIFO_LINEAR_WRITE_SET_16(__val) -#define LINEAR_WRITE_SET_8(__addr, __val) \ - FIFO_LINEAR_WRITE_SET_8(__val) -#define LINEAR_WRITE_END() \ - FIFO_LINEAR_WRITE_END; \ - GR_CHECK_SIZE(); \ -} - -/* Macro to write the edge cases of a linear write, for example to the - * lfb w/ a 16-bit pixel value. We do some address manipulation here - * since the cmd fifo only addresses 32-bit quantities, but allows us - * to mask of crap for the actual write. - */ -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) -#define FIFO_LINEAR_EDGE_MASK_ADJUST(__mask) ((~(__mask)) & 0x0FUL) -#define FIFO_LINEAR_EDGE_SET(__val) FIFO_LINEAR_WRITE_SET((((__val) & 0xFFFF0000UL) >> 16UL) | \ - (((__val) & 0x0000FFFFUL) << 16UL)) -#else -#define FIFO_LINEAR_EDGE_SET(__val) FIFO_LINEAR_WRITE_SET(__val) -#define FIFO_LINEAR_EDGE_MASK_ADJUST(__mask) (__mask) -#endif - -#define LINEAR_WRITE_EDGE(__type, __addr, __val, __valBytes) \ -do { \ - const FxU32 edgeAddr = (FxU32)(((FxU32)__addr) & 0x03UL); \ - GR_ASSERT((__valBytes) <= sizeof(FxU32)); \ - GR_ASSERT((((FxU32)(__addr)) + (__valBytes)) <= ((((FxU32)(__addr)) & ~0x03UL) + sizeof(FxU32))); \ - LINEAR_WRITE_BEGIN(1, __type, ((FxU32)__addr & ~0x03UL), \ - FIFO_LINEAR_EDGE_MASK_ADJUST((0xF0UL | (0x0FUL >> (__valBytes))) >> edgeAddr), \ - 0x00); \ - FIFO_LINEAR_EDGE_SET(((FxU32)(__val)) << (((sizeof(FxU32) - edgeAddr) << 3UL) - \ - ((__valBytes) << 3UL))); \ - LINEAR_WRITE_END(); \ -} while(0) -#else /* !USE_PACKET_FIFO */ -# define LINEAR_WRITE_BEGIN(__numWords, __type, __addr, __maskW2, __maskWN) \ -{ \ - GR_SET_EXPECTED_SIZE(((__numWords) << 2), (__numWords)) -# define LINEAR_WRITE_SET(__addr, __val) \ -do { \ - FxU32* tempAddr = (FxU32*)(__addr); \ - SET_LINEAR(*tempAddr, __val); \ - GR_INC_SIZE(sizeof(FxU32)); \ -} while(0) - -#define LINEAR_WRITE_SET_16(__addr, __val) \ -do { \ - FxU32* tempAddr = (FxU32*)(__addr); \ - SET_LINEAR_16(*tempAddr, __val); \ - GR_INC_SIZE(sizeof(FxU32)); \ -} while(0) - -#define LINEAR_WRITE_SET_8(__addr, __val) \ -do { \ - FxU32* tempAddr = (FxU32*)(__addr); \ - SET_LINEAR_8(*tempAddr, __val); \ - GR_INC_SIZE(sizeof(FxU32)); \ -} while(0) - -# define LINEAR_WRITE_EDGE(__type, __addr, __val, __isLeftP) \ -GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); \ -{ \ - FxU32* tempAddr = (FxU32*)(__addr); \ - SET16(*tempAddr, __val); \ - GR_INC_SIZE(sizeof(FxU32)); \ -} \ -GR_CHECK_SIZE() -# define LINEAR_WRITE_END() \ - GR_CHECK_SIZE(); \ -} - -/* The REG_GROUP_XXX macros do writes to a monotonically increasing - * set of registers. There are three flavors of the macros w/ - * different restrictions etc. - * - * NB: Care must be taken to order the REG_GROUP_SET macro uses to - * match the actual register order, otherwise all hell breaks loose. - */ - -/* Write to __groupNum registers (max 14) starting at __regBase under - * the control of __groupMask (lsb->msb). - */ -#define REG_GROUP_BEGIN(__chipId, __regBase, __groupNum, __groupMask) \ -GR_ASSERT(((__groupNum) >= 1) && ((__groupNum) <= 21)); \ -GR_ASSERT(((__groupMask) & (SSTCP_PKT4_MASK >> SSTCP_PKT4_MASK_SHIFT)) != 0x00); \ -GR_SET_EXPECTED_SIZE(sizeof(FxU32) * (__groupNum), 1); \ -REG_GROUP_BEGIN_INTERNAL(__regBase, __groupNum, __groupMask, FXTRUE) - -/* Same as the non-NO_CHECK variant, but GR_SET_EXPECTED_SIZE must - * have already been called to allocate space for this write. - */ -#define REG_GROUP_NO_CHECK_BEGIN(__chipId, __regBase, __groupNum, __groupMask) \ -GR_ASSERT(((__groupNum) >= 1) && ((__groupNum) <= 21)); \ -GR_ASSERT(((__groupMask) & (SSTCP_PKT4_MASK >> SSTCP_PKT4_MASK_SHIFT)) != 0x00); \ -GR_ASSERT(gc->expected_counter >= (FxI32)((__groupNum) * sizeof(FxU32))); \ -REG_GROUP_BEGIN_INTERNAL(__regBase, __groupNum, __groupMask, FXFALSE) - -/* Register writes (<= 32) sequentially starting at __regBase */ -#define REG_GROUP_LONG_BEGIN(__chipId, __regBase, __groupNum) \ -GR_ASSERT(((__groupNum) >= 1) && ((__groupNum) <= 32)); \ -GR_SET_EXPECTED_SIZE(sizeof(FxU32) * (__groupNum), 1); \ -REG_GROUP_BEGIN_INTERNAL(__regBase, __groupNum, (0xFFFFFFFF >> (32 - (__groupNum))), FXTRUE) - -#define REG_GROUP_BEGIN_INTERNAL(__regBase, __groupNum, __groupMask, __checkP) \ -{ \ - GR_DCL_GC; \ - REG_GROUP_DCL(__groupMask, __regBase, __groupNum, __checkP); \ - GDBG_INFO(gc->myLevel + 100, "REG_GROUP_BEGIN: (0x%X : 0x%X)\n", \ - (__groupMask), offsetof(SstRegs, __regBase) >> 2) - -#define REG_GROUP_SET(__regBase, __regAddr, __val) \ -do { \ - REG_GROUP_ASSERT(__regAddr, __val, FXFALSE); \ - SET(((SstRegs*)(__regBase))->__regAddr, (__val)); \ - GR_INC_SIZE(sizeof(FxU32)); \ -} while(0) - -#define REG_GROUP_SETF(__regBase, __regAddr, __val) \ -do { \ - REG_GROUP_ASSERT(__regAddr, __val, FXTRUE); \ - SETF(((SstRegs*)(__regBase))->__regAddr, (__val)); \ - GR_INC_SIZE(sizeof(FxFloat)); \ -} while(0) - -#if GLIDE_FP_CLAMP -#define REG_GROUP_SETF_CLAMP(__regBase, __regAddr, __val) \ -do { \ - const FxU32 fpClampVal = FP_FLOAT_CLAMP(__val); \ - REG_GROUP_ASSERT(__regAddr, fpClampVal, FXTRUE); \ - SET(((FxU32*)(__regBase))[offsetof(SstRegs, __regAddr) >> 2], fpClampVal); \ - GR_INC_SIZE(sizeof(FxU32)); \ -} while(0) -#else -#define REG_GROUP_SETF_CLAMP(__regBase, __regAddr, __val) \ - REG_GROUP_SETF(__regBase, __regAddr, __val) -#endif - -#define REG_GROUP_NO_CHECK_END() \ - ASSERT(!_checkP); \ -} - -#define REG_GROUP_END() \ - ASSERT(_checkP); \ -} \ -GR_CHECK_SIZE() - -#if !GLIDE_HW_TRI_SETUP || HOOPTI_TRI_SETUP_COMPARE -/* Send all of the triangle parameters in a single cmd fifo packet to - * the chip until the tsu is fixed. - */ -#define kNumTriParam 0x1FUL - -#define TRI_NO_TSU_BEGIN(__floatP) \ -GR_CHECK_COMPATABILITY(FN_NAME, \ - !gc->open, \ - "Called before grSstWinOpen()"); \ -GR_CHECK_COMPATABILITY(FN_NAME, \ - (gc->cmdTransportInfo.lfbLockCount != 0), \ - "Called within grLfbLock/grLfbUnlockPair"); \ -GR_SET_EXPECTED_SIZE(sizeof(FxU32) * kNumTriParam, 1); \ -{ \ - volatile FxU32* regBaseAddr = (volatile FxU32*)((__floatP) \ - ? &hw->FvA \ - : &hw->vA); \ - GDBG_INFO(gc->myLevel, "TRI_NO_TSU_BEGIN: fbiRegs->%svA\n", \ - ((__floatP) ? "F" : "")) - -#define TRI_NO_TSU_SET(__addr, __val) \ -do { \ - const FxU32* hwWriteAddr = (const FxU32*)(__addr); \ - ASSERT(hwWriteAddr == regBaseAddr); \ - SET(*hwWriteAddr, (__val)); \ - GR_INC_SIZE(sizeof(FxU32)); \ - regBaseAddr++; \ -} while(0) - -#define TRI_NO_TSU_SETF(__addr, __val) \ -do { \ - const FxU32* hwWriteAddr = (const FxU32*)(__addr); \ - const FxFloat hwFloatVal = __val; \ - ASSERT(hwWriteAddr == regBaseAddr); \ - GDBG_INFO(gc->myLevel + 200, FN_NAME": FloatVal 0x%X : (0x%X : %g)\n", \ - ((FxU32)hwWriteAddr - (FxU32)hw) >> 2, \ - *(const FxU32*)&hwFloatVal, hwFloatVal); \ - SETF(*hwWriteAddr, hwFloatVal); \ - GR_INC_SIZE(sizeof(FxU32)); \ - regBaseAddr++; \ -} while(0) - -#define TRI_NO_TSU_END() \ -} -#endif /* !GLIDE_HW_TRI_SETUP || HOOPTI_TRI_SETUP_COMPARE */ - -#endif /* !USE_PACKET_FIFO */ - -/* Offsets to 'virtual' addresses in the hw */ -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) -#define HW_REGISTER_OFFSET SST_3D_OFFSET -#define HW_FIFO_OFFSET 0x00200000UL -#elif (GLIDE_PLATFORM & GLIDE_HW_H3) -#define HW_IO_REG_REMAP SST_IO_OFFSET -#define HW_CMD_AGP_OFFSET SST_CMDAGP_OFFSET -#define HW_2D_REG_OFFSET SST_2D_OFFSET -#define HW_3D_REG_OFFSET SST_3D_OFFSET -#define HW_REGISTER_OFFSET HW_3D_REG_OFFSET -#else -#error "Must define virtual address spaces for this hw" -#endif - -#define HW_FIFO_OFFSET 0x00200000UL -#define HW_LFB_OFFSET SST_LFB_OFFSET -#define HW_TEXTURE_OFFSET SST_TEX_OFFSET - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) || (GLIDE_PLATFORM & GLIDE_HW_H3) -#define HW_BASE_PTR(__b) (__b) -#else -#error "Need HW_BASE_PTR to convert hw address into board address." -#endif - -#define HW_REG_PTR(__b) ((FxU32*)(((FxU32)(__b)) + HW_REGISTER_OFFSET)) -#define HW_LFB_PTR(__b) ((FxU32*)(((FxU32)(__b)) + HW_LFB_OFFSET)) -#define HW_TEX_PTR(__b) ((FxU32*)(((FxU32)(__b)) + HW_TEXTURE_OFFSET)) - -/* access a floating point array with a byte index */ -#define FARRAY(p,i) (*(float *)((i)+(int)(p))) -#define ArraySize(__a) (sizeof(__a) / sizeof((__a)[0])) - -void rle_decode_line_asm(FxU16 *tlut,FxU8 *src,FxU16 *dest); - -extern FxU16 rle_line[256]; -extern FxU16 *rle_line_end; - -#define RLE_CODE 0xE0 -#define NOT_RLE_CODE 31 - -#ifdef __WATCOMC__ -#pragma aux rle_decode_line_asm parm [edx] [edi] [esi] value [edi] modify exact [eax ebx ecx edx esi edi] = \ -" next_pixel: " \ -" xor ecx,ecx " \ -" mov al,byte ptr[edi] " \ -" mov cl,byte ptr[edi] " \ -" inc edi " \ -" " \ -" and al,0xE0 " \ -" cmp al,0xE0 " \ -" jne unique " \ -" " \ -" and cl,0x1F " \ -" mov al,cl " \ -" jz done_rle " \ -" " \ -" mov cl,byte ptr[edi] " \ -" inc edi " \ -" mov bx,word ptr[edx+ecx*2] " \ -" " \ -" copy_block: " \ -" mov word ptr[esi],bx " \ -" add esi,0x2 " \ -" dec al " \ -" jz next_pixel " \ -" jmp copy_block " \ -" " \ -" unique: " \ -" mov bx,word ptr[edx+ecx*2] " \ -" mov word ptr[esi],bx " \ -" add esi,0x2 " \ -" jmp next_pixel " \ -" done_rle: "; -#endif /* __WATCOMC__ */ - -#if GDBG_INFO_ON -/* cvg.c */ -extern void -_grErrorCallback(const char* const procName, - const char* const format, - va_list args); -#endif - -extern FxU32 GR_CDECL -_cpu_detect_asm(void); - -extern void GR_CDECL -single_precision_asm(void); - -extern void GR_CDECL -double_precision_asm(void); - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) -/* gglide.c */ -extern void -_grSliOriginClear(void); -#endif /* (GLIDE_PLATFORM & GLIDE_HW_CVG) */ - -#endif /* __FXGLIDE_H__ */ - diff --git a/glide2x/cvg/glide/src/g3df.c b/glide2x/cvg/glide/src/g3df.c deleted file mode 100644 index 5a00fb5..0000000 --- a/glide2x/cvg/glide/src/g3df.c +++ /dev/null @@ -1,558 +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 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 -#include - -#include <3dfx.h> - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" -#ifdef __linux__ -#include -#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 - */ -#ifdef __GNUC__ - /* This function is not found in libgcc.a */ - { - char* tempStr = (char*)color_format; - while(*tempStr != '\0') *tempStr++ = toupper(*tempStr); - } -#else - { - extern char* strupr(char*); - strupr(color_format); - } -#endif /* __GNUC__ */ - - 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; -} - - - diff --git a/glide2x/cvg/glide/src/gaa.c b/glide2x/cvg/glide/src/gaa.c deleted file mode 100644 index d91c87b..0000000 --- a/glide2x/cvg/glide/src/gaa.c +++ /dev/null @@ -1,1118 +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$ -** -** 64 5/18/98 12:15p Peter -** crybaby check for alpha enable -** -** 63 4/22/98 6:18p Jdt -** Optimized AA Lines. -** -** 62 2/20/98 11:00a Peter -** removed glide3 from glid2 tree - * - * 61 1/15/98 2:46p Atai - * fixed grDrawPoint and grDrawLine in aa mode - * - * 60 12/17/97 4:45p Peter - * groundwork for CrybabyGlide - * - * 59 12/12/97 12:43p Atai - * move i and dateElem into the set up loop - * - * 57 12/08/97 10:40a Atai - * modify draw vertex primitive routines to do grDrawVertexArrayLinear() - * - * 56 12/05/97 4:26p Peter - * watcom warnings - * - * 55 11/24/97 4:40p Peter - * aa prims vs packing - * - * 54 11/21/97 6:05p Atai - * use one datalist (tsuDataList) in glide3 - * - * 53 11/21/97 3:20p Peter - * direct writes tsu registers - * - * 52 11/18/97 6:11p Peter - * fixed glide3 muckage - * - * 51 11/18/97 4:36p Peter - * chipfield stuff cleanup and w/ direct writes - * - * 50 11/18/97 3:26p Atai - * update vData - * optimize state monster - * - * 49 11/17/97 4:55p Peter - * watcom warnings/chipfield stuff - * - * 48 11/06/97 6:10p Atai - * update GrState size - * rename grDrawArray to grDrawVertexArray - * update _grDrawPoint and _grDrawVertexList - * - * 47 11/04/97 6:35p Atai - * 1. sync with data structure changes - * 2. break up aa triangle routine - * - * 46 11/04/97 5:04p Peter - * cataclysm part deux - * - * 45 11/04/97 4:57p Atai - * use byte offset - * - * 44 11/03/97 3:43p Peter - * h3/cvg cataclysm - * - * 43 11/03/97 3:19p Atai - * optimization - * - * 42 10/29/97 2:45p Peter - * C version of Taco's packing code - * - * 41 10/29/97 2:24p Atai - * re-work aa draw routines to increase sbench number - * - * 40 10/21/97 8:38p Atai - * added lines routine for grDrawArray - * - * 39 10/21/97 3:22p Peter - * hand pack rgb - * - * 38 10/19/97 12:51p Peter - * no tsu happiness - * - * 37 10/17/97 3:15p Peter - * removed unused addr field from datalist - * - * 36 10/17/97 10:15a Peter - * packed rgb state cleanup - * - * 35 10/16/97 5:33p Peter - * argb != rgba - * - * 34 10/16/97 3:40p Peter - * packed rgb - * - * 33 10/16/97 1:50p Atai - * fix drawarray bugs - * - * 32 10/14/97 7:33p Atai - * fix compiler error - * - * 31 10/14/97 5:40p Atai - * added grculltest - * - * 30 10/14/97 4:36p Atai - * added aa points, strip line and trianlges for drawarray - * - * 29 10/09/97 8:02p Dow - * State Monster 1st Cut - * - * 28 10/08/97 5:19p Peter - * optinally clamp only texture params - * - * 27 10/08/97 11:32a Peter - * pre-computed packet headers for packet 3 - * - * 26 9/20/97 4:42p Peter - * tri_setf fixup/big fifo - * - * 25 9/16/97 2:49p Peter - * fixed watcom unhappiness w/ static initializers - * - * 24 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 - * - * 23 9/10/97 10:13p Peter - * fifo logic from GaryT, non-normalized fp first cut - * - * 22 8/30/97 5:58p Tarolli - * cleanups - * - * 21 7/29/97 4:31p Atai - * replace old edge sense routine - * - * 19 7/28/97 2:42p Peter - * aa points? - * - * 18 7/26/97 3:04p Peter - * cleanup - * - * 17 7/25/97 11:40a Peter - * removed dHalf, change field name to match real use for cvg - * - * 16 6/30/97 3:21p Peter - * more aa through cmd fifo - * - * 15 6/20/97 1:17p Peter - * changes for new CVG_TRI macros -** -*/ - -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -/* -** ----------------------------------------------------------------------- -** -** Antialiasing rendering functions -** -** ----------------------------------------------------------------------- -*/ - -/*--------------------------------------------------------------------------- -** grAADrawPoint -** -** |-w-| -** A---B - -** |\ /| | -** | E | h -** |/ \| | -** D --C - -** w = h = 2pixels -*/ -GR_ENTRY(grAADrawPoint, void, (const GrVertex *e)) -{ -#define FN_NAME "grAADrawPoint" - GR_DCL_GC; - GrCullMode_t cullSave; - -#if GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP - const FxU32 vertexParamOffset = _GlideRoot.curVertexSize; -#endif /* GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP */ - - GDBG_INFO(94,"grAADrawPoint(0x%x)\n",e); - - /* turn off culling so triangles unconditionally draw */ - cullSave = gc->state.cull_mode; - gc->state.cull_mode = GR_CULL_DISABLE; - - GR_CHECK_COMPATABILITY(FN_NAME, - ((gc->cmdTransportInfo.paramMask & (SST_SETUP_A << SSTCP_PKT3_PMASK_SHIFT)) == 0), - "Antialiasing require enabling alpha"); - -#if GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP - /* We draw this as a 4 triangle fan centered around E. */ - GR_SET_EXPECTED_SIZE(vertexParamOffset * 6, 1); - TRI_STRIP_BEGIN(kSetupFan, - 0x06UL, vertexParamOffset, - SSTCP_PKT3_BDDDDD); - - { - const float ptX = e->x; - const float ptY = e->y; - const float* const fp = (const float* const)e; - - /* Send down the original point center */ - TRI_SETF(ptX); - TRI_SETF(ptY); - - { - const int* dataList = gc->tsuDataList; - -#if GLIDE_PACKED_RGB - if ((gc->cmdTransportInfo.paramMask & SSTCP_PKT3_PACKEDCOLOR) != 0) { - FxU32 packedColor = 0x00; - - if (*dataList == (GR_VERTEX_R_OFFSET << 2)) { - packedColor = (RGBA_COMP_CLAMP(FARRAY(fp, (GR_VERTEX_B_OFFSET << 2)), B) | - RGBA_COMP_CLAMP(FARRAY(fp, (GR_VERTEX_G_OFFSET << 2)), G) | - RGBA_COMP_CLAMP(FARRAY(fp, (GR_VERTEX_R_OFFSET << 2)), R)); - - dataList++; - } - - packedColor |= RGBA_COMP_CLAMP(FARRAY(fp, (GR_VERTEX_A_OFFSET << 2)), A); - TRI_SET(packedColor); - } else { - TRI_SETF(FARRAY(fp, (GR_VERTEX_A_OFFSET << 2))); - } - dataList++; -#endif /* GLIDE_PACKED_RGB */ - -#if GLIDE_FP_CLAMP_TEX - while(*dataList != 0) { - TRI_SETF(FARRAY(fp, *dataList)); - dataList++; - } - - dataList++; -#endif /* GLIDE_FP_CLAMP_TEX */ - - while(*dataList != 0) { - TRI_SETF_CLAMP(FARRAY(fp, *dataList)); - dataList++; - } - } - - /* Send the 'surrounding' vertices w/ alpha == 0.0f. To avoid - * the vertex copying from the previous version we carry around - * a table of offsets that we add into the original point to get - * the new points. - */ - { - int v; - static const float xAdjust[] = { 1.0f, -1.0f, -1.0f, 1.0f, 1.0f }; - static const float yAdjust[] = { -1.0f, -1.0f, 1.0f, 1.0f, -1.0f }; - - ASSERT(ArraySize(xAdjust) == ArraySize(yAdjust)); - - for(v = 0; v < ArraySize(xAdjust); v++) { - TRI_SETF(ptX + xAdjust[v]); - TRI_SETF(ptY + yAdjust[v]); - - { - const int* dataList = gc->tsuDataList; - -#if GLIDE_PACKED_RGB - if ((gc->cmdTransportInfo.paramMask & SSTCP_PKT3_PACKEDCOLOR) != 0) { - FxU32 packedColor = 0x00; - - if (*dataList == (GR_VERTEX_R_OFFSET << 2)) { - packedColor = (RGBA_COMP_CLAMP(FARRAY(fp, (GR_VERTEX_B_OFFSET << 2)), B) | - RGBA_COMP_CLAMP(FARRAY(fp, (GR_VERTEX_G_OFFSET << 2)), G) | - RGBA_COMP_CLAMP(FARRAY(fp, (GR_VERTEX_R_OFFSET << 2)), R)); - - dataList++; - } - - TRI_SET(packedColor); - } else { - TRI_SETF(0.0f); - } -#else /* !GLIDE_PACKED_RGB */ - /* Parameters up to alpha. - * - * NB: It is up to the user to correctly set this up - * so that the alpha is sent. - */ - while(*dataList != (GR_VERTEX_A_OFFSET << 2)) { - TRI_SETF(FARRAY(fp, *dataList)); - dataList++; - } - - /* Send constant Alpha == 0.0f */ - TRI_SETF(0.0f); -#endif /* !GLIDE_PACKED_RGB */ - - /* Skip the actual alpha value in the data list */ - dataList++; - -#if GLIDE_FP_CLAMP_TEX - while(*dataList != 0) { - TRI_SETF(FARRAY(fp, *dataList)); - dataList++; - } - - dataList++; -#endif /* GLIDE_FP_CLAMP_TEX */ - - /* Anything else in the dataList */ - while(*dataList != 0) { - TRI_SETF_CLAMP(FARRAY(fp, *dataList)); - dataList++; - } - } - } - } - } - - TRI_END; - GR_CHECK_SIZE(); -#else - { - GrVertex a, b; - - /* - ** make corners of a square - */ - a = - b = *e; - - a.tmuvtx[0].oow = - b.tmuvtx[0].oow = _GlideRoot.pool.f1; - - a.x -= _GlideRoot.pool.f1; - a.y -= _GlideRoot.pool.f1; - - b.x += _GlideRoot.pool.f1; - b.y -= _GlideRoot.pool.f1; - - a.a = - b.a = _GlideRoot.pool.f0; - - grDrawTriangle(&a, &b, e); /* A B E */ - - b.x -= 2.0F; /* compute point D */ - b.y += 2.0F; - grDrawTriangle(&a, e, &b); /* A E D */ - - a.x += 2.0F; /* compute point C */ - a.y += 2.0F; - grDrawTriangle(&b, e, &a); /* D E C */ - - b.x += 2.0F; - b.y -= 2.0F; - grDrawTriangle(&a, e, &b); /* C E B */ - } -#endif /* GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP */ - - /* Restore culling mode */ - gc->state.cull_mode = cullSave; -#undef FN_NAME -} /* grAADrawPoint */ - -#if GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP -static void -grAADrawStrip(const FxU32 cullMode, const float* const vectorList[], const FxU32 vectorNum) -{ -#define FN_NAME "grAADrawStrip" - const FxU32 vertexParamOffset = _GlideRoot.curVertexSize; - - GR_BEGIN_NOFIFOCHECK(FN_NAME, gc->myLevel); - GDBG_INFO_MORE(gc->myLevel, "(): 0x%X\n", vectorNum); - - GR_FLUSH_STATE(); - - GR_SET_EXPECTED_SIZE(vertexParamOffset * vectorNum, 1); - TRI_PACKET_BEGIN(cullMode, gc->cmdTransportInfo.paramMask, - vectorNum, vertexParamOffset, - SSTCP_PKT3_BDDDDD); - { - FxU32 v; - - for(v = 0; v < vectorNum; v++) { - const float* const vector = vectorList[v]; - - TRI_SETF(vector[GR_VERTEX_X_OFFSET]); - TRI_SETF(vector[GR_VERTEX_Y_OFFSET]); - - { - const int* dataList = gc->tsuDataList; - -#if GLIDE_PACKED_RGB - if ((gc->cmdTransportInfo.paramMask & SSTCP_PKT3_PACKEDCOLOR) != 0) { - 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++; - } - - packedColor |= RGBA_COMP_CLAMP(FARRAY(vector, (GR_VERTEX_A_OFFSET << 2)), A); - TRI_SET(packedColor); - } else { - TRI_SETF(FARRAY(vector, (GR_VERTEX_A_OFFSET << 2))); - } - dataList++; -#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(); -#undef FN_NAME -} -#else /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ -/* -** grAADrawEdgeTriangle -*/ -static void -grAADrawEdgeTriangle(float *va, float *vb, float *vc) -{ - float - *fa = va, - *fb = vb, - *fc = vc, - dpAB, dpBC, - dpdx, dpdy, /* Change in parameter WRT x & y */ - area; - float - ooa, dxAB, dxBC, dyAB, dyBC; - float negateArea = -1.f; - - GR_BEGIN_NOFIFOCHECK("grAADrawEdgeTriangle",gc->myLevel); - GDBG_INFO_MORE(gc->myLevel,"()\n"); - GR_FLUSH_STATE(); - - /* - ** Sort the vertices. - ** Whenever the radial order is reversed (from counter-clockwise to - ** clockwise), we need to change the area of the triangle. Note - ** that we know the first two elements are X & Y by looking at the - ** grVertex structure. - */ - if (va[1] < vb[1]) { - if (vb[1] > vc[1]) { /* acb */ - if (va[1] < vc[1]) { - fa = va; - fb = vc; - fc = vb; - negateArea *= -1.f; - } else { /* cab */ - fa = vc; - fb = va; - fc = vb; - } - /* else it's already sorted */ - } - } else { - if (vb[1] < vc[1]) { /* bac */ - if (va[1] < vc[1]) { - fa = vb; - fb = va; - fc = vc; - negateArea *= -1.f; - } else { /* bca */ - fa = vb; - fb = vc; - fc = va; - } - } else { /* cba */ - fa = vc; - fb = vb; - fc = va; - negateArea *= -1.f; - } - } - - /* Compute Area */ - dxAB = fa[0] - fb[0]; - dxBC = fb[0] - fc[0]; - - dyAB = fa[1] - fb[1]; - dyBC = fb[1] - fc[1]; - - area = dxAB * dyBC - dxBC * dyAB; - - /* Zero-area triangles are BAD!! */ - if (area == 0.0f) goto all_done; - - ooa = 1.0f / area; - - /* - ** Divide the deltas by the area for gradient calculation. - */ - dxBC *= ooa; - dyAB *= ooa; - dxAB *= ooa; - dyBC *= ooa; - - GR_SET_EXPECTED_SIZE(((10 + (_GlideRoot.paramCount - 1)) << 2), - 10 + (_GlideRoot.paramCount - 1)); - - /* write out X & Y for vertex A */ - GR_SETF(BROADCAST_ID, hw, FvA.x, fa[0]); - GR_SETF(BROADCAST_ID, hw, FvA.y, fa[1]); - - /* write out X & Y for vertex B */ - GR_SETF(BROADCAST_ID, hw, FvB.x, fb[0]); - GR_SETF(BROADCAST_ID, hw, FvB.y, fb[1]); - - /* write out X & Y for vertex C */ - GR_SETF(BROADCAST_ID, hw, FvC.x, fc[0]); - GR_SETF(BROADCAST_ID, hw, FvC.y, fc[1]); - - dpAB = (fa[GR_VERTEX_A_OFFSET] - fb[GR_VERTEX_A_OFFSET]); - dpBC = (fb[GR_VERTEX_A_OFFSET] - fc[GR_VERTEX_A_OFFSET]); - dpdx = dpAB * dyBC - dpBC * dyAB; - dpdy = dpBC * dxAB - dpAB * dxBC; - - /* Write the alpha data */ - GR_SETF(BROADCAST_ID, hw, Fa, fa[GR_VERTEX_A_OFFSET]); - GR_SETF(BROADCAST_ID, hw, Fdadx , dpdx); - GR_SETF(BROADCAST_ID, hw, Fdady , dpdy); - - { - const struct dataList_s* dlp = gc->regDataList; - int i = dlp->i; - - /* We already put the alpha out, and this is guaranteed to - * be included in the dataList via convention. - */ - while (i != (GR_VERTEX_A_OFFSET << 2)) { - GR_SETF_INDEX(BROADCAST_ID, hw, ((FxU32*)dlp->addr - (FxU32*)hw), FARRAY(fa, i)); - dlp++; - i = dlp->i; - } - - dlp++; - i = dlp->i; - - while (i != 0) { - GR_SETF_INDEX(BROADCAST_ID, hw, ((FxU32*)dlp->addr - (FxU32*)hw), FARRAY(fa, i)); - dlp++; - i = dlp->i; - } - - /* Draw the triangle by writing the area to the triangleCMD register */ - GR_SETF(BROADCAST_ID, hw, FtriangleCMD, area); - } - -all_done: - GR_END(); -} /* grAADrawEdgeTriangle */ -#endif /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - - -#if (GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) -#define FUCAST( X ) (*(unsigned long*)&(X)) -#define FN_NAME "grAADrawLine" -GR_ENTRY(grAADrawLine, void, (const GrVertex *v1, const GrVertex *v2)) -{ - GR_DCL_GC; - GrVertex *_v1, *_v2; - const FxU32 vertexParamOffset = _GlideRoot.curVertexSize; - const int* datalist; - float xoff, yoff; - float alpha; - float dx, dy; /* delta X and Y */ - float adx, ady;/* |dX| and |dY| */ - - GR_CHECK_COMPATABILITY(FN_NAME, - ((gc->cmdTransportInfo.paramMask & (SST_SETUP_A << SSTCP_PKT3_PMASK_SHIFT)) == 0), - "Antialiasing require enabling alpha"); - - GR_SET_EXPECTED_SIZE( vertexParamOffset * 6, 1 ); - TRI_PACKET_BEGIN( 0, - gc->cmdTransportInfo.paramMask, - 6, - vertexParamOffset, - SSTCP_PKT3_BDDDDD ); - - /* y sort*/ - if (v2->y < v1->y) { - _v1 = (void*) v2; - _v2 = (void*) v1; - } else { - _v1 = (void*) v1; - _v2 = (void*) v2; - } -#define v1 _v1 -#define v2 _v2 - /* compute deltas and absolute deltas */ - - dx = v2->x - v1->x; - dy = v2->y - v1->y; - - adx = (float)(FUCAST( dx ) & 0x7fffffff); - ady = (float)(FUCAST( dy ) & 0x7fffffff); - - if ( adx >= ady ) { - xoff = 0.0f; - yoff = 1.0f; - } else { - xoff = 1.0f; - yoff = 0.0f; - } - - /* A---B Alpha = 0.0 - | \ | - V1-V2 Alpha = 1.0 ( user ) - | \ | - E---F Alpha = 0.0 -*/ - - /* B Vertex */ - TRI_SETF( v2->x + xoff ); - TRI_SETF( v2->y - yoff ); - - alpha = v2->a; - v2->a = 0.0f; - datalist = gc->tsuDataList; - - while( *datalist != 0 ) { - TRI_SETF(FARRAY(v2, *datalist)); - datalist++; - } - - v2->a = alpha; - - /* A Vertex */ - datalist = gc->tsuDataList; - - TRI_SETF( v1->x + xoff ); - TRI_SETF( v1->y - yoff ); - - alpha = v1->a; - v1->a = 0.0f; - datalist = gc->tsuDataList; - - while( *datalist != 0 ) { - TRI_SETF(FARRAY(v1, *datalist)); - datalist++; - } - - v1->a = alpha; - - /* V2 Vertex */ - datalist = gc->tsuDataList; - - TRI_SETF( v2->x ); - TRI_SETF( v2->y ); - - while( *datalist != 0 ) { - TRI_SETF(FARRAY(v2, *datalist)); - datalist++; - } - - /* V1 Vertex */ - datalist = gc->tsuDataList; - - TRI_SETF( v1->x ); - TRI_SETF( v1->y ); - - while( *datalist != 0 ) { - TRI_SETF(FARRAY(v1, *datalist)); - datalist++; - } - - /* F Vertex */ - datalist = gc->tsuDataList; - - TRI_SETF( v2->x - xoff ); - TRI_SETF( v2->y + yoff ); - - alpha = v2->a; - v2->a = 0.0f; - datalist = gc->tsuDataList; - - while( *datalist != 0 ) { - TRI_SETF(FARRAY(v2, *datalist)); - datalist++; - } - - v2->a = alpha; - - /* E Vertex */ - datalist = gc->tsuDataList; - - TRI_SETF( v1->x - xoff ); - TRI_SETF( v1->y + yoff ); - - alpha = v1->a; - v1->a = 0.0f; - datalist = gc->tsuDataList; - - - while( *datalist != 0 ) { - TRI_SETF(FARRAY(v1, *datalist)); - datalist++; - } - v1->a = alpha; - -#undef v1 -#undef v2 - TRI_END; - GR_CHECK_SIZE(); -} -#undef FN_NAME -#else /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP */ -GR_ENTRY(grAADrawLine, void, (const GrVertex *v1, const GrVertex *v2)) -{ - float dx, dy; /* delta X and Y */ - float adx, ady; /* |dX| and |dY| */ - GrVertex a, b, e, f; /* four vertices outlining the line */ - GR_DCL_GC; - - /* turn off culling so triangles unconditionally draw. - * - * NB: On cvg we control this via the command packet. - */ - GrCullMode_t cullSave = gc->state.cull_mode; - gc->state.cull_mode = GR_CULL_DISABLE; - - GDBG_INFO(95, "grAADrawLine (%f %f) -> (%f %f)\n", - v1->x, v1->y, v2->x, v2->y); - - GR_FLUSH_STATE(); - - /* draw from low Y to high Y */ - if (v2->y < v1->y) { - const GrVertex* tv = v1; v1 = v2; v2 = tv; - } - - /* compute deltas and absolute deltas */ - dx = adx = v2->x - v1->x; - dy = ady = v2->y - v1->y; - if (adx < 0) - adx = -adx; - if (ady < 0) - ady = -ady; - - a = *v1; - e = *v1; - b = *v2; - f = *v2; - - if (adx >= ady) { /* X major line */ - a.y -= _GlideRoot.pool.f1; - a.a = 0.F; - b.y -= _GlideRoot.pool.f1; - b.a = 0.F; - e.y += _GlideRoot.pool.f1; - e.a = 0.F; - f.y += _GlideRoot.pool.f1; - f.a = 0.F; - - grDrawTriangle(&a, v2, &b); - grDrawTriangle(&a, v2, v1); - grDrawTriangle(v1, &f, &e); - grDrawTriangle(v1, v2, &f); - } else { /* Y major line */ - a.x += _GlideRoot.pool.f1; - a.a = 0.F; - b.x += _GlideRoot.pool.f1; - b.a = 0.F; - e.x -= _GlideRoot.pool.f1; - e.a = 0.F; - f.x -= _GlideRoot.pool.f1; - f.a = 0.F; - - grDrawTriangle(&a, &b, v2); - grDrawTriangle(v1, &a, v2); - grDrawTriangle(v1, &f, &e); - grDrawTriangle(v1, v2, &f); - } - - gc->state.cull_mode = cullSave; -} /* grAADrawLine */ -#endif /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - -typedef enum { - aaEdgeSenseTop, - aaEdgeSenseLeft, - aaEdgeSenseBottom, - aaEdgeSenseRight -} aaEdgeSense; - -/* -** grAADrawTriEdge -*/ -static void -grAADrawTriEdge(const GrVertex *a, const GrVertex *b, aaEdgeSense sense) -{ - GrVertex c = *a, d = *b; - - c.a = 0.f; - d.a = 0.f; - - switch (sense) { - case aaEdgeSenseTop: - c.y += _GlideRoot.pool.f1; - d.y += _GlideRoot.pool.f1; - break; - - case aaEdgeSenseLeft: - c.x -= _GlideRoot.pool.f1; - d.x -= _GlideRoot.pool.f1; - break; - - case aaEdgeSenseBottom: - c.y -= _GlideRoot.pool.f1; - d.y -= _GlideRoot.pool.f1; - break; - - case aaEdgeSenseRight: - c.x += _GlideRoot.pool.f1; - d.x += _GlideRoot.pool.f1; - break; - } - -#if GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP - { - /* Maintain the same culling mode that we would have used for - * the inner triangle. - */ - GR_DCL_GC; - const FxU32 cullMode = gc->state.cull_mode; - const FxU32 sMode = ((cullMode != GR_CULL_DISABLE) - ? (kSetupCullEnable | ((cullMode == GR_CULL_POSITIVE) - ? kSetupCullPositive - : kSetupCullNegative)) - : kSetupCullDisable); - const float* lVertexList[4]; - - lVertexList[0] = &c.x; - lVertexList[1] = &d.x; - lVertexList[2] = &a->x; - lVertexList[3] = &b->x; - - grAADrawStrip(kSetupStrip | sMode, - lVertexList, - sizeof(lVertexList) / sizeof(lVertexList[0])); - } -#else /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - if (a->y < b->y) { - grAADrawEdgeTriangle((float *) a, (float *) &c, (float *) &d); - grAADrawEdgeTriangle((float *) a, (float *) &d, (float *) b); - } else { - grAADrawEdgeTriangle((float *) b, (float *) &d, (float *) &c); - grAADrawEdgeTriangle((float *) b, (float *) &c, (float *) a); - } -#endif /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ -} /* grAADrawTriEdge */ - -#define DXSQUARED(i,j) ((i->x - j->x) * (i->x - j->x)) -#define DYSQUARED(i,j) ((i->y - j->y) * (i->y - j->y)) - -/* -** -*/ -static aaEdgeSense -aaCalcEdgeSense(const GrVertex *a, const GrVertex *b, const GrVertex *c) -{ - const GrVertex *tv; - float dx, dy; - - if (a->y >= b->y) { - tv = a; a = b; b = tv; - } - dx = a->x - b->x; - dy = a->y - b->y; - - if (dx == 0.f) { - return ((c->x > a->x) ? aaEdgeSenseLeft : aaEdgeSenseRight); - } - else if (dy == 0.0f) { - return ((c->y > a->y) ? aaEdgeSenseBottom : aaEdgeSenseTop); - } - else { - float dcax, dcay, dcbx, dcby, cp; - dcax = a->x - c->x; - dcay = a->y - c->y; - dcbx = b->x - c->x; - dcby = b->y - c->y; - cp = dcax * dcby - dcay * dcbx; - - if (dx > 0.0f) { - if (dx >= -dy) /* X-major line */ - return ((cp > 0.0f) ? aaEdgeSenseTop : aaEdgeSenseBottom); - else /* Y-major line */ - return ((cp > 0.0f) ? aaEdgeSenseRight : aaEdgeSenseLeft); - } - else { - if (dx <= dy) /* X-major line */ - return ((cp < 0.0f) ? aaEdgeSenseTop : aaEdgeSenseBottom); - else /* Y-major line */ - return ((cp < 0.0f) ? aaEdgeSenseLeft : aaEdgeSenseRight); - } - } -} /* aaCalcEdgeSense */ - -/*--------------------------------------------------------------------------- -** grAADrawTriangle -** -** NOTE: This doesn't quite work yet -*/ -GR_ENTRY(grAADrawTriangle, - void, - (const GrVertex *a, const GrVertex *b, const GrVertex *c, - FxBool ab_antialias, FxBool bc_antialias, FxBool ca_antialias)) -{ -#define FN_NAME "grAADrawTriangle" - FxU32 - fbzMode, /* What we write to fbzMode */ - fbzModeOld; /* Squirrel away current fbzMode */ - aaEdgeSense - sense; /* Edge sense for edge polygons */ - - GR_BEGIN_NOFIFOCHECK(FN_NAME, 96); - GDBG_INFO_MORE(gc->myLevel,"(0x%x,0x%x,0x%x,%d,%d,%d)\n", - a,b,c,ab_antialias,bc_antialias,ca_antialias); - - GR_CHECK_COMPATABILITY(FN_NAME, - ((gc->cmdTransportInfo.paramMask & (SST_SETUP_A << SSTCP_PKT3_PMASK_SHIFT)) == 0), - "Antialiasing require enabling alpha"); - - GR_FLUSH_STATE(); - - fbzModeOld = gc->state.fbi_config.fbzMode; - - /* backfaced or zero area */ - if (TRISETUP(a, b, c) <= 0) return; - - /* Disable depth buffer writes for edge triangles */ - fbzMode = fbzModeOld; - fbzMode &= ~(SST_ZAWRMASK); - - GR_SET_EXPECTED_SIZE(4, 1); - GR_SET(BROADCAST_ID, hw, fbzMode, fbzMode); - GR_CHECK_SIZE(); - - if (ab_antialias) { - sense = aaCalcEdgeSense(a, b, c); - grAADrawTriEdge(a, b, sense); - } - - if (bc_antialias) { - sense = aaCalcEdgeSense(b, c, a); - grAADrawTriEdge(b, c, sense); - } - - if (ca_antialias) { - sense = aaCalcEdgeSense(c, a, b); - grAADrawTriEdge(c, a, sense); - } - - /* Restore the old fbzMode */ - GR_SET_EXPECTED_SIZE(4, 1); - GR_SET(BROADCAST_ID, hw, fbzMode, fbzModeOld); - GR_END(); -#undef FN_NAME -} /* grAADrawTriangle */ - -/*--------------------------------------------------------------------------- -** grAADrawPolygon -** NOTE: This routine does not do backface culling!!! -*/ - -GR_ENTRY(grAADrawPolygon, void, (const int nverts, const int ilist[], const GrVertex vlist[])) -{ -#define FN_NAME "grAADrawPolygon" - int - i = 1; /* index into ilist */ - const GrVertex - *a, *b, *c; /* What we end up sending */ - aaEdgeSense - sense; /* Edge sense for edge polygons */ - - GR_BEGIN_NOFIFOCHECK("grAADrawPolygon",97); - GDBG_INFO_MORE(gc->myLevel,"(%d,0x%x,0x%x)\n",nverts,ilist,vlist); - - GR_CHECK_COMPATABILITY(FN_NAME, - ((gc->cmdTransportInfo.paramMask & (SST_SETUP_A << SSTCP_PKT3_PMASK_SHIFT)) == 0), - "Antialiasing require enabling alpha"); - - GR_FLUSH_STATE(); - - for (i=1; i < nverts - 1; i++) { - a = &vlist[ilist[0]]; - b = &vlist[ilist[i]]; - c = &vlist[ilist[i+1]]; - if (TRISETUP (a, b, c) <= 0) /* backfaced or zero area */ - continue; - - /* - ** Always draw the BC edge. - ** On the first triangle, additionally draw the AB edge. - ** On the last triangle, draw the CA edge. - */ - if (i == 1) { - sense = aaCalcEdgeSense(a, b, c); - grAADrawTriEdge(a, b, sense); - - } else if (i == (nverts - 2)) { - sense = aaCalcEdgeSense(c, a, b); - grAADrawTriEdge(c, a, sense); - } - - sense = aaCalcEdgeSense(b, c, a); - grAADrawTriEdge(b, c, sense); - } - - GR_END(); -#undef FN_NAME -} /* grAADrawPolygon */ - -/*--------------------------------------------------------------------------- -** grAADrawPolygonVertexList -** NOTE: This routine does not do backface culling!!! -*/ - -GR_ENTRY(grAADrawPolygonVertexList, void, (const int nverts, const GrVertex vlist[])) -{ -#define FN_NAME "grAADrawPolygonVertexList" - int - i = 1; /* index into ilist */ - const GrVertex - *a, *b, *c; /* What we end up sending */ - aaEdgeSense - sense; /* Edge sense for edge polygons */ - FxI32 - res; - - GR_BEGIN_NOFIFOCHECK("grAADrawPolygonVertexList",97); - GDBG_INFO_MORE(gc->myLevel,"(%d,0x%x)\n",nverts,vlist); - - GR_CHECK_COMPATABILITY(FN_NAME, - ((gc->cmdTransportInfo.paramMask & (SST_SETUP_A << SSTCP_PKT3_PMASK_SHIFT)) == 0), - "Antialiasing require enabling alpha"); - - GR_FLUSH_STATE(); - - for (i=1; i < nverts - 1; i++) { - a = &vlist[0]; - b = &vlist[i]; - c = &vlist[i+1]; - - res = TRISETUP (a, b, c); - if (res <= 0) /* backfaced or zero area */ - continue; - - /* - ** Always draw the BC edge. - ** On the first triangle, additionally draw the AB edge. - ** On the last triangle, draw the CA edge. - */ - if (i == 1) { - sense = aaCalcEdgeSense(a, b, c); - grAADrawTriEdge(a, b, sense); - - } else if (i == (nverts - 2)) { - sense = aaCalcEdgeSense(c, a, b); - grAADrawTriEdge(c, a, sense); - } - - sense = aaCalcEdgeSense(b, c, a); - grAADrawTriEdge(b, c, sense); - - } - GR_END(); - -#undef FN_NAME -} /* grAADrawPolygonVertexList */ - - diff --git a/glide2x/cvg/glide/src/gbanner.c b/glide2x/cvg/glide/src/gbanner.c deleted file mode 100644 index 1ddfb4b..0000000 --- a/glide2x/cvg/glide/src/gbanner.c +++ /dev/null @@ -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 - -#define FX_DLL_DEFINITION -#include -#include -#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 */ - diff --git a/glide2x/cvg/glide/src/gdraw.c b/glide2x/cvg/glide/src/gdraw.c deleted file mode 100644 index 3877090..0000000 --- a/glide2x/cvg/glide/src/gdraw.c +++ /dev/null @@ -1,1130 +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.3 2000/01/17 22:18:41 joseph - ** A nicer, cleaner fix than the evil hack. - ** - ** Revision 1.2 2000/01/15 00:08:22 joseph - ** Evil nasty hack to fix dispatch code using binutils 2.9.5. - ** - ** Revision 1.1.1.1 1999/12/07 21:49:10 joseph - ** Initial checkin into SourceForge. - ** -** -** 98 6/02/98 8:03p Peter -** Mmmmm.... points -** -** 97 6/01/98 6:44p Peter -** snapped/unsnapped points -** -** 96 5/20/98 3:51p Peter -** no fifo glide -** -** 95 5/18/98 12:14p Peter -** better point code -** -** 94 2/20/98 11:00a Peter -** removed glide3 from glid2 tree -** -** 93 2/11/98 5:23p Peter -** workaround for tombraider rgb > 255.0 - * - * 92 1/15/98 2:46p Atai - * fixed grDrawPoint and grDrawLine in aa mode - * - * 90 12/17/97 4:45p Peter - * groundwork for CrybabyGlide - * - * 89 12/15/97 5:52p Atai - * disable obsolete glide2 api for glide3 - * - * 85 12/08/97 12:06p Atai - * change prototype for grDrawPoint, grDrawLine, grDrawTriangel - * - * 83 11/21/97 6:05p Atai - * use one datalist (tsuDataList) in glide3 - * - * 82 11/21/97 3:20p Peter - * direct writes tsu registers - * - * 81 11/19/97 4:33p Atai - * make vSize debug variable - * - * 80 11/18/97 4:36p Peter - * chipfield stuff cleanup and w/ direct writes - * - * 79 11/17/97 4:55p Peter - * watcom warnings/chipfield stuff - * - * 78 11/16/97 2:20p Peter - * cleanup - * - * 77 11/15/97 7:43p Peter - * more comdex silliness - * - ** - */ -#include - -#include <3dfx.h> - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -#if GLIDE_DISPATCH_SETUP -#include "fxinline.h" -#endif - -#define SST_XY_HALF (1 << (SST_XY_FRACBITS - 1)) -#define SST_XY_ONE (1 << SST_XY_FRACBITS) - -#define OUTBOUNDSX(a) ((a->x < 0.f ? 1 : 0) || (a->x > gc->state.screen_width ? 1 : 0)) -#define OUTBOUNDSY(a) ((a->y < 0.f ? 1 : 0) || (a->y > gc->state.screen_height ? 1 : 0)) -#define OUTBOUNDS(a) (OUTBOUNDSX(a) || OUTBOUNDSY(a)) - -/*--------------------------------------------------------------------------- -** grDrawPoint -*/ -GR_ENTRY(grDrawPoint, void, (const GrVertex *p)) -{ -#define FN_NAME "grDrawPoint" - FxU32 x, y; - GR_BEGIN_NOFIFOCHECK(FN_NAME, 90); - GDBG_INFO_MORE(gc->myLevel, "(0x%X) : (%f %f)\n", p, p->x, p->y); - - GR_FLUSH_STATE(); - - /* we snap to an integer by adding a large enough number that it - * shoves all fraction bits off the right side of the mantissa. - * - * NB: IEEE rounds to nearest integer by default, but applications - * can change the rounding mode so that it is difficult to get the - * correct truncation/ceiling operation w/ a simple adjustment to - * the bias. - * - * NB: The constant kNumMantissaBits defines how many bits of - * integer precision a coordinate can have. This needs to be atleast - * as large as the maximum hw screen resolution. We later use this - * to compute a logical 1/2 value to fill an entire pixel. - */ -#define kNumMantissaBits 18UL - { - const float bias = (const float)(3UL << kNumMantissaBits); - - /* Convert to 32-bit representation */ -#define FP_TRUNC_BIAS(__fpVal, __fpBias) \ - ((__fpVal) < (__fpBias) ? (float)((__fpVal) + (__fpBias)) : (__fpVal)) - _GlideRoot.pool.ftemp1 = FP_TRUNC_BIAS(p->x, bias); - _GlideRoot.pool.ftemp2 = FP_TRUNC_BIAS(p->y, bias); - - /* Mask off the real fractional bits from the mantissa */ - x = ((*(FxU32*)&_GlideRoot.pool.ftemp1 & (0xFFFFFFFFUL << (22UL - kNumMantissaBits))) + - (0x01UL << (22UL - kNumMantissaBits))); - y = ((*(FxU32*)&_GlideRoot.pool.ftemp2 & (0xFFFFFFFFUL << (22UL - kNumMantissaBits))) + - (0x01UL << (22UL - kNumMantissaBits))); - } - - /* draw a little triangle, with the lower left corner at pixel center. */ -#if GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP - /* The approach here is to split the triangle into two packets, one - * that sends just the coordinates of the last two points of the - * triangle w/ no other parameter information, and then the - * centered point w/ all of the parameter information. The first - * packet is has a BDD command, but is incomplete, so nothing - * draws, the next packet has a DDD command so will complete the - * triangle from the first packet sent. - */ - GR_SET_EXPECTED_SIZE((sizeof(FxU32) << 2) + /* Size of Initial coordinate packet */ - _GlideRoot.curVertexSize, /* The full coordinate vertex */ - 2); /* We do two split packets */ - TRI_PACKET_BEGIN(kSetupStrip | kSetupCullDisable, 0x00, - 0x02, sizeof(FxU32) << 1, SSTCP_PKT3_BDDDDD); - { - /* Lower right corner */ - TRI_SET(x); - TRI_SET(y); - - /* Upper right corner. */ - y -= (0x01UL << (21UL - kNumMantissaBits)); - TRI_SET(x); - TRI_SET(y); - - /* Upper Left corner */ - x -= (0x01UL << (21UL - kNumMantissaBits)); - } - TRI_END; - - /* Packet w/ actual point coordinate and parameter data */ - TRI_PACKET_BEGIN(kSetupStrip | kSetupCullDisable, gc->cmdTransportInfo.paramMask, - 1, _GlideRoot.curVertexSize, SSTCP_PKT3_DDDDDD); - { - TRI_SET(x); - TRI_SET(y); - - /* Vertex parameters */ - { - const int* dataList = gc->tsuDataList; - -#if GLIDE_PACKED_RGB - if ((gc->cmdTransportInfo.paramMask & SSTCP_PKT3_PACKEDCOLOR) != 0) { - FxU32 packedColor = 0x00; - - if (*dataList == (GR_VERTEX_R_OFFSET << 2)) { - packedColor = (RGBA_COMP_CLAMP(FARRAY(p, (GR_VERTEX_B_OFFSET << 2)), B) | - RGBA_COMP_CLAMP(FARRAY(p, (GR_VERTEX_G_OFFSET << 2)), G) | - RGBA_COMP_CLAMP(FARRAY(p, (GR_VERTEX_R_OFFSET << 2)), R)); - - dataList++; - } - - if (*dataList == (GR_VERTEX_A_OFFSET << 2)) { - packedColor |= RGBA_COMP_CLAMP(FARRAY(p, (GR_VERTEX_A_OFFSET << 2)), A); - dataList++; - } - - TRI_SET(packedColor); - } -#endif /* GLIDE_PACKED_RGB */ - -#if GLIDE_FP_CLAMP_TEX - while(*dataList != 0) { - TRI_SETF(FARRAY(p, *dataList)); - dataList++; - } - - dataList++; -#endif /* GLIDE_FP_CLAMP_TEX */ - - while(*dataList != 0) { - TRI_SETF_CLAMP(FARRAY(p, *dataList)); - dataList++; - } - } - } - TRI_END; - GR_CHECK_SIZE(); - - _GlideRoot.stats.pointsDrawn++; -#else /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - /* GMT: gross overestimate of fifo requirements */ - GR_SET_EXPECTED_SIZE(_GlideRoot.curTriSize, _GlideRoot.curTriSize >> 2); - { - const struct dataList_s* dlp = gc->regDataList; - int i; - -#ifdef GLIDE_USE_ALT_REGMAP - hw = SST_WRAP(hw,128); /* use alternate register mapping */ -#endif - - GR_SET(BROADCAST_ID, hw, FvA.x, x); - GR_SET(BROADCAST_ID, hw, FvA.y, y); - - x += (0x01UL << (22UL - kNumMantissaBits)); - GR_SET(BROADCAST_ID, hw, FvB.x, x); - GR_SET(BROADCAST_ID, hw, FvB.y, y); - - y += (0x01UL << (22UL - kNumMantissaBits)); - GR_SET(BROADCAST_ID, hw, FvC.x, x); - GR_SET(BROADCAST_ID, hw, FvC.y, y); - - i = _GlideRoot.stats.pointsDrawn++; - _GlideRoot.stats.pointsDrawn = ++i; - - dlp = gc->regDataList; - i = dlp->i; - - /* we don't care what the slopes are because the pixel center that is drawn */ - /* is exactly at vertex A - isn't that wonderful */ - while (i) { - GR_SETF_INDEX(BROADCAST_ID, hw, ((FxU32*)dlp->addr - (FxU32*)hw), FARRAY(p,i)); - dlp++; - i = dlp->i; - } - - GR_SET(BROADCAST_ID, hw, triangleCMD, 1); - } - GR_CHECK_SIZE(); -#endif /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - - GR_END(); -#undef FN_NAME -} /* grDrawPoint */ - -/*--------------------------------------------------------------------------- - ** grDrawLine - ** - ** NOTE: 1. this will not fill the last pixel in line because - ** B2 or C is on the right edge and the right edge is not - ** drawn. - ** (0,0) - ** - ** A(x1,y1-0.5)+ - ** | \ - ** | \ \ - ** (x1,y1)* \ - ** | * \ - ** | *\ \ - ** B1(x1,y1+0.5)+ * \ - ** \ \ * +B2(x2,y2-0.5) - ** \ * | - ** \ \ * | - ** \ \ + (x2,y2) - ** \ | - ** \ | - ** +C(x2,y2+0.5) - */ - -GR_ENTRY(grDrawLine, void, (const GrVertex *a, const GrVertex *b)) -{ -#define FN_NAME "grDrawLine" - int i, j; - -#define DX _GlideRoot.pool.ftemp1 -#define ADY _GlideRoot.pool.ftemp2 - - GR_BEGIN_NOFIFOCHECK("grDrawLine", 91); - GDBG_INFO_MORE(gc->myLevel, "A: (%f %f) B: (%f %f)\n", - a->x, a->y, b->x, b->y); - - GR_FLUSH_STATE(); - - /* - ** compute absolute deltas and draw from low Y to high Y - */ - ADY = b->y - a->y; - i = *(long *)&ADY; - if (i < 0) { - const GrVertex *tv; - tv = a; a = b; b = tv; - i ^= 0x80000000; /* ady = -ady; */ - (*(long *)&ADY) = i; - } - - DX = b->x - a->x; - j = *(long *)&DX; - if (j < 0) { - j ^= 0x80000000; /* adx = -adx; */ - } - - /* check for zero-length lines */ - if ((j >= i) && (j == 0)) goto all_done; - -#if GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP - /* One packet w/ 4 vertices */ - GR_SET_EXPECTED_SIZE((_GlideRoot.curVertexSize << 2), 1); - { - const float* const fa = (float*)a; - const float* const fb = (float*)b; - - /* Draw the triangle pair as a strip of 4 vertices. - * We can skip all of the gradient calculation stuff. - * - * NB: There are two cases, x/y major lines, and each of these - * loops are unrolled to send one set of endpoints of the 'line' - * per iteration since we can use the same bias per iteration. - */ - TRI_PACKET_BEGIN(kSetupCullDisable | kSetupStrip, gc->cmdTransportInfo.paramMask, - 0x04UL, _GlideRoot.curVertexSize, SSTCP_PKT3_BDDDDD); - { - float fBias = - _GlideRoot.pool.fHalf; - int vIndex; - - /* x macjor */ - if (j >= i) { - for(vIndex = 0; vIndex < 2; vIndex++) { - TRI_SETF(fb[GR_VERTEX_X_OFFSET]); - TRI_SETF(fb[GR_VERTEX_Y_OFFSET] + fBias); - - { - const int* dataList = gc->tsuDataList; - -#if GLIDE_PACKED_RGB - if ((gc->cmdTransportInfo.paramMask & SSTCP_PKT3_PACKEDCOLOR) != 0) { - FxU32 packedColor = 0x00; - - if (*dataList == (GR_VERTEX_R_OFFSET << 2)) { - packedColor = (RGBA_COMP_CLAMP(FARRAY(fb, (GR_VERTEX_B_OFFSET << 2)), B) | - RGBA_COMP_CLAMP(FARRAY(fb, (GR_VERTEX_G_OFFSET << 2)), G) | - RGBA_COMP_CLAMP(FARRAY(fb, (GR_VERTEX_R_OFFSET << 2)), R)); - - dataList++; - } - - if (*dataList == (GR_VERTEX_A_OFFSET << 2)) { - packedColor |= RGBA_COMP_CLAMP(FARRAY(fb, (GR_VERTEX_A_OFFSET << 2)), A); - dataList++; - } - - TRI_SET(packedColor); - } -#endif /* GLIDE_PACKED_RGB */ - -#if GLIDE_FP_CLAMP_TEX - while(*dataList != 0) { - TRI_SETF(FARRAY(fb, *dataList)); - dataList++; - } - - dataList++; -#endif /* GLIDE_FP_CLAMP_TEX */ - - while(*dataList != 0) { - TRI_SETF_CLAMP(FARRAY(fb, *dataList)); - dataList++; - } - } - - TRI_SETF(fa[GR_VERTEX_X_OFFSET]); - TRI_SETF(fa[GR_VERTEX_Y_OFFSET] + fBias); - - { - const int* dataList = gc->tsuDataList; - -#if GLIDE_PACKED_RGB - if ((gc->cmdTransportInfo.paramMask & SSTCP_PKT3_PACKEDCOLOR) != 0) { - FxU32 packedColor = 0x00; - - if (*dataList == (GR_VERTEX_R_OFFSET << 2)) { - packedColor = (RGBA_COMP_CLAMP(FARRAY(fa, (GR_VERTEX_B_OFFSET << 2)), B) | - RGBA_COMP_CLAMP(FARRAY(fa, (GR_VERTEX_G_OFFSET << 2)), G) | - RGBA_COMP_CLAMP(FARRAY(fa, (GR_VERTEX_R_OFFSET << 2)), R)); - - dataList++; - } - - if (*dataList == (GR_VERTEX_A_OFFSET << 2)) { - packedColor |= RGBA_COMP_CLAMP(FARRAY(fa, (GR_VERTEX_A_OFFSET << 2)), A); - dataList++; - } - - TRI_SET(packedColor); - } -#endif /* GLIDE_PACKED_RGB */ - -#if GLIDE_FP_CLAMP_TEX - while(*dataList != 0) { - TRI_SETF(FARRAY(fa, *dataList)); - dataList++; - } - - dataList++; -#endif /* GLIDE_FP_CLAMP_TEX */ - - while (*dataList != 0) { - TRI_SETF_CLAMP(FARRAY(fa, *dataList)); - dataList++; - } - } - - fBias *= -1.0f; - } - } else { /* y major */ - for(vIndex = 0; vIndex < 2; vIndex++) { - TRI_SETF(fb[GR_VERTEX_X_OFFSET] + fBias); - TRI_SETF(fb[GR_VERTEX_Y_OFFSET]); - - { - const int* dataList = gc->tsuDataList; - -#if GLIDE_PACKED_RGB - if ((gc->cmdTransportInfo.paramMask & SSTCP_PKT3_PACKEDCOLOR) != 0) { - FxU32 packedColor = 0x00; - - if (*dataList == (GR_VERTEX_R_OFFSET << 2)) { - packedColor = (RGBA_COMP_CLAMP(FARRAY(fb, (GR_VERTEX_B_OFFSET << 2)), B) | - RGBA_COMP_CLAMP(FARRAY(fb, (GR_VERTEX_G_OFFSET << 2)), G) | - RGBA_COMP_CLAMP(FARRAY(fb, (GR_VERTEX_R_OFFSET << 2)), R)); - - dataList++; - } - - if (*dataList == (GR_VERTEX_A_OFFSET << 2)) { - packedColor |= RGBA_COMP_CLAMP(FARRAY(fb, (GR_VERTEX_A_OFFSET << 2)), A); - dataList++; - } - - TRI_SET(packedColor); - } -#endif /* GLIDE_PACKED_RGB */ - -#if GLIDE_FP_CLAMP_TEX - while(*dataList != 0) { - TRI_SETF(FARRAY(fb, *dataList)); - dataList++; - } - - dataList++; -#endif /* GLIDE_FP_CLAMP_TEX */ - - while (*dataList != 0) { - TRI_SETF_CLAMP(FARRAY(fb, *dataList)); - dataList++; - } - } - - TRI_SETF(fa[GR_VERTEX_X_OFFSET] + fBias); - TRI_SETF(fa[GR_VERTEX_Y_OFFSET]); - - { - const int* dataList = gc->tsuDataList; - -#if GLIDE_PACKED_RGB - if ((gc->cmdTransportInfo.paramMask & SSTCP_PKT3_PACKEDCOLOR) != 0) { - FxU32 packedColor = 0x00; - - if (*dataList == (GR_VERTEX_R_OFFSET << 2)) { - packedColor = (RGBA_COMP_CLAMP(FARRAY(fa, (GR_VERTEX_B_OFFSET << 2)), B) | - RGBA_COMP_CLAMP(FARRAY(fa, (GR_VERTEX_G_OFFSET << 2)), G) | - RGBA_COMP_CLAMP(FARRAY(fa, (GR_VERTEX_R_OFFSET << 2)), R)); - - dataList++; - } - - if (*dataList == (GR_VERTEX_A_OFFSET << 2)) { - packedColor |= RGBA_COMP_CLAMP(FARRAY(fa, (GR_VERTEX_A_OFFSET << 2)), A); - dataList++; - } - - TRI_SET(packedColor); - } -#endif /* GLIDE_PACKED_RGB */ - -#if GLIDE_FP_CLAMP_TEX - while(*dataList != 0) { - TRI_SETF(FARRAY(fa, *dataList)); - dataList++; - } - - dataList++; -#endif /* GLIDE_FP_CLAMP_TEX */ - - while (*dataList != 0) { - TRI_SETF_CLAMP(FARRAY(fa, *dataList)); - dataList++; - } - } - - fBias *= -1.0f; - } - } - } - TRI_END; - } - GR_CHECK_SIZE(); -#else /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ -#ifdef GLIDE_USE_ALT_REGMAP - hw = SST_WRAP(hw,128); /* use alternate register mapping */ -#endif - - GR_SET_EXPECTED_SIZE(12 + _GlideRoot.curTriSize, (_GlideRoot.curTriSize + 12) >> 2); - { - float m, dp; - struct dataList_s* dlp; - - /* - ** X major line - */ - if (j >= i) { /* if (adx > ady) */ - if (j == 0) goto all_done; /* check for zero-length lines */ - /* start up divide and overlap with as much integer stuff as possible*/ - m = _GlideRoot.pool.f1 / DX; - dlp = gc->regDataList; - GR_SETF(BROADCAST_ID, hw, FvA.x, a->x); - dp = b->x; - GR_SETF(BROADCAST_ID, hw, FvB.x, dp); - GR_SETF(BROADCAST_ID, hw, FvC.x, dp); - - GR_SETF(BROADCAST_ID, hw, FvA.y, a->y - _GlideRoot.pool.fHalf); - - dp = b->y; - GR_SETF(BROADCAST_ID, hw, FvB.y, dp - _GlideRoot.pool.fHalf); - - i = dlp->i; - GR_SETF(BROADCAST_ID, hw, FvC.y, dp + _GlideRoot.pool.fHalf); - - while (i) { - dp = FARRAY(a,i); - GR_SETF_INDEX(BROADCAST_ID, hw, - ((FxU32*)dlp->addr - (FxU32*)hw), dp); - - dp = FARRAY(b,i) - dp; - GR_SETF_INDEX(BROADCAST_ID, hw, - ((FxU32*)&dlp->addr[DPDX_OFFSET >> 2] - (FxU32*)hw), dp * m); - - dlp++; - i = dlp->i; - GR_SETF_INDEX(BROADCAST_ID, hw, - ((FxU32*)&dlp->addr[DPDY_OFFSET >> 2] - (FxU32*)hw), _GlideRoot.pool.f0); - } - GR_SETF(BROADCAST_ID, hw, FtriangleCMD,_GlideRoot.pool.ftemp1); - - GR_SETF(BROADCAST_ID, hw, FvB.x,a->x); - GR_SETF(BROADCAST_ID, hw, FvB.y,a->y + _GlideRoot.pool.fHalf); - GR_SETF(BROADCAST_ID, hw, FtriangleCMD,-_GlideRoot.pool.ftemp1); - } - - /* - ** Y major line - */ - else { - m = _GlideRoot.pool.f1 / ADY; - dlp = gc->regDataList; - GR_SETF(BROADCAST_ID, hw, FvA.y,a->y); - dp = b->y; - GR_SETF(BROADCAST_ID, hw, FvB.y,dp); - GR_SETF(BROADCAST_ID, hw, FvC.y,dp); - - GR_SETF(BROADCAST_ID, hw, FvA.x,a->x - _GlideRoot.pool.fHalf); - - dp = b->x; - GR_SETF(BROADCAST_ID, hw, FvB.x,dp - _GlideRoot.pool.fHalf); - - i = dlp->i; - GR_SETF(BROADCAST_ID, hw, FvC.x,dp + _GlideRoot.pool.fHalf); - - while (i) { - dp = FARRAY(a,i); - GR_SETF_INDEX(BROADCAST_ID, hw, ((FxU32*)dlp->addr - (FxU32*)hw), dp); - - dp = FARRAY(b,i) - dp; - GR_SETF_INDEX(BROADCAST_ID, hw, - ((FxU32*)&dlp->addr[DPDX_OFFSET >> 2] - (FxU32*)hw), _GlideRoot.pool.f0); - - dlp++; - i = dlp->i; - GR_SETF_INDEX(BROADCAST_ID, hw, - ((FxU32*)&dlp->addr[DPDY_OFFSET >> 2] - (FxU32*)hw), dp * m); - } - GR_SET(BROADCAST_ID, hw, triangleCMD, 0xFFFFFFFF); - - GR_SETF(BROADCAST_ID, hw, FvB.x, a->x + _GlideRoot.pool.fHalf); - GR_SETF(BROADCAST_ID, hw, FvB.y, a->y); - GR_SET(BROADCAST_ID, hw, triangleCMD, 1); - } - } - GR_CHECK_SIZE(); -#endif /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - -all_done: /* come here on degenerate lines */ - _GlideRoot.stats.linesDrawn++; - - GR_END(); -#undef FN_NAME -} /* grDrawLine */ - -/*--------------------------------------------------------------------------- - ** grDrawTriangle - */ - -GR_ENTRY(grDrawTriangle, void, (const GrVertex *a, const GrVertex *b, const GrVertex *c)) -{ -#define FN_NAME grDrawTriangle -#if defined(GLIDE_USE_C_TRISETUP) || defined(__WATCOMC__) || defined(GLIDE_DEBUG) - GR_BEGIN_NOFIFOCHECK("grDrawTriangle",92); - 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"); - - GR_FLUSH_STATE(); - - /* Silly warning killer */ - if (0) goto all_done; - -#ifdef GLIDE_DEBUG - if (_GlideRoot.environment.triBoundsCheck) { - if (OUTBOUNDS(a) || OUTBOUNDS(b) || OUTBOUNDS(c)) { - GDBG_PRINTF("Triangle out of bounds:\n"); - GDBG_PRINTF("a->x = %3.2f, a->y = %3.2f\n", a->x, a->y); - GDBG_PRINTF("b->x = %3.2f, b->y = %3.2f\n", b->x, b->y); - GDBG_PRINTF("c->x = %3.2f, c->y = %3.2f\n", c->x, c->y); - GDBG_PRINTF("Culling triangle based on these bogus values.\n"); - goto all_done; - } - } -#endif /* GLIDE_DEBUG */ - - /* _trisetup and _trisetup_asm return 0 if culled, 1 if drawn */ -#if GLIDE_DEBUG && !GLIDE_USE_C_TRISETUP - /* HackAlert: Nuke the fifo ptr checking stuff here if we're just - * debugging teh asm tri code. - */ - if (TRISETUP(a, b, c) != 0) { - gc->checkPtr = (FxU32)gc->cmdTransportInfo.fifoPtr; - gc->checkCounter = 0; - } -#else - TRISETUP(a, b, c); -#endif - -all_done: - GR_END(); -#else -#if defined(__MSC__) - { - extern struct _GlideRoot_s _GlideRoot; - - _asm { - mov eax, [_GlideRoot + kCurGCOffset]; - mov eax, [eax + kTriProcOffset]; - jmp eax; - } - } -#endif -#if defined( __linux__ ) - - /* Here's the basic strategy for this dispatch code: - * We jump to _GlideRoot.curGC->archDispatchProcs.triSetupProc - * which contains code that looks like a function, we leave the - * paramters passed to grDrawTriangle on the stack and the dispatched - * function picks them up. However we have to compensate for - * the compiler pushing anything on the stack. The following describes - * why and when we have to pop. - * - * BIG_OPT: gcc pushes a frame pointer to maintain things, BIG_OPT - * turns on -fomit-frame-pointer so we don't have to pop it. - * - * PIC: When using position independant code gcc stores eip in ebx - * so it saves ebx from the previous call automatically. - * Therefore, once we have the jump address we have to pop ebx - * to restore the stack. - * - * The syntax is further complicated by the fact that gcc can (and will) - * emit code between the asm statements, so they all need to be in a single - * asm statement, wrapped with #ifdef's. This means we have fun with - * deciding if we need to list trashed registers and when we need commas - * between them. - */ - - asm ( -#if defined(PIC) - "popl %%ebx\n\t" -#endif -#if !defined(BIG_OPT) - "popl %%ebp\n\t" -#endif - "jmp *%0" - : /* no outputs */ - : "m" (_GlideRoot.curGC->cmdTransportInfo.triSetupProc) -#if defined (PIC) || !defined (BIG_OPT) - : -#endif -#if defined (PIC) - "ebx" -#endif -#if defined (PIC) && !defined (BIG_OPT) - , -#endif -#if !defined(BIG_OPT) - "ebp" -#endif - ); -#endif -#endif -#undef FN_NAME -} /* grDrawTriangle */ - -/*--------------------------------------------------------------------------- - ** grDrawPlanarPolygon - ** - ** Brute force "triangle-fan" implementation of a convex polygon drawer. - */ -GR_ENTRY(grDrawPlanarPolygon, - void, - (int nVerts, const int iList[], const GrVertex vList[])) -{ - GR_BEGIN_NOFIFOCHECK("grDrawPlanarPolygon",93); - GDBG_INFO_MORE(gc->myLevel,"(%d,0x%x,0x%x)\n",nVerts,iList,vList); - GR_CHECK_F(myName, !iList || !vList, "NULL pointer passed"); - - GR_FLUSH_STATE(); - -#if GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP - grDrawPolygon(nVerts, iList, vList); -#else /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - { - int n,i = nVerts-2; - const GrVertex *firstv = &vList[iList[0]]; - - for (i = 1; i < nVerts - 1; i++) { - n = TRISETUP(firstv, &vList[iList[i]], &vList[iList[i+1]]); - if (n > 0) break; /* stop after 1st non-zero-area triangle */ - if (n < 0) goto all_done; - } - /* now all the gradients are loaded into the chip, so we just have to */ - /* draw all the rest of the triangles */ - for (i = i+1; i < nVerts - 1; i++) { - _trisetup_nogradients(firstv, &vList[iList[i]], &vList[iList[i+1]]); - } - } -all_done: -#endif /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - - GR_END(); -} /* grDrawPlanarPolygon */ - -/*--------------------------------------------------------------------------- - ** grDrawPlanarPolygonVertexList - ** - ** Brute force "triangle-fan" implementation of a convex polygon drawer. - */ - -GR_ENTRY(grDrawPlanarPolygonVertexList, void, (int nVerts, const GrVertex vList[])) -{ - GR_BEGIN_NOFIFOCHECK("grDrawPlanarPolygonVertexList",93); - GDBG_INFO_MORE(gc->myLevel,"(%d,0x%x)\n",nVerts,vList); - GR_CHECK_F(myName, !vList, "NULL pointer passed"); - - GR_FLUSH_STATE(); - -#if GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP - grDrawPolygonVertexList(nVerts, vList); -#else /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - { - int n,i = nVerts-2; - const GrVertex *firstv = &vList[0]; - - for (i = 1; i < nVerts - 1; i++) { - n = TRISETUP(firstv, &vList[i], &vList[i+1]); - if (n > 0) break; /* stop after 1st non-zero-area triangle */ - if (n < 0) goto all_done; - } - /* now all the gradients are loaded into the chip, so we just have to */ - /* draw all the rest of the triangles */ - for (i = i+1; i < nVerts - 1; i++) { - _trisetup_nogradients(firstv, &vList[i], &vList[i+1]); - } - -all_done: - ; - } -#endif /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - - GR_END(); -} /* grDrawPlanarPolygonVertexList */ - -#if GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP -#define kMaxPacket3Vertex 0x0FUL - -/* Packet 3 requires at least one vertex, if there isn't enough room - * in the fifo then force a wrap now and write up to the max. - */ -#define FIFO_VERT(__vertSize, __polyVerts) \ - ((gc->cmdTransportInfo.fifoRoom < (FxI32)(sizeof(FxU32) + (__vertSize))) \ - ? (__polyVerts) \ - : MIN((__polyVerts), ((gc->cmdTransportInfo.fifoRoom - sizeof(FxU32)) / (__vertSize)))) - -#define FIFO_MAX_VERT(__polyVerts) MIN(kMaxPacket3Vertex, (__polyVerts)) -#endif /* GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP */ - -/*--------------------------------------------------------------------------- - ** grDrawPolygon - ** - ** Brute force "triangle-fan" implementation of a convex polygon drawer. - */ - -GR_ENTRY(grDrawPolygon, void, (int nVerts, const int iList[], const GrVertex vList[])) -{ -#define FN_NAME "grDrawPolygon" - GR_BEGIN_NOFIFOCHECK("grDrawPolygon",93); - GDBG_INFO_MORE(gc->myLevel,"(%d,0x%x,0x%x)\n",nVerts,iList,vList); - GR_CHECK_F(myName, !iList || !vList, "NULL pointer passed"); - - GR_FLUSH_STATE(); - - /* Zero length vertex lists are allowed, but we can't send them to - * the hw. - */ - if (nVerts <= 0) goto __exitNoVerts; - -#if GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP - { - const FxU32 vertexParamOffset = _GlideRoot.curVertexSize; - const int* vertexIndexP = iList; - FxU32 packVertMax = FIFO_MAX_VERT(nVerts); /* Max possible verts for this packet */ - FxU32 packVerts = FIFO_VERT(vertexParamOffset, packVertMax); /* # verts for this packet */ - FxU32 packType = SSTCP_PKT3_BDDDDD; - -__doPolyVertexSend: - { - const FxU32 packSize = packVerts * vertexParamOffset; - FxU32 vertexOffset; - - GR_ASSERT((packSize % vertexParamOffset) == 0); - GR_ASSERT(packSize >= vertexParamOffset); - - GR_SET_EXPECTED_SIZE(packSize, 1); - TRI_STRIP_BEGIN(kSetupFan, - packSize / vertexParamOffset, vertexParamOffset, - packType); - for(vertexOffset = 0; vertexOffset < packSize; vertexOffset += vertexParamOffset) { - const float* vertex = (const float*)(vList + *vertexIndexP++); - - TRI_SETF(vertex[GR_VERTEX_X_OFFSET]); - TRI_SETF(vertex[GR_VERTEX_Y_OFFSET]); - - { - const int* dataList = gc->tsuDataList; - -#if GLIDE_PACKED_RGB - { - FxBool doColorP = FXFALSE; - FxU32 packedColor = 0x00; - - if (*dataList == (GR_VERTEX_R_OFFSET << 2)) { - packedColor = (RGBA_COMP_CLAMP(FARRAY(vertex, (GR_VERTEX_B_OFFSET << 2)), B) | - RGBA_COMP_CLAMP(FARRAY(vertex, (GR_VERTEX_G_OFFSET << 2)), G) | - RGBA_COMP_CLAMP(FARRAY(vertex, (GR_VERTEX_R_OFFSET << 2)), R)); - doColorP = FXTRUE; - dataList++; - } - - if (*dataList == (GR_VERTEX_A_OFFSET << 2)) { - packedColor |= RGBA_COMP_CLAMP(FARRAY(vertex, (GR_VERTEX_A_OFFSET << 2)), A); - doColorP = FXTRUE; - dataList++; - } - - if (doColorP) TRI_SET(packedColor); - } -#endif /* GLIDE_PACKED_RGB */ - -#if GLIDE_FP_CLAMP_TEX - while(*dataList != 0) { - TRI_SETF(FARRAY(vertex, *dataList)); - dataList++; - } - - dataList++; -#endif /* GLIDE_FP_CLAMP_TEX */ - - while (*dataList != 0) { - TRI_SETF_CLAMP(FARRAY(vertex, *dataList)); - dataList++; - } - } - } - TRI_END; - GR_CHECK_SIZE(); - } - - /* Are there more vertices that need to be sent for this - * polygon? Reset the parameters and do the rest of them. - */ - if (vertexIndexP < iList + nVerts) { - /* Reset the # of verts maxing out the send based on the - * space left in the fifo and the max packet size. - */ - nVerts -= packVerts; - packVertMax = FIFO_MAX_VERT(nVerts); /* Max possible verts for this packet */ - packVerts = FIFO_VERT(vertexParamOffset, packVertMax); /* # verts for this packet */ - - packType = SSTCP_PKT3_DDDDDD; - - GDBG_INFO(120, "\tSending continueing polygon data (0x%X : 0x%X)\n", nVerts, packVerts); - - goto __doPolyVertexSend; - } - } -#else /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - { - int i; - for (i = 1; i < nVerts - 1; i++) { - grDrawTriangle(&vList[iList[0]], &vList[iList[i]], &vList[iList[i+1]]); - } - } -#endif /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - -__exitNoVerts: - GR_END(); -#undef FN_NAME -} /* grDrawPolygon */ - -/*--------------------------------------------------------------------------- - ** grDrawPolygonVertexList - ** - ** Brute force "triangle-fan" implementation of a convex polygon drawer. - */ - -GR_ENTRY(grDrawPolygonVertexList, void, (int nVerts, const GrVertex vList[])) -{ -#define FN_NAME "grDrawPolygonVertexList" - GR_BEGIN_NOFIFOCHECK("grDrawPolygonVertexList", 92); - GDBG_INFO_MORE(gc->myLevel,"(%d,0x%x)\n",nVerts,vList); - GR_CHECK_F(myName, !vList, "NULL pointer passed"); - - GR_FLUSH_STATE(); - - /* Zero length vertex lists are allowed, but we can't send them to - * the hw. - */ - if (nVerts <= 0) goto __exitNoVerts; - -#if GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP - { - const FxU32 vertexParamOffset = _GlideRoot.curVertexSize; - const GrVertex* vertexListP = vList; - FxU32 packVertMax = FIFO_MAX_VERT(nVerts); /* Max possible verts for this packet */ - FxU32 packVerts = FIFO_VERT(vertexParamOffset, packVertMax); /* # verts for this packet */ - FxU32 packType = SSTCP_PKT3_BDDDDD; - -__doPolyVertexSend: - GR_ASSERT(packVerts > 0); - GR_ASSERT(packVerts <= kMaxPacket3Vertex); - - { - const FxU32 packSize = packVerts * vertexParamOffset; - FxU32 vertexOffset; - - GR_SET_EXPECTED_SIZE(packSize, 1); - TRI_STRIP_BEGIN(kSetupFan, packVerts, vertexParamOffset, packType); - - for(vertexOffset = 0; vertexOffset < packSize; vertexOffset += vertexParamOffset) { - const float* vertex = (const float*)vertexListP++; - - TRI_SETF(vertex[GR_VERTEX_X_OFFSET]); - TRI_SETF(vertex[GR_VERTEX_Y_OFFSET]); - - { - const int* dataList = gc->tsuDataList; - -#if GLIDE_PACKED_RGB - /* dpc - 10 feb 1998 - - * Some apps send color values outside of the range [0..255] - */ -#undef RGBA_COMP -#define RGBA_COMP(__fpVal, __fpBias, __fpShift, __fpMask) \ -((_GlideRoot.pool.ftemp1 = (float)((float)(__fpVal) + (float)(__fpBias))), \ - ((((float)(__fpVal)) > 255.0f) \ - ? (__fpMask) \ - : ((((float)(__fpVal)) < 0.0f) \ - ? 0x00UL \ - : ((*(const FxU32*)&_GlideRoot.pool.ftemp1) & (__fpMask)))) << (__fpShift)) - - { - FxBool doColorP = FXFALSE; - FxU32 packedColor = 0x00; - - if (*dataList == (GR_VERTEX_R_OFFSET << 2)) { - packedColor = (RGBA_COMP_CLAMP(FARRAY(vertex, (GR_VERTEX_B_OFFSET << 2)), B) | - RGBA_COMP_CLAMP(FARRAY(vertex, (GR_VERTEX_G_OFFSET << 2)), G) | - RGBA_COMP_CLAMP(FARRAY(vertex, (GR_VERTEX_R_OFFSET << 2)), R)); - doColorP = FXTRUE; - dataList++; - } - - if (*dataList == (GR_VERTEX_A_OFFSET << 2)) { - packedColor |= RGBA_COMP_CLAMP(FARRAY(vertex, (GR_VERTEX_A_OFFSET << 2)), A); - doColorP = FXTRUE; - dataList++; - } - - if (doColorP) TRI_SET(packedColor); - } -#endif /* GLIDE_PACKED_RGB */ - -#if GLIDE_FP_CLAMP_TEX - while(*dataList != 0) { - TRI_SETF(FARRAY(vertex, *dataList)); - dataList++; - } - - dataList++; -#endif /* GLIDE_FP_CLAMP_TEX */ - - while (*dataList != 0) { - TRI_SETF_CLAMP(FARRAY(vertex, *dataList)); - dataList++; - } - } - } - TRI_END; - GR_CHECK_SIZE(); - } - - /* More verts? */ - if (vertexListP < vList + nVerts) { - /* Reset the # of verts maxing out the send based on the - * space left in the fifo and the max packet size. - */ - nVerts -= packVerts; - packVertMax = FIFO_MAX_VERT(nVerts); /* Max possible verts for this packet */ - packVerts = FIFO_VERT(vertexParamOffset, packVertMax); /* # verts for this packet */ - - /* Packet type to continue strip */ - packType = SSTCP_PKT3_DDDDDD; - - GDBG_INFO(120, "\tSending continueing polygon data (0x%X : 0x%X)\n", packVerts, nVerts); - - goto __doPolyVertexSend; - } - } -#else /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - { - int i; - - for (i = 1; i < nVerts - 1; i++) { - grDrawTriangle(&vList[0], &vList[i], &vList[i+1]); - } - } -#endif /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - -__exitNoVerts: - GR_END(); -#undef FN_NAME -} /* grDrawPolygonVertexList */ - -/*--------------------------------------------------------------------------- - ** _grColorCombineDelta0Mode - ** - ** GMT: when we are in delta0 mode, color comes from the RGB iterators - ** but the slopes are 0.0. So when we enter delta0 mode we set - ** the iterators up and then we leave them alone during primitive - ** rendering - */ - -GR_DDFUNC(_grColorCombineDelta0Mode, void, (FxBool delta0mode)) -{ -#define FN_NAME "_grColorCombineDelta0Mode" - GR_BEGIN_NOFIFOCHECK("_grColorCombineDelta0Mode",85); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",delta0mode); - - if (delta0mode) { - GR_SET_EXPECTED_SIZE(9 << 2, 9); - { - GR_SETF(BROADCAST_ID, hw, Fr, gc->state.r); - GR_SETF(BROADCAST_ID, hw, Fg, gc->state.g); - GR_SETF(BROADCAST_ID, hw, Fb, gc->state.b); - GR_SET(BROADCAST_ID, hw, drdx, 0); - GR_SET(BROADCAST_ID, hw, drdy, 0); - GR_SET(BROADCAST_ID, hw, dgdx, 0); - GR_SET(BROADCAST_ID, hw, dgdy, 0); - GR_SET(BROADCAST_ID, hw, dbdx, 0); - GR_SET(BROADCAST_ID, hw, dbdy, 0); - } - GR_CHECK_SIZE(); - } - - gc->state.cc_delta0mode = delta0mode; - GR_END(); -#undef FN_NAME -} /* _grColorCombineDeltaMode */ - diff --git a/glide2x/cvg/glide/src/gerror.c b/glide2x/cvg/glide/src/gerror.c deleted file mode 100644 index bc607bd..0000000 --- a/glide2x/cvg/glide/src/gerror.c +++ /dev/null @@ -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 -#ifdef __DOS__ -# include -#endif - -#ifdef __WIN32__ -# include -#endif - -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include -#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 */ diff --git a/glide2x/cvg/glide/src/gglide.c b/glide2x/cvg/glide/src/gglide.c deleted file mode 100644 index 830f7d9..0000000 --- a/glide2x/cvg/glide/src/gglide.c +++ /dev/null @@ -1,2594 +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. -** -** -** 168 7/02/98 6:59p Peter -** Fixed merge problem from previous checkin -** -** 167 6/30/98 6:08p Jeske -** fixed bug where we tried to setup MTRRs on old ( -#include <3dfx.h> -#include - -#define FX_DLL_DEFINITION -#include -#include - -#include "fxglide.h" -#include "fxinline.h" - -#include "rcver.h" -static char glideIdent[] = "@#%" VERSIONSTR ; - -#if GLIDE_HW_TRI_SETUP -static void -_grUpdateTriPacketHdr(FxU32 paramMask, - const GrCullMode_t mode); -#endif /* GLIDE_HW_TRI_SETUP */ - -/*--------------------------------------------------------------------------- -** grAlphaBlendFunction -** -** GMT: BUG if grColorMask() turns off alphaplanes then destination alpha -** blending wont work! -*/ - -GR_STATE_ENTRY(grAlphaBlendFunction, void, - (GrAlphaBlendFnc_t rgb_sf, GrAlphaBlendFnc_t rgb_df, - GrAlphaBlendFnc_t alpha_sf, GrAlphaBlendFnc_t alpha_df)) -{ -#define FN_NAME "grAlphaBlendFunction" - FxU32 alphamode; - GR_BEGIN_NOFIFOCHECK("grAlphaBlendFunction", 85); - GDBG_INFO_MORE(gc->myLevel, "(%d,%d,%d,%d)\n", - rgb_sf, rgb_df, alpha_sf, alpha_df); - - /* Watcom warning suppressor */ - glideIdent[0] = glideIdent[0]; - - alphamode = gc->state.fbi_config.alphaMode; - if (alpha_sf != GR_BLEND_ONE && alpha_sf != GR_BLEND_ZERO) { - GR_CHECK_W(myName, 1, "unsupported alpha source blend function"); - alpha_sf = GR_BLEND_ONE; - } - - if (alpha_df != GR_BLEND_ONE && alpha_df != GR_BLEND_ZERO) { - GR_CHECK_W(myName, 1, "unsupported alpha destination blend function"); - alpha_df = GR_BLEND_ZERO; - } - - if (rgb_sf == GR_BLEND_ONE && rgb_df == GR_BLEND_ZERO && - alpha_sf == GR_BLEND_ONE && alpha_df == GR_BLEND_ZERO) - alphamode &= ~SST_ENALPHABLEND; - else - alphamode |= SST_ENALPHABLEND; - - alphamode &= ~(SST_RGBSRCFACT | SST_RGBDSTFACT | SST_ASRCFACT | SST_ADSTFACT); - - alphamode |= ((((FxU32) rgb_sf) << SST_RGBSRCFACT_SHIFT) | - (((FxU32) rgb_df) << SST_RGBDSTFACT_SHIFT) | - (((FxU32) alpha_sf) << SST_ASRCFACT_SHIFT) | - (((FxU32) alpha_df) << SST_ADSTFACT_SHIFT)); - - gc->state.fbi_config.alphaMode = alphamode; - - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, alphaMode, alphamode); - GR_CHECK_SIZE(); -#undef FN_NAME -} /* grAlphaBlendFunction */ - -/*--------------------------------------------------------------------------- -** grAlphaCombine -*/ - -GR_STATE_ENTRY(grAlphaCombine, void, - (GrCombineFunction_t function, GrCombineFactor_t factor, - GrCombineLocal_t local, GrCombineOther_t other, FxBool invert)) -{ -#define FN_NAME "grAlphaCombine" - FxU32 fbzColorPath; - FxU32 oldTextureEnabled; - - GR_BEGIN_NOFIFOCHECK("grAlphaCombine",85); - GDBG_INFO_MORE(gc->myLevel,"(%d,%d,%d,%d,%d)\n",function,factor,local,other,invert); - GR_CHECK_W(myName, - function < GR_COMBINE_FUNCTION_ZERO || - function > GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA, - "unsupported alpha combine function"); - GR_CHECK_W(myName, - (factor & 0x7) < GR_COMBINE_FACTOR_ZERO || - (factor & 0x7) > GR_COMBINE_FACTOR_TEXTURE_ALPHA || - factor > GR_COMBINE_FACTOR_ONE_MINUS_TEXTURE_ALPHA, - "unsupported alpha combine scale factor"); - - GR_CHECK_W(myName, - local < GR_COMBINE_LOCAL_ITERATED || local > GR_COMBINE_LOCAL_DEPTH, - "unsupported alpha combine local color"); - GR_CHECK_W(myName, - other < GR_COMBINE_OTHER_ITERATED || other > GR_COMBINE_OTHER_CONSTANT, - "unsupported alpha combine other color"); - - fbzColorPath = gc->state.fbi_config.fbzColorPath; - oldTextureEnabled = fbzColorPath & SST_ENTEXTUREMAP; - fbzColorPath &= ~(SST_ENTEXTUREMAP | - SST_ASELECT | - SST_ALOCALSELECT | - SST_CCA_ZERO_OTHER | - SST_CCA_SUB_CLOCAL | - SST_CCA_MSELECT | - SST_CCA_REVERSE_BLEND | - SST_CCA_ADD_CLOCAL | - SST_CCA_ADD_ALOCAL | - SST_CCA_INVERT_OUTPUT); - - /* setup reverse blending first, then strip off the the high bit */ - if ((factor & 0x8) == 0) - fbzColorPath |= SST_CCA_REVERSE_BLEND; - factor &= 0x7; - - /* NOTE: we use boolean OR instead of logical to avoid branches */ - gc->state.ac_requires_texture = ((factor == GR_COMBINE_FACTOR_TEXTURE_ALPHA) | - (other == GR_COMBINE_OTHER_TEXTURE)); - gc->state.ac_requires_it_alpha = ((local == GR_COMBINE_LOCAL_ITERATED) | - (other == GR_COMBINE_OTHER_ITERATED)); - - /* setup scale factor bits */ - fbzColorPath |= factor << SST_CCA_MSELECT_SHIFT; - - /* setup local color bits */ - fbzColorPath |= local << SST_ALOCALSELECT_SHIFT; - - /* setup other color bits */ - fbzColorPath |= other << SST_ASELECT_SHIFT; - - - /* setup invert output bits */ - if (invert) - fbzColorPath |= SST_CCA_INVERT_OUTPUT; - - /* setup core color combine unit bits */ - switch (function) { - case GR_COMBINE_FUNCTION_ZERO: - fbzColorPath |= SST_CCA_ZERO_OTHER; - break; - - case GR_COMBINE_FUNCTION_LOCAL: - case GR_COMBINE_FUNCTION_LOCAL_ALPHA: - fbzColorPath |= SST_CCA_ZERO_OTHER | SST_CCA_ADD_ALOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER: - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL: - case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA: - fbzColorPath |= SST_CCA_ADD_ALOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL: - fbzColorPath |= SST_CCA_SUB_CLOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL: - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL_ALPHA: - fbzColorPath |= SST_CCA_SUB_CLOCAL | SST_CCA_ADD_ALOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL: - case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA: - fbzColorPath |= SST_CCA_ZERO_OTHER | SST_CCA_SUB_CLOCAL | SST_CCA_ADD_ALOCAL; - break; - } - - /* if either color or alpha combine requires texture then enable it */ - if (gc->state.cc_requires_texture || gc->state.ac_requires_texture) - fbzColorPath |= SST_ENTEXTUREMAP; - gc->state.fbi_config.fbzColorPath = fbzColorPath; - - { - const FxBool texTransP = (oldTextureEnabled != (fbzColorPath & SST_ENTEXTUREMAP)); - - GR_SET_EXPECTED_SIZE(sizeof(FxU32) + (texTransP ? sizeof(FxU32) : 0), - 1 + texTransP); - - /* transition into/out of texturing ... add nopCMD */ - if (texTransP) GR_SET(BROADCAST_ID, hw, nopCMD, 0); - GR_SET(BROADCAST_ID, hw, fbzColorPath, fbzColorPath); - GR_CHECK_SIZE(); - } - - /* setup paramIndex bits */ - _grUpdateParamIndex(); -#undef FN_NAME -} /* grAlphaCombine */ - -/*--------------------------------------------------------------------------- -** grAlphaControlsITRGBLighting -** -** Determines whether the LSB of alpha controls what lighting is used-- -** Specifically whether grConstantColorValu or the interated RGB values are used -** during TEXTURE_TIMES_itrgb & TEXTURE_TIMES_ITRGB_DELTA0 color combine modes. -** -*/ - -GR_STATE_ENTRY(grAlphaControlsITRGBLighting, void, (FxBool enable)) -{ -#define FN_NAME "grAlphaControlsITRGBLighting" - FxU32 fbzColorPath; - GR_BEGIN_NOFIFOCHECK("grAlphaControlsITRGBLighting", 85); - GDBG_INFO_MORE(gc->myLevel, "(%d)\n", enable); - - fbzColorPath = gc->state.fbi_config.fbzColorPath; - if (enable) { - fbzColorPath |= SST_LOCALSELECT_OVERRIDE_WITH_ATEX; - } else { - fbzColorPath &= ~SST_LOCALSELECT_OVERRIDE_WITH_ATEX; - } - - gc->state.fbi_config.fbzColorPath = fbzColorPath; - - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, fbzColorPath, fbzColorPath); - GR_CHECK_SIZE(); -#undef FN_NAME -} /* grAlphaControlsITRGBLighting() */ - -/*--------------------------------------------------------------------------- -** grAlphaTestFunction -*/ - -GR_STATE_ENTRY(grAlphaTestFunction, void, (GrCmpFnc_t fnc)) -{ -#define FN_NAME "grAlphaTestFunction" - FxU32 alphamode; - GR_BEGIN_NOFIFOCHECK("grAlphaTestFunction", 85); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",fnc); - - alphamode = gc->state.fbi_config.alphaMode; - alphamode &= ~(SST_ALPHAFUNC | SST_ENALPHAFUNC); - if (fnc != GR_CMP_ALWAYS) - alphamode |= ((fnc << SST_ALPHAFUNC_SHIFT) | SST_ENALPHAFUNC); - - gc->state.fbi_config.alphaMode = alphamode; - - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, alphaMode, alphamode); - GR_CHECK_SIZE(); -#undef FN_NAME -} /* grAlphaTestFunction */ - -/*--------------------------------------------------------------------------- -** grAlphaTestReferenceValue -*/ - -GR_STATE_ENTRY(grAlphaTestReferenceValue, void, (GrAlpha_t value)) -{ -#define FN_NAME "grAlphaTestReferenceValue" - FxU32 alphamode; - GR_BEGIN_NOFIFOCHECK("grAlphaTestReferenceValue", 85); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",value); - - alphamode = gc->state.fbi_config.alphaMode; - alphamode &= ~SST_ALPHAREF; - alphamode |= (((FxU32) value) << SST_ALPHAREF_SHIFT); - - gc->state.fbi_config.alphaMode = alphamode; - - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, alphaMode, alphamode); - GR_CHECK_SIZE(); -#undef FN_NAME -} /* grAlphaTestReferenceValue */ - -/*--------------------------------------------------------------------------- -** grBufferClear -*/ - -GR_ENTRY(grBufferClear, void, (GrColor_t color, GrAlpha_t alpha, FxU16 depth)) -{ -#define FN_NAME "grBufferClear" - GR_BEGIN_NOFIFOCHECK("grBufferClear", 86); - GDBG_INFO_MORE(gc->myLevel, "(0x%x,0x%x,0x%x)\n", color, alpha, depth); - - { - const GrColor_t oldc1 = gc->state.fbi_config.color1; - const FxU32 oldzacolor = gc->state.fbi_config.zaColor; - const FxU32 fbzMode = gc->state.fbi_config.fbzMode; - FxU32 zacolor = oldzacolor; - FxBool doneP = FXFALSE; - FxBool doColorP = ((fbzMode & SST_RGBWRMASK) != 0); - FxBool doAuxP = FXFALSE; - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) && GLIDE_BLIT_CLEAR - const FxU32 clipBottomTop = gc->state.fbi_config.clipBottomTop; - const FxU32 bottomOriginP = ((fbzMode & SST_YORIGIN) == SST_YORIGIN); - FxBool didClipP = FXFALSE; -#endif /* (GLIDE_PLATFORM & GLIDE_HW_CVG) && GLIDE_BLIT_CLEAR */ - - /* Setup source registers */ - if (doColorP) _grSwizzleColor(&color); - if ((fbzMode & SST_ZAWRMASK) != 0) { - if ((fbzMode & SST_ENALPHABUFFER) != 0) { - doAuxP = FXTRUE; - - zacolor &= ~SST_ZACOLOR_ALPHA; - zacolor |= (((FxU32) alpha) << SST_ZACOLOR_ALPHA_SHIFT); - } else if ((fbzMode & SST_ENDEPTHBUFFER) != 0) { - doAuxP = FXTRUE; - - zacolor &= ~SST_ZACOLOR_DEPTH; - zacolor |= (((FxU32) depth) << SST_ZACOLOR_DEPTH_SHIFT); - } - } - - /* Why were we called? */ - if (!doColorP && !doAuxP) return; - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) && GLIDE_BLIT_CLEAR - /* If the width clipping is the same as the screen resolution - * then we can use the sgram fill rect to clear the page aligned - * region, and then use the fastFillCmd to clear the remainder. - * - * NB: The test really does check against (clipLeft == 0) && - * (clipright == screenWidth) since screenWidth should have 0 - * in its upper bits. - * - * First we convert the vertical clipping from pixel coordinates - * to tile coordinates. (The top coordinate is rounded up to the - * next page, and the bottom coordinate is rounded down.) A page - * (4k) is composed of two tiles layed out horizontally. We then - * map this into fbi memory based on the current screen - * resolution, set in grSstWinOpen, scaled into tile space as - * well. Ick! - * - * To top it all of we have this 'special' case thanks to sli and - * y origin flipping. The problem is that each card is responsible - * for rendering its set of scanlines, regardless or the location - * of the y origin. However, if the origin is 'flipped' then it - * can be the case that the 'first' scanline on the screen is - * actually odd. To get around this the hw implicitly adds two - * invisible (they're always black) scanlines to the renderable - * area. If the y origin is at the top of the screen then - * scanlines screenHeight and (screenHeight + 1) are not - * rendered. If the origin is 'flipped' then scanlines 0 and - * (screenHeight + 1) are not rendered. - */ - if (gc->state.fbi_config.clipLeftRight == gc->state.screen_width) { - const FxU32 screenHeightAdjust = (gc->scanline_interleaved && bottomOriginP ? 1 : 0); - const FxU32 screenHeight = gc->state.screen_height + screenHeightAdjust; - const FxU32 yTileShift = gc->hwDep.cvgDep.yTileShift; - const FxU32 yTileMask = ((0x01 << yTileShift) - 1); - const FxU32 regBottom = ((clipBottomTop >> SST_CLIPBOTTOM_SHIFT) & 0x0FFF); - const FxU32 regTop = ((clipBottomTop >> SST_CLIPTOP_SHIFT) & 0x0FFF); - const FxU32 clipLow = (bottomOriginP ? screenHeight - regTop : regBottom); - const FxU32 clipHi = (bottomOriginP ? screenHeight - regBottom : regTop); - const FxU32 tileLow = ((clipLow >> yTileShift) + (((clipLow & yTileMask) == 0) ? 0 : 1)); - const FxU32 tileHi = (clipHi >> yTileShift); - - /* If they're both in the same tile then just clear using a - * fastFillCmd - */ - if (tileHi <= tileLow) goto __skipBlitClear; - - /* Column size is always a full page size divided by the # - * of points in a tile row (2 tiles). - * - * NB: This set is 'lifted' out of the groupings below because - * it is common and stays set accross blit invocations. - */ - { - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, bltSize, - ((((((tileHi - tileLow) * gc->hwDep.cvgDep.xTilePages) - 1) << 16) | (0x1000 >> 3)) - 1)); - GR_CHECK_SIZE(); - } - - /* Clear the current buffer */ - if (doColorP) { - const FxU32 tileBuffer = (gc->hwDep.cvgDep.numBufferPages * gc->hwDep.cvgDep.renderBuf); - - REG_GROUP_BEGIN(BROADCAST_ID, bltDstXY, 3, 0x29); - { - /* Starting point of the blit. We always do a full page in x. */ - REG_GROUP_SET(hw, bltDstXY, - (((tileBuffer + (tileLow * gc->hwDep.cvgDep.xTilePages)) << 16) | 0x00UL)); - - /* dpc - 27 aug 1997 - FixMe! - * What is the right way of converting the 888 color that we're - * passed into a 565 color? - */ - REG_GROUP_SET(hw, bltColor, (((color & 0xF8UL) >> (3 + 0)) | /* blue [4:0] */ - ((color & 0xFC00UL) >> (2 + 3)) | /* green [10:5] */ - ((color & 0xF80000UL) >> (3 + 5)))); /* red [15:11] */ - - REG_GROUP_SET(hw, bltCommand, (SSTG_FRECTFILL | /* SGRAM Fill command */ - 0x80000000)); /* Start blit signal */ - } - REG_GROUP_END(); - } - - /* Clear the aux buffer */ - if (doAuxP) { - const FxU32 tileBuffer = (gc->hwDep.cvgDep.numBufferPages * gc->state.num_buffers); - - REG_GROUP_BEGIN(BROADCAST_ID, bltDstXY, 3, 0x29); - { - REG_GROUP_SET(hw, bltDstXY, (((tileBuffer + (tileLow * gc->hwDep.cvgDep.xTilePages)) << 16) | - 0x00UL)); - REG_GROUP_SET(hw, bltColor, zacolor); - REG_GROUP_SET(hw, bltCommand, (SSTG_FRECTFILL | /* SGRAM Fill command */ - 0x80000000)); /* Start blit signal */ - } - REG_GROUP_END(); - } - - __skipBlitClear: - /* Did we round off crap to page align the top part of - * clipping? If so then reset the hw clipping and use - * the normal fastFillCmd on this region. - */ - didClipP = ((tileLow << yTileShift) > clipLow); - if (didClipP) { - REG_GROUP_BEGIN(BROADCAST_ID, zaColor, 2, 0x41UL); - { - /* Set the colors */ - REG_GROUP_SET(hw, zaColor, zacolor); - REG_GROUP_SET(hw, c1, color); - } - REG_GROUP_END(); - - REG_GROUP_BEGIN(BROADCAST_ID, fbzMode, - 2 + bottomOriginP, (bottomOriginP | 0x28UL)); - { - /* Put the origin in our canonical clipping form */ - if (bottomOriginP) REG_GROUP_SET(hw, fbzMode, fbzMode & ~SST_YORIGIN); - - /* Reset the clipping to have the same top clipping and - * our rounded clip value as the bottom. - */ - REG_GROUP_SET(hw, clipBottomTop, ((clipLow << SST_CLIPBOTTOM_SHIFT) | - MIN(((tileLow << yTileShift) << SST_CLIPTOP_SHIFT), clipHi))); - - /* Execute the FASTFILL command */ - REG_GROUP_SET(hw, fastfillCMD, 1); - } - REG_GROUP_END(); - } - - /* If we're done then we have to restore the color registers. - * Otherwise, leave them set for the next fastFillCmd, and - * reset the clipping for the bottom rounding error. - */ - doneP = ((tileLow > tileHi) | - ((tileHi << yTileShift) == clipHi)); - if (doneP && didClipP) { - REG_GROUP_BEGIN(BROADCAST_ID, zaColor, 2, 0x41); - { - REG_GROUP_SET(hw, zaColor, oldzacolor); - REG_GROUP_SET(hw, c1, oldc1); - } - REG_GROUP_END(); - } else if (!doneP) { - const FxBool origSetP = (bottomOriginP & !didClipP); - - REG_GROUP_BEGIN(BROADCAST_ID, fbzMode, 1 + origSetP, (origSetP | 0x8UL)); - { - if (origSetP) REG_GROUP_SET(hw, fbzMode, fbzMode & ~SST_YORIGIN); - - /* Reset the clipping to have the same bottom clipping and - * our rounded clip value as the top. - */ - REG_GROUP_SET(hw, clipBottomTop, (((tileHi << yTileShift) << SST_CLIPBOTTOM_SHIFT) | - (clipHi << SST_CLIPTOP_SHIFT))); - } - REG_GROUP_END(); - - /* Clear the color sense flags so that we don't waste - * time sending them again, and always set the clip flag. - */ - doColorP = - doAuxP = FXFALSE; - didClipP = FXTRUE; - } - } -#endif /* (GLIDE_PLATFORM & GLIDE_HW_CVG) && GLIDE_BLIT_CLEAR */ - - if (!doneP) { - REG_GROUP_BEGIN(BROADCAST_ID, zaColor, 2, 0x41); - { - REG_GROUP_SET(hw, zaColor, zacolor); - REG_GROUP_SET(hw, c1, color); - } - REG_GROUP_END(); - - REG_GROUP_BEGIN(BROADCAST_ID, fastfillCMD, 3, 0x209); - { - /* Execute the FASTFILL command */ - REG_GROUP_SET(hw, fastfillCMD, 1); - - /* Restore C1 and ZACOLOR */ - REG_GROUP_SET(hw, zaColor, oldzacolor); - REG_GROUP_SET(hw, c1, oldc1); - } - REG_GROUP_END(); - } - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) && GLIDE_BLIT_CLEAR - /* Restore clipping */ - if (didClipP) { - REG_GROUP_BEGIN(BROADCAST_ID, fbzMode, - bottomOriginP + 1, (bottomOriginP | 0x8UL)); - { - if (bottomOriginP) REG_GROUP_SET(hw, fbzMode, fbzMode); - REG_GROUP_SET(hw, clipBottomTop, clipBottomTop); - } - REG_GROUP_END(); - } -#endif /* (GLIDE_PLATFORM & GLIDE_HW_CVG) && GLIDE_BLIT_CLEAR */ - } - -#undef FN_NAME -} /* grBufferClear */ - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) -/* Sli has an 'interesting' feature where the physical scanlines - * that are being rendered is dependent on the location of the y - * origin. We always clear the overlap bit to black here so that - * no one ever notices. This needs to be done for all of the allocated - * color buffers that could have possibly have been rendered to since - * the last origin swap. Rather than beeing really tricky I just do - * it for every allocated color buffer. - * - * Origin_Lower_Left: 0:Black [1 .. screenRezY]:Rendered screenRez+1:Black - * Origin_Upper_Left: [0 .. screenRezY - 1]:Rendered [screenRez-screenRez+1]:Black - */ -void -_grSliOriginClear(void) -{ -#define FN_NAME "_grSliOriginClear" - GR_BEGIN_NOFIFOCHECK(FN_NAME, 86); - - GR_ASSERT(gc->scanline_interleaved); - GR_ASSERT(gc->hwDep.cvgDep.sliOriginBufCount != 0); - - /* Setup the two pixel high area to clear */ - REG_GROUP_BEGIN(BROADCAST_ID, clipLeftRight, 3, 0x1003UL); - { - REG_GROUP_SET(hw, clipLeftRight, gc->state.screen_width); - REG_GROUP_SET(hw, clipBottomTop, 0x01UL); - REG_GROUP_SET(hw, c1, 0x00UL); - } - REG_GROUP_END(); - - /* Do the clear */ - REG_GROUP_BEGIN(BROADCAST_ID, fbzMode, 2, 0x21UL); - { - REG_GROUP_SET(hw, fbzMode, - ((gc->state.fbi_config.fbzMode & ~SST_YORIGIN) | - (~gc->state.fbi_config.fbzMode & SST_YORIGIN) | - SST_RGBWRMASK)); - REG_GROUP_SET(hw, fastfillCMD, 0x01UL); - } - REG_GROUP_END(); - - REG_GROUP_BEGIN(BROADCAST_ID, fbzMode, 2, 0x21UL); - { - REG_GROUP_SET(hw, fbzMode, - (gc->state.fbi_config.fbzMode | SST_RGBWRMASK)); - REG_GROUP_SET(hw, fastfillCMD, 0x01UL); - } - REG_GROUP_END(); - - /* Restore the initial glide state. - * NB: Cannot be done in one packet. Wah! - */ - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, fbzMode, gc->state.fbi_config.fbzMode); - GR_CHECK_SIZE(); - - REG_GROUP_BEGIN(BROADCAST_ID, clipLeftRight, 3, 0x1003UL); - { - REG_GROUP_SET(hw, clipLeftRight, gc->state.fbi_config.clipLeftRight); - REG_GROUP_SET(hw, clipBottomTop, gc->state.fbi_config.clipBottomTop); - REG_GROUP_SET(hw, c1, gc->state.fbi_config.color1); - } - REG_GROUP_END(); - - gc->hwDep.cvgDep.sliOriginBufCount--; -#undef FN_NAME -} -#endif /* (GLIDE_PLATFORM & GLIDE_HW_CVG) */ - -/*--------------------------------------------------------------------------- -** grBufferSwap -** -** NOTE: This routine should be COMPLETELY device-independant, -** but it isn't right now because we need to move all the -** code for the splash screen into the init library. -*/ -GR_ENTRY(grBufferSwap, void, (int swapInterval)) -{ -#define FN_NAME "grBufferSwap" - int vSync; - - GR_BEGIN_NOFIFOCHECK(FN_NAME, 88); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",swapInterval); - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) - if (gc->hwDep.cvgDep.singleBufferP) return; -#endif /* (GLIDE_PLATFORM & GLIDE_HW_CVG) */ - -#if ((GLIDE_PLATFORM & GLIDE_HW_CVG) || (GLIDE_PLATFORM & GLIDE_HW_H3)) - /* optionally display the 3Dfx powerfield logo overlay */ - if (_GlideRoot.environment.shamelessPlug) _grShamelessPlug(); - - /* check for environmental override. - * - * NB: If we are sli, the application passes in 0, and the user has - * elected to not sync to retrace then we honor the user's - * choice. Otherwise we force syncing because most apps don't know - * any better. If, however, the user has not chosen, but the app - * wants something other than 0 then we need to honor their choice. - */ - swapInterval = ((_GlideRoot.environment.swapInterval >= 0) - ? _GlideRoot.environment.swapInterval - : (gc->scanline_interleaved ? MAX(swapInterval, 1) : swapInterval)); - - GR_CHECK_F(myName, - (swapInterval > 255) || (swapInterval < 0), - "swap_interval out of range"); - - /* Wait until there's 6 or fewer buffer swaps pending. the hardware - * counter is only 3 bits so we don't want it to overflow also the - * latency gets too long. - */ - while (grBufferNumPending() > 6) - ; - - /* if the interval is non-zero turn on VSYNC waiting */ - vSync = (swapInterval > 0); - - if (swapInterval > 0) swapInterval--; - - /* NOTE: we need a PCI read before and after the swap command */ - /* but since we already called grBufferNumPending() we've done a read */ - { - const FxU32 swapCmdVal = (swapInterval << 1) | vSync; - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) && USE_PACKET_FIFO - /* When the command fifo is enabled we need to do a naked - * set to the command register too so that the num swaps pending - * field in status is kept in sync w/ reality. - * - * NB: This must be done before the fifo write to avoid a race - * condition if the hw is on our ass. - * - * NB: We fence here just in case since we are hopefully going to - * figure out the damn uswc problem soon. - */ - SET(hw->swapbufferCMD, swapCmdVal); - P6FENCE; -#endif /* (GLIDE_PLATFORM & GLIDE_HW_CVG) && USE_PACKET_FIFO */ - - GR_SET_EXPECTED_SIZE(4, 1); - GR_SET(BROADCAST_ID, hw, swapbufferCMD, swapCmdVal); - GR_CHECK_SIZE(); - } - -#ifdef GLIDE_DEBUG - { - if ((FxI32)_GlideRoot.environment.snapshot > 0) { - static char saveDBG[GDBG_MAX_LEVELS]; - int i; - - /* turn off tracing after frame 0 and the snapshot frame */ - if ((_GlideRoot.stats.bufferSwaps == 0) || - (_GlideRoot.stats.bufferSwaps == _GlideRoot.environment.snapshot + 3)) { - GDBG_PRINTF(FN_NAME": FX_SNAPSHOT (%ld)\n", _GlideRoot.stats.bufferSwaps); - for (i = 1; i < GDBG_MAX_LEVELS; i++) { - if (_GlideRoot.stats.bufferSwaps == 0) saveDBG[i] = (char)GDBG_GET_DEBUGLEVEL(i); - GDBG_SET_DEBUGLEVEL(i, 0); - } - } - - /* turn on tracing after the snapshot frame */ - if (_GlideRoot.stats.bufferSwaps == _GlideRoot.environment.snapshot) { - GDBG_PRINTF(FN_NAME": FX_SNAPSHOT (%ld)\n", _GlideRoot.stats.bufferSwaps); - for (i = 1; i < GDBG_MAX_LEVELS; i++) { - GDBG_SET_DEBUGLEVEL(i, saveDBG[i]); - } - } - } - } -#endif /* GLIDE_DEBUG */ - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) - if (gc->hwDep.cvgDep.sliOriginBufCount != 0) _grSliOriginClear(); - -#if GLIDE_BLIT_CLEAR - { - const FxU32 numBufs = gc->state.num_buffers; - FxU32* bufPtrs[3]; - FxU32 i; - - bufPtrs[0] = &gc->hwDep.cvgDep.renderBuf; - bufPtrs[1] = &gc->hwDep.cvgDep.frontBuf; - bufPtrs[2] = &gc->hwDep.cvgDep.backBuf; - - for(i = 0; i < sizeof(bufPtrs) / sizeof(*bufPtrs); i++) { - *bufPtrs[i] = (*bufPtrs[i] + 1) % numBufs; - } - - GDBG_INFO(gc->myLevel, - "\trenderBuf: 0x%X\n", - gc->hwDep.cvgDep.renderBuf); - } -#endif /* GLIDE_BLIT_CLEAR */ -#endif /* (GLIDE_PLATFORM & GLIDE_HW_CVG) */ - - grSstStatus(); /* special bug workaround */ -#else -# error "Need to implement swap." -#endif /* GLIDE_PLATFORM & GLIDE_HW_SST1 */ - - _GlideRoot.stats.bufferSwaps++; - - GR_END(); -#undef FN_NAME -} /* grBufferSwap */ - -/*--------------------------------------------------------------------------- -** grBufferNumPending -*/ - -GR_ENTRY(grBufferNumPending, int, (void)) -{ - int pend; /* Num Swaps pending */ - - { - FxU32 status = grSstStatus(); - -#if ((GLIDE_PLATFORM & GLIDE_HW_CVG) || (GLIDE_PLATFORM & GLIDE_HW_H3)) - pend = ((status & SST_SWAPBUFPENDING) >> SST_SWAPBUFPENDING_SHIFT); -#else -#error "Implement BufferNumPending for this hardware" -#endif - } - - GDBG_INFO(86,"grBufferNumPending() => %d\n", pend); - - return pend; -} /* grBufferNumPending */ - -/*--------------------------------------------------------------------------- -** grChromakeyMode -*/ - -GR_STATE_ENTRY(grChromakeyMode, void, (GrChromakeyMode_t mode)) -{ -#define FN_NAME "grChromakeyMode" - FxU32 fbzMode; - GR_BEGIN_NOFIFOCHECK("grChromakeyMode", 85); - GDBG_INFO_MORE(gc->myLevel, "(%d)\n", mode); - - fbzMode = gc->state.fbi_config.fbzMode; - if (mode == GR_CHROMAKEY_ENABLE) - fbzMode |= SST_ENCHROMAKEY; - else - fbzMode &= ~SST_ENCHROMAKEY; - - gc->state.fbi_config.fbzMode = fbzMode; - - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(eChipFBI, hw, fbzMode, fbzMode); - GR_CHECK_SIZE(); -#undef FN_NAME -} /* grChromaKeyMode */ - -/*--------------------------------------------------------------------------- -** grChromakeyValue -*/ -GR_STATE_ENTRY(grChromakeyValue, void, (GrColor_t color)) -{ -#define FN_NAME "grChromakeyValue" - GR_BEGIN_NOFIFOCHECK("grChromakeyValue", 10); - GDBG_INFO_MORE(gc->myLevel, "(0x%x)\n", color); - - _grSwizzleColor(&color); - gc->state.fbi_config.chromaKey = color; - -#if 1 - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(eChipFBI, hw, chromaKey, color); - GR_CHECK_SIZE(); -#else - /* Experimental fix to see if the increased precison of v^2 bilinear - * blending (.4 to .8) was causing more grief to developers who did - * the hacky by turning on chroma w/ bilinear. - */ -#define kChromaOffset 2 - { - const FxI32 compR = (color >> 16) & 0xFF; - const FxI32 compG = (color >> 8) & 0xFF; - const FxI32 compB = (color >> 0) & 0xFF; - const FxU32 chromaMin = ((MAX(compR - kChromaOffset, 0x00) << 16) | - (MAX(compG - kChromaOffset, 0x00) << 8) | - (MAX(compB - kChromaOffset, 0x00) << 0)); - const FxU32 chromaMax = ((MIN(compR + kChromaOffset, 0xFF) << 16) | - (MIN(compG + kChromaOffset, 0xFF) << 8) | - (MIN(compB + kChromaOffset, 0xFF) << 0)); - - REG_GROUP_BEGIN(eChipFBI, chromaKey, 2, 0x03UL); - { - REG_GROUP_SET(hw, chromaKey, chromaMin); - REG_GROUP_SET(hw, chromaRange, chromaMax | SST_ENCHROMARANGE); - } - REG_GROUP_END(); - } -#undef kChromaOffset -#endif -#undef FN_NAME -} /* grChromaKeyValue */ - -/*--------------------------------------------------------------------------- -** _grClipNormalizeAndGenerateRegValues -** -** This routine normalizes clip variables to screen_width and -** screen_height, then generates the values to be written to the -** registers clipLeftRight and clipBottomTop. The reason for its -** existence is that BOTH grClipWindow() and grSstControl() need to -** write these registers. -*/ -void -_grClipNormalizeAndGenerateRegValues(FxU32 minx, FxU32 miny, FxU32 maxx, - FxU32 maxy, FxU32 *clipLeftRight, - FxU32 *clipBottomTop) -{ -#define FN_NAME "_grClipNormalizeAndGenerateRegValues" - GR_DCL_GC; - - GDBG_INFO(85, "%s: minx = %d, maxx = %d, miny = %d, maxy = %d\n", - FN_NAME, minx, maxx, miny, maxy); - - GR_CHECK_COMPATABILITY(FN_NAME, - ((maxx > gc->state.screen_width) || (maxy > gc->state.screen_height)), - "Max clip coordinate > screen size"); - GR_CHECK_COMPATABILITY(FN_NAME, - ((minx > LONG_MAX) || (miny > LONG_MAX)), - "Negative min clip coordinate"); - - /* don't allow bogus clip coords!!! */ - if (maxx > gc->state.screen_width) maxx = gc->state.screen_width; - if (maxy > gc->state.screen_height) maxy = gc->state.screen_height; - if (minx > maxx) minx = maxx; - if (miny > maxy) miny = maxy; - - GDBG_INFO(85, "%s: normalized minx = %d, maxx = %d, miny = %d, maxy = %d\n", - FN_NAME, minx, maxx, miny, maxy); - - *clipLeftRight = (minx << SST_CLIPLEFT_SHIFT) | (maxx << SST_CLIPRIGHT_SHIFT); - *clipBottomTop = (miny << SST_CLIPBOTTOM_SHIFT) | (maxy << SST_CLIPTOP_SHIFT); - - GDBG_INFO(85, "%s: clipLeftRight = 0x%x, clipBottomTop = 0x%x\n", - FN_NAME, clipLeftRight, clipBottomTop); - -#undef FN_NAME -} /* _grClipNormalizeAndGenerateRegValues */ - -/*--------------------------------------------------------------------------- -** grClipWindow -*/ -GR_STATE_ENTRY(grClipWindow, void, (FxU32 minx, FxU32 miny, - FxU32 maxx, FxU32 maxy)) -{ -#define FN_NAME "grClipWindow" - FxU32 - clipLeftRight, /* SST Clipping Registers */ - clipBottomTop; - - GR_BEGIN_NOFIFOCHECK("grClipWindow",83); - GDBG_INFO_MORE(gc->myLevel,"(%d,%d %d,%d)\n",minx,miny,maxx,maxy); - - _grClipNormalizeAndGenerateRegValues(minx, miny, maxx, maxy, - &clipLeftRight, &clipBottomTop); - - REG_GROUP_BEGIN(BROADCAST_ID, clipLeftRight, 2, 0x03); - { - REG_GROUP_SET(hw, clipLeftRight, clipLeftRight); - REG_GROUP_SET(hw, clipBottomTop, clipBottomTop); - } - REG_GROUP_END(); - - gc->state.fbi_config.clipLeftRight = clipLeftRight; - gc->state.fbi_config.clipBottomTop = clipBottomTop; - - gc->state.clipwindowf_xmin = (float) minx; - gc->state.clipwindowf_xmax = (float) maxx; - gc->state.clipwindowf_ymin = (float) miny; - gc->state.clipwindowf_ymax = (float) maxy; - - GR_END(); -#undef FN_NAME -} /* grClipWindow */ - -/*--------------------------------------------------------------------------- -** grColorCombine -*/ - -GR_STATE_ENTRY(grColorCombine, void, - (GrCombineFunction_t function, GrCombineFactor_t factor, - GrCombineLocal_t local, GrCombineOther_t other, FxBool invert)) -{ -#define FN_NAME "grColorCombine" - FxU32 fbzColorPath; - FxU32 oldTextureEnabled; - - GR_BEGIN_NOFIFOCHECK("grColorCombine",85); - GDBG_INFO_MORE(gc->myLevel,"(%d,%d,%d,%d,%d)\n",function,factor,local,other,invert); - - GR_CHECK_W(myName, - function < GR_COMBINE_FUNCTION_ZERO || - function > GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA , - "unsupported color combine function"); - - /* Starting w/ Voodoo^2 the ccu has texture RGB mode as well. */ - GR_CHECK_W(myName, - (factor & 0x7) < GR_COMBINE_FACTOR_ZERO || - (factor & 0x7) > GR_COMBINE_FACTOR_TEXTURE_RGB || - factor > GR_COMBINE_FACTOR_ONE_MINUS_TEXTURE_ALPHA, - "unsupported color combine scale factor"); - GR_CHECK_W(myName, - local < GR_COMBINE_LOCAL_ITERATED || local > GR_COMBINE_LOCAL_DEPTH, - "unsupported color combine local color"); - GR_CHECK_W(myName, - other < GR_COMBINE_OTHER_ITERATED || other > GR_COMBINE_OTHER_CONSTANT, - "unsupported color combine other color"); - - fbzColorPath = gc->state.fbi_config.fbzColorPath; - oldTextureEnabled = fbzColorPath & SST_ENTEXTUREMAP; - fbzColorPath &= ~(SST_ENTEXTUREMAP | - 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); - - /* this is bogus, it should be done once, somewhere. */ - fbzColorPath |= SST_PARMADJUST; - - /* setup reverse blending first, then strip off the the high bit */ - if ((factor & 0x8) == 0) - fbzColorPath |= SST_CC_REVERSE_BLEND; - factor &= 0x7; - - /* NOTE: we use boolean OR instead of logical to avoid branches */ - gc->state.cc_requires_texture = ((factor == GR_COMBINE_FACTOR_TEXTURE_ALPHA) | - (factor == GR_COMBINE_FACTOR_TEXTURE_RGB) | - (other == GR_COMBINE_OTHER_TEXTURE)); - gc->state.cc_requires_it_rgb = ((local == GR_COMBINE_LOCAL_ITERATED) | - (other == GR_COMBINE_OTHER_ITERATED)); - - /* setup scale factor bits */ - fbzColorPath |= factor << SST_CC_MSELECT_SHIFT; - - /* setup local color bits */ - fbzColorPath |= local << SST_LOCALSELECT_SHIFT; - - /* setup other color bits */ - fbzColorPath |= other << SST_RGBSELECT_SHIFT; - - /* setup invert output bits */ - if (invert) - fbzColorPath |= SST_CC_INVERT_OUTPUT; - - /* setup core color combine unit bits */ - switch (function) { - case GR_COMBINE_FUNCTION_ZERO: - fbzColorPath |= SST_CC_ZERO_OTHER; - break; - - case GR_COMBINE_FUNCTION_LOCAL: - fbzColorPath |= SST_CC_ZERO_OTHER | SST_CC_ADD_CLOCAL; - break; - - case GR_COMBINE_FUNCTION_LOCAL_ALPHA: - fbzColorPath |= SST_CC_ZERO_OTHER | SST_CC_ADD_ALOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER: - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL: - fbzColorPath |= SST_CC_ADD_CLOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA: - fbzColorPath |= SST_CC_ADD_ALOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL: - fbzColorPath |= SST_CC_SUB_CLOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL: - fbzColorPath |= SST_CC_SUB_CLOCAL | SST_CC_ADD_CLOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL_ALPHA: - fbzColorPath |= SST_CC_SUB_CLOCAL | SST_CC_ADD_ALOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL: - fbzColorPath |= SST_CC_ZERO_OTHER | SST_CC_SUB_CLOCAL | SST_CC_ADD_CLOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA: - fbzColorPath |= SST_CC_ZERO_OTHER | SST_CC_SUB_CLOCAL | SST_CC_ADD_ALOCAL; - break; - } - - /* if either color or alpha combine requires texture then enable it */ - if (gc->state.cc_requires_texture || gc->state.ac_requires_texture) - fbzColorPath |= SST_ENTEXTUREMAP; - gc->state.fbi_config.fbzColorPath = fbzColorPath; - - { - const FxBool texTransP = (oldTextureEnabled != (fbzColorPath & SST_ENTEXTUREMAP)); - - GR_SET_EXPECTED_SIZE(sizeof(FxU32) + (texTransP ? sizeof(FxU32) : 0), - 1 + texTransP); - - /* transition into/out of texturing ... add nopCMD */ - if (texTransP) GR_SET(BROADCAST_ID, hw, nopCMD, 0); - GR_SET(BROADCAST_ID, hw, fbzColorPath, fbzColorPath); - GR_CHECK_SIZE(); - } - - /* setup paramIndex bits */ - _grUpdateParamIndex(); - - GR_END(); -#undef FN_NAME -} /* grColorCombine */ - -/*--------------------------------------------------------------------------- -** grColorMask -*/ - -GR_STATE_ENTRY(grColorMask, void, (FxBool rgb, FxBool alpha)) -{ -#define FN_NAME "grColorMask" - FxU32 fbzMode; - GR_BEGIN_NOFIFOCHECK("grColorMask", 85); - GDBG_INFO_MORE(gc->myLevel, "(0x%x,0x%x)\n", rgb, alpha); - - fbzMode = gc->state.fbi_config.fbzMode; - -#if 0 - GR_CHECK_W(myName, - (fbzMode & SST_ENDEPTHBUFFER) && alpha, - "alpha writes enabled even though depth buffering"); -#endif - - /* This is fatal because they could stomp on the cmd fifo. */ - GR_CHECK_COMPATABILITY(FN_NAME, - (alpha && (gc->grAuxBuf == 0)), - "cannot enable alpha buffering w/o allocating one"); - - if (rgb) - fbzMode |= SST_RGBWRMASK; - else - fbzMode &= ~SST_RGBWRMASK; - - /* GMT: BUG leave SST_ENALPHABUFFER on if dest. alpha being used */ - /* Don't do anything if depth buffering on */ - /* XXX Should check for triple buffering too */ - - if (!(fbzMode & SST_ENDEPTHBUFFER) && (gc->state.num_buffers != 3)) { - if (alpha) - fbzMode |= SST_ENALPHABUFFER | SST_ZAWRMASK; - else - fbzMode &= ~(SST_ENALPHABUFFER | SST_ZAWRMASK); - } - - gc->state.fbi_config.fbzMode = fbzMode; - - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, fbzMode, fbzMode); - GR_CHECK_SIZE(); -#undef FN_NAME -} /* grColorMask */ - -/*--------------------------------------------------------------------------- -** grConstantColorValue -*/ - -GR_STATE_ENTRY(grConstantColorValue, void, (GrColor_t color)) -{ -#define FN_NAME "grConstantColorValue" - GR_BEGIN_NOFIFOCHECK("grConstantColorValue",85); - GDBG_INFO_MORE(gc->myLevel,"(0x%x)\n",color); - - _grSwizzleColor(&color); - - REG_GROUP_BEGIN(BROADCAST_ID, c0, 2, 0x03); - { - REG_GROUP_SET(hw, c0, color); - REG_GROUP_SET(hw, c1, color); - } - REG_GROUP_END(); - - gc->state.fbi_config.color0 = color; - gc->state.fbi_config.color1 = color; - - GR_END(); -#undef FN_NAME -} /* grConstanColorValue */ - -/*--------------------------------------------------------------------------- -** grConstantColorValue4 -** GMT: obsolete routine -** GMT: send values to hardware immediately -*/ - -GR_ENTRY(grConstantColorValue4, void, (float a, float r, float g, float b)) -{ -#define FN_NAME "grConstantColorValue4" - GR_BEGIN_NOFIFOCHECK("grConstantColorValue4",85); - GDBG_INFO_MORE(gc->myLevel,"(%d,%d,%d,%d)\n",a,r,g,b); - gc->state.a = a; - gc->state.r = r; - gc->state.g = g; - gc->state.b = b; - - if (gc->state.cc_delta0mode) { - REG_GROUP_BEGIN(BROADCAST_ID, Fr, 3, 0x07); - { - REG_GROUP_SETF(hw, Fr, r); - REG_GROUP_SETF(hw, Fg, g); - REG_GROUP_SETF(hw, Fb, b); - } - REG_GROUP_END(); - } - - GR_END(); -#undef FN_NAME -} /* grConstantColorValue4 */ - -/*--------------------------------------------------------------------------- -** grCullMode -** -** GMT: warning - gaa.c has the guts of this in-line -*/ - -GR_ENTRY(grCullMode, void, (GrCullMode_t mode)) -{ -#define FN_NAME "grCullMode" - GR_BEGIN_NOFIFOCHECK("grCullMode",85); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",mode); - gc->state.cull_mode = mode; - -#if GLIDE_HW_TRI_SETUP - _grUpdateTriPacketHdr(gc->cmdTransportInfo.paramMask, mode); -#endif /* GLIDE_HW_TRI_SETUP */ - - GR_END(); -#undef FN_NAME -} /* grCullMode */ - -/*--------------------------------------------------------------------------- -** grDepthBiasLevel -** -** Sets the depth bias level. -*/ - -GR_STATE_ENTRY(grDepthBiasLevel, void, (FxI16 level)) -{ -#define FN_NAME "grDepthBiasLevel" - FxU32 zacolor; - GR_BEGIN_NOFIFOCHECK("grDepthBiasLevel", 85); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",level); - - zacolor = gc->state.fbi_config.zaColor; - zacolor = (zacolor & ~SST_ZACOLOR_DEPTH) | (level & SST_ZACOLOR_DEPTH); - - gc->state.fbi_config.zaColor = zacolor; - - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, zaColor, zacolor); - GR_CHECK_SIZE(); -#undef FN_NAME -} /* grDepthBiasLevel */ - -/*--------------------------------------------------------------------------- -** grDepthBufferFunction -*/ - -GR_STATE_ENTRY(grDepthBufferFunction, void, (GrCmpFnc_t fnc)) -{ -#define FN_NAME "grDepthBufferFunction" - FxU32 fbzMode; - - GR_BEGIN_NOFIFOCHECK("grDepthBufferFunction",85); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",fnc); - - fbzMode = gc->state.fbi_config.fbzMode; - fbzMode &= ~SST_ZFUNC; - fbzMode |= (fnc << SST_ZFUNC_SHIFT); - - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, fbzMode, fbzMode); - GR_CHECK_SIZE(); - - gc->state.fbi_config.fbzMode = fbzMode; - GR_END(); -#undef FN_NAME -} /* grDepthBufferFunction */ - -/*--------------------------------------------------------------------------- -** grDepthBufferMode -*/ - -GR_STATE_ENTRY(grDepthBufferMode, void, (GrDepthBufferMode_t mode)) -{ -#define FN_NAME "grDepthBufferMode" - FxU32 fbzMode; - GR_BEGIN_NOFIFOCHECK("grDepthBufferMode", 85); - GDBG_INFO_MORE(gc->myLevel, "(%d)\n", mode); - - /* This is fatal because they could stomp on the cmd fifo. */ - GR_CHECK_COMPATABILITY(FN_NAME, - (mode != GR_DEPTHBUFFER_DISABLE) && (gc->grAuxBuf == 0), - "cannot enable depth buffer w/o allocating one"); - - /* turn off all the bits and then turn them back on selectively */ - fbzMode = gc->state.fbi_config.fbzMode; - fbzMode &= ~(SST_ENDEPTHBUFFER | - SST_WBUFFER | - SST_ENZBIAS | - SST_ZCOMPARE_TO_ZACOLOR); - - switch (mode) { - case GR_DEPTHBUFFER_DISABLE: - break; - - case GR_DEPTHBUFFER_ZBUFFER: - fbzMode |= SST_ENDEPTHBUFFER | SST_ENZBIAS; - break; - - case GR_DEPTHBUFFER_WBUFFER: - fbzMode |= SST_ENDEPTHBUFFER | SST_WBUFFER | SST_ENZBIAS; - break; - - case GR_DEPTHBUFFER_ZBUFFER_COMPARE_TO_BIAS: - fbzMode |= SST_ENDEPTHBUFFER | SST_ZCOMPARE_TO_ZACOLOR; - break; - - case GR_DEPTHBUFFER_WBUFFER_COMPARE_TO_BIAS: - fbzMode |= SST_ENDEPTHBUFFER | SST_WBUFFER | SST_ZCOMPARE_TO_ZACOLOR; - break; - } - - /* - ** Update hardware and Glide state - */ - gc->state.fbi_config.fbzMode = fbzMode; - - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, fbzMode, fbzMode); - GR_CHECK_SIZE(); - - _grUpdateParamIndex(); -#undef FN_NAME -} /* grDepthBufferMode */ - -/*--------------------------------------------------------------------------- -** No Comment -*/ -#ifdef GLIDE_DEBUG -FxBool - -_grCanSupportDepthBuffer(void) -{ - GR_DCL_GC; - if (gc->state.screen_height == 640) { - if (gc->fbuf_size == 1) { - return FXFALSE; - } - } else if (gc->state.screen_width == 800) { - if ((gc->fbuf_size == 1) || - (gc->fbuf_size == 2)) { - return FXFALSE; - } - } - return FXTRUE; -} /* _grCanSupportDepthBuffer */ -#endif - -/*--------------------------------------------------------------------------- -** grDepthMask -*/ -GR_STATE_ENTRY(grDepthMask, void, (FxBool enable)) -{ -#define FN_NAME "grDepthMask" - FxU32 fbzMode; - GR_BEGIN_NOFIFOCHECK("grDepthMask", 85); - GDBG_INFO_MORE(gc->myLevel, "(%d)\n", enable); - - fbzMode = gc->state.fbi_config.fbzMode; - GR_CHECK_F(myName, - enable && !_grCanSupportDepthBuffer(), - "called in a non-depthbufferable configuration"); - - if (enable) - fbzMode |= SST_ZAWRMASK; - else - fbzMode &= ~SST_ZAWRMASK; - - gc->state.fbi_config.fbzMode = fbzMode; - - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, fbzMode, fbzMode); - GR_CHECK_SIZE(); -#undef FN_NAME -} /* grDepthMask */ - -/*--------------------------------------------------------------------------- -** grDisableAllEffects -*/ - -GR_ENTRY(grDisableAllEffects, void, (void)) -{ - GDBG_INFO(87,"grDisableAllEffects()\n"); - grAlphaBlendFunction(GR_BLEND_ONE, GR_BLEND_ZERO, GR_BLEND_ONE, GR_BLEND_ZERO); - grAlphaTestFunction(GR_CMP_ALWAYS); - grChromakeyMode(GR_CHROMAKEY_DISABLE); - grDepthBiasLevel(0); - grDepthBufferMode(GR_DEPTHBUFFER_DISABLE); - grFogMode(GR_FOG_DISABLE); -} /* grDisableAllEffects */ - -/*--------------------------------------------------------------------------- -** grDitherMode -*/ - -GR_STATE_ENTRY(grDitherMode, void, (GrDitherMode_t mode)) -{ -#define FN_NAME "grDitherMode" - FxU32 fbzMode; - GR_BEGIN_NOFIFOCHECK("grDitherMode", 85); - GDBG_INFO_MORE(gc->myLevel, "(%d)\n", mode); - - fbzMode = gc->state.fbi_config.fbzMode; - if (_GlideRoot.environment.disableDitherSub == FXTRUE) - fbzMode &= ~(SST_ENDITHER | SST_DITHER2x2); - else - fbzMode &= ~(SST_ENDITHER | SST_DITHER2x2 | SST_ENDITHERSUBTRACT); - - switch (mode) { - case GR_DITHER_DISABLE: - break; - - case GR_DITHER_2x2: - fbzMode |= (SST_ENDITHER | SST_DITHER2x2); - break; - - case GR_DITHER_4x4: - fbzMode |= (SST_ENDITHER | SST_ENDITHERSUBTRACT); - break; - } - - gc->state.fbi_config.fbzMode = fbzMode; - - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, fbzMode, fbzMode); - GR_CHECK_SIZE(); -#undef FN_NAME -} /* grDitherMode */ - -/*--------------------------------------------------------------------------- -** grFogMode -*/ - -GR_STATE_ENTRY(grFogMode, void, (GrFogMode_t mode)) -{ -#define FN_NAME "grFogMode" - FxU32 fogmode; - GR_BEGIN_NOFIFOCHECK("grFogMode", 85); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",mode); - - fogmode = gc->state.fbi_config.fogMode; - fogmode &= ~(SST_ENFOGGING | - SST_FOGADD | - SST_FOGMULT | - SST_FOG_ALPHA | - SST_FOG_Z | - SST_FOG_CONSTANT); - - switch (mode & 0xFF) { /* switch based on lower 8 bits */ - case GR_FOG_DISABLE: - break; - - case GR_FOG_WITH_ITERATED_ALPHA: - fogmode |= (SST_ENFOGGING | SST_FOG_ALPHA); - break; - - case GR_FOG_WITH_ITERATED_Z: /* Bug 735 */ - fogmode |= (SST_ENFOGGING | SST_FOG_Z); - break; - - case GR_FOG_WITH_TABLE: - fogmode |= (SST_ENFOGGING); - break; - } - if (mode & GR_FOG_MULT2) fogmode |= SST_FOGMULT; - if (mode & GR_FOG_ADD2) fogmode |= SST_FOGADD; - - /* GMT says that this should be enabled for CVG. It is always safe - * to enable these even when fogging is not enabled. - */ - fogmode |= (SST_FOG_DITHER | SST_FOG_ZONES); - - /* - ** Update the hardware and Glide state - */ - gc->state.fbi_config.fogMode = fogmode; - - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, fogMode, fogmode); - GR_CHECK_SIZE(); - - _grUpdateParamIndex(); -#undef FN_NAME -} /* grFogMode */ - -/*--------------------------------------------------------------------------- -** grFogColorValue -*/ - -GR_STATE_ENTRY(grFogColorValue, void, (GrColor_t color)) -{ -#define FN_NAME "grFogColorValue" - GR_BEGIN_NOFIFOCHECK("grFogColorValue", 85); - GDBG_INFO_MORE(gc->myLevel, "(0x%x)\n", color); - - _grSwizzleColor(&color); - - gc->state.fbi_config.fogColor = color; - - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, fogColor, color); - GR_CHECK_SIZE(); -#undef FN_NAME -} /* grFogColorValue */ - -/*--------------------------------------------------------------------------- -** grFogTable -*/ - -GR_ENTRY(grFogTable, void, (const GrFog_t fogtable[])) -{ -#define FN_NAME "grFogTable" - const GrFog_t *locTable = fogtable; - const int iend = (kInternalFogTableEntryCount >> 1); - GR_BEGIN_NOFIFOCHECK("grFogTable",85); - GDBG_INFO_MORE(gc->myLevel,"(0x%x)\n",fogtable); - GR_ASSERT(fogtable != NULL); - GR_ASSERT(kInternalFogTableEntryCount == 64); - - REG_GROUP_LONG_BEGIN(BROADCAST_ID, fogTable[0], 32); - { - int j; - - for (j = 0; j < iend; j++) { - FxU32 e0, e1, d0, d1; - - e0 = locTable[0]; /* lower entry */ - e1 = locTable[1]; /* upper entry */ - - GR_CHECK_COMPATABILITY(FN_NAME, - (e1 < e0), - "Invalid fog table entry. (Must be monotonically increasing)"); - GR_CHECK_COMPATABILITY(FN_NAME, - ((j > 0) ? (e0 < locTable[-1]) : 0), - "Invalid fog table entry. (Must be monotonically increasing)"); - - /* del0 in .2 format */ - d0 = ((e1 - e0) << 2); - - /* del1 in .2 format - don't access beyond end of table */ - d1 = ((j == (iend - 1)) ? e1 : locTable[2]); - d1 = (d1 - e1) << 2; - - REG_GROUP_SET(hw, fogTable[j], - ((e1 << 24) | (d1 << 16) | (e0 << 8) | d0)); - GDBG_INFO(gc->myLevel + 200, "fogTable[%ld]: 0x%X\n", - j, ((e1 << 24) | (d1 << 16) | (e0 << 8) | d0)); - locTable += 2; - } - } - REG_GROUP_END(); - - GR_END(); -#undef FN_NAME -} /* grFogTable */ - -/*------------------------------------------------------------------- - Function: grGlideShutdown - Date: 3/16 - Implementor(s): dow, gmt, jdt - Library: Glide - Description: - Shutdown the Glide Library. Iterate through all hardware and - call grSstWinClose(). Call InitShutdown() which unmaps all - hardware from linear memory. - Arguments: - none - Return: - none - -------------------------------------------------------------------*/ - -GR_ENTRY(grGlideShutdown, void, (void)) -{ - _GlideRoot.windowsInit = FXFALSE; - - if (!_GlideRoot.initialized) return; /* never made it thru startup */ - -#if GLIDE_SANITY_SIZE - /* GMT: reset the counter so we can proceed without assertions */ - { - GR_DCL_GC; - gc->counter = gc->expected_counter = 0; - } -#endif /* GLIDE_SANITY_SIZE */ - - { - int i; - GR_BEGIN_NOFIFOCHECK("grGlideShutdown\n", 80); - - for(i = 0; i < _GlideRoot.hwConfig.num_sst; i++) { - grSstSelect(i); - grSstWinClose(); - } - -#if GLIDE_INIT_HAL - fxHalShutdownAll(); -#else /* !GLIDE_INIT_HAL */ - /* dpc - 5 sep 1997 - FixMe! - * Move this to the new initCode world some time. - * - * initClose(); - * - * NB: This is only necessary to properly shtudown the hw and vxd - * if the application never called grSstWinOpen because they are - * doing some sort of hw/dll detection before trying to run w/ - * glide. - */ - for(i = 0; i < _GlideRoot.hwConfig.num_sst; i++) { - if (_GlideRoot.GCs[i].hwInitP) { - if (_GlideRoot.CPUType >= 6) { - sst1InitCaching(_GlideRoot.GCs[i].base_ptr, FXFALSE); - } - sst1InitShutdown(_GlideRoot.GCs[i].base_ptr); - - _GlideRoot.GCs[i].hwInitP = FXFALSE; - } - } -#endif /* !GLIDE_INIT_HAL */ - - _grDisplayStats(); - gc->grSstRez = GR_RESOLUTION_NONE; - gc->grSstRefresh = GR_REFRESH_NONE; - } -} /* grGlideShutdown */ - - -/*------------------------------------------------------------------- - Function: _grFlushCommonStateRegs - Date: 14-Oct-97 - Implementor(s): dpc - Description: - Flushes all State Monster regs. If we're not doing Glide 3, - then it's still used by grGlideSetState() - Arguments: - - Return: - -------------------------------------------------------------------*/ -void -_grFlushCommonStateRegs() -{ -#define FN_NAME "_grFlushCommonStateRegs" - GR_BEGIN("_grFlushCommonStateRegs", 97, 13 * sizeof(FxU32), 2); - - /* NB: This logical write must be split into two writes since the - * registers are non-contiguous (not good for packet 1) and are the - * register span is larget (greater than the 14 register mask size - * for packet 4). - */ - REG_GROUP_NO_CHECK_BEGIN(BROADCAST_ID, fbzColorPath, 10, 0x1C7F); - { - REG_GROUP_SET(hw, fbzColorPath, gc->state.fbi_config.fbzColorPath); - REG_GROUP_SET(hw, fogMode, gc->state.fbi_config.fogMode); - REG_GROUP_SET(hw, alphaMode, gc->state.fbi_config.alphaMode); - REG_GROUP_SET(hw, fbzMode, gc->state.fbi_config.fbzMode); - - REG_GROUP_SET(hw, lfbMode, gc->state.fbi_config.lfbMode); - REG_GROUP_SET(hw, clipLeftRight, gc->state.fbi_config.clipLeftRight); - REG_GROUP_SET(hw, clipBottomTop, gc->state.fbi_config.clipBottomTop); - - REG_GROUP_SET(hw, fogColor, gc->state.fbi_config.fogColor); - REG_GROUP_SET(hw, zaColor, gc->state.fbi_config.zaColor); - REG_GROUP_SET(hw, chromaKey, gc->state.fbi_config.chromaKey); - } - REG_GROUP_NO_CHECK_END(); - - REG_GROUP_NO_CHECK_BEGIN(BROADCAST_ID, stipple, 3, 0x07); - { - REG_GROUP_SET(hw, stipple, gc->state.fbi_config.stipple); - REG_GROUP_SET(hw, c0, gc->state.fbi_config.color0); - REG_GROUP_SET(hw, c1, gc->state.fbi_config.color1); - } - REG_GROUP_NO_CHECK_END(); - - - GR_END(); - -#undef FN_NAME -} /* _grFlushCommonStateRegs */ - -/*--------------------------------------------------------------------------- -** grGlideSetState -*/ -GR_ENTRY(grGlideSetState, void, (const GrState *state)) -{ -#define FN_NAME "grGlideSetState" - GR_BEGIN_NOFIFOCHECK(FN_NAME, 87); - GDBG_INFO_MORE(gc->myLevel,"(0x%x)\n",state); - - GR_ASSERT(state != NULL); - - /* if texture mapping changed then we need to issue a NOP command*/ - { - const FxBool texChangeP = (((gc->state.fbi_config.fbzColorPath ^ state->fbi_config.fbzColorPath) & - SST_ENTEXTUREMAP) != 0); - if (texChangeP) { - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, nopCMD, 0); - GR_CHECK_SIZE(); - } - } - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) - /* If we're on sli and the new state includes changing the origin - * that we clear the slop lines at the bottom of the screen. - */ - if (gc->scanline_interleaved) gc->hwDep.cvgDep.sliOriginBufCount = gc->grColBuf; -#endif /* (GLIDE_PLATFORM & GLIDE_HW_CVG) */ - - /* copy all the state */ - gc->state = *state; - - /* Update the hardware state from the saved state. */ - _grFlushCommonStateRegs(); - - GR_SET_EXPECTED_SIZE((7 * sizeof(FxU32)) * gc->num_tmu, gc->num_tmu); - { - int tmu; - - for (tmu = 0; tmu < gc->num_tmu; tmu++) { - SstRegs* tmuregs = SST_TMU(hw, tmu); - const FifoChipField chipField = (FifoChipField)(0x02UL << tmu); - - REG_GROUP_NO_CHECK_BEGIN(chipField, textureMode, 7, 0x7F); - { - REG_GROUP_SET(tmuregs, textureMode, gc->state.tmu_config[tmu].textureMode); - REG_GROUP_SET(tmuregs, tLOD, gc->state.tmu_config[tmu].tLOD); - REG_GROUP_SET(tmuregs, tDetail, gc->state.tmu_config[tmu].tDetail); - REG_GROUP_SET(tmuregs, texBaseAddr, gc->state.tmu_config[tmu].texBaseAddr); - - REG_GROUP_SET(tmuregs, texBaseAddr1, gc->state.tmu_config[tmu].texBaseAddr_1); - REG_GROUP_SET(tmuregs, texBaseAddr2, gc->state.tmu_config[tmu].texBaseAddr_2); - REG_GROUP_SET(tmuregs, texBaseAddr38, gc->state.tmu_config[tmu].texBaseAddr_3_8); - } - REG_GROUP_NO_CHECK_END(); - } - } - GR_CHECK_SIZE(); - - /* NOTE: since glide state includes things like hints and all cached - * variables like paramIndex we needn't recompute these, BUT: we do - * need to rebuild stuff that depends on them!!! - */ - _grUpdateParamIndex(); - - GR_END(); -#undef FN_NAME -} /* grGlideSetState */ - -/*--------------------------------------------------------------------------- -** grRenderBuffer -** -** Although SST1 supports triple buffering, it's a hack in the hardware, -** and the only drawbuffer modes supported by the fbzMode register are 0 -** (back) and 1 (front) -*/ - -GR_STATE_ENTRY(grRenderBuffer, void, (GrBuffer_t buffer)) -{ -#define FN_NAME "grRenderBuffer" - GR_BEGIN_NOFIFOCHECK("grRenderBuffer", 85); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",buffer); - GR_CHECK_F(myName, buffer >= GR_BUFFER_AUXBUFFER, "invalid buffer"); - - { - FxU32 fbzMode; - - fbzMode = gc->state.fbi_config.fbzMode; - fbzMode &= ~(SST_DRAWBUFFER); - fbzMode |= ((buffer == GR_BUFFER_FRONTBUFFER) - ? SST_DRAWBUFFER_FRONT - : SST_DRAWBUFFER_BACK); - - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, fbzMode, fbzMode); - GR_CHECK_SIZE(); - - gc->state.fbi_config.fbzMode = fbzMode; - } - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) && GLIDE_BLIT_CLEAR - /* Setting the render buffer means we need to adjust - * our current pointer to the render buffer's physical - * address if we're doing blit clears. - */ - { - const FxU32 oldRenderBuf = gc->hwDep.cvgDep.renderBuf; - - gc->hwDep.cvgDep.renderBuf = ((buffer == GR_BUFFER_FRONTBUFFER) - ? gc->hwDep.cvgDep.frontBuf - : gc->hwDep.cvgDep.backBuf); - if ((gc->hwDep.cvgDep.renderBuf != oldRenderBuf) && - (gc->hwDep.cvgDep.sliOriginBufCount != 0)) _grSliOriginClear(); - } -#endif /* (GLIDE_PLATFORM & GLIDE_HW_CVG) && GLIDE_BLIT_CLEAR */ - - GR_END(); -#undef FN_NAME -} /* grRenderBuffer */ - -GR_ENTRY(grCheckForRoom, void, (FxI32 n)) -{ - GR_DCL_GC; - - /* dpc - 13 sep 1997 - FixMe! - * Setting one packet for now. - */ - GR_CHECK_FOR_ROOM(n, 1); -} - -/*--------------------------------------------------------------------------- -** _grUpdateParamIndex -** -** Updates the paramIndex bits based on Glide state and the hints. -** -*/ -GR_DDFUNC(_grUpdateParamIndex, void, (void)) -{ -#define FN_NAME "_grUpdateParamIndex" - GR_DCL_GC; - FxU32 paramIndex = 0; - const FxU32 hints = gc->state.paramHints; - const FxU32 fbzColorPath = gc->state.fbi_config.fbzColorPath; - const FxU32 fogMode = gc->state.fbi_config.fogMode; - const FxU32 fbzMode = gc->state.fbi_config.fbzMode; - - /* - ** First, turn on every bit that we think we need. We can prune them - ** back later. - */ - - /* Turn on the texture bits based on what grTexCombine set */ - if (fbzColorPath & SST_ENTEXTUREMAP) { - /* No matter what, we need oow from the main grvertex structure */ - static FxU32 paramI_array[] = { - /* 0 */ - STATE_REQUIRES_OOW_FBI, - - /* 1 */ - STATE_REQUIRES_OOW_FBI | - STATE_REQUIRES_W_TMU0 | STATE_REQUIRES_ST_TMU0, - - /* 2 */ - STATE_REQUIRES_OOW_FBI | - STATE_REQUIRES_W_TMU1 | STATE_REQUIRES_ST_TMU1, - - /* 3 */ - STATE_REQUIRES_OOW_FBI | - STATE_REQUIRES_W_TMU0 | STATE_REQUIRES_ST_TMU0 | - STATE_REQUIRES_W_TMU1 | STATE_REQUIRES_ST_TMU1, - - /* 4 */ - STATE_REQUIRES_OOW_FBI | - STATE_REQUIRES_W_TMU2 | STATE_REQUIRES_ST_TMU2, - - /* 5 */ - STATE_REQUIRES_OOW_FBI | - STATE_REQUIRES_W_TMU0 | STATE_REQUIRES_ST_TMU0 | - STATE_REQUIRES_W_TMU2 | STATE_REQUIRES_ST_TMU2, - - /* 6 */ - STATE_REQUIRES_OOW_FBI | - STATE_REQUIRES_W_TMU1 | STATE_REQUIRES_ST_TMU1 | - STATE_REQUIRES_W_TMU2 | STATE_REQUIRES_ST_TMU2, - - /* 7 */ - STATE_REQUIRES_OOW_FBI | - STATE_REQUIRES_W_TMU0 | STATE_REQUIRES_ST_TMU0 | - STATE_REQUIRES_W_TMU1 | STATE_REQUIRES_ST_TMU1 | - STATE_REQUIRES_W_TMU2 | STATE_REQUIRES_ST_TMU2, - }; - - GR_ASSERT(gc->state.tmuMask < sizeof(paramI_array)/sizeof(paramI_array[0])); - paramIndex |= paramI_array[gc->state.tmuMask]; - } - - /* See if we need iterated RGB */ - if (gc->state.cc_requires_it_rgb && !gc->state.cc_delta0mode) { - paramIndex |= STATE_REQUIRES_IT_DRGB; - } - - /* See if we need to iterate alpha based on the value of - ac_requires_it_alpha */ - if (gc->state.ac_requires_it_alpha) { - paramIndex |= STATE_REQUIRES_IT_ALPHA; - } - - /* See what fbzColorPath contributes - BUG 1084*/ - if (( fbzColorPath & SST_ALOCALSELECT ) == SST_ALOCAL_Z ) { - paramIndex |= STATE_REQUIRES_OOZ; - } - - /* See what fbzMode contributes */ - if (fbzMode & SST_ENDEPTHBUFFER) { - if (fbzMode & SST_WBUFFER) { - paramIndex |= STATE_REQUIRES_OOW_FBI; - } else { - paramIndex |= STATE_REQUIRES_OOZ; - } - } - - /* See what fogMode contributes */ - if (fogMode & SST_ENFOGGING) { - if (fogMode & SST_FOG_Z) { - paramIndex |= STATE_REQUIRES_OOZ; - } else { - if (fogMode & SST_FOG_ALPHA) { - paramIndex |= STATE_REQUIRES_IT_ALPHA; - } else { - paramIndex |= STATE_REQUIRES_OOW_FBI; - } - } - } - - /* - ** Now we know everything that needs to be iterated. Prune back - ** the stuff that isn't explicitly different - ** - ** NOTE: by GMT, STATE_REQUIRES_OOW_FBI is set whenever texture mapping - ** is enabled - */ - /* Turn off W for TMU0 if we don't have a hint */ - if (paramIndex & STATE_REQUIRES_W_TMU0) { - GR_ASSERT(paramIndex & STATE_REQUIRES_OOW_FBI); - if (!(hints & GR_STWHINT_W_DIFF_TMU0)) - paramIndex &= ~STATE_REQUIRES_W_TMU0; - } - - /* Turn off ST for TMU1 if TMU0 is active and TMU1 is not different */ - if (((paramIndex & (STATE_REQUIRES_ST_TMU0 | STATE_REQUIRES_ST_TMU1)) == - (STATE_REQUIRES_ST_TMU0 | STATE_REQUIRES_ST_TMU1)) && - !(hints & GR_STWHINT_ST_DIFF_TMU1)) - paramIndex &= ~STATE_REQUIRES_ST_TMU1; - - /* Turn off W for TMU1 if we have a previous W, and don't have a hint */ - if ((paramIndex & STATE_REQUIRES_W_TMU1) && !(hints & GR_STWHINT_W_DIFF_TMU1)) - paramIndex &= ~STATE_REQUIRES_W_TMU1; - -#if (GLIDE_NUM_TMU > 2) - /* Turn off ST for TMU1 if it's not different & any other is set up. */ - if ((paramIndex & (STATE_REQUIRES_ST_TMU0 | STATE_REQURES_ST_TMU1)) && - (paramIndex & STATE_REQUIRES_ST_TMU2) && - !(hints & GR_STWHINT_ST_DIFF_TMU2)) - paramIndex &= ~STATE_REQUIRES_ST_TMU2; - - /* Turn off W for TMU2 if we have a previous W, and don't have a hint */ - if ((paramIndex & STATE_REQUIRES_W_TMU2) && !(hints & GR_STWHINT_W_DIFF_TMU2)) - paramIndex &= ~STATE_REQUIRES_W_TMU2; -#endif - - gc->state.paramIndex = paramIndex; - - _grRebuildDataList(); -#undef FN_NAME -} /* _grUpdateParamIndex */ - -#if defined(GLIDE_USE_ALT_REGMAP) -#define RED Fr_ALT -#define DRDX Fdrdx_ALT -#define DRDY Fdrdy_ALT -#define GRN Fg_ALT -#define DGDX Fdgdx_ALT -#define DGDY Fdgdy_ALT -#define BLU Fb_ALT -#define DBDX Fdbdx_ALT -#define DBDY Fdbdy_ALT -#define ALF Fa_ALT -#define DADX Fdadx_ALT -#define DADY Fdady_ALT -#define Z Fz_ALT -#define DZDX Fdzdx_ALT -#define DZDY Fdzdy_ALT -#define S Fs_ALT -#define DSDX Fdsdx_ALT -#define DSDY Fdsdy_ALT -#define T Ft_ALT -#define DTDX Fdtdx_ALT -#define DTDY Fdtdy_ALT -#define W Fw_ALT -#define DWDX Fdwdx_ALT -#define DWDY Fdwdy_ALT -#else -#define RED Fr -#define DRDX Fdrdx -#define DRDY Fdrdy -#define GRN Fg -#define DGDX Fdgdx -#define DGDY Fdgdy -#define BLU Fb -#define DBDX Fdbdx -#define DBDY Fdbdy -#define ALF Fa -#define DADX Fdadx -#define DADY Fdady -#define Z Fz -#define DZDX Fdzdx -#define DZDY Fdzdy -#define S Fs -#define DSDX Fdsdx -#define DSDY Fdsdy -#define T Ft -#define DTDX Fdtdx -#define DTDY Fdtdy -#define W Fw -#define DWDX Fdwdx -#define DWDY Fdwdy -#endif - -#if GLIDE_HW_TRI_SETUP -static void -_grUpdateTriPacketHdr(FxU32 paramMask, - const GrCullMode_t cullMode) -{ - GR_DCL_GC; - FxU32 sMode = ((cullMode != GR_CULL_DISABLE) - ? kSetupCullEnable - : kSetupPingPongDisable); - if (sMode != kSetupPingPongDisable) sMode |= ((cullMode == GR_CULL_POSITIVE) - ? kSetupCullPositive - : kSetupCullNegative); - -#if GLIDE_DISPATCH_SETUP -#define COLOR_COMP_ARGB ((SST_SETUP_RGB | SST_SETUP_A) << SSTCP_PKT3_PMASK_SHIFT) -#define COLOR_COMP_RGB (SST_SETUP_RGB << SSTCP_PKT3_PMASK_SHIFT) -#define COLOR_COMP_MASK COLOR_COMP_ARGB - - /* Setup custom triangle/strip procs. - * - * NB: Currently this selection is based entirely on if - * we're sending color information. We should possibly - * select on cpu type as well to determine if we should - * do sw culling or not. - */ - if ((paramMask & SSTCP_PKT3_PACKEDCOLOR) == SSTCP_PKT3_PACKEDCOLOR) { - const FxU32 colorComp = paramMask & COLOR_COMP_MASK; - - switch(colorComp) { - case COLOR_COMP_ARGB: - gc->cmdTransportInfo.triSetupProc = TRISETUP_ARGB(cullMode); - break; - - case COLOR_COMP_RGB: - gc->cmdTransportInfo.triSetupProc = TRISETUP_RGB(cullMode); - break; - - /* If no rgb data then it is not worthwhile to pack - * just alpha so just mask off the packed color bit - * and just use the looping proc. - */ - default: - gc->cmdTransportInfo.triSetupProc = TRISETUP_NORGB(cullMode); - paramMask &= ~SSTCP_PKT3_PACKEDCOLOR; - break; - } - } else { - gc->cmdTransportInfo.triSetupProc = TRISETUP_NORGB(cullMode); - } -#endif /* GLIDE_DISPATCH_SETUP */ - - gc->cmdTransportInfo.paramMask = paramMask; - - /* Compute the common case packet 3 header which just needs - * the vertex count and strip/command type to be completed. - */ - gc->cmdTransportInfo.cullStripHdr = ((sMode << SSTCP_PKT3_SMODE_SHIFT) | - paramMask | - SSTCP_PKT3); - - /* Independent triangle hdr for grDrawTriangle */ - gc->cmdTransportInfo.triPacketHdr = (gc->cmdTransportInfo.cullStripHdr | - (0x3UL << SSTCP_PKT3_NUMVERTEX_SHIFT) | - SSTCP_PKT3_BDDBDD); - -#if GLIDE_TRI_CULLING - /* If we're doing sw culling for independent triangles then turn off - * the hw culling so we're consistent. HW culling, however, remains - * enabled for things using strips/fans. - */ - if (cullMode != GR_CULL_DISABLE) { - gc->cmdTransportInfo.triPacketHdr &= ~(kSetupCullEnable << SSTCP_PKT3_SMODE_SHIFT); - } -#endif /* GLIDE_TRI_CULLING */ -} -#endif /* GLIDE_HW_TRI_SETUP */ - -/*--------------------------------------------------------------------------- - * _grRebuildDataList - * - * NB: For CVG is *IMPERATIVE* that the writes to the parameter - * dataList remain in the order below otherwise the parameters - * will get written to the command packet in the wrong order. - */ -GR_DDFUNC(_grRebuildDataList, void, (void)) -{ -#define FN_NAME "_grRebuildDataList" - GR_DCL_GC; - GR_DCL_HW; - int curTriSize, params; - FxU32 i; - SstRegs *tmu0; - SstRegs *tmu1; - -#if GLIDE_PACKED_RGB - FxBool packedRGB = FXFALSE; -#endif /* GLIDE_PACKED_RGB */ - -#ifdef GLIDE_DEBUG - static char *p_str[] = {"x","y","z","r","g","b","ooz","a","oow", - "s0","t0","w0","s1","t1","w1","s2","t2","w2"}; -#endif /* GLIDE_DEBUG */ - - GDBG_INFO(85,"(s) paramHints=0x%x paramIndex=0x%x\n", FN_NAME, - gc->state.paramHints,gc->state.paramIndex); - - curTriSize = params = 0; - i = gc->state.paramIndex; -#ifdef GLIDE_USE_ALT_REGMAP - hw = SST_WRAP(hw,128); /* wrap 128-257 are ALTernate register mappings */ -#endif /* GLIDE_USE_ALT_REGMAP */ - - tmu0 = SST_CHIP(hw,0xE); /* tmu 0,1,2 */ - tmu1 = SST_CHIP(hw,0xC); /* tmu 1,2 */ - -#if GLIDE_HW_TRI_SETUP - gc->cmdTransportInfo.paramMask = 0x00; -#endif /* GLIDE_HW_TRI_SETUP */ - - if (i & STATE_REQUIRES_IT_DRGB) { -#if GLIDE_HW_TRI_SETUP - gc->cmdTransportInfo.paramMask |= SST_SETUP_RGB; - gc->tsuDataList[curTriSize + 0] = GR_VERTEX_R_OFFSET << 2; - - /* When using packed color we only add *ONE* item to the data list - * and this signals the entire color set since it is not possible - * to specify a single color component in any packet. - */ -#if !GLIDE_PACKED_RGB - gc->tsuDataList[curTriSize + 1] = GR_VERTEX_G_OFFSET << 2; - gc->tsuDataList[curTriSize + 2] = GR_VERTEX_B_OFFSET << 2; -#endif /* !GLIDE_PACKED_RGB */ -#endif /* GLIDE_HW_TRI_SETUP */ - -#if !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP - gc->regDataList[curTriSize + 0].i = GR_VERTEX_R_OFFSET << 2; - gc->regDataList[curTriSize + 1].i = GR_VERTEX_G_OFFSET << 2; - gc->regDataList[curTriSize + 2].i = GR_VERTEX_B_OFFSET << 2; - - gc->regDataList[curTriSize + 0].addr = (float*)&hw->RED; - gc->regDataList[curTriSize + 1].addr = (float*)&hw->GRN; - gc->regDataList[curTriSize + 2].addr = (float*)&hw->BLU; -#endif /* !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP */ - -#if GLIDE_PACKED_RGB - curTriSize += 1; - params += 1; - - packedRGB = FXTRUE; -#else /* !GLIDE_PACKED_RGB */ - curTriSize += 3; - params += 3; -#endif /* !GLIDE_PACKED_RGB */ - } - - if (i & STATE_REQUIRES_IT_ALPHA) { -#if GLIDE_HW_TRI_SETUP - gc->cmdTransportInfo.paramMask |= SST_SETUP_A; - gc->tsuDataList[curTriSize + 0] = GR_VERTEX_A_OFFSET << 2; -#endif /* GLIDE_HW_TRI_SETUP */ - -#if !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP - gc->regDataList[curTriSize + 0].i = GR_VERTEX_A_OFFSET << 2; - gc->regDataList[curTriSize + 0].addr = (float*)&hw->ALF; -#endif /* !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP */ - - curTriSize += 1; - -#if GLIDE_PACKED_RGB - { - /* Only increment the parameter packet size if we have not already - * added the rgb fields. - */ - if ((i & STATE_REQUIRES_IT_DRGB) == 0) params += 1; - packedRGB = FXTRUE; - } -#else /* !GLIDE_PACKED_RGB */ - params += 1; -#endif /* !GLIDE_PACKED_RGB */ - } - - if (i & STATE_REQUIRES_OOZ) { -#if GLIDE_HW_TRI_SETUP - gc->tsuDataList[curTriSize + 0] = GR_VERTEX_OOZ_OFFSET << 2; - gc->cmdTransportInfo.paramMask |= SST_SETUP_Z; -#endif /* GLIDE_HW_TRI_SETUP */ - -#if !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP - gc->regDataList[curTriSize + 0].i = GR_VERTEX_OOZ_OFFSET << 2; - gc->regDataList[curTriSize + 0].addr = (float*)&hw->Z; -#endif /* !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP */ - - curTriSize += 1; - params += 1; - } - - /* we squeeze FBI.OOW in here for sequential writes in the simple case */ - if (i & STATE_REQUIRES_OOW_FBI) { -#if GLIDE_HW_TRI_SETUP - gc->tsuDataList[curTriSize + 0] = GR_VERTEX_OOW_OFFSET << 2; - gc->cmdTransportInfo.paramMask |= SST_SETUP_Wfbi; -#endif /* GLIDE_HW_TRI_SETUP */ - -#if !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP - gc->regDataList[curTriSize + 0].i = GR_VERTEX_OOW_OFFSET << 2; - gc->regDataList[curTriSize + 0].addr = (float*)&hw->W; -#endif /* !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP */ - - curTriSize += 1; - params += 1; - } - -#if GLIDE_FP_CLAMP_TEX -#if !GLIDE_FP_CLAMP || !GLIDE_HW_TRI_SETUP -#error "Does not make sense to have GLIDE_FP_CLAMP_TEX w/o GLIDE_FP_CLAMP or GLIDE_HW_TRI_SETUP" -#endif /* !GLIDE_FP_CLAMP || !GLIDE_HW_TRI_SETUP */ - - /* Simplify the test for clamping only the texture parameters by - * sticking an extra empty slot into the data list. - * - * NB: This means that the code that runs through the parameter list - * needs to increment the datalist pointer before moving onto the - * texture parameters. - */ - gc->tsuDataList[curTriSize++] = 0; -#endif /* GLIDE_FP_CLAMP_TEX */ - - /* NOTE: this is the first */ - if (i & STATE_REQUIRES_W_TMU0) { -#if GLIDE_HW_TRI_SETUP - gc->tsuDataList[curTriSize + 0] = GR_VERTEX_OOW_TMU0_OFFSET << 2; - gc->cmdTransportInfo.paramMask |= SST_SETUP_W0; -#endif /* GLIDE_HW_TRI_SETUP */ - -#if !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP - gc->regDataList[curTriSize + 0].i = GR_VERTEX_OOW_TMU0_OFFSET << 2; - gc->regDataList[curTriSize + 0].addr = (float*)&tmu0->W; -#endif /* !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP */ - - curTriSize += 1; - params += 1; - } - - /* TMU0 --------------------------------- */ - /* always output to ALL chips, saves from having to change CHIP field */ - if (i & STATE_REQUIRES_ST_TMU0) { -#if GLIDE_HW_TRI_SETUP - gc->tsuDataList[curTriSize + 0] = GR_VERTEX_SOW_TMU0_OFFSET << 2; - gc->tsuDataList[curTriSize + 1] = GR_VERTEX_TOW_TMU0_OFFSET << 2; - gc->cmdTransportInfo.paramMask |= SST_SETUP_ST0; -#endif /* GLIDE_HW_TRI_SETUP */ - -#if !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP - gc->regDataList[curTriSize + 0].i = GR_VERTEX_SOW_TMU0_OFFSET << 2; - gc->regDataList[curTriSize + 1].i = GR_VERTEX_TOW_TMU0_OFFSET << 2; - gc->regDataList[curTriSize + 0].addr = (float*)&tmu0->S; - gc->regDataList[curTriSize + 1].addr = (float*)&tmu0->T; -#endif /* !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP */ - - curTriSize += 2; - params += 2; - } - - /* TMU1 --------------------------------- */ - if (i & STATE_REQUIRES_W_TMU1) { -#if GLIDE_HW_TRI_SETUP - gc->tsuDataList[curTriSize + 0] = GR_VERTEX_OOW_TMU1_OFFSET << 2; - gc->cmdTransportInfo.paramMask |= SST_SETUP_W1; -#endif /* GLIDE_HW_TRI_SETUP */ - -#if !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP - gc->regDataList[curTriSize + 0].i = GR_VERTEX_OOW_TMU1_OFFSET << 2; - gc->regDataList[curTriSize + 0].addr = (float*)&tmu1->W; -#endif /* !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP */ - - curTriSize += 1; - params += 1; - - } - - if (i & STATE_REQUIRES_ST_TMU1) { -#if GLIDE_HW_TRI_SETUP - gc->tsuDataList[curTriSize + 0] = GR_VERTEX_SOW_TMU1_OFFSET << 2; - gc->tsuDataList[curTriSize + 1] = GR_VERTEX_TOW_TMU1_OFFSET << 2; - gc->cmdTransportInfo.paramMask |= SST_SETUP_ST1; -#endif /* GLIDE_HW_TRI_SETUP */ - -#if !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP - gc->regDataList[curTriSize + 0].i = GR_VERTEX_SOW_TMU1_OFFSET << 2; - gc->regDataList[curTriSize + 0].addr = (float*)&tmu1->S; - gc->regDataList[curTriSize + 1].i = GR_VERTEX_TOW_TMU1_OFFSET << 2; - gc->regDataList[curTriSize + 1].addr = (float*)&tmu1->T; -#endif /* !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP */ - - curTriSize += 2; - params += 2; - } - -#if (GLIDE_NUM_TMU > 2) -#error "GLIDE_NUM_TMU > 2: Write this code." -#endif - -#if !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP - gc->regDataList[curTriSize].i = 0; /* terminate the list with 0,* */ -#endif /* !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP */ - -#if GLIDE_HW_TRI_SETUP - gc->tsuDataList[curTriSize] = 0; -#endif /* GLIDE_HW_TRI_SETUP */ - - curTriSize++; - -#if GLIDE_HW_TRI_SETUP - /* Per vertex size: (xy [required] + parameters) * param size (32 bit word) */ - _GlideRoot.curVertexSize = ((2 + params) << 2); - - /* Packet size: 3 * vertex size */ - _GlideRoot.curTriSize = (_GlideRoot.curVertexSize << 1) + _GlideRoot.curVertexSize; - - /* Shift the parameter mask to just write into the packet header. */ - GDBG_INFO(191, "CVG ParamMask: 0x%X\n", gc->cmdTransportInfo.paramMask); - gc->cmdTransportInfo.paramMask <<= SSTCP_PKT3_PMASK_SHIFT; - -#if GLIDE_PACKED_RGB - if (packedRGB) gc->cmdTransportInfo.paramMask |= SSTCP_PKT3_PACKEDCOLOR; -#endif /* GLIDE_PACKED_RGB */ - - /* Update common packet 3 headers */ - _grUpdateTriPacketHdr(gc->cmdTransportInfo.paramMask, gc->state.cull_mode); -#endif /* GLIDE_HW_TRI_SETUP */ - -#if !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP - gc->regDataList[curTriSize].i = 1; - gc->regDataList[curTriSize].addr = (float*)&hw->FtriangleCMD; - - /* 6 X,Y values plus AREA = 7, plus parameters */ - _GlideRoot.paramCount = params; - _GlideRoot.curTriSize = (6 + curTriSize + (params << 1)) << 2; - - /* Need to know tri size without gradients for planar polygons */ - _GlideRoot.curTriSizeNoGradient = _GlideRoot.curTriSize - (params << 3); -#endif /* !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP */ - -#if GLIDE_FP_CLAMP_TEX - /* Stick one more 0 in the dataList so that the texture clamping - * loop does not go one more iteration. - */ - gc->tsuDataList[++curTriSize] = 0; -#endif /* GLIDE_FP_CLAMP_TEX */ - -#ifdef GDBG_INFO_ON -#if GLIDE_HW_TRI_SETUP - for (i = 0; gc->tsuDataList[i]; i++) { - GDBG_INFO(282," tsuDataList[%d] = %2d [%s]\n", - i, gc->tsuDataList[i] >> 2, p_str[gc->tsuDataList[i] >> 2]); - } -#endif /* GLIDE_HW_TRI_SETUP */ - -#if !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP - for (i = 0; gc->regDataList[i].i; i++) { - GDBG_INFO(282," dataList[%d] = %2d 0x%x [%s]\n", - i, gc->regDataList[i].i >> 2, gc->regDataList[i].addr, - p_str[gc->regDataList[i].i >> 2]); - } -#endif /* !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP */ -#endif /* GDBG_INFO_ON */ - -#undef FN_NAME -} /* _grRebuildDataList */ - -#if GLIDE_MULTIPLATFORM -/* - _grInitializeGCFuncs - initialize the gcFuncs Structure for this - device. -*/ -GR_DDFUNC(_grInitializeGCFuncs, void, (GrGC *gc)) -{ - - gc->gcFuncs._grColorCombineDelta0Mode = (void *) - GR_DDNAME(_grColorCombineDelta0Mode); - gc->gcFuncs._grRebuildDataList = (void *) GR_DDNAME(_grRebuildDataList); - gc->gcFuncs._grTexDetailControl = (void *) GR_DDNAME(_grTexDetailControl); - gc->gcFuncs._grTexDownloadNccTable = (void *) - GR_DDNAME(_grTexDownloadNccTable); - gc->gcFuncs._grTexDownloadPalette = (void *) - GR_DDNAME(_grTexDownloadPalette); - gc->gcFuncs._gumpTexCombineFunction = (void *) - GR_DDNAME(_gumpTexCombineFunction); - gc->gcFuncs._grUpdateParamIndex = (void *) - GR_DDNAME(_grUpdateParamIndex); - gc->gcFuncs._trisetup = (void *) GR_DDNAME(_trisetup); - gc->gcFuncs._trisetup_nogradients = (void *) - GR_DDNAME(_trisetup_nogradients); - gc->gcFuncs.grAADrawLine = (void *) GR_DDNAME(grAADrawLine); - gc->gcFuncs.grAADrawPoint = (void *) GR_DDNAME(grAADrawPoint); - gc->gcFuncs.grAADrawPolygon = (void *) GR_DDNAME(grAADrawPolygon); - gc->gcFuncs.grAADrawPolygonVertexList = (void *) - GR_DDNAME(grAADrawPolygonVertexList); - gc->gcFuncs.grAADrawTriangle = (void *) GR_DDNAME(grAADrawTriangle); - gc->gcFuncs.grAlphaBlendFunction = (void *) - GR_DDNAME(grAlphaBlendFunction); - gc->gcFuncs.grAlphaCombine = (void *) GR_DDNAME(grAlphaCombine); - gc->gcFuncs.grAlphaControlsITRGBLighting = (void *) - GR_DDNAME(grAlphaControlsITRGBLighting); - gc->gcFuncs.grAlphaTestFunction = (void *) - GR_DDNAME(grAlphaTestFunction); - gc->gcFuncs.grAlphaTestReferenceValue = (void *) - GR_DDNAME(grAlphaTestReferenceValue); - gc->gcFuncs.grBufferClear = (void *) GR_DDNAME(grBufferClear); - gc->gcFuncs.grBufferNumPending = (void *) - GR_DDNAME(grBufferNumPending); - gc->gcFuncs.grBufferSwap = (void *) GR_DDNAME(grBufferSwap); - gc->gcFuncs.grChromakeyMode = (void *) GR_DDNAME(grChromakeyMode); - gc->gcFuncs.grChromakeyValue = (void *) GR_DDNAME(grChromakeyValue); - gc->gcFuncs.grClipWindow = (void *) GR_DDNAME(grClipWindow); - gc->gcFuncs.grColorCombine = (void *) GR_DDNAME(grColorCombine); - gc->gcFuncs.grColorMask = (void *) GR_DDNAME(grColorMask); - gc->gcFuncs.grConstantColorValue = (void *) - GR_DDNAME(grConstantColorValue); - gc->gcFuncs.grConstantColorValue4 = (void *) - GR_DDNAME(grConstantColorValue4); - gc->gcFuncs.grCullMode = (void *) GR_DDNAME(grCullMode); - gc->gcFuncs.grDepthBiasLevel = (void *) GR_DDNAME(grDepthBiasLevel); - gc->gcFuncs.grDepthBufferFunction = (void *) - GR_DDNAME(grDepthBufferFunction); - gc->gcFuncs.grDepthBufferMode = (void *) GR_DDNAME(grDepthBufferMode); - - gc->gcFuncs.grDepthMask = (void *) GR_DDNAME(grDepthMask); - gc->gcFuncs.grDisableAllEffects = (void *) - GR_DDNAME(grDisableAllEffects); - gc->gcFuncs.grDitherMode = (void *) GR_DDNAME(grDitherMode); - gc->gcFuncs.grDrawLine = (void *) GR_DDNAME(grDrawLine); - gc->gcFuncs.grDrawPlanarPolygon = (void *) - GR_DDNAME(grDrawPlanarPolygon); - gc->gcFuncs.grDrawPlanarPolygonVertexList = (void *) - GR_DDNAME(grDrawPlanarPolygonVertexList); - gc->gcFuncs.grDrawPoint = (void *) GR_DDNAME(grDrawPoint); - gc->gcFuncs.grDrawPolygon = (void *) GR_DDNAME(grDrawPolygon); - gc->gcFuncs.grDrawPolygonVertexList = (void *) - GR_DDNAME(grDrawPolygonVertexList); - gc->gcFuncs.grDrawTriangle = (void *) GR_DDNAME(grDrawTriangle); - gc->gcFuncs.grFogColorValue = (void *) GR_DDNAME(grFogColorValue); - gc->gcFuncs.grFogMode = (void *) GR_DDNAME(grFogMode); - gc->gcFuncs.grFogTable = (void *) GR_DDNAME(grFogTable); - gc->gcFuncs.grGammaCorrectionValue = (void *) - GR_DDNAME(grGammaCorrectionValue); - gc->gcFuncs.grGlideSetState = (void *) GR_DDNAME(grGlideSetState); - gc->gcFuncs.grGlideShutdown = (void *) GR_DDNAME(grGlideShutdown); - gc->gcFuncs.grLfbConstantAlpha = (void *) - GR_DDNAME(grLfbConstantAlpha); - gc->gcFuncs.grLfbConstantDepth = (void *) - GR_DDNAME(grLfbConstantDepth); - gc->gcFuncs.grLfbLock = (void *)GR_DDNAME(grLfbLock); - gc->gcFuncs.grLfbUnlock = (void*)GR_DDNAME(grLfbUnlock); - gc->gcFuncs.grLfbWriteColorFormat = (void *) - GR_DDNAME(grLfbWriteColorFormat); - gc->gcFuncs.grLfbWriteColorSwizzle = (void *) - GR_DDNAME(grLfbWriteColorSwizzle); - gc->gcFuncs.grRenderBuffer = (void *) GR_DDNAME(grRenderBuffer); - gc->gcFuncs.grSstConfigPipeline = (void *) - GR_DDNAME(grSstConfigPipeline); - gc->gcFuncs.grSstIdle = (void *) GR_DDNAME(grSstIdle); - gc->gcFuncs.grSstIsBusy = (void *) GR_DDNAME(grSstIsBusy); - gc->gcFuncs.grSstOpen = (void *) GR_DDNAME(grSstOpen); - gc->gcFuncs.grSstOrigin = (void *) GR_DDNAME(grSstOrigin); - gc->gcFuncs.grSstPassthruMode = (void *) GR_DDNAME(grSstPassthruMode); - - gc->gcFuncs.grSstPerfStats = (void *) GR_DDNAME(grSstPerfStats); - gc->gcFuncs.grSstResetPerfStats = (void *) GR_DDNAME(grSstResetPerfStats); - gc->gcFuncs.grSstStatus = (void *) GR_DDNAME(grSstStatus); - gc->gcFuncs.grSstVRetraceOn = (void *) GR_DDNAME(grSstVRetraceOn); - gc->gcFuncs.grSstVideoLine = (void *) GR_DDNAME(grSstVideoLine); - gc->gcFuncs.grTexClampMode = (void *) GR_DDNAME(grTexClampMode); - gc->gcFuncs.grTexCombine = (void *) GR_DDNAME(grTexCombine); - gc->gcFuncs.grTexDownloadMipMapLevelPartial = (void *) - GR_DDNAME(grTexDownloadMipMapLevelPartial); - gc->gcFuncs.grTexFilterMode = (void *) GR_DDNAME(grTexFilterMode); - gc->gcFuncs.grTexLodBiasValue = (void *) GR_DDNAME(grTexLodBiasValue); - gc->gcFuncs.grTexMipMapMode = (void *) GR_DDNAME(grTexMipMapMode); - gc->gcFuncs.grTexMultibase = (void *) GR_DDNAME(grTexMultibase); - gc->gcFuncs.grTexMultibaseAddress = (void *) - GR_DDNAME(grTexMultibaseAddress); - gc->gcFuncs.grTexNCCTable = (void *) GR_DDNAME(grTexNCCTable); - gc->gcFuncs.grTexSource = (void *) GR_DDNAME(grTexSource); - gc->gcFuncs.guMPDrawTriangle = (void *) GR_DDNAME(guMPDrawTriangle); - gc->gcFuncs.guTexSource = (void *) GR_DDNAME(guTexSource); - gc->gcFuncs.ConvertAndDownloadRle=(void *) GR_DDNAME(ConvertAndDownloadRle); - gc->gcFuncs.grCheckForRoom=(void *) GR_DDNAME(grCheckForRoom); -} /* _grInitializeGCFuncs */ -#endif diff --git a/glide2x/cvg/glide/src/glfb.c b/glide2x/cvg/glide/src/glfb.c deleted file mode 100644 index 7d560ac..0000000 --- a/glide2x/cvg/glide/src/glfb.c +++ /dev/null @@ -1,1124 +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. -** -** -** 75 6/23/98 5:38p Peter -** lfb hinting -** -** 74 4/29/98 2:49p Peter -** fixed debug build -** -** 73 4/16/98 3:54p Peter -** removed cruft -** -** 72 4/01/98 1:51p Peter -** sli origin thing vs grRenderBuffer -** -** 71 3/31/98 6:09p Peter -** sli origin everywhere (I think) and grLfbReadRegion/grRenderBuffer vs -** triple buffering -** -** 70 3/29/98 1:07p Peter -** yet another sli origin thing -** -** 69 3/23/98 5:57p Peter -** warning cleanup -** -** 68 3/18/98 3:04p Peter -** cleaner origin swapping hacks -** -** 67 3/13/98 1:56p Peter -** more sli origin swapping -** -** 66 3/13/98 1:27p Peter -** grLfbReadRegion vs triple buffering -** -** 65 3/09/98 2:24p Peter -** change for new pci passthrough interface -** -** 63 3/02/98 7:23p Peter -** clear slop on sli systems when changing y origin -** -** 62 2/20/98 11:00a Peter -** removed glide3 from glid2 tree -** -** 61 2/11/98 5:26p Peter -** new write edge stuff -** -** 60 2/01/98 7:52p Peter -** grLfbWriteRegion byte count problems -** -** 59 1/30/98 4:31p Peter -** general clenaup - * - * 58 1/16/98 4:18p Atai - * fixed lfb and grLoadGammaTable - * - * 57 1/06/98 3:53p Atai - * remove grHint, modify grLfbWriteRegion and grGet - * - * 56 12/17/97 4:45p Peter - * groundwork for CrybabyGlide - * - * 55 12/15/97 6:04p Atai - * disable obsolete glide2 api for glide3 - * - * 54 12/15/97 5:54p Peter - * swizzle reads too - * - * 53 12/11/97 4:15p Peter - * mac lfb write region - * - * 52 12/01/97 5:18p Peter - * - * 51 11/25/97 12:09p Peter - * nested calls to grLfbLock vs init code locking on v2 - * - * 50 11/18/97 4:36p Peter - * chipfield stuff cleanup and w/ direct writes - * - * 49 11/17/97 4:55p Peter - * watcom warnings/chipfield stuff - * - * 48 11/06/97 3:38p Dow - * More banshee stuff - * - * 47 11/04/97 5:04p Peter - * cataclysm part deux - * - * 46 11/03/97 3:43p Peter - * h3/cvg cataclysm - * - * 45 10/27/97 11:10a Peter - * starting cleanup - * - * 44 10/09/97 8:02p Dow - * State Monster 1st Cut - * - * 43 10/08/97 5:18p Peter - * fixed grLfbLock wrt writemode_any - * - * 42 10/08/97 11:33a Peter - * hmmmm.... - * - * 41 9/30/97 1:03p Peter - * more debugging code - * - * 40 9/25/97 1:35p Peter - * - * 39 9/24/97 4:09p Peter - * lfb/idle fixes - * - * 38 9/24/97 1:31p Peter - * assert if grXX call inside lock/unlock - * - * 37 9/20/97 10:54a Peter - * naked lfb writes - * - * 36 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 - * - * 35 9/10/97 10:13p Peter - * fifo logic from GaryT, non-normalized fp first cut - * -** -*/ - -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -/*--------------------------------------------------------------------------- -** grLfbConstantAlpha -*/ -GR_ENTRY(grLfbConstantAlpha, void, (GrAlpha_t alpha)) -{ - GR_BEGIN_NOFIFOCHECK("grLfbConstantAlpha",82); - GDBG_INFO_MORE(gc->myLevel,"(0x%x)\n",alpha); - - gc->state.lfb_constant_alpha = alpha; - GR_END(); -} /* grLfbConstantAlpha */ - -/*--------------------------------------------------------------------------- -** grLfbConstantDepth -*/ -GR_ENTRY(grLfbConstantDepth, void, (FxU16 depth)) -{ - GR_BEGIN_NOFIFOCHECK("grLfbConstantDepth",82); - GDBG_INFO_MORE(gc->myLevel,"(0x%x)\n",depth); - - gc->state.lfb_constant_depth = depth; - GR_END(); -} /* grLfbConstantDepth */ - - -/*------------------------------------------------------------------- - Function: grLfbLock - Date: 2/19 - Implementor(s): jdt - Library: Glide - Description: - Secures a pointer to a requested frame buffer and guarantees ordered - access to that buffer. - - Arguments: - type - type of lock, one of: - GR_LOCK_WRITE_ONLY - GR_LOCK_READ_ONLY - buffer - which buffer to lock, one of: - GR_BUFFER_FRONTBUFFER - GR_BUFFER_BACKBUFFER - GR_BUFFER_AUXBUFFER - writeMode - desired destination color format - origin - desired lfb origin - pixelPipeline - flag whether to process through pixpipe - info - pointer to info structure - Return: - FXTRUE - lock is successful - FXFALSE - lock fails - -------------------------------------------------------------------*/ - -GR_ENTRY(grLfbLock, FxBool,(GrLock_t type, GrBuffer_t buffer, - GrLfbWriteMode_t writeMode, GrOriginLocation_t origin, - FxBool pixelPipeline, GrLfbInfo_t *info)) -{ -#define FN_NAME "grLfbLock" - FxBool rv = FXTRUE; - FxU32 lfbMode = 0, zaColor = 0, fbzMode = 0; - const FxBool idleLockP = ((type & GR_LFB_NOIDLE) == 0); -#if (GLIDE_PLATFORM & GLIDE_OS_MACOS) && SET_BSWAP - FxBool swizzleByteP = FXFALSE; -#endif /* (GLIDE_PLATFORM & GLIDE_OS_MACOS) && SET_BSWAP */ - - GR_BEGIN_NOFIFOCHECK("grLfbLock", 87); - GDBG_INFO_MORE(gc->myLevel,"(%d, %d, %d, %d, %d)\n", - type, buffer, writeMode, origin, pixelPipeline); - - GR_CHECK_COMPATABILITY(FN_NAME, !info, - "Null info structure passed."); - /* there is only one revision extant */ - GR_CHECK_COMPATABILITY(FN_NAME, info->size != sizeof(GrLfbInfo_t), - "uninitialized info structure passed."); - - type = type & ~(GR_LFB_NOIDLE); - switch(type) { - case GR_LFB_READ_ONLY: - { - if (gc->lockPtrs[type] != (FxU32)-1) { - GDBG_INFO(83, "Read lock failure due to existing lock"); - rv = FXFALSE; - } else { - lfbMode = gc->state.fbi_config.lfbMode; - lfbMode &= ~(SST_LFB_READBUFSELECT | - SST_LFB_YORIGIN); - - switch(buffer) { - case GR_BUFFER_FRONTBUFFER: - lfbMode |= SST_LFB_READFRONTBUFFER; - break; - - case GR_BUFFER_BACKBUFFER: - lfbMode |= SST_LFB_READBACKBUFFER; - break; - - case GR_BUFFER_AUXBUFFER: - lfbMode |= SST_LFB_READAUXBUFFER; - break; - - default: - GR_CHECK_F(myName, - 1, - "illegal buffer parameter passed"); - rv = FXFALSE; - break; - } - - lfbMode |= (origin ? SST_LFB_YORIGIN : 0); - gc->state.fbi_config.lfbMode = lfbMode; - -#if (GLIDE_PLATFORM & GLIDE_OS_MACOS) && SET_BSWAP - if (!gc->cmdTransportInfo.fifoLfbP) lfbMode |= (SST_LFB_READ_SWAP16 | - SST_LFB_READ_BYTESWAP); -#endif /* (GLIDE_PLATFORM & GLIDE_OS_MACOS) */ - - info->strideInBytes = gc->fbStride * 2; - info->origin = origin; - info->lfbPtr = gc->lfb_ptr; - } - } - break; - - case GR_LFB_WRITE_ONLY: - { - if (gc->lockPtrs[type] != (FxU32)-1) { - GDBG_INFO(83, "Write failure due to existing lock"); - rv = FXFALSE; - } else { - /* Set up the constant depth register because it may have - * been trashed by a call to grDepthBiasLevel - * (depthbiaslevel and constant depth use the same register) - */ - zaColor = gc->state.fbi_config.zaColor; - zaColor = (((FxU32) gc->state.lfb_constant_depth) << SST_ZACOLOR_DEPTH_SHIFT); - zaColor |= (gc->state.lfb_constant_alpha << SST_ZACOLOR_ALPHA_SHIFT); - - /* disable depth biasing */ - fbzMode = gc->state.fbi_config.fbzMode; - fbzMode &= ~(SST_ENZBIAS); - - lfbMode = gc->state.fbi_config.lfbMode; - lfbMode &= ~(SST_LFB_WRITEBUFSELECT | - SST_LFB_YORIGIN | - SST_LFB_FORMAT | - SST_LFB_ENPIXPIPE); - - switch(writeMode) { - case GR_LFBWRITEMODE_RESERVED1: - case GR_LFBWRITEMODE_RESERVED2: - case GR_LFBWRITEMODE_RESERVED3: - case GR_LFBWRITEMODE_RESERVED4: - case GR_LFBWRITEMODE_RESERVED5: - case GR_LFBWRITEMODE_RESERVED6: - case GR_LFBWRITEMODE_RESERVED7: - rv = FXFALSE; - } - - /* Default to hw */ - if (writeMode == GR_LFBWRITEMODE_ANY) { - writeMode = ((buffer == GR_BUFFER_AUXBUFFER) - ? GR_LFBWRITEMODE_ZA16 - : GR_LFBWRITEMODE_565); - } - - switch(buffer) { - case GR_BUFFER_FRONTBUFFER: - if (writeMode == GR_LFBWRITEMODE_ZA16) { - rv = FXFALSE; - } - lfbMode |= SST_LFB_WRITEFRONTBUFFER; - break; - - case GR_BUFFER_BACKBUFFER: - if (writeMode == GR_LFBWRITEMODE_ZA16) { - rv = FXFALSE; - } - lfbMode |= SST_LFB_WRITEBACKBUFFER; - break; - - case GR_BUFFER_AUXBUFFER: - if (writeMode != GR_LFBWRITEMODE_ZA16) { - rv = FXFALSE; - } - lfbMode |= SST_LFB_WRITEFRONTBUFFER; - break; - - default: - GR_CHECK_F(myName, 1, "illegal buffer parameter passed"); - break; - } - - lfbMode |= (writeMode << SST_LFB_FORMAT_SHIFT); - lfbMode |= (origin ? SST_LFB_YORIGIN : 0); - - if (pixelPipeline) { - lfbMode |= SST_LFB_ENPIXPIPE; - - fbzMode &= ~SST_YORIGIN; - fbzMode |= (origin ? SST_YORIGIN : 0); - } - gc->state.fbi_config.lfbMode = lfbMode; - - info->origin = origin; - info->writeMode = writeMode; - -#if (GLIDE_PLATFORM & GLIDE_OS_MACOS) && SET_BSWAP - /* Turn on word swizzling by default. - * - * NB: This state does not get shadowed because it is only - * relevant if the app is doing its own lfb writes. When coming - * through grLfbWriteRegion we take care of doing this when - * putting the data in the fifo so the actual rendering state - * in lfbMode is all we care about. - */ - if (!gc->cmdTransportInfo.fifoLfbP) lfbMode |= SST_LFB_WRITE_SWAP16; -#endif /* (GLIDE_PLATFORM & GLIDE_OS_MACOS) */ - - switch(lfbMode & SST_LFB_FORMAT) { - case SST_LFB_565: - case SST_LFB_555: - case SST_LFB_1555: - case SST_LFB_ZZ: - info->strideInBytes = gc->fbStride << 1; - -#if (GLIDE_PLATFORM & GLIDE_OS_MACOS) && SET_BSWAP - if (!gc->cmdTransportInfo.fifoLfbP) lfbMode |= SST_LFB_WRITE_BYTESWAP; -#endif /* (GLIDE_PLATFORM & GLIDE_OS_MACOS) */ - break; - - case SST_LFB_888: - case SST_LFB_8888: - case SST_LFB_Z565: - case SST_LFB_Z555: - case SST_LFB_Z1555: - info->strideInBytes = gc->fbStride << 2; - break; - } - - info->lfbPtr = gc->lfb_ptr; - } - } - break; - default: - rv = FXFALSE; - GDBG_INFO(gc->myLevel, "Lock failed because of invalid lock type."); - break; - } - - if (rv) { - const FxU32 lfbLockCount = gc->cmdTransportInfo.lfbLockCount; - - gc->lockPtrs[type] = buffer; - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) && !GLIDE_INIT_HAL - /* If the cmd fifo has been turned off before then make sure its - * on again before trying to dork w/ the modes etc. - */ - if (lfbLockCount > 0) { - GR_ASSERT(!gc->cmdTransportInfo.fifoLfbP); - - /* Hack to allow the register writes below to be happy. - * - * NB: This *MUST* come before the unlock call since that - * is going to write a nopCmd via the init code callback. - */ - gc->cmdTransportInfo.lfbLockCount = 0; - -#if GLIDE_DEBUG || GLIDE_CHECK_COMPATABILITY - grHints(GR_HINT_LFB_RESET, 0UL); -#endif /* GLIDE_DEBUG || GLIDE_CHECK_COMPATABILITY */ - - sst1InitLfbUnlock((FxU32*)hw); - } -#endif /* (GLIDE_PLATFORM & GLIDE_HW_CVG) && !GLIDE_INIT_HAL */ - - /* Setup the hw w/ the settings computed above. */ - switch(type) { - case GR_LFB_READ_ONLY: - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, lfbMode, lfbMode); - GR_CHECK_SIZE(); - break; - - case GR_LFB_WRITE_ONLY: - REG_GROUP_BEGIN(BROADCAST_ID, fbzMode, 3, 0x103); - { - REG_GROUP_SET(hw, fbzMode, fbzMode); - REG_GROUP_SET(hw, lfbMode, lfbMode); - REG_GROUP_SET(hw, zaColor, zaColor); - } - REG_GROUP_END(); - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) - /* Sli has an 'interesting' feature where the physical scanlines - * that are being rendered is dependent on the location of the y - * origin. We always clear the overlap bit to black here so that - * no one ever notices. This needs to be done for all of the allocated - * color buffers that could have possibly have been rendered to since - * the last origin swap. Rather than beeing really tricky I just do - * it for every allocated color buffer. - * - * Origin_Lower_Left: 0:Black [1 .. screenRezY]:Rendered screenRez+1:Black - * Origin_Upper_Left: [0 .. screenRezY - 1]:Rendered [screenRez-screenRez+1]:Black - */ - if (gc->scanline_interleaved) gc->hwDep.cvgDep.sliOriginBufCount = gc->grColBuf; -#endif /* (GLIDE_PLATFORM & GLIDE_HW_CVG) */ - break; - } - - if (!gc->cmdTransportInfo.fifoLfbP && idleLockP) { - /* This is required to flush the write buffers before the - * actual LFB accesses. - */ - P6FENCE; - - /* Must idle to get things in the right order. */ - grSstIdle(); - } - - /* If we're not coming through grLfbWriteRegion then we need to - * temporarily turn off the command fifo so that the accesses are - * processed correctly by the hw. - */ - if (!gc->cmdTransportInfo.fifoLfbP) { -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) && !GLIDE_INIT_HAL - sst1InitLfbLock((FxU32*)hw); - -#if GLIDE_DEBUG || GLIDE_CHECK_COMPATABILITY - grHints(GR_HINT_LFB_PROTECT, info->strideInBytes); -#endif /* GLIDE_DEBUG || GLIDE_CHECK_COMPATABILITY */ -#endif /* (GLIDE_PLATFORM & GLIDE_HW_CVG) && !GLIDE_INIT_HAL */ - - /* Increment lock count */ - gc->cmdTransportInfo.lfbLockCount = lfbLockCount + 1; - } - } - - GR_RETURN(rv); -#undef FN_NAME -} /* grLfbLock */ - -/*------------------------------------------------------------------- - Function: grLfbUnlock - Date: 2/21 - Implementor(s): jdt - Library: Glide - Description: - Unlock a previously locked buffer - Arguments: - type - type of lock (read only/write only) - buffer - which buffer to unlock - Return: - FXTRUE - success - FXFALSE - failure - -------------------------------------------------------------------*/ - -GR_ENTRY(grLfbUnlock, FxBool, (GrLock_t type, GrBuffer_t buffer)) -{ -#define FN_NAME "grLfbUnlock" - FxBool rval = FXFALSE; - - GR_BEGIN_NOFIFOCHECK("grLfbUnLock", 87); - GDBG_INFO_MORE(gc->myLevel,"(%d, %d)\n", type, buffer); - - type = type & ~(GR_LFB_NOIDLE); - - GR_CHECK_COMPATABILITY(FN_NAME, - type != GR_LFB_WRITE_ONLY && - type != GR_LFB_READ_ONLY, - "Bad type"); - - GR_CHECK_COMPATABILITY(FN_NAME, - buffer != GR_BUFFER_FRONTBUFFER && - buffer != GR_BUFFER_BACKBUFFER && - buffer != GR_BUFFER_AUXBUFFER, - "Bad buffer"); - -#if ((GLIDE_PLATFORM & GLIDE_HW_SST1) || (GLIDE_PLATFORM & GLIDE_HW_CVG)) - if (gc->lockPtrs[type] == (FxU32)buffer) { - rval = FXTRUE; - gc->lockPtrs[type] = (FxU32)-1; - - /* Is this a direct lfb access? */ - if (!gc->cmdTransportInfo.fifoLfbP) { - /* Flush the write buffers */ - if (type != GR_LFB_READ_ONLY) P6FENCE; - - /* If there are no more outstanding lfb locks, then turn the - * fifo back on before we do anything else otherwise just - * return w/ the new lock count. - */ - gc->cmdTransportInfo.lfbLockCount--; - if (gc->cmdTransportInfo.lfbLockCount == 0) { -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) && !GLIDE_INIT_HAL -#if GLIDE_DEBUG || GLIDE_CHECK_COMPATABILITY - grHints(GR_HINT_LFB_PROTECT, 0UL); -#endif /* GLIDE_DEBUG || GLIDE_CHECK_COMPATABILITY */ - - sst1InitLfbUnlock((FxU32*)hw); -#endif /* (GLIDE_PLATFORM & GLIDE_HW_CVG) && !GLIDE_INIT_HAL */ - } else { - return FXTRUE; - } - } - - GR_SET_EXPECTED_SIZE(8 + MaskSelect(gc->scanline_interleaved, sizeof(FxU32)), - 2 + gc->scanline_interleaved); - { - /* Restore depth bias level */ - GR_SET(BROADCAST_ID, hw, zaColor, gc->state.fbi_config.zaColor); - - /* turn back on depth biasing */ - GR_SET(BROADCAST_ID, hw, fbzMode, gc->state.fbi_config.fbzMode); - - if (gc->scanline_interleaved) GR_SET(BROADCAST_ID, hw, nopCMD, 0x0); - } - GR_CHECK_SIZE(); - } else { - GDBG_INFO(gc->myLevel, "Unlock failed because there was no matching lock"); - rval = FXFALSE; - } -#endif - - GR_RETURN(rval); -#undef FN_NAME -} /* grLfbUnlock */ - - -/*--------------------------------------------------------------------------- -** grLfbWriteColorFormat -** -*/ - -GR_STATE_ENTRY(grLfbWriteColorFormat, void, (GrColorFormat_t colorFormat)) -{ -#define FN_NAME "grLfbWriteColorFormat" - FxU32 lfbMode; - - GR_BEGIN_NOFIFOCHECK("grLfbWriteColorFormat",82); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",colorFormat); - - GR_CHECK_F(myName, - colorFormat < 0 || colorFormat > 0x3, - "invalid color format"); - - lfbMode = gc->state.fbi_config.lfbMode; - lfbMode &= ~SST_LFB_RGBALANES; - lfbMode |= (colorFormat << SST_LFB_RGBALANES_SHIFT); - - { - const FxBool sliP = gc->scanline_interleaved; - - GR_SET_EXPECTED_SIZE(sizeof(FxU32) + MaskSelect(sliP, sizeof(FxU32)), - 1 + sliP); - { - GR_SET(BROADCAST_ID, hw, lfbMode, lfbMode); - gc->state.fbi_config.lfbMode = lfbMode; - - if (sliP) GR_SET(BROADCAST_ID, hw, nopCMD, 0x0); - } - GR_CHECK_SIZE(); - } - - GR_END(); -#undef FN_NAME -} /* grLfbWriteColorFormat */ - - -/*--------------------------------------------------------------------------- -** grLfbWriteColorSwizzle - set up SST for byte swizzling and word swapping -** -** Registers/Bits Affected: -** lfbMode: bit(11), bit(12) -** -** WARNING: GMT: SST_LFB_WRITE_SWAP16 changes pixel addressing!!! -*/ -GR_STATE_ENTRY(grLfbWriteColorSwizzle, void, (FxBool swizzleBytes, FxBool swapWords)) -{ -#define FN_NAME "grLfbWriteColorSwizzle" - FxU32 lfbMode; - - GR_BEGIN_NOFIFOCHECK("grLfbWriteColorSwizzle",82); - GDBG_INFO_MORE(gc->myLevel,"(%d,%d)\n",swizzleBytes,swapWords); - - /* Clear out the bits we'll set back if appropriate */ - lfbMode = gc->state.fbi_config.lfbMode; - lfbMode &= ~(SST_LFB_WRITE_SWAP16 | SST_LFB_WRITE_BYTESWAP); - - if (swizzleBytes) - lfbMode |= SST_LFB_WRITE_BYTESWAP; - - if (swapWords) - lfbMode |= SST_LFB_WRITE_SWAP16; - - { - const FxBool sliP = gc->scanline_interleaved; - - GR_SET_EXPECTED_SIZE(sizeof(FxU32) + MaskSelect(sliP, sizeof(FxU32)), - 1 + sliP); - { - GR_SET(BROADCAST_ID, hw, lfbMode, lfbMode); - gc->state.fbi_config.lfbMode = lfbMode; - - if (sliP) GR_SET(BROADCAST_ID, hw, nopCMD, 0x0); - } - GR_CHECK_SIZE(); - } - - GR_END(); -#undef FN_NAME -} /* grLfbWriteColorSwizzle */ - -FxBool -_grLfbWriteRegion(FxBool pixPipelineP, - GrBuffer_t dst_buffer, FxU32 dst_x, FxU32 dst_y, - GrLfbSrcFmt_t src_format, - FxU32 src_width, FxU32 src_height, - FxI32 src_stride, void *src_data) -{ -#define FN_NAME "_grLfbWriteRegion" - FxBool rv = FXTRUE; - GrLfbInfo_t info; - GrLfbWriteMode_t writeMode; - - GR_BEGIN_NOFIFOCHECK("_grLfbWriteRegion", 82); - GDBG_INFO_MORE(gc->myLevel, - "(0x%x, %s, %d, %d, %d, %d, %d, %d, 0x%x)\n", - dst_buffer, - (pixPipelineP ? "Enable" : "Disable"), - dst_x, dst_y, - src_format, src_width, src_height, - src_stride, src_data); - - if (src_format == GR_LFB_SRC_FMT_RLE16) - writeMode = GR_LFBWRITEMODE_565; - else - writeMode = src_format; - - gc->cmdTransportInfo.fifoLfbP = FXTRUE; - info.size = sizeof(info); - - if (grLfbLock(GR_LFB_WRITE_ONLY | GR_LFB_NOIDLE, - dst_buffer, - writeMode, - GR_ORIGIN_UPPER_LEFT, - pixPipelineP, - &info)) { - FxU32 *srcData; /* Tracking Source Pointer */ - FxU32 *dstData; /* Tracking Destination Pointer */ - FxU32 *end; /* Demarks End of each Scanline */ - FxI32 srcJump; /* bytes to next scanline */ - FxU32 dstJump; /* bytes to next scanline */ - FxU32 length; /* bytes to copy in scanline */ - FxU32 scanline; /* scanline number */ - int aligned; /* word aligned? */ - - /* When writing to the fifo we give an offset from the - * start of the lfb so we don't need to add it in here. - */ -#if USE_PACKET_FIFO - dstData = (FxU32*)(dst_y * info.strideInBytes); -#else - dstData = (FxU32*)(((FxU8*)info.lfbPtr) + (dst_y * info.strideInBytes)); -#endif - - srcData = (FxU32*)src_data; - scanline = src_height; - - switch(src_format) { - /* 16-bit aligned */ - case GR_LFB_SRC_FMT_565: - case GR_LFB_SRC_FMT_555: - case GR_LFB_SRC_FMT_1555: - case GR_LFB_SRC_FMT_ZA16: - dstData = (FxU32*)(((FxU16*)dstData) + dst_x); - length = src_width * 2; - aligned = !((int)dstData & 0x2); - srcJump = src_stride - length; - dstJump = info.strideInBytes - length; - - if (aligned) { - while(scanline--) { - GR_ASSERT(((FxU32)dstData & 0x03UL) == 0); - end = (FxU32*)((char*)srcData + length - 2); - - if (srcData < end) { - LINEAR_WRITE_BEGIN(length >> 2, kLinearWriteLFB, dstData, 0x00, 0x00); - while(srcData < end) { - LINEAR_WRITE_SET_16((FxU32)dstData, srcData[0]); - dstData++; - srcData++; - } - LINEAR_WRITE_END(); - } - - if ((length & 0x3) != 0x00) { - LINEAR_WRITE_EDGE(kLinearWriteLFB, dstData, *(FxU16*)srcData, sizeof(FxU16)); - dstData = (FxU32*)(((FxU16*)dstData) + 1); - srcData = (FxU32*)(((FxU16*)srcData) + 1); - } - - dstData = (FxU32*)(((char*)dstData) + dstJump); - srcData = (FxU32*)(((char*)srcData) + srcJump); - } - } else { - while(scanline--) { - GR_ASSERT(((FxU32)dstData & 0x03UL) != 0); - end = (FxU32*)((char*)srcData + length); - - LINEAR_WRITE_EDGE(kLinearWriteLFB, dstData, - *(FxU16*)srcData, sizeof(FxU16)); - dstData = (FxU32*)(((FxU16*)dstData) + 1); - srcData = (FxU32*)(((FxU16*)srcData) + 1); - - if (srcData < end) { - const FxU32 numWords = (((FxU32)end - (FxU32)srcData) >> 2); - FxU32 i; - - LINEAR_WRITE_BEGIN(numWords, kLinearWriteLFB, dstData, 0x00, 0x00); - for(i = 0; i < numWords; i++) { - LINEAR_WRITE_SET_16((FxU32)dstData, srcData[0]); - dstData++; - srcData++; - } - LINEAR_WRITE_END(); - } - - if ((length & 0x03) == 0) { - LINEAR_WRITE_EDGE(kLinearWriteLFB, dstData, - *(FxU16*)srcData, sizeof(FxU16)); - dstData = (FxU32*)(((FxU16*)dstData) + 1); - srcData = (FxU32*)(((FxU16*)srcData) + 1); - } - - dstData = (FxU32*)(((char*)dstData) + dstJump); - srcData = (FxU32*)(((char*)srcData) + srcJump); - } - } - break; - - /* 32-bit aligned */ - case GR_LFB_SRC_FMT_888: - case GR_LFB_SRC_FMT_8888: - case GR_LFB_SRC_FMT_565_DEPTH: - case GR_LFB_SRC_FMT_555_DEPTH: - case GR_LFB_SRC_FMT_1555_DEPTH: - dstData = ((FxU32*)dstData) + dst_x; - length = src_width * 4; - srcJump = src_stride - length; - dstJump = info.strideInBytes - length; - while(scanline--) { - end = (FxU32*)((char*)srcData + length); - - LINEAR_WRITE_BEGIN(src_width, - kLinearWriteLFB, - (FxU32)dstData, - 0x00, 0x00); - while(srcData < end) { - LINEAR_WRITE_SET((FxU32)dstData, srcData[0]); - dstData++; - srcData++; - } - LINEAR_WRITE_END(); - - dstData = (FxU32*)(((char*)dstData)+dstJump); - srcData = (FxU32*)(((char*)srcData)+srcJump); - } - break; - case GR_LFB_SRC_FMT_RLE16: - /* needs to be implemented */ - rv = FXFALSE; - break; - } - grLfbUnlock(GR_LFB_WRITE_ONLY, dst_buffer); - } else { - rv = FXFALSE; - } - gc->cmdTransportInfo.fifoLfbP = FXFALSE; - GR_RETURN(rv); -#undef FN_NAME -} /* grLfbWriteRegion */ - -/*------------------------------------------------------------------- - Function: grLfbWriteRegion - Date: 3/5 - Implementor(s): jdt - Library: Glide - Description: - Write a pixel rectangle to the frame buffer as efficiently as possible - Arguments: - dst_buffer - buffer to which to copy data - dst_x,dst_y - destination image start coordinates - src_format - data format of source image - src_width, src_height - - dimensions of source image - src_stride - stride of source image in bytes, not meaningful - for RLE images - src_data - pointer to source data memory - Return: - FXTRUE succeed - FXFALSE fail - -------------------------------------------------------------------*/ -GR_ENTRY(grLfbWriteRegion, FxBool, (GrBuffer_t dst_buffer, - FxU32 dst_x, FxU32 dst_y, - GrLfbSrcFmt_t src_format, - FxU32 src_width, FxU32 src_height, - FxI32 src_stride, void *src_data)) -{ - FxBool rv = FXTRUE; - - GR_BEGIN_NOFIFOCHECK("grLfbWriteRegion",82); - GDBG_INFO_MORE(gc->myLevel, - "(0x%x,%d,%d,%d,%d,%d,%d,0x%x)\n", - dst_buffer, dst_x, dst_y, - src_format, src_width, src_height, - src_stride, src_data); - - rv = _grLfbWriteRegion(FXFALSE, dst_buffer, dst_x, dst_y, - src_format, src_width, src_height, - src_stride, src_data); - - GR_RETURN(rv); -} /* grLfbWriteRegion */ - -/*------------------------------------------------------------------- - Function: grLfbReadRegion - Date: 3/12 - Implementor(s): jdt - Library: Glide - Description: - Grab a rectangle from the frame buffer into user supplied memory - Arguments: - src_buffer - buffer to read from - src_x - x coordinate of upper left corner rectangle to read - src_y - y coordinate of upper left corner of rectangle to read - src_width - width of rectangle to read - src_height - height of rectangle to read - dst_stride - distance between scanlines in destination buffer - dst_data - pointer to user memory in which to place image - Return: - FXTRUE - success - FXFALSE - failure - -------------------------------------------------------------------*/ -GR_ENTRY(grLfbReadRegion, FxBool, (GrBuffer_t src_buffer, - FxU32 src_x, FxU32 src_y, - FxU32 src_width, FxU32 src_height, - FxU32 dst_stride, void *dst_data)) -{ -#define FN_NAME "grLfbReadRegion" - FxBool rv = FXTRUE; - GrLfbInfo_t info; - - GR_BEGIN_NOFIFOCHECK("grLfbReadRegion", 82); - GDBG_INFO_MORE(gc->myLevel, - "(0x%x,%d,%d,%d,%d,%d,0x%x)\n", - src_buffer, src_x, src_y, - src_width, src_height, dst_stride, dst_data); - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) -#define kTileSize (32 * sizeof(FxU16)) -#define kTileMask (kTileSize - 1) -#define kPageMask ((kTileSize << 1) - 1) - - { - const FxBool swapP = ((gc->grColBuf >= 3) && - (((src_buffer == GR_BUFFER_BACKBUFFER) && (gc->hwDep.cvgDep.backBuf == 2)) || - ((src_buffer == GR_BUFFER_FRONTBUFFER) && (gc->hwDep.cvgDep.frontBuf == 2)))); - - if (swapP && (gc->grAuxBuf > 0)) sst1InitAllocBuffers(gc->base_ptr, - gc->grColBuf, - 0); -#endif /* (GLIDE_PLATFORM & GLIDE_HW_CVG) */ - - info.size = sizeof(info); - if (grLfbLock(GR_LFB_READ_ONLY, - src_buffer, - GR_LFBWRITEMODE_ANY, - GR_ORIGIN_UPPER_LEFT, - FXFALSE, - &info)) { - const FxU32 *srcData; /* Tracking Source Pointer */ - FxU32 *dstData; /* Tracking Destination Pointer */ - FxU32 srcJump; /* bytes to next scanline */ - FxU32 dstJump; /* bytes to next scanline */ - FxU32 length; /* bytes to copy in scanline */ - FxU32 scanline; /* scanline number */ - - dstData = (FxU32*)dst_data; - srcData = (const FxU32*)((FxU8*)info.lfbPtr + - (src_y * info.strideInBytes) + - (src_x << 1)); - scanline = src_height; - length = src_width * 2; - dstJump = dst_stride - length; - srcJump = info.strideInBytes - length; - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) - /* Voodoo2 has a problem reading from the frame buffer if we are - * triple buffering and the triple buffer is the currently - * active lfb buffer. The problem is that the 32 pixel screen - * tiles are reversed such that the logical tiling 0101 comes - * back as 1010. We do the 'swapping' here for the app, but - * if they use direct lfb accesses they are screwed. - */ - if (swapP) { - while(scanline--) { - FxU32* const dstEnd = (FxU32*)((FxU8*)dstData + length); - const FxU32* end = (const FxU32*)((FxU8*)srcData + length); - const FxU32* tilePtr; - const FxU32* tileEnd; - const FxU32* tileEndAlign; - - /* Leading slop up to the start of a logical 0 tile */ - if (((FxU32)srcData & kPageMask) != 0) { - FxU32 tileSlopMask = 0xFFFFFFFFUL; - FxU32 tileSlopAdjust = kTileSize; - - /* Do we have a partial 0 tile? */ - if (((FxU32)srcData & kTileSize) == 0) { - tilePtr = (const FxU32*)((FxU32)srcData + kTileSize); - tileEnd = (const FxU32*)(((FxU32)end <= ((FxU32)tilePtr & ~kTileMask)) - ? ((FxU32)end + kTileSize) - : (((FxU32)tilePtr + kTileSize) & ~kTileMask)); - tileEndAlign = (const FxU32*)((FxU32)tileEnd & ~0x03UL); - - /* Are we aligned in the hw lfb? */ - if (((FxU32)tilePtr & 0x03UL) != 0) { - *(FxU16*)dstData = GR_GET16(*tilePtr); - dstData = (FxU32*)((FxU8*)dstData + sizeof(FxU16)); - tilePtr = (const FxU32*)((FxU8*)tilePtr + sizeof(FxU16)); - } - - /* Copy the remainder of the 0 tile */ - while(tilePtr < tileEndAlign) *dstData++ = GR_GET(*tilePtr++); - if (tileEnd != tileEndAlign) *(FxU16*)dstData = GR_GET16(*tilePtr); - - tileSlopMask = ~kTileMask; - tileSlopAdjust = 0; - } - - /* Copying the logical 1 tile. This may require us to go - * 'backwards' in physical memory if there was no logical - * 0 tile in the current read. - */ - tilePtr = (const FxU32*)(((FxU32)srcData - tileSlopAdjust) & tileSlopMask); - tileEnd = (const FxU32*)MIN((((FxU32)tilePtr + kTileSize) & ~kTileMask), - (FxU32)end - kTileSize - sizeof(FxU16)); - tileEndAlign = (const FxU32*)((FxU32)tileEnd & ~0x03UL); - - if (tilePtr < tileEnd) { - /* Are we aligned in the hw lfb? */ - if (((FxU32)tilePtr & 0x03UL) != 0) { - *(FxU16*)dstData = GR_GET16(*tilePtr); - dstData = (FxU32*)((FxU8*)dstData + sizeof(FxU16)); - tilePtr = (const FxU32*)((FxU8*)tilePtr + sizeof(FxU16)); - } - - /* Copy the remainder of the logical 1 tile */ - while(tilePtr < tileEndAlign) *dstData++ = GR_GET(*tilePtr++); - if (tileEnd != tileEndAlign) - *(FxU16*)dstData = GR_GET16(*tilePtr); - } - - srcData = (const FxU32*)(((FxU32)srcData + (kTileSize << 1)) & ~kPageMask); - } - - /* Loop over complete logical 01 tile groups */ - { - const FxU32* endTileAddr = (const FxU32*)((FxU32)end & ~kPageMask); - - while(srcData < endTileAddr) { - tilePtr = (const FxU32*)((FxU32)srcData + kTileSize); - tileEnd = (const FxU32*)((FxU32)tilePtr + kTileSize); - while(tilePtr < tileEnd) *dstData++ = GR_GET(*tilePtr++); - - tilePtr = srcData; - tileEnd = (const FxU32*)((FxU32)tilePtr + kTileSize); - while(tilePtr < tileEnd) *dstData++ = GR_GET(*tilePtr++); - - srcData = (const FxU32*)((FxU8*)srcData + (kTileSize << 1)); - } - } - - /* Slop 01 tile group */ - if (srcData < end) { - const FxU32* startTileAddr = (const FxU32*)((FxU32)srcData + kTileSize); - - tilePtr = startTileAddr; - tileEnd = (const FxU32*)((FxU32)startTileAddr + - MIN(kTileSize, ((FxU32)end - (FxU32)srcData))); - tileEndAlign = (const FxU32*)((FxU32)tileEnd & ~0x3); - - while(tilePtr < tileEndAlign) *dstData++ = GR_GET(*tilePtr++); - if (tileEnd != tileEndAlign) - *(FxU16*)dstData = GR_GET16(*tilePtr); - - if (startTileAddr < end) { - tilePtr = srcData; - tileEnd = (const FxU32*)((FxU8*)tilePtr + kTileSize - - ((FxU32)tileEndAlign - (FxU32)end)); - tileEndAlign = (const FxU32*)((FxU32)tileEnd & ~0x3); - - while(tilePtr < tileEndAlign) *dstData++ = GR_GET(*tilePtr++); - if (tileEnd != tileEndAlign) - *(FxU16*)dstData = GR_GET16(*tilePtr); - } - } - - /* Adjust pointers */ - dstData = (FxU32*)((FxU8*)dstEnd + dstJump); - srcData = (const FxU32*)((FxU8*)end + srcJump); - } - } else -#endif /* (GLIDE_PLATFORM & GLIDE_HW_CVG) */ - /* If the source data is aligned for 4 byte pci reads */ - if (((FxU32)srcData & 0x02UL) == 0) { - while(scanline--) { - const FxU32* end = (const FxU32*)((char*)srcData + length - 2); - - while(srcData < end) { - *dstData++ = GR_GET(*srcData++); - } - - if (((int)length) & 0x2) { - (*(FxU16*)dstData) = GR_GET16(*srcData); - dstData = (FxU32*)(((FxU16*)dstData) + 1); - srcData = (FxU32*)(((FxU16*)srcData) + 1); - } - - dstData = (FxU32*)(((char*)dstData)+dstJump); - srcData = (FxU32*)(((char*)srcData)+srcJump); - } - } else { - while(scanline--) { - const FxU32* end = (const FxU32*)((char*)srcData + length - 2); - - (*(FxU16*)dstData) = (FxU16)GR_GET16(*srcData); - dstData = (FxU32*)(((FxU16*)dstData) + 1); - srcData = (FxU32*)(((FxU16*)srcData) + 1); - - while(srcData < end) { - *dstData++ = GR_GET(*srcData++); - } - - if (!(((int)length) & 0x2)) { - (*(FxU16*)dstData) = GR_GET16(*srcData); - dstData = (FxU32*)(((FxU16*)dstData) + 1); - srcData = (FxU32*)(((FxU16*)srcData) + 1); - } - - dstData = (FxU32*)(((char*)dstData)+dstJump); - srcData = (FxU32*)(((char*)srcData)+srcJump); - } - } - - grLfbUnlock(GR_LFB_READ_ONLY, src_buffer); - } else { - rv = FXFALSE; - } - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) - if (swapP && (gc->grAuxBuf > 0)) sst1InitAllocBuffers(gc->base_ptr, - gc->grColBuf, - gc->grAuxBuf); - } -#endif /* (GLIDE_PLATFORM & GLIDE_HW_CVG) */ - - GR_RETURN(rv); -#undef FN_NAME -}/* grLfbReadRegion */ - diff --git a/glide2x/cvg/glide/src/glide.h b/glide2x/cvg/glide/src/glide.h deleted file mode 100644 index f0ed986..0000000 --- a/glide2x/cvg/glide/src/glide.h +++ /dev/null @@ -1,1518 +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 -*/ - -/* -** GLIDE.H -** -** The following #defines are relevant when using Glide: -** -** One of the following "platform constants" must be defined during -** compilation: -** -** __DOS__ Defined for 32-bit DOS applications -** __WIN32__ Defined for 32-bit Windows applications -** __sparc__ Defined for Sun Solaris/SunOS -** __linux__ Defined for Linux applications -** __IRIX__ Defined for SGI Irix applications -** -*/ -#ifndef __GLIDE_H__ -#define __GLIDE_H__ - -#include <3dfx.h> -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* -** ----------------------------------------------------------------------- -** TYPE DEFINITIONS -** ----------------------------------------------------------------------- -*/ -typedef FxU32 GrColor_t; -typedef FxU8 GrAlpha_t; -typedef FxU32 GrMipMapId_t; -typedef FxU8 GrFog_t; -typedef void (FX_CALL *GrProc)(); - -/* -** ----------------------------------------------------------------------- -** CONSTANTS AND TYPES -** ----------------------------------------------------------------------- -*/ -#define MAX_NUM_SST 4 -#define MAX_MIPMAPS_PER_SST 1024 - -#ifndef GLIDE_LIB -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -#define GR_FOG_TABLE_SIZE 128 -#else /* !(defined(GLIDE3) && defined(GLIDE3_ALPHA)) */ -#define GR_FOG_TABLE_SIZE 64 -#endif /* !(defined(GLIDE3) && defined(GLIDE3_ALPHA)) */ -#endif /* GLIDE_LIB */ - -#define GR_NULL_MIPMAP_HANDLE ((GrMipMapId_t) -1) -#define GR_ZDEPTHVALUE_NEAREST 0xFFFF -#define GR_ZDEPTHVALUE_FARTHEST 0x0000 -#define GR_WDEPTHVALUE_NEAREST 0x0000 -#define GR_WDEPTHVALUE_FARTHEST 0xFFFF - -#define GR_MIPMAPLEVELMASK_EVEN FXBIT(0) -#define GR_MIPMAPLEVELMASK_ODD FXBIT(1) -#define GR_MIPMAPLEVELMASK_BOTH (GR_MIPMAPLEVELMASK_EVEN | GR_MIPMAPLEVELMASK_ODD ) - -#define GR_LODBIAS_BILINEAR 0.5 -#define GR_LODBIAS_TRILINEAR 0.0 - -typedef FxI32 GrChipID_t; -#define GR_TMU0 0x0 -#define GR_TMU1 0x1 -#define GR_TMU2 0x2 -#define GR_FBI 0x3 - -typedef FxI32 GrCombineFunction_t; -#define GR_COMBINE_FUNCTION_ZERO 0x0 -#define GR_COMBINE_FUNCTION_NONE GR_COMBINE_FUNCTION_ZERO -#define GR_COMBINE_FUNCTION_LOCAL 0x1 -#define GR_COMBINE_FUNCTION_LOCAL_ALPHA 0x2 -#define GR_COMBINE_FUNCTION_SCALE_OTHER 0x3 -#define GR_COMBINE_FUNCTION_BLEND_OTHER GR_COMBINE_FUNCTION_SCALE_OTHER -#define GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL 0x4 -#define GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA 0x5 -#define GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL 0x6 -#define GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL 0x7 -#define GR_COMBINE_FUNCTION_BLEND GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL -#define GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL_ALPHA 0x8 -#define GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL 0x9 -#define GR_COMBINE_FUNCTION_BLEND_LOCAL GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL -#define GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA 0x10 - -typedef FxI32 GrCombineFactor_t; -#define GR_COMBINE_FACTOR_ZERO 0x0 -#define GR_COMBINE_FACTOR_NONE GR_COMBINE_FACTOR_ZERO -#define GR_COMBINE_FACTOR_LOCAL 0x1 -#define GR_COMBINE_FACTOR_OTHER_ALPHA 0x2 -#define GR_COMBINE_FACTOR_LOCAL_ALPHA 0x3 -#define GR_COMBINE_FACTOR_TEXTURE_ALPHA 0x4 -#define GR_COMBINE_FACTOR_TEXTURE_RGB 0x5 -#define GR_COMBINE_FACTOR_DETAIL_FACTOR GR_COMBINE_FACTOR_TEXTURE_ALPHA -#define GR_COMBINE_FACTOR_LOD_FRACTION 0x5 -#define GR_COMBINE_FACTOR_ONE 0x8 -#define GR_COMBINE_FACTOR_ONE_MINUS_LOCAL 0x9 -#define GR_COMBINE_FACTOR_ONE_MINUS_OTHER_ALPHA 0xa -#define GR_COMBINE_FACTOR_ONE_MINUS_LOCAL_ALPHA 0xb -#define GR_COMBINE_FACTOR_ONE_MINUS_TEXTURE_ALPHA 0xc -#define GR_COMBINE_FACTOR_ONE_MINUS_DETAIL_FACTOR GR_COMBINE_FACTOR_ONE_MINUS_TEXTURE_ALPHA -#define GR_COMBINE_FACTOR_ONE_MINUS_LOD_FRACTION 0xd - - -typedef FxI32 GrCombineLocal_t; -#define GR_COMBINE_LOCAL_ITERATED 0x0 -#define GR_COMBINE_LOCAL_CONSTANT 0x1 -#define GR_COMBINE_LOCAL_NONE GR_COMBINE_LOCAL_CONSTANT -#define GR_COMBINE_LOCAL_DEPTH 0x2 - -typedef FxI32 GrCombineOther_t; -#define GR_COMBINE_OTHER_ITERATED 0x0 -#define GR_COMBINE_OTHER_TEXTURE 0x1 -#define GR_COMBINE_OTHER_CONSTANT 0x2 -#define GR_COMBINE_OTHER_NONE GR_COMBINE_OTHER_CONSTANT - - -typedef FxI32 GrAlphaSource_t; -#define GR_ALPHASOURCE_CC_ALPHA 0x0 -#define GR_ALPHASOURCE_ITERATED_ALPHA 0x1 -#define GR_ALPHASOURCE_TEXTURE_ALPHA 0x2 -#define GR_ALPHASOURCE_TEXTURE_ALPHA_TIMES_ITERATED_ALPHA 0x3 - - -typedef FxI32 GrColorCombineFnc_t; -#define GR_COLORCOMBINE_ZERO 0x0 -#define GR_COLORCOMBINE_CCRGB 0x1 -#define GR_COLORCOMBINE_ITRGB 0x2 -#define GR_COLORCOMBINE_ITRGB_DELTA0 0x3 -#define GR_COLORCOMBINE_DECAL_TEXTURE 0x4 -#define GR_COLORCOMBINE_TEXTURE_TIMES_CCRGB 0x5 -#define GR_COLORCOMBINE_TEXTURE_TIMES_ITRGB 0x6 -#define GR_COLORCOMBINE_TEXTURE_TIMES_ITRGB_DELTA0 0x7 -#define GR_COLORCOMBINE_TEXTURE_TIMES_ITRGB_ADD_ALPHA 0x8 -#define GR_COLORCOMBINE_TEXTURE_TIMES_ALPHA 0x9 -#define GR_COLORCOMBINE_TEXTURE_TIMES_ALPHA_ADD_ITRGB 0xa -#define GR_COLORCOMBINE_TEXTURE_ADD_ITRGB 0xb -#define GR_COLORCOMBINE_TEXTURE_SUB_ITRGB 0xc -#define GR_COLORCOMBINE_CCRGB_BLEND_ITRGB_ON_TEXALPHA 0xd -#define GR_COLORCOMBINE_DIFF_SPEC_A 0xe -#define GR_COLORCOMBINE_DIFF_SPEC_B 0xf -#define GR_COLORCOMBINE_ONE 0x10 - -typedef FxI32 GrAlphaBlendFnc_t; -#define GR_BLEND_ZERO 0x0 -#define GR_BLEND_SRC_ALPHA 0x1 -#define GR_BLEND_SRC_COLOR 0x2 -#define GR_BLEND_DST_COLOR GR_BLEND_SRC_COLOR -#define GR_BLEND_DST_ALPHA 0x3 -#define GR_BLEND_ONE 0x4 -#define GR_BLEND_ONE_MINUS_SRC_ALPHA 0x5 -#define GR_BLEND_ONE_MINUS_SRC_COLOR 0x6 -#define GR_BLEND_ONE_MINUS_DST_COLOR GR_BLEND_ONE_MINUS_SRC_COLOR -#define GR_BLEND_ONE_MINUS_DST_ALPHA 0x7 -#define GR_BLEND_RESERVED_8 0x8 -#define GR_BLEND_RESERVED_9 0x9 -#define GR_BLEND_RESERVED_A 0xa -#define GR_BLEND_RESERVED_B 0xb -#define GR_BLEND_RESERVED_C 0xc -#define GR_BLEND_RESERVED_D 0xd -#define GR_BLEND_RESERVED_E 0xe -#define GR_BLEND_ALPHA_SATURATE 0xf -#define GR_BLEND_PREFOG_COLOR GR_BLEND_ALPHA_SATURATE - -typedef FxI32 GrAspectRatio_t; -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -//#define GLIDE3_DEBUG -#ifdef GLIDE3_DEBUG -#define GR_ASPECT_8x1 0x0 /* 8W x 1H */ -#define GR_ASPECT_4x1 0x1 /* 4W x 1H */ -#define GR_ASPECT_2x1 0x2 /* 2W x 1H */ -#define GR_ASPECT_1x1 0x3 /* 1W x 1H */ -#define GR_ASPECT_1x2 0x4 /* 1W x 2H */ -#define GR_ASPECT_1x4 0x5 /* 1W x 4H */ -#define GR_ASPECT_1x8 0x6 /* 1W x 8H */ -#else -#define GR_ASPECT_8x1 3 /* 8W x 1H */ -#define GR_ASPECT_4x1 2 /* 4W x 1H */ -#define GR_ASPECT_2x1 1 /* 2W x 1H */ -#define GR_ASPECT_1x1 0 /* 1W x 1H */ -#define GR_ASPECT_1x2 -1 /* 1W x 2H */ -#define GR_ASPECT_1x4 -2 /* 1W x 4H */ -#define GR_ASPECT_1x8 -3 /* 1W x 8H */ -#endif /* GLIDE3_DEBUG */ -#else -#define GR_ASPECT_8x1 0x0 /* 8W x 1H */ -#define GR_ASPECT_4x1 0x1 /* 4W x 1H */ -#define GR_ASPECT_2x1 0x2 /* 2W x 1H */ -#define GR_ASPECT_1x1 0x3 /* 1W x 1H */ -#define GR_ASPECT_1x2 0x4 /* 1W x 2H */ -#define GR_ASPECT_1x4 0x5 /* 1W x 4H */ -#define GR_ASPECT_1x8 0x6 /* 1W x 8H */ -#endif - -typedef FxI32 GrBuffer_t; -#define GR_BUFFER_FRONTBUFFER 0x0 -#define GR_BUFFER_BACKBUFFER 0x1 -#define GR_BUFFER_AUXBUFFER 0x2 -#define GR_BUFFER_DEPTHBUFFER 0x3 -#define GR_BUFFER_ALPHABUFFER 0x4 -#define GR_BUFFER_TRIPLEBUFFER 0x5 - -typedef FxI32 GrChromakeyMode_t; -#define GR_CHROMAKEY_DISABLE 0x0 -#define GR_CHROMAKEY_ENABLE 0x1 - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -typedef FxI32 GrChromaRangeMode_t; -#define GR_CHROMARANGE_RGB_ANY 0x0 -#define GR_CHROMARANGE_RGb_ANY 0x1 -#define GR_CHROMARANGE_RgB_ANY 0x2 -#define GR_CHROMARANGE_Rgb_ANY 0x3 -#define GR_CHROMARANGE_rGB_ANY 0x4 -#define GR_CHROMARANGE_rGb_ANY 0x5 -#define GR_CHROMARANGE_rgB_ANY 0x6 -#define GR_CHROMARANGE_rgb_ANY 0x7 -#define GR_CHROMARANGE_RGB_ALL 0x8 -#define GR_CHROMARANGE_RGb_ALL 0x9 -#define GR_CHROMARANGE_RgB_ALL 0xa -#define GR_CHROMARANGE_Rgb_ALL 0xb -#define GR_CHROMARANGE_rGB_ALL 0xc -#define GR_CHROMARANGE_rGb_ALL 0xd -#define GR_CHROMARANGE_rgB_ALL 0xe -#define GR_CHROMARANGE_rgb_ALL 0xf -#endif - -typedef FxI32 GrCmpFnc_t; -#define GR_CMP_NEVER 0x0 -#define GR_CMP_LESS 0x1 -#define GR_CMP_EQUAL 0x2 -#define GR_CMP_LEQUAL 0x3 -#define GR_CMP_GREATER 0x4 -#define GR_CMP_NOTEQUAL 0x5 -#define GR_CMP_GEQUAL 0x6 -#define GR_CMP_ALWAYS 0x7 - -typedef FxI32 GrColorFormat_t; -#define GR_COLORFORMAT_ARGB 0x0 -#define GR_COLORFORMAT_ABGR 0x1 - -#define GR_COLORFORMAT_RGBA 0x2 -#define GR_COLORFORMAT_BGRA 0x3 - -typedef FxI32 GrCullMode_t; -#define GR_CULL_DISABLE 0x0 -#define GR_CULL_NEGATIVE 0x1 -#define GR_CULL_POSITIVE 0x2 - -typedef FxI32 GrDepthBufferMode_t; -#define GR_DEPTHBUFFER_DISABLE 0x0 -#define GR_DEPTHBUFFER_ZBUFFER 0x1 -#define GR_DEPTHBUFFER_WBUFFER 0x2 -#define GR_DEPTHBUFFER_ZBUFFER_COMPARE_TO_BIAS 0x3 -#define GR_DEPTHBUFFER_WBUFFER_COMPARE_TO_BIAS 0x4 - -typedef FxI32 GrDitherMode_t; -#define GR_DITHER_DISABLE 0x0 -#define GR_DITHER_2x2 0x1 -#define GR_DITHER_4x4 0x2 - -typedef FxI32 GrFogMode_t; -#define GR_FOG_DISABLE 0x0 -#define GR_FOG_WITH_ITERATED_ALPHA 0x1 -#define GR_FOG_WITH_TABLE 0x2 -#define GR_FOG_WITH_ITERATED_Z 0x3 /* Bug 735 */ -#define GR_FOG_MULT2 0x100 -#define GR_FOG_ADD2 0x200 - -typedef FxU32 GrLock_t; -#define GR_LFB_READ_ONLY 0x00 -#define GR_LFB_WRITE_ONLY 0x01 -#define GR_LFB_IDLE 0x00 -#define GR_LFB_NOIDLE 0x10 - -typedef FxI32 GrLfbBypassMode_t; -#define GR_LFBBYPASS_DISABLE 0x0 -#define GR_LFBBYPASS_ENABLE 0x1 - -typedef FxI32 GrLfbWriteMode_t; -#define GR_LFBWRITEMODE_565 0x0 /* RGB:RGB */ -#define GR_LFBWRITEMODE_555 0x1 /* RGB:RGB */ -#define GR_LFBWRITEMODE_1555 0x2 /* ARGB:ARGB */ -#define GR_LFBWRITEMODE_RESERVED1 0x3 -#define GR_LFBWRITEMODE_888 0x4 /* RGB */ -#define GR_LFBWRITEMODE_8888 0x5 /* ARGB */ -#define GR_LFBWRITEMODE_RESERVED2 0x6 -#define GR_LFBWRITEMODE_RESERVED3 0x7 -#define GR_LFBWRITEMODE_RESERVED4 0x8 -#define GR_LFBWRITEMODE_RESERVED5 0x9 -#define GR_LFBWRITEMODE_RESERVED6 0xa -#define GR_LFBWRITEMODE_RESERVED7 0xb -#define GR_LFBWRITEMODE_565_DEPTH 0xc /* RGB:DEPTH */ -#define GR_LFBWRITEMODE_555_DEPTH 0xd /* RGB:DEPTH */ -#define GR_LFBWRITEMODE_1555_DEPTH 0xe /* ARGB:DEPTH */ -#define GR_LFBWRITEMODE_ZA16 0xf /* DEPTH:DEPTH */ -#define GR_LFBWRITEMODE_ANY 0xFF - - -typedef FxI32 GrOriginLocation_t; -#define GR_ORIGIN_UPPER_LEFT 0x0 -#define GR_ORIGIN_LOWER_LEFT 0x1 -#define GR_ORIGIN_ANY 0xFF - -typedef struct { - int size; - void *lfbPtr; - FxU32 strideInBytes; - GrLfbWriteMode_t writeMode; - GrOriginLocation_t origin; -} GrLfbInfo_t; - -typedef FxI32 GrLOD_t; -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -#ifdef GLIDE3_DEBUG -#define GR_LOD_256 0x0 -#define GR_LOD_128 0x1 -#define GR_LOD_64 0x2 -#define GR_LOD_32 0x3 -#define GR_LOD_16 0x4 -#define GR_LOD_8 0x5 -#define GR_LOD_4 0x6 -#define GR_LOD_2 0x7 -#define GR_LOD_1 0x8 -#else -#define GR_LOD_256 0x8 -#define GR_LOD_128 0x7 -#define GR_LOD_64 0x6 -#define GR_LOD_32 0x5 -#define GR_LOD_16 0x4 -#define GR_LOD_8 0x3 -#define GR_LOD_4 0x2 -#define GR_LOD_2 0x1 -#define GR_LOD_1 0x0 -#endif /* GLIDE3_DEBUG */ -#else -#define GR_LOD_256 0x0 -#define GR_LOD_128 0x1 -#define GR_LOD_64 0x2 -#define GR_LOD_32 0x3 -#define GR_LOD_16 0x4 -#define GR_LOD_8 0x5 -#define GR_LOD_4 0x6 -#define GR_LOD_2 0x7 -#define GR_LOD_1 0x8 -#endif - -typedef FxI32 GrMipMapMode_t; -#define GR_MIPMAP_DISABLE 0x0 /* no mip mapping */ -#define GR_MIPMAP_NEAREST 0x1 /* use nearest mipmap */ -#define GR_MIPMAP_NEAREST_DITHER 0x2 /* GR_MIPMAP_NEAREST + LOD dith */ - - -typedef FxI32 GrSmoothingMode_t; -#define GR_SMOOTHING_DISABLE 0x0 -#define GR_SMOOTHING_ENABLE 0x1 - -typedef FxI32 GrTextureClampMode_t; -#define GR_TEXTURECLAMP_WRAP 0x0 -#define GR_TEXTURECLAMP_CLAMP 0x1 - -typedef FxI32 GrTextureCombineFnc_t; -#define GR_TEXTURECOMBINE_ZERO 0x0 /* texout = 0 */ -#define GR_TEXTURECOMBINE_DECAL 0x1 /* texout = texthis */ -#define GR_TEXTURECOMBINE_OTHER 0x2 /* this TMU in passthru mode */ -#define GR_TEXTURECOMBINE_ADD 0x3 /* tout = tthis + t(this+1) */ -#define GR_TEXTURECOMBINE_MULTIPLY 0x4 /* texout = tthis * t(this+1) */ -#define GR_TEXTURECOMBINE_SUBTRACT 0x5 /* Sutract from upstream TMU */ -#define GR_TEXTURECOMBINE_DETAIL 0x6 /* detail--detail on tthis */ -#define GR_TEXTURECOMBINE_DETAIL_OTHER 0x7 /* detail--detail on tthis+1 */ -#define GR_TEXTURECOMBINE_TRILINEAR_ODD 0x8 /* trilinear--odd levels tthis*/ -#define GR_TEXTURECOMBINE_TRILINEAR_EVEN 0x9 /*trilinear--even levels tthis*/ -#define GR_TEXTURECOMBINE_ONE 0xa /* texout = 0xFFFFFFFF */ - -typedef FxI32 GrTextureFilterMode_t; -#define GR_TEXTUREFILTER_POINT_SAMPLED 0x0 -#define GR_TEXTUREFILTER_BILINEAR 0x1 - -typedef FxI32 GrTextureFormat_t; -#define GR_TEXFMT_8BIT 0x0 -#define GR_TEXFMT_RGB_332 GR_TEXFMT_8BIT -#define GR_TEXFMT_YIQ_422 0x1 -#define GR_TEXFMT_ALPHA_8 0x2 /* (0..0xFF) alpha */ -#define GR_TEXFMT_INTENSITY_8 0x3 /* (0..0xFF) intensity */ -#define GR_TEXFMT_ALPHA_INTENSITY_44 0x4 -#define GR_TEXFMT_P_8 0x5 /* 8-bit palette */ -#define GR_TEXFMT_RSVD0 0x6 -#define GR_TEXFMT_RSVD1 0x7 -#define GR_TEXFMT_16BIT 0x8 -#define GR_TEXFMT_ARGB_8332 GR_TEXFMT_16BIT -#define GR_TEXFMT_AYIQ_8422 0x9 -#define GR_TEXFMT_RGB_565 0xa -#define GR_TEXFMT_ARGB_1555 0xb -#define GR_TEXFMT_ARGB_4444 0xc -#define GR_TEXFMT_ALPHA_INTENSITY_88 0xd -#define GR_TEXFMT_AP_88 0xe /* 8-bit alpha 8-bit palette */ -#define GR_TEXFMT_RSVD2 0xf - -typedef FxU32 GrTexTable_t; -#define GR_TEXTABLE_NCC0 0x0 -#define GR_TEXTABLE_NCC1 0x1 -#define GR_TEXTABLE_PALETTE 0x2 - -typedef FxU32 GrNCCTable_t; -#define GR_NCCTABLE_NCC0 0x0 -#define GR_NCCTABLE_NCC1 0x1 - -typedef FxU32 GrTexBaseRange_t; -#define GR_TEXBASE_256 0x0 -#define GR_TEXBASE_128 0x1 -#define GR_TEXBASE_64 0x2 -#define GR_TEXBASE_32_TO_1 0x3 - -#ifdef GLIDE3 - -#define GLIDE3_VERTEX_LAYOUT 1 - -typedef FxU32 GrEnableMode_t; -#define GR_MODE_DISABLE 0x0 -#define GR_MODE_ENABLE 0x1 - -#define GR_AA_ORDERED 0x01 -#define GR_ALLOW_MIPMAP_DITHER 0x02 -#define GR_SHAMELESS_PLUG 0x03 -#define GR_VIDEO_SMOOTHING 0x04 - -typedef FxU32 GrCoordinateSpaceMode_t; -#define GR_WINDOW_COORDS 0x00 -#define GR_CLIP_COORDS 0x01 - -#endif - -#ifdef GLIDE3 -#ifdef GLIDE3_ALPHA -#define GLIDE3_EXTRA_STATE 392 -#else -#define GLIDE3_EXTRA_STATE 216 -#endif -#else -#define GLIDE3_EXTRA_STATE 0 -#endif - -#define GLIDE_STATE_PAD_SIZE 312 + GLIDE3_EXTRA_STATE - -#ifdef GLIDE_LIB -typedef struct _GrState_s GrState; -#else -typedef struct _GrState_s { - char pad[GLIDE_STATE_PAD_SIZE]; -} GrState; -#endif - -#ifdef GLIDE3 -/* Types of data in strips */ -#define GR_FLOAT 0 -#define GR_U8 1 - -/* Parameters for strips */ -#define GR_PARAM_XY 0x01 -#define GR_PARAM_Z 0x02 -#define GR_PARAM_W 0x03 -#define GR_PARAM_Q 0x04 - -#define GR_PARAM_A 0x10 -#define GR_PARAM_A0 GR_PARAM_A -#define GR_PARAM_A1 GR_PARAM_A+1 -#define GR_PARAM_A2 GR_PARAM_A+2 -#define GR_PARAM_A3 GR_PARAM_A+3 -#define GR_PARAM_A4 GR_PARAM_A+4 -#define GR_PARAM_A5 GR_PARAM_A+5 -#define GR_PARAM_A6 GR_PARAM_A+6 -#define GR_PARAM_A7 GR_PARAM_A+7 - -#define GR_PARAM_RGB 0x20 -#define GR_PARAM_RGB0 GR_PARAM_RGB -#define GR_PARAM_RGB1 GR_PARAM_RGB+1 -#define GR_PARAM_RGB2 GR_PARAM_RGB+2 -#define GR_PARAM_RGB3 GR_PARAM_RGB+3 -#define GR_PARAM_RGB4 GR_PARAM_RGB+4 -#define GR_PARAM_RGB5 GR_PARAM_RGB+5 -#define GR_PARAM_RGB6 GR_PARAM_RGB+6 -#define GR_PARAM_RGB7 GR_PARAM_RGB+7 - -#define GR_PARAM_PARGB 0x30 -#define GR_PARAM_PARGB0 GR_PARAM_PARGB -#define GR_PARAM_PARGB1 GR_PARAM_PARGB+1 -#define GR_PARAM_PARGB2 GR_PARAM_PARGB+2 -#define GR_PARAM_PARGB3 GR_PARAM_PARGB+3 -#define GR_PARAM_PARGB4 GR_PARAM_PARGB+4 -#define GR_PARAM_PARGB5 GR_PARAM_PARGB+5 -#define GR_PARAM_PARGB6 GR_PARAM_PARGB+6 -#define GR_PARAM_PARGB7 GR_PARAM_PARGB+7 - -#define GR_PARAM_ST0 0x40 -#define GR_PARAM_ST1 GR_PARAM_ST0+1 -#define GR_PARAM_ST2 GR_PARAM_ST0+2 -#define GR_PARAM_ST3 GR_PARAM_ST0+3 -#define GR_PARAM_ST4 GR_PARAM_ST0+4 -#define GR_PARAM_ST5 GR_PARAM_ST0+5 -#define GR_PARAM_ST6 GR_PARAM_ST0+6 -#define GR_PARAM_ST7 GR_PARAM_ST0+7 - -#define GR_PARAM_Q0 0x50 -#define GR_PARAM_Q1 GR_PARAM_Q0+1 -#define GR_PARAM_Q2 GR_PARAM_Q0+2 -#define GR_PARAM_Q3 GR_PARAM_Q0+3 -#define GR_PARAM_Q4 GR_PARAM_Q0+4 -#define GR_PARAM_Q5 GR_PARAM_Q0+5 -#define GR_PARAM_Q6 GR_PARAM_Q0+6 -#define GR_PARAM_Q7 GR_PARAM_Q0+7 - -#define GR_PARAM_DISABLE 0x00 -#define GR_PARAM_ENABLE 0x01 - -/* Componenets for strips */ -/* vertex */ -#define GR_VERTEX_XYZ 3 -#define GR_VERTEX_XYZW 4 -/* Color */ -#define GR_COLOR_RGB 3 -#define GR_COLOR_RGBA 4 -/* Texture */ -#define GR_TEX_NONE 0 -#define GR_TEX_ST 2 -#define GR_TEX_STW 3 - -/* grDrawVertexArray primitive type */ -#define GR_POINTS 0 -#define GR_LINE_STRIP 1 -#define GR_LINES 2 -#define GR_POLYGON 3 -#define GR_TRIANGLE_STRIP 4 -#define GR_TRIANGLE_FAN 5 -#define GR_TRIANGLES 6 - - -/* Stuff for grGet/grReset */ -#define GR_BITS_DEPTH 0x01 -#define GR_BITS_RGBA 0x02 -#define GR_FIFO_FULLNESS 0x03 -#define GR_FOG_TABLE_ENTRIES 0x04 -#define GR_GAMMA_TABLE_ENTRIES 0x05 -#define GR_IS_BUSY 0x06 -#define GR_LFB_PIXEL_PIPE 0x07 -#define GR_MAX_TEXTURE_SIZE 0x08 -#define GR_MAX_TEXTURE_ASPECT_RATIO 0x09 -#define GR_MEMORY_FB 0x0a -#define GR_MEMORY_TMU 0x0b -#define GR_MEMORY_UMA 0x0c -#define GR_NUM_BOARDS 0x0d -#define GR_NUM_POWER_OF_TWO_TEXTURES 0x0e -#define GR_NUM_FB 0x0f -#define GR_NUM_TMU 0x10 -#define GR_PENDING_BUFFERSWAPS 0x11 -#define GR_REVISION_FB 0x12 -#define GR_REVISION_TMU 0x13 -#define GR_STATS_LINES 0x14 /* grSet/grReset */ -#define GR_STATS_PIXELS_AFUNC_FAIL 0x15 -#define GR_STATS_PIXELS_CHROMA_FAIL 0x16 -#define GR_STATS_PIXELS_DEPTHFUNC_FAIL 0x17 -#define GR_STATS_PIXELS_IN 0x18 -#define GR_STATS_PIXELS_OUT 0x19 -#define GR_STATS_PIXELS 0x1a /* grReset */ -#define GR_STATS_POINTS 0x1b /* grSet/grReset */ -#define GR_STATS_TRIANGLES_IN 0x1c -#define GR_STATS_TRIANGLES_OUT 0x1d -#define GR_STATS_TRIANGLES 0x1e /* grReset */ -#define GR_SWAP_HISTORY 0x1f -#define GR_TEXTURE_ALIGN 0x20 -#define GR_VIDEO_POSITION 0x21 -#define GR_VIEWPORT 0x22 -#define GR_WDEPTH_MIN_MAX 0x23 -#define GR_ZDEPTH_MIN_MAX 0x24 - -/* stuff for grGetString */ -#define GR_EXTENSION 0xa0 -#define GR_HARDWARE 0xa1 -#define GR_RENDERER 0xa2 -#define GR_VENDOR 0xa3 -#define GR_VERSION 0xa4 - -#endif - -/* -** ----------------------------------------------------------------------- -** STRUCTURES -** ----------------------------------------------------------------------- -*/ - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -#ifdef GLIDE3_DEBUG -typedef struct { - GrLOD_t smallLod; - GrLOD_t largeLod; - GrAspectRatio_t aspectRatio; - GrTextureFormat_t format; - void *data; -} GrTexInfo; -#else -typedef struct { - GrLOD_t smallLodLog2; - GrLOD_t largeLodLog2; - GrAspectRatio_t aspectRatioLog2; - GrTextureFormat_t format; - void *data; -} GrTexInfo; -#endif /* GLIDE3_DEBUG */ -#else -typedef struct { - GrLOD_t smallLod; - GrLOD_t largeLod; - GrAspectRatio_t aspectRatio; - GrTextureFormat_t format; - void *data; -} GrTexInfo; -#endif - -#ifndef 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; - -typedef struct -{ - int sst; /* SST where this texture map was stored */ - FxBool valid; /* set when this table entry is allocated*/ - int width, height; - GrAspectRatio_t aspect_ratio; /* aspect ratio of the mip map. */ - void *data; /* actual texture data */ - - GrTextureFormat_t format; /* format of the texture table */ - GrMipMapMode_t mipmap_mode; /* mip map mode for this texture */ - GrTextureFilterMode_t magfilter_mode; /* filtering to be used when magnified */ - GrTextureFilterMode_t minfilter_mode; /* filtering to be used with minified */ - GrTextureClampMode_t s_clamp_mode; /* how this texture should be clamped in s */ - GrTextureClampMode_t t_clamp_mode; /* how this texture should be clamped in t */ - FxU32 tLOD; /* Register value for tLOD register */ - FxU32 tTextureMode; /* Register value for tTextureMode register - not including non-texture specific bits */ - FxU32 lod_bias; /* LOD bias of the mip map in preshifted 4.2*/ - GrLOD_t lod_min, lod_max; /* largest and smallest levels of detail */ - int tmu; /* tmu on which this texture resides */ - FxU32 odd_even_mask; /* mask specifying levels on this tmu */ - FxU32 tmu_base_address; /* base addr (in TMU mem) of this texture */ - FxBool trilinear; /* should we blend by lod? */ - - GuNccTable ncc_table; /* NCC compression table (optional) */ -} GrMipMapInfo; -#endif - -typedef int GrSstType; -#define GR_SSTTYPE_VOODOO 0 -#define GR_SSTTYPE_SST96 1 -#define GR_SSTTYPE_AT3D 2 -#define GR_SSTTYPE_Voodoo2 3 - -typedef struct GrTMUConfig_St { - int tmuRev; /* Rev of Texelfx chip */ - int tmuRam; /* 1, 2, or 4 MB */ -} GrTMUConfig_t; - -typedef struct GrVoodooConfig_St { - int fbRam; /* 1, 2, or 4 MB */ - int fbiRev; /* Rev of Pixelfx chip */ - int nTexelfx; /* How many texelFX chips are there? */ - FxBool sliDetect; /* Is it a scan-line interleaved board? */ - GrTMUConfig_t tmuConfig[GLIDE_NUM_TMU]; /* Configuration of the Texelfx chips */ -} GrVoodooConfig_t; - -typedef struct GrSst96Config_St { - int fbRam; /* How much? */ - int nTexelfx; - GrTMUConfig_t tmuConfig; -} GrSst96Config_t; - -typedef GrVoodooConfig_t GrVoodoo2Config_t; - -typedef struct GrAT3DConfig_St { - int rev; -} GrAT3DConfig_t; - -typedef struct { - int num_sst; /* # of HW units in the system */ - struct { - GrSstType type; /* Which hardware is it? */ - union SstBoard_u { - GrVoodooConfig_t VoodooConfig; - GrSst96Config_t SST96Config; - GrAT3DConfig_t AT3DConfig; - GrVoodoo2Config_t Voodoo2Config; - } sstBoard; - } SSTs[MAX_NUM_SST]; /* configuration for each board */ -} GrHwConfiguration; - -typedef struct GrSstPerfStats_s { - FxU32 pixelsIn; /* # pixels processed (minus buffer clears) */ - FxU32 chromaFail; /* # pixels not drawn due to chroma key */ - FxU32 zFuncFail; /* # pixels not drawn due to Z comparison */ - FxU32 aFuncFail; /* # pixels not drawn due to alpha comparison */ - FxU32 pixelsOut; /* # pixels drawn (including buffer clears) */ -} GrSstPerfStats_t; - - -typedef struct { - float sow; /* s texture ordinate (s over w) */ - float tow; /* t texture ordinate (t over w) */ - float oow; /* 1/w (used mipmapping - really 0xfff/w) */ -} GrTmuVertex; - -/* -** GrVertex -** If these are changed the C & assembly language trisetup routines MUST -** be changed, for they will no longer work. -*/ -#if !GLIDE3_VERTEX_LAYOUT -typedef struct -{ - float x, y, z; /* X, Y, and Z of scrn space -- Z is ignored */ - float r, g, b; /* R, G, B, ([0..255.0]) */ - float ooz; /* 65535/Z (used for Z-buffering) */ - float a; /* Alpha [0..255.0] */ - float oow; /* 1/W (used for W-buffering, texturing) */ - GrTmuVertex tmuvtx[GLIDE_NUM_TMU]; -} GrVertex; - -#define GR_VERTEX_X_OFFSET 0 -#define GR_VERTEX_Y_OFFSET 1 -#define GR_VERTEX_Z_OFFSET 2 -#define GR_VERTEX_R_OFFSET 3 -#define GR_VERTEX_G_OFFSET 4 -#define GR_VERTEX_B_OFFSET 5 -#define GR_VERTEX_OOZ_OFFSET 6 -#define GR_VERTEX_A_OFFSET 7 -#define GR_VERTEX_OOW_OFFSET 8 - -#else /* GLIDE3_VERTEX_LAYOUT */ -typedef struct -{ - float x, y; /* X and Y in screen space */ - float ooz; /* 65535/Z (used for Z-buffering) */ - float oow; /* 1/W (used for W-buffering, texturing) */ - float r, g, b, a; /* R, G, B, A [0..255.0] */ - float z; /* Z is ignored */ - GrTmuVertex tmuvtx[GLIDE_NUM_TMU]; -} GrVertex; - -#define GR_VERTEX_X_OFFSET 0 -#define GR_VERTEX_Y_OFFSET 1 -#define GR_VERTEX_OOZ_OFFSET 2 -#define GR_VERTEX_OOW_OFFSET 3 -#define GR_VERTEX_R_OFFSET 4 -#define GR_VERTEX_G_OFFSET 5 -#define GR_VERTEX_B_OFFSET 6 -#define GR_VERTEX_A_OFFSET 7 -#define GR_VERTEX_Z_OFFSET 8 - -#endif /* GLIDE3_VERTEX_LAYOUT */ - -#define GR_VERTEX_SOW_TMU0_OFFSET 9 -#define GR_VERTEX_TOW_TMU0_OFFSET 10 -#define GR_VERTEX_OOW_TMU0_OFFSET 11 -#define GR_VERTEX_SOW_TMU1_OFFSET 12 -#define GR_VERTEX_TOW_TMU1_OFFSET 13 -#define GR_VERTEX_OOW_TMU1_OFFSET 14 - -#if (GLIDE_NUM_TMU > 2) -#define GR_VERTEX_SOW_TMU2_OFFSET 15 -#define GR_VERTEX_TOW_TMU2_OFFSET 16 -#define GR_VERTEX_OOW_TMU2_OFFSET 17 -#endif - -typedef FxU32 GrLfbSrcFmt_t; -#define GR_LFB_SRC_FMT_565 0x00 -#define GR_LFB_SRC_FMT_555 0x01 -#define GR_LFB_SRC_FMT_1555 0x02 -#define GR_LFB_SRC_FMT_888 0x04 -#define GR_LFB_SRC_FMT_8888 0x05 -#define GR_LFB_SRC_FMT_565_DEPTH 0x0c -#define GR_LFB_SRC_FMT_555_DEPTH 0x0d -#define GR_LFB_SRC_FMT_1555_DEPTH 0x0e -#define GR_LFB_SRC_FMT_ZA16 0x0f -#define GR_LFB_SRC_FMT_RLE16 0x80 - -typedef FxI32 GrPassthruMode_t; -#define GR_PASSTHRU_SHOW_VGA 0x0 -#define GR_PASSTHRU_SHOW_SST1 0x1 - -typedef FxU32 GrHint_t; -#define GR_HINTTYPE_MIN 0 -#define GR_HINT_STWHINT 0 -#define GR_HINT_FIFOCHECKHINT 1 -#define GR_HINT_FPUPRECISION 2 -#define GR_HINT_ALLOW_MIPMAP_DITHER 3 -#define GR_HINT_LFB_WRITE 4 -#define GR_HINT_LFB_PROTECT 5 -#define GR_HINT_LFB_RESET 6 -#define GR_HINTTYPE_MAX GR_HINT_LFB_RESET -#ifdef H3D -#define GR_HINT_H3DENABLE GR_HINTTYPE_MAX -#undef GR_HINTTYPE_MAX -#define GR_HINTTYPE_MAX GR_HIT_H3DENABLE -#endif - -typedef FxU32 GrSTWHint_t; -#define GR_STWHINT_W_DIFF_FBI FXBIT(0) -#define GR_STWHINT_W_DIFF_TMU0 FXBIT(1) -#define GR_STWHINT_ST_DIFF_TMU0 FXBIT(2) -#define GR_STWHINT_W_DIFF_TMU1 FXBIT(3) -#define GR_STWHINT_ST_DIFF_TMU1 FXBIT(4) -#define GR_STWHINT_W_DIFF_TMU2 FXBIT(5) -#define GR_STWHINT_ST_DIFF_TMU2 FXBIT(6) - -typedef FxU32 GrControl_t; -#define GR_CONTROL_ACTIVATE 0x1 -#define GR_CONTROL_DEACTIVATE 0x2 -#define GR_CONTROL_RESIZE 0x3 -#define GR_CONTROL_MOVE 0x4 - -#define GR_GENERATE_FIFOCHECK_HINT_MASK(swHWM, swLWM) \ - (((swHWM & 0xffff) << 16) | (swLWM & 0xffff)) - -/* -** ----------------------------------------------------------------------- -** FUNCTION PROTOTYPES -** ----------------------------------------------------------------------- -*/ -#ifndef FX_GLIDE_NO_FUNC_PROTO -/* -** rendering functions -*/ - -#ifndef GLIDE3_ALPHA - -FX_ENTRY void FX_CALL -grDrawPlanarPolygon( int nverts, const int ilist[], const GrVertex vlist[] ); - -FX_ENTRY void FX_CALL -grDrawPlanarPolygonVertexList( int nverts, const GrVertex vlist[] ); - -FX_ENTRY void FX_CALL -grDrawPolygon( int nverts, const int ilist[], const GrVertex vlist[] ); - -FX_ENTRY void FX_CALL -grDrawPolygonVertexList( int nverts, const GrVertex vlist[] ); - -#endif /* !GLIDE3_ALPHA */ - -#ifdef GLIDE3 -FX_ENTRY void FX_CALL -grDrawPoint( void *pt ); - -FX_ENTRY void FX_CALL -grDrawLine( void *v1, void *v2 ); - -FX_ENTRY void FX_CALL -grDrawTriangle( void *a, void *b, void *c ); - -#else -FX_ENTRY void FX_CALL -grDrawPoint( const GrVertex *pt ); - -FX_ENTRY void FX_CALL -grDrawLine( const GrVertex *v1, const GrVertex *v2 ); - -FX_ENTRY void FX_CALL -grDrawTriangle( const GrVertex *a, const GrVertex *b, const GrVertex *c ); -#endif - -/* -** buffer management -*/ -FX_ENTRY void FX_CALL -grBufferClear( GrColor_t color, GrAlpha_t alpha, FxU16 depth ); - -#ifndef GLIDE3_ALPHA -FX_ENTRY int FX_CALL -grBufferNumPending( void ); -#endif /* !GLIDE3_ALPHA */ - -FX_ENTRY void FX_CALL -grBufferSwap( int swap_interval ); - -FX_ENTRY void FX_CALL -grRenderBuffer( GrBuffer_t buffer ); - -/* -** error management -*/ -typedef void (*GrErrorCallbackFnc_t)( const char *string, FxBool fatal ); - -FX_ENTRY void FX_CALL -grErrorSetCallback( GrErrorCallbackFnc_t fnc ); - -/* -** SST routines -*/ -#ifdef GLIDE3 -FX_ENTRY void FX_CALL -grFinish(void); -#endif - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -FX_ENTRY void FX_CALL -grFlush(void); -#endif - -#ifndef GLIDE3_ALPHA -FX_ENTRY void FX_CALL -grSstIdle(void); - -FX_ENTRY FxU32 FX_CALL -grSstVideoLine( void ); - -FX_ENTRY FxBool FX_CALL -grSstVRetraceOn( void ); - -FX_ENTRY FxBool FX_CALL -grSstIsBusy( void ); -#endif /* !GLIDE3_ALPHA */ - -FX_ENTRY FxBool FX_CALL -grSstWinOpen( - FxU32 hWnd, - GrScreenResolution_t screen_resolution, - GrScreenRefresh_t refresh_rate, - GrColorFormat_t color_format, - GrOriginLocation_t origin_location, - int nColBuffers, - int nAuxBuffers); - -FX_ENTRY void FX_CALL -grSstWinClose( void ); - -FX_ENTRY FxBool FX_CALL -grSstControl( FxU32 code ); - -#ifndef GLIDE3_ALPHA -FX_ENTRY FxBool FX_CALL -grSstQueryHardware( GrHwConfiguration *hwconfig ); - -FX_ENTRY FxBool FX_CALL -grSstQueryBoards( GrHwConfiguration *hwconfig ); -#endif /* !GLIDE3_ALPHA */ - -FX_ENTRY void FX_CALL -grSstOrigin(GrOriginLocation_t origin); - -FX_ENTRY void FX_CALL -grSstSelect( int which_sst ); - -#ifndef GLIDE3_ALPHA -FX_ENTRY FxU32 FX_CALL -grSstScreenHeight( void ); - -FX_ENTRY FxU32 FX_CALL -grSstScreenWidth( void ); - -FX_ENTRY FxU32 FX_CALL -grSstStatus( void ); -#endif /* !GLIDE3_ALPHA */ - -/* -** Drawing Statistics -*/ -#ifndef GLIDE3_ALPHA -FX_ENTRY void FX_CALL -grSstPerfStats(GrSstPerfStats_t *pStats); - -FX_ENTRY void FX_CALL -grSstResetPerfStats(void); -#endif /* !GLIDE3_ALPHA */ - -FX_ENTRY void FX_CALL -grResetTriStats(); - -FX_ENTRY void FX_CALL -grTriStats(FxU32 *trisProcessed, FxU32 *trisDrawn); - -/* -** Glide configuration and special effect maintenance functions -*/ -FX_ENTRY void FX_CALL -grAlphaBlendFunction( - GrAlphaBlendFnc_t rgb_sf, GrAlphaBlendFnc_t rgb_df, - GrAlphaBlendFnc_t alpha_sf, GrAlphaBlendFnc_t alpha_df - ); - -FX_ENTRY void FX_CALL -grAlphaCombine( - GrCombineFunction_t function, GrCombineFactor_t factor, - GrCombineLocal_t local, GrCombineOther_t other, - FxBool invert - ); - -FX_ENTRY void FX_CALL -grAlphaControlsITRGBLighting( FxBool enable ); - -FX_ENTRY void FX_CALL -grAlphaTestFunction( GrCmpFnc_t function ); - -FX_ENTRY void FX_CALL -grAlphaTestReferenceValue( GrAlpha_t value ); - -FX_ENTRY void FX_CALL -grChromakeyMode( GrChromakeyMode_t mode ); - -FX_ENTRY void FX_CALL -grChromakeyValue( GrColor_t value ); - -FX_ENTRY void FX_CALL -grClipWindow( FxU32 minx, FxU32 miny, FxU32 maxx, FxU32 maxy ); - -FX_ENTRY void FX_CALL -grColorCombine( - GrCombineFunction_t function, GrCombineFactor_t factor, - GrCombineLocal_t local, GrCombineOther_t other, - FxBool invert ); - -FX_ENTRY void FX_CALL -grColorMask( FxBool rgb, FxBool a ); - -FX_ENTRY void FX_CALL -grCullMode( GrCullMode_t mode ); - -FX_ENTRY void FX_CALL -grConstantColorValue( GrColor_t value ); - -FX_ENTRY void FX_CALL -grConstantColorValue4( float a, float r, float g, float b ); - -FX_ENTRY void FX_CALL -grDepthBiasLevel( FxI16 level ); - -FX_ENTRY void FX_CALL -grDepthBufferFunction( GrCmpFnc_t function ); - -FX_ENTRY void FX_CALL -grDepthBufferMode( GrDepthBufferMode_t mode ); - -FX_ENTRY void FX_CALL -grDepthMask( FxBool mask ); - -FX_ENTRY void FX_CALL -grDisableAllEffects( void ); - -FX_ENTRY void FX_CALL -grDitherMode( GrDitherMode_t mode ); - -FX_ENTRY void FX_CALL -grFogColorValue( GrColor_t fogcolor ); - -FX_ENTRY void FX_CALL -grFogMode( GrFogMode_t mode ); - -FX_ENTRY void FX_CALL -grFogTable( const GrFog_t ft[] ); - -FX_ENTRY void FX_CALL -grGammaCorrectionValue( float value ); - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -FX_ENTRY void FX_CALL -grLoadGammaTable( FxU32 nentries, FxU32 *red, FxU32 *green, FxU32 *blue); -#endif - -FX_ENTRY void FX_CALL -grSplash(float x, float y, float width, float height, FxU32 frame); - -#ifdef GLIDE3 -FX_ENTRY FxBool FX_CALL -grGet( FxU32 pname, FxU32 plength, FxI32 *params ); - -FX_ENTRY const char * FX_CALL -grGetString( FxU32 pname ); - -FX_ENTRY FxBool FX_CALL -grReset( FxU32 what ); - -FX_ENTRY GrProc FX_CALL -grGetProcAddress( char *procName ); - -FX_ENTRY void FX_CALL -grEnable( GrEnableMode_t mode ); - -FX_ENTRY void FX_CALL -grDisable( GrEnableMode_t mode ); - -FX_ENTRY void FX_CALL -grCoordinateSpace( GrCoordinateSpaceMode_t mode ); - -FX_ENTRY void FX_CALL -grDepthRange( FxFloat n, FxFloat f ); - -FX_ENTRY void FX_CALL -grViewport( FxI32 x, FxI32 y, FxI32 width, FxI32 height ); - -#endif -/* -** texture mapping control functions -*/ -FX_ENTRY FxU32 FX_CALL -grTexCalcMemRequired( - GrLOD_t lodmin, GrLOD_t lodmax, - GrAspectRatio_t aspect, GrTextureFormat_t fmt); - -FX_ENTRY FxU32 FX_CALL -grTexTextureMemRequired( FxU32 evenOdd, - GrTexInfo *info ); - -FX_ENTRY FxU32 FX_CALL -grTexMinAddress( GrChipID_t tmu ); - - -FX_ENTRY FxU32 FX_CALL -grTexMaxAddress( GrChipID_t tmu ); - - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -FX_ENTRY void FX_CALL -grTexNCCTable( GrNCCTable_t table ); -#else -FX_ENTRY void FX_CALL -grTexNCCTable( GrChipID_t tmu, GrNCCTable_t table ); -#endif - -FX_ENTRY void FX_CALL -grTexSource( GrChipID_t tmu, - FxU32 startAddress, - FxU32 evenOdd, - GrTexInfo *info ); - -FX_ENTRY void FX_CALL -grTexClampMode( - GrChipID_t tmu, - GrTextureClampMode_t s_clampmode, - GrTextureClampMode_t t_clampmode - ); - -FX_ENTRY void FX_CALL -grTexCombine( - GrChipID_t tmu, - GrCombineFunction_t rgb_function, - GrCombineFactor_t rgb_factor, - GrCombineFunction_t alpha_function, - GrCombineFactor_t alpha_factor, - FxBool rgb_invert, - FxBool alpha_invert - ); - -#ifndef GLIDE3_ALPHA -FX_ENTRY void FX_CALL -grTexCombineFunction( - GrChipID_t tmu, - GrTextureCombineFnc_t fnc - ); -#endif - -FX_ENTRY void FX_CALL -grTexDetailControl( - GrChipID_t tmu, - int lod_bias, - FxU8 detail_scale, - float detail_max - ); - -FX_ENTRY void FX_CALL -grTexFilterMode( - GrChipID_t tmu, - GrTextureFilterMode_t minfilter_mode, - GrTextureFilterMode_t magfilter_mode - ); - - -FX_ENTRY void FX_CALL -grTexLodBiasValue(GrChipID_t tmu, float bias ); - -FX_ENTRY void FX_CALL -grTexDownloadMipMap( GrChipID_t tmu, - FxU32 startAddress, - FxU32 evenOdd, - GrTexInfo *info ); - -FX_ENTRY void FX_CALL -grTexDownloadMipMapLevel( GrChipID_t tmu, - FxU32 startAddress, - GrLOD_t thisLod, - GrLOD_t largeLod, - GrAspectRatio_t aspectRatio, - GrTextureFormat_t format, - FxU32 evenOdd, - void *data ); - -FX_ENTRY void FX_CALL -grTexDownloadMipMapLevelPartial( GrChipID_t tmu, - FxU32 startAddress, - GrLOD_t thisLod, - GrLOD_t largeLod, - GrAspectRatio_t aspectRatio, - GrTextureFormat_t format, - FxU32 evenOdd, - void *data, - int start, - int end ); - - -FX_ENTRY void FX_CALL -ConvertAndDownloadRle( 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); - -FX_ENTRY void FX_CALL -grCheckForRoom(FxI32 n); - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -FX_ENTRY void FX_CALL -grTexDownloadTable( GrTexTable_t type, - void *data ); - -FX_ENTRY void FX_CALL -grTexDownloadTablePartial( GrTexTable_t type, - void *data, - int start, - int end ); -#else -FX_ENTRY void FX_CALL -grTexDownloadTable( GrChipID_t tmu, - GrTexTable_t type, - void *data ); - -FX_ENTRY void FX_CALL -grTexDownloadTablePartial( GrChipID_t tmu, - GrTexTable_t type, - void *data, - int start, - int end ); -#endif - -FX_ENTRY void FX_CALL -grTexMipMapMode( GrChipID_t tmu, - GrMipMapMode_t mode, - FxBool lodBlend ); - -FX_ENTRY void FX_CALL -grTexMultibase( GrChipID_t tmu, - FxBool enable ); - -FX_ENTRY void FX_CALL -grTexMultibaseAddress( GrChipID_t tmu, - GrTexBaseRange_t range, - FxU32 startAddress, - FxU32 evenOdd, - GrTexInfo *info ); - -/* -** utility texture functions -*/ - -#ifndef GLIDE3_ALPHA -FX_ENTRY GrMipMapId_t FX_CALL -guTexAllocateMemory( - GrChipID_t tmu, - FxU8 odd_even_mask, - 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 minfilter_mode, - GrTextureFilterMode_t magfilter_mode, - float lod_bias, - FxBool trilinear - ); - -FX_ENTRY FxBool FX_CALL -guTexChangeAttributes( - 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 - ); - -FX_ENTRY void FX_CALL -guTexCombineFunction( - GrChipID_t tmu, - GrTextureCombineFnc_t fnc - ); - -FX_ENTRY GrMipMapId_t FX_CALL -guTexGetCurrentMipMap( GrChipID_t tmu ); - -FX_ENTRY GrMipMapInfo * FX_CALL -guTexGetMipMapInfo( GrMipMapId_t mmid ); - -FX_ENTRY FxU32 FX_CALL -guTexMemQueryAvail( GrChipID_t tmu ); - -FX_ENTRY void FX_CALL -guTexMemReset( void ); - -FX_ENTRY void FX_CALL -guTexDownloadMipMap( - GrMipMapId_t mmid, - const void *src, - const GuNccTable *table - ); - -FX_ENTRY void FX_CALL -guTexDownloadMipMapLevel( - GrMipMapId_t mmid, - GrLOD_t lod, - const void **src - ); -FX_ENTRY void FX_CALL -guTexSource( GrMipMapId_t id ); -#endif /* !GLIDE3_ALPHA */ - -/* -** linear frame buffer functions -*/ - -FX_ENTRY FxBool FX_CALL -grLfbLock( GrLock_t type, GrBuffer_t buffer, GrLfbWriteMode_t writeMode, - GrOriginLocation_t origin, FxBool pixelPipeline, - GrLfbInfo_t *info ); - -FX_ENTRY FxBool FX_CALL -grLfbUnlock( GrLock_t type, GrBuffer_t buffer ); - -FX_ENTRY void FX_CALL -grLfbConstantAlpha( GrAlpha_t alpha ); - -FX_ENTRY void FX_CALL -grLfbConstantDepth( FxU16 depth ); - -FX_ENTRY void FX_CALL -grLfbWriteColorSwizzle(FxBool swizzleBytes, FxBool swapWords); - -FX_ENTRY void FX_CALL -grLfbWriteColorFormat(GrColorFormat_t colorFormat); - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -FX_ENTRY FxBool FX_CALL -grLfbWriteRegion( GrBuffer_t dst_buffer, - FxU32 dst_x, FxU32 dst_y, - GrLfbSrcFmt_t src_format, - FxU32 src_width, FxU32 src_height, - FxBool pixelPipeline, - FxI32 src_stride, void *src_data ); -#else -FX_ENTRY FxBool FX_CALL -grLfbWriteRegion( GrBuffer_t dst_buffer, - FxU32 dst_x, FxU32 dst_y, - GrLfbSrcFmt_t src_format, - FxU32 src_width, FxU32 src_height, - FxI32 src_stride, void *src_data ); -#endif - -FX_ENTRY FxBool FX_CALL -grLfbReadRegion( GrBuffer_t src_buffer, - FxU32 src_x, FxU32 src_y, - FxU32 src_width, FxU32 src_height, - FxU32 dst_stride, void *dst_data ); - - -/* -** Antialiasing Functions -*/ - -#ifndef GLIDE3_ALPHA - -FX_ENTRY void FX_CALL -grAADrawLine(const GrVertex *v1, const GrVertex *v2); - -FX_ENTRY void FX_CALL -grAADrawPoint(const GrVertex *pt ); - -FX_ENTRY void FX_CALL -grAADrawPolygon(const int nverts, const int ilist[], const GrVertex vlist[]); - -FX_ENTRY void FX_CALL -grAADrawPolygonVertexList(const int nverts, const GrVertex vlist[]); -#endif /* !GLIDE3_ALPHA */ - -FX_ENTRY void FX_CALL -grAADrawTriangle( - const GrVertex *a, const GrVertex *b, const GrVertex *c, - FxBool ab_antialias, FxBool bc_antialias, FxBool ca_antialias - ); - -/* -** glide management functions -*/ -FX_ENTRY void FX_CALL -grGlideInit( void ); - -FX_ENTRY void FX_CALL -grGlideShutdown( void ); - -#ifndef GLIDE3_ALPHA -FX_ENTRY void FX_CALL -grGlideGetVersion( char version[80] ); -#endif /* !GLIDE3_ALPHA */ - -FX_ENTRY void FX_CALL -grGlideGetState( GrState *state ); - -FX_ENTRY void FX_CALL -grGlideSetState( const GrState *state ); - -#ifndef GLIDE3_ALPHA -FX_ENTRY void FX_CALL -grGlideShamelessPlug(const FxBool on); - -FX_ENTRY void FX_CALL -grHints(GrHint_t hintType, FxU32 hintMask); -#endif /* !GLIDE3_ALPHA */ - -#ifdef GLIDE3 -FX_ENTRY void FX_CALL -grVertexLayout(FxU32 param, FxI32 offset, FxU32 mode); - -FX_ENTRY void FX_CALL -grDrawVertexArray(FxU32 mode, FxU32 Count, void *pointers); - -FX_ENTRY void FX_CALL -grDrawVertexArrayLinear(FxU32 mode, FxU32 Count, void *pointers, FxU32 stride); - -FX_ENTRY void FX_CALL -grDrawVertexArrayLinear(FxU32 mode, FxU32 Count, void *pointers, FxU32 stride); - -#endif - -#endif /* FX_GLIDE_NO_FUNC_PROTO */ - -#ifdef __cplusplus -} -#endif - -#include - -#endif /* __GLIDE_H__ */ diff --git a/glide2x/cvg/glide/src/glide.rc b/glide2x/cvg/glide/src/glide.rc deleted file mode 100644 index dc75c5f..0000000 --- a/glide2x/cvg/glide/src/glide.rc +++ /dev/null @@ -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 -#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. 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 diff --git a/glide2x/cvg/glide/src/glidesys.h b/glide2x/cvg/glide/src/glidesys.h deleted file mode 100644 index feefa41..0000000 --- a/glide2x/cvg/glide/src/glidesys.h +++ /dev/null @@ -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__ */ diff --git a/glide2x/cvg/glide/src/glideutl.h b/glide2x/cvg/glide/src/glideutl.h deleted file mode 100644 index e578740..0000000 --- a/glide2x/cvg/glide/src/glideutl.h +++ /dev/null @@ -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__ */ diff --git a/glide2x/cvg/glide/src/gmovie.c b/glide2x/cvg/glide/src/gmovie.c deleted file mode 100644 index 04ad996..0000000 --- a/glide2x/cvg/glide/src/gmovie.c +++ /dev/null @@ -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 - -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include -#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 ); -} diff --git a/glide2x/cvg/glide/src/gpci.c b/glide2x/cvg/glide/src/gpci.c deleted file mode 100644 index 31787fb..0000000 --- a/glide2x/cvg/glide/src/gpci.c +++ /dev/null @@ -1,629 +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$ -** -** 110 6/30/98 6:08p Jeske -** fixed bug where we tried to setup MTRRs on old ( 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 -#include - -#include <3dfx.h> -#include - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -/*------------------------------------------------------------------- - 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 >= 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 >= 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 -#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 - - _GlideRoot.CPUType = _cpu_detect_asm(); - if (GETENV("FX_CPU")) _GlideRoot.CPUType = atoi(GETENV("FX_CPU")); - - /* 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.disableDitherSub = (GETENV("FX_GLIDE_NO_DITHER_SUB") != 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); - - 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 */ diff --git a/glide2x/cvg/glide/src/gsplash.c b/glide2x/cvg/glide/src/gsplash.c deleted file mode 100644 index 70ad877..0000000 --- a/glide2x/cvg/glide/src/gsplash.c +++ /dev/null @@ -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 - -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include - -#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); - -} - diff --git a/glide2x/cvg/glide/src/gsst.c b/glide2x/cvg/glide/src/gsst.c deleted file mode 100644 index 79c1e3e..0000000 --- a/glide2x/cvg/glide/src/gsst.c +++ /dev/null @@ -1,2069 +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. -** -** -** 168 6/30/98 6:08p Jeske -** fixed bug where we tried to setup MTRRs on old (curRenderBuf for clarity -** -** 118 1/24/98 12:29p Peter -** more caching fun -** -** 117 1/20/98 11:03a Peter -** env var to force triple buffering - * - * 116 1/16/98 4:18p Atai - * fixed lfb and grLoadGammaTable - * - * 115 1/16/98 10:47a Peter - * fixed idle muckage - * - * 114 1/16/98 10:16a Atai - * fixed grSstIldle - * - * 113 1/10/98 4:01p Atai - * inititialize vertex layout, viewport, added defines - * - * 110 1/06/98 6:47p Atai - * undo grSplash and remove gu routines - * - * 109 1/06/98 3:53p Atai - * remove grHint, modify grLfbWriteRegion and grGet - * - * 107 12/18/97 2:12p Peter - * grSstControl on v2 - * - * 106 12/17/97 4:48p Peter - * groundwork for CrybabyGlide - * - * 105 12/17/97 4:06p Atai - * added grChromaRange(), grGammaCorrecionRGB(), grRest(), and grGet() - * functions - * - * 104 12/16/97 1:33p Atai - * added grGammaCorrectionRGB() - * - * 103 12/16/97 10:03a Atai - * fixed gutexmemreset for glide2 - * - * 101 12/09/97 12:20p Peter - * mac glide port - * - * 100 12/05/97 4:26p Peter - * watcom warnings - * - * 99 12/03/97 11:35a Peter - * is busy thing - * - * 98 11/25/97 12:09p Peter - * nested calls to grLfbLock vs init code locking on v2 - * - * 97 11/21/97 1:02p Peter - * v^2 supported resolutions - * - * 96 11/21/97 11:19a Dow - * Added RESOLUTION_NONE hack for Banshee - * - * 95 11/19/97 2:49p Peter - * env vars in registry for win32 - * - * 94 11/19/97 2:22p Dow - * gsst.c - * - * 93 11/18/97 4:50p Peter - * chipfield stuff cleanup and w/ direct writes - * - * 92 11/18/97 4:00p Atai - * fixed the GR_BEGIN and GR_END error in previous check-in - * - * 91 11/18/97 3:27p Atai - * update vData - * optimize state monster - * - * 90 11/17/97 4:55p Peter - * watcom warnings/chipfield stuff - * - * 89 11/16/97 2:20p Peter - * cleanup - * - * 88 11/15/97 7:43p Peter - * more comdex silliness - * - * 87 11/14/97 11:10p Peter - * open vs hw init confusion - * - * 86 11/14/97 5:02p Peter - * more comdex stuff - * - * 85 11/14/97 4:47p Dow - * New splash screen - * - * 84 11/14/97 12:09a Peter - * comdex thing and some other stuff - * - * 83 11/12/97 9:37p Dow - * Banshee crap - * - * 82 11/12/97 2:27p Peter - * - * 81 11/12/97 1:09p Dow - * H3 Stuf - * - * 80 11/12/97 9:22a Dow - * H3 Mods - * - * 79 11/06/97 3:46p Peter - * sli shutdown problem - * - * 78 11/06/97 3:38p Dow - * More banshee stuff - * - * 77 11/04/97 5:04p Peter - * cataclysm part deux - * - * 76 11/04/97 3:58p Dow - * Banshee stuff - * - * 75 11/03/97 3:43p Peter - * h3/cvg cataclysm - * - * 74 10/29/97 4:59p Peter - * - * 73 10/29/97 2:45p Peter - * C version of Taco's packing code - * - * 72 10/23/97 5:28p Peter - * sli fifo thing - * - * 71 10/17/97 3:15p Peter - * grSstVidMode thingee - * - * 70 10/14/97 2:44p Peter - * moved close flag set - * - * 69 10/09/97 8:02p Dow - * State Monster 1st Cut - * -** -*/ - -#include -#include -#include <3dfx.h> - -#include - -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) -#include -#endif - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) -#define WIN32_LEAN_AND_MEAN -#include -#endif - -/*------------------------------------------------------------------- - Function: grSstWinOpen - Date: 3/16 - Implementor(s): dow, gmt, murali, jdt - Mutator: dpc - Library: Glide - Description: - - Initialize the selected SST - - Initialization has 4 Steps - - Video Init - - In the full screen case this includes setting the requested - resolution/refresh state and allocating any necessary OS - resource for the GC. - - In the windowed case, this involves acquiring all necessary - surfaces for rendering, back buffer and memory fifo - - Also perform any work necessary to enable access to 3D - registers - - Command Transport Init: - Assuming video registers are in a reset state, initialize - the appropriate command transport mechanism. All writes - to hardware prior to this action are direct writes, - afterwards, most commands will go throught the command - transport - - GC Init - - Initialize the current GC based on the user requested - open parameters and command transport data reported - during initialization. - - 3D State Init - - Push an initial state onto all of the 3D state registers. - - Arguments: - hwnd - pointer to a window handle or null. If NULL, then - the application window handle will be inferred though - the GetActiveWindow() api. - resolution - either one of the pre-defined glide resolutions, - or GR_RESOLUTION_NONE, in which case the window - size is inferred from the size application window - refresh - requested fullscreen refresh rate, ignored in a window - format - requested ccolor format for glide packed color values - origin - location of coordinate origin either upper left or - lower right - nColBuffers - number of color buffers to attempt to allocate - 0 - meaningless - 1 - allocate a front buffer only - 2 - allocate a front and back buffer - 3 - allocate a front, back, aux buffer for tripple buffering - nAuxBuffers - number of aux buffers to attempt to allocate - 0 - no alpha or z buffers - 1 - allocate one aux buffer for alpha/depth buffering - 2 - allocate on depth and one alpha buffer (unsup) - Return: - FXTRUE - glide successfully acquired the necessary resources and a - is ready for rendering - FXFALSE - glide was unsuccessful in getting the necessary resources, - or the requested configuration is unavailble on the host - hardware - any calls to glide rendering routines will result - in undefined behavior. - -------------------------------------------------------------------*/ -GR_ENTRY(grSstWinOpen, FxBool, ( - FxU32 hWnd, - GrScreenResolution_t resolution, - GrScreenRefresh_t refresh, - GrColorFormat_t format, - GrOriginLocation_t origin, - int nColBuffers, - int nAuxBuffers)) -{ -#define FN_NAME "grSstWinOpen" - FxBool rv = FXTRUE; - int tmu; - int xres = 0, yres = 0, fbStride; - FxDeviceInfo devInfo; -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) - sst1VideoTimingStruct *sstVideoRez = NULL, tvVidtiming; - FxBool tv_swap_board = FXFALSE; -#endif - - GR_BEGIN_NOFIFOCHECK("grSstWinOpen",80); - GDBG_INFO_MORE(gc->myLevel, - "(rez=%d,ref=%d,cformat=%d,origin=%s,#bufs=%d, #abufs=%d)\n", - resolution,refresh,format, - origin ? "LL" : "UL", - nColBuffers, nAuxBuffers); - GR_CHECK_F(FN_NAME, !gc, "no SST selected as current (gc==NULL)"); - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) - /* Voodoo^2 has a bug in sli mode where the video cannot really - * support resolutions less than 512x384 on pc monitors. Rather than - * saying sli is not fully compatible w/ single board systems the - * 'solution' is to just not allow these resolutions. - * - * NB: The current assumption here is taht if the user passes - * their own video timing structure then they know what the hell - * they are doing for some weird-ass arcade monitor. - */ - rv = !((gc->vidTimings == NULL) && - ((resolution < GR_RESOLUTION_512x384) || - (resolution == GR_RESOLUTION_512x256) || - (resolution == GR_RESOLUTION_400x300) || - (resolution == GR_RESOLUTION_NONE))); - if (!rv) { - GDBG_INFO(gc->myLevel, " Incompatible Voodoo^2 resolution.\n"); - goto BAILOUT; - } - -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) - GR_CHECK_COMPATABILITY(FN_NAME, - ((hWnd == 0x00UL) && (GetActiveWindow() == NULL)), - "A valid active window or hWnd parameter is required."); -#endif /* (GLIDE_PLATFORM & GLIDE_OS_WIN32) */ -#endif /* (GLIDE_PLATFORM & GLODE_HW_CVG) */ - -#if !GLIDE_INIT_HAL -__tryReOpen: - /* If we've been closed via grSstWinClose then we need to re-init - * the hw registers etc before init-ing video etc or bad ju-ju is - * in our future. - * - * NB: These are in the same order that they are done in the same - * order as in _grDetectResources. They should match, so don't mess - * it up. - */ - if (!gc->hwInitP) { - FxU32* sstRegs = NULL; - - rv = pciOpen(); - if (!rv) { - GDBG_INFO(gc->myLevel, "%s: pci bus could not be opened\n", FN_NAME); - goto BAILOUT; - } - - sstRegs = sst1InitMapBoard(_GlideRoot.current_sst); - rv = (sstRegs != NULL); - if (!rv) { - GDBG_INFO(gc->myLevel, "%s: re-map of board failed (0x%X : 0x%x)\n", - FN_NAME, sstRegs, gc->reg_ptr); - goto BAILOUT; - } - - /* Re-enabled write combining */ - if (_GlideRoot.CPUType >= 6) { - sst1InitCaching(sstRegs, FXTRUE); - } - - rv = sst1InitRegisters(sstRegs); - if (!rv) { - GDBG_INFO(gc->myLevel, "%s: Could not re-init hw registers\n", FN_NAME); - goto BAILOUT; - } - - /* Reset up pointers to the various address spaces within the hw - * since the hw base address can be different from the original - * map board. - */ - gc->base_ptr = (FxU32*)HW_BASE_PTR(sstRegs); - gc->reg_ptr = (FxU32*)HW_REG_PTR(sstRegs); - gc->lfb_ptr = (FxU32*)HW_LFB_PTR(sstRegs); - gc->tex_ptr = (FxU32*)HW_TEX_PTR(sstRegs); - - /* Make sure that the sli-slave gets re-initted too. - * - * NB: This makes the same assumption as the sli-pairing code - * that the sli slave is the next one discovered in the - * set of GC's. - */ - if (gc->scanline_interleaved) { - sstRegs = sst1InitMapBoard(_GlideRoot.current_sst + 1); - rv = (sstRegs != NULL); - if (!rv) { - GDBG_INFO(gc->myLevel, "%s: Could not re-map slave.\n", FN_NAME); - goto BAILOUT; - } - - rv = sst1InitRegisters(sstRegs); - if (!rv) { - GDBG_INFO(gc->myLevel, "%s: Could not re-init slave registers\n", FN_NAME); - goto BAILOUT; - } - - /* Reset up pointers to the various address spaces within the hw - * since the hw base address can be different from the original - * map board. - */ - (gc + 1)->base_ptr = (FxU32*)HW_BASE_PTR(sstRegs); - (gc + 1)->reg_ptr = (FxU32*)HW_REG_PTR(sstRegs); - (gc + 1)->lfb_ptr = (FxU32*)HW_LFB_PTR(sstRegs); - (gc + 1)->tex_ptr = (FxU32*)HW_TEX_PTR(sstRegs); - - gc->slave_ptr = sstRegs; - } - - gc->hwInitP = FXTRUE; - } else if (gc->open) { - /* If this device is already open then it is probably an error to - * call grSstWinOpen again. Rather than letting all hell break - * loose as we re-init the video and (especially) command fifo - * shutdown the hw and do a full re-init. - * - * NB: This is here for TombRaider which is not going to be reved - * as far as I know. - */ - GR_CHECK_COMPATABILITY(FN_NAME, gc->open, "This context is already open"); - grSstWinClose(); - goto __tryReOpen; - } -#endif /* !GLIDE_INIT_HAL */ - -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) - /* - ** load fxoem2x.dll and map board - */ - { - gc->oemInit = NULL; - rv = sst1InitGetDeviceInfo(gc->reg_ptr, &devInfo); - if (rv) { - char* boardIDStr; - FxU32 boardID; - char* requireOEMDLLStr; - FxU32 requireOEMDLL; - - gc->oemi.version = OEMINIT_VERSION; - gc->oemi.vendorID = devInfo.vendorID; - gc->oemi.subvendorID = OEMINIT_INVALID_BOARD_ID; - gc->oemi.deviceID = devInfo.deviceID; - gc->oemi.boardID = devInfo.fbiBoardID | (devInfo.fbiConfig << FX_OEM_FBI_CONFIG_SHIFT); - gc->oemi.linearAddress = gc->base_ptr; - gc->oemi.slaveAddress = gc->slave_ptr; - gc->oemi.fxoemPciWriteConfig = (PciConfigProc)pciSetConfigData; - gc->oemi.fxoemPciReadConfig = (PciConfigProc)pciGetConfigData; - - boardIDStr = GETENV("FX_GLIDE_BOARDID"); - boardID = (boardIDStr == NULL) ? 0 : atol(boardIDStr); - if ((boardID) && (devInfo.fbiBoardID != boardID)) { - /* if boardID is defined and does not match */ - GrErrorCallback("Undefined boardID", FXTRUE); - grSstWinClose(); - exit(0); - } - - requireOEMDLLStr = GETENV("FX_GLIDE_REQUIREOEMDLL"); - requireOEMDLL = (requireOEMDLLStr == NULL) ? 0 : atol(requireOEMDLLStr); - if (requireOEMDLL == GR_SKIP_OEMDLL) { - /* skip oem dll */ - gc->oemInit = NULL; - } - else if (requireOEMDLL == GR_NO_OEMDLL) { - /* no oemdll is allowed */ - gc->oemInit = LoadLibrary("fxoem2x.dll"); - if (gc->oemInit) { - GrErrorCallback("Please remove fxoem2x.dll", FXTRUE); - grSstWinClose(); - exit(0); - } - } - else if ( requireOEMDLL == 0) { - /* FX_GLIDE_REQUIREOEMDLL is not defined, load oemdll if it exist */ - gc->oemInit = LoadLibrary("fxoem2x.dll"); - } - else { - /* oem dll is required */ - gc->oemInit = LoadLibrary("fxoem2x.dll"); - if (gc->oemInit == NULL) { - GrErrorCallback("Missing fxoem2x.dll", FXTRUE); - grSstWinClose(); - exit(0); - } - } - - /* - ** oem map board - */ - if (gc->oemInit) { - FARPROC oemInitMapBoard = NULL; - oemInitMapBoard = GetProcAddress(gc->oemInit, "_fxoemInitMapBoard@4"); - if (oemInitMapBoard != NULL) - oemInitMapBoard(&gc->oemi); - else - gc->oemInit = NULL; - } - } - else { - GDBG_INFO(gc->myLevel, " XXXGetDeviceInfo failed. (0x%X)\n", gc->reg_ptr); - goto BAILOUT; - } - } -#endif /* (GLIDE_PLATFORM & GLIDE_OS_WIN32) */ - - /*------------------------------------------------------ - Video Init - ------------------------------------------------------*/ -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) - /* - ** initialize video timing data for oemdll - ** if tv out component exist, the oem dll need to modify the vidtiming - ** data in oemi. Glide will take the changes and pass it to - ** sst1InitVideoBuffers() - */ - { - if((gc->oemInit) && (sstVideoRez = sst1InitFindVideoTimingStruct(resolution, refresh))) { - tvVidtiming = *sstVideoRez; - gc->oemi.vid.res = resolution; - gc->oemi.vid.refresh = refresh; - gc->oemi.vid.depth = 16; - gc->oemi.vid.hSyncOn = tvVidtiming.hSyncOn; - gc->oemi.vid.hSyncOff = tvVidtiming.hSyncOff; - gc->oemi.vid.vSyncOn = tvVidtiming.vSyncOn; - gc->oemi.vid.vSyncOff = tvVidtiming.vSyncOff; - gc->oemi.vid.hBackPorch = tvVidtiming.hBackPorch; - gc->oemi.vid.vBackPorch = tvVidtiming.vBackPorch; - gc->oemi.vid.xDimension = tvVidtiming.xDimension; - gc->oemi.vid.yDimension = tvVidtiming.yDimension; - gc->oemi.vid.clkFreq16bpp = tvVidtiming.clkFreq16bpp; - gc->oemi.vid.clkFreq24bpp = tvVidtiming.clkFreq24bpp; - - if (gc->oemInit) { - FARPROC oemInitVideoTiming = NULL; - if (oemInitVideoTiming = GetProcAddress(gc->oemInit, "_fxoemInitVideoTiming@4")) { - if (oemInitVideoTiming(&gc->oemi.vid)) { - /* - ** video timing is updated by oem dll - */ - tvVidtiming.hSyncOn = gc->oemi.vid.hSyncOn; - tvVidtiming.hSyncOff = gc->oemi.vid.hSyncOff; - tvVidtiming.vSyncOn = gc->oemi.vid.vSyncOn; - tvVidtiming.vSyncOff = gc->oemi.vid.vSyncOff; - tvVidtiming.hBackPorch = gc->oemi.vid.hBackPorch; - tvVidtiming.vBackPorch = gc->oemi.vid.vBackPorch; - tvVidtiming.xDimension = gc->oemi.vid.xDimension; - tvVidtiming.yDimension = gc->oemi.vid.yDimension; - tvVidtiming.clkFreq16bpp = gc->oemi.vid.clkFreq16bpp; - tvVidtiming.clkFreq24bpp = gc->oemi.vid.clkFreq24bpp; - refresh = tvVidtiming.refreshRate = gc->oemi.vid.refresh; - grSstVidMode(_GlideRoot.current_sst, &tvVidtiming); - } - } - } - } - } -#endif /* (GLIDE_PLATFORM & GLIDE_OS_WIN32) */ - -#if GLIDE_INIT_HAL - { - GDBG_INFO(gc->myLevel, " HAL Video Init\n"); - - rv = fxHalInitVideo((SstRegs*)gc->reg_ptr, - ((resolution == GR_RESOLUTION_NONE) - ? GR_RESOLUTION_640x480 - : resolution), - refresh, - NULL); - if (!rv) goto BAILOUT; - } -#else - GDBG_INFO(gc->myLevel, " Video Init\n"); - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) - /* CVG cannot just do one color buffer (Well, I guess it could, but - * not if you have the aux buffer too) so just force the allocation - * of two buffers. This does have consequences for swap since we - * need to ignore them too. - */ - gc->hwDep.cvgDep.singleBufferP = (nColBuffers == 1); - if (gc->hwDep.cvgDep.singleBufferP) nColBuffers = 2; -#endif /* (GLIDE_PLATFORM & GLIDE_HW_CVG) */ - - /* If the user has buffer allocation set in their environment. Try - * those settings before trying the actual program settings. - * - * NB: We cannot fail the allocation on the env settings since the - * user could have messed up and set something ridiculous. - */ - { - FxI32 curColorBuffers = ((_GlideRoot.environment.nColorBuffer == -1L) - ? nColBuffers - : _GlideRoot.environment.nColorBuffer); - FxI32 curAuxBuffers = ((_GlideRoot.environment.nAuxBuffer == -1L) - ? nAuxBuffers - : _GlideRoot.environment.nAuxBuffer); - FxBool triedParamsP; - - do { - triedParamsP = ((curColorBuffers == nColBuffers) && - (curAuxBuffers == nAuxBuffers)); - - rv = sst1InitVideoBuffers(gc->reg_ptr, - resolution, refresh, - ((curColorBuffers == 1) ? 2 : curColorBuffers), - curAuxBuffers, - gc->vidTimings, - FXTRUE); - if (!rv && !triedParamsP) { - curColorBuffers = nColBuffers; - curAuxBuffers = nAuxBuffers; - } - } while(!rv && !triedParamsP); - - /* Reset the parameters for the possible sli-slave video init and - * internal bookkeeping. - */ - nColBuffers = curColorBuffers; - nAuxBuffers = curAuxBuffers; - } - - /* If sli is on then we need to init the slave board's video */ - if (rv && gc->scanline_interleaved) { - rv = (gc->slave_ptr != NULL); - if (!rv) { - GDBG_INFO(gc->myLevel, " Invalid slave base address.\n"); - goto __errSliExit; - } - - rv = sst1InitVideoBuffers(gc->slave_ptr, - resolution, refresh, - nColBuffers, nAuxBuffers, - gc->vidTimings, - FXTRUE); - if (!rv) { - GDBG_INFO(gc->myLevel, " sst1InitVideoBuffers failed for sli slave.\n"); - goto __errSliExit; - } - } - -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) - /* - ** initialize oem vedio after master and slave board - */ - if (gc->oemInit) { - FARPROC oemInitSetVideo = NULL; - FARPROC oemGet; - FxI32 tv_connected = 0; - FxI32 slimaster[2], slislave[2]; - if (oemInitSetVideo = GetProcAddress(gc->oemInit, "_fxoemInitSetVideo@4")) - oemInitSetVideo(&gc->oemi); - - if (oemGet = GetProcAddress(gc->oemInit, "_fxoemGet@12")) { - oemGet(FX_OEM_TVOUT, 4, &tv_connected); - /* Is tv connected to the board? */ - if (tv_connected) { - oemGet(FX_OEM_SLIMASTER, 8, slimaster); - oemGet(FX_OEM_SLISLAVE, 8, slislave); - if (((FxU32 *)slimaster[1] == gc->slave_ptr) && - ((FxU32 *)slislave[1] == gc->base_ptr)) - tv_swap_board = FXTRUE; - else - tv_swap_board = FXFALSE; - } - } - } -#endif - - if (rv) { - /* Check to see that we have a monitor attached to the board taht we - * expect to be driving the video. There are two cases here: sli and - * non-sli. - * - * In the sli case we expect the master to be driving the video so if - * the slave has the monitor plugged into it then we swap the sense of - * the master and slave. - * - * In the non-sli case there are two sub-cases: the user does not - * have a monitor attached at all to the card (read: moron) or that - * they have explicitly disabled sli with the monitor plugged into - * the slave. In the moron case there's nothing we can do, except - * finish up the init and let the user deal w/ the fact that they - * can't see anything. In the sli-disable case we need to initialize - * the video of the would be slave (this was not done before since - * sli was not auto-detected by the init code), swap the sense of - * the boards and continue w/ the rest of the initialization. - * - * NB: The calls to sst1InitGetDeviceInfo *MUST* come after - * sst1InitVideoBuffers for each card since that is where the - * monitor detection is done. - */ - rv = sst1InitGetDeviceInfo(gc->reg_ptr, &devInfo); - if (!rv) { - GDBG_INFO(gc->myLevel, - " sst1InitGetDeviceInfo failed to determine master monitor connectivness.\n"); - goto __errSliExit; - } - if (!devInfo.monitorDetected) { - if (gc->scanline_interleaved) { - rv = sst1InitGetDeviceInfo(gc->slave_ptr, &devInfo); - if (!rv) { - GDBG_INFO(gc->myLevel, - " sst1InitGetDeviceInfo failed to determine slave monitor connectivness.\n"); - goto __errSliExit; - } - - rv = FXTRUE; - if (devInfo.monitorDetected) { - GDBG_INFO(gc->myLevel, " Swapping sli slave and master"); - } else { - /* no monitors attached. - * Just do the default init w/o any swapping. - */ -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) - /* - ** We need to check the if tv is connected. - ** If not, then there is no output. - */ - if (tv_swap_board) - GDBG_INFO(gc->myLevel, " TV is connected. Swapping sli slave and master"); - else -#endif - { - GDBG_INFO(gc->myLevel, " No monitor attached to slave or master.\n"); - goto __errSliExit; - } - } - } else { - if (!gc->sliPairP) { - /* If there isn't a next board then there is not output. */ - rv = FXTRUE; - goto __errSliExit; - } else -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) - if (!tv_swap_board) -#endif - { - /* Shutdown the logical master so that the new master will - * really own the video. - * - * NB: We don't have to shutdown the command fifo here since - * it is not on yet. - */ - { - sst1InitIdle(gc->base_ptr); - - /* Make sure that the caching is toggled. - * - * NB: The order of the caching changes is relevant here since - * we don't want to waste mtrr's, even briefly. - */ - if (_GlideRoot.CPUType >= 6) { - sst1InitCaching(gc->base_ptr, FXFALSE); - sst1InitCaching((gc + 1)->base_ptr, FXTRUE); - } - - sst1InitShutdown(gc->base_ptr); - - /* We want to let the oem that video has shutdown here so - * that they can do the 'right' thing when we re-init - * video w/ the current slave as the master. - * - * NB: However, we don't do this currently because it requires - * odd semantics to the calling conventions of the oem dll. - */ -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) && 0 - if (gc->oemInit) { - FARPROC oemRestoreVideo = GetProcAddress(gc->oemInit, "_fxoemRestoreVideo@4"); - if (oemRestoreVideo != NULL) oemRestoreVideo(&gc->oemi); - } -#endif /* (GLIDE_PLATFORM & GLIDE_OS_WIN32) */ - - gc->hwInitP = FXFALSE; - } - - /* dpc - 14 feb 1997 - HackAlert!!!! - * The sst1InitShutdown above will close the pci library which - * then prevents other pci library calls which we need to init - * video next. - */ - pciOpen(); - - /* Re-init the new master */ - { - FxU32* sstRegs = sst1InitMapBoard(_GlideRoot.current_sst + 1); - rv = (sstRegs != NULL); - if (!rv) { - GDBG_INFO(gc->myLevel, "%s: Could not re-map 'monitor swap slave'.\n", FN_NAME); - goto __errSliExit; - } - - rv = sst1InitRegisters(sstRegs); - if (!rv) { - GDBG_INFO(gc->myLevel, "%s: Could not re-init 'monitor swap slave' registers\n", FN_NAME); - goto __errSliExit; - } - - /* Reset up pointers to the various address spaces within the hw - * since the hw base address can be different from the original - * map board. - */ - (gc + 1)->base_ptr = (FxU32*)HW_BASE_PTR(sstRegs); - (gc + 1)->reg_ptr = (FxU32*)HW_REG_PTR(sstRegs); - (gc + 1)->lfb_ptr = (FxU32*)HW_LFB_PTR(sstRegs); - (gc + 1)->tex_ptr = (FxU32*)HW_TEX_PTR(sstRegs); - - /* We're done setting up the new master's hw */ - (gc + 1)->hwInitP = FXTRUE; - } - - rv = sst1InitVideoBuffers((gc + 1)->base_ptr, - resolution, refresh, - nColBuffers, nAuxBuffers, - gc->vidTimings, - FXTRUE); - if (!rv) { - GDBG_INFO(gc->myLevel, " sst1InitVideoBuffers failed for 'monitor swap slave'.\n"); - goto __errSliExit; - } - } - } - - /* Switch the senses of the master and slave in the gc's. - * - * NB: This only has to swap the hw addresses since the rest of - * the information has to be the same in order for the boards to - * be sli-able. - */ -#define SwapPtrVal(__a, __b) do { FxU32* temp = (__a); (__a) = (__b); (__b) = temp; } while(0); - SwapPtrVal(gc->base_ptr, (gc + 1)->base_ptr); - SwapPtrVal(gc->reg_ptr, (gc + 1)->reg_ptr); - SwapPtrVal(gc->tex_ptr, (gc + 1)->tex_ptr); - SwapPtrVal(gc->lfb_ptr, (gc + 1)->lfb_ptr); -#undef SwapPtrVal - - if (gc->scanline_interleaved) { - /* The slave pointer, however, needs to be set by hand again. */ - gc->slave_ptr = (gc + 1)->base_ptr; - (gc + 1)->slave_ptr = NULL; - - /* Swap the caching characteristics too. The old master is now - * the slave, and the old slave is now the master. The caching - * on the old master was set when the board was mapped the - * first time. - * - * NB: The order of the caching changes is relevant here since - * we don't want to waste mtrr's, even briefly. - */ - if (_GlideRoot.CPUType >= 6) { - sst1InitCaching(gc->slave_ptr, FXFALSE); - sst1InitCaching(gc->base_ptr, FXTRUE); - } - } - - /* Save that we swapped teh master sense so that we can - * restore these settings when we shut down. - */ - gc->swapMasterSenseP = FXTRUE; - -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) - /* NB: We need to make sure that the oem structure reflects the - * 'new' sense of the master/slave relationship. - */ - gc->oemi.linearAddress = gc->base_ptr; - gc->oemi.slaveAddress = gc->slave_ptr; - - /* re-initialize oem vedio for the board */ - if (gc->oemInit) { - FARPROC oemInitSetVideo = GetProcAddress(gc->oemInit, "_fxoemInitSetVideo@4"); - if (oemInitSetVideo != NULL) oemInitSetVideo(&gc->oemi); - } -#endif - } - } - - /* If we have an sli configuration then start it up. - * - * NB: There are two ways to get here. In the case that a monitor - * was detected we will get here straightline. If no monitors are - * detected (sli or no) we will get here via an error goto to - * the label __errSliExit. - */ -__errSliExit: - if (rv && gc->scanline_interleaved) { - rv = sst1InitSli(gc->reg_ptr, gc->slave_ptr); - if (!rv) { - GDBG_INFO(gc->myLevel, " sst1InitSli failed.\n"); - goto __errSliExit; - } - - /* If the user has not set FX_GLIDE_SWAPINTERVAL == 0 then - * override the swapInterval for grBufferSwap so that it always - * goes w/ vsync. Otherwise it can look bad as the boards swap out - * of sync w/ each other. - */ - if (_GlideRoot.environment.swapInterval < 0) _GlideRoot.environment.swapInterval = 1; - } - - /* Explicitly set the pass through address that the vxd will be - * using to toggle the passthrough. In sli mode this is the master, - * and otherwise it is the card driving the monitor's vidoe. - * Currently, we set this to be a 16mb address space. - */ -#if 0 - if (rv) pciSetPassThroughBase(gc->base_ptr, 0x1000000); -#endif -#endif - - if (!rv) goto BAILOUT; - - /* Doh! Don't forget to set the resolution conversions. */ - if (gc->vidTimings == NULL) { - switch(resolution) { -#if !(GLIDE_PLATFORM & GLIDE_HW_CVG) - case GR_RESOLUTION_320x200: - xres = 320; yres = 200; - break; - - case GR_RESOLUTION_320x240: - xres = 320; yres = 240; - break; - - case GR_RESOLUTION_400x256: - xres = 400; yres = 256; - break; -#endif /* !(GLIDE_PLATFORM & GLIDE_HW_CVG) */ - - case GR_RESOLUTION_512x384: - xres = 512; yres = 384; - break; - - case GR_RESOLUTION_640x200: - xres = 640; yres = 200; - break; - - case GR_RESOLUTION_640x350: - xres = 640; yres = 350; - break; - - case GR_RESOLUTION_640x400: - xres = 640; yres = 400; - break; - - case GR_RESOLUTION_640x480: - xres = 640; yres = 480; - break; - - case GR_RESOLUTION_800x600: - xres = 800; yres = 600; - break; - - case GR_RESOLUTION_960x720: - xres = 960; yres = 720; - break; - - case GR_RESOLUTION_856x480: - xres = 856; yres = 480; - break; - - case GR_RESOLUTION_512x256: - xres = 512; yres = 256; - break; - - case GR_RESOLUTION_1024x768: - xres = 1024; yres = 768; - break; - - case GR_RESOLUTION_1280x1024: - xres = 1280; yres = 1024; - break; - - case GR_RESOLUTION_1600x1200: - xres = 1600; yres = 1200; - break; - - default: - GR_ASSERT(0); - } - } else { - xres = gc->vidTimings->xDimension; - yres = gc->vidTimings->yDimension; - } - - /* Stash these, mostly for error checking type things */ - gc->grColBuf = nColBuffers; - gc->grAuxBuf = nAuxBuffers; - - /* The current init code always sets this to 1024. */ - fbStride = 1024; - - GDBG_INFO(gc->myLevel, - " Video init succeeded. xRes:%.04d yRes:%.04d nCol:%d nAux:%d\n", - xres, yres, gc->grColBuf, gc->grAuxBuf); - - /*------------------------------------------------------ - Command Transport Init - ------------------------------------------------------*/ - { -#if !((GLIDE_PLATFORM & GLIDE_HW_CVG)) - InitFIFOData fifoInfo; - - GDBG_INFO(gc->myLevel, " Command Transport Init\n"); - rv = initEnableTransport(&fifoInfo); - if (!rv) goto BAILOUT; -#endif - -#if ((GLIDE_PLATFORM & GLIDE_HW_H3) || (GLIDE_PLATFORM & GLIDE_HW_CVG)) - /* Place cmd fifo into fbi memory. There are actually two - * 'placements' here, hw memory and virtual address space. In hw - * memory, the fifo is placed after any buffers that the user has - * requested (color and aux). If there is any memory left after - * these buffer allocations, we grab it all, otherwise this is an - * error. In virtual address space, the fifo is always placed at - * HW_FIFO_OFFSET. - */ - { - FxU32 xTileNum = 0; - FxU32 fifoSize = 0x00UL; - -#if GLIDE_INIT_HAL - rv = fxHalGetDeviceInfo((SstRegs*)gc->reg_ptr, &devInfo); -#else - rv = sst1InitGetDeviceInfo(gc->base_ptr, &devInfo); -#endif - if (!rv) { - GDBG_INFO(gc->myLevel, " XXXGetDeviceInfo failed. (0x%X)\n", gc->reg_ptr); - goto BAILOUT; - } - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) - xTileNum = devInfo.fbiVideoTilesInX; -#endif - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) && GLIDE_BLIT_CLEAR - { - /* Cache the # of pages for video tiles in the x direction - * for use in grBufferClear (gglide.c). - */ - gc->hwDep.cvgDep.tileSlopP = ((xTileNum & 0x01) != 0x00); - gc->hwDep.cvgDep.xTilePages = (xTileNum >> 1); - - gc->hwDep.cvgDep.yTileShift = (gc->scanline_interleaved ? 6 : 5); - - /* Get the # of pages per buffer. */ - gc->hwDep.cvgDep.numBufferPages = devInfo.fbiVideoMemOffset; - - /* Set logical buffer -> physical buffer translations */ - gc->hwDep.cvgDep.frontBuf = 0; - gc->hwDep.cvgDep.backBuf = (gc->scanline_interleaved ? gc->grColBuf - 1 : 1); - - /* Initially current buffer == back buffer. */ - gc->hwDep.cvgDep.renderBuf = gc->hwDep.cvgDep.backBuf; - } -#endif /* (GLIDE_PLATFORM & GLIDE_HW_CVG) && GLIDE_BLIT_CLEAR */ - -#if USE_PACKET_FIFO - /* Place fifo in hw memory */ - { - /* Init hw */ -#define MB2B(__b) (((FxU32)(__b)) << 20) -#if GLIDE_INIT_HAL - /* Allocate the fifo on a page boundary */ -#define kPageBoundarySlop 0x1000UL -#define kPageBoundaryMask (kPageBoundarySlop - 1) - - const FxU32 memEnd = MB2B(gc->fbuf_size); /* size of hw memory */ - FxU32 maxOffset = ((xTileNum * yres) << 6) * (nColBuffers + nAuxBuffers); /* Bytes for buffers */ - - /* Align on a page boundary */ - if ((maxOffset & kPageBoundaryMask) != 0x00) { - maxOffset = ((maxOffset + kPageBoundarySlop) & ~kPageBoundaryMask); - } - -#if GLIDE_USE_DEBUG_FIFO - fifoSize = 0x1000UL; -#else /* !GLIDE_USE_DEBUG_FIFO */ - /* Too much memory claimed for other stuff? */ - fifoSize = MIN(memEnd - maxOffset, (0x01 << 18)); - rv = (maxOffset < memEnd); - if (!rv) { - GDBG_INFO(0, "Error: Tried to place cmd fifo (0x%X) past end of fbi mem (0x%X).\n", - maxOffset, memEnd); - goto BAILOUT; - } -#endif /* !GLIDE_USE_DEBUG_FIFO */ - - /* Place fifo in hw. Taking all of the remainging memory up to the - * byte swizzling bit in the cmd fifo address. - */ - gc->cmdTransportInfo.fifoOffset = memEnd - fifoSize; - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) - rv = fxHalInitCmdFifo(hw, /* sst */ - 0, /* which fifo - always 0 for cvg */ - /* V fifoStart - offset from hw base V */ - gc->cmdTransportInfo.fifoOffset, - fifoSize, /* size - in bytes */ - FXFALSE, /* directExec */ - FXFALSE, /* disableHoles */ - _grSet32); -#else -#error "Need HAL command fifo init routine for this hw" -#endif -#else /* !GLIDE_INIT_HAL */ - { - /* NB: This is a dummy since fifoStart is always hwBase + - * HW_FIFO_OFFSET (0x200000) - */ - FxU32 fifoStart = 0; - - rv = sst1InitCmdFifo(gc->reg_ptr, FXTRUE, - &fifoStart, - &gc->cmdTransportInfo.fifoOffset, - &fifoSize, - _grSet32); - } -#if GLIDE_USE_DEBUG_FIFO - { - const char* envVar = GETENV("FX_GLIDE_DEBUG_FIFO"); - const FxU32 debugFifoSize = ((envVar == NULL) - ? kDebugFifoSize - : atoi(envVar)); - if (fifoSize > debugFifoSize) fifoSize = debugFifoSize; - } -#endif /* GLIDE_USE_DEBUG_FIFO */ - -#if GLIDE_USE_SHADOW_FIFO - /* If we're debugging its nice to know what we really wrote - * into the fifo space, just in case tracing is off. - */ - { - FxU32* shadowPtr = (FxU32*)calloc(fifoSize + kPageBoundarySlop, sizeof(FxU32)); - - if (shadowPtr == NULL) { - gdbg_printf("Could not allocate shadow fifo\n"); - } else if (((FxU32)shadowPtr & kPageBoundaryMask) != 0x00) { - shadowPtr = (FxU32*)(((FxU32)shadowPtr + kPageBoundarySlop) & ~kPageBoundaryMask); - } - gc->cmdTransportInfo.fifoShadowBase = - gc->cmdTransportInfo.fifoShadowPtr = shadowPtr; - } -#endif /* GLIDE_USE_SHADOW_FIFO */ -#endif /* !GLIDE_INIT_HAL */ - - if (!rv) { - GDBG_INFO(0, "Error: fxHalInitCmdFifo failed.\n"); - goto BAILOUT; - } - GR_ASSERT(fifoSize > 0); - - /* Pre-compute the packet to return us back to the start. - * - * NB: This is an actual hw address. - */ - gc->cmdTransportInfo.fifoJmpHdr = (SSTCP_PKT0_JMP_LOCAL | - (gc->cmdTransportInfo.fifoOffset << (SSTCP_PKT0_ADDR_SHIFT - 2))); - } - - /* Setup virtual fifo addressing */ - { - gc->cmdTransportInfo.fifoStart = (FxU32*)((FxU32)gc->base_ptr + HW_FIFO_OFFSET); - gc->cmdTransportInfo.fifoEnd = (FxU32*)((FxU32)gc->cmdTransportInfo.fifoStart + fifoSize); - gc->cmdTransportInfo.fifoSize = fifoSize; - - /* Adjust room values. - * RoomToEnd needs enough room for the jmp packet since we - * never allow the hw to auto-wrap. RoomToRead needs to be - * adjusted so that we never acutally write onto the read ptr. - * - * fifoRoom is generally the min of roomToEnd and roomToRead, - * but we 'know' here that roomToRead < roomToEnd. - */ - gc->cmdTransportInfo.roomToEnd = fifoSize - FIFO_END_ADJUST; - gc->cmdTransportInfo.fifoRoom = - gc->cmdTransportInfo.roomToReadPtr = - gc->cmdTransportInfo.roomToEnd - sizeof(FxU32); - - /* Set initial fifo state. hw read and sw write pointers at - * start of the fifo. - */ - gc->cmdTransportInfo.fifoPtr = gc->cmdTransportInfo.fifoStart; - gc->cmdTransportInfo.fifoRead = HW_FIFO_PTR(FXTRUE); - - GDBG_INFO(gc->myLevel, - "Fifo Parameters:\n" - "\tStart: 0x%X\n" - "\tHW Read: 0x%X\n" - "\tHW Offset: 0x%X\n" - "\tSW Write: 0x%X\n", - gc->cmdTransportInfo.fifoStart, - gc->cmdTransportInfo.fifoRead, - gc->cmdTransportInfo.fifoOffset, - gc->cmdTransportInfo.fifoPtr); - } -#endif /* USE_PACKET_FIFO */ - - /* We expect that lfb writes will *NOT* go through the fifo, and that the - * fifo is ready for commands. - */ - gc->cmdTransportInfo.fifoLfbP = FXFALSE; - gc->cmdTransportInfo.lfbLockCount = 0; -#undef MB2B - } - -#if !GLIDE_INIT_HAL && 0 - /* dpc - 24 jan 1998 - FixMe! - * This is currently being done in _grDetectResources so that we - * can match the nt driver semantics in win95. - */ - if (_GlideRoot.CPUType >= 6) { - sst1InitCaching(gc->reg_ptr, FXTRUE); - } -#endif /* !GLIDE_INIT_HAL */ -#else -#error "Need to write command transport init for glide for this hw" -#endif - } - - /* We're effectively open now */ - gc->open = FXTRUE; - - /*------------------------------------------------------ - GC Init - ------------------------------------------------------*/ - GDBG_INFO(gc->myLevel, " GC Init\n"); - gc->state.screen_width = xres; - gc->state.screen_height = yres; - gc->state.num_buffers = nColBuffers; - gc->state.color_format = format; - gc->grSstRez = resolution; - gc->grSstRefresh = refresh; - - gc->lockPtrs[GR_LFB_READ_ONLY] = (FxU32)-1; - gc->lockPtrs[GR_LFB_WRITE_ONLY] = (FxU32)-1; - gc->fbStride = fbStride; - - /* Initialize the read/write registers to all 0 */ - gc->state.fbi_config.fbzColorPath = 0; - gc->state.fbi_config.fogMode = 0; - gc->state.fbi_config.alphaMode = 0; - gc->state.fbi_config.fbzMode = 0; - gc->state.fbi_config.lfbMode = 0; - gc->state.fbi_config.clipLeftRight = 0; - gc->state.fbi_config.clipBottomTop = 0; - gc->state.fbi_config.fogColor = 0; - gc->state.fbi_config.zaColor = 0; - gc->state.fbi_config.chromaKey = 0; - gc->state.fbi_config.stipple = 0; - gc->state.fbi_config.color0 = 0; - gc->state.fbi_config.color1 = 0; - - for (tmu = 0; tmu < gc->num_tmu; tmu += 1) { - const GrHwConfiguration* hwConfig = &_GlideRoot.hwConfig; - FxU32 textureMode = (FxU32)SST_SEQ_8_DOWNLD; - - if ((hwConfig->SSTs[_GlideRoot.current_sst].type == GR_SSTTYPE_VOODOO) && - (hwConfig->SSTs[_GlideRoot.current_sst].sstBoard.VoodooConfig.tmuConfig[tmu].tmuRev == 0)) { - textureMode = 0; - } - - gc->state.tmu_config[tmu].textureMode = textureMode; - gc->state.tmu_config[tmu].tLOD = 0x00000000; - gc->state.tmu_config[tmu].tDetail = 0x00000000; - gc->state.tmu_config[tmu].texBaseAddr = 0x00000000; - gc->state.tmu_config[tmu].texBaseAddr_1 = 0x00000000; - gc->state.tmu_config[tmu].texBaseAddr_2 = 0x00000000; - gc->state.tmu_config[tmu].texBaseAddr_3_8 = 0x00000000; - gc->state.tmu_config[tmu].mmMode = GR_MIPMAP_NEAREST; - gc->state.tmu_config[tmu].smallLod = GR_LOD_1; - gc->state.tmu_config[tmu].largeLod = GR_LOD_1; - gc->state.tmu_config[tmu].evenOdd = GR_MIPMAPLEVELMASK_BOTH; - gc->state.tmu_config[tmu].nccTable = GR_NCCTABLE_NCC0; - } - - /*------------------------------------------------------ - 3D State Init - ------------------------------------------------------*/ - GDBG_INFO(gc->myLevel, " 3D State Init\n"); - gc->state.fbi_config.fbzMode = (SST_ENRECTCLIP | - SST_ENZBIAS | - SST_DRAWBUFFER_BACK); - - grHints(GR_HINT_ALLOW_MIPMAP_DITHER, 0); - grSstOrigin(origin); - grAlphaBlendFunction(GR_BLEND_ONE , GR_BLEND_ZERO, - GR_BLEND_ONE, GR_BLEND_ZERO); - grAlphaTestFunction(GR_CMP_ALWAYS); - grAlphaTestReferenceValue(0); - grChromakeyMode(GR_CHROMAKEY_DISABLE); - grConstantColorValue((FxU32) ~0); - grClipWindow(0, 0, gc->state.screen_width, - gc->state.screen_height); - _grColorCombineDelta0Mode(FXFALSE); - grColorCombine(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_ITERATED, - FXFALSE); - grAlphaCombine(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_CONSTANT, - FXFALSE); - grColorMask(FXTRUE, FXFALSE); - grCullMode(GR_CULL_DISABLE); - grDepthBiasLevel(0); - grDepthMask(FXFALSE); - grDepthBufferMode(GR_DEPTHBUFFER_DISABLE); - grDepthBufferFunction(GR_CMP_LESS); - grDepthBiasLevel(0); - grDitherMode(GR_DITHER_4x4); - grFogMode(GR_FOG_DISABLE); - grFogColorValue(0x00000000); -#ifdef ENABLE_REGISTRY_GAMMA_RGB_AND_GAMMA_TABLE - { - char* gammaRGBTableStr; - char* gammaRGBStr; - char* str; - /* - ** if we decided to enable gammargb and gammatable, we need to - ** bump the buffer size in GETENV - */ - if (gammaRGBTableStr = GETENV("FX_GLIDE_GAMMATABLE_SIZE")) { - FxU32 entries, i; - float red[256], green[256], blue[256]; - FxBool useGammaTable = FXTRUE; - GR_BEGIN_NOFIFOCHECK("Hack for Gamma Table",80); - str = strtok(gammaRGBTableStr, " "); - entries = atol(str); - if (gammaRGBTableStr = GETENV("FX_GLIDE_GAMMATABLE_RED")) { - str = strtok(gammaRGBTableStr, " "); - red[0] = (float)atof(str); - for (i = 1; i < entries; i++) { - str = strtok(NULL, " "); - red[i] = (float)atof(str); - } - } - else - useGammaTable = FXFALSE; - if (gammaRGBTableStr = GETENV("FX_GLIDE_GAMMATABLE_GREEN")) { - str = strtok(gammaRGBTableStr, " "); - green[0] = (float)atof(str); - for (i = 1; i < entries; i++) { - str = strtok(NULL, " "); - green[i] = (float)atof(str); - } - } - else - useGammaTable = FXFALSE; - if (gammaRGBTableStr = GETENV("FX_GLIDE_GAMMATABLE_BLUE")) { - str = strtok(gammaRGBTableStr, " "); - blue[0] = (float)atof(str); - for (i = 1; i < entries; i++) { - str = strtok(NULL, " "); - blue[i] = (float)atof(str); - } - } - else - useGammaTable = FXFALSE; - if (useGammaTable) - sst1InitGammaTable(gc->reg_ptr, entries, (FxU32 *)red, (FxU32 *)green, (FxU32 *)blue); - else - grGammaCorrectionValue(GLIDE_DEFAULT_GAMMA); - GR_END(); - } - else if (gammaRGBStr = GETENV("FX_GLIDE_GAMMARGB")) { - float r, g, b; - GR_BEGIN_NOFIFOCHECK("Hack for Gamma RGB",80); - str = strtok(gammaRGBStr, " "); - r = (float)atof(str); - str = strtok(NULL, " "); - g = (float)atof(str); - str = strtok(NULL, " "); - b = (float)atof(str); - sst1InitGammaRGB(gc->reg_ptr, r, g, b); - GR_END(); - } - else - grGammaCorrectionValue(GLIDE_DEFAULT_GAMMA); - } -#else - grGammaCorrectionValue(GLIDE_DEFAULT_GAMMA); -#endif - - guTexMemReset(); - - switch (gc->num_tmu) { - case 3: - grTexClampMode(GR_TMU2, GR_TEXTURECLAMP_CLAMP, GR_TEXTURECLAMP_CLAMP); - grTexDetailControl(GR_TMU2, 0, 1, 1.0F); - grTexFilterMode(GR_TMU2, GR_TEXTUREFILTER_POINT_SAMPLED, - GR_TEXTUREFILTER_POINT_SAMPLED); - grTexLodBiasValue(GR_TMU2, 0.0F); - grTexMipMapMode(GR_TMU2, GR_MIPMAP_DISABLE, FXFALSE); - grTexCombineFunction(GR_TMU2, GR_TEXTURECOMBINE_ZERO); - grTexCombine(GR_TMU2, GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE); - case 2: - grTexClampMode(GR_TMU1, GR_TEXTURECLAMP_CLAMP, GR_TEXTURECLAMP_CLAMP); - grTexDetailControl(GR_TMU1, 0, 1, 1.0F); - grTexFilterMode(GR_TMU1, GR_TEXTUREFILTER_POINT_SAMPLED, - GR_TEXTUREFILTER_POINT_SAMPLED); - grTexLodBiasValue(GR_TMU1, 0.0F); - grTexMipMapMode(GR_TMU1, GR_MIPMAP_DISABLE, FXFALSE); - grTexCombine(GR_TMU1, GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE); - case 1: - grTexClampMode(GR_TMU0, GR_TEXTURECLAMP_CLAMP, GR_TEXTURECLAMP_CLAMP); - grTexDetailControl(GR_TMU0, 0, 1, 1.0F); - grTexFilterMode(GR_TMU0, GR_TEXTUREFILTER_POINT_SAMPLED, - GR_TEXTUREFILTER_POINT_SAMPLED); - grTexLodBiasValue(GR_TMU0, 0.0F); - grTexMipMapMode(GR_TMU0, GR_MIPMAP_DISABLE, FXFALSE); - grTexCombine(GR_TMU0, GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE); - } - grLfbConstantAlpha(0xFF); - grLfbConstantDepth(0); - - /* -------------------------------------------------------- - Splash Screen - --------------------------------------------------------*/ -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) - if (!_GlideRoot.environment.noSplash) { - HMODULE newSplash; - - if (newSplash = LoadLibrary("3dfxsplash2.dll")) { - FARPROC fxSplash; - - if (fxSplash = GetProcAddress(newSplash, "_fxSplash@16")) { - fxSplash(hWnd, gc->state.screen_width, gc->state.screen_height, nAuxBuffers); - _GlideRoot.environment.noSplash = 1; - } - } - } -#endif /* (GLIDE_PLATFORM & GLIDE_OS_WIN32) */ - - /* If it's still 0, then do the old one */ - if (!_GlideRoot.environment.noSplash) { - grSplash(0.0f, 0.0f, - (float) gc->state.screen_width, - (float) gc->state.screen_height, - 0); - _GlideRoot.environment.noSplash = 1; - } - - _GlideRoot.windowsInit = FXTRUE; /* to avoid race with grSstControl() */ - -BAILOUT: - GR_RETURN(rv); -#undef FN_NAME -} /* grSstWinOpen */ - -/*------------------------------------------------------------------- - Function: grSstWinClose - Date: 3/16 - Implementor(s): jdt - Library: Glide - Description: - Shut down the selected SST - - Shutdown has 4 steps - - 3D Idle - the 3D engine must be idled to make sure that there are no - commands executing in the transport when the registers are - reset - - GC Reset - the GC is flagged as unitialized - (nosup) - - Command Transport Disable - the command transport to the 3D device is put in a state - of reset. No further commands may be issued throught the - command transport - - Video Restore - video is restored to its pre-open state. - - Arguments: - none - Return: - none - -------------------------------------------------------------------*/ -GR_ENTRY(grSstWinClose, void, (void)) -{ -#define FN_NAME "grSstWinClose" - GR_BEGIN_NOFIFOCHECK("grSstWinClose", 80); - GDBG_INFO_MORE(gc->myLevel,"()\n"); - - if ((gc != NULL) && gc->open) { -#if GLIDE_INIT_HAL - /* dpc - 22 may 1997 - FixMe! - * We need the equivilant stuff in the hal layer too. - */ -#else /* !GLIDE_INIT_HAL */ -#if GLIDE_DEBUG || GLIDE_CHECK_COMPATABILITY - /* Make sure that linear memory is back to the 'happy' state - * before shutting down so that any re-inits are not going to die - * on access violations. - */ - grHints(GR_HINT_LFB_RESET, 0); -#endif /* GLIDE_DEBUG || GLIDE_CHECK_COMPATABILITY */ - - /*-------------------------- - 3D Idle - --------------------------*/ - GDBG_INFO(gc->myLevel, " 3D Idle"); - /* dpc - 5 sep 1997 - * The old way. - * - * initIdle(); - */ - sst1InitIdle(gc->reg_ptr); - - /*-------------------------- - Command Transport Disable - --------------------------*/ - GDBG_INFO(gc->myLevel, " Command Transport Disable"); - /* dpc - 5 sep 1997 - * The old way. - * - * initDisableTransport(); - */ - /* When disabling all of the parameters other than sstBase and the - * enable flag are ignored. - */ - sst1InitCmdFifo(gc->reg_ptr, FXFALSE, NULL, NULL, NULL, NULL); - - /*-------------------------- - Video Restore - --------------------------*/ - GDBG_INFO(gc->myLevel, " Restore Video"); - /* dpc - 5 sep 1997 - FixMe! - * Uhhh.... what is the new call to do this? - * - * initRestoreVideo(); - */ - /* The shutdown takes care of restoring the video etc. The - * shutdown also takes care of cleaning up sli now just in case - * someone (test27) tries to re-open the sli pair later because - * the init sequence has trouble sometimes re-initting if the - * boards are still paired. - * - * NB: We do have to cleanup any processor caching characteristics - * here because sst1InitShutdown will unlink the connection - * between our hw address and its internal structures which keep - * track of the mtrr's. - */ - sst1InitIdle(gc->reg_ptr); - if (_GlideRoot.CPUType >= 6) { - sst1InitCaching(gc->base_ptr, FXFALSE); - } - sst1InitShutdown(gc->reg_ptr); -#endif /* !GLIDE_INIT_HAL */ - - /*-------------------------- - GC Reset - --------------------------*/ - GDBG_INFO(gc->myLevel, " GC Reset"); - - /* open and hwInitP are really two different things. - * - * hwInitP indicates whether the init code mapping/init sequence - * is active for this hw. - * - * open includes setting up video, command transport, and the - * initial glide state. - */ - gc->hwInitP = FXFALSE; - if (gc->scanline_interleaved) (gc + 1)->hwInitP = FXFALSE; - - /* If we swapped the monitor sense on open then switch these - * back so that any later re-mappings of the board are in sync - * w/ the init code's mappings. - */ - if (gc->swapMasterSenseP) { -#define SwapPtrVal(__a, __b) do { FxU32* temp = (__a); (__a) = (__b); (__b) = temp; } while(0); - SwapPtrVal(gc->base_ptr, (gc + 1)->base_ptr); - SwapPtrVal(gc->reg_ptr, (gc + 1)->reg_ptr); - SwapPtrVal(gc->tex_ptr, (gc + 1)->tex_ptr); - SwapPtrVal(gc->lfb_ptr, (gc + 1)->lfb_ptr); -#undef SwapPtrVal - - /* Again, reset the slave pointers by hand */ - if (gc->scanline_interleaved) { - gc->slave_ptr = (gc + 1)->base_ptr; - (gc + 1)->slave_ptr = NULL; - } - - gc->swapMasterSenseP = FXFALSE; - } - -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) - if (gc->oemInit) { - FARPROC oemRestoreVideo = GetProcAddress(gc->oemInit, "_fxoemRestoreVideo@4"); - - if (oemRestoreVideo != NULL) oemRestoreVideo(&gc->oemi); - FreeLibrary(gc->oemInit); - } -#endif - } - gc->open = FXFALSE; - - GR_END(); -#undef FN_NAME -} /* grSstWinClose */ - -GR_ENTRY(grSstControl, FxBool, (GrControl_t code)) -{ - GR_DCL_GC; -#define FN_NAME "grSstControl" - GDBG_INFO(41, "%s: code = 0x%x, windowsInit = %d\n", FN_NAME, - code, _GlideRoot.windowsInit); - - if (_GlideRoot.windowsInit && gc->open) { -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) - /* For VG96, windows haven't been created, so there's no point - * trying to control it. - */ - - /* Believe it or not, the following code really should be bracketed - like this. The reason is that GR_BEGIN_NOFIFOCHECK seg faults - when grSstControl is called before the Glide window is truly - initialized. This is a real concern, as grSstControl is called - from event loops, which are asynchronous. - */ - FxU32 - status, - xRes, yRes, - clipLeftRight, clipBottomTop; - - GR_BEGIN_NOFIFOCHECK(FN_NAME,80); - - xRes = initControl(code); - - GDBG_INFO((80, "%s: initControl returned 0x%x\n", FN_NAME, xRes)); - - if (!xRes) return FXFALSE; - - yRes = xRes >> 16; - xRes = xRes & 0xffff; - - /* !! FIXME +++ this call should properly update the gc->fbStride, - this information is known only to the init layer and needs to be - exposed, it is only really necessary to lfblock right now, - and therefore is returned by initGetBufferPtr */ - - gc->state.screen_width = xRes; - gc->state.screen_height = yRes; - - /* Wait for Idle. */ - - nTries = 0; - do { - if (nTries++ > 999) { - GDBG_INFO((80, "%s: returning FALSE after %d checks for idle\n", - FN_NAME, nTries)); - return FXFALSE; - } - - status = GET(hw->status); - - } while (status & 0x1); - - /* Set ClipRect Via direct writes */ - _grClipNormalizeAndGenerateRegValues(0, 0, xRes, yRes, - &clipLeftRight, - &clipBottomTop); - SET_DIRECT(clipLeftRight1, clipLeftRight); - SET_DIRECT(clipBottomTop1, clipBottomTop); - -#elif (GLIDE_PLATFORM&GLIDE_HW_SST1) - return initControl(code); -#elif (GLIDE_PLATFORM & GLIDE_HW_CVG) && !GLIDE_INIT_HAL - { - FxBool isValidP = FXTRUE; - FxBool passFlag = 0; - - switch ( code ) { - case GR_CONTROL_DEACTIVATE: - passFlag = FXTRUE; - break; - - case GR_CONTROL_ACTIVATE: - passFlag = FXFALSE; - break; - - default: - isValidP = FXFALSE; - } - - if (isValidP) sst1InitVgaPassCtrl(gc->base_ptr, passFlag); -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) - { - FARPROC oemControl = NULL; - if (gc->oemInit) { - if ((oemControl = GetProcAddress(gc->oemInit, "_fxoemControl@4"))) - oemControl(code); - } - } -#endif - - } -#endif - } - - GDBG_INFO(41, "%s: Returning TRUE\n", FN_NAME); - return FXTRUE; -#undef FN_NAME -} /* grSstControl */ - -/*--------------------------------------------------------------------------- -** grSstPerfStats -*/ -GR_ENTRY(grSstPerfStats, void, (GrSstPerfStats_t *pStats)) -{ -#define FN_NAME "grSstPerfStats" - GR_BEGIN_NOFIFOCHECK("grSstPerfStats",83); - GDBG_INFO_MORE(gc->myLevel,"(0x%x)\n",pStats); - GR_CHECK_F(FN_NAME, !pStats, "NULL pointer"); - - pStats->pixelsIn = GR_GET(hw->stats.fbiPixelsIn); - pStats->chromaFail = GR_GET(hw->stats.fbiChromaFail); - pStats->zFuncFail = GR_GET(hw->stats.fbiZfuncFail); - pStats->aFuncFail = GR_GET(hw->stats.fbiAfuncFail); - pStats->pixelsOut = GR_GET(hw->stats.fbiPixelsOut); - - GR_END(); -#undef FN_NAME -} /* grSstPerfStats */ - -/*--------------------------------------------------------------------------- -** grStatsResetPerfStats -*/ - -GR_ENTRY(grSstResetPerfStats, void, (void)) -{ -#define FN_NAME "grSstResetPerfStats" - GR_BEGIN("grSstResetPerfStats",83,4, 1); - GDBG_INFO_MORE(gc->myLevel,"()\n"); - GR_SET(BROADCAST_ID, hw, nopCMD, 1); - GR_END(); -#undef FN_NAME -} /* grSstResetPerfStats */ - - -/*--------------------------------------------------------------------------- -** grSstStatus - return contents of status register -*/ - -GR_ENTRY(grSstStatus, FxU32, (void)) -{ - GR_BEGIN_NOFIFOCHECK("grSstStatus", 85); - - { - const FxU32 stat = GR_GET(hw->status); - - GDBG_INFO(84,"grSstStatus() => 0x%x\n", stat); - - return stat; - } -}/* grSstStatus */ - -/*--------------------------------------------------------------------------- -** grSstVideoLine - return current video line number -*/ - -GR_ENTRY(grSstVideoLine, FxU32, (void)) -{ - FxU32 vline = 1; -#if (GLIDE_PLATFORM & GLIDE_HW_SST1) - GR_DCL_GC; - GR_DCL_HW; - - vline = GR_GET(hw->vRetrace); - GDBG_INFO(84,"grSstVideoLine() => 0x%x (%d)\n",vline,vline); -#endif - return vline; -}/* grSstVideoLine */ - -/*--------------------------------------------------------------------------- -** grSstVRetrace - return contents of SST_VRETRACE bit of status register; -*/ - -GR_ENTRY(grSstVRetraceOn, FxBool, (void)) -{ - return ((grSstStatus() & SST_VRETRACE) == 0); -}/* grSstVRetrace */ - -/*--------------------------------------------------------------------------- -** grSstIdle/grFinish -*/ -GR_ENTRY(grSstIdle, void, (void)) -#define FN_NAME "grSstIdle" -{ - GR_BEGIN_NOFIFOCHECK(FN_NAME, 83); - GDBG_INFO_MORE(gc->myLevel,"()\n"); - - IDLE_HW(hw); - - GR_END(); -#undef FN_NAME -} /* grSstIdle */ - -/*--------------------------------------------------------------------------- -** grSstIsBusy - find out if the SST is busy or not -*/ -GR_ENTRY(grSstIsBusy, FxBool, (void)) -{ -#define FN_NAME "grSstIsBusy" - static FxBool nopP = FXTRUE; - FxBool busy; - GR_BEGIN_NOFIFOCHECK("grSstIsBusy", 80); - - /* dpc - 22 may 1997 - FixMe! - * Seems like the simplest way to do it, but is this really the way - * to do it? - */ - if (nopP) { - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, nopCMD, 0); - GR_CHECK_SIZE(); - } - - busy = ((grSstStatus() & SST_BUSY) != 0); - nopP = !busy; - - GDBG_INFO(84,"grSstIsBusy() => 0x%x\n", busy); - - return busy; -#undef FN_NAME -}/* grSstIsBusy */ - -/*--------------------------------------------------------------------------- -** grGammaCorrectionValue - set the gamma correction value -*/ - -GR_ENTRY(grGammaCorrectionValue, void, (float gamma)) -{ - GR_BEGIN_NOFIFOCHECK("grGammaCorrectionValue",80); - GDBG_INFO_MORE(gc->myLevel,"(%g)\n",gamma); - -#if GLIDE_INIT_HAL - fxHalInitGamma(hw, gamma); -#else /* !GLIDE_INIT_HAL */ - /* dpc - 5 sep 1997 - FixMe! - * The old way - * - * initGamma(gam); - */ - sst1InitGamma(gc->reg_ptr, gamma); -#endif /* !GLIDE_INIT_HAL */ - - GR_END(); -} /* grGammaCorrectionValue */ - -/*--------------------------------------------------------------------------- -** grSstOrigin - Set the orgin orientation of the screen. -** -** Returns: -** -** Notes: -** -*/ - -GR_STATE_ENTRY(grSstOrigin, void, (GrOriginLocation_t origin)) -{ -#define FN_NAME "grSstOrigin" - FxU32 fbzMode; - GR_BEGIN_NOFIFOCHECK("grSstOrigin", 83); - GDBG_INFO_MORE(gc->myLevel, "(%d)\n", origin); - - /* Initialize FBZMODE register */ - fbzMode = gc->state.fbi_config.fbzMode; - if (origin == GR_ORIGIN_LOWER_LEFT) - fbzMode |= SST_YORIGIN; - else - fbzMode &= ~(SST_YORIGIN); - - /* dpc - 22 may 1997 - FixMe! - * Do we need to do anything here for the HAL? - */ -#if !GLIDE_INIT_HAL - /* dpc - 5 sep 1997 - FixMe! - * This is the old way. Is there anything else we - * need to do here? - * - * initOrigin(origin); - */ -#endif - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) - /* Sli has an 'interesting' feature where the physical scanlines - * that are being rendered is dependent on the location of the y - * origin. We always clear the overlap bit to black here so that - * no one ever notices. This needs to be done for all of the allocated - * color buffers that could have possibly have been rendered to since - * the last origin swap. Rather than beeing really tricky I just do - * it for every allocated color buffer. - * - * Origin_Lower_Left: 0:Black [1 .. screenRezY]:Rendered screenRez+1:Black - * Origin_Upper_Left: [0 .. screenRezY - 1]:Rendered [screenRez-screenRez+1]:Black - */ - if (gc->scanline_interleaved) gc->hwDep.cvgDep.sliOriginBufCount = gc->grColBuf; -#endif /* (GLIDE_PLATFORM & GLIDE_HW_CVG) */ - - gc->state.fbi_config.fbzMode = fbzMode; -#if !GLIDE3 - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, fbzMode, fbzMode); - GR_CHECK_SIZE(); -#endif -#undef FN_NAME -} /* grSstOrigin */ - -/* GMT: do we really have users for this??? - * CHD: No. - * JDT: Huh? If you're talking about grSstOrigin, you're smoking crack. - * if you are talking about SstConfigPipeline, it is evil and must - * be destroyed. :) - * dpc: There is one user that I know of. This 'Nature' demo that Scott just - * gave me. - * chd: It's a stub now. - */ - - -extern FX_ENTRY void FX_CALL -grSstConfigPipeline(GrChipID_t chip, FxU32 reg, FxU32 value); - -/*--------------------------------------------------------------------------- -** grSstConfigPipeline -*/ - -GR_ENTRY(grSstConfigPipeline, void, (GrChipID_t chip, FxU32 reg, FxU32 value)) -{ -} /* grSstConfigPipeline */ - diff --git a/glide2x/cvg/glide/src/gsstdef.h b/glide2x/cvg/glide/src/gsstdef.h deleted file mode 100644 index d1801b6..0000000 --- a/glide2x/cvg/glide/src/gsstdef.h +++ /dev/null @@ -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 -#else -#include -#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__ */ diff --git a/glide2x/cvg/glide/src/gstrip.c b/glide2x/cvg/glide/src/gstrip.c deleted file mode 100644 index 6076ebf..0000000 --- a/glide2x/cvg/glide/src/gstrip.c +++ /dev/null @@ -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 - -#define FX_DLL_DEFINITION -#include -#include -#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 diff --git a/glide2x/cvg/glide/src/gtex.c b/glide2x/cvg/glide/src/gtex.c deleted file mode 100644 index 0e598ac..0000000 --- a/glide2x/cvg/glide/src/gtex.c +++ /dev/null @@ -1,1102 +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$ -** -** 42 6/24/98 5:19p Peter -** cleanedup version merged w/ banshee -** -** 41 6/23/98 5:39p Peter -** gary's trilinear hell bug -** -** 40 6/06/98 12:06p Peter -** gmt's trilinear hell bug -** -** 39 5/18/98 12:14p Peter -** crybaby check in grTexCombine -** -** 38 5/07/98 4:12p Peter -** lbe texture thing -** -** 37 4/16/98 3:54p Peter -** 1x1 lod fix, sorry John -** -** 36 4/01/98 1:51p Peter -** fixed resetting unused tmu muckage -** -** 35 3/13/98 1:27p Peter -** lodDither vs tri-linear -** -** 34 2/20/98 5:31p Peter -** crybaby glide -** -** 33 2/20/98 11:00a Peter -** removed glide3 from glid2 tree - * - * 32 1/13/98 12:42p Atai - * fixed grtexinfo, grVertexLayout, and draw triangle - * - * 31 1/09/98 6:48p Atai - * grTexInfo, GR_LOD_* and GR_ASPECT_* - * - * 30 1/08/98 7:09p Peter - * real hw stuff modulo makefile change - * - * 29 1/08/98 4:58p Atai - * tex table broadcast, grVertexLayout enable/disable, stq, and some - * defines - * - * 28 1/07/98 10:22a Peter - * lod dithering env var - * - * 27 1/05/98 6:06p Atai - * glide extension stuff - * - * 26 12/18/97 10:52a Atai - * fixed grGet(GR_VIDEO_POS) - * - * 25 12/17/97 4:45p Peter - * groundwork for CrybabyGlide - * - * 24 12/11/97 4:15p Peter - * fixed assertions - * - * 23 12/05/97 4:26p Peter - * watcom warnings - * - * 22 11/20/97 6:57p Dow - * baseaddress for banshee - * - * 21 11/18/97 4:36p Peter - * chipfield stuff cleanup and w/ direct writes - * - * 20 11/17/97 4:55p Peter - * watcom warnings/chipfield stuff - * - * 19 11/03/97 3:43p Peter - * h3/cvg cataclysm - * - * 18 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 - * - * 17 9/05/97 12:31p Peter - * more reg write grouping - * - * 16 7/08/97 2:48p Peter - * - * 15 6/06/97 10:47a Peter - * texture downloading, fixed 640x480 dimension, changed cvg dep to be the - * same as sst1 - * - * 14 5/27/97 1:16p Peter - * Basic cvg, w/o cmd fifo stuff. - * - * 13 5/21/97 6:05a Peter - * - * 12 3/04/97 9:08p Dow - * - * 11 3/03/97 10:58a Jdt - * Fixe for 2-pass trilinear - * - * 10 12/23/96 1:37p Dow - * chagnes for multiplatform glide -** -*/ - -#include <3dfx.h> - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -extern const int _grMipMapHostWH[GR_ASPECT_1x8 + 1][GR_LOD_1 + 1][2]; -extern FxU32 _grMipMapHostSize[][16]; -extern FxU32 _gr_aspect_index_table[]; -extern FxU32 _gr_evenOdd_xlate_table[]; -extern FxU32 _gr_aspect_xlate_table[]; - -/* Make sure that the trilinear blending bits are set in a - * consistent manner across the tmu's. This only really matters if - * we have multiple tmu's, but this state is really setup across - * multiple calls (grTexCombine, grTexMipMapMode, and - * grTexSource). - * - * NB: This must be called after the shadows are updated because - * _grTexCheckTriLinear() will use the shadow register values - * to determine the current state of trilinearness. - * - * FixMe: This should eventually get merged in w/ the texture - * statemonster. When/If that ever happens. - */ -static void -_grTexCheckTriLinear(GrChipID_t tmu) -{ -#define FN_NAME "_grTexCheckTriLinear" - GR_BEGIN_NOFIFOCHECK(FN_NAME, 90); - GDBG_INFO_MORE(gc->myLevel, "(0x%X)\n", tmu); - -#if (GLIDE_NUM_TMU > 2) -#error "(GLIDE_NUM_TMU > 2): Write this code" -#endif - -/* NB: The factor mask needs to include the factor bits as - * well as the reverse bit so that we can differentiate - * between the lodfrac and the (1 - lodfrac) case. - */ -#define SST_TC_FACTOR_MASK (SST_TC_MSELECT | SST_TC_REVERSE_BLEND) - -#define SST_MIPMAP_LEVEL_MASK (SST_LOD_ODD | SST_LOD_TSPLIT) - - /* Is this tmu on? */ - if (!gc->hwDep.cvgDep.tmuLodDisable[tmu]) { - const struct tmu_config_t* tmu0 = gc->state.tmu_config; - const struct tmu_config_t* tmu1 = gc->state.tmu_config + 1; - const struct tmu_config_t* curTmu = gc->state.tmu_config + tmu; - const struct tmu_config_t* otherTmu = gc->state.tmu_config + !tmu; - - /* This is the 'tricky' state where we have to manage the states - * of teh tmu's together to get the correct effect. Within this - * state there are two sub-states: two-pass trilinear and single - * pass using both tmu's w/ split levels. - * - * Case 1 - TMU set for lod blending and has both even/odd levels - */ - if (((curTmu->textureMode & SST_TRILINEAR) == SST_TRILINEAR) && - (curTmu->evenOdd == GR_MIPMAPLEVELMASK_BOTH)) { - - /* Check the 'other' tmu to see if it is active, if not then we - * are doing two pass trilinear so check that we have the - * correct even/odd things set based on the factor where one - * pass will use GR_COMBINE_FACTOR_LOD_FRACTION and the other - * will use (1 - GR_COMBINE_FACTOR_LOD_FRACTION). - */ - if (gc->hwDep.cvgDep.tmuLodDisable[!tmu]) { - /* NB: In this case the rgb/alpha factors need to match so - * checking for only one of them is fine. - */ - const FxU32 levelMask = (((curTmu->textureMode & SST_TC_FACTOR_MASK) == SST_TC_MLODFRAC) - ? SST_LOD_ODD - : 0); - - GDBG_INFO(gc->myLevel, FN_NAME": Two-pass trilinear fixup (0x%X) : tLOD : (0x%X : 0x%X)\n", - tmu, curTmu->tLOD, ((curTmu->tLOD & ~SST_MIPMAP_LEVEL_MASK) | levelMask)); - - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(eChipTMU0, SST_TMU(hw, 0), tLOD, - ((curTmu->tLOD & ~SST_MIPMAP_LEVEL_MASK) | levelMask)); - GR_CHECK_SIZE(); - } else { - /* One pass trilinear - * - * Make sure that the tmu's have the levels split across the - * two tmu's. There are basically three cases based on what - * the user might have already set on the other tmu. - */ - if (((tmu0->textureMode & SST_TC_BLEND) == SST_TC_BLEND) && - ((tmu1->textureMode & SST_TC_REPLACE) == SST_TC_REPLACE)) { - FxU32 evenOdd[GLIDE_NUM_TMU]; - FxU32* curEvenOdd = evenOdd + tmu; - - { - FxU32 i; - - for(i = 0; i < GLIDE_NUM_TMU; i++) { - evenOdd[i] = gc->state.tmu_config[i].tLOD & SST_LOD_ODD; - } - } - - /* 1 - The other tmu already has the even levels. */ - if ((otherTmu->evenOdd == GR_MIPMAPLEVELMASK_EVEN) && - (curTmu->evenOdd != GR_MIPMAPLEVELMASK_ODD)) { - *curEvenOdd = SST_LOD_ODD; - goto __tmuRegUpdate; - } - - /* 2 - The other tmu already has the odd levels. */ - if ((otherTmu->evenOdd == GR_MIPMAPLEVELMASK_ODD) && - (curTmu->evenOdd != GR_MIPMAPLEVELMASK_EVEN)) { - *curEvenOdd = 0; - goto __tmuRegUpdate; - } - - /* 3 - The other tmu already has both the levels. If the - * downstream tmu's factor is lodFrac then the upstream tmu - * needs to be (1 - lodFrac) and vice-versa. - */ - if (otherTmu->evenOdd == GR_MIPMAPLEVELMASK_BOTH) { - evenOdd[0] = (((tmu0->textureMode & SST_TC_FACTOR_MASK) == SST_TC_MLODFRAC) - ? 0 - : SST_LOD_ODD); - evenOdd[1] = ~evenOdd[0] & SST_LOD_ODD; - - goto __tmuRegUpdate; - } - - /* Do the register updates */ - if (0) { - __tmuRegUpdate: - GDBG_INFO(gc->myLevel, FN_NAME": Tri-linear fixup (0x%X : 0x%X) : (0x%X : 0x%X)\n", - tmu0->tLOD, tmu1->tLOD, - ((tmu0->tLOD & ~SST_MIPMAP_LEVEL_MASK) | evenOdd[0]), - ((tmu1->tLOD & ~SST_MIPMAP_LEVEL_MASK) | evenOdd[1])); - - GR_SET_EXPECTED_SIZE((sizeof(FxU32) << 1), 2); - { - GR_SET(eChipTMU0, SST_TMU(hw, 0), tLOD, - ((tmu0->tLOD & ~SST_MIPMAP_LEVEL_MASK) | evenOdd[0])); - GR_SET(eChipTMU1, SST_TMU(hw, 1), tLOD, - ((tmu1->tLOD & ~SST_MIPMAP_LEVEL_MASK) | evenOdd[1])); - } - GR_CHECK_SIZE(); - } - } - } - } - } - - GR_END(); -#undef FN_NAME -} - -/*--------------------------------------------------------------------------- -** grTexClampMode -*/ -GR_ENTRY(grTexClampMode, void, - (GrChipID_t tmu, - GrTextureClampMode_t s_clamp_mode, GrTextureClampMode_t t_clamp_mode)) -{ -#define FN_NAME "grTexClampMode" - FxU32 texturemode; - FxU32 clampMode =((s_clamp_mode == GR_TEXTURECLAMP_CLAMP ? SST_TCLAMPS : 0) | - (t_clamp_mode == GR_TEXTURECLAMP_CLAMP ? SST_TCLAMPT : 0)); - - GR_BEGIN("grTexClampMode",88,4, 1); - GDBG_INFO_MORE(gc->myLevel,"(%d, %d,%d)\n",tmu,s_clamp_mode,t_clamp_mode); - GR_CHECK_TMU(FN_NAME, tmu); - - texturemode = gc->state.tmu_config[tmu].textureMode; - texturemode &= ~(SST_TCLAMPS | SST_TCLAMPT); - texturemode |= clampMode; - - GR_SET((0x02UL << tmu), SST_TMU(hw, tmu), textureMode, texturemode); - gc->state.tmu_config[tmu].textureMode = texturemode; - GR_END(); -#undef FN_NAME -} /* grTexClampMode */ - -/*--------------------------------------------------------------------------- -** grTexCombine -*/ -GR_ENTRY(grTexCombine, void, - (GrChipID_t tmu, - GrCombineFunction_t rgb_function, GrCombineFactor_t rgb_factor, - GrCombineFunction_t alpha_function, GrCombineFactor_t alpha_factor, - FxBool rgb_invert, FxBool alpha_invert)) -{ -#define FN_NAME "grTexCombine" - FxU32 texturemode; - FxU32 tLod; - FxU32 tmuMask; - FxBool localColorP = FXFALSE; - FxBool localAlphaP = FXFALSE; - - GR_BEGIN_NOFIFOCHECK("grTexCombine",88); - GDBG_INFO_MORE(gc->myLevel,"(%d, %d,%d, %d,%d, %d,%d)\n", - tmu, rgb_function, rgb_factor, - alpha_function, alpha_factor, - rgb_invert, alpha_invert); - GR_CHECK_TMU(FN_NAME, tmu); - GR_CHECK_W(FN_NAME, - rgb_function < GR_COMBINE_FUNCTION_ZERO || - rgb_function > GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA, - "unsupported texture color combine function"); - GR_CHECK_W(FN_NAME, - alpha_function < GR_COMBINE_FUNCTION_ZERO || - alpha_function > GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA, - "unsupported texture alpha combine function"); - GR_CHECK_W(FN_NAME, - (rgb_factor & 0x7) < GR_COMBINE_FACTOR_ZERO || - (rgb_factor & 0x7) > GR_COMBINE_FACTOR_LOD_FRACTION || - rgb_factor > GR_COMBINE_FACTOR_ONE_MINUS_LOD_FRACTION, - "unsupported texture color combine scale factor"); - GR_CHECK_W(FN_NAME, - (alpha_factor & 0x7) < GR_COMBINE_FACTOR_ZERO || - (alpha_factor & 0x7) > GR_COMBINE_FACTOR_LOD_FRACTION || - alpha_factor > GR_COMBINE_FACTOR_ONE_MINUS_LOD_FRACTION, - "unsupported texture alpha combine scale factor"); - - - GR_CHECK_COMPATABILITY(FN_NAME, - (rgb_factor != alpha_factor) && - (((rgb_factor & 0x07UL) == GR_COMBINE_FACTOR_DETAIL_FACTOR) || - ((rgb_factor & 0x07UL) == GR_COMBINE_FACTOR_LOD_FRACTION)) && - (((alpha_factor & 0x07UL) == GR_COMBINE_FACTOR_DETAIL_FACTOR) || - ((alpha_factor & 0x07UL) == GR_COMBINE_FACTOR_LOD_FRACTION)), - "Incompatible texture combine factors (rgb vs alpha) based on lod"); - - texturemode = gc->state.tmu_config[tmu].textureMode; - texturemode &= ~(SST_TCOMBINE | SST_TACOMBINE); - tLod = gc->state.tmu_config[tmu].tLOD; - tLod &= ~(SST_LOD_ODD); - - /* tmuMask tells grColorCombineFunction what to turn off an on if - * the ccFunc requires texture mapping - */ - tmuMask = GR_TMUMASK_TMU0 << tmu; - gc->state.tmuMask &= ~tmuMask; - - /* setup scale factor bits */ - texturemode |= (rgb_factor & 0x7) << SST_TC_MSELECT_SHIFT; - if (!(rgb_factor & 0x8)) texturemode |= SST_TC_REVERSE_BLEND; - if (((rgb_factor & 0x7) == GR_COMBINE_FACTOR_LOCAL) || - ((rgb_factor & 0x7) == GR_COMBINE_FACTOR_LOCAL_ALPHA)) - gc->state.tmuMask |= tmuMask; - - texturemode |= (alpha_factor & 0x7) << SST_TCA_MSELECT_SHIFT; - if (!(alpha_factor & 0x8)) texturemode |= SST_TCA_REVERSE_BLEND; - if (((alpha_factor & 0x7) == GR_COMBINE_FACTOR_LOCAL) || - ((alpha_factor & 0x7) == GR_COMBINE_FACTOR_LOCAL_ALPHA)) - gc->state.tmuMask |= tmuMask; - - /* setup invert output bits */ - if (rgb_invert) texturemode |= SST_TC_INVERT_OUTPUT; - if (alpha_invert) texturemode |= SST_TCA_INVERT_OUTPUT; - - /* setup core color combine unit bits */ - switch (rgb_function) { - case GR_COMBINE_FUNCTION_ZERO: - texturemode |= SST_TC_ZERO_OTHER; - localColorP = FXTRUE; - break; - - case GR_COMBINE_FUNCTION_LOCAL: - texturemode |= SST_TC_ZERO_OTHER | SST_TC_ADD_CLOCAL; - gc->state.tmuMask |= tmuMask; - localColorP = FXTRUE; - break; - - case GR_COMBINE_FUNCTION_LOCAL_ALPHA: - texturemode |= SST_TC_ZERO_OTHER | SST_TC_ADD_ALOCAL; - gc->state.tmuMask |= tmuMask; - localColorP = FXTRUE; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER: - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL: - texturemode |= SST_TC_ADD_CLOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA: - texturemode |= SST_TC_ADD_ALOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL: - texturemode |= SST_TC_SUB_CLOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL: - texturemode |= SST_TC_SUB_CLOCAL | SST_TC_ADD_CLOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL_ALPHA: - texturemode |= SST_TC_SUB_CLOCAL | SST_TC_ADD_ALOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL: - texturemode |= SST_TC_ZERO_OTHER | SST_TC_SUB_CLOCAL | SST_TC_ADD_CLOCAL; - gc->state.tmuMask |= tmuMask; - localColorP = ((rgb_factor & 0x07UL) != GR_COMBINE_FACTOR_OTHER_ALPHA); - break; - - case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA: - texturemode |= SST_TC_ZERO_OTHER | SST_TC_SUB_CLOCAL | SST_TC_ADD_ALOCAL; - gc->state.tmuMask |= tmuMask; - localColorP = ((rgb_factor & 0x07UL) != GR_COMBINE_FACTOR_OTHER_ALPHA); - break; - } - - switch (alpha_function) { - case GR_COMBINE_FUNCTION_ZERO: - texturemode |= SST_TCA_ZERO_OTHER; - localAlphaP = FXTRUE; - break; - - case GR_COMBINE_FUNCTION_LOCAL: - texturemode |= SST_TCA_ZERO_OTHER | SST_TCA_ADD_CLOCAL; - gc->state.tmuMask |= tmuMask; - localAlphaP = FXTRUE; - break; - - case GR_COMBINE_FUNCTION_LOCAL_ALPHA: - texturemode |= SST_TCA_ZERO_OTHER | SST_TCA_ADD_ALOCAL; - gc->state.tmuMask |= tmuMask; - localAlphaP = FXTRUE; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER: - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL: - texturemode |= SST_TCA_ADD_CLOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA: - texturemode |= SST_TCA_ADD_ALOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL: - texturemode |= SST_TCA_SUB_CLOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL: - texturemode |= SST_TCA_SUB_CLOCAL | SST_TCA_ADD_CLOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL_ALPHA: - texturemode |= SST_TCA_SUB_CLOCAL | SST_TCA_ADD_ALOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL: - texturemode |= SST_TCA_ZERO_OTHER | SST_TCA_SUB_CLOCAL | SST_TCA_ADD_CLOCAL; - gc->state.tmuMask |= tmuMask; - localAlphaP = ((alpha_factor & 0x07UL) != GR_COMBINE_FACTOR_OTHER_ALPHA); - break; - - case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA: - texturemode |= SST_TCA_ZERO_OTHER | SST_TCA_SUB_CLOCAL | SST_TCA_ADD_ALOCAL; - gc->state.tmuMask |= tmuMask; - localAlphaP = ((alpha_factor & 0x07UL) != GR_COMBINE_FACTOR_OTHER_ALPHA); - break; - } - - /* Hack to enable TWO-PASS Trilinear */ - if (texturemode & SST_TRILINEAR) { - if ((texturemode & SST_TC_ZERO_OTHER) && - (texturemode & SST_TC_BLEND_LODFRAC) && - !(texturemode & SST_TC_REVERSE_BLEND)) { - tLod |= SST_LOD_ODD; - } - } - tLod |= _gr_evenOdd_xlate_table[gc->state.tmu_config[tmu].evenOdd]; - - /* Update shadows */ - gc->state.tmu_config[tmu].textureMode = texturemode; - gc->state.tmu_config[tmu].tLOD = tLod; - -#if 1 - /* If the state of a tmu changes from active then make sure that it - * is addressing some valid tiny texture so taht it does not spend - * time thrashing on a large texture access. - * - * NB: We don't update the shadow here so the other bits in the - * register shadow should be unchanged. - */ - { - const FxI32 upstreamTmu = tmu + 1; - - if (upstreamTmu < gc->num_tmu) { - if (localColorP && localAlphaP) { - SstRegs* tmuHw = SST_TMU(hw, upstreamTmu); - - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET((0x02UL << upstreamTmu), tmuHw, tLOD, SST_TLOD_MINMAX_INT(GR_LOD_1, GR_LOD_1)); - GR_CHECK_SIZE(); - - gc->hwDep.cvgDep.tmuLodDisable[upstreamTmu] = FXTRUE; - - GDBG_INFO(gc->myLevel, FN_NAME": Disabling tmu(%ld) : (0x%X : 0x%X)\n", - upstreamTmu, rgb_function, alpha_function); - } else if (gc->hwDep.cvgDep.tmuLodDisable[upstreamTmu]) { - SstRegs* tmuHw = SST_TMU(hw, upstreamTmu); - - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET((0x02UL << upstreamTmu), tmuHw, tLOD, gc->state.tmu_config[upstreamTmu].tLOD); - GR_CHECK_SIZE(); - - gc->hwDep.cvgDep.tmuLodDisable[upstreamTmu] = FXFALSE; - } - } - /* If this tmu is inactive then also do the reset for the register - * write, but not in the shadow so that the remaining bits are - * retained. - */ - if ((gc->state.tmuMask & tmuMask) == 0) { - tLod = SST_TLOD_MINMAX_INT(GR_LOD_1, GR_LOD_1); - } - } -#endif - - /* update register */ - { - SstRegs* tmuHw = SST_TMU(hw, tmu); - - REG_GROUP_BEGIN((0x02 << tmu), textureMode, 2, 0x3); - { - REG_GROUP_SET(tmuHw, textureMode , texturemode); - REG_GROUP_SET(tmuHw, tLOD, tLod); - } - REG_GROUP_END(); - } - - /* Make sure that the trilinear blending bits are set in a - * consistent manner across the tmu's. This only really matters if - * we have multiple tmu's, but this state is really setup across - * multiple calls (grTexCombine, grTexMipMapMode, and - * grTexSource). - * - * NB: This must happen after the shadows are updated because - * _grTexCheckTriLinear() will use the shadow register values - * to determine the current state of trilinearness. - */ - if (gc->num_tmu > 1) _grTexCheckTriLinear(tmu); - - /* update paramIndex */ - _grUpdateParamIndex(); - - GR_END(); -#undef FN_NAME -} /* grTexCombine */ - -/* -** _grTexDetailControl, NOTE: its up to caller to account for bytes -*/ -GR_DDFUNC(_grTexDetailControl, void, (GrChipID_t tmu, FxU32 detail)) -{ -#define FN_NAME "_grTexDetailControl" - GR_BEGIN(FN_NAME,88,4, 1); - GDBG_INFO_MORE(gc->myLevel, "(%d, 0x%X)\n", tmu, detail); - GR_CHECK_TMU(FN_NAME, tmu); - - GR_SET((0x02UL << tmu), SST_TMU(hw, tmu), tDetail, detail); - gc->state.tmu_config[tmu].tDetail = detail; - - GR_END(); -#undef FN_NAME -} /* _grTexDetailControl */ - -/*--------------------------------------------------------------------------- -** grTexFilterMode -*/ - -GR_ENTRY(grTexFilterMode, void, - (GrChipID_t tmu, GrTextureFilterMode_t minfilter, GrTextureFilterMode_t magfilter)) -{ -#define FN_NAME "grTexFilterMode" - FxU32 texMode; - - GR_BEGIN("grTexFilterMode",99,4, 1); - GDBG_INFO_MORE(gc->myLevel,"(%d,%d,%d)\n",tmu,minfilter,magfilter); - GR_CHECK_TMU(FN_NAME, tmu); - - texMode = gc->state.tmu_config[tmu].textureMode; - texMode &= ~(SST_TMINFILTER | SST_TMAGFILTER); - texMode |= (minfilter == GR_TEXTUREFILTER_BILINEAR ? SST_TMINFILTER : 0) | - (magfilter == GR_TEXTUREFILTER_BILINEAR ? SST_TMAGFILTER : 0); - - GR_SET((0x02UL << tmu), SST_TMU(hw, tmu), textureMode, texMode); - gc->state.tmu_config[tmu].textureMode = texMode; - - GR_END(); -#undef FN_NAME -} /* grTexFilterMode */ - -/*--------------------------------------------------------------------------- -** grTexLodBiasValue -*/ - -GR_ENTRY(grTexLodBiasValue, void, - (GrChipID_t tmu, float fvalue)) -{ -#define FN_NAME "grTexLodBiasValue" - FxU32 tLod; - - GR_BEGIN("grTexLodBiasValue",88,4, 1); - GDBG_INFO_MORE(gc->myLevel,"(%d,%g)\n",tmu,fvalue); - GR_CHECK_TMU(FN_NAME, tmu); - - tLod = gc->state.tmu_config[tmu].tLOD; - tLod &= ~(SST_LODBIAS); - tLod |= _grTexFloatLODToFixedLOD(fvalue) << SST_LODBIAS_SHIFT; - - GR_SET((0x02 << tmu), SST_TMU(hw, tmu), tLOD, tLod); - gc->state.tmu_config[tmu].tLOD = tLod; - - GR_END(); -#undef FN_NAME -} /* grTexLodBiasValue */ - -/*------------------------------------------------------------------- - Function: grTexMipMapMode - Date: 6/2 - Implementor(s): GaryMcT, Jdt - Library: glide - Description: - Sets the mip map mode for the specified TMU - "Ex" because glide's grTexMipMapMode is inadequate for - low level texture memory management - Arguments: - tmu - tmu to update - mmMode - mipmap mode - One of: - GR_MIPMAP_DISABLE - GR_MIPMAP_NEAREST - GR_MIPMAP_NEAREST_DITHER - lodBlend - enable lodBlending - FXTRUE - enabled - FXFALSE - disabled - Return: - none - -------------------------------------------------------------------*/ - -GR_ENTRY(grTexMipMapMode, void, - (GrChipID_t tmu, GrMipMapMode_t mmMode, FxBool lodBlend)) -{ -#define FN_NAME "grTexMipMapMode" - FxU32 - tLod, - texMode; - - GR_BEGIN_NOFIFOCHECK("grTexMipMapMode",88); - GDBG_INFO_MORE(gc->myLevel,"(%d,%d,%d)\n",tmu,mmMode,lodBlend); - GR_CHECK_TMU(FN_NAME, tmu); - - /*-------------------------------------------------------------- - Get Current tLod and texMode register values - --------------------------------------------------------------*/ - tLod = gc->state.tmu_config[tmu].tLOD; - texMode = gc->state.tmu_config[tmu].textureMode; - - /*-------------------------------------------------------------- - Clear LODMIN, LODMAX and LODDITHER - --------------------------------------------------------------*/ - tLod &= ~(SST_LODMIN | SST_LODMAX | SST_LOD_ODD); - texMode &= ~(SST_TLODDITHER | SST_TRILINEAR); - - /*-------------------------------------------------------------- - Encode Mipmap Mode Bits - --------------------------------------------------------------*/ - switch (mmMode) { - case GR_MIPMAP_DISABLE: - /*---------------------------------------------------------- - To disable mipmapping set the min and max lods to the same - value - ----------------------------------------------------------*/ - tLod |= SST_TLOD_MINMAX_INT(gc->state.tmu_config[tmu].largeLod, - gc->state.tmu_config[tmu].largeLod); - break; - - case GR_MIPMAP_NEAREST_DITHER: - if (gc->state.allowLODdither) texMode |= SST_TLODDITHER; - /* intentional fall-through to set lodmin and lodmax values */ - - case GR_MIPMAP_NEAREST: - /*---------------------------------------------------------- - Set LODMIN and LODMAX in the tLod register to the - actual min and max LODs of the current texture. - ----------------------------------------------------------*/ - tLod |= SST_TLOD_MINMAX_INT(gc->state.tmu_config[tmu].largeLod, - gc->state.tmu_config[tmu].smallLod); - break; - - default: - GrErrorCallback("grTexMipMapMode: invalid mode passed", FXFALSE); - break; - } - gc->state.tmu_config[tmu].mmMode = mmMode; - - /* 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; - - /*-------------------------------------------------------------- - Fix trilinear and evenOdd bits - - - This is a bit of a hack to make two pass trilinear work with - full textures. The assumption here is that the only reason - you would ever set up Multiply by LODFRAC w/o REVERSE BLEND - is for the ODD pass of trilinear. - --------------------------------------------------------------*/ - if (lodBlend) { - /* If we're doing trilinear for real then nuke the lod dithering - * at the same time because it just looks bad. - */ - texMode = ((texMode & ~SST_TLODDITHER) | SST_TRILINEAR); - - if ((texMode & SST_TC_ZERO_OTHER) && - (texMode & SST_TC_BLEND_LODFRAC) && - !(texMode & SST_TC_REVERSE_BLEND)) { - tLod |= SST_LOD_ODD; - } - } - tLod |= _gr_evenOdd_xlate_table[gc->state.tmu_config[tmu].evenOdd]; - - /*-------------------------------------------------------------- - Write State To Hardware and Update Glide Shadow State - --------------------------------------------------------------*/ - hw = SST_TMU(hw, tmu); - REG_GROUP_BEGIN((0x02UL << tmu), textureMode, 2, 0x03); - { - REG_GROUP_SET(hw, textureMode , texMode); - REG_GROUP_SET(hw, tLOD , tLod); - } - REG_GROUP_END(); - - gc->state.tmu_config[tmu].tLOD = tLod; - gc->state.tmu_config[tmu].textureMode = texMode; - - /* Make sure that the trilinear blending bits are set in a - * consistent manner across the tmu's. This only really matters if - * we have multiple tmu's, but this state is really setup across - * multiple calls (grTexCombine, grTexMipMapMode, and - * grTexSource). - * - * NB: This must happen after the shadows are updated because - * _grTexCheckTriLinear() will use the shadow register values - * to determine the current state of trilinearness. - */ - if (gc->num_tmu > 1) _grTexCheckTriLinear(tmu); - - GR_END(); -#undef FN_NAME -} /* grTexMipMapMode */ - -/*------------------------------------------------------------------- - Function: grTexMinAddress - Date: 6/2 - Implementor(s): GaryMcT, Jdt - Library: glide - Description: - Returns address of start of texture ram for a TMU - Arguments: - tmu - Return: - integer texture base address, this pointer is not to be dereferenced - by the application, it is on to be used by grTexDownload(), - and grTExDownloadLevel() - -------------------------------------------------------------------*/ -/*------------------------------------------------------------------- - Function: grTexNCCTable - Date: 6/3 - Implementor(s): jdt - Library: glide - Description: - select one of the two NCC tables - Arguments: - tmu - which tmu - table - which table to select - One of: - GR_TEXTABLE_NCC0 - GR_TEXTABLE_NCC1 - GR_TEXTABLE_PALETTE - Return: - none - -------------------------------------------------------------------*/ - -GR_ENTRY(grTexNCCTable, void, - (GrChipID_t tmu, GrNCCTable_t table)) -{ -#define FN_NAME "grTexNCCTable" - FxU32 texMode; - - GR_BEGIN("grTexNCCTable",88,4, 1); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",tmu); - GR_CHECK_TMU(FN_NAME, tmu); - GR_CHECK_F(FN_NAME, table > GR_TEXTABLE_PALETTE, "invalid ncc table specified"); - - /*------------------------------------------------------------------ - Update local state - ------------------------------------------------------------------*/ - gc->state.tmu_config[tmu].nccTable = table; - - /*------------------------------------------------------------------ - Grab shadow texMode, update TexMode, update shadow/real register - ------------------------------------------------------------------*/ - texMode = gc->state.tmu_config[tmu].textureMode; - texMode &= ~(SST_TNCCSELECT); - if (table == GR_TEXTABLE_NCC1) - texMode |= SST_TNCCSELECT; - else - texMode &= ~(SST_TNCCSELECT); - - GR_SET((0x02UL << tmu), SST_TMU(hw, tmu), textureMode, texMode); - gc->state.tmu_config[tmu].textureMode = texMode; - - GR_END(); -#undef FN_NAME -} /* grTexNCCTable */ - -/*------------------------------------------------------------------- - Function: grTexSource - Date: 6/2 - Implementor(s): GaryMcT, Jdt - Library: glide - Description: - Sets up the current texture for texture mapping on the specified - TMU. - Arguments: - tmu - which tmu - startAddress - texture start address - 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 containing - texture dimensions - Return: - none - -------------------------------------------------------------------*/ -GR_ENTRY(grTexSource, void, - (GrChipID_t tmu, FxU32 startAddress, FxU32 evenOdd, GrTexInfo *info)) -{ -#define FN_NAME "grTexSource" - FxU32 baseAddress, texMode, tLod; - - GR_BEGIN_NOFIFOCHECK("grTexSource",88); - GDBG_INFO_MORE(gc->myLevel,"(%d,0x%x,%d,0x%x)\n",tmu,startAddress,evenOdd,info); - GR_CHECK_TMU(FN_NAME, tmu); - GR_CHECK_COMPATABILITY(FN_NAME, - startAddress >= gc->tmu_state[tmu].total_mem, - "invalid startAddress"); - - GR_CHECK_COMPATABILITY(FN_NAME, - (startAddress + grTexTextureMemRequired(evenOdd, info) >= - gc->tmu_state[tmu].total_mem), - "insufficient texture ram at startAddress"); - GR_CHECK_F(FN_NAME, evenOdd > 0x3 || evenOdd == 0, "evenOdd mask invalid"); - GR_CHECK_F(FN_NAME, !info, "invalid info pointer"); - - /*------------------------------------------------------------- - Update Texture Unit State - -------------------------------------------------------------*/ - gc->state.tmu_config[tmu].smallLod = info->smallLod; - gc->state.tmu_config[tmu].largeLod = info->largeLod; - gc->state.tmu_config[tmu].evenOdd = evenOdd; - - /*------------------------------------------------------------- - Calculate Base Address - -------------------------------------------------------------*/ - baseAddress = _grTexCalcBaseAddress(startAddress, - info->largeLod, - info->aspectRatio, - info->format, - evenOdd) >> 3; -#if (GLIDE_PLATFORM & GLIDE_HW_H3) - baseAddress = ((baseAddress << 3) & ~0x0F); - baseAddress += 0x200000; -#endif - - /*------------------------------------------------------------- - Update Texture Mode - -------------------------------------------------------------*/ - texMode = gc->state.tmu_config[tmu].textureMode; - texMode &= ~SST_TFORMAT; - texMode |= (info->format << SST_TFORMAT_SHIFT) | SST_TPERSP_ST | SST_TCLAMPW; - - /*------------------------------------------------------------- - Compute TLOD (keep LODBIAS in tact) - -------------------------------------------------------------*/ - tLod = gc->state.tmu_config[tmu].tLOD; - tLod &= ~(SST_LODMIN | - SST_LODMAX | - SST_LOD_ASPECT | - SST_LOD_TSPLIT | - SST_LOD_ODD | - SST_LOD_S_IS_WIDER); - tLod |= SST_TLOD_MINMAX_INT(info->largeLod, - ((gc->state.tmu_config[tmu].mmMode == GR_MIPMAP_DISABLE) - ? info->largeLod - : info->smallLod)); - tLod |= _gr_evenOdd_xlate_table[evenOdd]; - tLod |= _gr_aspect_xlate_table[info->aspectRatio]; - - /* 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; - - /* Make sure that the trilinear blending bits are set in a - * consistent manner across the tmu's. This only really matters if - * we have multiple tmu's, but this state is really setup across - * multiple calls (grTexCombine, grTexMipMapMode, and - * grTexSource). - * - * NB: This must happen after the shadows are updated because - * _grTexCheckTriLinear() will use the shadow register values - * to determine the current state of trilinearness. - */ - if (gc->num_tmu > 1) _grTexCheckTriLinear(tmu); - - GR_END(); -#undef FN_NAME -} - -/*------------------------------------------------------------------- - Function: grTexMultibase - Date: 11/4/96 - Implementor(s): gmt - Library: Glide - Description: - Enable multiple base addresses for texturing. - Arguments: - tmu - which tmu - enable - flag which enables/disables multibase - Return: - none - -------------------------------------------------------------------*/ - -GR_ENTRY(grTexMultibase, void, - (GrChipID_t tmu, FxBool enable)) -{ -#define FN_NAME "grTexMultibase" - FxU32 tLod; - - GR_BEGIN("grTexMultibase",88,4,1); - GDBG_INFO_MORE(gc->myLevel,"(%d,%d)\n",tmu,enable); - GR_CHECK_TMU(FN_NAME,tmu); - - tLod = gc->state.tmu_config[tmu].tLOD; - if (enable) - tLod |= SST_TMULTIBASEADDR; - else - tLod &= ~SST_TMULTIBASEADDR; - /*-------------------------------------------------------------- - Write State To Hardware and Update Glide Shadow State - --------------------------------------------------------------*/ - GR_SET((0x02UL << tmu), SST_TMU(hw, tmu), tLOD, tLod); - gc->state.tmu_config[tmu].tLOD = tLod; - - GR_END(); -#undef FN_NAME -} /* grTexMultibase */ - -/*------------------------------------------------------------------- - Function: grTexMultibaseAddress - Date: 11/4/96 - Implementor(s): gmt - Library: Glide - Description: - Set the base address for a particular set of mipmaps - Arguments: - tmu - which tmu - range - range of lods that are based at this starting address - One of: - GR_TEXBASE_256 - GR_TEXBASE_128 - GR_TEXBASE_64 - GR_TEXBASE_32_TO_1 - startAddress - start address that data was downloaded to - hardware with using grTexDownload/Level - info - pointer to GrTexInfo structure containing - texture dimensions - Return: - none - -------------------------------------------------------------------*/ - -GR_ENTRY(grTexMultibaseAddress, void, - (GrChipID_t tmu, GrTexBaseRange_t range, FxU32 startAddress, FxU32 evenOdd, GrTexInfo *info)) -{ -#define FN_NAME "grTexMultibaseAddress" - FxU32 baseAddress; - const FifoChipField tmuChip = (FifoChipField)(0x02UL << tmu); - GR_BEGIN("grTexMultibaseAddress",88,4,1); - GDBG_INFO_MORE(gc->myLevel,"(%d,%d,0x%x)\n",tmu,range,startAddress); - GR_CHECK_TMU(FN_NAME, tmu); - GR_CHECK_F(FN_NAME, range > GR_TEXBASE_32_TO_1, "invalid range"); - GR_CHECK_F(FN_NAME, startAddress >= gc->tmu_state[tmu].total_mem, "invalid startAddress"); - GR_CHECK_F(FN_NAME, evenOdd > 0x3, "evenOdd mask invalid"); - GR_CHECK_F(FN_NAME, info, "invalid info pointer"); - - - /* Write relevant registers out to hardware and shadows */ - hw = SST_TMU(hw,tmu); - switch (range) { - case GR_TEXBASE_256: - baseAddress = _grTexCalcBaseAddress(startAddress, - GR_LOD_256, - info->aspectRatio, - info->format, - evenOdd) >> 3; - GR_SET(tmuChip, hw, texBaseAddr, baseAddress); - gc->state.tmu_config[tmu].texBaseAddr = baseAddress; - break; - - case GR_TEXBASE_128: - baseAddress = _grTexCalcBaseAddress(startAddress, - GR_LOD_128, - info->aspectRatio, - info->format, - evenOdd) >> 3; - GR_SET(tmuChip, hw, texBaseAddr1, baseAddress); - gc->state.tmu_config[tmu].texBaseAddr_1 = baseAddress; - break; - - case GR_TEXBASE_64: - baseAddress = _grTexCalcBaseAddress(startAddress, - GR_LOD_64, - info->aspectRatio, - info->format, - evenOdd) >> 3; - GR_SET(tmuChip, hw, texBaseAddr2, baseAddress); - gc->state.tmu_config[tmu].texBaseAddr_2 = baseAddress; - break; - - case GR_TEXBASE_32_TO_1: - baseAddress = _grTexCalcBaseAddress(startAddress, - GR_LOD_32, - info->aspectRatio, - info->format, - evenOdd) >> 3; - GR_SET(tmuChip, hw, texBaseAddr38, baseAddress); - gc->state.tmu_config[tmu].texBaseAddr_3_8 = baseAddress; - break; - } - - GR_END(); -#undef FN_NAME -} /* grTexMultibaseAddress */ diff --git a/glide2x/cvg/glide/src/gtexdl.c b/glide2x/cvg/glide/src/gtexdl.c deleted file mode 100644 index b0ec6f6..0000000 --- a/glide2x/cvg/glide/src/gtexdl.c +++ /dev/null @@ -1,825 +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. -** -** -** 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 -#include -#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; - FxU32 max_s, width, tmu_baseaddress; -#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(); - } - - /*------------------------------------------------------------ - 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, thisLod); - 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, thisLod); - } - 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, thisLod); - } - 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, thisLod); - } - 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, thisLod); - - 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, thisLod); - 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, thisLod); - } - 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, thisLod); - } - break; - - default: - for (; t <= max_t; t++) { - FxU32 s; - - tex_address = tmu_baseaddress + TEX_ROW_ADDR_INCR(t, thisLod); - - /* 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; - } - } - - /*------------------------------------------------------------ - 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>1; - expected_size=max_s*5; - - rle_line_end=rle_line+width+u0; - for(t=0;ttex_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, thisLod); - 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 -} - - - - - - diff --git a/glide2x/cvg/glide/src/gu.c b/glide2x/cvg/glide/src/gu.c deleted file mode 100644 index dddb669..0000000 --- a/glide2x/cvg/glide/src/gu.c +++ /dev/null @@ -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 -#include -#include "fxglide.h" - -#if ( (GLIDE_PLATFORM & GLIDE_SST_HW) && (GLIDE_PLATFORM & GLIDE_HW_SST1) ) -#include -#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; -} diff --git a/glide2x/cvg/glide/src/guclip.c b/glide2x/cvg/glide/src/guclip.c deleted file mode 100644 index 8b5d156..0000000 --- a/glide2x/cvg/glide/src/guclip.c +++ /dev/null @@ -1,444 +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$ - * - * 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 -#include -#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 */ diff --git a/glide2x/cvg/glide/src/gump.c b/glide2x/cvg/glide/src/gump.c deleted file mode 100644 index 513d644..0000000 --- a/glide2x/cvg/glide/src/gump.c +++ /dev/null @@ -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 -#include -#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)) -{ -} diff --git a/glide2x/cvg/glide/src/gump.h b/glide2x/cvg/glide/src/gump.h deleted file mode 100644 index b8f6404..0000000 --- a/glide2x/cvg/glide/src/gump.h +++ /dev/null @@ -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__ */ diff --git a/glide2x/cvg/glide/src/gutex.c b/glide2x/cvg/glide/src/gutex.c deleted file mode 100644 index 2ad1eef..0000000 --- a/glide2x/cvg/glide/src/gutex.c +++ /dev/null @@ -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 -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include -#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 */ - - diff --git a/glide2x/cvg/glide/src/gxdraw.c b/glide2x/cvg/glide/src/gxdraw.c deleted file mode 100644 index b208cda..0000000 --- a/glide2x/cvg/glide/src/gxdraw.c +++ /dev/null @@ -1,583 +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$ -** -** 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 - -#define FX_DLL_DEFINITION -#include -#include -#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 - { - 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) << 0UL) | - (RGBA_COMP_CLAMP(curVertex->g) << 8UL) | - (RGBA_COMP_CLAMP(curVertex->r) << 16UL)); - if (hasAlpha) packedVal |= (RGBA_COMP_CLAMP(curVertex->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 */ diff --git a/glide2x/cvg/glide/src/makefile b/glide2x/cvg/glide/src/makefile deleted file mode 100644 index 7685543..0000000 --- a/glide2x/cvg/glide/src/makefile +++ /dev/null @@ -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 - diff --git a/glide2x/cvg/glide/src/makefile.linux b/glide2x/cvg/glide/src/makefile.linux deleted file mode 100644 index 44f990b..0000000 --- a/glide2x/cvg/glide/src/makefile.linux +++ /dev/null @@ -1,263 +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 -ifeq ($(FX_GLIDE_HW),cvg) -FX_GLIDE_REAL_HW= 1 -FX_GLIDE_CTRISETUP = 0 - -HWSPEC = fifo.c -LCDEFS += -DCVG \ - -DGLIDE_CHIP_BROADCAST=1 -DGLIDE_DEFAULT_GAMMA=1.3 \ - -DGLIDE_BLIT_CLEAR=1 - -else -ifeq ($(FX_GLIDE_HW),H3) -FX_GLIDE_REAL_HW= 1 -FX_GLIDE_NO_FIFO= 1 -FX_GLIDE_CTRISETUP = 1 -HWSPEC = fifo.c -LCDEFS += -DH3 \ - -DGLIDE_HW_TRI_SETUP=1 -DGLIDE_PACKET3_TRI_SETUP=0 -else -error "FX_GLIDE_HW == unknown value (H3|CVG)" -endif -endif - -ifeq ($(DEBUG),1) -DBGOPTS = -DGLIDE_DEBUG -DGDBG_INFO_ON -GLIDE_SANITY_ALL = 1 -endif - -ifeq ($(FX_GLIDE_HW),) -error "FX_GLIDE_HW not defined" -endif - -# Display Options -DSPOPTS = -SUBLIBRARIES = - -ifeq ($(HAL_HW),1) -DSPOPTS += -DHAL_HW=1 -SUBLIBRARIES += $(BUILD_ROOT)/$(FX_GLIDE_HW)/lib/libsst1init.a \ - $(BUILD_ROOT_SWLIBS)/lib/libfxmisc.a \ - $(BUILD_ROOT_SWLIBS)/lib/libfxpci.a -endif -ifeq ($(DSPOPTS),) -error "Unknown HAL_* configuration" -endif - -# GLIDE_HW_TRI_SETUP: Use the hw TSU for triangle rendering. -# GLIDE_TRI_CULLING: Cull backfaced/zero area triangles in sw before the fifo. -# NB: This must be set if GLIDE_HW_TRI_SETUP=0 -ifeq ($(FX_GLIDE_SW_SETUP),1) -LCDEFS += -DGLIDE_HW_TRI_SETUP=0 -DGLIDE_TRI_CULLING=1 -FX_GLIDE_CTRISETUP = 1 -else -# Do culling test in sw for independent triangles -CULL_MODE = -DGLIDE_TRI_CULLING=0 -ifeq ($(FX_GLIDE_HW_CULL),1) -CULL_MODE = -DGLIDE_TRI_CULLING=1 -endif -DSPOPTS += $(CULL_MODE) - -# Send a single DWORD ARGB rather than 4 fp values, at -# the cost of doing the conversion. -ifeq ($(FX_GLIDE_PACK_RGB),1) -LCDEFS += -DGLIDE_PACKED_RGB=1 -endif - -endif - -ifneq ($(FX_GLIDE_NO_FIFO),1) -FIFODEFS = -DUSE_PACKET_FIFO=1 \ - -DGLIDE_HW_TRI_SETUP=1 -DGLIDE_PACKET3_TRI_SETUP=1 - -ifeq ($(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 += -DGLIDE_USE_DEBUG_FIFO=1 -DFIFO_ASSERT_FULL=1 \ - -DASSERT_FAULT=0 #-DGLIDE_SANITY_SIZE=1 -endif -else -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) -ifeq ($(FX_GLIDE_CTRISETUP),1) -ASMTRISETUP = -ATSOPTS = -DGLIDE_USE_C_TRISETUP -CFILES = gxdraw.c -else -ASMTRISETUP = xdraw2.S -DSPOPTS += -DGLIDE_DISPATCH_SETUP=1 -DGLIDE_PACKED_RGB=0 -endif - -OPTOPTS = $(GRMOPTS) $(OTSOPTS) $(ATSOPTS) - -# local defines, begin with basics and then add on -LCDEFS += -DGLIDE_LIB - -ifeq ($(FX_GLIDE_CRYBABY),1) -LCDEFS += -DGLIDE_CHECK_COMPATABILITY=1 -endif - -# Turn Off/On compilation of shameless plug -ifeq ($(FX_GLIDE_NO_PLUG),1) -else -LCDEFS += -DGLIDE_PLUG -endif - -# Turn Off/On splash screen -ifeq ($(FX_GLIDE_NO_SPLASH),1) -else -LCDEFS += -DGLIDE_SPLASH -endif - -#Glide 3 Stuff, for migration all -ifneq ($(FX_GLIDE3),) -LCDEFS += -DGLIDE3 -GLIDE3FILES = gstrip.c distrip.c distate.c diget.c -endif - -#Glide 3. remove migration stuff -ifneq ($(FX_GLIDE3_ALPHA),) -LCDEFS += -DGLIDE3_ALPHA -GLIDE3FILES = gstrip.c distrip.c distate.c diget.c -endif - -ifneq ($(GLIDE_SANITY_ALL)$(GLIDE_SANITY_SIZE),) -LCDEFS += -DGLIDE_SANITY_SIZE -endif -ifneq ($(GLIDE_SANITY_ALL)$(GLIDE_SANITY_ASSERT),) -LCDEFS += -DGLIDE_SANITY_ASSERT -endif - -# Local Defs, Includes, and Options (C) -LCINCS += -I$(BUILD_ROOT)/$(FX_GLIDE_HW)/include -LCOPTS = $(DBGOPTS) $(DSPOPTS) $(OPTOPTS) - -# Local Defs, Includes, and Options (ASM) -LADEFS += $(ASM_REGMAP_DEFS) -LAINCS = -I$(BUILD_ROOT)/$(FX_GLIDE_HW)/include -LAOPTS = $(DBGOPTS) $(DSPOPTS) $(OPTOPTS) - -AFILES = $(ASMTRISETUP) - -# 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 += 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) \ - cpudetect.c - -OFILES = $(CFILES:.c=.o) - -OTHER_CFILES = fxgasm.c fxbldno.c fxinline.h - -CODFILES = $(CFILES:.c=.cod) - -# targets -LDIRT = fxgasm.o fxgasm fxgasm.h fxinline.h fxbldno.o fxbldno fxbldno.h - -ifeq ($(FX_GLIDE3),1) -LIBRARIES = libglide3.a -SHARED_LIBRARY = libglide3.so.3.01 -else -LIBRARIES = libglide.a -SHARED_LIBRARY = libglide.so.2.53 -endif -RCFILE = glide.rc - -# 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 - - -LCDEFS += $(FIFODEFS) - -include $(BUILD_ROOT)/swlibs/include/make/3dfx.mak - -codfiles: $(CODFILES) - -ctags: $(CFILES) - ctags $(CFILES) - -gbanner.o : banner.inc -gsplash.o : splshdat.c - - -#-------------------------------------------------------------------------- -# special rules for making FXGASM.H -# -fxgasm: fxgasm.c $(HEADERS) gsstdef.h fxglide.h - $(CC) -o $@ fxgasm.c $(GCDEFS) $(LCDEFS) $(VCDEFS) $(LCOPTS) \ - -I$(BUILD_ROOT)/$(FX_GLIDE_HW)/include -I$(BUILD_ROOT)/swlibs/include $(LDFLAGS) - -fxgasm.h: fxgasm - ./fxgasm > fxgasm.h -fxinline.h: fxgasm - ./fxgasm -inline > fxinline.h - -#-------------------------------------------------------------------------- -# special rules for making FXBLDNO.H -# - -fxbldno: fxbldno.c $(HEADERS) $(PRIVATE_HEADERS) - $(CC) -o $@ fxbldno.c $(GCDEFS) $(LCDEFS) $(VCDEFS) $(LCOPTS) $(LDFLAGS) - -fxbldno.h: fxbldno.exe - fxbldno > fxbldno.h - -glide.res: rcver.h fxbldno.h -gglide.obj: rcver.h - -ifeq ($(FX_GLIDE_CTRISETUP),1) -gdraw.o: fxinline.h -endif - -xdraw2.o : xdraw2.S xdraw2.inc.S fxgasm.h fxinline.h - gasp xdraw2.S $(ASM_OPTS) $(LAOPTS) | as -V -Qy -o xdraw2.o - -cpudtect.o : - gasp cpudtect.S $(LAOPTS) | as -V -Qy -o cpudtect.o diff --git a/glide2x/cvg/glide/src/rcver.h b/glide2x/cvg/glide/src/rcver.h deleted file mode 100644 index 83b66e1..0000000 --- a/glide2x/cvg/glide/src/rcver.h +++ /dev/null @@ -1,28 +0,0 @@ - -#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 diff --git a/glide2x/cvg/glide/src/readme b/glide2x/cvg/glide/src/readme deleted file mode 100644 index 35875f3..0000000 --- a/glide2x/cvg/glide/src/readme +++ /dev/null @@ -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 - diff --git a/glide2x/cvg/glide/src/splshdat.c b/glide2x/cvg/glide/src/splshdat.c deleted file mode 100644 index 34e7133..0000000 --- a/glide2x/cvg/glide/src/splshdat.c +++ /dev/null @@ -1,14791 +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:13 joseph -** Initial checkin into SourceForge. -** -** -** 7 2/20/98 11:00a Peter -** removed glide3 from glid2 tree - * - * 6 1/09/98 6:48p Atai - * grTexInfo, GR_LOD_* and GR_ASPECT_* - * - * 5 12/09/97 10:20a Peter - * removed extraneous cruft - * - * 4 6/02/97 4:09p Peter - * Compile w/ gcc for Dural - * - * 3 5/21/97 6:05a Peter -** -*/ - -static Vert vert_0[] = { -{ 273.149261f, -24.549585f, 271.420441f, 0.012590f, -0.999890f, 0.007876f, 189.411841f, 18.708570f }, -{ 262.776489f, -24.549574f, 143.489777f, 0.005015f, -0.999765f, 0.021108f, 187.071440f, 69.986058f }, -{ 484.061951f, -24.549578f, 188.438385f, 0.011169f, -0.999936f, -0.001735f, 236.999758f, 51.969644f }, -{ 383.791992f, -24.549570f, 84.710793f, 0.010803f, -0.999785f, 0.017720f, 214.376000f, 93.546010f }, -{ 563.586426f, -24.549566f, 46.677605f, 0.009678f, -0.999914f, -0.008881f, 254.942760f, 108.790640f }, -{ 432.198181f, -24.549561f, -5.186394f, 0.013545f, -0.999894f, 0.005335f, 225.297815f, 129.578823f }, -{ 542.840820f, -24.549555f, -77.795677f, 0.007103f, -0.999894f, -0.012739f, 250.261958f, 158.682259f }, -{ 407.995087f, -24.549522f, -95.083649f, 0.013879f, -0.999904f, -0.000529f, 219.836900f, 165.611674f }, -{ 494.434692f, -24.549543f, -205.726379f, 0.002522f, -0.999903f, -0.013725f, 239.340159f, 209.959770f }, -{ 300.809937f, -24.549547f, -171.150482f, 0.015764f, -0.999874f, -0.001621f, 195.652869f, 196.100972f }, -{ 331.928192f, -24.549507f, -274.878052f, 0.002234f, -0.999897f, -0.014178f, 202.674041f, 237.677320f }, -{ 155.591354f, -24.549513f, -202.268799f, 0.011551f, -0.999861f, -0.012043f, 162.887410f, 208.573894f }, -{ 138.303436f, -24.549505f, -288.708374f, -0.003900f, -0.999855f, -0.016564f, 158.986767f, 243.220826f }, -{ -10.372740f, -24.549486f, -178.065643f, 0.019735f, -0.999598f, -0.020336f, 125.441172f, 198.872725f }, -{ -76.066864f, -24.549473f, -316.369080f, -0.005668f, -0.999796f, -0.019403f, 110.618699f, 254.307860f }, -{ -148.676147f, -24.549513f, -212.641541f, 0.006169f, -0.999812f, -0.018392f, 94.235969f, 212.731524f }, -{ -235.115784f, -24.549473f, -316.369080f, -0.011969f, -0.999851f, -0.012476f, 74.732718f, 254.307860f }, -{ -276.606812f, -24.549515f, -191.895996f, 0.001960f, -0.999741f, -0.022663f, 65.371153f, 204.416240f }, -{ -394.164703f, -24.549477f, -267.962891f, -0.008901f, -0.999940f, -0.006464f, 38.846733f, 234.905569f }, -{ -352.673676f, -24.549488f, -136.574646f, -0.001484f, -0.999702f, -0.024356f, 48.208294f, 182.242196f }, -{ -490.977112f, -24.549486f, -167.692871f, -0.010745f, -0.999942f, -0.000498f, 17.003084f, 194.715083f }, -{ -404.537445f, -24.549494f, -81.253296f, -0.011367f, -0.999900f, -0.008360f, 36.506343f, 160.068151f }, -{ -563.586426f, -24.549498f, -29.389488f, -0.008846f, -0.999795f, 0.018188f, 0.620349f, 139.279968f }, -{ -421.825378f, -24.549501f, 8.643953f, -0.014278f, -0.999891f, -0.003750f, 32.605693f, 124.035300f }, -{ -522.095337f, -24.549541f, 105.456299f, -0.006669f, -0.999881f, 0.013889f, 9.981924f, 85.230734f }, -{ -363.046448f, -24.549541f, 112.371468f, -0.021114f, -0.999733f, -0.009357f, 45.867897f, 82.458980f }, -{ -446.028503f, -24.549519f, 205.726318f, 0.001853f, -0.999682f, 0.025132f, 27.144776f, 45.040260f }, -{ -304.267487f, -24.549698f, 160.777710f, -0.020407f, -0.999774f, 0.005967f, 59.130113f, 63.056674f }, -{ -325.013000f, -24.549555f, 267.962860f, 0.003703f, -0.999746f, 0.022221f, 54.449330f, 20.094447f }, -{ -203.997513f, -24.549549f, 198.811157f, -0.010313f, -0.999774f, 0.018587f, 81.753890f, 47.811998f }, -{ -138.303391f, -24.549589f, 316.369080f, 0.008523f, -0.999823f, 0.016755f, 96.576363f, 0.692140f }, -{ -44.948593f, -24.549578f, 178.065643f, -0.007338f, -0.999733f, 0.021901f, 117.639871f, 56.127275f }, -{ 79.524475f, -24.549589f, 302.538696f, 0.018197f, -0.999766f, 0.011712f, 145.724552f, 6.235663f }, -{ 107.185158f, -24.549576f, 164.235291f, 0.002913f, -0.999764f, 0.021512f, 151.965595f, 61.670797f }, -{ 257.177246f, -24.933891f, 247.388947f, -0.002196f, -0.999908f, 0.013383f, 189.411841f, 18.708570f }, -{ 248.097778f, -24.933882f, 127.560898f, 0.006178f, -0.999976f, 0.003207f, 187.071440f, 69.986058f }, -{ 449.640747f, -24.933884f, 170.658722f, 0.002530f, -0.999944f, 0.010309f, 236.999758f, 51.969644f }, -{ 357.436859f, -24.933876f, 80.888054f, 0.006209f, -0.999981f, -0.000250f, 214.376000f, 93.546010f }, -{ 521.126526f, -24.933874f, 43.160934f, 0.006734f, -0.999927f, 0.010037f, 254.942760f, 108.790640f }, -{ 404.311340f, -24.933870f, -2.458469f, 0.006431f, -0.999963f, -0.005670f, 225.297815f, 129.578823f }, -{ 501.943878f, -24.933863f, -69.597458f, 0.008351f, -0.999957f, 0.004028f, 250.261958f, 158.682259f }, -{ 380.763092f, -24.933832f, -86.167274f, 0.003817f, -0.999973f, -0.006297f, 219.836900f, 165.611674f }, -{ 459.521820f, -24.933853f, -187.305740f, 0.007558f, -0.999970f, -0.001392f, 239.340159f, 209.959770f }, -{ 277.039581f, -24.933857f, -148.476547f, 0.001550f, -0.999981f, -0.006005f, 195.652869f, 196.100972f }, -{ 310.612000f, -24.933817f, -250.478271f, 0.010282f, -0.999945f, -0.002099f, 202.674041f, 237.677320f }, -{ 143.869293f, -24.933823f, -182.877960f, 0.000385f, -0.999975f, -0.007022f, 162.887410f, 208.573894f }, -{ 126.038422f, -24.933817f, -261.421204f, 0.007580f, -0.999942f, -0.007664f, 158.986767f, 243.220826f }, -{ -12.511669f, -24.933794f, -160.756546f, 0.000504f, -0.999969f, -0.007865f, 125.441172f, 198.872725f }, -{ -76.663612f, -24.933783f, -297.401611f, 0.011523f, -0.999829f, -0.014451f, 110.618699f, 254.307860f }, -{ -148.031876f, -24.933823f, -192.176437f, -0.004257f, -0.999964f, -0.007337f, 94.235969f, 212.731524f }, -{ -229.626144f, -24.933783f, -288.089294f, 0.004915f, -0.999922f, -0.011510f, 74.732718f, 254.307860f }, -{ -271.880676f, -24.933825f, -170.771347f, -0.005194f, -0.999973f, -0.005174f, 65.371153f, 204.416240f }, -{ -371.136383f, -24.933788f, -242.218704f, 0.003027f, -0.999922f, -0.012100f, 38.846733f, 234.905569f }, -{ -331.104309f, -24.933798f, -120.729073f, -0.004534f, -0.999987f, -0.002245f, 48.208294f, 182.242196f }, -{ -457.056519f, -24.933796f, -151.361816f, -0.000889f, -0.999896f, -0.014400f, 17.003084f, 194.715083f }, -{ -375.726990f, -24.933802f, -71.798042f, -0.008099f, -0.999961f, 0.003607f, 36.506343f, 160.068151f }, -{ -521.126587f, -24.933805f, -27.175323f, -0.006509f, -0.999977f, 0.001914f, 0.620349f, 139.279968f }, -{ -393.095642f, -24.933809f, 1.511459f, -0.005247f, -0.999950f, 0.008552f, 32.605693f, 124.035300f }, -{ -489.623932f, -24.933847f, 94.842606f, -0.009209f, -0.999957f, -0.000960f, 9.981924f, 85.230734f }, -{ -339.383545f, -24.933847f, 99.110413f, -0.004875f, -0.999978f, 0.004578f, 45.867897f, 82.458980f }, -{ -420.171265f, -24.933825f, 190.964874f, -0.009048f, -0.999950f, 0.004143f, 27.144776f, 45.040260f }, -{ -291.672363f, -24.934004f, 144.238663f, -0.000427f, -0.999928f, 0.011948f, 59.130113f, 63.056674f }, -{ -309.379486f, -24.933861f, 249.619171f, -0.011270f, -0.999908f, 0.007562f, 54.449330f, 20.094447f }, -{ -195.040344f, -24.933855f, 180.815704f, 0.002731f, -0.999942f, 0.010459f, 81.753890f, 47.811998f }, -{ -136.935654f, -24.933895f, 293.288574f, -0.005146f, -0.999926f, 0.011049f, 96.576363f, 0.692140f }, -{ -48.893070f, -24.933884f, 161.229355f, 0.003108f, -0.999963f, 0.008062f, 117.639871f, 56.127275f }, -{ 72.555756f, -24.933893f, 275.836060f, -0.004433f, -0.999894f, 0.013872f, 145.724552f, 6.235663f }, -{ 102.042297f, -24.933882f, 146.974792f, 0.007025f, -0.999961f, 0.005404f, 151.965595f, 61.670797f } -}; - -static Face face_0[] = { -{ { 61, 60, 59 }, 3, 0 }, -{ { 55, 54, 53 }, 3, 0 }, -{ { 57, 56, 55 }, 3, 0 }, -{ { 39, 38, 37 }, 3, 0 }, -{ { 37, 36, 35 }, 3, 0 }, -{ { 53, 52, 51 }, 3, 0 }, -{ { 41, 40, 39 }, 3, 0 }, -{ { 43, 42, 41 }, 3, 0 }, -{ { 59, 58, 57 }, 3, 0 }, -{ { 63, 62, 61 }, 3, 0 }, -{ { 45, 44, 43 }, 3, 0 }, -{ { 35, 34, 67 }, 3, 0 }, -{ { 67, 66, 65 }, 3, 0 }, -{ { 51, 50, 49 }, 3, 0 }, -{ { 49, 48, 47 }, 3, 0 }, -{ { 65, 64, 63 }, 3, 0 }, -{ { 47, 46, 45 }, 3, 0 }, -{ { 41, 39, 37 }, 3, 0 }, -{ { 43, 41, 37 }, 3, 0 }, -{ { 43, 37, 35 }, 3, 0 }, -{ { 45, 43, 35 }, 3, 0 }, -{ { 45, 35, 67 }, 3, 0 }, -{ { 47, 45, 67 }, 3, 0 }, -{ { 47, 67, 65 }, 3, 0 }, -{ { 49, 47, 65 }, 3, 0 }, -{ { 49, 65, 63 }, 3, 0 }, -{ { 51, 49, 63 }, 3, 0 }, -{ { 51, 63, 61 }, 3, 0 }, -{ { 53, 51, 61 }, 3, 0 }, -{ { 53, 61, 59 }, 3, 0 }, -{ { 53, 59, 57 }, 3, 0 }, -{ { 53, 57, 55 }, 3, 0 }, -{ { 61, 27, 26 }, 4, 2 }, -{ { 26, 60, 61 }, 4, 0 }, -{ { 60, 26, 25 }, 4, 2 }, -{ { 25, 59, 60 }, 4, 0 }, -{ { 55, 21, 20 }, 4, 2 }, -{ { 20, 54, 55 }, 4, 0 }, -{ { 54, 20, 19 }, 4, 2 }, -{ { 19, 53, 54 }, 4, 0 }, -{ { 57, 23, 22 }, 4, 2 }, -{ { 22, 56, 57 }, 4, 0 }, -{ { 56, 22, 21 }, 4, 2 }, -{ { 21, 55, 56 }, 4, 0 }, -{ { 39, 5, 4 }, 4, 2 }, -{ { 4, 38, 39 }, 4, 0 }, -{ { 38, 4, 3 }, 4, 2 }, -{ { 3, 37, 38 }, 4, 0 }, -{ { 37, 3, 2 }, 4, 2 }, -{ { 2, 36, 37 }, 4, 0 }, -{ { 36, 2, 1 }, 4, 2 }, -{ { 1, 35, 36 }, 4, 0 }, -{ { 53, 19, 18 }, 4, 2 }, -{ { 18, 52, 53 }, 4, 0 }, -{ { 52, 18, 17 }, 4, 2 }, -{ { 17, 51, 52 }, 4, 0 }, -{ { 41, 7, 6 }, 4, 2 }, -{ { 6, 40, 41 }, 4, 0 }, -{ { 40, 6, 5 }, 4, 2 }, -{ { 5, 39, 40 }, 4, 0 }, -{ { 43, 9, 8 }, 4, 2 }, -{ { 8, 42, 43 }, 4, 0 }, -{ { 42, 8, 7 }, 4, 2 }, -{ { 7, 41, 42 }, 4, 0 }, -{ { 59, 25, 24 }, 4, 2 }, -{ { 24, 58, 59 }, 4, 0 }, -{ { 58, 24, 23 }, 4, 2 }, -{ { 23, 57, 58 }, 4, 0 }, -{ { 63, 29, 28 }, 4, 2 }, -{ { 28, 62, 63 }, 4, 0 }, -{ { 62, 28, 27 }, 4, 2 }, -{ { 27, 61, 62 }, 4, 0 }, -{ { 45, 11, 10 }, 4, 2 }, -{ { 10, 44, 45 }, 4, 0 }, -{ { 44, 10, 9 }, 4, 2 }, -{ { 9, 43, 44 }, 4, 0 }, -{ { 35, 1, 0 }, 4, 2 }, -{ { 0, 34, 35 }, 4, 0 }, -{ { 34, 0, 33 }, 4, 2 }, -{ { 33, 67, 34 }, 4, 0 }, -{ { 67, 33, 32 }, 4, 2 }, -{ { 32, 66, 67 }, 4, 0 }, -{ { 66, 32, 31 }, 4, 2 }, -{ { 31, 65, 66 }, 4, 0 }, -{ { 51, 17, 16 }, 4, 2 }, -{ { 16, 50, 51 }, 4, 0 }, -{ { 50, 16, 15 }, 4, 2 }, -{ { 15, 49, 50 }, 4, 0 }, -{ { 49, 15, 14 }, 4, 2 }, -{ { 14, 48, 49 }, 4, 0 }, -{ { 48, 14, 13 }, 4, 2 }, -{ { 13, 47, 48 }, 4, 0 }, -{ { 65, 31, 30 }, 4, 2 }, -{ { 30, 64, 65 }, 4, 0 }, -{ { 64, 30, 29 }, 4, 2 }, -{ { 29, 63, 64 }, 4, 0 }, -{ { 47, 13, 12 }, 4, 2 }, -{ { 12, 46, 47 }, 4, 0 }, -{ { 46, 12, 11 }, 4, 2 }, -{ { 11, 45, 46 }, 4, 0 } -}; - -static Vert vert_1[] = { -{ -227.530014f, -20.966743f, 18.889576f, -0.132901f, 0.000004f, -0.991129f, 11.312357f, 104.759467f }, -{ -227.530014f, -20.966749f, 49.094059f, -0.113407f, 0.000000f, 0.993549f, 24.483732f, 68.571409f }, -{ -220.271423f, -20.966749f, 49.922577f, -0.278891f, 0.000000f, 0.960323f, 33.541598f, 70.744057f }, -{ -214.348251f, -20.966755f, 52.198391f, -0.521000f, 0.000000f, 0.853557f, 41.630631f, 70.600333f }, -{ -209.753510f, -20.966747f, 55.606861f, -0.731747f, 0.000000f, 0.681577f, 48.621978f, 68.520264f }, -{ -206.480209f, -20.966747f, 59.833366f, -0.886449f, 0.000000f, 0.462826f, 54.386820f, 64.883859f }, -{ -204.521362f, -20.966749f, 64.563301f, -0.976238f, 0.000000f, 0.216703f, 58.796339f, 60.071098f }, -{ -203.869965f, -20.966747f, 69.481987f, -0.998414f, 0.000000f, -0.056296f, 61.721703f, 54.462037f }, -{ -204.699646f, -20.966759f, 74.975159f, -0.937504f, 0.000000f, -0.347976f, 63.123094f, 47.518821f }, -{ -207.067520f, -20.966751f, 79.783142f, -0.793604f, 0.000000f, -0.608435f, 62.382769f, 40.725774f }, -{ -210.791794f, -20.966751f, 83.766113f, -0.597880f, 0.000001f, -0.801586f, 59.657563f, 34.329668f }, -{ -215.690674f, -20.966751f, 86.784210f, -0.383174f, 0.000001f, -0.923676f, 55.104290f, 28.577385f }, -{ -221.582382f, -20.966751f, 88.697617f, -0.170028f, 0.000001f, -0.985439f, 48.879779f, 23.715683f }, -{ -228.285126f, -20.966751f, 89.366486f, -0.004631f, 0.000001f, -0.999989f, 41.140841f, 19.991411f }, -{ -233.272552f, -20.966751f, 89.153244f, 0.101449f, 0.000001f, -0.994841f, 35.072373f, 18.071997f }, -{ -238.232040f, -20.966751f, 88.499512f, 0.188036f, 0.000001f, -0.982162f, 28.845299f, 16.692535f }, -{ -243.261429f, -20.966751f, 87.384338f, 0.268237f, 0.000001f, -0.963353f, 22.333248f, 15.835422f }, -{ -248.458618f, -20.966747f, 85.786713f, 0.337432f, 0.000001f, -0.941350f, 15.409765f, 15.483181f }, -{ -253.921509f, -20.966747f, 83.685699f, 0.393673f, 0.000001f, -0.919251f, 7.948429f, 15.618211f }, -{ -259.747955f, -20.966747f, 81.060303f, 0.410820f, 0.000001f, -0.911717f, -0.177157f, 16.222941f }, -{ -259.747955f, -20.966751f, 111.264603f, -0.366219f, -0.000001f, 0.930529f, 12.994208f, -19.965071f }, -{ -253.885376f, -20.966755f, 113.571884f, -0.315937f, -0.000001f, 0.948780f, 21.024357f, -20.172935f }, -{ -247.666229f, -20.966757f, 115.459656f, -0.243578f, -0.000001f, 0.969881f, 29.298774f, -19.722674f }, -{ -241.153412f, -20.966763f, 116.927917f, -0.175846f, -0.000001f, 0.984418f, 37.742109f, -18.641708f }, -{ -234.409882f, -20.966763f, 117.976685f, -0.111723f, -0.000001f, 0.993739f, 46.278933f, -16.957548f }, -{ -227.498550f, -20.966763f, 118.605942f, -0.050166f, -0.000001f, 0.998741f, 54.833858f, -14.697611f }, -{ -220.482346f, -20.966763f, 118.815689f, 0.049994f, -0.000001f, 0.998749f, 63.331494f, -11.889319f }, -{ -205.143631f, -20.966763f, 117.432495f, 0.221684f, -0.000001f, 0.975119f, 81.105759f, -3.543264f }, -{ -191.825546f, -20.966755f, 113.455368f, 0.430806f, -0.000001f, 0.902444f, 95.327940f, 7.029456f }, -{ -180.870651f, -20.966755f, 107.142990f, 0.647042f, -0.000001f, 0.762454f, 105.700410f, 19.369521f }, -{ -172.621567f, -20.966755f, 98.754059f, 0.840384f, 0.000000f, 0.541992f, 111.925502f, 33.017599f }, -{ -167.420868f, -20.966753f, 88.547287f, 0.966795f, 0.000000f, 0.255554f, 113.705577f, 47.514307f }, -{ -165.611176f, -20.966751f, 76.781357f, 0.999957f, 0.000000f, -0.009295f, 110.742945f, 62.400328f }, -{ -166.340637f, -20.966751f, 68.696579f, 0.976852f, 0.000000f, -0.213918f, 106.343396f, 71.768664f }, -{ -168.510422f, -20.966749f, 61.101204f, 0.918400f, 0.000000f, -0.395654f, 100.431605f, 79.922555f }, -{ -172.092514f, -20.966755f, 54.065182f, 0.827210f, 0.000000f, -0.561892f, 93.071636f, 86.790413f }, -{ -177.058975f, -20.966747f, 47.658421f, 0.712639f, 0.000000f, -0.701531f, 84.327446f, 92.300650f }, -{ -183.381851f, -20.966743f, 41.950832f, 0.586577f, 0.000000f, -0.809893f, 74.263017f, 96.381707f }, -{ -191.033142f, -20.966743f, 37.012333f, 0.830953f, 0.000000f, 0.556343f, 62.942380f, 98.962027f }, -{ -181.454453f, -20.966751f, 32.298737f, 0.560396f, -0.000001f, 0.828225f, 72.363203f, 108.786445f }, -{ -173.805496f, -20.966743f, 26.319462f, 0.724928f, -0.000003f, 0.688825f, 78.920131f, 119.285616f }, -{ -168.002350f, -20.966745f, 19.235668f, 0.857930f, -0.000002f, 0.513767f, 82.783855f, 130.303376f }, -{ -163.961121f, -20.966740f, 11.208173f, 0.946024f, 0.000000f, 0.324095f, 84.125031f, 141.683643f }, -{ -161.597916f, -20.966740f, 2.397420f, 0.990004f, 0.000000f, 0.141040f, 83.114247f, 153.270415f }, -{ -160.828827f, -20.966740f, -7.035602f, 0.998047f, 0.000000f, -0.062465f, 79.922191f, 164.907572f }, -{ -162.772522f, -20.966736f, -21.426922f, 0.945614f, 0.000000f, -0.325292f, 71.317727f, 181.302331f }, -{ -168.407867f, -20.966743f, -33.734730f, 0.805843f, 0.000000f, -0.592129f, 59.198844f, 193.590982f }, -{ -177.441193f, -20.966736f, -43.721256f, 0.600640f, 0.000000f, -0.799519f, 44.021060f, 201.616710f }, -{ -189.578857f, -20.966732f, -51.148808f, 0.373832f, 0.000000f, -0.927496f, 26.239853f, 205.222777f }, -{ -204.527191f, -20.966740f, -55.779682f, 0.160102f, 0.000000f, -0.987101f, 6.310721f, 204.252461f }, -{ -221.992554f, -20.966740f, -57.376118f, 0.002576f, 0.000000f, -0.999997f, -15.310837f, 198.548949f }, -{ -229.371170f, -20.966740f, -57.068485f, -0.093624f, 0.000000f, -0.995608f, -24.017065f, 194.962735f }, -{ -236.805725f, -20.966740f, -56.173542f, -0.168365f, 0.000000f, -0.985725f, -32.534211f, 190.648469f }, -{ -244.142380f, -20.966740f, -54.733250f, -0.240737f, 0.000000f, -0.970590f, -40.696227f, 185.723508f }, -{ -251.227341f, -20.966732f, -52.789539f, -0.314259f, 0.000000f, -0.949337f, -48.337180f, 180.305151f }, -{ -257.906799f, -20.966732f, -50.384388f, -0.392630f, 0.000000f, -0.919696f, -55.291061f, 174.510773f }, -{ -264.026886f, -20.966732f, -47.559727f, -0.419059f, 0.000000f, -0.907959f, -61.391828f, 168.457698f }, -{ -264.026886f, -20.966738f, -14.334979f, 0.543306f, 0.000000f, 0.839534f, -46.903330f, 128.650867f }, -{ -257.339294f, -20.966736f, -18.662861f, 0.501817f, 0.000000f, 0.864974f, -40.778150f, 136.752428f }, -{ -251.050217f, -20.966736f, -22.109791f, 0.426524f, 0.000000f, 0.904476f, -34.746278f, 143.624739f }, -{ -245.054810f, -20.966736f, -24.717709f, 0.331870f, 0.000000f, 0.943325f, -28.700379f, 149.363753f }, -{ -239.248169f, -20.966736f, -26.528568f, 0.220540f, 0.000000f, 0.975378f, -22.533070f, 154.065492f }, -{ -233.525421f, -20.966736f, -27.584324f, 0.100336f, 0.000000f, 0.994954f, -16.136991f, 157.825952f }, -{ -227.781708f, -20.966736f, -27.926914f, -0.045215f, 0.000000f, 0.998977f, -9.404798f, 160.741110f }, -{ -220.280746f, -20.966736f, -27.192783f, -0.239464f, 0.000000f, 0.970905f, -0.097693f, 163.132527f }, -{ -213.751633f, -20.966736f, -25.074284f, -0.460291f, 0.000000f, 0.887768f, 8.648720f, 163.441519f }, -{ -208.369156f, -20.966736f, -21.697269f, -0.678343f, 0.000000f, 0.734745f, 16.570136f, 161.742661f }, -{ -204.308121f, -20.966736f, -17.187603f, -0.860689f, 0.000000f, 0.509130f, 23.402251f, 158.110511f }, -{ -201.743317f, -20.966747f, -11.671123f, -0.971980f, 0.000000f, 0.235065f, 28.880766f, 152.619616f }, -{ -200.849533f, -20.966740f, -5.273685f, -0.999103f, 0.000000f, -0.042355f, 32.741388f, 145.344557f }, -{ -201.724655f, -20.966740f, 1.288052f, -0.949258f, 0.000000f, -0.314499f, 34.554308f, 137.101264f }, -{ -204.242859f, -20.966745f, 7.031773f, -0.823833f, 0.000000f, -0.566833f, 34.041921f, 129.121540f }, -{ -208.243301f, -20.966740f, 11.810628f, -0.639055f, 0.000000f, -0.769161f, 31.332898f, 121.651460f }, -{ -213.565170f, -20.966740f, 15.477796f, -0.424211f, 0.000001f, -0.905563f, 26.555888f, 114.937053f }, -{ -220.047684f, -20.966743f, 17.886265f, -0.205822f, 0.000004f, -0.978589f, 19.839473f, 109.224409f }, -{ -148.686584f, -20.966757f, 116.550354f, 0.000000f, -0.000001f, 1.000000f, 148.362720f, 22.133174f }, -{ -72.924095f, -20.966761f, 116.550354f, 0.071640f, -0.000001f, 0.997431f, 239.134392f, 55.171337f }, -{ -44.133286f, -20.966759f, 113.442535f, 0.268782f, -0.000001f, 0.963201f, 272.273660f, 71.449816f }, -{ -20.467419f, -20.966759f, 104.692368f, 0.513694f, -0.000001f, 0.857974f, 296.812166f, 92.253563f }, -{ -1.975434f, -20.966759f, 91.159866f, 0.734379f, 0.000000f, 0.678739f, 313.066387f, 116.530870f }, -{ 11.293716f, -20.966763f, 73.704994f, 0.894190f, 0.000000f, 0.447688f, 321.352617f, 143.230046f }, -{ 19.291100f, -20.966763f, 53.187717f, 0.979694f, 0.000000f, 0.200499f, 321.987274f, 171.299429f }, -{ 21.967770f, -20.966759f, 30.467985f, 0.999373f, 0.000000f, -0.035418f, 315.286714f, 199.687265f }, -{ 19.338877f, -20.966749f, 6.999157f, 0.959992f, 0.000000f, -0.280027f, 301.902798f, 226.659149f }, -{ 11.340330f, -20.966751f, -13.645114f, 0.842717f, 0.000000f, -0.538357f, 283.317205f, 247.905254f }, -{ -2.195676f, -20.966743f, -30.821491f, 0.643022f, 0.000000f, -0.765848f, 259.609426f, 262.581684f }, -{ -21.436935f, -20.966740f, -43.886723f, 0.400098f, 0.000000f, -0.916472f, 230.858877f, 269.844599f }, -{ -46.551262f, -20.966736f, -52.197575f, 0.167743f, 0.000000f, -0.985831f, 197.145034f, 268.850158f }, -{ -77.706444f, -20.966743f, -55.110798f, 0.031064f, 0.000000f, -0.999517f, 158.547374f, 258.754495f }, -{ -148.686584f, -20.966743f, -55.110798f, 0.000000f, 0.000000f, -1.000000f, 73.505490f, 227.801797f }, -{ -105.897141f, -20.966753f, 85.087540f, 0.894427f, 0.000000f, -0.447214f, 185.908946f, 78.488452f }, -{ -105.897141f, -20.966742f, -23.647968f, 0.447214f, 0.000000f, 0.894427f, 138.492050f, 208.765350f }, -{ -77.958153f, -20.966742f, -23.647968f, -0.079186f, 0.000000f, 0.996860f, 171.965974f, 220.948864f }, -{ -58.874207f, -20.966740f, -21.368664f, -0.304705f, 0.000000f, 0.952447f, 195.824559f, 226.540055f }, -{ -44.341877f, -20.966745f, -15.146022f, -0.579111f, 0.000000f, 0.815249f, 215.949404f, 225.421851f }, -{ -33.878738f, -20.966743f, -5.902942f, -0.798828f, 0.000000f, 0.601559f, 232.516059f, 218.910357f }, -{ -27.002363f, -20.966749f, 5.437657f, -0.929901f, 0.000000f, 0.367810f, 245.700060f, 208.321713f }, -{ -23.230320f, -20.966747f, 17.952679f, -0.987642f, -0.000001f, 0.156725f, 255.676941f, 194.972086f }, -{ -22.080179f, -20.966755f, 30.719687f, -0.999434f, 0.000000f, -0.033649f, 262.622269f, 180.177463f }, -{ -23.442402f, -20.966751f, 44.972424f, -0.970480f, 0.000000f, -0.241182f, 267.205431f, 162.507202f }, -{ -27.692215f, -20.966751f, 57.903645f, -0.878100f, 0.000000f, -0.478477f, 267.752663f, 145.160958f }, -{ -35.074326f, -20.966751f, 68.947113f, -0.700409f, 0.000000f, -0.713742f, 263.723906f, 128.710531f }, -{ -45.833443f, -20.966755f, 77.536469f, -0.453361f, 0.000001f, -0.891327f, 254.578922f, 113.727776f }, -{ -60.214287f, -20.966755f, 83.105392f, -0.193834f, 0.000001f, -0.981034f, 239.777576f, 100.784454f }, -{ -78.461555f, -20.966755f, 85.087540f, -0.036044f, 0.000001f, -0.999350f, 218.779751f, 90.452444f }, -{ 53.459190f, 2.970489f, -63.834198f, 0.000000f, 0.000000f, -1.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 2.970482f, 19.696451f, 0.000000f, 0.000010f, -1.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 2.970485f, 19.696451f, 0.000000f, 0.000010f, -1.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 2.970482f, 37.767296f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 2.970482f, 37.767296f, -0.894427f, 0.000000f, 0.447214f, 0.000000f, 255.000000f }, -{ 53.459190f, 2.970471f, 52.887688f, -0.994427f, 0.000000f, 0.105425f, 0.000000f, 255.000000f }, -{ 54.761124f, 2.970478f, 61.040325f, -0.930341f, 0.000000f, 0.366696f, 0.000000f, 255.000000f }, -{ 58.744659f, 2.970474f, 68.629539f, -0.769108f, -0.000001f, 0.639119f, 0.000000f, 255.000000f }, -{ 65.526382f, 2.970473f, 75.245560f, -0.554146f, -0.000001f, 0.832420f, 0.000000f, 255.000000f }, -{ 75.222885f, 2.970474f, 80.478622f, -0.334245f, -0.000001f, 0.942486f, 0.000000f, 255.000000f }, -{ 87.950760f, 2.970474f, 83.918953f, -0.139337f, -0.000002f, 0.990245f, 0.000000f, 255.000000f }, -{ 103.826599f, 2.970474f, 85.156792f, -0.014576f, -0.000002f, 0.999894f, 0.000000f, 255.000000f }, -{ 107.486267f, 2.970474f, 85.094475f, 0.038307f, -0.000002f, 0.999266f, 0.000000f, 255.000000f }, -{ 111.371353f, 2.970474f, 84.904106f, 0.070572f, -0.000002f, 0.997507f, 0.000000f, 255.000000f }, -{ 115.334160f, 2.970474f, 84.580559f, 0.105682f, -0.000002f, 0.994400f, 0.000000f, 255.000000f }, -{ 119.227013f, 2.970474f, 84.118721f, 0.147635f, -0.000002f, 0.989042f, 0.000000f, 255.000000f }, -{ 122.902229f, 2.970474f, 83.513466f, 0.202285f, -0.000002f, 0.979327f, 0.000000f, 255.000000f }, -{ 126.212128f, 2.970474f, 82.759666f, 0.996088f, 0.000000f, -0.088370f, 0.000000f, 255.000000f }, -{ 114.179916f, 2.970478f, 65.426537f, 0.125438f, 0.000002f, -0.992102f, 0.000000f, 255.000000f }, -{ 112.235428f, 2.970474f, 65.933624f, -0.222749f, 0.000002f, -0.974876f, 0.000000f, 255.000000f }, -{ 110.283180f, 2.970474f, 66.348511f, -0.174788f, 0.000002f, -0.984606f, 0.000000f, 255.000000f }, -{ 108.268738f, 2.970474f, 66.671196f, -0.124447f, 0.000002f, -0.992226f, 0.000000f, 255.000000f }, -{ 106.137703f, 2.970474f, 66.901688f, -0.075842f, 0.000002f, -0.997120f, 0.000000f, 255.000000f }, -{ 103.835670f, 2.970474f, 67.039986f, -0.032153f, 0.000002f, -0.999483f, 0.000000f, 255.000000f }, -{ 101.308228f, 2.970474f, 67.086082f, 0.055747f, 0.000002f, -0.998445f, 0.000000f, 255.000000f }, -{ 95.838806f, 2.970474f, 66.577293f, 0.226773f, 0.000002f, -0.973948f, 0.000000f, 255.000000f }, -{ 91.224388f, 2.970478f, 65.167015f, 0.433606f, 0.000001f, -0.901103f, 0.000000f, 255.000000f }, -{ 87.527145f, 2.970478f, 63.029404f, 0.640544f, 0.000000f, -0.767921f, 0.000000f, 255.000000f }, -{ 84.809280f, 2.970478f, 60.338612f, 0.827378f, 0.000000f, -0.561646f, 0.000000f, 255.000000f }, -{ 83.132957f, 2.970478f, 57.268784f, 0.960620f, 0.000000f, -0.277867f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970479f, 53.994072f, 0.998339f, 0.000000f, -0.057605f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970478f, 37.767296f, 0.447214f, 0.000000f, 0.894427f, 0.000000f, 255.000000f }, -{ 111.661545f, 2.970478f, 37.767296f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 2.970482f, 19.696451f, 0.000000f, 0.000010f, -1.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970482f, 19.696451f, 0.000000f, 0.000010f, -1.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970489f, -63.834198f, 0.000000f, 0.000000f, -1.000000f, 0.000000f, 255.000000f }, -{ 109.261765f, 2.970490f, -33.040283f, -0.936759f, 0.000000f, 0.349975f, 0.000000f, 255.000000f }, -{ 158.509918f, 2.970482f, 10.661288f, -0.945897f, 0.000000f, -0.324468f, 0.000000f, 255.000000f }, -{ 110.660858f, 2.970478f, 56.206810f, -0.475466f, 0.000000f, 0.879734f, 0.000000f, 255.000000f }, -{ 147.037323f, 2.970478f, 56.206810f, 0.529090f, -0.000002f, 0.848566f, 0.000000f, 255.000000f }, -{ 175.299042f, 2.970477f, 25.597071f, -0.347260f, -0.000006f, 0.937769f, 0.000000f, 255.000000f }, -{ 203.001129f, 2.970478f, 56.206810f, -0.267475f, 0.000000f, 0.963565f, 0.000000f, 255.000000f }, -{ 237.139038f, 2.970478f, 56.206810f, 0.947348f, 0.000000f, -0.320206f, 0.000000f, 255.000000f }, -{ 189.569809f, 2.970482f, 11.767657f, 0.937358f, 0.000000f, 0.348368f, 0.000000f, 255.000000f }, -{ 239.097778f, 2.970486f, -33.040283f, 0.470435f, 0.000000f, -0.882435f, 0.000000f, 255.000000f }, -{ 202.161682f, 2.970486f, -33.040283f, -0.518991f, 0.000000f, -0.854780f, 0.000000f, 255.000000f }, -{ 173.620132f, 2.970482f, -3.168332f, 0.311085f, 0.000000f, -0.950382f, 0.000000f, 255.000000f }, -{ 143.679504f, 2.970490f, -33.040283f, 0.252382f, 0.000000f, -0.967628f, 0.000000f, 255.000000f }, -{ 246.695496f, 2.970477f, 44.635109f, -0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 246.695496f, 2.970479f, 54.095207f, -0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 243.335144f, 2.970479f, 54.095207f, -0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 243.335144f, 2.970478f, 56.104118f, -0.447214f, 0.000000f, 0.894427f, 0.000000f, 255.000000f }, -{ 252.174316f, 2.970478f, 56.104118f, 0.894427f, 0.000000f, 0.447214f, 0.000000f, 255.000000f }, -{ 252.174316f, 2.970475f, 54.095207f, 0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 248.813965f, 2.970479f, 54.095207f, 0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 248.813965f, 2.970477f, 44.635109f, 0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 253.836212f, 2.970477f, 44.635109f, -0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 253.836212f, 2.970478f, 56.341530f, 0.287199f, 0.000000f, 0.957871f, 0.000000f, 255.000000f }, -{ 258.931549f, 2.970471f, 51.191429f, -0.319282f, 0.000000f, 0.947660f, 0.000000f, 255.000000f }, -{ 264.026886f, 2.970478f, 56.341530f, 0.877850f, 0.000000f, 0.478935f, 0.000000f, 255.000000f }, -{ 264.026886f, 2.970477f, 44.635109f, 0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 261.908356f, 2.970477f, 44.635109f, -0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 261.908356f, 2.970467f, 51.721062f, 0.301814f, 0.000000f, -0.953367f, 0.000000f, 255.000000f }, -{ 258.931549f, 2.970471f, 48.634651f, -0.326641f, 0.000000f, -0.945149f, 0.000000f, 255.000000f }, -{ 255.954681f, 2.970471f, 51.721062f, 0.879074f, 0.000000f, -0.476685f, 0.000000f, 255.000000f }, -{ 255.954681f, 2.970477f, 44.635109f, 0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 53.398365f, 9.484123f, -118.046249f, -0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 53.398365f, 9.484118f, -89.641510f, -0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 58.399651f, 9.484118f, -89.641510f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 58.399651f, 9.484123f, -118.046249f, 0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 64.683319f, 9.484123f, -118.046249f, -0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 64.683319f, 9.484118f, -89.641510f, -0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 69.684608f, 9.484118f, -89.641510f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 69.684608f, 9.484118f, -92.719223f, -0.390384f, -0.000002f, 0.920652f, 0.000000f, 255.000000f }, -{ 71.361206f, 9.484118f, -90.693527f, -0.520918f, -0.000002f, 0.853607f, 0.000000f, 255.000000f }, -{ 75.070610f, 9.484118f, -89.192673f, 0.065749f, -0.000003f, 0.997836f, 0.000000f, 255.000000f }, -{ 78.221947f, 9.484118f, -90.116470f, 0.641452f, -0.000002f, 0.767163f, 0.000000f, 255.000000f }, -{ 80.447113f, 9.484106f, -92.906830f, 0.914903f, -0.000001f, 0.403674f, 0.000000f, 255.000000f }, -{ 81.069901f, 9.484118f, -95.010895f, 0.988384f, 0.000000f, 0.151978f, 0.000000f, 255.000000f }, -{ 81.290161f, 9.484118f, -97.592270f, 0.999598f, 0.000000f, 0.028362f, 0.000000f, 255.000000f }, -{ 81.290161f, 9.484123f, -118.046249f, 0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 76.288872f, 9.484123f, -118.046249f, -0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 76.288872f, 9.484118f, -97.720505f, -0.997195f, 0.000000f, -0.074851f, 0.000000f, 255.000000f }, -{ 76.046646f, 9.484118f, -95.573715f, -0.873911f, 0.000001f, -0.486087f, 0.000000f, 255.000000f }, -{ 74.507790f, 9.484118f, -93.751663f, -0.206069f, 0.000002f, -0.978537f, 0.000000f, 255.000000f }, -{ 72.154381f, 9.484118f, -93.999222f, 0.497835f, 0.000001f, -0.867272f, 0.000000f, 255.000000f }, -{ 70.869621f, 9.484118f, -95.136749f, 0.791861f, 0.000001f, -0.610702f, 0.000000f, 255.000000f }, -{ 69.684608f, 9.484118f, -97.015213f, 0.982874f, 0.000000f, -0.184277f, 0.000000f, 255.000000f }, -{ 69.684608f, 9.484123f, -118.046249f, 0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 116.042702f, 9.484123f, -111.377884f, 0.874270f, -0.000001f, 0.485440f, 0.000000f, 255.000000f }, -{ 116.042702f, 9.484123f, -116.315048f, 0.760144f, 0.000001f, -0.649755f, 0.000000f, 255.000000f }, -{ 112.247803f, 9.484123f, -118.552078f, 0.152177f, 0.000001f, -0.988353f, 0.000000f, 255.000000f }, -{ 107.574234f, 9.484123f, -118.394455f, -0.459333f, 0.000001f, -0.888264f, 0.000000f, 255.000000f }, -{ 103.539482f, 9.484123f, -115.040680f, -0.838627f, 0.000001f, -0.544706f, 0.000000f, 255.000000f }, -{ 102.209610f, 9.484123f, -112.118805f, -0.959193f, 0.000000f, -0.282751f, 0.000000f, 255.000000f }, -{ 101.385559f, 9.484118f, -108.374069f, -0.993577f, 0.000000f, -0.113155f, 0.000000f, 255.000000f }, -{ 101.102959f, 9.484118f, -103.811813f, -0.999878f, 0.000000f, 0.015607f, 0.000000f, 255.000000f }, -{ 101.339844f, 9.484118f, -99.454697f, -0.989803f, 0.000000f, 0.142441f, 0.000000f, 255.000000f }, -{ 102.036247f, 9.484118f, -95.777939f, -0.953092f, -0.000001f, 0.302681f, 0.000000f, 255.000000f }, -{ 103.170799f, 9.484106f, -92.831436f, -0.859240f, -0.000001f, 0.511573f, 0.000000f, 255.000000f }, -{ 104.722122f, 9.484118f, -90.665039f, -0.601898f, -0.000001f, 0.798573f, 0.000000f, 255.000000f }, -{ 107.933678f, 9.484118f, -88.927658f, -0.064729f, -0.000002f, 0.997903f, 0.000000f, 255.000000f }, -{ 111.632736f, 9.484118f, -89.470520f, 0.480740f, -0.000002f, 0.876863f, 0.000000f, 255.000000f }, -{ 113.549179f, 9.484118f, -91.009384f, 0.770417f, -0.000001f, 0.637540f, 0.000000f, 255.000000f }, -{ 114.952675f, 9.484106f, -93.103928f, 0.938897f, 0.000000f, 0.344197f, 0.000000f, 255.000000f }, -{ 116.387047f, 9.484118f, -99.154877f, 0.994578f, 0.000000f, 0.103992f, 0.000000f, 255.000000f }, -{ 116.619774f, 9.484118f, -104.965958f, 0.454185f, 0.000001f, -0.890908f, 0.000000f, 255.000000f }, -{ 106.104248f, 9.484118f, -104.965958f, 0.931736f, 0.000000f, -0.363137f, 0.000000f, 255.000000f }, -{ 106.676575f, 9.484123f, -110.009995f, 0.932112f, 0.000000f, 0.362171f, 0.000000f, 255.000000f }, -{ 108.374535f, 9.484123f, -113.130463f, 0.561654f, -0.000001f, 0.827372f, 0.000000f, 255.000000f }, -{ 111.169655f, 9.484123f, -114.199112f, -0.059665f, -0.000002f, 0.998218f, 0.000000f, 255.000000f }, -{ 113.774490f, 9.484123f, -113.485794f, -0.556104f, -0.000002f, 0.831112f, 0.000000f, 255.000000f }, -{ 106.040123f, 9.484118f, -101.247055f, 0.458115f, -0.000001f, 0.888893f, 0.000000f, 255.000000f }, -{ 111.618484f, 9.484118f, -101.247055f, -0.917639f, -0.000001f, 0.397415f, 0.000000f, 255.000000f }, -{ 111.312141f, 9.484118f, -96.746857f, -0.968412f, 0.000000f, -0.249357f, 0.000000f, 255.000000f }, -{ 110.364601f, 9.484118f, -94.098984f, -0.666434f, 0.000002f, -0.745564f, 0.000000f, 255.000000f }, -{ 108.733131f, 9.484106f, -93.232178f, 0.199195f, 0.000001f, -0.979960f, 0.000000f, 255.000000f }, -{ 107.208519f, 9.484118f, -94.113220f, 0.848531f, 0.000001f, -0.529146f, 0.000000f, 255.000000f }, -{ 106.325096f, 9.484118f, -96.775345f, 0.988917f, 0.000000f, -0.148471f, 0.000000f, 255.000000f }, -{ 122.262253f, 9.484123f, -118.046249f, -0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 122.262253f, 9.484118f, -89.641510f, -0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 127.263535f, 9.484118f, -89.641510f, 0.888400f, -0.000001f, 0.459070f, 0.000000f, 255.000000f }, -{ 127.391785f, 9.484118f, -97.335800f, -0.832354f, -0.000001f, 0.554244f, 0.000000f, 255.000000f }, -{ 128.306671f, 9.484118f, -94.372665f, -0.943875f, -0.000001f, 0.330303f, 0.000000f, 255.000000f }, -{ 129.111130f, 9.484118f, -92.203903f, -0.906859f, -0.000001f, 0.421435f, 0.000000f, 255.000000f }, -{ 129.876404f, 9.484118f, -90.715500f, -0.732608f, -0.000001f, 0.680651f, 0.000000f, 255.000000f }, -{ 131.574371f, 9.484118f, -89.323883f, -0.237380f, -0.000001f, 0.971417f, 0.000000f, 255.000000f }, -{ 133.556717f, 9.484118f, -89.280533f, 0.272164f, -0.000002f, 0.962251f, 0.000000f, 255.000000f }, -{ 135.214310f, 9.484118f, -90.026230f, 0.953239f, -0.000001f, 0.302219f, 0.000000f, 255.000000f }, -{ 134.829590f, 9.484118f, -95.155746f, 0.189441f, 0.000002f, -0.981892f, 0.000000f, 255.000000f }, -{ 132.649551f, 9.484118f, -94.450439f, 0.149986f, 0.000002f, -0.988688f, 0.000000f, 255.000000f }, -{ 130.914764f, 9.484118f, -95.135269f, 0.671985f, 0.000002f, -0.740564f, 0.000000f, 255.000000f }, -{ 129.543335f, 9.484118f, -96.915451f, 0.885876f, 0.000001f, -0.463921f, 0.000000f, 255.000000f }, -{ 128.513855f, 9.484118f, -99.379593f, 0.955085f, 0.000001f, -0.296334f, 0.000000f, 255.000000f }, -{ 127.804985f, 9.484118f, -102.116226f, 0.982240f, 0.000000f, -0.187627f, 0.000000f, 255.000000f }, -{ 127.395340f, 9.484118f, -104.713943f, 0.998278f, 0.000000f, -0.058653f, 0.000000f, 255.000000f }, -{ 127.263535f, 9.484123f, -118.046249f, 0.445434f, 0.000001f, -0.895315f, 0.000000f, 255.000000f }, -{ 155.668289f, 9.484123f, -112.788498f, 0.872224f, -0.000001f, 0.489107f, 0.000000f, 255.000000f }, -{ 155.668289f, 9.484123f, -116.571518f, 0.821354f, 0.000001f, -0.570419f, 0.000000f, 255.000000f }, -{ 154.127060f, 9.484123f, -117.804031f, 0.488794f, 0.000002f, -0.872399f, 0.000000f, 255.000000f }, -{ 152.305023f, 9.484123f, -118.637589f, 0.117071f, 0.000003f, -0.993124f, 0.000000f, 255.000000f }, -{ 150.903000f, 9.484123f, -118.586227f, -0.347726f, 0.000002f, -0.937596f, 0.000000f, 255.000000f }, -{ 149.472794f, 9.484123f, -117.781754f, -0.743957f, 0.000001f, -0.668227f, 0.000000f, 255.000000f }, -{ 148.448669f, 9.484123f, -116.186508f, -0.922915f, 0.000001f, -0.385003f, 0.000000f, 255.000000f }, -{ 148.102249f, 9.484123f, -115.096786f, 0.319982f, 0.000002f, -0.947424f, 0.000000f, 255.000000f }, -{ 146.276031f, 9.484123f, -117.172348f, 0.536214f, 0.000002f, -0.844082f, 0.000000f, 255.000000f }, -{ 142.652115f, 9.484123f, -118.815689f, -0.095167f, 0.000003f, -0.995461f, 0.000000f, 255.000000f }, -{ 139.866501f, 9.484123f, -117.808792f, -0.663668f, 0.000002f, -0.748027f, 0.000000f, 255.000000f }, -{ 137.850311f, 9.484123f, -115.206024f, -0.935434f, 0.000001f, -0.353502f, 0.000000f, 255.000000f }, -{ 137.073761f, 9.484123f, -111.634354f, -0.994825f, 0.000000f, 0.101602f, 0.000000f, 255.000000f }, -{ 138.144791f, 9.484118f, -107.571106f, -0.821232f, -0.000001f, 0.570594f, 0.000000f, 255.000000f }, -{ 141.623840f, 9.484118f, -104.049301f, -0.614743f, -0.000001f, 0.788728f, 0.000000f, 255.000000f }, -{ 144.391052f, 9.484118f, -102.166397f, -0.533800f, -0.000001f, 0.845611f, 0.000000f, 255.000000f }, -{ 147.909882f, 9.484118f, -100.028793f, -0.946986f, 0.000000f, 0.321275f, 0.000000f, 255.000000f }, -{ 147.909882f, 9.484118f, -97.335800f, -0.985542f, 0.000000f, -0.169429f, 0.000000f, 255.000000f }, -{ 147.180527f, 9.484118f, -94.538605f, -0.721135f, 0.000001f, -0.692794f, 0.000000f, 255.000000f }, -{ 145.869064f, 9.484118f, -93.718704f, -0.178468f, 0.000002f, -0.983946f, 0.000000f, 255.000000f }, -{ 143.898575f, 9.484118f, -93.732071f, 0.275751f, 0.000003f, -0.961229f, 0.000000f, 255.000000f }, -{ 141.682312f, 9.484118f, -94.706924f, 0.547231f, 0.000002f, -0.836982f, 0.000000f, 255.000000f }, -{ 137.779068f, 9.484118f, -98.297592f, -0.401856f, 0.000002f, -0.915703f, 0.000000f, 255.000000f }, -{ 137.779068f, 9.484118f, -92.526871f, -0.805424f, -0.000001f, 0.592699f, 0.000000f, 255.000000f }, -{ 141.658264f, 9.484118f, -89.665543f, -0.393509f, -0.000002f, 0.919321f, 0.000000f, 255.000000f }, -{ 144.054428f, 9.484118f, -88.951340f, -0.070072f, -0.000003f, 0.997542f, 0.000000f, 255.000000f }, -{ 147.152328f, 9.484118f, -89.072159f, 0.314714f, -0.000002f, 0.949187f, 0.000000f, 255.000000f }, -{ 150.474655f, 9.484118f, -90.715500f, 0.737681f, -0.000002f, 0.675150f, 0.000000f, 255.000000f }, -{ 152.600082f, 9.484118f, -94.111435f, 0.963322f, 0.000000f, 0.268347f, 0.000000f, 255.000000f }, -{ 152.911179f, 9.484118f, -96.502243f, 0.999034f, 0.000000f, 0.043950f, 0.000000f, 255.000000f }, -{ 152.932556f, 9.484123f, -113.100784f, 0.988647f, 0.000000f, 0.150259f, 0.000000f, 255.000000f }, -{ 153.103531f, 9.484123f, -113.846451f, 0.722615f, -0.000001f, 0.691251f, 0.000000f, 255.000000f }, -{ 153.680603f, 9.484123f, -114.199112f, -0.065774f, -0.000002f, 0.997835f, 0.000000f, 255.000000f }, -{ 154.124680f, 9.484123f, -114.032883f, -0.508023f, -0.000002f, 0.861344f, 0.000000f, 255.000000f }, -{ 154.796753f, 9.484123f, -113.553177f, -0.634043f, -0.000002f, 0.773298f, 0.000000f, 255.000000f }, -{ 147.909882f, 9.484123f, -110.800797f, -0.988652f, 0.000000f, 0.150224f, 0.000000f, 255.000000f }, -{ 147.909882f, 9.484118f, -103.491226f, 0.063729f, 0.000001f, -0.997967f, 0.000000f, 255.000000f }, -{ 146.048050f, 9.484118f, -104.727600f, 0.606494f, 0.000001f, -0.795088f, 0.000000f, 255.000000f }, -{ 144.556686f, 9.484118f, -105.944382f, 0.698230f, 0.000002f, -0.715873f, 0.000000f, 255.000000f }, -{ 143.421539f, 9.484118f, -107.154037f, 0.856732f, 0.006809f, -0.515717f, 0.000000f, 255.000000f }, -{ 142.162918f, 9.484122f, -109.601837f, 0.996222f, 0.008519f, -0.086430f, 0.000000f, 255.000000f }, -{ 142.329147f, 9.484123f, -112.551010f, 0.896470f, -0.000001f, 0.443104f, 0.000000f, 255.000000f }, -{ 143.188812f, 9.484123f, -113.667160f, 0.487260f, -0.000002f, 0.873257f, 0.000000f, 255.000000f }, -{ 144.447449f, 9.484123f, -114.070877f, -0.092078f, -0.000002f, 0.995752f, 0.000000f, 255.000000f }, -{ 145.715591f, 9.484123f, -113.693283f, -0.563378f, -0.000001f, 0.826199f, 0.000000f, 255.000000f }, -{ 146.898224f, 9.484123f, -112.589005f, -0.789808f, -0.000001f, 0.613355f, 0.000000f, 255.000000f }, -{ 147.430771f, 9.484123f, -111.777725f, -0.878742f, -0.000001f, 0.477296f, 0.000000f, 255.000000f }, -{ 173.749878f, 9.484123f, -112.467911f, 0.866044f, -0.000001f, 0.499968f, 0.000000f, 255.000000f }, -{ 173.749878f, 9.484123f, -117.276840f, 0.738938f, 0.000002f, -0.673773f, 0.000000f, 255.000000f }, -{ 172.085159f, 9.484123f, -118.160263f, 0.289883f, 0.000003f, -0.957062f, 0.000000f, 255.000000f }, -{ 168.812698f, 9.484123f, -118.815689f, -0.052447f, 0.000003f, -0.998624f, 0.000000f, 255.000000f }, -{ 166.009262f, 9.484123f, -118.315506f, -0.398492f, 0.000002f, -0.917172f, 0.000000f, 255.000000f }, -{ 163.547806f, 9.484123f, -116.887375f, -0.667370f, 0.000002f, -0.744726f, 0.000000f, 255.000000f }, -{ 161.503128f, 9.484123f, -114.639938f, -0.842882f, 0.000001f, -0.538099f, 0.000000f, 255.000000f }, -{ 159.950012f, 9.484123f, -111.681854f, -0.942324f, 0.000000f, -0.334701f, 0.000000f, 255.000000f }, -{ 158.963303f, 9.484118f, -108.121765f, -0.989253f, 0.000000f, -0.146212f, 0.000000f, 255.000000f }, -{ 158.617767f, 9.484118f, -104.068314f, -0.998414f, 0.000000f, 0.056296f, 0.000000f, 255.000000f }, -{ 159.531387f, 9.484118f, -96.903595f, -0.905095f, -0.000001f, 0.425210f, 0.000000f, 255.000000f }, -{ 163.822617f, 9.484118f, -90.542221f, -0.501771f, -0.000002f, 0.865000f, 0.000000f, 255.000000f }, -{ 169.115997f, 9.484118f, -88.872086f, 0.060412f, -0.000003f, 0.998173f, 0.000000f, 255.000000f }, -{ 173.301041f, 9.484118f, -89.897995f, 0.917345f, -0.000001f, 0.398092f, 0.000000f, 255.000000f }, -{ 173.301041f, 9.484118f, -95.027512f, 0.153606f, 0.000003f, -0.988132f, 0.000000f, 255.000000f }, -{ 169.582138f, 9.484118f, -93.616898f, 0.141905f, 0.000002f, -0.989880f, 0.000000f, 255.000000f }, -{ 166.473557f, 9.484118f, -94.882645f, 0.742680f, 0.000001f, -0.669646f, 0.000000f, 255.000000f }, -{ 164.462112f, 9.484118f, -98.442444f, 0.967176f, 0.000000f, -0.254107f, 0.000000f, 255.000000f }, -{ 163.747299f, 9.484118f, -103.940063f, 0.998594f, 0.000000f, 0.053008f, 0.000000f, 255.000000f }, -{ 164.523849f, 9.484122f, -109.302322f, 0.912953f, -0.000001f, 0.408064f, 0.000000f, 255.000000f }, -{ 166.711029f, 9.484123f, -112.812241f, 0.468894f, -0.000002f, 0.883254f, 0.000000f, 255.000000f }, -{ 171.313354f, 9.484123f, -113.911758f, -0.280562f, -0.000002f, 0.959836f, 0.000000f, 255.000000f }, -{ 188.369019f, 9.484123f, -113.301437f, 0.869996f, -0.000001f, 0.493059f, 0.000000f, 255.000000f }, -{ 188.369019f, 9.484123f, -117.725662f, 0.673699f, 0.000002f, -0.739006f, 0.000000f, 255.000000f }, -{ 186.637802f, 9.484123f, -118.378738f, 0.251252f, 0.000003f, -0.967922f, 0.000000f, 255.000000f }, -{ 184.602036f, 9.484123f, -118.792831f, 0.027993f, 0.000002f, -0.999608f, 0.000000f, 255.000000f }, -{ 182.419891f, 9.484123f, -118.666077f, -0.249737f, 0.000002f, -0.968314f, 0.000000f, 255.000000f }, -{ 181.128311f, 9.484123f, -118.195877f, -0.534105f, 0.000002f, -0.845418f, 0.000000f, 255.000000f }, -{ 180.089645f, 9.484123f, -117.373001f, -0.779634f, 0.000001f, -0.626236f, 0.000000f, 255.000000f }, -{ 179.323486f, 9.484123f, -116.165436f, -0.929593f, 0.000001f, -0.368587f, 0.000000f, 255.000000f }, -{ 178.849426f, 9.484123f, -114.541092f, -0.989265f, 0.000000f, -0.146131f, 0.000000f, 255.000000f }, -{ 178.687042f, 9.484123f, -112.467911f, -0.999661f, 0.000000f, -0.026047f, 0.000000f, 255.000000f }, -{ 178.687042f, 9.484118f, -94.001602f, -0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 175.416977f, 9.484118f, -94.001602f, -0.996832f, -0.000001f, 0.079535f, 0.000000f, 255.000000f }, -{ 178.200211f, 9.484118f, -89.945480f, -0.823749f, -0.000001f, 0.566955f, 0.000000f, 255.000000f }, -{ 180.755478f, 9.484117f, -86.238449f, -0.837145f, -0.000001f, 0.546981f, 0.000000f, 255.000000f }, -{ 183.239502f, 9.484117f, -82.331924f, -0.315664f, -0.000001f, 0.948871f, 0.000000f, 255.000000f }, -{ 183.688324f, 9.484117f, -82.331924f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 183.688324f, 9.484118f, -89.641510f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 188.369019f, 9.484118f, -89.641510f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 188.369019f, 9.484118f, -94.001602f, 0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 183.688324f, 9.484118f, -94.001602f, 0.896316f, -0.004678f, -0.443391f, 0.000000f, 255.000000f }, -{ 183.724243f, 9.484123f, -111.466034f, 0.997969f, -0.005230f, 0.063485f, 0.000000f, 255.000000f }, -{ 183.847443f, 9.484123f, -112.446518f, 0.909068f, 0.001063f, 0.416646f, 0.000000f, 255.000000f }, -{ 184.448257f, 9.484123f, -113.686172f, 0.726480f, -0.015559f, 0.687011f, 0.000000f, 255.000000f }, -{ 184.972198f, 9.484123f, -113.977371f, 0.170193f, -0.000003f, 0.985411f, 0.000000f, 255.000000f }, -{ 186.488205f, 9.484123f, -113.985397f, -0.229252f, -0.000002f, 0.973367f, 0.000000f, 255.000000f }, -{ 192.280289f, 9.484123f, -118.046249f, -0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 192.280289f, 9.484118f, -89.641510f, -0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 197.281570f, 9.484118f, -89.641510f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 197.281570f, 9.484123f, -118.046249f, 0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 209.400085f, 9.484123f, -118.687454f, -0.775277f, 0.000002f, -0.631621f, 0.000000f, 255.000000f }, -{ 200.872238f, 9.484118f, -89.641510f, -0.487542f, -0.000001f, 0.873100f, 0.000000f, 255.000000f }, -{ 205.873535f, 9.484118f, -89.641510f, 0.791121f, -0.000001f, 0.611659f, 0.000000f, 255.000000f }, -{ 210.041275f, 9.484118f, -105.863632f, 0.395561f, -0.000001f, 0.918440f, 0.000000f, 255.000000f }, -{ 210.169510f, 9.484118f, -105.863632f, -0.791121f, -0.000001f, 0.611659f, 0.000000f, 255.000000f }, -{ 214.337250f, 9.484118f, -89.641510f, -0.395561f, -0.000001f, 0.918440f, 0.000000f, 255.000000f }, -{ 219.338531f, 9.484118f, -89.641510f, 0.975084f, 0.000000f, 0.221838f, 0.000000f, 255.000000f }, -{ 210.810699f, 9.484123f, -118.687454f, 0.387639f, 0.000002f, -0.921811f, 0.000000f, 255.000000f }, -{ -227.530014f, 20.966755f, 18.889763f, -0.132902f, 0.000004f, -0.991129f, 11.312366f, 104.759421f }, -{ -227.530014f, 20.966747f, 49.094074f, -0.113407f, 0.000000f, 0.993549f, 24.483732f, 68.571394f }, -{ -220.271423f, 20.966747f, 49.922592f, -0.196555f, 0.000000f, 0.980493f, 33.541610f, 70.744042f }, -{ -214.348251f, 20.966747f, 52.198406f, -0.441307f, 0.000000f, 0.897356f, 41.630631f, 70.600318f }, -{ -209.753510f, 20.966751f, 55.606876f, -0.666260f, 0.000000f, 0.745720f, 48.621982f, 68.520264f }, -{ -206.480209f, 20.966751f, 59.833382f, -0.841668f, 0.000000f, 0.539995f, 54.386827f, 64.883844f }, -{ -204.521362f, 20.966751f, 64.563332f, -0.953587f, 0.000000f, 0.301119f, 58.796350f, 60.071068f }, -{ -203.869965f, 20.966747f, 69.482018f, -0.999275f, 0.000000f, 0.038078f, 61.721714f, 54.462006f }, -{ -204.699646f, 20.966745f, 74.975189f, -0.968387f, 0.000000f, -0.249452f, 63.123110f, 47.518791f }, -{ -207.067520f, 20.966745f, 79.783180f, -0.849701f, 0.000000f, -0.527265f, 62.382784f, 40.725728f }, -{ -210.791794f, 20.966745f, 83.766144f, -0.667060f, 0.000001f, -0.745004f, 59.657578f, 34.329638f }, -{ -215.690674f, 20.966745f, 86.784241f, -0.455510f, 0.000001f, -0.890230f, 55.104305f, 28.577339f }, -{ -221.582382f, 20.966745f, 88.697647f, -0.240248f, 0.000001f, -0.970712f, 48.879791f, 23.715652f }, -{ -228.285126f, 20.966745f, 89.366524f, -0.052076f, 0.000001f, -0.998643f, 41.140860f, 19.991366f }, -{ -233.272552f, 20.966745f, 89.153275f, 0.072102f, 0.000001f, -0.997397f, 35.072392f, 18.071967f }, -{ -238.232040f, 20.966745f, 88.499550f, 0.159415f, 0.000001f, -0.987212f, 28.845318f, 16.692474f }, -{ -243.261429f, 20.966745f, 87.384369f, 0.242432f, 0.000001f, -0.970168f, 22.333258f, 15.835392f }, -{ -248.458618f, 20.966745f, 85.786751f, 0.315709f, 0.000001f, -0.948856f, 15.409784f, 15.483151f }, -{ -253.921509f, 20.966745f, 83.685738f, 0.376381f, 0.000001f, -0.926465f, 7.948449f, 15.618150f }, -{ -259.747955f, 20.966745f, 81.060341f, 0.410820f, 0.000001f, -0.911717f, -0.177137f, 16.222895f }, -{ -259.747955f, 20.966743f, 111.264641f, -0.366218f, -0.000001f, 0.930529f, 12.994218f, -19.965132f }, -{ -253.885376f, 20.966743f, 113.571915f, -0.341209f, -0.000001f, 0.939987f, 21.024369f, -20.172966f }, -{ -247.666229f, 20.966742f, 115.459694f, -0.267103f, -0.000001f, 0.963668f, 29.298793f, -19.722705f }, -{ -241.153412f, 20.966742f, 116.927956f, -0.197940f, -0.000001f, 0.980214f, 37.742128f, -18.641769f }, -{ -234.409882f, 20.966742f, 117.976715f, -0.132733f, -0.000001f, 0.991152f, 46.278944f, -16.957608f }, -{ -227.498550f, 20.966742f, 118.605980f, -0.070438f, -0.000001f, 0.997516f, 54.833877f, -14.697672f }, -{ -220.482346f, 20.966742f, 118.815727f, 0.010033f, -0.000001f, 0.999950f, 63.331513f, -11.889380f }, -{ -205.143631f, 20.966742f, 117.432526f, 0.155949f, -0.000001f, 0.987765f, 81.105774f, -3.543295f }, -{ -191.825546f, 20.966743f, 113.455399f, 0.359337f, -0.000001f, 0.933208f, 95.327947f, 7.029410f }, -{ -180.870651f, 20.966740f, 107.143021f, 0.575202f, -0.000001f, 0.818011f, 105.700425f, 19.369491f }, -{ -172.621567f, 20.966740f, 98.754097f, 0.780436f, -0.000001f, 0.625235f, 111.925517f, 33.017553f }, -{ -167.420868f, 20.966738f, 88.547325f, 0.933968f, 0.000000f, 0.357358f, 113.705593f, 47.514262f }, -{ -165.611176f, 20.966738f, 76.781395f, 0.997415f, 0.000000f, 0.071862f, 110.742960f, 62.400282f }, -{ -166.340637f, 20.966747f, 68.696609f, 0.988370f, 0.000000f, -0.152067f, 106.343412f, 71.768634f }, -{ -168.510422f, 20.966751f, 61.101219f, 0.941956f, 0.000000f, -0.335737f, 100.431613f, 79.922540f }, -{ -172.092514f, 20.966747f, 54.065197f, 0.860949f, 0.000000f, -0.508692f, 93.071636f, 86.790398f }, -{ -177.058975f, 20.966749f, 47.658436f, 0.752871f, 0.000000f, -0.658168f, 84.327446f, 92.300634f }, -{ -183.381851f, 20.966749f, 41.950848f, 0.629290f, 0.000000f, -0.777170f, 74.263017f, 96.381691f }, -{ -191.033142f, 20.966749f, 37.012348f, 0.889699f, 0.000000f, -0.456548f, 62.942388f, 98.962011f }, -{ -181.454453f, 20.966749f, 32.298752f, 0.502007f, 0.000000f, 0.864864f, 72.363211f, 108.786445f }, -{ -173.805496f, 20.966751f, 26.319649f, 0.672072f, -0.000002f, 0.740485f, 78.920146f, 119.285570f }, -{ -168.002350f, 20.966755f, 19.235847f, 0.817837f, -0.000002f, 0.575450f, 82.783870f, 130.303345f }, -{ -163.961121f, 20.966755f, 11.208177f, 0.921693f, -0.000001f, 0.387921f, 84.125031f, 141.683643f }, -{ -161.597916f, 20.966753f, 2.397416f, 0.979689f, 0.000000f, 0.200522f, 83.114247f, 153.270422f }, -{ -160.828827f, 20.966753f, -7.035606f, 0.999954f, 0.000000f, 0.009609f, 79.922183f, 164.907587f }, -{ -162.772522f, 20.966755f, -21.426933f, 0.973138f, 0.000000f, -0.230221f, 71.317727f, 181.302347f }, -{ -168.407867f, 20.966755f, -33.734711f, 0.862300f, 0.000000f, -0.506399f, 59.198847f, 193.590963f }, -{ -177.441193f, 20.966757f, -43.721252f, 0.674528f, 0.000000f, -0.738249f, 44.021060f, 201.616710f }, -{ -189.578857f, 20.966757f, -51.148804f, 0.449703f, 0.000000f, -0.893178f, 26.239853f, 205.222777f }, -{ -204.527191f, 20.966757f, -55.779663f, 0.228732f, 0.000000f, -0.973489f, 6.310730f, 204.252446f }, -{ -221.992554f, 20.966764f, -57.376114f, 0.046891f, 0.000000f, -0.998900f, -15.310837f, 198.548949f }, -{ -229.371170f, 20.966764f, -57.068481f, -0.067655f, 0.000000f, -0.997709f, -24.017065f, 194.962735f }, -{ -236.805725f, 20.966764f, -56.173538f, -0.143976f, 0.000000f, -0.989581f, -32.534211f, 190.648469f }, -{ -244.142380f, 20.966764f, -54.733246f, -0.216746f, 0.000000f, -0.976228f, -40.696227f, 185.723508f }, -{ -251.227341f, 20.966764f, -52.789536f, -0.289503f, 0.000000f, -0.957177f, -48.337180f, 180.305151f }, -{ -257.906799f, 20.966764f, -50.384384f, -0.365851f, 0.000000f, -0.930674f, -55.291061f, 174.510773f }, -{ -264.026886f, 20.966764f, -47.559723f, -0.419059f, 0.000000f, -0.907959f, -61.391828f, 168.457698f }, -{ -264.026886f, 20.966753f, -14.334975f, 0.543307f, 0.000000f, 0.839534f, -46.903330f, 128.650867f }, -{ -257.339294f, 20.966755f, -18.662872f, 0.522722f, 0.000000f, 0.852503f, -40.778150f, 136.752450f }, -{ -251.050217f, 20.966759f, -22.109795f, 0.453797f, 0.000000f, 0.891105f, -34.746278f, 143.624746f }, -{ -245.054810f, 20.966759f, -24.717712f, 0.365635f, 0.000000f, 0.930758f, -28.700388f, 149.363761f }, -{ -239.248169f, 20.966759f, -26.528572f, 0.259367f, 0.000000f, 0.965779f, -22.533070f, 154.065507f }, -{ -233.525421f, 20.966759f, -27.584328f, 0.141032f, 0.000000f, 0.990005f, -16.136991f, 157.825968f }, -{ -227.781708f, 20.966759f, -27.926926f, 0.007245f, 0.000000f, 0.999974f, -9.404798f, 160.741125f }, -{ -220.280746f, 20.966759f, -27.192787f, -0.168689f, 0.000000f, 0.985669f, -0.097693f, 163.132535f }, -{ -213.751633f, 20.966759f, -25.074295f, -0.385508f, 0.000000f, 0.922705f, 8.648710f, 163.441542f }, -{ -208.369156f, 20.966755f, -21.697281f, -0.607191f, 0.000000f, 0.794556f, 16.570136f, 161.742676f }, -{ -204.308121f, 20.966755f, -17.187607f, -0.805587f, 0.000000f, 0.592477f, 23.402251f, 158.110519f }, -{ -201.743317f, 20.966753f, -11.671119f, -0.943840f, 0.000000f, 0.330403f, 28.880766f, 152.619616f }, -{ -200.849533f, 20.966753f, -5.273689f, -0.998820f, 0.000000f, 0.048575f, 32.741376f, 145.344564f }, -{ -201.724655f, 20.966753f, 1.288060f, -0.974605f, 0.000000f, -0.223930f, 34.554308f, 137.101256f }, -{ -204.242859f, 20.966751f, 7.031769f, -0.873964f, 0.000000f, -0.485991f, 34.041921f, 129.121548f }, -{ -208.243301f, 20.966755f, 11.810632f, -0.706060f, 0.000000f, -0.708152f, 31.332898f, 121.651460f }, -{ -213.565170f, 20.966755f, 15.477799f, -0.497756f, 0.000000f, -0.867317f, 26.555888f, 114.937053f }, -{ -220.047684f, 20.966755f, 17.886444f, -0.278017f, 0.000003f, -0.960576f, 19.839494f, 109.224379f }, -{ -148.686584f, 20.966726f, 116.550392f, 0.000000f, -0.000001f, 1.000000f, 148.362750f, 22.133128f }, -{ -72.924095f, 20.966726f, 116.550392f, 0.035820f, -0.000001f, 0.999358f, 239.134392f, 55.171292f }, -{ -44.133286f, 20.966728f, 113.442566f, 0.188416f, -0.000001f, 0.982089f, 272.273660f, 71.449770f }, -{ -20.467419f, 20.966740f, 104.692406f, 0.431738f, -0.000001f, 0.901999f, 296.812196f, 92.253517f }, -{ -1.975434f, 20.966738f, 91.159897f, 0.665230f, -0.000001f, 0.746638f, 313.066387f, 116.530840f }, -{ 11.293716f, 20.966730f, 73.705025f, 0.848586f, 0.000000f, 0.529057f, 321.352617f, 143.230008f }, -{ 19.291100f, 20.966740f, 53.187733f, 0.959076f, 0.000000f, 0.283149f, 321.987274f, 171.299414f }, -{ 21.967770f, 20.966734f, 30.467978f, 0.999154f, 0.000000f, 0.041134f, 315.286714f, 199.687280f }, -{ 19.338877f, 20.966743f, 6.999154f, 0.980586f, 0.000000f, -0.196088f, 301.902798f, 226.659158f }, -{ 11.340330f, 20.966745f, -13.645118f, 0.892215f, 0.000000f, -0.451610f, 283.317205f, 247.905264f }, -{ -2.195676f, 20.966759f, -30.821503f, 0.718364f, 0.000000f, -0.695667f, 259.609396f, 262.581703f }, -{ -21.436935f, 20.966757f, -43.886719f, 0.483336f, 0.000000f, -0.875435f, 230.858877f, 269.844599f }, -{ -46.551262f, 20.966757f, -52.197571f, 0.241852f, 0.000000f, -0.970313f, 197.145034f, 268.850158f }, -{ -77.706444f, 20.966757f, -55.110794f, 0.062127f, 0.000000f, -0.998068f, 158.547374f, 258.754495f }, -{ -148.686584f, 20.966757f, -55.110794f, 0.000000f, 0.000000f, -1.000000f, 73.505490f, 227.801797f }, -{ -105.897141f, 20.966738f, 85.087578f, 0.447214f, 0.000001f, -0.894427f, 185.908961f, 78.488406f }, -{ -105.897141f, 20.966759f, -23.647980f, 0.894427f, 0.000000f, 0.447214f, 138.492035f, 208.765369f }, -{ -77.958153f, 20.966759f, -23.647980f, -0.039593f, 0.000000f, 0.999216f, 171.965959f, 220.948887f }, -{ -58.874207f, 20.966755f, -21.368675f, -0.212191f, 0.000000f, 0.977228f, 195.824544f, 226.540074f }, -{ -44.341877f, 20.966753f, -15.146018f, -0.488613f, 0.000000f, 0.872501f, 215.949404f, 225.421851f }, -{ -33.878738f, 20.966745f, -5.902946f, -0.733828f, 0.000000f, 0.679335f, 232.516059f, 218.910365f }, -{ -27.002363f, 20.966743f, 5.437653f, -0.895536f, 0.000000f, 0.444989f, 245.700045f, 208.321724f }, -{ -23.230320f, 20.966747f, 17.952866f, -0.974747f, -0.000001f, 0.223313f, 255.676941f, 194.972041f }, -{ -22.080179f, 20.966734f, 30.719679f, -0.999602f, 0.000000f, 0.028209f, 262.622269f, 180.177478f }, -{ -23.442402f, 20.966742f, 44.972439f, -0.985715f, 0.000000f, -0.168424f, 267.205431f, 162.507187f }, -{ -27.692215f, 20.966743f, 57.903660f, -0.917976f, 0.000000f, -0.396636f, 267.752663f, 145.160943f }, -{ -35.074326f, 20.966740f, 68.947144f, -0.770297f, 0.000000f, -0.637685f, 263.723906f, 128.710501f }, -{ -45.833443f, 20.966738f, 77.536499f, -0.541864f, 0.000001f, -0.840466f, 254.578922f, 113.727730f }, -{ -60.214287f, 20.966738f, 83.105423f, -0.278852f, 0.000001f, -0.960334f, 239.777591f, 100.784424f }, -{ -78.461555f, 20.966738f, 85.087578f, -0.072088f, 0.000001f, -0.997398f, 218.779751f, 90.452398f }, -{ 53.459190f, 21.106728f, -63.834198f, 0.000000f, 0.000000f, -1.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 21.106720f, 19.696632f, 0.000000f, 0.000010f, -1.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 21.106720f, 19.696632f, 0.000000f, 0.000010f, -1.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 21.106718f, 37.767292f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 21.106718f, 37.767292f, -0.447214f, 0.000000f, 0.894427f, 0.000000f, 255.000000f }, -{ 53.459190f, 21.106716f, 52.887684f, -0.998610f, 0.000000f, 0.052712f, 0.000000f, 255.000000f }, -{ 54.761124f, 21.106716f, 61.040321f, -0.964760f, 0.000000f, 0.263130f, 0.000000f, 255.000000f }, -{ 58.744659f, 21.106709f, 68.629570f, -0.832175f, -0.000001f, 0.554513f, 0.000000f, 255.000000f }, -{ 65.526382f, 21.106707f, 75.245590f, -0.629247f, -0.000001f, 0.777205f, 0.000000f, 255.000000f }, -{ 75.222885f, 21.106714f, 80.478653f, -0.406003f, -0.000001f, 0.913872f, 0.000000f, 255.000000f }, -{ 87.950760f, 21.106714f, 83.918983f, -0.200640f, -0.000002f, 0.979665f, 0.000000f, 255.000000f }, -{ 103.826599f, 21.106714f, 85.156822f, -0.046194f, -0.000002f, 0.998932f, 0.000000f, 255.000000f }, -{ 107.486267f, 21.106707f, 85.094505f, 0.027667f, -0.000002f, 0.999617f, 0.000000f, 255.000000f }, -{ 111.371353f, 21.106707f, 84.904137f, 0.059760f, -0.000002f, 0.998213f, 0.000000f, 255.000000f }, -{ 115.334160f, 21.106707f, 84.580589f, 0.093534f, -0.000002f, 0.995616f, 0.000000f, 255.000000f }, -{ 119.227013f, 21.106707f, 84.118752f, 0.132736f, -0.000002f, 0.991151f, 0.000000f, 255.000000f }, -{ 122.902229f, 21.106707f, 83.513496f, 0.182424f, -0.000002f, 0.983220f, 0.000000f, 255.000000f }, -{ 126.212128f, 21.106707f, 82.759697f, 0.675942f, -0.000001f, 0.736955f, 0.000000f, 255.000000f }, -{ 114.179916f, 21.106716f, 65.426567f, 0.550632f, 0.000001f, -0.834748f, 0.000000f, 255.000000f }, -{ 112.235428f, 21.106709f, 65.933655f, -0.237575f, 0.000002f, -0.971369f, 0.000000f, 255.000000f }, -{ 110.283180f, 21.106709f, 66.348541f, -0.191361f, 0.000002f, -0.981520f, 0.000000f, 255.000000f }, -{ 108.268738f, 21.106709f, 66.671227f, -0.141331f, 0.000002f, -0.989962f, 0.000000f, 255.000000f }, -{ 106.137703f, 21.106709f, 66.901718f, -0.091701f, 0.000002f, -0.995787f, 0.000000f, 255.000000f }, -{ 103.835670f, 21.106709f, 67.040016f, -0.046066f, 0.000002f, -0.998938f, 0.000000f, 255.000000f }, -{ 101.308228f, 21.106709f, 67.086113f, 0.018743f, 0.000002f, -0.999824f, 0.000000f, 255.000000f }, -{ 95.838806f, 21.106709f, 66.577324f, 0.159913f, 0.000002f, -0.987131f, 0.000000f, 255.000000f }, -{ 91.224388f, 21.106716f, 65.167046f, 0.363788f, 0.000001f, -0.931482f, 0.000000f, 255.000000f }, -{ 87.527145f, 21.106716f, 63.029400f, 0.572373f, 0.000000f, -0.819993f, 0.000000f, 255.000000f }, -{ 84.809280f, 21.106716f, 60.338608f, 0.768792f, 0.000000f, -0.639499f, 0.000000f, 255.000000f }, -{ 83.132957f, 21.106716f, 57.268780f, 0.924396f, 0.000000f, -0.381433f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106716f, 53.994068f, 0.993341f, 0.000000f, -0.115210f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106718f, 37.767292f, 0.894427f, 0.000000f, 0.447214f, 0.000000f, 255.000000f }, -{ 111.661545f, 21.106718f, 37.767292f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 21.106720f, 19.696632f, 0.000000f, 0.000010f, -1.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106720f, 19.696632f, 0.000000f, 0.000010f, -1.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106728f, -63.834198f, 0.000000f, 0.000000f, -1.000000f, 0.000000f, 255.000000f }, -{ 109.261765f, 21.106724f, -33.040283f, -0.468379f, 0.000000f, -0.883527f, 0.000000f, 255.000000f }, -{ 158.509918f, 21.106720f, 10.661286f, -0.933984f, 0.000000f, 0.357316f, 0.000000f, 255.000000f }, -{ 110.660858f, 21.106716f, 56.206806f, -0.950931f, 0.000000f, -0.309402f, 0.000000f, 255.000000f }, -{ 147.037323f, 21.106716f, 56.206806f, 0.264544f, 0.000000f, 0.964374f, 0.000000f, 255.000000f }, -{ 175.299042f, 21.106712f, 25.597252f, 0.337904f, -0.000006f, 0.941181f, 0.000000f, 255.000000f }, -{ 203.001129f, 21.106716f, 56.206806f, -0.534949f, -0.000002f, 0.844884f, 0.000000f, 255.000000f }, -{ 237.139038f, 21.106712f, 56.206806f, 0.473674f, 0.000000f, 0.880700f, 0.000000f, 255.000000f }, -{ 189.569809f, 21.106720f, 11.767655f, 0.942807f, 0.000000f, -0.333339f, 0.000000f, 255.000000f }, -{ 239.097778f, 21.106724f, -33.040283f, 0.940870f, 0.000000f, 0.338768f, 0.000000f, 255.000000f }, -{ 202.161682f, 21.106724f, -33.040283f, -0.259495f, 0.000000f, -0.965744f, 0.000000f, 255.000000f }, -{ 173.620132f, 21.106722f, -3.168342f, -0.333727f, 0.000000f, -0.942670f, 0.000000f, 255.000000f }, -{ 143.679504f, 21.106724f, -33.040283f, 0.504764f, 0.000000f, -0.863257f, 0.000000f, 255.000000f }, -{ 246.695496f, 21.106710f, 44.635105f, -0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 246.695496f, 21.106709f, 54.095203f, -0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 243.335144f, 21.106709f, 54.095203f, -0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 243.335144f, 21.106712f, 56.104115f, -0.894427f, 0.000000f, 0.447214f, 0.000000f, 255.000000f }, -{ 252.174316f, 21.106712f, 56.104115f, 0.447214f, 0.000000f, 0.894427f, 0.000000f, 255.000000f }, -{ 252.174316f, 21.106709f, 54.095203f, 0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 248.813965f, 21.106709f, 54.095203f, 0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 248.813965f, 21.106710f, 44.635105f, 0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 253.836212f, 21.106710f, 44.635105f, -0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 253.836212f, 21.106712f, 56.341526f, -0.877850f, 0.000000f, 0.478935f, 0.000000f, 255.000000f }, -{ 258.931549f, 21.106709f, 51.191425f, 0.319282f, 0.000000f, 0.947660f, 0.000000f, 255.000000f }, -{ 264.026886f, 21.106712f, 56.341526f, -0.287199f, 0.000000f, 0.957871f, 0.000000f, 255.000000f }, -{ 264.026886f, 21.106710f, 44.635105f, 0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 261.908356f, 21.106710f, 44.635105f, -0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 261.908356f, 21.106709f, 51.721058f, -0.879075f, 0.000000f, -0.476683f, 0.000000f, 255.000000f }, -{ 258.931549f, 21.106709f, 48.634647f, 0.326650f, 0.000000f, -0.945145f, 0.000000f, 255.000000f }, -{ 255.954681f, 21.106709f, 51.721058f, -0.301802f, 0.000000f, -0.953371f, 0.000000f, 255.000000f }, -{ 255.954681f, 21.106710f, 44.635105f, 0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 53.398365f, 21.091320f, -118.046234f, -0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 53.398365f, 21.091311f, -89.641495f, -0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 58.399651f, 21.091311f, -89.641495f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 58.399651f, 21.091320f, -118.046234f, 0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 64.683319f, 21.091320f, -118.046234f, -0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 64.683319f, 21.091311f, -89.641495f, -0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 69.684608f, 21.091311f, -89.641495f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 69.684608f, 21.091311f, -92.719193f, 0.887750f, -0.000001f, 0.460327f, 0.000000f, 255.000000f }, -{ 71.361206f, 21.091311f, -90.693512f, -0.656342f, -0.000001f, 0.754463f, 0.000000f, 255.000000f }, -{ 75.070610f, 21.091311f, -89.192642f, -0.164366f, -0.000002f, 0.986400f, 0.000000f, 255.000000f }, -{ 78.221947f, 21.091311f, -90.116440f, 0.467430f, -0.000002f, 0.884030f, 0.000000f, 255.000000f }, -{ 80.447113f, 21.091311f, -92.906815f, 0.854905f, -0.000001f, 0.518785f, 0.000000f, 255.000000f }, -{ 81.069901f, 21.091311f, -95.010880f, 0.975826f, 0.000000f, 0.218549f, 0.000000f, 255.000000f }, -{ 81.290161f, 21.091311f, -97.592255f, 0.998390f, 0.000000f, 0.056724f, 0.000000f, 255.000000f }, -{ 81.290161f, 21.091320f, -118.046234f, 0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 76.288872f, 21.091320f, -118.046234f, -0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 76.288872f, 21.091311f, -97.720490f, -0.999299f, 0.000000f, -0.037426f, 0.000000f, 255.000000f }, -{ 76.046646f, 21.091311f, -95.573685f, -0.953521f, 0.000001f, -0.301328f, 0.000000f, 255.000000f }, -{ 74.507790f, 21.091311f, -93.751633f, -0.528723f, 0.000002f, -0.848795f, 0.000000f, 255.000000f }, -{ 72.154381f, 21.091311f, -93.999207f, 0.303533f, 0.000002f, -0.952821f, 0.000000f, 255.000000f }, -{ 70.869621f, 21.091311f, -95.136734f, 0.730358f, 0.000001f, -0.683065f, 0.000000f, 255.000000f }, -{ 69.684608f, 21.091311f, -97.015182f, 0.929606f, 0.000001f, -0.368555f, 0.000000f, 255.000000f }, -{ 69.684608f, 21.091320f, -118.046234f, 0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 116.042702f, 21.091320f, -111.377853f, -0.239564f, -0.000003f, 0.970881f, 0.000000f, 255.000000f }, -{ 116.042702f, 21.091320f, -116.315018f, 0.945756f, 0.000001f, -0.324877f, 0.000000f, 255.000000f }, -{ 112.247803f, 21.091320f, -118.552063f, 0.339296f, 0.000002f, -0.940680f, 0.000000f, 255.000000f }, -{ 107.574234f, 21.091320f, -118.394440f, -0.247366f, 0.000001f, -0.968922f, 0.000000f, 255.000000f }, -{ 103.539482f, 21.091320f, -115.040665f, -0.746247f, 0.000001f, -0.665669f, 0.000000f, 255.000000f }, -{ 102.209610f, 21.091320f, -112.118790f, -0.936927f, 0.000000f, -0.349526f, 0.000000f, 255.000000f }, -{ 101.385559f, 21.091312f, -108.374054f, -0.986407f, 0.000000f, -0.164321f, 0.000000f, 255.000000f }, -{ 101.102959f, 21.091311f, -103.811798f, -0.999732f, 0.000000f, -0.023155f, 0.000000f, 255.000000f }, -{ 101.339844f, 21.091307f, -99.454666f, -0.995145f, 0.000000f, 0.098417f, 0.000000f, 255.000000f }, -{ 102.036247f, 21.091311f, -95.777908f, -0.969592f, -0.000001f, 0.244727f, 0.000000f, 255.000000f }, -{ 103.170799f, 21.091311f, -92.831406f, -0.899584f, -0.000001f, 0.436747f, 0.000000f, 255.000000f }, -{ 104.722122f, 21.091311f, -90.665024f, -0.716919f, -0.000001f, 0.697157f, 0.000000f, 255.000000f }, -{ 107.933678f, 21.091311f, -88.927628f, -0.281539f, -0.000002f, 0.959550f, 0.000000f, 255.000000f }, -{ 111.632736f, 21.091311f, -89.470505f, 0.315299f, -0.000002f, 0.948992f, 0.000000f, 255.000000f }, -{ 113.549179f, 21.091311f, -91.009354f, 0.701500f, -0.000002f, 0.712669f, 0.000000f, 255.000000f }, -{ 114.952675f, 21.091311f, -93.103912f, 0.890786f, -0.000001f, 0.454424f, 0.000000f, 255.000000f }, -{ 116.387047f, 21.091307f, -99.154861f, 0.985821f, 0.000000f, 0.167802f, 0.000000f, 255.000000f }, -{ 116.619774f, 21.091309f, -104.965942f, 0.908369f, 0.000001f, -0.418169f, 0.000000f, 255.000000f }, -{ 106.104248f, 21.091312f, -104.965942f, 0.465868f, 0.000001f, -0.884854f, 0.000000f, 255.000000f }, -{ 106.676575f, 21.091320f, -110.009979f, 0.971167f, 0.000000f, 0.238399f, 0.000000f, 255.000000f }, -{ 108.374535f, 21.091320f, -113.130447f, 0.745484f, -0.000001f, 0.666523f, 0.000000f, 255.000000f }, -{ 111.169655f, 21.091320f, -114.199097f, 0.156933f, -0.000001f, 0.987609f, 0.000000f, 255.000000f }, -{ 113.774490f, 21.091320f, -113.485764f, -0.413582f, -0.000002f, 0.910467f, 0.000000f, 255.000000f }, -{ 106.040123f, 21.091307f, -101.247040f, 0.916229f, -0.000001f, 0.400654f, 0.000000f, 255.000000f }, -{ 111.618484f, 21.091307f, -101.247040f, -0.458820f, -0.000001f, 0.888529f, 0.000000f, 255.000000f }, -{ 111.312141f, 21.091311f, -96.746841f, -0.987291f, 0.000000f, -0.158925f, 0.000000f, 255.000000f }, -{ 110.364601f, 21.091311f, -94.098953f, -0.833881f, 0.000001f, -0.551945f, 0.000000f, 255.000000f }, -{ 108.733131f, 21.091311f, -93.232162f, -0.164167f, 0.000002f, -0.986433f, 0.000000f, 255.000000f }, -{ 107.208519f, 21.091311f, -94.113205f, 0.689773f, 0.000001f, -0.724025f, 0.000000f, 255.000000f }, -{ 106.325096f, 21.091311f, -96.775330f, 0.972507f, 0.000000f, -0.232875f, 0.000000f, 255.000000f }, -{ 122.262253f, 21.091320f, -118.046234f, -0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 122.262253f, 21.091311f, -89.641495f, -0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 127.263535f, 21.091311f, -89.641495f, 0.444200f, -0.000001f, 0.895928f, 0.000000f, 255.000000f }, -{ 127.391785f, 21.091311f, -97.335770f, 0.953952f, -0.000001f, 0.299959f, 0.000000f, 255.000000f }, -{ 128.306671f, 21.091311f, -94.372635f, -0.949849f, -0.000001f, 0.312709f, 0.000000f, 255.000000f }, -{ 129.111130f, 21.091311f, -92.203873f, -0.922966f, -0.000001f, 0.384882f, 0.000000f, 255.000000f }, -{ 129.876404f, 21.091311f, -90.715469f, -0.819365f, -0.000002f, 0.573272f, 0.000000f, 255.000000f }, -{ 131.574371f, 21.091311f, -89.323868f, -0.451781f, -0.000002f, 0.892129f, 0.000000f, 255.000000f }, -{ 133.556717f, 21.091311f, -89.280518f, 0.124905f, -0.000001f, 0.992169f, 0.000000f, 255.000000f }, -{ 135.214310f, 21.091311f, -90.026199f, 0.720568f, -0.000001f, 0.693384f, 0.000000f, 255.000000f }, -{ 134.829590f, 21.091311f, -95.155716f, 0.837365f, 0.000001f, -0.546645f, 0.000000f, 255.000000f }, -{ 132.649551f, 21.091311f, -94.450424f, -0.087364f, 0.000002f, -0.996176f, 0.000000f, 255.000000f }, -{ 130.914764f, 21.091311f, -95.135239f, 0.525644f, 0.000002f, -0.850705f, 0.000000f, 255.000000f }, -{ 129.543335f, 21.091311f, -96.915436f, 0.842037f, 0.000001f, -0.539420f, 0.000000f, 255.000000f }, -{ 128.513855f, 21.091307f, -99.379562f, 0.939937f, 0.000001f, -0.341349f, 0.000000f, 255.000000f }, -{ 127.804985f, 21.091307f, -102.116196f, 0.975653f, 0.000001f, -0.219322f, 0.000000f, 255.000000f }, -{ 127.395340f, 21.091309f, -104.713913f, 0.994216f, 0.000000f, -0.107397f, 0.000000f, 255.000000f }, -{ 127.263535f, 21.091320f, -118.046234f, 0.890868f, 0.000001f, -0.454263f, 0.000000f, 255.000000f }, -{ 155.668289f, 21.091312f, -112.788467f, -0.207596f, -0.000003f, 0.978215f, 0.000000f, 255.000000f }, -{ 155.668289f, 21.091312f, -116.571503f, 0.958465f, 0.000000f, -0.285210f, 0.000000f, 255.000000f }, -{ 154.127060f, 21.091320f, -117.804016f, 0.558773f, 0.000001f, -0.829321f, 0.000000f, 255.000000f }, -{ 152.305023f, 21.091320f, -118.637558f, 0.271646f, 0.000002f, -0.962397f, 0.000000f, 255.000000f }, -{ 150.903000f, 21.091320f, -118.586197f, -0.192636f, 0.000003f, -0.981270f, 0.000000f, 255.000000f }, -{ 149.472794f, 21.091320f, -117.781738f, -0.623712f, 0.000001f, -0.781654f, 0.000000f, 255.000000f }, -{ 148.448669f, 21.091320f, -116.186478f, -0.885465f, 0.000001f, -0.464706f, 0.000000f, 255.000000f }, -{ 148.102249f, 21.091320f, -115.096756f, -0.673915f, 0.000002f, -0.738809f, 0.000000f, 255.000000f }, -{ 146.276031f, 21.091320f, -117.172318f, 0.651081f, 0.000002f, -0.759008f, 0.000000f, 255.000000f }, -{ 142.652115f, 21.091320f, -118.815659f, 0.173318f, 0.000003f, -0.984866f, 0.000000f, 255.000000f }, -{ 139.866501f, 21.091320f, -117.808762f, -0.507992f, 0.000002f, -0.861362f, 0.000000f, 255.000000f }, -{ 137.850311f, 21.091320f, -115.206009f, -0.871837f, 0.000001f, -0.489796f, 0.000000f, 255.000000f }, -{ 137.073761f, 21.091320f, -111.634323f, -0.998311f, 0.000000f, -0.058104f, 0.000000f, 255.000000f }, -{ 138.144791f, 21.091309f, -107.571091f, -0.909053f, -0.000001f, 0.416680f, 0.000000f, 255.000000f }, -{ 141.623840f, 21.091307f, -104.049286f, -0.664570f, -0.000001f, 0.747226f, 0.000000f, 255.000000f }, -{ 144.391052f, 21.091307f, -102.166382f, -0.548261f, -0.000001f, 0.836307f, 0.000000f, 255.000000f }, -{ 147.909882f, 21.091307f, -100.028778f, -0.766243f, -0.000001f, 0.642551f, 0.000000f, 255.000000f }, -{ 147.909882f, 21.091311f, -97.335770f, -0.996405f, 0.000000f, -0.084715f, 0.000000f, 255.000000f }, -{ 147.180527f, 21.091311f, -94.538589f, -0.876729f, 0.000001f, -0.480984f, 0.000000f, 255.000000f }, -{ 145.869064f, 21.091311f, -93.718689f, -0.363965f, 0.000001f, -0.931413f, 0.000000f, 255.000000f }, -{ 143.898575f, 21.091311f, -93.732040f, 0.141328f, 0.000002f, -0.989963f, 0.000000f, 255.000000f }, -{ 141.682312f, 21.091311f, -94.706894f, 0.547231f, 0.000002f, -0.836982f, 0.000000f, 255.000000f }, -{ 137.779068f, 21.091307f, -98.297562f, -0.401856f, 0.000002f, -0.915703f, 0.000000f, 255.000000f }, -{ 137.779068f, 21.091311f, -92.526840f, -0.955079f, -0.000001f, 0.296350f, 0.000000f, 255.000000f }, -{ 141.658264f, 21.091311f, -89.665527f, -0.497538f, -0.000001f, 0.867442f, 0.000000f, 255.000000f }, -{ 144.054428f, 21.091311f, -88.951309f, -0.179589f, -0.000002f, 0.983742f, 0.000000f, 255.000000f }, -{ 147.152328f, 21.091311f, -89.072128f, 0.177231f, -0.000003f, 0.984169f, 0.000000f, 255.000000f }, -{ 150.474655f, 21.091311f, -90.715469f, 0.598228f, -0.000002f, 0.801326f, 0.000000f, 255.000000f }, -{ 152.600082f, 21.091311f, -94.111420f, 0.914330f, -0.000001f, 0.404969f, 0.000000f, 255.000000f }, -{ 152.911179f, 21.091311f, -96.502228f, 0.996242f, 0.000000f, 0.086610f, 0.000000f, 255.000000f }, -{ 152.932556f, 21.091312f, -113.100754f, 0.997125f, 0.000000f, 0.075777f, 0.000000f, 255.000000f }, -{ 153.103531f, 21.091312f, -113.846436f, 0.884948f, -0.000001f, 0.465690f, 0.000000f, 255.000000f }, -{ 153.680603f, 21.091312f, -114.199097f, 0.253386f, -0.000001f, 0.967365f, 0.000000f, 255.000000f }, -{ 154.124680f, 21.091312f, -114.032852f, -0.430647f, -0.000002f, 0.902520f, 0.000000f, 255.000000f }, -{ 154.796753f, 21.091312f, -113.553146f, -0.607827f, -0.000002f, 0.794070f, 0.000000f, 255.000000f }, -{ 147.909882f, 21.091312f, -110.800781f, -0.953798f, 0.000000f, 0.300449f, 0.000000f, 255.000000f }, -{ 147.909882f, 21.091307f, -103.491211f, -0.866611f, 0.000001f, -0.498984f, 0.000000f, 255.000000f }, -{ 146.048050f, 21.091309f, -104.727585f, 0.580141f, 0.000001f, -0.814516f, 0.000000f, 255.000000f }, -{ 144.556686f, 21.091309f, -105.944351f, 0.665820f, 0.000002f, -0.746113f, 0.000000f, 255.000000f }, -{ 143.421539f, 21.091309f, -107.154007f, 0.767879f, 0.000002f, -0.640594f, 0.000000f, 255.000000f }, -{ 142.628372f, 21.091309f, -108.369003f, 0.891623f, 0.013556f, -0.452576f, 0.000000f, 255.000000f }, -{ 142.162918f, 21.091312f, -109.601822f, 0.949579f, 0.009083f, -0.313397f, 0.000000f, 255.000000f }, -{ 142.010925f, 21.091312f, -110.864899f, 0.999304f, 0.016713f, 0.033337f, 0.000000f, 255.000000f }, -{ 142.329147f, 21.091312f, -112.550995f, 0.955846f, 0.011386f, 0.293649f, 0.000000f, 255.000000f }, -{ 143.188812f, 21.091320f, -113.667130f, 0.656317f, -0.000002f, 0.754485f, 0.000000f, 255.000000f }, -{ 144.447449f, 21.091320f, -114.070847f, 0.112970f, -0.000003f, 0.993598f, 0.000000f, 255.000000f }, -{ 145.715591f, 21.091312f, -113.693268f, -0.427813f, -0.000002f, 0.903867f, 0.000000f, 255.000000f }, -{ 146.898224f, 21.091312f, -112.588989f, -0.738315f, -0.000001f, 0.674456f, 0.000000f, 255.000000f }, -{ 147.430771f, 21.091312f, -111.777710f, -0.858087f, -0.000001f, 0.513505f, 0.000000f, 255.000000f }, -{ 173.749878f, 21.091312f, -112.467880f, -0.011390f, -0.000002f, 0.999935f, 0.000000f, 255.000000f }, -{ 173.749878f, 21.091312f, -117.276810f, 0.941545f, 0.000001f, -0.336887f, 0.000000f, 255.000000f }, -{ 172.085159f, 21.091312f, -118.160233f, 0.381529f, 0.000002f, -0.924357f, 0.000000f, 255.000000f }, -{ 168.812698f, 21.091312f, -118.815659f, 0.073515f, 0.000003f, -0.997294f, 0.000000f, 255.000000f }, -{ 166.009262f, 21.091312f, -118.315475f, -0.288270f, 0.000003f, -0.957549f, 0.000000f, 255.000000f }, -{ 163.547806f, 21.091312f, -116.887344f, -0.587254f, 0.000002f, -0.809402f, 0.000000f, 255.000000f }, -{ 161.503128f, 21.091312f, -114.639908f, -0.793964f, 0.000002f, -0.607965f, 0.000000f, 255.000000f }, -{ 159.950012f, 21.091312f, -111.681839f, -0.916096f, 0.000001f, -0.400960f, 0.000000f, 255.000000f }, -{ 158.963303f, 21.091309f, -108.121750f, -0.978307f, 0.000000f, -0.207162f, 0.000000f, 255.000000f }, -{ 158.617767f, 21.091307f, -104.068283f, -0.999894f, 0.000000f, -0.014533f, 0.000000f, 255.000000f }, -{ 159.531387f, 21.091311f, -96.903564f, -0.960752f, -0.000001f, 0.277410f, 0.000000f, 255.000000f }, -{ 163.822617f, 21.091311f, -90.542206f, -0.686978f, -0.000001f, 0.726678f, 0.000000f, 255.000000f }, -{ 169.115997f, 21.091311f, -88.872055f, -0.125351f, -0.000002f, 0.992112f, 0.000000f, 255.000000f }, -{ 173.301041f, 21.091311f, -89.897964f, 0.605053f, -0.000002f, 0.796185f, 0.000000f, 255.000000f }, -{ 173.301041f, 21.091311f, -95.027481f, 0.869424f, 0.000001f, -0.494066f, 0.000000f, 255.000000f }, -{ 169.582138f, 21.091311f, -93.616867f, -0.117972f, 0.000003f, -0.993017f, 0.000000f, 255.000000f }, -{ 166.473557f, 21.091311f, -94.882629f, 0.569661f, 0.000002f, -0.821880f, 0.000000f, 255.000000f }, -{ 164.462112f, 21.091307f, -98.442429f, 0.926161f, 0.000000f, -0.377127f, 0.000000f, 255.000000f }, -{ 163.747299f, 21.091307f, -103.940048f, 0.999259f, 0.000000f, -0.038502f, 0.000000f, 255.000000f }, -{ 164.523849f, 21.091312f, -109.302292f, 0.960848f, -0.000001f, 0.277074f, 0.000000f, 255.000000f }, -{ 166.711029f, 21.091312f, -112.812210f, 0.688926f, -0.000002f, 0.724832f, 0.000000f, 255.000000f }, -{ 171.313354f, 21.091312f, -113.911743f, -0.016062f, -0.000002f, 0.999871f, 0.000000f, 255.000000f }, -{ 188.369019f, 21.091312f, -113.301422f, 0.166049f, -0.000002f, 0.986117f, 0.000000f, 255.000000f }, -{ 188.369019f, 21.091312f, -117.725632f, 0.929230f, 0.000001f, -0.369503f, 0.000000f, 255.000000f }, -{ 186.637802f, 21.091312f, -118.378708f, 0.302607f, 0.000003f, -0.953115f, 0.000000f, 255.000000f }, -{ 184.602036f, 21.091312f, -118.792801f, 0.114406f, 0.000003f, -0.993434f, 0.000000f, 255.000000f }, -{ 182.419891f, 21.091312f, -118.666061f, -0.154137f, 0.000002f, -0.988049f, 0.000000f, 255.000000f }, -{ 181.128311f, 21.091312f, -118.195847f, -0.440071f, 0.000002f, -0.897963f, 0.000000f, 255.000000f }, -{ 180.089645f, 21.091312f, -117.372986f, -0.704223f, 0.000001f, -0.709979f, 0.000000f, 255.000000f }, -{ 179.323486f, 21.091312f, -116.165421f, -0.890730f, 0.000001f, -0.454533f, 0.000000f, 255.000000f }, -{ 178.849426f, 21.091312f, -114.541061f, -0.976876f, 0.000000f, -0.213806f, 0.000000f, 255.000000f }, -{ 178.687042f, 21.091312f, -112.467880f, -0.998642f, 0.000000f, -0.052093f, 0.000000f, 255.000000f }, -{ 178.687042f, 21.091311f, -94.001587f, -0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 175.416977f, 21.091311f, -94.001587f, -0.498416f, 0.000001f, -0.866938f, 0.000000f, 255.000000f }, -{ 178.200211f, 21.091311f, -89.945450f, -0.824150f, -0.000001f, 0.566372f, 0.000000f, 255.000000f }, -{ 180.755478f, 21.091311f, -86.238419f, -0.830310f, -0.000001f, 0.557302f, 0.000000f, 255.000000f }, -{ 183.239502f, 21.091309f, -82.331909f, -0.631328f, -0.000001f, 0.775516f, 0.000000f, 255.000000f }, -{ 183.688324f, 21.091309f, -82.331909f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 183.688324f, 21.091311f, -89.641495f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 188.369019f, 21.091311f, -89.641495f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 188.369019f, 21.091311f, -94.001587f, 0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 183.688324f, 21.091311f, -94.001587f, 0.448748f, 0.000001f, -0.893658f, 0.000000f, 255.000000f }, -{ 183.847443f, 21.091312f, -112.446503f, 0.993879f, -0.002630f, 0.110439f, 0.000000f, 255.000000f }, -{ 184.081055f, 21.091312f, -113.181198f, 0.839241f, 0.017509f, 0.543478f, 0.000000f, 255.000000f }, -{ 184.972198f, 21.091312f, -113.977341f, 0.558370f, 0.001114f, 0.829591f, 0.000000f, 255.000000f }, -{ 186.488205f, 21.091312f, -113.985367f, -0.111941f, -0.000003f, 0.993715f, 0.000000f, 255.000000f }, -{ 192.280289f, 21.091312f, -118.046234f, -0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 192.280289f, 21.091311f, -89.641495f, -0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 197.281570f, 21.091311f, -89.641495f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 197.281570f, 21.091312f, -118.046234f, 0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 209.400085f, 21.091312f, -118.687424f, -0.387639f, 0.000002f, -0.921811f, 0.000000f, 255.000000f }, -{ 200.872238f, 21.091311f, -89.641495f, -0.975084f, 0.000000f, 0.221837f, 0.000000f, 255.000000f }, -{ 205.873535f, 21.091311f, -89.641495f, 0.395561f, -0.000001f, 0.918440f, 0.000000f, 255.000000f }, -{ 210.041275f, 21.091309f, -105.863617f, 0.791121f, -0.000001f, 0.611659f, 0.000000f, 255.000000f }, -{ 210.169510f, 21.091309f, -105.863617f, -0.395561f, -0.000001f, 0.918440f, 0.000000f, 255.000000f }, -{ 214.337250f, 21.091311f, -89.641495f, -0.791121f, -0.000001f, 0.611659f, 0.000000f, 255.000000f }, -{ 219.338531f, 21.091311f, -89.641495f, 0.487542f, -0.000001f, 0.873100f, 0.000000f, 255.000000f }, -{ 210.810699f, 21.091312f, -118.687424f, 0.775278f, 0.000002f, -0.631621f, 0.000000f, 255.000000f }, -{ 196.095139f, 9.401914f, -83.842834f, 0.586264f, 0.000000f, -0.810120f, 0.000000f, 255.000000f }, -{ 197.530334f, 9.401917f, -82.099869f, 0.987392f, 0.000000f, -0.158291f, 0.000000f, 255.000000f }, -{ 197.312714f, 9.401917f, -79.852554f, 0.810120f, 0.000000f, 0.586264f, 0.000000f, 255.000000f }, -{ 195.569748f, 9.401917f, -78.417358f, 0.158291f, 0.000000f, 0.987392f, 0.000000f, 255.000000f }, -{ 193.322433f, 9.401917f, -78.634979f, -0.586264f, 0.000000f, 0.810120f, 0.000000f, 255.000000f }, -{ 191.887238f, 9.401917f, -80.377945f, -0.987392f, 0.000000f, 0.158291f, 0.000000f, 255.000000f }, -{ 192.104858f, 9.401917f, -82.625259f, -0.810120f, 0.000000f, -0.586264f, 0.000000f, 255.000000f }, -{ 193.847824f, 9.401914f, -84.060455f, -0.158291f, 0.000000f, -0.987392f, 0.000000f, 255.000000f }, -{ 196.095139f, 21.005835f, -83.842834f, 0.344805f, 0.000000f, -0.938674f, 0.000000f, 255.000000f }, -{ 197.530334f, 21.005833f, -82.099869f, 0.907558f, 0.000000f, -0.419928f, 0.000000f, 255.000000f }, -{ 197.312714f, 21.005833f, -79.852554f, 0.938674f, 0.000000f, 0.344805f, 0.000000f, 255.000000f }, -{ 195.569748f, 21.005836f, -78.417358f, 0.419928f, 0.000000f, 0.907558f, 0.000000f, 255.000000f }, -{ 193.322433f, 21.005836f, -78.634979f, -0.344805f, 0.000000f, 0.938674f, 0.000000f, 255.000000f }, -{ 191.887238f, 21.005833f, -80.377945f, -0.907558f, 0.000000f, 0.419928f, 0.000000f, 255.000000f }, -{ 192.104858f, 21.005835f, -82.625259f, -0.938674f, 0.000000f, -0.344805f, 0.000000f, 255.000000f }, -{ 193.847824f, 21.005835f, -84.060455f, -0.419928f, 0.000000f, -0.907558f, 0.000000f, 255.000000f }, -{ 57.212021f, 9.401914f, -83.842834f, 0.586264f, 0.000000f, -0.810120f, 0.000000f, 255.000000f }, -{ 58.647217f, 9.401917f, -82.099869f, 0.987392f, 0.000000f, -0.158291f, 0.000000f, 255.000000f }, -{ 58.429596f, 9.401917f, -79.852554f, 0.810120f, 0.000000f, 0.586264f, 0.000000f, 255.000000f }, -{ 56.686630f, 9.401917f, -78.417358f, 0.158291f, 0.000000f, 0.987392f, 0.000000f, 255.000000f }, -{ 54.439316f, 9.401917f, -78.634979f, -0.586264f, 0.000000f, 0.810120f, 0.000000f, 255.000000f }, -{ 53.004120f, 9.401917f, -80.377945f, -0.987392f, 0.000000f, 0.158291f, 0.000000f, 255.000000f }, -{ 53.221741f, 9.401917f, -82.625259f, -0.810120f, 0.000000f, -0.586264f, 0.000000f, 255.000000f }, -{ 54.964706f, 9.401914f, -84.060455f, -0.158291f, 0.000000f, -0.987392f, 0.000000f, 255.000000f }, -{ 57.212021f, 21.005835f, -83.842834f, 0.344805f, 0.000000f, -0.938674f, 0.000000f, 255.000000f }, -{ 58.647217f, 21.005833f, -82.099869f, 0.907558f, 0.000000f, -0.419928f, 0.000000f, 255.000000f }, -{ 58.429596f, 21.005833f, -79.852554f, 0.938674f, 0.000000f, 0.344805f, 0.000000f, 255.000000f }, -{ 56.686630f, 21.005836f, -78.417358f, 0.419928f, 0.000000f, 0.907558f, 0.000000f, 255.000000f }, -{ 54.439316f, 21.005836f, -78.634979f, -0.344805f, 0.000000f, 0.938674f, 0.000000f, 255.000000f }, -{ 53.004120f, 21.005833f, -80.377945f, -0.907558f, 0.000000f, 0.419928f, 0.000000f, 255.000000f }, -{ 53.221741f, 21.005835f, -82.625259f, -0.938674f, 0.000000f, -0.344805f, 0.000000f, 255.000000f }, -{ 54.964706f, 21.005835f, -84.060455f, -0.419928f, 0.000000f, -0.907558f, 0.000000f, 255.000000f }, -{ 98.582520f, 9.484123f, -113.301437f, 0.869996f, -0.000001f, 0.493059f, 0.000000f, 255.000000f }, -{ 98.582520f, 9.484123f, -117.725662f, 0.688899f, 0.000002f, -0.724858f, 0.000000f, 255.000000f }, -{ 95.979660f, 9.484123f, -118.792831f, 0.103299f, 0.000002f, -0.994650f, 0.000000f, 255.000000f }, -{ 92.633392f, 9.484123f, -118.666077f, -0.344449f, 0.000001f, -0.938805f, 0.000000f, 255.000000f }, -{ 90.303146f, 9.484123f, -117.373001f, -0.810154f, 0.000001f, -0.586217f, 0.000000f, 255.000000f }, -{ 89.062927f, 9.484123f, -114.541092f, -0.982148f, 0.000000f, -0.188111f, 0.000000f, 255.000000f }, -{ 88.900543f, 9.484123f, -112.467911f, -0.999661f, 0.000000f, -0.026047f, 0.000000f, 255.000000f }, -{ 88.900543f, 9.484118f, -94.001602f, -0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 85.630478f, 9.484118f, -94.001602f, -0.996832f, -0.000001f, 0.079535f, 0.000000f, 255.000000f }, -{ 88.413712f, 9.484118f, -89.945480f, -0.823749f, -0.000001f, 0.566955f, 0.000000f, 255.000000f }, -{ 90.968979f, 9.484117f, -86.238449f, -0.837145f, -0.000001f, 0.546981f, 0.000000f, 255.000000f }, -{ 93.453003f, 9.484117f, -82.331924f, -0.315664f, -0.000001f, 0.948871f, 0.000000f, 255.000000f }, -{ 93.901825f, 9.484117f, -82.331924f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 93.901825f, 9.484118f, -89.641510f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 98.582520f, 9.484118f, -89.641510f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 98.582520f, 9.484118f, -94.001602f, 0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 93.901825f, 9.484118f, -94.001602f, 0.897364f, 0.000532f, -0.441290f, 0.000000f, 255.000000f }, -{ 94.060944f, 9.484123f, -112.446518f, 0.908382f, 0.000909f, 0.418140f, 0.000000f, 255.000000f }, -{ 95.185699f, 9.484123f, -113.977371f, 0.300433f, -0.000003f, 0.953803f, 0.000000f, 255.000000f }, -{ 96.701706f, 9.484123f, -113.985397f, -0.229252f, -0.000002f, 0.973367f, 0.000000f, 255.000000f }, -{ 98.582520f, 21.091312f, -113.301422f, 0.166049f, -0.000002f, 0.986117f, 0.000000f, 255.000000f }, -{ 98.582520f, 21.091312f, -117.725632f, 0.932011f, 0.000001f, -0.362429f, 0.000000f, 255.000000f }, -{ 95.979660f, 21.091312f, -118.792801f, 0.245227f, 0.000003f, -0.969466f, 0.000000f, 255.000000f }, -{ 92.633392f, 21.091312f, -118.666061f, -0.191620f, 0.000002f, -0.981469f, 0.000000f, 255.000000f }, -{ 90.303146f, 21.091312f, -117.372986f, -0.659538f, 0.000001f, -0.751671f, 0.000000f, 255.000000f }, -{ 89.062927f, 21.091312f, -114.541061f, -0.954830f, 0.000001f, -0.297154f, 0.000000f, 255.000000f }, -{ 88.900543f, 21.091312f, -112.467880f, -0.998642f, 0.000000f, -0.052093f, 0.000000f, 255.000000f }, -{ 88.900543f, 21.091311f, -94.001587f, -0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 85.630478f, 21.091311f, -94.001587f, -0.498416f, 0.000001f, -0.866938f, 0.000000f, 255.000000f }, -{ 88.413712f, 21.091311f, -89.945450f, -0.824150f, -0.000001f, 0.566372f, 0.000000f, 255.000000f }, -{ 90.968979f, 21.091311f, -86.238419f, -0.830310f, -0.000001f, 0.557302f, 0.000000f, 255.000000f }, -{ 93.453003f, 21.091309f, -82.331909f, -0.631328f, -0.000001f, 0.775516f, 0.000000f, 255.000000f }, -{ 93.901825f, 21.091309f, -82.331909f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 93.901825f, 21.091311f, -89.641495f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 98.582520f, 21.091311f, -89.641495f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 98.582520f, 21.091311f, -94.001587f, 0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 93.901825f, 21.091311f, -94.001587f, 0.448616f, 0.000001f, -0.893725f, 0.000000f, 255.000000f }, -{ 94.047279f, 21.091312f, -112.455856f, 0.976683f, 0.000910f, 0.214684f, 0.000000f, 255.000000f }, -{ 95.185699f, 21.091312f, -113.977341f, 0.592555f, 0.000522f, 0.805530f, 0.000000f, 255.000000f }, -{ 96.701706f, 21.091312f, -113.985367f, -0.111941f, -0.000003f, 0.993715f, 0.000000f, 255.000000f }, -{ 236.900940f, 9.484123f, -111.377884f, 0.874270f, -0.000001f, 0.485440f, 0.000000f, 255.000000f }, -{ 236.900940f, 9.484123f, -116.315048f, 0.760144f, 0.000001f, -0.649754f, 0.000000f, 255.000000f }, -{ 233.106049f, 9.484123f, -118.552078f, 0.152177f, 0.000001f, -0.988353f, 0.000000f, 255.000000f }, -{ 228.432480f, 9.484123f, -118.394455f, -0.459334f, 0.000001f, -0.888264f, 0.000000f, 255.000000f }, -{ 224.397736f, 9.484123f, -115.040680f, -0.838627f, 0.000001f, -0.544707f, 0.000000f, 255.000000f }, -{ 223.067856f, 9.484123f, -112.118805f, -0.959193f, 0.000000f, -0.282752f, 0.000000f, 255.000000f }, -{ 222.243805f, 9.484118f, -108.374069f, -0.993577f, 0.000000f, -0.113154f, 0.000000f, 255.000000f }, -{ 221.961212f, 9.484118f, -103.811813f, -0.999878f, 0.000000f, 0.015606f, 0.000000f, 255.000000f }, -{ 222.198090f, 9.484118f, -99.454697f, -0.989803f, 0.000000f, 0.142441f, 0.000000f, 255.000000f }, -{ 222.894501f, 9.484118f, -95.777939f, -0.953092f, -0.000001f, 0.302682f, 0.000000f, 255.000000f }, -{ 224.029053f, 9.484106f, -92.831436f, -0.859240f, -0.000001f, 0.511572f, 0.000000f, 255.000000f }, -{ 225.580368f, 9.484118f, -90.665039f, -0.601898f, -0.000001f, 0.798573f, 0.000000f, 255.000000f }, -{ 228.791931f, 9.484118f, -88.927658f, -0.064729f, -0.000002f, 0.997903f, 0.000000f, 255.000000f }, -{ 232.490982f, 9.484118f, -89.470520f, 0.480740f, -0.000002f, 0.876863f, 0.000000f, 255.000000f }, -{ 234.407425f, 9.484118f, -91.009384f, 0.770418f, -0.000001f, 0.637539f, 0.000000f, 255.000000f }, -{ 235.810913f, 9.484106f, -93.103928f, 0.938897f, 0.000000f, 0.344198f, 0.000000f, 255.000000f }, -{ 237.245300f, 9.484118f, -99.154877f, 0.994578f, 0.000000f, 0.103993f, 0.000000f, 255.000000f }, -{ 237.478027f, 9.484118f, -104.965958f, 0.454185f, 0.000001f, -0.890908f, 0.000000f, 255.000000f }, -{ 226.962494f, 9.484118f, -104.965958f, 0.931736f, 0.000000f, -0.363137f, 0.000000f, 255.000000f }, -{ 227.534821f, 9.484123f, -110.009995f, 0.932111f, 0.000000f, 0.362173f, 0.000000f, 255.000000f }, -{ 229.232788f, 9.484123f, -113.130463f, 0.561655f, -0.000001f, 0.827372f, 0.000000f, 255.000000f }, -{ 232.027893f, 9.484123f, -114.199112f, -0.059664f, -0.000002f, 0.998219f, 0.000000f, 255.000000f }, -{ 234.632736f, 9.484123f, -113.485794f, -0.556105f, -0.000002f, 0.831112f, 0.000000f, 255.000000f }, -{ 226.898376f, 9.484118f, -101.247055f, 0.458115f, -0.000001f, 0.888893f, 0.000000f, 255.000000f }, -{ 232.476730f, 9.484118f, -101.247055f, -0.917640f, -0.000001f, 0.397413f, 0.000000f, 255.000000f }, -{ 232.170380f, 9.484118f, -96.746857f, -0.968412f, 0.000000f, -0.249358f, 0.000000f, 255.000000f }, -{ 231.222839f, 9.484118f, -94.098984f, -0.666434f, 0.000002f, -0.745564f, 0.000000f, 255.000000f }, -{ 229.591370f, 9.484106f, -93.232178f, 0.199198f, 0.000001f, -0.979959f, 0.000000f, 255.000000f }, -{ 228.066772f, 9.484118f, -94.113220f, 0.848531f, 0.000001f, -0.529145f, 0.000000f, 255.000000f }, -{ 227.183350f, 9.484118f, -96.775345f, 0.988917f, 0.000000f, -0.148471f, 0.000000f, 255.000000f }, -{ 236.900940f, 21.091320f, -111.377853f, -0.239566f, -0.000003f, 0.970880f, 0.000000f, 255.000000f }, -{ 236.900940f, 21.091320f, -116.315018f, 0.945756f, 0.000001f, -0.324877f, 0.000000f, 255.000000f }, -{ 233.106049f, 21.091320f, -118.552063f, 0.339296f, 0.000002f, -0.940680f, 0.000000f, 255.000000f }, -{ 228.432480f, 21.091320f, -118.394440f, -0.247366f, 0.000001f, -0.968922f, 0.000000f, 255.000000f }, -{ 224.397736f, 21.091320f, -115.040665f, -0.746247f, 0.000001f, -0.665669f, 0.000000f, 255.000000f }, -{ 223.067856f, 21.091320f, -112.118790f, -0.936926f, 0.000000f, -0.349528f, 0.000000f, 255.000000f }, -{ 222.243805f, 21.091312f, -108.374054f, -0.986407f, 0.000000f, -0.164320f, 0.000000f, 255.000000f }, -{ 221.961212f, 21.091311f, -103.811798f, -0.999732f, 0.000000f, -0.023155f, 0.000000f, 255.000000f }, -{ 222.198090f, 21.091307f, -99.454666f, -0.995145f, 0.000000f, 0.098417f, 0.000000f, 255.000000f }, -{ 222.894501f, 21.091311f, -95.777908f, -0.969592f, -0.000001f, 0.244728f, 0.000000f, 255.000000f }, -{ 224.029053f, 21.091311f, -92.831406f, -0.899585f, -0.000001f, 0.436746f, 0.000000f, 255.000000f }, -{ 225.580368f, 21.091311f, -90.665024f, -0.716920f, -0.000001f, 0.697156f, 0.000000f, 255.000000f }, -{ 228.791931f, 21.091311f, -88.927628f, -0.281538f, -0.000002f, 0.959550f, 0.000000f, 255.000000f }, -{ 232.490982f, 21.091311f, -89.470505f, 0.315299f, -0.000002f, 0.948992f, 0.000000f, 255.000000f }, -{ 234.407425f, 21.091311f, -91.009354f, 0.701501f, -0.000002f, 0.712669f, 0.000000f, 255.000000f }, -{ 235.810913f, 21.091311f, -93.103912f, 0.890786f, -0.000001f, 0.454423f, 0.000000f, 255.000000f }, -{ 237.245300f, 21.091307f, -99.154861f, 0.985820f, 0.000000f, 0.167804f, 0.000000f, 255.000000f }, -{ 237.478027f, 21.091309f, -104.965942f, 0.908369f, 0.000001f, -0.418169f, 0.000000f, 255.000000f }, -{ 226.962494f, 21.091312f, -104.965942f, 0.465868f, 0.000001f, -0.884854f, 0.000000f, 255.000000f }, -{ 227.534821f, 21.091320f, -110.009979f, 0.971167f, 0.000000f, 0.238399f, 0.000000f, 255.000000f }, -{ 229.232788f, 21.091320f, -113.130447f, 0.745484f, -0.000001f, 0.666524f, 0.000000f, 255.000000f }, -{ 232.027893f, 21.091320f, -114.199097f, 0.156935f, -0.000001f, 0.987609f, 0.000000f, 255.000000f }, -{ 234.632736f, 21.091320f, -113.485764f, -0.413582f, -0.000002f, 0.910467f, 0.000000f, 255.000000f }, -{ 226.898376f, 21.091307f, -101.247040f, 0.916229f, -0.000001f, 0.400654f, 0.000000f, 255.000000f }, -{ 232.476730f, 21.091307f, -101.247040f, -0.458820f, -0.000001f, 0.888529f, 0.000000f, 255.000000f }, -{ 232.170380f, 21.091311f, -96.746841f, -0.987291f, 0.000000f, -0.158926f, 0.000000f, 255.000000f }, -{ 231.222839f, 21.091311f, -94.098953f, -0.833881f, 0.000001f, -0.551945f, 0.000000f, 255.000000f }, -{ 229.591370f, 21.091311f, -93.232162f, -0.164166f, 0.000002f, -0.986433f, 0.000000f, 255.000000f }, -{ 228.066772f, 21.091311f, -94.113205f, 0.689776f, 0.000001f, -0.724023f, 0.000000f, 255.000000f }, -{ 227.183350f, 21.091311f, -96.775330f, 0.972507f, 0.000000f, -0.232875f, 0.000000f, 255.000000f }, -{ -227.530014f, -20.966743f, 18.889576f, -1.000000f, 0.000000f, 0.000000f, 11.312357f, 104.759467f }, -{ -227.530014f, -20.966749f, 49.094059f, -1.000000f, 0.000000f, 0.000000f, 24.483732f, 68.571409f }, -{ -259.747955f, -20.966747f, 81.060303f, -1.000000f, 0.000000f, 0.000000f, -0.177157f, 16.222941f }, -{ -259.747955f, -20.966751f, 111.264603f, -1.000000f, 0.000000f, 0.000000f, 12.994208f, -19.965071f }, -{ -264.026886f, -20.966732f, -47.559727f, -1.000000f, 0.000000f, 0.000000f, -61.391828f, 168.457698f }, -{ -264.026886f, -20.966738f, -14.334979f, -1.000000f, 0.000000f, 0.000000f, -46.903330f, 128.650867f }, -{ -148.686584f, -20.966757f, 116.550354f, -1.000000f, 0.000000f, 0.000000f, 148.362720f, 22.133174f }, -{ -148.686584f, -20.966743f, -55.110798f, -1.000000f, 0.000000f, 0.000000f, 73.505490f, 227.801797f }, -{ 53.459190f, 2.970489f, -63.834198f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 2.970482f, 19.696451f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 2.970485f, 19.696451f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 2.970482f, 37.767296f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 2.970478f, 37.767296f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 2.970482f, 19.696451f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970482f, 19.696451f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970489f, -63.834198f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ -227.530014f, 20.966755f, 18.889763f, -1.000000f, 0.000000f, 0.000000f, 11.312366f, 104.759421f }, -{ -227.530014f, 20.966747f, 49.094074f, -1.000000f, 0.000000f, 0.000000f, 24.483732f, 68.571394f }, -{ -259.747955f, 20.966745f, 81.060341f, -1.000000f, 0.000000f, 0.000000f, -0.177137f, 16.222895f }, -{ -259.747955f, 20.966743f, 111.264641f, -1.000000f, 0.000000f, 0.000000f, 12.994218f, -19.965132f }, -{ -264.026886f, 20.966764f, -47.559723f, -1.000000f, 0.000000f, 0.000000f, -61.391828f, 168.457698f }, -{ -264.026886f, 20.966753f, -14.334975f, -1.000000f, 0.000000f, 0.000000f, -46.903330f, 128.650867f }, -{ -148.686584f, 20.966726f, 116.550392f, -1.000000f, 0.000000f, 0.000000f, 148.362750f, 22.133128f }, -{ -148.686584f, 20.966757f, -55.110794f, -1.000000f, 0.000000f, 0.000000f, 73.505490f, 227.801797f }, -{ 53.459190f, 21.106728f, -63.834198f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 21.106720f, 19.696632f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 21.106720f, 19.696632f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 21.106718f, 37.767292f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 21.106718f, 37.767292f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 21.106720f, 19.696632f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106720f, 19.696632f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106728f, -63.834198f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ -227.530014f, -20.966743f, 18.889576f, 0.000000f, -1.000000f, 0.000000f, 11.312357f, 104.759467f }, -{ -227.530014f, -20.966749f, 49.094059f, 0.000000f, -1.000000f, 0.000000f, 24.483732f, 68.571409f }, -{ -220.271423f, -20.966749f, 49.922577f, 0.000000f, -1.000000f, 0.000000f, 33.541598f, 70.744057f }, -{ -214.348251f, -20.966755f, 52.198391f, 0.000000f, -1.000000f, 0.000000f, 41.630631f, 70.600333f }, -{ -209.753510f, -20.966747f, 55.606861f, 0.000001f, -1.000000f, 0.000000f, 48.621978f, 68.520264f }, -{ -206.480209f, -20.966747f, 59.833366f, 0.000000f, -1.000000f, 0.000000f, 54.386820f, 64.883859f }, -{ -204.521362f, -20.966749f, 64.563301f, 0.000000f, -1.000000f, 0.000000f, 58.796339f, 60.071098f }, -{ -203.869965f, -20.966747f, 69.481987f, 0.000000f, -1.000000f, 0.000000f, 61.721703f, 54.462037f }, -{ -204.699646f, -20.966759f, 74.975159f, 0.000000f, -1.000000f, 0.000000f, 63.123094f, 47.518821f }, -{ -207.067520f, -20.966751f, 79.783142f, 0.000000f, -1.000000f, 0.000000f, 62.382769f, 40.725774f }, -{ -210.791794f, -20.966751f, 83.766113f, 0.000000f, -1.000000f, 0.000000f, 59.657563f, 34.329668f }, -{ -215.690674f, -20.966751f, 86.784210f, 0.000000f, -1.000000f, 0.000000f, 55.104290f, 28.577385f }, -{ -221.582382f, -20.966751f, 88.697617f, 0.000000f, -1.000000f, 0.000000f, 48.879779f, 23.715683f }, -{ -228.285126f, -20.966751f, 89.366486f, 0.000000f, -1.000000f, 0.000000f, 41.140841f, 19.991411f }, -{ -233.272552f, -20.966751f, 89.153244f, 0.000000f, -1.000000f, 0.000000f, 35.072373f, 18.071997f }, -{ -238.232040f, -20.966751f, 88.499512f, 0.000000f, -1.000000f, 0.000000f, 28.845299f, 16.692535f }, -{ -243.261429f, -20.966751f, 87.384338f, 0.000000f, -1.000000f, 0.000000f, 22.333248f, 15.835422f }, -{ -248.458618f, -20.966747f, 85.786713f, 0.000000f, -1.000000f, 0.000000f, 15.409765f, 15.483181f }, -{ -253.921509f, -20.966747f, 83.685699f, 0.000000f, -1.000000f, 0.000000f, 7.948429f, 15.618211f }, -{ -259.747955f, -20.966747f, 81.060303f, 0.000000f, -1.000000f, 0.000000f, -0.177157f, 16.222941f }, -{ -259.747955f, -20.966751f, 111.264603f, 0.000000f, -1.000000f, 0.000000f, 12.994208f, -19.965071f }, -{ -253.885376f, -20.966755f, 113.571884f, 0.000000f, -1.000000f, 0.000000f, 21.024357f, -20.172935f }, -{ -247.666229f, -20.966757f, 115.459656f, 0.000000f, -1.000000f, 0.000000f, 29.298774f, -19.722674f }, -{ -241.153412f, -20.966763f, 116.927917f, 0.000000f, -1.000000f, 0.000000f, 37.742109f, -18.641708f }, -{ -234.409882f, -20.966763f, 117.976685f, 0.000000f, -1.000000f, 0.000000f, 46.278933f, -16.957548f }, -{ -227.498550f, -20.966763f, 118.605942f, 0.000000f, -1.000000f, 0.000000f, 54.833858f, -14.697611f }, -{ -220.482346f, -20.966763f, 118.815689f, 0.000000f, -1.000000f, 0.000000f, 63.331494f, -11.889319f }, -{ -205.143631f, -20.966763f, 117.432495f, 0.000000f, -1.000000f, 0.000000f, 81.105759f, -3.543264f }, -{ -191.825546f, -20.966755f, 113.455368f, 0.000000f, -1.000000f, 0.000000f, 95.327940f, 7.029456f }, -{ -180.870651f, -20.966755f, 107.142990f, 0.000000f, -1.000000f, 0.000000f, 105.700410f, 19.369521f }, -{ -172.621567f, -20.966755f, 98.754059f, 0.000000f, -1.000000f, 0.000000f, 111.925502f, 33.017599f }, -{ -167.420868f, -20.966753f, 88.547287f, 0.000000f, -1.000000f, 0.000000f, 113.705577f, 47.514307f }, -{ -165.611176f, -20.966751f, 76.781357f, 0.000000f, -1.000000f, 0.000000f, 110.742945f, 62.400328f }, -{ -166.340637f, -20.966751f, 68.696579f, 0.000000f, -1.000000f, -0.000001f, 106.343396f, 71.768664f }, -{ -168.510422f, -20.966749f, 61.101204f, 0.000000f, -1.000000f, 0.000000f, 100.431605f, 79.922555f }, -{ -172.092514f, -20.966755f, 54.065182f, 0.000000f, -1.000000f, 0.000000f, 93.071636f, 86.790413f }, -{ -177.058975f, -20.966747f, 47.658421f, 0.000000f, -1.000000f, -0.000001f, 84.327446f, 92.300650f }, -{ -183.381851f, -20.966743f, 41.950832f, 0.000000f, -1.000000f, 0.000000f, 74.263017f, 96.381707f }, -{ -191.033142f, -20.966743f, 37.012333f, 0.000000f, -1.000000f, 0.000000f, 62.942380f, 98.962027f }, -{ -181.454453f, -20.966751f, 32.298737f, 0.000000f, -1.000000f, 0.000000f, 72.363203f, 108.786445f }, -{ -173.805496f, -20.966743f, 26.319462f, 0.000000f, -1.000000f, 0.000000f, 78.920131f, 119.285616f }, -{ -168.002350f, -20.966745f, 19.235668f, 0.000000f, -1.000000f, 0.000000f, 82.783855f, 130.303376f }, -{ -163.961121f, -20.966740f, 11.208173f, 0.000000f, -1.000000f, 0.000000f, 84.125031f, 141.683643f }, -{ -161.597916f, -20.966740f, 2.397420f, 0.000000f, -1.000000f, 0.000000f, 83.114247f, 153.270415f }, -{ -160.828827f, -20.966740f, -7.035602f, 0.000000f, -1.000000f, 0.000000f, 79.922191f, 164.907572f }, -{ -162.772522f, -20.966736f, -21.426922f, 0.000000f, -1.000000f, 0.000000f, 71.317727f, 181.302331f }, -{ -168.407867f, -20.966743f, -33.734730f, 0.000000f, -1.000000f, 0.000000f, 59.198844f, 193.590982f }, -{ -177.441193f, -20.966736f, -43.721256f, 0.000000f, -1.000000f, 0.000000f, 44.021060f, 201.616710f }, -{ -189.578857f, -20.966732f, -51.148808f, 0.000000f, -1.000000f, 0.000000f, 26.239853f, 205.222777f }, -{ -204.527191f, -20.966740f, -55.779682f, 0.000000f, -1.000000f, 0.000000f, 6.310721f, 204.252461f }, -{ -221.992554f, -20.966740f, -57.376118f, 0.000000f, -1.000000f, 0.000000f, -15.310837f, 198.548949f }, -{ -229.371170f, -20.966740f, -57.068485f, 0.000000f, -1.000000f, 0.000000f, -24.017065f, 194.962735f }, -{ -236.805725f, -20.966740f, -56.173542f, 0.000000f, -1.000000f, 0.000000f, -32.534211f, 190.648469f }, -{ -244.142380f, -20.966740f, -54.733250f, 0.000000f, -1.000000f, 0.000000f, -40.696227f, 185.723508f }, -{ -251.227341f, -20.966732f, -52.789539f, 0.000000f, -1.000000f, 0.000000f, -48.337180f, 180.305151f }, -{ -257.906799f, -20.966732f, -50.384388f, 0.000000f, -1.000000f, 0.000000f, -55.291061f, 174.510773f }, -{ -264.026886f, -20.966732f, -47.559727f, 0.000000f, -1.000000f, 0.000000f, -61.391828f, 168.457698f }, -{ -264.026886f, -20.966738f, -14.334979f, 0.000000f, -1.000000f, 0.000000f, -46.903330f, 128.650867f }, -{ -257.339294f, -20.966736f, -18.662861f, 0.000000f, -1.000000f, 0.000000f, -40.778150f, 136.752428f }, -{ -251.050217f, -20.966736f, -22.109791f, 0.000000f, -1.000000f, 0.000000f, -34.746278f, 143.624739f }, -{ -245.054810f, -20.966736f, -24.717709f, 0.000000f, -1.000000f, 0.000000f, -28.700379f, 149.363753f }, -{ -239.248169f, -20.966736f, -26.528568f, 0.000000f, -1.000000f, 0.000000f, -22.533070f, 154.065492f }, -{ -233.525421f, -20.966736f, -27.584324f, 0.000000f, -1.000000f, 0.000000f, -16.136991f, 157.825952f }, -{ -227.781708f, -20.966736f, -27.926914f, 0.000000f, -1.000000f, 0.000000f, -9.404798f, 160.741110f }, -{ -220.280746f, -20.966736f, -27.192783f, 0.000000f, -1.000000f, 0.000000f, -0.097693f, 163.132527f }, -{ -213.751633f, -20.966736f, -25.074284f, 0.000000f, -1.000000f, 0.000000f, 8.648720f, 163.441519f }, -{ -208.369156f, -20.966736f, -21.697269f, 0.000000f, -1.000000f, 0.000000f, 16.570136f, 161.742661f }, -{ -204.308121f, -20.966736f, -17.187603f, 0.000000f, -1.000000f, -0.000001f, 23.402251f, 158.110511f }, -{ -201.743317f, -20.966747f, -11.671123f, 0.000000f, -1.000000f, 0.000000f, 28.880766f, 152.619616f }, -{ -200.849533f, -20.966740f, -5.273685f, 0.000000f, -1.000000f, 0.000000f, 32.741388f, 145.344557f }, -{ -201.724655f, -20.966740f, 1.288052f, 0.000000f, -1.000000f, 0.000000f, 34.554308f, 137.101264f }, -{ -204.242859f, -20.966745f, 7.031773f, 0.000000f, -1.000000f, 0.000000f, 34.041921f, 129.121540f }, -{ -208.243301f, -20.966740f, 11.810628f, 0.000000f, -1.000000f, 0.000000f, 31.332898f, 121.651460f }, -{ -213.565170f, -20.966740f, 15.477796f, 0.000001f, -1.000000f, 0.000000f, 26.555888f, 114.937053f }, -{ -220.047684f, -20.966743f, 17.886265f, 0.000000f, -1.000000f, 0.000000f, 19.839473f, 109.224409f }, -{ -148.686584f, -20.966757f, 116.550354f, 0.000000f, -1.000000f, 0.000000f, 148.362720f, 22.133174f }, -{ -72.924095f, -20.966761f, 116.550354f, 0.000000f, -1.000000f, 0.000000f, 239.134392f, 55.171337f }, -{ -44.133286f, -20.966759f, 113.442535f, 0.000000f, -1.000000f, 0.000000f, 272.273660f, 71.449816f }, -{ -20.467419f, -20.966759f, 104.692368f, 0.000000f, -1.000000f, 0.000000f, 296.812166f, 92.253563f }, -{ -1.975434f, -20.966759f, 91.159866f, 0.000000f, -1.000000f, 0.000000f, 313.066387f, 116.530870f }, -{ 11.293716f, -20.966763f, 73.704994f, 0.000000f, -1.000000f, 0.000000f, 321.352617f, 143.230046f }, -{ 19.291100f, -20.966763f, 53.187717f, 0.000000f, -1.000000f, 0.000000f, 321.987274f, 171.299429f }, -{ 21.967770f, -20.966759f, 30.467985f, 0.000000f, -1.000000f, 0.000000f, 315.286714f, 199.687265f }, -{ 19.338877f, -20.966749f, 6.999157f, 0.000000f, -1.000000f, 0.000000f, 301.902798f, 226.659149f }, -{ 11.340330f, -20.966751f, -13.645114f, 0.000000f, -1.000000f, 0.000000f, 283.317205f, 247.905254f }, -{ -2.195676f, -20.966743f, -30.821491f, 0.000000f, -1.000000f, 0.000000f, 259.609426f, 262.581684f }, -{ -21.436935f, -20.966740f, -43.886723f, 0.000000f, -1.000000f, 0.000000f, 230.858877f, 269.844599f }, -{ -46.551262f, -20.966736f, -52.197575f, 0.000000f, -1.000000f, 0.000000f, 197.145034f, 268.850158f }, -{ -77.706444f, -20.966743f, -55.110798f, 0.000000f, -1.000000f, 0.000000f, 158.547374f, 258.754495f }, -{ -148.686584f, -20.966743f, -55.110798f, 0.000000f, -1.000000f, 0.000000f, 73.505490f, 227.801797f }, -{ -105.897141f, -20.966753f, 85.087540f, 0.000000f, -1.000000f, 0.000000f, 185.908946f, 78.488452f }, -{ -105.897141f, -20.966742f, -23.647968f, 0.000000f, -1.000000f, 0.000000f, 138.492050f, 208.765350f }, -{ -77.958153f, -20.966742f, -23.647968f, 0.000000f, -1.000000f, 0.000000f, 171.965974f, 220.948864f }, -{ -58.874207f, -20.966740f, -21.368664f, 0.000000f, -1.000000f, 0.000000f, 195.824559f, 226.540055f }, -{ -44.341877f, -20.966745f, -15.146022f, 0.000000f, -1.000000f, 0.000000f, 215.949404f, 225.421851f }, -{ -33.878738f, -20.966743f, -5.902942f, 0.000000f, -1.000000f, 0.000000f, 232.516059f, 218.910357f }, -{ -27.002363f, -20.966749f, 5.437657f, 0.000000f, -1.000000f, 0.000000f, 245.700060f, 208.321713f }, -{ -23.230320f, -20.966747f, 17.952679f, 0.000000f, -1.000000f, 0.000000f, 255.676941f, 194.972086f }, -{ -22.080179f, -20.966755f, 30.719687f, 0.000000f, -1.000000f, 0.000000f, 262.622269f, 180.177463f }, -{ -23.442402f, -20.966751f, 44.972424f, 0.000000f, -1.000000f, 0.000000f, 267.205431f, 162.507202f }, -{ -27.692215f, -20.966751f, 57.903645f, 0.000000f, -1.000000f, 0.000000f, 267.752663f, 145.160958f }, -{ -35.074326f, -20.966751f, 68.947113f, 0.000000f, -1.000000f, 0.000000f, 263.723906f, 128.710531f }, -{ -45.833443f, -20.966755f, 77.536469f, 0.000000f, -1.000000f, 0.000000f, 254.578922f, 113.727776f }, -{ -60.214287f, -20.966755f, 83.105392f, 0.000000f, -1.000000f, 0.000000f, 239.777576f, 100.784454f }, -{ -78.461555f, -20.966755f, 85.087540f, 0.000000f, -1.000000f, 0.000000f, 218.779751f, 90.452444f }, -{ 53.459190f, 2.970489f, -63.834198f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 2.970482f, 19.696451f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 2.970485f, 19.696451f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 2.970482f, 37.767296f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 2.970482f, 37.767296f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 2.970471f, 52.887688f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 54.761124f, 2.970478f, 61.040325f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 58.744659f, 2.970474f, 68.629539f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 65.526382f, 2.970473f, 75.245560f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 75.222885f, 2.970474f, 80.478622f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 87.950760f, 2.970474f, 83.918953f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 103.826599f, 2.970474f, 85.156792f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 107.486267f, 2.970474f, 85.094475f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.371353f, 2.970474f, 84.904106f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 115.334160f, 2.970474f, 84.580559f, 0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 119.227013f, 2.970474f, 84.118721f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 122.902229f, 2.970474f, 83.513466f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 126.212128f, 2.970474f, 82.759666f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 114.179916f, 2.970478f, 65.426537f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 112.235428f, 2.970474f, 65.933624f, 0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 110.283180f, 2.970474f, 66.348511f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 108.268738f, 2.970474f, 66.671196f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 106.137703f, 2.970474f, 66.901688f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 103.835670f, 2.970474f, 67.039986f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 101.308228f, 2.970474f, 67.086082f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 95.838806f, 2.970474f, 66.577293f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 91.224388f, 2.970478f, 65.167015f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 87.527145f, 2.970478f, 63.029404f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 84.809280f, 2.970478f, 60.338612f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 83.132957f, 2.970478f, 57.268784f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970479f, 53.994072f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970478f, 37.767296f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 2.970478f, 37.767296f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 2.970482f, 19.696451f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970482f, 19.696451f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970489f, -63.834198f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 109.261765f, 2.970490f, -33.040283f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 158.509918f, 2.970482f, 10.661288f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 110.660858f, 2.970478f, 56.206810f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.037323f, 2.970478f, 56.206810f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 175.299042f, 2.970477f, 25.597071f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 203.001129f, 2.970478f, 56.206810f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 237.139038f, 2.970478f, 56.206810f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 189.569809f, 2.970482f, 11.767657f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 239.097778f, 2.970486f, -33.040283f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 202.161682f, 2.970486f, -33.040283f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.620132f, 2.970482f, -3.168332f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 143.679504f, 2.970490f, -33.040283f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 246.695496f, 2.970477f, 44.635109f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 246.695496f, 2.970479f, 54.095207f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 243.335144f, 2.970479f, 54.095207f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 243.335144f, 2.970478f, 56.104118f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 252.174316f, 2.970478f, 56.104118f, -0.000001f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 252.174316f, 2.970475f, 54.095207f, -0.000001f, -1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 248.813965f, 2.970479f, 54.095207f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 248.813965f, 2.970477f, 44.635109f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 253.836212f, 2.970477f, 44.635109f, -0.000002f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 253.836212f, 2.970478f, 56.341530f, -0.000001f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 258.931549f, 2.970471f, 51.191429f, -0.000001f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 264.026886f, 2.970478f, 56.341530f, 0.000002f, -1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 264.026886f, 2.970477f, 44.635109f, 0.000003f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 261.908356f, 2.970477f, 44.635109f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 261.908356f, 2.970467f, 51.721062f, 0.000000f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 258.931549f, 2.970471f, 48.634651f, -0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 255.954681f, 2.970471f, 51.721062f, -0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 255.954681f, 2.970477f, 44.635109f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 53.398365f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.398365f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 58.399651f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 58.399651f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 64.683319f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 64.683319f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 69.684608f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 69.684608f, 9.484118f, -92.719223f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 71.361206f, 9.484118f, -90.693527f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 75.070610f, 9.484118f, -89.192673f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 78.221947f, 9.484118f, -90.116470f, -0.000001f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 80.447113f, 9.484106f, -92.906830f, -0.000001f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 81.069901f, 9.484118f, -95.010895f, 0.000000f, -1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 81.290161f, 9.484118f, -97.592270f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 81.290161f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 76.288872f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 76.288872f, 9.484118f, -97.720505f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 76.046646f, 9.484118f, -95.573715f, 0.000000f, -1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 74.507790f, 9.484118f, -93.751663f, -0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 72.154381f, 9.484118f, -93.999222f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 70.869621f, 9.484118f, -95.136749f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 69.684608f, 9.484118f, -97.015213f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 69.684608f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 116.042702f, 9.484123f, -111.377884f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 116.042702f, 9.484123f, -116.315048f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 112.247803f, 9.484123f, -118.552078f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 107.574234f, 9.484123f, -118.394455f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 103.539482f, 9.484123f, -115.040680f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 102.209610f, 9.484123f, -112.118805f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 101.385559f, 9.484118f, -108.374069f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 101.102959f, 9.484118f, -103.811813f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 101.339844f, 9.484118f, -99.454697f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 102.036247f, 9.484118f, -95.777939f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 103.170799f, 9.484106f, -92.831436f, 0.000002f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 104.722122f, 9.484118f, -90.665039f, -0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 107.933678f, 9.484118f, -88.927658f, 0.000000f, -1.000000f, 0.000003f, 0.000000f, 255.000000f }, -{ 111.632736f, 9.484118f, -89.470520f, 0.000001f, -1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 113.549179f, 9.484118f, -91.009384f, 0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 114.952675f, 9.484106f, -93.103928f, -0.000002f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 116.387047f, 9.484118f, -99.154877f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 116.619774f, 9.484118f, -104.965958f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 106.104248f, 9.484118f, -104.965958f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 106.676575f, 9.484123f, -110.009995f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 108.374535f, 9.484123f, -113.130463f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.169655f, 9.484123f, -114.199112f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 113.774490f, 9.484123f, -113.485794f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 106.040123f, 9.484118f, -101.247055f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.618484f, 9.484118f, -101.247055f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.312141f, 9.484118f, -96.746857f, -0.000001f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 110.364601f, 9.484118f, -94.098984f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 108.733131f, 9.484106f, -93.232178f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 107.208519f, 9.484118f, -94.113220f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 106.325096f, 9.484118f, -96.775345f, 0.000001f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 122.262253f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 122.262253f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 127.263535f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 127.391785f, 9.484118f, -97.335800f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 128.306671f, 9.484118f, -94.372665f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 129.111130f, 9.484118f, -92.203903f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 129.876404f, 9.484118f, -90.715500f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 131.574371f, 9.484118f, -89.323883f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 133.556717f, 9.484118f, -89.280533f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 135.214310f, 9.484118f, -90.026230f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 134.829590f, 9.484118f, -95.155746f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 132.649551f, 9.484118f, -94.450439f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 130.914764f, 9.484118f, -95.135269f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 129.543335f, 9.484118f, -96.915451f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 128.513855f, 9.484118f, -99.379593f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 127.804985f, 9.484118f, -102.116226f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 127.395340f, 9.484118f, -104.713943f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 127.263535f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 155.668289f, 9.484123f, -112.788498f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 155.668289f, 9.484123f, -116.571518f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 154.127060f, 9.484123f, -117.804031f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 152.305023f, 9.484123f, -118.637589f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 150.903000f, 9.484123f, -118.586227f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 149.472794f, 9.484123f, -117.781754f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 148.448669f, 9.484123f, -116.186508f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 148.102249f, 9.484123f, -115.096786f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 146.276031f, 9.484123f, -117.172348f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 142.652115f, 9.484123f, -118.815689f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 139.866501f, 9.484123f, -117.808792f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 137.850311f, 9.484123f, -115.206024f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 137.073761f, 9.484123f, -111.634354f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 138.144791f, 9.484118f, -107.571106f, 0.000001f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 141.623840f, 9.484118f, -104.049301f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 144.391052f, 9.484118f, -102.166397f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.909882f, 9.484118f, -100.028793f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.909882f, 9.484118f, -97.335800f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.180527f, 9.484118f, -94.538605f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 145.869064f, 9.484118f, -93.718704f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 143.898575f, 9.484118f, -93.732071f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 141.682312f, 9.484118f, -94.706924f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 137.779068f, 9.484118f, -98.297592f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 137.779068f, 9.484118f, -92.526871f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 141.658264f, 9.484118f, -89.665543f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 144.054428f, 9.484118f, -88.951340f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.152328f, 9.484118f, -89.072159f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 150.474655f, 9.484118f, -90.715500f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 152.600082f, 9.484118f, -94.111435f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 152.911179f, 9.484118f, -96.502243f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 152.932556f, 9.484123f, -113.100784f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 153.103531f, 9.484123f, -113.846451f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 153.680603f, 9.484123f, -114.199112f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 154.124680f, 9.484123f, -114.032883f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 154.796753f, 9.484123f, -113.553177f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.909882f, 9.484123f, -110.800797f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.909882f, 9.484118f, -103.491226f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 146.048050f, 9.484118f, -104.727600f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 144.556686f, 9.484118f, -105.944382f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 143.421539f, 9.484118f, -107.154037f, -0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 142.162918f, 9.484122f, -109.601837f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 142.329147f, 9.484123f, -112.551010f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 143.188812f, 9.484123f, -113.667160f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 144.447449f, 9.484123f, -114.070877f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 145.715591f, 9.484123f, -113.693283f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 146.898224f, 9.484123f, -112.589005f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.430771f, 9.484123f, -111.777725f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.749878f, 9.484123f, -112.467911f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.749878f, 9.484123f, -117.276840f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 172.085159f, 9.484123f, -118.160263f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 168.812698f, 9.484123f, -118.815689f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 166.009262f, 9.484123f, -118.315506f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 163.547806f, 9.484123f, -116.887375f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 161.503128f, 9.484123f, -114.639938f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 159.950012f, 9.484123f, -111.681854f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 158.963303f, 9.484118f, -108.121765f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 158.617767f, 9.484118f, -104.068314f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 159.531387f, 9.484118f, -96.903595f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 163.822617f, 9.484118f, -90.542221f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 169.115997f, 9.484118f, -88.872086f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.301041f, 9.484118f, -89.897995f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.301041f, 9.484118f, -95.027512f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 169.582138f, 9.484118f, -93.616898f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 166.473557f, 9.484118f, -94.882645f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 164.462112f, 9.484118f, -98.442444f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 163.747299f, 9.484118f, -103.940063f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 164.523849f, 9.484122f, -109.302322f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 166.711029f, 9.484123f, -112.812241f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 171.313354f, 9.484123f, -113.911758f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 188.369019f, 9.484123f, -113.301437f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 188.369019f, 9.484123f, -117.725662f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 186.637802f, 9.484123f, -118.378738f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 184.602036f, 9.484123f, -118.792831f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 182.419891f, 9.484123f, -118.666077f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 181.128311f, 9.484123f, -118.195877f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 180.089645f, 9.484123f, -117.373001f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 179.323486f, 9.484123f, -116.165436f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 178.849426f, 9.484123f, -114.541092f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 178.687042f, 9.484123f, -112.467911f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 178.687042f, 9.484118f, -94.001602f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 175.416977f, 9.484118f, -94.001602f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 178.200211f, 9.484118f, -89.945480f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 180.755478f, 9.484117f, -86.238449f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.239502f, 9.484117f, -82.331924f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.688324f, 9.484117f, -82.331924f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.688324f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 188.369019f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 188.369019f, 9.484118f, -94.001602f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.688324f, 9.484118f, -94.001602f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.724243f, 9.484123f, -111.466034f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.847443f, 9.484123f, -112.446518f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 184.448257f, 9.484123f, -113.686172f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 184.972198f, 9.484123f, -113.977371f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 186.488205f, 9.484123f, -113.985397f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 192.280289f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 192.280289f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 197.281570f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 197.281570f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 209.400085f, 9.484123f, -118.687454f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 200.872238f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 205.873535f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 210.041275f, 9.484118f, -105.863632f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 210.169510f, 9.484118f, -105.863632f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 214.337250f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 219.338531f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 210.810699f, 9.484123f, -118.687454f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ -227.530014f, 20.966755f, 18.889763f, 0.000000f, 1.000000f, 0.000000f, 11.312366f, 104.759421f }, -{ -227.530014f, 20.966747f, 49.094074f, 0.000000f, 1.000000f, 0.000000f, 24.483732f, 68.571394f }, -{ -220.271423f, 20.966747f, 49.922592f, 0.000000f, 1.000000f, 0.000000f, 33.541610f, 70.744042f }, -{ -214.348251f, 20.966747f, 52.198406f, 0.000000f, 1.000000f, 0.000000f, 41.630631f, 70.600318f }, -{ -209.753510f, 20.966751f, 55.606876f, 0.000000f, 1.000000f, 0.000000f, 48.621982f, 68.520264f }, -{ -206.480209f, 20.966751f, 59.833382f, 0.000000f, 1.000000f, 0.000000f, 54.386827f, 64.883844f }, -{ -204.521362f, 20.966751f, 64.563332f, 0.000000f, 1.000000f, 0.000000f, 58.796350f, 60.071068f }, -{ -203.869965f, 20.966747f, 69.482018f, 0.000000f, 1.000000f, 0.000000f, 61.721714f, 54.462006f }, -{ -204.699646f, 20.966745f, 74.975189f, 0.000000f, 1.000000f, 0.000000f, 63.123110f, 47.518791f }, -{ -207.067520f, 20.966745f, 79.783180f, 0.000000f, 1.000000f, 0.000000f, 62.382784f, 40.725728f }, -{ -210.791794f, 20.966745f, 83.766144f, 0.000000f, 1.000000f, 0.000000f, 59.657578f, 34.329638f }, -{ -215.690674f, 20.966745f, 86.784241f, 0.000000f, 1.000000f, 0.000000f, 55.104305f, 28.577339f }, -{ -221.582382f, 20.966745f, 88.697647f, 0.000000f, 1.000000f, 0.000000f, 48.879791f, 23.715652f }, -{ -228.285126f, 20.966745f, 89.366524f, 0.000000f, 1.000000f, 0.000000f, 41.140860f, 19.991366f }, -{ -233.272552f, 20.966745f, 89.153275f, 0.000000f, 1.000000f, 0.000000f, 35.072392f, 18.071967f }, -{ -238.232040f, 20.966745f, 88.499550f, 0.000000f, 1.000000f, 0.000000f, 28.845318f, 16.692474f }, -{ -243.261429f, 20.966745f, 87.384369f, 0.000000f, 1.000000f, 0.000000f, 22.333258f, 15.835392f }, -{ -248.458618f, 20.966745f, 85.786751f, 0.000000f, 1.000000f, 0.000000f, 15.409784f, 15.483151f }, -{ -253.921509f, 20.966745f, 83.685738f, 0.000000f, 1.000000f, 0.000000f, 7.948449f, 15.618150f }, -{ -259.747955f, 20.966745f, 81.060341f, 0.000000f, 1.000000f, 0.000000f, -0.177137f, 16.222895f }, -{ -259.747955f, 20.966743f, 111.264641f, 0.000000f, 1.000000f, 0.000000f, 12.994218f, -19.965132f }, -{ -253.885376f, 20.966743f, 113.571915f, 0.000000f, 1.000000f, 0.000000f, 21.024369f, -20.172966f }, -{ -247.666229f, 20.966742f, 115.459694f, 0.000000f, 1.000000f, 0.000000f, 29.298793f, -19.722705f }, -{ -241.153412f, 20.966742f, 116.927956f, 0.000000f, 1.000000f, 0.000000f, 37.742128f, -18.641769f }, -{ -234.409882f, 20.966742f, 117.976715f, 0.000000f, 1.000000f, 0.000000f, 46.278944f, -16.957608f }, -{ -227.498550f, 20.966742f, 118.605980f, 0.000000f, 1.000000f, 0.000000f, 54.833877f, -14.697672f }, -{ -220.482346f, 20.966742f, 118.815727f, 0.000000f, 1.000000f, 0.000000f, 63.331513f, -11.889380f }, -{ -205.143631f, 20.966742f, 117.432526f, 0.000000f, 1.000000f, 0.000000f, 81.105774f, -3.543295f }, -{ -191.825546f, 20.966743f, 113.455399f, 0.000000f, 1.000000f, 0.000000f, 95.327947f, 7.029410f }, -{ -180.870651f, 20.966740f, 107.143021f, 0.000000f, 1.000000f, 0.000000f, 105.700425f, 19.369491f }, -{ -172.621567f, 20.966740f, 98.754097f, 0.000000f, 1.000000f, 0.000000f, 111.925517f, 33.017553f }, -{ -167.420868f, 20.966738f, 88.547325f, 0.000000f, 1.000000f, 0.000000f, 113.705593f, 47.514262f }, -{ -165.611176f, 20.966738f, 76.781395f, 0.000000f, 1.000000f, 0.000000f, 110.742960f, 62.400282f }, -{ -166.340637f, 20.966747f, 68.696609f, 0.000000f, 1.000000f, 0.000000f, 106.343412f, 71.768634f }, -{ -168.510422f, 20.966751f, 61.101219f, 0.000000f, 1.000000f, 0.000000f, 100.431613f, 79.922540f }, -{ -172.092514f, 20.966747f, 54.065197f, 0.000000f, 1.000000f, 0.000000f, 93.071636f, 86.790398f }, -{ -177.058975f, 20.966749f, 47.658436f, 0.000000f, 1.000000f, 0.000000f, 84.327446f, 92.300634f }, -{ -183.381851f, 20.966749f, 41.950848f, 0.000000f, 1.000000f, 0.000000f, 74.263017f, 96.381691f }, -{ -191.033142f, 20.966749f, 37.012348f, 0.000000f, 1.000000f, 0.000000f, 62.942388f, 98.962011f }, -{ -181.454453f, 20.966749f, 32.298752f, 0.000000f, 1.000000f, 0.000000f, 72.363211f, 108.786445f }, -{ -173.805496f, 20.966751f, 26.319649f, 0.000000f, 1.000000f, 0.000000f, 78.920146f, 119.285570f }, -{ -168.002350f, 20.966755f, 19.235847f, 0.000000f, 1.000000f, 0.000000f, 82.783870f, 130.303345f }, -{ -163.961121f, 20.966755f, 11.208177f, 0.000000f, 1.000000f, 0.000000f, 84.125031f, 141.683643f }, -{ -161.597916f, 20.966753f, 2.397416f, 0.000000f, 1.000000f, 0.000000f, 83.114247f, 153.270422f }, -{ -160.828827f, 20.966753f, -7.035606f, 0.000000f, 1.000000f, 0.000000f, 79.922183f, 164.907587f }, -{ -162.772522f, 20.966755f, -21.426933f, 0.000000f, 1.000000f, 0.000000f, 71.317727f, 181.302347f }, -{ -168.407867f, 20.966755f, -33.734711f, 0.000000f, 1.000000f, 0.000000f, 59.198847f, 193.590963f }, -{ -177.441193f, 20.966757f, -43.721252f, 0.000000f, 1.000000f, 0.000000f, 44.021060f, 201.616710f }, -{ -189.578857f, 20.966757f, -51.148804f, 0.000000f, 1.000000f, 0.000000f, 26.239853f, 205.222777f }, -{ -204.527191f, 20.966757f, -55.779663f, 0.000000f, 1.000000f, 0.000000f, 6.310730f, 204.252446f }, -{ -221.992554f, 20.966764f, -57.376114f, 0.000000f, 1.000000f, 0.000000f, -15.310837f, 198.548949f }, -{ -229.371170f, 20.966764f, -57.068481f, 0.000000f, 1.000000f, 0.000000f, -24.017065f, 194.962735f }, -{ -236.805725f, 20.966764f, -56.173538f, 0.000000f, 1.000000f, 0.000000f, -32.534211f, 190.648469f }, -{ -244.142380f, 20.966764f, -54.733246f, 0.000000f, 1.000000f, 0.000000f, -40.696227f, 185.723508f }, -{ -251.227341f, 20.966764f, -52.789536f, 0.000000f, 1.000000f, 0.000000f, -48.337180f, 180.305151f }, -{ -257.906799f, 20.966764f, -50.384384f, 0.000000f, 1.000000f, 0.000000f, -55.291061f, 174.510773f }, -{ -264.026886f, 20.966764f, -47.559723f, 0.000000f, 1.000000f, 0.000000f, -61.391828f, 168.457698f }, -{ -264.026886f, 20.966753f, -14.334975f, 0.000000f, 1.000000f, 0.000000f, -46.903330f, 128.650867f }, -{ -257.339294f, 20.966755f, -18.662872f, 0.000000f, 1.000000f, 0.000000f, -40.778150f, 136.752450f }, -{ -251.050217f, 20.966759f, -22.109795f, 0.000000f, 1.000000f, 0.000000f, -34.746278f, 143.624746f }, -{ -245.054810f, 20.966759f, -24.717712f, 0.000000f, 1.000000f, 0.000000f, -28.700388f, 149.363761f }, -{ -239.248169f, 20.966759f, -26.528572f, 0.000000f, 1.000000f, 0.000000f, -22.533070f, 154.065507f }, -{ -233.525421f, 20.966759f, -27.584328f, 0.000000f, 1.000000f, 0.000000f, -16.136991f, 157.825968f }, -{ -227.781708f, 20.966759f, -27.926926f, 0.000000f, 1.000000f, 0.000000f, -9.404798f, 160.741125f }, -{ -220.280746f, 20.966759f, -27.192787f, 0.000000f, 1.000000f, 0.000000f, -0.097693f, 163.132535f }, -{ -213.751633f, 20.966759f, -25.074295f, 0.000000f, 1.000000f, 0.000000f, 8.648710f, 163.441542f }, -{ -208.369156f, 20.966755f, -21.697281f, 0.000000f, 1.000000f, 0.000000f, 16.570136f, 161.742676f }, -{ -204.308121f, 20.966755f, -17.187607f, 0.000000f, 1.000000f, 0.000000f, 23.402251f, 158.110519f }, -{ -201.743317f, 20.966753f, -11.671119f, 0.000000f, 1.000000f, 0.000000f, 28.880766f, 152.619616f }, -{ -200.849533f, 20.966753f, -5.273689f, 0.000000f, 1.000000f, 0.000000f, 32.741376f, 145.344564f }, -{ -201.724655f, 20.966753f, 1.288060f, 0.000000f, 1.000000f, 0.000000f, 34.554308f, 137.101256f }, -{ -204.242859f, 20.966751f, 7.031769f, 0.000000f, 1.000000f, 0.000000f, 34.041921f, 129.121548f }, -{ -208.243301f, 20.966755f, 11.810632f, 0.000000f, 1.000000f, 0.000000f, 31.332898f, 121.651460f }, -{ -213.565170f, 20.966755f, 15.477799f, 0.000000f, 1.000000f, 0.000000f, 26.555888f, 114.937053f }, -{ -220.047684f, 20.966755f, 17.886444f, 0.000000f, 1.000000f, 0.000000f, 19.839494f, 109.224379f }, -{ -148.686584f, 20.966726f, 116.550392f, 0.000000f, 1.000000f, 0.000000f, 148.362750f, 22.133128f }, -{ -72.924095f, 20.966726f, 116.550392f, 0.000000f, 1.000000f, 0.000000f, 239.134392f, 55.171292f }, -{ -44.133286f, 20.966728f, 113.442566f, 0.000000f, 1.000000f, 0.000000f, 272.273660f, 71.449770f }, -{ -20.467419f, 20.966740f, 104.692406f, 0.000000f, 1.000000f, 0.000000f, 296.812196f, 92.253517f }, -{ -1.975434f, 20.966738f, 91.159897f, 0.000000f, 1.000000f, 0.000000f, 313.066387f, 116.530840f }, -{ 11.293716f, 20.966730f, 73.705025f, 0.000000f, 1.000000f, 0.000000f, 321.352617f, 143.230008f }, -{ 19.291100f, 20.966740f, 53.187733f, 0.000000f, 1.000000f, 0.000000f, 321.987274f, 171.299414f }, -{ 21.967770f, 20.966734f, 30.467978f, 0.000000f, 1.000000f, 0.000000f, 315.286714f, 199.687280f }, -{ 19.338877f, 20.966743f, 6.999154f, 0.000000f, 1.000000f, 0.000000f, 301.902798f, 226.659158f }, -{ 11.340330f, 20.966745f, -13.645118f, 0.000000f, 1.000000f, 0.000000f, 283.317205f, 247.905264f }, -{ -2.195676f, 20.966759f, -30.821503f, 0.000000f, 1.000000f, 0.000000f, 259.609396f, 262.581703f }, -{ -21.436935f, 20.966757f, -43.886719f, 0.000000f, 1.000000f, 0.000000f, 230.858877f, 269.844599f }, -{ -46.551262f, 20.966757f, -52.197571f, 0.000000f, 1.000000f, 0.000000f, 197.145034f, 268.850158f }, -{ -77.706444f, 20.966757f, -55.110794f, 0.000000f, 1.000000f, 0.000000f, 158.547374f, 258.754495f }, -{ -148.686584f, 20.966757f, -55.110794f, 0.000000f, 1.000000f, 0.000000f, 73.505490f, 227.801797f }, -{ -105.897141f, 20.966738f, 85.087578f, 0.000000f, 1.000000f, 0.000000f, 185.908961f, 78.488406f }, -{ -105.897141f, 20.966759f, -23.647980f, 0.000000f, 1.000000f, 0.000000f, 138.492035f, 208.765369f }, -{ -77.958153f, 20.966759f, -23.647980f, 0.000000f, 1.000000f, 0.000000f, 171.965959f, 220.948887f }, -{ -58.874207f, 20.966755f, -21.368675f, 0.000000f, 1.000000f, 0.000000f, 195.824544f, 226.540074f }, -{ -44.341877f, 20.966753f, -15.146018f, 0.000000f, 1.000000f, 0.000000f, 215.949404f, 225.421851f }, -{ -33.878738f, 20.966745f, -5.902946f, 0.000000f, 1.000000f, 0.000000f, 232.516059f, 218.910365f }, -{ -27.002363f, 20.966743f, 5.437653f, 0.000000f, 1.000000f, 0.000000f, 245.700045f, 208.321724f }, -{ -23.230320f, 20.966747f, 17.952866f, 0.000000f, 1.000000f, 0.000000f, 255.676941f, 194.972041f }, -{ -22.080179f, 20.966734f, 30.719679f, 0.000000f, 1.000000f, 0.000000f, 262.622269f, 180.177478f }, -{ -23.442402f, 20.966742f, 44.972439f, 0.000000f, 1.000000f, 0.000000f, 267.205431f, 162.507187f }, -{ -27.692215f, 20.966743f, 57.903660f, 0.000000f, 1.000000f, 0.000000f, 267.752663f, 145.160943f }, -{ -35.074326f, 20.966740f, 68.947144f, 0.000000f, 1.000000f, 0.000000f, 263.723906f, 128.710501f }, -{ -45.833443f, 20.966738f, 77.536499f, 0.000000f, 1.000000f, 0.000000f, 254.578922f, 113.727730f }, -{ -60.214287f, 20.966738f, 83.105423f, 0.000000f, 1.000000f, 0.000000f, 239.777591f, 100.784424f }, -{ -78.461555f, 20.966738f, 85.087578f, 0.000000f, 1.000000f, 0.000000f, 218.779751f, 90.452398f }, -{ 53.459190f, 21.106728f, -63.834198f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 21.106720f, 19.696632f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 21.106720f, 19.696632f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 21.106718f, 37.767292f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 21.106718f, 37.767292f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 21.106716f, 52.887684f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 54.761124f, 21.106716f, 61.040321f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 58.744659f, 21.106709f, 68.629570f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 65.526382f, 21.106707f, 75.245590f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 75.222885f, 21.106714f, 80.478653f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 87.950760f, 21.106714f, 83.918983f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 103.826599f, 21.106714f, 85.156822f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 107.486267f, 21.106707f, 85.094505f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.371353f, 21.106707f, 84.904137f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 115.334160f, 21.106707f, 84.580589f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 119.227013f, 21.106707f, 84.118752f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 122.902229f, 21.106707f, 83.513496f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 126.212128f, 21.106707f, 82.759697f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 114.179916f, 21.106716f, 65.426567f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 112.235428f, 21.106709f, 65.933655f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 110.283180f, 21.106709f, 66.348541f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 108.268738f, 21.106709f, 66.671227f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 106.137703f, 21.106709f, 66.901718f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 103.835670f, 21.106709f, 67.040016f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 101.308228f, 21.106709f, 67.086113f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 95.838806f, 21.106709f, 66.577324f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 91.224388f, 21.106716f, 65.167046f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 87.527145f, 21.106716f, 63.029400f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 84.809280f, 21.106716f, 60.338608f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 83.132957f, 21.106716f, 57.268780f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106716f, 53.994068f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106718f, 37.767292f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 21.106718f, 37.767292f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 21.106720f, 19.696632f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106720f, 19.696632f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106728f, -63.834198f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 109.261765f, 21.106724f, -33.040283f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 158.509918f, 21.106720f, 10.661286f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 110.660858f, 21.106716f, 56.206806f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.037323f, 21.106716f, 56.206806f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 175.299042f, 21.106712f, 25.597252f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 203.001129f, 21.106716f, 56.206806f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 237.139038f, 21.106712f, 56.206806f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 189.569809f, 21.106720f, 11.767655f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 239.097778f, 21.106724f, -33.040283f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 202.161682f, 21.106724f, -33.040283f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.620132f, 21.106722f, -3.168342f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 143.679504f, 21.106724f, -33.040283f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 246.695496f, 21.106710f, 44.635105f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 246.695496f, 21.106709f, 54.095203f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 243.335144f, 21.106709f, 54.095203f, 0.000000f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 243.335144f, 21.106712f, 56.104115f, 0.000000f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 252.174316f, 21.106712f, 56.104115f, 0.000000f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 252.174316f, 21.106709f, 54.095203f, 0.000000f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 248.813965f, 21.106709f, 54.095203f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 248.813965f, 21.106710f, 44.635105f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 253.836212f, 21.106710f, 44.635105f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 253.836212f, 21.106712f, 56.341526f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 258.931549f, 21.106709f, 51.191425f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 264.026886f, 21.106712f, 56.341526f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 264.026886f, 21.106710f, 44.635105f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 261.908356f, 21.106710f, 44.635105f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 261.908356f, 21.106709f, 51.721058f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 258.931549f, 21.106709f, 48.634647f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 255.954681f, 21.106709f, 51.721058f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 255.954681f, 21.106710f, 44.635105f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.398365f, 21.091320f, -118.046234f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.398365f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 58.399651f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 58.399651f, 21.091320f, -118.046234f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 64.683319f, 21.091320f, -118.046234f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 64.683319f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 69.684608f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 69.684608f, 21.091311f, -92.719193f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 71.361206f, 21.091311f, -90.693512f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 75.070610f, 21.091311f, -89.192642f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 78.221947f, 21.091311f, -90.116440f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 80.447113f, 21.091311f, -92.906815f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 81.069901f, 21.091311f, -95.010880f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 81.290161f, 21.091311f, -97.592255f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 81.290161f, 21.091320f, -118.046234f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 76.288872f, 21.091320f, -118.046234f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 76.288872f, 21.091311f, -97.720490f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 76.046646f, 21.091311f, -95.573685f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 74.507790f, 21.091311f, -93.751633f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 72.154381f, 21.091311f, -93.999207f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 70.869621f, 21.091311f, -95.136734f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 69.684608f, 21.091311f, -97.015182f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 69.684608f, 21.091320f, -118.046234f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 116.042702f, 21.091320f, -111.377853f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 116.042702f, 21.091320f, -116.315018f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 112.247803f, 21.091320f, -118.552063f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 107.574234f, 21.091320f, -118.394440f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 103.539482f, 21.091320f, -115.040665f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 102.209610f, 21.091320f, -112.118790f, -0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 101.385559f, 21.091312f, -108.374054f, -0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 101.102959f, 21.091311f, -103.811798f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 101.339844f, 21.091307f, -99.454666f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 102.036247f, 21.091311f, -95.777908f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 103.170799f, 21.091311f, -92.831406f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 104.722122f, 21.091311f, -90.665024f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 107.933678f, 21.091311f, -88.927628f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.632736f, 21.091311f, -89.470505f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 113.549179f, 21.091311f, -91.009354f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 114.952675f, 21.091311f, -93.103912f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 116.387047f, 21.091307f, -99.154861f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 116.619774f, 21.091309f, -104.965942f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 106.104248f, 21.091312f, -104.965942f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 106.676575f, 21.091320f, -110.009979f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 108.374535f, 21.091320f, -113.130447f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.169655f, 21.091320f, -114.199097f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 113.774490f, 21.091320f, -113.485764f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 106.040123f, 21.091307f, -101.247040f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.618484f, 21.091307f, -101.247040f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.312141f, 21.091311f, -96.746841f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 110.364601f, 21.091311f, -94.098953f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 108.733131f, 21.091311f, -93.232162f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 107.208519f, 21.091311f, -94.113205f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 106.325096f, 21.091311f, -96.775330f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 122.262253f, 21.091320f, -118.046234f, 0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 122.262253f, 21.091311f, -89.641495f, -0.000003f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 127.263535f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 127.391785f, 21.091311f, -97.335770f, -0.000004f, 1.000000f, -0.000003f, 0.000000f, 255.000000f }, -{ 128.306671f, 21.091311f, -94.372635f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 129.111130f, 21.091311f, -92.203873f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 129.876404f, 21.091311f, -90.715469f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 131.574371f, 21.091311f, -89.323868f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 133.556717f, 21.091311f, -89.280518f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 135.214310f, 21.091311f, -90.026199f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 134.829590f, 21.091311f, -95.155716f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 132.649551f, 21.091311f, -94.450424f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 130.914764f, 21.091311f, -95.135239f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 129.543335f, 21.091311f, -96.915436f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 128.513855f, 21.091307f, -99.379562f, -0.000005f, 1.000000f, -0.000004f, 0.000000f, 255.000000f }, -{ 127.804985f, 21.091307f, -102.116196f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 127.395340f, 21.091309f, -104.713913f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 127.263535f, 21.091320f, -118.046234f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 155.668289f, 21.091312f, -112.788467f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 155.668289f, 21.091312f, -116.571503f, 0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 154.127060f, 21.091320f, -117.804016f, 0.000001f, 1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 152.305023f, 21.091320f, -118.637558f, 0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 150.903000f, 21.091320f, -118.586197f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 149.472794f, 21.091320f, -117.781738f, 0.000003f, 1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 148.448669f, 21.091320f, -116.186478f, 0.000012f, 1.000000f, 0.000005f, 0.000000f, 255.000000f }, -{ 148.102249f, 21.091320f, -115.096756f, 0.000003f, 1.000000f, 0.000003f, 0.000000f, 255.000000f }, -{ 146.276031f, 21.091320f, -117.172318f, 0.000001f, 1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 142.652115f, 21.091320f, -118.815659f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 139.866501f, 21.091320f, -117.808762f, -0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 137.850311f, 21.091320f, -115.206009f, 0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 137.073761f, 21.091320f, -111.634323f, 0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 138.144791f, 21.091309f, -107.571091f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 141.623840f, 21.091307f, -104.049286f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 144.391052f, 21.091307f, -102.166382f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.909882f, 21.091307f, -100.028778f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.909882f, 21.091311f, -97.335770f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.180527f, 21.091311f, -94.538589f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 145.869064f, 21.091311f, -93.718689f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 143.898575f, 21.091311f, -93.732040f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 141.682312f, 21.091311f, -94.706894f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 137.779068f, 21.091307f, -98.297562f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 137.779068f, 21.091311f, -92.526840f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 141.658264f, 21.091311f, -89.665527f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 144.054428f, 21.091311f, -88.951309f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.152328f, 21.091311f, -89.072128f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 150.474655f, 21.091311f, -90.715469f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 152.600082f, 21.091311f, -94.111420f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 152.911179f, 21.091311f, -96.502228f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 152.932556f, 21.091312f, -113.100754f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 153.103531f, 21.091312f, -113.846436f, 0.000002f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 153.680603f, 21.091312f, -114.199097f, 0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 154.124680f, 21.091312f, -114.032852f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 154.796753f, 21.091312f, -113.553146f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.909882f, 21.091312f, -110.800781f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 147.909882f, 21.091307f, -103.491211f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 146.048050f, 21.091309f, -104.727585f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 144.556686f, 21.091309f, -105.944351f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 143.421539f, 21.091309f, -107.154007f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 142.628372f, 21.091309f, -108.369003f, 0.000003f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 142.162918f, 21.091312f, -109.601822f, 0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 142.010925f, 21.091312f, -110.864899f, 0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 142.329147f, 21.091312f, -112.550995f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 143.188812f, 21.091320f, -113.667130f, -0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 144.447449f, 21.091320f, -114.070847f, 0.000002f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 145.715591f, 21.091312f, -113.693268f, 0.000000f, 1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 146.898224f, 21.091312f, -112.588989f, -0.000002f, 1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 147.430771f, 21.091312f, -111.777710f, 0.000004f, 1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 173.749878f, 21.091312f, -112.467880f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.749878f, 21.091312f, -117.276810f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 172.085159f, 21.091312f, -118.160233f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 168.812698f, 21.091312f, -118.815659f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 166.009262f, 21.091312f, -118.315475f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 163.547806f, 21.091312f, -116.887344f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 161.503128f, 21.091312f, -114.639908f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 159.950012f, 21.091312f, -111.681839f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 158.963303f, 21.091309f, -108.121750f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 158.617767f, 21.091307f, -104.068283f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 159.531387f, 21.091311f, -96.903564f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 163.822617f, 21.091311f, -90.542206f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 169.115997f, 21.091311f, -88.872055f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.301041f, 21.091311f, -89.897964f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.301041f, 21.091311f, -95.027481f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 169.582138f, 21.091311f, -93.616867f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 166.473557f, 21.091311f, -94.882629f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 164.462112f, 21.091307f, -98.442429f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 163.747299f, 21.091307f, -103.940048f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 164.523849f, 21.091312f, -109.302292f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 166.711029f, 21.091312f, -112.812210f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 171.313354f, 21.091312f, -113.911743f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 188.369019f, 21.091312f, -113.301422f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 188.369019f, 21.091312f, -117.725632f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 186.637802f, 21.091312f, -118.378708f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 184.602036f, 21.091312f, -118.792801f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 182.419891f, 21.091312f, -118.666061f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 181.128311f, 21.091312f, -118.195847f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 180.089645f, 21.091312f, -117.372986f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 179.323486f, 21.091312f, -116.165421f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 178.849426f, 21.091312f, -114.541061f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 178.687042f, 21.091312f, -112.467880f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 178.687042f, 21.091311f, -94.001587f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 175.416977f, 21.091311f, -94.001587f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 178.200211f, 21.091311f, -89.945450f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 180.755478f, 21.091311f, -86.238419f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.239502f, 21.091309f, -82.331909f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.688324f, 21.091309f, -82.331909f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.688324f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 188.369019f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 188.369019f, 21.091311f, -94.001587f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.688324f, 21.091311f, -94.001587f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.847443f, 21.091312f, -112.446503f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 184.081055f, 21.091312f, -113.181198f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 184.972198f, 21.091312f, -113.977341f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 186.488205f, 21.091312f, -113.985367f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 192.280289f, 21.091312f, -118.046234f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 192.280289f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 197.281570f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 197.281570f, 21.091312f, -118.046234f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 209.400085f, 21.091312f, -118.687424f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 200.872238f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 205.873535f, 21.091311f, -89.641495f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 210.041275f, 21.091309f, -105.863617f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 210.169510f, 21.091309f, -105.863617f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 214.337250f, 21.091311f, -89.641495f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 219.338531f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 210.810699f, 21.091312f, -118.687424f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 196.095139f, 9.401914f, -83.842834f, 0.000000f, -1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 197.530334f, 9.401917f, -82.099869f, 0.000000f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 197.312714f, 9.401917f, -79.852554f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 195.569748f, 9.401917f, -78.417358f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 193.322433f, 9.401917f, -78.634979f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 191.887238f, 9.401917f, -80.377945f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 192.104858f, 9.401917f, -82.625259f, 0.000000f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 193.847824f, 9.401914f, -84.060455f, 0.000000f, -1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 196.095139f, 21.005835f, -83.842834f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 197.530334f, 21.005833f, -82.099869f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 197.312714f, 21.005833f, -79.852554f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 195.569748f, 21.005836f, -78.417358f, 0.000000f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 193.322433f, 21.005836f, -78.634979f, 0.000000f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 191.887238f, 21.005833f, -80.377945f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 192.104858f, 21.005835f, -82.625259f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 193.847824f, 21.005835f, -84.060455f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 194.708786f, 21.005833f, -81.238907f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 194.708786f, 9.401917f, -81.238907f, 0.000000f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 57.212021f, 9.401914f, -83.842834f, 0.000000f, -1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 58.647217f, 9.401917f, -82.099869f, 0.000000f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 58.429596f, 9.401917f, -79.852554f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 56.686630f, 9.401917f, -78.417358f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 54.439316f, 9.401917f, -78.634979f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.004120f, 9.401917f, -80.377945f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.221741f, 9.401917f, -82.625259f, 0.000000f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 54.964706f, 9.401914f, -84.060455f, 0.000000f, -1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 57.212021f, 21.005835f, -83.842834f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 58.647217f, 21.005833f, -82.099869f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 58.429596f, 21.005833f, -79.852554f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 56.686630f, 21.005836f, -78.417358f, 0.000000f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 54.439316f, 21.005836f, -78.634979f, 0.000000f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 53.004120f, 21.005833f, -80.377945f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 53.221741f, 21.005835f, -82.625259f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 54.964706f, 21.005835f, -84.060455f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 55.825668f, 21.005833f, -81.238907f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 55.825668f, 9.401917f, -81.238907f, 0.000000f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 98.582520f, 9.484123f, -113.301437f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 98.582520f, 9.484123f, -117.725662f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 95.979660f, 9.484123f, -118.792831f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 92.633392f, 9.484123f, -118.666077f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 90.303146f, 9.484123f, -117.373001f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 89.062927f, 9.484123f, -114.541092f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 88.900543f, 9.484123f, -112.467911f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 88.900543f, 9.484118f, -94.001602f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 85.630478f, 9.484118f, -94.001602f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 88.413712f, 9.484118f, -89.945480f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 90.968979f, 9.484117f, -86.238449f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 93.453003f, 9.484117f, -82.331924f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 93.901825f, 9.484117f, -82.331924f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 93.901825f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 98.582520f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 98.582520f, 9.484118f, -94.001602f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 93.901825f, 9.484118f, -94.001602f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 94.060944f, 9.484123f, -112.446518f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 95.185699f, 9.484123f, -113.977371f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 96.701706f, 9.484123f, -113.985397f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 98.582520f, 21.091312f, -113.301422f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 98.582520f, 21.091312f, -117.725632f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 95.979660f, 21.091312f, -118.792801f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 92.633392f, 21.091312f, -118.666061f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 90.303146f, 21.091312f, -117.372986f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 89.062927f, 21.091312f, -114.541061f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 88.900543f, 21.091312f, -112.467880f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 88.900543f, 21.091311f, -94.001587f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 85.630478f, 21.091311f, -94.001587f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 88.413712f, 21.091311f, -89.945450f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 90.968979f, 21.091311f, -86.238419f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 93.453003f, 21.091309f, -82.331909f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 93.901825f, 21.091309f, -82.331909f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 93.901825f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 98.582520f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 98.582520f, 21.091311f, -94.001587f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 93.901825f, 21.091311f, -94.001587f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 94.047279f, 21.091312f, -112.455856f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 95.185699f, 21.091312f, -113.977341f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 96.701706f, 21.091312f, -113.985367f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 236.900940f, 9.484123f, -111.377884f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 236.900940f, 9.484123f, -116.315048f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 233.106049f, 9.484123f, -118.552078f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 228.432480f, 9.484123f, -118.394455f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 224.397736f, 9.484123f, -115.040680f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 223.067856f, 9.484123f, -112.118805f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 222.243805f, 9.484118f, -108.374069f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 221.961212f, 9.484118f, -103.811813f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 222.198090f, 9.484118f, -99.454697f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 222.894501f, 9.484118f, -95.777939f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 224.029053f, 9.484106f, -92.831436f, 0.000002f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 225.580368f, 9.484118f, -90.665039f, -0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 228.791931f, 9.484118f, -88.927658f, 0.000000f, -1.000000f, 0.000003f, 0.000000f, 255.000000f }, -{ 232.490982f, 9.484118f, -89.470520f, 0.000001f, -1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 234.407425f, 9.484118f, -91.009384f, 0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 235.810913f, 9.484106f, -93.103928f, -0.000002f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 237.245300f, 9.484118f, -99.154877f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 237.478027f, 9.484118f, -104.965958f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 226.962494f, 9.484118f, -104.965958f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 227.534821f, 9.484123f, -110.009995f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 229.232788f, 9.484123f, -113.130463f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 232.027893f, 9.484123f, -114.199112f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 234.632736f, 9.484123f, -113.485794f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 226.898376f, 9.484118f, -101.247055f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 232.476730f, 9.484118f, -101.247055f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 232.170380f, 9.484118f, -96.746857f, -0.000001f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 231.222839f, 9.484118f, -94.098984f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 229.591370f, 9.484106f, -93.232178f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 228.066772f, 9.484118f, -94.113220f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 227.183350f, 9.484118f, -96.775345f, 0.000001f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 236.900940f, 21.091320f, -111.377853f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 236.900940f, 21.091320f, -116.315018f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 233.106049f, 21.091320f, -118.552063f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 228.432480f, 21.091320f, -118.394440f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 224.397736f, 21.091320f, -115.040665f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 223.067856f, 21.091320f, -112.118790f, -0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 222.243805f, 21.091312f, -108.374054f, -0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 221.961212f, 21.091311f, -103.811798f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 222.198090f, 21.091307f, -99.454666f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 222.894501f, 21.091311f, -95.777908f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 224.029053f, 21.091311f, -92.831406f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 225.580368f, 21.091311f, -90.665024f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 228.791931f, 21.091311f, -88.927628f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 232.490982f, 21.091311f, -89.470505f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 234.407425f, 21.091311f, -91.009354f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 235.810913f, 21.091311f, -93.103912f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 237.245300f, 21.091307f, -99.154861f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 237.478027f, 21.091309f, -104.965942f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 226.962494f, 21.091312f, -104.965942f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 227.534821f, 21.091320f, -110.009979f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 229.232788f, 21.091320f, -113.130447f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 232.027893f, 21.091320f, -114.199097f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 234.632736f, 21.091320f, -113.485764f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 226.898376f, 21.091307f, -101.247040f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 232.476730f, 21.091307f, -101.247040f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 232.170380f, 21.091311f, -96.746841f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 231.222839f, 21.091311f, -94.098953f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 229.591370f, 21.091311f, -93.232162f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 228.066772f, 21.091311f, -94.113205f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 227.183350f, 21.091311f, -96.775330f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f } -}; - -static Face face_1[] = { -{ { 1, 2, 350 }, 0, 4 }, -{ { 1, 350, 349 }, 0, 3 }, -{ { 2, 3, 351 }, 0, 4 }, -{ { 2, 351, 350 }, 0, 2 }, -{ { 3, 4, 352 }, 0, 4 }, -{ { 3, 352, 351 }, 0, 2 }, -{ { 4, 5, 353 }, 0, 4 }, -{ { 4, 353, 352 }, 0, 2 }, -{ { 5, 6, 354 }, 0, 4 }, -{ { 5, 354, 353 }, 0, 2 }, -{ { 6, 7, 355 }, 0, 4 }, -{ { 6, 355, 354 }, 0, 2 }, -{ { 7, 8, 356 }, 0, 4 }, -{ { 7, 356, 355 }, 0, 2 }, -{ { 8, 9, 357 }, 0, 4 }, -{ { 8, 357, 356 }, 0, 2 }, -{ { 9, 10, 358 }, 0, 4 }, -{ { 9, 358, 357 }, 0, 2 }, -{ { 10, 11, 359 }, 0, 4 }, -{ { 10, 359, 358 }, 0, 2 }, -{ { 11, 12, 360 }, 0, 4 }, -{ { 11, 360, 359 }, 0, 2 }, -{ { 12, 13, 361 }, 0, 4 }, -{ { 12, 361, 360 }, 0, 2 }, -{ { 13, 14, 362 }, 0, 4 }, -{ { 13, 362, 361 }, 0, 2 }, -{ { 14, 15, 363 }, 0, 4 }, -{ { 14, 363, 362 }, 0, 2 }, -{ { 15, 16, 364 }, 0, 4 }, -{ { 15, 364, 363 }, 0, 2 }, -{ { 16, 17, 365 }, 0, 4 }, -{ { 16, 365, 364 }, 0, 2 }, -{ { 17, 18, 366 }, 0, 4 }, -{ { 17, 366, 365 }, 0, 2 }, -{ { 18, 19, 367 }, 0, 6 }, -{ { 18, 367, 366 }, 0, 2 }, -{ { 20, 21, 369 }, 0, 4 }, -{ { 20, 369, 368 }, 0, 3 }, -{ { 21, 22, 370 }, 0, 4 }, -{ { 21, 370, 369 }, 0, 2 }, -{ { 22, 23, 371 }, 0, 4 }, -{ { 22, 371, 370 }, 0, 2 }, -{ { 23, 24, 372 }, 0, 4 }, -{ { 23, 372, 371 }, 0, 2 }, -{ { 24, 25, 373 }, 0, 4 }, -{ { 24, 373, 372 }, 0, 2 }, -{ { 25, 26, 374 }, 0, 4 }, -{ { 25, 374, 373 }, 0, 2 }, -{ { 26, 27, 375 }, 0, 4 }, -{ { 26, 375, 374 }, 0, 2 }, -{ { 27, 28, 376 }, 0, 4 }, -{ { 27, 376, 375 }, 0, 2 }, -{ { 28, 29, 377 }, 0, 4 }, -{ { 28, 377, 376 }, 0, 2 }, -{ { 29, 30, 378 }, 0, 4 }, -{ { 29, 378, 377 }, 0, 2 }, -{ { 30, 31, 379 }, 0, 4 }, -{ { 30, 379, 378 }, 0, 2 }, -{ { 31, 32, 380 }, 0, 4 }, -{ { 31, 380, 379 }, 0, 2 }, -{ { 32, 33, 381 }, 0, 4 }, -{ { 32, 381, 380 }, 0, 2 }, -{ { 33, 34, 382 }, 0, 4 }, -{ { 33, 382, 381 }, 0, 2 }, -{ { 34, 35, 383 }, 0, 4 }, -{ { 34, 383, 382 }, 0, 2 }, -{ { 35, 36, 384 }, 0, 4 }, -{ { 35, 384, 383 }, 0, 2 }, -{ { 36, 37, 385 }, 0, 4 }, -{ { 36, 385, 384 }, 0, 2 }, -{ { 37, 38, 386 }, 0, 4 }, -{ { 37, 386, 385 }, 0, 2 }, -{ { 38, 39, 387 }, 0, 4 }, -{ { 38, 387, 386 }, 0, 2 }, -{ { 39, 40, 388 }, 0, 4 }, -{ { 39, 388, 387 }, 0, 2 }, -{ { 40, 41, 389 }, 0, 4 }, -{ { 40, 389, 388 }, 0, 2 }, -{ { 41, 42, 390 }, 0, 4 }, -{ { 41, 390, 389 }, 0, 2 }, -{ { 42, 43, 391 }, 0, 4 }, -{ { 42, 391, 390 }, 0, 2 }, -{ { 43, 44, 392 }, 0, 4 }, -{ { 43, 392, 391 }, 0, 2 }, -{ { 44, 45, 393 }, 0, 4 }, -{ { 44, 393, 392 }, 0, 2 }, -{ { 45, 46, 394 }, 0, 4 }, -{ { 45, 394, 393 }, 0, 2 }, -{ { 46, 47, 395 }, 0, 4 }, -{ { 46, 395, 394 }, 0, 2 }, -{ { 47, 48, 396 }, 0, 4 }, -{ { 47, 396, 395 }, 0, 2 }, -{ { 48, 49, 397 }, 0, 4 }, -{ { 48, 397, 396 }, 0, 2 }, -{ { 49, 50, 398 }, 0, 4 }, -{ { 49, 398, 397 }, 0, 2 }, -{ { 50, 51, 399 }, 0, 4 }, -{ { 50, 399, 398 }, 0, 2 }, -{ { 51, 52, 400 }, 0, 4 }, -{ { 51, 400, 399 }, 0, 2 }, -{ { 52, 53, 401 }, 0, 4 }, -{ { 52, 401, 400 }, 0, 2 }, -{ { 53, 54, 402 }, 0, 4 }, -{ { 53, 402, 401 }, 0, 2 }, -{ { 54, 55, 403 }, 0, 4 }, -{ { 54, 403, 402 }, 0, 2 }, -{ { 55, 56, 404 }, 0, 6 }, -{ { 55, 404, 403 }, 0, 2 }, -{ { 57, 58, 406 }, 0, 4 }, -{ { 57, 406, 405 }, 0, 3 }, -{ { 58, 59, 407 }, 0, 4 }, -{ { 58, 407, 406 }, 0, 2 }, -{ { 59, 60, 408 }, 0, 4 }, -{ { 59, 408, 407 }, 0, 2 }, -{ { 60, 61, 409 }, 0, 4 }, -{ { 60, 409, 408 }, 0, 2 }, -{ { 61, 62, 410 }, 0, 4 }, -{ { 61, 410, 409 }, 0, 2 }, -{ { 62, 63, 411 }, 0, 4 }, -{ { 62, 411, 410 }, 0, 2 }, -{ { 63, 64, 412 }, 0, 4 }, -{ { 63, 412, 411 }, 0, 2 }, -{ { 64, 65, 413 }, 0, 4 }, -{ { 64, 413, 412 }, 0, 2 }, -{ { 65, 66, 414 }, 0, 4 }, -{ { 65, 414, 413 }, 0, 2 }, -{ { 66, 67, 415 }, 0, 4 }, -{ { 66, 415, 414 }, 0, 2 }, -{ { 67, 68, 416 }, 0, 4 }, -{ { 67, 416, 415 }, 0, 2 }, -{ { 68, 69, 417 }, 0, 4 }, -{ { 68, 417, 416 }, 0, 2 }, -{ { 69, 70, 418 }, 0, 4 }, -{ { 69, 418, 417 }, 0, 2 }, -{ { 70, 71, 419 }, 0, 4 }, -{ { 70, 419, 418 }, 0, 2 }, -{ { 71, 72, 420 }, 0, 4 }, -{ { 71, 420, 419 }, 0, 2 }, -{ { 72, 73, 421 }, 0, 4 }, -{ { 72, 421, 420 }, 0, 2 }, -{ { 73, 74, 422 }, 0, 4 }, -{ { 73, 422, 421 }, 0, 2 }, -{ { 74, 0, 348 }, 0, 6 }, -{ { 74, 348, 422 }, 0, 2 }, -{ { 75, 76, 424 }, 0, 4 }, -{ { 75, 424, 423 }, 0, 3 }, -{ { 76, 77, 425 }, 0, 4 }, -{ { 76, 425, 424 }, 0, 2 }, -{ { 77, 78, 426 }, 0, 4 }, -{ { 77, 426, 425 }, 0, 2 }, -{ { 78, 79, 427 }, 0, 4 }, -{ { 78, 427, 426 }, 0, 2 }, -{ { 79, 80, 428 }, 0, 4 }, -{ { 79, 428, 427 }, 0, 2 }, -{ { 80, 81, 429 }, 0, 4 }, -{ { 80, 429, 428 }, 0, 2 }, -{ { 81, 82, 430 }, 0, 4 }, -{ { 81, 430, 429 }, 0, 2 }, -{ { 82, 83, 431 }, 0, 4 }, -{ { 82, 431, 430 }, 0, 2 }, -{ { 83, 84, 432 }, 0, 4 }, -{ { 83, 432, 431 }, 0, 2 }, -{ { 84, 85, 433 }, 0, 4 }, -{ { 84, 433, 432 }, 0, 2 }, -{ { 85, 86, 434 }, 0, 4 }, -{ { 85, 434, 433 }, 0, 2 }, -{ { 86, 87, 435 }, 0, 4 }, -{ { 86, 435, 434 }, 0, 2 }, -{ { 87, 88, 436 }, 0, 4 }, -{ { 87, 436, 435 }, 0, 2 }, -{ { 88, 89, 437 }, 0, 6 }, -{ { 88, 437, 436 }, 0, 2 }, -{ { 90, 91, 439 }, 0, 4 }, -{ { 90, 439, 438 }, 0, 2 }, -{ { 91, 92, 440 }, 0, 4 }, -{ { 91, 440, 439 }, 0, 2 }, -{ { 92, 93, 441 }, 0, 4 }, -{ { 92, 441, 440 }, 0, 2 }, -{ { 93, 94, 442 }, 0, 4 }, -{ { 93, 442, 441 }, 0, 2 }, -{ { 94, 95, 443 }, 0, 4 }, -{ { 94, 443, 442 }, 0, 2 }, -{ { 95, 96, 444 }, 0, 4 }, -{ { 95, 444, 443 }, 0, 2 }, -{ { 96, 97, 445 }, 0, 4 }, -{ { 96, 445, 444 }, 0, 2 }, -{ { 97, 98, 446 }, 0, 4 }, -{ { 97, 446, 445 }, 0, 2 }, -{ { 98, 99, 447 }, 0, 4 }, -{ { 98, 447, 446 }, 0, 2 }, -{ { 99, 100, 448 }, 0, 4 }, -{ { 99, 448, 447 }, 0, 2 }, -{ { 100, 101, 449 }, 0, 4 }, -{ { 100, 449, 448 }, 0, 2 }, -{ { 101, 102, 450 }, 0, 4 }, -{ { 101, 450, 449 }, 0, 2 }, -{ { 102, 103, 451 }, 0, 4 }, -{ { 102, 451, 450 }, 0, 2 }, -{ { 103, 104, 452 }, 0, 4 }, -{ { 103, 452, 451 }, 0, 2 }, -{ { 104, 90, 438 }, 0, 4 }, -{ { 104, 438, 452 }, 0, 2 }, -{ { 106, 107, 455 }, 1, 6 }, -{ { 106, 455, 454 }, 1, 3 }, -{ { 108, 109, 457 }, 1, 4 }, -{ { 108, 457, 456 }, 1, 3 }, -{ { 109, 110, 458 }, 1, 4 }, -{ { 109, 458, 457 }, 1, 2 }, -{ { 110, 111, 459 }, 1, 4 }, -{ { 110, 459, 458 }, 1, 2 }, -{ { 111, 112, 460 }, 1, 4 }, -{ { 111, 460, 459 }, 1, 2 }, -{ { 112, 113, 461 }, 1, 4 }, -{ { 112, 461, 460 }, 1, 2 }, -{ { 113, 114, 462 }, 1, 4 }, -{ { 113, 462, 461 }, 1, 2 }, -{ { 114, 115, 463 }, 1, 4 }, -{ { 114, 463, 462 }, 1, 2 }, -{ { 115, 116, 464 }, 1, 4 }, -{ { 115, 464, 463 }, 1, 2 }, -{ { 116, 117, 465 }, 1, 4 }, -{ { 116, 465, 464 }, 1, 2 }, -{ { 117, 118, 466 }, 1, 4 }, -{ { 117, 466, 465 }, 1, 2 }, -{ { 118, 119, 467 }, 1, 4 }, -{ { 118, 467, 466 }, 1, 2 }, -{ { 119, 120, 468 }, 1, 4 }, -{ { 119, 468, 467 }, 1, 2 }, -{ { 120, 121, 469 }, 1, 4 }, -{ { 120, 469, 468 }, 1, 2 }, -{ { 121, 122, 470 }, 1, 4 }, -{ { 121, 470, 469 }, 1, 2 }, -{ { 122, 123, 471 }, 1, 4 }, -{ { 122, 471, 470 }, 1, 2 }, -{ { 123, 124, 472 }, 1, 4 }, -{ { 123, 472, 471 }, 1, 2 }, -{ { 124, 125, 473 }, 1, 4 }, -{ { 124, 473, 472 }, 1, 2 }, -{ { 125, 126, 474 }, 1, 4 }, -{ { 125, 474, 473 }, 1, 2 }, -{ { 126, 127, 475 }, 1, 4 }, -{ { 126, 475, 474 }, 1, 2 }, -{ { 127, 128, 476 }, 1, 4 }, -{ { 127, 476, 475 }, 1, 2 }, -{ { 128, 129, 477 }, 1, 4 }, -{ { 128, 477, 476 }, 1, 2 }, -{ { 129, 130, 478 }, 1, 4 }, -{ { 129, 478, 477 }, 1, 2 }, -{ { 130, 131, 479 }, 1, 4 }, -{ { 130, 479, 478 }, 1, 2 }, -{ { 131, 132, 480 }, 1, 4 }, -{ { 131, 480, 479 }, 1, 2 }, -{ { 132, 133, 481 }, 1, 4 }, -{ { 132, 481, 480 }, 1, 2 }, -{ { 133, 134, 482 }, 1, 4 }, -{ { 133, 482, 481 }, 1, 2 }, -{ { 134, 135, 483 }, 1, 4 }, -{ { 134, 483, 482 }, 1, 2 }, -{ { 135, 136, 484 }, 1, 4 }, -{ { 135, 484, 483 }, 1, 2 }, -{ { 136, 137, 485 }, 1, 6 }, -{ { 136, 485, 484 }, 1, 2 }, -{ { 138, 139, 487 }, 1, 6 }, -{ { 138, 487, 486 }, 1, 3 }, -{ { 140, 105, 453 }, 1, 6 }, -{ { 140, 453, 488 }, 1, 3 }, -{ { 141, 142, 490 }, 1, 4 }, -{ { 141, 490, 489 }, 1, 2 }, -{ { 142, 143, 491 }, 1, 4 }, -{ { 142, 491, 490 }, 1, 2 }, -{ { 143, 144, 492 }, 1, 4 }, -{ { 143, 492, 491 }, 1, 2 }, -{ { 144, 145, 493 }, 1, 4 }, -{ { 144, 493, 492 }, 1, 2 }, -{ { 145, 146, 494 }, 1, 4 }, -{ { 145, 494, 493 }, 1, 2 }, -{ { 146, 147, 495 }, 1, 4 }, -{ { 146, 495, 494 }, 1, 2 }, -{ { 147, 148, 496 }, 1, 4 }, -{ { 147, 496, 495 }, 1, 2 }, -{ { 148, 149, 497 }, 1, 4 }, -{ { 148, 497, 496 }, 1, 2 }, -{ { 149, 150, 498 }, 1, 4 }, -{ { 149, 498, 497 }, 1, 2 }, -{ { 150, 151, 499 }, 1, 4 }, -{ { 150, 499, 498 }, 1, 2 }, -{ { 151, 152, 500 }, 1, 4 }, -{ { 151, 500, 499 }, 1, 2 }, -{ { 152, 141, 489 }, 1, 4 }, -{ { 152, 489, 500 }, 1, 2 }, -{ { 153, 154, 502 }, 1, 4 }, -{ { 153, 502, 501 }, 1, 2 }, -{ { 154, 155, 503 }, 1, 4 }, -{ { 154, 503, 502 }, 1, 2 }, -{ { 155, 156, 504 }, 1, 4 }, -{ { 155, 504, 503 }, 1, 2 }, -{ { 156, 157, 505 }, 1, 4 }, -{ { 156, 505, 504 }, 1, 2 }, -{ { 157, 158, 506 }, 1, 4 }, -{ { 157, 506, 505 }, 1, 2 }, -{ { 158, 159, 507 }, 1, 4 }, -{ { 158, 507, 506 }, 1, 2 }, -{ { 159, 160, 508 }, 1, 4 }, -{ { 159, 508, 507 }, 1, 2 }, -{ { 160, 153, 501 }, 1, 4 }, -{ { 160, 501, 508 }, 1, 2 }, -{ { 161, 162, 510 }, 1, 4 }, -{ { 161, 510, 509 }, 1, 2 }, -{ { 162, 163, 511 }, 1, 4 }, -{ { 162, 511, 510 }, 1, 2 }, -{ { 163, 164, 512 }, 1, 4 }, -{ { 163, 512, 511 }, 1, 2 }, -{ { 164, 165, 513 }, 1, 4 }, -{ { 164, 513, 512 }, 1, 2 }, -{ { 165, 166, 514 }, 1, 4 }, -{ { 165, 514, 513 }, 1, 2 }, -{ { 166, 167, 515 }, 1, 4 }, -{ { 166, 515, 514 }, 1, 2 }, -{ { 167, 168, 516 }, 1, 4 }, -{ { 167, 516, 515 }, 1, 2 }, -{ { 168, 169, 517 }, 1, 4 }, -{ { 168, 517, 516 }, 1, 2 }, -{ { 169, 170, 518 }, 1, 4 }, -{ { 169, 518, 517 }, 1, 2 }, -{ { 170, 161, 509 }, 1, 4 }, -{ { 170, 509, 518 }, 1, 2 }, -{ { 171, 172, 520 }, 1, 4 }, -{ { 171, 520, 519 }, 1, 2 }, -{ { 172, 173, 521 }, 1, 4 }, -{ { 172, 521, 520 }, 1, 2 }, -{ { 173, 174, 522 }, 1, 4 }, -{ { 173, 522, 521 }, 1, 2 }, -{ { 174, 171, 519 }, 1, 4 }, -{ { 174, 519, 522 }, 1, 2 }, -{ { 175, 176, 524 }, 1, 4 }, -{ { 175, 524, 523 }, 1, 2 }, -{ { 176, 177, 525 }, 1, 4 }, -{ { 176, 525, 524 }, 1, 2 }, -{ { 177, 178, 526 }, 1, 4 }, -{ { 177, 526, 525 }, 1, 2 }, -{ { 178, 179, 527 }, 1, 4 }, -{ { 178, 527, 526 }, 1, 2 }, -{ { 179, 180, 528 }, 1, 4 }, -{ { 179, 528, 527 }, 1, 2 }, -{ { 180, 181, 529 }, 1, 4 }, -{ { 180, 529, 528 }, 1, 2 }, -{ { 181, 182, 530 }, 1, 4 }, -{ { 181, 530, 529 }, 1, 2 }, -{ { 182, 183, 531 }, 1, 4 }, -{ { 182, 531, 530 }, 1, 2 }, -{ { 183, 184, 532 }, 1, 4 }, -{ { 183, 532, 531 }, 1, 2 }, -{ { 184, 185, 533 }, 1, 4 }, -{ { 184, 533, 532 }, 1, 2 }, -{ { 185, 186, 534 }, 1, 4 }, -{ { 185, 534, 533 }, 1, 2 }, -{ { 186, 187, 535 }, 1, 4 }, -{ { 186, 535, 534 }, 1, 2 }, -{ { 187, 188, 536 }, 1, 4 }, -{ { 187, 536, 535 }, 1, 2 }, -{ { 188, 189, 537 }, 1, 4 }, -{ { 188, 537, 536 }, 1, 2 }, -{ { 189, 190, 538 }, 1, 4 }, -{ { 189, 538, 537 }, 1, 2 }, -{ { 190, 191, 539 }, 1, 4 }, -{ { 190, 539, 538 }, 1, 2 }, -{ { 191, 192, 540 }, 1, 4 }, -{ { 191, 540, 539 }, 1, 2 }, -{ { 192, 193, 541 }, 1, 4 }, -{ { 192, 541, 540 }, 1, 2 }, -{ { 193, 175, 523 }, 1, 4 }, -{ { 193, 523, 541 }, 1, 2 }, -{ { 194, 195, 543 }, 1, 4 }, -{ { 194, 543, 542 }, 1, 2 }, -{ { 195, 196, 544 }, 1, 4 }, -{ { 195, 544, 543 }, 1, 2 }, -{ { 196, 197, 545 }, 1, 4 }, -{ { 196, 545, 544 }, 1, 2 }, -{ { 197, 198, 546 }, 1, 4 }, -{ { 197, 546, 545 }, 1, 2 }, -{ { 198, 199, 547 }, 1, 4 }, -{ { 198, 547, 546 }, 1, 2 }, -{ { 199, 200, 548 }, 1, 4 }, -{ { 199, 548, 547 }, 1, 2 }, -{ { 200, 201, 549 }, 1, 4 }, -{ { 200, 549, 548 }, 1, 2 }, -{ { 201, 202, 550 }, 1, 4 }, -{ { 201, 550, 549 }, 1, 2 }, -{ { 202, 203, 551 }, 1, 4 }, -{ { 202, 551, 550 }, 1, 2 }, -{ { 203, 204, 552 }, 1, 4 }, -{ { 203, 552, 551 }, 1, 2 }, -{ { 204, 205, 553 }, 1, 4 }, -{ { 204, 553, 552 }, 1, 2 }, -{ { 205, 206, 554 }, 1, 4 }, -{ { 205, 554, 553 }, 1, 2 }, -{ { 206, 207, 555 }, 1, 4 }, -{ { 206, 555, 554 }, 1, 2 }, -{ { 207, 208, 556 }, 1, 4 }, -{ { 207, 556, 555 }, 1, 2 }, -{ { 208, 209, 557 }, 1, 4 }, -{ { 208, 557, 556 }, 1, 2 }, -{ { 209, 210, 558 }, 1, 4 }, -{ { 209, 558, 557 }, 1, 2 }, -{ { 210, 211, 559 }, 1, 4 }, -{ { 210, 559, 558 }, 1, 2 }, -{ { 211, 212, 560 }, 1, 4 }, -{ { 211, 560, 559 }, 1, 2 }, -{ { 212, 213, 561 }, 1, 4 }, -{ { 212, 561, 560 }, 1, 2 }, -{ { 213, 214, 562 }, 1, 4 }, -{ { 213, 562, 561 }, 1, 2 }, -{ { 214, 215, 563 }, 1, 4 }, -{ { 214, 563, 562 }, 1, 2 }, -{ { 215, 216, 564 }, 1, 4 }, -{ { 215, 564, 563 }, 1, 2 }, -{ { 216, 194, 542 }, 1, 4 }, -{ { 216, 542, 564 }, 1, 2 }, -{ { 217, 218, 566 }, 1, 4 }, -{ { 217, 566, 565 }, 1, 2 }, -{ { 218, 219, 567 }, 1, 4 }, -{ { 218, 567, 566 }, 1, 2 }, -{ { 219, 220, 568 }, 1, 4 }, -{ { 219, 568, 567 }, 1, 2 }, -{ { 220, 221, 569 }, 1, 4 }, -{ { 220, 569, 568 }, 1, 2 }, -{ { 221, 222, 570 }, 1, 4 }, -{ { 221, 570, 569 }, 1, 2 }, -{ { 222, 223, 571 }, 1, 4 }, -{ { 222, 571, 570 }, 1, 2 }, -{ { 223, 217, 565 }, 1, 4 }, -{ { 223, 565, 571 }, 1, 2 }, -{ { 224, 225, 573 }, 1, 4 }, -{ { 224, 573, 572 }, 1, 2 }, -{ { 225, 226, 574 }, 1, 4 }, -{ { 225, 574, 573 }, 1, 2 }, -{ { 226, 227, 575 }, 1, 4 }, -{ { 226, 575, 574 }, 1, 2 }, -{ { 227, 228, 576 }, 1, 4 }, -{ { 227, 576, 575 }, 1, 2 }, -{ { 228, 229, 577 }, 1, 4 }, -{ { 228, 577, 576 }, 1, 2 }, -{ { 229, 230, 578 }, 1, 4 }, -{ { 229, 578, 577 }, 1, 2 }, -{ { 230, 231, 579 }, 1, 4 }, -{ { 230, 579, 578 }, 1, 2 }, -{ { 231, 232, 580 }, 1, 4 }, -{ { 231, 580, 579 }, 1, 2 }, -{ { 232, 233, 581 }, 1, 4 }, -{ { 232, 581, 580 }, 1, 2 }, -{ { 233, 234, 582 }, 1, 4 }, -{ { 233, 582, 581 }, 1, 2 }, -{ { 234, 235, 583 }, 1, 4 }, -{ { 234, 583, 582 }, 1, 2 }, -{ { 235, 236, 584 }, 1, 4 }, -{ { 235, 584, 583 }, 1, 2 }, -{ { 236, 237, 585 }, 1, 4 }, -{ { 236, 585, 584 }, 1, 2 }, -{ { 237, 238, 586 }, 1, 4 }, -{ { 237, 586, 585 }, 1, 2 }, -{ { 238, 239, 587 }, 1, 4 }, -{ { 238, 587, 586 }, 1, 2 }, -{ { 239, 240, 588 }, 1, 4 }, -{ { 239, 588, 587 }, 1, 2 }, -{ { 240, 241, 589 }, 1, 4 }, -{ { 240, 589, 588 }, 1, 2 }, -{ { 241, 224, 572 }, 1, 4 }, -{ { 241, 572, 589 }, 1, 2 }, -{ { 242, 243, 591 }, 1, 4 }, -{ { 242, 591, 590 }, 1, 2 }, -{ { 243, 244, 592 }, 1, 4 }, -{ { 243, 592, 591 }, 1, 2 }, -{ { 244, 245, 593 }, 1, 4 }, -{ { 244, 593, 592 }, 1, 2 }, -{ { 245, 246, 594 }, 1, 4 }, -{ { 245, 594, 593 }, 1, 2 }, -{ { 246, 247, 595 }, 1, 4 }, -{ { 246, 595, 594 }, 1, 2 }, -{ { 247, 248, 596 }, 1, 4 }, -{ { 247, 596, 595 }, 1, 2 }, -{ { 248, 249, 597 }, 1, 4 }, -{ { 248, 597, 596 }, 1, 2 }, -{ { 249, 250, 598 }, 1, 4 }, -{ { 249, 598, 597 }, 1, 2 }, -{ { 250, 251, 599 }, 1, 4 }, -{ { 250, 599, 598 }, 1, 2 }, -{ { 251, 252, 600 }, 1, 4 }, -{ { 251, 600, 599 }, 1, 2 }, -{ { 252, 253, 601 }, 1, 4 }, -{ { 252, 601, 600 }, 1, 2 }, -{ { 253, 254, 602 }, 1, 4 }, -{ { 253, 602, 601 }, 1, 2 }, -{ { 254, 255, 603 }, 1, 4 }, -{ { 254, 603, 602 }, 1, 2 }, -{ { 255, 256, 604 }, 1, 4 }, -{ { 255, 604, 603 }, 1, 2 }, -{ { 256, 257, 605 }, 1, 4 }, -{ { 256, 605, 604 }, 1, 2 }, -{ { 257, 258, 606 }, 1, 4 }, -{ { 257, 606, 605 }, 1, 2 }, -{ { 258, 259, 607 }, 1, 4 }, -{ { 258, 607, 606 }, 1, 2 }, -{ { 259, 260, 608 }, 1, 4 }, -{ { 259, 608, 607 }, 1, 2 }, -{ { 260, 261, 609 }, 1, 4 }, -{ { 260, 609, 608 }, 1, 2 }, -{ { 261, 262, 610 }, 1, 4 }, -{ { 261, 610, 609 }, 1, 2 }, -{ { 262, 263, 611 }, 1, 4 }, -{ { 262, 611, 610 }, 1, 2 }, -{ { 263, 264, 611 }, 1, 4 }, -{ { 264, 612, 611 }, 1, 2 }, -{ { 264, 265, 613 }, 1, 4 }, -{ { 264, 613, 612 }, 1, 2 }, -{ { 265, 266, 614 }, 1, 4 }, -{ { 265, 614, 613 }, 1, 2 }, -{ { 266, 267, 615 }, 1, 4 }, -{ { 266, 615, 614 }, 1, 2 }, -{ { 267, 268, 616 }, 1, 4 }, -{ { 267, 616, 615 }, 1, 2 }, -{ { 268, 269, 617 }, 1, 4 }, -{ { 268, 617, 616 }, 1, 2 }, -{ { 269, 270, 618 }, 1, 4 }, -{ { 269, 618, 617 }, 1, 2 }, -{ { 270, 271, 619 }, 1, 4 }, -{ { 270, 619, 618 }, 1, 2 }, -{ { 271, 272, 620 }, 1, 4 }, -{ { 271, 620, 619 }, 1, 2 }, -{ { 272, 273, 621 }, 1, 4 }, -{ { 272, 621, 620 }, 1, 2 }, -{ { 273, 274, 622 }, 1, 4 }, -{ { 273, 622, 621 }, 1, 2 }, -{ { 274, 275, 623 }, 1, 4 }, -{ { 274, 623, 622 }, 1, 2 }, -{ { 275, 276, 624 }, 1, 4 }, -{ { 275, 624, 623 }, 1, 2 }, -{ { 276, 242, 590 }, 1, 4 }, -{ { 276, 590, 624 }, 1, 2 }, -{ { 277, 278, 626 }, 1, 4 }, -{ { 277, 626, 625 }, 1, 2 }, -{ { 278, 279, 627 }, 1, 4 }, -{ { 278, 627, 626 }, 1, 2 }, -{ { 279, 280, 628 }, 1, 4 }, -{ { 279, 628, 627 }, 1, 2 }, -{ { 280, 281, 629 }, 1, 4 }, -{ { 280, 629, 628 }, 1, 2 }, -{ { 281, 630, 629 }, 1, 2 }, -{ { 281, 282, 631 }, 1, 4 }, -{ { 281, 631, 630 }, 1, 2 }, -{ { 282, 632, 631 }, 1, 2 }, -{ { 282, 283, 633 }, 1, 4 }, -{ { 282, 633, 632 }, 1, 2 }, -{ { 283, 284, 634 }, 1, 4 }, -{ { 283, 634, 633 }, 1, 2 }, -{ { 284, 285, 635 }, 1, 4 }, -{ { 284, 635, 634 }, 1, 2 }, -{ { 285, 286, 636 }, 1, 4 }, -{ { 285, 636, 635 }, 1, 2 }, -{ { 286, 287, 637 }, 1, 4 }, -{ { 286, 637, 636 }, 1, 2 }, -{ { 287, 288, 638 }, 1, 4 }, -{ { 287, 638, 637 }, 1, 2 }, -{ { 288, 277, 625 }, 1, 4 }, -{ { 288, 625, 638 }, 1, 2 }, -{ { 289, 290, 640 }, 1, 4 }, -{ { 289, 640, 639 }, 1, 2 }, -{ { 290, 291, 641 }, 1, 4 }, -{ { 290, 641, 640 }, 1, 2 }, -{ { 291, 292, 642 }, 1, 4 }, -{ { 291, 642, 641 }, 1, 2 }, -{ { 292, 293, 643 }, 1, 4 }, -{ { 292, 643, 642 }, 1, 2 }, -{ { 293, 294, 644 }, 1, 4 }, -{ { 293, 644, 643 }, 1, 2 }, -{ { 294, 295, 645 }, 1, 4 }, -{ { 294, 645, 644 }, 1, 2 }, -{ { 295, 296, 646 }, 1, 4 }, -{ { 295, 646, 645 }, 1, 2 }, -{ { 296, 297, 647 }, 1, 4 }, -{ { 296, 647, 646 }, 1, 2 }, -{ { 297, 298, 648 }, 1, 4 }, -{ { 297, 648, 647 }, 1, 2 }, -{ { 298, 299, 649 }, 1, 4 }, -{ { 298, 649, 648 }, 1, 2 }, -{ { 299, 300, 650 }, 1, 4 }, -{ { 299, 650, 649 }, 1, 2 }, -{ { 300, 301, 651 }, 1, 4 }, -{ { 300, 651, 650 }, 1, 2 }, -{ { 301, 302, 652 }, 1, 4 }, -{ { 301, 652, 651 }, 1, 2 }, -{ { 302, 303, 653 }, 1, 4 }, -{ { 302, 653, 652 }, 1, 2 }, -{ { 303, 304, 654 }, 1, 4 }, -{ { 303, 654, 653 }, 1, 2 }, -{ { 304, 305, 655 }, 1, 4 }, -{ { 304, 655, 654 }, 1, 2 }, -{ { 305, 306, 656 }, 1, 4 }, -{ { 305, 656, 655 }, 1, 2 }, -{ { 306, 307, 657 }, 1, 4 }, -{ { 306, 657, 656 }, 1, 2 }, -{ { 307, 308, 658 }, 1, 4 }, -{ { 307, 658, 657 }, 1, 2 }, -{ { 308, 309, 659 }, 1, 4 }, -{ { 308, 659, 658 }, 1, 2 }, -{ { 309, 310, 660 }, 1, 4 }, -{ { 309, 660, 659 }, 1, 2 }, -{ { 310, 289, 639 }, 1, 4 }, -{ { 310, 639, 660 }, 1, 2 }, -{ { 311, 312, 662 }, 1, 4 }, -{ { 311, 662, 661 }, 1, 2 }, -{ { 312, 313, 663 }, 1, 4 }, -{ { 312, 663, 662 }, 1, 2 }, -{ { 313, 314, 664 }, 1, 4 }, -{ { 313, 664, 663 }, 1, 2 }, -{ { 314, 315, 665 }, 1, 4 }, -{ { 314, 665, 664 }, 1, 2 }, -{ { 315, 316, 666 }, 1, 4 }, -{ { 315, 666, 665 }, 1, 2 }, -{ { 316, 317, 667 }, 1, 4 }, -{ { 316, 667, 666 }, 1, 2 }, -{ { 317, 318, 668 }, 1, 4 }, -{ { 317, 668, 667 }, 1, 2 }, -{ { 318, 319, 669 }, 1, 4 }, -{ { 318, 669, 668 }, 1, 2 }, -{ { 319, 320, 670 }, 1, 4 }, -{ { 319, 670, 669 }, 1, 2 }, -{ { 320, 321, 671 }, 1, 4 }, -{ { 320, 671, 670 }, 1, 2 }, -{ { 321, 322, 672 }, 1, 4 }, -{ { 321, 672, 671 }, 1, 2 }, -{ { 322, 323, 673 }, 1, 4 }, -{ { 322, 673, 672 }, 1, 2 }, -{ { 323, 324, 674 }, 1, 4 }, -{ { 323, 674, 673 }, 1, 2 }, -{ { 324, 325, 675 }, 1, 4 }, -{ { 324, 675, 674 }, 1, 2 }, -{ { 325, 326, 676 }, 1, 4 }, -{ { 325, 676, 675 }, 1, 2 }, -{ { 326, 327, 677 }, 1, 4 }, -{ { 326, 677, 676 }, 1, 2 }, -{ { 327, 328, 678 }, 1, 4 }, -{ { 327, 678, 677 }, 1, 2 }, -{ { 328, 329, 679 }, 1, 4 }, -{ { 328, 679, 678 }, 1, 2 }, -{ { 329, 330, 680 }, 1, 4 }, -{ { 329, 680, 679 }, 1, 2 }, -{ { 330, 331, 681 }, 1, 4 }, -{ { 330, 681, 680 }, 1, 2 }, -{ { 331, 332, 681 }, 1, 4 }, -{ { 332, 682, 681 }, 1, 2 }, -{ { 332, 333, 683 }, 1, 4 }, -{ { 332, 683, 682 }, 1, 2 }, -{ { 333, 334, 683 }, 1, 4 }, -{ { 334, 335, 684 }, 1, 4 }, -{ { 334, 684, 683 }, 1, 2 }, -{ { 335, 311, 661 }, 1, 4 }, -{ { 335, 661, 684 }, 1, 2 }, -{ { 336, 337, 686 }, 1, 4 }, -{ { 336, 686, 685 }, 1, 2 }, -{ { 337, 338, 687 }, 1, 4 }, -{ { 337, 687, 686 }, 1, 2 }, -{ { 338, 339, 688 }, 1, 4 }, -{ { 338, 688, 687 }, 1, 2 }, -{ { 339, 336, 685 }, 1, 4 }, -{ { 339, 685, 688 }, 1, 2 }, -{ { 340, 341, 690 }, 1, 4 }, -{ { 340, 690, 689 }, 1, 2 }, -{ { 341, 342, 691 }, 1, 4 }, -{ { 341, 691, 690 }, 1, 2 }, -{ { 342, 343, 692 }, 1, 4 }, -{ { 342, 692, 691 }, 1, 2 }, -{ { 343, 344, 693 }, 1, 4 }, -{ { 343, 693, 692 }, 1, 2 }, -{ { 344, 345, 694 }, 1, 4 }, -{ { 344, 694, 693 }, 1, 2 }, -{ { 345, 346, 695 }, 1, 4 }, -{ { 345, 695, 694 }, 1, 2 }, -{ { 346, 347, 696 }, 1, 4 }, -{ { 346, 696, 695 }, 1, 2 }, -{ { 347, 340, 689 }, 1, 4 }, -{ { 347, 689, 696 }, 1, 2 }, -{ { 706, 698, 697 }, 1, 2 }, -{ { 705, 706, 697 }, 1, 4 }, -{ { 707, 699, 698 }, 1, 2 }, -{ { 706, 707, 698 }, 1, 4 }, -{ { 708, 700, 699 }, 1, 2 }, -{ { 707, 708, 699 }, 1, 4 }, -{ { 709, 701, 700 }, 1, 2 }, -{ { 708, 709, 700 }, 1, 4 }, -{ { 710, 702, 701 }, 1, 2 }, -{ { 709, 710, 701 }, 1, 4 }, -{ { 711, 703, 702 }, 1, 2 }, -{ { 710, 711, 702 }, 1, 4 }, -{ { 712, 704, 703 }, 1, 2 }, -{ { 711, 712, 703 }, 1, 4 }, -{ { 705, 697, 704 }, 1, 2 }, -{ { 712, 705, 704 }, 1, 4 }, -{ { 722, 714, 713 }, 1, 2 }, -{ { 721, 722, 713 }, 1, 4 }, -{ { 723, 715, 714 }, 1, 2 }, -{ { 722, 723, 714 }, 1, 4 }, -{ { 724, 716, 715 }, 1, 2 }, -{ { 723, 724, 715 }, 1, 4 }, -{ { 725, 717, 716 }, 1, 2 }, -{ { 724, 725, 716 }, 1, 4 }, -{ { 726, 718, 717 }, 1, 2 }, -{ { 725, 726, 717 }, 1, 4 }, -{ { 727, 719, 718 }, 1, 2 }, -{ { 726, 727, 718 }, 1, 4 }, -{ { 728, 720, 719 }, 1, 2 }, -{ { 727, 728, 719 }, 1, 4 }, -{ { 721, 713, 720 }, 1, 2 }, -{ { 728, 721, 720 }, 1, 4 }, -{ { 729, 730, 750 }, 1, 4 }, -{ { 729, 750, 749 }, 1, 2 }, -{ { 730, 731, 751 }, 1, 4 }, -{ { 730, 751, 750 }, 1, 2 }, -{ { 731, 732, 752 }, 1, 4 }, -{ { 731, 752, 751 }, 1, 2 }, -{ { 732, 733, 753 }, 1, 4 }, -{ { 732, 753, 752 }, 1, 2 }, -{ { 733, 734, 754 }, 1, 4 }, -{ { 733, 754, 753 }, 1, 2 }, -{ { 734, 735, 755 }, 1, 4 }, -{ { 734, 755, 754 }, 1, 2 }, -{ { 735, 736, 756 }, 1, 4 }, -{ { 735, 756, 755 }, 1, 2 }, -{ { 736, 737, 757 }, 1, 4 }, -{ { 736, 757, 756 }, 1, 2 }, -{ { 737, 738, 758 }, 1, 4 }, -{ { 737, 758, 757 }, 1, 2 }, -{ { 738, 739, 759 }, 1, 4 }, -{ { 738, 759, 758 }, 1, 2 }, -{ { 739, 740, 760 }, 1, 4 }, -{ { 739, 760, 759 }, 1, 2 }, -{ { 740, 741, 761 }, 1, 4 }, -{ { 740, 761, 760 }, 1, 2 }, -{ { 741, 742, 762 }, 1, 4 }, -{ { 741, 762, 761 }, 1, 2 }, -{ { 742, 743, 763 }, 1, 4 }, -{ { 742, 763, 762 }, 1, 2 }, -{ { 743, 744, 764 }, 1, 4 }, -{ { 743, 764, 763 }, 1, 2 }, -{ { 744, 745, 765 }, 1, 4 }, -{ { 744, 765, 764 }, 1, 2 }, -{ { 745, 746, 766 }, 1, 4 }, -{ { 745, 766, 765 }, 1, 2 }, -{ { 746, 747, 767 }, 1, 4 }, -{ { 746, 767, 766 }, 1, 2 }, -{ { 747, 748, 768 }, 1, 4 }, -{ { 747, 768, 767 }, 1, 2 }, -{ { 748, 729, 749 }, 1, 4 }, -{ { 748, 749, 768 }, 1, 2 }, -{ { 769, 770, 800 }, 1, 4 }, -{ { 769, 800, 799 }, 1, 2 }, -{ { 770, 771, 801 }, 1, 4 }, -{ { 770, 801, 800 }, 1, 2 }, -{ { 771, 772, 802 }, 1, 4 }, -{ { 771, 802, 801 }, 1, 2 }, -{ { 772, 773, 803 }, 1, 4 }, -{ { 772, 803, 802 }, 1, 2 }, -{ { 773, 774, 804 }, 1, 4 }, -{ { 773, 804, 803 }, 1, 2 }, -{ { 774, 775, 805 }, 1, 4 }, -{ { 774, 805, 804 }, 1, 2 }, -{ { 775, 776, 806 }, 1, 4 }, -{ { 775, 806, 805 }, 1, 2 }, -{ { 776, 777, 807 }, 1, 4 }, -{ { 776, 807, 806 }, 1, 2 }, -{ { 777, 778, 808 }, 1, 4 }, -{ { 777, 808, 807 }, 1, 2 }, -{ { 778, 779, 809 }, 1, 4 }, -{ { 778, 809, 808 }, 1, 2 }, -{ { 779, 780, 810 }, 1, 4 }, -{ { 779, 810, 809 }, 1, 2 }, -{ { 780, 781, 811 }, 1, 4 }, -{ { 780, 811, 810 }, 1, 2 }, -{ { 781, 782, 812 }, 1, 4 }, -{ { 781, 812, 811 }, 1, 2 }, -{ { 782, 783, 813 }, 1, 4 }, -{ { 782, 813, 812 }, 1, 2 }, -{ { 783, 784, 814 }, 1, 4 }, -{ { 783, 814, 813 }, 1, 2 }, -{ { 784, 785, 815 }, 1, 4 }, -{ { 784, 815, 814 }, 1, 2 }, -{ { 785, 786, 816 }, 1, 4 }, -{ { 785, 816, 815 }, 1, 2 }, -{ { 786, 787, 817 }, 1, 4 }, -{ { 786, 817, 816 }, 1, 2 }, -{ { 787, 788, 818 }, 1, 4 }, -{ { 787, 818, 817 }, 1, 2 }, -{ { 788, 789, 819 }, 1, 4 }, -{ { 788, 819, 818 }, 1, 2 }, -{ { 789, 790, 820 }, 1, 4 }, -{ { 789, 820, 819 }, 1, 2 }, -{ { 790, 791, 821 }, 1, 4 }, -{ { 790, 821, 820 }, 1, 2 }, -{ { 791, 769, 799 }, 1, 4 }, -{ { 791, 799, 821 }, 1, 2 }, -{ { 792, 793, 823 }, 1, 4 }, -{ { 792, 823, 822 }, 1, 2 }, -{ { 793, 794, 824 }, 1, 4 }, -{ { 793, 824, 823 }, 1, 2 }, -{ { 794, 795, 825 }, 1, 4 }, -{ { 794, 825, 824 }, 1, 2 }, -{ { 795, 796, 826 }, 1, 4 }, -{ { 795, 826, 825 }, 1, 2 }, -{ { 796, 797, 827 }, 1, 4 }, -{ { 796, 827, 826 }, 1, 2 }, -{ { 797, 798, 828 }, 1, 4 }, -{ { 797, 828, 827 }, 1, 2 }, -{ { 798, 792, 822 }, 1, 4 }, -{ { 798, 822, 828 }, 1, 2 }, -{ { 829, 830, 846 }, 0, 6 }, -{ { 829, 846, 845 }, 0, 3 }, -{ { 831, 832, 848 }, 0, 6 }, -{ { 831, 848, 847 }, 0, 3 }, -{ { 833, 834, 850 }, 0, 6 }, -{ { 833, 850, 849 }, 0, 3 }, -{ { 836, 835, 851 }, 0, 6 }, -{ { 836, 851, 852 }, 0, 3 }, -{ { 837, 838, 854 }, 1, 6 }, -{ { 837, 854, 853 }, 1, 3 }, -{ { 839, 840, 856 }, 1, 6 }, -{ { 839, 856, 855 }, 1, 3 }, -{ { 841, 842, 858 }, 1, 6 }, -{ { 841, 858, 857 }, 1, 3 }, -{ { 843, 844, 860 }, 1, 6 }, -{ { 843, 860, 859 }, 1, 3 }, -{ { 919, 918, 917 }, 0, 6 }, -{ { 881, 880, 879 }, 0, 6 }, -{ { 920, 919, 917 }, 0, 4 }, -{ { 881, 879, 878 }, 0, 2 }, -{ { 882, 881, 878 }, 0, 4 }, -{ { 882, 878, 877 }, 0, 2 }, -{ { 883, 882, 877 }, 0, 4 }, -{ { 883, 877, 876 }, 0, 2 }, -{ { 884, 883, 876 }, 0, 4 }, -{ { 920, 917, 916 }, 0, 2 }, -{ { 921, 920, 916 }, 0, 4 }, -{ { 921, 916, 915 }, 0, 2 }, -{ { 922, 921, 915 }, 0, 4 }, -{ { 922, 915, 914 }, 0, 2 }, -{ { 884, 876, 875 }, 0, 2 }, -{ { 885, 884, 875 }, 0, 4 }, -{ { 923, 922, 914 }, 0, 4 }, -{ { 923, 914, 913 }, 0, 2 }, -{ { 885, 875, 874 }, 0, 2 }, -{ { 886, 885, 874 }, 0, 4 }, -{ { 923, 913, 912 }, 0, 2 }, -{ { 924, 923, 912 }, 0, 4 }, -{ { 924, 912, 911 }, 0, 2 }, -{ { 925, 924, 911 }, 0, 4 }, -{ { 925, 911, 910 }, 0, 2 }, -{ { 926, 925, 910 }, 0, 4 }, -{ { 926, 910, 909 }, 0, 2 }, -{ { 927, 926, 909 }, 0, 4 }, -{ { 927, 909, 908 }, 0, 2 }, -{ { 928, 927, 908 }, 0, 4 }, -{ { 928, 908, 907 }, 0, 2 }, -{ { 929, 928, 907 }, 0, 4 }, -{ { 929, 907, 906 }, 0, 2 }, -{ { 929, 906, 905 }, 0, 2 }, -{ { 930, 929, 905 }, 0, 4 }, -{ { 930, 905, 904 }, 0, 2 }, -{ { 930, 904, 903 }, 0, 2 }, -{ { 931, 930, 903 }, 0, 4 }, -{ { 931, 903, 902 }, 0, 2 }, -{ { 931, 902, 901 }, 0, 2 }, -{ { 932, 931, 901 }, 0, 4 }, -{ { 932, 901, 900 }, 0, 2 }, -{ { 932, 900, 899 }, 0, 2 }, -{ { 933, 932, 899 }, 0, 4 }, -{ { 934, 933, 899 }, 0, 4 }, -{ { 887, 886, 874 }, 0, 4 }, -{ { 887, 874, 873 }, 0, 2 }, -{ { 888, 887, 873 }, 0, 4 }, -{ { 888, 873, 872 }, 0, 2 }, -{ { 889, 888, 872 }, 0, 4 }, -{ { 889, 872, 871 }, 0, 2 }, -{ { 890, 889, 871 }, 0, 4 }, -{ { 890, 871, 870 }, 0, 2 }, -{ { 891, 890, 870 }, 0, 4 }, -{ { 892, 891, 870 }, 0, 4 }, -{ { 892, 870, 869 }, 0, 2 }, -{ { 893, 892, 869 }, 0, 4 }, -{ { 894, 893, 869 }, 0, 4 }, -{ { 894, 869, 868 }, 0, 2 }, -{ { 895, 894, 868 }, 0, 4 }, -{ { 896, 895, 868 }, 0, 4 }, -{ { 896, 868, 867 }, 0, 2 }, -{ { 897, 896, 867 }, 0, 4 }, -{ { 898, 897, 867 }, 0, 4 }, -{ { 898, 867, 866 }, 0, 2 }, -{ { 899, 898, 866 }, 0, 4 }, -{ { 899, 866, 865 }, 0, 2 }, -{ { 934, 899, 865 }, 0, 0 }, -{ { 934, 865, 864 }, 0, 2 }, -{ { 935, 934, 864 }, 0, 4 }, -{ { 935, 864, 863 }, 0, 2 }, -{ { 861, 935, 863 }, 0, 4 }, -{ { 862, 861, 863 }, 0, 5 }, -{ { 959, 943, 942 }, 0, 2 }, -{ { 960, 959, 942 }, 0, 4 }, -{ { 960, 942, 941 }, 0, 2 }, -{ { 961, 960, 941 }, 0, 4 }, -{ { 961, 941, 940 }, 0, 2 }, -{ { 962, 961, 940 }, 0, 4 }, -{ { 962, 940, 939 }, 0, 2 }, -{ { 963, 962, 939 }, 0, 4 }, -{ { 963, 939, 938 }, 0, 2 }, -{ { 964, 963, 938 }, 0, 4 }, -{ { 964, 938, 937 }, 0, 2 }, -{ { 965, 964, 937 }, 0, 4 }, -{ { 937, 936, 951 }, 0, 4 }, -{ { 951, 965, 937 }, 0, 4 }, -{ { 951, 936, 950 }, 0, 2 }, -{ { 952, 951, 950 }, 0, 4 }, -{ { 952, 950, 949 }, 0, 2 }, -{ { 953, 952, 949 }, 0, 4 }, -{ { 944, 943, 959 }, 0, 4 }, -{ { 944, 959, 958 }, 0, 2 }, -{ { 945, 944, 958 }, 0, 4 }, -{ { 945, 958, 957 }, 0, 2 }, -{ { 946, 945, 957 }, 0, 4 }, -{ { 946, 957, 956 }, 0, 2 }, -{ { 947, 946, 956 }, 0, 4 }, -{ { 947, 956, 955 }, 0, 2 }, -{ { 948, 947, 955 }, 0, 4 }, -{ { 948, 955, 954 }, 0, 2 }, -{ { 949, 948, 954 }, 0, 4 }, -{ { 953, 949, 954 }, 0, 1 }, -{ { 984, 983, 982 }, 1, 6 }, -{ { 984, 982, 981 }, 1, 2 }, -{ { 984, 981, 980 }, 1, 2 }, -{ { 985, 984, 980 }, 1, 4 }, -{ { 985, 980, 979 }, 1, 2 }, -{ { 986, 985, 979 }, 1, 4 }, -{ { 987, 986, 979 }, 1, 4 }, -{ { 987, 979, 978 }, 1, 2 }, -{ { 988, 987, 978 }, 1, 4 }, -{ { 988, 978, 977 }, 1, 2 }, -{ { 989, 988, 977 }, 1, 4 }, -{ { 989, 977, 976 }, 1, 2 }, -{ { 990, 989, 976 }, 1, 4 }, -{ { 991, 990, 976 }, 1, 4 }, -{ { 992, 991, 976 }, 1, 4 }, -{ { 992, 976, 975 }, 1, 2 }, -{ { 993, 992, 975 }, 1, 4 }, -{ { 966, 1001, 1000 }, 1, 6 }, -{ { 967, 966, 1000 }, 1, 4 }, -{ { 1000, 999, 998 }, 1, 6 }, -{ { 1000, 998, 997 }, 1, 2 }, -{ { 967, 1000, 997 }, 1, 0 }, -{ { 970, 969, 968 }, 1, 6 }, -{ { 970, 968, 967 }, 1, 2 }, -{ { 970, 967, 997 }, 1, 0 }, -{ { 970, 997, 996 }, 1, 2 }, -{ { 971, 970, 996 }, 1, 4 }, -{ { 972, 971, 996 }, 1, 4 }, -{ { 973, 972, 996 }, 1, 4 }, -{ { 973, 996, 995 }, 1, 2 }, -{ { 974, 973, 995 }, 1, 4 }, -{ { 974, 995, 994 }, 1, 2 }, -{ { 975, 974, 994 }, 1, 4 }, -{ { 993, 975, 994 }, 1, 1 }, -{ { 1003, 1002, 1013 }, 1, 6 }, -{ { 1003, 1013, 1012 }, 1, 2 }, -{ { 1011, 1010, 1009 }, 1, 6 }, -{ { 1012, 1011, 1009 }, 1, 4 }, -{ { 1009, 1008, 1007 }, 1, 6 }, -{ { 1009, 1007, 1006 }, 1, 2 }, -{ { 1005, 1004, 1003 }, 1, 6 }, -{ { 1006, 1005, 1003 }, 1, 4 }, -{ { 1006, 1003, 1012 }, 1, 0 }, -{ { 1006, 1012, 1009 }, 1, 0 }, -{ { 1014, 1021, 1020 }, 1, 6 }, -{ { 1015, 1014, 1020 }, 1, 4 }, -{ { 1020, 1019, 1018 }, 1, 6 }, -{ { 1020, 1018, 1017 }, 1, 2 }, -{ { 1015, 1020, 1017 }, 1, 0 }, -{ { 1016, 1015, 1017 }, 1, 5 }, -{ { 1022, 1031, 1030 }, 1, 6 }, -{ { 1023, 1022, 1030 }, 1, 4 }, -{ { 1024, 1023, 1030 }, 1, 4 }, -{ { 1024, 1030, 1029 }, 1, 2 }, -{ { 1024, 1029, 1028 }, 1, 2 }, -{ { 1025, 1024, 1028 }, 1, 4 }, -{ { 1026, 1025, 1028 }, 1, 4 }, -{ { 1026, 1028, 1027 }, 1, 3 }, -{ { 1032, 1035, 1034 }, 1, 6 }, -{ { 1033, 1032, 1034 }, 1, 5 }, -{ { 1036, 1054, 1053 }, 1, 6 }, -{ { 1037, 1036, 1053 }, 1, 4 }, -{ { 1053, 1052, 1039 }, 1, 4 }, -{ { 1048, 1047, 1046 }, 1, 6 }, -{ { 1048, 1046, 1045 }, 1, 2 }, -{ { 1048, 1045, 1044 }, 1, 2 }, -{ { 1049, 1048, 1044 }, 1, 4 }, -{ { 1049, 1044, 1043 }, 1, 2 }, -{ { 1050, 1049, 1043 }, 1, 4 }, -{ { 1050, 1043, 1042 }, 1, 2 }, -{ { 1050, 1042, 1041 }, 1, 2 }, -{ { 1050, 1041, 1040 }, 1, 2 }, -{ { 1051, 1050, 1040 }, 1, 4 }, -{ { 1051, 1040, 1039 }, 1, 2 }, -{ { 1039, 1038, 1037 }, 1, 6 }, -{ { 1039, 1037, 1053 }, 1, 0 }, -{ { 1051, 1039, 1052 }, 1, 1 }, -{ { 1063, 1062, 1078 }, 1, 4 }, -{ { 1064, 1063, 1078 }, 1, 4 }, -{ { 1064, 1078, 1084 }, 1, 2 }, -{ { 1056, 1055, 1077 }, 1, 6 }, -{ { 1065, 1064, 1084 }, 1, 4 }, -{ { 1065, 1084, 1083 }, 1, 2 }, -{ { 1066, 1065, 1083 }, 1, 4 }, -{ { 1066, 1083, 1082 }, 1, 2 }, -{ { 1067, 1066, 1082 }, 1, 4 }, -{ { 1068, 1067, 1082 }, 1, 4 }, -{ { 1069, 1068, 1082 }, 1, 4 }, -{ { 1069, 1082, 1081 }, 1, 2 }, -{ { 1070, 1069, 1081 }, 1, 4 }, -{ { 1070, 1081, 1080 }, 1, 2 }, -{ { 1071, 1070, 1080 }, 1, 4 }, -{ { 1071, 1080, 1079 }, 1, 2 }, -{ { 1072, 1071, 1079 }, 1, 4 }, -{ { 1073, 1072, 1079 }, 1, 4 }, -{ { 1073, 1079, 1078 }, 1, 2 }, -{ { 1073, 1078, 1062 }, 1, 0 }, -{ { 1073, 1062, 1061 }, 1, 2 }, -{ { 1073, 1061, 1060 }, 1, 2 }, -{ { 1074, 1073, 1060 }, 1, 4 }, -{ { 1074, 1060, 1059 }, 1, 2 }, -{ { 1075, 1074, 1059 }, 1, 4 }, -{ { 1075, 1059, 1058 }, 1, 2 }, -{ { 1076, 1075, 1058 }, 1, 4 }, -{ { 1076, 1058, 1057 }, 1, 2 }, -{ { 1076, 1057, 1056 }, 1, 2 }, -{ { 1077, 1076, 1056 }, 1, 4 }, -{ { 1085, 1102, 1101 }, 1, 6 }, -{ { 1086, 1085, 1101 }, 1, 4 }, -{ { 1086, 1101, 1100 }, 1, 2 }, -{ { 1100, 1099, 1088 }, 1, 4 }, -{ { 1088, 1087, 1086 }, 1, 6 }, -{ { 1088, 1086, 1100 }, 1, 0 }, -{ { 1088, 1099, 1098 }, 1, 2 }, -{ { 1089, 1088, 1098 }, 1, 4 }, -{ { 1089, 1098, 1097 }, 1, 2 }, -{ { 1090, 1089, 1097 }, 1, 4 }, -{ { 1096, 1095, 1094 }, 1, 6 }, -{ { 1090, 1097, 1096 }, 1, 2 }, -{ { 1091, 1090, 1096 }, 1, 4 }, -{ { 1096, 1094, 1093 }, 1, 2 }, -{ { 1092, 1091, 1096 }, 1, 4 }, -{ { 1093, 1092, 1096 }, 1, 4 }, -{ { 1133, 1149, 1148 }, 1, 2 }, -{ { 1107, 1106, 1133 }, 1, 4 }, -{ { 1108, 1107, 1133 }, 1, 4 }, -{ { 1109, 1108, 1133 }, 1, 4 }, -{ { 1110, 1109, 1133 }, 1, 4 }, -{ { 1148, 1110, 1133 }, 1, 0 }, -{ { 1104, 1103, 1137 }, 1, 6 }, -{ { 1104, 1137, 1136 }, 1, 2 }, -{ { 1126, 1125, 1124 }, 1, 6 }, -{ { 1127, 1126, 1124 }, 1, 4 }, -{ { 1127, 1124, 1123 }, 1, 2 }, -{ { 1128, 1127, 1123 }, 1, 4 }, -{ { 1128, 1123, 1122 }, 1, 2 }, -{ { 1129, 1128, 1122 }, 1, 4 }, -{ { 1130, 1129, 1122 }, 1, 4 }, -{ { 1130, 1122, 1121 }, 1, 2 }, -{ { 1131, 1130, 1121 }, 1, 4 }, -{ { 1132, 1131, 1121 }, 1, 4 }, -{ { 1132, 1121, 1120 }, 1, 2 }, -{ { 1132, 1120, 1119 }, 1, 2 }, -{ { 1132, 1119, 1139 }, 1, 0 }, -{ { 1104, 1136, 1135 }, 1, 2 }, -{ { 1110, 1148, 1147 }, 1, 2 }, -{ { 1111, 1110, 1147 }, 1, 4 }, -{ { 1111, 1147, 1146 }, 1, 2 }, -{ { 1105, 1104, 1135 }, 1, 4 }, -{ { 1112, 1111, 1146 }, 1, 4 }, -{ { 1112, 1146, 1145 }, 1, 2 }, -{ { 1113, 1112, 1145 }, 1, 4 }, -{ { 1113, 1145, 1144 }, 1, 2 }, -{ { 1114, 1113, 1144 }, 1, 4 }, -{ { 1115, 1114, 1144 }, 1, 4 }, -{ { 1115, 1144, 1143 }, 1, 2 }, -{ { 1116, 1115, 1143 }, 1, 4 }, -{ { 1117, 1116, 1143 }, 1, 4 }, -{ { 1117, 1143, 1142 }, 1, 2 }, -{ { 1117, 1142, 1141 }, 1, 2 }, -{ { 1118, 1117, 1141 }, 1, 4 }, -{ { 1118, 1141, 1140 }, 1, 2 }, -{ { 1119, 1118, 1140 }, 1, 4 }, -{ { 1119, 1140, 1139 }, 1, 2 }, -{ { 1132, 1139, 1138 }, 1, 2 }, -{ { 1138, 1133, 1132 }, 1, 2 }, -{ { 1133, 1138, 1149 }, 1, 2 }, -{ { 1134, 1133, 1106 }, 1, 4 }, -{ { 1135, 1134, 1106 }, 1, 4 }, -{ { 1135, 1106, 1105 }, 1, 2 }, -{ { 1163, 1165, 1164 }, 1, 3 }, -{ { 1165, 1163, 1162 }, 1, 2 }, -{ { 1151, 1150, 1171 }, 1, 6 }, -{ { 1165, 1162, 1161 }, 1, 2 }, -{ { 1166, 1165, 1161 }, 1, 4 }, -{ { 1166, 1161, 1160 }, 1, 2 }, -{ { 1167, 1166, 1160 }, 1, 4 }, -{ { 1167, 1160, 1159 }, 1, 2 }, -{ { 1168, 1167, 1159 }, 1, 4 }, -{ { 1168, 1159, 1158 }, 1, 2 }, -{ { 1169, 1168, 1158 }, 1, 4 }, -{ { 1169, 1158, 1157 }, 1, 2 }, -{ { 1170, 1169, 1157 }, 1, 4 }, -{ { 1170, 1157, 1156 }, 1, 2 }, -{ { 1170, 1156, 1155 }, 1, 2 }, -{ { 1170, 1155, 1154 }, 1, 2 }, -{ { 1170, 1154, 1153 }, 1, 2 }, -{ { 1171, 1170, 1153 }, 1, 4 }, -{ { 1171, 1153, 1152 }, 1, 2 }, -{ { 1171, 1152, 1151 }, 1, 2 }, -{ { 1191, 1190, 1189 }, 1, 6 }, -{ { 1191, 1189, 1188 }, 1, 2 }, -{ { 1188, 1187, 1186 }, 1, 6 }, -{ { 1188, 1186, 1185 }, 1, 2 }, -{ { 1184, 1183, 1182 }, 1, 6 }, -{ { 1173, 1172, 1196 }, 1, 6 }, -{ { 1174, 1173, 1196 }, 1, 4 }, -{ { 1175, 1174, 1196 }, 1, 4 }, -{ { 1175, 1196, 1195 }, 1, 2 }, -{ { 1176, 1175, 1195 }, 1, 4 }, -{ { 1176, 1195, 1194 }, 1, 2 }, -{ { 1177, 1176, 1194 }, 1, 4 }, -{ { 1178, 1177, 1194 }, 1, 4 }, -{ { 1179, 1178, 1194 }, 1, 4 }, -{ { 1179, 1194, 1193 }, 1, 2 }, -{ { 1180, 1179, 1193 }, 1, 4 }, -{ { 1181, 1180, 1193 }, 1, 4 }, -{ { 1181, 1193, 1192 }, 1, 2 }, -{ { 1182, 1181, 1192 }, 1, 4 }, -{ { 1182, 1192, 1191 }, 1, 2 }, -{ { 1182, 1191, 1188 }, 1, 0 }, -{ { 1182, 1188, 1185 }, 1, 0 }, -{ { 1182, 1185, 1184 }, 1, 2 }, -{ { 1197, 1200, 1199 }, 1, 6 }, -{ { 1198, 1197, 1199 }, 1, 5 }, -{ { 1203, 1202, 1201 }, 1, 6 }, -{ { 1204, 1203, 1201 }, 1, 4 }, -{ { 1208, 1207, 1206 }, 1, 6 }, -{ { 1208, 1206, 1205 }, 1, 2 }, -{ { 1201, 1208, 1205 }, 1, 4 }, -{ { 1204, 1201, 1205 }, 1, 1 }, -{ { 1265, 1266, 1267 }, 0, 6 }, -{ { 1227, 1228, 1229 }, 0, 6 }, -{ { 1265, 1267, 1268 }, 0, 2 }, -{ { 1226, 1227, 1229 }, 0, 4 }, -{ { 1226, 1229, 1230 }, 0, 2 }, -{ { 1225, 1226, 1230 }, 0, 4 }, -{ { 1225, 1230, 1231 }, 0, 2 }, -{ { 1224, 1225, 1231 }, 0, 4 }, -{ { 1224, 1231, 1232 }, 0, 2 }, -{ { 1264, 1265, 1268 }, 0, 4 }, -{ { 1264, 1268, 1269 }, 0, 2 }, -{ { 1263, 1264, 1269 }, 0, 4 }, -{ { 1263, 1269, 1270 }, 0, 2 }, -{ { 1262, 1263, 1270 }, 0, 4 }, -{ { 1223, 1224, 1232 }, 0, 4 }, -{ { 1223, 1232, 1233 }, 0, 2 }, -{ { 1262, 1270, 1271 }, 0, 2 }, -{ { 1261, 1262, 1271 }, 0, 4 }, -{ { 1222, 1223, 1233 }, 0, 4 }, -{ { 1222, 1233, 1234 }, 0, 2 }, -{ { 1260, 1261, 1271 }, 0, 4 }, -{ { 1260, 1271, 1272 }, 0, 2 }, -{ { 1259, 1260, 1272 }, 0, 4 }, -{ { 1259, 1272, 1273 }, 0, 2 }, -{ { 1258, 1259, 1273 }, 0, 4 }, -{ { 1258, 1273, 1274 }, 0, 2 }, -{ { 1257, 1258, 1274 }, 0, 4 }, -{ { 1257, 1274, 1275 }, 0, 2 }, -{ { 1256, 1257, 1275 }, 0, 4 }, -{ { 1256, 1275, 1276 }, 0, 2 }, -{ { 1255, 1256, 1276 }, 0, 4 }, -{ { 1255, 1276, 1277 }, 0, 2 }, -{ { 1254, 1255, 1277 }, 0, 4 }, -{ { 1253, 1254, 1277 }, 0, 4 }, -{ { 1253, 1277, 1278 }, 0, 2 }, -{ { 1252, 1253, 1278 }, 0, 4 }, -{ { 1251, 1252, 1278 }, 0, 4 }, -{ { 1251, 1278, 1279 }, 0, 2 }, -{ { 1250, 1251, 1279 }, 0, 4 }, -{ { 1249, 1250, 1279 }, 0, 4 }, -{ { 1249, 1279, 1280 }, 0, 2 }, -{ { 1248, 1249, 1280 }, 0, 4 }, -{ { 1247, 1248, 1280 }, 0, 4 }, -{ { 1247, 1280, 1281 }, 0, 2 }, -{ { 1247, 1281, 1282 }, 0, 2 }, -{ { 1222, 1234, 1235 }, 0, 2 }, -{ { 1221, 1222, 1235 }, 0, 4 }, -{ { 1221, 1235, 1236 }, 0, 2 }, -{ { 1220, 1221, 1236 }, 0, 4 }, -{ { 1220, 1236, 1237 }, 0, 2 }, -{ { 1219, 1220, 1237 }, 0, 4 }, -{ { 1219, 1237, 1238 }, 0, 2 }, -{ { 1218, 1219, 1238 }, 0, 4 }, -{ { 1218, 1238, 1239 }, 0, 2 }, -{ { 1218, 1239, 1240 }, 0, 2 }, -{ { 1217, 1218, 1240 }, 0, 4 }, -{ { 1217, 1240, 1241 }, 0, 2 }, -{ { 1217, 1241, 1242 }, 0, 2 }, -{ { 1216, 1217, 1242 }, 0, 4 }, -{ { 1216, 1242, 1243 }, 0, 2 }, -{ { 1216, 1243, 1244 }, 0, 2 }, -{ { 1215, 1216, 1244 }, 0, 4 }, -{ { 1215, 1244, 1245 }, 0, 2 }, -{ { 1215, 1245, 1246 }, 0, 2 }, -{ { 1214, 1215, 1246 }, 0, 4 }, -{ { 1214, 1246, 1247 }, 0, 2 }, -{ { 1213, 1214, 1247 }, 0, 4 }, -{ { 1213, 1247, 1282 }, 0, 0 }, -{ { 1212, 1213, 1282 }, 0, 4 }, -{ { 1212, 1282, 1283 }, 0, 2 }, -{ { 1211, 1212, 1283 }, 0, 4 }, -{ { 1211, 1283, 1209 }, 0, 2 }, -{ { 1211, 1209, 1210 }, 0, 3 }, -{ { 1290, 1291, 1307 }, 0, 4 }, -{ { 1290, 1307, 1308 }, 0, 2 }, -{ { 1289, 1290, 1308 }, 0, 4 }, -{ { 1289, 1308, 1309 }, 0, 2 }, -{ { 1288, 1289, 1309 }, 0, 4 }, -{ { 1288, 1309, 1310 }, 0, 2 }, -{ { 1287, 1288, 1310 }, 0, 4 }, -{ { 1287, 1310, 1311 }, 0, 2 }, -{ { 1286, 1287, 1311 }, 0, 4 }, -{ { 1286, 1311, 1312 }, 0, 2 }, -{ { 1285, 1286, 1312 }, 0, 4 }, -{ { 1285, 1312, 1313 }, 0, 2 }, -{ { 1284, 1285, 1313 }, 0, 4 }, -{ { 1284, 1313, 1299 }, 0, 2 }, -{ { 1298, 1284, 1299 }, 0, 4 }, -{ { 1298, 1299, 1300 }, 0, 2 }, -{ { 1297, 1298, 1300 }, 0, 4 }, -{ { 1297, 1300, 1301 }, 0, 2 }, -{ { 1307, 1291, 1292 }, 0, 2 }, -{ { 1306, 1307, 1292 }, 0, 4 }, -{ { 1306, 1292, 1293 }, 0, 2 }, -{ { 1305, 1306, 1293 }, 0, 4 }, -{ { 1305, 1293, 1294 }, 0, 2 }, -{ { 1304, 1305, 1294 }, 0, 4 }, -{ { 1304, 1294, 1295 }, 0, 2 }, -{ { 1303, 1304, 1295 }, 0, 4 }, -{ { 1303, 1295, 1296 }, 0, 2 }, -{ { 1302, 1303, 1296 }, 0, 4 }, -{ { 1302, 1296, 1297 }, 0, 2 }, -{ { 1302, 1297, 1301 }, 0, 1 }, -{ { 1330, 1331, 1332 }, 1, 6 }, -{ { 1329, 1330, 1332 }, 1, 4 }, -{ { 1328, 1329, 1332 }, 1, 4 }, -{ { 1328, 1332, 1333 }, 1, 2 }, -{ { 1327, 1328, 1333 }, 1, 4 }, -{ { 1327, 1333, 1334 }, 1, 2 }, -{ { 1327, 1334, 1335 }, 1, 2 }, -{ { 1326, 1327, 1335 }, 1, 4 }, -{ { 1326, 1335, 1336 }, 1, 2 }, -{ { 1325, 1326, 1336 }, 1, 4 }, -{ { 1325, 1336, 1337 }, 1, 2 }, -{ { 1324, 1325, 1337 }, 1, 4 }, -{ { 1324, 1337, 1338 }, 1, 2 }, -{ { 1324, 1338, 1339 }, 1, 2 }, -{ { 1324, 1339, 1340 }, 1, 2 }, -{ { 1323, 1324, 1340 }, 1, 4 }, -{ { 1323, 1340, 1341 }, 1, 2 }, -{ { 1348, 1349, 1314 }, 1, 6 }, -{ { 1348, 1314, 1315 }, 1, 2 }, -{ { 1346, 1347, 1348 }, 1, 6 }, -{ { 1345, 1346, 1348 }, 1, 4 }, -{ { 1345, 1348, 1315 }, 1, 0 }, -{ { 1316, 1317, 1318 }, 1, 6 }, -{ { 1315, 1316, 1318 }, 1, 4 }, -{ { 1345, 1315, 1318 }, 1, 0 }, -{ { 1344, 1345, 1318 }, 1, 4 }, -{ { 1344, 1318, 1319 }, 1, 2 }, -{ { 1344, 1319, 1320 }, 1, 2 }, -{ { 1344, 1320, 1321 }, 1, 2 }, -{ { 1343, 1344, 1321 }, 1, 4 }, -{ { 1343, 1321, 1322 }, 1, 2 }, -{ { 1342, 1343, 1322 }, 1, 4 }, -{ { 1342, 1322, 1323 }, 1, 2 }, -{ { 1342, 1323, 1341 }, 1, 1 }, -{ { 1361, 1350, 1351 }, 1, 6 }, -{ { 1360, 1361, 1351 }, 1, 4 }, -{ { 1357, 1358, 1359 }, 1, 6 }, -{ { 1357, 1359, 1360 }, 1, 2 }, -{ { 1355, 1356, 1357 }, 1, 6 }, -{ { 1354, 1355, 1357 }, 1, 4 }, -{ { 1351, 1352, 1353 }, 1, 6 }, -{ { 1351, 1353, 1354 }, 1, 2 }, -{ { 1360, 1351, 1354 }, 1, 0 }, -{ { 1357, 1360, 1354 }, 1, 0 }, -{ { 1368, 1369, 1362 }, 1, 6 }, -{ { 1368, 1362, 1363 }, 1, 2 }, -{ { 1366, 1367, 1368 }, 1, 6 }, -{ { 1365, 1366, 1368 }, 1, 4 }, -{ { 1365, 1368, 1363 }, 1, 0 }, -{ { 1365, 1363, 1364 }, 1, 3 }, -{ { 1378, 1379, 1370 }, 1, 6 }, -{ { 1378, 1370, 1371 }, 1, 2 }, -{ { 1378, 1371, 1372 }, 1, 2 }, -{ { 1377, 1378, 1372 }, 1, 4 }, -{ { 1376, 1377, 1372 }, 1, 4 }, -{ { 1376, 1372, 1373 }, 1, 2 }, -{ { 1376, 1373, 1374 }, 1, 2 }, -{ { 1375, 1376, 1374 }, 1, 5 }, -{ { 1382, 1383, 1380 }, 1, 6 }, -{ { 1382, 1380, 1381 }, 1, 3 }, -{ { 1401, 1402, 1384 }, 1, 6 }, -{ { 1401, 1384, 1385 }, 1, 2 }, -{ { 1400, 1401, 1385 }, 1, 4 }, -{ { 1394, 1395, 1396 }, 1, 6 }, -{ { 1393, 1394, 1396 }, 1, 4 }, -{ { 1392, 1393, 1396 }, 1, 4 }, -{ { 1392, 1396, 1397 }, 1, 2 }, -{ { 1391, 1392, 1397 }, 1, 4 }, -{ { 1391, 1397, 1398 }, 1, 2 }, -{ { 1390, 1391, 1398 }, 1, 4 }, -{ { 1389, 1390, 1398 }, 1, 4 }, -{ { 1388, 1389, 1398 }, 1, 4 }, -{ { 1388, 1398, 1399 }, 1, 2 }, -{ { 1387, 1388, 1399 }, 1, 4 }, -{ { 1385, 1386, 1387 }, 1, 6 }, -{ { 1400, 1385, 1387 }, 1, 0 }, -{ { 1400, 1387, 1399 }, 1, 1 }, -{ { 1426, 1410, 1411 }, 1, 2 }, -{ { 1426, 1411, 1412 }, 1, 2 }, -{ { 1432, 1426, 1412 }, 1, 4 }, -{ { 1425, 1403, 1404 }, 1, 6 }, -{ { 1432, 1412, 1413 }, 1, 2 }, -{ { 1431, 1432, 1413 }, 1, 4 }, -{ { 1431, 1413, 1414 }, 1, 2 }, -{ { 1430, 1431, 1414 }, 1, 4 }, -{ { 1430, 1414, 1415 }, 1, 2 }, -{ { 1430, 1415, 1416 }, 1, 2 }, -{ { 1430, 1416, 1417 }, 1, 2 }, -{ { 1429, 1430, 1417 }, 1, 4 }, -{ { 1429, 1417, 1418 }, 1, 2 }, -{ { 1428, 1429, 1418 }, 1, 4 }, -{ { 1428, 1418, 1419 }, 1, 2 }, -{ { 1427, 1428, 1419 }, 1, 4 }, -{ { 1427, 1419, 1420 }, 1, 2 }, -{ { 1427, 1420, 1421 }, 1, 2 }, -{ { 1426, 1427, 1421 }, 1, 4 }, -{ { 1410, 1426, 1421 }, 1, 0 }, -{ { 1409, 1410, 1421 }, 1, 4 }, -{ { 1408, 1409, 1421 }, 1, 4 }, -{ { 1408, 1421, 1422 }, 1, 2 }, -{ { 1407, 1408, 1422 }, 1, 4 }, -{ { 1407, 1422, 1423 }, 1, 2 }, -{ { 1406, 1407, 1423 }, 1, 4 }, -{ { 1406, 1423, 1424 }, 1, 2 }, -{ { 1405, 1406, 1424 }, 1, 4 }, -{ { 1404, 1405, 1424 }, 1, 4 }, -{ { 1404, 1424, 1425 }, 1, 2 }, -{ { 1449, 1450, 1433 }, 1, 6 }, -{ { 1449, 1433, 1434 }, 1, 2 }, -{ { 1448, 1449, 1434 }, 1, 4 }, -{ { 1447, 1448, 1434 }, 1, 4 }, -{ { 1434, 1435, 1436 }, 1, 6 }, -{ { 1447, 1434, 1436 }, 1, 0 }, -{ { 1446, 1447, 1436 }, 1, 4 }, -{ { 1446, 1436, 1437 }, 1, 2 }, -{ { 1445, 1446, 1437 }, 1, 4 }, -{ { 1445, 1437, 1438 }, 1, 2 }, -{ { 1442, 1443, 1444 }, 1, 6 }, -{ { 1444, 1445, 1438 }, 1, 4 }, -{ { 1444, 1438, 1439 }, 1, 2 }, -{ { 1441, 1442, 1444 }, 1, 4 }, -{ { 1444, 1439, 1440 }, 1, 2 }, -{ { 1444, 1440, 1441 }, 1, 2 }, -{ { 1499, 1486, 1454 }, 1, 4 }, -{ { 1499, 1454, 1455 }, 1, 2 }, -{ { 1499, 1455, 1456 }, 1, 2 }, -{ { 1499, 1456, 1457 }, 1, 2 }, -{ { 1499, 1457, 1458 }, 1, 2 }, -{ { 1498, 1499, 1458 }, 1, 4 }, -{ { 1485, 1451, 1452 }, 1, 6 }, -{ { 1472, 1473, 1474 }, 1, 6 }, -{ { 1484, 1485, 1452 }, 1, 4 }, -{ { 1472, 1474, 1475 }, 1, 2 }, -{ { 1471, 1472, 1475 }, 1, 4 }, -{ { 1471, 1475, 1476 }, 1, 2 }, -{ { 1470, 1471, 1476 }, 1, 4 }, -{ { 1470, 1476, 1477 }, 1, 2 }, -{ { 1470, 1477, 1478 }, 1, 2 }, -{ { 1469, 1470, 1478 }, 1, 4 }, -{ { 1469, 1478, 1479 }, 1, 2 }, -{ { 1469, 1479, 1480 }, 1, 2 }, -{ { 1468, 1469, 1480 }, 1, 4 }, -{ { 1468, 1480, 1481 }, 1, 2 }, -{ { 1467, 1468, 1481 }, 1, 4 }, -{ { 1483, 1484, 1452 }, 1, 4 }, -{ { 1497, 1498, 1458 }, 1, 4 }, -{ { 1497, 1458, 1459 }, 1, 2 }, -{ { 1496, 1497, 1459 }, 1, 4 }, -{ { 1483, 1452, 1453 }, 1, 2 }, -{ { 1496, 1459, 1460 }, 1, 2 }, -{ { 1495, 1496, 1460 }, 1, 4 }, -{ { 1495, 1460, 1461 }, 1, 2 }, -{ { 1494, 1495, 1461 }, 1, 4 }, -{ { 1494, 1461, 1462 }, 1, 2 }, -{ { 1494, 1462, 1463 }, 1, 2 }, -{ { 1493, 1494, 1463 }, 1, 4 }, -{ { 1493, 1463, 1464 }, 1, 2 }, -{ { 1492, 1493, 1464 }, 1, 4 }, -{ { 1492, 1464, 1465 }, 1, 2 }, -{ { 1491, 1492, 1465 }, 1, 4 }, -{ { 1490, 1491, 1465 }, 1, 4 }, -{ { 1489, 1490, 1465 }, 1, 4 }, -{ { 1489, 1465, 1466 }, 1, 2 }, -{ { 1488, 1489, 1466 }, 1, 4 }, -{ { 1488, 1466, 1467 }, 1, 2 }, -{ { 1487, 1488, 1467 }, 1, 4 }, -{ { 1487, 1467, 1481 }, 1, 0 }, -{ { 1486, 1487, 1481 }, 1, 4 }, -{ { 1454, 1486, 1481 }, 1, 0 }, -{ { 1454, 1481, 1482 }, 1, 2 }, -{ { 1454, 1482, 1483 }, 1, 2 }, -{ { 1453, 1454, 1483 }, 1, 4 }, -{ { 1513, 1514, 1515 }, 1, 6 }, -{ { 1512, 1513, 1515 }, 1, 4 }, -{ { 1521, 1500, 1501 }, 1, 6 }, -{ { 1511, 1512, 1515 }, 1, 4 }, -{ { 1511, 1515, 1516 }, 1, 2 }, -{ { 1510, 1511, 1516 }, 1, 4 }, -{ { 1510, 1516, 1517 }, 1, 2 }, -{ { 1509, 1510, 1517 }, 1, 4 }, -{ { 1509, 1517, 1518 }, 1, 2 }, -{ { 1508, 1509, 1518 }, 1, 4 }, -{ { 1508, 1518, 1519 }, 1, 2 }, -{ { 1507, 1508, 1519 }, 1, 4 }, -{ { 1507, 1519, 1520 }, 1, 2 }, -{ { 1506, 1507, 1520 }, 1, 4 }, -{ { 1505, 1506, 1520 }, 1, 4 }, -{ { 1504, 1505, 1520 }, 1, 4 }, -{ { 1503, 1504, 1520 }, 1, 4 }, -{ { 1503, 1520, 1521 }, 1, 2 }, -{ { 1502, 1503, 1521 }, 1, 4 }, -{ { 1501, 1502, 1521 }, 1, 4 }, -{ { 1539, 1540, 1541 }, 1, 6 }, -{ { 1538, 1539, 1541 }, 1, 4 }, -{ { 1536, 1537, 1538 }, 1, 6 }, -{ { 1535, 1536, 1538 }, 1, 4 }, -{ { 1532, 1533, 1534 }, 1, 6 }, -{ { 1545, 1522, 1523 }, 1, 6 }, -{ { 1545, 1523, 1524 }, 1, 2 }, -{ { 1545, 1524, 1525 }, 1, 2 }, -{ { 1544, 1545, 1525 }, 1, 4 }, -{ { 1544, 1525, 1526 }, 1, 2 }, -{ { 1544, 1526, 1527 }, 1, 2 }, -{ { 1544, 1527, 1528 }, 1, 2 }, -{ { 1544, 1528, 1529 }, 1, 2 }, -{ { 1543, 1544, 1529 }, 1, 4 }, -{ { 1543, 1529, 1530 }, 1, 2 }, -{ { 1543, 1530, 1531 }, 1, 2 }, -{ { 1542, 1543, 1531 }, 1, 4 }, -{ { 1542, 1531, 1532 }, 1, 2 }, -{ { 1541, 1542, 1532 }, 1, 4 }, -{ { 1538, 1541, 1532 }, 1, 0 }, -{ { 1535, 1538, 1532 }, 1, 0 }, -{ { 1534, 1535, 1532 }, 1, 4 }, -{ { 1548, 1549, 1546 }, 1, 6 }, -{ { 1548, 1546, 1547 }, 1, 3 }, -{ { 1550, 1551, 1552 }, 1, 6 }, -{ { 1550, 1552, 1553 }, 1, 2 }, -{ { 1555, 1556, 1557 }, 1, 6 }, -{ { 1554, 1555, 1557 }, 1, 4 }, -{ { 1554, 1557, 1550 }, 1, 2 }, -{ { 1554, 1550, 1553 }, 1, 1 }, -{ { 1575, 1558, 1559 }, 0, 2 }, -{ { 1575, 1559, 1560 }, 0, 2 }, -{ { 1575, 1560, 1561 }, 0, 2 }, -{ { 1575, 1561, 1562 }, 0, 2 }, -{ { 1575, 1562, 1563 }, 0, 2 }, -{ { 1575, 1563, 1564 }, 0, 2 }, -{ { 1575, 1564, 1565 }, 0, 2 }, -{ { 1575, 1565, 1558 }, 0, 2 }, -{ { 1574, 1567, 1566 }, 0, 2 }, -{ { 1574, 1568, 1567 }, 0, 2 }, -{ { 1574, 1569, 1568 }, 0, 2 }, -{ { 1574, 1570, 1569 }, 0, 2 }, -{ { 1574, 1571, 1570 }, 0, 2 }, -{ { 1574, 1572, 1571 }, 0, 2 }, -{ { 1574, 1573, 1572 }, 0, 2 }, -{ { 1574, 1566, 1573 }, 0, 2 }, -{ { 1593, 1576, 1577 }, 0, 2 }, -{ { 1593, 1577, 1578 }, 0, 2 }, -{ { 1593, 1578, 1579 }, 0, 2 }, -{ { 1593, 1579, 1580 }, 0, 2 }, -{ { 1593, 1580, 1581 }, 0, 2 }, -{ { 1593, 1581, 1582 }, 0, 2 }, -{ { 1593, 1582, 1583 }, 0, 2 }, -{ { 1593, 1583, 1576 }, 0, 2 }, -{ { 1592, 1585, 1584 }, 0, 2 }, -{ { 1592, 1586, 1585 }, 0, 2 }, -{ { 1592, 1587, 1586 }, 0, 2 }, -{ { 1592, 1588, 1587 }, 0, 2 }, -{ { 1592, 1589, 1588 }, 0, 2 }, -{ { 1592, 1590, 1589 }, 0, 2 }, -{ { 1592, 1591, 1590 }, 0, 2 }, -{ { 1592, 1584, 1591 }, 0, 2 }, -{ { 1610, 1609, 1608 }, 1, 6 }, -{ { 1610, 1608, 1607 }, 1, 2 }, -{ { 1607, 1606, 1605 }, 1, 6 }, -{ { 1607, 1605, 1604 }, 1, 2 }, -{ { 1603, 1602, 1601 }, 1, 6 }, -{ { 1595, 1594, 1613 }, 1, 6 }, -{ { 1596, 1595, 1613 }, 1, 4 }, -{ { 1596, 1613, 1612 }, 1, 2 }, -{ { 1597, 1596, 1612 }, 1, 4 }, -{ { 1598, 1597, 1612 }, 1, 4 }, -{ { 1599, 1598, 1612 }, 1, 4 }, -{ { 1599, 1612, 1611 }, 1, 2 }, -{ { 1600, 1599, 1611 }, 1, 4 }, -{ { 1601, 1600, 1611 }, 1, 4 }, -{ { 1601, 1611, 1610 }, 1, 2 }, -{ { 1601, 1610, 1607 }, 1, 0 }, -{ { 1601, 1607, 1604 }, 1, 0 }, -{ { 1601, 1604, 1603 }, 1, 2 }, -{ { 1628, 1629, 1630 }, 1, 6 }, -{ { 1627, 1628, 1630 }, 1, 4 }, -{ { 1625, 1626, 1627 }, 1, 6 }, -{ { 1624, 1625, 1627 }, 1, 4 }, -{ { 1621, 1622, 1623 }, 1, 6 }, -{ { 1633, 1614, 1615 }, 1, 6 }, -{ { 1633, 1615, 1616 }, 1, 2 }, -{ { 1632, 1633, 1616 }, 1, 4 }, -{ { 1632, 1616, 1617 }, 1, 2 }, -{ { 1632, 1617, 1618 }, 1, 2 }, -{ { 1632, 1618, 1619 }, 1, 2 }, -{ { 1631, 1632, 1619 }, 1, 4 }, -{ { 1631, 1619, 1620 }, 1, 2 }, -{ { 1631, 1620, 1621 }, 1, 2 }, -{ { 1630, 1631, 1621 }, 1, 4 }, -{ { 1627, 1630, 1621 }, 1, 0 }, -{ { 1624, 1627, 1621 }, 1, 0 }, -{ { 1623, 1624, 1621 }, 1, 4 }, -{ { 1642, 1641, 1657 }, 1, 4 }, -{ { 1643, 1642, 1657 }, 1, 4 }, -{ { 1643, 1657, 1663 }, 1, 2 }, -{ { 1635, 1634, 1656 }, 1, 6 }, -{ { 1644, 1643, 1663 }, 1, 4 }, -{ { 1644, 1663, 1662 }, 1, 2 }, -{ { 1645, 1644, 1662 }, 1, 4 }, -{ { 1645, 1662, 1661 }, 1, 2 }, -{ { 1646, 1645, 1661 }, 1, 4 }, -{ { 1647, 1646, 1661 }, 1, 4 }, -{ { 1648, 1647, 1661 }, 1, 4 }, -{ { 1648, 1661, 1660 }, 1, 2 }, -{ { 1649, 1648, 1660 }, 1, 4 }, -{ { 1649, 1660, 1659 }, 1, 2 }, -{ { 1650, 1649, 1659 }, 1, 4 }, -{ { 1650, 1659, 1658 }, 1, 2 }, -{ { 1651, 1650, 1658 }, 1, 4 }, -{ { 1652, 1651, 1658 }, 1, 4 }, -{ { 1652, 1658, 1657 }, 1, 2 }, -{ { 1652, 1657, 1641 }, 1, 0 }, -{ { 1652, 1641, 1640 }, 1, 2 }, -{ { 1652, 1640, 1639 }, 1, 2 }, -{ { 1653, 1652, 1639 }, 1, 4 }, -{ { 1653, 1639, 1638 }, 1, 2 }, -{ { 1654, 1653, 1638 }, 1, 4 }, -{ { 1654, 1638, 1637 }, 1, 2 }, -{ { 1655, 1654, 1637 }, 1, 4 }, -{ { 1655, 1637, 1636 }, 1, 2 }, -{ { 1655, 1636, 1635 }, 1, 2 }, -{ { 1656, 1655, 1635 }, 1, 4 }, -{ { 1687, 1671, 1672 }, 1, 2 }, -{ { 1687, 1672, 1673 }, 1, 2 }, -{ { 1693, 1687, 1673 }, 1, 4 }, -{ { 1686, 1664, 1665 }, 1, 6 }, -{ { 1693, 1673, 1674 }, 1, 2 }, -{ { 1692, 1693, 1674 }, 1, 4 }, -{ { 1692, 1674, 1675 }, 1, 2 }, -{ { 1691, 1692, 1675 }, 1, 4 }, -{ { 1691, 1675, 1676 }, 1, 2 }, -{ { 1691, 1676, 1677 }, 1, 2 }, -{ { 1691, 1677, 1678 }, 1, 2 }, -{ { 1690, 1691, 1678 }, 1, 4 }, -{ { 1690, 1678, 1679 }, 1, 2 }, -{ { 1689, 1690, 1679 }, 1, 4 }, -{ { 1689, 1679, 1680 }, 1, 2 }, -{ { 1688, 1689, 1680 }, 1, 4 }, -{ { 1688, 1680, 1681 }, 1, 2 }, -{ { 1688, 1681, 1682 }, 1, 2 }, -{ { 1687, 1688, 1682 }, 1, 4 }, -{ { 1671, 1687, 1682 }, 1, 0 }, -{ { 1670, 1671, 1682 }, 1, 4 }, -{ { 1669, 1670, 1682 }, 1, 4 }, -{ { 1669, 1682, 1683 }, 1, 2 }, -{ { 1668, 1669, 1683 }, 1, 4 }, -{ { 1668, 1683, 1684 }, 1, 2 }, -{ { 1667, 1668, 1684 }, 1, 4 }, -{ { 1667, 1684, 1685 }, 1, 2 }, -{ { 1666, 1667, 1685 }, 1, 4 }, -{ { 1665, 1666, 1685 }, 1, 4 }, -{ { 1665, 1685, 1686 }, 1, 2 } -}; - -static Vert vert_2[] = { -{ 171.834137f, -24.549576f, 161.761139f, 0.000000f, -1.000000f, 0.000000f, 167.258984f, 73.910260f }, -{ 385.145508f, -24.549585f, 281.452515f, 0.000000f, -1.000000f, 0.000000f, 214.952915f, 32.905991f }, -{ 336.557922f, -24.549572f, 123.839111f, 0.000000f, -1.000000f, 0.000000f, 204.089298f, 86.901717f }, -{ 526.168030f, -24.549603f, 127.394318f, 0.000000f, -1.000000f, 0.000000f, 246.483912f, 85.683761f }, -{ 387.515625f, -24.549564f, 39.699638f, 0.000000f, -1.000000f, 0.000000f, 215.482850f, 115.726499f }, -{ 540.388733f, -24.549561f, -4.147684f, 0.000000f, -1.000000f, 0.000000f, 249.663506f, 130.747868f }, -{ 398.181213f, -24.549526f, -46.809975f, 0.000000f, -1.000000f, 0.000000f, 217.867557f, 145.363252f }, -{ 559.349792f, -24.549519f, -146.355286f, 0.000000f, -1.000000f, 0.000000f, 253.902968f, 179.465822f }, -{ 342.483246f, -24.549520f, -126.209206f, 0.000000f, -1.000000f, 0.000000f, 205.414135f, 172.564107f }, -{ 451.509033f, -24.549507f, -264.861603f, 0.000000f, -1.000000f, 0.000000f, 229.791028f, 220.064120f }, -{ 233.457428f, -24.549515f, -184.277298f, 0.000000f, -1.000000f, 0.000000f, 181.037242f, 192.457275f }, -{ 252.418427f, -24.549503f, -317.004364f, 0.000000f, -1.000000f, 0.000000f, 185.276690f, 237.927362f }, -{ 87.694656f, -24.549515f, -183.092224f, 0.000000f, -1.000000f, 0.000000f, 148.446376f, 192.051290f }, -{ 27.256439f, -24.549471f, -341.890686f, 0.000000f, -1.000000f, 0.000000f, 134.933100f, 246.453003f }, -{ -72.288864f, -24.549515f, -178.351990f, 0.000000f, -1.000000f, 0.000000f, 112.675931f, 190.427367f }, -{ -154.058212f, -24.549473f, -325.299805f, 0.000000f, -1.000000f, 0.000000f, 94.393258f, 240.769243f }, -{ -220.421753f, -24.549486f, -172.426666f, 0.000000f, -1.000000f, 0.000000f, 79.555146f, 188.397447f }, -{ -346.038452f, -24.549469f, -367.962097f, 0.000000f, -1.000000f, 0.000000f, 51.468713f, 255.384635f }, -{ -318.781982f, -24.549488f, -146.355286f, 0.000000f, -1.000000f, 0.000000f, 57.562944f, 179.465822f }, -{ -466.914886f, -24.549479f, -242.345398f, 0.000000f, -1.000000f, 0.000000f, 24.442152f, 212.350443f }, -{ -383.960480f, -24.549492f, -96.582626f, 0.000000f, -1.000000f, 0.000000f, 42.989791f, 162.414540f }, -{ -552.239441f, -24.549492f, -101.322876f, 0.000000f, -1.000000f, 0.000000f, 5.364584f, 164.038467f }, -{ -421.882477f, -24.549498f, -27.848965f, 0.000000f, -1.000000f, 0.000000f, 34.510873f, 138.867531f }, -{ -559.349792f, -24.549505f, 49.180138f, 0.000000f, -1.000000f, 0.000000f, 3.774793f, 112.478631f }, -{ -412.401978f, -24.549538f, 71.696342f, 0.000000f, -1.000000f, 0.000000f, 36.630604f, 104.764969f }, -{ -510.762207f, -24.549515f, 174.796814f, 0.000000f, -1.000000f, 0.000000f, 14.638404f, 69.444450f }, -{ -348.408569f, -24.549543f, 140.429993f, 0.000000f, -1.000000f, 0.000000f, 50.938782f, 81.217951f }, -{ -411.216919f, -24.549555f, 264.861633f, 0.000000f, -1.000000f, 0.000000f, 36.895568f, 38.589741f }, -{ -258.343781f, -24.549547f, 187.832520f, 0.000000f, -1.000000f, 0.000000f, 71.076220f, 64.978641f }, -{ -254.788574f, -24.549561f, 338.335541f, 0.000000f, -1.000000f, 0.000000f, 71.871129f, 13.418798f }, -{ -133.912140f, -24.549547f, 193.757843f, 0.000000f, -1.000000f, 0.000000f, 98.897688f, 62.948714f }, -{ -43.847347f, -24.549593f, 367.962097f, 0.000000f, -1.000000f, 0.000000f, 119.035126f, 3.269238f }, -{ 37.922009f, -24.549547f, 183.092255f, 0.000000f, -1.000000f, 0.000000f, 137.317792f, 66.602568f }, -{ 168.278946f, -24.549589f, 315.819336f, 0.000000f, -1.000000f, 0.000000f, 166.464082f, 21.132490f } -}; - -static Face face_2[] = { -{ { 18, 17, 16 }, 2, 6 }, -{ { 8, 7, 6 }, 2, 6 }, -{ { 20, 19, 18 }, 2, 6 }, -{ { 22, 21, 20 }, 2, 6 }, -{ { 4, 3, 2 }, 2, 6 }, -{ { 10, 9, 8 }, 2, 6 }, -{ { 6, 5, 4 }, 2, 6 }, -{ { 26, 25, 24 }, 2, 6 }, -{ { 28, 27, 26 }, 2, 6 }, -{ { 24, 23, 22 }, 2, 6 }, -{ { 30, 29, 28 }, 2, 6 }, -{ { 12, 11, 10 }, 2, 6 }, -{ { 2, 1, 0 }, 2, 6 }, -{ { 0, 33, 32 }, 2, 6 }, -{ { 32, 31, 30 }, 2, 6 }, -{ { 14, 13, 12 }, 2, 6 }, -{ { 16, 15, 14 }, 2, 6 }, -{ { 4, 2, 0 }, 2, 0 }, -{ { 6, 4, 0 }, 2, 0 }, -{ { 8, 6, 0 }, 2, 0 }, -{ { 10, 8, 0 }, 2, 0 }, -{ { 12, 10, 0 }, 2, 0 }, -{ { 12, 0, 32 }, 2, 0 }, -{ { 14, 12, 32 }, 2, 0 }, -{ { 14, 32, 30 }, 2, 0 }, -{ { 16, 14, 30 }, 2, 0 }, -{ { 16, 30, 28 }, 2, 0 }, -{ { 16, 28, 26 }, 2, 0 }, -{ { 18, 16, 26 }, 2, 0 }, -{ { 20, 18, 26 }, 2, 0 }, -{ { 20, 26, 24 }, 2, 0 }, -{ { 20, 24, 22 }, 2, 0 } -}; - - -static Vert *vert[] = { -vert_0, -vert_1, -vert_2 -}; - -static int num_verts[] = { -68, -1694, -34 -}; - -static Face *face[] = { -face_0, -face_1, -face_2 -}; - -static int num_faces[] = { -100, -1606, -32 -}; - -static int total_num_frames = 75; - -static Matrix mat[][3] = -{ - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 22198.351563f, 1.000000f - }, - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.0000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -32.104950f, -4.568500f, 21760.089844f, 1.000000f - }, - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 22230.794922f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 21601.316406f, 1.000000f, - }, - { - 0.881000f, 0.187100f, 0.434500f, 0.000000f, - -0.178600f, -0.718900f, 0.671800f, 0.000000f, - -0.438000f, 0.669500f, 0.600000f, 0.000000f, - -40.679047f, 57.105099f, 21262.400391f, 1.000000f, - }, - { - 1.008900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.008900f, 0.000000f, - 0.000000f, 1.008900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 21633.759766f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 20863.496094f, 1.000000f, - }, - { - 0.759600f, 0.187100f, 0.622900f, 0.000000f, - -0.326300f, -0.718900f, 0.613800f, 0.000000f, - -0.562600f, 0.669500f, 0.485100f, 0.000000f, - -35.966850f, 57.105099f, 20524.212891f, 1.000000f, - }, - { - 1.017400f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.017400f, 0.000000f, - 0.000000f, 1.017400f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 20895.939453f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 20000.533203f, 1.000000f, - }, - { - 0.598200f, 0.187100f, 0.779200f, 0.000000f, - -0.457200f, -0.718900f, 0.523600f, 0.000000f, - -0.658100f, 0.669500f, 0.344500f, 0.000000f, - -31.281849f, 57.105099f, 19661.962891f, 1.000000f, - }, - { - 1.025100f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.025100f, 0.000000f, - 0.000000f, 1.025100f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 20032.976563f, 1.000000f, - }, - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 19028.070313f, 1.000000f, - }, - { - 0.406500f, 0.187100f, 0.894300f, 0.000000f, - -0.563800f, -0.718900f, 0.406600f, 0.000000f, - -0.719000f, 0.669500f, 0.186800f, 0.000000f, - -26.903849f, 57.105099f, 18691.248047f, 1.000000f, - }, - { - 1.031600f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.031600f, 0.000000f, - 0.000000f, 1.031600f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 19060.513672f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 17961.750000f, 1.000000f, - }, - { - 0.196700f, 0.187100f, 0.962400f, 0.000000f, - -0.640300f, -0.718900f, 0.270600f, 0.000000f, - -0.742500f, 0.669500f, 0.021700f, 0.000000f, - -23.081848f, 57.105099f, 17627.578125f, 1.000000f, - }, - { - 1.036500f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.036500f, 0.000000f, - 0.000000f, 1.036500f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 17994.193359f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 16817.216797f, 1.000000f, - }, - { - -0.018200f, 0.187100f, 0.982200f, 0.000000f, - -0.683900f, -0.718900f, 0.124300f, 0.000000f, - -0.729300f, 0.669500f, -0.141000f, 0.000000f, - -20.007050f, 57.105099f, 16486.400391f, 1.000000f, - }, - { - 1.039500f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.039500f, 0.000000f, - 0.000000f, 1.039500f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 16849.660156f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 15610.111328f, 1.000000f, - }, - { - -0.225800f, 0.187100f, 0.956000f, 0.000000f, - -0.694700f, -0.718900f, -0.023400f, 0.000000f, - -0.682900f, 0.669500f, -0.292300f, 0.000000f, - -17.795149f, 57.105099f, 15283.111328f, 1.000000f, - }, - { - 1.040000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.040000f, 0.000000f, - 0.000000f, 1.040000f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 15642.555664f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 14356.078125f, 1.000000f, - }, - { - -0.414200f, 0.187100f, 0.890800f, 0.000000f, - -0.675700f, -0.718900f, -0.163200f, 0.000000f, - -0.609900f, 0.669500f, -0.424100f, 0.000000f, - -16.485548f, 57.105099f, 14033.073242f, 1.000000f, - }, - { - 1.037200f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.037200f, 0.000000f, - 0.000000f, 1.037200f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 14388.522461f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 13070.758789f, 1.000000f, - }, - { - -0.577800f, 0.187100f, 0.794500f, 0.000000f, - -0.631700f, -0.718900f, -0.290100f, 0.000000f, - -0.516900f, 0.669500f, -0.533500f, 0.000000f, - -16.012848f, 57.105099f, 12751.730469f, 1.000000f, - }, - { - 1.031000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.031000f, 0.000000f, - 0.000000f, 1.031000f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 13103.203125f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 11769.795898f, 1.000000f, - }, - { - -0.715900f, 0.187100f, 0.672600f, 0.000000f, - -0.566400f, -0.718900f, -0.402900f, 0.000000f, - -0.408200f, 0.669500f, -0.620600f, 0.000000f, - -16.293648f, 57.105099f, 11454.640625f, 1.000000f, - }, - { - 1.022700f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.022700f, 0.000000f, - 0.000000f, 1.022700f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 11802.240234f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 10468.833984f, 1.000000f, - }, - { - -0.827900f, 0.187100f, 0.528800f, 0.000000f, - -0.482200f, -0.718900f, -0.500600f, 0.000000f, - -0.286500f, 0.669500f, -0.685400f, 0.000000f, - -17.278248f, 57.105099f, 10157.392578f, 1.000000f, - }, - { - 1.013400f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.013400f, 0.000000f, - 0.000000f, 1.013400f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 10501.278320f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 9183.513672f, 1.000000f, - }, - { - -0.912000f, 0.187100f, 0.365100f, 0.000000f, - -0.380400f, -0.718900f, -0.581800f, 0.000000f, - -0.153600f, 0.669500f, -0.726800f, 0.000000f, - -18.951847f, 57.105099f, 8875.574219f, 1.000000f, - }, - { - 1.004100f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004100f, 0.000000f, - 0.000000f, 1.004100f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 9215.958008f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 7929.480957f, 1.000000f, - }, - { - -0.965100f, 0.187100f, 0.183100f, 0.000000f, - -0.261500f, -0.718900f, -0.644000f, 0.000000f, - -0.011100f, 0.669500f, -0.742800f, 0.000000f, - -21.328348f, 57.105099f, 7624.758301f, 1.000000f, - }, - { - 0.996000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.996000f, 0.000000f, - 0.000000f, 0.996000f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 7961.925293f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 6722.375488f, 1.000000f, - }, - { - -0.982200f, 0.187100f, -0.015200f, 0.000000f, - -0.126300f, -0.718900f, -0.683500f, 0.000000f, - 0.138800f, 0.669500f, -0.729800f, 0.000000f, - -24.438049f, 57.105099f, 6420.471191f, 1.000000f, - }, - { - 0.990300f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.990300f, 0.000000f, - 0.000000f, 0.990300f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 6754.819824f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 5577.841309f, 1.000000f, - }, - { - -0.956000f, 0.187100f, -0.225800f, 0.000000f, - 0.023400f, -0.718900f, -0.694700f, 0.000000f, - 0.292300f, 0.669500f, -0.682900f, 0.000000f, - -28.305548f, 57.105099f, 5278.185547f, 1.000000f, - }, - { - 0.988000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.988000f, 0.000000f, - 0.000000f, 0.988000f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 5610.285645f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 4511.521484f, 1.000000f, - }, - { - -0.878200f, 0.187100f, -0.440200f, 0.000000f, - 0.183000f, -0.718900f, -0.670600f, 0.000000f, - 0.441900f, 0.669500f, -0.597100f, 0.000000f, - -32.898449f, 57.105099f, 4213.296387f, 1.000000f, - }, - { - 0.991400f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.991400f, 0.000000f, - 0.000000f, 0.991400f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 4543.965332f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 3539.058594f, 1.000000f, - }, - { - -0.743400f, 0.187100f, -0.642200f, 0.000000f, - 0.341900f, -0.718900f, -0.605200f, 0.000000f, - 0.574900f, 0.669500f, -0.470500f, 0.000000f, - -38.008450f, 57.105099f, 3241.149658f, 1.000000f, - }, - { - 1.000100f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000100f, 0.000000f, - 0.000000f, 1.000100f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 3571.502441f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 2676.096436f, 1.000000f, - }, - { - -0.553100f, 0.187100f, -0.811800f, 0.000000f, - 0.486100f, -0.718900f, -0.496800f, 0.000000f, - 0.676600f, 0.669500f, -0.306700f, 0.000000f, - -43.285347f, 57.105099f, 2377.160400f, 1.000000f, - }, - { - 1.011600f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.011600f, 0.000000f, - 0.000000f, 1.011600f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 2708.540283f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1938.275757f, 1.000000f, - }, - { - -0.316400f, 0.187100f, -0.930000f, 0.000000f, - 0.601100f, -0.718900f, -0.349100f, 0.000000f, - 0.733900f, 0.669500f, -0.115000f, 0.000000f, - -48.290947f, 57.105099f, 1636.875488f, 1.000000f, - }, - { - 1.023400f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.023400f, 0.000000f, - 0.000000f, 1.023400f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1970.719727f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.049500f, 0.187100f, -0.981100f, 0.000000f, - 0.673700f, -0.718900f, -0.171100f, 0.000000f, - 0.737300f, 0.669500f, 0.090500f, 0.000000f, - -52.555748f, 57.105099f, 1036.013794f, 1.000000f, - }, - { - 1.032800f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.032800f, 0.000000f, - 0.000000f, 1.032800f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.225800f, 0.187100f, -0.956000f, 0.000000f, - 0.694700f, -0.718900f, 0.023400f, 0.000000f, - 0.682900f, 0.669500f, 0.292300f, 0.000000f, - -55.649448f, 57.105099f, 1031.074585f, 1.000000f, - }, - { - 1.037400f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.037400f, 0.000000f, - 0.000000f, 1.037400f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.491100f, 0.187100f, -0.850800f, 0.000000f, - 0.658600f, -0.718900f, 0.222200f, 0.000000f, - 0.570100f, 0.669500f, 0.476300f, 0.000000f, - -57.270248f, 57.105099f, 1025.276733f, 1.000000f, - }, - { - 1.037900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.037900f, 0.000000f, - 0.000000f, 1.037900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.723400f, 0.187100f, -0.664600f, 0.000000f, - 0.561800f, -0.718900f, 0.409300f, 0.000000f, - 0.401200f, 0.669500f, 0.625200f, 0.000000f, - -57.111149f, 57.105099f, 1019.001221f, 1.000000f, - }, - { - 1.036800f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.036800f, 0.000000f, - 0.000000f, 1.036800f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.892600f, 0.187100f, -0.410300f, 0.000000f, - 0.409000f, -0.718900f, 0.562000f, 0.000000f, - 0.189800f, 0.669500f, 0.718200f, 0.000000f, - -55.002949f, 57.105099f, 1012.916504f, 1.000000f, - }, - { - 1.034500f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.034500f, 0.000000f, - 0.000000f, 1.034500f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.975800f, 0.187100f, -0.113200f, 0.000000f, - 0.214500f, -0.718900f, 0.661200f, 0.000000f, - -0.042300f, 0.669500f, 0.741600f, 0.000000f, - -51.079346f, 57.105099f, 1007.726318f, 1.000000f, - }, - { - 1.031200f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.031200f, 0.000000f, - 0.000000f, 1.031200f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.963000f, 0.187100f, 0.193800f, 0.000000f, - -0.000200f, -0.718900f, 0.695100f, 0.000000f, - -0.269300f, 0.669500f, 0.692300f, 0.000000f, - -45.765148f, 57.105099f, 1004.021790f, 1.000000f, - }, - { - 1.027000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.027000f, 0.000000f, - 0.000000f, 1.027000f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.859000f, 0.187100f, 0.476600f, 0.000000f, - -0.210900f, -0.718900f, 0.662300f, 0.000000f, - -0.466500f, 0.669500f, 0.578100f, 0.000000f, - -39.690350f, 57.105099f, 1002.157410f, 1.000000f, - }, - { - 1.022400f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.022400f, 0.000000f, - 0.000000f, 1.022400f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.681700f, 0.187100f, 0.707300f, 0.000000f, - -0.395700f, -0.718900f, 0.571500f, 0.000000f, - -0.615400f, 0.669500f, 0.416100f, 0.000000f, - -33.554749f, 57.105099f, 1002.187256f, 1.000000f, - }, - { - 1.017400f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.017400f, 0.000000f, - 0.000000f, 1.017400f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.458000f, 0.187100f, 0.869100f, 0.000000f, - -0.539100f, -0.718900f, 0.438800f, 0.000000f, - -0.706900f, 0.669500f, 0.228400f, 0.000000f, - -27.984049f, 57.105099f, 1003.876953f, 1.000000f, - }, - { - 1.012300f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.012300f, 0.000000f, - 0.000000f, 1.012300f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.217300f, 0.187100f, 0.958000f, 0.000000f, - -0.634300f, -0.718900f, 0.284200f, 0.000000f, - -0.741900f, 0.669500f, 0.037500f, 0.000000f, - -23.418049f, 57.105099f, 1006.781006f, 1.000000f, - }, - { - 1.007400f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.007400f, 0.000000f, - 0.000000f, 1.007400f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.011500f, 0.187100f, 0.982300f, 0.000000f, - -0.683000f, -0.718900f, 0.128900f, 0.000000f, - -0.730300f, 0.669500f, -0.136000f, 0.000000f, - -20.090649f, 57.105099f, 1010.310059f, 1.000000f, - }, - { - 1.001600f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.001600f, 0.000000f, - 0.000000f, 1.001600f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.214400f, 0.187100f, 0.958700f, 0.000000f, - -0.694900f, -0.718900f, -0.015100f, 0.000000f, - -0.686400f, 0.669500f, -0.284100f, 0.000000f, - -17.896347f, 57.105099f, 1014.017090f, 1.000000f, - }, - { - 0.994300f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.994300f, 0.000000f, - 0.000000f, 0.994300f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.391300f, 0.187100f, 0.901000f, 0.000000f, - -0.679600f, -0.718900f, -0.145900f, 0.000000f, - -0.620500f, 0.669500f, -0.408500f, 0.000000f, - -16.604847f, 57.105099f, 1017.721558f, 1.000000f, - }, - { - 0.986100f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.986100f, 0.000000f, - 0.000000f, 0.986100f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.545300f, 0.187100f, 0.817100f, 0.000000f, - -0.642900f, -0.718900f, -0.264400f, 0.000000f, - -0.538000f, 0.669500f, -0.512300f, 0.000000f, - -16.047749f, 57.105099f, 1021.376709f, 1.000000f, - }, - { - 0.977700f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.977700f, 0.000000f, - 0.000000f, 0.977700f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.679500f, 0.187100f, 0.709400f, 0.000000f, - -0.586800f, -0.718900f, -0.372600f, 0.000000f, - -0.440300f, 0.669500f, -0.598300f, 0.000000f, - -16.141548f, 57.105099f, 1025.005493f, 1.000000f, - }, - { - 0.969900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.969900f, 0.000000f, - 0.000000f, 0.969900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.795500f, 0.187100f, 0.576300f, 0.000000f, - -0.510700f, -0.718900f, -0.471600f, 0.000000f, - -0.326100f, 0.669500f, -0.667400f, 0.000000f, - -16.893848f, 57.105099f, 1028.650513f, 1.000000f, - }, - { - 0.963300f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.963300f, 0.000000f, - 0.000000f, 0.963300f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.890900f, 0.187100f, 0.413900f, 0.000000f, - -0.411300f, -0.718900f, -0.560400f, 0.000000f, - -0.192700f, 0.669500f, -0.717400f, 0.000000f, - -18.402348f, 57.105099f, 1032.325195f, 1.000000f, - }, - { - 0.958800f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.958800f, 0.000000f, - 0.000000f, 0.958800f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.958000f, 0.187100f, 0.217300f, 0.000000f, - -0.284200f, -0.718900f, -0.634300f, 0.000000f, - -0.037500f, 0.669500f, -0.741900f, 0.000000f, - -20.845448f, 57.105099f, 1035.962158f, 1.000000f, - }, - { - 0.957000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.957000f, 0.000000f, - 0.000000f, 0.957000f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.982300f, 0.187100f, -0.013000f, 0.000000f, - -0.127900f, -0.718900f, -0.683200f, 0.000000f, - 0.137100f, 0.669500f, -0.730100f, 0.000000f, - -24.399748f, 57.105099f, 1039.308228f, 1.000000f, - }, - { - 0.958800f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.958800f, 0.000000f, - 0.000000f, 0.958800f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.947100f, 0.187100f, -0.260700f, 0.000000f, - 0.048800f, -0.718900f, -0.693400f, 0.000000f, - 0.317100f, 0.669500f, -0.671800f, 0.000000f, - -29.005148f, 57.105099f, 1041.880859f, 1.000000f, - }, - { - 0.963900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.963900f, 0.000000f, - 0.000000f, 0.963900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.844400f, 0.187100f, -0.502000f, 0.000000f, - 0.230600f, -0.718900f, -0.655700f, 0.000000f, - 0.483600f, 0.669500f, -0.563900f, 0.000000f, - -34.367550f, 57.105099f, 1043.237793f, 1.000000f, - }, - { - 0.971800f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.971800f, 0.000000f, - 0.000000f, 0.971800f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.677300f, 0.187100f, -0.711500f, 0.000000f, - 0.399200f, -0.718900f, -0.569000f, 0.000000f, - 0.618000f, 0.669500f, -0.412200f, 0.000000f, - -40.015949f, 57.105099f, 1043.108643f, 1.000000f, - }, - { - 0.981700f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.981700f, 0.000000f, - 0.000000f, 0.981700f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.460700f, 0.187100f, -0.867600f, 0.000000f, - 0.537700f, -0.718900f, -0.440500f, 0.000000f, - 0.706200f, 0.669500f, -0.230600f, 0.000000f, - -45.402149f, 57.105099f, 1041.465820f, 1.000000f, - }, - { - 0.993000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.993000f, 0.000000f, - 0.000000f, 0.993000f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.217300f, 0.187100f, -0.958000f, 0.000000f, - 0.634300f, -0.718900f, -0.284200f, 0.000000f, - 0.741900f, 0.669500f, -0.037500f, 0.000000f, - -50.026550f, 57.105099f, 1038.534790f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.034900f, 0.187100f, -0.981700f, 0.000000f, - 0.685900f, -0.718900f, -0.112600f, 0.000000f, - 0.726800f, 0.669500f, 0.153400f, 0.000000f, - -53.643948f, 57.105099f, 1034.605103f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.284000f, 0.187100f, -0.940400f, 0.000000f, - 0.692000f, -0.718900f, 0.066000f, 0.000000f, - 0.663700f, 0.669500f, 0.333600f, 0.000000f, - -56.130249f, 57.105099f, 1029.897339f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.513800f, 0.187100f, -0.837300f, 0.000000f, - 0.652400f, -0.718900f, 0.239800f, 0.000000f, - 0.557100f, 0.669500f, 0.491400f, 0.000000f, - -57.333046f, 57.105099f, 1024.724487f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.709500f, 0.187100f, -0.679400f, 0.000000f, - 0.570200f, -0.718900f, 0.397500f, 0.000000f, - 0.414100f, 0.669500f, 0.616700f, 0.000000f, - -57.182648f, 57.105099f, 1019.425110f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.858600f, 0.187100f, -0.477300f, 0.000000f, - 0.450800f, -0.718900f, 0.529100f, 0.000000f, - 0.244200f, 0.669500f, 0.701600f, 0.000000f, - -55.694046f, 57.105099f, 1014.342407f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.951600f, 0.187100f, -0.244000f, 0.000000f, - 0.301900f, -0.718900f, 0.626100f, 0.000000f, - 0.058300f, 0.669500f, 0.740600f, 0.000000f, - -52.966049f, 57.105099f, 1009.804321f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.982300f, 0.187100f, 0.005300f, 0.000000f, - 0.133200f, -0.718900f, 0.682200f, 0.000000f, - -0.131400f, 0.669500f, 0.731100f, 0.000000f, - -49.174549f, 57.105099f, 1006.104492f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - } -}; - -static Gu3dfInfo text_3dfinfo = { - { /* header */ - 0x00000040, /* width */ - 0x00000040, /* height */ - GR_LOD_1, /* small_lod */ - GR_LOD_64, /* large_lod */ - GR_ASPECT_1x1, /* aspect_ratio */ - GR_TEXFMT_YIQ_422 /* format */ - }, - { /* table */ - { /* nccTable */ - { /* yRGB */ - 0x22, 0x22, 0x2b, 0x3c, - 0x44, 0x44, 0x66, 0x77, - 0x88, 0x99, 0xaa, 0xbb, - 0xcc, 0xdd, 0xee, 0xff - }, - { /* iRGB */ - { 0x01cf, 0x0027, 0x0023 }, - { 0x0001, 0x0000, 0x01ef }, - { 0x01e2, 0x000e, 0x0012 }, - { 0x01f4, 0x01ff, 0x01fc } - }, - { /* qRGB */ - { 0x01ee, 0x0019, 0x0010 }, - { 0x01e5, 0x0011, 0x0006 }, - { 0x01e8, 0x0009, 0x0008 }, - { 0x01eb, 0x0001, 0x0004 } - }, - { /* packed_data */ - 0x3c2b2222, 0x77664444, 0xbbaa9988, 0xffeeddcc, - 0x073c4e23, 0x000401ef, 0x07881c12, 0x07d3fffc, - 0x07b83210, 0x07942206, 0x07a01208, 0x07ac0204 - } - } - }, - NULL, /* data */ - 0x00001558 /* mem_required */ -}; - -unsigned char text_3dfinfo_image[] = { -0xc, -0xe, -0xe, -0xe, -0xc, -0x8, -0x3, -0x29, -0x9, -0x9, -0xa, -0xc, -0xb, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0x9, -0x8, -0x3, -0x9, -0x2e, -0xf, -0xe, -0xc, -0xa, -0x9, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x39, -0x0, -0x33, -0x32, -0x31, -0x30, -0x30, -0x40, -0x40, -0x40, -0x30, -0x30, -0x42, -0x32, -0x32, -0x21, -0x0, -0x22, -0x39, -0x22, -0x39, -0x39, -0x2, -0x2, -0x9, -0x9, -0xc, -0x2e, -0xe, -0xe, -0x2e, -0x9, -0x3, -0x29, -0x9, -0xa, -0x2e, -0x2e, -0xe, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0x9, -0x29, -0x3, -0x9, -0xd, -0xf, -0xe, -0x2e, -0xa, -0x9, -0x8, -0x3, -0x2, -0x2, -0x1, -0x22, -0x39, -0x22, -0x22, -0x22, -0x0, -0x21, -0x33, -0x32, -0x32, -0x31, -0x42, -0x42, -0x41, -0x42, -0x42, -0x31, -0x32, -0x31, -0x20, -0x20, -0x33, -0x21, -0x33, -0x21, -0x33, -0x0, -0x22, -0x1, -0x8, -0x29, -0x9, -0xc, -0xe, -0xe, -0xf, -0x2e, -0x8, -0x3, -0x8, -0x2d, -0x2e, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xc, -0x9, -0x8, -0x3, -0x9, -0xe, -0xf, -0xd, -0xb, -0xa, -0x9, -0x29, -0x2, -0x39, -0x22, -0x0, -0x21, -0x33, -0x21, -0x33, -0x21, -0x33, -0x33, -0x20, -0x20, -0x32, -0x20, -0x20, -0x20, -0x20, -0x32, -0x20, -0x32, -0x20, -0x32, -0x32, -0x20, -0x32, -0x32, -0x32, -0x31, -0x20, -0x33, -0x0, -0x2, -0x8, -0x9, -0x2e, -0xe, -0xe, -0xe, -0x9, -0x8, -0x3, -0x29, -0x9, -0xc, -0x2e, -0xd, -0xe, -0xe, -0xd, -0x2e, -0xc, -0x2b, -0x8, -0x29, -0x2a, -0x2e, -0xe, -0xe, -0x2e, -0xc, -0x9, -0x8, -0x2, -0x2, -0x39, -0x22, -0x0, -0x33, -0x21, -0x33, -0x0, -0x33, -0x0, -0x0, -0x33, -0x0, -0x0, -0x0, -0x0, -0x0, -0x22, -0x0, -0x0, -0x33, -0x20, -0x20, -0x32, -0x31, -0x32, -0x31, -0x42, -0x31, -0x32, -0x20, -0x0, -0x23, -0x9, -0x2e, -0xe, -0xe, -0x9, -0x29, -0x3, -0x29, -0x29, -0x9, -0x2a, -0x9, -0x9, -0x2a, -0x8, -0x9, -0x8, -0x29, -0x29, -0x8, -0x9, -0x2e, -0xe, -0xe, -0x2e, -0xa, -0x9, -0x8, -0x3, -0x23, -0x1, -0x22, -0x0, -0x0, -0x0, -0x33, -0x21, -0x21, -0x33, -0x0, -0x22, -0x39, -0x1, -0x2, -0x2, -0x3, -0x2, -0x29, -0x3, -0x2, -0x2, -0x39, -0x0, -0x33, -0x20, -0x31, -0x42, -0x41, -0x42, -0x42, -0x31, -0x20, -0x0, -0x2, -0xc, -0xe, -0xe, -0xa, -0x2, -0x29, -0x8, -0x9, -0x9, -0x9, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x29, -0x9, -0xc, -0xe, -0xf, -0xe, -0x2e, -0xc, -0x9, -0x29, -0x2, -0x2, -0x39, -0x22, -0x0, -0x0, -0x33, -0x0, -0x0, -0x0, -0x33, -0x0, -0x22, -0x39, -0x2, -0x2, -0x29, -0x8, -0x9, -0x9, -0x9, -0x9, -0x2a, -0x29, -0x2, -0x1, -0x0, -0x20, -0x32, -0x41, -0x42, -0x30, -0x42, -0x31, -0x20, -0x22, -0x2, -0x2e, -0xe, -0xe, -0xa, -0x8, -0x29, -0x29, -0x9, -0x9, -0x9, -0x9, -0x8, -0x29, -0x3, -0x29, -0x2, -0x2, -0x29, -0x3, -0x8, -0x9, -0x2e, -0xe, -0xe, -0xe, -0x2e, -0xc, -0x9, -0x8, -0x3, -0x2, -0x39, -0x22, -0x0, -0x0, -0x33, -0x21, -0x33, -0x0, -0x0, -0x22, -0x23, -0x2, -0x29, -0x29, -0x9, -0x9, -0x9, -0x9, -0x2a, -0x29, -0x2, -0x2, -0x39, -0x0, -0x33, -0x20, -0x20, -0x20, -0x33, -0x21, -0x22, -0x2, -0x29, -0x2e, -0xe, -0xe, -0xa, -0x29, -0x3, -0x29, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x29, -0x8, -0x2a, -0x8, -0x8, -0x29, -0x8, -0x3, -0x29, -0x29, -0x2d, -0x2e, -0xe, -0xe, -0x2e, -0xa, -0x9, -0x2, -0x1, -0x0, -0x33, -0x20, -0x32, -0x20, -0x20, -0x33, -0x0, -0x22, -0x23, -0x2, -0x29, -0x29, -0x8, -0x9, -0x2a, -0x29, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x39, -0x23, -0x1, -0x2, -0x2, -0x3, -0x8, -0xc, -0x2e, -0xe, -0xf, -0xc, -0x9, -0x2, -0x29, -0x8, -0x9, -0x9, -0x9, -0x9, -0xa, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x8, -0x3, -0x2, -0x8, -0xc, -0xe, -0xe, -0xe, -0xa, -0x9, -0x3, -0x1, -0x0, -0x33, -0x20, -0x32, -0x32, -0x20, -0x33, -0x0, -0x22, -0x39, -0x2, -0x2, -0x29, -0x29, -0x8, -0x8, -0x29, -0x29, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x29, -0x8, -0xc, -0xc, -0x2e, -0xe, -0xe, -0xe, -0x9, -0x29, -0x3, -0x29, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0xd, -0x2e, -0xe, -0x2e, -0xa, -0x9, -0x8, -0x29, -0x29, -0xa, -0xd, -0xe, -0xe, -0x2e, -0xa, -0x9, -0x3, -0x23, -0x0, -0x0, -0x32, -0x32, -0x31, -0x32, -0x32, -0x32, -0x20, -0x21, -0x0, -0x22, -0x22, -0x1, -0x23, -0x1, -0x23, -0x1, -0x23, -0x1, -0x1, -0x23, -0x1, -0x22, -0x1, -0x22, -0x1, -0x22, -0x2, -0x2, -0x3, -0x9, -0x9, -0xa, -0x2e, -0xe, -0xe, -0xe, -0xc, -0x8, -0x3, -0x9, -0xa, -0xd, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0x9, -0x2a, -0x8, -0x9, -0xe, -0xe, -0x2e, -0xc, -0x2b, -0x8, -0x29, -0x1, -0x22, -0x21, -0x20, -0x32, -0x31, -0x32, -0x31, -0x31, -0x32, -0x32, -0x20, -0x20, -0x33, -0x21, -0x33, -0x21, -0x21, -0x33, -0x21, -0x0, -0x33, -0x0, -0x0, -0x0, -0x0, -0x0, -0x22, -0x0, -0x22, -0x22, -0x39, -0x2, -0x29, -0x8, -0x9, -0xc, -0x2e, -0xe, -0xf, -0xd, -0x9, -0x3, -0x29, -0x9, -0xc, -0x2e, -0xe, -0xe, -0xe, -0xe, -0xe, -0xc, -0x9, -0x3, -0x8, -0x2e, -0xf, -0xe, -0x2e, -0xa, -0x9, -0x29, -0x2, -0x1, -0x0, -0x33, -0x20, -0x32, -0x31, -0x42, -0x31, -0x42, -0x31, -0x20, -0x20, -0x33, -0x21, -0x0, -0x0, -0x22, -0x22, -0x0, -0x22, -0x0, -0x0, -0x0, -0x33, -0x0, -0x33, -0x21, -0x20, -0x33, -0x20, -0x33, -0x0, -0x22, -0x2, -0x2, -0x29, -0x9, -0x2e, -0x2e, -0xe, -0xf, -0x2e, -0x9, -0x29, -0x3, -0x29, -0x9, -0x9, -0xa, -0xc, -0xa, -0x9, -0x29, -0x8, -0x29, -0xc, -0xe, -0xe, -0x2e, -0xc, -0x9, -0x8, -0x3, -0x1, -0x22, -0x21, -0x32, -0x31, -0x42, -0x42, -0x30, -0x30, -0x42, -0x31, -0x32, -0x33, -0x0, -0x39, -0x2, -0x2, -0x29, -0x3, -0x8, -0x2, -0x2, -0x39, -0x0, -0x33, -0x20, -0x31, -0x42, -0x42, -0x30, -0x42, -0x42, -0x31, -0x20, -0x22, -0x1, -0x3, -0x8, -0xc, -0xb, -0xe, -0xe, -0xf, -0x2e, -0x9, -0x8, -0x2, -0x29, -0x29, -0x29, -0x8, -0x8, -0x29, -0x2, -0x8, -0xc, -0xe, -0xf, -0xe, -0x2e, -0xa, -0x9, -0x29, -0x2, -0x1, -0x22, -0x33, -0x20, -0x31, -0x42, -0x30, -0x30, -0x30, -0x42, -0x31, -0x20, -0x0, -0x22, -0x2, -0x8, -0x29, -0x9, -0x9, -0x9, -0x8, -0x3, -0x1, -0x22, -0x33, -0x31, -0x42, -0x30, -0x30, -0x30, -0x30, -0x30, -0x42, -0x32, -0x21, -0x1, -0x2, -0x8, -0x9, -0xa, -0x2e, -0xe, -0xe, -0xe, -0x2e, -0x9, -0x3, -0x2, -0x29, -0x29, -0x29, -0x8, -0x3, -0x2, -0x9, -0xc, -0xe, -0xf, -0xd, -0x2e, -0xa, -0x9, -0x29, -0x2, -0x2, -0x39, -0x22, -0x21, -0x33, -0x33, -0x20, -0x20, -0x20, -0x33, -0x0, -0x22, -0x1, -0x2, -0x29, -0x2a, -0x9, -0x9, -0xa, -0x9, -0x9, -0x29, -0x2, -0x2, -0x22, -0x21, -0x32, -0x32, -0x31, -0x32, -0x31, -0x20, -0x20, -0x33, -0x0, -0x2, -0x2, -0x2, -0x29, -0x9, -0x9, -0xb, -0xd, -0xe, -0xe, -0x2e, -0x9, -0x3, -0x2, -0x29, -0x8, -0x3, -0x2, -0x29, -0x9, -0x2e, -0xf, -0xe, -0xe, -0xc, -0x2b, -0x9, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x8, -0x8, -0x29, -0x8, -0x9, -0x9, -0x9, -0xa, -0x2d, -0xa, -0xc, -0x9, -0x9, -0x8, -0x29, -0x2, -0x2, -0x1, -0x22, -0x22, -0x22, -0x39, -0x39, -0x39, -0x39, -0x39, -0x2, -0x2, -0x2, -0x29, -0x9, -0x9, -0x2e, -0xd, -0xe, -0xe, -0x2e, -0x9, -0x3, -0x2, -0x29, -0x29, -0x8, -0x2, -0x29, -0x9, -0x2e, -0xf, -0xe, -0xd, -0x2e, -0xa, -0x9, -0x8, -0x29, -0x3, -0x3, -0x2, -0x8, -0x8, -0x29, -0x29, -0x29, -0x29, -0x8, -0x29, -0x9, -0x2a, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x29, -0x3, -0x2, -0x2, -0x23, -0x1, -0x39, -0x1, -0x22, -0x23, -0x39, -0x23, -0x3, -0x29, -0x9, -0xa, -0x2e, -0xd, -0xe, -0xe, -0x2e, -0x9, -0x8, -0x3, -0x29, -0x8, -0x9, -0x8, -0x2a, -0x29, -0x3, -0x8, -0x9, -0x2e, -0xf, -0xe, -0x2e, -0xc, -0x2b, -0x9, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x23, -0x23, -0x1, -0x2, -0x1, -0x23, -0x1, -0x39, -0x1, -0x22, -0x22, -0x39, -0x22, -0x22, -0x22, -0x0, -0x22, -0x0, -0x0, -0x0, -0x33, -0x21, -0x33, -0x0, -0x0, -0x39, -0x23, -0x29, -0x9, -0x2e, -0xe, -0xe, -0xf, -0x2e, -0x9, -0x8, -0x2, -0x29, -0x29, -0x9, -0x9, -0x9, -0xa, -0x9, -0x9, -0x8, -0x2, -0x8, -0xa, -0xe, -0xf, -0xe, -0x2e, -0xc, -0x2b, -0x9, -0x29, -0x2, -0x2, -0x1, -0x22, -0x22, -0x0, -0x0, -0x0, -0x0, -0x33, -0x21, -0x20, -0x20, -0x32, -0x32, -0x31, -0x31, -0x42, -0x42, -0x31, -0x42, -0x31, -0x31, -0x43, -0x31, -0x32, -0x31, -0x32, -0x32, -0x32, -0x20, -0x33, -0x39, -0x2, -0x9, -0xc, -0x2e, -0xe, -0xf, -0x2e, -0x9, -0x8, -0x2, -0x3, -0x29, -0x8, -0x9, -0x9, -0x9, -0x9, -0x9, -0x2a, -0x29, -0x3, -0x2, -0x9, -0x2e, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0xa, -0x9, -0x29, -0x2, -0x2, -0x39, -0x39, -0x22, -0x0, -0x0, -0x33, -0x0, -0x21, -0x33, -0x20, -0x20, -0x32, -0x32, -0x32, -0x31, -0x31, -0x43, -0x31, -0x32, -0x32, -0x20, -0x20, -0x20, -0x33, -0x20, -0x33, -0x0, -0x0, -0x22, -0x2, -0x2, -0x2e, -0xe, -0xe, -0xe, -0x2e, -0x9, -0x8, -0x2, -0x2, -0x29, -0x3, -0x3, -0x3, -0x2, -0x29, -0x2, -0x29, -0x2, -0x8, -0x2, -0x2, -0x2, -0x29, -0x8, -0x9, -0x2e, -0xe, -0xe, -0xe, -0xb, -0x2d, -0x2a, -0x29, -0x2, -0x1, -0x22, -0x22, -0x22, -0x22, -0x22, -0x22, -0x22, -0x22, -0x22, -0x22, -0x22, -0x0, -0x22, -0x0, -0x22, -0x22, -0x39, -0x39, -0x1, -0x23, -0x2, -0x2, -0x2, -0x8, -0x2, -0x29, -0x29, -0x9, -0x9, -0xe, -0xe, -0xf, -0x2e, -0x9, -0x29, -0x2, -0x3, -0x2, -0x8, -0x2, -0x2, -0x2, -0x3, -0x29, -0x29, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x3, -0x2, -0x3, -0x8, -0xc, -0xe, -0xe, -0xe, -0x2e, -0xa, -0x8, -0x8, -0x2, -0x1, -0x22, -0x39, -0x39, -0x1, -0x23, -0x1, -0x23, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x29, -0x29, -0x29, -0x8, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0xc, -0x2e, -0xe, -0xe, -0xf, -0x2e, -0xa, -0x29, -0x2, -0x2, -0x2, -0x2, -0x29, -0x29, -0x29, -0x9, -0x9, -0xa, -0x9, -0x9, -0xa, -0x9, -0xc, -0x2b, -0xc, -0x2e, -0x2e, -0xe, -0xe, -0xe, -0x2e, -0xc, -0xa, -0x9, -0x8, -0x29, -0x29, -0x2, -0x2, -0x3, -0x2, -0x29, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x29, -0x29, -0x8, -0x9, -0x9, -0x9, -0xa, -0xa, -0x2d, -0xa, -0xc, -0x2e, -0x2e, -0xe, -0xe, -0xf, -0xe, -0x2e, -0x9, -0x8, -0x29, -0x29, -0x8, -0x9, -0xa, -0x2e, -0xd, -0xe, -0xe, -0xe, -0xe, -0xe, -0xf, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0xa, -0x9, -0x9, -0x29, -0x29, -0x29, -0x8, -0x8, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x29, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x29, -0x29, -0x2a, -0x9, -0xa, -0xc, -0xc, -0x2e, -0x2e, -0xb, -0x2e, -0x2e, -0x2e, -0xd, -0xd, -0xe, -0xe, -0xe, -0xe, -0x2e, -0xa, -0x9, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0xe, -0xe, -0xe, -0xe, -0xf, -0xf, -0xe, -0xe, -0xd, -0xb, -0xc, -0xa, -0x9, -0x29, -0x29, -0x3, -0x3, -0x29, -0x29, -0x8, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x2a, -0x29, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x3, -0x29, -0x8, -0x9, -0x9, -0xa, -0x2d, -0xa, -0xc, -0xa, -0xa, -0x2d, -0xa, -0xd, -0x8, -0x9, -0x9, -0x2e, -0x2e, -0xe, -0xe, -0xe, -0xe, -0x2e, -0xc, -0x2b, -0x9, -0x29, -0x29, -0x2a, -0x29, -0x9, -0x9, -0xa, -0xd, -0xe, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0x2d, -0x9, -0x9, -0x2a, -0x29, -0x29, -0x3, -0x3, -0x2, -0x2, -0x3, -0x2, -0x2, -0x3, -0x2, -0x2, -0x2, -0x2, -0x23, -0x23, -0x1, -0x22, -0x1, -0x22, -0x1, -0x22, -0x1, -0x39, -0x1, -0x23, -0x1, -0x23, -0x1, -0x39, -0x1, -0x23, -0x29, -0x22, -0x1, -0x2, -0x3, -0x8, -0x9, -0xc, -0x2e, -0xe, -0xf, -0xc, -0x9, -0x2, -0x29, -0x29, -0x2a, -0x29, -0x8, -0x29, -0x2, -0x3, -0x8, -0x9, -0x2e, -0xe, -0xf, -0xe, -0xe, -0x2e, -0xc, -0x9, -0x8, -0x3, -0x2, -0x39, -0x22, -0x0, -0x22, -0x0, -0x22, -0x22, -0x22, -0x22, -0x39, -0x39, -0x39, -0x39, -0x22, -0x0, -0x0, -0x0, -0x33, -0x20, -0x32, -0x32, -0x31, -0x31, -0x42, -0x31, -0x42, -0x31, -0x31, -0x32, -0x0, -0x22, -0x1, -0x2, -0x8, -0x8, -0x9, -0xa, -0x2e, -0xe, -0xe, -0xe, -0x2e, -0x9, -0x8, -0x8, -0x8, -0x8, -0x29, -0x29, -0x8, -0x2a, -0x9, -0xc, -0xb, -0xd, -0xf, -0xf, -0xe, -0xe, -0x2e, -0xc, -0x9, -0x9, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x23, -0x1, -0x39, -0x22, -0x0, -0x33, -0x20, -0x32, -0x31, -0x42, -0x42, -0x42, -0x42, -0x31, -0x32, -0x32, -0x20, -0x2, -0x2, -0x29, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0xd, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0x2e, -0xe, -0x2e, -0xe, -0xf, -0xf, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0x2e, -0xc, -0xc, -0xa, -0xc, -0xa, -0xc, -0xa, -0xc, -0xa, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x29, -0x2, -0x39, -0x0, -0x33, -0x20, -0x32, -0x31, -0x42, -0x31, -0x32, -0x20, -0x33, -0x0, -0x2, -0x29, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0x2e, -0x2e, -0xd, -0xe, -0xe, -0xf, -0xe, -0xf, -0xe, -0xe, -0xf, -0xf, -0xe, -0xf, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0x2e, -0xd, -0xb, -0x2e, -0x2e, -0xc, -0xc, -0xa, -0x9, -0x29, -0x2, -0x39, -0x0, -0x33, -0x20, -0x32, -0x31, -0x32, -0x32, -0x33, -0x21, -0x22, -0x2, -0x29, -0x9, -0xa, -0xc, -0xc, -0xb, -0x2e, -0xd, -0x2e, -0xe, -0x2e, -0xd, -0x2e, -0xe, -0x2e, -0xd, -0x2e, -0xe, -0xe, -0xd, -0xe, -0xe, -0xe, -0xd, -0xe, -0x2e, -0x2e, -0xd, -0x2e, -0xd, -0x2e, -0xe, -0xe, -0xe, -0xd, -0xe, -0xe, -0xe, -0x2e, -0xd, -0xb, -0x2e, -0xc, -0xa, -0x9, -0x9, -0x9, -0x9, -0x8, -0x3, -0x2, -0x1, -0x22, -0x0, -0x33, -0x32, -0x20, -0x32, -0x32, -0x20, -0x33, -0x0, -0x1, -0x3, -0x29, -0x9, -0xa, -0xc, -0xc, -0x2e, -0x2e, -0xe, -0xe, -0xe, -0xf, -0xf, -0xe, -0xe, -0xe, -0xf, -0xe, -0xf, -0xe, -0xd, -0xb, -0xc, -0x9, -0x9, -0x2a, -0x9, -0x2a, -0x9, -0x9, -0x9, -0xa, -0xc, -0xc, -0xb, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0x2b, -0x9, -0x8, -0x3, -0x2, -0x2, -0x1, -0x23, -0x39, -0x22, -0x0, -0x0, -0x33, -0x0, -0x20, -0x32, -0x32, -0x20, -0x20, -0x33, -0x21, -0x22, -0x1, -0x2, -0x29, -0x8, -0x9, -0x9, -0xa, -0xc, -0xc, -0xb, -0xd, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xd, -0x2e, -0xa, -0x9, -0x9, -0x29, -0x29, -0x8, -0x29, -0x8, -0x29, -0x9, -0x9, -0xa, -0xc, -0xc, -0xa, -0x2e, -0xc, -0xc, -0xa, -0x9, -0x9, -0x8, -0x8, -0x2, -0x2, -0x1, -0x22, -0x39, -0x22, -0x22, -0x0, -0x0, -0x0, -0x33, -0x21, -0x33, -0x21, -0x33, -0x0, -0x0, -0x0, -0x22, -0x2, -0x1, -0x23, -0x1, -0x1, -0x23, -0x2, -0x2, -0x2, -0x29, -0x29, -0x8, -0x8, -0x9, -0x8, -0x9, -0x9, -0x2a, -0x9, -0x9, -0x9, -0x9, -0x9, -0xa, -0x9, -0x2d, -0xa, -0xc, -0xa, -0x2d, -0xa, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x9, -0x8, -0x9, -0x2a, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x8, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x23, -0x0, -0x0, -0x20, -0x20, -0x32, -0x20, -0x20, -0x20, -0x20, -0x33, -0x20, -0x33, -0x21, -0x33, -0x0, -0x33, -0x0, -0x0, -0x39, -0x2, -0x29, -0x9, -0x9, -0x2e, -0x2e, -0xd, -0xe, -0x2e, -0x2e, -0xb, -0xc, -0x9, -0x9, -0x29, -0x2, -0x2, -0x2, -0x2, -0x2, -0x3, -0x29, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0x2e, -0xd, -0xb, -0x2e, -0xc, -0xa, -0x2d, -0x9, -0x9, -0x9, -0x9, -0x2a, -0x9, -0x2a, -0x29, -0x29, -0x2, -0x1, -0x22, -0x33, -0x20, -0x32, -0x32, -0x31, -0x32, -0x32, -0x32, -0x20, -0x32, -0x32, -0x20, -0x32, -0x32, -0x20, -0x32, -0x33, -0x0, -0x22, -0x23, -0x2, -0x8, -0x9, -0x9, -0xc, -0x2e, -0xc, -0xa, -0xc, -0xa, -0x9, -0x9, -0x2a, -0x29, -0x29, -0x29, -0x29, -0x29, -0x9, -0x9, -0x9, -0xc, -0x2e, -0xb, -0xd, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0xc, -0xa, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x29, -0x3, -0x1, -0x1, -0x22, -0x0, -0x0, -0x33, -0x20, -0x33, -0x20, -0x33, -0x20, -0x20, -0x20, -0x20, -0x32, -0x32, -0x20, -0x32, -0x20, -0x33, -0x21, -0x33, -0x0, -0x22, -0x22, -0x39, -0x23, -0x2, -0x2, -0x29, -0x8, -0x9, -0x9, -0xc, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xd, -0x2e, -0x2e, -0x2e, -0xc, -0xc, -0xa, -0x2d, -0x2b, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x29, -0x8, -0x2, -0x2, -0x39, -0x39, -0x0, -0x0, -0x0, -0x33, -0x21, -0x21, -0x33, -0x33, -0x20, -0x20, -0x32, -0x32, -0x20, -0x32, -0x32, -0x20, -0x32, -0x32, -0x20, -0x32, -0x32, -0x20, -0x20, -0x21, -0x0, -0x1, -0x2, -0x8, -0xc, -0x2e, -0xd, -0xe, -0xf, -0xf, -0xf, -0xf, -0xf, -0xe, -0xe, -0x2e, -0x2e, -0xc, -0x2b, -0x9, -0x2a, -0x29, -0x8, -0x8, -0x8, -0x8, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x2a, -0x8, -0x29, -0x3, -0x2, -0x2, -0x1, -0x1, -0x22, -0x22, -0x22, -0x0, -0x33, -0x21, -0x32, -0x32, -0x20, -0x32, -0x31, -0x32, -0x32, -0x32, -0x20, -0x20, -0x20, -0x33, -0x0, -0x0, -0x22, -0x39, -0x2, -0x2, -0x29, -0x9, -0x9, -0xa, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0xc, -0x9, -0x9, -0x9, -0x29, -0x29, -0x29, -0x8, -0x2a, -0x9, -0x9, -0x9, -0x9, -0xa, -0x9, -0xa, -0x9, -0x9, -0x9, -0x29, -0x9, -0x29, -0x8, -0x29, -0x8, -0x2, -0x2, -0x2, -0x39, -0x22, -0x21, -0x33, -0x32, -0x32, -0x31, -0x31, -0x32, -0x31, -0x20, -0x33, -0x0, -0x22, -0x1, -0x2, -0x3, -0x8, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x29, -0x29, -0x29, -0x29, -0x29, -0x8, -0x2a, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x2a, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0xa, -0xa, -0x9, -0xa, -0xa, -0x9, -0xa, -0x9, -0x8, -0x8, -0x29, -0x3, -0x3, -0x2, -0x2, -0x1, -0x22, -0x0, -0x33, -0x32, -0x31, -0x32, -0x42, -0x42, -0x31, -0x31, -0x32, -0x33, -0x0, -0x39, -0x2, -0x3, -0x8, -0x9, -0xa, -0xc, -0xa, -0xc, -0x2b, -0x9, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x8, -0x29, -0x29, -0x9, -0x9, -0x9, -0xa, -0xa, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x2a, -0x8, -0x8, -0x9, -0x0, -0x0, -0x33, -0x33, -0x20, -0x20, -0x32, -0x32, -0x31, -0x42, -0x30, -0x30, -0x30, -0x30, -0x40, -0x30, -0x30, -0x30, -0x42, -0x32, -0x33, -0x39, -0x2, -0x29, -0x9, -0x9, -0xc, -0xc, -0x2e, -0xc, -0xa, -0xc, -0x9, -0x9, -0x2a, -0x8, -0x8, -0x29, -0x8, -0x9, -0x9, -0x9, -0xc, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0x9, -0x8, -0x29, -0x2, -0x1, -0x22, -0x22, -0x22, -0x22, -0x21, -0x33, -0x0, -0x33, -0x1, -0x30, -0x30, -0x30, -0x30, -0x40, -0x30, -0x40, -0x40, -0x40, -0x40, -0x63, -0x40, -0x40, -0x40, -0x63, -0x40, -0x40, -0x40, -0x30, -0x42, -0x20, -0x0, -0x2, -0x29, -0x9, -0xa, -0xc, -0xb, -0x2e, -0x2e, -0xb, -0xc, -0xc, -0xa, -0xa, -0x9, -0x9, -0x9, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0xd, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0xc, -0x9, -0x29, -0x2, -0x22, -0x33, -0x20, -0x31, -0x42, -0x31, -0x42, -0x42, -0x42, -0x41, -0x31, -0x32, -0x31, -0x42, -0x42, -0x41, -0x30, -0x30, -0x30, -0x30, -0x40, -0x40, -0x40, -0x40, -0x40, -0x40, -0x40, -0x30, -0x30, -0x30, -0x32, -0x20, -0x0, -0x23, -0x29, -0x8, -0x9, -0xc, -0xc, -0x2e, -0x2e, -0xc, -0xc, -0xa, -0x2d, -0xa, -0x9, -0x9, -0xa, -0x9, -0xc, -0xc, -0x2e, -0x2e, -0xd, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0xc, -0xa, -0x8, -0x29, -0x23, -0x22, -0x21, -0x33, -0x33, -0x20, -0x33, -0x0, -0x33, -0x21, -0x32, -0x2, -0x2, -0x1, -0x22, -0x22, -0x22, -0x0, -0x0, -0x33, -0x20, -0x20, -0x32, -0x32, -0x31, -0x31, -0x42, -0x31, -0x32, -0x32, -0x20, -0x21, -0x0, -0x22, -0x2, -0x2, -0x29, -0x29, -0x9, -0x9, -0x9, -0x9, -0x9, -0xa, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0xa, -0xc, -0xc, -0x2e, -0xb, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0x9, -0x9, -0x9, -0x2a, -0x8, -0x9, -0x8, -0x29, -0x2a, -0x9, -0x8, -0x8, -0x29, -0x9, -0x2a, -0x8, -0x29, -0x29, -0x3, -0x2, -0x2, -0x2, -0x39, -0x22, -0x0, -0x0, -0x33, -0x0, -0x33, -0x0, -0x33, -0x21, -0x0, -0x0, -0x22, -0x39, -0x39, -0x2, -0x2, -0x3, -0x29, -0x8, -0x2a, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0xa, -0xc, -0xc, -0xc, -0xc, -0x2e, -0xc, -0xc, -0xa, -0x2d, -0xa, -0xa, -0x2d, -0xa, -0xc, -0xc, -0xa, -0xc, -0xc, -0xc, -0xa, -0xc, -0xa, -0x9, -0x3, -0x3, -0x2, -0x2, -0x2, -0x2, -0x23, -0x1, -0x39, -0x22, -0x0, -0x0, -0x0, -0x33, -0x21, -0x33, -0x21, -0x33, -0x0, -0x22, -0x39, -0x1, -0x2, -0x2, -0x29, -0x8, -0x9, -0x9, -0x9, -0xa, -0x2d, -0xa, -0xa, -0x2d, -0xa, -0x9, -0xa, -0x9, -0xa, -0xa, -0x9, -0xa, -0xc, -0x9, -0x9, -0x9, -0x9, -0x9, -0x29, -0x8, -0x29, -0x8, -0x8, -0x29, -0x8, -0x8, -0x8, -0x29, -0x29, -0x3, -0x29, -0x8, -0x29, -0x8, -0x22, -0x0, -0x22, -0x22, -0x0, -0x0, -0x0, -0x0, -0x33, -0x0, -0x33, -0x0, -0x33, -0x33, -0x21, -0x20, -0x33, -0x0, -0x0, -0x22, -0x2, -0x2, -0x29, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xc, -0xc, -0xc, -0xa, -0xa, -0x9, -0x9, -0x29, -0x3, -0x2, -0x2, -0x23, -0x1, -0x22, -0x22, -0x22, -0x22, -0x22, -0x0, -0x0, -0x0, -0x33, -0x21, -0x33, -0x0, -0x0, -0x0, -0x22, -0x33, -0x21, -0x33, -0x0, -0x33, -0x0, -0x33, -0x0, -0x21, -0x33, -0x21, -0x33, -0x0, -0x0, -0x33, -0x21, -0x0, -0x0, -0x22, -0x2, -0x3, -0x29, -0x9, -0xc, -0x2e, -0x2e, -0xd, -0xe, -0xe, -0x2e, -0xd, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xc, -0xc, -0xa, -0xa, -0x9, -0x9, -0x29, -0x3, -0x2, -0x2, -0x39, -0x39, -0x22, -0x0, -0x0, -0x33, -0x0, -0x33, -0x20, -0x20, -0x20, -0x32, -0x32, -0x32, -0x32, -0x20, -0x20, -0x33, -0x31, -0x32, -0x31, -0x32, -0x32, -0x32, -0x20, -0x20, -0x33, -0x0, -0x0, -0x0, -0x22, -0x22, -0x39, -0x39, -0x1, -0x23, -0x2, -0x29, -0x8, -0x9, -0xc, -0xb, -0xd, -0xe, -0xe, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0xc, -0xa, -0x2d, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x8, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x1, -0x22, -0x0, -0x0, -0x20, -0x32, -0x32, -0x31, -0x42, -0x31, -0x42, -0x42, -0x31, -0x42, -0x32, -0x30, -0x42, -0x41, -0x42, -0x31, -0x42, -0x31, -0x32, -0x20, -0x21, -0x0, -0x22, -0x23, -0x2, -0x2, -0x2, -0x8, -0x8, -0x29, -0x9, -0xa, -0xc, -0x2e, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0xa, -0x9, -0x9, -0x29, -0x8, -0x8, -0x8, -0x8, -0x8, -0x8, -0x8, -0x8, -0x8, -0x8, -0x8, -0x8, -0x29, -0x2, -0x2, -0x22, -0x21, -0x32, -0x32, -0x42, -0x30, -0x30, -0x30, -0x30, -0x30, -0x30, -0x30, -0x30, -0x30, -0x42, -0x42, -0x31, -0x42, -0x31, -0x32, -0x20, -0x21, -0x22, -0x1, -0x2, -0x3, -0x29, -0x8, -0x9, -0x2a, -0x9, -0x9, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0x9, -0x9, -0x9, -0x2a, -0x29, -0x9, -0x8, -0x8, -0x8, -0x8, -0x8, -0x29, -0x8, -0x8, -0x8, -0x29, -0x3, -0x2, -0x23, -0x22, -0x21, -0x20, -0x32, -0x42, -0x41, -0x30, -0x30, -0x30, -0x30, -0x30, -0x30, -0x42, -0x42, -0x31, -0x42, -0x31, -0x32, -0x31, -0x33, -0x21, -0x22, -0x2, -0x2, -0x8, -0x9, -0xa, -0xc, -0xa, -0xc, -0xa, -0xa, -0x9, -0x9, -0x9, -0x8, -0x8, -0x29, -0x8, -0x8, -0x29, -0x29, -0x29, -0x29, -0x9, -0x9, -0x9, -0xa, -0xc, -0xa, -0xc, -0xa, -0x2d, -0x9, -0x9, -0x9, -0x8, -0x29, -0x29, -0x3, -0x2, -0x2, -0x2, -0x39, -0x22, -0x0, -0x33, -0x32, -0x32, -0x31, -0x42, -0x42, -0x31, -0x42, -0x31, -0x42, -0x42, -0x32, -0x31, -0x32, -0x31, -0x20, -0x20, -0x0, -0x22, -0x2, -0x2, -0x8, -0xc, -0xa, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0x9, -0x29, -0x2, -0x2, -0x39, -0x22, -0x0, -0x22, -0x39, -0x23, -0x2, -0x29, -0x2a, -0x9, -0xc, -0xc, -0xb, -0x2e, -0xc, -0xc, -0xa, -0x9, -0x9, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x23, -0x1, -0x22, -0x0, -0x33, -0x20, -0x20, -0x32, -0x31, -0x32, -0x31, -0x32, -0x31, -0x32, -0x31, -0x33, -0x21, -0x33, -0x0, -0x22, -0x39, -0x2, -0x2, -0x29, -0x9, -0x9, -0xc, -0xc, -0xb, -0xd, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0x9, -0x9, -0x29, -0x3, -0x2, -0x1, -0x22, -0x39, -0x39, -0x39, -0x2, -0x2, -0x3, -0x29, -0x8, -0x9, -0x2a, -0x9, -0x8, -0x9, -0x9, -0x2a, -0x8, -0x8, -0x2a, -0x8, -0x8, -0x8, -0x29, -0x3, -0x2, -0x2, -0x1, -0x22, -0x0, -0x0, -0x33, -0x33, -0x20, -0x33, -0x21, -0x33, -0x33, -0x20, -0x23, -0x2, -0x2, -0x3, -0x29, -0x29, -0x9, -0x9, -0xa, -0x2d, -0xa, -0xc, -0xc, -0xc, -0x2e, -0xc, -0xc, -0xc, -0xc, -0xa, -0xa, -0x9, -0x9, -0x8, -0x8, -0x3, -0x2, -0x2, -0x23, -0x1, -0x22, -0x39, -0x39, -0x39, -0x1, -0x22, -0x39, -0x39, -0x1, -0x2, -0x2, -0x29, -0x8, -0x9, -0x9, -0xa, -0x2d, -0xa, -0x2d, -0x9, -0x9, -0x8, -0x29, -0x3, -0x2, -0x23, -0x1, -0x22, -0x22, -0x39, -0x1, -0x22, -0x1, -0x22, -0x3b, -0x3, -0x8, -0x29, -0x9, -0x9, -0xc, -0xc, -0xb, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0xa, -0x9, -0x9, -0x29, -0x3, -0x2, -0x2, -0x1, -0x22, -0x22, -0x22, -0x0, -0x0, -0x0, -0x0, -0x22, -0x39, -0x2, -0x2, -0x29, -0x9, -0x9, -0xa, -0xc, -0xc, -0xa, -0xa, -0x9, -0x9, -0x8, -0x3, -0x2, -0x2, -0x1, -0x22, -0x22, -0x22, -0x22, -0x39, -0x39, -0x2, -0x1, -0x2, -0x2, -0x29, -0x9, -0x9, -0xc, -0xb, -0xd, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xf, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xd, -0x2e, -0x2e, -0x2d, -0x9, -0x9, -0x29, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x3, -0x3, -0x3, -0x8, -0x8, -0x2a, -0x2a, -0x9, -0x2a, -0x9, -0x8, -0x8, -0x29, -0x2, -0x2, -0x22, -0x0, -0x0, -0x0, -0x33, -0x20, -0x20, -0x20, -0x20, -0x33, -0x39, -0x22, -0x1, -0x2, -0x29, -0x9, -0x9, -0xc, -0x2e, -0xe, -0xe, -0xf, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xd, -0xe, -0xe, -0xf, -0xe, -0xe, -0x2e, -0x2e, -0xc, -0xa, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x29, -0x29, -0x29, -0x3, -0x3, -0x2, -0x2, -0x3, -0x2, -0x23, -0x39, -0x0, -0x33, -0x32, -0x31, -0x42, -0x42, -0x42, -0x41, -0x42, -0x31, -0x32, -0x33, -0x1, -0x2, -0x8, -0x9, -0xc, -0xb, -0xd, -0xe, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0xc, -0xc, -0xa, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0xe, -0xe, -0xf, -0xe, -0xe, -0x2e, -0xc, -0xa, -0x9, -0x9, -0x9, -0x29, -0x2a, -0x29, -0x8, -0x8, -0x9, -0x29, -0x29, -0x8, -0x3, -0x2, -0x2, -0x2, -0x2, -0x1, -0x1, -0x23, -0x39, -0x22, -0x0, -0x33, -0x20, -0x32, -0x31, -0x42, -0x42, -0x30, -0x42, -0x31, -0x32, -0x20, -0x33, -0x8, -0x9, -0x2e, -0xe, -0xe, -0xe, -0x2e, -0xc, -0x9, -0x9, -0x9, -0xc, -0x25, -0x4, -0x4, -0x2b, -0x9, -0xc, -0x2e, -0xe, -0xf, -0xe, -0xe, -0x2e, -0xc, -0x9, -0x29, -0x3, -0x2, -0x2, -0x23, -0x1, -0x1, -0x23, -0x1, -0x1, -0x23, -0x1, -0x23, -0x1, -0x22, -0x22, -0x22, -0x0, -0x0, -0x0, -0x33, -0x0, -0x0, -0x33, -0x21, -0x20, -0x20, -0x32, -0x32, -0x32, -0x31, -0x32, -0x31, -0x32, -0x32, -0x21, -0x0, -0x39, -0x9, -0x2e, -0xe, -0xf, -0xc, -0x9, -0x8, -0x2, -0x2, -0x2, -0x3, -0x2, -0x29, -0x8, -0x9, -0x9, -0x9, -0xc, -0x2e, -0xe, -0xf, -0xe, -0xb, -0xc, -0x9, -0x3, -0x2, -0x39, -0x22, -0x0, -0x0, -0x33, -0x0, -0x0, -0x0, -0x22, -0x0, -0x22, -0x0, -0x0, -0x0, -0x33, -0x21, -0x32, -0x20, -0x32, -0x32, -0x32, -0x32, -0x20, -0x32, -0x32, -0x20, -0x32, -0x32, -0x20, -0x32, -0x32, -0x20, -0x20, -0x33, -0x0, -0x1, -0x3, -0xc, -0x2e, -0xe, -0xe, -0xa, -0x8, -0x2, -0x29, -0x29, -0x29, -0x29, -0x29, -0x29, -0x29, -0x29, -0x29, -0x3, -0x29, -0x8, -0xa, -0xd, -0xe, -0xe, -0x2e, -0xa, -0x9, -0x2, -0x2, -0x1, -0x22, -0x22, -0x22, -0x22, -0x22, -0x22, -0x39, -0x22, -0x39, -0x39, -0x22, -0x0, -0x33, -0x20, -0x32, -0x31, -0x42, -0x42, -0x42, -0x42, -0x42, -0x31, -0x32, -0x31, -0x20, -0x20, -0x20, -0x33, -0x0, -0x33, -0x0, -0x0, -0x39, -0x2, -0x8, -0xc, -0xe, -0xe, -0xe, -0xa, -0x29, -0x2, -0x8, -0x9, -0x9, -0x9, -0xa, -0xc, -0xa, -0xc, -0xa, -0xc, -0x9, -0x8, -0x8, -0x29, -0xc, -0xe, -0xe, -0x2e, -0xa, -0x9, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x39, -0x0, -0x33, -0x32, -0x31, -0x30, -0x30, -0x40, -0x40, -0x30, -0x30, -0x30, -0x42, -0x32, -0x32, -0x0, -0x0, -0x22, -0x22, -0x39, -0x39, -0x23, -0x2, -0x29, -0x9, -0xc, -0xe, -0xc, -0x8, -0x9, -0xc, -0x2e, -0xe, -0x2e, -0x9, -0x29, -0x2e, -0xe, -0x9, -0x8, -0x2, -0x2, -0x2, -0x1, -0x22, -0x21, -0x32, -0x30, -0x30, -0x30, -0x42, -0x32, -0x33, -0x0, -0x0, -0x22, -0x8, -0x9, -0x2e, -0xe, -0x9, -0x29, -0xa, -0xe, -0xe, -0xe, -0xc, -0x8, -0x9, -0xe, -0x2e, -0x9, -0x2, -0x39, -0x0, -0x33, -0x0, -0x33, -0x21, -0x33, -0x33, -0x20, -0x33, -0x20, -0x32, -0x31, -0x32, -0x20, -0x22, -0x2e, -0x2e, -0x8, -0x29, -0x9, -0x29, -0x8, -0x29, -0x29, -0x9, -0x2e, -0xe, -0xc, -0x8, -0x2, -0x22, -0x0, -0x0, -0x33, -0x0, -0x39, -0x2, -0x29, -0x8, -0x29, -0x2, -0x0, -0x32, -0x41, -0x42, -0x32, -0x1, -0xd, -0x2e, -0x3, -0x8, -0x9, -0x9, -0x29, -0x29, -0x29, -0x29, -0x9, -0xa, -0xd, -0xb, -0x9, -0x2, -0x22, -0x20, -0x20, -0x0, -0x22, -0x2, -0x29, -0x9, -0x2a, -0x29, -0x2, -0x22, -0x0, -0x0, -0x1, -0x8, -0x2e, -0xe, -0x9, -0x29, -0x9, -0xa, -0xc, -0xc, -0xa, -0x9, -0x8, -0x8, -0x2e, -0xe, -0xc, -0x3, -0x0, -0x20, -0x32, -0x32, -0x21, -0x22, -0x2, -0x2, -0x3, -0x2, -0x2, -0x2, -0x2, -0x23, -0x2, -0x9, -0x9, -0x2e, -0xe, -0xa, -0x29, -0xc, -0xe, -0xe, -0xe, -0xc, -0x8, -0xd, -0x2e, -0xa, -0x29, -0x22, -0x20, -0x32, -0x31, -0x31, -0x32, -0x33, -0x0, -0x0, -0x0, -0x0, -0x33, -0x0, -0x0, -0x33, -0x0, -0x2, -0x2, -0xa, -0xd, -0xe, -0x9, -0x29, -0x2a, -0x9, -0x2a, -0x29, -0xc, -0xe, -0x2e, -0x9, -0x23, -0x0, -0x32, -0x30, -0x30, -0x42, -0x33, -0x1, -0x3, -0x29, -0x29, -0x2, -0x21, -0x43, -0x30, -0x30, -0x42, -0x21, -0x2, -0x8, -0xa, -0xe, -0xe, -0x9, -0x3, -0x29, -0x3, -0x29, -0xe, -0xe, -0xa, -0x9, -0x2, -0x23, -0x39, -0x22, -0x22, -0x1, -0x2, -0x8, -0x9, -0xa, -0x9, -0x29, -0x2, -0x22, -0x20, -0x33, -0x0, -0x22, -0x2, -0x9, -0xc, -0xe, -0x2e, -0x9, -0x3, -0x29, -0x29, -0x8, -0x2e, -0xe, -0xc, -0x9, -0x3, -0x3, -0x2, -0x2, -0x8, -0x2, -0x29, -0x3, -0x8, -0x8, -0x2, -0x2, -0x23, -0x1, -0x22, -0x22, -0x22, -0x1, -0x9, -0xd, -0xe, -0x9, -0x3, -0x29, -0x9, -0x9, -0x9, -0x29, -0x2a, -0xe, -0xe, -0xc, -0x2a, -0x8, -0x1, -0x22, -0x0, -0x0, -0x33, -0x20, -0x32, -0x31, -0x31, -0x31, -0x32, -0x32, -0x20, -0x20, -0x0, -0x23, -0xe, -0xe, -0x9, -0x2, -0x8, -0x2, -0x3, -0x29, -0x2, -0x2, -0x2, -0x29, -0x9, -0xe, -0xd, -0xa, -0x8, -0x1, -0x22, -0x22, -0x39, -0x39, -0x1, -0x1, -0x23, -0x1, -0x2, -0x3, -0x29, -0x8, -0x9, -0x9, -0xe, -0xe, -0x9, -0x3, -0x3, -0x2a, -0x2d, -0xb, -0xd, -0xb, -0xd, -0xb, -0x2e, -0xc, -0xa, -0x9, -0x29, -0x8, -0x29, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x29, -0x9, -0x9, -0xc, -0xa, -0x2e, -0x2e, -0xc, -0x2e, -0xd, -0xb, -0x2e, -0xc, -0xa, -0xc, -0x2e, -0x2e, -0xe, -0x2e, -0xc, -0x9, -0x8, -0x8, -0x29, -0x8, -0x8, -0x29, -0x8, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x29, -0x8, -0x29, -0x29, -0x9, -0x22, -0x2, -0x9, -0x2e, -0xe, -0x2e, -0x29, -0x8, -0x8, -0x29, -0x29, -0xc, -0xe, -0xe, -0x2e, -0x9, -0x8, -0x1, -0x22, -0x1, -0x22, -0x23, -0x1, -0x22, -0x22, -0x0, -0x20, -0x32, -0x42, -0x31, -0x42, -0x20, -0x2, -0x9, -0xc, -0xb, -0xd, -0xe, -0x2e, -0x2e, -0xe, -0xe, -0xe, -0xe, -0xe, -0xf, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0x9, -0x29, -0x39, -0x33, -0x32, -0x31, -0x20, -0x0, -0x29, -0x9, -0x2e, -0x2e, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xd, -0xb, -0xc, -0xa, -0xc, -0x2e, -0x2e, -0x2e, -0xd, -0x2e, -0xc, -0x2b, -0x8, -0x29, -0x2, -0x1, -0x22, -0x33, -0x20, -0x32, -0x33, -0x1, -0x2, -0x3, -0x29, -0x2a, -0x9, -0xc, -0xa, -0xc, -0x2e, -0xc, -0xa, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x3, -0x3, -0x2, -0x2, -0x39, -0x22, -0x22, -0x39, -0x39, -0x1, -0x0, -0x32, -0x32, -0x20, -0x20, -0x20, -0x20, -0x20, -0x33, -0x39, -0x29, -0x9, -0x2e, -0x2e, -0x2e, -0xa, -0x8, -0x29, -0x2, -0x29, -0x9, -0xc, -0xb, -0xd, -0x2e, -0xa, -0xa, -0x9, -0x9, -0x9, -0x8, -0x2, -0x1, -0x0, -0x33, -0x21, -0x33, -0x20, -0x20, -0x32, -0x20, -0x20, -0x20, -0x33, -0x0, -0x39, -0x2, -0x9, -0x2e, -0xe, -0xe, -0xe, -0xd, -0xb, -0xc, -0x9, -0x9, -0x29, -0x9, -0x9, -0x9, -0x9, -0x9, -0x3, -0x29, -0x2, -0x2, -0x1, -0x0, -0x33, -0x32, -0x31, -0x32, -0x20, -0x33, -0x39, -0x2, -0x8, -0x29, -0x9, -0x9, -0xa, -0x9, -0x9, -0xa, -0x2d, -0x2b, -0x9, -0x2a, -0x2a, -0x9, -0x9, -0xa, -0x9, -0xa, -0x9, -0x2, -0x39, -0x22, -0x0, -0x20, -0x31, -0x42, -0x30, -0x30, -0x32, -0x0, -0x2, -0x9, -0xc, -0xa, -0x2d, -0x2a, -0x29, -0x3, -0x29, -0x2a, -0x2d, -0xa, -0xc, -0xa, -0x9, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x42, -0x30, -0x30, -0x40, -0x40, -0x40, -0x40, -0x40, -0x40, -0x42, -0x21, -0x2, -0x9, -0x2e, -0x2e, -0x2e, -0xa, -0xa, -0x9, -0xa, -0xc, -0x2e, -0xe, -0xd, -0xb, -0x9, -0x2, -0x33, -0x20, -0x32, -0x32, -0x32, -0x3, -0x2, -0x2, -0x39, -0x0, -0x33, -0x20, -0x32, -0x20, -0x33, -0x0, -0x39, -0x2, -0x8, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0xc, -0x2e, -0x2e, -0x2e, -0xa, -0x2d, -0x9, -0x9, -0x9, -0x9, -0x9, -0x2a, -0x23, -0x1, -0x22, -0x22, -0x0, -0x0, -0x33, -0x20, -0x0, -0x0, -0x2, -0x29, -0x9, -0xa, -0xc, -0xc, -0xa, -0xc, -0xa, -0xc, -0xa, -0x9, -0x8, -0x29, -0x2, -0x2, -0x2, -0x2, -0x23, -0x1, -0x23, -0x2, -0x20, -0x20, -0x20, -0x20, -0x33, -0x21, -0x0, -0x22, -0x22, -0x2, -0x8, -0xc, -0x2e, -0xe, -0xd, -0x2e, -0x2e, -0xc, -0xa, -0x9, -0x9, -0x29, -0x2, -0x23, -0x22, -0x0, -0x33, -0x20, -0x32, -0x31, -0x32, -0x32, -0x30, -0x42, -0x31, -0x32, -0x0, -0x22, -0x2, -0x29, -0x8, -0x9, -0xc, -0x2e, -0xe, -0xe, -0x2e, -0x2e, -0x9, -0x9, -0x29, -0x29, -0x8, -0x8, -0x8, -0x8, -0x2, -0x1, -0x33, -0x31, -0x30, -0x30, -0x30, -0x30, -0x31, -0x32, -0x32, -0x21, -0x23, -0x29, -0xc, -0x2e, -0xc, -0xa, -0x9, -0x3, -0x2, -0x23, -0x2, -0x29, -0x9, -0xc, -0xa, -0xc, -0x9, -0x2a, -0x29, -0x2, -0x2, -0x39, -0x33, -0x20, -0x31, -0x43, -0x31, -0x42, -0x22, -0x39, -0x2, -0x29, -0x9, -0xa, -0x2e, -0x2e, -0x2e, -0xc, -0x9, -0x8, -0x2, -0x23, -0x1, -0x23, -0x2, -0x2, -0x3, -0x8, -0x29, -0x8, -0x9, -0x9, -0x9, -0x3, -0x2, -0x22, -0x0, -0x0, -0x0, -0x0, -0x2, -0x29, -0x9, -0xc, -0x2e, -0xe, -0xd, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0xa, -0x9, -0x29, -0x2, -0x23, -0x1, -0x22, -0x2, -0x3, -0x8, -0x9, -0x9, -0x9, -0x8, -0x2, -0x1, -0x0, -0x0, -0x0, -0x22, -0x1, -0x29, -0xa, -0xd, -0xe, -0xe, -0x2e, -0x2e, -0xc, -0xb, -0xd, -0xe, -0xe, -0x2e, -0xa, -0x9, -0x9, -0x9, -0x8, -0x9, -0x29, -0x3, -0x2, -0x2, -0x2, -0x22, -0x33, -0x32, -0x41, -0x42, -0x31, -0x20, -0x9, -0xe, -0x2e, -0x9, -0x8, -0x8, -0x2c, -0x9, -0x2d, -0xe, -0xe, -0x2e, -0x9, -0x2, -0x1, -0x22, -0x22, -0x22, -0x22, -0x22, -0x0, -0x0, -0x33, -0x20, -0x20, -0x20, -0x32, -0x20, -0x32, -0x32, -0x33, -0x1, -0x2e, -0xe, -0x9, -0x3, -0x29, -0x9, -0x9, -0x2a, -0x9, -0x8, -0x2e, -0xe, -0xa, -0x29, -0x2, -0x39, -0x1, -0x1, -0x23, -0x22, -0x21, -0x32, -0x30, -0x30, -0x30, -0x42, -0x32, -0x21, -0x0, -0x0, -0x1, -0x3, -0x2e, -0xa, -0x9, -0xe, -0xc, -0x9, -0x2e, -0x29, -0x39, -0x0, -0x33, -0x31, -0x32, -0x20, -0x33, -0x39, -0x2e, -0x8, -0x9, -0x8, -0x8, -0x2e, -0xc, -0x2, -0x0, -0x33, -0x23, -0x8, -0x29, -0x0, -0x20, -0x22, -0x2e, -0xa, -0x9, -0xd, -0xc, -0x2a, -0x2e, -0x29, -0x20, -0x32, -0x21, -0x22, -0x39, -0x22, -0x22, -0x2, -0x29, -0x2e, -0x9, -0x8, -0x8, -0xd, -0x2b, -0x1, -0x33, -0x20, -0x1, -0x2a, -0x29, -0x0, -0x32, -0x20, -0x9, -0x2e, -0x9, -0x8, -0x8, -0x2e, -0xc, -0x3, -0x2, -0x39, -0x39, -0x0, -0x0, -0x0, -0x33, -0x39, -0xe, -0x8, -0x29, -0x9, -0x9, -0x9, -0xc, -0xa, -0x29, -0x2, -0x2, -0x2, -0x2, -0x8, -0x9, -0xa, -0x2a, -0xc, -0x2e, -0x9, -0x9, -0x2e, -0x2e, -0x9, -0x29, -0x2, -0x2, -0x23, -0x1, -0x22, -0x0, -0x39, -0x8, -0x2e, -0xe, -0xd, -0xe, -0xe, -0x2e, -0x2e, -0xd, -0xb, -0xc, -0x9, -0x29, -0x0, -0x32, -0x21, -0x22, -0x39, -0x2, -0x2, -0x29, -0x9, -0xa, -0x9, -0x9, -0x8, -0x9, -0x9, -0x2a, -0x29, -0x2, -0x2, -0x2, -0x22, -0x33, -0x32, -0x20, -0x0, -0x1, -0x2a, -0xc, -0x2e, -0xc, -0xa, -0x8, -0x9, -0x9, -0x2a, -0x33, -0x31, -0x42, -0x30, -0x42, -0x39, -0xa, -0xc, -0x9, -0x9, -0xa, -0x2e, -0x9, -0x2, -0x0, -0x0, -0x2, -0x39, -0x0, -0x20, -0x33, -0x1, -0x2a, -0xc, -0x2b, -0x2d, -0xa, -0x9, -0x8, -0x8, -0x29, -0x8, -0x31, -0x32, -0x0, -0x23, -0x29, -0xc, -0xe, -0x2e, -0xa, -0x9, -0x8, -0x8, -0x39, -0x20, -0x42, -0x42, -0x33, -0x1, -0x8, -0x2e, -0xc, -0x8, -0x2, -0x2, -0x29, -0x9, -0x9, -0x8, -0x2, -0x22, -0x20, -0x20, -0x2, -0xc, -0xe, -0x2e, -0x2e, -0xd, -0xa, -0x9, -0x2, -0x29, -0x8, -0x29, -0x2, -0x0, -0x20, -0x33, -0x2e, -0x9, -0x2a, -0x9, -0x9, -0xe, -0x29, -0x1, -0x22, -0x39, -0x33, -0x31, -0x32, -0x20, -0x33, -0x39, -0xa, -0x9, -0xc, -0x9, -0x0, -0x22, -0x0, -0x21, -0xa, -0x9, -0x2d, -0x2a, -0x20, -0x1, -0x1, -0x0, -0xc, -0x2a, -0x9, -0x9, -0x2, -0x39, -0x23, -0x2, -0x9, -0x2e, -0x2e, -0x2e, -0x9, -0x8, -0x39, -0x0, -0x39, -0x22, -0x1, -0x2a, -0x9, -0x9, -0x9, -0x29, -0x0, -0x32, -0x21, -0x2b, -0x9, -0xc, -0x8, -0x23, -0x20, -0x3, -0x9, -0x9, -0x9, -0x8, -0x22, -0x32, -0x9, -0xc, -0xb, -0x8, -0x2, -0x39, -0x0, -0x33, -0xa, -0x9, -0x0, -0x0, -0xa, -0xc, -0x3, -0x1, -0x0, -0x2, -0xa, -0x29, -0x29, -0x9, -0x3, -0x33, -0x9, -0x1, -0x2, -0x3, -0x3, -0x0, -0x0, -0x0, -}; - -static Gu3dfInfo hilite_3dfinfo = { - { /* header */ - 0x00000020, /* width */ - 0x00000020, /* height */ - 0x00000008, /* small_lod */ - 0x00000003, /* large_lod */ - GR_ASPECT_1x1, /* aspect_ratio */ - GR_TEXFMT_INTENSITY_8 /* format */ - }, - { {{0x0000000}} }, /* table */ - NULL, /* data */ - 0x00000ab0 /* mem_required */ -}; - -unsigned char hilite_3dfinfo_image[] = { -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x3, -0x2, -0x2, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x2, -0x5, -0x7, -0xc, -0xb, -0xb, -0x7, -0x5, -0x2, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x2, -0x7, -0xb, -0xe, -0x11, -0x16, -0x16, -0x15, -0x11, -0xe, -0xa, -0x6, -0x2, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x3, -0x8, -0x10, -0x14, -0x17, -0x1a, -0x20, -0x21, -0x1e, -0x1a, -0x17, -0x14, -0xe, -0x8, -0x3, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x2, -0x8, -0x10, -0x16, -0x20, -0x22, -0x26, -0x2d, -0x2f, -0x2b, -0x26, -0x21, -0x1b, -0x16, -0x10, -0x8, -0x2, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x7, -0xf, -0x16, -0x1f, -0x28, -0x30, -0x35, -0x3d, -0x40, -0x3d, -0x36, -0x2d, -0x26, -0x1f, -0x16, -0xf, -0x7, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x4, -0xc, -0x15, -0x1c, -0x28, -0x31, -0x41, -0x46, -0x4f, -0x54, -0x50, -0x47, -0x3f, -0x31, -0x28, -0x1c, -0x15, -0xc, -0x4, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x7, -0x11, -0x1a, -0x25, -0x31, -0x3e, -0x4d, -0x60, -0x66, -0x79, -0x64, -0x5e, -0x4d, -0x3e, -0x31, -0x25, -0x1a, -0x11, -0x7, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x2, -0xb, -0x14, -0x1f, -0x2a, -0x39, -0x4a, -0x63, -0x76, -0x94, -0xa4, -0x8c, -0x76, -0x5a, -0x4a, -0x39, -0x2a, -0x1f, -0x14, -0xb, -0x2, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x4, -0xe, -0x16, -0x21, -0x2f, -0x40, -0x54, -0x6a, -0x91, -0xcf, -0xd9, -0xc5, -0x95, -0x76, -0x54, -0x40, -0x2f, -0x21, -0x16, -0xe, -0x4, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x6, -0x10, -0x1b, -0x27, -0x35, -0x47, -0x60, -0x81, -0xc1, -0xeb, -0xff, -0xe8, -0xb8, -0x73, -0x5d, -0x44, -0x31, -0x23, -0x17, -0xe, -0x4, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x4, -0xe, -0x17, -0x27, -0x38, -0x4e, -0x69, -0x95, -0xc7, -0xec, -0xff, -0xe6, -0xbe, -0x81, -0x5c, -0x45, -0x31, -0x23, -0x17, -0xe, -0x4, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x3, -0xb, -0x16, -0x1c, -0x2a, -0x3a, -0x4e, -0x5b, -0x73, -0x9a, -0xd1, -0xf9, -0xc0, -0x9d, -0x70, -0x5d, -0x4b, -0x32, -0x22, -0x16, -0xe, -0x4, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x6, -0x13, -0x1c, -0x21, -0x2a, -0x43, -0x53, -0x64, -0x7c, -0xa7, -0x97, -0x94, -0x7a, -0x64, -0x52, -0x3c, -0x2e, -0x1f, -0x14, -0xb, -0x2, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x7, -0x11, -0x1e, -0x2c, -0x33, -0x46, -0x55, -0x69, -0x72, -0x6d, -0x6c, -0x62, -0x54, -0x46, -0x33, -0x25, -0x1a, -0x11, -0x7, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x4, -0x11, -0x15, -0x1c, -0x28, -0x34, -0x47, -0x56, -0x55, -0x55, -0x54, -0x4b, -0x47, -0x34, -0x28, -0x1c, -0x15, -0xc, -0x4, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x2, -0x7, -0xf, -0x16, -0x1f, -0x2a, -0x34, -0x42, -0x3f, -0x3f, -0x3f, -0x3d, -0x30, -0x29, -0x1f, -0x16, -0xf, -0x7, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x2, -0x8, -0x10, -0x16, -0x1e, -0x25, -0x2e, -0x2c, -0x2c, -0x2c, -0x28, -0x21, -0x1b, -0x16, -0x10, -0x8, -0x2, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x3, -0x8, -0xe, -0x14, -0x19, -0x1c, -0x1c, -0x1c, -0x1c, -0x1a, -0x17, -0x14, -0xe, -0x8, -0x3, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x2, -0x6, -0xa, -0x11, -0x11, -0x13, -0x13, -0x13, -0x11, -0xe, -0xa, -0x6, -0x2, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x2, -0xa, -0x7, -0x8, -0x8, -0x8, -0x7, -0x5, -0x2, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x1, -0x1, -0x1, -0x1, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x59, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x2, -0x5, -0x6, -0x4, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x9, -0x11, -0x19, -0x1b, -0x14, -0xc, -0x3, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x8, -0x17, -0x27, -0x31, -0x35, -0x2b, -0x1e, -0xf, -0x3, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x3, -0x13, -0x26, -0x3f, -0x57, -0x60, -0x4c, -0x32, -0x1c, -0xa, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x8, -0x1a, -0x35, -0x5b, -0x9b, -0xb4, -0x77, -0x46, -0x26, -0x11, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0xa, -0x20, -0x41, -0x78, -0xd8, -0xf3, -0x9a, -0x51, -0x2a, -0x13, -0x2, -0x0, -0x0, -0x0, -0x0, -0x1, -0xe, -0x20, -0x3d, -0x62, -0xa4, -0xb9, -0x7b, -0x4e, -0x28, -0x11, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x3, -0x15, -0x29, -0x46, -0x62, -0x60, -0x52, -0x35, -0x1c, -0xa, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x8, -0x17, -0x28, -0x37, -0x35, -0x2e, -0x1e, -0xf, -0x3, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x8, -0x12, -0x17, -0x18, -0x14, -0xc, -0x3, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x3, -0x4, -0x5, -0x4, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x16, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x3, -0xd, -0xf, -0x4, -0x0, -0x0, -0x0, -0x1, -0x16, -0x3c, -0x44, -0x1f, -0x3, -0x0, -0x0, -0x4, -0x2c, -0x92, -0xae, -0x3a, -0xa, -0x0, -0x0, -0x4, -0x27, -0x6c, -0x7a, -0x32, -0x7, -0x0, -0x0, -0x0, -0xa, -0x22, -0x24, -0xf, -0x1, -0x0, -0x0, -0x0, -0x0, -0x2, -0x2, -0x0, -0x0, -0x0, -0x5, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x4, -0x5, -0x0, -0x1, -0x44, -0x53, -0x3, -0x1, -0x30, -0x38, -0x2, -0x1, -0x0, -0x0, -0x0, -0x12, -0x17, -0xd, -0xf, -0x11, -0x0, -0x0, -0x0, -}; - -static Gu3dfInfo shadow_3dfinfo = { - { /* header */ - 0x00000040, /* width */ - 0x00000020, /* height */ - GR_LOD_1, /* small_lod */ - GR_LOD_64, /* large_lod */ - GR_ASPECT_2x1, /* aspect_ratio */ - GR_TEXFMT_INTENSITY_8 /* format */ - }, - { {{0x00000000}} }, /* table */ - NULL, /* data */ - 0x00000ab0 /* mem_required */ -}; - -unsigned char shadow_3dfinfo_image[] = { -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xfb, -0xfa, -0xfa, -0xfb, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xfd, -0xfd, -0xfd, -0xfd, -0xfd, -0xfd, -0xfd, -0xfd, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xf4, -0xe4, -0xd7, -0xd0, -0xcf, -0xd6, -0xe2, -0xf2, -0xfc, -0xff, -0xff, -0xfb, -0xe8, -0xdf, -0xdf, -0xdf, -0xdf, -0xde, -0xdf, -0xe0, -0xe2, -0xe7, -0xee, -0xf5, -0xfa, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf1, -0xc0, -0x94, -0x80, -0x79, -0x78, -0x7f, -0x91, -0xb1, -0xda, -0xf8, -0xfd, -0xe7, -0xab, -0x8c, -0x89, -0x89, -0x89, -0x89, -0x89, -0x8b, -0x8e, -0x96, -0xa1, -0xb4, -0xcf, -0xe8, -0xf9, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xe3, -0x93, -0x60, -0x58, -0x58, -0x57, -0x55, -0x59, -0x6b, -0x96, -0xd4, -0xf7, -0xdc, -0x88, -0x5d, -0x59, -0x59, -0x5a, -0x5a, -0x5b, -0x5b, -0x5b, -0x5d, -0x60, -0x6a, -0x7e, -0xa0, -0xcc, -0xf0, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xe2, -0x96, -0x72, -0x7a, -0x7e, -0x74, -0x60, -0x53, -0x53, -0x66, -0xa3, -0xe8, -0xdb, -0x84, -0x57, -0x52, -0x54, -0x5d, -0x67, -0x69, -0x68, -0x65, -0x5f, -0x59, -0x56, -0x58, -0x64, -0x86, -0xbc, -0xed, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xfa, -0xf7, -0xf4, -0xf3, -0xf6, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xef, -0xc8, -0xc1, -0xd1, -0xd6, -0xc4, -0x95, -0x62, -0x52, -0x57, -0x84, -0xd7, -0xd9, -0x84, -0x57, -0x52, -0x5b, -0x82, -0xac, -0xb6, -0xb4, -0xac, -0x9c, -0x83, -0x68, -0x58, -0x55, -0x5d, -0x7f, -0xc0, -0xf3, -0xff, -0xff, -0xff, -0xff, -0xf9, -0xe5, -0xcc, -0xba, -0xb0, -0xaf, -0xc4, -0xeb, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xf7, -0xf8, -0xfb, -0xfc, -0xf5, -0xc9, -0x79, -0x55, -0x54, -0x7c, -0xd0, -0xd8, -0x85, -0x58, -0x52, -0x61, -0xa1, -0xe7, -0xf6, -0xf6, -0xf3, -0xe9, -0xd1, -0xa5, -0x72, -0x58, -0x54, -0x5f, -0x8d, -0xd6, -0xfb, -0xff, -0xff, -0xf8, -0xd2, -0x9f, -0x7e, -0x77, -0x7b, -0x81, -0xa8, -0xe5, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf9, -0xd0, -0x7d, -0x55, -0x57, -0x88, -0xda, -0xd9, -0x85, -0x58, -0x53, -0x61, -0xa7, -0xf2, -0xff, -0xff, -0xff, -0xfe, -0xf9, -0xe2, -0xa7, -0x6a, -0x55, -0x56, -0x6c, -0xb2, -0xf2, -0xff, -0xfd, -0xe2, -0x9a, -0x69, -0x6c, -0x95, -0xb3, -0xbd, -0xd0, -0xed, -0xf5, -0xf8, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xfa, -0xf7, -0xf6, -0xf9, -0xfe, -0xfe, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf6, -0xda, -0xa6, -0x69, -0x55, -0x69, -0xaa, -0xeb, -0xdc, -0x85, -0x58, -0x52, -0x61, -0xa7, -0xf1, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfa, -0xd4, -0x87, -0x5b, -0x55, -0x5d, -0x93, -0xe3, -0xfd, -0xfa, -0xcc, -0x7a, -0x5e, -0x85, -0xd1, -0xf3, -0xf0, -0xd8, -0xbf, -0xb7, -0xc4, -0xe5, -0xfc, -0xff, -0xff, -0xf4, -0xd2, -0xbb, -0xbc, -0xd6, -0xf1, -0xf2, -0xf0, -0xf8, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfa, -0xd1, -0x94, -0x6b, -0x57, -0x64, -0x97, -0xd9, -0xf8, -0xdc, -0x84, -0x57, -0x52, -0x61, -0xa7, -0xf1, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xec, -0xa1, -0x62, -0x54, -0x58, -0x80, -0xd4, -0xf8, -0xef, -0xbb, -0x70, -0x5f, -0x8e, -0xda, -0xf4, -0xf2, -0xd5, -0x9d, -0x77, -0x7a, -0xaa, -0xe4, -0xfc, -0xf4, -0xc8, -0x8c, -0x76, -0x93, -0xcc, -0xf2, -0xf2, -0xed, -0xf6, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf6, -0xb8, -0x6b, -0x53, -0x56, -0x75, -0xb9, -0xf1, -0xfc, -0xdb, -0x84, -0x57, -0x52, -0x61, -0xa7, -0xf1, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf5, -0xb0, -0x67, -0x55, -0x57, -0x77, -0xc7, -0xde, -0xba, -0x90, -0x65, -0x5b, -0x77, -0xa3, -0xb5, -0xcb, -0xe5, -0xc8, -0x8e, -0x68, -0x75, -0xaf, -0xdd, -0xcc, -0x8e, -0x6c, -0x85, -0xbe, -0xed, -0xfe, -0xfd, -0xfc, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf7, -0xba, -0x6e, -0x54, -0x53, -0x64, -0x93, -0xd0, -0xf5, -0xdc, -0x84, -0x57, -0x52, -0x61, -0xa7, -0xf1, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf6, -0xb4, -0x69, -0x56, -0x56, -0x74, -0xc0, -0xc7, -0x8f, -0x6e, -0x5b, -0x58, -0x64, -0x76, -0x80, -0xa6, -0xe7, -0xf2, -0xcc, -0x90, -0x6a, -0x77, -0x98, -0x8a, -0x70, -0x88, -0xc2, -0xef, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfb, -0xd8, -0xa0, -0x76, -0x59, -0x53, -0x63, -0x96, -0xdc, -0xd9, -0x84, -0x57, -0x52, -0x61, -0xa7, -0xf1, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf2, -0xab, -0x65, -0x55, -0x57, -0x79, -0xca, -0xdf, -0xbd, -0x91, -0x65, -0x5b, -0x78, -0xa6, -0xb8, -0xce, -0xf3, -0xff, -0xf5, -0xcd, -0x8d, -0x65, -0x64, -0x66, -0x83, -0xc4, -0xf2, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfa, -0xe5, -0xb9, -0x77, -0x55, -0x53, -0x70, -0xbb, -0xd2, -0x85, -0x57, -0x52, -0x61, -0xa7, -0xf1, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xe3, -0x95, -0x5e, -0x54, -0x59, -0x85, -0xd8, -0xf9, -0xf0, -0xba, -0x6f, -0x5f, -0x90, -0xdd, -0xf4, -0xf9, -0xff, -0xff, -0xfe, -0xe7, -0xa4, -0x6a, -0x5c, -0x63, -0x91, -0xd9, -0xfb, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xe5, -0x96, -0x5c, -0x51, -0x62, -0xa5, -0xca, -0x84, -0x57, -0x52, -0x61, -0xa7, -0xf1, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf3, -0xc0, -0x77, -0x58, -0x54, -0x61, -0x9c, -0xe8, -0xfe, -0xf8, -0xc2, -0x71, -0x60, -0x95, -0xe7, -0xfe, -0xff, -0xff, -0xfe, -0xed, -0xbf, -0x84, -0x6a, -0x70, -0x68, -0x74, -0xab, -0xe1, -0xfa, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfb, -0xf8, -0xfd, -0xff, -0xff, -0xfe, -0xe8, -0x99, -0x5d, -0x52, -0x60, -0xa1, -0xc9, -0x84, -0x57, -0x52, -0x61, -0xa6, -0xef, -0xfd, -0xfd, -0xfc, -0xf9, -0xee, -0xc9, -0x8b, -0x5f, -0x54, -0x57, -0x74, -0xbd, -0xf5, -0xff, -0xf8, -0xc2, -0x71, -0x60, -0x95, -0xe7, -0xfe, -0xff, -0xfc, -0xe8, -0xb8, -0x81, -0x6f, -0x91, -0xb2, -0x96, -0x6e, -0x73, -0xa4, -0xdb, -0xf9, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfb, -0xe0, -0xca, -0xdd, -0xef, -0xf5, -0xeb, -0xc3, -0x7d, -0x56, -0x52, -0x66, -0xad, -0xcd, -0x85, -0x57, -0x52, -0x5f, -0x97, -0xd3, -0xe1, -0xdf, -0xd9, -0xca, -0xad, -0x83, -0x61, -0x55, -0x55, -0x66, -0x9d, -0xe1, -0xfd, -0xff, -0xf8, -0xc2, -0x71, -0x60, -0x95, -0xe7, -0xfe, -0xfd, -0xe6, -0xb3, -0x7d, -0x6d, -0x93, -0xd0, -0xef, -0xd6, -0x98, -0x6c, -0x71, -0xa0, -0xd9, -0xf9, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf8, -0xc2, -0x85, -0x8c, -0xa4, -0xad, -0xa0, -0x7e, -0x5c, -0x51, -0x56, -0x7d, -0xc9, -0xd5, -0x84, -0x57, -0x52, -0x58, -0x6e, -0x87, -0x8c, -0x8a, -0x83, -0x77, -0x68, -0x5a, -0x54, -0x58, -0x68, -0x94, -0xd3, -0xf9, -0xff, -0xff, -0xf8, -0xc2, -0x71, -0x60, -0x95, -0xe7, -0xfd, -0xf5, -0xcd, -0x9b, -0x86, -0x9d, -0xd1, -0xf6, -0xff, -0xf8, -0xd4, -0x9e, -0x84, -0x91, -0xbd, -0xed, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf7, -0xbe, -0x6f, -0x5a, -0x5f, -0x63, -0x5f, -0x56, -0x53, -0x58, -0x71, -0xac, -0xe9, -0xdb, -0x84, -0x57, -0x53, -0x54, -0x57, -0x5b, -0x5b, -0x5b, -0x5a, -0x58, -0x57, -0x5a, -0x63, -0x79, -0xa3, -0xd5, -0xf7, -0xff, -0xff, -0xff, -0xf8, -0xc2, -0x71, -0x60, -0x95, -0xe7, -0xfd, -0xfa, -0xe6, -0xd6, -0xd5, -0xe4, -0xf8, -0xff, -0xff, -0xff, -0xf9, -0xe4, -0xd5, -0xd4, -0xe0, -0xf6, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfa, -0xd2, -0x8f, -0x6d, -0x61, -0x5e, -0x5d, -0x61, -0x6c, -0x85, -0xb2, -0xe3, -0xf9, -0xdf, -0x92, -0x6a, -0x66, -0x67, -0x67, -0x67, -0x67, -0x69, -0x6c, -0x70, -0x78, -0x89, -0xa4, -0xc5, -0xe6, -0xfa, -0xff, -0xff, -0xff, -0xff, -0xf8, -0xc1, -0x71, -0x60, -0x95, -0xe7, -0xfe, -0xff, -0xfc, -0xfb, -0xfb, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xfb, -0xfb, -0xfc, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf4, -0xd8, -0xbe, -0xaa, -0xa0, -0xa0, -0xa9, -0xbb, -0xd5, -0xef, -0xfd, -0xfe, -0xf0, -0xc8, -0xb4, -0xb2, -0xb2, -0xb3, -0xb3, -0xb3, -0xb6, -0xbb, -0xc3, -0xcd, -0xdc, -0xec, -0xf8, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf9, -0xc9, -0x83, -0x73, -0xa2, -0xea, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfc, -0xf7, -0xf2, -0xee, -0xee, -0xf1, -0xf7, -0xfb, -0xff, -0xff, -0xff, -0xfe, -0xf8, -0xf5, -0xf5, -0xf5, -0xf5, -0xf5, -0xf5, -0xf6, -0xf7, -0xf8, -0xfa, -0xfc, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xe7, -0xc5, -0xbd, -0xd4, -0xf6, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfa, -0xf6, -0xf6, -0xf9, -0xfd, -0xfe, -0xff, -0xff, -0xff, -0xfe, -0xfe, -0xff, -0xff, -0xfe, -0xfd, -0xfc, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xf4, -0xf1, -0xf2, -0xf3, -0xee, -0xf0, -0xf4, -0xf6, -0xf5, -0xf4, -0xf3, -0xf7, -0xf6, -0xf1, -0xea, -0xea, -0xf0, -0xf6, -0xf7, -0xf5, -0xfa, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfc, -0xe7, -0xd4, -0xce, -0xd0, -0xcb, -0xcd, -0xcd, -0xd3, -0xd4, -0xd9, -0xd3, -0xd7, -0xd8, -0xd6, -0xcc, -0xd0, -0xd4, -0xd5, -0xd3, -0xd0, -0xe7, -0xfc, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfb, -0xde, -0xc5, -0xc0, -0xc4, -0xc2, -0xc1, -0xbc, -0xc5, -0xcb, -0xd5, -0xc3, -0xbf, -0xcb, -0xd7, -0xcb, -0xca, -0xc7, -0xbf, -0xbf, -0xbe, -0xe0, -0xfb, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfb, -0xe3, -0xcf, -0xce, -0xd0, -0xcc, -0xc9, -0xc9, -0xd5, -0xda, -0xd9, -0xc2, -0xc2, -0xcd, -0xd8, -0xd0, -0xd2, -0xd7, -0xd2, -0xd3, -0xcf, -0xe9, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf6, -0xee, -0xee, -0xef, -0xeb, -0xe8, -0xe8, -0xef, -0xf2, -0xef, -0xe3, -0xe6, -0xe9, -0xeb, -0xe8, -0xec, -0xf4, -0xf4, -0xf3, -0xeb, -0xf6, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xfe, -0xfe, -0xfd, -0xfd, -0xfd, -0xfe, -0xfe, -0xfe, -0xfc, -0xfd, -0xfd, -0xfd, -0xfd, -0xfd, -0xff, -0xff, -0xff, -0xfd, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xfd, -0xff, -0xff, -0xff, -0xfe, -0xfe, -0xfe, -0xfe, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfb, -0xcb, -0xa8, -0xa7, -0xc6, -0xf3, -0xf8, -0xc0, -0xb4, -0xb4, -0xb5, -0xbb, -0xce, -0xec, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf0, -0x7f, -0x6a, -0x60, -0x5b, -0x9d, -0xe6, -0x70, -0x56, -0x5e, -0x62, -0x5f, -0x5e, -0x77, -0xc0, -0xfa, -0xff, -0xff, -0xff, -0xfc, -0xf9, -0xfc, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfb, -0xde, -0xe8, -0xc6, -0x61, -0x6b, -0xd6, -0x6e, -0x58, -0xae, -0xd6, -0xc9, -0x98, -0x5e, -0x64, -0xc6, -0xfe, -0xfd, -0xd4, -0x9f, -0x97, -0xcf, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xd2, -0x64, -0x7d, -0xdf, -0x6f, -0x5a, -0xcc, -0xff, -0xff, -0xf5, -0x9b, -0x57, -0x84, -0xf4, -0xe9, -0x77, -0x96, -0xd5, -0xd5, -0xda, -0xf7, -0xff, -0xf0, -0xd9, -0xf0, -0xf7, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xde, -0x6f, -0x62, -0xc7, -0xeb, -0x6e, -0x5a, -0xcc, -0xff, -0xff, -0xff, -0xcd, -0x5d, -0x6a, -0xdc, -0xbd, -0x64, -0xa1, -0xda, -0xc8, -0x7a, -0xad, -0xe6, -0x94, -0x93, -0xea, -0xf6, -0xfc, -0xff, -0xff, -0xff, -0xff, -0xe1, -0x76, -0x59, -0x97, -0xe2, -0x6e, -0x5a, -0xcc, -0xff, -0xff, -0xff, -0xd2, -0x5e, -0x67, -0xcc, -0x93, -0x5d, -0x7e, -0xab, -0xf3, -0xc8, -0x75, -0x7b, -0x90, -0xe9, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xe0, -0x70, -0x5e, -0xbf, -0x6e, -0x5a, -0xcc, -0xff, -0xff, -0xfc, -0xac, -0x58, -0x77, -0xee, -0xd9, -0x68, -0xba, -0xfb, -0xff, -0xe4, -0x7f, -0x66, -0xa2, -0xf5, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf5, -0xe7, -0xf9, -0xe5, -0x72, -0x5b, -0xb9, -0x6e, -0x59, -0xc0, -0xef, -0xe6, -0xba, -0x68, -0x5a, -0xac, -0xfc, -0xdd, -0x69, -0xbe, -0xfe, -0xdf, -0x89, -0x99, -0xc3, -0x79, -0xa4, -0xf3, -0xff, -0xff, -0xff, -0xff, -0xdc, -0x77, -0x85, -0x75, -0x56, -0x7c, -0xd9, -0x6e, -0x54, -0x6a, -0x73, -0x6b, -0x5d, -0x62, -0x9d, -0xf1, -0xff, -0xdd, -0x69, -0xbe, -0xfa, -0xc9, -0xb7, -0xf0, -0xfd, -0xd4, -0xb0, -0xe0, -0xff, -0xff, -0xff, -0xff, -0xf0, -0xa5, -0x82, -0x82, -0xa0, -0xe0, -0xf2, -0x9e, -0x8c, -0x8d, -0x8e, -0x97, -0xab, -0xd3, -0xf7, -0xff, -0xff, -0xdf, -0x72, -0xc2, -0xff, -0xfd, -0xfe, -0xff, -0xff, -0xff, -0xfd, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfc, -0xf8, -0xf7, -0xfc, -0xff, -0xff, -0xfb, -0xfa, -0xfa, -0xfa, -0xfb, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xf7, -0xdc, -0xf0, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf5, -0xe1, -0xdf, -0xe0, -0xe5, -0xe5, -0xe7, -0xdf, -0xe0, -0xe5, -0xea, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xee, -0xc9, -0xc9, -0xc4, -0xd0, -0xcd, -0xc6, -0xd3, -0xcf, -0xc9, -0xd6, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xf6, -0xf5, -0xf3, -0xf7, -0xf3, -0xf2, -0xf3, -0xf7, -0xf9, -0xf7, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xdc, -0xda, -0xfa, -0xdc, -0xd9, -0xe2, -0xfa, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfa, -0xac, -0x79, -0xb1, -0x63, -0x91, -0x88, -0x7e, -0xef, -0xf4, -0xcb, -0xf2, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf6, -0x82, -0xc4, -0x64, -0xe6, -0xfd, -0x87, -0xb0, -0xa0, -0xba, -0xbc, -0xe2, -0xbc, -0xf2, -0xfe, -0xff, -0xf7, -0x88, -0xa6, -0x64, -0xe6, -0xfe, -0x8d, -0xa6, -0x8c, -0xb8, -0xe8, -0x75, -0xc4, -0xff, -0xff, -0xf4, -0xb7, -0x89, -0x9a, -0x62, -0xa3, -0x9a, -0x70, -0xe6, -0xa3, -0xdd, -0xba, -0xd2, -0xa8, -0xf4, -0xff, -0xfb, -0xc7, -0xc5, -0xf4, -0xc8, -0xc4, -0xcf, -0xf2, -0xff, -0xc9, -0xec, -0xfe, -0xff, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xe3, -0xd3, -0xda, -0xd8, -0xd7, -0xef, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfc, -0xfa, -0xfa, -0xf9, -0xfc, -0xfd, -0xff, -0xe0, -0xc0, -0xaa, -0xb9, -0xf8, -0xef, -0xff, -0xff, -0xfb, -0x9d, -0xa5, -0xc4, -0xa1, -0xc6, -0xb6, -0xfc, -0xdb, -0xb7, -0xa4, -0xb3, -0xd4, -0xe0, -0xde, -0xfc, -0xff, -0xff, -0xff, -0xff, -0xf7, -0xe8, -0xe9, -0xfb, -0xce, -0xb3, -0xd4, -0xec, -0xe4, -0xd5, -0xe5, -0xf0, -0xcf, -0xe5, -0xda, -0x0, -0x0, -0x0, -0x0, -0x0, -}; - -#undef RAW_NAME -#undef IMAGE_NAME diff --git a/glide2x/cvg/glide/src/xdraw2.S b/glide2x/cvg/glide/src/xdraw2.S deleted file mode 100644 index 8c2fae3..0000000 --- a/glide2x/cvg/glide/src/xdraw2.S +++ /dev/null @@ -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 -#flds TEXTEQU -#fsubs TEXTEQU -#fmuls TEXTEQU - - .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 - - - diff --git a/glide2x/cvg/glide/src/xdraw2.asm b/glide2x/cvg/glide/src/xdraw2.asm deleted file mode 100644 index b79ea38..0000000 --- a/glide2x/cvg/glide/src/xdraw2.asm +++ /dev/null @@ -1,220 +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$ -;; -;; 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. -;; - -TITLE xdraw2.asm -OPTION OLDSTRUCTS -.586P - -.model FLAT,C ; Flat memory, mangle publics with leading '_' - -; some useful floating load and store macros -flds TEXTEQU -fsubs TEXTEQU -fmuls TEXTEQU - -_DATA SEGMENT - One DD 03f800000r - Area DD 0 - dxAB DD 0 - dxBC DD 0 - dyAB DD 0 - dyBC DD 0 - culltest DD 0 - - ;; Extra junk to pad out to the next cache line. - bias0 DD 0 - pad1 DD 0 - pad2 DD 0 - pad3 DD 0 - pad4 DD 0 - pad5 DD 0 - pad6 DD 0 - pad7 DD 0 - bias1 DD 0 -_DATA ENDS - -; Ugly, but seems to workaround the problem with locally defined -; data segment globals not getting relocated properly when using -; djgpp. - -zArea TEXTEQU -zdxAB TEXTEQU -zdxBC TEXTEQU -zdyAB TEXTEQU -zdyBC TEXTEQU -zculltest TEXTEQU - -;;; Definitions of cvg regs and glide root structures. -INCLUDE fxgasm.h - -;; enables/disables trisProcessed and trisDrawn counters -STATS = 1 - -;-------------------------------------------------------------------------- -; Arguments (STKOFF = 16 from 4 pushes) -STKOFF = 16 -_va$ = 4 + STKOFF -_vb$ = 8 + STKOFF -_vc$ = 12 + STKOFF - -X = 0 -Y = 4 - ; edx is used as index, loading from *src -gc TEXTEQU ; points to graphics context - -_TEXT SEGMENT - - align 4 - PUBLIC _trisetup_cull@12 -_trisetup_cull@12 PROC NEAR - .code - -GLIDE_CULLING textequ <1> -GLIDE_PACK_RGB textequ <0> -GLIDE_PACK_ALPHA textequ <0> -GLIDE_GENERIC_SETUP textequ <0> -INCLUDE xdraw2.inc -GLIDE_GENERIC_SETUP textequ <0> -GLIDE_PACK_ALPHA textequ <0> -GLIDE_PACK_RGB textequ <0> -GLIDE_CULLING textequ <0> - -_trisetup_cull@12 ENDP - -IF GLIDE_PACKED_RGB - align 4 - PUBLIC _trisetup_cull_rgb@12 -_trisetup_cull_rgb@12 PROC NEAR - .code - -GLIDE_CULLING textequ <1> -GLIDE_PACK_RGB textequ <1> -GLIDE_PACK_ALPHA textequ <0> -GLIDE_GENERIC_SETUP textequ <0> -INCLUDE xdraw2.inc -GLIDE_GENERIC_SETUP textequ <0> -GLIDE_PACK_ALPHA textequ <0> -GLIDE_PACK_RGB textequ <0> -GLIDE_CULLING textequ <0> - -_trisetup_cull_rgb@12 ENDP - - align 4 - PUBLIC _trisetup_cull_argb@12 -_trisetup_cull_argb@12 PROC NEAR - .code - -GLIDE_CULLING textequ <1> -GLIDE_PACK_RGB textequ <1> -GLIDE_PACK_ALPHA textequ <1> -GLIDE_GENERIC_SETUP textequ <0> -INCLUDE xdraw2.inc -GLIDE_GENERIC_SETUP textequ <0> -GLIDE_PACK_ALPHA textequ <0> -GLIDE_PACK_RGB textequ <0> -GLIDE_CULLING textequ <0> - -_trisetup_cull_argb@12 ENDP -ENDIF ; GLIDE_PACKED_RGB - - align 4 - PUBLIC _trisetup@12 -_trisetup@12 PROC NEAR - .code - -GLIDE_CULLING textequ <0> -GLIDE_PACK_RGB textequ <0> -GLIDE_PACK_ALPHA textequ <0> -GLIDE_GENERIC_SETUP textequ <0> -INCLUDE xdraw2.inc -GLIDE_GENERIC_SETUP textequ <0> -GLIDE_PACK_ALPHA textequ <0> -GLIDE_PACK_RGB textequ <0> -GLIDE_CULLING textequ <0> - -_trisetup@12 ENDP - -IF GLIDE_PACKED_RGB - align 4 - PUBLIC _trisetup_rgb@12 -_trisetup_rgb@12 PROC NEAR - .code - -GLIDE_CULLING textequ <0> -GLIDE_PACK_RGB textequ <1> -GLIDE_PACK_ALPHA textequ <0> -GLIDE_GENERIC_SETUP textequ <0> -INCLUDE xdraw2.inc -GLIDE_GENERIC_SETUP textequ <0> -GLIDE_PACK_ALPHA textequ <0> -GLIDE_PACK_RGB textequ <0> -GLIDE_CULLING textequ <0> - -_trisetup_rgb@12 ENDP - - align 4 - PUBLIC _trisetup_argb@12 -_trisetup_argb@12 PROC NEAR - .code - -GLIDE_CULLING textequ <0> -GLIDE_PACK_RGB textequ <1> -GLIDE_PACK_ALPHA textequ <1> -GLIDE_GENERIC_SETUP textequ <0> -INCLUDE xdraw2.inc -GLIDE_GENERIC_SETUP textequ <0> -GLIDE_PACK_ALPHA textequ <0> -GLIDE_PACK_RGB textequ <0> -GLIDE_CULLING textequ <0> - -_trisetup_argb@12 ENDP -ENDIF ; GLIDE_PACKED_RGB - -_TEXT ENDS -END diff --git a/glide2x/cvg/glide/src/xdraw2.inc b/glide2x/cvg/glide/src/xdraw2.inc deleted file mode 100644 index 1bbd2c3..0000000 --- a/glide2x/cvg/glide/src/xdraw2.inc +++ /dev/null @@ -1,310 +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$ -; -; 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. -;; - -TITLE xdraw2.inc -.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 TEXTEQU -zdxAB TEXTEQU -zdxBC TEXTEQU -zdyAB TEXTEQU -zdyBC TEXTEQU -zculltest TEXTEQU - -gc TEXTEQU ; points to graphics context - - ;; Prologue stuff - push esi - push edi - - push ebx - push ebp - - mov gc, [_GlideRoot + curGC] ;; GR_DCL_GC - - align 4 -IF GLIDE_CULLING -fa TEXTEQU ; vtx a from caller -fb TEXTEQU ; vtx b from caller -fc TEXTEQU ; vtx c from caller - -cull TEXTEQU -intArea TEXTEQU ; temp Y storage - - ;; Pre-load the current culling mode before all of the - ;; floating point area stuff. - mov cull, [gc + cull_mode] - mov fa, [esp + _va$] - - mov fb, [esp + _vb$] - mov fc, [esp + _vc$] - - shl cull, 31 ; culltest << 31 - -Area_Computation: -; 47-3 -; jmp ret_pop0f - flds [fa + X] ; xa - fsubs [fb + X] ; dxAB - flds [fb + X] ; | xb - fsubs [fc + X] ; | dxBC - flds [fb + Y] ; | | yb - fsubs [fc + Y] ; | | dyBC - flds [fa + Y] ; | | | ya - fsubs [fb + Y] ; | | | dyAB - fld st(3) ; | | | | dxAB - fmul st, st(2) ; | | | | t0 t0=dxAB*dyBC - fld st(3) ; | | | | | dxBC - fmul st, st(2) ; | | | | | t1 t1=dxBC*dyAB - fsubp st(1),st ; | | | | area - fst zArea ; | | | | area - - ;; Pop temp things from the sw culling off the fp stack - fstp st(0) ; 4 - fstp st(0) ; 3 - fstp st(0) ; 2 - fstp st(0) ; 1 - fstp st(0) ; 0 - - mov intArea, zArea ; j = *(long *)&area - xor eax, eax ; Clear the return value (0 == culled) - - ; Zero Area Triangle Check - and intArea, 7fffffffh ; if ((j & 0x7FFFFFFF) == 0) - jz __triDone - - ;; Triangle area check vs culling mode - mov intArea, zArea ; reload area just in case we're culling - xor intArea, cull ; if (j ^ (culltest << 31)) - - jge __triDone -ENDIF ; GLIDE_CULLING - - align 4 - ;; Check to make sure that we have enough room for - ;; the complete triangle packet. - mov eax, [_GlideRoot + curTriSize] - mov ebx, [gc + fifoRoom] - - add eax, 4 - cmp ebx, eax - - jge __triBegin - - push @Line - push 0h - - push eax - call _FifoMakeRoom - - add esp, 12 - - ;; Send triangle parameters - -dlp TEXTEQU ; points to dataList structure -fifo TEXTEQU ; points to next entry in fifo -vertex TEXTEQU ; the current vertex -vOffset TEXTEQU ; Current vertex offset - -packCol TEXTEQU -tempVal TEXTEQU - -GR_FIFO_WRITE MACRO __addr, __offset, __data - mov [__addr + __offset], __data -ENDM ; GR_FIFO_WRITE - - align 4 -__triBegin: - mov fifo, [gc + fifoPtr] ; Fetch Fifo Ptr - mov vOffset, 4 ; Starting vertex - - mov eax, [gc + triPacketHdr] ; Packet 3 header - nop - - GR_FIFO_WRITE fifo, 0, eax ; Write packet header to fifo - add fifo, 4 ; Advance fifo for hdr & x/y coordinate - - align 4 -__vertexStart: - mov vertex, [esp + STKOFF + vOffset] ; Current vertex - add fifo, 8 - - nop ; Avoid p5 agi w/ load of vertex ptr - nop - - mov eax, DWORD PTR [vertex + x] ; X - lea dlp, [gc + tsuDataList] ; Reset the dataList - - GR_FIFO_WRITE fifo, -8, eax ; PCI write X - mov eax, DWORD PTR [vertex + y] ; Y - - xor packCol, packCol ; Clear packed color - GR_FIFO_WRITE fifo, -4, eax ; PCI write Y - -IF GLIDE_PACK_RGB - fld DWORD PTR [vertex + b] ; B - fadd DWORD PTR _GlideRoot + fBiasLo ; BC GC - - fld DWORD PTR [vertex + g] ; G B - fadd DWORD PTR _GlideRoot + fBiasHi ; GC B - - fld DWORD PTR [vertex + r] ; R GC BC - fadd DWORD PTR _GlideRoot + fBiasHi ; RC GC BC - - fxch st(2) ; BC GC RC - fstp DWORD PTR bias0 ; GC RC - - fstp DWORD PTR bias1 ; RC - mov packCol, DWORD PTR bias0 ; B + bias - - fstp DWORD PTR bias0 - mov eax, DWORD PTR bias1 ; G + bias - -IF GLIDE_PACK_ALPHA - fld DWORD PTR [vertex + a] - fadd DWORD PTR _GlideRoot + fBiasHi - - and packCol, 00FFh ; B color component - and eax, 0000FF00h ; G component << 8 - - add dlp, 8 ; Packed RGB + A dataList entry - nop - - or packCol, eax ; 0000GGBB - nop - - fstp DWORD PTR bias1 - mov eax, DWORD PTR bias0 ; R + bias - - mov esi, DWORD PTR bias1 ; A + bias - and eax, 0000FF00h ; R component << 8 - - and esi, 0FFFFFF00h ; A component << 8 - shl eax, 8 ; R << 16 - - or packCol, eax ; 00RRGGBB - shl esi, 16 ; A << 16 - - or packCol, esi ; AARRGGBB - nop -ELSE ; !GLIDE_PACK_ALPHA - and packCol, 00FFh ; B color component - and eax, 0000FF00h ; G component << 8 - - add dlp, 4 ; Next dataList item - or packCol, eax - - mov eax, DWORD PTR bias0 ; R + bias - and eax, 0000FF00h ; R component << 8 - - shl eax, 8 ; R << 16 - or packCol, eax ; 00RRGGBB -ENDIF ; !GLIDE_PACK_ALPHA - - GR_FIFO_WRITE fifo, 0, packCol ; PCI write packed color value - add fifo, 4 -ENDIF ; GLIDE_PACK_RGB - -__doParams: - mov eax, DWORD PTR [dlp] ; Get first offset from the data list - add dlp, 4 ; dlp++ - - cmp eax, 0 ; Are we done? - je __nextVertex - - ;; Not using align directive here because it sometimes - ;; introduces an agi for the eax use below. - nop - nop - -__paramLoop: - mov tempVal, DWORD PTR [eax + vertex] ; Get the parameter from teh vertex - add fifo, 4 ; fifoPtr += sizeof(FxU32) - - mov eax, DWORD PTR [dlp] ; offset = *(dlp + 1) - add dlp, 4 ; dlp++ - - cmp eax, 0 ; Are we done? - GR_FIFO_WRITE fifo, -4, tempVal ; *fifoPtr = data - - jne SHORT __paramLoop - - align 4 -__nextVertex: - ;; On to the next vertex - add vOffset, 4 - mov gc, [_GlideRoot + curGC] ; Reload gc incase we trashed it as a temp - - cmp vOffset, 16 ; Offset of one past last vertex? - jne __vertexStart - - ;; Update gc->fifoPtr and gc->fifoRoom - mov eax, fifo - mov ebx, [gc + fifoPtr] - - mov [gc + fifoPtr], fifo - sub eax, ebx - - mov ebx, [_GlideRoot + trisDrawn] ; _GlideRoot.stats.trisDrawn++; - sub [gc + fifoRoom], eax - - add ebx, 1 - mov [_GlideRoot + trisDrawn], ebx - - ;; return 1 (triangle drawn) - mov eax, 1h - -__triDone: - ;; Restore trashed registers - mov esi, [_GlideRoot + trisProcessed] - pop ebp - - add esi, 1 ; _GlideRoot.stats.trisProcessed++; - pop ebx - - pop edi - mov [_GlideRoot + trisProcessed], esi - - pop esi - ret 12 \ No newline at end of file diff --git a/glide2x/cvg/glide/src/xdraw2.inc.S b/glide2x/cvg/glide/src/xdraw2.inc.S deleted file mode 100644 index 4996e7d..0000000 --- a/glide2x/cvg/glide/src/xdraw2.inc.S +++ /dev/null @@ -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 diff --git a/glide2x/cvg/glide/tests/alpha.3df b/glide2x/cvg/glide/tests/alpha.3df deleted file mode 100644 index e67fc8a..0000000 Binary files a/glide2x/cvg/glide/tests/alpha.3df and /dev/null differ diff --git a/glide2x/cvg/glide/tests/ap88.3df b/glide2x/cvg/glide/tests/ap88.3df deleted file mode 100644 index f465e2d..0000000 Binary files a/glide2x/cvg/glide/tests/ap88.3df and /dev/null differ diff --git a/glide2x/cvg/glide/tests/argb1555.3df b/glide2x/cvg/glide/tests/argb1555.3df deleted file mode 100644 index 98d7374..0000000 --- a/glide2x/cvg/glide/tests/argb1555.3df +++ /dev/null @@ -1,806 +0,0 @@ -3df v1.1 -argb1555 -lod range: 1 256 -aspect ratio: 1 1 -)K)K559m5m5n5m11111L1L)K)K) -) -)K)K1L1L5m5mA°=¯AÐ=¯5595AïAïJFIðEðAðAðIðEðAðAðAðAðIðEðAðAðAðAðAðAðIðEðAðAð1Œ1Œ-*1*1L1L)K)K1L1L-l-l1L1L1L1L)K)K5m5m)K)K1L1L)K)K)K)K)K)K) -) -) -) -)K)K1L1L115n5m115595111L1L11111L1L)K)K) -) -)K)K) -) -)K)K11551*-*) -) -)K)K1L1L11-l-l1L1L) -) -)K)K)K)K1L1L55IðIð5559AðAðAïAïJFAðAðAðAðAðAðAðAðAïAïIðEðAðAðAðAðIðEðAðAð551L1L)K)K-*1*-l-l-*1*-l-l-l-l1L1L)K)K5m5m1L1L)K)K)K)K)K)K) -) -) -) -)K)K)K)K5m5m-l-l11559555111L1L551111AïAï-*1*)K)K)K)K) -) -)K)K559m5m5n5m11111L1L)K)K) -) -)K)K1L1L5m5mA°=¯AÐ=¯5595AïAïJFIðEðAðAðIðEðAðAðAðAðIðEðAðAðAðAðAðAðIðEðAðAð1Œ1Œ-*1*1L1L)K)K1L1L-l-l1L1L1L1L)K)K5m5m)K)K1L1L)K)K)K)K)K)K) -) -) -) -)K)K1L1L115n5m115595111L1L11111L1L)K)K) -) -)K)K) -) -)K)K11551*-*) -) -)K)K1L1L11-l-l1L1L) -) -)K)K)K)K1L1L55IðIð5559AðAðAïAïJFAðAðAðAðAðAðAðAðAïAïIðEðAðAðAðAðIðEðAðAð551L1L)K)K-*1*-l-l-*1*-l-l-l-l1L1L)K)K5m5m1L1L)K)K)K)K)K)K) -) -) -) -)K)K)K)K5m5m-l-l11559555111L1L551111AïAï-*1*)K)K)K)K) -) -1111--115k5k=Ž=Ž,ç,ç § §(¥(¥ § § ç ç § § ¥ ¥ Æ Æ Æ Æ(¥(¥ ç ç$Æ$Æ(ç(ç(ç(ç$Ç$Ç(ç(ç(ç(ç$Æ$Æ § § ¥ ¥ ¥ ¥(ç(ç § § ¥ ¥ § § Æ Æ$Æ$Æ,ç,ç5J5J55955k5k95=Œ=Œ5m5m=Œ=Œ=Ž=Ž=Ž=Ž55955k5k9m5m5Ž5955k5k9I5I11--5J5J5k5k9I5I5k5k9k5k5k5k9k5k5k5k9k5k5k5k95,Æ,Æ,¥,¥,Æ,Æ4ç4ç951)1),Æ,Æ † †(ç(ç § § ç ç Æ Æ$¥$¥ § § Æ Æ(¥(¥ ç ç(ç(ç(ç(ç(ç(ç(ç(ç$Æ$Æ(ç(ç$Æ$Æ § § „ „ ç ç(ç(ç$¥$¥$¥$¥ § § ç ç,Æ,Æ11=¯A°1Œ1Œ5m5m=Œ=Œ5k5k955Ž5=Œ=Œ=Ž=Ž5595=Œ=Œ5m5m=Ž=ŽNSN3=Ž=Ž5I5I9)5)111)1)5J5J5k5k9k5k5I5I9k5k5J5J5k5k9k5k1L1L1111--115k5k=Ž=Ž,ç,ç § §(¥(¥ § § ç ç § § ¥ ¥ Æ Æ Æ Æ(¥(¥ ç ç$Æ$Æ(ç(ç(ç(ç$Ç$Ç(ç(ç(ç(ç$Æ$Æ § § ¥ ¥ ¥ ¥(ç(ç § § ¥ ¥ § § Æ Æ$Æ$Æ,ç,ç5J5J55955k5k95=Œ=Œ5m5m=Œ=Œ=Ž=Ž=Ž=Ž55955k5k9m5m5Ž5955k5k9I5I11--5J5J5k5k9I5I5k5k9k5k5k5k9k5k5k5k9k5k5k5k95,Æ,Æ,¥,¥,Æ,Æ4ç4ç951)1),Æ,Æ † †(ç(ç § § ç ç Æ Æ$¥$¥ § § Æ Æ(¥(¥ ç ç(ç(ç(ç(ç(ç(ç(ç(ç$Æ$Æ(ç(ç$Æ$Æ § § „ „ ç ç(ç(ç$¥$¥$¥$¥ § § ç ç,Æ,Æ11=¯A°1Œ1Œ5m5m=Œ=Œ5k5k955Ž5=Œ=Œ=Ž=Ž5595=Œ=Œ5m5m=Ž=ŽNSN3=Ž=Ž5I5I9)5)111)1)5J5J5k5k9k5k5I5I9k5k5J5J5k5k9k5k1L1L(¥(¥ e …$„$„$„$„,é,é55(¥(¥$d$„ d „dddddcdcdd$„$d ¥ ¥$d$„dd „ ddd„cdddddddd„cdd „ „$¥$¥ d „dddd … e$„$„1)1)=Ž=Ž0ç0ç(¥(¥(¥(¥(¥(¥(¥(¥ § §,¥,¥0ç0ç,Æ,Æ$Ç$Ç0ç0ç0ç0ç1L1L1Œ1Œ(¥(¥(¥(¥ e …(¥(¥$„$„$„$d,¥,¥,¥,¥,¤,¤,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,Æ,Æ,Æ,Æ,Æ,Æ5m5m11dd „ d „ ddcdcdddd „ d$„$d ¥ ¥cd d „dd „ ddddddddd„cdddd$¥$¥dddddcdd(¥(¥,¥,¥5595,¥,¥ † †(¥(¥(¥(¥(¥(¥,¥,¥$Ç$Ç0Æ0Æ0ç0ç$Ç$Ç,Æ,Æ5)5)AòAñ--(¥(¥ d „(¥(¥(¥(¥$„$„,¥,¥,¤,¤,¥,¥,¤,¤,¥,¥,¥,¥,¥,¥,¥,¥(¥(¥ e …$„$„$„$„,é,é55(¥(¥$d$„ d „dddddcdcdd$„$d ¥ ¥$d$„dd „ ddd„cdddddddd„cdd „ „$¥$¥ d „dddd … e$„$„1)1)=Ž=Ž0ç0ç(¥(¥(¥(¥(¥(¥(¥(¥ § §,¥,¥0ç0ç,Æ,Æ$Ç$Ç0ç0ç0ç0ç1L1L1Œ1Œ(¥(¥(¥(¥ e …(¥(¥$„$„$„$d,¥,¥,¥,¥,¤,¤,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,Æ,Æ,Æ,Æ,Æ,Æ5m5m11dd „ d „ ddcdcdddd „ d$„$d ¥ ¥cd d „dd „ ddddddddd„cdddd$¥$¥dddddcdd(¥(¥,¥,¥5595,¥,¥ † †(¥(¥(¥(¥(¥(¥,¥,¥$Ç$Ç0Æ0Æ0ç0ç$Ç$Ç,Æ,Æ5)5)AòAñ--(¥(¥ d „(¥(¥(¥(¥$„$„,¥,¥,¤,¤,¥,¥,¤,¤,¥,¥,¥,¥,¥,¥,¥,¥,Æ,Æ,¥,¥ † † … e0ç0ç5m5m(¥(¥ d „dddc„d„ddddddd ¥ ¥ d „dddcdddd„ddd„d„„dddd¥¥dddddd„cdd(¥(¥5595$Ç$Ç(¥(¥ † †,¥,¥$Ç$Ç,Æ,Æ$Ç$Ç,Æ,Æ$Ç$Ç0ç0ç$Ç$Ç0Æ0Æ=Ž=Ž1L1L,Æ,Æ(¥(¥ † †(¥(¥ † †(¥(¥(¥(¥(¥(¥$d$„,¥,¥0Æ0Æ,Æ,Æ,Æ,Æ$Ç$Ç,Æ,Æ$Ç$Ç,¥,¥,Æ,Æ,Æ,Æ1L1L) -) -$d$„ d „dc„d„d„ddd „ ddd … ecddddc„ddddddd„ddd „ „dd¥¥ d „dd „ „dd … e,Æ,Æ5511 § §(¥(¥ § §,¥,¥$Ç$Ç0ç0ç$Ç$Ç0ç0ç$Ç$Ç,Æ,Æ,é,é5)5)A¯=°$Ç$Ç,¥,¥ § §(¥(¥ † †(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥,Æ,Æ(¥(¥,Æ,Æ,Æ,Æ,¥,¥ † † … e0ç0ç5m5m(¥(¥ d „dddc„d„ddddddd ¥ ¥ d „dddcdddd„ddd„d„„dddd¥¥dddddd„cdd(¥(¥5595$Ç$Ç(¥(¥ † †,¥,¥$Ç$Ç,Æ,Æ$Ç$Ç,Æ,Æ$Ç$Ç0ç0ç$Ç$Ç0Æ0Æ=Ž=Ž1L1L,Æ,Æ(¥(¥ † †(¥(¥ † †(¥(¥(¥(¥(¥(¥$d$„,¥,¥0Æ0Æ,Æ,Æ,Æ,Æ$Ç$Ç,Æ,Æ$Ç$Ç,¥,¥,Æ,Æ,Æ,Æ1L1L) -) -$d$„ d „dc„d„d„ddd „ ddd … ecddddc„ddddddd„ddd „ „dd¥¥ d „dd „ „dd … e,Æ,Æ5511 § §(¥(¥ § §,¥,¥$Ç$Ç0ç0ç$Ç$Ç0ç0ç$Ç$Ç,Æ,Æ,é,é5)5)A¯=°$Ç$Ç,¥,¥ § §(¥(¥ † †(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥,Æ,Æ(¥(¥,Æ,Æ,Æ,Æ † † … e „ „,é,é1Œ1Œ,¥,¥dddd„ddddc„ddd „ „ … edddd „ „„ddd„ddddd„„dd„„ … e$¥$¥dddd„„dd$¥$¥--550ç0ç$Ç$Ç,¥,¥$Ç$Ç § §,Æ,Æ$Ç$Ç0ç0ç$Ç$Ç,Æ,Æ$Ç$Ç0ç0ç=Ž=Ž55(¥(¥(¥(¥ † †(¥(¥ † †$Æ$Æ † †$Ç$Ç(¥(¥ § §,¥,¥ § §0ç0ç,é,é0ç0ç,é,é0ç0ç,é,é$Ç$Ç5n5m95 d „dd„ddddddcdddd „ „ „ „dd „ „„ddddd„ddd„„dddd¥¥ e … ¥ ¥dddcdd$¥$¥(¥(¥551*-*,Æ,Æ,Æ,Æ,¥,¥$Ç$Ç § §$Ç$Ç,Æ,Æ$Ç$Ç0ç0ç$Ç$Ç,Æ,Æ5J5J=¯A°,è,é(¥(¥ † † … e(¥(¥ † † § § † †$Ç$Ç(¥(¥,é,é(¥(¥ § §,Æ,Æ,Æ,Æ † † … e „ „,é,é1Œ1Œ,¥,¥dddd„ddddc„ddd „ „ … edddd „ „„ddd„ddddd„„dd„„ … e$¥$¥dddd„„dd$¥$¥--550ç0ç$Ç$Ç,¥,¥$Ç$Ç § §,Æ,Æ$Ç$Ç0ç0ç$Ç$Ç,Æ,Æ$Ç$Ç0ç0ç=Ž=Ž55(¥(¥(¥(¥ † †(¥(¥ † †$Æ$Æ † †$Ç$Ç(¥(¥ § §,¥,¥ § §0ç0ç,é,é0ç0ç,é,é0ç0ç,é,é$Ç$Ç5n5m95 d „dd„ddddddcdddd „ „ „ „dd „ „„ddddd„ddd„„dddd¥¥ e … ¥ ¥dddcdd$¥$¥(¥(¥551*-*,Æ,Æ,Æ,Æ,¥,¥$Ç$Ç § §$Ç$Ç,Æ,Æ$Ç$Ç0ç0ç$Ç$Ç,Æ,Æ5J5J=¯A°,è,é(¥(¥ † † … e(¥(¥ † † § § † †$Ç$Ç(¥(¥,é,é(¥(¥ § §,Æ,Æ(ç(ç$Ç$Ç † † … e1111,¥,¥dddd„d„ddddc„ddd „ „dd „ „dd„ddd„d…e„„„ddddd¥¥ e … ¥ ¥dddcdd(¥(¥,é,é5k5k,é,é0ç0ç$Ç$Ç,¥,¥$Ç$Ç § §,Æ,Æ$Ç$Ç,é,é$Ç$Ç0ç0ç,é,é5k5k1L1L$¥$¥f†d„d„e…e…¥¥ † † † †,¥,¥$Ç$Ç0ç0ç$Ç$Ç,é,é,ç,ç,é,é(ç(ç,é,é,ç,ç5m5m1*-*$d$„dddddc„d„ddddddd „ „dddddd„ddd„d„„„ddd „ „dd¥¥ e …c„dddd¥¥(¥(¥5m5m11,é,é0ç0ç § §$Æ$Æ$Ç$Ç,¥,¥$Ç$Ç,é,é,¥,¥$Ç$Ç,é,é5)5)A¯=° ¦ §¥¥e…d„d„e…¥¥e… † † § §,ç,ç$Ç$Ç,¥,¥,é,é(ç(ç$Ç$Ç † † … e1111,¥,¥dddd„d„ddddc„ddd „ „dd „ „dd„ddd„d…e„„„ddddd¥¥ e … ¥ ¥dddcdd(¥(¥,é,é5k5k,é,é0ç0ç$Ç$Ç,¥,¥$Ç$Ç § §,Æ,Æ$Ç$Ç,é,é$Ç$Ç0ç0ç,é,é5k5k1L1L$¥$¥f†d„d„e…e…¥¥ † † † †,¥,¥$Ç$Ç0ç0ç$Ç$Ç,é,é,ç,ç,é,é(ç(ç,é,é,ç,ç5m5m1*-*$d$„dddddc„d„ddddddd „ „dddddd„ddd„d„„„ddd „ „dd¥¥ e …c„dddd¥¥(¥(¥5m5m11,é,é0ç0ç § §$Æ$Æ$Ç$Ç,¥,¥$Ç$Ç,é,é,¥,¥$Ç$Ç,é,é5)5)A¯=° ¦ §¥¥e…d„d„e…¥¥e… † † § §,ç,ç$Ç$Ç,¥,¥,é,é,ç,ç § § e …$„$„--55,¥,¥dddddd„d„ddcdddddd „ „dddcdddd„cdddd „ „dddcdd$¥$¥$d$„dd„c … e$„$d,ç,ç1Œ1Œ55,é,é0ç0ç § §$Ç$Ç$Ç$Ç,é,é0ç0ç$Ç$Ç0ç0ç$Ç$Ç0Æ0Æ-*1*-*1*d„e…ÆÆ dde…e…f†d„d„dd † † § §(ç(ç$Æ$Æ$Ç$Ç$¥$¥ § § § §,Æ,Æ11--$c$„ d „dddc„d„d „ ddcdd „ „dd„„dcdd„cdddd „ „dddddc$¥$¥ e …c„dd„c$„$„(¥(¥1L1L1)1)55$Ç$Ç0ç0ç$Ç$Ç$Ç$Ç$Ç$Ç,é,é0ç0ç$Ç$Ç,é,é,Æ,Æ5595¥¥e…f†e…e…e…e…e…d„dd ç çdd…e(ç(ç,ç,ç § § e …$„$„--55,¥,¥dddddd„d„ddcdddddd „ „dddcdddd„cdddd „ „dddcdd$¥$¥$d$„dd„c … e$„$d,ç,ç1Œ1Œ55,é,é0ç0ç § §$Ç$Ç$Ç$Ç,é,é0ç0ç$Ç$Ç0ç0ç$Ç$Ç0Æ0Æ-*1*-*1*d„e…ÆÆ dde…e…f†d„d„dd † † § §(ç(ç$Æ$Æ$Ç$Ç$¥$¥ § § § §,Æ,Æ11--$c$„ d „dddc„d„d „ ddcdd „ „dd„„dcdd„cdddd „ „dddddc$¥$¥ e …c„dd„c$„$„(¥(¥1L1L1)1)55$Ç$Ç0ç0ç$Ç$Ç$Ç$Ç$Ç$Ç,é,é0ç0ç$Ç$Ç,é,é,Æ,Æ5595¥¥e…f†e…e…e…e…e…d„dd ç çdd…e(ç(ç,Æ,Æ § §$Æ$Æ † †,é,é55,é,é § §¥¥e…dd„d…e„ddddc„ddcdddd„„dddd„„¥¥e…dd†f † †¥¥e… § § § §$Æ$Æ-*1*1L1L$Ç$Ç § §$Æ$Æ$Ç$Ç0ç0ç § §,Æ,Æ § §$Ç$Ç,¥,¥ † † § §=Œ=Œ55cd¥¥$Ç$Ç † † … e „ „¥¥ † † … e ¥ ¥,Æ,Æ$Ç$Ç † †$Æ$Æ † †$¥$¥ † †¥¥$Ç$Ç111L1L § §$¥$¥e…e…d„dd„d„ddddc„cdc„ddd„ddd„„†f¥¥d„e… † † … e†f § § § § § §,é,é-l-l,é,é § § § §(ç(ç$Ç$Ç,Æ,Æ$Ç$Ç,¥,¥$Ç$Ç § § § §(¥(¥11AòAñÆÆe…(ç(ç § § „ „¥¥ e …¥¥ e … ¥ ¥(¥(¥ † †¥¥ † †,Æ,Æ § §$Æ$Æ † †,é,é55,é,é § §¥¥e…dd„d…e„ddddc„ddcdddd„„dddd„„¥¥e…dd†f † †¥¥e… § § § §$Æ$Æ-*1*1L1L$Ç$Ç § §$Æ$Æ$Ç$Ç0ç0ç § §,Æ,Æ § §$Ç$Ç,¥,¥ † † § §=Œ=Œ55cd¥¥$Ç$Ç † † … e „ „¥¥ † † … e ¥ ¥,Æ,Æ$Ç$Ç † †$Æ$Æ † †$¥$¥ † †¥¥$Ç$Ç111L1L § §$¥$¥e…e…d„dd„d„ddddc„cdc„ddd„ddd„„†f¥¥d„e… † † … e†f § § § § § §,é,é-l-l,é,é § § § §(ç(ç$Ç$Ç,Æ,Æ$Ç$Ç,¥,¥$Ç$Ç § § § §(¥(¥11AòAñÆÆe…(ç(ç § § „ „¥¥ e …¥¥ e … ¥ ¥(¥(¥ † †¥¥ † †=Ž=Ž5k5k955k5k95=Ž=Ž551*-*1L1L1L1L-*1*) -) -1*-*)K)K-*1*1Œ1Œ-*1*)K)K-*1*)K)K-*1*-*1*)J)J1L1L-*1*1Œ1Œ1L1L5Œ5Œ95=Ž=Ž=Ž=Ž559Ž5551Œ1Œ551L1L1L1L%%,é,é-*1*) -) -)K)K,é,é)K)K1L1L)K)K1L1L=¯A°AðAð551L1L559k5k=Œ=Œ=Ž=Ž=Ž=Ž=¯A°=ÏA°9Œ=ŒAðAðIðEðAðAðAðAð=¯A°=Œ=Œ555955=Ž=Ž=Œ=Œ1L1L1L1L1L1L-*1*-)-))K)K-*1*-*1*1L1L-l-l-*1*-*1*-*1*)K)K-*1*)K)K5J5J-*1*1L1L-l-l5k5k95AðAð5Œ5Œ955Ž5951L1L=Ž=Ž551L1L-)-)%%) -) -1*-*1*-*) -) -) -) --l-l-*1*1L1L11AðAð=Ž=Ž1Œ1Œ1L1L=Ž=Ž5k5k=Ž=Ž=Ž=Ž=¯A°=ÏA°9Œ=Œ=¯A°EðIð=¯A°=Ï=°=Ž=Ž5k5k955k5k95=Ž=Ž551*-*1L1L1L1L-*1*) -) -1*-*)K)K-*1*1Œ1Œ-*1*)K)K-*1*)K)K-*1*-*1*)J)J1L1L-*1*1Œ1Œ1L1L5Œ5Œ95=Ž=Ž=Ž=Ž559Ž5551Œ1Œ551L1L1L1L%%,é,é-*1*) -) -)K)K,é,é)K)K1L1L)K)K1L1L=¯A°AðAð551L1L559k5k=Œ=Œ=Ž=Ž=Ž=Ž=¯A°=ÏA°9Œ=ŒAðAðIðEðAðAðAðAð=¯A°=Œ=Œ555955=Ž=Ž=Œ=Œ1L1L1L1L1L1L-*1*-)-))K)K-*1*-*1*1L1L-l-l-*1*-*1*-*1*)K)K-*1*)K)K5J5J-*1*1L1L-l-l5k5k95AðAð5Œ5Œ955Ž5951L1L=Ž=Ž551L1L-)-)%%) -) -1*-*1*-*) -) -) -) --l-l-*1*1L1L11AðAð=Ž=Ž1Œ1Œ1L1L=Ž=Ž5k5k=Ž=Ž=Ž=Ž=¯A°=ÏA°9Œ=Œ=¯A°EðIð=¯A°=Ï=°$¥$¥$¥$¥(¥(¥(¥(¥(¥(¥(¥(¥$„$„dd$¥$¥ ¥ ¥ ¥ ¥ e …$¥$¥(¥(¥11-*1* ç ç0Æ0Æ(¥(¥(¥(¥,¥,¥,Æ,Æ,¥,¥(¥(¥$¥$¥(¥(¥(¥(¥(ç(ç$ç$ç1L1L--(ç(ç(¥(¥,Æ,Æ § §(¥(¥(¥(¥ † †$Æ$Æ § § Æ Æ$Æ$Æ$Ç$Ç(ç(ç,ç,ç,é,é11(ç(ç,ç,ç,é,é))----,é,é,ç,ç-----*1*5J5J1111,ç,ç----,ç,ç,Æ,Æ,Æ,Æ,Æ,Æ(¥(¥(¥(¥(¥(¥dd ¥ ¥$„$„ † †$¥$¥ e …(¥(¥,Æ,Æ1L1L$ç$ç(ç(ç,¥,¥(¥(¥(¥(¥,Æ,Æ,¥,¥,Æ,Æ ¥ ¥$¥$¥(¥(¥(¥(¥(ç(ç)K)K1)1),ç,ç,Æ,Æ$Æ$Æ,Æ,Æ § §$¥$¥(¥(¥ § §(¥(¥ § § § §(ç(ç$Æ$Æ,é,é,ç,ç,é,é,ç,ç)),ç,ç,é,é-)-)-)-),ç,ç))----111L1L1111 § § „ „ Æ Æ$¥$¥$¥$¥(¥(¥(¥(¥(¥(¥(¥(¥$„$„dd$¥$¥ ¥ ¥ ¥ ¥ e …$¥$¥(¥(¥11-*1* ç ç0Æ0Æ(¥(¥(¥(¥,¥,¥,Æ,Æ,¥,¥(¥(¥$¥$¥(¥(¥(¥(¥(ç(ç$ç$ç1L1L--(ç(ç(¥(¥,Æ,Æ § §(¥(¥(¥(¥ † †$Æ$Æ § § Æ Æ$Æ$Æ$Ç$Ç(ç(ç,ç,ç,é,é11(ç(ç,ç,ç,é,é))----,é,é,ç,ç-----*1*5J5J1111,ç,ç----,ç,ç,Æ,Æ,Æ,Æ,Æ,Æ(¥(¥(¥(¥(¥(¥dd ¥ ¥$„$„ † †$¥$¥ e …(¥(¥,Æ,Æ1L1L$ç$ç(ç(ç,¥,¥(¥(¥(¥(¥,Æ,Æ,¥,¥,Æ,Æ ¥ ¥$¥$¥(¥(¥(¥(¥(ç(ç)K)K1)1),ç,ç,Æ,Æ$Æ$Æ,Æ,Æ § §$¥$¥(¥(¥ § §(¥(¥ § § § §(ç(ç$Æ$Æ,é,é,ç,ç,é,é,ç,ç)),ç,ç,é,é-)-)-)-),ç,ç))----111L1L1111 § § „ „ Æ Ædd…e … e † † … e … edd¥¥dd … e … e „ „$¥$¥ † †5511,Æ,Æ,¥,¥0Æ0Æ,¥,¥,Æ,Æ,Æ,Æ0ç0ç,Æ,Æ § §(ç(ç Æ Æ$¥$¥$Ç$Ç1Ž1-- § §(¥(¥ † †$¥$¥ e …¥¥ † † … e ¥ ¥dd † †$¥$¥ † †(¥(¥ † †(¥(¥ † † § § ¥ ¥ e … „ „dd † † § § § §,¥,¥,é,é--,¥,¥ † †,¥,¥ † †(¥(¥ † †(¥(¥ e … e …(¥(¥ e …dd¥¥dd … edd¥¥ † †(¥(¥,Æ,Æ55--,¥,¥,Æ,Æ,¥,¥0ç0ç,¥,¥$Ç$Ç,Æ,Æ(ç(ç,Æ,Æ$Æ$Æ § § § §1L1L-*1*$Æ$Æ † † § § e …(¥(¥ e …¥¥ † †dd¥¥ † † † † … e$¥$¥$¥$¥$¥$¥ † †$Æ$Æ † †$¥$¥e…dd … e † † § §(¥(¥,Æ,Æ11$Ç$Ç(¥(¥ d „dd…edd…e … e † † … e … edd¥¥dd … e … e „ „$¥$¥ † †5511,Æ,Æ,¥,¥0Æ0Æ,¥,¥,Æ,Æ,Æ,Æ0ç0ç,Æ,Æ § §(ç(ç Æ Æ$¥$¥$Ç$Ç1Ž1-- § §(¥(¥ † †$¥$¥ e …¥¥ † † … e ¥ ¥dd † †$¥$¥ † †(¥(¥ † †(¥(¥ † † § § ¥ ¥ e … „ „dd † † § § § §,¥,¥,é,é--,¥,¥ † †,¥,¥ † †(¥(¥ † †(¥(¥ e … e …(¥(¥ e …dd¥¥dd … edd¥¥ † †(¥(¥,Æ,Æ55--,¥,¥,Æ,Æ,¥,¥0ç0ç,¥,¥$Ç$Ç,Æ,Æ(ç(ç,Æ,Æ$Æ$Æ § § § §1L1L-*1*$Æ$Æ † † § § e …(¥(¥ e …¥¥ † †dd¥¥ † † † † … e$¥$¥$¥$¥$¥$¥ † †$Æ$Æ † †$¥$¥e…dd … e † † § §(¥(¥,Æ,Æ11$Ç$Ç(¥(¥ d „dd…edd „ „ … e „ „¥¥ e …„„…e¥¥dd¥¥ † † … e,Æ,Æ111L1L e …,¥,¥,Æ,Æ0ç0ç,Æ,Æ,Æ,Æ,Æ,Æ0ç0ç$Ç$Ç(ç(ç § §$Ç$Ç ç ç1L1L0ç0ç$Æ$Æ † †$¥$¥ † † … e … e$¥$¥ e …¥¥ e …¥¥ † †(¥(¥ † †(¥(¥ † † § §(¥(¥ † †$¥$¥f†¥¥ † †$¥$¥ † †(¥(¥0Æ0Æ,é,é § §,¥,¥$Ç$Ç † †,¥,¥ † †(¥(¥ e … e …„„ … edd…e¥¥dd¥¥ † † … e$¥$¥$Ç$Ç5n5m$Æ$Æ,¥,¥,Æ,Æ,Æ,Æ,Æ,Æ0Æ0Æ0Æ0Æ0ç0ç,Æ,Æ$Ç$Ç$Ç$Ç$Ç$ÇÆÆ-)-)5J5J$Ç$Ç † †(¥(¥ e …¥¥ † † … e ¥ ¥dd$¥$¥ e …¥¥(¥(¥ † †(¥(¥ † † § §(¥(¥ e … † † † †„„ † † † †$¥$¥ † †,Æ,Æ,é,é,¥,¥$Ç$Ç,¥,¥ † †dddd „ „ … e „ „¥¥ e …„„…e¥¥dd¥¥ † † … e,Æ,Æ111L1L e …,¥,¥,Æ,Æ0ç0ç,Æ,Æ,Æ,Æ,Æ,Æ0ç0ç$Ç$Ç(ç(ç § §$Ç$Ç ç ç1L1L0ç0ç$Æ$Æ † †$¥$¥ † † … e … e$¥$¥ e …¥¥ e …¥¥ † †(¥(¥ † †(¥(¥ † † § §(¥(¥ † †$¥$¥f†¥¥ † †$¥$¥ † †(¥(¥0Æ0Æ,é,é § §,¥,¥$Ç$Ç † †,¥,¥ † †(¥(¥ e … e …„„ … edd…e¥¥dd¥¥ † † … e$¥$¥$Ç$Ç5n5m$Æ$Æ,¥,¥,Æ,Æ,Æ,Æ,Æ,Æ0Æ0Æ0Æ0Æ0ç0ç,Æ,Æ$Ç$Ç$Ç$Ç$Ç$ÇÆÆ-)-)5J5J$Ç$Ç † †(¥(¥ e …¥¥ † † … e ¥ ¥dd$¥$¥ e …¥¥(¥(¥ † †(¥(¥ † † § §(¥(¥ e … † † † †„„ † † † †$¥$¥ † †,Æ,Æ,é,é,¥,¥$Ç$Ç,¥,¥ † †dddd†fdd¥¥dd…edd¥¥ e …e… „ „¥¥ e …$¥$¥) -) -1L1Lc„,Æ,Æ0Æ0Æ,Æ,Æ0Æ0Æ0Æ0Æ0ç0ç0Æ0Æ$Ç$Ç(ç(ç$Ç$Ç § §-)-)-*1*,é,é$¥$¥ † † † †$¥$¥ e …¥¥ e …¥¥ e …¥¥ † † † † § §$„$„ † †$¥$¥ † † § § e …¥¥dd¥¥ † † † †(¥(¥ § §0Æ0Æ11$Ç$Ç(¥(¥ § §(¥(¥ † † § §$„$„ … e…edd¥¥dd†f „ „…e … e „ „¥¥ † †,¥,¥5m5m † †(¥(¥,Æ,Æ,Æ,Æ0Æ0Æ0Æ0Æ0ç0ç0ç0ç0ç0ç § §,ç,ç Æ Æ † †)K)K11$Ç$Ç † † † † ¥ ¥ † †dd$¥$¥ e …¥¥ e …¥¥ † † § §(¥(¥ † † † †$¥$¥ † † † †¥¥ e …e… Æ Æ † †(¥(¥ † †,¥,¥-*1*$Ç$Ç,¥,¥ † †dd … edd†fdd¥¥dd…edd¥¥ e …e… „ „¥¥ e …$¥$¥) -) -1L1Lc„,Æ,Æ0Æ0Æ,Æ,Æ0Æ0Æ0Æ0Æ0ç0ç0Æ0Æ$Ç$Ç(ç(ç$Ç$Ç § §-)-)-*1*,é,é$¥$¥ † † † †$¥$¥ e …¥¥ e …¥¥ e …¥¥ † † † † § §$„$„ † †$¥$¥ † † § § e …¥¥dd¥¥ † † † †(¥(¥ § §0Æ0Æ11$Ç$Ç(¥(¥ § §(¥(¥ † † § §$„$„ … e…edd¥¥dd†f „ „…e … e „ „¥¥ † †,¥,¥5m5m † †(¥(¥,Æ,Æ,Æ,Æ0Æ0Æ0Æ0Æ0ç0ç0ç0ç0ç0ç § §,ç,ç Æ Æ † †)K)K11$Ç$Ç † † † † ¥ ¥ † †dd$¥$¥ e …¥¥ e …¥¥ † † § §(¥(¥ † † † †$¥$¥ † † † †¥¥ e …e… Æ Æ † †(¥(¥ † †,¥,¥-*1*$Ç$Ç,¥,¥ † †dd … edd„„dd†fdd „ „„d…e … e„„ … e¥¥e… † †,é,é-l-l,Æ,Æ0ç0ç0Æ0Æ4ç4ç======5595 § §$Æ$Æ Æ Æ,é,é1L1L(ç(ç$¥$¥ † †$¥$¥ † †…e … e¥¥e…$¥$¥ † †¥¥ † †(¥(¥ † †$¥$¥ † † † †$¥$¥ e …¥¥dd„d † †$¥$¥ † †,¥,¥,é,é) -) -,¥,¥ § §(¥(¥ † †(¥(¥ § §(¥(¥e…dd¥¥dddd„„…e¥¥ e …dd … e¥¥$Ç$Ç1L1L,é,é,Å,Å4ç4ç954ç4ç====0ç0ç4ç4ç(ç(ç § § § §$Ç$Ç1L1L,é,é$¥$¥ † †$¥$¥ e …¥¥e… e … e …¥¥ † † … e † †$¥$¥ † † † †$¥$¥ † † § § † †dd¥¥dd¥¥ † †(¥(¥(¥(¥,Æ,Æ-*1*,é,é(¥(¥ e …dd „ „dd„„dd†fdd „ „„d…e … e„„ … e¥¥e… † †,é,é-l-l,Æ,Æ0ç0ç0Æ0Æ4ç4ç======5595 § §$Æ$Æ Æ Æ,é,é1L1L(ç(ç$¥$¥ † †$¥$¥ † †…e … e¥¥e…$¥$¥ † †¥¥ † †(¥(¥ † †$¥$¥ † † † †$¥$¥ e …¥¥dd„d † †$¥$¥ † †,¥,¥,é,é) -) -,¥,¥ § §(¥(¥ † †(¥(¥ § §(¥(¥e…dd¥¥dddd„„…e¥¥ e …dd … e¥¥$Ç$Ç1L1L,é,é,Å,Å4ç4ç954ç4ç====0ç0ç4ç4ç(ç(ç § § § §$Ç$Ç1L1L,é,é$¥$¥ † †$¥$¥ e …¥¥e… e … e …¥¥ † † … e † †$¥$¥ † † † †$¥$¥ † † § § † †dd¥¥dd¥¥ † †(¥(¥(¥(¥,Æ,Æ-*1*,é,é(¥(¥ e …dd „ „dd „ „dddd „ „dddd„„„d … e„„ … e$¥$¥$¥$¥,é,é1L1L(ç(ç(ç(ç § §,é,é11==,é,é0Æ0Æ0ç0ç e …¥¥ † †)K)K-)-)$¥$¥ † †(¥(¥ † † … e „ „…e$¥$¥e… e …¥¥ † † … e(¥(¥ † †(¥(¥ † †$¥$¥ † † … e…e$¥$¥ e … † †$¥$¥ § §(¥(¥0Æ0Æ1L1L,¥,¥(¥(¥ § § † †(¥(¥ † † † †$„$d„cdd$¥$¥d„dddd…e „ „¥¥ † † † †,¥,¥-l-l,é,é(ç(ç$Ç$Ç,Æ,Æ,é,é559555,é,é § §ddÆÆ¥¥)K)K$Æ$Æ § §(¥(¥ e …¥¥ † †dd¥¥ † †dd¥¥$¥$¥ e …$¥$¥ † †(¥(¥ † †$¥$¥ † † … e „ „¥¥ † † … e$¥$¥ † †(¥(¥,¥,¥-*1*,é,é(¥(¥(¥(¥dddddd „ „dddd „ „dddd„„„d … e„„ … e$¥$¥$¥$¥,é,é1L1L(ç(ç(ç(ç § §,é,é11==,é,é0Æ0Æ0ç0ç e …¥¥ † †)K)K-)-)$¥$¥ † †(¥(¥ † † … e „ „…e$¥$¥e… e …¥¥ † † … e(¥(¥ † †(¥(¥ † †$¥$¥ † † … e…e$¥$¥ e … † †$¥$¥ § §(¥(¥0Æ0Æ1L1L,¥,¥(¥(¥ § § † †(¥(¥ † † † †$„$d„cdd$¥$¥d„dddd…e „ „¥¥ † † † †,¥,¥-l-l,é,é(ç(ç$Ç$Ç,Æ,Æ,é,é559555,é,é § §ddÆÆ¥¥)K)K$Æ$Æ § §(¥(¥ e …¥¥ † †dd¥¥ † †dd¥¥$¥$¥ e …$¥$¥ † †(¥(¥ † †$¥$¥ † † … e „ „¥¥ † † … e$¥$¥ † †(¥(¥,¥,¥-*1*,é,é(¥(¥(¥(¥dddd † † † †ÆÆ † †¥¥¥¥¥¥¥¥ Æ Æf† † † Æ Æ † † § §) -) -)K)Kd„d„dcd cdde…f†d„e…%%) -) - ç ç1L1L)K)K † ††f † ††fÆÆe…e…dd„d…e … e†f § §¥¥ † † † † † † † † … e ¥ ¥dddd¥¥ † † § §,Æ,Æ$Ç$Ç,é,é5m5m) -) -,é,é$Ç$Ç,é,é$Ç$Ç$Ç$Ç$Ç$Ç † † § § ç 祥 e …ÆÆd„dd¥¥ † † † † § §$Ç$Ç-l-l ç çddd„ C C„d„d†fddd„ § §!!!!%%5m5m § § † ††f Æ Æf†e… e …dddd†fdd†f § § † † † †¥¥ † † † †$„$„ … e…edddd Æ Æ § §$Ç$Ç § §$Ç$Ç1L1L1L1L$Ç$Ç,é,é$Ç$Ç$Ç$Ç † † † †ÆÆ † †¥¥¥¥¥¥¥¥ Æ Æf† † † Æ Æ † † § §) -) -)K)Kd„d„dcd cdde…f†d„e…%%) -) - ç ç1L1L)K)K † ††f † ††fÆÆe…e…dd„d…e … e†f § §¥¥ † † † † † † † † … e ¥ ¥dddd¥¥ † † § §,Æ,Æ$Ç$Ç,é,é5m5m) -) -,é,é$Ç$Ç,é,é$Ç$Ç$Ç$Ç$Ç$Ç † † § § ç 祥 e …ÆÆd„dd¥¥ † † † † § §$Ç$Ç-l-l ç çddd„ C C„d„d†fddd„ § §!!!!%%5m5m § § † ††f Æ Æf†e… e …dddd†fdd†f § § † † † †¥¥ † † † †$„$„ … e…edddd Æ Æ § §$Ç$Ç § §$Ç$Ç1L1L1L1L$Ç$Ç,é,é$Ç$Ç$Ç$Ç551Œ1Œ559k5k1L1LAðAð1Œ1Œ-*1*1Œ1Œ5J5J-*1*) -) -1L1L1L1L1Œ1Œ551*-*) -) -)K)K%%-*1*1L1L1Œ1Œ5m5mA°=¯AðAð5595=Ž=Ž=Ž=Ž5Œ5Œ=Ž=Ž559Œ5Œ55A¯=°591Œ1Œ5m5m1Œ1Œ1L1LIðEð5595559Ž5551L1L5k5k95AðAð5511=Ž=ŽAðAð55=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=¯A°=ÏA°9Ž=Ž=Œ=Œ1L1L5J5J5J5J1L1L5J5J$Ç$Ç) -) -)K)K-*1*-*1*1L1L-l-l551L1L) -) -)K)K%%) -) --l-l1L1L1155AðAð=¯A°=Ž=Ž=Ž=Ž=Ž=Ž5Œ5Œ=Ž=Ž5Œ5Œ9555=Ž=ŽAðAð-l-l1Œ1Œ111L1L=ï=ïAðAð1Œ1Œ559m5m5Ž59m5m1L1L55AðAðAðAð-l-l55A¯=°=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=¯A°=Ž=Ž=Ž=Ž=Ž=Ž=¯A°591Œ1Œ559k5k1L1LAðAð1Œ1Œ-*1*1Œ1Œ5J5J-*1*) -) -1L1L1L1L1Œ1Œ551*-*) -) -)K)K%%-*1*1L1L1Œ1Œ5m5mA°=¯AðAð5595=Ž=Ž=Ž=Ž5Œ5Œ=Ž=Ž559Œ5Œ55A¯=°591Œ1Œ5m5m1Œ1Œ1L1LIðEð5595559Ž5551L1L5k5k95AðAð5511=Ž=ŽAðAð55=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=¯A°=ÏA°9Ž=Ž=Œ=Œ1L1L5J5J5J5J1L1L5J5J$Ç$Ç) -) -)K)K-*1*-*1*1L1L-l-l551L1L) -) -)K)K%%) -) --l-l1L1L1155AðAð=¯A°=Ž=Ž=Ž=Ž=Ž=Ž5Œ5Œ=Ž=Ž5Œ5Œ9555=Ž=ŽAðAð-l-l1Œ1Œ111L1L=ï=ïAðAð1Œ1Œ559m5m5Ž59m5m1L1L55AðAðAðAð-l-l55A¯=°=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=¯A°=Ž=Ž=Ž=Ž=Ž=Ž=¯A°,Æ,Æ,Æ,Æ,Æ,Æ,Æ,Æ(ç(ç=¯A°1L1L e …$¥$¥$„$„ … e¥¥$¥$¥ § §(¥(¥ † †(ç(ç$Æ$Æ$Ç$Ç,Æ,Æ § §$Ç$Ç(ç(ç(ç(ç(ç(ç(ç(ç(¥(¥$¥$¥$¥$¥ Æ Æ$Æ$Æ(¥(¥(ç(ç0ç0ç(¥(¥5k5kIðIð11$Ç$Ç$Ç$Ç(ç(ç ç ç(¥(¥ ç ç(¥(¥ § §(ç(ç(¥(¥,ç,ç--AòAñ5k5k11--,ç,ç----,ç,ç,ç,ç(ç(ç$Æ$Æ$Ç$Ç,Æ,Æ,Æ,Æ$Ç$Ç,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥5k5k § §(¥(¥ † † … e ¥ ¥ e …(¥(¥$Æ$Æ(¥(¥ § §(ç(ç,Æ,Æ § §$Ç$Ç$Æ$Æ(ç(ç(ç(ç,ç,ç(ç(ç § §(¥(¥$¥$¥(¥(¥ § §(¥(¥(ç(ç,Æ,Æ,Æ,Æ--IðEð1Œ1Œ$Ç$Ç(ç(ç$Æ$Æ$Æ$Æ$Æ$Æ$Æ$Æ$Æ$Æ$Æ$Æ$Æ$Æ,Æ,Æ$Æ$Æ,ç,ç=Œ=Œ=¯A°1111,é,é1111,ç,ç55$Æ$Æ$Ç$Ç,Æ,Æ$Æ$Æ0ç0ç,Æ,Æ,Æ,Æ,Æ,Æ,Æ,Æ(ç(ç=¯A°1L1L e …$¥$¥$„$„ … e¥¥$¥$¥ § §(¥(¥ † †(ç(ç$Æ$Æ$Ç$Ç,Æ,Æ § §$Ç$Ç(ç(ç(ç(ç(ç(ç(ç(ç(¥(¥$¥$¥$¥$¥ Æ Æ$Æ$Æ(¥(¥(ç(ç0ç0ç(¥(¥5k5kIðIð11$Ç$Ç$Ç$Ç(ç(ç ç ç(¥(¥ ç ç(¥(¥ § §(ç(ç(¥(¥,ç,ç--AòAñ5k5k11--,ç,ç----,ç,ç,ç,ç(ç(ç$Æ$Æ$Ç$Ç,Æ,Æ,Æ,Æ$Ç$Ç,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥5k5k § §(¥(¥ † † … e ¥ ¥ e …(¥(¥$Æ$Æ(¥(¥ § §(ç(ç,Æ,Æ § §$Ç$Ç$Æ$Æ(ç(ç(ç(ç,ç,ç(ç(ç § §(¥(¥$¥$¥(¥(¥ § §(¥(¥(ç(ç,Æ,Æ,Æ,Æ--IðEð1Œ1Œ$Ç$Ç(ç(ç$Æ$Æ$Æ$Æ$Æ$Æ$Æ$Æ$Æ$Æ$Æ$Æ$Æ$Æ,Æ,Æ$Æ$Æ,ç,ç=Œ=Œ=¯A°1111,é,é1111,ç,ç55$Æ$Æ$Ç$Ç,Æ,Æ$Æ$Æ0ç0ç(¥(¥(¥(¥,Æ,Æ § §,¥,¥5511$¥$¥ † †$„$„(¥(¥ † †$„$„(¥(¥$¥$¥$¥$¥ † †(¥(¥$¥$¥ † †$Æ$Æ,¥,¥ § §(¥(¥,Æ,Æ § §(¥(¥ † †$¥$¥$„$„$¥$¥(¥(¥(¥(¥,Æ,Æ,¥,¥5k5kIðIð) -) -$¥$¥(¥(¥ e …(¥(¥(¥(¥ § §(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥,é,é=Ž=Ž(ç(ç(¥(¥(¥(¥,¥,¥ § §(¥(¥(¥(¥ § §(¥(¥ † † § §(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥0ç0ç,¥,¥,é,é § §$„$„ … e(¥(¥$„$„$¥$¥(¥(¥ † †(¥(¥ e …(¥(¥$¥$¥ † †(¥(¥$Æ$Æ,¥,¥ § §(¥(¥ § §$¥$¥(¥(¥ † † ¥ ¥$¥$¥$¥$¥(¥(¥,Å,Å,Æ,Æ11AðAð5m5m(¥(¥(¥(¥(¥(¥(¥(¥ † †(¥(¥ † †(¥(¥(¥(¥ † †,Æ,Æ,¥,¥5m5m1*-*(¥(¥ § §(¥(¥,¥,¥ † †,¥,¥ † †(¥(¥ † †$Æ$Æ(¥(¥ § §(¥(¥(¥(¥,Æ,Æ § §,¥,¥5511$¥$¥ † †$„$„(¥(¥ † †$„$„(¥(¥$¥$¥$¥$¥ † †(¥(¥$¥$¥ † †$Æ$Æ,¥,¥ § §(¥(¥,Æ,Æ § §(¥(¥ † †$¥$¥$„$„$¥$¥(¥(¥(¥(¥,Æ,Æ,¥,¥5k5kIðIð) -) -$¥$¥(¥(¥ e …(¥(¥(¥(¥ § §(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥,é,é=Ž=Ž(ç(ç(¥(¥(¥(¥,¥,¥ § §(¥(¥(¥(¥ § §(¥(¥ † † § §(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥0ç0ç,¥,¥,é,é § §$„$„ … e(¥(¥$„$„$¥$¥(¥(¥ † †(¥(¥ e …(¥(¥$¥$¥ † †(¥(¥$Æ$Æ,¥,¥ § §(¥(¥ § §$¥$¥(¥(¥ † † ¥ ¥$¥$¥$¥$¥(¥(¥,Å,Å,Æ,Æ11AðAð5m5m(¥(¥(¥(¥(¥(¥(¥(¥ † †(¥(¥ † †(¥(¥(¥(¥ † †,Æ,Æ,¥,¥5m5m1*-*(¥(¥ § §(¥(¥,¥,¥ † †,¥,¥ † †(¥(¥ † †$Æ$Æ(¥(¥ § §(¥(¥,Æ,Æ † †(¥(¥,¥,¥1L1L$Ç$Ç$¥$¥$„$„ † †$„$„$„$„ § §$„$„ † †(¥(¥$„$„(¥(¥ † †$¥$¥(¥(¥ † †(¥(¥(¥(¥,¥,¥ § §$¥$¥$„$„$¥$¥(¥(¥(¥(¥,Æ,Æ,Æ,Æ,Å,Å(¥(¥5J5J=ð=ð,é,é$¥$¥(¥(¥$¥$¥$¥$¥ † †(¥(¥$¥$¥ † † † †(¥(¥,¥,¥,ç,ç=¯A°$Ç$Ç,¥,¥,¥,¥$Ç$Ç(¥(¥,¥,¥ § §,¥,¥,Æ,Æ(¥(¥ † †$Æ$Æ § §(¥(¥ † †,Æ,Æ$Ç$Ç,é,é,Æ,Æ-*1* § §$d$„(¥(¥$„$„(¥(¥ † †$„$„(¥(¥ † †$¥$¥$¥$¥(¥(¥ † †$„$„ † †(¥(¥(¥(¥(¥(¥(¥(¥ † †$„$„$¥$¥(¥(¥(¥(¥(¥(¥,Æ,Æ,Æ,Æ(¥(¥0ç0çAðAð-*1*(¥(¥ § §(¥(¥ † †(¥(¥ † †(¥(¥(¥(¥ † †(¥(¥,¥,¥,¥,¥=Ž=Ž1L1L(¥(¥,¥,¥(¥(¥,¥,¥ § §,¥,¥,Æ,Æ § §(¥(¥ § §(¥(¥(¥(¥(¥(¥,Æ,Æ † †(¥(¥,¥,¥1L1L$Ç$Ç$¥$¥$„$„ † †$„$„$„$„ § §$„$„ † †(¥(¥$„$„(¥(¥ † †$¥$¥(¥(¥ † †(¥(¥(¥(¥,¥,¥ § §$¥$¥$„$„$¥$¥(¥(¥(¥(¥,Æ,Æ,Æ,Æ,Å,Å(¥(¥5J5J=ð=ð,é,é$¥$¥(¥(¥$¥$¥$¥$¥ † †(¥(¥$¥$¥ † † † †(¥(¥,¥,¥,ç,ç=¯A°$Ç$Ç,¥,¥,¥,¥$Ç$Ç(¥(¥,¥,¥ § §,¥,¥,Æ,Æ(¥(¥ † †$Æ$Æ § §(¥(¥ † †,Æ,Æ$Ç$Ç,é,é,Æ,Æ-*1* § §$d$„(¥(¥$„$„(¥(¥ † †$„$„(¥(¥ † †$¥$¥$¥$¥(¥(¥ † †$„$„ † †(¥(¥(¥(¥(¥(¥(¥(¥ † †$„$„$¥$¥(¥(¥(¥(¥(¥(¥,Æ,Æ,Æ,Æ(¥(¥0ç0çAðAð-*1*(¥(¥ § §(¥(¥ † †(¥(¥ † †(¥(¥(¥(¥ † †(¥(¥,¥,¥,¥,¥=Ž=Ž1L1L(¥(¥,¥,¥(¥(¥,¥,¥ § §,¥,¥,Æ,Æ § §(¥(¥ § §(¥(¥(¥(¥(¥(¥ † †(¥(¥ § §(¥(¥11) -) - e …$„$„$„$„(¥(¥(¥(¥$„$„(¥(¥(¥(¥(¥(¥(¥(¥ d „ † †$„$„(¥(¥(¥(¥$¥$¥(¥(¥,¥,¥(¥(¥(¥(¥(¥(¥,Æ,Æ,¥,¥,Æ,Æ,Æ,Æ,Æ,Æ(ç(ç,Å,Å5k5kAòAñ$Æ$Æ(¥(¥ † † † †(¥(¥ † †(¥(¥ † †$„$„ † †(¥(¥ § §4ç4çA¯=°--,¥,¥,¥,¥(¥(¥(¥(¥,¥,¥,¥,¥(¥(¥,¥,¥ † †$Æ$Æ § §(¥(¥(¥(¥ § § § §,Æ,Æ,é,é,é,é1)1)(¥(¥$„$„$„$„$„$„(¥(¥$„$„(¥(¥(¥(¥(¥(¥$„$„ … e$„$„(¥(¥ † †(¥(¥$¥$¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥,Æ,Æ,Æ,Æ,¥,¥0ç0ç,Å,Å--=ð=ð1L1L e …$¥$¥ † †$„$„ † †(¥(¥ † † † †$„$„ † †,Æ,Æ § §5k5k9m5m,¥,¥,¥,¥,¥,¥,¥,¥,Æ,Æ § §(¥(¥,¥,¥(¥(¥ § §(¥(¥(¥(¥(¥(¥ † †(¥(¥ § §(¥(¥11) -) - e …$„$„$„$„(¥(¥(¥(¥$„$„(¥(¥(¥(¥(¥(¥(¥(¥ d „ † †$„$„(¥(¥(¥(¥$¥$¥(¥(¥,¥,¥(¥(¥(¥(¥(¥(¥,Æ,Æ,¥,¥,Æ,Æ,Æ,Æ,Æ,Æ(ç(ç,Å,Å5k5kAòAñ$Æ$Æ(¥(¥ † † † †(¥(¥ † †(¥(¥ † †$„$„ † †(¥(¥ § §4ç4çA¯=°--,¥,¥,¥,¥(¥(¥(¥(¥,¥,¥,¥,¥(¥(¥,¥,¥ † †$Æ$Æ § §(¥(¥(¥(¥ § § § §,Æ,Æ,é,é,é,é1)1)(¥(¥$„$„$„$„$„$„(¥(¥$„$„(¥(¥(¥(¥(¥(¥$„$„ … e$„$„(¥(¥ † †(¥(¥$¥$¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥,Æ,Æ,Æ,Æ,¥,¥0ç0ç,Å,Å--=ð=ð1L1L e …$¥$¥ † †$„$„ † †(¥(¥ † † † †$„$„ † †,Æ,Æ § §5k5k9m5m,¥,¥,¥,¥,¥,¥,¥,¥,Æ,Æ § §(¥(¥,¥,¥(¥(¥ § §(¥(¥(¥(¥$¥$¥(¥(¥ † †(¥(¥ § §-*1*11 e …(¥(¥$c$„$„$„(¥(¥(¥(¥(¥(¥$d$„$d$„(¥(¥(¥(¥$„$„(¥(¥(¥(¥(¥(¥$d$„,Å,Å0ç0ç,¥,¥,Æ,Æ(¥(¥,Æ,Æ,¥,¥(¥(¥,Æ,Æ,Å,Å0ç0ç0Æ0Æ5J5J=¯A°)) † †(¥(¥ † †(¥(¥ e …¥¥(¥(¥ † †$¥$¥(¥(¥ § §,Æ,Æ558ç4ç,Æ,Æ,¥,¥,¥,¥,¥,¥,¥,¥ § §,¥,¥,Æ,Æ(¥(¥ † †$Æ$Æ § §(¥(¥ † †,Æ,Æ † †(ç(ç,ç,ç1L1L(¥(¥(¥(¥ d „$„$„(¥(¥(¥(¥(¥(¥(¥(¥$d$„$„$„(¥(¥(¥(¥(¥(¥$„$„(¥(¥(¥(¥,¥,¥,¥,¥,¥,¥,¥,¥$Æ$Æ,¥,¥,Æ,Æ(¥(¥,Æ,Æ,Æ,Æ,Æ,Æ,Å,Å11AðAð-*1*(¥(¥ † †(¥(¥$¥$¥ † † † † ¥ ¥$¥$¥ † †$¥$¥(¥(¥,¥,¥5k5k1L1L,¥,¥,Å,Å,¥,¥,¥,¥(¥(¥,¥,¥,¥,¥,Æ,Æ(¥(¥ § §(¥(¥ † †$¥$¥(¥(¥ † †(¥(¥ § §-*1*11 e …(¥(¥$c$„$„$„(¥(¥(¥(¥(¥(¥$d$„$d$„(¥(¥(¥(¥$„$„(¥(¥(¥(¥(¥(¥$d$„,Å,Å0ç0ç,¥,¥,Æ,Æ(¥(¥,Æ,Æ,¥,¥(¥(¥,Æ,Æ,Å,Å0ç0ç0Æ0Æ5J5J=¯A°)) † †(¥(¥ † †(¥(¥ e …¥¥(¥(¥ † †$¥$¥(¥(¥ § §,Æ,Æ558ç4ç,Æ,Æ,¥,¥,¥,¥,¥,¥,¥,¥ § §,¥,¥,Æ,Æ(¥(¥ † †$Æ$Æ § §(¥(¥ † †,Æ,Æ † †(ç(ç,ç,ç1L1L(¥(¥(¥(¥ d „$„$„(¥(¥(¥(¥(¥(¥(¥(¥$d$„$„$„(¥(¥(¥(¥(¥(¥$„$„(¥(¥(¥(¥,¥,¥,¥,¥,¥,¥,¥,¥$Æ$Æ,¥,¥,Æ,Æ(¥(¥,Æ,Æ,Æ,Æ,Æ,Æ,Å,Å11AðAð-*1*(¥(¥ † †(¥(¥$¥$¥ † † † † ¥ ¥$¥$¥ † †$¥$¥(¥(¥,¥,¥5k5k1L1L,¥,¥,Å,Å,¥,¥,¥,¥(¥(¥,¥,¥,¥,¥,Æ,Æ(¥(¥ § §(¥(¥ † † e …(¥(¥(¥(¥,¥,¥,Æ,Æ,é,é,é,é e …$d$„$„$„ † †$„$d(¥(¥(¥(¥(¥(¥(¥(¥ d „$„$„ † †(¥(¥(¥(¥(¥(¥,Æ,Æ,Å,Å0Æ0Æ(¥(¥(¥(¥,Æ,Æ,Æ,Æ,Æ,Æ,Å,Å,Æ,Æ0ç0ç(Å(Å(Å(Å--AðAð,é,é(¥(¥ † †$¥$¥ † † † †$„$„ † †$¥$¥ † † § §$„$„ § §55(ç(ç,Å,Å,Æ,Æ,¥,¥,Æ,Æ,¥,¥,¥,¥0ç0ç,¥,¥,¥,¥(¥(¥ § §(¥(¥(¥(¥$¥$¥ § §(¥(¥(¥(¥ † †-*1* § §$c$„ e …$„$„(¥(¥(¥(¥$d$„(¥(¥(¥(¥ † †$„$d$¥$¥$„$„,¥,¥,¥,¥,¥,¥,Æ,Æ,¥,¥,Æ,Æ(¥(¥,Æ,Æ,Æ,Æ,Æ,Æ(¥(¥,Å,Å0ç0ç,Å,Å,¥,¥,Æ,Æ5511 e …(¥(¥(¥(¥ e … § § ¥ ¥$„$„ † †(¥(¥ § §(¥(¥ e …-*1*1L1L,¥,¥,Å,Å0Æ0Æ,¥,¥,Æ,Æ(¥(¥0Æ0Æ,¥,¥,Æ,Æ(¥(¥ e …$¥$¥ … e(¥(¥(¥(¥,¥,¥,Æ,Æ,é,é,é,é e …$d$„$„$„ † †$„$d(¥(¥(¥(¥(¥(¥(¥(¥ d „$„$„ † †(¥(¥(¥(¥(¥(¥,Æ,Æ,Å,Å0Æ0Æ(¥(¥(¥(¥,Æ,Æ,Æ,Æ,Æ,Æ,Å,Å,Æ,Æ0ç0ç(Å(Å(Å(Å--AðAð,é,é(¥(¥ † †$¥$¥ † † † †$„$„ † †$¥$¥ † † § §$„$„ § §55(ç(ç,Å,Å,Æ,Æ,¥,¥,Æ,Æ,¥,¥,¥,¥0ç0ç,¥,¥,¥,¥(¥(¥ § §(¥(¥(¥(¥$¥$¥ § §(¥(¥(¥(¥ † †-*1* § §$c$„ e …$„$„(¥(¥(¥(¥$d$„(¥(¥(¥(¥ † †$„$d$¥$¥$„$„,¥,¥,¥,¥,¥,¥,Æ,Æ,¥,¥,Æ,Æ(¥(¥,Æ,Æ,Æ,Æ,Æ,Æ(¥(¥,Å,Å0ç0ç,Å,Å,¥,¥,Æ,Æ5511 e …(¥(¥(¥(¥ e … § § ¥ ¥$„$„ † †(¥(¥ § §(¥(¥ e …-*1*1L1L,¥,¥,Å,Å0Æ0Æ,¥,¥,Æ,Æ(¥(¥0Æ0Æ,¥,¥,Æ,Æ(¥(¥ e …$¥$¥ † † § §$Ç$Ç § §,é,é5m5m)K)K † †¥¥e…$¥$¥ † † † † § §$Ç$Ç § § § §$Ç$Ç$Ç$Ç § §$Ç$Ç$Ç$Ç,é,é § § § §$Æ$Æ § § § § § § § §,ç,ç)),é,é111L1L1L1L551*-*e… † † § § † † ç ç § § § § § § § §$Ç$Ç-*1*-l-l=Ž=Ž) -) -$Ç$Ç † † § § § §,é,é § §$Ç$Ç,é,é,é,é,é,é,é,é)) § § § §$Ç$Ç § §$Ç$Ç) -) --l-l$Ç$Çf†¥¥ e …f† † † § § § § § § § §$Ç$Ç$Ç$Ç § §!!$Ç$Ç$Ç$Ç$Ç$Ç § § § § § § § § § § § §(ç(ç,é,é,ç,ç) -) -5J5J5k5k1L1L5Œ5Œ † † § § § § Æ Æ § § § § § § ç ç § § § §!!1L1L551L1L$Æ$Æ$Ç$Ç § §$Ç$Ç$Æ$Æ$Ç$Ç$Ç$Ç$Ç$Ç,é,é$Ç$Ç$Ç$Ç$Ç$Ç † † § §$Ç$Ç § §,é,é5m5m)K)K † †¥¥e…$¥$¥ † † † † § §$Ç$Ç § § § §$Ç$Ç$Ç$Ç § §$Ç$Ç$Ç$Ç,é,é § § § §$Æ$Æ § § § § § § § §,ç,ç)),é,é111L1L1L1L551*-*e… † † § § † † ç ç § § § § § § § §$Ç$Ç-*1*-l-l=Ž=Ž) -) -$Ç$Ç † † § § § §,é,é § §$Ç$Ç,é,é,é,é,é,é,é,é)) § § § §$Ç$Ç § §$Ç$Ç) -) --l-l$Ç$Çf†¥¥ e …f† † † § § § § § § § §$Ç$Ç$Ç$Ç § §!!$Ç$Ç$Ç$Ç$Ç$Ç § § § § § § § § § § § §(ç(ç,é,é,ç,ç) -) -5J5J5k5k1L1L5Œ5Œ † † § § § § Æ Æ § § § § § § ç ç § § § §!!1L1L551L1L$Æ$Æ$Ç$Ç § §$Ç$Ç$Æ$Æ$Ç$Ç$Ç$Ç$Ç$Ç,é,é$Ç$Ç$Ç$Ç$Ç$Ç55AðAð=¯A°AðAðAðAð=¯A°=Ž=Ž=ï=ï55=Ž=Ž=¯A°555955595Ž5591L1L5Œ5Œ951Œ1Œ1L1L55=Ž=Ž559Œ5ŒAðAðAðAð55=ï=ï=¯A°AðAðIðEðAðAðJFNSN3=ï=ï=¯A°=Ž=ŽAðAðAðAðAðAð=¯A°AñAòAðAðAðAð=ð=ð=¯A°BBNSN3IïEïAðAð=¯A°=Ž=ŽAðAðAðAðAðAðAðAð=¯A°AðAðBBJSF3JSF3JSF3NSN3IðEðAðAð=ð=ð=ð=ðAòAñ=ï=ï=¯A°55=Ž=Ž=¯A°555955595Œ5Œ595k5k1Œ1Œ559m5m1L1L5595559Œ5Œ=¯A°AðAð=ï=ï=Ž=Ž=¯A°=ï=ïAðAðAïAïIðEðNSN3AïAï=ð=ð=Ž=ŽAðAð=¯A°AðAð=¯A°AðAðAðAðAòAñ=ð=ð55IðIðNSN3IðEðAïAïAòAñ=Ž=Ž=Ž=ŽAðAðAòAñAðAðAðAðAðAðAðAðJSF3JSF3JSF359AðAð=¯A°AðAðAðAð=¯A°=Ž=Ž=ï=ï55=Ž=Ž=¯A°555955595Ž5591L1L5Œ5Œ951Œ1Œ1L1L55=Ž=Ž559Œ5ŒAðAðAðAð55=ï=ï=¯A°AðAðIðEðAðAðJFNSN3=ï=ï=¯A°=Ž=ŽAðAðAðAðAðAð=¯A°AñAòAðAðAðAð=ð=ð=¯A°BBNSN3IïEïAðAð=¯A°=Ž=ŽAðAðAðAðAðAðAðAð=¯A°AðAðBBJSF3JSF3JSF3NSN3IðEðAðAð=ð=ð=ð=ðAòAñ=ï=ï=¯A°55=Ž=Ž=¯A°555955595Œ5Œ595k5k1Œ1Œ559m5m1L1L5595559Œ5Œ=¯A°AðAð=ï=ï=Ž=Ž=¯A°=ï=ïAðAðAïAïIðEðNSN3AïAï=ð=ð=Ž=ŽAðAð=¯A°AðAð=¯A°AðAðAðAðAòAñ=ð=ð55IðIðNSN3IðEðAïAïAòAñ=Ž=Ž=Ž=ŽAðAðAòAñAðAðAðAðAðAðAðAðJSF3JSF3JSF3(ç(ç Æ Æ(¥(¥ § §(ç(ç Æ Æ(¥(¥ ç ç(¥(¥ ç ç---*1*(ç(ç ¥ ¥(¥(¥$¥$¥$¥$¥(¥(¥$¥$¥$¥$¥$¥$¥$„$„$¥$¥,ç,ç,ç,ç%%$Ç$Ç$ç$ç-)-)(ç(ç § § Æ Æ$Ç$Ç ç ç(ç(ç,ç,ç,ç,ç-)-)$ç$ç--(ç(ç--(ç(ç--(ç(ç(ç(ç$Ç$Ç(ç(ç(ç(ç Æ Æ$Æ$Æ § §,ç,ç11-*1*-)-) ç ç$¥$¥ Æ Æ Æ Æ § § ç ç § §(ç(ç ç ç Æ Æ$Æ$Æ$Æ$Æ § §(ç(ç$¥$¥ § §$Æ$Æ(ç(ç(ç(ç-*1*%%$¥$¥(¥(¥(Å(Å$¥$¥$¥$¥$¥$¥$¥$¥(¥(¥ ¥ ¥$¥$¥(¥(¥--,é,é%%(ç(ç$ç$ç,é,é ç ç § §(ç(ç ç ç(ç(ç$Ç$Ç---)-),ç,ç$ç$ç,é,é,ç,ç$ç$ç-)-),ç,ç$ç$ç(ç(ç § §,ç,ç(ç(ç § §(ç(ç(ç(ç(ç(ç11-*1*-)-)¥¥ † † Æ Æ Æ Æ § § ç ç § §(ç(ç Æ Æ(¥(¥ § §(ç(ç Æ Æ(¥(¥ ç ç(¥(¥ ç ç---*1*(ç(ç ¥ ¥(¥(¥$¥$¥$¥$¥(¥(¥$¥$¥$¥$¥$¥$¥$„$„$¥$¥,ç,ç,ç,ç%%$Ç$Ç$ç$ç-)-)(ç(ç § § Æ Æ$Ç$Ç ç ç(ç(ç,ç,ç,ç,ç-)-)$ç$ç--(ç(ç--(ç(ç--(ç(ç(ç(ç$Ç$Ç(ç(ç(ç(ç Æ Æ$Æ$Æ § §,ç,ç11-*1*-)-) ç ç$¥$¥ Æ Æ Æ Æ § § ç ç § §(ç(ç ç ç Æ Æ$Æ$Æ$Æ$Æ § §(ç(ç$¥$¥ § §$Æ$Æ(ç(ç(ç(ç-*1*%%$¥$¥(¥(¥(Å(Å$¥$¥$¥$¥$¥$¥$¥$¥(¥(¥ ¥ ¥$¥$¥(¥(¥--,é,é%%(ç(ç$ç$ç,é,é ç ç § §(ç(ç ç ç(ç(ç$Ç$Ç---)-),ç,ç$ç$ç,é,é,ç,ç$ç$ç-)-),ç,ç$ç$ç(ç(ç § §,ç,ç(ç(ç § §(ç(ç(ç(ç(ç(ç11-*1*-)-)¥¥ † † Æ Æ Æ Æ § § ç ç § § d „dƒ e …$d$„dƒdddd$„$d„c … e,Æ,Æ)K)K$d$„$d$„$d$„ d ƒ d ƒ$d$„dƒ$d$„dƒdd … e$„$„(¥(¥1L1L † † ¥ ¥ d „ d „dcdd ¥ ¥ e …$d$„ ¥ ¥ e … e …(Å(Å(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥ † †$„$„ † †$„$„ † † … e$¥$¥ e …$¥$¥(¥(¥5m5m$Ç$Çdd … edd¥¥dd „ „dd „ „dd$¥$¥dd … e$„$d„cdd„c$„$d„c ¥ ¥-*1*$Æ$Æ$c$„$„$„ „ d$„$d „ c$„$d „ ddc$„$d„c … e$„$„55) -) -c„ ¥ ¥ d „dd„c … e … e ¥ ¥$d$„ e …$d$„$¥$¥(¥(¥$¥$¥(¥(¥(¥(¥$„$„(¥(¥ † †$„$„(¥(¥ † † … e ¥ ¥dd$¥$¥ e …5I5I1L1Ldddd¥¥dd$¥$¥dddd „ „ „ d„c … e$„$d„cdddd$„$d„c … e,Æ,Æ)K)K$d$„$d$„$d$„ d ƒ d ƒ$d$„dƒ$d$„dƒdd … e$„$„(¥(¥1L1L † † ¥ ¥ d „ d „dcdd ¥ ¥ e …$d$„ ¥ ¥ e … e …(Å(Å(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥ † †$„$„ † †$„$„ † † … e$¥$¥ e …$¥$¥(¥(¥5m5m$Ç$Çdd … edd¥¥dd „ „dd „ „dd$¥$¥dd … e$„$d„cdd„c$„$d„c ¥ ¥-*1*$Æ$Æ$c$„$„$„ „ d$„$d „ c$„$d „ ddc$„$d„c … e$„$„55) -) -c„ ¥ ¥ d „dd„c … e … e ¥ ¥$d$„ e …$d$„$¥$¥(¥(¥$¥$¥(¥(¥(¥(¥$„$„(¥(¥ † †$„$„(¥(¥ † † … e ¥ ¥dd$¥$¥ e …5I5I1L1Ldddd¥¥dd$¥$¥dddd „ „$d$„$d$„dƒ$d$„$„$„ƒdƒd$„$d„c$„$d$Æ$Æ-*1*$d$„ d ƒ$d$„ „ ƒ$„$c$„$„$„$d„c „ „„c$„$„dd$„$„-*1* Æ Æ$d$„dddd „ „dd ¥ ¥ e … ¥ ¥ e …$„$„$¥$¥(¥(¥ † †$„$d(¥(¥(¥(¥(¥(¥(¥(¥ † †(¥(¥ e … ¥ ¥ ¥ ¥dd$¥$¥ e …(¥(¥55)) e … „ „¥¥dd¥¥ e …¥¥ e …dd¥¥dd$„$d „ c$„$„cd$„$d„c$„$d$„$d1)1) § §$d$„$d$„$d$„ d ƒ$d$ƒ$„$„ƒd$„$d„c$„$d „ „ „ c--$ç$ç e … e …c„ „ „dd ¥ ¥c„ ¥ ¥ e …$¥$¥$¥$¥$¥$¥(¥(¥ † †(¥(¥(¥(¥(¥(¥(¥(¥ † †(¥(¥ † †$„$d ¥ ¥dd$¥$¥ e … Æ Æ5)5)1L1L † † … edd „ „ … e … eƒd … e$„$d$„$d„c$„$d$„$„ƒdƒd$„$d„c$„$d$Æ$Æ-*1*$d$„ d ƒ$d$„ „ ƒ$„$c$„$„$„$d„c „ „„c$„$„dd$„$„-*1* Æ Æ$d$„dddd „ „dd ¥ ¥ e … ¥ ¥ e …$„$„$¥$¥(¥(¥ † †$„$d(¥(¥(¥(¥(¥(¥(¥(¥ † †(¥(¥ e … ¥ ¥ ¥ ¥dd$¥$¥ e …(¥(¥55)) e … „ „¥¥dd¥¥ e …¥¥ e …dd¥¥dd$„$d „ c$„$„cd$„$d„c$„$d$„$d1)1) § §$d$„$d$„$d$„ d ƒ$d$ƒ$„$„ƒd$„$d„c$„$d „ „ „ c--$ç$ç e … e …c„ „ „dd ¥ ¥c„ ¥ ¥ e …$¥$¥$¥$¥$¥$¥(¥(¥ † †(¥(¥(¥(¥(¥(¥(¥(¥ † †(¥(¥ † †$„$d ¥ ¥dd$¥$¥ e … Æ Æ5)5)1L1L † † … edd „ „ … e … eƒd … e$d$„$d$„ „ ƒ„c$„$d„c$„$d„c$„$c$„$d,Å,Å)K)K$d$„$d$„ „ ƒ$„$d$„$„$„$„$„$d„c$„$d$„$„cd ¥ ¥$„$„5J5J e …dd „ „dd¥¥dddd ¥ ¥$d$„ ¥ ¥$¥$¥$„$„ † †$„$„(¥(¥(¥(¥(¥(¥ † †$„$„…e … e ¥ ¥$„$„ … edd¥¥(¥(¥ § §5k5k,é,édd „ „dd¥¥ e …dddd „ „dd…eƒd … e$„$d „ c$„$d„c „ c$„$d$„$„-*1* Æ Æ$d$„$d$„ „ ƒ$„$d$„$„ ƒ d$„$d „ „„c$„$d „ „$„$d--))dd „ „dd „ „dd„„ … e „ „ ¥ ¥$„$„(¥(¥ † † … e$¥$¥$d$„(¥(¥(¥(¥ † † … e$„$d „ „ „ „$¥$¥dd¥¥ † †$„$d1)1)1L1Lc„ ¥ ¥dd¥¥dd$„$„ƒddd$„$d$„$d „ ƒ„c$„$d„c$„$d„c$„$c$„$d,Å,Å)K)K$d$„$d$„ „ ƒ$„$d$„$„$„$„$„$d„c$„$d$„$„cd ¥ ¥$„$„5J5J e …dd „ „dd¥¥dddd ¥ ¥$d$„ ¥ ¥$¥$¥$„$„ † †$„$„(¥(¥(¥(¥(¥(¥ † †$„$„…e … e ¥ ¥$„$„ … edd¥¥(¥(¥ § §5k5k,é,édd „ „dd¥¥ e …dddd „ „dd…eƒd … e$„$d „ c$„$d„c „ c$„$d$„$„-*1* Æ Æ$d$„$d$„ „ ƒ$„$d$„$„ ƒ d$„$d „ „„c$„$d „ „$„$d--))dd „ „dd „ „dd„„ … e „ „ ¥ ¥$„$„(¥(¥ † † … e$¥$¥$d$„(¥(¥(¥(¥ † † … e$„$d „ „ „ „$¥$¥dd¥¥ † †$„$d1)1)1L1Lc„ ¥ ¥dd¥¥dd$„$„ƒddd$d$„dƒ d ƒ$d$„dƒ d ƒ$d$„ d ƒ d ƒ$„$„$Æ$Æ1L1L$d$„$„$„$„$d$„$„$„$„$„$„$„$„$„$„ƒd$„$„$„$d$„$„ … e,é,é„„dd „ „dddd„„dc … e$„$„ … e$¥$¥$„$„ † †$„$„ … e$„$„(¥(¥ e …(¥(¥dd$„$„ … e … e ¥ ¥$d$„ ¥ ¥$„$„,¥,¥5m5m ç çdddd„c … edddd¥¥dd¥¥dddd$„$„ ƒ d ƒ d ƒ „ ƒ d$ƒ$d$„$„$„$d)J)J$Ç$Ç$d$„$„$„$„$„$„$„$„$„$„$„$„$„ƒd$„$„ƒd$¥$¥ c „(ç(ç § §c„dd „ „„ddddc ¥ ¥dd$„$„ † †$„$„(¥(¥ † †$„$d(¥(¥$„$„(¥(¥ e … e …$„$„dd ¥ ¥ e … e …$„$„(¥(¥(¥(¥--1L1Ldddddc † †dddddd$„$d$„$d„c „ c$„$d„c „ c$„$d „ c „ c$„$„$Æ$Æ1L1L$d$„$„$„$„$d$„$„$„$„$„$„$„$„$„$„ƒd$„$„$„$d$„$„ … e,é,é„„dd „ „dddd„„dc … e$„$„ … e$¥$¥$„$„ † †$„$„ … e$„$„(¥(¥ e …(¥(¥dd$„$„ … e … e ¥ ¥$d$„ ¥ ¥$„$„,¥,¥5m5m ç çdddd„c … edddd¥¥dd¥¥dddd$„$„ ƒ d ƒ d ƒ „ ƒ d$ƒ$d$„$„$„$d)J)J$Ç$Ç$d$„$„$„$„$„$„$„$„$„$„$„$„$„ƒd$„$„ƒd$¥$¥ c „(ç(ç § §c„dd „ „„ddddc ¥ ¥dd$„$„ † †$„$„(¥(¥ † †$„$d(¥(¥$„$„(¥(¥ e … e …$„$„dd ¥ ¥ e … e …$„$„(¥(¥(¥(¥--1L1Ldddddc † †dddddd$„$d$d$„ d ƒ d ƒ d ƒ$d$ƒ d ƒ d ƒ d ƒ$d$ƒ$d$„(Å(Å5J5Jdd$„$d$„$„ ƒ d$„$„$„$„$„$d$„$„$„$d „ „$„$„ƒd$¥$¥(¥(¥¥¥c„dd „ „„c … e$„$„ ¥ ¥$„$„(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$„$„$„$„(¥(¥ † †$„$„ § §$d$„5J5J$Ç$Çdddddd„„dd„„„ddddddd „ „„c$„$d „ c „ c „ c$„$c$„$d$„$d5)5)%% c „$d$„ d ƒ$„$„$„$d$„$„$„$„$„$d$„$„$„$d$„$d$„$„ Æ Æ$¥$¥dddd$„$ddc ¥ ¥$d$„$d$„$¥$¥$„$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$d$„(¥(¥(¥(¥$„$„(¥(¥ e …$¥$¥(¥(¥(¥(¥,é,é-*1*dƒ e …cddd„„dd „ „„c$„$d „ c „ c „ c$„$c „ c „ c „ c$„$c$„$d(Å(Å5J5Jdd$„$d$„$„ ƒ d$„$„$„$„$„$d$„$„$„$d „ „$„$„ƒd$¥$¥(¥(¥¥¥c„dd „ „„c … e$„$„ ¥ ¥$„$„(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$„$„$„$„(¥(¥ † †$„$„ § §$d$„5J5J$Ç$Çdddddd„„dd„„„ddddddd „ „„c$„$d „ c „ c „ c$„$c$„$d$„$d5)5)%% c „$d$„ d ƒ$„$„$„$d$„$„$„$„$„$d$„$„$„$d$„$d$„$„ Æ Æ$¥$¥dddd$„$ddc ¥ ¥$d$„$d$„$¥$¥$„$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$d$„(¥(¥(¥(¥$„$„(¥(¥ e …$¥$¥(¥(¥(¥(¥,é,é-*1*dƒ e …cddd„„dd „ „„c † † † †$„$„ † †(¥(¥ † †dddd „ d„c § §1L1L%%(¥(¥ † †$„$„(¥(¥$Æ$Æ,Æ,Æ † † ¥ ¥$¥$¥$¥$¥$¥$¥ § §11$Ç$Ç$Ç$Ç § §dd„c … e ¥ ¥$„$„ † †$„$„$„$d … e † †(¥(¥ e … e …$d$„(¥(¥ e …$d$„(¥(¥ † † † † … e(¥(¥ † †(¥(¥$Ç$Ç551*-* † ††f„„ÆÆd„dde…e… § § ç ç § § § § § §(¥(¥e…dd „ ddd ¥ ¥-*1*) -) - § §$¥$¥$„$„$¥$¥$Æ$Æ,¥,¥ † †$¥$¥ ¥ ¥$¥$¥$¥$¥(¥(¥,é,é%% § §$Æ$Æ † †ƒd … e ¥ ¥$„$„ † †$„$„(¥(¥dd$„$d † †$„$d … e$„$d(¥(¥ † †$„$d$¥$¥$d$„ § § d „(¥(¥ † † † † † †-*1*)K)Kf†f†„„ Æ Æe…d„dd † † † † † †$„$„ † †(¥(¥ † †dddd „ d„c § §1L1L%%(¥(¥ † †$„$„(¥(¥$Æ$Æ,Æ,Æ † † ¥ ¥$¥$¥$¥$¥$¥$¥ § §11$Ç$Ç$Ç$Ç § §dd„c … e ¥ ¥$„$„ † †$„$„$„$d … e † †(¥(¥ e … e …$d$„(¥(¥ e …$d$„(¥(¥ † † † † … e(¥(¥ † †(¥(¥$Ç$Ç551*-* † ††f„„ÆÆd„dde…e… § § ç ç § § § § § §(¥(¥e…dd „ ddd ¥ ¥-*1*) -) - § §$¥$¥$„$„$¥$¥$Æ$Æ,¥,¥ † †$¥$¥ ¥ ¥$¥$¥$¥$¥(¥(¥,é,é%% § §$Æ$Æ † †ƒd … e ¥ ¥$„$„ † †$„$„(¥(¥dd$„$d † †$„$d … e$„$d(¥(¥ † †$„$d$¥$¥$d$„ § § d „(¥(¥ † † † † † †-*1*)K)Kf†f†„„ Æ Æe…d„dd † †1L1L11551L1L55951L1L-l-l-*1*)K)K1L1L11=ð=ð=Ž=Ž5595=°A¯EïIïEðIðAðAðAðAð=Ž=ŽAïAïIðEðAðAðAðAðAðAðAðAð5Œ5Œ95)J)J1L1L1L1L1L1L1L1L1Œ1Œ-l-l5m5m-l-l1L1L1L1L1L1L1L1L)K)K)K)K) -) -)K)K1L1L559555A¯=°59=ð=ðNSN3NSN3=¯A°=ï=ïAðAðAðAð551Œ1Œ55A¯=°=ð=ðAòAñIðEðAïAïAòAñ1Œ1Œ1L1L1L1L)K)K-*1*1L1L5m5m95AðAð5595=Ž=ŽIïEïIðEðAðAðAðAðAðAð=ï=ïAðAðAðAð=Ž=ŽAðAðIðEðAðAð551L1L-*1*1L1L1L1L1L1L-l-l1L1L5m5m9n5m5m5m-l-l1L1L1L1L)K)K)K)K) -) -1L1L1L1L115m5m95=¯A°55595559551155AðAð-*1*1L1L)K)K)K)K1L1L11551L1L55951L1L-l-l-*1*)K)K1L1L11=ð=ð=Ž=Ž5595=°A¯EïIïEðIðAðAðAðAð=Ž=ŽAïAïIðEðAðAðAðAðAðAðAðAð5Œ5Œ95)J)J1L1L1L1L1L1L1L1L1Œ1Œ-l-l5m5m-l-l1L1L1L1L1L1L1L1L)K)K)K)K) -) -)K)K1L1L559555A¯=°59=ð=ðNSN3NSN3=¯A°=ï=ïAðAðAðAð551Œ1Œ55A¯=°=ð=ðAòAñIðEðAïAïAòAñ1Œ1Œ1L1L1L1L)K)K-*1*1L1L5m5m95AðAð5595=Ž=ŽIïEïIðEðAðAðAðAðAðAð=ï=ïAðAðAðAð=Ž=ŽAðAðIðEðAðAð551L1L-*1*1L1L1L1L1L1L-l-l1L1L5m5m9n5m5m5m-l-l1L1L1L1L)K)K)K)K) -) -1L1L1L1L115m5m95=¯A°55595559551155AðAð-*1*1L1L)K)K)K)K11,Æ,Æ11115J5J=¯A°,Æ,Æ$¥$¥ † †(¥(¥ ç ç$¥$¥ e … Æ Æ ¥ ¥(¥(¥ Æ Æ § §$Æ$Æ(ç(ç(¥(¥ ç ç$Æ$Æ$Æ$Æ$¥$¥ e … „ „ ç ç$Æ$Æ(¥(¥$¥$¥ † † ç ç,¥,¥5J5J=¯A°5k5k5k9k5m5m5k9k555k9k55=Œ=Œ5m5m=Œ=Œ5m5m=Œ=Œ559Ž55J5J1)1)-*1*11111)1)5)5)5J5J5I5I5J5J5J5J5k5k9I5I5)5)9k5k5k5k9)5)11=Œ=Œ1L1L(¥(¥(¥(¥$¥$¥ † † § § Æ ÆÆÆ ¥ ¥ e …$¥$¥(¥(¥ Æ Æ ç ç$Æ$Æ(ç(ç$Æ$Æ$Æ$Æ,Æ,Æ$¥$¥ † † „ „ § §$Æ$Æ ¥ ¥ ¥ ¥ Æ Æ(¥(¥$Æ$Æ11=Ž=Ž555J5J1Œ1Œ5k5k955k5k=Ž=Ž5m5m=Ž=Ž=Œ=Œ5m5m9k5k=Ž=ŽJF=Ž=Ž5)5)1)1)--115I5I9I5I5J5J5k5k9I5I5J5J5k5k9)5)1L1L11,Æ,Æ11115J5J=¯A°,Æ,Æ$¥$¥ † †(¥(¥ ç ç$¥$¥ e … Æ Æ ¥ ¥(¥(¥ Æ Æ § §$Æ$Æ(ç(ç(¥(¥ ç ç$Æ$Æ$Æ$Æ$¥$¥ e … „ „ ç ç$Æ$Æ(¥(¥$¥$¥ † † ç ç,¥,¥5J5J=¯A°5k5k5k9k5m5m5k9k555k9k55=Œ=Œ5m5m=Œ=Œ5m5m=Œ=Œ559Ž55J5J1)1)-*1*11111)1)5)5)5J5J5I5I5J5J5J5J5k5k9I5I5)5)9k5k5k5k9)5)11=Œ=Œ1L1L(¥(¥(¥(¥$¥$¥ † † § § Æ ÆÆÆ ¥ ¥ e …$¥$¥(¥(¥ Æ Æ ç ç$Æ$Æ(ç(ç$Æ$Æ$Æ$Æ,Æ,Æ$¥$¥ † † „ „ § §$Æ$Æ ¥ ¥ ¥ ¥ Æ Æ(¥(¥$Æ$Æ11=Ž=Ž555J5J1Œ1Œ5k5k955k5k=Ž=Ž5m5m=Ž=Ž=Œ=Œ5m5m9k5k=Ž=ŽJF=Ž=Ž5)5)1)1)--115I5I9I5I5J5J5k5k9I5I5J5J5k5k9)5)1L1L(¥(¥ † †$„$d$„$d0ç0ç55(¥(¥ d „dddd„ddddddd$„$d ¥ ¥ d „dcdƒdddddddddddd„„dd „ „$¥$¥dddddc … e(¥(¥55950ç0ç(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥$Ç$Ç,¥,¥0ç0ç0ç0ç$Ç$Ç0Æ0Æ5m5m1L1L(¥(¥(¥(¥$„$„(¥(¥$d$„$d$„,¥,¥$d$„,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,Æ,Æ(¥(¥,¥,¥,¥,¥,¥,¥1L1L5J5J d „dd$„$ddcdddddddd „ c ¥ ¥ e …c„$d$„dd „ ddddddddddddc „ „$¥$¥dddddcdd(¥(¥,¥,¥551)1)(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥$Ç$Ç,Æ,Æ0ç0ç,¥,¥$Ç$Ç5)5)IðIð) -) -(¥(¥ e …$¥$¥$d$„(¥(¥,¤,¤,¥,¥$d$„,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥(¥(¥ † †$„$d$„$d0ç0ç55(¥(¥ d „dddd„ddddddd$„$d ¥ ¥ d „dcdƒdddddddddddd„„dd „ „$¥$¥dddddc … e(¥(¥55950ç0ç(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥$Ç$Ç,¥,¥0ç0ç0ç0ç$Ç$Ç0Æ0Æ5m5m1L1L(¥(¥(¥(¥$„$„(¥(¥$d$„$d$„,¥,¥$d$„,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,Æ,Æ(¥(¥,¥,¥,¥,¥,¥,¥1L1L5J5J d „dd$„$ddcdddddddd „ c ¥ ¥ e …c„$d$„dd „ ddddddddddddc „ „$¥$¥dddddcdd(¥(¥,¥,¥551)1)(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥$Ç$Ç,Æ,Æ0ç0ç,¥,¥$Ç$Ç5)5)IðIð) -) -(¥(¥ e …$¥$¥$d$„(¥(¥,¤,¤,¥,¥$d$„,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,Æ,Æ,¥,¥$¥$¥ e …--5m5m(¥(¥ d „dddc„d„ddddcdd ¥ ¥ d „dddcdd„ddd„ddd„„dddd¥¥ e …dddd„„dd$„$„1155$Ç$Ç(¥(¥ † †,¥,¥$Ç$Ç$Ç$Ç$Ç$Ç0ç0ç$Ç$Ç,Æ,Æ$Ç$Ç0ç0ç=Ž=Ž1L1L,Æ,Æ § §(¥(¥ † †(¥(¥(¥(¥ § §,¥,¥(¥(¥(¥(¥,¥,¥0Æ0Æ,Æ,Æ,¥,¥ § §0Æ0Æ,é,é,¥,¥1L1L1L1L$c$„dddd„ddc„ddcdcdd$¥$¥ d „dddcdddc„ddd„ddd„„dddd¥¥ d „dddd „ „ … e,Æ,Æ5511,¥,¥ § §(¥(¥$Ç$Ç$Ç$Ç0ç0ç$Ç$Ç0ç0ç$Ç$Ç,é,é,Æ,Æ5J5J=¯A°(æ(ç(¥(¥(¥(¥(¥(¥ † †(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥$Ç$Ç,¥,¥,¥,¥,Æ,Æ,¥,¥$¥$¥ e …--5m5m(¥(¥ d „dddc„d„ddddcdd ¥ ¥ d „dddcdd„ddd„ddd„„dddd¥¥ e …dddd„„dd$„$„1155$Ç$Ç(¥(¥ † †,¥,¥$Ç$Ç$Ç$Ç$Ç$Ç0ç0ç$Ç$Ç,Æ,Æ$Ç$Ç0ç0ç=Ž=Ž1L1L,Æ,Æ § §(¥(¥ † †(¥(¥(¥(¥ § §,¥,¥(¥(¥(¥(¥,¥,¥0Æ0Æ,Æ,Æ,¥,¥ § §0Æ0Æ,é,é,¥,¥1L1L1L1L$c$„dddd„ddc„ddcdcdd$¥$¥ d „dddcdddc„ddd„ddd„„dddd¥¥ d „dddd „ „ … e,Æ,Æ5511,¥,¥ § §(¥(¥$Ç$Ç$Ç$Ç0ç0ç$Ç$Ç0ç0ç$Ç$Ç,é,é,Æ,Æ5J5J=¯A°(æ(ç(¥(¥(¥(¥(¥(¥ † †(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥$Ç$Ç,¥,¥,¥,¥,Æ,Æ † † … edd--55(¥(¥ d „d„d„dddcdcdd … e „ „dddd „ „„ddd„ddd„„dddd„„ … e „ „dd„„dddd$¥$¥1155,ç,ç0ç0ç,¥,¥ § § § §,Æ,Æ$Ç$Ç0ç0ç$Ç$Ç,é,é,¥,¥,é,é=Œ=Œ55(¥(¥(¥(¥ † † ¥ ¥ † † § §(¥(¥$Æ$Æ,¥,¥ § §(¥(¥ § §0Æ0Æ,Æ,Æ,é,é,¥,¥,é,é4ç4ç1*-*1L1L$d$„dd„c„ddd„ddcdddd¥¥ d „dd … ecddd„ddd…edd„„dd¥¥ † †$„$ddd„ddd „ „,¥,¥551*-*,Æ,Æ$Ç$Ç,¥,¥$Ç$Ç § §,¥,¥$Ç$Ç0ç0ç$Ç$Ç$Ç$Ç,Æ,Æ5J5J=¯A°,è,é(¥(¥ † † … e Æ Æ(¥(¥ † †$Ç$Ç(¥(¥$Ç$Ç,Æ,Æ$Ç$Ç,¥,¥$Ç$Ç,Æ,Æ † † … edd--55(¥(¥ d „d„d„dddcdcdd … e „ „dddd „ „„ddd„ddd„„dddd„„ … e „ „dd„„dddd$¥$¥1155,ç,ç0ç0ç,¥,¥ § § § §,Æ,Æ$Ç$Ç0ç0ç$Ç$Ç,é,é,¥,¥,é,é=Œ=Œ55(¥(¥(¥(¥ † † ¥ ¥ † † § §(¥(¥$Æ$Æ,¥,¥ § §(¥(¥ § §0Æ0Æ,Æ,Æ,é,é,¥,¥,é,é4ç4ç1*-*1L1L$d$„dd„c„ddd„ddcdddd¥¥ d „dd … ecddd„ddd…edd„„dd¥¥ † †$„$ddd„ddd „ „,¥,¥551*-*,Æ,Æ$Ç$Ç,¥,¥$Ç$Ç § §,¥,¥$Ç$Ç0ç0ç$Ç$Ç$Ç$Ç,Æ,Æ5J5J=¯A°,è,é(¥(¥ † † … e Æ Æ(¥(¥ † †$Ç$Ç(¥(¥$Ç$Ç,Æ,Æ$Ç$Ç,¥,¥$Ç$Ç(ç(ç$Ç$Ç † † … e1111,¥,¥dddd„d„d„ddddcdddd„„dddd„ddd„d…edd„„…edd „ „¥¥ e …cddd¥¥(¥(¥,é,é1L1L11$Ç$Ç$Ç$Ç$Ç$Ç,¥,¥$Ç$Ç$Ç$Ç,¥,¥$Ç$Ç0ç0ç$Ç$Ç,é,é=Œ=Œ1L1L$¥$¥f†d„d„d„f†„„†f † †,Æ,Æ § §0Æ0Æ,é,é,é,é0ç0ç,é,é(ç(ç(ç(ç1L1L5k5k d „ d „dddd„d„ddc„ddddddd „ „dd„ddd„ddd„„„ddd „ „dd¥¥ e …c„dddd$¥$¥ § §5k5k95,é,é$Ç$Ç,¥,¥$Ç$Ç § §$Ç$Ç0ç0ç$Ç$Ç,Æ,Æ$Ç$Ç0ç0ç5)5)A¯=° ¦ §¥¥f†„„„d…e…e…e † † § §,é,é § § § §,ç,ç(ç(ç$Ç$Ç † † … e1111,¥,¥dddd„d„d„ddddcdddd„„dddd„ddd„d…edd„„…edd „ „¥¥ e …cddd¥¥(¥(¥,é,é1L1L11$Ç$Ç$Ç$Ç$Ç$Ç,¥,¥$Ç$Ç$Ç$Ç,¥,¥$Ç$Ç0ç0ç$Ç$Ç,é,é=Œ=Œ1L1L$¥$¥f†d„d„d„f†„„†f † †,Æ,Æ § §0Æ0Æ,é,é,é,é0ç0ç,é,é(ç(ç(ç(ç1L1L5k5k d „ d „dddd„d„ddc„ddddddd „ „dd„ddd„ddd„„„ddd „ „dd¥¥ e …c„dddd$¥$¥ § §5k5k95,é,é$Ç$Ç,¥,¥$Ç$Ç § §$Ç$Ç0ç0ç$Ç$Ç,Æ,Æ$Ç$Ç0ç0ç5)5)A¯=° ¦ §¥¥f†„„„d…e…e…e † † § §,é,é § § § §,ç,ç,ç,ç § § e …$„$„--55,¥,¥ d „ d „dc„ddddddd„c … ecd „ „dcdddd „ „„cdddd$„$ddd„c$¥$¥dd„c„c „ d „ d,é,é5k5k11550ç0ç$Ç$Ç$Ç$Ç$Ç$Ç0ç0ç,é,é$Ç$Ç,é,é$Ç$Ç0Æ0Æ=Œ=Œ1L1Ld„e…ÆÆ dde…e…e…d„d„dd § § ç ç,Æ,Æ$Ç$Ç,Æ,Æ § §(¥(¥$¥$¥1L1L1L1L d „dcdc„ddc„d„ddddc „ „dddc „ „dddd„cdddd ¥ ¥ d „dddcdd$¥$¥ d „dc„c$„$„(¥(¥1L1L-*1*4ç4ç,é,é$Ç$Ç,Æ,Æ$Ç$Ç0ç0ç$Ç$Ç,é,é0ç0ç$Ç$Ç,é,é11=¯A°…e…e†f…e…e…e†f„d„ddc(ç(çcddd(ç(ç,ç,ç § § e …$„$„--55,¥,¥ d „ d „dc„ddddddd„c … ecd „ „dcdddd „ „„cdddd$„$ddd„c$¥$¥dd„c„c „ d „ d,é,é5k5k11550ç0ç$Ç$Ç$Ç$Ç$Ç$Ç0ç0ç,é,é$Ç$Ç,é,é$Ç$Ç0Æ0Æ=Œ=Œ1L1Ld„e…ÆÆ dde…e…e…d„d„dd § § ç ç,Æ,Æ$Ç$Ç,Æ,Æ § §(¥(¥$¥$¥1L1L1L1L d „dcdc„ddc„d„ddddc „ „dddc „ „dddd„cdddd ¥ ¥ d „dddcdd$¥$¥ d „dc„c$„$„(¥(¥1L1L-*1*4ç4ç,é,é$Ç$Ç,Æ,Æ$Ç$Ç0ç0ç$Ç$Ç,é,é0ç0ç$Ç$Ç,é,é11=¯A°…e…e†f…e…e…e†f„d„ddc(ç(çcddd(ç(ç(ç(ç$Ç$Ç$Æ$Æ † †-*1*1111 § §f†e…e…e…dd…e„ddc„ddc„ddd„„„dddÆÆ † †ÆÆd„ † † † ††f § § § §$Ç$Ç § §-*1*1L1L$Ç$Ç § §$Æ$Æ$Ç$Ç$Ç$Ç,¥,¥ § § § §(ç(ç § §(¥(¥(¥(¥=Ž=Ž55cd † † § § § § ¥ ¥ † †$¥$¥$¥$¥ † † ¥ ¥(ç(ç--11-*1*11-*1*-*1*%%5595$Ç$ÇÆÆ § §f†e…f†dd„ddd„ddc„d„d„ddd„ddd¥¥f†e…e…¥¥ † ††f Æ Æ † †$Ç$Ç § §%%5m5m,é,é ç ç$Æ$Æ$Ç$Ç$Ç$Ç,Æ,Æ § § § §$Ç$Ç § §,¥,¥ † †11AòAñ § §¥¥ § §(ç(çdd Æ Æ † †$¥$¥¥¥ † †(¥(¥ § § Æ Æ † †(ç(ç$Ç$Ç$Æ$Æ † †-*1*1111 § §f†e…e…e…dd…e„ddc„ddc„ddd„„„dddÆÆ † †ÆÆd„ † † † ††f § § § §$Ç$Ç § §-*1*1L1L$Ç$Ç § §$Æ$Æ$Ç$Ç$Ç$Ç,¥,¥ § § § §(ç(ç § §(¥(¥(¥(¥=Ž=Ž55cd † † § § § § ¥ ¥ † †$¥$¥$¥$¥ † † ¥ ¥(ç(ç--11-*1*11-*1*-*1*%%5595$Ç$ÇÆÆ § §f†e…f†dd„ddd„ddc„d„d„ddd„ddd¥¥f†e…e…¥¥ † ††f Æ Æ † †$Ç$Ç § §%%5m5m,é,é ç ç$Æ$Æ$Ç$Ç$Ç$Ç,Æ,Æ § § § §$Ç$Ç § §,¥,¥ † †11AòAñ § §¥¥ § §(ç(çdd Æ Æ † †$¥$¥¥¥ † †(¥(¥ § § Æ Æ † †=Œ=Œ5m5m9k5k5m5m9k5k=Ž=Ž1L1L1L1L1L1L1L1L)J)J11)K)K-*1*1L1L1Œ1Œ1L1L)K)K-*1*)K)K5J5J-*1*-*1*1L1L) -) -1L1L1Œ1Œ5595=ï=ï=Œ=Œ1Œ1Œ559k5k1Œ1Œ551Œ1Œ-*1*) -) -) -) -) -) -)K)K-*1*-*1*-*1*1L1L)K)K1L1L=ï=ïAðAð551Œ1Œ55=Œ=Œ5k5k=Ž=Ž=¯A°=ÏA°=¯=¯=Œ=ŒIðEðIðEðJFIðEðAðAðAðAð=ï=ï=¯A°5k5k=Ž=Ž=Ž=Ž-*1*1L1L)J)J1L1L-)-)-)-)1L1L)K)K1Œ1Œ-l-l-*1*-*1*-*1*-*1*-*1*)K)K1L1L-*1*1Œ1Œ1L1L1Œ1Œ=Ž=Ž=ï=ï=Ž=Ž559Ž5559n5m5k5k95-l-l-*1*))) -) -) -) -)K)K-*1*-*1*-*1*-l-l-*1*55AïAï55951Œ1Œ=Œ=Œ5k5k=Ž=Ž=Œ=Œ=¯A°=ÏA°=¯=¯=Ž=ŽIïEïAðAð=Ž=Ž=Œ=Œ5m5m9k5k5m5m9k5k=Ž=Ž1L1L1L1L1L1L1L1L)J)J11)K)K-*1*1L1L1Œ1Œ1L1L)K)K-*1*)K)K5J5J-*1*-*1*1L1L) -) -1L1L1Œ1Œ5595=ï=ï=Œ=Œ1Œ1Œ559k5k1Œ1Œ551Œ1Œ-*1*) -) -) -) -) -) -)K)K-*1*-*1*-*1*1L1L)K)K1L1L=ï=ïAðAð551Œ1Œ55=Œ=Œ5k5k=Ž=Ž=¯A°=ÏA°=¯=¯=Œ=ŒIðEðIðEðJFIðEðAðAðAðAð=ï=ï=¯A°5k5k=Ž=Ž=Ž=Ž-*1*1L1L)J)J1L1L-)-)-)-)1L1L)K)K1Œ1Œ-l-l-*1*-*1*-*1*-*1*-*1*)K)K1L1L-*1*1Œ1Œ1L1L1Œ1Œ=Ž=Ž=ï=ï=Ž=Ž559Ž5559n5m5k5k95-l-l-*1*))) -) -) -) -)K)K-*1*-*1*-*1*-l-l-*1*55AïAï55951Œ1Œ=Œ=Œ5k5k=Ž=Ž=Œ=Œ=¯A°=ÏA°=¯=¯=Ž=ŽIïEïAðAð=Ž=Ž$¥$¥ e …(¥(¥$¥$¥(¥(¥(¥(¥(¥(¥ d „dd$¥$¥$¥$¥ e …$¥$¥(¥(¥11-*1* § §,Å,Å,¥,¥(¥(¥,¥,¥,Æ,Æ(¥(¥(¥(¥ ¥ ¥(Å(Å$¥$¥$¥$¥(ç(ç1L1L--,¥,¥ § §,Æ,Æ § §(¥(¥$¥$¥$¥$¥ † † Æ Æ$¥$¥ § §,Æ,Æ § §(ç(ç,ç,ç,é,é(ç(ç(ç(ç$Ç$Ç,ç,ç11$Ç$Ç,é,é,ç,ç--,ç,ç111L1L11(ç(ç--1)1),ç,ç,Æ,Æ,¥,¥(¥(¥$d$„,¥,¥(¥(¥(¥(¥dd … e$¥$¥ ¥ ¥ e …$¥$¥$„$„$Ç$Ç5k5k$Ç$Ç,Æ,Æ,Æ,Æ(¥(¥(¥(¥,Æ,Æ(¥(¥(¥(¥$¥$¥$¥$¥(Å(Å(¥(¥ § §-*1*1)1)(ç(ç § §,Æ,Æ § §(¥(¥$¥$¥ † †(¥(¥ † † § § § §$Æ$Æ,Æ,Æ § §--,ç,ç,é,é(ç(ç(ç(ç,é,é,ç,ç%%,é,é(ç(ç,é,é0ç0ç--1L1L11,Æ,Æ § § „ „¥¥$¥$¥ e …(¥(¥$¥$¥(¥(¥(¥(¥(¥(¥ d „dd$¥$¥$¥$¥ e …$¥$¥(¥(¥11-*1* § §,Å,Å,¥,¥(¥(¥,¥,¥,Æ,Æ(¥(¥(¥(¥ ¥ ¥(Å(Å$¥$¥$¥$¥(ç(ç1L1L--,¥,¥ § §,Æ,Æ § §(¥(¥$¥$¥$¥$¥ † † Æ Æ$¥$¥ § §,Æ,Æ § §(ç(ç,ç,ç,é,é(ç(ç(ç(ç$Ç$Ç,ç,ç11$Ç$Ç,é,é,ç,ç--,ç,ç111L1L11(ç(ç--1)1),ç,ç,Æ,Æ,¥,¥(¥(¥$d$„,¥,¥(¥(¥(¥(¥dd … e$¥$¥ ¥ ¥ e …$¥$¥$„$„$Ç$Ç5k5k$Ç$Ç,Æ,Æ,Æ,Æ(¥(¥(¥(¥,Æ,Æ(¥(¥(¥(¥$¥$¥$¥$¥(Å(Å(¥(¥ § §-*1*1)1)(ç(ç § §,Æ,Æ § §(¥(¥$¥$¥ † †(¥(¥ † † § § § §$Æ$Æ,Æ,Æ § §--,ç,ç,é,é(ç(ç(ç(ç,é,é,ç,ç%%,é,é(ç(ç,é,é0ç0ç--1L1L11,Æ,Æ § § „ „¥¥dd¥¥ e … e … † † … edd „ „…edd¥¥ e …(¥(¥(¥(¥1111,¥,¥,Æ,Æ,¥,¥,Æ,Æ,Æ,Æ,¥,¥0ç0ç,Æ,Æ$Æ$Æ § §(ç(ç$¥$¥$Ç$Ç1Œ1Œ,é,é § § § § † †$¥$¥ † † … e$¥$¥ e … e …¥¥ † † † †$¥$¥(¥(¥ † †(¥(¥ † † § §$„$„ † †…edd Æ Æ † † § §,¥,¥,é,é--(¥(¥(¥(¥ † †(¥(¥ e …(¥(¥ † †$„$„ † † … e … edd „ „dddd¥¥ d „ † †(¥(¥,¥,¥5m5m11,¥,¥,¥,¥,¥,¥,Æ,Æ,¥,¥0ç0ç,Æ,Æ,Æ,Æ$Æ$Æ$Æ$Æ$Æ$Æ § §1L1L-*1*,Æ,Æ † †$¥$¥ † † … e$¥$¥ e …¥¥ † †dd$¥$¥ † † † †(¥(¥ † †(¥(¥ † † § §(¥(¥ e …¥¥e… e … † †(¥(¥ § §0Æ0Æ11$Ç$Ç(¥(¥ † †dddddd¥¥ e … e … † † … edd „ „…edd¥¥ e …(¥(¥(¥(¥1111,¥,¥,Æ,Æ,¥,¥,Æ,Æ,Æ,Æ,¥,¥0ç0ç,Æ,Æ$Æ$Æ § §(ç(ç$¥$¥$Ç$Ç1Œ1Œ,é,é § § § § † †$¥$¥ † † … e$¥$¥ e … e …¥¥ † † † †$¥$¥(¥(¥ † †(¥(¥ † † § §$„$„ † †…edd Æ Æ † † § §,¥,¥,é,é--(¥(¥(¥(¥ † †(¥(¥ e …(¥(¥ † †$„$„ † † … e … edd „ „dddd¥¥ d „ † †(¥(¥,¥,¥5m5m11,¥,¥,¥,¥,¥,¥,Æ,Æ,¥,¥0ç0ç,Æ,Æ,Æ,Æ$Æ$Æ$Æ$Æ$Æ$Æ § §1L1L-*1*,Æ,Æ † †$¥$¥ † † … e$¥$¥ e …¥¥ † †dd$¥$¥ † † † †(¥(¥ † †(¥(¥ † † § §(¥(¥ e …¥¥e… e … † †(¥(¥ § §0Æ0Æ11$Ç$Ç(¥(¥ † †dddddddd¥¥ e …dd „ „…e„„¥¥ e … e … „ „¥¥ § §551L1L e …,¥,¥0ç0ç,¥,¥0ç0ç,Æ,Æ,Æ,Æ0ç0ç$Ç$Ç(ç(ç § §$Ç$Ç ç ç1L1L--,¥,¥ † †$¥$¥ e …¥¥ e … † †dd¥¥ † † † † … e$¥$¥ † †(¥(¥ † † § §(¥(¥ † † † †¥¥e… § §$¥$¥ † †(¥(¥0Æ0Æ,é,é § §,¥,¥$Ç$Ç(¥(¥ e … † †(¥(¥e… e … „ „¥¥dd¥¥e…¥¥dd$¥$¥ e … † †,é,é5m5m § §(¥(¥0Æ0Æ0ç0ç$Ç$Ç,¥,¥0Æ0Æ0ç0ç$Ç$Ç(ç(ç$Ç$Ç § § Æ Æ) -) -9)5) § §$Æ$Æ † †$¥$¥ e …¥¥ † † … e „ „¥¥ † † … e(¥(¥ † †(¥(¥¥¥ § §(¥(¥ e … Æ Æ e …e… § §$¥$¥ † †(¥(¥,¥,¥,é,é$Æ$Æ,Æ,Æ,¥,¥ † † … edddd¥¥ e …dd „ „…e„„¥¥ e … e … „ „¥¥ § §551L1L e …,¥,¥0ç0ç,¥,¥0ç0ç,Æ,Æ,Æ,Æ0ç0ç$Ç$Ç(ç(ç § §$Ç$Ç ç ç1L1L--,¥,¥ † †$¥$¥ e …¥¥ e … † †dd¥¥ † † † † … e$¥$¥ † †(¥(¥ † † § §(¥(¥ † † † †¥¥e… § §$¥$¥ † †(¥(¥0Æ0Æ,é,é § §,¥,¥$Ç$Ç(¥(¥ e … † †(¥(¥e… e … „ „¥¥dd¥¥e…¥¥dd$¥$¥ e … † †,é,é5m5m § §(¥(¥0Æ0Æ0ç0ç$Ç$Ç,¥,¥0Æ0Æ0ç0ç$Ç$Ç(ç(ç$Ç$Ç § § Æ Æ) -) -9)5) § §$Æ$Æ † †$¥$¥ e …¥¥ † † … e „ „¥¥ † † … e(¥(¥ † †(¥(¥¥¥ § §(¥(¥ e … Æ Æ e …e… § §$¥$¥ † †(¥(¥,¥,¥,é,é$Æ$Æ,Æ,Æ,¥,¥ † † … edd¥¥dd…e „ „…edd¥¥ e …e…„„ † † … e$¥$¥,é,é-l-ldd,¥,¥0ç0ç,Æ,Æ0Æ0Æ0ç0ç0ç0ç0ç0ç$Ç$Ç,Æ,Æ$Ç$Ç Æ Æ%%1L1L(ç(ç § §(¥(¥ † † … e$¥$¥e…$¥$¥ e …¥¥ e …¥¥ † †$Æ$Æ † †$¥$¥$¥$¥ † † † †$¥$¥e…dd¥¥ † † § §$„$„,¥,¥,é,é,é,é(¥(¥$Ç$Ç(¥(¥ † †(¥(¥e… † † … edddd¥¥dd…e … e¥¥ e …e…$¥$¥ e …$Æ$Æ55 § §(¥(¥,¥,¥0ç0ç,¥,¥4ç4ç,é,é0Æ0Æ0Æ0Æ$Ç$Ç(ç(ç § § Æ Æ) -) -11 § §$Æ$Æ † † … e¥¥ † †dd$¥$¥ e … e …¥¥ † † † †(¥(¥ † †$¥$¥ † † § § † † … e¥¥dd Æ Æ † †$¥$¥ † †,¥,¥-*1*$Ç$Ç,¥,¥ † † … edddd¥¥dd…e „ „…edd¥¥ e …e…„„ † † … e$¥$¥,é,é-l-ldd,¥,¥0ç0ç,Æ,Æ0Æ0Æ0ç0ç0ç0ç0ç0ç$Ç$Ç,Æ,Æ$Ç$Ç Æ Æ%%1L1L(ç(ç § §(¥(¥ † † … e$¥$¥e…$¥$¥ e …¥¥ e …¥¥ † †$Æ$Æ † †$¥$¥$¥$¥ † † † †$¥$¥e…dd¥¥ † † § §$„$„,¥,¥,é,é,é,é(¥(¥$Ç$Ç(¥(¥ † †(¥(¥e… † † … edddd¥¥dd…e … e¥¥ e …e…$¥$¥ e …$Æ$Æ55 § §(¥(¥,¥,¥0ç0ç,¥,¥4ç4ç,é,é0Æ0Æ0Æ0Æ$Ç$Ç(ç(ç § § Æ Æ) -) -11 § §$Æ$Æ † † … e¥¥ † †dd$¥$¥ e … e …¥¥ † † † †(¥(¥ † †$¥$¥ † † § § † † … e¥¥dd Æ Æ † †$¥$¥ † †,¥,¥-*1*$Ç$Ç,¥,¥ † † … edddd„d … edd¥¥dd„d…e…e „ „ … e¥¥dd¥¥11-l-l,ç,ç0Æ0Æ4ç4ç95======4ç4ç95 § §(ç(ç † †) -) -1*-*(ç(ç † † § § e …$¥$¥e… e …¥¥ e …¥¥ † †$¥$¥ e … † †(¥(¥ † † † † § §$¥$¥ e …¥¥dddd † †$¥$¥ † †,¥,¥,é,é11$Ç$Ç(¥(¥ † † † †(¥(¥ † †$„$„dd ¥ ¥dd … e„d „ „…e … e„„ … edd¥¥ § §1L1L11,Æ,Æ0ç0ç4ç4ç====4ç4ç==4ç4ç(ç(ç § §$Æ$Æ § §1L1L,é,é Æ Æ(¥(¥¥¥ † † † †dd¥¥e… e … † †¥¥$¥$¥ † †$¥$¥ † † † † § §(¥(¥ e …¥¥e…dd¥¥ † † † †,¥,¥,Æ,Æ-*1*0ç0ç † † † † „ ddddd„d … edd¥¥dd„d…e…e „ „ … e¥¥dd¥¥11-l-l,ç,ç0Æ0Æ4ç4ç95======4ç4ç95 § §(ç(ç † †) -) -1*-*(ç(ç † † § § e …$¥$¥e… e …¥¥ e …¥¥ † †$¥$¥ e … † †(¥(¥ † † † † § §$¥$¥ e …¥¥dddd † †$¥$¥ † †,¥,¥,é,é11$Ç$Ç(¥(¥ † † † †(¥(¥ † †$„$„dd ¥ ¥dd … e„d „ „…e … e„„ … edd¥¥ § §1L1L11,Æ,Æ0ç0ç4ç4ç====4ç4ç==4ç4ç(ç(ç § §$Æ$Æ § §1L1L,é,é Æ Æ(¥(¥¥¥ † † † †dd¥¥e… e … † †¥¥$¥$¥ † †$¥$¥ † † † † § §(¥(¥ e …¥¥e…dd¥¥ † † † †,¥,¥,Æ,Æ-*1*0ç0ç † † † † „ ddddddd„„dddd „ „dddddd¥¥dd¥¥ † †(¥(¥,é,é-l-l$Ç$Ç(ç(ç § §0ç0ç,é,é55,é,é0Æ0Æ$Ç$Ç † †dd ç ç$Ç$Ç) -) -(¥(¥$¥$¥ † † ¥ ¥ e …dd¥¥ e …dd¥¥ † †dd$¥$¥$¥$¥ † †(¥(¥ † †$¥$¥ e … e …¥¥ e …ÆÆ e …$¥$¥ † †,¥,¥,é,é-*1*,¥,¥ † †,¥,¥ § §$d$„(¥(¥ e … e …$d$„dc$¥$¥d„dddd¥¥dd¥¥$¥$¥ † †,Æ,Æ1L1L))$Ç$Ç$Æ$Æ$Ç$Ç,é,é1155,é,é,ç,ç § §dd Æ Æ † †)K)K(ç(ç † †(¥(¥ e …¥¥ e …dd … e¥¥dd¥¥ † † † † … e(¥(¥$¥$¥$¥$¥ † † † †dd¥¥ † † … e¥¥(¥(¥ † †(¥(¥,¥,¥-*1*,é,é(¥(¥(¥(¥dddddddd„„dddd „ „dddddd¥¥dd¥¥ † †(¥(¥,é,é-l-l$Ç$Ç(ç(ç § §0ç0ç,é,é55,é,é0Æ0Æ$Ç$Ç † †dd ç ç$Ç$Ç) -) -(¥(¥$¥$¥ † † ¥ ¥ e …dd¥¥ e …dd¥¥ † †dd$¥$¥$¥$¥ † †(¥(¥ † †$¥$¥ e … e …¥¥ e …ÆÆ e …$¥$¥ † †,¥,¥,é,é-*1*,¥,¥ † †,¥,¥ § §$d$„(¥(¥ e … e …$d$„dc$¥$¥d„dddd¥¥dd¥¥$¥$¥ † †,Æ,Æ1L1L))$Ç$Ç$Æ$Æ$Ç$Ç,é,é1155,é,é,ç,ç § §dd Æ Æ † †)K)K(ç(ç † †(¥(¥ e …¥¥ e …dd … e¥¥dd¥¥ † † † † … e(¥(¥$¥$¥$¥$¥ † † † †dd¥¥ † † … e¥¥(¥(¥ † †(¥(¥,¥,¥-*1*,é,é(¥(¥(¥(¥dddd § § Æ Æ § § Æ Æ¥¥¥¥¥¥ÆÆ § §ÆÆ † † † † § § § §-*1*)K)Kd„d„ dd CCdde…f† ddf†) -) -!!!!11-*1* § §f† Æ Æ † † § §e…e… e …f†dd¥¥ § § § § † † † † † † † † † † † †¥¥e…e… e … Æ Æ § §$Ç$Ç$Ç$Ç,é,é5m5m1*-*,é,é,é,é$Ç$Ç$Ç$Ç § § † †$¥$¥dd¥¥dd„d„d„d…e†f § § † † § §))11 ç çddd dd cdc ddf†d„e…$Ç$Ç!! ç ç) -) -11 § § † † § §f† § §f†¥¥e… e …ÆÆdd † † § § † † † † † † † † † † † †$¥$¥e…dd¥¥ † † § §$Ç$Ç$Ç$Ç,é,é5J5J1L1L,é,é,é,é,é,é$Ç$Ç § § Æ Æ § § Æ Æ¥¥¥¥¥¥ÆÆ § §ÆÆ † † † † § § § §-*1*)K)Kd„d„ dd CCdde…f† ddf†) -) -!!!!11-*1* § §f† Æ Æ † † § §e…e… e …f†dd¥¥ § § § § † † † † † † † † † † † †¥¥e…e… e … Æ Æ § §$Ç$Ç$Ç$Ç,é,é5m5m1*-*,é,é,é,é$Ç$Ç$Ç$Ç § § † †$¥$¥dd¥¥dd„d„d„d…e†f § § † † § §))11 ç çddd dd cdc ddf†d„e…$Ç$Ç!! ç ç) -) -11 § § † † § §f† § §f†¥¥e… e …ÆÆdd † † § § † † † † † † † † † † † †$¥$¥e…dd¥¥ † † § §$Ç$Ç$Ç$Ç,é,é5J5J1L1L,é,é,é,é,é,é$Ç$Ç559k5k559k5k1L1LAðAð551*-*1Œ1Œ11)K)K-*1*-*1*-l-l5k5k95-*1*-*1*-*1*%%-*1*1L1L1155=ï=ïAðAð=Ž=Ž=Ž=Ž=Ž=Ž=Œ=Œ5Œ5Œ955Œ5Œ951Œ1ŒAòAñ=Ž=Ž1Œ1Œ1Œ1Œ111L1LAðAð559Œ5Œ551Œ1Œ=Ž=Ž1Œ1Œ5m5m95AðAð=¯A°1Œ1Œ=¯A°=ÏA°=¯=¯=Ž=Ž=Ž=Ž=¯A°=Œ=Œ=Ž=Ž=Ž=Ž=Ž=Ž555k9k555k9k5m5m1L1L-*1*) -) -) -) -%%) -) --)-)1L1L)K)K)J)J5m5m9k5k-*1*)K)K-*1*) -) -1*-*1L1L1Œ1Œ55=Ž=ŽAðAð=¯A°5559Ž=Œ=Œ555Œ9Œ555Œ9Œ55=Ž=ŽAðAð551L1L55-l-l=¯A°=ÏA°1Ž1559Ž5559Ž51L1L55AðAðAòAñ1L1L=¯A°=ÏA°9Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=¯A°=Ž=Ž=Ž=Ž55=Ž=Ž595k5k595k5k1L1LAðAð551*-*1Œ1Œ11)K)K-*1*-*1*-l-l5k5k95-*1*-*1*-*1*%%-*1*1L1L1155=ï=ïAðAð=Ž=Ž=Ž=Ž=Ž=Ž=Œ=Œ5Œ5Œ955Œ5Œ951Œ1ŒAòAñ=Ž=Ž1Œ1Œ1Œ1Œ111L1LAðAð559Œ5Œ551Œ1Œ=Ž=Ž1Œ1Œ5m5m95AðAð=¯A°1Œ1Œ=¯A°=ÏA°=¯=¯=Ž=Ž=Ž=Ž=¯A°=Œ=Œ=Ž=Ž=Ž=Ž=Ž=Ž555k9k555k9k5m5m1L1L-*1*) -) -) -) -%%) -) --)-)1L1L)K)K)J)J5m5m9k5k-*1*)K)K-*1*) -) -1*-*1L1L1Œ1Œ55=Ž=ŽAðAð=¯A°5559Ž=Œ=Œ555Œ9Œ555Œ9Œ55=Ž=ŽAðAð551L1L55-l-l=¯A°=ÏA°1Ž1559Ž5559Ž51L1L55AðAðAòAñ1L1L=¯A°=ÏA°9Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=¯A°=Ž=Ž=Ž=Ž55=Ž=Ž,Æ,Æ,Æ,Æ,Æ,Æ § §,Æ,ÆAðAð5J5Jdd(¥(¥ † † … e ¥ ¥ ¥ ¥(¥(¥ † †(¥(¥ § §(ç(ç § §$Æ$Æ § §(ç(ç$Æ$Æ,Æ,Æ(ç(ç$Æ$Æ(¥(¥$¥$¥$¥$¥$¥$¥ † †(¥(¥(ç(ç,Å,Å,Æ,Æ5J5JIðEð) -) -(ç(ç(¥(¥$Æ$Æ$Æ$Æ § §$Æ$Æ § §(¥(¥$Æ$Æ,¥,¥,Æ,Æ,é,éAðAð5J5J11--(ç(ç,ç,ç,é,é,Æ,Æ,Æ,Æ$Ç$Ç$Æ$Æ § §(ç(ç,Æ,Æ,é,é,Æ,Æ,ç,ç=Œ=Œ1L1L$¥$¥ e …$„$„ ¥ ¥$„$„ † †ƒd(¥(¥(¥(¥ † † § §$Æ$Æ$Ç$Ç,Æ,Æ § § § §(ç(ç$Æ$Æ,Æ,Æ$Ç$Ç(ç(ç$¥$¥(¥(¥ † †$¥$¥$Æ$Æ(¥(¥(¥(¥,Æ,Æ,Æ,Æ--AïAï55,Æ,Æ$Æ$Æ$Æ$Æ$Æ$Æ † †$Æ$Æ$Æ$Æ(¥(¥ † †,Æ,Æ,Æ,Æ,Æ,Æ55=Ž=Ž11--(ç(ç,ç,ç,é,é,ç,ç0ç0ç$Æ$Æ § §,Æ,Æ$Æ$Æ,Æ,Æ,Æ,Æ,Æ,Æ,Æ,Æ § §,Æ,ÆAðAð5J5Jdd(¥(¥ † † … e ¥ ¥ ¥ ¥(¥(¥ † †(¥(¥ § §(ç(ç § §$Æ$Æ § §(ç(ç$Æ$Æ,Æ,Æ(ç(ç$Æ$Æ(¥(¥$¥$¥$¥$¥$¥$¥ † †(¥(¥(ç(ç,Å,Å,Æ,Æ5J5JIðEð) -) -(ç(ç(¥(¥$Æ$Æ$Æ$Æ § §$Æ$Æ § §(¥(¥$Æ$Æ,¥,¥,Æ,Æ,é,éAðAð5J5J11--(ç(ç,ç,ç,é,é,Æ,Æ,Æ,Æ$Ç$Ç$Æ$Æ § §(ç(ç,Æ,Æ,é,é,Æ,Æ,ç,ç=Œ=Œ1L1L$¥$¥ e …$„$„ ¥ ¥$„$„ † †ƒd(¥(¥(¥(¥ † † § §$Æ$Æ$Ç$Ç,Æ,Æ § § § §(ç(ç$Æ$Æ,Æ,Æ$Ç$Ç(ç(ç$¥$¥(¥(¥ † †$¥$¥$Æ$Æ(¥(¥(¥(¥,Æ,Æ,Æ,Æ--AïAï55,Æ,Æ$Æ$Æ$Æ$Æ$Æ$Æ † †$Æ$Æ$Æ$Æ(¥(¥ † †,Æ,Æ,Æ,Æ,Æ,Æ55=Ž=Ž11--(ç(ç,ç,ç,é,é,ç,ç0ç0ç$Æ$Æ § §,Æ,Æ$Æ$Æ,Æ,Æ(¥(¥(¥(¥,Æ,Æ § §,¥,¥55) -) -$¥$¥$„$„$„$„(¥(¥ e …(¥(¥(¥(¥ † †(¥(¥ † †(¥(¥$¥$¥ † †(¥(¥ § §(¥(¥ § §(¥(¥,¥,¥ † †$¥$¥ † †$¥$¥$¥$¥(¥(¥,¥,¥,Æ,Æ,¥,¥5k5k=ð=ð1)1)(¥(¥ † †(¥(¥(¥(¥ † †(¥(¥(¥(¥(¥(¥ † †,¥,¥ § §4ç4ç95$Æ$Æ,¥,¥ § §,¥,¥,¥,¥(¥(¥ § §(¥(¥ § §(¥(¥ † †$Æ$Æ § §$Æ$Æ,¥,¥,¥,¥-*1*1L1L$d$„$d$„$d$„dƒ e …(¥(¥$¥$¥ e …(¥(¥(¥(¥ † †$„$„(¥(¥ † †(¥(¥$¥$¥ § §(¥(¥ § §(¥(¥,Æ,Æ$¥$¥$¥$¥ † †$¥$¥$„$„$¥$¥(¥(¥,Æ,Æ,Æ,Æ11AðAð55$„$„ § §(¥(¥(¥(¥(¥(¥ † †(¥(¥ § §(¥(¥(¥(¥ § §,¥,¥=Œ=Œ-*1*(¥(¥(¥(¥,¥,¥$Ç$Ç(¥(¥(¥(¥ † †(¥(¥ § §(¥(¥(¥(¥ § §(¥(¥(¥(¥,Æ,Æ § §,¥,¥55) -) -$¥$¥$„$„$„$„(¥(¥ e …(¥(¥(¥(¥ † †(¥(¥ † †(¥(¥$¥$¥ † †(¥(¥ § §(¥(¥ § §(¥(¥,¥,¥ † †$¥$¥ † †$¥$¥$¥$¥(¥(¥,¥,¥,Æ,Æ,¥,¥5k5k=ð=ð1)1)(¥(¥ † †(¥(¥(¥(¥ † †(¥(¥(¥(¥(¥(¥ † †,¥,¥ § §4ç4ç95$Æ$Æ,¥,¥ § §,¥,¥,¥,¥(¥(¥ § §(¥(¥ § §(¥(¥ † †$Æ$Æ § §$Æ$Æ,¥,¥,¥,¥-*1*1L1L$d$„$d$„$d$„dƒ e …(¥(¥$¥$¥ e …(¥(¥(¥(¥ † †$„$„(¥(¥ † †(¥(¥$¥$¥ § §(¥(¥ § §(¥(¥,Æ,Æ$¥$¥$¥$¥ † †$¥$¥$„$„$¥$¥(¥(¥,Æ,Æ,Æ,Æ11AðAð55$„$„ § §(¥(¥(¥(¥(¥(¥ † †(¥(¥ § §(¥(¥(¥(¥ § §,¥,¥=Œ=Œ-*1*(¥(¥(¥(¥,¥,¥$Ç$Ç(¥(¥(¥(¥ † †(¥(¥ § §(¥(¥(¥(¥ § §(¥(¥,Æ,Æ † †(¥(¥,¥,¥-*1*)) e …(¥(¥ e …$„$„(¥(¥(¥(¥ † †$„$„(¥(¥ e …$¥$¥$„$„$¥$¥ † †$¥$¥(¥(¥(¥(¥,Æ,Æ(¥(¥(¥(¥ † †$¥$¥(¥(¥(¥(¥,¥,¥,Æ,Æ(ç(ç,¥,¥5J5JAòAñ$Ç$Ç(¥(¥ § §(¥(¥ † †(¥(¥ † †(¥(¥ † †(¥(¥ § §,¥,¥,ç,çAðAð$Ç$Ç,¥,¥,¥,¥,¥,¥ § §,¥,¥,¥,¥ § §,¥,¥$Æ$Æ § §(¥(¥ † †$Æ$Æ$Ç$Ç,¥,¥5k5k1*-*$„$„ … e$„$ddc „ „$¥$¥$„$„(¥(¥ e …$¥$¥$¥$¥$„$„(¥(¥$¥$¥ † †$¥$¥$„$„ § §(¥(¥(¥(¥(¥(¥(¥(¥ † †$¥$¥(¥(¥(¥(¥(¥(¥,Æ,Æ,Æ,Æ(¥(¥0ç0çAðAð-*1* § §(¥(¥(¥(¥ † † † †(¥(¥(¥(¥ † †(¥(¥$¥$¥,¥,¥,¥,¥5m5m1L1L,¥,¥,¥,¥,¥,¥ § §(¥(¥,¥,¥,¥,¥$Æ$Æ,¥,¥ † †$Æ$Æ(¥(¥(¥(¥,Æ,Æ † †(¥(¥,¥,¥-*1*)) e …(¥(¥ e …$„$„(¥(¥(¥(¥ † †$„$„(¥(¥ e …$¥$¥$„$„$¥$¥ † †$¥$¥(¥(¥(¥(¥,Æ,Æ(¥(¥(¥(¥ † †$¥$¥(¥(¥(¥(¥,¥,¥,Æ,Æ(ç(ç,¥,¥5J5JAòAñ$Ç$Ç(¥(¥ § §(¥(¥ † †(¥(¥ † †(¥(¥ † †(¥(¥ § §,¥,¥,ç,çAðAð$Ç$Ç,¥,¥,¥,¥,¥,¥ § §,¥,¥,¥,¥ § §,¥,¥$Æ$Æ § §(¥(¥ † †$Æ$Æ$Ç$Ç,¥,¥5k5k1*-*$„$„ … e$„$ddc „ „$¥$¥$„$„(¥(¥ e …$¥$¥$¥$¥$„$„(¥(¥$¥$¥ † †$¥$¥$„$„ § §(¥(¥(¥(¥(¥(¥(¥(¥ † †$¥$¥(¥(¥(¥(¥(¥(¥,Æ,Æ,Æ,Æ(¥(¥0ç0çAðAð-*1* § §(¥(¥(¥(¥ † † † †(¥(¥(¥(¥ † †(¥(¥$¥$¥,¥,¥,¥,¥5m5m1L1L,¥,¥,¥,¥,¥,¥ § §(¥(¥,¥,¥,¥,¥$Æ$Æ,¥,¥ † †$Æ$Æ(¥(¥(¥(¥ † †(¥(¥ † †,¥,¥) -) -,é,é e …$„$„$„$„(¥(¥$„$„(¥(¥$„$„ † †$„$d(¥(¥$„$„ † †$„$„(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥,Æ,Æ(¥(¥(¥(¥(¥(¥,¥,¥,Æ,Æ,Æ,Æ,Æ,Æ,Å,Å,Å,Å5k5kAðAð$Ç$Ç † †$„$„ † †$„$„ † †(¥(¥ † † ¥ ¥ † †$¥$¥(¥(¥0Æ0Æ=¯A°11,¥,¥,¥,¥,Æ,Æ(¥(¥,¥,¥ § §,¥,¥,¥,¥(¥(¥ § §$¥$¥ † † § §(ç(ç551*-*1L1L$„$„ „ d … eƒd$„$„$„$„(¥(¥ † †(¥(¥$d$„(¥(¥(¥(¥ e …$„$„ † †$„$„(¥(¥(¥(¥(¥(¥,¥,¥,Æ,Æ(¥(¥(¥(¥(¥(¥,¥,¥,Æ,Æ,Æ,Æ,Æ,Æ,Æ,Æ,Å,Å1)1)AðAð-*1* ¥ ¥(¥(¥e…(¥(¥ † †(¥(¥ e …$¥$¥ † † † †(¥(¥,¥,¥=Œ=Œ1L1L,¥,¥,Æ,Æ,¥,¥(¥(¥,¥,¥ § §(¥(¥,¥,¥ § §(¥(¥ † †(¥(¥(¥(¥ † †(¥(¥ † †,¥,¥) -) -,é,é e …$„$„$„$„(¥(¥$„$„(¥(¥$„$„ † †$„$d(¥(¥$„$„ † †$„$„(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥,Æ,Æ(¥(¥(¥(¥(¥(¥,¥,¥,Æ,Æ,Æ,Æ,Æ,Æ,Å,Å,Å,Å5k5kAðAð$Ç$Ç † †$„$„ † †$„$„ † †(¥(¥ † † ¥ ¥ † †$¥$¥(¥(¥0Æ0Æ=¯A°11,¥,¥,¥,¥,Æ,Æ(¥(¥,¥,¥ § §,¥,¥,¥,¥(¥(¥ § §$¥$¥ † † § §(ç(ç551*-*1L1L$„$„ „ d … eƒd$„$„$„$„(¥(¥ † †(¥(¥$d$„(¥(¥(¥(¥ e …$„$„ † †$„$„(¥(¥(¥(¥(¥(¥,¥,¥,Æ,Æ(¥(¥(¥(¥(¥(¥,¥,¥,Æ,Æ,Æ,Æ,Æ,Æ,Æ,Æ,Å,Å1)1)AðAð-*1* ¥ ¥(¥(¥e…(¥(¥ † †(¥(¥ e …$¥$¥ † † † †(¥(¥,¥,¥=Œ=Œ1L1L,¥,¥,Æ,Æ,¥,¥(¥(¥,¥,¥ § §(¥(¥,¥,¥ § §(¥(¥ † †(¥(¥$¥$¥(¥(¥ † †(¥(¥$Ç$Ç551*-*$d$„$¥$¥$c$„$d$„(¥(¥(¥(¥(¥(¥(¥(¥$d$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥,Æ,Æ,Æ,Æ(¥(¥,Æ,Æ(¥(¥,Æ,Æ,¥,¥0ç0ç,Å,Å0ç0ç,Æ,Æ1L1L=ï=ï,é,é$¥$¥$¥$¥ † †(¥(¥ † † … e(¥(¥$¥$¥ † †(¥(¥(¥(¥0ç0ç5m5m--0Æ0Æ,¥,¥,¥,¥,¥,¥,¥,¥(¥(¥,¥,¥,Æ,Æ(¥(¥ † †(¥(¥ § §$¥$¥,Æ,Æ$Ç$Ç5n5m1L1L$„$„ „ d … eƒd … e$¥$¥$„$„(¥(¥(¥(¥(¥(¥$d$„(¥(¥$¥$¥$d$„(¥(¥(¥(¥(¥(¥$d$„,¥,¥0Æ0Æ,Å,Å,Æ,Æ(¥(¥,¥,¥,Æ,Æ(¥(¥,Æ,Æ0ç0ç,Å,Å0Æ0Æ11551Œ1Œ$„$„ † † § §$„$„ † † † † ¥ ¥(¥(¥ † †$¥$¥(¥(¥,¥,¥1L1L1L1L,Å,Å,¥,¥,¥,¥,¥,¥,¥,¥(¥(¥,¥,¥,Æ,Æ,¥,¥ § §(¥(¥ † †$¥$¥(¥(¥ † †(¥(¥$Ç$Ç551*-*$d$„$¥$¥$c$„$d$„(¥(¥(¥(¥(¥(¥(¥(¥$d$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥,Æ,Æ,Æ,Æ(¥(¥,Æ,Æ(¥(¥,Æ,Æ,¥,¥0ç0ç,Å,Å0ç0ç,Æ,Æ1L1L=ï=ï,é,é$¥$¥$¥$¥ † †(¥(¥ † † … e(¥(¥$¥$¥ † †(¥(¥(¥(¥0ç0ç5m5m--0Æ0Æ,¥,¥,¥,¥,¥,¥,¥,¥(¥(¥,¥,¥,Æ,Æ(¥(¥ † †(¥(¥ § §$¥$¥,Æ,Æ$Ç$Ç5n5m1L1L$„$„ „ d … eƒd … e$¥$¥$„$„(¥(¥(¥(¥(¥(¥$d$„(¥(¥$¥$¥$d$„(¥(¥(¥(¥(¥(¥$d$„,¥,¥0Æ0Æ,Å,Å,Æ,Æ(¥(¥,¥,¥,Æ,Æ(¥(¥,Æ,Æ0ç0ç,Å,Å0Æ0Æ11551Œ1Œ$„$„ † † § §$„$„ † † † † ¥ ¥(¥(¥ † †$¥$¥(¥(¥,¥,¥1L1L1L1L,Å,Å,¥,¥,¥,¥,¥,¥,¥,¥(¥(¥,¥,¥,Æ,Æ,¥,¥ § §(¥(¥ † † e …(¥(¥(¥(¥,¥,¥$Ç$Ç11%%$„$„ „ d$„$„ † †(¥(¥$„$„(¥(¥$„$„(¥(¥$„$„ … e$¥$¥$„$„(¥(¥,¥,¥,¥,¥,¥,¥0ç0ç(¥(¥(¥(¥,¥,¥,Æ,Æ,Æ,Æ,Å,Å,Å,Å(ç(ç,¥,¥(Å(Å11AðAð)) † †(¥(¥ † † † †(¥(¥ e …$¥$¥$¥$¥ † † § §$„$„ † †110ç0ç,¥,¥,Æ,Æ,¥,¥,Æ,Æ,¥,¥,¥,¥,Æ,Æ,¥,¥(¥(¥(¥(¥(¥(¥$¥$¥$¥$¥$¥$¥ e …1L1L1L1L c „$d$„dc d „dcdƒ$„$„(¥(¥(¥(¥$„$„(¥(¥$„$„$„$„(¥(¥$„$„(¥(¥(¥(¥,Æ,Æ,Å,Å,Å,Å,Æ,Æ$¥$¥,¥,¥,Æ,Æ,Æ,Æ,Å,Å,Å,Å,Æ,Æ,Å,Å(¥(¥,Æ,Æ5595$d$„,¥,¥ † †$¥$¥ † †$„$„ † †$¥$¥ † †(¥(¥ † † † †1)1)1L1L,¥,¥,Å,Å,¥,¥,Æ,Æ,Æ,Æ,¥,¥,Æ,Æ,Å,Å,¥,¥(¥(¥ † †$„$d … e(¥(¥(¥(¥,¥,¥$Ç$Ç11%%$„$„ „ d$„$„ † †(¥(¥$„$„(¥(¥$„$„(¥(¥$„$„ … e$¥$¥$„$„(¥(¥,¥,¥,¥,¥,¥,¥0ç0ç(¥(¥(¥(¥,¥,¥,Æ,Æ,Æ,Æ,Å,Å,Å,Å(ç(ç,¥,¥(Å(Å11AðAð)) † †(¥(¥ † † † †(¥(¥ e …$¥$¥$¥$¥ † † § §$„$„ † †110ç0ç,¥,¥,Æ,Æ,¥,¥,Æ,Æ,¥,¥,¥,¥,Æ,Æ,¥,¥(¥(¥(¥(¥(¥(¥$¥$¥$¥$¥$¥$¥ e …1L1L1L1L c „$d$„dc d „dcdƒ$„$„(¥(¥(¥(¥$„$„(¥(¥$„$„$„$„(¥(¥$„$„(¥(¥(¥(¥,Æ,Æ,Å,Å,Å,Å,Æ,Æ$¥$¥,¥,¥,Æ,Æ,Æ,Æ,Å,Å,Å,Å,Æ,Æ,Å,Å(¥(¥,Æ,Æ5595$d$„,¥,¥ † †$¥$¥ † †$„$„ † †$¥$¥ † †(¥(¥ † † † †1)1)1L1L,¥,¥,Å,Å,¥,¥,Æ,Æ,Æ,Æ,¥,¥,Æ,Æ,Å,Å,¥,¥(¥(¥ † †$„$d † † § §$Ç$Ç § §-*1*1L1L1L1L § §f† † † † † † † § § § §%%$Ç$Ç § §)) § §$Ç$Ç$Ç$Ç$Ç$Ç,é,é ç ç$Ç$Ç § § § § ç ç$Ç$Ç § §,é,é))11-*1*5k5k9m5m1Œ1Œ-*1* † † § § § § † †$Ç$Ç!! § §!! § §$Ç$Ç)K)K5m5m=Ž=Ž) -) - § §$Ç$Ç § §$Ç$Ç$Ç$Ç%%$Ç$Ç,é,é,é,é%%) -) -$Ç$Ç%%$Ç$Ç) -) -AðAðAðAð11%% § § § §¥¥ † † § § † † § §$Ç$Ç § §$Ç$Ç!!$Ç$Ç$Ç$Ç$Ç$Ç%%$Ç$Ç,é,é § §$Ç$Ç § § ç ç § § § §,é,é)),é,é-*1*5J5J551Œ1Œ5m5m † † § § § § § § § §%% § §$Ç$Ç § §!!) -) -1L1L551L1L$Ç$Ç$Ç$Ç § §$Ç$Ç$Ç$Ç$Ç$Ç$Ç$Ç,é,é%%,é,é!!$Ç$Ç † † § §$Ç$Ç § §-*1*1L1L1L1L § §f† † † † † † † § § § §%%$Ç$Ç § §)) § §$Ç$Ç$Ç$Ç$Ç$Ç,é,é ç ç$Ç$Ç § § § § ç ç$Ç$Ç § §,é,é))11-*1*5k5k9m5m1Œ1Œ-*1* † † § § § § † †$Ç$Ç!! § §!! § §$Ç$Ç)K)K5m5m=Ž=Ž) -) - § §$Ç$Ç § §$Ç$Ç$Ç$Ç%%$Ç$Ç,é,é,é,é%%) -) -$Ç$Ç%%$Ç$Ç) -) -AðAðAðAð11%% § § § §¥¥ † † § § † † § §$Ç$Ç § §$Ç$Ç!!$Ç$Ç$Ç$Ç$Ç$Ç%%$Ç$Ç,é,é § §$Ç$Ç § § ç ç § § § §,é,é)),é,é-*1*5J5J551Œ1Œ5m5m † † § § § § § § § §%% § §$Ç$Ç § §!!) -) -1L1L551L1L$Ç$Ç$Ç$Ç § §$Ç$Ç$Ç$Ç$Ç$Ç$Ç$Ç,é,é%%,é,é!!$Ç$Ç55AðAðAðAðAðAðAðAð=¯A°=Ž=Ž=¯A°11AðAð55=ï=ï1155=Ž=Ž1L1L551L1L5Œ5Œ95111L1L55=Ž=Ž1155=Ž=ŽAðAð=¯A°55=ï=ïAðAðAïAïAðAðIðEðJFAðAð=Ž=Ž=Ž=ŽAðAðAðAðAðAð=¯A°AðAðAðAð=ð=ð=ð=ð=¯A°EðIðFJEðIðEðIð=¯A°9ï=ï55IðIðAòAñ=ð=ð=ð=ðIðEðAòAñJSF3JSF3NSN3NSN3NSN3JSF3NSN3JSF3AðAðAðAð5595=Ž=ŽAðAð55955Œ5Œ9555951L1L1Œ1Œ551L1L551L1L55955Œ5Œ95AòAñAðAð=Ž=Ž=ï=ï=¯A°AðAðAïAïIðEðJFIðEðAðAð55=ï=ïAðAðAðAðAðAð=ð=ðAòAñAðAð=ð=ð55AðAðJFIïEïIðEðAðAð55AðAðAðAð=ð=ðIðEð=ð=ðAðAðAòAñJSF3NSN3AòAñ59AðAðAðAðAðAðAðAð=¯A°=Ž=Ž=¯A°11AðAð55=ï=ï1155=Ž=Ž1L1L551L1L5Œ5Œ95111L1L55=Ž=Ž1155=Ž=ŽAðAð=¯A°55=ï=ïAðAðAïAïAðAðIðEðJFAðAð=Ž=Ž=Ž=ŽAðAðAðAðAðAð=¯A°AðAðAðAð=ð=ð=ð=ð=¯A°EðIðFJEðIðEðIð=¯A°9ï=ï55IðIðAòAñ=ð=ð=ð=ðIðEðAòAñJSF3JSF3NSN3NSN3NSN3JSF3NSN3JSF3AðAðAðAð5595=Ž=ŽAðAð55955Œ5Œ9555951L1L1Œ1Œ551L1L551L1L55955Œ5Œ95AòAñAðAð=Ž=Ž=ï=ï=¯A°AðAðAïAïIðEðJFIðEðAðAð55=ï=ïAðAðAðAðAðAð=ð=ðAòAñAðAð=ð=ð55AðAðJFIïEïIðEðAðAð55AðAðAðAð=ð=ðIðEð=ð=ðAðAðAòAñJSF3NSN3AòAñ Æ Æ(¥(¥ † † § § Æ Æ$¥$¥ § § Æ Æ$¥$¥ § §,ç,ç)J)J(¥(¥$¥$¥$¥$¥(¥(¥$„$„$¥$¥$¥$¥$¥$¥$„$„ ¥ ¥ ¥ ¥,Æ,Æ,Æ,Æ) -) -$ç$ç(ç(ç ç ç(ç(ç Æ Æ$¥$¥ § §(ç(ç § §,ç,ç,ç,ç)),ç,ç$ç$ç,ç,ç,ç,ç$ç$ç,é,é(ç(ç$Æ$Æ$Æ$Æ$Æ$Æ$Ç$Ç$Æ$Æ$Æ$Æ$Æ$Æ$Ç$Ç,Æ,Æ1L1L-)-) ç ç „ „¥¥ † † Æ Æ Æ Æ † † ç ç$¥$¥ § § ¥ ¥ Æ Æ Æ Æ(¥(¥¥¥$Æ$Æ § §(¥(¥ ç ç5J5J$Ç$Ç$¥$¥$¥$¥(¥(¥$¥$¥$d$„$¥$¥$¥$¥$¥$¥ e …$„$„$Æ$Æ0ç0ç)))) ç ç(ç(ç(ç(ç † † § § ç ç(¥(¥ ç ç(ç(ç(ç(ç,ç,ç))(ç(ç(ç(ç,ç,ç(ç(ç(ç(ç(ç(ç § §(ç(ç(¥(¥$Ç$Ç(ç(ç Æ Æ$Æ$Æ(ç(ç,Æ,Æ---*1*))¥¥¥¥$¥$¥ † † ç ç † † Æ Æ Æ Æ(¥(¥ † † § § Æ Æ$¥$¥ § § Æ Æ$¥$¥ § §,ç,ç)J)J(¥(¥$¥$¥$¥$¥(¥(¥$„$„$¥$¥$¥$¥$¥$¥$„$„ ¥ ¥ ¥ ¥,Æ,Æ,Æ,Æ) -) -$ç$ç(ç(ç ç ç(ç(ç Æ Æ$¥$¥ § §(ç(ç § §,ç,ç,ç,ç)),ç,ç$ç$ç,ç,ç,ç,ç$ç$ç,é,é(ç(ç$Æ$Æ$Æ$Æ$Æ$Æ$Ç$Ç$Æ$Æ$Æ$Æ$Æ$Æ$Ç$Ç,Æ,Æ1L1L-)-) ç ç „ „¥¥ † † Æ Æ Æ Æ † † ç ç$¥$¥ § § ¥ ¥ Æ Æ Æ Æ(¥(¥¥¥$Æ$Æ § §(¥(¥ ç ç5J5J$Ç$Ç$¥$¥$¥$¥(¥(¥$¥$¥$d$„$¥$¥$¥$¥$¥$¥ e …$„$„$Æ$Æ0ç0ç)))) ç ç(ç(ç(ç(ç † † § § ç ç(¥(¥ ç ç(ç(ç(ç(ç,ç,ç))(ç(ç(ç(ç,ç,ç(ç(ç(ç(ç(ç(ç § §(ç(ç(¥(¥$Ç$Ç(ç(ç Æ Æ$Æ$Æ(ç(ç,Æ,Æ---*1*))¥¥¥¥$¥$¥ † † ç ç † † Æ Æ e …$d$„dƒ e …$d$„dƒdƒ$d$„dƒ e …,Å,Å-*1* e …$d$„$d$„ d ƒ$d$„ d ƒ$d$„dc„c$„$d„c$„$„(¥(¥5J5J † † ¥ ¥ e … d „dd … e „ „dd ¥ ¥ e …$d$„ ¥ ¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$„$„ † †$¥$¥(¥(¥(¥(¥ e …$¥$¥ e …¥¥ † †(¥(¥=Œ=Œ § § e … „ „ … e¥¥ e …dd¥¥ d „dd$„$ddd$„$d„c … eƒd … eƒd$„$d ¥ ¥1)1) § §$d$„$d$„ d ƒ d ƒ$d$„ d ƒ$d$„dƒ$d$„dƒ$„$„ … e11) -) -c„ e …dd „ „dc ¥ ¥ e … e … ¥ ¥$„$„ † †$„$„ § §$d$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥ † †$¥$¥$„$„ … e¥¥ e … † †$¥$¥1)1)-*1*dd$¥$¥e…dd¥¥dddd ¥ ¥ … e$„$d„c … e$„$d„c„c$„$d„c … e,Å,Å-*1* e …$d$„$d$„ d ƒ$d$„ d ƒ$d$„dc„c$„$d„c$„$„(¥(¥5J5J † † ¥ ¥ e … d „dd … e „ „dd ¥ ¥ e …$d$„ ¥ ¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$„$„ † †$¥$¥(¥(¥(¥(¥ e …$¥$¥ e …¥¥ † †(¥(¥=Œ=Œ § § e … „ „ … e¥¥ e …dd¥¥ d „dd$„$ddd$„$d„c … eƒd … eƒd$„$d ¥ ¥1)1) § §$d$„$d$„ d ƒ d ƒ$d$„ d ƒ$d$„dƒ$d$„dƒ$„$„ … e11) -) -c„ e …dd „ „dc ¥ ¥ e … e … ¥ ¥$„$„ † †$„$„ § §$d$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥ † †$¥$¥$„$„ … e¥¥ e … † †$¥$¥1)1)-*1*dd$¥$¥e…dd¥¥dddd ¥ ¥$d$„dƒ$„$„ƒd … e$„$d„c„c „ c$„$d(ç(ç) -) -$„$„ƒd$„$„$„$„ƒd$„$„$„$„ƒddd$„$„dd$„$„ ¥ ¥-*1*$¥$¥dddd „ „dd „ „dd$¥$¥dd(¥(¥ ¥ ¥$„$„ † †(¥(¥ † †$„$d,¥,¥ § §$¥$¥$„$„ † † … e$¥$¥ e …dd¥¥ † †,¥,¥55,é,é „ „dd¥¥dd¥¥ e …dddd ¥ ¥ c „$d$„$d$„$d$„dƒ$d$„dƒ d ƒdƒ$„$„-*1* † †$„$d$„$„$„$d „ ƒ$„$c$„$„ƒdƒd ¥ ¥ d „dƒ$d$„11$ç$ç e … ¥ ¥c„ e …dd ¥ ¥dd ¥ ¥$„$„ † †$„$„(¥(¥ † †(¥(¥(¥(¥,¥,¥ † †(¥(¥ † †$„$„ † †$„$„ † †dd$¥$¥ e …$¥$¥1)1)5m5mdd$¥$¥e…dd$¥$¥ d „$d$„ d „$„$d„c$„$„ƒd … e$„$d„c„c „ c$„$d(ç(ç) -) -$„$„ƒd$„$„$„$„ƒd$„$„$„$„ƒddd$„$„dd$„$„ ¥ ¥-*1*$¥$¥dddd „ „dd „ „dd$¥$¥dd(¥(¥ ¥ ¥$„$„ † †(¥(¥ † †$„$d,¥,¥ § §$¥$¥$„$„ † † … e$¥$¥ e …dd¥¥ † †,¥,¥55,é,é „ „dd¥¥dd¥¥ e …dddd ¥ ¥ c „$d$„$d$„$d$„dƒ$d$„dƒ d ƒdƒ$„$„-*1* † †$„$d$„$„$„$d „ ƒ$„$c$„$„ƒdƒd ¥ ¥ d „dƒ$d$„11$ç$ç e … ¥ ¥c„ e …dd ¥ ¥dd ¥ ¥$„$„ † †$„$„(¥(¥ † †(¥(¥(¥(¥,¥,¥ † †(¥(¥ † †$„$„ † †$„$„ † †dd$¥$¥ e …$¥$¥1)1)5m5mdd$¥$¥e…dd$¥$¥ d „$d$„ d „$d$„$d$„dƒ$d$„ d ƒdƒ d ƒ$d$ƒ$d$„ d ƒ,Å,Å)K)Kc„$„$„ … e$„$d$„$„$„$„ƒd … e ƒ „$„$d „ „„c(¥(¥-*1*dd ¥ ¥dddd „ „dd „ „ „ „¥¥ e …$¥$¥(¥(¥ e …$„$„(¥(¥(¥(¥(¥(¥ † †$„$„ … e … e ¥ ¥ e … ¥ ¥c„$¥$¥(¥(¥(¥(¥5m5m$Ç$Çdd „ „dd¥¥ e …dd¥¥dd$„$ddd„c$„$d$„$d„c „ c$„$d „ c$„$d$„$„-*1* § §$„$„$„$„$„$d „ ƒ$„$„$„$d$„$d „ „ „ c$„$d „ „ „ c11))dddddd „ „dddd „ „dd$¥$¥ e …(¥(¥ † †$„$„(¥(¥ d „(¥(¥(¥(¥$d$„ † † … e … e ¥ ¥ e … „ „dd$¥$¥(¥(¥11-l-ldd † †ƒd … edddd„c … e$„$d$„$d„c$„$d „ c„c „ c$„$c$„$d „ c,Å,Å)K)Kc„$„$„ … e$„$d$„$„$„$„ƒd … e ƒ „$„$d „ „„c(¥(¥-*1*dd ¥ ¥dddd „ „dd „ „ „ „¥¥ e …$¥$¥(¥(¥ e …$„$„(¥(¥(¥(¥(¥(¥ † †$„$„ … e … e ¥ ¥ e … ¥ ¥c„$¥$¥(¥(¥(¥(¥5m5m$Ç$Çdd „ „dd¥¥ e …dd¥¥dd$„$ddd„c$„$d$„$d„c „ c$„$d „ c$„$d$„$„-*1* § §$„$„$„$„$„$d „ ƒ$„$„$„$d$„$d „ „ „ c$„$d „ „ „ c11))dddddd „ „dddd „ „dd$¥$¥ e …(¥(¥ † †$„$„(¥(¥ d „(¥(¥(¥(¥$d$„ † † … e … e ¥ ¥ e … „ „dd$¥$¥(¥(¥11-l-ldd † †ƒd … edddd„c … e$d$„dƒ d ƒ d ƒ$„$„ ƒ d$„$d„c „ c$„$„(¥(¥1L1L e …$„$„ ƒ „$„$d$„$„$„$„$„$„$„$„$„$d „ ƒ$„$d$„$„ … e))dddd$„$„dddc„„dddd$¥$¥ e …$¥$¥$„$„(¥(¥ † †$„$d$„$„(¥(¥ † †$„$„ … e$„$d$„$d ¥ ¥$d$„dd(¥(¥ † †(¥(¥5k5k$Ç$Çdddd „ „dddd„„dddd$„$d„c$„$d„c$„$„ƒd ƒ d ƒ d ƒ d$„$d$„$„5J5J ç ç$c$„ e …$„$„$„$„$„$d$„$„$„$„$„$d „ ƒ„c$„$„$„$d$ç$ç § §c„ „ „dddd„„dc ¥ ¥ e …$¥$¥$„$„ † †$„$d(¥(¥ e …(¥(¥$d$„(¥(¥ † †$„$d$„$d$„$„dd$¥$¥ e … ¥ ¥$„$„(¥(¥111L1Lcddddd„„…e „ „„c$„$d$„$d„c „ c „ c$„$„ ƒ d$„$d„c „ c$„$„(¥(¥1L1L e …$„$„ ƒ „$„$d$„$„$„$„$„$„$„$„$„$d „ ƒ$„$d$„$„ … e))dddd$„$„dddc„„dddd$¥$¥ e …$¥$¥$„$„(¥(¥ † †$„$d$„$„(¥(¥ † †$„$„ … e$„$d$„$d ¥ ¥$d$„dd(¥(¥ † †(¥(¥5k5k$Ç$Çdddd „ „dddd„„dddd$„$d„c$„$d„c$„$„ƒd ƒ d ƒ d ƒ d$„$d$„$„5J5J ç ç$c$„ e …$„$„$„$„$„$d$„$„$„$„$„$d „ ƒ„c$„$„$„$d$ç$ç § §c„ „ „dddd„„dc ¥ ¥ e …$¥$¥$„$„ † †$„$d(¥(¥ e …(¥(¥$d$„(¥(¥ † †$„$d$„$d$„$„dd$¥$¥ e … ¥ ¥$„$„(¥(¥111L1Lcddddd„„…e „ „„c$„$d$d$„ d ƒ d ƒ$d$ƒ d ƒ d ƒ d ƒ d ƒ$d$ƒ$d$„$¥$¥1L1L$d$„ d ƒ$„$„$„$„$ƒ$d$„$„$„$„$„$d$„$„$„$d$„$„ƒd$„$„$Ç$Ç „ „„cdd „ „„c … e ¥ ¥$„$„(¥(¥$„$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$„$„$„$„(¥(¥ † †$¥$¥(¥(¥$d$„1L1L$Ç$Çdƒ „ „„ddd„„dd„„ … e$„$d „ c$„$d$„$d „ c$„$c$„$d„c$„$c$„$c$„$d-+1*$Ç$Ç$d$„ d ƒ$„$„$ƒ$d$„$„$„$„$„$„ƒd$„$d$„$„$„$d$„$„(¥(¥ÆÆ d „dƒdd „ „„c ¥ ¥$d$„$¥$¥$d$„,¥,¥(¥(¥(¥(¥,¥,¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$d$„(¥(¥$¥$¥$d$„$¥$¥(¥(¥(¥(¥(¥(¥,é,é-*1*dddddd„ddddddd$„$d$„$d „ c „ c$„$c „ c „ c „ c „ c$„$c$„$d$¥$¥1L1L$d$„ d ƒ$„$„$„$„$ƒ$d$„$„$„$„$„$d$„$„$„$d$„$„ƒd$„$„$Ç$Ç „ „„cdd „ „„c … e ¥ ¥$„$„(¥(¥$„$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$„$„$„$„(¥(¥ † †$¥$¥(¥(¥$d$„1L1L$Ç$Çdƒ „ „„ddd„„dd„„ … e$„$d „ c$„$d$„$d „ c$„$c$„$d„c$„$c$„$c$„$d-+1*$Ç$Ç$d$„ d ƒ$„$„$ƒ$d$„$„$„$„$„$„ƒd$„$d$„$„$„$d$„$„(¥(¥ÆÆ d „dƒdd „ „„c ¥ ¥$d$„$¥$¥$d$„,¥,¥(¥(¥(¥(¥,¥,¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$d$„(¥(¥$¥$¥$d$„$¥$¥(¥(¥(¥(¥(¥(¥,é,é-*1*dddddd„ddddddd$„$d † †$¥$¥ † † † †(¥(¥ † † … edd „ ddd ç ç1L1L,é,é § §$¥$¥$¥$¥(¥(¥(ç(ç,Æ,Æ$¥$¥$¥$¥$¥$¥ † †(ç(ç(¥(¥-*1*))$Ç$Ç § §$¥$¥dd „ „ † †$„$„ † †$„$„$„$d … e † † † †$„$d … e … e(¥(¥ e …$d$„(¥(¥ † † † † † †(¥(¥ † † † †$Ç$Ç-*1*%%dddcdddc„ddddd „ c„c „ c „ c$„$c$„$d$„$d„c „ c$„$d$„$d$„$„)J)J1L1L † †(¥(¥$¥$¥ § §,Å,Å(ç(ç(¥(¥ † †(¥(¥ § §(¥(¥ § §-)-),é,é$Ç$Ç$Ç$Ç$¥$¥dddd(¥(¥ † †$„$d$¥$¥$„$„ … e … e$¥$¥ e … e … e …$„$„ † †$„$„(¥(¥ † †(¥(¥ e … † † § § † † † †) -) -)K)Kf†f†¥¥ § §e…d„d„f† † †$¥$¥ † † † †(¥(¥ † † … edd „ ddd ç ç1L1L,é,é § §$¥$¥$¥$¥(¥(¥(ç(ç,Æ,Æ$¥$¥$¥$¥$¥$¥ † †(ç(ç(¥(¥-*1*))$Ç$Ç § §$¥$¥dd „ „ † †$„$„ † †$„$„$„$d … e † † † †$„$d … e … e(¥(¥ e …$d$„(¥(¥ † † † † † †(¥(¥ † † † †$Ç$Ç-*1*%%dddcdddc„ddddd „ c„c „ c „ c$„$c$„$d$„$d„c „ c$„$d$„$d$„$„)J)J1L1L † †(¥(¥$¥$¥ § §,Å,Å(ç(ç(¥(¥ † †(¥(¥ § §(¥(¥ § §-)-),é,é$Ç$Ç$Ç$Ç$¥$¥dddd(¥(¥ † †$„$d$¥$¥$„$„ … e … e$¥$¥ e … e … e …$„$„ † †$„$„(¥(¥ † †(¥(¥ e … † † § § † † † †) -) -)K)Kf†f†¥¥ § §e…d„d„f†-l-l55955m5m=Ž=Ž559m5m)K)K) -) -1L1L-l-l11AðAð=Ž=Ž5Œ5Œ=Ž=ŽAðAðAðAðAðAðAðAðAðAð=ï=ïAðAðAðAðAðAð=Ž=Ž=ï=ïIðEð=Ž=Ž1Œ1Œ1L1L1L1L1L1L1L1L1Œ1Œ5m5m9n5m115n5m115m5m1L1L1L1L1L1L1L1L)K)K1L1L5m5m11=Ž=Ž=¯A°=ÏA°5Ž5595559551L1L-l-l) -) -11551L1L1L1L1L1L5J5J-*1*1L1L=Œ=Œ=Ž=Ž5k5k5J5J-*1*)K)K5J5J11=Ž=ŽAðAð5Œ5Œ95=Ž=ŽAïAïIðEðAðAðAïAïAðAð=ï=ïAïAïAïAïAðAð55AïAïAðAð5Œ5Œ-l-l1L1L1L1L1L1L-l-l551L1L111Œ1Œ115m5m-l-l1L1L1L1L1L1L)K)K)K)K1L1L1155A¯=°AÏ=°=¯A¯555955=ð=ð5595IðEð-l-l)K)K-l-l-l-l-l-l55955m5m=Ž=Ž559m5m)K)K) -) -1L1L-l-l11AðAð=Ž=Ž5Œ5Œ=Ž=ŽAðAðAðAðAðAðAðAðAðAð=ï=ïAðAðAðAðAðAð=Ž=Ž=ï=ïIðEð=Ž=Ž1Œ1Œ1L1L1L1L1L1L1L1L1Œ1Œ5m5m9n5m115n5m115m5m1L1L1L1L1L1L1L1L)K)K1L1L5m5m11=Ž=Ž=¯A°=ÏA°5Ž5595559551L1L-l-l) -) -11551L1L1L1L1L1L5J5J-*1*1L1L=Œ=Œ=Ž=Ž5k5k5J5J-*1*)K)K5J5J11=Ž=ŽAðAð5Œ5Œ95=Ž=ŽAïAïIðEðAðAðAïAïAðAð=ï=ïAïAïAïAïAðAð55AïAïAðAð5Œ5Œ-l-l1L1L1L1L1L1L-l-l551L1L111Œ1Œ115m5m-l-l1L1L1L1L1L1L)K)K)K)K1L1L1155A¯=°AÏ=°=¯A¯555955=ð=ð5595IðEð-l-l)K)K-l-l-l-l11(¥(¥0ç0ç,ç,ç5)5)A¯=°$Æ$Æ(¥(¥$¥$¥¥¥ § § ¥ ¥$d$„ „ „¥¥(¥(¥¥¥$¥$¥ § §(¥(¥ § §(¥(¥ Æ Æ(¥(¥ e … „ „¥¥$Æ$Æ § § ¥ ¥ e … ¥ ¥ ¥ ¥(¥(¥5J5J559k5k1L1L5J5J5k5k9k5k5m5m9k5k559k5k5m5m9k5k5k5k1Œ1Œ559)5)11-)-)(ç(ç115I5I9)5)5I5I9)5)5k5k9k5k5k5k5J5J=Œ=Œ5k5k9)5)5)5)5J5J=Œ=Œ-*1*$¥$¥ e …$¥$¥ Æ Æ$¥$¥$¥$¥ „ „ … e „ „ Æ Æ$¥$¥$¥$¥ § § Æ Æ$Æ$Æ § §$¥$¥$Æ$Æ † † ¥ ¥$d$„ÆÆ(¥(¥$¥$¥dd Æ Æ ¥ ¥(¥(¥11=Ž=Ž559I5I5k5k9k5k5k5k9m5m5k5k=Ž=Ž5k5k9m5m5k5k9k5k=Ž=ŽJF=Œ=Œ1)1)----115)5)1)1)5)5)9I5I5)5)5J5J5J5J5J5J5)5)11(¥(¥0ç0ç,ç,ç5)5)A¯=°$Æ$Æ(¥(¥$¥$¥¥¥ § § ¥ ¥$d$„ „ „¥¥(¥(¥¥¥$¥$¥ § §(¥(¥ § §(¥(¥ Æ Æ(¥(¥ e … „ „¥¥$Æ$Æ § § ¥ ¥ e … ¥ ¥ ¥ ¥(¥(¥5J5J559k5k1L1L5J5J5k5k9k5k5m5m9k5k559k5k5m5m9k5k5k5k1Œ1Œ559)5)11-)-)(ç(ç115I5I9)5)5I5I9)5)5k5k9k5k5k5k5J5J=Œ=Œ5k5k9)5)5)5)5J5J=Œ=Œ-*1*$¥$¥ e …$¥$¥ Æ Æ$¥$¥$¥$¥ „ „ … e „ „ Æ Æ$¥$¥$¥$¥ § § Æ Æ$Æ$Æ § §$¥$¥$Æ$Æ † † ¥ ¥$d$„ÆÆ(¥(¥$¥$¥dd Æ Æ ¥ ¥(¥(¥11=Ž=Ž559I5I5k5k9k5k5k5k9m5m5k5k=Ž=Ž5k5k9m5m5k5k9k5k=Ž=ŽJF=Œ=Œ1)1)----115)5)1)1)5)5)9I5I5)5)5J5J5J5J5J5J5)5),Æ,Æ e …$¥$¥$d$„1155(¥(¥ e …dddddddddddc … e$¥$¥ d „dd$„$ddcdddd„ddddddd„c … e ¥ ¥$d$„dddc ¥ ¥$d$„5)5)95,ç,ç(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$Ç$Ç,Æ,Æ0ç0ç,Æ,Æ$Ç$Ç0Æ0Æ5m5m1L1L,Æ,Æ † †$„$„(¥(¥$d$„(¥(¥,¥,¥,¥,¥(¥(¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥55 § §dddddddddcdd„ddd„c … e ¥ ¥c„ d „ d „dd „ ddcdddddd„cdd$¥$¥ e …dddddd(¥(¥,¥,¥5511,¥,¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥$Ç$Ç,Æ,Æ0ç0ç$Ç$Ç0Æ0Æ5)5)AòAñ,é,é$d$„$„$„(¥(¥(¥(¥$d$„$d$„,¥,¥$d$„,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,Æ,Æ e …$¥$¥$d$„1155(¥(¥ e …dddddddddddc … e$¥$¥ d „dd$„$ddcdddd„ddddddd„c … e ¥ ¥$d$„dddc ¥ ¥$d$„5)5)95,ç,ç(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$Ç$Ç,Æ,Æ0ç0ç,Æ,Æ$Ç$Ç0Æ0Æ5m5m1L1L,Æ,Æ † †$„$„(¥(¥$d$„(¥(¥,¥,¥,¥,¥(¥(¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥55 § §dddddddddcdd„ddd„c … e ¥ ¥c„ d „ d „dd „ ddcdddddd„cdd$¥$¥ e …dddddd(¥(¥,¥,¥5511,¥,¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥$Ç$Ç,Æ,Æ0ç0ç$Ç$Ç0Æ0Æ5)5)AòAñ,é,é$d$„$„$„(¥(¥(¥(¥$d$„$d$„,¥,¥$d$„,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,Æ,Æ § §$„$„ † †4ç4ç9m5m § §$d$„dddcdc„ddd „ d„c … eƒdƒddd„ddd„ddddd„„dd„„ … e „ „dddddddd(¥(¥5595$Ç$Ç(¥(¥(¥(¥ § §,¥,¥$Ç$Ç0ç0ç$Ç$Ç0ç0ç$Ç$Ç0ç0ç,é,é=Œ=Œ1L1L,Æ,Æ § §(¥(¥ † †(¥(¥(¥(¥ e …(¥(¥(¥(¥,¥,¥,¥,¥,Æ,Æ0Æ0Æ,Æ,Æ,Æ,Æ,é,é0Æ0Æ,é,é11$Ç$Ç e …$„$„dddd„„dc„ddddd$¥$¥dddd„c„ddddddd„ddddd„„¥¥dd … ecd„„dd … e,Æ,Æ5511 § § § §(¥(¥$Ç$Ç,¥,¥$Ç$Ç0ç0ç$Ç$Ç0ç0ç$Ç$Ç0ç0ç5J5J=Ž=Ž,é,é(¥(¥ § §(¥(¥ † †(¥(¥(¥(¥,¥,¥ § §,¥,¥,¥,¥$Ç$Ç,¥,¥,Æ,Æ,Æ,Æ § §$„$„ † †4ç4ç9m5m § §$d$„dddcdc„ddd „ d„c … eƒdƒddd„ddd„ddddd„„dd„„ … e „ „dddddddd(¥(¥5595$Ç$Ç(¥(¥(¥(¥ § §,¥,¥$Ç$Ç0ç0ç$Ç$Ç0ç0ç$Ç$Ç0ç0ç,é,é=Œ=Œ1L1L,Æ,Æ § §(¥(¥ † †(¥(¥(¥(¥ e …(¥(¥(¥(¥,¥,¥,¥,¥,Æ,Æ0Æ0Æ,Æ,Æ,Æ,Æ,é,é0Æ0Æ,é,é11$Ç$Ç e …$„$„dddd„„dc„ddddd$¥$¥dddd„c„ddddddd„ddddd„„¥¥dd … ecd„„dd … e,Æ,Æ5511 § § § §(¥(¥$Ç$Ç,¥,¥$Ç$Ç0ç0ç$Ç$Ç0ç0ç$Ç$Ç0ç0ç5J5J=Ž=Ž,é,é(¥(¥ § §(¥(¥ † †(¥(¥(¥(¥,¥,¥ § §,¥,¥,¥,¥$Ç$Ç,¥,¥,Æ,Æ,Æ,Æ † † … edd--1L1L,Æ,Ædddddc„ddc„ddddd$¥$¥dd „ „dd„ddddd„d„„dd„„dd¥¥ † †ƒddddd„„ … e--=Ž=Ž,ç,ç0ç0ç$Ç$Ç,¥,¥$Ç$Ç$Ç$Ç,¥,¥$Ç$Ç0ç0ç$Ç$Ç$Ç$Ç0Æ0Æ=Ž=Ž55(¥(¥(¥(¥ † † ¥ ¥ † † § §(¥(¥$Ç$Ç † †$Ç$Ç(¥(¥ § §0ç0ç,é,é0ç0ç,é,é,é,é,é,é55$Ç$Ç e …dd„„dddc„ddddddd¥¥ e …c„ e …cddd„ddd…e„„dddd … e¥¥ e …c„dd„„ … e(¥(¥551*-*0Æ0Æ,Æ,Æ$Ç$Ç † †$Ç$Ç$Ç$Ç0ç0ç$Ç$Ç0ç0ç$Ç$Ç,Æ,Æ5J5J=¯A°$Ç$Ç(¥(¥(¥(¥ e …¥¥ § § § § § §(¥(¥,Æ,Æ$Ç$Ç,¥,¥$Ç$Ç0ç0ç,Æ,Æ † † … edd--1L1L,Æ,Ædddddc„ddc„ddddd$¥$¥dd „ „dd„ddddd„d„„dd„„dd¥¥ † †ƒddddd„„ … e--=Ž=Ž,ç,ç0ç0ç$Ç$Ç,¥,¥$Ç$Ç$Ç$Ç,¥,¥$Ç$Ç0ç0ç$Ç$Ç$Ç$Ç0Æ0Æ=Ž=Ž55(¥(¥(¥(¥ † † ¥ ¥ † † § §(¥(¥$Ç$Ç † †$Ç$Ç(¥(¥ § §0ç0ç,é,é0ç0ç,é,é,é,é,é,é55$Ç$Ç e …dd„„dddc„ddddddd¥¥ e …c„ e …cddd„ddd…e„„dddd … e¥¥ e …c„dd„„ … e(¥(¥551*-*0Æ0Æ,Æ,Æ$Ç$Ç † †$Ç$Ç$Ç$Ç0ç0ç$Ç$Ç0ç0ç$Ç$Ç,Æ,Æ5J5J=¯A°$Ç$Ç(¥(¥(¥(¥ e …¥¥ § § § § § §(¥(¥,Æ,Æ$Ç$Ç,¥,¥$Ç$Ç0ç0ç(ç(ç$Ç$Ç † † … e1155,Æ,Æ d „dddc„d„ddd„ddddddd„„dd„ddd„d…edd„ddd „ „dd$¥$¥dddd„d … e$¥$¥,ç,ç55,ç,ç,é,é,¥,¥$Ç$Ç † †$Ç$Ç$Ç$Ç0ç0ç$Ç$Ç$Ç$Ç0ç0ç,é,é5k5k1L1L „ „†f„d„d„d†f„d¥¥ † †,¥,¥ § §0Æ0Æ,é,é,é,é,é,é--,é,é(ç(ç-*1*,é,é$d$„dc„ddddd„ddc„ddddd … eƒddddd„ddd„ddd„d „ „dd„„¥¥ e …dddd„d$¥$¥(¥(¥5m5m11,é,é,Æ,Æ$Ç$Ç,¥,¥$Ç$Ç,¥,¥$Ç$Ç$Ç$Ç$Ç$Ç,Æ,Æ,é,é5)5)A¯=° ¦ §¥¥f†„„„d…edd¥¥ † † § §,ç,ç § § † †--(ç(ç$Ç$Ç † † … e1155,Æ,Æ d „dddc„d„ddd„ddddddd„„dd„ddd„d…edd„ddd „ „dd$¥$¥dddd„d … e$¥$¥,ç,ç55,ç,ç,é,é,¥,¥$Ç$Ç † †$Ç$Ç$Ç$Ç0ç0ç$Ç$Ç$Ç$Ç0ç0ç,é,é5k5k1L1L „ „†f„d„d„d†f„d¥¥ † †,¥,¥ § §0Æ0Æ,é,é,é,é,é,é--,é,é(ç(ç-*1*,é,é$d$„dc„ddddd„ddc„ddddd … eƒddddd„ddd„ddd„d „ „dd„„¥¥ e …dddd„d$¥$¥(¥(¥5m5m11,é,é,Æ,Æ$Ç$Ç,¥,¥$Ç$Ç,¥,¥$Ç$Ç$Ç$Ç$Ç$Ç,Æ,Æ,é,é5)5)A¯=° ¦ §¥¥f†„„„d…edd¥¥ † † § §,ç,ç § § † †--,ç,ç § §$„$„ … e--55(¥(¥$d$„dddddc„ddddd„c … eƒdcddddd„cdd „ „dddd „ „dcdd „ „dddd„c$„$d$„$d,ç,ç1Œ1Œ55,é,é,ç,ç$Ç$Ç0ç0ç$Ç$Ç$Ç$Ç,é,é0ç0ç$Ç$Ç0ç0ç0ç0ç-*1*-*1*d„¥¥f†e…e…„„…e„d„ddd † † § §11,ç,ç,é,é,ç,ç,é,é,ç,ç-*1*)) d „dƒdddc„ddc„d „ ddd„c$„$ddd „ „dc„cdd„cdd „ „dddcdc … e$„$„cdƒd … e$„$d$¥$¥1L1L1)1)4ç4ç,é,é$Ç$Ç$Ç$Ç$Ç$Ç$Ç$Ç,é,é0ç0ç,é,é$Ç$Ç0ç0ç1155¥¥e…f†e…e…e…e…e…„„dd Æ Ædddd ç ç,ç,ç § §$„$„ … e--55(¥(¥$d$„dddddc„ddddd„c … eƒdcddddd„cdd „ „dddd „ „dcdd „ „dddd„c$„$d$„$d,ç,ç1Œ1Œ55,é,é,ç,ç$Ç$Ç0ç0ç$Ç$Ç$Ç$Ç,é,é0ç0ç$Ç$Ç0ç0ç0ç0ç-*1*-*1*d„¥¥f†e…e…„„…e„d„ddd † † § §11,ç,ç,é,é,ç,ç,é,é,ç,ç-*1*)) d „dƒdddc„ddc„d „ ddd„c$„$ddd „ „dc„cdd„cdd „ „dddcdc … e$„$„cdƒd … e$„$d$¥$¥1L1L1)1)4ç4ç,é,é$Ç$Ç$Ç$Ç$Ç$Ç$Ç$Ç,é,é0ç0ç,é,é$Ç$Ç0ç0ç1155¥¥e…f†e…e…e…e…e…„„dd Æ Ædddd ç ç(ç(ç$Ç$Ç § §$Æ$Æ-*1*55) -) - § § § §¥¥f†f†„„…e„ddc„d„dddÆÆd„dd†f¥¥ Æ Æf†f† § § § § Æ Æ § § ç ç$Ç$Ç$Ç$Ç)K)K1L1L$Ç$Ç § § § §(ç(ç § §$Ç$Ç,Æ,Æ$Ç$Ç § § § § † †(¥(¥=Ž=Ž55d„$¥$¥ ç ç † † † † § §(¥(¥ † †$Æ$Æ$¥$¥,é,é,ç,ç%%-*1*11-*1*1)1)) -) -=Ž=Ž1L1L ç ç$Ç$Ç § §f† † †ÆÆd„e…dd„ddd„„dc†f„„†f„d¥¥ † † † ††fÆÆ § § § § § § § §$Ç$Ç$Ç$Ç) -) --l-l) -) -$Ç$Ç § §(ç(ç,Æ,Æ § §$Ç$Ç,Æ,Æ § § § §(¥(¥ † †11AòAñ § §¥¥ § §$Ç$Ç$¥$¥ † † § § Æ Æ(¥(¥$¥$¥ § §$Ç$Ç ç ç$Æ$Æ(ç(ç$Ç$Ç § §$Æ$Æ-*1*55) -) - § § § §¥¥f†f†„„…e„ddc„d„dddÆÆd„dd†f¥¥ Æ Æf†f† § § § § Æ Æ § § ç ç$Ç$Ç$Ç$Ç)K)K1L1L$Ç$Ç § § § §(ç(ç § §$Ç$Ç,Æ,Æ$Ç$Ç § § § § † †(¥(¥=Ž=Ž55d„$¥$¥ ç ç † † † † § §(¥(¥ † †$Æ$Æ$¥$¥,é,é,ç,ç%%-*1*11-*1*1)1)) -) -=Ž=Ž1L1L ç ç$Ç$Ç § §f† † †ÆÆd„e…dd„ddd„„dc†f„„†f„d¥¥ † † † ††fÆÆ § § § § § § § §$Ç$Ç$Ç$Ç) -) --l-l) -) -$Ç$Ç § §(ç(ç,Æ,Æ § §$Ç$Ç,Æ,Æ § § § §(¥(¥ † †11AòAñ § §¥¥ § §$Ç$Ç$¥$¥ † † § § Æ Æ(¥(¥$¥$¥ § §$Ç$Ç ç ç$Æ$Æ=Œ=Œ=Œ=Œ5m5m9k5k5k5k=Ž=Ž5k5k1*-*1L1L5J5J-*1*) -) -1*-*-)-)-l-l551*-*1L1L-)-)-*1*-*1*1L1L-)-)1L1L)K)K1L1L5k5k1Œ1Œ55=Ž=Ž5Œ5Œ955m5m1Œ1Œ5k5k955n5m)J)J11) -) -)K)K-*1*-*1*) -) -1L1L1L1L-*1*-l-lAðAð=Ž=Ž=ï=ï11=Œ=Œ=Ž=Ž5k5kA¯=°=Ž=ŽAðAð=¯A°=ÏA°=¯=¯AðAð=¯A°AðAð=¯A°=Ž=Ž=Ž=Ž=Œ=Œ=Œ=Œ=Œ=Œ551*-*1Œ1Œ5J5J-*1*) -) -11)K)K-*1*111L1L-*1*)K)K11-*1*1L1L-*1*)J)J1L1L)J)J551L1L5Œ5ŒAðAð551Œ1Œ551Œ1Œ5k5k955k5k1L1L-)-)) -) -) -) -)K)K-*1*) -) -)K)K1L1L-*1*1L1L55AðAð=¯A°551Œ1Œ=Œ=Œ5m5m=Œ=Œ=¯A°=ÏA°=¯=¯AÐ=¯A°=¯IïEï=Ž=Ž=¯A°=Œ=Œ=Œ=Œ5m5m9k5k5k5k=Ž=Ž5k5k1*-*1L1L5J5J-*1*) -) -1*-*-)-)-l-l551*-*1L1L-)-)-*1*-*1*1L1L-)-)1L1L)K)K1L1L5k5k1Œ1Œ55=Ž=Ž5Œ5Œ955m5m1Œ1Œ5k5k955n5m)J)J11) -) -)K)K-*1*-*1*) -) -1L1L1L1L-*1*-l-lAðAð=Ž=Ž=ï=ï11=Œ=Œ=Ž=Ž5k5kA¯=°=Ž=ŽAðAð=¯A°=ÏA°=¯=¯AðAð=¯A°AðAð=¯A°=Ž=Ž=Ž=Ž=Œ=Œ=Œ=Œ=Œ=Œ551*-*1Œ1Œ5J5J-*1*) -) -11)K)K-*1*111L1L-*1*)K)K11-*1*1L1L-*1*)J)J1L1L)J)J551L1L5Œ5ŒAðAð551Œ1Œ551Œ1Œ5k5k955k5k1L1L-)-)) -) -) -) -)K)K-*1*) -) -)K)K1L1L-*1*1L1L55AðAð=¯A°551Œ1Œ=Œ=Œ5m5m=Œ=Œ=¯A°=ÏA°=¯=¯AÐ=¯A°=¯IïEï=Ž=Ž=¯A° e …¥¥$„$„(¥(¥(¥(¥(¥(¥ d „ e …$d$„ „ „¥¥ e …$¥$¥(¥(¥11-*1* Æ Æ,¥,¥,¥,¥(¥(¥(¥(¥,¥,¥(¥(¥(¥(¥$¥$¥(¥(¥$¥$¥(¥(¥ ç ç1L1L--,Æ,Æ § §(¥(¥ § §$„$„ † †(¥(¥ † †$¥$¥¥¥ § § § §(¥(¥(ç(ç(ç(ç,ç,ç$Ç$Ç(ç(ç$Ç$Ç(ç(ç(ç(ç$Ç$Ç(ç(ç,é,é(ç(ç,ç,ç11-*1*,Æ,Æ,Æ,Æ,ç,ç,¥,¥ § §$¥$¥$„$„(¥(¥ e …¥¥$„$„ † †$„$d„c † † ¥ ¥ e … ¥ ¥(¥(¥,Æ,Æ1L1L$Ç$Ç(Å(Å,¥,¥(¥(¥(¥(¥,¥,¥(¥(¥,¥,¥$¥$¥$¥$¥(Å(Å$¥$¥(¥(¥)K)K11(ç(ç § §,¥,¥ † †(¥(¥$¥$¥$¥$¥$¥$¥¥¥$¥$¥ † †$Æ$Æ § §,Æ,Æ(ç(ç(ç(ç,é,é(ç(ç$Æ$Æ(ç(ç(ç(ç,é,é$Ç$Ç,ç,ç(ç(ç,ç,ç,é,é5J5J11(¥(¥ § §cd¥¥ … e¥¥$„$„(¥(¥(¥(¥(¥(¥ d „ e …$d$„ „ „¥¥ e …$¥$¥(¥(¥11-*1* Æ Æ,¥,¥,¥,¥(¥(¥(¥(¥,¥,¥(¥(¥(¥(¥$¥$¥(¥(¥$¥$¥(¥(¥ ç ç1L1L--,Æ,Æ § §(¥(¥ § §$„$„ † †(¥(¥ † †$¥$¥¥¥ § § § §(¥(¥(ç(ç(ç(ç,ç,ç$Ç$Ç(ç(ç$Ç$Ç(ç(ç(ç(ç$Ç$Ç(ç(ç,é,é(ç(ç,ç,ç11-*1*,Æ,Æ,Æ,Æ,ç,ç,¥,¥ § §$¥$¥$„$„(¥(¥ e …¥¥$„$„ † †$„$d„c † † ¥ ¥ e … ¥ ¥(¥(¥,Æ,Æ1L1L$Ç$Ç(Å(Å,¥,¥(¥(¥(¥(¥,¥,¥(¥(¥,¥,¥$¥$¥$¥$¥(Å(Å$¥$¥(¥(¥)K)K11(ç(ç § §,¥,¥ † †(¥(¥$¥$¥$¥$¥$¥$¥¥¥$¥$¥ † †$Æ$Æ § §,Æ,Æ(ç(ç(ç(ç,é,é(ç(ç$Æ$Æ(ç(ç(ç(ç,é,é$Ç$Ç,ç,ç(ç(ç,ç,ç,é,é5J5J11(¥(¥ § §cd¥¥dd … e¥¥ e … † † „ d … edd„„…e † †dd(¥(¥(¥(¥1111,Æ,Æ,¥,¥0Æ0Æ,¥,¥0ç0ç,¥,¥,ç,ç,Æ,Æ,Æ,Æ$Æ$Æ § § § §$ç$ç55,é,é(¥(¥ † † † †(¥(¥ † † † † … e ¥ ¥ e …¥¥ † †$„$„ † †(¥(¥ † †(¥(¥ † † § § ¥ ¥ † †dd…e † †(¥(¥ § §,¥,¥,é,é--,¥,¥$Ç$Ç(¥(¥ † †(¥(¥(¥(¥ † † … e ¥ ¥ e … e … „ „dd¥¥dd … e „ „ … e(¥(¥$Ç$Ç=Œ=Œ--,Æ,Æ,¥,¥,Æ,Æ,¥,¥0ç0ç,Æ,Æ,ç,ç,Æ,Æ$Æ$Æ § §(ç(ç † †1L1L-*1*$Ç$Ç(¥(¥ † † † †$¥$¥ e … † † … e¥¥ e …¥¥ † †(¥(¥ † †(¥(¥ † †(¥(¥ † †(¥(¥ † †…e…e¥¥ † † § §,¥,¥,¥,¥11$Ç$Ç,¥,¥ e …e…dddd … e¥¥ e … † † „ d … edd„„…e † †dd(¥(¥(¥(¥1111,Æ,Æ,¥,¥0Æ0Æ,¥,¥0ç0ç,¥,¥,ç,ç,Æ,Æ,Æ,Æ$Æ$Æ § § § §$ç$ç55,é,é(¥(¥ † † † †(¥(¥ † † † † … e ¥ ¥ e …¥¥ † †$„$„ † †(¥(¥ † †(¥(¥ † † § § ¥ ¥ † †dd…e † †(¥(¥ § §,¥,¥,é,é--,¥,¥$Ç$Ç(¥(¥ † †(¥(¥(¥(¥ † † … e ¥ ¥ e … e … „ „dd¥¥dd … e „ „ … e(¥(¥$Ç$Ç=Œ=Œ--,Æ,Æ,¥,¥,Æ,Æ,¥,¥0ç0ç,Æ,Æ,ç,ç,Æ,Æ$Æ$Æ § §(ç(ç † †1L1L-*1*$Ç$Ç(¥(¥ † † † †$¥$¥ e … † † … e¥¥ e …¥¥ † †(¥(¥ † †(¥(¥ † †(¥(¥ † †(¥(¥ † †…e…e¥¥ † † § §,¥,¥,¥,¥11$Ç$Ç,¥,¥ e …e…dddd¥¥dd … e … e¥¥d„ e …¥¥dd¥¥ † † … e$Æ$Æ-*1*1L1L$d$„,¥,¥,ç,ç,Æ,Æ,Æ,Æ,Æ,Æ,Æ,Æ0ç0ç$Ç$Ç(ç(ç$Ç$Ç ç ç § §1L1L11$¥$¥ † †$¥$¥ † †dd$¥$¥¥¥ e … e …¥¥ † †$¥$¥ † † § §(¥(¥ † † § §(¥(¥ † † † † … e¥¥ † † † †(¥(¥ § §0Æ0Æ,é,é § §,¥,¥ § §(¥(¥ e … † †(¥(¥ e … e … „ „¥¥dd¥¥e… e …„„¥¥ e … † †,ç,ç5m5m † †,¥,¥,Æ,Æ0ç0ç,Æ,Æ,¥,¥0Æ0Æ0ç0ç$Ç$Ç,Æ,Æ$Ç$Ç$Ç$ÇÆÆ-*1*11 § § § §$¥$¥ † † † †dd$¥$¥ e …¥¥ † † † † † † … e(¥(¥ † †(¥(¥ † †$Æ$Æ † † † †¥¥ e … † † † †(¥(¥ § §,¥,¥11$Ç$Ç,¥,¥$Ç$Ç e … „ „dd¥¥dd … e … e¥¥d„ e …¥¥dd¥¥ † † … e$Æ$Æ-*1*1L1L$d$„,¥,¥,ç,ç,Æ,Æ,Æ,Æ,Æ,Æ,Æ,Æ0ç0ç$Ç$Ç(ç(ç$Ç$Ç ç ç § §1L1L11$¥$¥ † †$¥$¥ † †dd$¥$¥¥¥ e … e …¥¥ † †$¥$¥ † † § §(¥(¥ † † § §(¥(¥ † † † † … e¥¥ † † † †(¥(¥ § §0Æ0Æ,é,é § §,¥,¥ § §(¥(¥ e … † †(¥(¥ e … e … „ „¥¥dd¥¥e… e …„„¥¥ e … † †,ç,ç5m5m † †,¥,¥,Æ,Æ0ç0ç,Æ,Æ,¥,¥0Æ0Æ0ç0ç$Ç$Ç,Æ,Æ$Ç$Ç$Ç$ÇÆÆ-*1*11 § § § §$¥$¥ † † † †dd$¥$¥ e …¥¥ † † † † † † … e(¥(¥ † †(¥(¥ † †$Æ$Æ † † † †¥¥ e … † † † †(¥(¥ § §,¥,¥11$Ç$Ç,¥,¥$Ç$Ç e … „ „dd„d … e¥¥dddd„d¥¥e… e …¥¥ e …¥¥ † †11-*1*$¥$¥(¥(¥0Æ0Æ,Æ,Æ0Æ0Æ0ç0ç0ç0ç0Æ0Æ0ç0ç § §$Ç$Ç Æ Æ ç ç-*1*,é,é$¥$¥ † †$¥$¥ e … † †¥¥e… † †dd$¥$¥ † † † †$¥$¥ † †$¥$¥ † †(¥(¥ † † † †¥¥dd¥¥ † †$¥$¥ † †,¥,¥0ç0ç,é,é,¥,¥$Ç$Ç † †,¥,¥ § §(¥(¥e… † †dddd…edd„d$¥$¥e… e …¥¥ e …¥¥$Ç$Ç5n5m § §(Å(Å,¥,¥0ç0ç,Æ,Æ0ç0ç0ç0ç0Æ0Æ0ç0ç$Ç$Ç$Ç$Ç § §„„)K)K11 § §(¥(¥$¥$¥ e …¥¥ e …¥¥ e …¥¥ e …¥¥ † †(¥(¥ † †$¥$¥ † † † †$Æ$Æ † † … e … e„„ † † § § ¥ ¥(¥(¥$Ç$Ç55$Ç$Ç$Ç$Ç$„$„…edddd„d … e¥¥dddd„d¥¥e… e …¥¥ e …¥¥ † †11-*1*$¥$¥(¥(¥0Æ0Æ,Æ,Æ0Æ0Æ0ç0ç0ç0ç0Æ0Æ0ç0ç § §$Ç$Ç Æ Æ ç ç-*1*,é,é$¥$¥ † †$¥$¥ e … † †¥¥e… † †dd$¥$¥ † † † †$¥$¥ † †$¥$¥ † †(¥(¥ † † † †¥¥dd¥¥ † †$¥$¥ † †,¥,¥0ç0ç,é,é,¥,¥$Ç$Ç † †,¥,¥ § §(¥(¥e… † †dddd…edd„d$¥$¥e… e …¥¥ e …¥¥$Ç$Ç5n5m § §(Å(Å,¥,¥0ç0ç,Æ,Æ0ç0ç0ç0ç0Æ0Æ0ç0ç$Ç$Ç$Ç$Ç § §„„)K)K11 § §(¥(¥$¥$¥ e …¥¥ e …¥¥ e …¥¥ e …¥¥ † †(¥(¥ † †$¥$¥ † † † †$Æ$Æ † † … e … e„„ † † § § ¥ ¥(¥(¥$Ç$Ç55$Ç$Ç$Ç$Ç$„$„…edddd„„…edd…e¥¥dd…e … edd¥¥ e …dd$¥$¥,é,é-l-l,Æ,Æ,ç,ç4ç4ç95========,é,é,Æ,Æ § §ÆÆ ç ç-*1*$Ç$Ç(¥(¥ † † † †¥¥ e … e …¥¥ e …¥¥ e … Æ Æ e … † †$¥$¥ † † † † § §$¥$¥ e …e…dd„„ † † † †(¥(¥ † †0Æ0Æ-*1*$Ç$Ç(¥(¥ † † † † § §(¥(¥ † † … e „ „dd¥¥dd…e…e „ „…e † †dd$¥$¥ § §1L1L11,Æ,Æ4ç4ç0Æ0Æ========4ç4ç$Ç$Ç(ç(ç § §$Ç$Ç1L1L$ç$ç § § § § † †$¥$¥ e …¥¥ e … e …¥¥ † † † † † † † †(¥(¥ e … § §$¥$¥ † † … e¥¥e…dd¥¥ † †(¥(¥ † †,¥,¥-*1*,é,é(¥(¥e… d „dddd„„…edd…e¥¥dd…e … edd¥¥ e …dd$¥$¥,é,é-l-l,Æ,Æ,ç,ç4ç4ç95========,é,é,Æ,Æ § §ÆÆ ç ç-*1*$Ç$Ç(¥(¥ † † † †¥¥ e … e …¥¥ e …¥¥ e … Æ Æ e … † †$¥$¥ † † † † § §$¥$¥ e …e…dd„„ † † † †(¥(¥ † †0Æ0Æ-*1*$Ç$Ç(¥(¥ † † † † § §(¥(¥ † † … e „ „dd¥¥dd…e…e „ „…e † †dd$¥$¥ § §1L1L11,Æ,Æ4ç4ç0Æ0Æ========4ç4ç$Ç$Ç(ç(ç § §$Ç$Ç1L1L$ç$ç § § § § † †$¥$¥ e …¥¥ e … e …¥¥ † † † † † † † †(¥(¥ e … § §$¥$¥ † † … e¥¥e…dd¥¥ † †(¥(¥ † †,¥,¥-*1*,é,é(¥(¥e… d „dddddddd„„dddddcdddd¥¥dd¥¥ † †(¥(¥,é,é1L1L ç ç$Ç$Ç § §,Æ,Æ,é,é55,é,é,Æ,Æ,Æ,Æe…¥¥ e …) -) -) -) -(¥(¥ † †$¥$¥ e …¥¥ e …dd¥¥dd¥¥ † †dd$¥$¥$¥$¥ † †(¥(¥ † †$¥$¥dd¥¥ e … „ „¥¥ † † † †(¥(¥,¥,¥,é,é1L1L(¥(¥(¥(¥ † †,¥,¥ † † † †(¥(¥ d „dddd ¥ ¥dddddd¥¥dd „ „¥¥(¥(¥$Ç$Ç-*1*) -) -(ç(ç § §(ç(ç$Ç$Ç55,é,é0ç0ç$Ç$Ç(¥(¥e…¥¥$Ç$Ç)K)K,Æ,Æ$¥$¥ † † … e „ „ … e…e¥¥dd … e¥¥ e … ¥ ¥ e …$¥$¥(¥(¥$¥$¥ e … † †¥¥ e … ¥ ¥dd † †$¥$¥(¥(¥ † †0Æ0Æ-*1*,é,é(¥(¥(¥(¥dd … edddddd„„dddddcdddd¥¥dd¥¥ † †(¥(¥,é,é1L1L ç ç$Ç$Ç § §,Æ,Æ,é,é55,é,é,Æ,Æ,Æ,Æe…¥¥ e …) -) -) -) -(¥(¥ † †$¥$¥ e …¥¥ e …dd¥¥dd¥¥ † †dd$¥$¥$¥$¥ † †(¥(¥ † †$¥$¥dd¥¥ e … „ „¥¥ † † † †(¥(¥,¥,¥,é,é1L1L(¥(¥(¥(¥ † †,¥,¥ † † † †(¥(¥ d „dddd ¥ ¥dddddd¥¥dd „ „¥¥(¥(¥$Ç$Ç-*1*) -) -(ç(ç § §(ç(ç$Ç$Ç55,é,é0ç0ç$Ç$Ç(¥(¥e…¥¥$Ç$Ç)K)K,Æ,Æ$¥$¥ † † … e „ „ … e…e¥¥dd … e¥¥ e … ¥ ¥ e …$¥$¥(¥(¥$¥$¥ e … † †¥¥ e … ¥ ¥dd † †$¥$¥(¥(¥ † †0Æ0Æ-*1*,é,é(¥(¥(¥(¥dd … e § § § § ç ç ç 祥 † † ç ç Æ Æ ç ç § §f† § § § § § §)K)K-*1*e…dd„d C C ddf†f†„„ § §!!)K)K) -) -11)K)K § § § §ÆÆ § § § §f†f†¥¥ e …f†f† ç ç § § § § § § † † † † § § § § e …$¥$¥e…f† § §$Ç$Ç,é,é$Ç$Ç,é,é5m5m1*-*,é,é11) -) -$Ç$Ç$Ç$Ç † ††f¥¥f†d„d„d„d„ † ††f § § Æ Æ § §$Ç$Ç1Ž1 ç çddd„d„dde…f†e…f†%%)K)K!!!!1L1L § § § § § § § §ÆÆ § §e… e …¥¥f†e… § § § § § § § § † † § § † † § §$¥$¥e…¥¥ e … Æ Æ § §$Ç$Ç,é,é,Æ,Æ1L1L1L1L,é,é,é,é,é,é%% § § § § ç ç ç 祥 † † ç ç Æ Æ ç ç § §f† § § § § § §)K)K-*1*e…dd„d C C ddf†f†„„ § §!!)K)K) -) -11)K)K § § § §ÆÆ § § § §f†f†¥¥ e …f†f† ç ç § § § § § § † † † † § § § § e …$¥$¥e…f† § §$Ç$Ç,é,é$Ç$Ç,é,é5m5m1*-*,é,é11) -) -$Ç$Ç$Ç$Ç † ††f¥¥f†d„d„d„d„ † ††f § § Æ Æ § §$Ç$Ç1Ž1 ç çddd„d„dde…f†e…f†%%)K)K!!!!1L1L § § § § § § § §ÆÆ § §e… e …¥¥f†e… § § § § § § § § † † § § † † § §$¥$¥e…¥¥ e … Æ Æ § §$Ç$Ç,é,é,Æ,Æ1L1L1L1L,é,é,é,é,é,é%%559k5k559k5k1L1LAðAð551)1)1L1L-)-))K)K-*1*-*1*1Œ1Œ1L1L5k5k1*-*)K)K-*1*-*1*)K)K1L1L551Œ1Œ=¯A°=ÏA°5559Ž=Œ=Œ=Œ=Œ555Ž955595k5kIðEðA¯=°1Œ1Œ111Œ1Œ55AðAð55955n5m95559k5k1Œ1Œ=Ž=ŽAòAñ=ð=ð55=Ž=Ž=¯A°=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž55=Ž=Ž551L1L5m5m11-*1*) -) -1*-*)K)K) -) -1L1L1Œ1Œ-*1*-*1*-l-l1L1L5k5k1L1L-*1*)K)K1L1L1)1)-l-l559n5m5Œ5ŒAðAð=Ž=Ž=Œ=Œ=Ž=Ž=Ž=Ž559Ž5559Ž55595AòAñ5Œ5Œ11551L1L=ï=ïAðAð1Œ1Œ55955Ž5951L1L55AðAðAòAñ55=Ž=ŽAðAð=¯A°=Ž=Ž=Ž=Ž=Ž=Ž=¯A°9Œ=Œ=Ž=Ž55=Ž=Ž595k5k595k5k1L1LAðAð551)1)1L1L-)-))K)K-*1*-*1*1Œ1Œ1L1L5k5k1*-*)K)K-*1*-*1*)K)K1L1L551Œ1Œ=¯A°=ÏA°5559Ž=Œ=Œ=Œ=Œ555Ž955595k5kIðEðA¯=°1Œ1Œ111Œ1Œ55AðAð55955n5m95559k5k1Œ1Œ=Ž=ŽAòAñ=ð=ð55=Ž=Ž=¯A°=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž55=Ž=Ž551L1L5m5m11-*1*) -) -1*-*)K)K) -) -1L1L1Œ1Œ-*1*-*1*-l-l1L1L5k5k1L1L-*1*)K)K1L1L1)1)-l-l559n5m5Œ5ŒAðAð=Ž=Ž=Œ=Œ=Ž=Ž=Ž=Ž559Ž5559Ž55595AòAñ5Œ5Œ11551L1L=ï=ïAðAð1Œ1Œ55955Ž5951L1L55AðAðAòAñ55=Ž=ŽAðAð=¯A°=Ž=Ž=Ž=Ž=Ž=Ž=¯A°9Œ=Œ=Ž=Ž55=Ž=Ž(ç(ç(¥(¥,Æ,Æ,¥,¥,Æ,ÆAðAð)J)J e …$¥$¥$„$„ † † … e ¥ ¥$¥$¥$¥$¥(¥(¥$Æ$Æ § §$Æ$Æ § §(¥(¥$Æ$Æ$Æ$Æ$Ç$Ç,Æ,Æ$Æ$Æ(¥(¥ † †$¥$¥(¥(¥$¥$¥$¥$¥(¥(¥,Æ,Æ(¥(¥5k5kIðIð) -) -(¥(¥ § §(¥(¥ § § ¥ ¥(¥(¥$¥$¥$¥$¥$Æ$Æ(¥(¥,¥,¥,é,éAðAð5)5)11,ç,ç(ç(ç,ç,ç,ç,ç,Æ,Æ(ç(ç(¥(¥ § §(ç(ç(¥(¥$Ç$Ç(ç(ç(¥(¥55=Ž=Ž(¥(¥ † †$¥$¥(¥(¥(¥(¥ † †$¥$¥ e … ¥ ¥(¥(¥(¥(¥ † †(¥(¥ § §,Æ,Æ § §(¥(¥ § §(¥(¥(ç(ç(ç(ç$Æ$Æ(¥(¥ † †(¥(¥ † †$¥$¥$¥$¥(¥(¥,¥,¥(ç(ç0ç0çAïAï1L1L,Æ,Æ § §(¥(¥ § § ¥ ¥(¥(¥$¥$¥$¥$¥ † †(¥(¥,Æ,Æ,Æ,Æ5m5m=Ž=Ž11(ç(ç$Ç$Ç,Æ,Æ11,Æ,Æ$Ç$Ç(¥(¥$Æ$Æ$Æ$Æ(¥(¥,Æ,Æ(ç(ç(¥(¥,Æ,Æ,¥,¥,Æ,ÆAðAð)J)J e …$¥$¥$„$„ † † … e ¥ ¥$¥$¥$¥$¥(¥(¥$Æ$Æ § §$Æ$Æ § §(¥(¥$Æ$Æ$Æ$Æ$Ç$Ç,Æ,Æ$Æ$Æ(¥(¥ † †$¥$¥(¥(¥$¥$¥$¥$¥(¥(¥,Æ,Æ(¥(¥5k5kIðIð) -) -(¥(¥ § §(¥(¥ § § ¥ ¥(¥(¥$¥$¥$¥$¥$Æ$Æ(¥(¥,¥,¥,é,éAðAð5)5)11,ç,ç(ç(ç,ç,ç,ç,ç,Æ,Æ(ç(ç(¥(¥ § §(ç(ç(¥(¥$Ç$Ç(ç(ç(¥(¥55=Ž=Ž(¥(¥ † †$¥$¥(¥(¥(¥(¥ † †$¥$¥ e … ¥ ¥(¥(¥(¥(¥ † †(¥(¥ § §,Æ,Æ § §(¥(¥ § §(¥(¥(ç(ç(ç(ç$Æ$Æ(¥(¥ † †(¥(¥ † †$¥$¥$¥$¥(¥(¥,¥,¥(ç(ç0ç0çAïAï1L1L,Æ,Æ § §(¥(¥ § § ¥ ¥(¥(¥$¥$¥$¥$¥ † †(¥(¥,Æ,Æ,Æ,Æ5m5m=Ž=Ž11(ç(ç$Ç$Ç,Æ,Æ11,Æ,Æ$Ç$Ç(¥(¥$Æ$Æ$Æ$Æ(¥(¥,Æ,Æ(¥(¥(¥(¥,¥,¥ § §,Æ,Æ5m5m11$¥$¥ † †$„$„$„$„$¥$¥(¥(¥(¥(¥ † †$„$„ † †(¥(¥(¥(¥ † †$Æ$Æ,¥,¥$Ç$Ç(¥(¥ § §(¥(¥ † †(¥(¥ e … ¥ ¥$„$„ § §,¥,¥,Æ,Æ,Æ,Æ5J5JAðAð11 § §$¥$¥(¥(¥(¥(¥$¥$¥ § §(¥(¥(¥(¥ † †,¥,¥$Ç$Ç4ç4ç95$Ç$Ç(¥(¥(¥(¥,Æ,Æ † †(¥(¥,Æ,Æ † †$Æ$Æ(¥(¥ † † § § Æ Æ(¥(¥(¥(¥559m5m † †$„$d$„$„ † †$„$„(¥(¥$„$„ † †$„$„(¥(¥ † †(¥(¥ † †$¥$¥(¥(¥$¥$¥ † †$Æ$Æ,¥,¥ † †,Æ,Æ § §(¥(¥$¥$¥ † †$¥$¥$„$„$¥$¥(¥(¥,Æ,Æ,Æ,Æ0ç0çAðAð55(¥(¥ § §$„$„ § §(¥(¥(¥(¥ § §$„$„ § §(¥(¥,¥,¥,¥,¥551*-*$¥$¥,¥,¥(¥(¥,¥,¥ † †,Æ,Æ(¥(¥ † †$Æ$Æ § §(¥(¥,¥,¥(¥(¥(¥(¥,¥,¥ § §,Æ,Æ5m5m11$¥$¥ † †$„$„$„$„$¥$¥(¥(¥(¥(¥ † †$„$„ † †(¥(¥(¥(¥ † †$Æ$Æ,¥,¥$Ç$Ç(¥(¥ § §(¥(¥ † †(¥(¥ e … ¥ ¥$„$„ § §,¥,¥,Æ,Æ,Æ,Æ5J5JAðAð11 § §$¥$¥(¥(¥(¥(¥$¥$¥ § §(¥(¥(¥(¥ † †,¥,¥$Ç$Ç4ç4ç95$Ç$Ç(¥(¥(¥(¥,Æ,Æ † †(¥(¥,Æ,Æ † †$Æ$Æ(¥(¥ † † § § Æ Æ(¥(¥(¥(¥559m5m † †$„$d$„$„ † †$„$„(¥(¥$„$„ † †$„$„(¥(¥ † †(¥(¥ † †$¥$¥(¥(¥$¥$¥ † †$Æ$Æ,¥,¥ † †,Æ,Æ § §(¥(¥$¥$¥ † †$¥$¥$„$„$¥$¥(¥(¥,Æ,Æ,Æ,Æ0ç0çAðAð55(¥(¥ § §$„$„ § §(¥(¥(¥(¥ § §$„$„ § §(¥(¥,¥,¥,¥,¥551*-*$¥$¥,¥,¥(¥(¥,¥,¥ † †,Æ,Æ(¥(¥ † †$Æ$Æ § §(¥(¥,¥,¥(¥(¥,Æ,Æ † †(¥(¥,¥,¥-*1*%%$„$„(¥(¥ d „(¥(¥$d$„(¥(¥ † †$„$„(¥(¥(¥(¥ † †$„$„(¥(¥ † †(¥(¥(¥(¥(¥(¥(¥(¥,Æ,Æ(¥(¥ † †$¥$¥(¥(¥(¥(¥,¥,¥0ç0ç,Å,Å(¥(¥5k5kA¯=°$Ç$Ç(¥(¥ § §$„$„ † †(¥(¥ † †(¥(¥ † †(¥(¥ § §$d$„0ç0çAòAñ(ç(ç,¥,¥(¥(¥,¥,¥ § §(¥(¥,¥,¥,Æ,Æ § §(¥(¥ † †$Æ$Æ(¥(¥ † †,¥,¥-*1*-l-l(¥(¥$d$„ e …$„$„ † †$ƒ$d(¥(¥(¥(¥$„$„ † †$„$„(¥(¥$„$„$¥$¥ † †$„$„$¥$¥ † †(¥(¥,¥,¥$Æ$Æ,¥,¥(¥(¥$¥$¥ † †(¥(¥(¥(¥(¥(¥,Æ,Æ,Å,Å(¥(¥11AðAð-*1*(¥(¥ § §(¥(¥ † †$¥$¥(¥(¥ † †(¥(¥ † †(¥(¥ § §,¥,¥=Œ=Œ1L1L,¥,¥,¥,¥,Æ,Æ § §(¥(¥,¥,¥$Æ$Æ(¥(¥,¥,¥ § §(¥(¥ § §(¥(¥,Æ,Æ † †(¥(¥,¥,¥-*1*%%$„$„(¥(¥ d „(¥(¥$d$„(¥(¥ † †$„$„(¥(¥(¥(¥ † †$„$„(¥(¥ † †(¥(¥(¥(¥(¥(¥(¥(¥,Æ,Æ(¥(¥ † †$¥$¥(¥(¥(¥(¥,¥,¥0ç0ç,Å,Å(¥(¥5k5kA¯=°$Ç$Ç(¥(¥ § §$„$„ † †(¥(¥ † †(¥(¥ † †(¥(¥ § §$d$„0ç0çAòAñ(ç(ç,¥,¥(¥(¥,¥,¥ § §(¥(¥,¥,¥,Æ,Æ § §(¥(¥ † †$Æ$Æ(¥(¥ † †,¥,¥-*1*-l-l(¥(¥$d$„ e …$„$„ † †$ƒ$d(¥(¥(¥(¥$„$„ † †$„$„(¥(¥$„$„$¥$¥ † †$„$„$¥$¥ † †(¥(¥,¥,¥$Æ$Æ,¥,¥(¥(¥$¥$¥ † †(¥(¥(¥(¥(¥(¥,Æ,Æ,Å,Å(¥(¥11AðAð-*1*(¥(¥ § §(¥(¥ † †$¥$¥(¥(¥ † †(¥(¥ † †(¥(¥ § §,¥,¥=Œ=Œ1L1L,¥,¥,¥,¥,Æ,Æ § §(¥(¥,¥,¥$Æ$Æ(¥(¥,¥,¥ § §(¥(¥ § §(¥(¥$¥$¥ § §(¥(¥ † †-*1*,é,é † †$„$„$„$„$„$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥ e …$¥$¥$„$„ † †$„$„(¥(¥(¥(¥(¥(¥,Æ,Æ(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥,Å,Å0ç0ç,Å,Å,Æ,Æ,Å,Å55A°=¯$Ç$Ç(¥(¥ † †$¥$¥ † †(¥(¥ † † ¥ ¥$„$„ † †(¥(¥(¥(¥,ç,ç=¯A°,è,é,¥,¥,¥,¥(¥(¥,¥,¥,Æ,Æ,¥,¥(¥(¥,¥,¥ § §(¥(¥ † †$Æ$Æ § § § §--5m5m(¥(¥ d „ d „$d$„$¥$¥$„$„$„$d(¥(¥(¥(¥(¥(¥(¥(¥ † †$„$„(¥(¥ e …(¥(¥ † †(¥(¥(¥(¥(¥(¥,¥,¥,Æ,Æ(¥(¥(¥(¥(¥(¥(¥(¥,Å,Å0ç0ç,¥,¥0ç0ç,Å,Å11=ð=ð-*1*$¥$¥$¥$¥ † †$„$„ † †(¥(¥ † †$¥$¥ † †$¥$¥(¥(¥(¥(¥=Œ=Œ1L1L,¥,¥,¥,¥(¥(¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥ § §(¥(¥ † †(¥(¥(¥(¥$¥$¥ § §(¥(¥ † †-*1*,é,é † †$„$„$„$„$„$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥ e …$¥$¥$„$„ † †$„$„(¥(¥(¥(¥(¥(¥,Æ,Æ(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥,Å,Å0ç0ç,Å,Å,Æ,Æ,Å,Å55A°=¯$Ç$Ç(¥(¥ † †$¥$¥ † †(¥(¥ † † ¥ ¥$„$„ † †(¥(¥(¥(¥,ç,ç=¯A°,è,é,¥,¥,¥,¥(¥(¥,¥,¥,Æ,Æ,¥,¥(¥(¥,¥,¥ § §(¥(¥ † †$Æ$Æ § § § §--5m5m(¥(¥ d „ d „$d$„$¥$¥$„$„$„$d(¥(¥(¥(¥(¥(¥(¥(¥ † †$„$„(¥(¥ e …(¥(¥ † †(¥(¥(¥(¥(¥(¥,¥,¥,Æ,Æ(¥(¥(¥(¥(¥(¥(¥(¥,Å,Å0ç0ç,¥,¥0ç0ç,Å,Å11=ð=ð-*1*$¥$¥$¥$¥ † †$„$„ † †(¥(¥ † †$¥$¥ † †$¥$¥(¥(¥(¥(¥=Œ=Œ1L1L,¥,¥,¥,¥(¥(¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥ § §(¥(¥ † †(¥(¥$¥$¥(¥(¥ † †(¥(¥,¥,¥) -) -11$„$„$„$d$„$„(¥(¥(¥(¥$d$„(¥(¥(¥(¥$d$„$„$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥,Æ,Æ,Æ,Æ(¥(¥,Æ,Æ,¥,¥,Æ,Æ,¥,¥,Æ,Æ,Æ,Æ0ç0ç,Å,Å5J5J=ð=ð,é,é$¥$¥$¥$¥ † †(¥(¥ e …$¥$¥ † †$¥$¥ † †(¥(¥ § §0Æ0Æ550ç0ç,Å,Å0Æ0Æ,¥,¥(¥(¥(¥(¥,¥,¥,Æ,Æ(¥(¥(¥(¥ † †$Æ$Æ,¥,¥ § §(¥(¥-*1*55$„$„ „ d „ d$„$d$„$„$„$d$„$d(¥(¥(¥(¥(¥(¥$d$„(¥(¥$„$„(¥(¥$„$„(¥(¥(¥(¥(¥(¥$d$„,¥,¥0Æ0Æ,Å,Å,Æ,Æ(¥(¥,Æ,Æ,¥,¥,Æ,Æ,¥,¥0ç0ç,Å,Å,Æ,Æ11551Œ1Œ(¥(¥ † †(¥(¥ † †$¥$¥ e …$¥$¥ † †$¥$¥ † †(¥(¥(¥(¥5k5k1L1L,¥,¥,Å,Å,¥,¥,¥,¥,Æ,Æ(¥(¥,¥,¥,Æ,Æ(¥(¥ § §(¥(¥ † †$¥$¥(¥(¥ † †(¥(¥,¥,¥) -) -11$„$„$„$d$„$„(¥(¥(¥(¥$d$„(¥(¥(¥(¥$d$„$„$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥,Æ,Æ,Æ,Æ(¥(¥,Æ,Æ,¥,¥,Æ,Æ,¥,¥,Æ,Æ,Æ,Æ0ç0ç,Å,Å5J5J=ð=ð,é,é$¥$¥$¥$¥ † †(¥(¥ e …$¥$¥ † †$¥$¥ † †(¥(¥ § §0Æ0Æ550ç0ç,Å,Å0Æ0Æ,¥,¥(¥(¥(¥(¥,¥,¥,Æ,Æ(¥(¥(¥(¥ † †$Æ$Æ,¥,¥ § §(¥(¥-*1*55$„$„ „ d „ d$„$d$„$„$„$d$„$d(¥(¥(¥(¥(¥(¥$d$„(¥(¥$„$„(¥(¥$„$„(¥(¥(¥(¥(¥(¥$d$„,¥,¥0Æ0Æ,Å,Å,Æ,Æ(¥(¥,Æ,Æ,¥,¥,Æ,Æ,¥,¥0ç0ç,Å,Å,Æ,Æ11551Œ1Œ(¥(¥ † †(¥(¥ † †$¥$¥ e …$¥$¥ † †$¥$¥ † †(¥(¥(¥(¥5k5k1L1L,¥,¥,Å,Å,¥,¥,¥,¥,Æ,Æ(¥(¥,¥,¥,Æ,Æ(¥(¥ § §(¥(¥ † † † †$„$„(¥(¥(¥(¥,é,é55%% e … e … e …$d$„$¥$¥(¥(¥$„$„(¥(¥(¥(¥ e … e …$¥$¥$d$„(¥(¥(¥(¥,¥,¥,¥,¥0Æ0Æ(¥(¥(¥(¥,Æ,Æ(¥(¥,Æ,Æ(¥(¥0ç0ç(Å(Å(¥(¥,¥,¥-)-)AðAð)) † †(¥(¥ † † … e$¥$¥ † † … e(¥(¥$¥$¥ † †(¥(¥$¥$¥1L1L,é,é,¥,¥,¥,¥,¥,¥,Æ,Æ,¥,¥,¥,¥,Æ,Æ0Æ0Æ(¥(¥(¥(¥(¥(¥ † †(¥(¥ e …--55(¥(¥ c d d „ d „$d$„$„$„ ¥ ¥$„$„(¥(¥(¥(¥$„$„(¥(¥ d „$„$„ † †$„$„(¥(¥(¥(¥,¥,¥,¥,¥,Å,Å,Å,Å(¥(¥(¥(¥,Æ,Æ(¥(¥,Æ,Æ,Å,Å,Æ,Æ,Å,Å(¥(¥(ç(ç559n5m$d$„ § §$„$„ † †$¥$¥ † † † † ¥ ¥$„$„ § §(¥(¥ e …-*1*-*1*,¥,¥,¥,¥,Æ,Æ,¥,¥,¥,¥,¥,¥,Æ,Æ,¥,¥,Æ,Æ$¥$¥ e …$d$„ † †$„$„(¥(¥(¥(¥,é,é55%% e … e … e …$d$„$¥$¥(¥(¥$„$„(¥(¥(¥(¥ e … e …$¥$¥$d$„(¥(¥(¥(¥,¥,¥,¥,¥0Æ0Æ(¥(¥(¥(¥,Æ,Æ(¥(¥,Æ,Æ(¥(¥0ç0ç(Å(Å(¥(¥,¥,¥-)-)AðAð)) † †(¥(¥ † † … e$¥$¥ † † … e(¥(¥$¥$¥ † †(¥(¥$¥$¥1L1L,é,é,¥,¥,¥,¥,¥,¥,Æ,Æ,¥,¥,¥,¥,Æ,Æ0Æ0Æ(¥(¥(¥(¥(¥(¥ † †(¥(¥ e …--55(¥(¥ c d d „ d „$d$„$„$„ ¥ ¥$„$„(¥(¥(¥(¥$„$„(¥(¥ d „$„$„ † †$„$„(¥(¥(¥(¥,¥,¥,¥,¥,Å,Å,Å,Å(¥(¥(¥(¥,Æ,Æ(¥(¥,Æ,Æ,Å,Å,Æ,Æ,Å,Å(¥(¥(ç(ç559n5m$d$„ § §$„$„ † †$¥$¥ † † † † ¥ ¥$„$„ § §(¥(¥ e …-*1*-*1*,¥,¥,¥,¥,Æ,Æ,¥,¥,¥,¥,¥,¥,Æ,Æ,¥,¥,Æ,Æ$¥$¥ e …$d$„ † †$Ç$Ç$Ç$Ç$Ç$Ç-*1*1L1L1L1L § § § § † † § § † † § § § §%%$Ç$Ç$Ç$Ç))$Ç$Ç%%,é,é$Ç$Ç,é,é)) § §)) § §$Ç$Ç$Ç$Ç$Ç$Ç,é,é-)-)-*1*5J5J5m5m9n5m1Œ1Œ-*1* † † § § § §$Ç$Ç!!!!$Ç$Ç!!$Ç$Ç!!1L1L5m5m95-*1*$Ç$Ç$Ç$Ç$Ç$Ç$Ç$Ç%%$Ç$Ç,é,é%%) -) -) -) -1*-*) -) -1*-*1*-*9Ž5AòAñ11,é,é,é,é%% § § § § † † § § § § § §$Ç$Ç!!$Ç$Ç$Ç$Ç%%$Ç$Ç,é,é%%,é,é,é,é ç ç$Ç$Ç § §$Ç$Ç$Ç$Ç$Ç$Ç)),é,é) -) -1*-*9k5k=Ž=Ž1Œ1Œ5m5m § § § §$Ç$Ç § § ç ç!! § §$Ç$Ç!!$Ç$Ç) -) -9m5m5595$Ç$Ç$Ç$Ç$Ç$Ç$Ç$Ç$Ç$Ç) -) -$Ç$Ç) -) -,é,é) -) -) -) -%% † †$Ç$Ç$Ç$Ç$Ç$Ç-*1*1L1L1L1L § § § § † † § § † † § § § §%%$Ç$Ç$Ç$Ç))$Ç$Ç%%,é,é$Ç$Ç,é,é)) § §)) § §$Ç$Ç$Ç$Ç$Ç$Ç,é,é-)-)-*1*5J5J5m5m9n5m1Œ1Œ-*1* † † § § § §$Ç$Ç!!!!$Ç$Ç!!$Ç$Ç!!1L1L5m5m95-*1*$Ç$Ç$Ç$Ç$Ç$Ç$Ç$Ç%%$Ç$Ç,é,é%%) -) -) -) -1*-*) -) -1*-*1*-*9Ž5AòAñ11,é,é,é,é%% § § § § † † § § § § § §$Ç$Ç!!$Ç$Ç$Ç$Ç%%$Ç$Ç,é,é%%,é,é,é,é ç ç$Ç$Ç § §$Ç$Ç$Ç$Ç$Ç$Ç)),é,é) -) -1*-*9k5k=Ž=Ž1Œ1Œ5m5m § § § §$Ç$Ç § § ç ç!! § §$Ç$Ç!!$Ç$Ç) -) -9m5m5595$Ç$Ç$Ç$Ç$Ç$Ç$Ç$Ç$Ç$Ç) -) -$Ç$Ç) -) -,é,é) -) -) -) -%%55AðAð=ð=ð=¯A°=ÏA°AðAð=Ž=Ž5595=ï=ï55=ï=ï5595559n5m1L1L551L1L551Œ1Œ1L1L5595551Œ1Œ=¯A°=ð=ðAðAð55=ï=ï=ï=ïAðAð=¯A°FJEïIïAðAð=Ž=ŽAðAðAðAðAðAðAðAð=¯A°AñAòAñAòAðAð=¯A°=Ž=ŽEðIðNSN3AðAð=¯A°=ï=ï=Ž=ŽAðAðAðAðAòAñAðAð=ï=ïAòAñAðAðJSF3NSN3JSF3IðEðNSN3NSN3NSN3AïAïAðAð55=ï=ï5595=ï=ï55955Œ5Œ955m5m1Œ1Œ5m5m1L1L551Œ1Œ1L1L1L1L5Œ5Œ9555=ï=ïAðAð=¯A°=ÏA°9î=ï55AïAïAïAïIðEðJFIðEðAðAð55=ï=ïAðAðAðAð=¯A°AñAòIðEðAòAñAòAñ55AïAïJFIðEðAïAïAðAð55AðAðAðAðAðAð=ð=ðAðAðAðAð=ï=ïJSF3NSN3AðAð59AðAð=ð=ð=¯A°=ÏA°AðAð=Ž=Ž5595=ï=ï55=ï=ï5595559n5m1L1L551L1L551Œ1Œ1L1L5595551Œ1Œ=¯A°=ð=ðAðAð55=ï=ï=ï=ïAðAð=¯A°FJEïIïAðAð=Ž=ŽAðAðAðAðAðAðAðAð=¯A°AñAòAñAòAðAð=¯A°=Ž=ŽEðIðNSN3AðAð=¯A°=ï=ï=Ž=ŽAðAðAðAðAòAñAðAð=ï=ïAòAñAðAðJSF3NSN3JSF3IðEðNSN3NSN3NSN3AïAïAðAð55=ï=ï5595=ï=ï55955Œ5Œ955m5m1Œ1Œ5m5m1L1L551Œ1Œ1L1L1L1L5Œ5Œ9555=ï=ïAðAð=¯A°=ÏA°9î=ï55AïAïAïAïIðEðJFIðEðAðAð55=ï=ïAðAðAðAð=¯A°AñAòIðEðAòAñAòAñ55AïAïJFIðEðAïAïAðAð55AðAðAðAðAðAð=ð=ðAðAðAðAð=ï=ïJSF3NSN3AðAð$¥$¥ ¥ ¥$¥$¥$¥$¥ † †$¥$¥¥¥(¥(¥¥¥$Æ$Æ(ç(ç1L1L ¥ ¥$d$„$„$„$¥$¥$„$„ ¥ ¥$d$„$¥$¥ e …$„$„ ¥ ¥,Å,Å(ç(ç,é,é ç ç$Æ$Æ$Ç$Ç § § Æ Æ$¥$¥ § § Æ Æ(¥(¥$Ç$Ç,ç,ç$ç$ç(ç(ç$Æ$Æ(ç(ç,Æ,Æ$Ç$Ç(ç(ç(¥(¥$Æ$Æ § §(¥(¥$Æ$Æ † † Æ Æ$Æ$Æ,Æ,Æ,Æ,Æ-*1*) -) - Æ Æ„„¥¥¥¥ † † Æ Ædd Æ Æ ¥ ¥ ¥ ¥ ¥ ¥(¥(¥ § §$¥$¥¥¥(¥(¥$¥$¥$¥$¥ § §1)1))) e …$„$„$¥$¥$¥$¥$d$„$¥$¥$d$„$¥$¥$d$„ ¥ ¥(¥(¥11$Ç$Ç)) § § ç ç § § Æ Æ Æ Æ § § Æ Æ(¥(¥$Ç$Ç(ç(ç(ç(ç(ç(ç(ç(ç$Æ$Æ(ç(ç,Æ,Æ$Ç$Ç(ç(ç(¥(¥ § §(¥(¥(ç(ç † † Æ Æ(¥(¥ § §(ç(ç11-*1* ç ç e …¥¥¥¥¥¥ † †¥¥$¥$¥$¥$¥ ¥ ¥$¥$¥$¥$¥ † †$¥$¥¥¥(¥(¥¥¥$Æ$Æ(ç(ç1L1L ¥ ¥$d$„$„$„$¥$¥$„$„ ¥ ¥$d$„$¥$¥ e …$„$„ ¥ ¥,Å,Å(ç(ç,é,é ç ç$Æ$Æ$Ç$Ç § § Æ Æ$¥$¥ § § Æ Æ(¥(¥$Ç$Ç,ç,ç$ç$ç(ç(ç$Æ$Æ(ç(ç,Æ,Æ$Ç$Ç(ç(ç(¥(¥$Æ$Æ § §(¥(¥$Æ$Æ † † Æ Æ$Æ$Æ,Æ,Æ,Æ,Æ-*1*) -) - Æ Æ„„¥¥¥¥ † † Æ Ædd Æ Æ ¥ ¥ ¥ ¥ ¥ ¥(¥(¥ § §$¥$¥¥¥(¥(¥$¥$¥$¥$¥ § §1)1))) e …$„$„$¥$¥$¥$¥$d$„$¥$¥$d$„$¥$¥$d$„ ¥ ¥(¥(¥11$Ç$Ç)) § § ç ç § § Æ Æ Æ Æ § § Æ Æ(¥(¥$Ç$Ç(ç(ç(ç(ç(ç(ç(ç(ç$Æ$Æ(ç(ç,Æ,Æ$Ç$Ç(ç(ç(¥(¥ § §(¥(¥(ç(ç † † Æ Æ(¥(¥ § §(ç(ç11-*1* ç ç e …¥¥¥¥¥¥ † †¥¥$¥$¥ e …$d$„dƒ e …c„ e …c„ e …$d$„dƒ,Æ,Æ-*1*$d$„$d$„$„$„ƒd$„$d „ c$„$d„c„c$„$d„c ¥ ¥,¤,¤5J5J † † † †ƒddddddd ¥ ¥ e … ¥ ¥ e …$d$„ ¥ ¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$d$„(¥(¥$¥$¥(¥(¥ † †$„$„ … e¥¥ † † † †(¥(¥55$Ç$Çdd$¥$¥e…dd$¥$¥e… ¥ ¥$c$„$d$„ d „ d „ d „ d „dƒdd„cdd … e$¥$¥11 § §$„$„$„$d$„$d„c$„$d „ c$„$ddc$„$d„c$„$d$„$„--) -) -c„ ¥ ¥ d „dd„c … e ¥ ¥ e …$„$„dd(¥(¥ † †(¥(¥(¥(¥(¥(¥(¥(¥$d$„(¥(¥ † †$¥$¥$¥$¥ e … ¥ ¥ e … ¥ ¥$¥$¥ e …5I5I1*-* e … „ „ … edd¥¥ d „ e …dd … e$„$d„c … eƒd … eƒd … e$„$d„c,Æ,Æ-*1*$d$„$d$„$„$„ƒd$„$d „ c$„$d„c„c$„$d„c ¥ ¥,¤,¤5J5J † † † †ƒddddddd ¥ ¥ e … ¥ ¥ e …$d$„ ¥ ¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$d$„(¥(¥$¥$¥(¥(¥ † †$„$„ … e¥¥ † † † †(¥(¥55$Ç$Çdd$¥$¥e…dd$¥$¥e… ¥ ¥$c$„$d$„ d „ d „ d „ d „dƒdd„cdd … e$¥$¥11 § §$„$„$„$d$„$d„c$„$d „ c$„$ddc$„$d„c$„$d$„$„--) -) -c„ ¥ ¥ d „dd„c … e ¥ ¥ e …$„$„dd(¥(¥ † †(¥(¥(¥(¥(¥(¥(¥(¥$d$„(¥(¥ † †$¥$¥$¥$¥ e … ¥ ¥ e … ¥ ¥$¥$¥ e …5I5I1*-* e … „ „ … edd¥¥ d „ e …dd$d$„dƒ e …$d$„$d$„dƒ$d$„dƒ d ƒ$d$„$Æ$Æ11dd$„$„$„$d$„$„$„$d „ ƒ$„$d„c$„$„ƒd … e ƒ d$„$„-*1*$¥$¥dd ¥ ¥dd ¥ ¥dd ¥ ¥ e …$d$„ ¥ ¥$¥$¥$„$„ † †$„$„ † †,¥,¥(¥(¥(¥(¥$¥$¥ † † † † … e(¥(¥¥¥dd$¥$¥ e …(¥(¥55,é,édd ¥ ¥dd¥¥dd † †$„$d „ d „ d„c „ d$„$d$„$d„c$„$d„c$„$d„c$„$„-*1* § § c „$„$„$„$d „ c$„$„$„$„ƒd „ „„c$„$„cd$„$„--))dd … eƒd$¥$¥dddd ¥ ¥ e … ¥ ¥$¥$¥$„$„ † †$„$„ † †(¥(¥,¥,¥,¥,¥$¥$¥ † †$„$„$¥$¥ † † ¥ ¥dd$¥$¥e…(¥(¥1)1)1L1L$¥$¥ e …dd¥¥ † †$„$d „ d„c$„$d„c … e$„$d$„$d„c$„$d„c „ c$„$d$Æ$Æ11dd$„$„$„$d$„$„$„$d „ ƒ$„$d„c$„$„ƒd … e ƒ d$„$„-*1*$¥$¥dd ¥ ¥dd ¥ ¥dd ¥ ¥ e …$d$„ ¥ ¥$¥$¥$„$„ † †$„$„ † †,¥,¥(¥(¥(¥(¥$¥$¥ † † † † … e(¥(¥¥¥dd$¥$¥ e …(¥(¥55,é,édd ¥ ¥dd¥¥dd † †$„$d „ d „ d„c „ d$„$d$„$d„c$„$d„c$„$d„c$„$„-*1* § § c „$„$„$„$d „ c$„$„$„$„ƒd „ „„c$„$„cd$„$„--))dd … eƒd$¥$¥dddd ¥ ¥ e … ¥ ¥$¥$¥$„$„ † †$„$„ † †(¥(¥,¥,¥,¥,¥$¥$¥ † †$„$„$¥$¥ † † ¥ ¥dd$¥$¥e…(¥(¥1)1)1L1L$¥$¥ e …dd¥¥ † †$„$d „ d„c$d$„$d$„dƒ d ƒ d ƒ d ƒdƒ$d$ƒ d ƒ$d$„(ç(ç-*1*dd$„$„$„$„ƒd$„$„$„$„$„$d „ „„c$„$d „ „$„$d$„$„-*1*¥¥dd „ „dddddd „ „dd ¥ ¥$d$„ ¥ ¥(¥(¥ † †$„$„(¥(¥$d$„(¥(¥ † †(¥(¥dd … e$„$„ „ „ … edd$¥$¥$¥$¥(¥(¥5m5m$ç$çdddd „ „ … e … edddd„c„c$„$d „ d„c$„$d„c „ c$„$d „ c$„$d$„$„-*1* § §$„$„$„$d$„$„$„$„$„$d „ ƒ$„$d„c$„$d„c ¥ ¥$d$„11$Ç$Çdd „ „dddd„„dd „ „dd ¥ ¥$„$„ § §$„$„ † †$„$d(¥(¥$„$„ † †(¥(¥ e …dd$¥$¥ d „ e … „ „dd(¥(¥(¥(¥11-l-ldddd „ „ … edd„c„c … e$„$d$„$d„c „ c „ c „ c„c$„$c „ c$„$d(ç(ç-*1*dd$„$„$„$„ƒd$„$„$„$„$„$d „ „„c$„$d „ „$„$d$„$„-*1*¥¥dd „ „dddddd „ „dd ¥ ¥$d$„ ¥ ¥(¥(¥ † †$„$„(¥(¥$d$„(¥(¥ † †(¥(¥dd … e$„$„ „ „ … edd$¥$¥$¥$¥(¥(¥5m5m$ç$çdddd „ „ … e … edddd„c„c$„$d „ d„c$„$d„c „ c$„$d „ c$„$d$„$„-*1* § §$„$„$„$d$„$„$„$„$„$d „ ƒ$„$d„c$„$d„c ¥ ¥$d$„11$Ç$Çdd „ „dddd„„dd „ „dd ¥ ¥$„$„ § §$„$„ † †$„$d(¥(¥$„$„ † †(¥(¥ e …dd$¥$¥ d „ e … „ „dd(¥(¥(¥(¥11-l-ldddd „ „ … edd„c„c … e$d$„dƒ d ƒ$d$ƒ$„$„ƒd$ƒ$d$„$d „ c$„$„(¥(¥1L1L$„$„ ¥ ¥$d$„$d$„$„$„$„$„$„$„$„$„ƒd ¥ ¥ c „$d$„$„$„)) e …dd „ „dc„„dd„„dd ¥ ¥$„$„(¥(¥ † †$„$„(¥(¥ e …$„$„(¥(¥ e …$„$„ … e$„$„ „ „ † † ¥ ¥$d$„ ¥ ¥(¥(¥(¥(¥5k5k$Ç$Çdd„ddd¥¥dd „ „dd ¥ ¥$d$„dƒ$d$„$d$„ d ƒ d ƒ d ƒ d ƒ d ƒ$d$„$„$„5J5J ç ç$d$„$„$„ƒd$„$„$„$„$„$„$„$„ ¥ ¥$d$„$„$„$„$d$„$d(ç(ç Æ Ædddd „ „dddc „ „dd ¥ ¥$„$„(¥(¥ † †$„$d(¥(¥(¥(¥ d „(¥(¥(¥(¥ d „(¥(¥ e …$d$„ ¥ ¥$„$„dd$¥$¥$¥$¥(¥(¥,é,é1L1Ldddddd„„„„…e$„$d„c$„$d„c „ c$„$c$„$„ƒd$ƒ$d$„$d „ c$„$„(¥(¥1L1L$„$„ ¥ ¥$d$„$d$„$„$„$„$„$„$„$„$„ƒd ¥ ¥ c „$d$„$„$„)) e …dd „ „dc„„dd„„dd ¥ ¥$„$„(¥(¥ † †$„$„(¥(¥ e …$„$„(¥(¥ e …$„$„ … e$„$„ „ „ † † ¥ ¥$d$„ ¥ ¥(¥(¥(¥(¥5k5k$Ç$Çdd„ddd¥¥dd „ „dd ¥ ¥$d$„dƒ$d$„$d$„ d ƒ d ƒ d ƒ d ƒ d ƒ$d$„$„$„5J5J ç ç$d$„$„$„ƒd$„$„$„$„$„$„$„$„ ¥ ¥$d$„$„$„$„$d$„$d(ç(ç Æ Ædddd „ „dddc „ „dd ¥ ¥$„$„(¥(¥ † †$„$d(¥(¥(¥(¥ d „(¥(¥(¥(¥ d „(¥(¥ e …$d$„ ¥ ¥$„$„dd$¥$¥$¥$¥(¥(¥,é,é1L1Ldddddd„„„„…e$„$d„c$d$„ d ƒ d ƒ d ƒ d ƒ$d$ƒdƒ d ƒ$d$ƒ d ƒ$¥$¥5J5Jdd$„$d$„$„$„$„ ƒ d$„$„$„$„$„$„$„$d$„$„$„$d$„$„$„$„ ç çdd „ „„cdd„c ¥ ¥$d$„$¥$¥$„$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥(¥(¥(¥(¥(¥(¥$d$„$¥$¥$„$„(¥(¥(¥(¥ † †$„$d1L1L ç ç d „dd„cdddd„„„c$„$d„c$„$c „ c$„$c „ c$„$c „ c „ c „ c$„$c „ c5J5J$Ç$Ç d „$d$„$„$„ ƒ d$„$„$„$„$„$„$„$d$„$d$„$„ „ „ „ ƒ(¥(¥ † †dd „ „„cdd$„$„dd$¥$¥$„$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$d$„(¥(¥$d$„$¥$¥$„$„(¥(¥(¥(¥ † †,ç,ç-*1* d „dcdd„ddddc„c$„$d$„$d „ c „ c „ c „ c$„$c„c „ c$„$c „ c$¥$¥5J5Jdd$„$d$„$„$„$„ ƒ d$„$„$„$„$„$„$„$d$„$„$„$d$„$„$„$„ ç çdd „ „„cdd„c ¥ ¥$d$„$¥$¥$„$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥(¥(¥(¥(¥(¥(¥$d$„$¥$¥$„$„(¥(¥(¥(¥ † †$„$d1L1L ç ç d „dd„cdddd„„„c$„$d„c$„$c „ c$„$c „ c$„$c „ c „ c „ c$„$c „ c5J5J$Ç$Ç d „$d$„$„$„ ƒ d$„$„$„$„$„$„$„$d$„$d$„$„ „ „ „ ƒ(¥(¥ † †dd „ „„cdd$„$„dd$¥$¥$„$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$d$„(¥(¥$d$„$¥$¥$„$„(¥(¥(¥(¥ † †,ç,ç-*1* d „dcdd„ddddc„c$„$d § § § §,Æ,Æ$Ç$Ç$Ç$Ç § § § § † † † † † †,é,é11) -) -(¥(¥$¥$¥ † †$¥$¥(¥(¥ † † § § e … ¥ ¥dd$¥$¥ † †-*1*)) § § § §$Æ$Æ e … e …$¥$¥ e …$¥$¥$„$„ † †$„$d † † † † … e † †$„$d † †(¥(¥ † †(¥(¥$Ç$Ç$Ç$Ç † †$Ç$Ç$Ç$Ç § §,é,é-l-l) -) - § § § § § § § §ÆÆ § § § §$Ç$Ç § § § §,¥,¥ § §$Ç$Ç,é,é † † † † † † † †$Æ$Æ1L1L1L1L$Æ$Æ † †$¥$¥(¥(¥ † †(¥(¥ † †$¥$¥dd¥¥ † †$„$„,é,é)K)K Æ Æ § §$Æ$Æ † †dd(¥(¥$¥$¥ † †$„$„ … e(¥(¥f† † † … e … e † †$„$d § §(¥(¥ † †,¥,¥$Ç$Ç § §$Ç$Ç$Ç$Ç § §$Ç$Ç1L1L1L1L § §ÆÆ § § § §ÆÆf† § § § § § § § §,Æ,Æ$Ç$Ç$Ç$Ç § § § § † † † † † †,é,é11) -) -(¥(¥$¥$¥ † †$¥$¥(¥(¥ † † § § e … ¥ ¥dd$¥$¥ † †-*1*)) § § § §$Æ$Æ e … e …$¥$¥ e …$¥$¥$„$„ † †$„$d † † † † … e † †$„$d † †(¥(¥ † †(¥(¥$Ç$Ç$Ç$Ç † †$Ç$Ç$Ç$Ç § §,é,é-l-l) -) - § § § § § § § §ÆÆ § § § §$Ç$Ç § § § §,¥,¥ § §$Ç$Ç,é,é † † † † † † † †$Æ$Æ1L1L1L1L$Æ$Æ † †$¥$¥(¥(¥ † †(¥(¥ † †$¥$¥dd¥¥ † †$„$„,é,é)K)K Æ Æ § §$Æ$Æ † †dd(¥(¥$¥$¥ † †$„$„ … e(¥(¥f† † † … e … e † †$„$d § §(¥(¥ † †,¥,¥$Ç$Ç § §$Ç$Ç$Ç$Ç § §$Ç$Ç1L1L1L1L § §ÆÆ § § § §ÆÆf† § § § §1Œ1Œ=¯A°55=Ž=Ž=¯A°=ÏA°1Ž11L1L-*1*-l-l55=Ž=Ž=ï=ï55955k5k=Ž=ŽAðAð=ï=ï=¯A°=ÏA°9­=­=ÐA¯=¯A°9ï=ï=Ž=Ž=Ž=ŽAïAï=Ž=Ž551*-*1Œ1Œ1L1L1L1L559n5m55955m5m955m5m9n5m111L1L1L1L1L1L1L1L11=¯A°=ÏA°=¯=¯AÐ=¯A°=¯=ÏA°=¯A°=Ï=¯=ð=ð55AðAðAòAñAòAñAòAñAòAñ=ð=ð=¯A°1155955m5m1L1L111L1L-*1*-l-l5m5m95=¯A°=Ž=Ž55595Ž5A¯=°=ï=ï=¯A°=Ž=ŽAðAð=Ž=Ž=¯A°=ï=ï=Ž=Ž=Ž=Ž=¯A°=Ï=°=Ž=Ž5J5J-l-l1L1L1L1L1L1L55951155955m5m9n5m5m5m111L1L1L1L1L1L1155A¯=°AÏ=°=¯A¯AòAò5Ž5A¯=°59AñAò=ð=ð55AòAñ551111111Œ1Œ=¯A°55=Ž=Ž=¯A°=ÏA°1Ž11L1L-*1*-l-l55=Ž=Ž=ï=ï55955k5k=Ž=ŽAðAð=ï=ï=¯A°=ÏA°9­=­=ÐA¯=¯A°9ï=ï=Ž=Ž=Ž=ŽAïAï=Ž=Ž551*-*1Œ1Œ1L1L1L1L559n5m55955m5m955m5m9n5m111L1L1L1L1L1L1L1L11=¯A°=ÏA°=¯=¯AÐ=¯A°=¯=ÏA°=¯A°=Ï=¯=ð=ð55AðAðAòAñAòAñAòAñAòAñ=ð=ð=¯A°1155955m5m1L1L111L1L-*1*-l-l5m5m95=¯A°=Ž=Ž55595Ž5A¯=°=ï=ï=¯A°=Ž=ŽAðAð=Ž=Ž=¯A°=ï=ï=Ž=Ž=Ž=Ž=¯A°=Ï=°=Ž=Ž5J5J-l-l1L1L1L1L1L1L55951155955m5m9n5m5m5m111L1L1L1L1L1L1155A¯=°AÏ=°=¯A¯AòAò5Ž5A¯=°59AñAò=ð=ð55AòAñ55111111,ç,ç,¥,¥0ç0ç0ç0ç-*1*=Ž=Ž(¥(¥$„$„$¥$¥dd$¥$¥dd „ „dd ¥ ¥(¥(¥dd Æ Æ$¥$¥$¥$¥(¥(¥$¥$¥$¥$¥$¥$¥dd ¥ ¥c„$Æ$Æ(¥(¥dd¥¥ † † ¥ ¥(¥(¥5J5J=Ž=Ž1L1L5I5I5J5J1L1L5J5J5k5k9m5m5k5k9m5m5k5k1L1L5k5k9m5m1L1L5J5J--,é,é1111--1)1)5)5)1)1)5)5)1)1)5)5)1)1)1)1)551*-*951L1L-- e …$¥$¥$d$„(¥(¥(¥(¥ e … „ „ „ „dd ¥ ¥ ¥ ¥$„$„ „ „$¥$¥(¥(¥ Æ Æ(¥(¥$¥$¥$¥$¥ † † … eƒd Æ Æ$¥$¥ ¥ ¥$d$„ „ „¥¥(¥(¥,ç,ç=¯A°1L1L5I5I5J5J5J5J5k5k1L1L5k5k9k5k5m5m9k5k5k5k9k5k5m5mJJ9Ž=Ž11,ç,ç,ç,ç,é,é11115I5I9)5)115I5I1)1)5)5)9)5),ç,ç,¥,¥0ç0ç0ç0ç-*1*=Ž=Ž(¥(¥$„$„$¥$¥dd$¥$¥dd „ „dd ¥ ¥(¥(¥dd Æ Æ$¥$¥$¥$¥(¥(¥$¥$¥$¥$¥$¥$¥dd ¥ ¥c„$Æ$Æ(¥(¥dd¥¥ † † ¥ ¥(¥(¥5J5J=Ž=Ž1L1L5I5I5J5J1L1L5J5J5k5k9m5m5k5k9m5m5k5k1L1L5k5k9m5m1L1L5J5J--,é,é1111--1)1)5)5)1)1)5)5)1)1)5)5)1)1)1)1)551*-*951L1L-- e …$¥$¥$d$„(¥(¥(¥(¥ e … „ „ „ „dd ¥ ¥ ¥ ¥$„$„ „ „$¥$¥(¥(¥ Æ Æ(¥(¥$¥$¥$¥$¥ † † … eƒd Æ Æ$¥$¥ ¥ ¥$d$„ „ „¥¥(¥(¥,ç,ç=¯A°1L1L5I5I5J5J5J5J5k5k1L1L5k5k9k5k5m5m9k5k5k5k9k5k5m5mJJ9Ž=Ž11,ç,ç,ç,ç,é,é11115I5I9)5)115I5I1)1)5)5)9)5),Æ,Æ † † „ d$„$„,é,é5m5m(¥(¥ d „ d „dd„ddd„d„c … e$¥$¥$d$„dd$„$ddddcdddddd „ „dddd¥¥ † †ƒddddd … e(¥(¥11=Ž=Ž,Æ,Æ(¥(¥ † †(¥(¥(¥(¥,¥,¥$Ç$Ç,Æ,Æ0ç0ç$Ç$Ç,Æ,Æ0Æ0Æ=Ž=Ž1Œ1Œ † †(¥(¥$d$„(¥(¥$d$„(¥(¥,¤,¤(¥(¥$d$„,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥$Ç$Ç,¥,¥,¥,¥$Ç$Ç,é,é$„$„(¥(¥ † †$„$ddddc„ddddd„c … e ¥ ¥ d „dddddddd„ddd„cdd„cdd(¥(¥dddddddd(¥(¥,¥,¥551)1)(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$Ç$Ç,¥,¥0ç0ç$Ç$Ç,Æ,Æ,Æ,Æ5J5J=¯A°11(¥(¥ e …(¥(¥$„$„$„$„(¥(¥,¥,¥$d$„,¥,¥,¥,¥,¥,¥,¥,¥(¥(¥,Æ,Æ † † „ d$„$„,é,é5m5m(¥(¥ d „ d „dd„ddd„d„c … e$¥$¥$d$„dd$„$ddddcdddddd „ „dddd¥¥ † †ƒddddd … e(¥(¥11=Ž=Ž,Æ,Æ(¥(¥ † †(¥(¥(¥(¥,¥,¥$Ç$Ç,Æ,Æ0ç0ç$Ç$Ç,Æ,Æ0Æ0Æ=Ž=Ž1Œ1Œ † †(¥(¥$d$„(¥(¥$d$„(¥(¥,¤,¤(¥(¥$d$„,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥$Ç$Ç,¥,¥,¥,¥$Ç$Ç,é,é$„$„(¥(¥ † †$„$ddddc„ddddd„c … e ¥ ¥ d „dddddddd„ddd„cdd„cdd(¥(¥dddddddd(¥(¥,¥,¥551)1)(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$Ç$Ç,¥,¥0ç0ç$Ç$Ç,Æ,Æ,Æ,Æ5J5J=¯A°11(¥(¥ e …(¥(¥$„$„$„$„(¥(¥,¥,¥$d$„,¥,¥,¥,¥,¥,¥,¥,¥(¥(¥,Æ,Æ § §$„$„ … e111L1L,Æ,Ædddddc„d„ddddddd ¥ ¥dd„cdd„ddddd„d…edddc „ „…e ¥ ¥$d$„dc„„dd$„$„5595(ç(ç,¥,¥ § §(¥(¥$Ç$Ç0ç0ç § §,Æ,Æ,é,é,Æ,Æ,é,é0ç0ç=Œ=Œ5m5m § §(¥(¥(¥(¥ † †(¥(¥(¥(¥ e …(¥(¥,¥,¥(¥(¥(¥(¥,¥,¥$Ç$Ç,¥,¥0Æ0Æ,Æ,Æ(¥(¥ § §--$d$„(¥(¥$„$„$„$„„ddddc„d„ddd$¥$¥dddcdddd„ddd„ddddd„„dd„„¥¥ d „dd„„dd … e,Æ,Æ5511,¥,¥ § § † †,¥,¥$Ç$Ç0ç0ç$Ç$Ç0ç0ç$Ç$Ç,Æ,Æ,é,é5)5)A¯=°$Ç$Ç,¥,¥ † †(¥(¥ † † § §(¥(¥(¥(¥(¥(¥,¥,¥$Ç$Ç,¥,¥,¥,¥$Ç$Ç,Æ,Æ § §$„$„ … e111L1L,Æ,Ædddddc„d„ddddddd ¥ ¥dd„cdd„ddddd„d…edddc „ „…e ¥ ¥$d$„dc„„dd$„$„5595(ç(ç,¥,¥ § §(¥(¥$Ç$Ç0ç0ç § §,Æ,Æ,é,é,Æ,Æ,é,é0ç0ç=Œ=Œ5m5m § §(¥(¥(¥(¥ † †(¥(¥(¥(¥ e …(¥(¥,¥,¥(¥(¥(¥(¥,¥,¥$Ç$Ç,¥,¥0Æ0Æ,Æ,Æ(¥(¥ § §--$d$„(¥(¥$„$„$„$„„ddddc„d„ddd$¥$¥dddcdddd„ddd„ddddd„„dd„„¥¥ d „dd„„dd … e,Æ,Æ5511,¥,¥ § § † †,¥,¥$Ç$Ç0ç0ç$Ç$Ç0ç0ç$Ç$Ç,Æ,Æ,é,é5)5)A¯=°$Ç$Ç,¥,¥ † †(¥(¥ † † § §(¥(¥(¥(¥(¥(¥,¥,¥$Ç$Ç,¥,¥,¥,¥$Ç$Ç,Æ,Æ † † … edd--55,¥,¥dddd„d„ddc„ddddd$¥$¥dddddddd„ddd„d„„dd„„dd¥¥ e …$d$„d„dddd$¥$¥1111,é,é,Æ,Æ$Ç$Ç,¥,¥$Ç$Ç § §,Æ,Æ0ç0ç$Ç$Ç0ç0ç$Ç$Ç0ç0ç=Ž=Ž5m5m(¥(¥(¥(¥ e …¥¥ † † § § § § § §(¥(¥(¥(¥ § §(¥(¥$Ç$Ç,é,é,Æ,Æ,é,é,¥,¥,é,é11 d „(¥(¥$d$„dd„ddd„ddcdddd † †ƒd … e „ „dddd„dddÆÆcddd„„…e$¥$¥dddd„ddd$¥$¥(¥(¥551*-*,Æ,Æ$Ç$Ç,¥,¥ § §$Ç$Ç,¥,¥$Ç$Ç0ç0ç$Ç$Ç,é,é,¥,¥5J5JAòAñ$Ç$Ç,¥,¥ † †$¥$¥¥¥ § §(¥(¥ † †$Ç$Ç,¥,¥$Ç$Ç$Ç$Ç,¥,¥$Ç$Ç,Æ,Æ † † … edd--55,¥,¥dddd„d„ddc„ddddd$¥$¥dddddddd„ddd„d„„dd„„dd¥¥ e …$d$„d„dddd$¥$¥1111,é,é,Æ,Æ$Ç$Ç,¥,¥$Ç$Ç § §,Æ,Æ0ç0ç$Ç$Ç0ç0ç$Ç$Ç0ç0ç=Ž=Ž5m5m(¥(¥(¥(¥ e …¥¥ † † § § § § § §(¥(¥(¥(¥ § §(¥(¥$Ç$Ç,é,é,Æ,Æ,é,é,¥,¥,é,é11 d „(¥(¥$d$„dd„ddd„ddcdddd † †ƒd … e „ „dddd„dddÆÆcddd„„…e$¥$¥dddd„ddd$¥$¥(¥(¥551*-*,Æ,Æ$Ç$Ç,¥,¥ § §$Ç$Ç,¥,¥$Ç$Ç0ç0ç$Ç$Ç,é,é,¥,¥5J5JAòAñ$Ç$Ç,¥,¥ † †$¥$¥¥¥ § §(¥(¥ † †$Ç$Ç,¥,¥$Ç$Ç$Ç$Ç,¥,¥$Ç$Ç(ç(ç,Æ,Æ e …¥¥5511,¥,¥dddd„d„d„ddddcdddd„„dd„„„ddd„ddd„„dd…edd „ „$¥$¥dddddd „ „ † †,ç,ç5m5m8ç4ç$Ç$Ç0ç0ç$Ç$Ç § §,¥,¥$Ç$Ç$Ç$Ç0ç0ç$Ç$Ç$Ç$Ç0Æ0Æ5m5m1L1L „ „†f„„„d…e†f„„…e † † § §,¥,¥ § §,¥,¥$Ç$Ç,é,é$Ç$Ç § §---*1*$d$„$„$„ … e „ ddc„d„d„ddd„d … eƒddddddd„ddcdd„ddddddddd$¥$¥dd „ „dddd¥¥(¥(¥5m5m1155$Ç$Ç$Ç$Ç,¥,¥$Ç$Ç § §0ç0ç$Ç$Ç$Ç$Ç,Æ,Æ,é,é55A¯=° ¦ §¥¥e…e…d„e…f†¥¥e… § §11 † † § §--(ç(ç,Æ,Æ e …¥¥5511,¥,¥dddd„d„d„ddddcdddd„„dd„„„ddd„ddd„„dd…edd „ „$¥$¥dddddd „ „ † †,ç,ç5m5m8ç4ç$Ç$Ç0ç0ç$Ç$Ç § §,¥,¥$Ç$Ç$Ç$Ç0ç0ç$Ç$Ç$Ç$Ç0Æ0Æ5m5m1L1L „ „†f„„„d…e†f„„…e † † § §,¥,¥ § §,¥,¥$Ç$Ç,é,é$Ç$Ç § §---*1*$d$„$„$„ … e „ ddc„d„d„ddd„d … eƒddddddd„ddcdd„ddddddddd$¥$¥dd „ „dddd¥¥(¥(¥5m5m1155$Ç$Ç$Ç$Ç,¥,¥$Ç$Ç § §0ç0ç$Ç$Ç$Ç$Ç,Æ,Æ,é,é55A¯=° ¦ §¥¥e…e…d„e…f†¥¥e… § §11 † † § §--(ç(ç$Ç$Ç † †$ƒ$d1111,¥,¥ d „ d „dc„ddcdddd„c … ecdƒddd„cdd„cdddd „ „„cdd„c … e$„$ddc„c„c$„$„,é,é1L1L0ç0ç11$Ç$Ç$Ç$Ç0ç0ç$Ç$Ç$Ç$Ç,é,é0ç0ç$Ç$Ç,é,é,Æ,Æ5J5J) -) -d„¥¥f†e…e…„„…e„„„ddd † † Æ Æ § §,Æ,Æ$Æ$Æ$Ç$Ç,ç,ç11) -) -dd$„$ddcdƒdcdcdddc d „dd„c$„$d„„„cdcdd„cdd„c … e „ „dcdc … e$„$„cdcdƒd$„$„(¥(¥1L1L1)1),é,é4ç4ç$Ç$Ç$Ç$Ç$Ç$Ç,é,é$Ç$Ç0ç0ç$Ç$Ç,é,é0ç0ç11=¯A°†f…e†f…e…e…e„„…e„ddd Æ Ædddd § §(ç(ç$Ç$Ç † †$ƒ$d1111,¥,¥ d „ d „dc„ddcdddd„c … ecdƒddd„cdd„cdddd „ „„cdd„c … e$„$ddc„c„c$„$„,é,é1L1L0ç0ç11$Ç$Ç$Ç$Ç0ç0ç$Ç$Ç$Ç$Ç,é,é0ç0ç$Ç$Ç,é,é,Æ,Æ5J5J) -) -d„¥¥f†e…e…„„…e„„„ddd † † Æ Æ § §,Æ,Æ$Æ$Æ$Ç$Ç,ç,ç11) -) -dd$„$ddcdƒdcdcdddc d „dd„c$„$d„„„cdcdd„cdd„c … e „ „dcdc … e$„$„cdcdƒd$„$„(¥(¥1L1L1)1),é,é4ç4ç$Ç$Ç$Ç$Ç$Ç$Ç,é,é$Ç$Ç0ç0ç$Ç$Ç,é,é0ç0ç11=¯A°†f…e†f…e…e…e„„…e„ddd Æ Ædddd § §(ç(ç$Ç$Ç § §$Ç$Ç-*1*11-*1*$Ç$Ç § § § §f†¥¥f†¥¥d„dd„d„dÆÆe…¥¥f†„„ÆÆ § §f†f†$Ç$Ç § § ç ç § §$Ç$Ç%%$Ç$Ç1L1L1L1L%%$Ç$Ç$Æ$Æ$Ç$Ç § §(ç(ç § § § § § §$Æ$Æ † † § §=¯A°=Ž=Žf†ÆÆ § §$Æ$Æ § § § § § § § §(¥(¥$Æ$Æ--11$Ç$Ç) -) -1*-*11-*1*55A¯=°) -) -%%!!$Ç$Çf† § §f†f†¥¥e…dd„d„d„d¥¥e…e…¥¥f† § § Æ Æf†ÆÆ § § § § ç ç § §) -) -$Ç$Ç) -) --l-l) -) - § § § §(ç(ç$Ç$Ç$Ç$Ç,¥,¥$Ç$Ç$Ç$Ç$Ç$Ç † † † †11AòAñ ç 祥 ç ç$Ç$Ç § §(¥(¥ † † § §,Æ,Æ § §$Æ$Æ$Ç$Ç ç ç$Ç$Ç(ç(ç$Ç$Ç § §$Ç$Ç-*1*11-*1*$Ç$Ç § § § §f†¥¥f†¥¥d„dd„d„dÆÆe…¥¥f†„„ÆÆ § §f†f†$Ç$Ç § § ç ç § §$Ç$Ç%%$Ç$Ç1L1L1L1L%%$Ç$Ç$Æ$Æ$Ç$Ç § §(ç(ç § § § § § §$Æ$Æ † † § §=¯A°=Ž=Žf†ÆÆ § §$Æ$Æ § § § § § § § §(¥(¥$Æ$Æ--11$Ç$Ç) -) -1*-*11-*1*55A¯=°) -) -%%!!$Ç$Çf† § §f†f†¥¥e…dd„d„d„d¥¥e…e…¥¥f† § § Æ Æf†ÆÆ § § § § ç ç § §) -) -$Ç$Ç) -) --l-l) -) - § § § §(ç(ç$Ç$Ç$Ç$Ç,¥,¥$Ç$Ç$Ç$Ç$Ç$Ç † † † †11AòAñ ç 祥 ç ç$Ç$Ç § §(¥(¥ † † § §,Æ,Æ § §$Æ$Æ$Ç$Ç ç ç$Ç$Ç=Œ=Œ=Œ=Œ5m5m5J5J5m5m=Œ=Œ1L1L11-l-l-*1*-*1*) -) --)-)-*1*-*1*55-l-l-*1*-*1*11-*1*)J)J1L1L5J5J-*1*1L1L1Œ1Œ5k5k95=¯A°551Œ1Œ5m5m1L1L1Œ1Œ5k5k1Œ1Œ-*1*-*1*))-*1*-*1*-*1*)K)K1L1L1L1L1L1L5k5k=Ž=Ž=ï=ï=Ž=Ž=Ž=Ž=Ž=Ž=Œ=Œ=Œ=Œ=Œ=Œ=¯A°EïIï=¯A°=Ï=¯A°=¯IðEðAðAð55A°=¯=Œ=Œ5m5m=Œ=Œ=Œ=Œ=Ž=Ž5m5m) -) -1*-*1L1L)J)J1)1)-)-))K)K-*1*5Ž5-l-l1L1L-*1*111L1L-*1*-*1*)J)J5J5J-*1*-l-l559Ž555A¯=°1Œ1Œ1L1L551L1L5k5k955J5J)K)K,é,é) -) -)K)K-*1*-*1*-*1*-*1*-l-l1L1L55A¯=°=ï=ï=Ž=Ž55=Œ=Œ5k5k=Ž=Ž=¯A°=ÏA°=¯=¯AÐ=¯A°=¯IïEï=¯A°=Ž=Ž=Œ=Œ=Œ=Œ5m5m5J5J5m5m=Œ=Œ1L1L11-l-l-*1*-*1*) -) --)-)-*1*-*1*55-l-l-*1*-*1*11-*1*)J)J1L1L5J5J-*1*1L1L1Œ1Œ5k5k95=¯A°551Œ1Œ5m5m1L1L1Œ1Œ5k5k1Œ1Œ-*1*-*1*))-*1*-*1*-*1*)K)K1L1L1L1L1L1L5k5k=Ž=Ž=ï=ï=Ž=Ž=Ž=Ž=Ž=Ž=Œ=Œ=Œ=Œ=Œ=Œ=¯A°EïIï=¯A°=Ï=¯A°=¯IðEðAðAð55A°=¯=Œ=Œ5m5m=Œ=Œ=Œ=Œ=Ž=Ž5m5m) -) -1*-*1L1L)J)J1)1)-)-))K)K-*1*5Ž5-l-l1L1L-*1*111L1L-*1*-*1*)J)J5J5J-*1*-l-l559Ž555A¯=°1Œ1Œ1L1L551L1L5k5k955J5J)K)K,é,é) -) -)K)K-*1*-*1*-*1*-*1*-l-l1L1L55A¯=°=ï=ï=Ž=Ž55=Œ=Œ5k5k=Ž=Ž=¯A°=ÏA°=¯=¯AÐ=¯A°=¯IïEï=¯A°=Ž=Ždd † †$„$d(¥(¥$d$„(¥(¥ e …dd ¥ ¥ e … ¥ ¥$d$„ ¥ ¥(¥(¥11)K)K(¥(¥,Æ,Æ(¥(¥,¥,¥,¥,¥(¥(¥(¥(¥(¥(¥ ¥ ¥$¥$¥(¥(¥ ¥ ¥$Ç$Ç1L1L11 § §(¥(¥$Æ$Æ § §$„$„ † †$„$„ † †$¥$¥ e … Æ Æ § §(¥(¥,Æ,Æ$Ç$Ç(ç(ç,Æ,Æ$Ç$Ç(ç(ç$Æ$Æ,ç,ç$Ç$Ç$Ç$Ç(ç(ç,ç,ç0ç0ç,é,é-*1*(ç(ç,¥,¥(ç(ç(¥(¥ § §(¥(¥$d$„,¥,¥$„$„(¥(¥(¥(¥ † †$„$ddd ¥ ¥ e … ¥ ¥ e …(¥(¥,Æ,Æ1L1L(ç(ç$¥$¥,¥,¥(¥(¥(¥(¥,¥,¥(¥(¥,¥,¥$¥$¥$¥$¥$¥$¥$¥$¥(¥(¥)K)K1)1)$Ç$Ç,¥,¥$Æ$Æ § §$„$„ † †(¥(¥ † † ¥ ¥ ¥ ¥$¥$¥ † †$Æ$Æ § §(ç(ç,Æ,Æ(ç(ç$Ç$Ç$Æ$Æ,Æ,Æ$Ç$Ç$Ç$Ç$Ç$Ç(ç(ç,ç,ç0ç0ç$Ç$Ç1L1L0ç0ç(¥(¥$¥$¥dd„„dd † †$„$d(¥(¥$d$„(¥(¥ e …dd ¥ ¥ e … ¥ ¥$d$„ ¥ ¥(¥(¥11)K)K(¥(¥,Æ,Æ(¥(¥,¥,¥,¥,¥(¥(¥(¥(¥(¥(¥ ¥ ¥$¥$¥(¥(¥ ¥ ¥$Ç$Ç1L1L11 § §(¥(¥$Æ$Æ § §$„$„ † †$„$„ † †$¥$¥ e … Æ Æ § §(¥(¥,Æ,Æ$Ç$Ç(ç(ç,Æ,Æ$Ç$Ç(ç(ç$Æ$Æ,ç,ç$Ç$Ç$Ç$Ç(ç(ç,ç,ç0ç0ç,é,é-*1*(ç(ç,¥,¥(ç(ç(¥(¥ § §(¥(¥$d$„,¥,¥$„$„(¥(¥(¥(¥ † †$„$ddd ¥ ¥ e … ¥ ¥ e …(¥(¥,Æ,Æ1L1L(ç(ç$¥$¥,¥,¥(¥(¥(¥(¥,¥,¥(¥(¥,¥,¥$¥$¥$¥$¥$¥$¥$¥$¥(¥(¥)K)K1)1)$Ç$Ç,¥,¥$Æ$Æ § §$„$„ † †(¥(¥ † † ¥ ¥ ¥ ¥$¥$¥ † †$Æ$Æ § §(ç(ç,Æ,Æ(ç(ç$Ç$Ç$Æ$Æ,Æ,Æ$Ç$Ç$Ç$Ç$Ç$Ç(ç(ç,ç,ç0ç0ç$Ç$Ç1L1L0ç0ç(¥(¥$¥$¥dd„„dd¥¥ † † … e ¥ ¥ e …dd ¥ ¥dddd¥¥dd(¥(¥ † †559m5m$Ç$Ç,¥,¥,¥,¥,Æ,Æ$Ç$Ç,¥,¥0Æ0Æ,ç,ç$Æ$Æ$Ç$Ç,Æ,Æ § § ç ç55,ç,ç § § § § e …(¥(¥ e …$¥$¥ † † … e¥¥ e … † †$¥$¥$¥$¥ † †(¥(¥ † † § §(¥(¥ e … † †¥¥$¥$¥ † † † † § §,¥,¥0ç0ç,é,é(¥(¥,Æ,Æ † † § §(¥(¥(¥(¥(¥(¥ e … e … † † „ ddd … e„„…edd$¥$¥dd$Æ$Æ,Æ,Æ5m5m--,¥,¥0Æ0Æ,¥,¥,Æ,Æ,Æ,Æ,Æ,Æ,ç,ç,Æ,Æ § §(ç(ç$Æ$Æ † †-l-l5)5)$Ç$Ç § § e …$¥$¥ † † † † … e ¥ ¥ e …dd$¥$¥ † † † †(¥(¥ † †(¥(¥ † † § §(¥(¥ † †…edd¥¥ † † † †,¥,¥,Æ,Æ11$Ç$Ç,¥,¥ e …e…dddd¥¥ † † … e ¥ ¥ e …dd ¥ ¥dddd¥¥dd(¥(¥ † †559m5m$Ç$Ç,¥,¥,¥,¥,Æ,Æ$Ç$Ç,¥,¥0Æ0Æ,ç,ç$Æ$Æ$Ç$Ç,Æ,Æ § § ç ç55,ç,ç § § § § e …(¥(¥ e …$¥$¥ † † … e¥¥ e … † †$¥$¥$¥$¥ † †(¥(¥ † † § §(¥(¥ e … † †¥¥$¥$¥ † † † † § §,¥,¥0ç0ç,é,é(¥(¥,Æ,Æ † † § §(¥(¥(¥(¥(¥(¥ e … e … † † „ ddd … e„„…edd$¥$¥dd$Æ$Æ,Æ,Æ5m5m--,¥,¥0Æ0Æ,¥,¥,Æ,Æ,Æ,Æ,Æ,Æ,ç,ç,Æ,Æ § §(ç(ç$Æ$Æ † †-l-l5)5)$Ç$Ç § § e …$¥$¥ † † † † … e ¥ ¥ e …dd$¥$¥ † † † †(¥(¥ † †(¥(¥ † † § §(¥(¥ † †…edd¥¥ † † † †,¥,¥,Æ,Æ11$Ç$Ç,¥,¥ e …e…dddddd „ „ … e„„ … e„d¥¥ e …dd¥¥ † † † †(¥(¥-*1*-*1* ¥ ¥,¥,¥0Æ0Æ,Æ,Æ0Æ0Æ0Æ0Æ0ç0ç0ç0ç$Ç$Ç,Æ,Æ ç ç § § ç ç1L1L--(¥(¥ † †$¥$¥ e …¥¥ e …¥¥ e …¥¥ † †¥¥ † †(¥(¥ † †$¥$¥ † † § §(¥(¥ e … Æ Æ † † † † † †$¥$¥ † †,¥,¥,é,é$Ç$Ç,Æ,Æ,¥,¥$Ç$Ç(¥(¥ § §(¥(¥ † † † †dddd$¥$¥d„e…$¥$¥dd¥¥ e …$¥$¥ † †0ç0ç1L1L § §(¥(¥0Æ0Æ,Æ,Æ,Æ,Æ0Æ0Æ0Æ0Æ0ç0ç$Ç$Ç(ç(ç$Æ$Æ$Ç$Ç Æ Æ-*1*-*1* § §(¥(¥ † †$¥$¥ e … „ „¥¥ † †dd † †¥¥ † †(¥(¥ † †(¥(¥ † †(¥(¥ † †$¥$¥ † † † †„„ † † † †(¥(¥ § §,¥,¥11$Ç$Ç,¥,¥ § §$¥$¥ e …dddd „ „ … e„„ … e„d¥¥ e …dd¥¥ † † † †(¥(¥-*1*-*1* ¥ ¥,¥,¥0Æ0Æ,Æ,Æ0Æ0Æ0Æ0Æ0ç0ç0ç0ç$Ç$Ç,Æ,Æ ç ç § § ç ç1L1L--(¥(¥ † †$¥$¥ e …¥¥ e …¥¥ e …¥¥ † †¥¥ † †(¥(¥ † †$¥$¥ † † § §(¥(¥ e … Æ Æ † † † † † †$¥$¥ † †,¥,¥,é,é$Ç$Ç,Æ,Æ,¥,¥$Ç$Ç(¥(¥ § §(¥(¥ † † † †dddd$¥$¥d„e…$¥$¥dd¥¥ e …$¥$¥ † †0ç0ç1L1L § §(¥(¥0Æ0Æ,Æ,Æ,Æ,Æ0Æ0Æ0Æ0Æ0ç0ç$Ç$Ç(ç(ç$Æ$Æ$Ç$Ç Æ Æ-*1*-*1* § §(¥(¥ † †$¥$¥ e … „ „¥¥ † †dd † †¥¥ † †(¥(¥ † †(¥(¥ † †(¥(¥ † †$¥$¥ † † † †„„ † † † †(¥(¥ § §,¥,¥11$Ç$Ç,¥,¥ § §$¥$¥ e …dd„„†fdd¥¥dddd¥¥e…¥¥e… e …dd$¥$¥11-l-l e …,Å,Å0Æ0Æ,Æ,Æ0Æ0Æ0ç0ç0Æ0Æ0ç0ç0ç0ç § §$Ç$ÇÆÆ,é,é1L1L(ç(ç § §(¥(¥ e … † †¥¥ e … e …¥¥ † †dd$¥$¥ † † † †$¥$¥ † †$¥$¥ † † § § † †dd § § ¥ ¥ † † † †(¥(¥ † †0Æ0Æ-*1* § §(¥(¥ † †(¥(¥ § § † †(¥(¥e… † †dd…edddd¥¥ e …e…¥¥ e … e … § §55 § §(Å(Å0Æ0Æ,¥,¥0ç0ç0Æ0Æ0ç0ç0ç0ç0Æ0Æ$Ç$Ç(ç(ç † † ç ç1L1L11 § § † † † † † † ¥ ¥ e … e …¥¥ e …¥¥ † † † †(¥(¥ † †$¥$¥ † † † †$Æ$Æ † † … e¥¥d„ † † § § † †(¥(¥,¥,¥) -) -$Ç$Ç,¥,¥ † †dddddd„„†fdd¥¥dddd¥¥e…¥¥e… e …dd$¥$¥11-l-l e …,Å,Å0Æ0Æ,Æ,Æ0Æ0Æ0ç0ç0Æ0Æ0ç0ç0ç0ç § §$Ç$ÇÆÆ,é,é1L1L(ç(ç § §(¥(¥ e … † †¥¥ e … e …¥¥ † †dd$¥$¥ † † † †$¥$¥ † †$¥$¥ † † § § † †dd § § ¥ ¥ † † † †(¥(¥ † †0Æ0Æ-*1* § §(¥(¥ † †(¥(¥ § § † †(¥(¥e… † †dd…edddd¥¥ e …e…¥¥ e … e … § §55 § §(Å(Å0Æ0Æ,¥,¥0ç0ç0Æ0Æ0ç0ç0ç0ç0Æ0Æ$Ç$Ç(ç(ç † † ç ç1L1L11 § § † † † † † † ¥ ¥ e … e …¥¥ e …¥¥ † † † †(¥(¥ † †$¥$¥ † † † †$Æ$Æ † † … e¥¥d„ † † § § † †(¥(¥,¥,¥) -) -$Ç$Ç,¥,¥ † †dddddd„d „ „…edd¥¥dddd…e … e¥¥dd$¥$¥ † †%%1L1L,ç,ç0Æ0Æ5595========55 § §(ç(ç † †%%-*1* § §(¥(¥ † †¥¥$¥$¥e… e …¥¥e… † †$¥$¥ e …¥¥ † †(¥(¥ † † † † § § e … ¥ ¥$¥$¥ e …¥¥ e …$¥$¥ † †,¥,¥0ç0ç) -) -,¥,¥$Ç$Ç † †(¥(¥ § §(¥(¥ e … d „dddd¥¥dd¥¥e…dd¥¥e…dd$¥$¥ § §1L1L--0ç0ç4ç4ç95========55$Ç$Ç § §$Æ$Æ § §1L1L$Ç$Ç$Æ$Æ § §$¥$¥ e … e …¥¥e… † †dd$¥$¥¥¥ † † † †$¥$¥ † †$¥$¥ † † † †$¥$¥e… e …dd¥¥ † †(¥(¥ † †0Æ0Æ-*1*,é,é(¥(¥ e …dd „ „dd„d „ „…edd¥¥dddd…e … e¥¥dd$¥$¥ † †%%1L1L,ç,ç0Æ0Æ5595========55 § §(ç(ç † †%%-*1* § §(¥(¥ † †¥¥$¥$¥e… e …¥¥e… † †$¥$¥ e …¥¥ † †(¥(¥ † † † † § § e … ¥ ¥$¥$¥ e …¥¥ e …$¥$¥ † †,¥,¥0ç0ç) -) -,¥,¥$Ç$Ç † †(¥(¥ § §(¥(¥ e … d „dddd¥¥dd¥¥e…dd¥¥e…dd$¥$¥ § §1L1L--0ç0ç4ç4ç95========55$Ç$Ç § §$Æ$Æ § §1L1L$Ç$Ç$Æ$Æ § §$¥$¥ e … e …¥¥e… † †dd$¥$¥¥¥ † † † †$¥$¥ † †$¥$¥ † † † †$¥$¥e… e …dd¥¥ † †(¥(¥ † †0Æ0Æ-*1*,é,é(¥(¥ e …dd „ „dd „ „dddd „ „dddd„„dddd „ „¥¥ † †(¥(¥,é,é1L1L ç ç,Æ,Æ † † § §,é,é55$Ç$Ç,Æ,Æ$Ç$Çdd†f¥¥%%) -) -(¥(¥ † †$¥$¥ e … e …¥¥e… e …dd „ „…e$¥$¥ † †$„$„ † †(¥(¥ † †$¥$¥ † †dd$¥$¥ e …e…$¥$¥ † †(¥(¥(¥(¥,é,é5k5k § §(¥(¥(¥(¥ † †(¥(¥ † †(¥(¥ † † … eƒd ¥ ¥dddddc¥¥dd † † ¥ ¥(¥(¥ § §1L1L,é,é ç ç(¥(¥ † †,é,é,é,é,é,é,Æ,Æ$Ç$Ç(¥(¥d„¥¥ § §)K)K$Æ$Æ † †(¥(¥dd$¥$¥e…dd … e „ „¥¥ e … e …¥¥$„$„ † †(¥(¥ † †(¥(¥ † †dd … e „ „¥¥ † †$¥$¥ † †(¥(¥,¥,¥-*1*,é,é(¥(¥(¥(¥dddddd „ „dddd „ „dddd„„dddd „ „¥¥ † †(¥(¥,é,é1L1L ç ç,Æ,Æ † † § §,é,é55$Ç$Ç,Æ,Æ$Ç$Çdd†f¥¥%%) -) -(¥(¥ † †$¥$¥ e … e …¥¥e… e …dd „ „…e$¥$¥ † †$„$„ † †(¥(¥ † †$¥$¥ † †dd$¥$¥ e …e…$¥$¥ † †(¥(¥(¥(¥,é,é5k5k § §(¥(¥(¥(¥ † †(¥(¥ † †(¥(¥ † † … eƒd ¥ ¥dddddc¥¥dd † † ¥ ¥(¥(¥ § §1L1L,é,é ç ç(¥(¥ † †,é,é,é,é,é,é,Æ,Æ$Ç$Ç(¥(¥d„¥¥ § §)K)K$Æ$Æ † †(¥(¥dd$¥$¥e…dd … e „ „¥¥ e … e …¥¥$„$„ † †(¥(¥ † †(¥(¥ † †dd … e „ „¥¥ † †$¥$¥ † †(¥(¥,¥,¥-*1*,é,é(¥(¥(¥(¥dddd ç ç § §$Ç$Ç!!f† ç ç § § ç ç ç ç ç ç § § § § § §$Ç$Ç)K)K-*1*e…e…„„ddd df† § §e… § §)K)K) -) -) -) -)K)K1L1L ç ç § § § § ç ç § § § §f†¥¥f†f† § § ç ç § § § § § § § § § § † †$Æ$Æ † † § § † † † † § §$Ç$Ç,é,é$Ç$Ç5595-*1*,é,é) -) -,é,é,é,é,é,é,é,é$Ç$Ç † † † ††fÆÆ¥¥ † ††f § § Æ Æ § § § §-*1*55%%d„d dd„d dd„f†f†ÆÆ!!1L1L) -) -) -) -95!!$Ç$Ç § § § § § § § §ÆÆf†f†f† Æ Æ § § § § § § § § § § § § † † § § † † † † Æ Æf† Æ Æ$Ç$Ç,é,é$Ç$Ç,é,é5k5k9m5m) -) -,é,é) -) -,é,é ç ç § §$Ç$Ç!!f† ç ç § § ç ç ç ç ç ç § § § § § §$Ç$Ç)K)K-*1*e…e…„„ddd df† § §e… § §)K)K) -) -) -) -)K)K1L1L ç ç § § § § ç ç § § § §f†¥¥f†f† § § ç ç § § § § § § § § § § † †$Æ$Æ † † § § † † † † § §$Ç$Ç,é,é$Ç$Ç5595-*1*,é,é) -) -,é,é,é,é,é,é,é,é$Ç$Ç † † † ††fÆÆ¥¥ † ††f § § Æ Æ § § § §-*1*55%%d„d dd„d dd„f†f†ÆÆ!!1L1L) -) -) -) -95!!$Ç$Ç § § § § § § § §ÆÆf†f†f† Æ Æ § § § § § § § § § § § § † † § § † † † † Æ Æf† Æ Æ$Ç$Ç,é,é$Ç$Ç,é,é5k5k9m5m) -) -,é,é) -) -,é,é559k5k559k5k1L1LAïAï551)1)1L1L-)-)) -) -)K)K-*1*)J)J5m5m9k5k-*1*-*1*-*1*) -) -1*-*1Œ1Œ1L1L11=Ž=Ž=ï=ï559k5k=Ž=Ž5k5k95559Ž5551Œ1Œ=¯A°=ð=ð551Œ1Œ551Œ1Œ=¯A°55595559Ž551Œ1Œ5m5m=Ž=ŽIðEð=ð=ð55A¯=°AÏ=°=Ž=Ž=¯A°=Ž=Ž=Ž=Ž=Œ=Œ=Ž=Ž=Ž=Ž=Ž=Ž=Œ=Œ5m5m=Ž=Ž5m5m=Œ=Œ=ð=ð5J5J,é,é-*1*-)-))K)K11)K)K-*1*-*1*1Œ1Œ5J5J1L1L111L1L) -) -)K)K1L1L5k5k9555A°=¯=Œ=Œ5m5m9Ž55k5k=Œ=Œ55955Ž59555AòAñ5Œ5Œ95=Œ=Œ-l-l55=ð=ð55955Ž5955Ž51L1L5Œ5ŒIðIðAòAñ5595AðAð=Ž=Ž=¯A°=Ž=Ž=Ž=Ž=Œ=Œ=Ž=Ž=Œ=Œ55=Œ=Œ595k5k595k5k1L1LAïAï551)1)1L1L-)-)) -) -)K)K-*1*)J)J5m5m9k5k-*1*-*1*-*1*) -) -1*-*1Œ1Œ1L1L11=Ž=Ž=ï=ï559k5k=Ž=Ž5k5k95559Ž5551Œ1Œ=¯A°=ð=ð551Œ1Œ551Œ1Œ=¯A°55595559Ž551Œ1Œ5m5m=Ž=ŽIðEð=ð=ð55A¯=°AÏ=°=Ž=Ž=¯A°=Ž=Ž=Ž=Ž=Œ=Œ=Ž=Ž=Ž=Ž=Ž=Ž=Œ=Œ5m5m=Ž=Ž5m5m=Œ=Œ=ð=ð5J5J,é,é-*1*-)-))K)K11)K)K-*1*-*1*1Œ1Œ5J5J1L1L111L1L) -) -)K)K1L1L5k5k9555A°=¯=Œ=Œ5m5m9Ž55k5k=Œ=Œ55955Ž59555AòAñ5Œ5Œ95=Œ=Œ-l-l55=ð=ð55955Ž5955Ž51L1L5Œ5ŒIðIðAòAñ5595AðAð=Ž=Ž=¯A°=Ž=Ž=Ž=Ž=Œ=Œ=Ž=Ž=Œ=Œ55=Œ=Œ(¥(¥,Æ,Æ(¥(¥,¥,¥,Æ,ÆAðAð)J)J e …$¥$¥$„$„ … e … e ¥ ¥(¥(¥(¥(¥$¥$¥ † † § §$Æ$Æ$Æ$Æ § §$Æ$Æ § §(¥(¥(ç(ç(¥(¥ † †$„$„$¥$¥$¥$¥$¥$¥ ¥ ¥(¥(¥,¥,¥(¥(¥5k5kAòAñ,é,é(¥(¥ Æ Æ(¥(¥$¥$¥$¥$¥$¥$¥$¥$¥ † †(¥(¥(¥(¥(¥(¥,ç,ç=¯A°5J5J(ç(ç(ç(ç,Æ,Æ(ç(ç$Ç$Ç,Æ,Æ,Æ,Æ † †$Æ$Æ § §,¥,¥,ç,ç,Æ,Æ,¥,¥,Æ,Æ0Æ0Æ55--$„$„ † †$„$„(¥(¥ e … e … ¥ ¥(¥(¥ † †(¥(¥$¥$¥ § §$Æ$Æ § §(¥(¥ † †(ç(ç(¥(¥(ç(ç § §$¥$¥$„$„ † †$¥$¥(¥(¥ † †(¥(¥,¥,¥(¥(¥11AðAð1L1L(¥(¥ § §(¥(¥ Æ Æ(¥(¥$¥$¥ † † ¥ ¥(¥(¥$¥$¥(¥(¥,Æ,Æ5m5m9Œ5Œ--,ç,ç$Ç$Ç,Æ,Æ$Ç$Ç,Æ,Æ,Æ,Æ § §(¥(¥ § §(¥(¥,Æ,Æ(¥(¥,Æ,Æ(¥(¥,¥,¥,Æ,ÆAðAð)J)J e …$¥$¥$„$„ … e … e ¥ ¥(¥(¥(¥(¥$¥$¥ † † § §$Æ$Æ$Æ$Æ § §$Æ$Æ § §(¥(¥(ç(ç(¥(¥ † †$„$„$¥$¥$¥$¥$¥$¥ ¥ ¥(¥(¥,¥,¥(¥(¥5k5kAòAñ,é,é(¥(¥ Æ Æ(¥(¥$¥$¥$¥$¥$¥$¥$¥$¥ † †(¥(¥(¥(¥(¥(¥,ç,ç=¯A°5J5J(ç(ç(ç(ç,Æ,Æ(ç(ç$Ç$Ç,Æ,Æ,Æ,Æ † †$Æ$Æ § §,¥,¥,ç,ç,Æ,Æ,¥,¥,Æ,Æ0Æ0Æ55--$„$„ † †$„$„(¥(¥ e … e … ¥ ¥(¥(¥ † †(¥(¥$¥$¥ § §$Æ$Æ § §(¥(¥ † †(ç(ç(¥(¥(ç(ç § §$¥$¥$„$„ † †$¥$¥(¥(¥ † †(¥(¥,¥,¥(¥(¥11AðAð1L1L(¥(¥ § §(¥(¥ Æ Æ(¥(¥$¥$¥ † † ¥ ¥(¥(¥$¥$¥(¥(¥,Æ,Æ5m5m9Œ5Œ--,ç,ç$Ç$Ç,Æ,Æ$Ç$Ç,Æ,Æ,Æ,Æ § §(¥(¥ § §(¥(¥,Æ,Æ(¥(¥,Æ,Æ § §$Æ$Æ,¥,¥5m5m,é,é$¥$¥$„$„ † †$¥$¥$d$„$¥$¥(¥(¥ † †$„$„ † †(¥(¥(¥(¥ † †(¥(¥ § §(¥(¥(¥(¥,Æ,Æ § §(¥(¥$¥$¥ † †(¥(¥ e …(¥(¥,Å,Å,Æ,Æ,Æ,Æ5J5JIðEð--(¥(¥ § §$„$„ § §(¥(¥ † †(¥(¥(¥(¥ † †(¥(¥,¥,¥5595 § §,Æ,Æ(¥(¥,¥,¥ § §(¥(¥,¥,¥ † †$Æ$Æ § §(¥(¥ † †,¥,¥,¥,¥,Æ,Æ,Æ,Æ,Æ,Æ1L1L11 † †$„$d(¥(¥ † †$„$„(¥(¥ e …(¥(¥ † †$¥$¥(¥(¥$¥$¥$¥$¥(¥(¥ † †,Æ,Æ § §(¥(¥ § §,¥,¥(¥(¥ † †$¥$¥$¥$¥ e …$¥$¥,¥,¥,Æ,Æ,Å,Å11AðAð5k5k(¥(¥$Æ$Æ(¥(¥(¥(¥ † †(¥(¥ § §$d$„(¥(¥ § §,¥,¥,¥,¥=Ž=Ž-*1*(¥(¥(¥(¥,¥,¥ § §(¥(¥,¥,¥ § §(¥(¥ † †$Æ$Æ(¥(¥,¥,¥(¥(¥,Æ,Æ § §$Æ$Æ,¥,¥5m5m,é,é$¥$¥$„$„ † †$¥$¥$d$„$¥$¥(¥(¥ † †$„$„ † †(¥(¥(¥(¥ † †(¥(¥ § §(¥(¥(¥(¥,Æ,Æ § §(¥(¥$¥$¥ † †(¥(¥ e …(¥(¥,Å,Å,Æ,Æ,Æ,Æ5J5JIðEð--(¥(¥ § §$„$„ § §(¥(¥ † †(¥(¥(¥(¥ † †(¥(¥,¥,¥5595 § §,Æ,Æ(¥(¥,¥,¥ § §(¥(¥,¥,¥ † †$Æ$Æ § §(¥(¥ † †,¥,¥,¥,¥,Æ,Æ,Æ,Æ,Æ,Æ1L1L11 † †$„$d(¥(¥ † †$„$„(¥(¥ e …(¥(¥ † †$¥$¥(¥(¥$¥$¥$¥$¥(¥(¥ † †,Æ,Æ § §(¥(¥ § §,¥,¥(¥(¥ † †$¥$¥$¥$¥ e …$¥$¥,¥,¥,Æ,Æ,Å,Å11AðAð5k5k(¥(¥$Æ$Æ(¥(¥(¥(¥ † †(¥(¥ § §$d$„(¥(¥ § §,¥,¥,¥,¥=Ž=Ž-*1*(¥(¥(¥(¥,¥,¥ § §(¥(¥,¥,¥ § §(¥(¥ † †$Æ$Æ(¥(¥,¥,¥(¥(¥$Æ$Æ(¥(¥ † †,¥,¥-*1*,é,é e …$¥$¥$d$„$„$„(¥(¥$¥$¥$„$„ † †$„$d(¥(¥(¥(¥ † †$¥$¥$„$„(¥(¥ § §(¥(¥(¥(¥(¥(¥(¥(¥$¥$¥$¥$¥(¥(¥(¥(¥,Æ,Æ,Æ,Æ,Å,Å,¥,¥5k5kA¯=°$Ç$Ç$Æ$Æ(¥(¥ † †(¥(¥ † †(¥(¥ † † † †(¥(¥ § §(¥(¥,é,é=¯A°,æ,ç,¥,¥,¥,¥,¥,¥ § §(¥(¥,¥,¥,Æ,Æ,¥,¥ § §(¥(¥ † †$Æ$Æ$Ç$Ç,¥,¥,é,é0ç0ç1L1L-*1*$d$„(¥(¥$„$„$„$„ † †$„$„(¥(¥$„$„ † †$„$„(¥(¥ † †$„$„ † †$„$„$¥$¥(¥(¥(¥(¥(¥(¥,Æ,Æ$¥$¥$¥$¥ ¥ ¥(¥(¥(¥(¥,¥,¥,Æ,Æ,Å,Å,Å,Å11=¯A°-*1*(¥(¥ § §(¥(¥ † †(¥(¥ † †(¥(¥(¥(¥ † †(¥(¥(¥(¥,¥,¥5m5m1L1L,¥,¥,¥,¥,¥,¥,¥,¥ § §,Æ,Æ(¥(¥(¥(¥,Æ,Æ † † § §(¥(¥(¥(¥$Æ$Æ(¥(¥ † †,¥,¥-*1*,é,é e …$¥$¥$d$„$„$„(¥(¥$¥$¥$„$„ † †$„$d(¥(¥(¥(¥ † †$¥$¥$„$„(¥(¥ § §(¥(¥(¥(¥(¥(¥(¥(¥$¥$¥$¥$¥(¥(¥(¥(¥,Æ,Æ,Æ,Æ,Å,Å,¥,¥5k5kA¯=°$Ç$Ç$Æ$Æ(¥(¥ † †(¥(¥ † †(¥(¥ † † † †(¥(¥ § §(¥(¥,é,é=¯A°,æ,ç,¥,¥,¥,¥,¥,¥ § §(¥(¥,¥,¥,Æ,Æ,¥,¥ § §(¥(¥ † †$Æ$Æ$Ç$Ç,¥,¥,é,é0ç0ç1L1L-*1*$d$„(¥(¥$„$„$„$„ † †$„$„(¥(¥$„$„ † †$„$„(¥(¥ † †$„$„ † †$„$„$¥$¥(¥(¥(¥(¥(¥(¥,Æ,Æ$¥$¥$¥$¥ ¥ ¥(¥(¥(¥(¥,¥,¥,Æ,Æ,Å,Å,Å,Å11=¯A°-*1*(¥(¥ § §(¥(¥ † †(¥(¥ † †(¥(¥(¥(¥ † †(¥(¥(¥(¥,¥,¥5m5m1L1L,¥,¥,¥,¥,¥,¥,¥,¥ § §,Æ,Æ(¥(¥(¥(¥,Æ,Æ † † § §(¥(¥(¥(¥ † †(¥(¥(¥(¥ § §55) -) -$„$„$„$„$„$„(¥(¥$„$„(¥(¥(¥(¥(¥(¥(¥(¥$„$„ † †$„$d$¥$¥$¥$¥(¥(¥(¥(¥,¥,¥,¥,¥(¥(¥(¥(¥(¥(¥(¥(¥,Æ,Æ,¥,¥,Æ,Æ,Æ,Æ,Æ,Æ,Å,Å55A°=¯$Ç$Ç(¥(¥ † † † †$„$„ † †(¥(¥$¥$¥ † †(¥(¥$¥$¥(¥(¥0ç0ç=Ž=Ž11,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥ § §(¥(¥,Æ,Æ(¥(¥ † † § § § §(¥(¥$Ç$Ç$Ç$Ç,é,é5k5k) -) -$d$„$„$„(¥(¥$d$„$d$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$d$„(¥(¥ e …(¥(¥ † †(¥(¥$d$„,¥,¥,¥,¥(ç(ç(¥(¥(¥(¥(¥(¥,¥,¥,¥,¥0ç0ç,Å,Å,Æ,Æ,Å,Å1)1)AðAð)K)K(¥(¥ † † † †$„$„ † †(¥(¥ † †$¥$¥ † †(¥(¥ § §(¥(¥=Œ=Œ5k5k,¥,¥,¥,¥,¥,¥,Æ,Æ(¥(¥(¥(¥,¥,¥,Æ,Æ(¥(¥ † †(¥(¥(¥(¥(¥(¥ † †(¥(¥(¥(¥ § §55) -) -$„$„$„$„$„$„(¥(¥$„$„(¥(¥(¥(¥(¥(¥(¥(¥$„$„ † †$„$d$¥$¥$¥$¥(¥(¥(¥(¥,¥,¥,¥,¥(¥(¥(¥(¥(¥(¥(¥(¥,Æ,Æ,¥,¥,Æ,Æ,Æ,Æ,Æ,Æ,Å,Å55A°=¯$Ç$Ç(¥(¥ † † † †$„$„ † †(¥(¥$¥$¥ † †(¥(¥$¥$¥(¥(¥0ç0ç=Ž=Ž11,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥ § §(¥(¥,Æ,Æ(¥(¥ † † § § § §(¥(¥$Ç$Ç$Ç$Ç,é,é5k5k) -) -$d$„$„$„(¥(¥$d$„$d$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$d$„(¥(¥ e …(¥(¥ † †(¥(¥$d$„,¥,¥,¥,¥(ç(ç(¥(¥(¥(¥(¥(¥,¥,¥,¥,¥0ç0ç,Å,Å,Æ,Æ,Å,Å1)1)AðAð)K)K(¥(¥ † † † †$„$„ † †(¥(¥ † †$¥$¥ † †(¥(¥ § §(¥(¥=Œ=Œ5k5k,¥,¥,¥,¥,¥,¥,Æ,Æ(¥(¥(¥(¥,¥,¥,Æ,Æ(¥(¥ † †(¥(¥(¥(¥$¥$¥(¥(¥ † †(¥(¥$Ç$Ç55) -) - e …$„$„$„$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$„$„ † †(¥(¥$¥$¥$d$„,¥,¥(¥(¥(¥(¥,Å,Å0ç0ç,¥,¥,Æ,Æ,Æ,Æ(¥(¥,Æ,Æ(¥(¥0ç0ç,Å,Å0ç0ç,Æ,Æ5J5JAðAð)) † †(¥(¥ † †(¥(¥ † † † † … e$¥$¥$¥$¥ † †(¥(¥0ç0ç5m5m--,¥,¥0ç0ç(¥(¥,¥,¥,¥,¥,¥,¥,Æ,Æ(¥(¥(¥(¥ † †$Æ$Æ § §(¥(¥ § §,Æ,Æ$Ç$Ç=Ž=Ž1)1)$d$„(¥(¥$d$„$„$„$„$d(¥(¥(¥(¥(¥(¥(¥(¥$„$„(¥(¥ e …(¥(¥(¥(¥$„$„(¥(¥(¥(¥,¥,¥0ç0ç,¥,¥(¥(¥,Æ,Æ,¥,¥,Æ,Æ,Å,Å,Æ,Æ,Æ,Æ0ç0ç,Å,Å--=¯A°-*1* § §(¥(¥ † †(¥(¥ † † … e ¥ ¥$¥$¥ † †$¥$¥(¥(¥(¥(¥5k5k1L1L,¥,¥0Æ0Æ,¥,¥,¥,¥,¥,¥ § §,¥,¥,¥,¥,Æ,Æ † †$Æ$Æ † †$¥$¥(¥(¥ † †(¥(¥$Ç$Ç55) -) - e …$„$„$„$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$„$„ † †(¥(¥$¥$¥$d$„,¥,¥(¥(¥(¥(¥,Å,Å0ç0ç,¥,¥,Æ,Æ,Æ,Æ(¥(¥,Æ,Æ(¥(¥0ç0ç,Å,Å0ç0ç,Æ,Æ5J5JAðAð)) † †(¥(¥ † †(¥(¥ † † † † … e$¥$¥$¥$¥ † †(¥(¥0ç0ç5m5m--,¥,¥0ç0ç(¥(¥,¥,¥,¥,¥,¥,¥,Æ,Æ(¥(¥(¥(¥ † †$Æ$Æ § §(¥(¥ § §,Æ,Æ$Ç$Ç=Ž=Ž1)1)$d$„(¥(¥$d$„$„$„$„$d(¥(¥(¥(¥(¥(¥(¥(¥$„$„(¥(¥ e …(¥(¥(¥(¥$„$„(¥(¥(¥(¥,¥,¥0ç0ç,¥,¥(¥(¥,Æ,Æ,¥,¥,Æ,Æ,Å,Å,Æ,Æ,Æ,Æ0ç0ç,Å,Å--=¯A°-*1* § §(¥(¥ † †(¥(¥ † † … e ¥ ¥$¥$¥ † †$¥$¥(¥(¥(¥(¥5k5k1L1L,¥,¥0Æ0Æ,¥,¥,¥,¥,¥,¥ § §,¥,¥,¥,¥,Æ,Æ † †$Æ$Æ † †$„$„ † †(¥(¥(¥(¥,Æ,Æ,é,é,é,éc„ e …$d$„$d$„ ¥ ¥$„$„$„$d(¥(¥ e …$„$„$„$„(¥(¥$¥$¥(¥(¥,¥,¥,¥,¥,¥,¥,¥,¥(¥(¥$¥$¥(¥(¥,¥,¥,Æ,Æ(¥(¥,Å,Å,Æ,Æ(¥(¥,¥,¥-)-)=Ž=Ž) -) - ¥ ¥(¥(¥ † † … e$¥$¥ † † ¥ ¥(¥(¥ † †(¥(¥ † †(¥(¥5m5m,é,é,¥,¥,¥,¥,¥,¥,Æ,Æ,¥,¥,¥,¥(¥(¥,Æ,Æ,¥,¥(¥(¥ † †(¥(¥ † †,Æ,Æ † †(ç(ç1L1L11 e …$d$„$„$„ … e$„$„ … e$¥$¥$„$„$„$d(¥(¥ d „$„$„ † †$„$„(¥(¥,¥,¥(¥(¥,¥,¥,¥,¥,¥,¥$¥$¥(¥(¥,Æ,Æ,¥,¥,Æ,Æ(¥(¥,Å,Å,Å,Å(¥(¥,ç,ç559Ž5$d$„(¥(¥ † † … e Æ Æ$„$„ … e$¥$¥$¥$¥ † † § § d „-*1*-*1*,¥,¥,¥,¥,Æ,Æ,¥,¥,Æ,Æ(¥(¥,¥,¥,Å,Å,¥,¥(¥(¥ e …$d$„$„$„ † †(¥(¥(¥(¥,Æ,Æ,é,é,é,éc„ e …$d$„$d$„ ¥ ¥$„$„$„$d(¥(¥ e …$„$„$„$„(¥(¥$¥$¥(¥(¥,¥,¥,¥,¥,¥,¥,¥,¥(¥(¥$¥$¥(¥(¥,¥,¥,Æ,Æ(¥(¥,Å,Å,Æ,Æ(¥(¥,¥,¥-)-)=Ž=Ž) -) - ¥ ¥(¥(¥ † † … e$¥$¥ † † ¥ ¥(¥(¥ † †(¥(¥ † †(¥(¥5m5m,é,é,¥,¥,¥,¥,¥,¥,Æ,Æ,¥,¥,¥,¥(¥(¥,Æ,Æ,¥,¥(¥(¥ † †(¥(¥ † †,Æ,Æ † †(ç(ç1L1L11 e …$d$„$„$„ … e$„$„ … e$¥$¥$„$„$„$d(¥(¥ d „$„$„ † †$„$„(¥(¥,¥,¥(¥(¥,¥,¥,¥,¥,¥,¥$¥$¥(¥(¥,Æ,Æ,¥,¥,Æ,Æ(¥(¥,Å,Å,Å,Å(¥(¥,ç,ç559Ž5$d$„(¥(¥ † † … e Æ Æ$„$„ … e$¥$¥$¥$¥ † † § § d „-*1*-*1*,¥,¥,¥,¥,Æ,Æ,¥,¥,Æ,Æ(¥(¥,¥,¥,Å,Å,¥,¥(¥(¥ e …$d$„ § §$Ç$Ç$Ç$Ç,é,é1L1L5m5m-l-l$Ç$Ç § § ç ç § § § § § §%%) -) -$Ç$Ç%%$Ç$Ç) -) -$Ç$Ç1*-*$Ç$Ç,é,é%%$Ç$Ç%%$Ç$Ç%%$Ç$Ç)),é,é)K)K-*1*5k5k=Œ=Œ5595-*1* † †$Ç$Ç$Ç$Ç ç ç%%!!$Ç$Ç) -) -!!!!1L1L55A¯=°1L1L551)1),é,é4ç4ç1111) -) -951L1L-*1*-*1*,é,é$Ç$Ç-*1*)K)K,é,é1Œ1Œ1L1L,ç,ç--,é,é † † ç ç § § § §$Ç$Ç) -) -!!,é,é%%,é,é%%) -) -,é,é%%11!!$Ç$Ç$Ç$Ç%%$Ç$Ç$Ç$Ç) -) -) -) -1*-*1L1L=Œ=Œ559n5m1Œ1Œ § § § §)) § §!!) -) -!!) -) -$Ç$Ç!!-*1*5n5mA¯=°11,è,é$Ç$Ç$Ç$Ç!!,é,é%%) -) -11) -) -) -) -) -) -) -) - § §$Ç$Ç$Ç$Ç,é,é1L1L5m5m-l-l$Ç$Ç § § ç ç § § § § § §%%) -) -$Ç$Ç%%$Ç$Ç) -) -$Ç$Ç1*-*$Ç$Ç,é,é%%$Ç$Ç%%$Ç$Ç%%$Ç$Ç)),é,é)K)K-*1*5k5k=Œ=Œ5595-*1* † †$Ç$Ç$Ç$Ç ç ç%%!!$Ç$Ç) -) -!!!!1L1L55A¯=°1L1L551)1),é,é4ç4ç1111) -) -951L1L-*1*-*1*,é,é$Ç$Ç-*1*)K)K,é,é1Œ1Œ1L1L,ç,ç--,é,é † † ç ç § § § §$Ç$Ç) -) -!!,é,é%%,é,é%%) -) -,é,é%%11!!$Ç$Ç$Ç$Ç%%$Ç$Ç$Ç$Ç) -) -) -) -1*-*1L1L=Œ=Œ559n5m1Œ1Œ § § § §)) § §!!) -) -!!) -) -$Ç$Ç!!-*1*5n5mA¯=°11,è,é$Ç$Ç$Ç$Ç!!,é,é%%) -) -11) -) -) -) -) -) -) -) -55AðAð=¯A°55AðAð=Ž=Ž=Ž=Ž=ï=ï1Œ1Œ=¯A°55A¯=°55115k5k951L1L1Œ1Œ1L1L551L1L1L1L1Œ1Œ559Œ5Œ11=Ž=ŽAòAñAðAð55=Ž=Ž=ï=ïAðAð=¯A°EïIïEðIðAðAð=ï=ï=Ž=ŽAðAð=ð=ðAòAñ=¯A°EðIð=ð=ðAòAñ=Ž=Ž=Ž=ŽIðEðIðEðAðAð=¯A°=ï=ï=Œ=ŒAðAð=ð=ðAòAñ=Ž=ŽAðAðAðAðAðAðJFNSN3=ð=ðIðEðAòAñJFAðAð1Œ1Œ=Ž=Ž=Ž=Ž=Ž=Ž5Œ5ŒA¯=°=Ž=ŽAðAð5511559k5k1L1L1L1L1L1L551L1L1L1L1Œ1Œ5m5m955595AðAðAðAð55=ï=ï=Ž=ŽAïAï=ï=ï=¯A°FJEðIð=Ž=ŽAðAð55IðIðAðAðAðAðAðAð=¯A°=ð=ð=¯A°9Ž=ŽAðAðIðEðAïAïAðAð=Ž=Ž=ï=ï=¯A°=ÏA°9ð=ð=¯A°=ÏA°9ð=ð=ð=ðJFNSN3AðAð59AðAð=¯A°55AðAð=Ž=Ž=Ž=Ž=ï=ï1Œ1Œ=¯A°55A¯=°55115k5k951L1L1Œ1Œ1L1L551L1L1L1L1Œ1Œ559Œ5Œ11=Ž=ŽAòAñAðAð55=Ž=Ž=ï=ïAðAð=¯A°EïIïEðIðAðAð=ï=ï=Ž=ŽAðAð=ð=ðAòAñ=¯A°EðIð=ð=ðAòAñ=Ž=Ž=Ž=ŽIðEðIðEðAðAð=¯A°=ï=ï=Œ=ŒAðAð=ð=ðAòAñ=Ž=ŽAðAðAðAðAðAðJFNSN3=ð=ðIðEðAòAñJFAðAð1Œ1Œ=Ž=Ž=Ž=Ž=Ž=Ž5Œ5ŒA¯=°=Ž=ŽAðAð5511559k5k1L1L1L1L1L1L551L1L1L1L1Œ1Œ5m5m955595AðAðAðAð55=ï=ï=Ž=ŽAïAï=ï=ï=¯A°FJEðIð=Ž=ŽAðAð55IðIðAðAðAðAðAðAð=¯A°=ð=ð=¯A°9Ž=ŽAðAðIðEðAïAïAðAð=Ž=Ž=ï=ï=¯A°=ÏA°9ð=ð=¯A°=ÏA°9ð=ð=ð=ðJFNSN3AðAð ¥ ¥ e … ¥ ¥ ¥ ¥$¥$¥dd Æ Æ$„$„ … e § §(ç(ç)K)K$¥$¥$c$„$„$„$„$„ ¥ ¥$d$„$„$„ ¥ ¥$d$„$„$„ „ „,Å,Å(ç(ç,é,é ç ç(¥(¥ ç ç(¥(¥¥¥$¥$¥$¥$¥¥¥ § §,Å,Å(ç(ç$Æ$Æ$Ç$Ç(ç(ç(¥(¥(ç(ç$Æ$Æ,Æ,Æ$Æ$Æ § §$¥$¥(¥(¥$Æ$Æ$¥$¥$¥$¥ † †(ç(ç(¥(¥1L1L))$¥$¥dd¥¥dd¥¥ † † „ „ … eÆÆ$¥$¥ e …¥¥$¥$¥ † † ¥ ¥ ¥ ¥ e … Æ Æ(¥(¥-*1* ç ç$d$„$„$„$¥$¥$d$„$¥$¥$„$„$„$d$„$„ „ „dd(¥(¥,ç,ç,ç,ç%%$¥$¥ § § ç ç ¥ ¥ ¥ ¥$¥$¥ † †(¥(¥ § §,Å,Å$Ç$Ç(ç(ç(ç(ç Æ Æ,Æ,Æ$Æ$Æ,Æ,Æ$Æ$Æ § §(¥(¥ † †$Æ$Æ(¥(¥¥¥ § §(¥(¥$Æ$Æ55) -) - ç ç † †dd „ „¥¥ † †¥¥ e … ¥ ¥ e … ¥ ¥ ¥ ¥$¥$¥dd Æ Æ$„$„ … e § §(ç(ç)K)K$¥$¥$c$„$„$„$„$„ ¥ ¥$d$„$„$„ ¥ ¥$d$„$„$„ „ „,Å,Å(ç(ç,é,é ç ç(¥(¥ ç ç(¥(¥¥¥$¥$¥$¥$¥¥¥ § §,Å,Å(ç(ç$Æ$Æ$Ç$Ç(ç(ç(¥(¥(ç(ç$Æ$Æ,Æ,Æ$Æ$Æ § §$¥$¥(¥(¥$Æ$Æ$¥$¥$¥$¥ † †(ç(ç(¥(¥1L1L))$¥$¥dd¥¥dd¥¥ † † „ „ … eÆÆ$¥$¥ e …¥¥$¥$¥ † † ¥ ¥ ¥ ¥ e … Æ Æ(¥(¥-*1* ç ç$d$„$„$„$¥$¥$d$„$¥$¥$„$„$„$d$„$„ „ „dd(¥(¥,ç,ç,ç,ç%%$¥$¥ § § ç ç ¥ ¥ ¥ ¥$¥$¥ † †(¥(¥ § §,Å,Å$Ç$Ç(ç(ç(ç(ç Æ Æ,Æ,Æ$Æ$Æ,Æ,Æ$Æ$Æ § §(¥(¥ † †$Æ$Æ(¥(¥¥¥ § §(¥(¥$Æ$Æ55) -) - ç ç † †dd „ „¥¥ † †¥¥ e … e …$d$„dƒ$„$„dd … eƒdƒd … e$„$d$Æ$Æ5J5J d „ e …$d$„$d$„ d ƒ$d$„$d$„dƒdƒdƒ e …$„$„$¥$¥5J5J † †$¥$¥dd … edddd¥¥(¥(¥dd † †$„$d$¥$¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥ † †$„$„(¥(¥ † † … e$¥$¥ e …¥¥ † †(¥(¥=Œ=Œ$Ç$Ç e …¥¥dd$¥$¥ e …¥¥dd¥¥ d „ e …$d$„$d$„dƒ e …c„c„$d$„dƒ$¥$¥-*1* § §$d$„$d$„$d$„dƒ$d$ƒ$d$„„„dc$„$d „ „„c$„$„11,é,é „ „ … edddddd ¥ ¥dd$¥$¥ e … ¥ ¥ e …$¥$¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥ † †$¥$¥$¥$¥$„$„ † † … e „ „¥¥(¥(¥-*1*1L1L$d$„dd¥¥ e … e …dd … e „ „ … e$„$d„c$„$„dd … eƒdƒd … e$„$d$Æ$Æ5J5J d „ e …$d$„$d$„ d ƒ$d$„$d$„dƒdƒdƒ e …$„$„$¥$¥5J5J † †$¥$¥dd … edddd¥¥(¥(¥dd † †$„$d$¥$¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥ † †$„$„(¥(¥ † † … e$¥$¥ e …¥¥ † †(¥(¥=Œ=Œ$Ç$Ç e …¥¥dd$¥$¥ e …¥¥dd¥¥ d „ e …$d$„$d$„dƒ e …c„c„$d$„dƒ$¥$¥-*1* § §$d$„$d$„$d$„dƒ$d$ƒ$d$„„„dc$„$d „ „„c$„$„11,é,é „ „ … edddddd ¥ ¥dd$¥$¥ e … ¥ ¥ e …$¥$¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥ † †$¥$¥$¥$¥$„$„ † † … e „ „¥¥(¥(¥-*1*1L1L$d$„dd¥¥ e … e …dd … e „ „$d$„$„$„ƒd … e$„$d„c$„$d„c „ c$„$d$Æ$Æ11dd$„$„$„$d „ ƒ$„$c$„$„ƒd$„$d„c ¥ ¥$d$„dƒ$„$„-*1*$¥$¥ e …dd „ „¥¥dd … edd ¥ ¥$„$„$¥$¥ † †$„$„ † †(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥ † † † †$„$„ † † … e „ „ … e¥¥,¥,¥5m5m,é,édd ¥ ¥dd … e„„ … e¥¥ † †dd$„$ddc$¥$¥$d$„ d ƒdƒ$d$„dƒ$d$„$d$„1)1) § § c „$„$„ ƒ d$ƒ$d$„$„$„$„ƒd$„$d„c„c … e$„$„11%%dd „ „dd¥¥dd … e ¥ ¥ e … ¥ ¥$d$„$¥$¥$¥$¥$„$„ † †(¥(¥(¥(¥(¥(¥(¥(¥ † †$„$„ † † … e$¥$¥dd¥¥ † †(¥(¥55-l-l † † … edd „ „¥¥$d$„dƒ$d$„$„$d$„$„ƒd … e$„$d„c$„$d„c „ c$„$d$Æ$Æ11dd$„$„$„$d „ ƒ$„$c$„$„ƒd$„$d„c ¥ ¥$d$„dƒ$„$„-*1*$¥$¥ e …dd „ „¥¥dd … edd ¥ ¥$„$„$¥$¥ † †$„$„ † †(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥ † † † †$„$„ † † … e „ „ … e¥¥,¥,¥5m5m,é,édd ¥ ¥dd … e„„ … e¥¥ † †dd$„$ddc$¥$¥$d$„ d ƒdƒ$d$„dƒ$d$„$d$„1)1) § § c „$„$„ ƒ d$ƒ$d$„$„$„$„ƒd$„$d„c„c … e$„$„11%%dd „ „dd¥¥dd … e ¥ ¥ e … ¥ ¥$d$„$¥$¥$¥$¥$„$„ † †(¥(¥(¥(¥(¥(¥(¥(¥ † †$„$„ † † … e$¥$¥dd¥¥ † †(¥(¥55-l-l † † … edd „ „¥¥$d$„dƒ$d$„$d$„dƒ$d$„dƒ$d$ƒdƒ d ƒ$d$„ d ƒ$„$„(ç(ç-*1* e …$„$„$„$„$„$d$„$„$„$„$„$d „ „„c$„$d „ „$„$d$„$„-*1*¥¥dd „ „dddd„„dd „ „¥¥ † †$„$„(¥(¥ † †$„$„ † †$„$d(¥(¥(¥(¥e… e … e … ¥ ¥$d$„ „ „dd$¥$¥$¥$¥(¥(¥5m5m$ç$çdddd „ „¥¥dd¥¥ d „dd … e$„$d„c$„$d$„$d„c „ c „ c$„$c$„$d$„$„-*1* § §$„$„$„$d$„$„$„$„$„$„$„$d „ „„c$„$„dd$„$„$„$d-)-) ç çdd „ „dddd „ „dd „ „dd ¥ ¥$¥$¥$„$„(¥(¥ † †$„$„(¥(¥$d$„ † †(¥(¥dd † †$„$d „ „$¥$¥dd † †$„$„(¥(¥) -) -1L1L d „dƒ „ „…e … eƒdƒd … e$„$d„c$„$d„c$„$c„c „ c$„$d „ c$„$„(ç(ç-*1* e …$„$„$„$„$„$d$„$„$„$„$„$d „ „„c$„$d „ „$„$d$„$„-*1*¥¥dd „ „dddd„„dd „ „¥¥ † †$„$„(¥(¥ † †$„$„ † †$„$d(¥(¥(¥(¥e… e … e … ¥ ¥$d$„ „ „dd$¥$¥$¥$¥(¥(¥5m5m$ç$çdddd „ „¥¥dd¥¥ d „dd … e$„$d„c$„$d$„$d„c „ c „ c$„$c$„$d$„$„-*1* § §$„$„$„$d$„$„$„$„$„$„$„$d „ „„c$„$„dd$„$„$„$d-)-) ç çdd „ „dddd „ „dd „ „dd ¥ ¥$¥$¥$„$„(¥(¥ † †$„$„(¥(¥$d$„ † †(¥(¥dd † †$„$d „ „$¥$¥dd † †$„$„(¥(¥) -) -1L1L d „dƒ „ „…e … eƒdƒd … e$d$„ d ƒdƒ$d$„ d ƒ$d$ƒ d ƒ d ƒ d ƒ$„$„(¥(¥1L1L$d$„$„$„ƒd$„$„$„$„$¥$¥$c$„$„$„$„$d „ ƒ$„$d$„$„$„$„%%dddd „ „dd„„dc „ „dd$¥$¥$„$„ † †$„$„ † †(¥(¥$d$„(¥(¥$d$„ † †$„$„ … e$„$d$„$„ … e ¥ ¥dd$¥$¥(¥(¥(¥(¥5k5k$Ç$Çd„dddddd … edddd ¥ ¥$d$„dƒ$d$„dƒ$d$„ d ƒ d ƒ d ƒ d ƒ$d$„$„$„-*1*$Ç$Ç d ƒ$„$„$„$„ƒd$¥$¥$„$„$„$d$„$„$„$d$„$„ „ „$„$d(ç(ç † †dddd „ „dddc „ „dd ¥ ¥$„$„(¥(¥ † †$„$„(¥(¥ e …(¥(¥(¥(¥$d$„(¥(¥ d „ e …$„$„ … e ¥ ¥ e … ¥ ¥$„$„(¥(¥111L1Lcddddd„„dd¥¥ d „$d$„$„$d „ c„c$„$d „ c$„$c „ c „ c „ c$„$„(¥(¥1L1L$d$„$„$„ƒd$„$„$„$„$¥$¥$c$„$„$„$„$d „ ƒ$„$d$„$„$„$„%%dddd „ „dd„„dc „ „dd$¥$¥$„$„ † †$„$„ † †(¥(¥$d$„(¥(¥$d$„ † †$„$„ … e$„$d$„$„ … e ¥ ¥dd$¥$¥(¥(¥(¥(¥5k5k$Ç$Çd„dddddd … edddd ¥ ¥$d$„dƒ$d$„dƒ$d$„ d ƒ d ƒ d ƒ d ƒ$d$„$„$„-*1*$Ç$Ç d ƒ$„$„$„$„ƒd$¥$¥$„$„$„$d$„$„$„$d$„$„ „ „$„$d(ç(ç † †dddd „ „dddc „ „dd ¥ ¥$„$„(¥(¥ † †$„$„(¥(¥ e …(¥(¥(¥(¥$d$„(¥(¥ d „ e …$„$„ … e ¥ ¥ e … ¥ ¥$„$„(¥(¥111L1Lcddddd„„dd¥¥ d „$d$„$d$„ d ƒ$d$ƒ d ƒ$d$ƒ d ƒ$d$„ d ƒ$d$ƒ$d$„$¥$¥1Œ1Œ$d$„dƒ$„$„$„$d$„$c$„$„$„$„$„$d „ c$„$„$„$„ƒd$¥$¥ § § „ „ „ „„c„cdd ¥ ¥$„$„(¥(¥$„$„(¥(¥(¥(¥(¥(¥,¥,¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥(¥(¥(¥(¥(¥(¥$d$„(¥(¥$„$„(¥(¥(¥(¥ † †(¥(¥1L1L § § e … „ „dc„„„d¥¥dd … e ƒ d ƒ d$„$d$„$c$„$c „ c „ c „ c$„$c$„$c$„$d5J5J ç ç$d$„$d$„$„$„ ƒ d$„$„$„$„$ƒ$d$„$d „ c$„$„$„$d „ ƒ(¥(¥ Æ Æc„ e …c„ „ „„c ¥ ¥$„$„(¥(¥$d$„(¥(¥,¥,¥(¥(¥ § §,¥,¥$d$„,¥,¥ † †,¥,¥(¥(¥,¥,¥(¥(¥$d$„$¥$¥$d$„(¥(¥,¥,¥ † †,é,é-*1*dƒdd„„„ddddddc$„$d$„$d „ c$„$c „ c$„$c „ c$„$d „ c$„$c$„$d$¥$¥1Œ1Œ$d$„dƒ$„$„$„$d$„$c$„$„$„$„$„$d „ c$„$„$„$„ƒd$¥$¥ § § „ „ „ „„c„cdd ¥ ¥$„$„(¥(¥$„$„(¥(¥(¥(¥(¥(¥,¥,¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥(¥(¥(¥(¥(¥(¥$d$„(¥(¥$„$„(¥(¥(¥(¥ † †(¥(¥1L1L § § e … „ „dc„„„d¥¥dd … e ƒ d ƒ d$„$d$„$c$„$c „ c „ c „ c$„$c$„$c$„$d5J5J ç ç$d$„$d$„$„$„ ƒ d$„$„$„$„$ƒ$d$„$d „ c$„$„$„$d „ ƒ(¥(¥ Æ Æc„ e …c„ „ „„c ¥ ¥$„$„(¥(¥$d$„(¥(¥,¥,¥(¥(¥ § §,¥,¥$d$„,¥,¥ † †,¥,¥(¥(¥,¥,¥(¥(¥$d$„$¥$¥$d$„(¥(¥,¥,¥ † †,é,é-*1*dƒdd„„„ddddddc$„$d † † † † † †$¥$¥ § § † †…edddddd § §1L1L%% § §(¥(¥ † †,Æ,Æ(ç(ç$Ç$Ç$Æ$Æ § § Æ Æ § §$Æ$Æ,Æ,Æ) -) -) -) -(ç(ç § § † †dd$„$ddd † † „ d$„$„ … edd … e † †…e „ d … e † †$„$„ „ d(¥(¥$¥$¥ † † … e § § † † † † § §)K)K § §cd„ddddcdcdcdd$„$d ¥ ¥ † †(¥(¥ † † † †$Ç$Çe…e… d „dc † †-*1*)K)K$Ç$Ç † † … e(¥(¥,ç,ç(ç(ç § §$Æ$Æ § § Æ Æ$Æ$Æ § §11) -) -,é,é ç ç † †dddd … e … e … e$¥$¥ d „dd … e … e † † „ d † †$„$„ † †$„$ddd(¥(¥ † † … e † † § § † † † †-*1*) -) -f†f†ÆÆ$Ç$Çe…d„e…f† † † † † † †$¥$¥ § § † †…edddddd § §1L1L%% § §(¥(¥ † †,Æ,Æ(ç(ç$Ç$Ç$Æ$Æ § § Æ Æ § §$Æ$Æ,Æ,Æ) -) -) -) -(ç(ç § § † †dd$„$ddd † † „ d$„$„ … edd … e † †…e „ d … e † †$„$„ „ d(¥(¥$¥$¥ † † … e § § † † † † § §)K)K § §cd„ddddcdcdcdd$„$d ¥ ¥ † †(¥(¥ † † † †$Ç$Çe…e… d „dc † †-*1*)K)K$Ç$Ç † † … e(¥(¥,ç,ç(ç(ç § §$Æ$Æ § § Æ Æ$Æ$Æ § §11) -) -,é,é ç ç † †dddd … e … e … e$¥$¥ d „dd … e … e † † „ d † †$„$„ † †$„$ddd(¥(¥ † † … e † † § § † † † †-*1*) -) -f†f†ÆÆ$Ç$Çe…d„e…f†)K55m9m111L)K) -)K1L5mA°=¯55AïJEðAðIðAðAðIðAðAðAðIðAð1Œ-*1L)K1L-l1L1L)K5m)K1L)K)K)K) -) -)K1L15m15511L111L)K) -)K) -)K151*) -)K1L1-l1L) -)K)K1L5Ið55AðAïJAðAðAðAðAïIðAðAðIðAð51L)K-*-l-*-l-l1L)K5m1L)K)K)K) -) -)K)K5m-l155911L511Aï-*)K)K) -11-15k=Ž,ç §(¥ § ç § ¥ Æ Æ(¥ ç$Æ(ç(ç$Ç(ç(ç$Æ § ¥ ¥(ç § ¥ § Æ$Æ,ç5J559k5=Œ5m=Œ=Ž=Ž559k5m559k5I1-5J5k5I9k5k5k5k9k5k5k5,Æ,¥,Æ4ç51),Æ †(ç § ç Æ$¥ § Æ(¥ ç(ç(ç(ç(ç$Æ(ç$Æ § „ ç(ç$¥$¥ § ç,Æ1=¯1Œ5m=Œ5k59=Œ=Ž55=Œ5m=ŽNS=Ž5I5)11)5J5k5k9I5k5J5k5k1L(¥ e$„$„,é5(¥$d „dddcd$„ ¥$dd „dddddd„d „$¥ ddd …$„1)=Ž0ç(¥(¥(¥(¥ §,¥0ç,Æ$Ç0ç0ç1L1Œ(¥(¥ e(¥$„$„,¥,¥,¤,¥,¥,¥,¥,¥,¥,¥,Æ,Æ,Æ5m1d d „dcdd „$d ¥d dd „dddd„dd$¥dddd(¥,¥55,¥ †(¥(¥(¥,¥$Ç0Æ0ç$Ç,Æ5)Aò-(¥ d(¥(¥$„,¥,¤,¥,¤,¥,¥,¥,¥,Æ,¥ † e0ç5m(¥ ddd„dddd ¥ „dddd„dd„dd¥ddd„d(¥55$Ç(¥ †,¥$Ç,Æ$Ç,Æ$Ç0ç$Ç0Æ=Ž1L,Æ(¥ †(¥ †(¥(¥(¥$d,¥0Æ,Æ,Æ$Ç,Æ$Ç,¥,Æ,Æ1L) -$d „dd„dd „d ecdd„ddd„d „d¥ dd „d …,Æ51 §(¥ §,¥$Ç0ç$Ç0ç$Ç,Æ,é5)A¯$Ç,¥ §(¥ †(¥(¥(¥(¥(¥(¥,Æ(¥,Æ,Æ † e „,é1Œ,¥dd„dd„d „ …dd „„dddd„d„ …$¥dd„d$¥-50ç$Ç,¥$Ç §,Æ$Ç0ç$Ç,Æ$Ç0ç=Ž5(¥(¥ †(¥ †$Æ †$Ç(¥ §,¥ §0ç,é0ç,é0ç,é$Ç5m5 dd„ddddd „ „d „„dd„d„dd¥ e ¥dcd$¥(¥51*,Æ,Æ,¥$Ç §$Ç,Æ$Ç0ç$Ç,Æ5J=¯,é(¥ † e(¥ † § †$Ç(¥,é(¥ §,Æ(ç$Ç † e11,¥dd„ddd„d „d „d„dd…„ddd¥ … ¥dcd(¥,é5k,é0ç$Ç,¥$Ç §,Æ$Ç,é$Ç0ç,é5k1L$¥f„d…e¥ † †,¥$Ç0ç$Ç,é,ç,é(ç,é,ç5m1* dddd„dddd „ddd„dd„„d „d¥ eƒdd¥(¥5m1,é0ç §$Æ$Ç,¥$Ç,é,¥$Ç,é5)A¯ §¥e„d…¥e † §,ç$Ç,¥,é,ç § e$„-5,¥ddd„ddddd „dddd„dd „ddd$¥$dd„ e$„,ç1Œ5,é0ç §$Ç$Ç,é0ç$Ç0ç$Ç0Æ-*1*d…Æ de…f„dd † §(ç$Æ$Ç$¥ § §,Æ1-$c „dd„d „dd „d„ddƒdd „ddd$¥ eƒdd$„(¥1L1)5$Ç0ç$Ç$Ç$Ç,é0ç$Ç,é,Æ55¥e†e…e…e„d çde(ç,Æ §$Æ †,é5,é §¥ed„e„dd„cdd„dd„¥ed† †¥e § §$Æ-*1L$Ç §$Æ$Ç0ç §,Æ §$Ç,¥ † §=Œ5c¥$Ç † e „¥ † … ¥,Æ$Ç †$Æ †$¥ †¥$Ç11L §$¥e…dd„dddƒddd„d„†¥d… † e† § § §,é-l,é § §(ç$Ç,Æ$Ç,¥$Ç § §(¥1AòÅe(ç § „¥ e¥ … ¥(¥ †¥ †=Ž5k59k5=Ž51*1L1L-*) -1*)K-*1Œ1*)K-*)K-*1*)J1L-*1Œ1L5Œ5=Ž=Ž559Ž1Œ51L1L%,é-*) -)K,é)K1L)K1L=¯Að51L55k=Œ=Ž=Ž=¯A°=ŒAðIðAðAð=¯=Œ559=Ž=Œ1L1L1L-*-))K-*1*1L-l-*1*-*)K-*)K5J-*1L-l5k5Að5Œ595Ž1L=Ž51L-)%) -1*-*) -) --l-*1L1Að=Ž1Œ1L=Ž5k=Ž=Ž=¯A°=Œ=¯Ið=¯A°$¥$¥(¥(¥(¥(¥$„d$¥ ¥ ¥ e$¥(¥1-* ç0Æ(¥(¥,¥,Æ,¥(¥$¥(¥(¥(ç$ç1L-(ç(¥,Æ §(¥(¥ †$Æ § Æ$Æ$Ç(ç,ç,é1(ç,ç,é)--,é,ç---*5J11,ç--,ç,Æ,Æ,Æ(¥(¥(¥d ¥$„ †$¥ e(¥,Æ1L$ç(ç,¥(¥(¥,Æ,¥,Æ ¥$¥(¥(¥(ç)K1),ç,Æ$Æ,Æ §$¥(¥ §(¥ § §(ç$Æ,é,ç,é,ç),ç,é-)-),ç)--11L11 § „ Æde … † e …d¥d e … „$¥ †51,Æ,¥0Æ,¥,Æ,Æ0ç,Æ §(ç Æ$¥$Ç1- §(¥ †$¥ e¥ † … ¥d †$¥ †(¥ †(¥ † § ¥ e „d † § §,¥,é-,¥ †,¥ †(¥ †(¥ e …(¥ ed¥d …d¥ †(¥,Æ5-,¥,Æ,¥0ç,¥$Ç,Æ(ç,Æ$Æ § §1L-*$Æ † § e(¥ …¥ †d¥ † † …$¥$¥$¥ †$Æ †$¥ed … † §(¥,Æ1$Ç(¥ dd…d „ … „¥ e„…¥d¥ † e,Æ11L e,¥,Æ0ç,Æ,Æ,Æ0ç$Ç(ç §$Ç ç1L0ç$Æ †$¥ † e …$¥ e¥ …¥ †(¥ †(¥ † §(¥ †$¥f¥ †$¥ †(¥0Æ,é §,¥$Ç †,¥ †(¥ e …„ ed…¥d¥ † e$¥$Ç5m$Æ,¥,Æ,Æ,Æ0Æ0Æ0ç,Æ$Ç$Ç$ÇÆ-)5J$Ç †(¥ e¥ † … ¥d$¥ e¥(¥ †(¥ † §(¥ e † †„ † †$¥ †,Æ,é,¥$Ç,¥ †dd†d¥ded¥ …e „¥ …$¥) -1Lc,Æ0Æ,Æ0Æ0Æ0ç0Æ$Ç(ç$Ç §-)-*,é$¥ † †$¥ e¥ …¥ e¥ † † §$„ †$¥ † § e¥d¥ † †(¥ §0Æ1$Ç(¥ §(¥ † §$„ e…d¥df „… e „¥ †,¥5m †(¥,Æ,Æ0Æ0Æ0ç0ç0ç §,ç Æ †)K1$Ç † † ¥ †d$¥ e¥ …¥ † §(¥ † †$¥ † †¥ e… Æ †(¥ †,¥-*$Ç,¥ †d …d„d†d „„e …„ e¥… †,é-l,Æ0ç0Æ4ç===55 §$Æ Æ,é1L(ç$¥ †$¥ †e …¥e$¥ †¥ †(¥ †$¥ † †$¥ e¥d„ †$¥ †,¥,é) -,¥ §(¥ †(¥ §(¥ed¥dd„…¥ ed …¥$Ç1L,é,Å4ç58ç==0ç4ç(ç § §$Ç1L,é$¥ †$¥ e¥… e …¥ † e †$¥ † †$¥ † § †d¥d¥ †(¥(¥,Æ-*,é(¥ ed „d „dd „dd„„ e„ …$¥$¥,é1L(ç(ç §,é1=,é0Æ0ç e¥ †)K-)$¥ †(¥ † e „…$¥e …¥ † e(¥ †(¥ †$¥ † …e$¥ … †$¥ §(¥0Æ1L,¥(¥ § †(¥ † †$„cd$¥„dd… „¥ † †,¥-l,é(ç$Ç,Æ,é559,é §dÆ¥)K$Æ §(¥ e¥ †d¥ †d¥$¥ e$¥ †(¥ †$¥ † … „¥ † e$¥ †(¥,¥-*,é(¥(¥dd † †Æ †¥¥¥¥ Æf † Æ † §) -)Kd„dcde†d…%) - ç1L)K †f ††Æe…dd… e† §¥ † † † † … ¥dd¥ † §,Æ$Ç,é5m) -,é$Ç,é$Ç$Ç$Ç † § ç¥ eÆdd¥ † † §$Ç-l çdd C„d†dd §!!%5m § †f Æf… edd†df § † †¥ † †$„ …edd Æ §$Ç §$Ç1L1L$Ç,é$Ç$Ç51Œ55k1LAð1Œ-*1Œ5J-*) -1L1L1Œ51*) -)K%-*1L1Œ5mA°Að55=Ž=Ž5Œ=Ž55Œ9=¯51Œ5m1Œ1LIð55595Ž1L5k5Að51=ŽAð5=Ž=Ž=Ž=Ž=Ž=Ž=Ž=¯A°=Ž=Œ1L5J5J1L5J$Ç) -)K-*1*1L-l51L) -)K%) --l1L15Að=¯=Ž=Ž=Ž5Œ=Ž5Œ59=ŽAð-l1Œ11L=ïAð1Œ55m95n1L5AðAð-l5A¯9Ž=Ž=Ž=Ž=¯=Ž=Ž=Ž=¯,Æ,Æ,Æ,Æ(ç=¯1L e$¥$„ …¥$¥ §(¥ †(ç$Æ$Ç,Æ §$Ç(ç(ç(ç(ç(¥$¥$¥ Æ$Æ(¥(ç0ç(¥5kIð1$Ç$Ç(ç ç(¥ ç(¥ §(ç(¥,ç-Aò5k1-,ç--,ç,ç(ç$Æ$Ç,Æ,Æ$Ç,¥,¥,¥,¥,¥5k §(¥ † e ¥ …(¥$Æ(¥ §(ç,Æ §$Ç$Æ(ç(ç,ç(ç §(¥$¥(¥ §(¥(ç,Æ,Æ-Ið1Œ$Ç(ç$Æ$Æ$Æ$Æ$Æ$Æ$Æ,Æ$Æ,ç=Œ=¯11,é11,ç5$Æ$Ç,Æ$Æ0ç(¥(¥,Æ §,¥51$¥ †$„(¥ †$„(¥$¥$¥ †(¥$¥ †$Æ,¥ §(¥,Æ §(¥ †$¥$„$¥(¥(¥,Æ,¥5kIð) -$¥(¥ e(¥(¥ §(¥(¥(¥(¥,¥,é=Ž(ç(¥(¥,¥ §(¥(¥ §(¥ † §(¥(¥(¥(¥(¥,¥0ç,¥,é §$„ e(¥$„$¥(¥ †(¥ e(¥$¥ †(¥$Æ,¥ §(¥ §$¥(¥ † ¥$¥$¥(¥,Å,Æ1Að5m(¥(¥(¥(¥ †(¥ †(¥(¥ †,Æ,¥5m1*(¥ §(¥,¥ †,¥ †(¥ †$Æ(¥ §(¥,Æ †(¥,¥1L$Ç$¥$„ †$„$„ §$„ †(¥$„(¥ †$¥(¥ †(¥(¥,¥ §$¥$„$¥(¥(¥,Æ,Æ,Å(¥5J=ð,é$¥(¥$¥$¥ †(¥$¥ † †(¥,¥,ç=¯$Ç,¥,¥$Ç(¥,¥ §,¥,Æ(¥ †$Æ §(¥ †,Æ$Ç,é,Æ-* §$d(¥$„(¥ †$„(¥ †$¥$¥(¥ †$„ †(¥(¥(¥(¥ †$„$¥(¥(¥(¥,Æ,Æ(¥0çAð-*(¥ §(¥ †(¥ †(¥(¥ †(¥,¥,¥=Ž1L(¥,¥(¥,¥ §,¥,Æ §(¥ §(¥(¥(¥ †(¥ §(¥1) - e$„$„(¥(¥$„(¥(¥(¥(¥ d †$„(¥(¥$¥(¥,¥(¥(¥(¥,Æ,¥,Æ,Æ,Æ(ç,Å5kAò$Å(¥ † †(¥ †(¥ †$„ †(¥ §4çA¯-,¥,¥(¥(¥,¥,¥(¥,¥ †$Æ §(¥(¥ § §,Æ,é,é1)(¥$„$„$„(¥$„(¥(¥(¥$„ e$„(¥ †(¥$¥(¥(¥(¥(¥(¥(¥,¥,Æ,Æ,¥0ç,Å-=ð1L e$¥ †$„ †(¥ † †$„ †,Æ §5k5m,¥,¥,¥,¥,Æ §(¥,¥(¥ §(¥(¥$¥(¥ †(¥ §-*1 e(¥$ƒ$„(¥(¥(¥$d$„(¥(¥$„(¥(¥(¥$d,Å0ç,¥,Æ(¥,Æ,¥(¥,Æ,Å0ç0Æ5J=¯) †(¥ †(¥ e¥(¥ †$¥(¥ §,Æ54ç,Æ,¥,¥,¥,¥ §,¥,Æ(¥ †$Æ §(¥ †,Æ †(ç,ç1L(¥(¥ d$„(¥(¥(¥(¥$d$„(¥(¥(¥$„(¥(¥,¥,¥,¥,¥$Æ,¥,Æ(¥,Æ,Æ,Æ,Å1Að-*(¥ †(¥$¥ † † ¥$¥ †$¥(¥,¥5k1L,¥,Å,¥,¥(¥,¥,¥,Æ(¥ §(¥ † e(¥(¥,¥,Æ,é,é e$„$„ †$„(¥(¥(¥(¥ d$„ †(¥(¥(¥,Æ,Å0Æ(¥(¥,Æ,Æ,Æ,Å,Æ0ç(Å(Å-Að,é(¥ †$¥ † †$„ †$¥ † §$„ §5(ç,Å,Æ,¥,Æ,¥,¥0ç,¥,¥(¥ §(¥(¥$¥ §(¥(¥ †-* §$c …$„(¥(¥$d(¥(¥ †$„$¥$„,¥,¥,¥,Æ,¥,Æ(¥,Æ,Æ,Æ(¥,Å0ç,Å,¥,Æ51 e(¥(¥ e § ¥$„ †(¥ §(¥ e-*1L,¥,Å0Æ,¥,Æ(¥0Æ,¥,Æ(¥ e$¥ † §$Ç §,é5m)K †¥e$¥ † † §$Ç § §$Ç$Ç §$Ç$Ç,é § §$Æ § § § §,ç),é11L1L51*e † § † ç § § § §$Ç-*-l=Ž) -$Ç † § §,é §$Ç,é,é,é,é) § §$Ç §$Ç) --l$Çf¥ …f † § § § §$Ç$Ç §!$Ç$Ç$Ç § § § § § §(ç,é,ç) -5J5k1L5Œ † § § Æ § § § ç § §!1L51L$Æ$Ç §$Ç$Æ$Ç$Ç$Ç,é$Ç$Ç$Ç5Að=¯AðAð=¯=Ž=ï5=Ž=¯9Ž555951L5Œ51Œ1L5=Ž55ŒAðAð5=ï=¯AðIðAðJNS=Ï=Ï=ŽAðAðAð=¯AòAðAð=ð=¯BNSIÏAð=¯=ŽAðAðAðAð=¯AðBJSF3JSN3IðAð=ð=ðAò=î=°9=Ž=¯5Ž9555Œ95k1Œ55m1L5955ŒA¯Að=ï=Ž=¯=ïAðAïIðNSAÏ=ð=ŽAð=¯Að=¯AðAðAò=ð5IðNSIÐAïAò=Ž=ŽAðAòAðAðAðAðJSF3JS(ç Æ(¥ §(ç Æ(¥ ç(¥ ç--*(ç ¥(¥$¥$¥(¥$¥$¥$¥$„$¥,ç,ç%$Ç$ç-)(ç § Æ$Ç ç(ç,ç,ç-)$ç-(ç-(ç-(ç(ç$Ç(ç(ç Æ$Æ §,ç1-*-) ç$¥ Æ Æ § ç §(ç ç Æ$Æ$Æ §(ç$¥ §$Æ(ç(ç-*%$¥(¥(Å$¥$¥$¥$¥(¥ ¥$¥(¥-,é%(ç$ç,é ç §(ç ç(ç$Ç--),ç$ç,é,ç$ç-),ç$ç(ç §,ç(ç §(ç(ç(ç1-*-)¥ † Æ Æ § ç § dƒ e$„ddd$„d …,Æ)K$d$„$d „ c$„d$„cd …$„(¥1L † ¥ d „dd ¥ e$„ ¥ e …(Å(¥(¥(¥(¥(¥ †$„ †$„ † …$¥ e$¥(¥5m$Çd ed¥d „d „d$¥d …$d„dc$„d ¥-*$Æ$c$„ „$d „$d „d$dƒ e$„5) -c ¥ „dd … e ¥$„ e$„$¥(¥$¥(¥(¥$„(¥ †$„(¥ † … ¥d$¥ e5I1Ldd¥d$¥dd „$„$d„$d$„ƒd$„c$„$Æ-*$d „$d ƒ$„$„$dƒ „d$„d$„-* Æ$ddd „d ¥ … ¥ e$„$¥(¥ †$„(¥(¥(¥(¥ †(¥ e ¥ ¥d$¥ e(¥5) e „¥d¥ e¥ …d¥d$d „$„c$„d$„$d1) §$d$„$d „$c$„ƒ$d„$d „ „-$ç e …c „d ¥„ ¥ e$¥$¥$¥(¥ †(¥(¥(¥(¥ †(¥ †$d ¥d$¥ e Æ5)1L † ed „ … eƒ e$d$„ „c$„d$„c$„$d,Å)K$d$„ „$d$„$„$„c$„$„c ¥$„5J ed „d¥dd ¥$d ¥$¥$„ †$„(¥(¥(¥ †$„… e ¥$„ …d¥(¥ §5k,éd „d¥ edd „d…c …$d „$dƒ d$„$„-* Æ$d$„ „$d$„ ƒ$d „„$d „$„-)d „d „d„ … „ ¥$„(¥ † e$¥$„(¥(¥ † e$„ „ „$¥d¥ †$„1)1Lc ¥d¥d$„ƒd$„d ƒ$d„ c$„ d ƒ$„$Æ1L$d$„$„$„$„$„$„$„ƒ$„$d$„ …,é„d „dd„d …$„ e$¥$„ †$„ …$„(¥ e(¥d$„ … e ¥$„ ¥$„,¥5m çdd„ edd¥d¥dd$„ ƒ d ƒ „$c$„$„)J$Ç$d$„$„$„$„$„$„ƒ$„c$¥ „(ç §cd „„dd ¥d$„ †$„(¥ †$„(¥$„(¥ e …$„d ¥ e …$„(¥(¥-1Lddd †ddd$„$d „ c „$c „ c „$c$„(Å5Jd$d$„ ƒ$„$„$„$„$d „$„ƒ$¥(¥¥cd „„ e$„ ¥$„(¥(¥(¥(¥,¥(¥(¥(¥(¥(¥(¥(¥$„$„(¥ †$„ §$d5J$Çddd„d„„ddd „„$d ƒ d ƒ$d$„$d5)% c$„ d$„$„$„$„$„$„$d$„$„ Æ$¥dd$„d ¥$d$„$¥$„(¥(¥(¥(¥(¥(¥(¥(¥(¥$d(¥(¥$„(¥ e$¥(¥(¥,é-*c …dd„d „„ † †$„ †(¥ †dd „d §1L%(¥ †$„(¥$Æ,Æ † ¥$¥$¥$¥ §1$Ç$Ç §dc … ¥$„ †$„$„ e †(¥ … e$„(¥ e$„(¥ † † …(¥ †(¥$Ç51*†f„Ædd…e § ç § § §(¥ed „d ¥-*) - §$¥$„$¥$Æ,¥ †$¥ ¥$¥$¥(¥,é% §$Æ †c … ¥$„ †$„(¥d$„ †$d …$d(¥ †$„$¥$d § „(¥ † † †-*)Kf†„ Æe„d †1L151L551L-l-*)K1L1=ð=Ž55A°EîIðAðAð=ŽAïIðAðAðAðAð5Œ5)J1L1L1L1L1Œ-l5m-l1L1L1L1L)K)K) -)K1L559=¯5=ðNSN3=¯=ïAðAð51Œ5A¯9ðAòIðAïAò1Œ1L1L)K-*1L5m9Að55=ŽIïEðAðAðAð=ïAðAð=ŽAðIðAð51L-*1L1L1L-l1L5m5m9n-l1L1L)K)K) -1L1L15m5A¯5559515Að-*1L)K)K1,Æ115J=¯,Æ$¥ †(¥ ç$¥ e Æ ¥(¥ Æ §$Æ(ç(¥ ç$Æ$Æ$¥ e „ ç$Æ(¥$¥ † ç,¥5J=¯9k5k5m5k95k5=Œ5m=Œ5m=Œ555J1)-*111)5)5J5I5J5J5k5I9)5k5k5)1=Œ1L(¥(¥$¥ † § ÆÆ ¥ e$¥(¥ Æ ç$Æ(ç$Æ$Æ,Æ$¥ † „ §$Æ ¥ ¥ Æ(¥$Æ1=Ž55J1Œ5k59k=Ž5m=Ž=Œ5m5k=ŽJ9Ž9)1)-15I5I5J5k5I5J5k5)1L(¥ †$d$„0ç5(¥ ddd„ddd$„ ¥ ddƒdddddd„d „$¥ddd …(¥550ç(¥(¥(¥(¥,¥$Ç,¥0ç0ç$Ç0Æ5m1L(¥(¥$„(¥$d$„,¥$d,¥,¥,¥,¥,¥,Æ(¥,¥,¥,¥1L5J dd$„ddddd „ ¥ eƒ$dd „dddddd „$¥dddd(¥,¥51)(¥(¥(¥(¥(¥,¥$Ç,Æ0ç,¥$Ç5)Ið) -(¥ e$¥$„(¥,¤,¥$d,¥,¥,¥,¥,¥,Æ,¥$¥ e-5m(¥ ddd„dddd ¥ „ddd„ddd„dd¥ …dd„d$„15$Ç(¥ †,¥$Ç$Ç$Ç0ç$Ç,Æ$Ç0ç=Ž1L,Æ §(¥ †(¥(¥ §,¥(¥(¥,¥0Æ,Æ,¥ §0Æ,é,¥1L1L$cdd„ddcdd$¥ „dddc„ddd„dd¥ „dd „ …,Æ51,¥ §(¥$Ç$Ç0ç$Ç0ç$Ç,é,Æ5J=¯(ç(¥(¥(¥ †(¥(¥(¥(¥(¥,¥$Ç,¥,¥,Æ † ed-5(¥ d„dddcd … „dd „„ddd„dd„ … „d„dd$¥15,ç0ç,¥ § §,Æ$Ç0ç$Ç,é,¥,é=Œ5(¥(¥ † ¥ † §(¥$Æ,¥ §(¥ §0Æ,Æ,é,¥,é4ç1*1L$dd„dd„ddd¥ dd …cd„ded„d¥ †$„ddd „,¥51*,Æ$Ç,¥$Ç §,¥$Ç0ç$Ç$Ç,Æ5J=¯,é(¥ † e Æ(¥ †$Ç(¥$Ç,Æ$Ç,¥$Ç(ç$Ç † e11,¥dd„d„dddd„dd„dd…d„…d „¥ ecd¥(¥,é1L1$Ç$Ç$Ç,¥$Ç$Ç,¥$Ç0ç$Ç,é=Œ1L$¥f„d„f„† †,Æ §0Æ,é,é0ç,é(ç(ç1L5k d „dd„dd„ddd „d„ddd„„d „d¥ eƒdd$¥ §5k5,é$Ç,¥$Ç §$Ç0ç$Ç,Æ$Ç0ç5)A¯ §¥f„„e…e † §,é § §,ç,ç § e$„-5,¥ d „ddddd„ ec „ddd „„dd$„dd$¥dƒd „ d,é5k150ç$Ç$Ç$Ç0ç,é$Ç,é$Ç0Æ=Œ1Ld…Æ de…e„dd § ç,Æ$Ç,Æ §(¥$¥1L1L dcd„cd„dd „dd „dd„dd ¥ dddd$¥ dc„$„(¥1L-*8ç,é$Ç,Æ$Ç0ç$Ç,é0ç$Ç,é1=¯e…f…e…f„dd(çcd(ç(ç$Ç$Æ †-*11 §f…e…de„cdd„d„„dÆ †Æd † †† § §$Ç §-*1L$Ç §$Æ$Ç$Ç,¥ § §(ç §(¥(¥=Ž5c † § § ¥ †$¥$¥ † ¥(ç-1-*11*-*%55$ÇÆ §f…fd„ddd„d„ddd¥†e…¥ †f Æ †$Ç §%5m,é ç$Æ$Ç$Ç,Æ § §$Ç §,¥ †1Aò ¦¥ §(çd Æ †$¥¥ †(¥ § Æ †=Œ5m5k9m5k=Ž1L1L1L1L)J1)K-*1L1Œ1L)K-*)K5J-*1*1L) -1L1Œ55=ï=Œ1Œ55k1Œ51Œ1*) -) -) -)K-*1*-*1L)K1L=ïAð51Œ5=Œ5k=Ž=¯A°=Ï=ŒIðEðJEðAðAð=ï=¯9k=Ž=Ž-*1L)J1L-)-)1L)K1Œ-l-*1*-*1*-*)K1L-*1Œ1L1Œ=Ž=ï=Ž559Ž5m5k5-l-*)) -) -)K-*1*-*-l-*9Aï551Œ=Œ5k=Ž=Œ=¯A°=Ï=ŽIïAð=Ž$¥ e(¥$¥(¥(¥(¥ dd$¥$¥ e$¥(¥1-* §,Å,¥(¥,¥,Æ(¥(¥ ¥(Å$¥$¥(ç1L-,¥ §,Æ §(¥$¥$¥ † Æ$¥ §,Æ §(ç,ç,é(ç(ç$Ç,ç1$Ç,é,ç-,ç11L1(ç-1),ç,Æ,¥(¥$d,¥(¥(¥d e$¥ ¥ e$¥$„$Ç5k$Ç,Æ,Æ(¥(¥,Æ(¥(¥$¥$¥(Å(¥ §-*1)(ç §,Æ §(¥$¥ †(¥ † § §$Æ,Æ §-,ç,é(ç(ç,é,ç%,é(ç,é0ç-1L1,Æ § „¥d¥ e … † ed „…d¥ e(¥(¥11,¥,Æ,¥,Æ,Æ,¥0ç,Æ$Æ §(ç$¥$Ç1Œ,é § § †$¥ † e$¥ … e¥ † †$¥(¥ †(¥ † §$„ †…d Æ † §,¥,é-(¥(¥ †(¥ e(¥ †$„ † … ed „dd¥ „ †(¥,¥5m1,¥,¥,¥,Æ,¥0ç,Æ,Æ$Æ$Æ$Æ §1L-*,Æ †$¥ † e$¥ …¥ †d$¥ † †(¥ †(¥ † §(¥ e¥… e †(¥ §0Æ1$Ç(¥ †dddd¥ ed „…„¥ e … „¥ §51L e,¥0ç,¥0ç,Æ,Æ0ç$Ç(ç §$Ç ç1L-,¥ †$¥ e¥ … †d¥ † † …$¥ †(¥ † §(¥ † †¥e §$¥ †(¥0Æ,é §,¥$Ç(¥ e †(¥… e „¥d¥e¥d$¥ e †,é5m §(¥0Æ0ç$Ç,¥0Æ0ç$Ç(ç$Ç § Æ) -5) §$Æ †$¥ e¥ † … „¥ † e(¥ †(¥¥ §(¥ e Æ e… §$¥ †(¥,¥,é$Æ,Æ,¥ † ed¥d… „ed¥ …e„ † …$¥,é-ld,¥0ç,Æ0Æ0ç0ç0ç$Ç,Æ$Ç Æ%1L(ç §(¥ † e$¥…$¥ e¥ …¥ †$Æ †$¥$¥ † †$¥ed¥ † §$„,¥,é,é(¥$Ç(¥ †(¥e † …dd¥d… e¥ …e$¥ …$Æ5 §(¥,¥0ç,¥4ç,é0Æ0Æ$Ç(ç § Æ) -1 §$Æ † e¥ †d$¥ e …¥ † †(¥ †$¥ † § † …¥d Æ †$¥ †,¥-*$Ç,¥ † edd„ ed¥d„e… „ e¥d¥1-l,ç0Æ4ç5===4ç5 §(ç †) -1*(ç † § e$¥… e¥ …¥ †$¥ e †(¥ † † §$¥ e¥dd †$¥ †,¥,é1$Ç(¥ † †(¥ †$„d ¥d …d „… e„ …d¥ §1L1,Æ0ç4ç==4ç=4ç(ç §$Æ §1L,é Æ(¥¥ † †d¥e … †¥$¥ †$¥ † † §(¥ e¥…d¥ † †,¥,Æ-*0ç † † „ddd„dd „ddd¥d¥ †(¥,é-l$Ç(ç §0ç,é5,é0Æ$Ç †d ç$Ç) -(¥$¥ † ¥ ed¥ …d¥ †d$¥$¥ †(¥ †$¥ e …¥ eÆ e$¥ †,¥,é-*,¥ †,¥ §$d(¥ … e$„c$¥ddd¥d¥$¥ †,Æ1L)$Ç$Æ$Ç,é15,é,ç §d Æ †)K(ç †(¥ e¥ …d e¥d¥ † † …(¥$¥$¥ † †d¥ † …¥(¥ †(¥,¥-*,é(¥(¥dd § Æ § Æ¥¥¥Æ §Æ † † § §-*)Kd„ dCde† df) -!!1-* §f Æ † §e… e†d¥ § § † † † † † †¥e… e Æ §$Ç$Ç,é5m1*,é,é$Ç$Ç § †$¥d¥dd„d…f § † §)1 çd ddc df„e$Ç! ç) -1 § † §f §†¥e …Æd † § † † † † † †$¥ed¥ † §$Ç$Ç,é5J1L,é,é,é$Ç55k95k1LAð51*1Œ1)K-*1*-l5k51*-*1*%-*1L15=ïAð=Ž=Ž=Ž=Œ5Œ59Œ51ŒAò=Ž1Œ1Œ11LAð55Œ91Œ=Ž1Œ5m5Að=¯1ŒA°=¯=Ï=Ž=Ž=¯=Œ=Ž=Ž=Ž55k95k5m1L-*) -) -%) --)1L)K)J5m5k1*)K-*) -1*1L1Œ5=ŽAð=¯9Ž5=Œ55Œ95Œ5=ŽAð51L5-l=¯A°15595Ž1L5AðAò1L=¯A°=Ž=Ž=Ž=Ž=¯=Ž=Ž5=Ž,Æ,Æ,Æ §,ÆAð5Jd(¥ † e ¥ ¥(¥ †(¥ §(ç §$Æ §(ç$Æ,Æ(ç$Æ(¥$¥$¥$¥ †(¥(ç,Å,Æ5JIð) -(ç(¥$Æ$Æ §$Æ §(¥$Æ,¥,Æ,éAð5J1-(ç,ç,é,Æ,Æ$Ç$Æ §(ç,Æ,é,Æ,ç=Œ1L$¥ e$„ ¥$„ †ƒ(¥(¥ † §$Æ$Ç,Æ § §(ç$Æ,Æ$Ç(ç$¥(¥ †$¥$Æ(¥(¥,Æ,Æ-Aï5,Æ$Æ$Æ$Æ †$Æ$Æ(¥ †,Æ,Æ,Æ5=Ž1-(ç,ç,é,ç0ç$Æ §,Æ$Æ,Æ(¥(¥,Æ §,¥5) -$¥$„$„(¥ e(¥(¥ †(¥ †(¥$¥ †(¥ §(¥ §(¥,¥ †$¥ †$¥$¥(¥,¥,Æ,¥5k=ð1)(¥ †(¥(¥ †(¥(¥(¥ †,¥ §4ç5$Æ,¥ §,¥,¥(¥ §(¥ §(¥ †$Æ §$Æ,¥,¥-*1L$d$„$d„ e(¥$¥ e(¥(¥ †$„(¥ †(¥$¥ §(¥ §(¥,Æ$¥$¥ †$¥$„$¥(¥,Æ,Æ1Að5$„ §(¥(¥(¥ †(¥ §(¥(¥ §,¥=Œ-*(¥(¥,¥$Ç(¥(¥ †(¥ §(¥(¥ §(¥,Æ †(¥,¥-*) e(¥ …$„(¥(¥ †$„(¥ e$¥$„$¥ †$¥(¥(¥,Æ(¥(¥ †$¥(¥(¥,¥,Æ(ç,¥5JAò$Ç(¥ §(¥ †(¥ †(¥ †(¥ §,¥,çAð$Ç,¥,¥,¥ §,¥,¥ §,¥$Æ §(¥ †$Æ$Ç,¥5k1*$„ e$„c „$¥$„(¥ e$¥$¥$„(¥$¥ †$¥$„ §(¥(¥(¥(¥ †$¥(¥(¥(¥,Æ,Æ(¥0çAð-* §(¥(¥ † †(¥(¥ †(¥$¥,¥,¥5m1L,¥,¥,¥ §(¥,¥,¥$Æ,¥ †$Æ(¥(¥ †(¥ †,¥) -,é e$„$„(¥$„(¥$„ †$„(¥$„ †$„(¥(¥(¥(¥,¥,Æ(¥(¥(¥,¥,Æ,Æ,Æ,Å,Å5kAð$Ç †$„ †$„ †(¥ † ¥ †$¥(¥0Æ=¯1,¥,¥,Æ(¥,¥ §,¥,¥(¥ §$¥ † §(ç51*1L$„ d …c$„$„(¥ †(¥$d(¥(¥ e$„ †$„(¥(¥(¥,¥,Æ(¥(¥(¥,¥,Æ,Æ,Æ,Æ,Å1)Að-* ¥(¥e(¥ †(¥ e$¥ † †(¥,¥=Œ1L,¥,Æ,¥(¥,¥ §(¥,¥ §(¥ †(¥$¥(¥ †(¥$Ç51* d$¥$ƒ$d(¥(¥(¥(¥$d(¥(¥(¥(¥(¥(¥(¥,¥,Æ,Æ(¥,Æ(¥,Æ,¥0ç,Å0ç,Æ1L=ï,é$¥$¥ †(¥ † e(¥$¥ †(¥(¥0ç5m-0Æ,¥,¥,¥,¥(¥,¥,Æ(¥ †(¥ §$¥,Æ$Ç5m1L$„ d …c …$¥$„(¥(¥(¥$d(¥$¥$d(¥(¥(¥$d,¥0Æ,Å,Æ(¥,¥,Æ(¥,Æ0ç,Å0Æ151Œ$„ † §$„ † † ¥(¥ †$¥(¥,¥1L1L,Å,¥,¥,¥,¥(¥,¥,Æ,¥ §(¥ † e(¥(¥,¥$Ç1%$„ d$„ †(¥$„(¥$„(¥$„ …$¥$„(¥,¥,¥,¥0ç(¥(¥,¥,Æ,Æ,Å,Å(ç,¥(Å1Að) †(¥ † †(¥ e$¥$¥ † §$„ †10ç,¥,Æ,¥,Æ,¥,¥,Æ,¥(¥(¥(¥$¥$¥$¥ e1L1L c$„d dc„$„(¥(¥$„(¥$„$„(¥$„(¥(¥,Æ,Å,Å,Æ$¥,¥,Æ,Æ,Å,Å,Æ,Å(¥,Æ55$d,¥ †$¥ †$„ †$¥ †(¥ † †1)1L,¥,Å,¥,Æ,Æ,¥,Æ,Å,¥(¥ †$d † §$Ç §-*1L1L §f † † † § §%$Ç §) §$Ç$Ç$Ç,é ç$Ç § § ç$Ç §,é)1-*9k5m1Œ-* † § § †$Ç! §! §$Ç)K5m=Ž) - §$Ç §$Ç$Ç%$Ç,é,é%) -$Ç%$Ç) -AðAð1% § §¥ † § † §$Ç §$Ç!$Ç$Ç$Ç%$Ç,é §$Ç § ç § §,é),é-*5J51Œ5m † § § § §% §$Ç §!) -1L51L$Ç$Ç §$Ç$Ç$Ç$Ç,é%,é!$Ç5AðAðAðAð=¯=Ž=°1Að5=ï15=Ž1L51L5Œ511L5=Ž15=ŽAð=¯9=ïAðAïAðIðFAð=Ž=ŽAðAðAð=¯AðAð=ð=ð=¯IðJEðIð=¯=ï5IðAò=ð=ðIðAòJSF3NSN3NSJ3NSJ3AðAð55=ŽAð559Œ5551L1Œ51L51L559Œ5AòAð=Ž=ï=¯AðAïIðFIðAð5=ïAðAðAð=ðAòAð=ð5AðJEîIðAð5AðAð=ðIð9ðAðAòJSN3Aò Æ(¥ † § Æ$¥ § Æ$¥ §,ç)J(¥$¥$¥(¥$„$¥$¥$¥$„ ¥ ¥,Æ,Æ) -$ç(ç ç(ç Æ$¥ §(ç §,ç,ç),ç$ç,ç,ç$ç,é(ç$Æ$Æ$Æ$Ç$Æ$Æ$Æ$Ç,Æ1L-) ç „¥ † Æ Æ † ç$¥ § ¥ Æ Æ(¥¥$Æ §(¥ ç5J$Ç$¥$¥(¥$¥$d$¥$¥$¥ e$„$Æ0ç)) ç(ç(ç † § ç(¥ ç(ç(ç,ç)(ç(ç,ç(ç(ç(ç §(ç(¥$Ç(ç Æ$Æ(ç,Æ--*)¥¥$¥ † ç † Æ e$„c …$d„c$„d …,Å-* e$„$d „$d ƒ$ddƒ$d„$„(¥5J † ¥ e „d e „d ¥ …$d ¥(¥(¥(¥(¥(¥$„ †$¥(¥(¥ e$¥ …¥ †(¥=Œ § e „ …¥ ed¥ „d$dd$„d …c …d$„ ¥1) §$d$„ d ƒ$d „$dƒ$d„$„ e1) -c …d „d ¥ e … ¥$„ †$„ §$d(¥(¥(¥(¥(¥ †$¥$„ e¥ … †$¥1)-*d$¥ed¥dd ¥$„c$„ƒ e$„dƒ d$„(ç) -$„c$„$„ƒ$„$„ƒd$„d$„ ¥-*$¥dd „d „d$¥d(¥ ¥$„ †(¥ †$„,¥ §$¥$„ † …$¥ ed¥ †,¥5,é „d¥d¥ edd ¥ ƒ$d$„$d„$dƒ dƒ$„-* †$d$„$„ ƒ$d$„ƒd ¥ „c$„1$ç e ¥ƒ ed ¥d ¥$„ †$„(¥ †(¥(¥,¥ †(¥ †$„ †$„ †d$¥ e$¥1)5md$¥ed$¥ „$d „$d$„d$„ c„ c$„$d ƒ,Å)Kc$„ …$d$„$„ƒ e „$„ „d(¥-*d ¥dd „d „ „¥ e$¥(¥ e$„(¥(¥(¥ †$„ … e ¥ … ¥c$¥(¥(¥5m$Çd „d¥ ed¥d$„dd$„$d„ c$„ d$„$„-* §$„$„$„ ƒ$„$„$d „ „$d „ „1)ddd „dd „d$¥ e(¥ †$„(¥ d(¥(¥$d † … e ¥ … „d$¥(¥1-ld †ƒ edd„ e$„d ƒ d$„ ƒ$d„ c$„(¥1L e$„ ƒ$„$„$„$„$„$„ ƒ$d$„ …)dd$„dc„dd$¥ e$¥$„(¥ †$„$„(¥ †$„ …$d$„ ¥$dd(¥ †(¥5k$Çdd „dd„dd$„d$„c$„ƒ d ƒ d$„$„5J ç$c …$„$„$„$„$„$„ ƒd$„$„$ç §c „dd„d ¥ …$¥$„ †$„(¥ e(¥$„(¥ †$d$„$„d$¥ e ¥$„(¥11Lcdd„… „d$„$d „ c$„ c „ c „$c$„$¥1L$d „$„$„$ƒ$„$„$„$„$d$„ƒ$„$Ç „dd „„ e ¥$„(¥$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$„$„(¥ †$¥(¥$d1L$Çc „„d„d„ …$d „$d$„ d$ƒ$d„$c$„$d-*$Ç$d „$„$c$„$„$„ƒ$d$„$„$„(¥Æ dƒd „„ ¥$d$¥$„,¥(¥(¥,¥(¥(¥(¥(¥(¥(¥$d(¥$¥$d$¥(¥(¥(¥,é-*ddd„ddd$„ †$¥ † †(¥ † …d dd ç1L,é §$¥$¥(¥(ç,Æ$¥$¥$¥ †(ç(¥-*)$Ç §$¥d „ †$„ †$„$„ e † †$„ e …(¥ e$„(¥ † † †(¥ † †$Ç-*%dcdd„dd „c „ c$„$d$„d ƒ$d$„$„)J1L †(¥$¥ §,Å(ç(¥ †(¥ §(¥ §-),é$Ç$Ç$¥dd(¥ †$„$¥$„ e …$¥ e … e$„ †$„(¥ †(¥ e † § † †) -)Kf†¥ §e„d†-l559m=Ž55m)K) -1L-l1Að=Ž5Œ=ŽAðAðAðAðAð=ïAðAðAð=Ž=ïIð9Ž1Œ1L1L1L1L1Œ5m5m1Ž5m15m1L1L1L1L)K1L5m1=Ž=¯A°555951L-l) -151L1L1L5J-*1L=Œ=Ž5k5J-*)K5J1=ŽAð5Œ5=ŽAïIðAðAïAð=ïAïAïAð5AïAð5Œ-l1L1L1L-l51L11Œ15m-l1L1L1L)K)K1L15A¯=°=Ï955=ð55Ið-l)K-l-l1(¥0ç,ç5)A¯ Æ(¥$¥¥ § ¥$d „¥(¥¥$¥ §(¥ §(¥ Æ(¥ e „¥$Æ § ¥ e ¥ ¥(¥5J55k1L5J5k5k9m5k55k9m5k5k1Œ55)1-)(ç15I5)9I5)5k5k9k5J=Œ5k5)5)5J=Œ-*$¥ e$¥ Æ$¥$¥ „ e „ Æ$¥$¥ § Æ$Æ §$¥$Æ † ¥$dÆ(¥$¥d Æ ¥(¥1=Ž55I9k5k5k5m9k=Ž5k5m5k9k=ŽF=Œ1)--15)1)5)5I9)5J5J5J5),Æ e$¥$„15(¥ edddddd …$¥ dd$„ddd„ddd„ e ¥$„dd ¥$d5)5,ç(¥(¥(¥(¥(¥$Ç,Æ0ç,Æ$Ç0Æ5m1L,Æ †$„(¥$d(¥,¥,¥(¥,¥,¥,¥,¥,¥,¥,¥,¥,¥5 §dddddd„dd … ¥c „ dd „dddd„d$¥ eddd(¥,¥51,¥(¥(¥(¥(¥,¥$Ç,Æ0ç$Ç0Æ5)Aò,è$d$„(¥(¥$d$„,¥$d,¥,¥,¥,¥,¥,Æ §$„ †4ç5m §$dddc„d d„ eƒdd„dddd„d„ … „dddd(¥55$Ç(¥(¥ §,¥$Ç0ç$Ç0ç$Ç0ç,é=Œ1L,Æ §(¥ †(¥(¥ e(¥(¥,¥,¥,Æ0Æ,Æ,Æ,é0Æ,é1$Ç e$„dd„d„dd$¥dd„dddd„dd„¥d …c„d …,Æ51 § §(¥$Ç,¥$Ç0ç$Ç0ç$Ç0ç5J=Ž,é(¥ §(¥ †(¥(¥,¥ §,¥,¥$Ç,¥,Æ,Æ † ed-1L,Æddd„cddd$¥d „d„dd„„d„d¥ †ƒdd„ …-=Ž,ç0ç$Ç,¥$Ç$Ç,¥$Ç0ç$Ç$Ç0Æ=Ž5(¥(¥ † ¥ † §(¥$Ç †$Ç(¥ §0ç,é0ç,é,é,é5$Ç ed„dd„ddd¥ eƒ edd„de„dd …¥ eƒd„ …(¥51*0Æ,Æ$Ç †$Ç$Ç0ç$Ç0ç$Ç,Æ5J=¯$Ç(¥(¥ e¥ § § §(¥,Æ$Ç,¥$Ç0ç(ç$Ç † e15,Æ ddd„dd„ddd„d„dd…ddd „d$¥dd„ e$¥,ç5,ç,é,¥$Ç †$Ç$Ç0ç$Ç$Ç0ç,é5k1L „f„d„f„¥ †,¥ §0Æ,é,é,é-,é(ç-*,é$dc„dd„dddd …cdd„ddd„ „d„¥ edd„$¥(¥5m1,é,Æ$Ç,¥$Ç,¥$Ç$Ç$Ç,Æ,é5)A¯ §¥f„„ed¥ † §,ç § †-,ç §$„ e-5(¥$dddd„dd„ eƒddd„d „dd „dd „dd„$d$„,ç1Œ5,é,ç$Ç0ç$Ç$Ç,é0ç$Ç0ç0ç-*1*d¥†e…„e„dd † §1,ç,é,ç,é,ç-*) dƒdd„cd „dd$„d „dƒddd „ddc …$„c„ e$„$¥1L1)4ç,é$Ç$Ç$Ç$Ç,é0ç,é$Ç0ç15¥e†e…e…e„d Ædd ç(ç$Ç §$Æ-*9) - § §¥f†„e„cd„dÆdd†¥ Æf† § § Æ § ç$Ç$Ç)K1L$Ç § §(ç §$Ç,Æ$Ç § § †(¥=Ž5d$¥ ç † † §(¥ †$Æ$¥,é,ç%-*11*1)) -=Ž1L ç$Ç §f †Æd…ddd„d†„f„¥ † ††Æ § § § §$Ç$Ç) --l) -$Ç §(ç,Æ §$Ç,Æ § §(¥ †1Aò ¦¥ §$Ç$¥ † § Æ(¥$¥ §$Ç ç$Æ=Œ=Œ5m5k9k=Ž5k-*1L5J-*) -1*-)-l51*1L-)-*1*1L-)1L)K1L5k1Œ5=Ž5Œ59m1Œ5k59m)J1) -)K-*1*) -1L1L-*-lAð=Ž=ï1=Œ=Ž5kA¯9ŽAð=¯A°=ÏAð=¯Að=¯=Ž=Ž=Œ=Œ=Œ51*1Œ5J-*) -1)K-*11L-*)K1-*1L1*)J1L)J51L5ŒAð51Œ51Œ5k59k1L-)) -) -)K-*) -)K1L-*1L5Að=¯91Œ=Œ5m=Œ=¯A°=ÏA°=¯Iï9ŽA¯ e¥$„(¥(¥(¥ d …$d „¥ …$¥(¥1-* Æ,¥,¥(¥(¥,¥(¥(¥$¥(¥$¥(¥ ç1L-,Æ §(¥ §$„ †(¥ †$¥¥ § §(¥(ç(ç,ç$Ç(ç$Ç(ç(ç$Ç(ç,é(ç,ç1-*,Æ,Æ,ç,¥ §$¥$„(¥ e¥$„ †$„c † ¥ … ¥(¥,Æ1L$Ç(Å,¥(¥(¥,¥(¥,¥$¥$¥(Å$¥(¥)K1(ç §,¥ †(¥$¥$¥$¥¥$¥ †$Æ §,Æ(ç(ç,é(ç$Æ(ç(ç,é$Ç,ç(ç,ç,é5J1(¥ §c¥d …¥ e † „ ed„… †d(¥(¥11,Æ,¥0Æ,¥0ç,¥,ç,Æ,Æ$Æ § §$ç5,é(¥ † †(¥ † † … ¥ e¥ †$„ †(¥ †(¥ † § ¥ †d… †(¥ §,¥,é-,¥$Ç(¥ †(¥(¥ † e ¥ … e „d¥d … „ e(¥$Ç=Œ-,Æ,¥,Æ,¥0ç,Æ,ç,Æ$Æ §(ç †1L-*$Ç(¥ † †$¥ e † …¥ e¥ †(¥ †(¥ †(¥ †(¥ †…e¥ † §,¥,¥1$Ç,¥ e…dd¥d … e¥„ e¥d¥ † …$Æ-*1L$d,¥,ç,Æ,Æ,Æ,Æ0ç$Ç(ç$Ç ç §1L1$¥ †$¥ †d$¥¥ e …¥ †$¥ † §(¥ † §(¥ † † …¥ † †(¥ §0Æ,é §,¥ §(¥ e †(¥ … e „¥d¥e …„¥ e †,ç5m †,¥,Æ0ç,Æ,¥0Æ0ç$Ç,Æ$Ç$ÇÆ-*1 § §$¥ † †d$¥ e¥ † † † …(¥ †(¥ †$Æ † †¥ e † †(¥ §,¥1$Ç,¥$Ç e „d„ e¥dd„¥e …¥ e¥ †1-*$¥(¥0Æ,Æ0Æ0ç0ç0Æ0ç §$Ç Æ ç-*,é$¥ †$¥ e †¥… †d$¥ † †$¥ †$¥ †(¥ † †¥d¥ †$¥ †,¥0ç,é,¥$Ç †,¥ §(¥e †dd…dd$¥… e¥ …¥$Ç5m §(Å,¥0ç,Æ0ç0ç0Æ0ç$Ç$Ç §„)K1 §(¥$¥ e¥ …¥ e¥ …¥ †(¥ †$¥ † †$Æ † e …„ † § ¥(¥$Ç5$Ç$Ç$„edd„…de¥d… ed¥ …d$¥,é-l,Æ,ç4ç5====,é,Æ §Æ ç-*$Ç(¥ † †¥ e …¥ e¥ … Æ e †$¥ † † §$¥ e…d„ † †(¥ †0Æ-*$Ç(¥ † † §(¥ † e „d¥d…e „… †d$¥ §1L1,Æ4ç0Æ====4ç$Ç(ç §$Ç1L$ç § § †$¥ e¥ … e¥ † † † †(¥ e §$¥ † …¥ed¥ †(¥ †,¥-*,é(¥e „dddd„ddddd¥d¥ †(¥,é1L ç$Ç §,Æ,é5,é,Æ,Æe¥ …) -) -(¥ †$¥ e¥ …d¥d¥ †d$¥$¥ †(¥ †$¥d¥ e „¥ † †(¥,¥,é1L(¥(¥ †,¥ † †(¥ ddd ¥ddd¥d „¥(¥$Ç-*) -(ç §(ç$Ç5,é0ç$Ç(¥e¥$Ç)K,Æ$¥ † e „ …e¥d …¥ e ¥ …$¥(¥$¥ e †¥ … ¥d †$¥(¥ †0Æ-*,é(¥(¥d e § § ç ç¥ † ç Æ ç §f § § §)K-*ed„ C df†„ §!)K) -1)K § §Æ § §f†¥ e†f ç § § § † † § § e$¥…f §$Ç,é$Ç,é5m1*,é1) -$Ç$Ç †f¥†d„d„ †f § Æ §$Ç1 çdd„de†e†%)K!!1L § § § §Æ §e …¥f… § § § § † § † §$¥e¥ … Æ §$Ç,é,Æ1L1L,é,é,é%55k95k1LAð51)1L-))K-*1*1Œ1L5k1*)K-*1*)K1L51Œ=¯A°55=Œ=Œ559Ž55kIð=¯1Œ11Œ5Að559m5Ž55k1Œ=ŽAò=ð5=Ž=¯=Ž=Ž=Ž=Ž=Ž=Ž=Ž5=Ž51L5m1-*) -1*)K) -1L1Œ-*1*-l1L5k1L-*)K1L1)-l55m9ŒAð=Ž=Œ=Ž=Ž559Ž555Aò5Œ151L=ïAð1Œ5595Ž1L5AðAò5Ž=ŽAð=¯=Ž=Ž=Ž=¯=Œ=Ž5=Ž(ç(¥,Æ,¥,ÆAð)J e$¥$„ † … ¥$¥$¥(¥$Æ §$Æ §(¥$Æ$Æ$Ç,Æ$Æ(¥ †$¥(¥$¥$¥(¥,Æ(¥5kIð) -(¥ §(¥ § ¥(¥$¥$¥$Æ(¥,¥,éAð5)1,ç(ç,ç,ç,Æ(ç(¥ §(ç(¥$Ç(ç(¥5=Ž(¥ †$¥(¥(¥ †$¥ e ¥(¥(¥ †(¥ §,Æ §(¥ §(¥(ç(ç$Æ(¥ †(¥ †$¥$¥(¥,¥(ç0çAï1L,Æ §(¥ § ¥(¥$¥$¥ †(¥,Æ,Æ5m=Ž1(ç$Ç,Æ1,Æ$Ç(¥$Æ$Æ(¥,Æ(¥(¥,¥ §,Æ5m1$¥ †$„$„$¥(¥(¥ †$„ †(¥(¥ †$Æ,¥$Ç(¥ §(¥ †(¥ e ¥$„ §,¥,Æ,Æ5JAð1 §$¥(¥(¥$¥ §(¥(¥ †,¥$Ç4ç5$Ç(¥(¥,Æ †(¥,Æ †$Æ(¥ † § Æ(¥(¥55m †$d$„ †$„(¥$„ †$„(¥ †(¥ †$¥(¥$¥ †$Æ,¥ †,Æ §(¥$¥ †$¥$„$¥(¥,Æ,Æ0çAð5(¥ §$„ §(¥(¥ §$„ §(¥,¥,¥51* ¥,¥(¥,¥ †,Æ(¥ †$Æ §(¥,¥(¥,Æ †(¥,¥-*%$„(¥ d(¥$„(¥ †$„(¥(¥ †$„(¥ †(¥(¥(¥(¥,Æ(¥ †$¥(¥(¥,¥0ç,Å(¥5kA¯$Ç(¥ §$„ †(¥ †(¥ †(¥ §$d0çAò(æ,¥(¥,¥ §(¥,¥,Æ §(¥ †$Æ(¥ †,¥-*-l(¥$d …$„ †$ƒ(¥(¥$„ †$„(¥$„$¥ †$„$¥ †(¥,¥$Æ,¥(¥$¥ †(¥(¥(¥,Æ,Å(¥1Að-*(¥ §(¥ †$¥(¥ †(¥ †(¥ §,¥=Œ1L,¥,¥,Æ §(¥,¥$Æ(¥,¥ §(¥ §(¥$¥ §(¥ †-*,é †$„$„$„(¥(¥(¥(¥(¥ e$¥$„ †$„(¥(¥(¥,Æ(¥(¥(¥(¥,¥,Å0ç,Å,Æ,Å5A°$Ç(¥ †$¥ †(¥ † ¥$„ †(¥(¥,ç=¯,é,¥,¥(¥,¥,Æ,¥(¥,¥ §(¥ †$Æ § §-5m(¥ d „$d$¥$„$„(¥(¥(¥(¥ †$„(¥ e(¥ †(¥(¥(¥,¥,Æ(¥(¥(¥(¥,Å0ç,¥0ç,Å1=ð-*$¥$¥ †$„ †(¥ †$¥ †$¥(¥(¥=Œ1L,¥,¥(¥,¥,¥,¥,¥,¥ §(¥ †(¥$¥(¥ †(¥,¥) -1$„$d$„(¥(¥$d(¥(¥$d$„(¥(¥(¥(¥(¥(¥,¥,Æ,Æ(¥,Æ,¥,Æ,¥,Æ,Æ0ç,Å5J=ð,é$¥$¥ †(¥ e$¥ †$¥ †(¥ §0Æ50ç,Å0Æ,¥(¥(¥,¥,Æ(¥(¥ †$Æ,¥ §(¥-*9$„ d „$d$„$„$d(¥(¥(¥$d(¥$„(¥$„(¥(¥(¥$d,¥0Æ,Å,Æ(¥,Æ,¥,Æ,¥0ç,Å,Æ151Œ(¥ †(¥ †$¥ e$¥ †$¥ †(¥(¥5k1L,¥,Å,¥,¥,Æ(¥,¥,Æ(¥ §(¥ † †$„(¥(¥,é5% e … e$„$¥(¥$„(¥(¥ e …$¥$d(¥(¥,¥,¥0Æ(¥(¥,Æ(¥,Æ(¥0ç(Å(¥,¥-)Að) †(¥ † e$¥ † …(¥$¥ †(¥$¥1L,é,¥,¥,¥,Æ,¥,¥,Æ0Æ(¥(¥(¥ †(¥ e-5(¥ c d „$d$„ ¥$„(¥(¥$„(¥ d$„ †$„(¥(¥,¥,¥,Å,Å(¥(¥,Æ(¥,Æ,Å,Æ,Å(¥(ç55m$d §$„ †$¥ † † ¥$„ §(¥ e-*1*,¥,¥,Æ,¥,¥,¥,Æ,¥,Æ$¥ e$„ †$Ç$Ç$Ç-*1L1L § § † § † § §%$Ç$Ç)$Ç%,é$Ç,é) §) §$Ç$Ç$Ç,é-)-*5J5m5m1Œ1*† § §$Ç!!$Ç!$Ç!1L5m51*$Ç$Ç$Ç$Ç%$Ç,é%) -) -1*) -1*-*9ŽAñ1,é,é% § § † § § §$Ç!$Ç$Ç%$Ç,é%,é,é ç$Ç §$Ç$Ç$Ç),é) -1*5k=Ž1Œ5m § §$Ç § ç! §$Ç!$Ç) -5m95$Ç$Ç$Ç$Ç$Ç) -$Ç) -,é) -) -%5Að=ð=¯A°Að=Ž55=ï5=ï5595m1L51L51Œ1L5591Œ=¯=ðAð5=ï=ïAð=¯JIïAð=ŽAðAðAðAð=¯AòAòAð=¯=ŽIðNSAÐ=Ï=ï=ŽAðAðAòAð=ïAòAðJSN3JSEÐNSNSN3AïAð5=ï55=ï559Œ55m1Œ5m1L51Œ1L1L5Œ59=ïAð=¯A°=ï5AïAïIðFIðAð5=ïAðAð=¯AòIðAòAñ5AïJEðAïAð5AðAðAð=ðAðAð=ïJSN3Að$¥ ¥$¥$¥ †$¥¥(¥¥$Æ(ç1L ¥$d$„$¥$„ ¥$d$¥ …$„ ¥,Å(ç,é ç$Æ$Ç § Æ$¥ § Æ(¥$Ç,ç$ç(ç$Æ(ç,Æ$Ç(ç(¥$Æ §(¥$Æ † Æ$Æ,Æ,Æ-*) - Æ„¥¥ † Æd Æ ¥ ¥ ¥(¥ §$¥¥(¥$¥$¥ §1)) e$„$¥$¥$d$¥$„$¥$d ¥(¥1$Ç) § ç § Æ Æ § Æ(¥$Ç(ç(ç(ç(ç$Æ(ç,Æ$Ç(ç(¥ §(¥(ç † Æ(¥ §(ç1-* ç e¥¥¥ †¥$¥ e$„c …d …c …$d„,Æ-*$d$„$„c$„ d$„c„$dƒ ¥,¤5J † †ƒddd ¥ e ¥ …$d ¥(¥(¥(¥(¥(¥$d(¥$¥(¥ †$„ …¥ † †(¥5$Çd$¥ed$¥… ¥$c$„ d „ d „ddƒd e$¥1 §$„$d$„d$„ c$„d$dƒ$d$„-) -c ¥ „dd … ¥ e$„d(¥ †(¥(¥(¥(¥$d(¥ †$¥$¥ e ¥ … ¥$¥ e5I1*e „ …d¥ d …d$„c …$d$„d$„c „$d$Æ1d$„$„$„$d ƒ$„d$„ƒ e „$„-*$¥d ¥d ¥d ¥ e$„ ¥$¥$„ †$„ †,¥(¥(¥$¥ † † …(¥¥d$¥ e(¥5,éd ¥d¥d †$„ d „d „$d$„d$„c$„d$„-* § c$„$„ d$„$„ƒ „d$„c$„-)d eƒ$¥dd ¥ e ¥$¥$„ †$„ †(¥,¥,¥$¥ †$„$¥ † ¥d$¥e(¥1)1L$¥ ed¥ †$„ d„$d$„d ƒ d ƒd$ƒ d$„(ç-*d$„$„ƒ$„$„$„ „d$„ „$d$„-*¥d „ddd „d ¥$d ¥(¥ †$„(¥$d(¥ †(¥d …$„ „ …d$¥$¥(¥5m$çdd „ … edd„c$„ d„$dƒ d$„ c$„$„-* §$„$d$„$„$„ ƒ$d„$dƒ ¥$d1$Çd „dd„d „d ¥$„ §$„ †$„(¥$„ †(¥ ed$¥ „ e „d(¥(¥1-ldd „ …ddƒ e$„d ƒ$d$„ƒ$d$„ c$„(¥1L$„ ¥$d$„$„$„$„$„ƒ ¥ d$„$„) ed „d„d„d ¥$„(¥ †$„(¥ e$„(¥ …$„ e$„ „ † ¥$„ ¥(¥(¥5k$Çddd¥d „d ¥$d„$d$„ d ƒ d ƒ d$„$„5J ç$d$„ƒ$„$„$„$„ ¥$d$„$„$d(ç Ædd „dd „d ¥$„(¥ †$„(¥(¥ d(¥(¥ d(¥ …$d ¥$„d$¥$¥(¥,é1Lddd„„…$d„$d „ c „ c$„c „$c „$¥5Jd$d$„$„ ƒ$„$„$„$„$„$d$„$„ çd „„dc ¥$„$¥$„(¥(¥(¥(¥(¥(¥(¥(¥,¥(¥(¥(¥$d$¥$„(¥(¥ †$d1L ç dd„dd„„$dƒ$d ƒ$d ƒ$d ƒ d ƒ$d ƒ5J$Ç d$„$„ c$„$„$„$„$d$„ „ ƒ(¥ †d „„d$„d$¥$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$d(¥$„$¥$„(¥(¥ †,ç-* ddd„ddƒ$d § §,Æ$Ç$Ç § § † † †,é1) -(¥$¥ †$¥(¥ † § e ¥d$¥ †-*) § §$Æ e …$¥ e$¥$„ †$„ † † … †$d †(¥ †(¥$Ç$Ç †$Ç$Ç §,é-l) - § § § §Æ § §$Ç § §,¥ §$Ç,é † † † †$Æ1L1L$Æ †$¥(¥ †(¥ †$¥d¥ †$„,é)K Æ §$Æ †d(¥$¥ †$„ …(¥f † … e †$„ §(¥ †,¥$Ç §$Ç$Ç §$Ç1L1L §Æ § §Æf § §1Œ=¯9=Ž=¯A°11L-*-l5=Ž=ï559k=ŽAð=ï=¯A°=Í=¯A°9ï=Ž=ŽAï=Ž51*1Œ1L1L55m955m59m5m11L1L1L1L1=¯A°=ÏA°=¯=¯AÐ=¯=ð5AðAòAñAòAñ=ð=¯1595m1L11L-*-l5m5A¯=Ž555A°=ï=¯=ŽAð=Ž=¯=ï=Ž=Ž=¯A°=Ž5J-l1L1L1L551595m5m5n11L1L1L15A¯=°=ÏAò5A¯5Aò=ð5Aò5Ž111,ç,¥0ç0ç-*=Ž(¥$„$¥d$¥d „d ¥(¥d Æ$¥$¥(¥$¥$¥$¥d ¥c$Æ(¥d¥ † ¥(¥5J=Ž1L5I5J1L5J5k5m9k5m5k1L5k5m1L5J-,é11-1)5)1)5)1)5)1)1)51*51L- e$¥$„(¥(¥ e „ „d ¥ ¥$„ „$¥(¥ Æ(¥$¥$¥ † eƒ Æ$¥ ¥$d „¥(¥,ç=¯1L5I5J5J5k1L5k5k9m5k5k5k9mF=Ž1,ç,ç,é115I5)15I1)5)9),Æ † d$„,é5m(¥ d „ddd„d …$¥$dd$„ddddd „dd¥ †ƒdd …(¥1=Ž,Æ(¥ †(¥(¥,¥$Ç,Æ0ç$Ç,Æ0Æ=Ž1Œ †(¥$d(¥$„(¥,¤(¥$d,¥,¥,¥,¥,¥$Ç,¥,¥$Ç,é$„(¥ †$ddd„dd„ e ¥ „dddd„dddƒd(¥dddd(¥,¥51)(¥(¥(¥(¥(¥$Ç,¥0ç$Ç,Æ,Æ5J=¯1(¥ e(¥$„$„(¥,¥$d,¥,¥,¥,¥(¥,Æ §$„ e11L,Æddd„dddd ¥d„dddd„edd „… ¥$dc„d$„55(ç,¥ §(¥$Ç0ç §,Æ,é,Æ,é0ç=Œ5m §(¥(¥ †(¥(¥ e(¥,¥(¥(¥,¥$Ç,¥0Æ,Æ(¥ §-$d(¥$„$„„dd„dd$¥dddd„dddd„d„¥ „d„d …,Æ51,¥ § †,¥$Ç0ç$Ç0ç$Ç,Æ,é5)A¯$Ç,¥ †(¥ † §(¥(¥(¥,¥$Ç,¥,¥$Ç,Æ † ed-5,¥dd„dd„dd$¥dddd„dd„d„d¥ …$d„dd$¥11,é,Æ$Ç,¥$Ç §,Æ0ç$Ç0ç$Ç0ç=Ž5m(¥(¥ e¥ † § § §(¥(¥ §(¥$Ç,é,Æ,é,¥,é1 d(¥$„ddd„ddd †ƒ e „dd„dÆcd„…$¥dd„d$¥(¥51*,Æ$Ç,¥ §$Ç,¥$Ç0ç$Ç,é,¥5JAò$Ç,¥ †$¥¥ §(¥ †$Ç,¥$Ç$Ç,¥$Ç(ç,Æ e¥51,¥dd„d„dddd„d„„ddd„d…d „$¥ddd „ †,ç5m4ç$Ç0ç$Ç §,¥$Ç$Ç0ç$Ç$Ç0Æ5m1L „f„„e†„e † §,¥ §,¥$Ç,é$Ç §--*$d$„ … dc„d„dd …dddd„dd„dddd$¥d „dd¥(¥5m15$Ç$Ç,¥$Ç §0ç$Ç$Ç,Æ,é5A¯ §¥e…d…f¥… §1 † §-(ç$Ç †$c11,¥ d „ddcdd„ ec„dcd„dd „„dc …$ddƒd$„,é1L0ç1$Ç$Ç0ç$Ç$Ç,é0ç$Ç,é,Æ5J) -d¥†e…„e„„d † Æ §,Æ$Æ$Ç,ç1) -d$ddƒdcdd dd„$d„„cd„dc … „dc …$„cdƒ$„(¥1L1),é4ç$Ç$Ç$Ç,é$Ç0ç$Ç,é0ç1=¯f…f…e…„e„d Ædd §(ç$Ç §$Ç-*11*$Ç § §f¥†¥dd„dÆe¥†„Æ §f†$Ç § ç §$Ç%$Ç1L1L%$Ç$Æ$Ç §(ç § § §$Æ † §=¯=ŽfÆ §$Æ § § § §(¥$Æ-1$Ç) -1*1-*9=¯) -%!$Çf §†f¥…dd„d¥…e¥† § ÆfÆ § § ç §) -$Ç) --l) - § §(ç$Ç$Ç,¥$Ç$Ç$Ç † †1Aò æ¥ ç$Ç §(¥ † §,Æ §$Æ$Ç ç$Ç=Œ=Œ5m5J5m=Œ1L1-l-*1*) --)-*1*5-l-*1*1-*)J1L5J-*1L1Œ5k5A¯5Ž1Œ5m1L1Œ5k1Œ-*1*)-*1*-*)K1L1L1L5k=Ž=ï=Ž=Ž=Ž=Œ=Œ=Œ=¯Iï=¯A°=ÏIðAð5A°9Œ9m=Œ=Œ=Ž5m) -1*1L)J1)-))K-*9-l1L-*11L-*1*)J5J-*-l559=¯1Œ1L51L5k55J)K,é) -)K-*1*-*1*-l1L5A¯9ï=Ž5=Œ5k=Ž=¯A°=ÏA°=¯Iï=¯=Žd †$„(¥$d(¥ …d ¥ e ¥$„ ¥(¥1)K(¥,Æ(¥,¥,¥(¥(¥(¥ ¥$¥(¥ ¥$Ç1L1 §(¥$Æ §$„ †$„ †$¥ e Æ §(¥,Æ$Ç(ç,Æ$Ç(ç$Æ,ç$Ç$Ç(ç,ç0ç,é-*(ç,¥(ç(¥ §(¥$d,¥$„(¥(¥ †$dd ¥ … ¥ e(¥,Æ1L(ç$¥,¥(¥(¥,¥(¥,¥$¥$¥$¥$¥(¥)K1)$Ç,¥$Æ §$„ †(¥ † ¥ ¥$¥ †$Æ §(ç,Æ(ç$Ç$Æ,Æ$Ç$Ç$Ç(ç,ç0ç$Ç1L0ç(¥$¥d„d¥ † … ¥ ed ¥dd¥d(¥ †55m$Ç,¥,¥,Æ$Ç,¥0Æ,ç$Æ$Ç,Æ § ç5,ç § § e(¥ …$¥ † e¥ … †$¥$¥ †(¥ † §(¥ e †¥$¥ † † §,¥0ç,é(¥,Æ † §(¥(¥(¥ e … † dd …„ed$¥d$Æ,Æ5m-,¥0Æ,¥,Æ,Æ,Æ,ç,Æ §(ç$Æ †-l5)$Ç § e$¥ † † … ¥ ed$¥ † †(¥ †(¥ † §(¥ †ed¥ † †,¥,Æ1$Ç,¥ e…ddd „ …„ e„¥ ed¥ † †(¥-*1* ¥,¥0Æ,Æ0Æ0Æ0ç0ç$Ç,Æ ç § ç1L-(¥ †$¥ e¥ …¥ e¥ †¥ †(¥ †$¥ † §(¥ e Æ † † †$¥ †,¥,é$Ç,Æ,¥$Ç(¥ §(¥ † †dd$¥d…$¥d¥ e$¥ †0ç1L §(¥0Æ,Æ,Æ0Æ0Æ0ç$Ç(ç$Æ$Ç Æ-*1* §(¥ †$¥ e „¥ †d †¥ †(¥ †(¥ †(¥ †$¥ † †„ † †(¥ §,¥1$Ç,¥ §$¥ ed„†d¥dd¥e¥… ed$¥1-l e,Å0Æ,Æ0Æ0ç0Æ0ç0ç §$ÇÆ,é1L(ç §(¥ e †¥ … e¥ †d$¥ † †$¥ †$¥ † § †d § ¥ † †(¥ †0Æ-* §(¥ †(¥ § †(¥e †d…dd¥ e…¥ e … §5 §(Å0Æ,¥0ç0Æ0ç0ç0Æ$Ç(ç † ç1L1 § † † † ¥ e …¥ e¥ † †(¥ †$¥ † †$Æ † e¥„ † § †(¥,¥) -$Ç,¥ †ddd„ „ed¥dd… e¥d$¥ †%1L,ç0Æ55====5 §(ç †%-* §(¥ †¥$¥e …¥e †$¥ …¥ †(¥ † † § e ¥$¥ e¥ …$¥ †,¥0ç) -,¥$Ç †(¥ §(¥ e „dd¥d¥ed¥…d$¥ §1L-0ç4ç5====5$Ç §$Æ §1L$Ç$Æ §$¥ e …¥e †d$¥¥ † †$¥ †$¥ † †$¥e …d¥ †(¥ †0Æ-*,é(¥ ed „d „dd „dd„dd „¥ †(¥,é1L ç,Æ † §,é5$Ç,Æ$Çdf¥%) -(¥ †$¥ e …¥e …d „…$¥ †$„ †(¥ †$¥ †d$¥ e…$¥ †(¥(¥,é5k §(¥(¥ †(¥ †(¥ † eƒ ¥ddd¥d † ¥(¥ §1L,é ç(¥ †,é,é,é,Æ$Ç(¥d¥ §)K$Æ †(¥d$¥ed … „¥ e …¥$„ †(¥ †(¥ †d … „¥ †$¥ †(¥,¥-*,é(¥(¥dd ç §$Ç!f ç § ç ç ç § § §$Ç)K-*e…„ddf §… §)K) -) -)K1L ç § § ç § §f¥†f § ç § § § § § †$Æ † § † † §$Ç,é$Ç551*,é) -,é,é,é,é$Ç † ††Æ¥ †f § Æ § §-*9!dd„ dd†fÆ!1L) -) -9$Ç § § § §Æf†f Æ § § § § § § † § † † Æf Æ$Ç,é$Ç,é5k5m) -,é) -,é55k95k1LAï51)1L-)) -)K-*)J5m5k1*-*1*) -1*1Œ1L1=Ž=ï55k=Ž5k5955Ž1Œ=¯=ð51Œ51Œ=¯95559Ž1Œ5m=ŽIð9ð9=¯A°9ŽA¯=Ž=Ž=Œ=Ž=Ž=Ž=Œ5m=Ž5m=Œ=ð5J,é-*-))K1)K-*1*1Œ5J1L11L) -)K1L5k59=°=Œ5m59k=Œ5559Ž5Añ5Œ5=Œ-l5=ð5595Ž51L5ŒIðAò55Að=Ž=¯=Ž=Ž=Œ=Ž=Œ5=Œ(¥,Æ(¥,¥,ÆAð)J e$¥$„ … e ¥(¥(¥$¥ † §$Æ$Æ §$Æ §(¥(ç(¥ †$„$¥$¥$¥ ¥(¥,¥(¥5kAò,è(¥ Æ(¥$¥$¥$¥$¥ †(¥(¥(¥,ç=¯5J(ç(ç,Æ(ç$Ç,Æ,Æ †$Æ §,¥,ç,Æ,¥,Æ0Æ5-$„ †$„(¥ e … ¥(¥ †(¥$¥ §$Æ §(¥ †(ç(¥(ç §$¥$„ †$¥(¥ †(¥,¥(¥1Að1L(¥ §(¥ Æ(¥$¥ † ¥(¥$¥(¥,Æ5m5Œ-,ç$Ç,Æ$Ç,Æ,Æ §(¥ §(¥,Æ(¥,Æ §$Æ,¥5m,é$¥$„ †$¥$d$¥(¥ †$„ †(¥(¥ †(¥ §(¥(¥,Æ §(¥$¥ †(¥ e(¥,Å,Æ,Æ5JIð-(¥ §$„ §(¥ †(¥(¥ †(¥,¥55 §,Æ(¥,¥ §(¥,¥ †$Æ §(¥ †,¥,¥,Æ,Æ,Æ1L1 †$d(¥ †$„(¥ e(¥ †$¥(¥$¥$¥(¥ †,Æ §(¥ §,¥(¥ †$¥$¥ e$¥,¥,Æ,Å1Að5k(¥$Æ(¥(¥ †(¥ §$d(¥ §,¥,¥=Ž-*(¥(¥,¥ §(¥,¥ §(¥ †$Æ(¥,¥(¥$Æ(¥ †,¥-*,é e$¥$„$„(¥$¥$„ †$„(¥(¥ †$¥$„(¥ §(¥(¥(¥(¥$¥$¥(¥(¥,Æ,Æ,Å,¥5kA¯$Ç$Æ(¥ †(¥ †(¥ † †(¥ §(¥,é=¯,ç,¥,¥,¥ §(¥,¥,Æ,¥ §(¥ †$Æ$Ç,¥,é0ç1L-*$d(¥$„$„ †$„(¥$„ †$„(¥ †$„ †$„$¥(¥(¥(¥,Æ$¥$¥ ¥(¥(¥,¥,Æ,Å,Å1=¯1*(¥ §(¥ †(¥ †(¥(¥ †(¥(¥,¥5m1L,¥,¥,¥,¥ §,Æ(¥(¥,Æ † §(¥(¥ †(¥(¥ §5) -$„$„$„(¥$„(¥(¥(¥(¥$„ †$„$¥$¥(¥(¥,¥,¥(¥(¥(¥(¥,Æ,¥,Æ,Æ,Æ,Å5A°$Ç(¥ † †$„ †(¥$¥ †(¥$¥(¥0ç=Ž1,¥,¥,¥,¥,¥ §(¥,Æ(¥ † § §(¥$Ç$Ç,é5k) -$d$„(¥$„$d(¥(¥(¥(¥(¥$d(¥ …(¥ †(¥$d,¥,¥(ç(¥(¥(¥,¥,¥0ç,Å,Æ,Å1)Að)K(¥ † †$„ †(¥ †$¥ †(¥ §(¥=Œ5k,¥,¥,¥,Æ(¥(¥,¥,Æ(¥ †(¥(¥$¥(¥ †(¥$Ç5) - e$„$„(¥(¥(¥(¥(¥$„ †(¥$¥$d,¥(¥(¥,Å0ç,¥,Æ,Æ(¥,Æ(¥0ç,Å0ç,Æ5JAð) †(¥ †(¥ † † …$¥$¥ †(¥0ç5m-,¥0ç(¥,¥,¥,¥,Æ(¥(¥ †$Æ §(¥ §,Æ$Ç=Ž1)$d(¥$„$„$d(¥(¥(¥(¥$„(¥ e(¥(¥$„(¥(¥,¥0ç,¥(¥,Æ,¥,Æ,Å,Æ,Æ0ç,Å-=¯1* §(¥ †(¥ † e ¥$¥ †$¥(¥(¥5k1L,¥0Æ,¥,¥,¥ §,¥,¥,Æ †$Æ †$„ †(¥(¥,Æ,é,éc …$d$„ ¥$„$d(¥ …$„$„(¥$¥(¥,¥,¥,¥,¥(¥$¥(¥,¥,Æ(¥,Å,Æ(¥,¥-)=Ž) - ¥(¥ † e$¥ † ¥(¥ †(¥ †(¥5m,é,¥,¥,¥,Æ,¥,¥(¥,Æ,¥(¥ †(¥ †,Æ †(ç1L1 e$„$„ e$„ …$¥$„$d(¥ „$„ †$„(¥,¥(¥,¥,¥,¥$¥(¥,Æ,¥,Æ(¥,Å,Å(¥,ç55$d(¥ † … Æ$„ e$¥$¥ † § d-*1*,¥,¥,Æ,¥,Æ(¥,¥,Å,¥(¥ e$„ §$Ç$Ç,é1L5m-l$Ç § ç § § §%) -$Ç%$Ç) -$Ç1*$Ç,é%$Ç%$Ç%$Ç),é)K-*9k=Œ551*†$Ç$Ç ç%!$Ç) -!!1L5A¯1L51),é4ç11) -51L1*-*,é$Ç-*)K,é1Œ1L,ç-,é † ç § §$Ç) -!,é%,é%) -,é%1!$Ç$Ç%$Ç$Ç) -) -1*1L=Œ55m1Œ § §) §!) -!) -$Ç!-*9m=°1,è$Ç$Ç!,é%) -1) -) -) -) -5Að=¯9Að=Ž=Ž=ï1Œ=¯9=¯5Ž15k91L1Œ1L51L1L1Œ55Œ1=ŽAòAð5=Ž=ïAð=¯IïIðAð=ï=ŽAð=ðAò=¯Ið=ðAò=Ž=ŽIðEðAð=¯=ï=ŒAð=ðAò=ŽAðAðAðJNS=ÐIðAòJAð1Œ=Ž=Ž=Ž5ŒA¯9ŽAð5155k1L1L1L51L1L1Œ5m595AðAð5=ï=ŽAï=ï=¯JIð9ŽAð5IðAðAðAð=¯=ð=¯=ŽAðIðAïAð=Ž=ï=¯A°=ð=¯A°9ð=ðJNSAÐ ¥ e ¥ ¥$¥d Æ$„ e §(ç)K$¥$c$„$„ ¥$„$„ ¥$d$„ „,Å(ç,é ç(¥ ç(¥¥$¥$¥¥ §,Å(ç$Æ$Ç(ç(¥(ç$Æ,Æ$Æ §$¥(¥$Æ$¥$¥ †(ç(¥1L)$¥d¥d¥ † „ …Æ$¥ e¥$¥ † ¥ ¥ e Æ(¥-* ç$d$„$¥$„$¥$„$d$„ „d(¥,ç,ç%$¥ § ç ¥ ¥$¥ †(¥ §,Å$Ç(ç(ç Æ,Æ$Æ,Æ$Æ §(¥ †$Æ(¥¥ §(¥$Æ5) - ç †d „¥ †¥ e e$„c$„d …c„ e$„$Æ5J d …$d$„ d$„$d„c„ e$„$¥5J †$¥d edd¥(¥d †$„$¥(¥(¥(¥(¥(¥(¥ †$„(¥ † …$¥ e¥ †(¥=Œ$Ç e¥d$¥ e¥d¥ d …$d$„d …c„$dƒ$¥-* §$d$„$d„$c$„„d$„ „d$„1,é „ eddd ¥d$¥ e ¥ …$¥(¥(¥(¥(¥(¥(¥ †$¥$¥$„ † … „¥(¥-*1L$dd¥ … ed … „$„$„c …$d„$dƒ d$„$Æ1d$„$„ ƒ$d$„ƒ$d„ ¥$dƒ$„-*$¥ ed „¥d …d ¥$„$¥ †$„ †(¥(¥(¥(¥(¥ † †$„ † … „ e¥,¥5m,éd ¥d e„ …¥ †d$„d$¥$d ƒd$„c$„$d1) § c$„ ƒ$d$„$„ƒ$d„c …$„1%d „d¥d … ¥ e ¥$„$¥$¥$„ †(¥(¥(¥(¥ †$„ † …$¥d¥ †(¥5-l † ed „¥$„d$„$d„$dƒ$dƒ d$„ c$„(ç-* e$„$„$„$„$„$„ „d$„ „$d$„-*¥d „dd„d „¥ †$„(¥ †$„ †$„(¥(¥e … e ¥$„ „d$¥$¥(¥5m$çdd „¥d¥ dd …$d„$d$„d ƒ d$ƒ$d$„-* §$„$d$„$„$„$„ „d$„d$„$„-) çd „dd „d „d ¥$¥$„(¥ †$„(¥$d †(¥d †$„ „$¥d †$„(¥) -1L dƒ „e …c„ e$„ dƒ$d „$c „ c „$„(¥1L$d$„ƒ$„$„$¥$c$„$„ „$d$„$„%dd „d„d „d$¥$„ †$„ †(¥$d(¥$„ †$„ …$d$„ … ¥d$¥(¥(¥5k$Çdddd …dd ¥$d„$dƒ$d „ c „ c$„$„-*$Ç d$„$„ƒ$¥$„$d$„$„$„ „$„(ç †dd „dd „d ¥$„(¥ †$„(¥ e(¥(¥$d(¥ „ e$„ … ¥ e ¥$„(¥11Lcdd„d¥ d$„$d „$c „$c „$d ƒ$d$„$¥1Œ$dƒ$„$d$„$„$„$„ c$„$„ƒ$¥ § „ „„cd ¥$„(¥$„(¥(¥(¥,¥(¥(¥(¥(¥,¥(¥(¥(¥$d(¥$„(¥(¥ †(¥1L § e „c„„¥d e ƒ d$„$c$„ c „ c$„$c$„5J ç$d$„$„ c$„$„$ƒ$d „$„$d ƒ(¥ Æc …d „ƒ ¥$„(¥$d(¥,¥(¥ §,¥$d,¥ †,¥(¥,¥(¥$d$¥$„(¥,¥ †,é-*cd„„ddd$„ † † †$¥ § †eddd §1L% §(¥ †,Æ(ç$Ç$Æ § Æ §$Æ,Æ) -) -(ç § †d$„d † „$„ ed … †e „ e †$„ „(¥$¥ † e § † † §)K §cdddcdd$„ ¥ †(¥ † †$Çe… dc †-*)K$Ç † e(¥,ç(ç §$Æ § Æ$Æ §1) -,é ç †dd … e …$¥ dd … e † „ †$„ †$„d(¥ † e † § † †-*) -f†Æ$Çe„e†1*1+5Ž) (è) -1*-*1k9k5L5k1K5K-*(é) 1l1l5l1l1m1L1L5Ž5l1K5l5l1J1K1l1 -(è5L-*(è% 1*-*1K5l5k5K1K1K1K(é) 5K1m5l1l1l1L1l9¯9m5K1L59Œ1J-+(¥ …5*$…ddd „dd„d„…„d$…5K(Æ(¥$¦,Æ(Ç0Æ5m(¥$¥$…(¥,„,Æ,¦(Æ,¥1 -$Æddd „dd„dd„…d „1*,Ç$¥(¦(Æ0Ç(Ç=(Æ$…$¥(¥,¥,¥,¥$Æ …1K$„dd„ …d„d…d… …d „1K,Ç(Æ$§(Ç(Ç,ç5m$¥…… ¦$¦(¦,è,è,è1 -(Æddd„„dd„d……d„1 -,è,Æ$§(Æ,Ç(Ç9m$¦………$¦(Ç(Ç(§ ¥1K$¦…ddd„dd„…d ¥… …1*(È(Æ(Ç(Ç,Ç$¦5L„¦………$¦$Æ ¦ ¦-+(Ç…ddd„d„d…d …… …- -,è(Ç(Ç(Ç(Ç(¦9l…¦……„ ¦¥- 11*(è(è$È(è1*)(è,è,è)- 1L1J1*- (é$Ç(è(è-*- 5l1*1*5J5L9k9l5l5J1*1 - (è(ç(è1 -) ,è(è-(è-1l1J1*- -- $Ç(è(è- - -1K1K1*1J5K9l5K1*d ……„……$¥1+(¥0Æ,Æ,Æ$Ç$Æ)*(Ç ¥ … ………$¥$† ¦ ¥ …… ¦,¦(Ç(¦$¥$† … …„…… ¥1*(Æ,¥,Æ,Æ(Ç$Ç$è- † ……… … ¥$¥ † ¥ †… †(¥,ç$¦e……d……… …-+(¥0Æ4ç4ç(Ç Æ1 -$Æ †…… …¥ † ¥ … †„… ¦,¦,è$¦$…$¦e„……d¥1 -(¦0æ4Ç4ç,Ç$Æ(é(Ç ¦… ……… ¦ … ¦ †……$¥(¦,é$¥d……„…… ¥ ¦- -¦…$Æ ¦ ¦ Ç-K… †……e… ¦ … ¦ ………$¦,Ç1 -$Ç(§ ¦ …¥…d¥ †) Ç… ¦$Æ §Æ) ¦ †……e… ¥ † ¥ ………$¦$¦1+(¦ ¦1*1)5m- --$Ç(é-)(è(è(é-*5k- -1*-)1*5k9- -1J-*- --)1*=¯1K5K5K1*1*5*5+10è1*$Ç$è(è- (é$è) -*1K1*1 --)1*1*9®-*-*-J-*1*-)AÏ1J5L5K5K1*5+(¥$¦1 (Æ …$„$¥$¥$… ¥$¦$¥(¦$¥$¥(¥,Å15m$¥$…$¥$¥$¥,Ç1+(¥(¦(¥(¦ ¦$¥$¥(¦,Æ(È$…$¤$…$¥$… ¦$¥(¥$¦$… ¥$¥,¥,æ9Ž$¥$¥$†$¥$¥,¥5M(¥(¥(¦$¦ ¦(¥$¥$¦(Ç(Ç$„(¥(¥$„$¥$…(¥$¥,¥(¥,Æ,¥,æ11L$¥$† ¥ …$¥(§5K,¥(¥(¥,¥ ¦$¦$¥$¦,è,è$„$¤(¥$…$„(¥$¥(¥(¥(¥,¥,Æ,Æ,æ9Ž …$¥ … ¦ …(¥5l,¥,¥(¥,¥$¦$¥ †(¦- $Ç … …$¦$¦$¥$¦$¦(Ç(¦$¦(Æ,Æ,ç- 5l … ¦ ¦ ¦ ¦(é1K(¦$¦(Æ,Ç,Ç(Ç$¦$¦$Ç(é… …$…$¦ ¦$¦(Æ(¦$¦$¦(Æ(Ç,ç15m ¥ ¦ ¦ ¦$¦$È1L(Æ(¦(Æ(¦(Ç$¦1K1+1K1J-*5L-*-)- - )1*1J1L1k1K5K9Œ5k5K5l5l5k1L5l5K5K91K1K1l55l1K1L1J1+1K-+1)- -)- - 1K1k1K1K1k9l5Œ5K5L5l5l-K=l5K5K5l5l1K1l5 d „d „d)$d „ „ d„ „,è …„d … … …$¥(¥(¥ …$… ¥ …$…-* …„…„… d „d „(Ç ¥$„ d „d „(Æ ¦ „d… … …$¥$¥(¥$…$¥ …„ …5Ke„ …d „ „d „ „-$„ „$„$„ „ „(Çd„…„ …$„ …$¥$… „ … …„(¥-*d„e„… d „ „ „(Ç ¥$„$„$„„ „$¦ ¥„d… „$¥ …$…(¥ … „ …„$…1*„…dd … „ „d „,è ¥$„$¥$… ¤ …(Æ ¦…d$¤$…$…$¥$…$¥$…$¥$… …$¦1*e¥d…… ¥ …d „(Ç$Ç „$¥$„$¥$„$¦ ¦ …„ „$…$¥$…$…$¥$…$…$¥ …$¥- -……d…1*1*9Ž- (è) --*-*1K5K1J5K1J1K-)(è- 5l5l1l5l1l1L1l9Ž5l5lA®9Œ=5l9l9®=l9- $è- -+- 1J5K5k1K1*1K1*(è- 1K5l5m1l5m1L5l9¯95K5L5l91K-+(¥ …5+$„ddd …dddd„…„d$…5K(¦(¥(¦(Ç,Æ,Ç5m(¥$¥$…(¥(¥,¥,¥(¦,Æ1Kdddd „dd„dd„…d „1*,Ç$¥(Æ(Ç,Æ,Ç=Œ(Ç$…$¥(¥(…(¥,¥$Æ e1K$…d„dd„d„e„…„d ¥1+,ç$¦(Æ(Ç,Ç(È9 ……†¥(¦$¦,Ç,Ç,ç1Ldd„d„d„d…d„ …d …- 0è(Æ$§(Æ,Ç(Ç9l$¦……†$¦(Ç(¦(Ç …1L(¦„ed„dd„„……… … †1*,ç(Ç(§(Ç$Ç(¦9d¦………$Ç,è,è(Ç5m¥…ed„d„d„…e…… ¥- -,è$Ç(Ç$§(Ç(Ç9l…¦………$¥ ¦- -1 (è(é$Ç(è1J(é,è,è,è(è-)1l1)1 --*)$È$è,è- - -1k1J1*1*9K9l9l=l5K1*1 ,è$è(è(ç-J- ,è,è(è)-1L5K-*- ) (Ç$È),é-)1K1+1J1*5K9m5*-*d… …„……$¥1+(¥,¦,Æ0Æ$Ç$¦)*(Ç † ¥ ……… ¥$† ¦$…†¥ †,Æ(Ç$¦$…$¥ ……„… „ †1 -(Æ0¥(Æ0Æ(Ç$Æ$é,è ¥ … …… … …$¦ ¥$†¥… †(¥(è(¥e„e„…………1*(¥0ç8ç4ç(Ç$Æ- -$Æ † ……… ¥ † ¥ † ¥……$…,Ç(Ç$¦$¥ ……„e………- (Æ0Ç4ç4ç,Ç$Æ$é(Ç ¥†… …… ¦ … ¦ ……… ¥(¦,é ¥e…¥……¥… ¦-+¥… § ¦ § Ç-* † ¥…………$¦ … ¦……¥$¦(È1 -(Ç$¦ † „…d…… †-* Æ… ¦$§ ¦Æ) - ¦ †………… † ¥ † ………$¦(Ç1*(Ç$¦1)- -9l-*(è$è(è- (è$è,é-*1k1 1)- 1*5k9-*-*-*- -1)1+=®5K5K5+5*-*1*1*5K- -$Ç$Æ$è(è- (è(è) -)5K1*- -)1)1+=Î- -*-*-*- -1)=¯5K5K5+5J1*1*(¥$¦1$Ç$„$…$¥$¥ …$¥ ¥(¦(¥$¥$¥(¥,Æ15l$¦$¥$…$¥$¦,Æ1K(¥(¦(¥$¦$¦ ¦(¦1(È „d$¥$…$¥$„$¦$¥$¦(¥$¥$¥$¥,¥,ç9®$¥$¥$†$¥$¥(¦5L(¥(¦(¥$¥$¦$¥$¥$†,ç(§$„$¥(¥$…(¥$…(¥(¥,Å(¥(¥,Æ,Æ15L ¥$… … ¥$†,Å5K,¥,¥(¦,¥$¦ ¥(¦1*,è d„$…$¥$…$¥$…(¥(…,Å(¥,¥,Æ,Æ0ç5 …$¥ … ¥ †(¥5L,Å,¥(¥,¥$¦$… †(¦- (è … …$¦$Æ$¦$¦(¦(Æ(§$Æ(¦,ç,ç1)1l † ¦ ¦ Æ §(è1L(¦(Æ(Æ(Ç(Æ$Ç$Æ-+1* ¥… …$¥$¦$¦$¦$Æ,Ç(¦$Æ$¦,ç,ç1 5$… ¦ ¦$¦ ¦$é5L(¦(Æ(¦(Ç(Æ ¦1*1K1K-*-*1l- - - - ) 1)1+1K1K1J1K9l5K5K5k5L1k1K5k5K5K5m1K-K1l5m9l5Œ5l-*1*1l-*- -- - ) - 1J1L5K-+5K5k9l1K5k5l1L1J5l5K1K9l1k-K1l5l d„ d„ d,è „$„ „d „ „(ç ……d… … „$¥$…(¥ ¥$… ……$¥1*………„ „ d„ d„(ç …$„ „ „„ „(¦ Æ…d… ¥$…$¥$…(¥$¥ …$…… ¥1* …d … „ „ d ƒ d „,è „ „$„ „ „ „(Ç„d„„ …$¥ …(„$¦ „ … … „$¥- -d„e„d „ „ d „,ç ¥$„$„$„ „ „$¥ ¦d„„ … …$…$…$¥ … „ …„(¥1*d„e„ … … „d d) $¦$„$¥(¥$„ ¥(Ç ¦ …„ …$¤$…$¥$…$¥$…$¥ …$¥$†) dd„d „ d$„d$„(Ç$Ç$„$¥(¥ „$…$Æ$§ …„ …$„$¥$…$…$¥$…$¥$… ¥$†- -e…d…-*5*9) (è) -1*- 1J1K1K5K-*1J- -(è) 5l5m5l5l5l1L5l5Ž9l1K5L5K1J5m5k5K1*9l,è%- -*- 1*1K1K1J1J-*1)$é-5l5l5l5l5m1L1k9¯=5K5L5l=l-K1K$¦$…5* …ddd …d„dd„… „d …9K(Æ$¥(¦(Ç,Æ,Ç5m$¦$¥(…(¥(¥,¥,¥,Æ,¦,çed„d„„dddd„ …d „1*,Ç$¥(¦(Æ,Ç,Ç9Œ(§$¥$…(¥(…(¦,¥$Æ e1K$…d„d„„dd…d„ …d …1J,ç(¦$Ç(Æ(Ç,Ç5m ¥…† ¥$¦$¦,è,è,è,èd„dd…dd„e„d…d…1 ,è(Ç$¦,Ç(Ç(Ç9l$¦……¦$¦(¦(Ç(Ç …1L$¦…e„dd„d………… ¥$¦-J(È(Ç(Ç(Ç$§,Æ5L…¦………(Ç-,è-1+¥……d„d„e„…… ……$¦) -,è(Ç$Ç(Ç(Ç(¦5l…¦…†„ ¦ Æ--1 (ç(è$Ç(ç1L(è,ç,è,è(è-1L1J- - (è(Ç$è(è- - 1K1K1*1*9K5L5K5K1*1 -(è)$Ç(ç1+(é,ç,è(ç(è- 1k1J- - -$Ç$è(è- - 1K1K1*1*5L9l5*-*………d……$¥1+(¥,Æ,Æ,Æ(Ç Ç- -(Æ ¦ … … …… ¥$¦ † ¥ …†$¥(§(Ç(¦$¥$… ……„…„ …1*(Æ,Æ,¥0ç(Æ$Ç$è(è$¥ † ……… †$¥$† ¥†… ¦(¥,è(¥ed…„…e… …-*(¥4ç4ç8ç(Ç ¦) (¦ ¦……… … † ¥ † ………$¥,¦,è ¦$¦ … …„e………- -(Æ0Æ4ç4ç,Ç$Ç$é$Ç$¥ ……… … ¦ … ¦ ……… ¥$¦,è$¥e…¦…¥¦… ¦-+¦…$¦ ¦ §$è-+ ¦ ¦………† ¦ ¦ †… …¦(§(Ç1*(Ç$Ç$¦……d…… ¦- Ç¥ ¦ §$¦ç) -$¦ ¦………… ¦ ¥ † ¥……$¦(Ç1+(Ç$¦1)1 9m-)(è$È)-$è(è) -*5K- 1)- 1*5K9) -1*-*- - 1*=¯5K5K5*1*1*1*- 5m(Ç(è(è(è),è(é) (è1*1J1 1*- 1)1*9®-*-*1)- --)1 =°1J5K5+1*1*1*(¥$¦0é$Æ$…$¤$¥$…$¥$…$¥(¦(¥$¦ …(¥,Å15L$¦$¥ ¥$¥$¦,Æ1L(¥$¦,¥$¦$¥ ¦(¥1+$… „$…$¥$„$¥ …$¥ ¥(¥(¦$¥ ¥(¥,¥,æ9®$¦$…$¥$¥$¦(¥5m(¥(¥(¦$¥$¦(¦$¥$¥(È(Æ$„(¥$…(¥$…$¥(¥(¥,¥(¥,¥,Æ,Æ15L ¥$… ¥ …$¦(¦5K,¥(¥,¥(¥$¦$¥ §1K$„ d$„$…(¥$¥$„$¥$¥(…,Å(¥(¥,Æ0Æ,æ5Ž$¥ …$¥ † ¥(¥5l,¥,¥,¥,¥$¦$¥ †(Æ1 -$È … ¦$¥$Æ$¦$¦(Ç,Æ(Ç$¦(Æ,ç,è1*1k † ¦ Ç ¦ Æ- 1,(¦(Æ(Æ,Ç(è(È(è5(¦$¦ ¥ †$¦$Æ$¥$¦(Ç,Ç(Æ$¦(Æ,Ç,è1)5m ¦$¦ Æ ¦ Æ(é5L(Æ(¦(Ç(Ç(Ç$Ç1*1J1+-*-*1l- -- -,é)-*1*1K1K-J1K5K5K5k5K5L1K1*5l1K5J5m1K-J1l5l5K9l1K-*- -1K-*- - ,é)- 1+1k1K-J1K5K9k1K5K5K5L1+5K5J1K9m-K1J-K5k d „d „ d,ç „ „ „ d „„,ç …„e … … ¤$…(¥$¥$¥ … …¥$…1+„…… „ d „d„ d(ç …$„ „ „d „(Æ ¦ …„… …$„ ¥$¥(… ¥$¥ … … …1* …„ …d „ c „ d „,è „ „$„$„„ „(Æ…„d„ …$¥$…$„$¥ … „ … „$¥- -d…„„ d „ d „ d,ç ¥$„$„$„ „ „(¦¥„d„ …$¥$…$„$¥$… „ …„(¥-*d…d „ …$¥ … … …- $¦$„$¥ … „ „$Ç ¦… „ …$¤$…$¦$…$¥$¥(¥$¦$¦$¦)*† …… ¦ …$…$¦ … …(è$Ç$… „$¥ „ …$¥ Ç …„$…$¥$…$¥$…$…$¥$¥$¦$¦$¦1*…†… …1*5J9Ž- $è- - ---*1*1*1*-*-)- (è) 9m5l5m5l5m5L1l9Ž9l5L9l5l=995L5l- -(é-) - -- -)1*1J1*-*-*1*(ç(é5l5m5l5l5m5L5l=¯95K5L9Œ9l5l5L$¦$„1+$…d„d …d„dd„… „d …9K(¥$¦(Æ(¦,ç,Ç9$¥$…$¥(…(¥,¥(¥,Æ$¦(Æ$…„dd„„ddd„d …d …1*,Æ$¦(¥(Ç,Ç,Æ9m(Æ$… ¥(¥(…(¥(¦(Æ…5K$…ddd„d„d„e„ …d …1K,Ç(Æ$§,Ç,Ç,Ç5m …„†¦$¥$¦(Ç,È(Ç(Æ$…ddd…dd„…dd …„…1 0è(Ç$¦(Ç(Ç,Ç9m$¦…… ¦ ¦(Ç(Ç$Ç$¦1L(Ç………dd„…„…… ¦…$¦1+(ç$Ç(Ç$§$Ç(§5l…¦†¦ …(Ç(Ç(è1*) - ¦……„d„„e„ †… …¥$¦- -(è(Ç$Ç(Ç(Ç(§9l¥¦†…… ¦ ¦-,è1 $Ç(è$Ç(ç1+-,Ç(ç-(è-1L1*- -(è$ç(è(è- - 1K1*1*1)9l5L5K1*1 1 1)(È$è$ç(ç1+) ,Ç,è,ç(è- 1K1K- ,è- $Ç$è(è(è- 1+1J1*1*5K9m5*- d ……„e…$¥1+(¥,Æ,¦0æ$Ç$¦)*(Æ † … ¥……$¥ † ¦$…¦ … ¦,Æ(Ç(¦$¦$¥e …d…… ¥1 -(Æ,¥,Æ0Æ$Ç$Æ$é,è ¥ …… …… ¥$†$¥ ¦…… †(¥,è$……„e„……… …-*(¥4ç4ç8ç(Ç Æ- -$¦ ¥… …… …†$¥ † ¥ ……$¦,¦(è$¦$¦$……„e…… …) -(Æ4Ç4ç8ç,Ç Æ) -(Ç † ………¥ † ¥ † ¥……$†(¥(é$¥d ¥¦…¦¥ ¦$¦-+¥… § ¦$Ç È)* ¦ ¦ ¦…e¦$¦ ¦ † ¥ †¥(§,Ç1+(Ç(Ç(Ç †………¦$¦-+ Ç… ¦ § Æ$È)* Ç † ¦…… † ¥ ¦ † † ¥†$Ç(¦1K(Ç$§1 1 9l-)(è$È(ç- (è(è) ) -1J-- -)1 5k9Ž-)-*- --)- 1*=®1K5*5+1)1*5*1 5)5l(Ç(ç$Ç(è-(è(é(è1)1+-- - 1)1*9¯1 -))1*) --)1 =¯1K5K5+1*1 1*(¥ ¦1$§$…$¤$¥ …$¥$…$¥$¦(¥$¥$¥$¥,Æ15L$¥$¥$†$¥$¦,Æ1+,¥$¦,¥$¥$¦$¦(¦,Ç1*$…$¤$…$¥ …$¥$…$¥$¥(¦$¥$¥$…,Å,æ9Ž$¥$¥$†$¥$¦,¥5L(¥(¥(¦$¥$¦(¥$¥$¥,Ç$Ç$„(¥(¥(¥ …$„(¥(¥,Å(¦,Å,¦,Æ1(5L$¥ … ¦ …$¥,Æ5K,¥,¥(¥(¦$¥ §$¦(Ç5K$„$„$…(¥(¥$…$¥$…(¥,Æ(¥,¥,Æ,Æ,æ5Ž$¥ … † ¥$…$¦9k,¥,¥(¦,¥$¦$¥ ¦(¦1*$è ¦ †$¥$Ç$¦$Ç,Ç(Æ(Æ$Æ(Ç(ç0è1J5L ¦ ¦ Ç$Ç Æ- -5L0Ç,Æ0Ç,ç,è(Ç(Ç$è1K(¦$¦ ¥$¦$Ç$¦$Æ(Ç,Æ(Æ$Æ(§(ç,è1)5$† ¦$Ç Ç Æ(é5m(¦(Ç(Ç,ç(Ç$Ç-*-*1*-*-*1L- -(è- (è- 1J1K1K-*1*9K1k1K5K5K1K1 -5K1+1J5-*1*1K1K1K1J- -*-*5K)*-,è,é(è- 1+1K-K-*1J5K5K1K5K5K1K1*5K1K1*9l-K-*1K1K$„„ d„ d- d „$„ d„ „(ç ……d … … ¥$…(¥(¥ …$¥ ……$¥1*…„…… d „ d„ d(ç …$„ „ „d„,Æ ¦„e… … …$¥$¥(¥$… ¥ …„$¥1+ …„… „ d „ c „ „,è$„ „$„$„ „ „(Æ…„„„ …$¥ …$…$¥ … „ … „$¥- -d„…„ d „ d ƒ d,ç …$„ „$„ „ „(¦¥„d„ …$¥$…$¥$… „ … ……(¤1+d„… d … „ …dd- ¥$…(¥$¥ … ¥$Ç$Æ…„ …$„ …$…$…$¥$„$¥$…$¥ †) d„d„ …$„ …d „(Ç$è …$¥$¥ …$¥$¦$Ç…„ …$…$„ †$…$¥$…$¥ …$… ¦- -e¥ed,è- §$Ç(è(è(è$Ç- - - 1 1K,è-1,ç- - ¦$Ç(è$è(ç$Ç- - - - 5l,è1 -$¦(èd„d„……(è(Ç(Ç(Ç(é… ¥(Ç(Ç,éd„d„……$Ç,Ç(Ç(Ç- ……$¦$Ç$Ç ¦- (Ç,ç(ç-*(Ç$Ç$Ç(Ç(è(è1 1 (è$Ç$¦(é,ç,ç(ç-*(Ç$Ç$Ç(Ç(è(è1 (è…„…(è$¦,Æ$Ç(è…… † ¥… †,è$¦ †……$Ç$Æ,Ç$Æ$è …… … ¦… …(è$…,ç- -$Æ(Ç$Ç(ç,è(ç1 1*(è(ç1+1,è,è,ç,è$¦(Ç$Ç(ç,è(ç11K(ç(è5*-,è,è$¦(È$„$¥$¦(¥(¦(Æ0ç) ¥$¦- (¦,¦$Æ$¦(è$„$¥$¥(¦(¥(Æ,ç- ¦ ¦- ,¥(Æ$¦(Ç(è)(Ç$Æ(Ç- $è-,è-,è)1*$è)(è(ç(è(ç$Ç$Ç-$è,è--,è-1*(è(è „ d$Æ$„$… „$¦„ …$…$¥ … …,è„e… „$¥$¥$„ „$¦„ …$…$¥ … …(è„e,è- Ç$Ç(ç$È(ç$Ç- - 1 - 5K1 1 1 5)- §$Ç(ç$è(Ç$Ç- 1 - 1 5l,è1 -$¦,èd„d„……(è(Ç(Ç(Ç) … …(ç,Ç(é„d„d……$Ç,ç(Ç(Ç- …†$¦$Ç$Ç ¦- (Ç,ç(ç-*(Ç$Ç$Ç(Ç(è(è1 1 (è$Ç ¦,è,ç,Ç(è-*(Ç$Ç$§(ç(è(è1 (è………(è$¦,Ç$Ç(è …… ¥ †… ¥,è$¦ …„…$È$Æ,Ç$Æ$è †…… ¦ … ¥,è$†,ç- -(Æ(Ç$Æ(È,è(ç1 1*(è(ç5+-,è(è1(Ç ¦(Ç$Ç(ç,è(ç0è1K(è(ç5+,è,è,è$¦(è$…$¥$¥(¦(Æ(Æ0è) ¦$¦1 (¦(Æ$¦,è(Ç „$¦$¥(¦(Æ(Æ0ç- ¦ ¦- ,¦(Æ$¦(Ç(ç) (Ç$Æ(Ç)(è(è,è-(è,è1*$è(è-(è(è(Ç$Æ$Ç-$è(è--,è(è1*$è(è „ „$¦$…$¤ „$¦„ …$…$¥$… …(çd„ d „$¥$¥$… „$¦„ …$…$…$… ¥(çe„(è1 §$Ç$ç$È$ç$Ç- - 1 1 1K,è,è1 1,è ¦$Ç$ç$ç$Ç$Ç- - 1 - 9l,è1 -$¦,è…d„e……(è(Ç(Ç(Ç(é… ¥(È,è$Ç…d„d……(Ç,è(Ç(Ç- … ¦$¦$Æ$§ Æ- ,Æ,ç(è- -$Ç$Æ$Ç(Ç(è(è1 ,è(Ç$Ç Æ(è,ç,Ç(ç-*(Ç$Æ$§(Ç(è(è1 (ç………(è$¦,Ç$Ç(è…… ¦ †… ¦,è$¦ ………$Ç$Æ,Ç$Ç$è …… † ¥† ¥,è ¦,ç- $Æ(Ç$Ç(ç,è(ç11*(è(Ç5K,è,è(è1 $Æ$Ç(Æ$Ç(Ç,è(ç,è1K(ç(È5K,è,è,è$¦(è$…$¥$¦(¦(Æ,Æ1(é ¦$¦1 (¦(Æ(Æ- -$¥$…$¥$¥(¦(Æ(Æ0ç- - ¦ ¦1 (¦,Æ$¦(Ç$Ç- (Ç$Æ$Æ- $ç(è,è-(è(è1*$è(è,è$ç(è(Ç$Æ$Æ- $ç(è,è-,è(è1*$è(è „ …$Ç$…$„ „ ¦„ …$¥$…$¥ ¥(è…… „ …$¦$¥$„ „$¦„ …$…$¥$… ¥,è…„,è- §$Ç$Ç$Ç$ç$Æ- 1 - 1 -5K,è1 1 1 (Ç Æ$Ç$Ç$Ç$Ç$Ç- - 1 1*9L,è1 - $¦,é„e„„……(è(Ç(Ç(Ç) … ¦(Ç,è$Çd…d„……(Ç(è(Ç(Ç- … ¦$¦$Æ$§ ¦- ,Æ,ç(ç-*$Ç$Æ$Ç(Ç(è(è1 ,è(Ç$Ç ¦(è,ç,Ç(ç-*(Ç$Æ$§(Ç(è(è1 (Ç………(è$¦,Ç$Ç(è ¥… † ¦ … ¦,è$¦$¦……(È$Æ,Ç$Ç$è †… ¥ †¥ ¦,è$¦(ç1 $¦$Ç$Ç(Ç(ç(ç1 1*(ç(È5J,è,è,è0è- $¦(Æ$Ç(Ç,ç(Ç11K(ç(È5*,è,è,ç$¦(è$…$¥$¦(Æ(Æ(Æ1,é ¦$¦1*,Æ,Æ$Ç(Ç,è$¥$¥$¦(¦(Æ(Æ0ç- - ¦$¦-*,¦(Æ(¦(Ç$Ç-$Æ$Æ$Ç-$Ç(è,è-(è(è1)$È(è(ç$Ç,è(Ç$Æ$¦-$È(è,è-(è(è1 $è(è „ d$Æ$…$¤ …$¦„ …$…$…$„ ¥(È„d … „$¥$¦$„ …$Æ„ …$…$…$… …(ç…d(è… ¦ ¦,è,è(è(ç,è… ¦ ¦(è,è)(Ç ¦$Ç(Æ(è ¦$¦$Ç,è ¦$Ç(Ç(è ¦$¦$Ç(Ç(ç$¦(Æ(Ç1 $Æ- ,Ç(ç$¦(¦(Ç1 $Æ- ,Ç$¦$Æ$¦$Ç(Æ(Ç(è ¦$Æ$Ç$¥$Ç$Æ(Ç(è ¦(è… ¦ ¦,è,è) ,ç- … ¦ ¦,è,è) (Ç ¦$Ç(Æ(è ¦$¦$Ç,è ¦$Ç(Ç(è ¦$¦$Ç(Ç(ç$¦(Æ(Ç1 $Ç-(Ç,è$¥(Æ(Ç1 $Ç,è,Ç$¦$Æ$¦$Æ$Ç(Æ(è ¦$¦$Æ$¦$Æ$Ç(Æ(è ¦(è… ¦ ¦-,è(é(ç,è¥ ¦ ¦,è,è) (Ç ¦$Ç(Æ(è ¦$¦$Ç,è ¦$Ç(Ç(è ¦$¦$Ç(Ç(ç$¦(Æ(Ç1 $Ç0è(ç(è$¦(Æ(Ç1 $Æ0é(ç$¦$Ç$¥$Ç$Æ(Ç(è ¦$Æ(Ç$¥$Ç$Æ(Ç(è ¦(è ¥ ¦ ¦,è,è(é(ç,è… ¦ ¦,è,è) (Ç ¦$Ç(Æ(è ¦$§$Ç,è ¦$Ç(Ç(è ¦$¦$Ç(Ç(ç$¦(Æ(Ç1 $Ç1(Ç,è$¦(Æ(Ç1 $Ç1(Ç$¦$Æ$¦$Æ$Ç(Æ(è ¦$¦$Æ$¥$Ç$Æ(Ç(Ç ¦$¦$Ç$Ç(è$Ç$Ç$Ç(ç$Ç(Æ(Ç(è$Æ(Æ(Ç(è$Æ$Ç(Ç(è$Ç$Æ$Ç(è$Ç(Æ(Ç(ç$Ç(Æ(Ç(ç$¦$Ç(Ç(è$Æ$Ç(Ç(è$Ç(Æ(Ç(ç$Ç(Æ(Ç(ç$Æ$Ç(Ç(è$¦$Ç(Ç(è$Æ(Ç(Ç(ç(Ç$Æ(Ç(ç$Æ(È$Æ(È$Ç(Ç$Ç(Ç$Æ(Ç$Ç(Ç$Æ(È$Æ(Ç(Ç(Ç(Ç$Ç(Ç \ No newline at end of file diff --git a/glide2x/cvg/glide/tests/argb4444.3df b/glide2x/cvg/glide/tests/argb4444.3df deleted file mode 100644 index 1f3da27..0000000 --- a/glide2x/cvg/glide/tests/argb4444.3df +++ /dev/null @@ -1,5 +0,0 @@ -3df v1.1 -argb4444 -lod range: 1 256 -aspect ratio: 1 1 -UEggWVWVggggVFUU5EUEVVVWwhwhfgggww‰ ˆx xxxx xxxxxx xxxxxxxx xxxffEEVVEUVFfVVFVVEUWVUUFVUEUUEUE5DEEUVFfgVWggggggggVFggggVFUU5EUEEEEUggggEEEDFUVFggVVVV5DVEUUFVggx xggfgxxww‰ ˆxxxxxxxxwwx xxxxxx xxxggVFUUEEVVEEVVVVVVEUWVVVEUUEUU5ED5UUEUWVVVggggggggggVFggggggwwEEUUEUE5UEggWVWVggggVFUU5EUEVVVWwhwhfgggww‰ ˆx xxxx xxxxxx xxxxxxxx xxxffEEVVEUVFfVVFVVEUWVUUFVUEUUEUE5DEEUVFfgVWggggggggVFggggVFUU5EUEEEEUggggEEEDFUVFggVVVV5DVEUUFVggx xggfgxxww‰ ˆxxxxxxxxwwx xxxxxx xxxggVFUUEEVVEEVVVVVVEUWVVVEUUEUU5ED5UUEUWVVVggggggggggVFggggggwwEEUUEUE54DC4DC4DUUgg33#3"#3#33#3"#3333""3333333343333333##2#"233#3#"3#333333UUggfgUUgfffVWffggggggfgUUWVgfggUUTT4DC4UTVUTTUUUUUUUUUUUUUUDD"3""3333ggDD33##33#33333""3#33""3333333333333333##""3333"3""3#3333D3xgffVWffUUgfgfffggggfgffVWgg ™ ‰ggTDDDDDDDUUUUUUTTUUUUUUUUVVDC4DC4DCVUgg33#3"#3#33#3"#3333""3333333343333333##2#"233#3#"3#333333UUggfgUUgfffVWffggggggfgUUWVgfggUUTT4DC4UTVUTTUUUUUUUUUUUUUUDD"3""3333ggDD33##33#33333""3#33""3333333333333333##""3333"3""3#3333D3xgffVWffUUgfgfffggggfgffVWgg ™ ‰ggTDDDDDDDUUUUUUTTUUUUUUUUVV""#""""44gf"""""""!!"""""""""""""""""""""""""DDgg33"3""3""3##2#3333343333VVff""3""2""""2"#2""2"#2"#2"#2"#2"333333VWCD"""""""""""""""""""""""2""!""#2"ggD42"##""3""3""4333333433DDyxDD"""2#"2""""2""3""2"#2"#2""2"""""44gf"""""""!!"""""""""""""""""""""""""DDgg33"3""3""3##2#3333343333VVff""3""2""""2"#2""2"#2"#2"#2"#2"333333VWCD"""""""""""""""""""""""2""!""#2"ggD42"##""3""3""4333333433DDyxDD"""2#"2""""2""3""2"#2"#2"33""##"33gV"#""!""""""2""!"""""""""""""""""3C4gg34""##"24333343334333433ggVF23""##"2##""3""3"""333333343334""3333VFED""!"""""""""""""""""""""""""""33ggD33##2##2#34333433343344DDxg34""3##2##""3""3""3""333""3333""##"33gV"#""!""""""2""!"""""""""""""""""3C4gg34""##"24333343334333433ggVF23""##"2##""3""3"""333333343334""3333VFED""!"""""""""""""""""""""""""""33ggD33##2##2#34333433343344DDxg34""3##2##""3""3""3""333""3333##"""44ff"""""""""""""""""""""""""""#""""""""DDgg3334""43##33343334333433gggg""3"##""##33##34""3##2##33443344334443WVDD""""""""""""""""""""""""""#2#"!""2#"ggEE3333""43##433334333433UDxg44"3##"#"###3##34""442##33333##"""44ff"""""""""""""""""""""""""""#""""""""DDgg3334""43##33343334333433gggg""3"##""##33##34""3##2##33443344334443WVDD""""""""""""""""""""""""""#2#"!""2#"ggEE3333""43##433334333433UDxg44"3##"#"###3##34""442##3333334##"D4gg""""""""""""""""""""""""""2""#"!""244UU443343"#34##333444343344UUVV""#""""""#####""433343443344334433WVEE"""!""""""""""""""""""""""#"!""""3"WVDD4433#33334""4344"33444DDxg##2#"""""#""###33343"#443343##"D4gg""""""""""""""""""""""""""2""#"!""244UU443343"#34##333444343344UUVV""#""""""#####""433343443344334433WVEE"""!""""""""""""""""""""""#"!""""3"WVDD4433#33334""4344"33444DDxg##2#"""""#""###33343"#4433#3#""D3gg"#"""""!"""""""""!"""""!""#""!"""33ffD344333#4343443343334333EEEE""33"#"#"""####333334""3##333ggD3""""""""!""""""!"!""""""!#""!"""""""VVDDDD#3334343434433434433D3gg"#"##""""#"""33""3333#3#""D3gg"#"""""!"""""""""!"""""!""#""!"""33ffD344333#4343443343334333EEEE""33"#"#"""####333334""3##333ggD3""""""""!""""""!"!""""""!#""!"""""""VVDDDD#3334343434433434433D3gg"#"##""""#"""33""3333##33##44gg44#3"#"""""""!"!""""""""""#"###"2"##3#33EEVV#4##333433#333##34""###3ffgg"""43##""""###"3"3334##33##""##"243ggVF3#"3""""""""""""""""#2"""##"#3##3##44fV44#3##33433334""43##3#"3D3yx33"33#3"""#"3""2"#2##""##33##33##44gg44#3"#"""""""!"!""""""""""#"###"2"##3#33EEVV#4##333433#333##34""###3ffgg"""43##""""###"3"3334##33##""##"243ggVF3#"3""""""""""""""""#2"""##"#3##3##44fV44#3##33433334""43##3#"3D3yx33"33#3"""#"3""2"#2##""##ggUUgfUUgfggfgEEVVFVEEEDEEUUEEffEEUUEEUUEEEEUTFVEEffVFffggggggfgfgfgfffgVFVV3D44EEEDFU44UUFVUEVVgxxxggVFfgUUffgggggxgxffxxx xxxxxgxffggggfgggffFVVFVVEEDDUUEEEEVVVVEEEEEEUUEEUUEUEEVVVVUUggxxfffgfgfgVFggfgVFDDDD4EEEEEED5EVVEEVVggxxggffVFggUUgggggxgxffgxx xgxgxggUUgfUUgfggfgEEVVFVEEEDEEUUEEffEEUUEEUUEEEEUTFVEEffVFffggggggfgfgfgfffgVFVV3D44EEEDFU44UUFVUEVVgxxxggVFfgUUffgggggxgxffxxx xxxxxgxffggggfgggffFVVFVVEEDDUUEEEEVVVVEEEEEEUUEEUUEUEEVVVVUUggxxfffgfgfgVFggfgVFDDDD4EEEEEED5EVVEEVVggxxggffVFggUUgggggxgxffgxx xgxgx""3""3""3""3"""""3""3"#"2#DCEE3333""3""333""3""3""3"3333VV4C33#233##2#"2##33##333334333344DD333344DD3DD34433DD3DEEUT4DC433DD3D33333333""3""3"""""##""#2#33VF33332#"2#"33""33""3""3""33VUDD33333333##2#"2##3"#3##333344334433DD3344DDDD33DD3DD3DDFVC4DC##""33"2#"2#"2#"2#"""""3""3"#"2#DCEE3333""3""333""3""3""3"3333VV4C33#233##2#"2##33##333334333344DD333344DD3DD34433DD3DEEUT4DC433DD3D33333333""3""3"""""##""#2#33VF33332#"2#"33""33""3""3""33VUDD33333333##2#"2##3"#3##333344334433DD3344DDDD33DD3DD3DDFVC4DC##""33"""##"#""2"#""""###CDgg#3""33""33333333##3333""43gfD43#"3##""#2###"3""##""##"2##""###3"#""""####3#"344DD""##"2##""##"2"#""#""2"#"""##"233gg4C#"33""333"4333333333##3#VVEE33####"2"#2###"""####"3""3""##33##""#""###3"#33C434"""""""###"#""2"#""""###CDgg#3""33""33333333##3333""43gfD43#"3##""#2###"3""##""##"2##""###3"#""""####3#"344DD""##"2##""##"2"#""#""2"#"""##"233gg4C#"33""333"4333333333##3#VVEE33####"2"#2###"""####"3""3""##33##""#""###3"#33C434""""""""""""#""""2"""3##"33D3VV"#"3333333333333433#34333VV3333##""##"#2#"3""2"##""##"2####2###""#2"##""##"23344#3"#34##""##"2"#"""""2"""3##"#"34VW23""3333333333333334343433DDUU#3##""#2###"3"""2""#2"##""###3"#"####""####""##3344"334""##""""""""#""""2"""3##"33D3VV"#"3333333333333433#34333VV3333##""##"#2#"3""2"##""##"2####2###""#2"##""##"23344#3"#34##""##"2"#"""""2"""3##"#"34VW23""3333333333333334343433DDUU#3##""#2###"3"""2""#2"##""###3"#"####""####""##3344"334""##""#"""""""2"#""""#2#EDFV"33333333333333343334##DDEE44"3####""#2#"3""2"######""##""###3#""""3####""3#33D343"#3#"3####"""#""2"#"""#"""2##""gV##""33333333333333#33333##UEDD#3####""##"""#2#"3"####2#####""####""#"#33##""##"2EE34""##"""#""2"#"""#"#""""#2#EDFV"33333333333333343334##DDEE44"3####""#2#"3""2"######""##""###3#""""3####""3#33D343"#3#"3####"""#""2"#"""#"""2##""gV##""33333333333333#33333##UEDD#3####""##"""#2#"3"####2#####""####""#"#33##""##"2EE34""##""""""#"""""#"""3""##44VV33333333DD3DD3DD3D##333344VV33"3##""##"#2#"3"##""##"2##""####""#2#""##"2##""44EE""3##2##""3##2#""""""""3""""3"43VF442333DD33DD3D333333#3##43VF442###""#2#"#"#""##"##"2####""###3##"""""3##""3"33EE44"3""""""""#"""""#"""3""##44VV33333333DD3DD3DD3D##333344VV33"3##""##"#2#"3"##""##"2##""####""#2#""##"2##""44EE""3##2##""3##2#""""""""3""""3"43VF442333DD33DD3D333333#3##43VF442###""#2#"#"#""##"##"2####""###3##"""""3##""3"33EE44"3""""""""""""""""""""2"#244VV3333#344DD3D443333"2"##UUDD"###"2##"""#""#"#""##"3"##""##"2##"""#"##"2##3"33VF2"#2####"2####""""""""""""3####""fV4433433344DD3DD3443#"33""VU33##2#"3"##"""##"""3""2"##""##"2##""""###"3"##""3"EE44"3""""""""""""""""""""2"#244VV3333#344DD3D443333"2"##UUDD"###"2##"""#""#"#""##"3"##""##"2##"""#"##"2##3"33VF2"#2####"2####""""""""""""3####""fV4433433344DD3DD3443#"33""VU33##2#"3"##"""##"""3""2"##""##"2##""""###"3"##""3"EE44"3""""####33##""3""3""33###33####EEUE"""!"##""DD5D33VVEU######33"""""##3#"3########"#""""2####333444WVEE443444343434####332#"33""""######34VV33""""##"3#DD3DD3gV#####33#"#""#"#3#####""####"""#""33##34##34VFVV#4443434####33##""3""3""33###33####EEUE"""!"##""DD5D33VVEU######33"""""##3#"3########"#""""2####333444WVEE443444343434####332#"33""""######34VV33""""##"3#DD3DD3gV#####33#"#""#"#3#####""####"""#""33##34##34VFVV#4443434ggffggUUVVxxffEEffUDEEEEFVVFfffgEEEDFUD3EEVVffVWwhxxggggggggffggggffgggxggffVWffVFx xggggfgfgfgVFeUggxxggggggxxgggggggggggggggggxgxggffFVTEUTFVUD43E5UUEEEEVVVVfgVFDEEUD4DEVVVVggggxxgxggggggffggffggfgggxxVVffggVFwwxxffggVWfgVWVVfgxxxxVVgggxgggggggggxgggggggxggffggUUVVxxffEEffUDEEEEFVVFfffgEEEDFUD3EEVVffVWwhxxggggggggffggggffgggxggffVWffVFx xggggfgfgfgVFeUggxxggggggxxgggggggggggggggggxgxggffFVTEUTFVUD43E5UUEEEEVVVVfgVFDEEUD4DEVVVVggggxxgxggggggffggffggfgggxxVVffggVFwwxxffggVWfgVWVVfgxxxxVVgggxgggggggggxgggggggx3333333333xgVV"#""""3""3##2###33333433##3433333333"3""3"3333""33333"UU xxCD#4343333"333"3##332#33DDxyUUDD3D33DD3D3333333334333334""3""3""3"UU#3"###"3""2"33""3#3333##343333333333#3"#2"#2##2#333333D3 xxff333333333333333333333333ffgx3DD344DD3D33DD"3343333333333333333xgVV"#""""3""3##2###33333433##3433333333"3""3"3333""33333"UU xxCD#4343333"333"3##332#33DDxyUUDD3D33DD3D3333333334333334""3""3""3"UU#3"###"3""2"33""3#3333##343333333333#3"#2"#2##2#333333D3 xxff333333333333333333333333ffgx3DD344DD3D33DD"334333333""3"33##2#fgC42"##""""##""""3""3##""3"##33""3##233##2###"""""2#"2#33""fU xxD52"#2#""3"#3"#2"#2"#2"44gg33"3""3"#3"#2"#3#"###3"#2"#2"#2"#233"344#3"""#""""2#"##"2""#2"##""33""3##2##2#"2##""3""3""3233D3xxVW"2"#2"#2##""##"2#"##33""gVEE"2##3""3##""##"2##33""3#"3""33##2#fgC42"##""""##""""3""3##""3"##33""3##233##2###"""""2#"2#33""fU xxD52"#2#""3"#3"#2"#2"#2"44gg33"3""3"#3"#2"#3#"###3"#2"#2"#2"#233"344#3"""#""""2#"##"2""#2"##""33""3##2##2#"2##""3""3""3233D3xxVW"2"#2"#2##""##"2#"##33""gVEE"2##3""3##""##"2##33""3#"333##""3"VV#4""""##""""##""##"""""2##""3"##""3""3##2#""""3""3333322#"UUxx44"2#"2#"2##""3"####""3"33xg34""3"43"#2"#3#"33""##33##2###33344433EE#3""""""2##""""##"2#"2###""##""3""3""##""""3""3""3333""33ˆxEE""3##2##""##"2#"##"2#"2#ggVF2"#2"#2"#3#"33##2##3"#2""333##""3"VV#4""""##""""##""##"""""2##""3"##""3""3##2#""""3""3333322#"UUxx44"2#"2#"2##""3"####""3"33xg34""3"43"#2"#3#"33""##33##2###33344433EE#3""""""2##""""##"2#"2###""##""3""3""##""""3""3""3333""33ˆxEE""3##2##""##"2#"##"2#"2#ggVF2"#2"#2"#3#"33##2##3"#2""3##""3##2D4DE"""""""3"""""3""3"""##""""3""3""3""3""3"33""3333333323UUyx33""####""##"2##""##""3#33xgDD""3""3""3""3""3"##33##2#"2##3#334444DD"3"""""""""""2#"2#""""""2##""3""3""3""3""3""33333""3332D4xxVV"#"##""##""####""##33##eUWV"3""3""333##2#"2#"3#"3"""3##""3##2D4DE"""""""3"""""3""3"""##""""3""3""3""3""3"33""3333333323UUyx33""####""##"2##""##""3#33xgDD""3""3""3""3""3"##33##2#"2##3#334444DD"3"""""""""""2#"2#""""""2##""3""3""3""3""3""33333""3332D4xxVV"#"##""##""####""##33##eUWV"3""3""333##2#"2#"3#"3"""3""##"2##EEDC""#!"""2#"2#""2"#2""""3""3"2233#233""33""3"33223333UDxgDD"#""##"2""#2"##""3"#333gg3333""3""3""3##233""##33##2###33##3333VV""3"""""2#"2#"2"""""3""3""""3""3""3""333""33""33333322D4xxEE"2##""3"####""3"##""3""3UUVV""32"#2"#2"#2"33""3##2##"3""##"2##EEDC""#!"""2#"2#""2"#2""""3""3"2233#233""33""3"33223333UDxgDD"#""##"2""#2"##""3"#333gg3333""3""3""3##233""##33##2###33##3333VV""3"""""2#"2#"2"""""3""3""""3""3""3""333""33""33333322D4xxEE"2##""3"####""3"##""3""3UUVV""32"#2"#2"#2"33""3##2##"2"#2"#334444""""##"2"#2"#2""""##""3""3332233""3"3333332233332322D4xx44"2##""####""##""###3""##gf332333""33""3"33"3""3"#3"#2"#2##2#"2##EE#3!"""""3""2"#2##""""""2#"2#33""33""333333""323323""33ggfg"#"2#"3##2""##""3##2#EEVV""3233""33""33""33""#2##""3""3334444""""##"2"#2"#2""""##""3""3332233""3"3333332233332322D4xx44"2##""####""##""###3""##gf332333""33""3"33"3""3"#3"#2"#2##2#"2##EE#3!"""""3""2"#2##""""""2#"2#33""33""333333""323323""33ggfg"#"2#"3##2""##""3##2#EEVV""3233""33""33""33""#2#####34##44gVUU##""#2#######34##3#4343##434344#3##33##3##3##33DD44DDFVVFfgEE"###3##33#3##3##343EEVVggD534####3#44#34344444444DD##3#43##43E5fV33#""#######3##3##4343##DD334343##3##3##3##3334433EEDUUUVVff####3#33##3##333#3##DDFVggVF3334##343334343444343434####34##44gVUU##""#2#######34##3#4343##434344#3##33##3##3##33DD44DDFVVFfgEE"###3##33#3##3##343EEVVggD534####3#44#34344444444DD##3#43##43E5fV33#""#######3##3##4343##DD334343##3##3##3##3334433EEDUUUVVff####3#33##3##333#3##DDFVggVF3334##343334343444343434ggxxgxxxxxgxggwwgggggxfgggggfgfgfgFVffggffVFfgggggffxxxxggwwgxxxx xxxˆ ˆ ‰ ™wwhwggxxxxxxgxxyxxxxxxgxˆˆ ‰ ™ wwxxgxggxxxxxxxxgxxxˆˆ‰ ™‰ ™‰ ™ ‰ ™ xxxxxxxxxywwgxgggggxfgggggggffggUUffggVWVVggfgggffgxxxwwgggxwwxxwwx x ™ ‰wwxxggxxgxxxgxxxxxxyxxggx x ™ ‰ xxwwyxggggxxxyxxxxxxxx™ ‰™ ‰™ ‰ggxxgxxxxxgxggwwgggggxfgggggfgfgfgFVffggffVFfgggggffxxxxggwwgxxxx xxxˆ ˆ ‰ ™wwhwggxxxxxxgxxyxxxxxxgxˆˆ ‰ ™ wwxxgxggxxxxxxxxgxxxˆˆ‰ ™‰ ™‰ ™ ‰ ™ xxxxxxxxxywwgxgggggxfgggggggffggUUffggVWVVggfgggffgxxxwwgggxwwxxwwx x ™ ‰wwxxggxxgxxxgxxxxxxyxxggx x ™ ‰ xxwwyxggggxxxyxxxxxxxx™ ‰™ ‰™ ‰3333""3#3333""333"33DDEE33"3""3""3""3""3"""""23333DD#433DD33#3333433333333DD33DD33DD33DD33334333333333##33DDEEDD33"33333##333#3333333333##332##3333333EEDC#"2#22#"2#"2#"2#"2#"2#CD44DD33334433#333333343D4DD3333443333DD333333#33333#3333333DDEEDD"3##3333##333#3333""3#3333""333"33DDEE33"3""3""3""3""3"""""23333DD#433DD33#3333433333333DD33DD33DD33DD33334333333333##33DDEEDD33"33333##333#3333333333##332##3333333EEDC#"2#22#"2#"2#"2#"2#"2#CD44DD33334433#333333343D4DD3333443333DD333333#33333#3333333DDEEDD"3##3333##333#""#""!"""!#33UE""""!!""""!"#""""VV##"""""!""#""""#"#"23""3""3""3"##""##""##"3""2"#2WV34""""#""""""""""""!"""""3"EE33"""""!"""""!#""DC5E""""""#"#""""#"""3""3""3"""""##""""##"3"""2"TTFV""""""3"""""""""!"""!#33UE""""!!""""!"#""""VV##"""""!""#""""#"#"23""3""3""3"##""##""##"3""2"#2WV34""""#""""""""""""!"""""3"EE33"""""!"""""!#""DC5E""""""#"#""""#"""3""3""3"""""##""""##"3"""2"TTFV""""""3""""""!"""""!""!"33EE"!""!"!"""!""!"""""EE33""""""""#2#""""2#"##"2"#2"#2"##""#2#"2""#"3"gfD4""""3"""#2#"""3""""""""""TD##""""!"""!"!""""!DD33"""!""""""3""2"#2"#2"##""3""3""##"2##"""""3"33DDVV##"""""""#""!"""!!""!"33EE"!""!"!"""!""!"""""EE33""""""""#2#""""2#"##"2"#2"#2"##""#2#"2""#"3"gfD4""""3"""#2#"""3""""""""""TD##""""!"""!"!""""!DD33"""!""""""3""2"#2"#2"##""3""3""##"2##"""""3"33DDVV##"""""""#""!""""!"!""23UE"""!""""""!"""""""""UT""""""""""2""#2"""##""""3""3##"""""#"""""3""3#VU44""""""#""""""!#""!"!""""EE33""!""""!"""!""""DD3D"""""""""""""#"""2##"#""2"#2##""""""""""3##"DDVV"""""3"""""""!""""!"!""23UE"""!""""""!"""""""""UT""""""""""2""#2"""##""""3""3##"""""#"""""3""3#VU44""""""#""""""!#""!"!""""EE33""!""""!"""!""""DD3D"""""""""""""#"""2##"#""2"#2##""""""""""3##"DDVV"""""3""""""!"!"!"""!!""33VF""""""""""""""!""""""44"""""""""!""""#"""##""""""2""#""""#2#"2"""""gV33"""#"""2""#""""!!"!"""""UT43""""""""""""""""!2""433#"""""""#2"""##""""##"2"""""#"#"""""#"#""""3"DDFV"""##"""""""""!!"""""33VF""""""""""""""!""""""44"""""""""!""""#"""##""""""2""#""""#2#"2"""""gV33"""#"""2""#""""!!"!"""""UT43""""""""""""""""!2""433#"""""""#2"""##""""##"2"""""#"#"""""#"#""""3"DDFV"""##"""""!"!!"!!"!!"23UD""""!""""""""""""!2"#2"#!"""!""""2""""3""3""3""3""3""3""3""3""""""##""##"UU33""""""""""""""!""""""""DDDD"""""""""""""""""33""""""#2"""""""2#"2#"2#"2#"2#"2#"2"#2""""#2#"2#"44EE!""""""""!""""""""""""23UD""""!""""""""""""!2"#2"#!"""!""""2""""3""3""3""3""3""3""3""3""""""##""##"UU33""""""""""""""!""""""""DDDD"""""""""""""""""33""""""#2"""""""2#"2#"2#"2#"2#"2#"2"#2""""#2#"2#"44EE!""""""""!####""##""##""""##VV4C#"##""""3333##""3""3""3#DD#434##""#2#""##""""##"2"#"2"#"2"####"3"##""43ggEE###""33""#"##333##3##2#"""""2EEEE##2#""""33""##"2#"2#"2#"44DD##33##""#"""##""""""##"""""###"2""3#"2"######EEUU##""33""######""##""##""""##VV4C#"##""""3333##""3""3""3#DD#434##""#2#""##""""##"2"#"2"#"2"####"3"##""43ggEE###""33""#"##333##3##2#"""""2EEEE##2#""""33""##"2#"2#"2#"44DD##33##""#"""##""""""##"""""###"2""3#"2"######EEUU##""33""##VVggggFVggggVFfVEEUUFVggxxggggfggxw wx xxxxxggwwx xxxxxxxxxffggUDVVFVVFVVffVVVWVVVVFVVFVVEUUEEEEUVFgggggggxggxx ™ ‰ ™ ‰hwwwxxxxggffgggxxxxyx xwwyxffVFVVEUEEVVVWggxxggfggg ww xxxxxxxxwwxxxxggxxx xxxfgVFEEVVFVVFfVVFfWVWVWVVVVFVUEUU5EVFVVggVWgggxggggggggggggggxxEEVVEUUEVFggggVFggggVFfVEEUUFVggxxggggfggxw wx xxxxxggwwx xxxxxxxxxffggUDVVFVVFVVffVVVWVVVVFVVFVVEUUEEEEUVFgggggggxggxx ™ ‰ ™ ‰hwwwxxxxggffgggxxxxyx xwwyxffVFVVEUEEVVVWggxxggfggg ww xxxxxxxxwwxxxxggxxx xxxfgVFEEVVFVVFfVVFfWVWVWVVVVFVUEUU5EVFVVggVWgggxggggggggggggggxxEEVVEUUE4C33D3DDDUgx"3""##"233#2#33""3"33##3333"3333333""#""3333""3"##33"3UDxgUUUUWVUUgfUUggffVWffVWfffgfgTEDDEEDC4DDDDDUUDTUETUUUTTDDUUUUDDDDffFV""3""3####3333""#2#"233333333333333""##""##33""3"33""33D3ggfgTEffUUgfUUggVWggffVWUUgg ˆˆggDDDDDD3DTDTTEUUUTTEUUUDDVVCD#3DC4DTEwh23""##"233#2#33""3"33##3333"3333333""#""3333""3"##33"3UDxgUUUUWVUUgfUUggffVWffVWfffgfgTEDDEEDC4DDDDDUUDTUETUUUTTDDUUUUDDDDffFV""3""3####3333""#2#"233333333333333""##""##33""3"33""33D3ggfgTEffUUgfUUggVWggffVWUUgg ˆˆggDDDDDD3DTDTTEUUUTTEUUUDDVV"###""C3gg""""""""""2""""""""""""""""""""#2#DCgg33"3""3""3""43"#33334333VWVV""3"""""""""""2#"2#"2#"233""3""3""VVUD"""""""""3""!"""""""""""""""""""3""ggDD"3""3""3""3"343333"334DDx xDE""#2#"2""2"#"2"#2"#2"#2"3##""33gg""""""""""2""""""""""""""""""""#2#DCgg33"3""3""3""43"#33334333VWVV""3"""""""""""2#"2#"2#"233""3""3""VVUD"""""""""3""!"""""""""""""""""""3""ggDD"3""3""3""3"343333"334DDx xDE""#2#"2""2"#"2"#2"#2"#233""3""DCWV"3""""""""""""""""""""""""#"""""""D3gg34""##"24343433343333433ggVF33##2###""3"#3"#2"#2"#3333""3#3344"3VFVV""""""!!""#""!"!""""""""""""""""33ggD33"#3"#3434333433344433UDxg33"3""3"##""3""3""3""334""3"33""3""DCWV"3""""""""""""""""""""""""#"""""""D3gg34""##"24343433343333433ggVF33##2###""3"#3"#2"#2"#3333""3#3344"3VFVV""""""!!""#""!"!""""""""""""""""33ggD33"#3"#3434333433344433UDxg33"3""3"##""3""3""3""334""3"33##""D4gg"""""""!!"#""""""""""""""""""""""""""DDgg3333"3##3#3334333444"344ffgg""3"##""###3"#33""3##2##333344"34433EEVV"""""""""""""""""""""""""##""""""""hgEE3334""43##2#3433343433UDxg44"3##"33""##34""433334""4333##""D4gg"""""""!!"#""""""""""""""""""""""""""DDgg3333"3##3#3334333444"344ffgg""3"##""###3"#33""3##2##333344"34433EEVV"""""""""""""""""""""""""##""""""""hgEE3334""43##2#3433343433UDxg44"3##"33""##34""433334""433334##"D4gg"""""""""!"""""""""""""""""""#"""3""44VV4C434343"#3434""43334344ffVF2"#""""#""###33##33444433443333VVUU"""""""""""""""""""""""""""#"!""""3#VUDC4443"#34##343334333433DDxg##2##""""#"#####443##3333343##"D4gg"""""""""!"""""""""""""""""""#"""3""44VV4C434343"#3434""43334344ffVF2"#""""#""###33##33444433443333VVUU"""""""""""""""""""""""""""#"!""""3#VUDC4443"#34##343334333433DDxg##2##""""#"#####443##33333#3#""D3gg"#"""""""!""""!""""!""""!#"""""""44UUDD3D33343434334434443433ffVF""33"#"#"""#333333433##2#"2VFVV"!"""""""""!""""!""""""!""#"!!"""2VFEE3344343334333444334344DDgx"##"#"##""!33""3333#3#""D3gg"#"""""""!""""!""""!""""!#"""""""44UUDD3D33343434334434443433ffVF""33"#"#"""#333333433##2#"2VFVV"!"""""""""!""""!""""""!""#"!!"""2VFEE3344343334333444334344DDgx"##"#"##""!33""33334333##EEggD33##"#"#"""!"!""""""33##33"#######3#43##EEVV#4##333434""3##333#3#"2#gggg"####3#"3##""3"##""33DD3DEEDCEEEEDCgggg#433###""#""""""""""""2#"#2####33##34##DDVW443333343433##3#43##2###DCyx##2##333"33##""3"##""3#33##334333##EEggD33##"#"#"""!"!""""""33##33"#######3#43##EEVV#4##333434""3##333#3#"2#gggg"####3#"3##""3"##""33DD3DEEDCEEEEDCgggg#433###""#""""""""""""2#"#2####33##34##DDVW443333343433##3#43##2###DCyx##2##333"33##""3"##""3#33##ffVWUUWVUUggVFVVFVVFUT4DUEEEVVffFVUEEEUUEUEEEEVV5DVFfffgggwwffffggUUffggffEEED5ED5UUEEEEEEVVEUVFwwxxggfffgffUUgggxgxgxff xx xx ˆ‰ xxxxxxwwgxUUggggEEVVETVFDDDDVVEUffVVEEEEEEEEEEUUFVEEffVFffggwwggfgfgfgVWUUgfVVEEDC5ED5UUEEEEEEVVEEggwwggggffffUUggffgxgxgxgg wwxxggffVWUUWVUUggVFVVFVVFUT4DUEEEVVffFVUEEEUUEUEEEEVV5DVFfffgggwwffffggUUffggffEEED5ED5UUEEEEEEVVEUVFwwxxggfffgffUUgggxgxgxff xx xx ˆ‰ xxxxxxwwgxUUggggEEVVETVFDDDDVVEUffVVEEEEEEEEEEUUFVEEffVFffggwwggfgfgfgVWUUgfVVEEDC5ED5UUEEEEEEVVEEggwwggggffffUUggffgxgxgxgg wwxxgg""#2#"2#"2#"2""""3""2"#2D4EE#323""3""333""3""322#"2#33VV4C#"3#33##2#"2#"##33""3#33##33334433334333DD#34433DD33DDFVC433DDDD3333""3""2"#2"#""3""3"#"""34UU343333""3"33""3""3""32"#3#EEDD33#333##2#"2##""###3##3333##DD334433334433DD44334433DDFVC433##"""2"3"#"2#"2#"2#"""2#""2"#2D4EE#323""3""333""3""322#"2#33VV4C#"3#33##2#"2#"##33""3#33##33334433334333DD#34433DD33DDFVC433DDDD3333""3""2"#2"#""3""3"#"""34UU343333""3"33""3""3""32"#3#EEDD33#333##2#"2##""###3##3333##DD334433334433DD44334433DDFVC433##"""2"""#"###"""""""#"3""3C4gg""33""3333""333333##332#34ff44#3####"2##"#""""#"####""3"##""###3""##""33####2#44DD""3"##""#2###""##"#""""""""##"2#"gVD42"#2"#33""333333333333##VVEE33##""##"3""2"##"""####""##"2####2#"3"""##"2##33D343"###""""2"###"""""""3"#"2#CDgg""33""3333""333333##332#34ff44#3####"2##"#""""#"####""3"##""###3""##""33####2#44DD""3"##""#2###""##"#""""""""##"2#"gVD42"#2"#33""333333333333##VVEE33##""##"3""2"##"""####""##"2####2#"3"""##"2##33D343"###""""""#"""""""3""""""3#DDFV"#"332#333333333433#34333VV4C#"##"2""#"##"""####"3"##""###3"#####""#3#"3##""3344#3"#34""###"2"#""""""3"#"""2"##44WV#3"#333334""3333343334##33E4DD#333##""#2###""""3##"#"##"2#"3#"3"33""##2###""3"443333""##"""""#"""""""3""""""3#DDFV"#"332#333333333433#34333VV4C#"##"2""#"##"""####"3"##""###3"#####""#3#"3##""3344#3"#34""###"2"#""""""3"#"""2"##44WV#3"#333334""3333343334##33E4DD#333##""#2###""""3##"#"##"2#"3#"3"33""##2###""3"443333""##"""""""""""3""""##"3"44VV""233333333333343333433C4VV33#3"###"3""2"#2#"3"##33##""3"####""#""2####"""24444"334""##"2"##""""""""3"""3""33fg##2"#233"3334433333433#3335DD43#33##"#"##"""#"#""####""##"2######"3""33##""##"2EE34""##""""2"#"""""#"#"""##"#"44fV"""33333333333343333433C4VV33#3"###"3""2"#2#"3"##33##""3"####""#""2####"""24444"334""##"2"##""""""""3"""3""33fg##2"#233"3334433333433#3335DD43#33##"#"##"""#"#""####""##"2######"3""33##""##"2EE34""##"""""""#"""#""""#"""2D4fV333333DD3DD3DD33DD##33##EDEE33####"2"#"2"#2###""###"2######2#"3"""##""##"244DD#3#"####""##"""""""""""#"""""3##VV4C333333DD3D33DD3333#333##VV4433""3"####"""#"###""3"##""######2#"3""""2####""33EE33####"""""""#"""#""""#"""2D4fV333333DD3DD3DD33DD##33##EDEE33####"2"#"2"#2###""###"2######2#"3"""##""##"244DD#3#"####""##"""""""""""#"""""3##VV4C333333DD3D33DD3333#333##VV4433""3"####"""#"###""3"##""######2#"3""""2####""33EE33####"""""""""""""""""3##""44fV3433#33344DD443334##"3334E43""3##""#""2""""##"""3"##""##"2"#""#33"#"##"244EE"2##""3#"2#"#""!#"""""2""#2"##33VFDC$3333444DD3D4433#3"33##UE33##"2""#"""2"""3####"#"2#"2####"""##"3""3##""3"EE44"3"""""""""""""""""""3##""44fV3433#33344DD443334##"3334E43""3##""#""2""""##"""3"##""##"2"#""#33"#"##"244EE"2##""3#"2#"#""!#"""""2""#2"##33VFDC$3333444DD3D4433#3"33##UE33##"2""#"""2"""3####"#"2#"2####"""##"3""3##""3"EE44"3""""##33##33""3""333##33######3#EEUU"""###EDD4CDggEE###33####""""#"""3##3############""#"#"33##343444WVEE44443434####"2""#""""""######34Dfg33"!"#"""43D433EEgg#####3####2"#"33"################""#""2####343444UUFV44444434#333##33""3""333##33######3#EEUU"""###EDD4CDggEE###33####""""#"""3##3############""#"#"33##343444WVEE44443434####"2""#""""""######34Dfg33"!"#"""43D433EEgg#####3####2"#"33"################""#""2####343444UUFV44444434ggUUggUUVVxxggEEffD3VUEEEEVVUUgfEEEEEEDCEEVVggfgwwxxggggggffffggffggffyxggffffggVFxxggffggffggffVWggxxgxffgxgxgxgggggxffggggggggUUgfUUWVVVEEED5EC4EDDDVVEUUEfWUUEEUUEEEDEEVVfffgggxxgxfgfgfffgffggffggggxxfgVFfgVVwhwhggfgfgfgfgVFfgxxxyVFwhwhgggggggggxggggfgggggUUggUUVVxxggEEffD3VUEEEEVVUUgfEEEEEEDCEEVVggfgwwxxggggggffffggffggffyxggffffggVFxxggffggffggffVWggxxgxffgxgxgxgggggxffggggggggUUgfUUWVVVEEED5EC4EDDDVVEUUEfWUUEEUUEEEDEEVVfffgggxxgxfgfgfffgffggffggggxxfgVFfgVVwhwhggfgfgfgfgVFfgxxxyVFwhwhgggggggggxggggfggg333333##33xxTE""2##"#"2#"2##""3#33#333##3333333333""3""3""##"2333233UD xxDE33"33333##33##2#33""3344xxTU4CD433334433333433##3333443333ffVF2"#"""2""##"""3"####333433##3#3333333433"3""##"233""3"3333D3wwgf33333333##3333""##333333fgggC4DC333344333333##333333333333##33xxTE""2##"#"2#"2##""3#33#333##3333333333""3""3""##"2333233UD xxDE33"33333##33##2#33""3344xxTU4CD433334433333433##3333443333ffVF2"#"""2""##"""3"####333433##3#3333333433"3""##"233""3"3333D3wwgf33333333##3333""##333333fgggC4DC333344333333##333333""3"33##2#fgD52"""""""#2#"2##""##"2#"##"2##3"#3"#2"##""##"2#"2#"233""fUxxDD"2##""3"##""3""3##""3#33hg33""3##2"#2"#3#"3#"3##33##33""3"EEVV"""!"3""3"#"2###""""##"2#"3#"3##2#33""3"##"""""2#"3333D3xxfg!"##2#"2#"##"2##3""3##2#ffEE"2#"2#34""3"##""3##2"#3#"3""33##2#fgD52"""""""#2#"2##""##"2#"##"2##3"#3"#2"##""##"2#"2#"233""fUxxDD"2##""3"##""3""3##""3#33hg33""3##2"#2"#3#"3#"3##33##33""3"EEVV"""!"3""3"#"2###""""##"2#"3#"3##2#33""3"##"""""2#"3333D3xxfg!"##2#"2#"##"2##3""3##2#ffEE"2#"2#34""3"##""3##2"#3#"333##""3"EEDC""#""""2#"##""""#2#""""##"2#"2#33""3"##""3""3""3333"3UDyx34""3##2##""##"2##""3##233xx33#"2#"2##3""3##2#33##2###3334""fUEE""""""""#"""2""#2"""""3"##""""#3"#2"#2"###"2#"2#"23333""33xxEE#3"#2"####""3"##""3""3""gVVV""3""3##2#"2#"33""##33"""333##""3"EEDC""#""""2#"##""""#2#""""##"2#"2#33""3"##""3""3""3333"3UDyx34""3##2##""##"2##""3##233xx33#"2#"2##3""3##2#33##2###3334""fUEE""""""""#"""2""#2"""""3"##""""#3"#2"#2"###"2#"2#"23333""33xxEE#3"#2"####""3"##""3""3""gVVV""3""3##2#"2#"33""##33"""3##""##"25E44""""""""""2""##"""""##""""3""3""3"33""3""3""3333332232UUxx33##""##""##""##"2##""3"33gx3D""3"33""3"#3"#2"#2##2#####33DDEEVV"""""""""""##"2""#2"#""##""""3""3""33""3""3""3333333322DDxxEE"2#""2"##""#2#####""3"ffVF2"33""3""3##2#"2##3"##"""3##""##"25E44""""""""""2""##"""""##""""3""3""3"33""3""3""3333332232UUxx33##""##""##""##"2##""3"33gx3D""3"33""3"#3"#2"#2##2#####33DDEEVV"""""""""""##"2""#2"#""##""""3""3""33""3""3""3333333322DDxxEE"2#""2"##""#2#####""3"ffVF2"33""3""3##2#"2##3"##"""3""##"2434DEE"2"""2#"2#"2#"2"#2"#2"#2"#2"#23333""33""33""33323333VFww44"3""##"2##"#"2###""3"33WVDD"3""3""3""3""333""##"2##3"3334VWVV!""""#2#""""3""3"""3""2"#2"#"2"332233""3"33""33332333C4ggff""####""####""3"##""3""3VFVV"2#"2#"2#"2#"233""3##2##"3""##"2434DEE"2"""2#"2#"2#"2"#2"#2"#2"#2"#23333""33""33""33323333VFww44"3""##"2##"#"2###""3"33WVDD"3""3""3""3""333""##"2##3"3334VWVV!""""#2#""""3""3"""3""2"#2"#"2"332233""3"33""33332333C4ggff""####""####""3"##""3""3VFVV"2#"2#"2#"2#"233""3##2##"2"#2"#34C4DC"""""##"""""2"""""""3"""""3""3""333""3""3333223233"3224DxxC4##"2####""#2#"2####""##gg33"333""33""3"33""3""3""3""3""#VVVF!"!""""""2#""""2"""""""""2#"33223233""3"333322323322#"33ggfg"""##"2##""##""##"2####DDVV""32"#3333""3322#"2###"#""3""334C4DC"""""##"""""2"""""""3"""""3""3""333""3""3333223233"3224DxxC4##"2####""#2#"2####""##gg33"333""33""3"33""3""3""3""3""#VVVF!"!""""""2#""""2"""""""""2#"33223233""3"333322323322#"33ggfg"""##"2##""##""##"2####DDVV""32"#3333""3322#"2###"####34##EEVVFV###########3#DD#3##DD##343434443343##3#3343##44DD3DEEUUWVffEE####3###34C43#DD##34UEgVggE43#43##4343D4334444DD4E34C434E4xxxxCD4C##3##2#######334##34D3434343D43344#343##333##344DD44EEUTgfffVW"###3##3##DD##34##DD4EVVggFV3434##3434343444DD44DD#3####34##EEVVFV###########3#DD#3##DD##343434443343##3#3343##44DD3DEEUUWVffEE####3###34C43#DD##34UEgVggE43#43##4343D4334444DD4E34C434E4xxxxCD4C##3##2#######334##34D3434343D43344#343##333##344DD44EEUTgfffVW"###3##3##DD##34##DD4EVVggFV3434##3434343444DD44DD#3ggxxxxxxxxgxgggxfgxxggwwggfgggVFggVFffggggVFfgggggfgggxxgxggwwxxwwxxx xˆ ‰xxggggxxxxxxgxxxxxxxxxgxx xˆ ˆx xx xgxwwggx xxyxxxx xxxy™ ‰™ ‰ ™ ‰ ™ ‰ ™ ‰ ™‰ ™ ‰ ™‰xxxxggggggxxggggffggggfgVFffggVFfgVFggggffggyxxxggwwgxxxwwx xˆ ˆx xxxggwwxxxxxxxxxyxxxxggxxˆ ‰w wx xxxggxxxxxx xxxxxxxy™ ‰ ™ ‰yxggxxxxxxxxgxgggxfgxxggwwggfgggVFggVFffggggVFfgggggfgggxxgxggwwxxwwxxx xˆ ‰xxggggxxxxxxgxxxxxxxxxgxx xˆ ˆx xx xgxwwggx xxyxxxx xxxy™ ‰™ ‰ ™ ‰ ™ ‰ ™ ‰ ™‰ ™ ‰ ™‰xxxxggggggxxggggffggggfgVFffggVFfgVFggggffggyxxxggwwgxxxwwx xˆ ˆx xxxggwwxxxxxxxxxyxxxxggxxˆ ‰w wx xxxggxxxxxx xxxxxxxy™ ‰ ™ ‰yx33""###333""3#33""3#33UU""3""3"""""2#"2#""""3"3333E43333333333""3#33#33333DD33333333334433333333343333333433VFDD33""""##3333##33"3##2#3333""3"33##2#33UU#3#"2#"2#""2"#2"#"""3333DD3D333333####332#33333333DD333333333333#333"3343333333333D3EEDC#"2#"2##33##3333""###333""3#33""3#33UU""3""3"""""2#"2#""""3"3333E43333333333""3#33#33333DD33333333334433333333343333333433VFDD33""""##3333##33"3##2#3333""3"33##2#33UU#3#"2#"2#""2"#2"#"""3333DD3D333333####332#33333333DD333333333333#333"3343333333333D3EEDC#"2#"2##33##33"""#""!!""#"23EE""""!"""""""!""""UU##""#"""""""""#""""3""3""3""3""##""3""3"#""2"##""ff##""""3""""2"""""!#"#"!""#DD#3""""""!""""!"""D4ED!""""!#""""#"""##""##"2"#2"#2"#2##"""""3""##"2DDEE"""#""2""""""!"""""""!"23EE""""!"""""""!""""UU##""#"""""""""#""""3""3""3""3""##""3""3"#""2"##""ff##""""3""""2"""""!#"#"!""#DD#3""""""!""""!"""D4ED!""""!#""""#"""##""##"2"#2"#2"#2##"""""3""##"2DDEE"""#""2"""""!""!"""!!""C3E5!""""""!""""!""""""""EE"2""""""""""""3""""##""##"2"#3#"""##"3""""2##""gf44"""""""3"""""""""""""!!"""EE##""""!"!""!!2"""""D433"2""#""2""#""##""""##"2#"2###""##""##""##"""#2#DDWV""2""""""""""""!"""!!""C3E5!""""""!""""!""""""""EE"2""""""""""""3""""##""##"2"#3#"""##"3""""2##""gf44"""""""3"""""""""""""!!"""EE##""""!"!""!!2"""""D433"2""#""2""#""##""""##"2#"2###""##""##""##"""#2#DDWV""2""""""""""!""!!"!"!"22VE!""""""""!""!""""3"EE""2"""""""""""#2#"2"""""3""3##"""""#"3""3""3""gV43""""""#""2"""!""""!"!"""EE#3"""""!"""""""!"""!DD3D""""""""""""#2###"""""2#"2"##"#2#""""""3"DDVV"##""""!"""!""!""!"""22VE!""""""""!""!""""3"EE""2"""""""""""#2#"2"""""3""3##"""""#"3""3""3""gV43""""""#""2"""!""""!"!"""EE#3"""""!"""""""!"""!DD3D""""""""""""#2###"""""2#"2"##"#2#""""""3"DDVV"##""""!"""""""!"!"!""""VV"""!"""""""""""!"""""DD""""""""""""#2#""""##""""2##"""""2""""2##""fU34"""""""""""""!""!!"!!"""UT33"#""""""""""!"!"""333#"""""""!#""2"""##"2"#2#"2"##"""""""#2#""""DDVF!""""""""""!"!!""""!"!""""VV"""!"""""""""""!"""""DD""""""""""""#2#""""##""""2##"""""2""""2##""fU34"""""""""""""!""!!"!!"""UT33"#""""""""""!"!"""333#"""""""!#""2"""##"2"#2#"2"##"""""""#2#""""DDVF!""""""""""""""""""""""#VV""""""!""""""""""!""34""""""""#""""2""""3""3""3""3""3""3""3"""""""##"2#""VV34""""""""""""""""!!"""!""EE34""""!""""""!"""""""233"""""""""2#"2"#2"#2"#2"#2"#2"#2""2#"2""#2"#2"#44EE"""""""""!"!!"!!"!!""#VV""""""!""""""""""!""34""""""""#""""2""""3""3""3""3""3""3""3"""""""##"2#""VV34""""""""""""""""!!"""!""EE34""""!""""""!"""""""233"""""""""2#"2"#2"#2"#2"#2"#2"#2""2#"2""#2"#2"#44EE""""""""##""####""##""""33VV44#3"#2"#23333""3""3##33"3EEDC$3##2#"""##""##""""####""#""#""""#######""####34EEDC!"!"""!!"!!""""""""""UTFV##""3"#32333"3##""3##2##DD444343"#"""2##""""""#2#"#"#""##""""##"2"########EDFU##""3##"""###""####""##""""33VV44#3"#2"#23333""3""3##33"3EEDC$3##2#"""##""##""""####""#""#""""#######""####34EEDC!"!"""!!"!!""""""""""UTFV##""3"#32333"3##""3##2##DD444343"#"""2##""""""#2#"#"#""##""""##"2"########EDFU##""3##"""#VVggggVWggggVWUU5EVFfVggxxggffggxxxxxxxxxxwwxxxxxxggww xxggffVFVVFVVFffVWVWfgVWggVWVVFVVFVVEUVFfWgggggxgxggggggggggFVVVEDgggfFVVFVVETEEVVffggUUUUEEUUEUggggxxffggggwwx xxxwwxxwwwwwwxxggwwxxffVVVVFVVFfVfgVFggffggVWVVVVFVVFUUEUVFgggggxgxgxggggggxxggggx xVVUUVVVVVVggggVWggggVWUU5EVFfVggxxggffggxxxxxxxxxxwwxxxxxxggww xxggffVFVVFVVFffVWVWfgVWggVWVVFVVFVVEUVFfWgggggxgxggggggggggFVVVEDgggfFVVFVVETEEVVffggUUUUEEUUEUggggxxffggggwwx xxxwwxxwwwwwwxxggwwxxffVVVVFVVFfVfgVFggffggVWVVVVFVVFUUEUVFgggggxgxgxggggggxxggggx xVVUUVVVVDC#"3333DDxg33""3""3##2#""""2#"2#"2##3"#3"#33""#"""233##2#"3""3""UUggUUVVETVUUUWVUUgfUUWVUUUUffggDDDDDD33DDDTDDTTDDUUUUUUUUffUUDDDDUUffEE""#2#33""3""""""33""3"#33333##2#33##"""33""3""33""3"DDggfgDTUUUUUUWVUUggUUWVUUUUgg ˆ‰ffDDDD3DD3DDDDDDTTDDUUDUUDDDC42"3333DDxg33""3""3##2#""""2#"2#"2##3"#3"#33""#"""233##2#"3""3""UUggUUVVETVUUUWVUUgfUUWVUUUUffggDDDDDD33DDDTDDTTDDUUUUUUUUffUUDDDDUUffEE""#2#33""3""""""33""3"#33333##2#33##"""33""3""33""3"DDggfgDTUUUUUUWVUUggUUWVUUUUgg ˆ‰ffDDDD3DD3DDDDDDTTDDUUDUUDDD33"#""DDfg""""""""!"3""""""""""""#2#""!"2"DDgg33"3""3""3""433333333433VWVV"3##"""""2#"2#"2#"2#"2#"2#"2#"2#"2#CD##"""""""""#2#!"""""""""!""#"""""2#"ggD42"#2"#2"#2"#3433333433DDyx44""""2#"""2""2#"2#"2#"233"#""DDfg""""""""!"3""""""""""""#2#""!"2"DDgg33"3""3""3""433333333433VWVV"3##"""""2#"2#"2#"2#"2#"2#"2#"2#"2#CD##"""""""""#2#!"""""""""!""#"""""2#"ggD42"#2"#2"#2"#3433333433DDyx44""""2#"""2""2#"2#"2#"233##""##33WV#3""!!"""!#""!""""""""""""""""""""DDgg34""3"#3"#34333433343344ffVF33##2###""3""2"#2"#2"33333333443344DD#3#""""""""""""""""""""""""""""!""""33ggD33##3#"34""433343334333UUgg44"2##3"##""3""3##2#"243"#3333##""##33WV#3""!!"""!#""!""""""""""""""""""""DDgg34""3"#3"#34333433343344ffVF33##2###""3""2"#2"#2"33333333443344DD#3#""""""""""""""""""""""""""""!""""33ggD33##3#"34""433343334333UUgg44"2##3"##""3""3##2#"243"#3333##""D4VV"3""!"!"""""""""""""""""""""##!"""""DDgg333343"#3434""4333434333gggg""3"##""###3"#34##34""3#334433444444DD#3#""""!""""""#"!"!"""""""""#""!"""""#"ggEE333334##34343334333433UDxg34""3""2"#3##3##23334""433333##""D4VV"3""!"!"""""""""""""""""""""##!"""""DDgg333343"#3434""4333434333gggg""3"##""###3"#34##34""3#334433444444DD#3#""""!""""""#"!"!"""""""""#""!"""""#"ggEE333334##34343334333433UDxg34""3""2"#3##3##23334""43333334##"D4gg33"""""""""""""""""""""""""""""3"33gf3344"334##34343334343344UUVV""#"""##"""##"2##33444444DD4433EE44""""""""""""""""""""""""""#"""2"#2WVDD443334""43"#3434343344DDxg##2##""""""3####333###DC3343##"D4gg33"""""""""""""""""""""""""""""3"33gf3344"334##34343334343344UUVV""#"""##"""##"2##33444444DD4433EE44""""""""""""""""""""""""""#"""2"#2WVDD443334""43"#3434343344DDxg##2##""""""3####333###DC33#3"""D4gg""""""""""#"!!""!"""""""!"""""!""33ffD34433433343434433433333EEEE"2"#"#"""""""####DD3344334433EEDC"!"!"!"""!""""!!"!""""!!"""""""2#VVDD3344434343434433444333DDgg""##"""#"#"""33""3333#3"""D4gg""""""""""#"!!""!"""""""!"""""!""33ffD34433433343434433433333EEEE"2"#"#"""""""####DD3344334433EEDC"!"!"!"""!""""!!"!""""!!"""""""2#VVDD3344434343434433444333DDgg""##"""#"#"""33""333343##33EEggE43##3#"##""""""""33""#""33####3#33##334343UEVV#4##3#33#3433334##3###""gggg"""33######2###33""4433DDEEDCEEDDEEggFV3334#####33"""""""!#""#"2"#####33##3##3##4343E5fVD534##3333##3433##3#"3##D3yx#3"#3#34""###333""3"#34333333343##33EEggE43##3#"##""""""""33""#""33####3#33##334343UEVV#4##3#33#3433334##3###""gggg"""33######2###33""4433DDEEDCEEDDEEggFV3334#####33"""""""!#""#"2"#####33##3##3##4343E5fVD534##3333##3433##3#"3##D3yx#3"#3#34""###333""3"#3433333ffffVWUUUUggUUEEVVETEEEEEEDDVVggEEVVDDEEEEVVDDVVEUVFeUffggggffggVWffUUgfWVUU3DE4VUEEEEEDFVVFEEVVxxggwwggffggUUxgggxxgxgxgxxxgxxxgxggggfffffffgEEffUDEEEE3DUEEEggVFEEUU4DEEVVEEUTFVUDgfVFffxxfgfffgffUUgfUUVVDDEE4EUEEEEDFUVFEEVVggxxgxggffffVWffgxgxgxgxgxw wgggxffffVWUUUUggUUEEVVETEEEEEEDDVVggEEVVDDEEEEVVDDVVEUVFeUffggggffggVWffUUgfWVUU3DE4VUEEEEEDFVVFEEVVxxggwwggffggUUxgggxxgxgxgxxxgxxxgxggggfffffffgEEffUDEEEE3DUEEEggVFEEUU4DEEVVEEUTFVUDgfVFffxxfgfffgffUUgfUUVVDDEE4EUEEEEDFUVFEEVVggxxgxggffffVWffgxgxgxgxgxw wgggx"#""""2#"2#""""""""#2#"2D4EE33""3""3""3""3""3""3""3"33VV4C33##2##3""##""##"2#"3##3"#33333343334333334333443333DDEE333333"3##2#""""#2#""##"!##"2""#2"33VF3422#"2#"2#"2#"2#"2#22#"2#UU4D33#3"###"2#"2#"2#"2###33##3333334433333333444333333344UU3D""3#"#2"2"""""3""3""""""2""#2"DDEE33""3""3""3""3""3""3""3"33VV4C33##2##3""##""##"2#"3##3"#33333343334333334333443333DDEE333333"3##2#""""#2#""##"!##"2""#2"33VF3422#"2#"2#"2#"2#"2#22#"2#UU4D33#3"###"2#"2#"2#"2###33##3333334433333333444333333344UU3D""3#"#2""#""##""""""##"""3"DDgg#3""33""333"33333333##3#33gf44"3####""####"3""2"##""##""##"2####2###""##""3##244DD""43"###"2#"##"3"""""""""""""3"43ffD333""33""3333333333##33##VVEE34""####""###"3""2"##""##"2##""##"2##"""####3"#2"DD#3#"""""""#""##""""""##"""3"DDgg#3""33""333"33333333##3#33gf44"3####""####"3""2"##""##""##"2####2###""##""3##244DD""43"###"2#"##"3"""""""""""""3"43ffD333""33""3333333333##33##VVEE34""####""###"3""2"##""##"2##""##"2##"""####3"#2"DD#3#"""""""""""3"""3"""2##"33EEVV"""33333333333334333433#3VFDC#"##"2##"""3"""3"##""###3"####3"#####"3"####""3#3344#3"#3#"3"##""#"#""""""3""""""###33WV##""333333""33333433343433EEDC##3##2####"""#2#######"3"##""##33####""#####""3##2D433#"43#""""2"#"#""""#"""2##"33EEVV"""33333333333334333433#3VFDC#"##"2##"""3"""3"##""###3"####3"#####"3"####""3#3344#3"#3#"3"##""#"#""""""3""""""###33WV##""333333""33333433343433EEDC##3##2####"""#2#######"3"##""##33####""#####""3##2D433#"43#"""""#""""2"#"2"#2###DCEE""3"33333333333333#3433333EE44"3##""###"2"##"""####""##"2##""####""""3##""##"23344"334##""3##2###"""""""#"#""#2#34VW#322#"3333333333333434##""UU4D##2#"2""#"3""2"#2###""##"2####33##""""####2#"243D43343"""""""#""""2"#"2"#2###DCEE""3"33333333333333#3433333EE44"3##""###"2"##"""####""##"2##""####""""3##""##"23344"334##""3##2###"""""""#"#""#2#34VW#322#"3333333333333434##""UU4D##2#"2""#"3""2"#2###""##"2####33##""""####2#"243D43343"""""""""#"""""""3"""#44fV333333DD3DD3DD3D4433##3333EE34""####""#"#""#2#"33"##""######2#"#"""####""##33EE34""######2###""""""""""""##"""3#VV4C333333D3DD3DD3334333#343VF333##3##""#2#"#2#########""#3#"3##"#""""2##""##"2EE44"3"""""""""2""""""3"""#44fV333333DD3DD3DD3D4433##3333EE34""####""#"#""#2#"33"##""######2#"#"""####""##33EE34""######2###""""""""""""##"""3#VV4C333333D3DD3DD3334333#343VF333##3##""#2#"#2#########""#3#"3##"#""""2##""##"2EE44"3"""""""""""""""""3##""44VV3334##3344DD443333"#""EDE52"##""#2#"""3"""##"""3"##""##"2""#""""3####""3"44VV""3"##""####""""""2""""""""""3"43EEED33#33343D4443343"#"3"43UE33""##"""""3"""3""2"#2#"2#""##"2""#"##""3"##33EE44"3""""""""""""""""""3##""44VV3334##3344DD443333"#""EDE52"##""#2#"""3"""##"""3"##""##"2""#""""3####""3"44VV""3"##""####""""""2""""""""""3"43EEED33#33343D4443343"#"3"43UE33""##"""""3"""3""2"#2#"2#""##"2""#"##""3"##33EE44"3""""#3##33332###333333#3###3##3UEEE""""##""##DDUEEEggEU##3#33##3###2"####33#3##3#######3#"2"##3#34443444WVEE44DD4E3434###""#"""""###3#33##34fg33""""##"#DCFUD3DDFV##3##3##33##"""#"#""##3##3#####3####2#"3""33##344433VFVV444444DD#3##33332###333333#3###3##3UEEE""""##""##DDUEEEggEU##3#33##3###2"####33#3##3#######3#"2"##3#34443444WVEE44DD4E3434###""#"""""###3#33##34fg33""""##"#DCFUD3DDFV##3##3##33##"""#"#""##3##3#####3####2#"3""33##344433VFVV444444DDggUUggUUVVxxggDDVVDDUUEEEEffVFeUEEUUEEEEUUFVfgffgxgxfgfgfffffgfgfgggUUx xwhffggfffgxxggfgVWfgggUUffggxyxxgggggxggggggggggggggfgggfgFVVWggEEEDEEUU5EVFffEEEEVVVVUUVVEEUUFVDDVVfgVWffxxggffggggfgfgfgfgfgggyxffggfgVFwwxxffggfgfgfgVFfgxxxyggggxxgxgggggggxffggggggggUUggUUVVxxggDDVVDDUUEEEEffVFeUEEUUEEEEUUFVfgffgxgxfgfgfffffgfgfgggUUx xwhffggfffgxxggfgVWfgggUUffggxyxxgggggxggggggggggggggfgggfgFVVWggEEEDEEUU5EVFffEEEEVVVVUUVVEEUUFVDDVVfgVWffxxggffggggfgfgfgfgfgggyxffggfgVFwwxxffggfgfgfgVFfgxxxyggggxxgxgggggggxffgggggg33"333""33xxTE"3"""##"3""3""3"33##33##2#3333343333""##"2#"2#"2#"33""fUx xD52"#3#"3#"3""3""333""3"44xxDDDD333333333333"3##332#3433"33Dgg""##"2#"2###""#2#"2#"##"2##33##2##3"#333333""##"2##""3""3""3333ˆwVF33##2##3"#2"#2"###"23333VWggC4333433D33334""3333""3333"333""33xxTE"3"""##"3""3""3"33##33##2#3333343333""##"2#"2#"2#"33""fUx xD52"#3#"3#"3""3""333""3"44xxDDDD333333333333"3##332#3433"33Dgg""##"2#"2###""#2#"2#"##"2##33##2##3"#333333""##"2##""3""3""3333ˆwVF33##2##3"#2"#2"###"23333VWggC4333433D33334""3333""33""3""3##33VWCD""##""""""3""3##""##""3"##33""43"#3#"3##""#2#""##2#3333UDxxCD##2#"2#"2##3"#2"##""4333gg34""3"33##""33##33""###333""3"DDVW"#"""##""""""##""""##"2##""3""3##33""##33##2#"2##"""""2#"333333xxfg""3#""##2#"2##""#3"#2"#2ggEE""3""3""##33""##33##2#"2"3""3"#333VWCD""##""""""3""3##""##""3"##33""43"#3#"3##""#2#""##2#3333UDxxCD##2#"2#"2##3"#2"##""4333gg34""3"33##""33##33""###333""3"DDVW"#"""##""""""##""""##"2##""3""3##33""##33##2#"2##"""""2#"333333xxfg""3#""##2#"2##""#3"#2"#2ggEE""3""3""##33""##33##2#"2"333##""3"EEDC"""""2#"2"##""""3"##""""##"2#"2#"233""##"2#"2#"23332"#eUhw#4""3#""##""##"2##""3#"33‰x33"3""3"#3"#2"33##2###33""##"2EEVV"2"#""##!2"#2""##"""""""2##""""##"2#"33""3""3##""3""33322#"DDxxEE"2##3"##""3"##""##"2##3"ffVF2"#233##2#"233""3"#3"#3#"333##""3"EEDC"""""2#"2"##""""3"##""""##"2#"2#"233""##"2#"2#"23332"#eUhw#4""3#""##""##"2##""3#"33‰x33"3""3"#3"#2"33##2###33""##"2EEVV"2"#""##!2"#2""##"""""""2##""""##"2#"33""3""3##""3""33322#"DDxxEE"2##3"##""3"##""##"2##3"ffVF2"#233##2#"233""3"#3"#3#"3""3##2##EE44##""""""""3""3""3""2"""##""""3""333""3""3""3"2333233322gfhw#4""##"2##""##"2""##""3"33xg44"3""3""333""3""3##2###33##3#DDVW"2"""2""""2"#2"#2"##""""#2###""3""3""33""3""3""3233"33323C4xxEE"2#"##""##""##"2##""3""3ffVF2"#2"#2"#2"#2"#2##2###"""3""3##2##EE44##""""""""3""3""3""2"""##""""3""333""3""3""3"2333233322gfhw#4""##"2##""##"2""##""3"33xg44"3""3""333""3""3##2###33##3#DDVW"2"""2""""2"#2"#2"##""""#2###""3""3""33""3""3""3233"33323C4xxEE"2#"##""##""##"2##""3""3ffVF2"#2"#2"#2"#2"#2##2###"""3""##"2#"EE3D"""""""3""2"#2"""""3""3""3""3""3333""33""33""33333323UDxx44"2#"##"2""###"2##""3#33gg332333""3""3""33""3"##33""3##2EEgg"""""""""2"#2"#"2""""""""2#"2#"2"332233""33""33""333233D3ggff""##"2##""#2###""##"2#"eUVF2"32"#2"33""3"33""3##2##"3""##"2#"EE3D"""""""3""2"#2"""""3""3""3""3""3333""33""33""33333323UDxx44"2#"##"2""###"2##""3#33gg332333""3""3""33""3"##33""3##2EEgg"""""""""2"#2"#"2""""""""2#"2#"2"332233""33""33""333233D3ggff""##"2##""#2###""##"2#"eUVF2"32"#2"33""3"33""3##2####""""3"44DD3D""""2"#2""""3"""3""2"#2"#2"33""3"33""33""3332"#2"DDxxCD##""##"3"##"3""3##""3"VV44"3""3"33""3"3333""3""3##""#DDgg""""""""""""""2#""""2"""##""""3""3""3223""3"33""33223322#"33gfWV"3#""##""####""""#3"#"EEEE"2#"33""3""333""33""#""##""""3"44DD3D""""2"#2""""3"""3""2"#2"#2"33""3"33""33""3332"#2"DDxxCD##""##"3"##"3""3##""3"VV44"3""3"33""3"3333""3""3##""#DDgg""""""""""""""2#""""2"""##""""3""3""3223""3"33""33223322#"33gfWV"3#""##""####""""#3"#"EEEE"2#"33""3""333""33""#""##343434EEVVFV##3########3##DD#343D433D4443444DD##DD##34343444DDEEUTWVWVffEE####3#43D4CD#4CD#4CDFVVWggEE34343434C43444DD4EE4EEEEEEEEfgxyC44444DD##3#####3##343D43343D43344DD44443343##434343D444EEEEUUggffVW#3##43##33DD##34D343E5fWgggg3434343434E443E544EE4ED3##343434EEVVFV##3########3##DD#343D433D4443444DD##DD##34343444DDEEUTWVWVffEE####3#43D4CD#4CD#4CDFVVWggEE34343434C43444DD4EE4EEEEEEEEfgxyC44444DD##3#####3##343D43343D43344DD44443343##434343D444EEEEUUggffVW#3##43##33DD##34D343E5fWgggg3434343434E443E544EE4ED3ggxxxxgxgxxxggggggwwggwwggggfgVWVVfgFVfgffVFfgggggffgxxxxxggwwwwxxgxˆ ˆw wxxggxxxxxxxxgxxyxyxxgxgg xx ™ ‰xxgxwwggxxxxxyxxwwyxxx™ ‰ ™ ‰ ™‰ xx ™ ‰ ™ ‰ ™ ‰wwxxggwwggggwwggggffggVWffVWVVggffFVVFffggggwwxxgxgxwwggwwwwx xˆ ˆx xxxggwwxxxxgxxyx xxyxyggwwˆ ˆx xwwxxggxxxxxxxxxxxxww ™‰ ™ ‰xxggxxxxgxgxxxggggggwwggwwggggfgVWVVfgFVfgffVFfgggggffgxxxxxggwwwwxxgxˆ ˆw wxxggxxxxxxxxgxxyxyxxgxgg xx ™ ‰xxgxwwggxxxxxyxxwwyxxx™ ‰ ™ ‰ ™‰ xx ™ ‰ ™ ‰ ™ ‰wwxxggwwggggwwggggffggVWffVWVVggffFVVFffggggwwxxgxgxwwggwwwwx xˆ ˆx xxxggwwxxxxgxxyx xxyxyggwwˆ ˆx xwwxxggxxxxxxxxxxxxww ™‰ ™ ‰xx""3""3""##"2#"2#"23333VV""""""2"""""2#""""2323344333334##33""3#33""433333333333333433"333##2#33##33333333EEED#3""""3"##33"33""3""3""3##2"#2"#2"#3#DDDD"""""3""2""2#"2"#2D433D43#33#33333##33""43333333333333333433"3##2#33##33""3#33DDEE33"2"#2"###"2#""3""3""3##""3""3""3333VV""""""2"""""2#""""2323344333334##33""3#33""433333333333333433"333##2#33##33333333EEED#3""""3"##33"33""3""3""3##2"#2"#2"#3#DDDD"""""3""2""2#"2"#2D433D43#33#33333##33""43333333333333333433"3##2#33##33""3#33DDEE33"2"#2"###"2#"""!""!#"#""!33EE""""!"!""!"""!#"2"UU"###""""""#2#""2#"2#"2#"2#""2"#2"###"""3"####""gf43"""#""2""#!""""""!""!"#""DD##""""!"""""""""""D3EE""""""#2#""""""##"2#"2#"2""###"2#""2"#2#"2"TTEE""""""2"#"#"!""!"!#""!33EE""""!"!""!"""!#"2"UU"###""""""#2#""2#"2#"2#"2#""2"#2"###"""3"####""gf43"""#""2""#!""""""!""!"#""DD##""""!"""""""""""D3EE""""""#2#""""""##"2#"2#"2""###"2#""2"#2#"2"TTEE""""""2"#"""#""""""!!"33D3"""""""!""!""!""!""EE"2""#""2""#""""#2"""##""##""3""3""####"3""3"""#2#fg44"""""3"##"""!""""!""!"!""EE#3!"""!""""!""!"""""D3DD""!#""""2""#2"""##""##""3""3""##""""##"2""#"3"DDVV""#""2##""!"!#"""!"""""33D3"""""""!""!""!""!""EE"2""#""2""#""""#2"""##""##""3""3""####"3""3"""#2#fg44"""""3"##"""!""""!""!"!""EE#3!"""!""""!""!"""""D3DD""!#""""2""#2"""##""##""3""3""##""""##"2""#"3"DDVV""#""2##""!""!"!!"!!"!"33EE"""""!"""""""!""""""EE"2""""""""""""2#"2##"""""2###"""""""""""3""3"WV33"""""#"""""""!"""!"!"""EE#3""""""""!""!""!#""DD33"""""""""""""""#3""##"""""##""#""2"#"""""3"DDVV""""""!!#""!""!""!"""33EE"""""""""""""!""""""EE"2""""""""""""2#"2##"""""2###"""""""""""3""3"WV33"""""#"""""""!"""!"!"""EE#3""""""""!""!""!#""DD33"""""""""""""""#3""##"""""##""#""2"#"""""3"DDVV""""""!!#"!"!!"""!""!""""VV"""""""""""""""""""""""D3#"""!"""""""""""2##""""#"""2""""""""##"""2#"2#"eU43"""""""""""""!"""""""""""UT33"""!"""""""""""""""C333""""""""""""""2##"""3""2"#2"""#"""""""""3""344VV""""""""""""""""!!""!""""VV"""""""""""""""""""""""D3#"""!"""""""""""2##""""#"""2""""""""##"""2#"2#"eU43"""""""""""""!"""""""""""UT33"""!"""""""""""""""C333""""""""""""""2##"""3""2"#2"""#"""""""""3""344VV"""""""""""!"!!"!!"!!"""UU"""""""""""""""""""""33""""""3""2"""""3""3""3""3""3""3""3""3""""""2#"##"VV33""""""""""!!"!!"!!"!!"!UE34""""!""""""""""""!"""##"""""""""""""2#"2#"2#"2#"2#"2#"2#""2""2#""""3"##33EE"!"""!""""""""""""""""UU"""""""""""""""""""""33""""""3""2"""""3""3""3""3""3""3""3""3""""""2#"##"VV33""""""""""!!"!!"!!"!!"!UE34""""!""""""""""""!"""##"""""""""""""2#"2#"2#"2#"2#"2#"2#""2""2#""""3"##33EE"!"""!""#3##333434##3#######44ggE52"#2##""3"####"2"""3##EEDC##3#33"""#"3"""##"####"##"##"2##""4343##3434##44fVE43##3##3#33##3#43##3#"3##3444########33VFVV#3##""3"##""##"2""###""44UU#3##33##"""3"##"""3"###"###"3#"3##""43##4343##43VFVV##33##3#33###3##3##333434##3#######44ggE52"#2##""3"####"2"""3##EEDC##3#33"""#"3"""##"####"##"##"2##""4343##3434##44fVE43##3##3#33##3#43##3#"3##3444########33VFVV#3##""3"##""##"2""###""44UU#3##33##"""3"##"""3"###"###"3#"3##""43##4343##43VFVV##33##3#33###3#ffgxgggggxgxggFVEEVVggggwwggfgUUggxxwwgxgxfwgxgxwwggggwwggfgEEffVFVVfgVWggggVWggVWVWggVFVVFVVFgggxgxgxgxgxgxgxgxxxggxxxyxyxyxyxxgxggggggVWVVggFVEEVVVWgggxggggfgfggxwwgxggxxgggxwwgggggxgxggDUVVVVFVVFggggggggggVWVWVWggVFVVFVgggggxgxgxxygggxggyxxxggyxggggggggffgxgggggxgxggFVEEVVggggwwggfgUUggxxwwgxgxfwgxgxwwggggwwggfgEEffVFVVfgVWggggVWggVWVWggVFVVFVVFgggxgxgxgxgxgxgxgxxxggxxxyxyxyxyxxgxggggggVWVVggFVEEVVVWgggxggggfgfggxwwgxggxxgggxwwgggggxgxggDUVVVVFVVFggggggggggVWVWVWggVFVVFVgggggxgxgxxygggxggyxxxggyxgggggggg33"33333EEgg"""""2""#""""""3""33""3""3""3""3""""33""""3##""3"UUggFVTDUUFVTEeUWVUUWVUUVVUUWVVVETD444DD3DD3DDDDDDDDDDDDDDDDDDEEDCFVD3#2#"2"#2#"""""""3"""""""3"33""3""3##"!33""3"""""2#"33xgVVDTUETUUUVVUUUUWVUUUUUUWV‰ ˆgg3D333344DD3DTDDDDDDTDDDDDD33"33333EEgg"""""2""#""""""3""33""3""3""3""3""""33""""3##""3"UUggFVTDUUFVTEeUWVUUWVUUVVUUWVVVETD444DD3DD3DDDDDDDDDDDDDDDDDDEEDCFVD3#2#"2"#2#"""""""3"""""""3"33""3""3##"!33""3"""""2#"33xgVVDTUETUUUVVUUUUWVUUUUUUWV‰ ˆgg3D333344DD3DTDDDDDDTDDDDDD33##"""44WV"2""""""!#2#""""!"""""""""##!"""3"DDgg"3""##"2#"2#343333343333ggff"#"""2#"2""2"#"2"#2"#2"#243"#2"4344""""##""!"""!"3"""""""""""""3""""""3"ggDD"3""3""3""43"#33343333UDxgDD""#2#""""""3""2"#2"#2"#233##"""44WV"2""""""!#2#""""!"""""""""##!"""3"DDgg"3""##"2#"2#343333343333ggff"#"""2#"2""2"#"2"#2"#2"#243"#2"4344""""##""!"""!"3"""""""""""""3""""""3"ggDD"3""3""3""43"#33343333UDxgDD""#2#""""""3""2"#2"#2"#233##"""DDVF33"""""""""""""""""""""""2""""""""D3gg33"3##2#3433#33344334433ffVW#3"#2"##""3""2"#2"#2"#243"#3333""3#DD"""""""""!""""2"!""""""""""""""""""""33ggD33"#3##""43334333433344DDxg34""##"2####2#"2#"2#34""3"3433##"""DDVF33"""""""""""""""""""""""2""""""""D3gg33"3##2#3433#33344334433ffVW#3"#2"##""3""2"#2"#2"#243"#3333""3#DD"""""""""!""""2"!""""""""""""""""""""33ggD33"#3##""43334333433344DDxg34""##"2####2#"2#"2#34""3"3433##""D4gg"""""""""""2"""""""""""""""#"""""""DDgg443334""43##333334333433ggVW"2"#"3"####3##3"#2"#3#"43443344"344DD"""""""""""##!"""""""33"""""#""""""2#"ggEE3334""3#43"#34333444"3UDyx34""##"2#"3#"3##34""4343"#3433##""D4gg"""""""""""2"""""""""""""""#"""""""DDgg443334""43##333334333433ggVW"2"#"3"####3##3"#2"#3#"43443344"344DD"""""""""""##!"""""""33"""""#""""""2#"ggEE3334""3#43"#34333444"3UDyx34""##"2#"3#"3##34""4343"#343333"#"DDgg"""""""""!"""""""""""""""""""""""""##33WV33433343##2#343433343433VWVV""#""""#"""###3"#3#"3344434##DDEE""""""""""""""""""""""""""2"""""""3"WVDD3D3434""43##3343433344DDgx##"2"#""##""#3#DD"###DD3333"#"DDgg"""""""""!"""""""""""""""""""""""""##33WV33433343##2#343433343433VWVV""#""""#"""###3"#3#"3344434##DDEE""""""""""""""""""""""""""2"""""""3"WVDD3D3434""43##3343433344DDgx##"2"#""##""#3#DD"###DD3343##"D3hg"""""!""""#"""""""""""""#""!!"""44VV33DD#3433343434433434433UDEE"""#""""""""""##33##33333433DD4E""!"""""""""""""""#""!!"""""!""""VVDD4433434343444333434433DDgx#"#"#"#"""""33""##3343##"D3hg"""""!""""#"""""""""""""#""!!"""44VV33DD#3433343434433434433UDEE"""#""""""""""##33##33333433DD4E""!"""""""""""""""#""!!"""""!""""VVDD4433434343444333434433DDgx#"#"#"#"""""33""##3343##43EEggEE34##3##2"#2"""""33"#"#""33#####34##333#43D433VFVV4C433334##333##3##33####xggg#33##33##3##3##2#33D3DD#3EEEEDCEEgghw5EC4DC$3#3###2"#"""""""#"#""#3#33#33##3#33#3E533E5fVE43##3334343"#343434####C4yx33"33334##2#####33##333433343343##43EEggEE34##3##2"#2"""""33"#"#""33#####34##333#43D433VFVV4C433334##333##3##33####xggg#33##33##3##3##2#33D3DD#3EEEEDCEEgghw5EC4DC$3#3###2"#"""""""#"#""#3#33#33##3#33#3E533E5fVE43##3334343"#343434####C4yx33"33334##2#####33##33343334ffffVWTUVWffVFCDVVEEEEEDDDEEEEggVVEEEEDCEEUUFVTEEEVVffUUgghwgfffVWVVffUUffEEEEDCEEEEEEUUFVVFVVUUggwwggggggffffffgxw wgxgxgxx xxxfggxffVWffffggVWDEEEVVETDDDDUUEEfgVVVVEEDCFVEEEEUTEUEEVVfgfggggxffFVfgVFeUgfUEUU44EEEUEEEEEEEEVVVVgggxwwggggffUUgggxgxgxgxgxw wgxggffffVWTUVWffVFCDVVEEEEEDDDEEEEggVVEEEEDCEEUUFVTEEEVVffUUgghwgfffVWVVffUUffEEEEDCEEEEEEUUFVVFVVUUggwwggggggffffffgxw wgxgxgxx xxxfggxffVWffffggVWDEEEVVETDDDDUUEEfgVVVVEEDCFVEEEEUTEUEEVVfgfggggxffFVfgVFeUgfUEUU44EEEUEEEEEEEEVVVVgggxwwggggffUUgggxgxgxgxgxw wgxgg"##""""2#"""3"#""2"#2D4UU"#33""3""3""3""3""3""3""43VFDC##3"33##""##""##""#33##2#3334333334333333343433333344EE33"333"3##2#"2"""""3"##"""2""#"3"33VF332#"2#"2#"2#"2#"2#"2#"2#"UUDD43"#33##""##""##"2#"2###33##33333334333334343433333343VF332#"2""""##""""2#"""3"#""2"#2D4UU"#33""3""3""3""3""3""3""43VFDC##3"33##""##""##""#33##2#3334333334333333343433333344EE33"333"3##2#"2"""""3"##"""2""#"3"33VF332#"2#"2#"2#"2#"2#"2#"2#"UUDD43"#33##""##""##"2#"2###33##33333334333334343433333343VF332#"2""""""##"3""""2""""""3##C4fW33#"2#3334""3333333433##33gf33#3##"2"#2###"3""##"2#"##"2####2#"##"2#"######2#3344"333####2#"2#""""##"""""#""""3333VWCD""33""3333333333##3333##VVDD34##"2"####"3""""2####""##"2####2###"""3####""33D343"#"#""""2##"#""""2""""""3##C4fW33#"2#3334""3333333433##33gf33#3##"2"#2###"3""##"2#"##"2####2#"##"2#"######2#3344"333####2#"2#""""##"""""#""""3333VWCD""33""3333333333##3333##VVDD34##"2"####"3""""2####""##"2####2###"""3####""33D343"#"#"""""""""#"2"#""2####""EEEE"2#"333333333333433333#333VV4C#"##"2""#"3""2"##""##"2##""###3"#"33######""##"2444333""43"#3#"3####""""""#""""3"#"##33VV##2#3333333333333433333433EEEE#3"###"2"""""##"##""##"2##""##"2##""####""####""3##2D433#"3#"3""""""""#"2"#""2####""EEEE"2#"333333333333433333#333VV4C#"##"2""#"3""2"##""##"2##""###3"#"33######""##"2444333""43"#3#"3####""""""#""""3"#"##33VV##2#3333333333333433333433EEEE#3"###"2"""""##"##""##"2##""##"2##""####""####""3##2D433#"3#"3""""#""""""2""#"#""""DDVV"3233333333333333#3433344VV33#3"#"##"2"#""##"""####""##"2######"##2#####""##33EE#3"###"2####"2"##""""""#"#""#"###gf##2333""33333333333433##33VV4C########""#"#""#2#####""##"2####33##"#""###3##""3"EE#3#"##"""""#""2""""#2#"#""2D4fV"3233333333333333#3433344VV33#3"#"##"2"#""##"""####""##"2######"##2#####""##33EE#3"###"2####"2"##""""""#"#""#"###gf##2333""33333333333433##33VV4C########""#"#""#2#####""##"2####33##"#""###3##""3"EE#3#"##"""""""""#"""#2#""2##D3VV3333D3DD3DD3DD3DD33#33##DCEE##2###""3"""3""##"2""###"2######"2"#2#""#2###""33EE""43##""3##2#"""""""3"""#"""3##VV4C3333DD3DD3DD3DD343##33##VV3433##2#"#2#"##"""3"####""##"2####""#"#"""##"2##33EE44"3"""""""""""#"""#2#""2##D3VV3333D3DD3DD3DD3DD33#33##DCEE##2###""3"""3""##"2""###"2######"2"#2#""#2###""33EE""43##""3##2#"""""""3"""#"""3##VV4C3333DD3DD3DD3DD343##33##VV3433##2#"#2#"##"""3"####""##"2####""#"#"""##"2##33EE44"3"""""""""""""""""""""##"244VV3333####44DD333334"#""DD5D#"##"2"#""#"#""""#"##""##""##"2##"""#"#""##"2#"44eU##2#"2##""##"2##"!#""""#2"##""3"#3VF44332###4444443334"""2##3UE33##""""3""#""""#"#""""##""##"2##"""""###"2##""3"EE44"3"""""""""""""""""""""##"244VV3333####44DD333334"#""DD5D#"##"2"#""#"#""""#"##""##""##"2##"""#"#""##"2#"44eU##2#"2##""##"2##"!#""""#2"##""3"#3VF44332###4444443334"""2##3UE33##""""3""#""""#"#""""##""##"2##"""""###"2##""3"EE44"3""""33#3434D#33#3333333#3##3#43UEEE"#"""#3#"3#UU5ED5UUFV33#3##333##3#""#####333##3##3##3##33##########344434D3ggEE44EE4444444434#####33""###3#33##3#EEggD3"""""###33D3VV5DE5fgC434##3##3##33###33##3##3##3##3########33#3334443444UUWVEE44EE4433#343D4"333#333333#3##3#43UEEE"#"""#3#"3#UU5ED5UUFV33#3##333##3#""#####333##3##3##3##33##########344434D3ggEE44EE4444444434#####33""###3#33##3#EEggD3"""""###33D3VV5DE5fgC434##3##3##33###33##3##3##3##3########33#3334443444UUWVEE44EE44ggUUggUUVVwwggDDVVDDEEEUEEUTWVUUEEEEEEEDEEffVFggggwwfgUUggUUgggfgfgfffgxxxfgffggffgxggggfgfgfgffVWgg xxxxgggxgxgggxggggffggggggffVWggVWffxxTE44EEDDUU4DUEEEEEffUDVV4CVFEDFUVFeUgggfhwffVWfgUUffggfgfgfgggyxffggffVVggxxggfgfgfgfgVFffx xxyfgggxxgggxggggffggffggffggUUggUUVVwwggDDVVDDEEEUEEUTWVUUEEEEEEEDEEffVFggggwwfgUUggUUgggfgfgfffgxxxfgffggffgxggggfgfgfgffVWgg xxxxgggxgxgggxggggffggggggffVWggVWffxxTE44EEDDUU4DUEEEEEffUDVV4CVFEDFUVFeUgggfhwffVWfgUUffggfgfgfgggyxffggffVVggxxggfgfgfgfgVFffx xxyfgggxxgggxggggffggffggff""33""3"33xxTE"3""""#2#"2#"2#####3333##33##2#33"3##""""3""3""3""3""fUyx44"333""3""3""3"##""3""333xgUU33333333343333##33##2#3333""3333ggD3""##""""#"#""3"##""3"#333##2###33"333#3"#""##""3"##""3""3D3xxVV""3##233""3"##""3""3""33VWffC4333433343333##2##3"#33"333""3"33xxTE"3""""#2#"2#"2#####3333##33##2#33"3##""""3""3""3""3""fUyx44"333""3""3""3"##""3""333xgUU33333333343333##33##2#3333""3333ggD3""##""""#"#""3"##""3"#333##2###33"333#3"#""##""3"##""3""3D3xxVV""3##233""3"##""3""3""33VWffC4333433343333##2##3"#33"333##33""gV44"3""##"""2#"2##""##""3"##""3##2"#33##2#"2##""#2#223333UD xxCD""3#""##2###""3"##""3"DDgg##33""3"#3"#2"##33##2###""3"333333VFDC##"""##""""#2###""3""3""3"##33##2##3"#2"##""3""2"#23322D4xxUU"233""3"##""3#"2##3"#2"ggEE"2#"2##3"#2"#3#"##33""3""333##33""gV44"3""##"""2#"2##""##""3"##""3##2"#33##2#"2##""#2#223333UD xxCD""3#""##2###""3"##""3"DDgg##33""3"#3"#2"##33##2###""3"333333VFDC##"""##""""#2###""3""3""3"##33##2##3"#2"##""3""2"#23322D4xxUU"233""3"##""3#"2##3"#2"ggEE"2#"2##3"#2"#3#"##33""3""333""##"2EE44"2"""""2#"""##"2"#2##"""""2##3""3""3""3""3""3333322#"eUhw#433""##"2##""####""3##244xg33"3""3"#3"#2"33""3##2##3334""4433VVEE"2"""""##""""""##""""##""##""""3""3""33""3""3""3""3332232D4whEE"2##3"##""##"2#"##"2#"2#VWVV""3""3""3#33""3"33####2#"333""##"2EE44"2"""""2#"""##"2"#2##"""""2##3""3""3""3""3""3333322#"eUhw#433""##"2##""####""3##244xg33"3""3"#3"#2"33""3##2##3334""4433VVEE"2"""""##""""""##""""##""##""""3""3""33""3""3""3""3332232D4whEE"2##3"##""##"2#"##"2#"2#VWVV""3""3""3#33""3"33####2#"3##""3"#3D4DE"""""""""""2#"2#"2""##"""3""3""3""3""3""3""33""33333322gfhw#4""####""##""3"##""3""333ggC42"#2"#2"#2##2#33""###3##2#343444UUEE""""""""""3""3""3""2"#2###"""2#"233#2"#2"#2"#33233322DDxxUU"#####""##""##"2##""3##2ffUU"3""3"33""3""333""##"2#""3##""3"#3D4DE"""""""""""2#"2#"2""##"""3""3""3""3""3""3""33""33333322gfhw#4""####""##""3"##""3""333ggC42"#2"#2"#2##2#33""###3##2#343444UUEE""""""""""3""3""3""2"#2###"""2#"233#2"#2"#2"#33233322DDxxUU"#####""##""##"2##""3##2ffUU"3""3"33""3""333""##"2#""3""##"2434DD5"""""""3""3""3"""##""3""2"#2"#2233#23333""33""33323333UDxxCD##""##"2####"#"2###""33gVD42"33#2"#2"#233""3"##33##2##33334ggDD"2"""""2"#2"#2"""""#2#"2""""3""333"3""33""332233333323C4xgEE#3"###"2##"#"2###""3""3UUVV""33""3""3##2#"233##33##"3""##"2434DD5"""""""3""3""3"""##""3""2"#2"#2233#23333""33""33323333UDxxCD##""##"2####"#"2###""33gVD42"33#2"#2"#233""3"##33##2##33334ggDD"2"""""2"#2"#2"""""#2#"2""""3""333"3""33""332233333323C4xgEE#3"###"2##"#"2###""3""3UUVV""33""3""3##2#"233##33##""##""3"334444"#""""""""2"#""""""3""3""3""3""3""3""3"33""3233""3"DDggE43""3##"#"##"2#"##"2##""gV44"3""3"33""3""333""3"##""##33##33VV4C""""""""3""""2""""##""""3""3""3""3""3"33""33""3223""33gfgf"""##"33"""#"2#####"UEEE"2#"33""33""3"23""3"""""##""3"334444"#""""""""2"#""""""3""3""3""3""3""3""3"33""3233""3"DDggE43""3##"#"##"2#"##"2##""gV44"3""3"33""3""333""3"##""##33##33VV4C""""""""3""""2""""##""""3""3""3""3""3"33""33""3223""33gfgf"""##"33"""#"2#####"UEEE"2#"33""33""3"23""3"""##343444VVVWVV33##333##3##DD5D43D433E534EE3444DD#3DD#4CD#4CD44UUEEUUffggfgEE##343433DD3D34E4DD3DVFgggxFVC4DD4433DD3DE4DDFVEEEE4434EEUU44ffVF33DD44##33#3##43E5CD44DD44DD4E44DD3DD34343D43343E5DEEEVVfffgVWff##3#DD##DD4ED3EE#3DDEEVWwhgg443434C444DD4ED3EE4EE4EE#3434344VVVWVV33##333##3##DD5D43D433E534EE3444DD#3DD#4CD#4CD44UUEEUUffggfgEE##343433DD3D34E4DD3DVFgggxFVC4DD4433DD3DE4DDFVEEEE4434EEUU44ffVF33DD44##33#3##43E5CD44DD44DD4E44DD3DD34343D43343E5DEEEVVfffgVWff##3#DD##DD4ED3EE#3DDEEVWwhgg443434C444DD4ED3EE4EE4EEggxxgxggxxggggwwffgxgggxfgggUUggVFffVFfgVFVVffggffggggxyxxggggwwxxgxw wx xxxwwggxxxxxygxx xxxxygggg xx xxxxgxwwffxxxxxyggxxxxxxˆ ˆ ‰ ™xx xxxyˆ ˆxxffggggggffgxggxxfgggfgUUVVFVVFfgVFVVffVWggggggxxxxggwwggwwwwgxˆ ˆx xggxxggx xxxxxxxgxxxgxggxxx xwwxxggwwgxgxxxgxgxxxxx ˆ‰ ‰ ™xxggxxgxggxxggggwwffgxgggxfgggUUggVFffVFfgVFVVffggffggggxyxxggggwwxxgxw wx xxxwwggxxxxxygxx xxxxygggg xx xxxxgxwwffxxxxxyggxxxxxxˆ ˆ ‰ ™xx xxxyˆ ˆxxffggggggffgxggxxfgggfgUUVVFVVFfgVFVVffVWggggggxxxxggwwggwwwwgxˆ ˆx xggxxggx xxxxxxxgxxxgxggxxx xwwxxggwwgxgxxxgxgxxxxx ˆ‰ ‰ ™xx""#2#"2#""33"""##33VU"""""""""""""2"""""22334433"333"3""3""3""3#3233333433"333333333##2#"233""3"##33"3VFCD""""3"""##"""33""#2#"2##""3""33""EE33""""2""#""""""""""3333DD""3#33#2"#2"##""3#324333333333333333##2###33""3"#3"#33D3EE33##"""""##"2""3"#"2#"2"33"""##33VU"""""""""""""2"""""22334433"333"3""3""3""3#3233333433"333333333##2#"233""3"##33"3VFCD""""3"""##"""33""#2#"2##""3""33""EE33""""2""#""""""""""3333DD""3#33#2"#2"##""3#324333333333333333##2###33""3"#3"#33D3EE33##"""""##"2"""!"""""!""""33UD""""""""!"!!#"""2UE##"2"#""""3""##"2"#2"#2"#2"#2"##""""##"3""2"##""ff34"#"""2""#""2"#""!""!""!"""EE#3"""""!"""!"""!""DC44"""""""2""#"3""2"#2"#2"#2"#2"##""3"""##""""3""EEVV""""#"#""""#"!""""!""""33UD""""""""!"!!#"""2UE##"2"#""""3""##"2"#2"#2"#2"#2"##""""##"3""2"##""ff34"#"""2""#""2"#""!""!""!"""EE#3"""""!"""!"""!""DC44"""""""2""#"3""2"#2"#2"#2"#2"##""3"""##""""3""EEVV""""#"#"""""""!"""!"""""33D3""""!"!""!"!"""""!""EE"2""""""""""2""""##""##""3""3""3"####""##""""2"#2WV44""2"#"""#"##"""""""!!"""""DD#3!"""!""""!"!"!"""DC4D""""""""2"#2#"2"#2""##""3""3""##""##"3"""2##""DDVV##""""""""!""""""""!"!""33D3""""!"!""!"!"""""!""EE"2""""""""""2""""##""##""3""3""3"####""##""""2"#2WV44""2"#"""#"##"""""""!!"""""DD#3!"""!""""!"!"!"""DC4D""""""""2"#2#"2"#2""##""3""3""##""##"3"""2##""DDVV##""""""""!""!""!!"!"""""33EE"""""""""""""!""""""EE"2""""""""""""##""""##""##"2"#2#"#2#""""""3""3VW33""""""""3""""""""!!"!""""EE#3""""""""""""!""""""DD33"""""""""""""3"""""##"""""##"2"##""""""##""""EEVF"!"""#"!!""""""!"""!""33EE"""""""""""""!""""""EE"2""""""""""""##""""##""##"2"#2#"#2#""""""3""3VW33""""""""3""""""""!!"!""""EE#3""""""""""""!""""""DD33"""""""""""""3"""""##"""""##"2"##""""""##""""EEVF"!"""#"!!""!"!"!""!""""""VV""""""""""""""!""""""DC"""""""!"""""""##""##"""2#"##"""""""3"""2#"2#UU34"""""""""""!"!"""!"""""EE34"""""""""""""""""""33##""""""""""""""2##""""#2#"2""#""""""#""2"""""DDVF!"""""""""""""""!!"!!"""2VF"""!""""""""""!""""""DC"""""""!"""""""##""##"""2#"##"""""""3"""2#"2#UU34"""""""""""!"!"""!"""""EE34"""""""""""""""""""33##""""""""""""""2##""""#2#"2""#""""""#""2"""""DDVF!"""""""""""!"!!"!"!"!""#ff"""""!"""""!""""!2"#3""""!!""#"""2""""3""3""3""3""3""3""3""3""""""2#"##"2VF3#"""""""""""!!""!""!""!""UU33""""!""""!"!""""!"""33""""""3""""""2#"2#"3#"3"""##"2#"2#"2""#"2"#2##44EE!""""""!"""""""""!""""#ff"""""!"""""!""""!2"#3""""!!""#"""2""""3""3""3""3""3""3""3""3""""""2#"##"2VF3#"""""""""""!!""!""!""!""UU33""""!""""!"!""""!"""33""""""3""""""2#"2#"3#"3"""##"2#"2#"2""#"2"#2##44EE!""""""!"######""3###""""#3VFDC##3"##33333433##33##3333E4EE33#3##"""##"""""###"""##"""2"#2##"########UU##""""""""""##"2####34""""##EEUU#4##"3"3333#333##3333##DD4E4433##"""""2""""###"##""##"""2##"########EEED##3334"""#######""3###""""#3VFDC##3"##33333433##33##3333E4EE33#3##"""##"""""###"""##"""2"#2##"########UU##""""""""""##"2####34""""##EEUU#4##"3"3333#333##3333##DD4E4433##"""""2""""###"##""##"""2##"########EEED##3334"""#UgWVggVEEUFfhwggw ‰wxxxxxxxxxxfEVUFfFVUWUVEUU5EUFfWggggVggFUEEEUggEEEVgVVEEUVgxgfxw‰wxxxwxxxxxgVEEVEVVVUWVUEUE5UUWVgggggVgggwEUU54CD4eg3#"33##33"33334333#"23##3333UgfUgfVfgggfUWfgUTD4TVTUUUUUUUD3"33gD3#3#33"#3"33333333#"33"3#33DgfVfUgffggffVg ™WTDDDUUUTUUUUV""""4g"""""2""""!"""""Dg3"2#"3"33333Vf""#"""""2"#2"#2"333VD"!""2"""""""""2hC"#""3"43333DyC"""#""2""2#"23"#"3W"""""""""""""""""Dg3"#"43333343gV"3#"#"2#""333333"33V5"!""""!""""""""3gD#"3"4333434Dx#2###"2#"2#3"33#"4f"""""""""""""""""2Dg33#3#3334333gg""#"#3#3"#3#3434344VD""!"""""""""""#"""#gE33"4#333343Ug4"#""###3"4#3333#Dg""""""""""""""#"""4V433#3#334434UV"#""###"433434343WE""""""""""""""""2WD43#33"44"44Dx#"""3##33#43#""Dg""""""!"""!""""3fD43#43434333EE"3"#"##333"#33gD"""!"""!""""""""VDD3343443343Dg"""#""3"33#3#4g4#"#"""!""""""##""##3EV3#333#3#3###fg#3#"""#""33#3#"#"4gV#"""""""""#""#"3##4f4##3433"4##2Dy233""#""#"#"#gUgUfgfEVVEEEUEfEUEUEEUVEfVfgggfgfffFVD4EEU4UVEVgxgVfUfgggxfxxxxgfggfgfVFVEDUEEVVEEEUEUUEVVUgxffgfVgfFDDEEEEDVEVgxgfVgUgggxfgxwh""3""3""2#""#DE33""33""3""33VD3"3#"3#3#333334D334DD343DDEU3D3DD3333""3""#""#3V33"3"3"3""3"3UD3333#"2##3#334343D34DD3DD3DV4C#"3"#""""#""#Dg3"3"3333#33"4fD#"#""##"""#"#"#"##2""###24D"#"#"#""2"""""#"3gD"3"3"43333##VE3##""#"#2##2#"#3#"""##"3D3"""""""#"2"#"3DF""33333333#43V33#"#"322#"#"##2#"#"#"#"34#24#"#"""""#""#""4V3"33333333433DU3#""##""""#""#"##2##"##"#34"4"#""""""#""#"EV3333333334#DE4"##""#""#"###"#"##"#""##"#3D3"#3##"""""""""#"g"#3333333#33#UD###"#"""#""##2##"##""3#"#"E3##""#""""3#4V3333DD3DD#334V3"#"#"32#"#"#"##""#"#"#"4E"#2#"#2""""""#""4V423D3DD333#34V4"#""#"#"#"#"##"###""""#"23E4""""""""""3"4V33#4DD433""#UD"#"#""3"##""#"#"#"3#"3"3V""3#"##"""""""##"f43334DD3433"U3#"#"#2#"22#"#"#"""#""#"2E4"3"##3#""3"3#3##EU""#"DE3VU###3""#3"####""""##334WD444343##3"#3""###3V3""#"#DD3g###3""#####"##"""3#3#4VV#443gfgUVxfEfUEEFVffEEU4EVfVxxggggfggfgggfVfV xggfgfVUgxgggxgggggggggxgfFTUFU3EEEEVVfV5UD5fFggxggggfgfgfgxVfgVwxfgVgVVfxxVggggggggggg33333xF"""""#3"#3333#33333#2"33"33"fxC$333"33#3"3DyUDC3D433333333"#2"#e#"#""#"3"#33#333333#2#"3"333D xf333333333333fgDD4D33D33333""3#"gC##""#"""3#""#3"#23#"#"""2#3"U xE""#""3#"2#"4g3"2##2"#3##"2#"2#3"43"2""##""#"#"3"#2##2#""3"23DxV"#2"#"#"2#3"WE"3"##"#"#3"#"3#""V3#"#""#"#"""#"2#""3#"""2#332"Ux4""3"#"2##""3x3"#3"#3"3"#3#"#3343E#""""#""#"2##"#""3"#"""3"33"3xE"3"#"#"2#""3gV""3"#23#"3#""#"3"DE"""2""#2""#"""3""3""3"33332Uy2###"#"#"#"#3xC#"2#"2#"#3#"2##344D"""""""2#""""#"2#"2#"2#33"32DxV2#"#"##"#3#UW"2"#3#"2##2""3#"#ED2""2#"2"""3""23"3"3""3233UgD#"#""#"#"2#3g33""3"#23"#3#"#3#33V""""""3"""""3"""3""33"3"3332DxE"#"2##""#"2#UV"2#"2#"3"#2#"#"2344""#"""3"""#""3323""33323323Cx4"#"##"#"##"#g323"3""33""3#"2##2#E#"""22##""""2#3"3"333"233"3gf3""##"#"3"#EV"23"3"3"3""###3#4WU#""####3##43#434##3##3#3D4DVFfE"###3#3##4EVgE3###4344444D##3#4EV32####3#43#D343##3##3343EUUVf###3##33##DVgV#3#433434434gxgxxwgwggggggfgfVfgfFfggfxxgwgxxx ˆ ™wggxxxgyxxxwˆ ‰ wxwgxxxxgxˆ™ ‰™ ‰ xxxxxwhgggggggfgUfgVVgfgfgxwggwxwx ™wxgxgxwxxxxg x ™ xwyfgxxxxxx™ ‰™33"#33"3"3DE3"2#"2#"2""33D33D3#333333D3D3D3D3333333#3DED3"33#3#33333#3"3333ED""3""3""3""D4D3343#3334CD33433D333#333333DED"#33#3#!#!""3U""!"!"""V#"""""2"2#"2#"#"#"#""#""g#""""""2""!""E3"""""""DE3"#2"2#"2#""#""#""""#TF"""""""!""""3E""""""!""E3""23""2#2"#2#""#"""#"gC""""#""""""""T#""!""!""D3"""""""#"2##"2#"#"#""""#3DV#"""""!""!"2U"""""""2"U"""""""#"#"""3#""#"""3#U4""""""""""""E3"!"""""""D4"""""""""#""""##""""""#"DV3"""""""!""3V""""""""""4"""""""2"#""""#"""#""""g3"#""""""!!"""U#"""""""""""3#"""!#""#""#"""""""""""2DF"!#""!"!!""2U""""""""!#"2""#""""2#"2#"2#"2#"""#"#"U#""""""""!!""DD""""""""3"""""2"""3""3""32"""#""34E!!"""##"#"#"!$VC##""33#""3"#D34#""""#""#"""""2##2#"4gE##"3""#3#3##"""EE#"""3"#"2#"24D#3##""#"""#"""#"""#""###EU#"3"#VggVggFfEUFgxggfh wxxxgwxxxxxfgUFVVFfVVVVVFVUEEUFgggggx ™ ‰hwxxgfggxywwyfVFUEVVgxgfg wxxxxwxxgxxxfVEVFVVVVWVVVVEUEFVgVghgggggggxEVUED"DDUg3"#"323""3#33"333"""33""#3"UgUUWUfUgfVfVffgTDEDDDDUTEUUTDUUDDfV""3##33""#"3333333"#"#3""3"3DgfUfUgUgVgfVUg ˆgDDDDDTUUTUUDV"#"3g"""""2"""""""""2Dg3"#2"#3"3343VV"""""22#"2#3""3"VU"!""2""""""""""2hD""3""3333"4DxE""#"""22#"2#3""#DV""""!""""""""""""Dg3"#"43433333gV#3"#"2##2"#33"#34"VV"""""""!""""""""3gD"#243343343Ug3"3"#"2#"2#3"#3#"Dg""""""""""""""""""Dg33"3#33344"4fg""#"##23"#2#334"43EV""""""""""""#""""gE33"4#"43343Ug4"#"3"#3"433"433#Dg""""""""""""""""""4VD343"43"4334fV"#"#"##3#3443433VU""""""""""""2"""#e443#3#433333Dx#"#""###4#333#""Dg"""""#"""""""""!"4UDD3343344433fV"3"#"33333#"3VF""!"""!""""""""!""VE34333344334Dg"#"#"!3"3333#EgD##"""""""3#3#####3#EV3#334"#33#"3gg##3"#""#"3DDEDEEDgg33###""""""#"###3#3#DV433343##3###Dx#"333#""#"33#fVUWUgVVFVU3VEVfVEEUUEEVEFffgwffgUfgfEED5UEEEVUFwxgfffUggxgf xx ˆxxxwgUggEVUFDDVUfVEEEEEUVEfVfgwgfgfWUfVEDD5UEEEVEgwggffUgfgxgg wxg""#"2#""2"#""DE#2"#23""32"#3VD"#3#"3"#3"#3#3343343D343D3DV43DD33""""#2"#""#"3U433""3""3"2##ED3#3#"3#"##333#D343343D4343DV42#""2##""""#""Dg"3"33"333#3"4f4###"#""#2##""#"##"#"3##"4D""#""##"#""""""#""g42"#3"333333#VE3#"#""#"#2##"#"##22##"#3D3"#""""""""#""3DF""3#333333#43VD"#""#"#"##""#"##2##""###"34#24""#""""""#""""#4W#2333#33334#3ED#3#""##"""#""#"2##"3"###"2433"#"""""""#"#""4V""3333334333DF33"#""#""#""#3#""##"""##""4424"#""#"""#""23g#"23#343333#3E333#2#""2##"#"###"""3#"#"E3##"""""""""""DV333DD3D3D#3#EE3##""#22#""#"###""#"#"#"4D3"##"#"2""""""3V4333DD3D33#3#V43""##2##""#"###23""##"3E3##"""""""""#"4f#3334D433#33E""#""2""#2"#"#""23""#"4E"#"32""""""""##3V34334DD43#"3#U3#""#""#""##""#2##"#""##"2E4"3"#3#3""33#3####EU"""EC4gE##3##"#""#3######"""3#344WE4434##""""""####Df3"#"4C3Eg######""3########"""##344UV4443gUgUVxgEfDEEEVUgEEEDEVgfwxgggffgfgfyfffgVxgfgfgfVgxgfhwhfggfggggUgUVVEED4EDVUEfUEUEEEVffgxggffffgfggxfVfVhwgfgfgFfxyUhwgggggggfg333#3xT"#""#2#"#333#33333""3"#"323U xD3#33#3#"3"34xUC43343333#33433fV"""""#!#"##333##33333"##"3""33Dwf3333#33"#333fgD3334333#333""3#"gE"""""#"#"#"2#"#2##2#"#"2#"3"UxD"#"2#""3#"#3g3"#2#"3"#3#3#3""EV"!#""#""#""#"2##3"3""#"""233Dxf"#"2##"3"#3"fE""33"##"3"#3"3#""ED2""2#"""#""#"2#3""#"2#"33"Uy3"#2#"#"#"3"3x3"#2#"3#"3#"#33"VE""""""""#"""2#""#2#"2#""3"33"3xE#2"##""#"2#"gF2"#3""33"#3""#"#"E4"""""""#"""#"""3""3""3"33322Vx3#"#"#"#"#"23hC"#3""3#"2####3DEV"""""#"""#""#"""3"3""3"33332DxE"22#""###""fV"3""3#"2###""3#"4CE2"""3"""#2"#2"#33"3"3"3233Vw4""#"#""##"23WD2#"2#"23"#"3"33WV""""""3""""""#22323""3"3323Dgf"##"##""#"2#VV"2#"2#"3"#2#"#"24D3"""#""""""""""3""33""33223#2DxC#"##""#"##"#g3"3"3""3""3""3""VF!"!""2"""""""23223""332232"3gg2#"#"#"#"##DV"2#33"32"##"##3#EVV#######D3#D#343434##34#4DDEUWfE####3D#D#3VVgE#3#43D#44DE343ExxC43#"####3#4D334434#4#3#34D4EUffV###3#D#3#DEFgV34#34344D4D3gxxxxggggxgwgfgVgFfggVfggfgxggwxwxx ˆxggxxxgxxxxw xˆ xxgwg xywx xx ™‰ ™ ‰ ™ ‰ ™ ‰xxgggxggfggfVfgFfVggfgywgwgxwx ˆxxgwxxxxxxxgx ˆw xxgxxx xxxx™ ‰y3"##3"#3"#3U""3"""2#"""33E33333"#3333D3333343333333333VD3""#33#3"#233""3#"3U3"#2"""#2"33DD333##323333D333333#32433333DED""3#3#3"""!""2E"""!""""U#""""""#2"#2"#"#"2#""#"#"f#""3""""""""2D#""""!"""D5!""#"3"#"#"""3""#""""##"DE""""""""!""!3E"""!""""""E""""""""#"#"#""#2"#2""#"g4"2"#""""!"!"E#""!""""""D3""""""""#""#"2##"#"#"#23DW2""""""""""2U""""!!""2E2""""""#""""#2#""#"""""3V4"2"""""!"!"E#"""!"""""!D4"""""""##""""#"#"#"""2DV#!"!"""!"""V"""""""!""D""!""""#""#"""#""""""#"e$"""""!""!!""U3!"""""!""33"""32"#232#""23""DV"""""!"!!"""V!"""""""!"3"""#"""""2#"2#"2#"2"""#"2V3"""""""!"""E3""!"""""""3"""222#"2#"2#"22#"""3"4E""""#"##"#""3V4#"3"33""3#3"ED3#"""#"#""##""#"2###"##3ED""""""""""UV"#"323##"3"#D443"""#""""3""#""#""####EU#"#""#VggVggVUEFfgxgfgxxxxxwxxxgw xgfVFVVfVWfWgVVVFVUFfgggxgggggFf5gfVFVUEVfgUUEUUggxfggwxxwxwwwxgwxfVVVFffFgfgVVVVFUUFgggxggggxgg xVUVVD"33Dx"3""3#""""3"#2##3""""3#"#""3UgUVUUUWUfUWUUfgDDD3DTDTDUUUUfUDDUfE""#3"""""3""333#"3#""3"""3""DgfTUUUWUgUWUUg ‰eDD4CDDDTDUUDD32Df"#""!2"""""#"""""Dg3"#2"#333333VV3#""""#2"#2"#2"#2"D#""""!2""!""""""2hC"#2"#243333Dy4"""""22#"2#3#"#3W#"!""#"""""""""""Dg3"#3"4333434fV#3"#"22"#23333434D3"""""""""""""""""3gD##24"433343Ug4"#2#""3#"24"33#"DF3"""""""""""""#!""Dg333#34"33433gg""#"##24#3"#343444D3""""""""""""""#""3gE333#3433343Ug3#""##3#"33#3333#Dg3""""""""""""""23g34"4#3433434UV"""#2#"#3444D43E4"""!"""""""""""2"WD433"4"43434Dx#"#""2##3##D3#""Dg"""""#""""""""""Cf443334343433EE""#""""##D34343ED!"!"""""!""#""""VD34434343443Dg"""#"""3"333#3EgE##2#""""3"23###3#334UF3##33433###"gg23###"#3"43DEDEDEgV33###3"""#"""###3##3#43EVE3#33#33##2#Dy#"34"##3""3433ffVUUgUEVUEEEDVgEVDEEVDVUFefggfgVfUgVUD4VEEEVFEVxgwgfgUxgxgxgxwxgggffffEfUEE3VEgVEU4EVEUVDgVfxffffUgUVDEEEEEUFEVgxggffVfhwhwhwgg2""#2""""#"DE3""3""3""3""3VD3#"3"#"#"2##33334333343433DE333"#2""#""#"#""#"3V32#"2#"2#"2#"UD3#"#"2#"2##3#33343333443334UD"#""""##"""#"2Dg#23"3"3333##3g4"##"##""#"#"#"#"##2#"#"#24D"4"#"2#2""2""33fD#23"33333#3#VE3"##""#22#"#"#"#"#"3##"2D#2""""#""2"#"3EV23333333343#VD"#"#2"#2#"##2##"##""##"#34#2##"#""""""#"""#3W"#333"3333343ED##2##""####""#"#3##""##"#2D#24""2"2#""##DE""3333333#333E4"#""#""#"##"#"#"##"""#"#"3424#"#2#"""""233W#2"33333334#"UD#"22322#"#"##3#""##"33D#4"""""#""2""4V333DD3DD43#33E3"##""233"#"###""""##"#3E3"###"#""""#"#""#VD333D3DD333#4V3###""#"3####""###""#"#"#"E42""""""""#"4V33#34D4332ED##""#""""#2"#"#"""#""##""4V""#"##"""""""""""4EE3#34C434""#3U3"#""#""223""##""#"#""#3E4"2"#333"#333####3UE"#"#DU5gU##3###2#C##3####"#"33444VE4DE#3##"#""###3#3g3""##DU4DV##3#3#"2"##3#####233#343VF444DgUgUVxgDVDUEEfVUEUEEUVffhwfgfffgfgU xgfgffxgfWfgUfgxxggggggggggfgfVVgEEEUEFfEEVVUVEUVDVfWfxgfggfgfgfgyfgfVwxfgfgfVfxyggxgggggfggg3"3"3xU2"#2#"23#3#"33333"#"2#"23"U xE"#2##2"#3""4ˆDD333333"33#33"Dg"#"2##""#"2#"#3#"3#333"#"#"2#"33‡F3#"3"#2"#"33VgD333D#3"33"3""3#3VD"#""""3#"#""#3"4"#2#""#"#233UxC#"3""3#"#"43g3#"3#"3#3"##3""DV#""#"""#""#"#"2##3"#3#"2#"""2333xf"#"#2##"#2"#gE"2#"#3"#3#"2"3#""ED""""""#"""#""#"2#"3"#"2#"32#Ux#2#"#"#"#"33‰3""3#"23#"#3"#"EV"""#!#""#""""#""#"23""3#""332"DxE"#2#""#"#"3"fV""3#"33""3##"3#"#E4#"""""3""#""#"""33""3""33232gg3##"#"#""#"23x4""3"3""3#"#3##DV""""""""3"#"""##"2#"3""3"23#32DxE""#"#"#"#"2#fV""3""3""3##""3#""ED"""22#""""3""3"33"3"3"3332Ux4""#""##"#"33g323""3"3""#3"#2Eg""""2"#""""""2#""323"3"3"323Dgf"#"#""##"#"2VV"2#"3""3"#2##"""4DD""""""3"#"""3"3""3"3"32#"DxD"##""#""##"2V4"#23""33""3#""Dg"""""""2""""#"""3"23""3"3232"3gV"#"#"##""#2EE"23""33"3""#343EVV######3D#4C4D434D#D#3434DEUVWfE###3DD#D3DFfgE3434C$4DE4EEEEfyC44D####3#4C43434D4434#343D4EEUgfV##4#3D#3D35fgg#4343E#E4EE3gxxgxxgggwgwggfWVfVffFfggfgxxgwwxg ˆwxgxxxxgyxxwg x ™xgwgxxxxwywš ‰ ™x ‰ ™ ‰wxgwggwggfgVfVVgfVFfggwxgxwgwwx ˆxxgwxxgy xxygw ˆxwxgxxxxxxw ™ ‰x""3"#"2#"33V""""""""#""234333#3"#3"433333333"3#"3#3333EE2""##33""3"#2#"2##DD""2222#D3D#3#33#3"4333333333"#33#3"#3DE3""#2#""""""""3E""!"!"!#"U"#""""#"2#"2#""""3#"2##"g3""22"""!"""D#""!"""""D4""""2"""#"2#"""#"223""TE"""""""""""3D"""!""!!"E"""""""#2""#"#""3"##""#"""#f42""#"!"""!""E#""!""""""DD"2"""#""#"#""3"#""#"""#"DV"""#"""""!""3E""!"""!"""E"""""22##""""#""""""3"W3"""""""""!""E#""""!""3D3""""2"#"#"""#"""""""#CV"""!!""!"""V"""""""!#!"D""""""""#"""""#"""#"""#2U4""""""""""""U3""""""""""33""!""""#"""""#"""2""2#4V"""""""!""!#U""""""""""3"""32"""3""3""3""32"""#"V3"""!""!""!"U3""""""""!##"!"2"""3""3""3""""""""3#3E"""!##334#####4gE""#"2##"#""#ED##3"32"###"##"#"43#34#4VE##3#3##4##2#44####3VF3#""#"#"""#"4U3#3#2"#"""##"#3"#"4#34#3VV#3##3###fggggxgFEVggwgfUgxwgxfxgwggwgfEfVFfWggVgWVgVFVVggxgxgxgxxgxxyxyxggggWVgVEVVghggfggwxgxggwgggxgDfFVVgggggVWVgVVFgggxgygggyxgygggg3"33Eg""""""""23""3""3""3"""#"2UgFTUFUUVUWUVUWVT44DD3DDDDDDDDDEDV3#""""#""2"""""3""3#"3"""""#3xVDUTVVUUWUUUW ˆgD334DDDDDTDDD3#"4W"""""2"""""""#!"3Cg#2#""3333333gf#""""""22#"2#3"#34""#"!""2""""!""""2hD""3""4"3433UgD""#""""""#2"#3#""DF3""""""""""""""""Dg3"#243#34343fV#"3#""#""3""4"33"#D2"""""""""""""""""3gD"##"4333434Dx#2#"##2#"24""43#"Dg""""""""""""2"""Dg433"4#333343gV"#""##3#"3#"4434"4D2""""##"""3""3""""hE24"#4"3344"Uy3"#"2###3"43"4332Dg""""""""""""""""#3W3334#"433433VV"""#"##2##344#DE""""""""""""""""""g4C43"4#33434Dg#2""#""#D##D33#Dg"""!""!"!"""#!!"4V3D3433443343U5""#""""#3#3333DE""""!""""#"""""""VD43434433443Dg##"#""3"#33#4EgE3###"#"""3""#"3##3#3#4C4VFD333#3#3#3##xg3#3##3#"3DD#EEDEggED34###2""2#"##33#33#E3EVE##343"434##Cy3"34#"##3#3334ffVUVfV4fEEEDEEgVEEDEUVDEVfUghffVVfUfEEDEEEUVFVUgwgggfffgwxgxxxfhfVffgVEEVUDDUEfVVEDVEEUTEVfgggfVfVUgTE4EUEEEEVVggwggfUggxgxg wxg#""""#""#"""DU"3""3""3""3"4V33#3#"#"#""3#"33333333343334E3"33#"""""2#"""#""3V3""3""3""3""3UD3#3#"#"#"2##3#3333333433334V3""""2#2""""""#DV4""33#33333#3g3#332#2#"2#"##2#"2###"3423##"2#"#""""""33VD"3"33333#33#VD3##"##""#"##"#"##2#""##"3D3"#"""""2""##"EE"2333333333#3VD"#""#""#"#"#"#"##23###"#"443"3##2##"""3""##3V#"33333333333EE#2#""""##"#"#"#"#"##"##"#2D#2##""""""""#"""DV"23333333#434V3#"##""2#"##"#"###"#"##"#3E#"#"3#""#""""2##g#23"3333333#3VD####""23##"#"##3#2###"2E#2#"""""""2"#DV33D3DD3DD#3#DE#"#"2""##""##"###""#""#"#"3E"4#"#2"""""#""2#VD33DD3DD34#3#V33#"#2#"""##"#"##""""#"#3E4"""""""""""#"4V33##4D333#"DE"#""2#"""#"#"#"#"""2#""4f#"2#"#"#"2"""#""3V43"#44433"""#V2#"""#"""#2"#"#"#"""#"#"2E4"3"3#3D33333#3#4UE""##"#UE5UV3##33##"#33##3###3#####344ChE4E44443##3"###3##EgD""#3DV4EfD#3##33#3#3##3#####333444UWD4E4gUgUVwgDVDEUEUVUEEEEEfVggwfUgUggfgfgxffgfggggfgfVg xxggxggggfgggfVgVfxU4EDUDEEEfUV3VEEVUgggfVgUfgfgfgyfgfVgxgfgfgVf xxggxggggfgfgf"3""3xU2""#"2###33#3#"32#"""3""3"Uy4"3""3""#"2#3xD3333333#3#"33"33gD!#"""2"#"2#3#"#3"33#"#""#"2#DxV"#23""#"2#"3VfD333333#"3"3"3#3"W4""#"""##"#""#"3"#3#"2#""#233U xC"#"#2#""#"2Dg#3""3#"#3#"#"2333V4"""#"""##"2#"2#3#"3"##"22"32DxU"3""#"32##2gE""3#"2###3"""3"#"E4"#"""""#"""#"""3"#2"#2"#332"Vw#3"#"#"##"3"4x3""3#"23"#2#33"43VE""""#"""#""#"#"""3"3""3""3322DhE"3"#"#"2#""3VV""3"#3""3##""#"2#DE""""""2#""#"""3""3""3"3"3332gg3###"#""#"2#3gD""3""3#3"##3"434UE"""2"#2"""#"#"""#32"#2"3332DxU"##"#"#"#"3"fU"3"3""33"#"2"3#"4C5"""""3"""#"22#"23#33"3"3233UxC#"#"##""##"3g333""3"3""#3#"333gD""""2"#2"""#"""2#3"23"323332DgE#2#"#""##"2#UV"3""3#"23#3#"#""344""2"2"""2#"2#"2#"23"23""DgE""#""#"2#"#"g4""33""33""#"#3#3VD""""""""""#"""3""3""3"3"23"3gf2#3"""###"EE"23"3""3""##344VVV3#3#3#DE#D3E#E34D3D#D3D4UEUfgfE#343DD#ED3VghVCD43DD4DVEE43EU4fV3D4#3#345C4D4DE4D3D34C$3EEEVffWf##D#DE3E3DEVxg434D4D4DE4EEgxggxggwfgghfgUgVfFfVVfgfggxxggwxg wxxwgxxxh xxxgg xxxgwfxxxgxxxˆ ‰x xxˆxfgggfggxfggUVVFfVVfVgggxxgwgwwg ˆxgxg xxxxgxwgxxwxgwgxxgxxx ˆ ‰x""#"23"33U"""""""""""2343"33""3"#23333#3333#"23""#3"VD"2"#""3""#"#"23"E3""""""""""33D"#32#"#"3243333333#"#3""3#3D43#"""#""""""!"3U"""""#""U#""""3#"""3""3"#""#""#"#"f33""#""""""!""E#""""""""D4""""""#""#"2#"2##"2"#""3EV""""""!""""3D""!"!""""E"""""""""#"#""3""##"#""3"W4"""""##"3!"!"D#"""""""#"D3""""322#"#""3"#"#""""#"DV#""""""""!""3E""""""""""E"""""""#""#"#"""#"#"""2#V3"""""""""!!""E#""""""!"""D3"""""""""#"""#""#"""#""EV!"#""!""""""V"!"""""!"""D"""""""#"#""""#"""2"3"U4""""""!""!"E3""!#""""""3#""!""""#"""#""""""#""""DV""2"""!"!""f!"""""""!##"""""""""2#"2#"2#"2#""""2#"V#"""""""""""""U3""!"""""!#3#!"2""""#2#"""#"2#"""""##4E!""""###"##""#VD#"#3333#3#33E433#"#"""#""#"2"#"####U#""""2#"##3#!#EU3#233#3#33#DE43#""2""##"#""#"####EE#33"#EUg4DEEEUVUVUUEDDVVVVfFVfVUVVUUVD4VE4DEEUVUUVUU4DVVVVfFVgfVUVfUE""E"""""""""V"3#333V"#"""3#2#D3"""""""E3#2333V3"#"2#23"U"""""""""U4#3334V"#"##3443E3""""""""E43#334V3""##33#"V#"""""""#U33433#V"#"""#3##U4"""""""#"E43343#V"#"""#"DDE4D34UD44DDDVUDE43D4EDVEUUVUVfEUD4D43ED4D4DDVUEDD444DEUUEUUVUE"#"""#E"3333#E3#"#""#"##"##33#"#""""#"E3"333#D4#"#""#"#"#"#"4""""""#"E333343E3"#""##"#""#"34#"#""""#D#3333353#""#"##"#""#"E"""#"""#"E3"#3#3U#"#"#"##""##3E#3##"""##D3##3#3D##"""#"#""##3E3#EDVED35DD4DEUEEDUUfEEUEDEwEVUEUEED3U#44DD4DEUEEDEUgEUEEDEwUVEUEU"3D3"""#"#"3#""3"DV""#2#3E2##2##2#34"""#"#"3"#"2#3g"#"3"#V"3"#3""#34""""""#2#2#23DV"#"#"3V""3"#3"#4D""""""#"2#2#33g""#"#2V"2#2#"#344""#3"#33#3#33EV"##3#4U#3#334"335""####33#3#33Df#"#3#3V3#333#UEUUEVEDDEDEUUVUVfUUVVUVVUUfUUVfVUVEUUEDEDDEUVUUUVfUVVUVVUUVVUVf"""D""""4"""""#""#"#""U""""""3#"""3#"""""#"2#"""#U""""""D"""""3"""""""#""""#E"""""""3#""""""#"""""#""#""""E"""""""D""""""3#"""""#""#""##U""#"""34"""""3#"""""#"""#""#E"""EUg4DEEDUVUUEUE4DVVVVfUVgVVgffVffVfD4EEDUUVUEUED4VVfVVVVgfVUVfUE""U"""""""""V"3#333W"""#"3"3#U""""""""E3#3333f3"#""3"3V"""""""""U4#3343V#"#"#3343V""""""""E43#333V3"###333#V#""""""#"#E33343#f3""#3443g"""""""#"#D433#43V"#"#"#"DDD443DED4D4DDVDEED444DEUUEUUVVfUED4D43UD44DDDVUEDD44D4EUEUEUVUE""""#"U#2333#E3#"#"#"##"#"#33#"#"""""#E3"333#D4"#""#"#"#"#"#33""""#"E"3D333E3#""#"#"#""#"34#"#""""#D33343343#"#""#"##""#"D#"#""#"#U#"##33E#"#""#"##""##3E3##"""##E3"#3#3E#"#""##"#"#"#3E3#EDVED34DD4DEUEDEDVfEEEDEEwUUEUEEEUE334D4D4DEUEDDEUgDEEDEDxEUEUEE"343""#"#"#2#"#23DV"#"3"3V"#2##3#D3"2"#"#"3"#2"33g"#"#2#V"3"#2#"#34"""""#"2#2#32DV"#"#"3U"3"3"#3E4"""""#"""3"3"33g""#"#"V2#"3#"#3D4"#"3##33#3#3DDV"#33#DF3#33333EE"#"##2#33#3#34Df##3#34V#3#33#UEUEEeEDDEDEUUEUUVUUVVUUVUUVUUVfVfUEEVDEDDDEEVUEUVUUVUVUVUUVUUVV"""4"""""3#""""#"#""#"#U""""""3""""""#3""""#""3"""#E"""""!""4""""""3"""""#""""""#E"""""32""""""#""""""#""""""E"""""""D#"""""3#"""""#"""#"#"E"""""34"""""3#"""""#""#""#"E#"EEfD4EDEUUUUEUD4DVVVVVVVgUVUVEfUUEf4DDEDEUUUUEDD4VfVVVVUhfUVVfUU#"U""""""""V#2#333V#""#2#2#33"""""""""E3#2333V3#""#2#3U"""""""""U33#343V"#"##3444D""""""""E43#334V3"###333#V#""""""#"#"#U4334#3V"#"#"3D4DE#""""""""#"#E43343#V"##""#3DDD4343V43D4DDVEDD4444DEUUEUUVUEEDD4D34ED34D4DUUDDD344DEUUEEUVUE""""#"V"3333#E3#"#"#"##"#"#33#"#"""""#E33"33344#"#"#"#"#"##"D"""""#"E234333D##""#"#"##""#34##""""#"E33333443#""#"#"##""##D""#""###U#"#3#4U##"#"####""#34E33#"""#"E3##3#3E##"#"##"##""#3E3#EDVE34DD4D4UEDDEDUgDEEDDEwEUEUEEDV444D4D4D4EUDEDEUgEEDEDEgUUEUEE"#D3""""#"#2#"#"3DV"#"3"3V"#2##3"U"""#"""#"3#2#"33g"#"#2#V"3"#3""343"""""#"2#2#23DV"#""#3U#"3"#2#V""""#"""#2#2333g""#"#"V2"3"#"#3E4"#"3#3#33#33DEU##3334V#333443g#3"##3"3333#334Dg##3#34V3#334#EUEEUVDDD4DEUUEUUUUVUVUEVUUVUUVVUVUEEUEDD5DDEVUUUUVUUVUEUUUVUUUV"""3"""""3#""""#""3""#"E""""""3"""""3#"""""#""#""#"E"""!""D""""""3"""""""#"""""E""""""3#"""""#""""#""""""""E""""#"""E#"""""3#""""#"#"#2#3#E"#"#""#""43"""""#3""""#"#"#"#3#E"#"#EUg4DDEDEUEEDUD4DVfVVVVVgVVUVffVVVD5DDEDEUEEEDED4VVfVVVVwWUVfVVU3"E"""""""""U#2#333g"#"""#2#3#""""""""""E3#2343V3"#""3"#"V"""""""""U43#333W""##"#3433""""""""ED#3#34V3"#"#333#V3""#""""#"#"3E433$33V"###"344ED#"#""""#"#"3E43343#f##"#"#3D4D3443U43D4DDVEDD434D4DUEUDVVUEDDE4434UD34D3EUUD4D444DDEUEEUVUD"""#"U#2#333E3#"#"#"##"#"#33##2#"""#D3#33334D"#""#"#"##"#"D"#""""#"E243333E#"#"#"#"##"#"34##""""#"E333433E3#""#"#"##""#"E""#"#2##E#"3#43E#3#"3###"##33E433#""###E3"##34E3##"#"####"#3#U3#EDVD443D44DEUDDEDUgDEEDDEgUEUEEDEDV3434D44DDEDDEDEgEDEEDDgUUEEDE"343"""#"#"3"#2#2DV"#"#"3V"#2##2#3U""""#""#2#"3"33f#"#"3"V"#2#3"#"43"""2#""2#2#23DV"#"#"3U#"3"#3#3U"""""#"""3"3233g"#"#"#e#2#2#"#3E4#"3#33333334DEV"3333EV33334434U##2#3#33333#4DDg"#3334V333343EEETEVDD4D4DUUEUEUUUVUVDUEUfEEUUVUDEEUED4D4DEUVDUUEUVUUEUUEVUEUV"""C""""3#"""#""3"#""#E"""#"""3#"!""3#""""#""#"#""#U""""""4""""""3"""""#""""""#D"""""!"3#"""""#"""""#"""""#"E"""""""D#""3""43"""""#""""#"#D""""""43""#""33#""""#""#""#"E3"4D#4D343EDDEU4DD3E#3D434DDEDV4DD"D""""43334#"335""""4333E"##33#D343E33344DDD43#D343E333444D4""#4#334"#"#"#4#"#"43334"#"#"#4"4D33344CDE43U4D43D#33443DU43U4D4"4""#2#33D##D#3#34""#2#33E"#D#3#43D333D4D4DD4EC4D44333D4DD4D4ED4"3"""#"""""#4"""#"""#"""""#3"4D343433EDDEUDDDED#43433DEDEV4DD#D""""4333E"#344"""""4333E"##33#D334D433444DD43#D343E333444D4""#4#334"#"#"#43"""43334"#"#"#4"4D333443DE4CED44D3#33443DU43U4D4"4"#"3#3D4#3D#3#D3"#"3#33E"#E2#343D333D44DD4DE4D43D333D44DD4DE3D""#"""3""#""4""""#""3"""#"4"4D#34343DEDEU4DD4D#34343DDEDV4DD#D""""43344"#343"""""4334D#"33#3D334E333444DD43#D334D43#4D4D4""#4"344"#"#"#43"#33334#"#"#"4#4D333443DE34U4D4D3#33434DU43U4D4"4"#2#33D4#3D#33E""#"3#33E#3D#3#43D333D44D4D4E3D43D33#D44D4D4D4D""3"""#"""#"#4""""#"""#"""#""4""4D#34333EDEDV4DDE3#33433DEDEV4DD#D"""""4333E"#343"""""4334D#"33#34334E333444DD3#34334E33#344D4""#43334#"##"#D##""43334#"##"#434D#33434DE34U4D34D#33343DU43ED43"4"3"333D43#E33334"3#3333E#3E"3343D#33D34D4D4D4433433#D34D4D4D44"3"""#"""#""4"""#"""3"""#""4"4"3#D4D34#3#D4D3"4343#3433343#344333D3D34#33D3D3#3"33343#3"333434"3#D4D4D"#34D43"4343#34#3343#344333D3D34#33D343#3#33343#3"333434"3#D4D34#3#D4D3#3343#34#3343#343333D3443333D343#3"33343#3"333434"3#D4D43##34D43#3343#3433343#343333D3D44233D3D3#3"3334#33"3334##33433343334333433343334#3343334333433343334333433433343#334333433343334#334333433333 \ No newline at end of file diff --git a/glide2x/cvg/glide/tests/argb8332.3df b/glide2x/cvg/glide/tests/argb8332.3df deleted file mode 100644 index 7db16f7..0000000 Binary files a/glide2x/cvg/glide/tests/argb8332.3df and /dev/null differ diff --git a/glide2x/cvg/glide/tests/argb8888.3df b/glide2x/cvg/glide/tests/argb8888.3df deleted file mode 100644 index a6a47df..0000000 Binary files a/glide2x/cvg/glide/tests/argb8888.3df and /dev/null differ diff --git a/glide2x/cvg/glide/tests/ayiq.3df b/glide2x/cvg/glide/tests/ayiq.3df deleted file mode 100644 index a6aac0d..0000000 Binary files a/glide2x/cvg/glide/tests/ayiq.3df and /dev/null differ diff --git a/glide2x/cvg/glide/tests/cmp.bat b/glide2x/cvg/glide/tests/cmp.bat deleted file mode 100644 index 7b481d9..0000000 --- a/glide2x/cvg/glide/tests/cmp.bat +++ /dev/null @@ -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 diff --git a/glide2x/cvg/glide/tests/decal1.3df b/glide2x/cvg/glide/tests/decal1.3df deleted file mode 100644 index f999d3f..0000000 Binary files a/glide2x/cvg/glide/tests/decal1.3df and /dev/null differ diff --git a/glide2x/cvg/glide/tests/display.c b/glide2x/cvg/glide/tests/display.c deleted file mode 100644 index 3862bbe..0000000 --- a/glide2x/cvg/glide/tests/display.c +++ /dev/null @@ -1,442 +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 -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#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 -r -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 " -}; - - -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; - - static void imageConvert( void *dst, - void *src, - GrLfbSrcFmt_t format, - FxU32 *bpp ); - - 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; -} - - - diff --git a/glide2x/cvg/glide/tests/h3dtst01.c b/glide2x/cvg/glide/tests/h3dtst01.c deleted file mode 100644 index 066b624..0000000 --- a/glide2x/cvg/glide/tests/h3dtst01.c +++ /dev/null @@ -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 -#endif - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include - -#include -#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); -} - diff --git a/glide2x/cvg/glide/tests/h3dtst02.c b/glide2x/cvg/glide/tests/h3dtst02.c deleted file mode 100644 index f8bbbe3..0000000 --- a/glide2x/cvg/glide/tests/h3dtst02.c +++ /dev/null @@ -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 -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#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 -r "; - -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); -} - - - - diff --git a/glide2x/cvg/glide/tests/lava.3df b/glide2x/cvg/glide/tests/lava.3df deleted file mode 100644 index f6aef2e..0000000 Binary files a/glide2x/cvg/glide/tests/lava.3df and /dev/null differ diff --git a/glide2x/cvg/glide/tests/light.3df b/glide2x/cvg/glide/tests/light.3df deleted file mode 100644 index aef8c8b..0000000 --- a/glide2x/cvg/glide/tests/light.3df +++ /dev/null @@ -1,5 +0,0 @@ -3df v1.1 -rgb565 -lod range: 1 64 -aspect ratio: 1 1 -9çAèB(B(JIJiJiJiJiZËZËRªRŠJIB(B9çBBB9Ç9Ç1¦1¦9ÇB9ç9Ç9çJIRŠRªZËZËZËRªJIBB(B9Ç1¦9Ç9ç9ç9Ç9ç9Ç9çBJIJiRŠRªZËRªRªZËc [ ZËRªJiJiAèB(B(JIJIJiJiRjJiRªRŠRªRªRŠRŠRŠJiJiJIB(J)9ç9Ç9ÇBB(BB(JiZëk-kmkmc,ZëZËRŠJiJIB9Ç1Æ9§9Ç9Ç9Ç:Aè9çB(JIJiJiRjRŠRŠRŠRŠRŠRŠRŠRŠJiJiBB(B(B(B(B(JIJIJIJiJiRjJiRŠJiRŠRŠJIBBBB9ç9çAèB(JIJiZËc,kms®s®kMc c ZËRŠJIB9Ç1¦1¦1†1†1¦9§1¦AèBBBBB(B(J)B(B(BB(JIB(J)JIBB9çB9Ç9Ç9çBB(B(J)BBJIJIJIB(Aè1Æ9§9ç1¦9Ç9Ç9çJIJiZËc kMkm{Ï{ïsŽkmkMc,ZËJiB9Ç1¦1f)…1f)E)e)e1†9Ç1¦1†1¦Aè9çAè9Ç1¦1†9Ç9çAè:B1¦9Ç9Ç9Ç1¦1†1¦1¦9çBB9Ç1¦AèB9ç9§)e)E)e1f)e)e1†9çJiZ«Zëc c,km{Ï{ïsŽsŽsŽkMZëRªB(9§)e1f!$!$!!$)%)E)E!$!)%1¦9ç9§1†!$)%)E1¦9Ç1¦1¦1†1†1†1†1†)e)E)E1†9Ç9Ç1†)…1†1†)e)E!$!$)%)E!$)E1†BRŠZËZëc c,sŽ„„s®sŽsŽkMZëRŠB(9§)e!$!$!!!!$!$!!!!)e1¦1†)E!!!$1†1†1†)e1†)E)E)E)E)E!$!)E)e1f)e1f)E!D!$!!$)%)E)E!$)e1†B(RŠZëk-kmkm„œÓ”’{ïsŽs®s®c,RŠJI9Ç)e!!!$!!$)%!$!!!!)E)e)E!!!!$1f)e1f)e!$!$!!$!!ã!!!!$)%!$!$!!ã!!$)E)e)E)E1†BRªc,sns®{ÏŒq¥4¥4Œq{ï„0„0s®ZëJI9ç)e!$!!!!!$)%!!!!!!$!ã ä!)E)e)E)e)E!ã!!ã äãã äã äã äãã äãã!!$)E)E!$1†JIZëkmsŽkm{Ï”’¥¥4”’„0ŒQ”’ŒQs®ZËB)e!$ äã ä!!$! ä äã äã äãã ä!$)%)E)E!$ã äãã äãã äãã äãã äãã äãã!!!!1¦Jic kmsŽsŽ{­u­U”ÒŒ1„0Œq”²ŒqkmJI1†!ãã äã!ã äãã äãã äãã äã!!$!$!ã äãã äãã äãã äãã äãã äãã äãã!9§ZËkmsŽs®„”²µ–ƾ­uŒq„„0œÓœÓ{ÏJi1f!ãã äã äãã äãã äãã äãã äã!!!ã äãã äãã äãã äãã äãã äãã äãã!9Çc,ƒð{Ï„0¥µÖÆ8ÎYÎy½×œÓ„0„0”²”’sŽJI1†!ãã äã äã äãã äãã äãã äãã!ã äã äãã äãã äãã äãã äãã äãã äãã!$J)sŽ„0ŒQ¥½÷Æ8Æ8ÎyÎYÆ8µv”²ŒQŒqŒQs®Ji1†)Eã äã!!ã äãã äãã äãã äã äã äãã äãã äãã äãã äãã äãã äãã äãã)EJIc s®ŒQ­uÆÆ8½÷½÷Æ8ÎyÎYµ–”²Œq”’{ïRª9§)Eã ä!!$!ãã äãã äãã äãã äã!ã äã äãã äãã äãã äãã äãã äãã äãã)%9ÇJic „0­uÆÆµ¶­u½×ÎYÎyÆ”²œ³„0ZË9Ç!$!!!!$!ãã äã äãã äãã äãã äããã äãã äãã äãã äãã äãã äãã äãã!9ÇJIc „¥4½÷ƾ½·µÖÆÎY¾­U¥4­UŒ‘c 9Ç)E!ã ä!!ã äã!!!ã äãã äãã äããã äãã äãã äãã äãã äãã äãã äãã!9çZË{ÏŒq­U¾ÎYÎyÖšÆXƽ÷½×µ¶½×µÖœÓc,B)eã äãã äã äãã äã!$!ã äãã äãã äã äãã äãã äãã äãã äãã äãã äãã!BkM”’¥T½÷Æ8ÎYÖšÖÚÖºÆ8µ¶µ¶½×½÷½×œósŽJI1†ãã äãã äãã äãã!!ã äãã äãã äã äãã äãã äãã äãã äãã äãã äãã)%BkM”’µ–ÆÆXÎYΙֺֺÆ8µ¶µ–µ–µ¶­UŒ‘s®RŠ1†ãã äãã äã äãã ä!! äãã äã äã äãã äãã äãã äãã äãã äãã äãã!$9ÇZëŒ1¥T½÷ÆÎYΙֺÎy½÷½×µ¶­uœó”²„0kmRŠ)e!!!!!!$!)%!$!$!$!$!$!$!!$!$!!$!$)%ã äãã äãã äãã äãã äãã äãã äãã!1¦RŠ„¥µ–µÖ½÷ÎYÎyÎY½÷½÷Æ­•”²ŒQ|s®bì9Ç)E)E)e1¦1†1†1†1¦1¦1†1¦9§1†)…1†1¦1†1†1†)e1f ä!!!!!)E!$!!!!$)%!$)E)E)e)%!!$)E1†1†1¦ZëŒQ­U­•­uµ¶Æ8֚ΙÎYÎYÆXµ¶œó”’”’”²„0ZëB9çB(J)BBBJiRŠRªZËZËRªJIB(BB(B9ç9ç9Ç!$)E)e)E1†9ÇB(B(Aè9Ç1¦J)B(JIJiRªRŠB9Ç9çJIRŠRªc s®œó½×µ¶¥4­uÎyÖºÞÛÖºÖšÆX½÷½×µ–µ–­u¥4„0c c kmkmZëZËZËc,s®ŒQ”’ŒQ„s®sŽkMc RªRªZ«ZË9çBB(JIRŠZëc,kMkMc c s®„s®kms®{Ï{ïs®s®{¯„ŒQ„0œÓµ–½÷µ¶­U½×ΙÞÛÞûÞÛÖºÆ8Æ8ÎYÎyÆ8µ¶¥ŒQ{ïŒqœó”’{ïsŽs®„0¥­uµ¶­Uœó”²œÓ”²Œq„0s®{Ï{ÏRŠZëc,kMs®{Ï{Ï{Ï„|ŒQœÓœÓŒQ{Ï„0œÓ¥4¥4œÓ”’œÓœó¥4µ¶Æ½÷µ¶½×Æ8ÖºÞÛÞÛÖÚÖºÎyÎyÖšÖºÎyµ¶”²Œq¥µ¶½×¥4”’ŒqŒq¥µ¶Æ½÷½×¥T¥¥4­u­u¥4”²ŒQŒQc,sŽ{ï„0ŒQŒqŒQ„0”’”Ò¥¥4¥4œóœÓœÓ¥4µ–µ–¥4”’”’¥µ¶ÆÆ8½÷½÷ÎYÖšÖÚÞÛÞÛÖÚÖºÞÛÖºÖºÖšÎy½÷­U­uÆ8ÎyÆ­u¥4­U¥4­u½÷½÷½÷½÷µ–¥4­U­•½×µ–¥T”²”’sŽ„„0ŒQ”²œÓœÓœó¥4­u­u­uµ–µ¶µ¶µ¶µ¶µ–­u¥”²œóµ–ÆÆ8½÷½×ÎYÖÚÞÛÞÛÞÛÖÚÞÛÞÛÞûÞÛÖºÎyÎyÖšÎYÎYΙ֚ÆX½×½÷ƽ÷½×ƽ÷ÆÆ8Æ8½÷µ¶µ¶µ¶µ–­•¥4œÓ{ï”r”’”’”²¥4­uµ¶½×µÖ½×½÷Æ8½÷½×½÷ƽ÷­Uœóœóµ–ÆXÎyÆ8½×½÷ÎyÞÛÞÛÞÛÞÛÖÚÞÛÞûÞÛÞÛΙÎYÖšÖÚÖºÖzΙֺÎyÎYÎyÖšÎyÎYÎYÆ8Æ8ÖºÖºÖzÆ8Ƶ¶µ–µ–­•­UŒQ”²œÓœÓœóµ–½÷Æ8Æ8ÆÎYÎyÎY½÷µ–½÷ÎYÎY½÷¥T­UÆΙ֚Æ8½÷Æ8ÎyÖºÞÛÞÛÖÚÞÛÞÛÞÛÞÛÖÚ֚Ιֺֺ֚Îyֺֺֺֺ֚֚֚ΙÎYÆÆ8ÖºÞÛÖºÎyÎyÆ8µ¶µ–µ–­•œóœó¥4­uµ¶ÆÎyÎyÎyÖšÖºÖºÖš½÷­uµ¶ÎYÖºÖšÆ8½÷ÎYÖšÖºÖšÖšÖºÖºÖšÞÛÞûÞÛÞûÞÛÞÛÖÚÞÛÖÚÞ»ÖÚÖºÎyÆ8ÎyÞÛֺֺ֚ΙÎyÎyÎyÎYÆ8ÖšÖÚÞÛÖºÖºÖš½÷µ–­•½×­U­Uµ–½÷Æ8֚֚Ιֺ֚֚ÞÛÖºÎYµ¶½×ÎyÞÛÖÚÖºÖºÖºÞÛÞÛÖÚÞÛÞûÞÛÖºÞÛÞûÞûÞûÞûÞÛÖºÞÛÞûÞÛÞÛÖÚÖºÎyÎyÞÛÞÛÖºÎYÆ8Æ8ÖšÖºÖºÎYÆXÖšÖºÞÛÞÛÖº¾µ–µ¶½÷¥4­u½×¾ÎY֚ΙÎyÎyÎYÖºÞÛÖÚÎy½×½×ÎyÖºÞÛÞÛÞÛÖÚÞÛÞÛÞÛÞûÞûÞÛÖºÞÛÞûÞûÞûÞÛÞÛÖÚÞ»ÞûÞûÞûÞÛÞÛÖšÎyÞÛÖÚÖºÎyÆ8Î9ΙÞÛÖºÎY½÷ÆÎyÖºÖºÖš½×­•½×Æœó­u½×µÖ½÷ÎYÎyÎY¾Æ8ÖšÖÚ޻Ι½÷½×Æ8ÎyÖšÖºÖºÖºÖºÖºÞ»ÞÛÞûÞÛÖÚÖºÞÛÞÛÞûÞÛÞûÞÛÖÚÞÛÞûÞûÞûÞÛÎyÎyֺֺ֚ΙÎyֺ֚֚ΙÎyƵ–µÖÎYÎyÎYµÖ­Uµ¶½÷œÓ­uµ¶µ¶­u½×ÆXÆ½×Æ8Îy֚ΙÎY½÷µ¶½×ÆÆ¾Æ8Æ8Æ8Æ8ÎyÖºÞÛÞûÞÛÖºÖºÞÛÞÛÞÛÞÛÖÚÞÛÖÚÞûÞûÞÛÖšÆÆ8ÎyÎYÆXÎyÖšÖºÖšÎYÎYÆXÆ­u­U½÷ÎyÎY½×¥T­U­u”’¥­U­U­Uµ¶½×½×Æ8Æ8Æ8Æ8Æ8½×µ–µ¶½×½×½÷Æ8½×µ¶½÷ÎYÖšÖÚÞÛÞÛÖºÖšÖºÖÚÞ»ÖÚÞÛÖÚÖºÞÛÞÛÖºÆX½×½÷Æ8½÷½÷Æ8ÎYÎYÆXÆ8½÷½÷½÷­Uœóµ–Æ8ÎY½÷­u¥”²„0”²œóœóœó¥­Uµ¶½÷ƽ÷½×¾ÆµÖµ¶½÷½×½×¾Æµ¶­U­•Æ8Özֺֺֺ֚Ιֺֺֺֺֺֺ֚֚֚ÆX½×µ–½÷¾µ¶­uµ–µ¶µ¶½÷½÷µ¶­u­u¥4”²œóµ¶ÆµÖ¥4œÓŒq{Ï„P”’œÓ¥4­uµ¶½÷µ¶µ–½×¾½÷½×µ¶½÷½×½÷½÷µ¶¥”²¥4ÆΙ֚ÎyÆXÎyÖºÞÛÖÚÖšÎyÖšÖºÖºÖºÎy½÷­U¥µ–½÷µ–œó”²¥¥4­uµ¶µ–¥4œó”²ŒQ”’¥¥T¥”²”²ŒqkMkm{ÏŒQœÓ¥¥4­u­U¥4µ¶½×µÖµ¶µ–µ–µ–µÖ­uœÓ„PŒQ¥4ÆΙ֚Æ8ÆΙÞÛÞûÞÛÖºÎyÎyÖºÞÛÖºÎyµ¶œÓŒqœó­u­U”²ŒQŒ‘Œq”’¥¥TœóŒQ{Ï{Ï„0”²ŒQs®{Ï„0„RªZËc kM„”’”²”’„„Œq¥¥œó¥œÓ”’”²œÓ”’|{ï„”²­uÆÆ8½×½÷ÖšÞÛÞûÞÛÖšÆ8ÆXÖzΙÎy½÷­u”’s®{ÏŒq”’„s®sŽc,c sŽ„0ŒQkmZëc sŽ{Ïc,RŠZËZëc BB(JIRŠc s®„s®c,c,s®„{ÏksŽkmkMc c c cL{¯s®sŽŒQ¥4­U­Uµ¶ÎyÞÛÞÛÖÚÎy½÷½÷½÷½÷µ–¥œÓ„c JiZëkMc RªJIB9Ç:RjRŠJIB(JIRŠRŠB9Ç9Ç9Ç9ç1†1¦9Ç9Ç9çJiZëZ«BBJIRŠRŠJIBB9çAè9ç9çJIRªRªJic „”’œÓ­uÆXÖºÞÛÖšÆXÆ8ƽ׭UœóŒq{ïkmB(1†9Ç9ç9ç1†)e)E)E)E)e)e)e)e9§1¦1†)e)E)e)e)e!$!$)E)E)E)E)e)e)%!$!$)E)e)%!$!$)E1†)e)E)E1†)e1†B(kmŒ1”²­uÆ8ÖšÖºÎyÎYÎyÎyÆ¥4”²„0{Ïc 9ç!$!!$)E!$!!!!!!!!$!$!$!!$!!$!$!ã äãã äãã äãã äãã äãã ä!!$!!!!)eJIkMŒQ”Òµ¶ÎYΙֺ֚֚֚Ι½÷µ–¥T”²„0kmB!$ã äãã äãã äãã äãã äãã äãã äã äãã äãã äãã äãã äãã äãã äãã ä)eRŠ{Ï”’œÓµ¶ÎyÖšÖºÖºÖºÖšÎy½÷½÷½×­U”²sŽB!$ã äãã äãã äãã äãã äãã äãã äã äãã äãã äãã äãã äãã äãã äãã ä)ERŠŒQœóœó­uÆ8ÖºÞ»ÖÚÖºÎyÆ8½÷ƽ÷µ–œós®B(!ã äãã äãã äãã äãã äãã äãã äã äãã äãã äãã äãã äãã äãã äãã ä)EJi„0œó¤ô¥TÆ8ÖšÞÛÖºÖšÆ8½÷½×µÖµ¶­U”²s®B(!$ã äãã äãã äãã äãã äãã äãã äã äãã äãã äãã äãã äãã äãã äãã ä)EJI{œó­uÆ8ÖšÖºÖšÎyÎyÆ8µ¶­u¥”²Œq{ÏRŠ)Eãã äãã äãã äãã äãã äãã äããã äãã äãã äãã äãã äãã äãã äãã ä)EJiƒðœÓœÓ¥4½×ÎY֚ΙÎyÖšÎyƵ–œÓ„0{Ïs®ZË)Eãã äãã äãã äãã äãã äãã äããã äãã äãã äãã äãã äãã äãã äãã ä)ERŠ{œÓœó­UÆÎYÎyÎYÆXÎyÎyÆ¥4{ïkMZëB!$ã äãã äãã äãã äãã äãã äãã äã äãã äãã äãã äãã äãã äãã äãã ä)ERª„0”²¥­•µ¶½÷ÎYÎY½÷µ¶½÷ÎYÆX½×Œ‘kmJi1†!$ äãã äãã äãã äãã äãã äãã äãã äãã äãã äãã äãã äãã äãã äãã ä)EZË„0œÓ­uÆÆ8ÎYΙ֚Æ­u­u½÷Æ8½÷¥4sŽJI1†!$ã äãã äãã äãã äãã äãã äãã äã äãã äãã äãã äãã äãã äãã äãã ä)ERª{­u½÷Æ8ÎYÖšÎy¾µ–µ–µ¶½×µ¶œÓkmJI1†)Eãã äãã äãã äãã äãã äãã äããã äãã äãã äãã äãã äãã äãã äãã ä)eJIc,{ïŒq¥4µ¶½÷½÷½×µ–­•µ–­Uœó”²{ïc B(1†!$ã äãã äãã äãã äãã äãã äã!ãã äãã äãã äãã äãã äãã äãã äãã ä!1ÆRjZës®”’¥¥”Ҝӥ¥T­U”²„0{ÏkMJ‰9Ç)E!ãã äãã äãã äãã äãã äãã!!$!$ äã äãã äãã äãã äãã äãã äãã äãã!1†JIc {ÏŒq”’ŒqŒ1Œqœóµ–­u”²„kbìJI1¦)E!ãã äãã äãã äãã äãã äã!!$)E!$!ã äãã äãã äãã äãã äãã äãã äãã!1†JIkM{ï”r”’”’Œ‘”’¥µ–­•”²„kmZËB(1¦)E!ãã äãã äãã äãã äãã ä!)E)E)E!$ã äãã äãã äãã äãã äãã äãã äãã ä!1†JIc sŽ{Ï„0”’œÓœóœÓœóœÓ„0{ÏsŽZëJI9ç1f!ãã äãã äãã äãã äãã ä!!$)E!$)% äã äãã äãã äãã äãã äã äãã äãã ä!)e9çJIRŠZëkM„œÓœóŒq„0„s®sŽkmRªJ)9ç)e äãã ä!$!ã äãã äã!ã!ã!!$)%)E!$ã!ã!ã äãã! äãã äã!!!ãã äã!ã ä!$1†9Ç9ÇBRªsŽ„0ŒQs®snkmc ZËRªJ)9ç1†!$ ä!!!$)e1f)E!$ äã!!!!!$!$!$)%)E)E)E!!!$!!!!$!$!!ãã äã!!!$!!ã!!!ã!$)E1†1¦9ÇJIZëkMc,RªZ«RªRŠB(B(B9Ç1†!$!$!!$)E1†1†1†)E!$)E!$)%)E)e)e)e1f)e)e1f)e!!!$!!$!!$!$)%!$!!!!!!$!$)E!$)%!$!!$!!!$1†1†9ÇBJiRŠJiJ)JIB(B(BB9ç9§)e)e)E)E!$)e1†1¦1†)e)e1†)e)e)E)e1†1†1†)e1†1†1†ã!!!!$!$!$)%!$)E!$)%!$!$)%!D)%!$)%!D)%!$!!!!$)E1f1¦AèBJIJIJIB(BB9ç9ç9Ç1†1†1†1†1†1†1†1¦9Ç1¦1¦1†1¦1¦1†1†1†1¦1†1†1†1†1†1† ä!!!!$!$!$!$!$)%!$!$!!$)%!$!$)%!$)%)E!$)%!$!!$)%)E)e1¦9çBJ)B(B(B9Ç9Ç1¦1†1†1†1†1¦1†1¦1¦1¦1¦1¦1†1¦1¦9§1¦1¦1¦9§1¦9§1¦1¦1¦1¦ãã äã!!!$!$!$!$)%ã äã!!!$!$)%!!!!! äã ä!!$1†1¦9Ç9Ç9Ç1¦1†)e)E)e)E)E)E)e1†)e1f)e1f)e1†1†1¦1¦1¦1†1¦9§1Æ9§9Ç9Ç9Ç9ÇBB(JiJiRŠRªRŠJIB(B(Aè1¦B9çJibìc ZËJIB(9Ç9Ç9Ç9çBJIRŠRªRªZËRªJiBB9çB(JIJIJIJiJI9ç9ç9ÇBRŠc sŽs®c,ZËB(9Ç1†1†1†9Ç9ç9çBAè9çBB(1¦1¦1†1f9Ç9Ç1¦9§)e)E)E)eJIZËc,s®{ÏsŽc,Ji1†!$!$!$)%!)E1¦)E!$1¦1†)E!$!$!)%)E)E!$!)E)E)eJIc,sŽ”²”’{Ïs®RŠ1¦!!!$!$!!$)Eã!$1f)eã äã äã äãã ä!!$)eZ«km{¯œóœóŒQŒqsŽ9Ç!ã! äã äã äã)%!$ã äãã äãã äãã ä)ekM{Ïœóƽ÷ŒQŒq„09ç!ã äã äãã äã äã äãã äãã äãã ä9Çs®œÓÆÆÆXµ–Œq„0B!$ ä!ã äãã äã äãã äãã äãã äãã ä)eZ«œÓ¾µ¶ÆÆ8¥”²Ji!$!!ã äã äã äããã äãã äãã äãã ä1†sŽ­UÆ8ÖšÎYµÖ½×­URÊ)%ãã äã ä!ã äããã äãã äãã äãã ä1†{ϵ¶ÎYÖšÎYµ¶­u”²c )Eã!!!!!!!!! äã!!!!!!!$!!$1fk­Uµ¶ÎyÎYÆ8¥4ŒQ{ÏB1¦9ç9ÇBB(B(9ç9ç9Ç1¦1†9ÇB(Z«RŠRªc c c ZËc,sŽœÓµÖ­uÖšÞÛÎyƽ÷­u{ï{ïs®k-|¤ô”²„0{ïkMkMc s®„„ŒQœÓœÓŒq¥4¥4”²¥4½÷½÷Æ8ÞÛÞÛֺ֚Ι­u­U¾¥œÓµ–½÷µ¶¥4µ–¥4Œq„ŒqœÓ¥4µ–µ¶½×½×½×¥4¥ÆÆÆ8ÞÛÞÛÖÚÞûÖºÎy֚ΙÖzÆ8Æ8Æ8Æ8Îyƽ׭•¥4”²¥µ–ÆXÎYΙÆ8µ¶Îy½÷½÷ÖšÎYÎyÞÛÞÛÞÛÖÚÖºÖºÖºÎyÖºÖºÖšÎyÆ8ÖºÖºÎyµ¶µ–­U½×ÎyÖšÎyÞÛΙ½×ÖšÖÚÞÛÖÚÞÛÞûÖºÞûÞûÞÛÞÛÞûÖÚÖzÖÚÖšÆ8ÖºÖzÆ8ÖºÖº½×½÷¥4µ¶½÷ÎY¾֚Ι½×Æ8ÎYÎyÎyÖºÞûÞ»ÖÚÞûÞÛÞÛÞûÖÚÎYΙÎy֚ΙÎy½×µÖÎyµ–µ–”’¥4¥µ¶Æ½÷Æ8µ¶½×½÷½÷µ–ÎyÞ»ÖºÖšÖºÖºÖºÖºÎYµÖ½÷½×¾ÆµÖ­u¥Æµ–”Òs®ŒQ¥­u­uµ–½÷µ¶µ¶½×œóœÓÎYÎyÎYÞÛÖºÎyÖºÖš­u¥µ–”’œÓ¥4¥4Œq„0œÓŒQŒQJiZË{ÏŒQsŽŒQŒQ„0{ï{Ïs®„­Uµ¶Æ8ÞÛÖºÆÆ8½×”²kM{ÏkmZËRªkmRªZëZëJIJi)e1†9§B(1¦9Ç9ç1†1¦1¦AèBc,”’½×ÖºÎyÎYµ–Œ‘sŽ1¦1†)e)E!$)%!D1f)E)E)Eã äãã äãã äã!ã)%c ”’ÆΙֺ֚½×¥T{ï1†ã äãã äãã äããã äãã äãã äãã ä!kmœó½×ÖºÖºÆ8½÷µ¶ŒQ1¦ãã äãã äãã äãã äãã äãã äãã ä!c,œÓµ¶ÖšÎ™ÎYµ¶”²{ïAèãã äãã äãã äãã äãã äãã äãã ä!kMœÓ­UÆ8ÎY¾ÎYœÓ[ 1†ãã äãã äãã äãã äãã äãã äãã ä!km¥Æ8ÎyÎY­u½÷­uZë)eã äãã äãã äããã äãã äãã äãã ä!Ji{¯¥4­u­U­uœÓ{ïJi!$ äãã äãã äã ä! äãã äãã äãã äã ä9çsŽ”’Œq”²µ–Œqc,9ç)%ãã äãã äã ä!$)Eã äãã äãã äãã ä!9ÇZËsŽ”’œÓŒq{Ïc,B!$ äã!ãã äã!!$)E!!!!!ã ä!!ã!ã)E9ÇB(sŽkmc RªJI1¦!$!)E1†!$!!$)E)E)E)e!!!$!$)%!$!!$)%!$!$!!$1f9çJIJIB(B9ç1†1f)e1†1¦1†1†)e1†1†1†1†ã!!!$!$!!!$!$!$)%!!!)E9ÇB9ç1¦1†)e1f1†1†1†1†1¦1¦9§1¦9Ç1¦BB(RjJiB(9ÇB(c c,Ji1¦9ÇBJIJIJI)e)E1†)e)E)eRª{Ï{ïZë)e!$!)e!$1†ã äãã ä!$kMœóœó„0)e äã äã!ã äãã ä)E{ïÅø¾”’1¦!ã äã äã äãã ä!$”’ÎyÆ¥TBã ä!ã!)E9§9ÇBBJIœÓÆÎy­u{ÏZËZËsŽZëRŠ{Ï”’¥¥4­U­U¾ÖºÞÛÖš½÷½÷µ¶Æµ¶¥¥4Æ8Öš¾ÎyÖšÖºÞÛÞÛÖÚÖšÖºÎyÎyÖº½·¥4µ¶Æ8ƾÆÖºÖºÞÛÖÚÎYÆ8ÎY½×½×­ukM”²”²¥œÓŒq½÷ÖšÎyÎY”’ŒQ{Ï{ï{¯kM!$)e)E)E)E1†{ÏÎYÎy­URª!$!!!$!ã äãã ä!„Æ8Îy­uZëã äãã äã äãã ä!„0ƾµ–B(ã äãã ä äãã äã äZëœó­U„1¦ã äã ä!$ã!ã ä ä9çsn{ïbì1†!!$!!$)E!!$!$!)%!$!$9ÇB9Ç)e1†1†1†1¦1¦9Ç9ç9§Zëc 1†1¦9Çãã!”’œó)Eã ä)%)e1¦µvµÖJiB9ǜ󵶽÷ÖšÖÚÎYÆ8½×”²µ–­UÎyÖš­Uœó”’!!$)%¥½÷9ç!!ã äã”’­U)eã ä!!!BRª)e)E)e)eRŠRª)EkMœó­U{ïc,”’œóZëãJ)Rª!$c kMRªbìc \ No newline at end of file diff --git a/glide2x/cvg/glide/tests/makefile b/glide2x/cvg/glide/tests/makefile deleted file mode 100644 index c2297a3..0000000 --- a/glide2x/cvg/glide/tests/makefile +++ /dev/null @@ -1,145 +0,0 @@ -# -# Copyright (c) 1995, 3Dfx Interactive, Inc. -# All Rights Reserved. -# -# This is UNPUBLISHED PROPRIETARY SOURCE CODE of 3Dfx Interactive, Inc.; -# the contents of this file may not be disclosed to third parties, copied or -# duplicated in any form, in whole or in part, without the prior written -# permission of 3Dfx Interactive, Inc. -# -# RESTRICTED RIGHTS LEGEND: -# 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. -# - - -LDIRT= *.exe *.map *.sys *.obj *.lib - -!ifdef FX_NO_GLIDE_SWDIAGS -!include $(BUILD_ROOT_SWLIBS)/include/nmake/3dfx.mak -!else -!if "$(FX_GLIDE_DSP_TARGET)"=="SIM" -LCDEFS = $(LCDEFS) -DGLIDE_SIMULATOR -LLDLIBS = $(LLDLIBS) $(BUILD_ROOT_SWLIBS)\lib\wing32.lib -!endif - -LCINCS = $(LCINCS) -I$(BUILD_ROOT_SST1)\include - -!if "$(FX_COMPILER)"=="WATCOM" -LIBOBJS = tlib.lib plib.lib -!else -LIBOBJS = tlib.obj plib.obj -!endif - -!if "$(FX_TARGET)"=="WIN32" -FX_TARGET_MINOR=WIN95 -!endif - -LLDLIBS = $(LLDLIBS) $(BUILD_ROOT_SST1)\lib\glide2x.lib $(LIBOBJS) - -PRIVATE_HEADERS = tlib.h tlib.c plib.h plib.c tldata.inc - -CFILES = display.c \ - test00.c \ - test01.c \ - test02.c \ - test03.c \ - test04.c \ - test05.c \ - test06.c \ - test07.c \ - test08.c \ - test09.c \ - test10.c \ - test11.c \ - test12.c \ - test13.c \ - test14.c \ - test15.c \ - test16.c \ - test17.c \ - test18.c \ - test19.c \ - test20.c \ - test21.c \ - test22.c \ - test23.c \ - test24.c \ - test25.c \ - test26.c \ - test27.c \ - test28.c \ - test29.c \ - qatest00.c \ - qatest01.c \ - h3dtst01.c \ - h3dtst02.c - -PROGRAMS = $(CFILES:.c=.exe) - -DATAFILES = alpha.3df decal1.3df lava.3df light.3df matt1.3df miro.3df \ - argb1555.3df argb4444.3df argb8332.3df argb8888.3df \ - ayiq.3df yiq.3df p8.3df ap88.3df rgb332.3df rgb565.3df - -!include $(BUILD_ROOT_SWLIBS)/include/nmake/3dfx.mak - -$(PROGRAMS): $(LLDLIBS) - -!if "$(FX_COMPILER)"=="WATCOM" -!if "$(FX_TARGET)"=="DOS" -tlib.lib: tlib.obj - wlib -b -c -n -q -p=512 tlib tlib.obj -plib.lib: plib.obj - wlib -b -c -n -q -p=512 plib plib.obj -!else -tlib.lib: tlib.obj - wlib -b -c -n -q -p=512 tlib tlib.obj -plib.lib: plib.obj - wlib -b -c -n -q -p=512 plib plib.obj -!endif -!endif - -test00: test00.exe -test01: test01.exe -test02: test02.exe -test03: test03.exe -test04: test04.exe -test05: test05.exe -test06: test06.exe -test07: test07.exe -test08: test08.exe -test09: test09.exe -test10: test10.exe -test11: test11.exe -test12: test12.exe -test13: test13.exe -test14: test14.exe -test15: test15.exe -test16: test16.exe -test17: test17.exe -test18: test18.exe -test19: test19.exe -test20: test20.exe -test21: test21.exe -test22: test22.exe -test23: test23.exe -test24: test24.exe -test25: test25.exe -test26: test26.exe -test27: test27.exe -test28: test28.exe -test29: test29.exe -test30: test30.exe -test31: test31.exe -qatest00: qatest00.exe -qatest01: qatest01.exe -h3dtst01: h3dtst01.exe -h3dtst02: h3dtst02.exe - -foo: foo.exe -display:display.exe - -!endif diff --git a/glide2x/cvg/glide/tests/makefile.distrib b/glide2x/cvg/glide/tests/makefile.distrib deleted file mode 100644 index 2358223..0000000 --- a/glide2x/cvg/glide/tests/makefile.distrib +++ /dev/null @@ -1,15 +0,0 @@ - -CFLAGS = -I. -I/usr/include/glide - -SRCS = $(wildcard test*.c) -OBJS = $(SRCS:.c=.o) -EXECS = $(basename $(SRCS)) -LIB_OBJS = tlib.o - -all: $(EXECS) - -clean: - rm $(EXECS) *.o - -$(EXECS): $(OBJS) $(LIB_OBJS) - $(CC) -o $@ $@.o $(LIB_OBJS) -lglide -lm diff --git a/glide2x/cvg/glide/tests/makefile.linux b/glide2x/cvg/glide/tests/makefile.linux deleted file mode 100644 index ce0a9c7..0000000 --- a/glide2x/cvg/glide/tests/makefile.linux +++ /dev/null @@ -1,77 +0,0 @@ -# -# Copyright (c) 1995, 3Dfx Interactive, Inc. -# All Rights Reserved. -# -# This is UNPUBLISHED PROPRIETARY SOURCE CODE of 3Dfx Interactive, Inc.; -# the contents of this file may not be disclosed to third parties, copied or -# duplicated in any form, in whole or in part, without the prior written -# permission of 3Dfx Interactive, Inc. -# -# RESTRICTED RIGHTS LEGEND: -# 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. -# - - -LDIRT= $(PROGRAMS) - -GLIDE_ROOT = $(BUILD_ROOT)/$(FX_GLIDE_HW) - -LIBOBJS = tlib.o plib.o - -GLIDELIB = -L$(GLIDE_ROOT)/lib -lglide - -LLDLIBS = $(LIBOBJS) $(GLIDELIB) - -PRIVATE_HEADERS = tlib.h tlib.c plib.h plib.c tldata.inc - -CFILES = display.c \ - test00.c \ - test01.c \ - test02.c \ - test03.c \ - test04.c \ - test05.c \ - test06.c \ - test07.c \ - test08.c \ - test09.c \ - test10.c \ - test11.c \ - test12.c \ - test13.c \ - test14.c \ - test15.c \ - test16.c \ - test17.c \ - test18.c \ - test19.c \ - test20.c \ - test21.c \ - test22.c \ - test23.c \ - test24.c \ - test25.c \ - test26.c \ - test27.c \ - test28.c \ - test29.c \ - qatest00.c \ - qatest01.c \ - h3dtst01.c \ - h3dtst02.c - -PROGRAMS = $(CFILES:.c=) - -DATAFILES = alpha.3df decal1.3df lava.3df light.3df matt1.3df miro.3df \ - argb1555.3df argb4444.3df argb8332.3df argb8888.3df \ - ayiq.3df yiq.3df p8.3df ap88.3df rgb332.3df rgb565.3df - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak - - -$(PROGRAMS): $(LIBOBJS) - diff --git a/glide2x/cvg/glide/tests/matt1.3df b/glide2x/cvg/glide/tests/matt1.3df deleted file mode 100644 index c02118d..0000000 Binary files a/glide2x/cvg/glide/tests/matt1.3df and /dev/null differ diff --git a/glide2x/cvg/glide/tests/miro.3df b/glide2x/cvg/glide/tests/miro.3df deleted file mode 100644 index 313b674..0000000 Binary files a/glide2x/cvg/glide/tests/miro.3df and /dev/null differ diff --git a/glide2x/cvg/glide/tests/p8.3df b/glide2x/cvg/glide/tests/p8.3df deleted file mode 100644 index 391f60b..0000000 Binary files a/glide2x/cvg/glide/tests/p8.3df and /dev/null differ diff --git a/glide2x/cvg/glide/tests/plib.c b/glide2x/cvg/glide/tests/plib.c deleted file mode 100644 index aac8164..0000000 --- a/glide2x/cvg/glide/tests/plib.c +++ /dev/null @@ -1,1397 +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 -#include -#ifndef __linux__ -#include -#endif -#include -#include -#include -#include -#include - -#include -#include "tlib.h" -#include "plib.h" - -#define MAX_HANDLES 32 - -//the following may need to go onto the heap... currently need 10K, not bad -static tlTxMnTexture_t tlTxMnMngr[MAX_HANDLES]; -static hTexId_t hFstOpnTexId = H_FSTTEXID; //0 is the NULL handle -static GrChipID_t currTMU = GR_TMU0; -static FxBool bMultiRevOrder; -static FxBool bMultiOffsetFix; - -/* static helper prototypes */ -static FxU32 prGetLodSize( GrTexInfo *const disTexInfo, GrLOD_t disLOD ); -static FxU32 prTexMultiMemRequired( FxU32 deMipMask, GrTexBaseRange_t deRange, - GrTexInfo* deTexInfo ); -static void prGetLod( GrTexInfo *lpTexInfo, GrLOD_t deLod, void *data ); -static void prPopLod( GrTexInfo *lpDeTexInfo, mipMapEnd_t deMipMapEnd ); -static void prPushLod( GrTexInfo *lpDeTexInfo, mipMapEnd_t deMipMapEnd ); -static FxU32 prGetTxMnAdd( hTexId_t deTexId, GrLOD_t deLod ); -static int prGetLodWidth( GrLOD_t lod, GrAspectRatio_t aspect ); -static int prGetLodHeight( GrLOD_t lod, GrAspectRatio_t aspect ); -static FxU32 prGetMultiMemBump( const GrTexInfo *const deTexInfo, - GrTexBaseRange_t deTexBase, - FxU32 deMipMask ); - - -/*------------------------------------------------------------------- - Function: plTxMnLoadTxMngr - Date: 6/26/97 - Implementor(s): psw - Library: - Description: - Arguments: - Return: - -------------------------------------------------------------------*/ -hTexId_t -plTxMnLoadTxMngr( TlTexture* lpTexture ) -{ - /* assumptions */ - assert( lpTexture ); - - /* code */ - tlTxMnMngr[ hFstOpnTexId ].lpTlTextureInfo = lpTexture; - tlTxMnMngr[ hFstOpnTexId ].origLargeLod = lpTexture->info.largeLod; - tlTxMnMngr[ hFstOpnTexId ].origSmallLod = lpTexture->info.smallLod; - SET_DOWNLOADABLE( tlTxMnMngr[hFstOpnTexId], FXFALSE); - SET_MULTIBASE( tlTxMnMngr[hFstOpnTexId], FXFALSE); - SET_TRILINEAR( tlTxMnMngr[hFstOpnTexId], FXFALSE); - SET_BEENPOPD( tlTxMnMngr[hFstOpnTexId], FXFALSE); - SET_DIRTY( tlTxMnMngr[hFstOpnTexId], FXFALSE); - - return (hFstOpnTexId++); -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnSetDownload - Date: 6/26/97 - Implementor(s): psw - Library: - Description: - Arguments: - Return: - -------------------------------------------------------------------*/ -static void -prTxMnSetBeenPopd( hTexId_t deTexId, FxBool bBeenPopd ) -{ - SET_BEENPOPD( tlTxMnMngr[deTexId], bBeenPopd ); - SET_DIRTY( tlTxMnMngr[deTexId], FXTRUE ); /* just for messing with it */ -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnSetDownload - Date: 6/26/97 - Implementor(s): psw - Library: - Description: - Arguments: - Return: - -------------------------------------------------------------------*/ -void -plTxMnSetDownload( hTexId_t deTexId, FxBool bDownLoad ) -{ - /* assumptions */ - assert( deTexId < hFstOpnTexId ); - - /* code */ - SET_DOWNLOADABLE( tlTxMnMngr[deTexId], bDownLoad ); - SET_DIRTY( tlTxMnMngr[deTexId], FXTRUE ); /* just for messing with it */ -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnSetMultibase - Date: 6/26/97 - Implementor(s): psw - Library: - Description: - Arguments: - Return: - -------------------------------------------------------------------*/ -void -plTxMnSetMultibase( hTexId_t deTexId, FxBool bMultibase ) -{ - /* assumptions */ - assert( deTexId < hFstOpnTexId ); - - /* code */ - SET_MULTIBASE( tlTxMnMngr[deTexId], bMultibase ); - SET_DIRTY( tlTxMnMngr[deTexId], FXTRUE ); /* just for messing with it */ -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnGetMultibase - Date: 6/26/97 - Implementor(s): psw - Library: - Description: - Arguments: - Return: - -------------------------------------------------------------------*/ -FxBool -plTxMnGetMultibase( hTexId_t deTexId ) -{ - assert( deTexId < hFstOpnTexId ); - return (IS_MULTIBASE(tlTxMnMngr[deTexId]) ); -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnSetMultiRevOrder - Date: 7/6/97 - Implementor(s): psw - Library: - Description: - Sets the global bMultiRevOrder which is used by plTxMnDownloadAll - to determine the order of the multibase segments in tmu mem - Arguments: - FxBool bOrder - Return: - void - -------------------------------------------------------------------*/ -void -plTxMnSetMultiRevOrder( FxBool bOrder ) -{ - bMultiRevOrder = bOrder; -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnGetMultiRevOrder - Date: 7/6/97 - Implementor(s): psw - Library: - Description: - Returns the current status of the bMultiRevOrder static global - Arguments: - none - Return: - FxBool - -------------------------------------------------------------------*/ -FxBool -plTxMnGetMultiRevOrder( ) -{ - return ( bMultiRevOrder ); -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnSetMultiOffsetFix - Date: 7/16/97 - Implementor(s): psw - Library: - Description: - Sets the global bMultiOffsetFix which is used by plTxMnTextureSource - to determine to use the Multibase offset fix - Arguments: - FxBool bOrder - Return: - void - -------------------------------------------------------------------*/ -void -plTxMnSetMultiOffsetFix( FxBool bOffsetFix ) -{ - bMultiOffsetFix = bOffsetFix; -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnGetMultiOffsetFix - Date: 7/16/97 - Implementor(s): psw - Library: - Description: - Returns the current status of the bMultiOffsetFix static global - Arguments: - none - Return: - FxBool - -------------------------------------------------------------------*/ -FxBool -plTxMnGetMultiOffsetFix( ) -{ - return ( bMultiOffsetFix ); -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnSetTrilinear - Date: 6/26/97 - Implementor(s): psw - Library: - Description: - Arguments: - Return: - -------------------------------------------------------------------*/ -void -plTxMnSetTrilinear( hTexId_t deTexId, FxBool bTrilinear ) -{ - /* assumptions */ - assert( deTexId < hFstOpnTexId ); - - /* trilinear && <2-lods are mutex */ - if ( (tlTxMnMngr[ deTexId ].lpTlTextureInfo->info.smallLod - - tlTxMnMngr[ deTexId ].lpTlTextureInfo->info.largeLod) >= 1) - { - SET_TRILINEAR( tlTxMnMngr[deTexId], bTrilinear ); - SET_DIRTY( tlTxMnMngr[deTexId], FXTRUE ); /* just for messing with it */ - } -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnGetTrilinear - Date: 6/26/97 - Implementor(s): psw - Library: - Description: - Arguments: - Return: - -------------------------------------------------------------------*/ -FxBool -plTxMnGetTrilinear( hTexId_t deTexId ) -{ - assert( deTexId < hFstOpnTexId ); - return (IS_TRILINEAR(tlTxMnMngr[deTexId]) ); -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnReset - Date: 6/26/97 - Implementor(s): psw - Library: - Description: - Resets the respective texture back to its base state - Arguments: - hTexId_t deTexId - the id of the tlTxMnMngr texture to reset - Return: - void - -------------------------------------------------------------------*/ -void -plTxMnReset( hTexId_t deTexId ) -{ - /* initializations */ - tlTxMnTexture_t *lpThisTxMnTexture; - GrTexInfo *lpThisTexInfo; - - /* assumptions */ - assert( deTexId < hFstOpnTexId ); - - /* initializations */ - lpThisTxMnTexture = &tlTxMnMngr[deTexId]; - lpThisTexInfo = &lpThisTxMnTexture->lpTlTextureInfo->info; - - /* code */ - SET_MULTIBASE( tlTxMnMngr[deTexId], FXFALSE ); - SET_TRILINEAR( tlTxMnMngr[deTexId], FXFALSE ); - bMultiRevOrder = FXFALSE; - /* SET_DIRTY( tlTxMnMngr[deTexId], FXFALSE ); */ - - while ( lpThisTexInfo->largeLod > lpThisTxMnTexture->origLargeLod ) - prPushLod( lpThisTexInfo, topOfMipMap );/* reset d'm data ptrs */ - - while ( lpThisTexInfo->smallLod < lpThisTxMnTexture->origSmallLod ) - prPushLod (lpThisTexInfo, btmOfMipMap );/* reset d'm data ptrs */ -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnDownloadAll - Date: 6/27/97 - Implementor(s): psw - Library: - Description: - Downloads all the textures be held by tlTexManMngr[] - Will determine if the textures are to be downloaded - in (linear || multibase) && (BOTH || EVEN/ODD) mode based upon - their flags and do the right thang - Arguments: - None - Return: - void - -------------------------------------------------------------------*/ -void -plTxMnDownloadAll( ) -{ - /* definitions */ - hTexId_t hCurrTexId; - FxU32 currTexMemReq; - FxU32 currStartAdd; - tlTxMnTexture_t *lpThisTxMnTexture; - GrTexInfo *lpThisTexInfo; - TlTexture *lpThisTlTex; - - /* assumptions */ - assert(hFstOpnTexId != 0); - - /* initializations */ - currStartAdd = grTexMinAddress(currTMU); - - /* code */ - for ( hCurrTexId = H_FSTTEXID; hCurrTexId < hFstOpnTexId; ++hCurrTexId ) - { /* here we go */ - if (IS_DOWNLOADABLE(tlTxMnMngr[hCurrTexId])) - { /* download it */ - lpThisTxMnTexture = &tlTxMnMngr[hCurrTexId]; - lpThisTlTex = lpThisTxMnTexture->lpTlTextureInfo; - lpThisTexInfo = &lpThisTlTex->info; - if (!IS_MULTIBASE(*lpThisTxMnTexture)) - { /* not multibased */ - if (!IS_TRILINEAR(*lpThisTxMnTexture)) - { /* not trilinear mip'd */ - currTexMemReq = grTexTextureMemRequired(GR_MIPMAPLEVELMASK_BOTH, lpThisTexInfo); - assert( currStartAdd + currTexMemReq < grTexMaxAddress(currTMU) ); - grTexDownloadMipMap( currTMU, currStartAdd, - GR_MIPMAPLEVELMASK_BOTH, lpThisTexInfo ); - lpThisTxMnTexture->u0.bothAdd = currStartAdd; - currStartAdd += currTexMemReq; - } /* if !IS_TRILINEAR && !IS_MULTIBASE */ - else - { /* else it is being rendered as trilinear mip'd */ - /* first do the even segment */ - currTexMemReq = grTexTextureMemRequired(GR_MIPMAPLEVELMASK_EVEN, lpThisTexInfo); - assert( currStartAdd + currTexMemReq < grTexMaxAddress(currTMU) ); - grTexDownloadMipMap( currTMU, currStartAdd, - GR_MIPMAPLEVELMASK_EVEN, lpThisTexInfo ); - lpThisTxMnTexture->u0.evenAdd = currStartAdd; - currStartAdd += currTexMemReq; - /* next do the odd segment */ - currTexMemReq = grTexTextureMemRequired(GR_MIPMAPLEVELMASK_ODD, lpThisTexInfo); - assert( currStartAdd + currTexMemReq < grTexMaxAddress(currTMU) ); - grTexDownloadMipMap( currTMU, currStartAdd, - GR_MIPMAPLEVELMASK_ODD, lpThisTexInfo ); - lpThisTxMnTexture->u1.oddAdd = currStartAdd; - currStartAdd += currTexMemReq; - } /* else !IS_MULTIBASE && IS_TRILINEAR */ - } /* if !IS_MULTIBASE */ - else /* else it is multibased */ - { - /* stack frame definitions */ - FxU32 *lpxAdd; - GrTexBaseRange_t tTxBse; - - grTexMultibase(currTMU, FXTRUE); /* turn on multibase */ - if (!IS_TRILINEAR(*lpThisTxMnTexture)) - { /* non trilinear mip'd multibase texture - ** if bMultiRevOrder is True, get the addresses for the Multibase segs - ** in reverse order, 32_TO_1 to 256, else get them in 256 to 32_TO_1 */ - - for ( tTxBse = bMultiRevOrder ? GR_TEXBASE_32_TO_1 : GR_TEXBASE_256, - lpxAdd = bMultiRevOrder ? &lpThisTxMnTexture->u3.multiR3Add : - &lpThisTxMnTexture->u0.multiR0Add; - bMultiRevOrder ? lpxAdd >= &lpThisTxMnTexture->u0.multiR0Add : - lpxAdd <= &lpThisTxMnTexture->u3.multiR3Add; - (bMultiRevOrder ? --tTxBse : ++tTxBse), - (bMultiRevOrder ? --lpxAdd : ++lpxAdd) ) - { /* this loop just gets the texture addresses - the multibase - ** segments will be in reverse order, but in the same linear block */ - currTexMemReq = prTexMultiMemRequired( GR_MIPMAPLEVELMASK_BOTH, - tTxBse, lpThisTexInfo); - if (currTexMemReq != 0) /* if the LOD(s) !missing, ie. pop'd */ - { - assert( currStartAdd + currTexMemReq < grTexMaxAddress(currTMU) ); - *lpxAdd = currStartAdd; - currStartAdd += currTexMemReq; /* bump the current TMU address */ - } - } /* for */ - for ( tTxBse = GR_TEXBASE_256, lpxAdd = &lpThisTxMnTexture->u0.multiR0Add; - lpxAdd <= &lpThisTxMnTexture->u3.multiR3Add; - ++tTxBse, ++lpxAdd ) - { /* this loop actually does the downloading - in the proper order... - ** GR_TEXBASE_256 to GR_TEXBASE_32_TO_1 */ - - /* stack frame definitions */ - GrTexInfo tmpInfo; - GrTexInfo *lpTmpInfo = &tmpInfo; - - /* initializations */ - /* multibase requires that I munge the data for downloading */ - *lpTmpInfo = *lpThisTexInfo; - if ((lpThisTexInfo->largeLod <= (FxI32) tTxBse ) && - (lpThisTexInfo->smallLod >= (FxI32) tTxBse )) - { /* if the TexBase exists in the lod range */ - while ( lpTmpInfo->largeLod < (FxI32) tTxBse ) - prPopLod( lpTmpInfo, topOfMipMap ); /* munge the top */ - - if ( tTxBse != GR_TEXBASE_32_TO_1 ) - lpTmpInfo->smallLod = lpTmpInfo->largeLod; /* munge the btm */ - - grTexDownloadMipMap(currTMU, *lpxAdd, /* download mung'd data */ - GR_MIPMAPLEVELMASK_BOTH, lpTmpInfo ); - } /* if */ - } /* for */ - } /* if !IS_TRILINEAR && IS_MULTIBASE */ - else - { /* else it is a multibased trilinear mipmap, aka motherfucker - ** if bMultiRevOrder is True, get the addresses for the Multibase segs - ** in reverse order, 32_TO_1 to 256, else get them in 256 to 32_TO_1 */ - for (tTxBse = bMultiRevOrder ? GR_TEXBASE_32_TO_1+1 : GR_TEXBASE_256, - lpxAdd = bMultiRevOrder ? &lpThisTxMnTexture->u4.multiR3EvenAdd : - &lpThisTxMnTexture->u0.multiR0EvenAdd; - bMultiRevOrder ? lpxAdd >= &lpThisTxMnTexture->u0.multiR0EvenAdd : - lpxAdd <= &lpThisTxMnTexture->u4.multiR3EvenAdd; - (bMultiRevOrder ? --tTxBse : ++tTxBse), - (bMultiRevOrder ? --lpxAdd : ++lpxAdd) ) - { /* this loop just gets the texture addresses */ - if ( tTxBse % 2 ) /* is it odd? */ - currTexMemReq = prTexMultiMemRequired(GR_MIPMAPLEVELMASK_ODD, - tTxBse, lpThisTexInfo); /* 1,3 */ - else /* even */ - currTexMemReq = prTexMultiMemRequired(GR_MIPMAPLEVELMASK_EVEN, - (tTxBse>3?3:tTxBse), - lpThisTexInfo);/* 0,2,3 */ - /* prTexMulti.. only knows about 0-3 */ - if (currTexMemReq != 0) /* if the LOD(s) !missing, ie. pop'd */ - { - assert( currStartAdd + currTexMemReq < grTexMaxAddress(currTMU) ); - *lpxAdd = currStartAdd; - currStartAdd += currTexMemReq;/* bump the current TMU address */ - } - } /* for */ - for (tTxBse = GR_TEXBASE_256, - lpxAdd = &lpThisTxMnTexture->u0.multiR0EvenAdd; - lpxAdd <= &lpThisTxMnTexture->u4.multiR3EvenAdd; - ++tTxBse, ++lpxAdd ) /* tTxBse will actually overrun... - ** overrun = GR_TEXBASE_32_TO_1 + 1 - ** (tTxBse>3?3:tTxBse) will fix this - ** required for 32to1_ODD and 32to1_EVEN */ - /* actually (tTxBse>GR_TEXBASE_32_TO_1:GR_TEXBASE_32_TO_1?tTxBse) */ - { /* this loop actually does the downloading - in the proper order... - ** GR_TEXBASE_256 to GR_TEXBASE_32_TO_1 */ - - /* stack frame definitions */ - GrTexInfo tmpInfo; - GrTexInfo *lpTmpInfo = &tmpInfo; - - /* initializations */ - /* multibase requires that I munge the data, hence the data copies */ - *lpTmpInfo = *lpThisTexInfo; - - if ((lpThisTexInfo->largeLod <= (FxI32) (tTxBse>3?3:tTxBse)) && - (lpThisTexInfo->smallLod >= (FxI32) (tTxBse>3?3:tTxBse))) - { /* if an lod actually exits in the range */ - while ( lpTmpInfo->largeLod < (FxI32)(tTxBse>3?3:tTxBse) ) - prPopLod( lpTmpInfo, topOfMipMap ); /* munge the top */ - - if ( (tTxBse>3?3:tTxBse) != GR_TEXBASE_32_TO_1 ) - lpTmpInfo->smallLod = lpTmpInfo->largeLod; /* munge the btm */ - - if ( tTxBse % 2 ) /* is it odd? */ - grTexDownloadMipMap(currTMU, *lpxAdd, /* download mung'd odd data */ - GR_MIPMAPLEVELMASK_ODD, lpTmpInfo ); - else - grTexDownloadMipMap(currTMU, *lpxAdd, /* download mung'd even data */ - GR_MIPMAPLEVELMASK_EVEN, lpTmpInfo ); - } /* if */ - } /* for */ - } /* else IS_TRILINEAR && IS_MULTIBASE */ - grTexMultibase(currTMU, FXFALSE); /* turn off multibase */ - } /* else IS_MULTIBASE */ - if ( lpThisTlTex->tableType != NO_TABLE ) - grTexDownloadTable(currTMU, lpThisTlTex->tableType, - &lpThisTlTex->tableData ); - } /* if IS_DOWNLOADABLE */ - } /* for ( i = 0; i < fstOpnTexId; ++i ) */ -} /* plTxMnDownloadAll */ -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnTexSource - Date: 6/28/97 - Implementor(s): psw - Library: - Description: - Renders the texture associated with hTexId. Will setup the rendering - modes based upon the tlTxMnMngr[deTexId].flags fields, i.e., - (linear || multibase) && (BOTH || EVEN/ODD) modes. Also uses - the addresses saved by previous call to tlTxMnDownloadAll - Arguments: - hTexId_t deTexId - handle to the texture - FxU32 deMipMask - mipmap mask - Return: - void - -------------------------------------------------------------------*/ -void -plTxMnTexSource( hTexId_t deTexId, FxU32 deMipMask ) -{ - /* definitions */ - tlTxMnTexture_t *lpThisTxMnTexture; - GrTexInfo thisTexInfo, - *lpThisTexInfo; - TlTexture *lpThisTlTex; - FxU32 *lpxAdd, - xAdd; - GrTexBaseRange_t tTexBase; - - /* assumptions */ - assert( deTexId < hFstOpnTexId ); - assert((deMipMask >= GR_TEXBASE_256) && - (deMipMask <= GR_TEXBASE_32_TO_1)); - - /* initializations */ - lpThisTxMnTexture = &tlTxMnMngr[deTexId]; - lpThisTlTex = lpThisTxMnTexture->lpTlTextureInfo; - lpThisTexInfo = &thisTexInfo; - *lpThisTexInfo = lpThisTxMnTexture->lpTlTextureInfo->info; - -/* - if ((lpThisTlTex->tableType == GR_NCCTABLE_NCC0) || - (lpThisTlTex->tableType == GR_NCCTABLE_NCC1)) - grTexNCCTable( currTMU, lpThisTlTex->tableType ); -*/ - if (!IS_MULTIBASE(*lpThisTxMnTexture)) - { /* not multibased */ - if (!IS_TRILINEAR(*lpThisTxMnTexture)) - grTexSource( currTMU, lpThisTxMnTexture->u0.bothAdd, deMipMask, lpThisTexInfo ); - else /* IS_TRILINEAR */ - if ( deMipMask == GR_MIPMAPLEVELMASK_EVEN ) /* first do the even segment */ - grTexSource( currTMU, lpThisTxMnTexture->u0.evenAdd, deMipMask, lpThisTexInfo ); - else /* next do the odd segment */ - grTexSource( currTMU, lpThisTxMnTexture->u1.oddAdd, deMipMask, lpThisTexInfo ); - }/* if !IS_MULTIBASE */ - else - { /* else it is multibased */ - grTexMultibase(currTMU, FXTRUE); /* turn on multibase */ - if (!IS_TRILINEAR(*lpThisTxMnTexture)) - { /* really dependant on the unions being in the proper order */ - lpxAdd = &lpThisTxMnTexture->u0.multiR0Add; - for (tTexBase = GR_TEXBASE_256; tTexBase <= GR_TEXBASE_32_TO_1; - ++tTexBase, ++lpxAdd) - /* next i check that the current TexBase is in the lod range */ - if ((lpThisTexInfo->largeLod <= (FxI32) tTexBase) && - (lpThisTexInfo->smallLod >= (FxI32) tTexBase)) - { - xAdd = *lpxAdd; - if (bMultiOffsetFix) - xAdd -= prGetMultiMemBump(lpThisTexInfo, tTexBase, deMipMask); - grTexMultibaseAddress(currTMU, tTexBase, xAdd, deMipMask, - lpThisTexInfo ); - } - } /* if !IS_TRILINEAR */ - else - { /* else it is a multibased trilinear mipmap */ - if ( deMipMask == GR_MIPMAPLEVELMASK_EVEN ) /* do the even segments */ - { - lpxAdd = &lpThisTxMnTexture->u0.multiR0EvenAdd;/* set lpxAdd to 1st add */ - for (tTexBase = GR_TEXBASE_256; tTexBase <= GR_TEXBASE_32_TO_1; - tTexBase = ( tTexBase + 2 == GR_TEXBASE_32_TO_1 + 1 ) ? /* 32t1 is both even & odd */ - GR_TEXBASE_32_TO_1 : tTexBase + 2, lpxAdd += 2 ) /* even segs r at even indices */ - /* next i check that the current TexBase is in the lod range */ - if ((lpThisTexInfo->largeLod <= (FxI32) tTexBase) && - (lpThisTexInfo->smallLod >= (FxI32) tTexBase)) - { - xAdd = *lpxAdd; - if (bMultiOffsetFix) - xAdd -= prGetMultiMemBump(lpThisTexInfo, tTexBase, deMipMask); - grTexMultibaseAddress(currTMU, tTexBase, xAdd, deMipMask, - lpThisTexInfo); - } - } /* if - even */ - else /* else do the odd segments */ - { - lpxAdd = &lpThisTxMnTexture->u1.multiR1OddAdd; - for (tTexBase = GR_TEXBASE_128; tTexBase <= GR_TEXBASE_32_TO_1; - tTexBase+=2, lpxAdd+=2 ) /* odd segs r at odd indices */ - /* next i check that the current TexBase is in the lod range */ - if ((lpThisTexInfo->largeLod <= (FxI32) tTexBase) && - (lpThisTexInfo->smallLod >= (FxI32) tTexBase)) - { - xAdd = *lpxAdd; - if (bMultiOffsetFix) - xAdd -= prGetMultiMemBump(lpThisTexInfo, tTexBase, deMipMask); - grTexMultibaseAddress( currTMU, tTexBase, xAdd, deMipMask, - lpThisTexInfo ); - } - } /* else - odd */ - } /* else IS_TRILINEAR && IS_MULTIBASE */ - grTexMultibase(currTMU, FXFALSE); /* turn off multibase */ - } /* else IS_MULTIBASE */ -} /* plTxMnRender */ -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnGetInfo - Date: 6/27/97 - Implementor(s): psw - Library: - Description: - simply fills in GrTexInfo struct with info about Texture - Arguments: - hTexId_t deTexHndl - the texture that you want to know about - GrTexInfo *deGrTexInfo - the info struct you want filled - Return: - void - -------------------------------------------------------------------*/ -void -plTxMnGetInfo( hTexId_t deTexHndl, GrTexInfo *deGrTexInfo ) -{ - - /* assumptions */ - assert (deGrTexInfo); - assert ( deTexHndl < hFstOpnTexId ); - - *deGrTexInfo = tlTxMnMngr[deTexHndl].lpTlTextureInfo->info; -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plPopLod - Date: 6/17/97 - Implementor(s): psw - Library: - Description: - Basically a wrapper for prPopLod - Arguments: - hTexId_t thisTexId - mipMapEnd_t deMipMapEnd - Return: - none - -------------------------------------------------------------------*/ -void -plPopLod( hTexId_t hCurrTexture, mipMapEnd_t deMipMapEnd ) -{ - /* definitions */ - GrTexInfo *lpThisTexInfo; - tlTxMnTexture_t *lpThisTxMnTexture; - - /* assumptions */ - assert( hCurrTexture < hFstOpnTexId ); - - - /* initializations */ - lpThisTxMnTexture = &tlTxMnMngr[hCurrTexture]; - lpThisTexInfo = &lpThisTxMnTexture->lpTlTextureInfo->info; - - /* code */ - if ( lpThisTexInfo->smallLod == lpThisTexInfo->largeLod ) - return; /* no reason to go on, nothing to do */ - - if ((IS_TRILINEAR(*lpThisTxMnTexture)) && - ((lpThisTexInfo->smallLod - lpThisTexInfo->largeLod) == 2 ) ) - return; /* trilinear && <2-lods are mutex */ - - prPopLod( lpThisTexInfo, deMipMapEnd ); -} /* plPopLod */ -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plPushLod - Date: 6/17/97 - Implementor(s): psw - Library: - Description: - Basically a wrapper for prPushLod - Arguments: - hTexId_t thisTexId - mipMapEnd_t deMipMapEnd - Return: - none - -------------------------------------------------------------------*/ -void -plPushLod( hTexId_t hCurrTexture, mipMapEnd_t deMipMapEnd ) -{ - /* definitions */ - GrTexInfo *lpThisTexInfo;/* info struct associated with curr tlTxMnMnger obj */ - tlTxMnTexture_t *lpThisTxMnTexture; - - /* assumptions */ - assert( hCurrTexture < hFstOpnTexId ); - - /* initializations */ - lpThisTxMnTexture = &tlTxMnMngr[hCurrTexture]; - lpThisTexInfo = &lpThisTxMnTexture->lpTlTextureInfo->info; - - /* code */ - if ((deMipMapEnd == topOfMipMap) && - (lpThisTexInfo->largeLod == lpThisTxMnTexture->origLargeLod)) - return; /* already at the top of the stack */ - - if ((deMipMapEnd == btmOfMipMap) && - (lpThisTexInfo->smallLod == lpThisTxMnTexture->origSmallLod)) - return; /* already at the bottom of the stack */ - - prPushLod( lpThisTexInfo, deMipMapEnd); -} /* plPushLod */ -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plCreateTlTexture - Date: 6/20/97 - Implementor(s): psw - Library: - Description: - creates a TlTexture - Arguments: - GrTexInfo* - FxU16 [] - Return: - void - -------------------------------------------------------------------*/ -void -plCreateTlTexture( TlTexture *deTlTexture, FxU16 daColors[] ) -{ - /* definitions */ - GrLOD_t tCurrLod; /* the current LOD */ - int nBytePerPixel; /* number of bytes per pixel */ - FxU8 *spLilTex; /* 8bit LOD data ptr */ - FxU16 *mpBigTex; /* 16bit LOD data ptr */ - void *lpvCurrLod; /* curr LOD data ptr */ - FxU32 xLodNumBytes; /* number of bytes to write in curr LOD */ - GrTexInfo *lpThisTexInfo; /* ptr to GrTexInfo in TlTexture struct */ - - /* assumptions */ - assert( deTlTexture ); - assert( deTlTexture->info.data ); - assert( deTlTexture->info.smallLod > deTlTexture->info.largeLod ); - - /* no palettized */ - assert( (deTlTexture->info.format != GR_TEXFMT_YIQ_422) || - (deTlTexture->info.format != GR_TEXFMT_P_8) || - (deTlTexture->info.format != GR_TEXFMT_AYIQ_8422) || - (deTlTexture->info.format != GR_TEXFMT_AP_88) ); - - /* initializations */ - lpThisTexInfo = &deTlTexture->info; - - /* code */ - if ((lpThisTexInfo->format == GR_TEXFMT_RGB_332) || - (lpThisTexInfo->format == GR_TEXFMT_YIQ_422) || - (lpThisTexInfo->format == GR_TEXFMT_ALPHA_8) || - (lpThisTexInfo->format == GR_TEXFMT_INTENSITY_8) || - (lpThisTexInfo->format == GR_TEXFMT_P_8)) - nBytePerPixel = 1; /* 8-bit formats */ - else - nBytePerPixel = 2; /* 16-bit formats */ - - lpvCurrLod = lpThisTexInfo->data; - - if ((deTlTexture->info.format != GR_TEXFMT_YIQ_422) || - (deTlTexture->info.format != GR_TEXFMT_P_8) || - (deTlTexture->info.format != GR_TEXFMT_AYIQ_8422) || - (deTlTexture->info.format != GR_TEXFMT_AP_88) ) - deTlTexture->tableType = NO_TABLE; /* fuck me */ - - for ( tCurrLod = lpThisTexInfo->largeLod; - tCurrLod <= (lpThisTexInfo->smallLod); ++tCurrLod ) - { - if ( nBytePerPixel == 1 ) - { - xLodNumBytes = prGetLodSize( lpThisTexInfo, tCurrLod ); - for (spLilTex = (FxU8*) lpvCurrLod; - spLilTex < (FxU8*) ((FxU32)lpvCurrLod + xLodNumBytes); - ++spLilTex ) - *spLilTex = (FxU8) daColors[tCurrLod]; - - lpvCurrLod = (void*) spLilTex; - } - else - { - xLodNumBytes = prGetLodSize( lpThisTexInfo, tCurrLod ); - for (mpBigTex = (FxU16*) lpvCurrLod; - mpBigTex < (FxU16*) ((FxU32)lpvCurrLod + xLodNumBytes); - ++mpBigTex ) - *mpBigTex = daColors[tCurrLod]; - - lpvCurrLod = (void*) mpBigTex; - } - } -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnDwnldMipMapLod - Date: 7/7/97 - Implementor(s): psw - Library: - Description: - downloads a mipmap lod, deLod, from a src TxMnTexture to a dst - TxMnTexture. - ***multibase not yet supported, not clearly defined - Arguments: - hTexId_t dstTexId - destination TxMnTexture id - hTexId_t srcTexId - source TxMnTexture id - GrLOD_t deLod - the lod to download in srcTexId - Return: - void - -------------------------------------------------------------------*/ -void -plTxMnDwnldMipMapLod( hTexId_t dstTexId, hTexId_t srcTexId, GrLOD_t deLod ) -{ - /* definitions */ - GrTexInfo *lpDstTexInfo, - *lpSrcTexInfo; - tlTxMnTexture_t *lpDstTxMnTexture, - *lpSrcTxMnTexture; - void *lpvData; - FxU32 thisAdd; - GrLOD_t thisLgLod; - FxU32 thisMask; - - /* assumptions */ - assert( dstTexId < hFstOpnTexId ); - assert( srcTexId < hFstOpnTexId ); - assert( IS_DOWNLOADABLE(tlTxMnMngr[dstTexId]) ); - - /* initializations */ - lpDstTxMnTexture = &tlTxMnMngr[dstTexId]; - lpSrcTxMnTexture = &tlTxMnMngr[srcTexId]; - lpDstTexInfo = &lpDstTxMnTexture->lpTlTextureInfo->info; - lpSrcTexInfo = &lpSrcTxMnTexture->lpTlTextureInfo->info; - - /* just some error checking */ - if ( ((lpDstTexInfo->format) != (lpSrcTexInfo->format)) || - ((lpDstTexInfo->aspectRatio) != (lpSrcTexInfo->aspectRatio)) || - ((lpSrcTxMnTexture->origLargeLod) > deLod) || - ((lpSrcTxMnTexture->origSmallLod) < deLod) || - ((lpDstTxMnTexture->origLargeLod) > deLod) || - ((lpDstTxMnTexture->origSmallLod) < deLod) ) - return; /* nonfatal error, just return */ - - /* code */ - /* get the data */ - lpvData = malloc(prGetLodSize(lpSrcTexInfo, deLod)); - assert(lpvData); - prGetLod(lpSrcTexInfo, deLod, lpvData); - /* now i have an lod to download */ - - /* get the address */ - thisAdd = prGetTxMnAdd( dstTexId, deLod ); - /* get the mask */ - if (!IS_TRILINEAR(*lpDstTxMnTexture)) - thisMask = GR_MIPMAPLEVELMASK_BOTH; - else /* it is trilinear */ - thisMask = deLod%2 ? GR_MIPMAPLEVELMASK_ODD : GR_MIPMAPLEVELMASK_EVEN; - - /* get the largeLod, SPECIAL case for multibase */ - if (!IS_MULTIBASE(*lpDstTxMnTexture)) - thisLgLod = lpDstTexInfo->largeLod; - else /* is is multibase */ - thisLgLod = deLod < GR_LOD_32 ? deLod : - lpDstTexInfo->largeLod > GR_LOD_32 ? - lpDstTexInfo->largeLod : GR_LOD_32; - - grTexDownloadMipMapLevel( currTMU, thisAdd, deLod, thisLgLod, - lpDstTexInfo->aspectRatio, lpDstTexInfo->format, - thisMask, lpvData ); - free(lpvData); -} /* plTxMnDwnldMipMapLod */ -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnDwnldMipMapLod - Date: 7/7/97 - Implementor(s): psw - Library: - Description: - downloads a mipmap lod, deLod, from a src TxMnTexture to a dst - TxMnTexture. - Arguments: - hTexId_t dstTexId - destination TxMnTexture id - hTexId_t srcTexId - source TxMnTexture id - GrLOD_t deLod - the lod to download in srcTexId - Return: - void - -------------------------------------------------------------------*/ -void -plTxMnDwnldMipMapLodPrtl( hTexId_t dstTexId, hTexId_t srcTexId, GrLOD_t deLod, - int nFstRow, int nLstRow ) -{ - /* definitions */ - GrTexInfo *lpDstTexInfo, - *lpSrcTexInfo; - tlTxMnTexture_t *lpDstTxMnTexture, - *lpSrcTxMnTexture; - void *lpvData; - FxU32 thisAdd; - GrLOD_t thisLgLod; - FxU32 thisMask; - - /* assumptions */ - assert( dstTexId < hFstOpnTexId ); - assert( srcTexId < hFstOpnTexId ); - assert( IS_DOWNLOADABLE(tlTxMnMngr[dstTexId]) ); - assert( nFstRow <= nLstRow ); - - /* initializations */ - lpDstTxMnTexture = &tlTxMnMngr[dstTexId]; - lpSrcTxMnTexture = &tlTxMnMngr[srcTexId]; - lpDstTexInfo = &lpDstTxMnTexture->lpTlTextureInfo->info; - lpSrcTexInfo = &lpSrcTxMnTexture->lpTlTextureInfo->info; - - /* code */ - /* just some error checking */ - if ( ((lpDstTexInfo->format) != (lpSrcTexInfo->format)) || - ((lpDstTexInfo->aspectRatio) != (lpSrcTexInfo->aspectRatio)) || - ((lpSrcTxMnTexture->origLargeLod) > deLod) || - ((lpSrcTxMnTexture->origSmallLod) < deLod) || - ((lpDstTxMnTexture->origLargeLod) > deLod) || - ((lpDstTxMnTexture->origSmallLod) < deLod) || - (nFstRow > prGetLodHeight( deLod, lpDstTexInfo->aspectRatio)) ) - return; /* nonfatal error, just return */ - - /* because i'm a nice guy */ -// if (nLstRow >= prGetLodHeight( deLod, lpDstTexInfo->aspectRatio)) -// nLstRow = (-1) + prGetLodHeight( deLod, lpDstTexInfo->aspectRatio); - /* not so nice */ - - /* get the data */ - lpvData = malloc(prGetLodSize(lpSrcTexInfo, deLod)); - assert(lpvData); - prGetLod(lpSrcTexInfo, deLod, lpvData); - /* now i have an lod to download */ - - /* get the address */ - thisAdd = prGetTxMnAdd( dstTexId, deLod ); - - /* get the mask */ - if (!IS_TRILINEAR(*lpDstTxMnTexture)) - thisMask = GR_MIPMAPLEVELMASK_BOTH; - else /* it is trilinear */ - thisMask = deLod%2 ? GR_MIPMAPLEVELMASK_ODD : GR_MIPMAPLEVELMASK_EVEN; - - /* get the largeLod, SPECIAL case for multibase */ - if (!IS_MULTIBASE(*lpDstTxMnTexture)) - thisLgLod = lpDstTexInfo->largeLod; - else /* is is multibase */ - thisLgLod = deLod < GR_LOD_32 ? deLod : - lpDstTexInfo->largeLod > GR_LOD_32 ? - lpDstTexInfo->largeLod : GR_LOD_32; - - grTexDownloadMipMapLevelPartial( currTMU, thisAdd, deLod, thisLgLod, - lpDstTexInfo->aspectRatio, lpDstTexInfo->format, - thisMask, lpvData, nFstRow, nLstRow ); - free(lpvData); -} -/*-------------------------------------------------------------------*/ - - - -/* static helpers */ - -/*------------------------------------------------------------------- - Function: prGetTxMnAdd - Date: 7/14/97 - Implementor(s): psw - Library: - Description: - returns the address of the texture seg in linear memory that contains - the LOD being sought based on TxMn id - Arguments: - hTexId_t deTexId - destination TxMnTexture id - GrLOD_t deLod - the lod to locate the seg in - Return: - FxU32 - address of the seg containing deLod - -------------------------------------------------------------------*/ -static FxU32 -prGetTxMnAdd( hTexId_t deTexId, GrLOD_t deLod ) -{ - /* definitions */ - tlTxMnTexture_t *lpThisTxMnTxtre; - FxU32 xAdd; - - /* initializations */ - lpThisTxMnTxtre = &tlTxMnMngr[deTexId]; - - /* code */ - if (!IS_MULTIBASE(*lpThisTxMnTxtre)) - { /* not multibased */ - if (!IS_TRILINEAR(*lpThisTxMnTxtre)) - xAdd = lpThisTxMnTxtre->u0.bothAdd; - else /* IS_TRILINEAR */ - xAdd = (deLod%2) ? lpThisTxMnTxtre->u1.oddAdd : - lpThisTxMnTxtre->u0.evenAdd ; - } /* if !IS_MULTIBASE */ - else /* this is going to be fucking ugly! */ - { /* else it is multibased */ - if (!IS_TRILINEAR(*lpThisTxMnTxtre)) - { - switch ( deLod ) - { /* some things are better done with a switch... */ - case GR_LOD_256: - xAdd = (FxU32) &lpThisTxMnTxtre->u0.multiR0Add; - break; - - case GR_LOD_128: - xAdd = (FxU32) &lpThisTxMnTxtre->u1.multiR1Add; - break; - - case GR_LOD_64: - xAdd = (FxU32) &lpThisTxMnTxtre->u2.multiR2Add; - break; - - default: - xAdd = (FxU32) &lpThisTxMnTxtre->u3.multiR3Add; - break; - } - } /* if !IS_TRILINEAR */ - else - { - switch ( deLod ) - { /* some things are better done with a switch... */ - case GR_LOD_256: - xAdd = (FxU32) &lpThisTxMnTxtre->u0.multiR0EvenAdd; - break; - - case GR_LOD_128: - xAdd = (FxU32) &lpThisTxMnTxtre->u1.multiR1OddAdd; - break; - - case GR_LOD_64: - xAdd = (FxU32) &lpThisTxMnTxtre->u2.multiR2EvenAdd; - break; - - default: /* deLod <= 32_TO_1, key is could be < */ - xAdd = (deLod % 2) ? (FxU32) &lpThisTxMnTxtre->u3.multiR3OddAdd : - (FxU32) &lpThisTxMnTxtre->u4.multiR3EvenAdd; - break; - } - } /* else IS_TRILINEAR */ - } /* else IS_MULTIBASE */ - - return (xAdd); -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: prGetLod - Date: 7/7/97 - Implementor(s): psw - Library: - Description: - gets the lod specific data out of a GrTexInfo designated by - lpTexInfo, used primarily by plTxMnDwnldMipMapLod - Arguments: - GrTexInfo *lpTexInfo - destination TxMnTexture id - GrLOD_t deLod - the lod get in deTexId - void *lpvData - pointer to data to propagate - Return: - void - -------------------------------------------------------------------*/ -static void -prGetLod( GrTexInfo *lpTexInfo, GrLOD_t deLod, void *lpvData ) -{ - /* definitions */ - GrTexInfo thisTexInfo, - *lpThisTexInfo; - GrLOD_t lod; - FxU32 i, xNumBytes; - FxU8 *lpSrc, - *lpDst; - - /* initializations */ - lpThisTexInfo = &thisTexInfo; - *lpThisTexInfo = *lpTexInfo; /* munge a copy */ - - /* code */ - /* mod copy to get deLod at the top */ - for ( lod = lpThisTexInfo->largeLod; lod < deLod; ++lod ) - prPopLod( lpThisTexInfo, topOfMipMap ); - - /* get the size of top lod */ - xNumBytes = prGetLodSize( lpThisTexInfo, lpThisTexInfo->largeLod ); - - /* read the top lod data into *lpvData */ - lpSrc = (FxU8*) lpThisTexInfo->data; - lpDst = (FxU8*) lpvData; - - for ( i = 0; i < xNumBytes; ++i ) - *lpDst++ = *lpSrc++; -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: prPushLod - Date: 7/7/97 - Implementor(s): psw - Library: - Description: - This routine actually modifies the GrTexInfo struct data to push - data BACK on the top or bottom of the mipmap. pushes a single lod - Arguments: - GrTexInfo *lpDeTexInfo - mipMapEnd_t deMipMapEnd - Return: - none - -------------------------------------------------------------------*/ -static void -prPushLod( GrTexInfo *lpDeTexInfo, mipMapEnd_t deMipMapEnd ) -{ - if (deMipMapEnd == topOfMipMap) - lpDeTexInfo->data = (void*)( (FxU32) lpDeTexInfo->data - - prGetLodSize(lpDeTexInfo, --lpDeTexInfo->largeLod)); - else - ++lpDeTexInfo->smallLod; -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: prPopLod - Date: 7/7/97 - Implementor(s): psw - Library: - Description: - This routine actually modifies the GrTexInfo struct data to pop - data off the top or bottom of the mipmap. pops off a single lod - Arguments: - GrTexInfo *lpDeTexInfo - mipMapEnd_t deMipMapEnd - Return: - none - -------------------------------------------------------------------*/ -static void -prPopLod( GrTexInfo *lpDeTexInfo, mipMapEnd_t deMipMapEnd ) -{ - if (deMipMapEnd == topOfMipMap) - lpDeTexInfo->data = (void*)( (FxU32) lpDeTexInfo->data + - prGetLodSize(lpDeTexInfo, lpDeTexInfo->largeLod++)); - else - --lpDeTexInfo->smallLod; -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: prGetLodSize - Date: 6/18/97 - Implementor(s): psw - Library: - Description: - returns the size, in number of bytes, of an LOD based upon format, - LOD level and aspect ratio. this routine is meant to be used on - the void* in the GrTexInfo struct. - Arguments: - GrTexInfo *const disTexInfo - pointer to the Texture Info - GrLOD_t disLOD - the lod to get the size of - Return: - FxU32 - -------------------------------------------------------------------*/ -static FxU32 -prGetLodSize( GrTexInfo *const deTexInfo, GrLOD_t deLod ) -{ - /* definitions */ - int nPxlFctr; - int yAspctDvdr[] = {3, 2, 1, 0, 1, 2, 3}; /* ie. GR_ASPECT_1x8 = 2^3 */ - int yLodFctr[] = {8, 7, 6, 5, 4, 3, 2, 1, 0}; /* ie. GR_LOD_256 = 2^8 */ - FxU32 xNumBytes; - GrAspectRatio_t thisAR; - GrLOD_t thisLod; - - /* code */ - if ((deTexInfo->format == GR_TEXFMT_RGB_332) || - (deTexInfo->format == GR_TEXFMT_YIQ_422) || - (deTexInfo->format == GR_TEXFMT_ALPHA_8) || - (deTexInfo->format == GR_TEXFMT_INTENSITY_8) || - (deTexInfo->format == GR_TEXFMT_P_8)) - nPxlFctr = 1; /* 8-bit formats */ - else - nPxlFctr = 2; /* all else are 16-bit formats */ - - thisAR = deTexInfo->aspectRatio; /* thisAspectRatio */ - thisLod = deLod; /* thisLod */ - - /* the general formula is xNumBytes=nBytesPerPixel*nPixels - ** nPixels=maxPixels/aspectRatio - ** maxPixels for GR_LOD_256=256*256 or 2^8*2^8, hence the following formula...*/ - if ( yAspctDvdr[thisAR] < yLodFctr[thisLod] ) - xNumBytes = nPxlFctr << yLodFctr[thisLod] << yLodFctr[thisLod] >> - yAspctDvdr[thisAR]; - else - xNumBytes = nPxlFctr << yLodFctr[thisLod]; - - return xNumBytes; -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: prTexMultiMemRequired - Date: 6/27/97 - Implementor(s): psw - Library: - Description: - calculates and returns the amount of memory required for the - individual multibase texture segments in BOTH, EVEN or ODD modes - traps cases for missing LODs - Arguments: - FxU32 deMipMask (GR_MIPMAPLEVELMASK) - GrTexBaseRange_t deRange - GrAspectRatio_t deRatio - GrTextureFormat_t deFormat - Return: - FxU32 - memory required - -------------------------------------------------------------------*/ -static -FxU32 prTexMultiMemRequired( FxU32 deMipMask, GrTexBaseRange_t deMultiSeg, - GrTexInfo* deTexInfo ) -{ - /* definitions */ - GrTexInfo tmpTexInfo, - *lpTmpTexInfo; /* create a copy of the GrTexInfo */ - FxU32 thisSegMemReq = 0x0; - GrLOD_t lod; - - /* initializations */ - lpTmpTexInfo = &tmpTexInfo; - *lpTmpTexInfo = *deTexInfo; /* copy passed data, then prepare to munge */ - - /* code */ - if ((lpTmpTexInfo->largeLod > (FxI32) deMultiSeg) || - (lpTmpTexInfo->smallLod < (FxI32) deMultiSeg)) - return 0; /* the deMultiSeg !exist in the lod range of info */ - - /* else it does */ - for (lod = lpTmpTexInfo->largeLod; lod < (FxI32) deMultiSeg; ++lod) - prPopLod( lpTmpTexInfo, topOfMipMap ); /* munge the top */ - - if ( deMultiSeg != GR_TEXBASE_32_TO_1) - lpTmpTexInfo->smallLod = lpTmpTexInfo->largeLod; /* munge the btm */ - - thisSegMemReq = grTexTextureMemRequired( deMipMask, lpTmpTexInfo ); - - return thisSegMemReq; -} /* prTexMultiMemRequired */ -/*-------------------------------------------------------------------*/ - - - -/*-------------------------------------------------------------------*/ -static int -prGetLodWidth( GrLOD_t lod, GrAspectRatio_t aspect ) -{ - int yAspctWdvdr[] = {0, 0, 0, 0, 1, 2, 3}; - int yLodFctr[] = {8, 7, 6, 5, 4, 3, 2, 1, 0}; - int val; - - val = yLodFctr[lod] > yAspctWdvdr[aspect] ? - 1 << yLodFctr[lod] >> yAspctWdvdr[aspect] : 1; - - return( val ); -} -/*-------------------------------------------------------------------*/ - - - -/*-------------------------------------------------------------------*/ -static int -prGetLodHeight( GrLOD_t lod, GrAspectRatio_t aspect ) -{ - int yAspctHdvdr[] = {3, 2, 1, 0, 0, 0, 0}; - int yLodFctr[] = {8, 7, 6, 5, 4, 3, 2, 1, 0}; - int val; - - val = yLodFctr[lod] > yAspctHdvdr[aspect] ? - 1 << yLodFctr[lod] >> yAspctHdvdr[aspect] : 1; - - return( val ); -} -/*-------------------------------------------------------------------*/ - - - -/*-------------------------------------------------------------------*/ -static FxU32 -prGetMultiMemBump( const GrTexInfo *const deTexInfo, - GrTexBaseRange_t deTexBase, - FxU32 deMipMask ) -{ /* this fixes some multibase fuckage */ - /* definitions */ - FxU32 xMemBump, - xAllMemReq, - xSegMemReq; - GrTexInfo tmpTexInfo, - *lpTmpTexInfo; - - /* initializations */ - lpTmpTexInfo = &tmpTexInfo; - *lpTmpTexInfo = *deTexInfo; - - /* code */ - lpTmpTexInfo->largeLod = GR_LOD_256; - xAllMemReq = grTexTextureMemRequired( deMipMask, lpTmpTexInfo ); - - lpTmpTexInfo->largeLod = deTexBase != GR_TEXBASE_32_TO_1 ? deTexBase : - lpTmpTexInfo->largeLod > (FxI32) deTexBase ? - lpTmpTexInfo->largeLod : GR_LOD_32; - xSegMemReq = grTexTextureMemRequired( deMipMask, lpTmpTexInfo ); - - xMemBump = xAllMemReq - xSegMemReq; - return (xMemBump); -} diff --git a/glide2x/cvg/glide/tests/plib.h b/glide2x/cvg/glide/tests/plib.h deleted file mode 100644 index 933e272..0000000 --- a/glide2x/cvg/glide/tests/plib.h +++ /dev/null @@ -1,129 +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$ -** -*/ - - -#ifndef _PLIB_H_ -#define _PLIB_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum { topOfMipMap, btmOfMipMap } mipMapEnd_t; - -typedef FxU8 hTexId_t; -#define H_NULL 0x0 -#define H_FSTTEXID 0x1 - -typedef struct { - unsigned int isDownloadable : 1; /* should tex be downloaded? */ - unsigned int isMultibase : 1; /* downloaded as multibase? */ - unsigned int isTrilinear : 1; /* downloaded as EVEN/ODD? */ - unsigned int isBeenPopd : 1; /* has it been pop'd? - not used */ - unsigned int isDirty : 1; /* has it been touched? - not used */ -} tlTxMnFlags_t; - -typedef struct { - TlTexture* lpTlTextureInfo; - GrLOD_t origLargeLod; /* for pop 'n' push */ - GrLOD_t origSmallLod; /* for pop 'n' push */ - /* I need a min of 5 start addresses worst case - Trilinear Multibase - ** The unions contain start addresses that are mutually exclusive - ** ps, if the order of these unions ever change, some shit will seriously - ** break, especially in plTxMnTexSource() */ - union u0_u { /* can you believe softice doesn't understand unnamed unions? */ - FxU32 bothAdd; /* BOTH linear start */ - FxU32 evenAdd; /* EVEN linear start */ - FxU32 multiR0Add; /* BOTH multi 1st range start */ - FxU32 multiR0EvenAdd; /* EVEN multi 1st range start */ - } u0; - union u1_u { - FxU32 oddAdd; /* ODD linear start */ - FxU32 multiR1Add; /* BOTH multi 2nd range start */ - FxU32 multiR1OddAdd; /* ODD multi 2nd range start */ - } u1; - union u2_u { - FxU32 multiR2Add; /* BOTH multi 3rd range start */ - FxU32 multiR2EvenAdd; /* EVEN multi 3rd range start */ - } u2; - union u3_u { - FxU32 multiR3Add; /* BOTH multi 4th range start */ - FxU32 multiR3OddAdd; /* EVEN multi 4th range start */ - } u3; - union u4_u { - FxU32 multiR3EvenAdd; /* ODD multi 4th range start */ - } u4; /* just for consistency */ - tlTxMnFlags_t flags; -} tlTxMnTexture_t; - -/* exposed function prototypes for TxMn */ -hTexId_t plTxMnLoadTxMngr( TlTexture* lpTexture ); -void plTxMnDownloadAll( ); -void plTxMnTexSource( hTexId_t deTexId, FxU32 deMipMask ); -void plTxMnReset( hTexId_t deTexId ); -void plTxMnSetDownload( hTexId_t theTexId, FxBool bDownLoad ); -FxBool plTxMnGetMultibase( hTexId_t deTexId ); -void plTxMnSetMultibase( hTexId_t deTexId, FxBool bMultibase ); -FxBool plTxMnGetTrilinear( hTexId_t deTexId ); -void plTxMnSetTrilinear( hTexId_t theTexId, FxBool bTrilinear ); -FxBool plTxMnGetMultiRevOrder( ); -void plTxMnSetMultiOffsetFix( FxBool bOffsetFix ); -FxBool plTxMnGetMultiOffsetFix( ); -void plTxMnSetMultiRevOrder( FxBool bOrder ); -void plTxMnGetInfo( hTexId_t deTexHndl, GrTexInfo *deGrTexInfo ); -void plTxMnDwnldMipMapLod( hTexId_t dstTexId, hTexId_t srcTexId, GrLOD_t deLod ); -void plTxMnDwnldMipMapLodPrtl( hTexId_t dstTexId, hTexId_t srcTexId, GrLOD_t deLod, - int nFstRow, int nLstRow ); - -/* public helper function prototypes */ -void plPopLod( hTexId_t hCurrTexture, mipMapEnd_t mipMapEnd ); -void plPushLod( hTexId_t hCurrTexture, mipMapEnd_t mipMapEnd ); -void plCreateTlTexture( TlTexture *disTlTexture, FxU16 daColors[] ); - - - - - -/* some macros to play with the bit fields */ -#define IS_DOWNLOADABLE( tex ) (tex).flags.isDownloadable ? FXTRUE : FXFALSE -#define IS_MULTIBASE( tex ) (tex).flags.isMultibase ? FXTRUE : FXFALSE -#define IS_BEENPOPD( tex ) (tex).flags.isBeenPopd ? FXTRUE : FXFALSE -#define IS_TRILINEAR( tex ) (tex).flags.isTrilinear ? FXTRUE : FXFALSE -#define IS_DIRTY( tex ) (tex).flags.isDirty ? FXTRUE : FXFALSE -#define SET_DOWNLOADABLE( tex, b ) (tex).flags.isDownloadable = b -#define SET_MULTIBASE( tex, b ) (tex).flags.isMultibase = b -#define SET_TRILINEAR( tex, b ) (tex).flags.isTrilinear = b -#define SET_BEENPOPD( tex, b ) (tex).flags.isBeenPopd = b -#define SET_DIRTY( tex, b ) (tex).flags.isDirty = b - - -#ifdef NDEBUG -#undef NDEBUG -#endif - -#ifdef __cplusplus -} -#endif -#endif diff --git a/glide2x/cvg/glide/tests/qatest00.c b/glide2x/cvg/glide/tests/qatest00.c deleted file mode 100644 index 0690717..0000000 --- a/glide2x/cvg/glide/tests/qatest00.c +++ /dev/null @@ -1,1239 +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 -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" -#include "plib.h" -#include "qatest00.h" - -/* 1BgFile+8FgFile+3Algo+8DwnlodAlgo=21*/ -#define NUMTEXTURES 21 -myTexture_t theTextures[NUMTEXTURES]; - -TexCoordFactors aspctToTxtreCrdFctrs[7] = { - { 256.0f, 256.0f / 8.0f }, /* GR_ASPECT_8x1 */ - { 256.0f, 256.0f / 4.0f }, /* GR_ASPECT_4x1 */ - { 256.0f, 256.0f / 2.0f }, /* GR_ASPECT_2x1 */ - { 256.0f, 256.0f }, /* GR_ASPECT_1x1 */ - { 256.0f / 2.0f, 256.0f }, /* GR_ASPECT_1x2 */ - { 256.0f / 4.0f, 256.0f }, /* GR_ASPECT_1x4 */ - { 256.0f / 8.0f, 256.0f } /* GR_ASPECT_1x8 */ -}; - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "QATEST00"; -static const char purpose[] = "Texture Download"; -static const char usage[] = "-n -r "; - -static float scrWidth = 640.0f; -static float scrHeight = 480.0f; - -/* some global shit for mipmap lod && partial lod downloads */ -static FxBool g_bDoLodDwnld = FXFALSE; -static FxI32 g_nLodToDwnld; -static FxBool g_bDoLodPrtlDwnld = FXFALSE; -static FxI32 g_nLodPrtlFstRow; -static FxI32 g_nLodPrtlLstRow; - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - /* definitions */ - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - int frames = -1; - - /* some texture stuff */ - /* disk based textures */ - const char *lpzBgTxtrFile = "miro.3df"; - const int nNumFgTxtrFiles = 8; - const char *lpzFgTxtrFiles[] = { "rgb332.3df", "rgb565.3df", - "argb4444.3df", "argb1555.3df", - "p8.3df", "ap88.3df", - "yiq.3df", "ayiq.3df" }; - /* color stuff for algorithmic textures */ - const int nAlgFgTxtres = 4; - FxU16 yAlgFgClrs[][9] = - {{ RED_565, GRN_565, RED_565, GRN_565, RED_565, GRN_565, RED_565, GRN_565, RED_565 }, - { RED_565, GRN_565, RED_565, GRN_565, RED_565, GRN_565, RED_565, GRN_565, RED_565 }, - { RED_565, GRN_565, RED_565, GRN_565, RED_565, GRN_565, RED_565, GRN_565, RED_565 }, - { RED_565, GRN_565, RED_565, GRN_565, RED_565, GRN_565, RED_565, GRN_565, RED_565 }}; - - /* templates for all algorithmic textures */ - GrTexInfo yAlgTxtreTmplts[][9] = - {{ {GR_LOD_1, GR_LOD_256, GR_ASPECT_8x1, GR_TEXFMT_RGB_565, NULL} }, - { {GR_LOD_1, GR_LOD_256, GR_ASPECT_4x1, GR_TEXFMT_RGB_565, NULL} }, - { {GR_LOD_1, GR_LOD_256, GR_ASPECT_2x1, GR_TEXFMT_RGB_565, NULL} }, - { {GR_LOD_1, GR_LOD_256, GR_ASPECT_1x1, GR_TEXFMT_RGB_565, NULL} }}; - - const int nDwnLodTxtres = 8; - FxU16 yDwnLodClrs[][9] = - {{ BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565 }, - { BLU_332, BLU_332, BLU_332, BLU_332, BLU_332, BLU_332, BLU_332, BLU_332, BLU_332 }, - { BLU_1555, BLU_1555, BLU_1555, BLU_1555, BLU_1555, BLU_1555, BLU_1555, BLU_1555, BLU_1555 }, - { BLU_4444, BLU_4444, BLU_4444, BLU_4444, BLU_4444, BLU_4444, BLU_4444, BLU_4444, BLU_4444 }, - { BLU_8332, BLU_8332, BLU_8332, BLU_8332, BLU_8332, BLU_8332, BLU_8332, BLU_8332, BLU_8332 }, - { BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565 }, - { BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565 }, - { BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565 }}; - - GrTexInfo yDwnTxtreTmplts[][9] = - {{ {GR_LOD_1, GR_LOD_256, GR_ASPECT_1x1, GR_TEXFMT_RGB_565, NULL} }, - { {GR_LOD_1, GR_LOD_256, GR_ASPECT_1x1, GR_TEXFMT_RGB_332, NULL} }, - { {GR_LOD_1, GR_LOD_256, GR_ASPECT_1x1, GR_TEXFMT_ARGB_1555, NULL} }, - { {GR_LOD_1, GR_LOD_256, GR_ASPECT_1x1, GR_TEXFMT_ARGB_4444, NULL} }, - { {GR_LOD_1, GR_LOD_256, GR_ASPECT_1x1, GR_TEXFMT_RGB_565, NULL} }, - { {GR_LOD_1, GR_LOD_256, GR_ASPECT_8x1, GR_TEXFMT_RGB_565, NULL} }, - { {GR_LOD_1, GR_LOD_256, GR_ASPECT_4x1, GR_TEXFMT_RGB_565, NULL} }, - { {GR_LOD_1, GR_LOD_256, GR_ASPECT_2x1, GR_TEXFMT_RGB_565, NULL} }}; - - /* texture handles */ - hTexId_t hCurrFgTxtre, /* current fg texture */ - hFstFgTxtre = 0, /* first fg texture */ - hLstFgTxtre, /* last fg texture */ - hFstAlgFgTxtre, /* first algo texture */ - hLstAlgFgTxtre = 0, /* last algo texture */ - hFstDwnlTxtre = 0, /* first lod download texture */ - hLstDwnlTxtre = 0, /* last lod download texture */ - hDwlnSrcTxtre, - hTmpTxtre; - hTexId_t hBgTxtre; /* bg texture */ - - GrVertex bgVerts[4]; - GrVertex fgVerts[4]; - - const float alpha = 192.0f; /* Alpha for ,blending tringle over background */ - FxU32 fxColorValue; - int i; - - /*---- - 0-1 - |/| - 3-2 - -----*/ - bgVerts[0].x = 0.f, bgVerts[0].y = 0.f; - bgVerts[0].a = 255.f, bgVerts[0].oow = 1.f; - bgVerts[0].tmuvtx[0].sow = 0.f * bgVerts[0].oow; - bgVerts[0].tmuvtx[0].tow = 0.f * bgVerts[0].oow; - - bgVerts[1].x = scrWidth, bgVerts[1].y = 0.f; - bgVerts[1].a = 255.f,bgVerts[1].oow = 1.f; - bgVerts[1].tmuvtx[0].sow = 255.f * bgVerts[1].oow; - bgVerts[1].tmuvtx[0].tow = 0.f * bgVerts[1].oow; - - bgVerts[2].x = scrWidth, bgVerts[2].y = scrHeight; - bgVerts[2].a = 255.f, bgVerts[2].oow = 1.f; - bgVerts[2].tmuvtx[0].sow = 255.f * bgVerts[2].oow; - bgVerts[2].tmuvtx[0].tow = 255.f * bgVerts[2].oow; - - bgVerts[3].x = 0.f, bgVerts[3].y = scrHeight; - bgVerts[3].a = 255.f, bgVerts[3].oow = 1.f; - bgVerts[3].tmuvtx[0].sow = 0.f * bgVerts[3].oow; - bgVerts[3].tmuvtx[0].tow = 255.f * bgVerts[3].oow; - - fgVerts[0].x = 0.f, fgVerts[0].y = 0.f; - fgVerts[0].a = 255.f, fgVerts[0].oow = 1.f; - fgVerts[0].tmuvtx[0].sow = 0.f; - fgVerts[0].tmuvtx[0].tow = 0.f; - - fgVerts[1].x = 0.f, fgVerts[1].y = 0.f; - fgVerts[1].a = 255.f, fgVerts[1].oow = 1.f; - fgVerts[1].tmuvtx[0].sow = 0.f; - fgVerts[1].tmuvtx[0].tow = 0.f; - - fgVerts[2].x = 0.f, fgVerts[2].y = 0.f; - fgVerts[2].a = 255.f, fgVerts[2].oow = 1.f; - fgVerts[2].tmuvtx[0].sow = 0.f; - fgVerts[2].tmuvtx[0].tow = 0.f; - - fgVerts[3].x = 0.f, fgVerts[3].y = 0.f; - fgVerts[3].a = 255.f, fgVerts[3].oow = 1.f; - fgVerts[3].tmuvtx[0].sow = 0.f; - fgVerts[3].tmuvtx[0].tow = 0.f; - - /* 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; - } - } /* while */ - - 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, 40, 0xffffff ); - /* done initialize Glide */ - - /* Texure stuff */ - /* do the disk based texture stuff */ - for ( i = 0; i < nNumFgTxtrFiles; ++i ) - if ( i==0 ) - hFstFgTxtre = doLoadTexture( lpzFgTxtrFiles[i], NULL, NULL, FXTRUE ); - else - hLstFgTxtre = doLoadTexture( lpzFgTxtrFiles[i], NULL, NULL, FXTRUE ); - /* do the algorithmic fg texture stuff */ - for ( i = 0; i < nAlgFgTxtres; ++i ) - if ( i==0 ) - hFstAlgFgTxtre = doLoadTexture( NULL, &yAlgTxtreTmplts[i][0], &yAlgFgClrs[i][0], FXTRUE ); - else - hLstAlgFgTxtre = doLoadTexture( NULL, &yAlgTxtreTmplts[i][0], &yAlgFgClrs[i][0], FXTRUE ); - - hLstFgTxtre = hLstAlgFgTxtre; - /* do the algorithmic download lod texture stuff, these are not downloadable */ - for ( i = 0; i < nDwnLodTxtres; ++i ) - if ( i==0 ) - hFstDwnlTxtre = doLoadTexture( NULL, &yDwnTxtreTmplts[i][0], &yDwnLodClrs[i][0], FXFALSE ); - else - hLstDwnlTxtre = doLoadTexture( NULL, &yDwnTxtreTmplts[i][0], &yDwnLodClrs[i][0], FXFALSE ); - - hCurrFgTxtre = hFstFgTxtre; /* init hCurrFgTxtre */ - hBgTxtre = doLoadTexture( lpzBgTxtrFile, NULL, NULL, FXTRUE ); - plTxMnDownloadAll(); /* make plTxMn download everything */ - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - /* done loading plTxMn */ - -// grTexFilterMode( GR_TMU0, GR_TEXTUREFILTER_BILINEAR, GR_TEXTUREFILTER_BILINEAR ); - - fxColorValue = (0x00FFFFFF | ( ((int) alpha) << 24 ) ); - grConstantColorValue(fxColorValue); - - /* Main processing loop */ - while( frames-- ) - { - /* definitions */ - static ScaleAmt_t tCurrScle = SCALE_1; - static MipMapMode_t mipMapMode = DISABLE; - static FilterMode_t filterMode = BOTH_BILNEAR; - static float fBiasLevel = 0.0f; - static float fBiasInc = 0.25f; - static FxBool bVerboseMode = FXTRUE; - static FxBool bBgImage = FXTRUE; - - float fXsize, fYsize, fULsow, fLRsow, fULtow, fLRtow; - GrTexInfo tmpTexInfo; - FxBool isTrilinear, isMultibase; - - /* code */ - grBufferClear( 0x00404040, 0, GR_ZDEPTHVALUE_FARTHEST ); - - /* Output the diagnostic stuff */ - if (bVerboseMode) - { - tlConClear(); - plTxMnGetInfo( hCurrFgTxtre, &tmpTexInfo ); - isTrilinear = plTxMnGetTrilinear( hCurrFgTxtre ); - isMultibase = plTxMnGetMultibase( hCurrFgTxtre ); - tlConOutput("txt %d, fmt %#x, lgLod %#x, smLod %#x, aspct %#x, T:%d, M:%d\n", - hCurrFgTxtre, tmpTexInfo.format, tmpTexInfo.largeLod, - tmpTexInfo.smallLod, tmpTexInfo.aspectRatio, - isTrilinear, isMultibase ); - fXsize = fgVerts[1].x - fgVerts[0].x; - fYsize = fgVerts[3].y - fgVerts[0].y; - fULsow = fgVerts[0].tmuvtx[0].sow; - fULtow = fgVerts[0].tmuvtx[0].tow; - fLRsow = fgVerts[2].tmuvtx[0].sow; - fLRtow = fgVerts[2].tmuvtx[0].tow; - tlConOutput("Size %f by %f:\nUL s,t %f, %f: LR s,t %f, %f\n", - fXsize, fYsize, fULsow, fULtow, fLRsow, fLRtow ); - switch (tCurrScle) - { - case SCALE_1: - tlConOutput("Curr Scale is 1 LOD; "); - break; - - case SCALE_2: - tlConOutput("Curr Scale is 1/2 LOD; "); - break; - - case SCALE_4: - tlConOutput("Curr Scale is 1/4 LOD; "); - break; - - case SCALE_8: - tlConOutput("Curr Scale is 1/8 LOD; "); - break; - - case SCALE_16: - tlConOutput("Curr Scale is 1/16 LOD; "); - break; - - case SCALE_32: - tlConOutput("Curr Scale is 1/32 LOD; "); - break; - } - tlConOutput("LOD Bias is %f\n", fBiasLevel); - } /* done with the Con output stuff */ - - /* do the Bg texture */ - if (bBgImage) - { - /* Setup the system for the Bg Texture */ - grTexLodBiasValue( GR_TMU0, 0.0f ); - grHints(GR_HINT_ALLOW_MIPMAP_DITHER, FXFALSE); - grTexMipMapMode(GR_TMU0, GR_MIPMAP_DISABLE, FXFALSE); - grTexFilterMode( GR_TMU0, GR_TEXTUREFILTER_BILINEAR, GR_TEXTUREFILTER_BILINEAR ); - grTexCombine( GR_TMU0, GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_NONE, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ZERO, GR_BLEND_ZERO, GR_BLEND_ZERO ); - - /* set bgTexture as source of next rendering operations */ - plTxMnTexSource( hBgTxtre, GR_MIPMAPLEVELMASK_BOTH ); - - grDrawTriangle( &bgVerts[0], &bgVerts[1], &bgVerts[3] ); - grDrawTriangle( &bgVerts[1], &bgVerts[2], &bgVerts[3] ); - } /* done with Bg txtre */ - - /* Setup the system for the Fg Texture */ - switch( mipMapMode ) - { - case DISABLE: - grHints (GR_HINT_ALLOW_MIPMAP_DITHER, FXFALSE ); - grTexMipMapMode( GR_TMU0, GR_MIPMAP_DISABLE, FXFALSE ); - if (bVerboseMode) - tlConOutput( "MipMapMode: DISABLE " ); - break; - - case NEAREST: - grHints (GR_HINT_ALLOW_MIPMAP_DITHER, FXFALSE ); - grTexMipMapMode( GR_TMU0, GR_MIPMAP_NEAREST, FXFALSE ); - if (bVerboseMode) - tlConOutput( "MipMapMode: NEAREST " ); - break; - - case TRILINEAR: - grHints (GR_HINT_ALLOW_MIPMAP_DITHER, FXFALSE ); - grTexMipMapMode( GR_TMU0, GR_MIPMAP_NEAREST, FXTRUE ); - if (bVerboseMode) - tlConOutput( "MipMapMode: TRILINEAR " ); - break; - - case DITHRD_NREST: - grHints (GR_HINT_ALLOW_MIPMAP_DITHER, FXTRUE ); - grTexMipMapMode( GR_TMU0, GR_MIPMAP_NEAREST_DITHER, FXFALSE ); - if (bVerboseMode) - tlConOutput( "MipMapMode: NEAR_DITHRD " ); - break; - - case DITHRD_TRILIN: - grHints (GR_HINT_ALLOW_MIPMAP_DITHER, FXTRUE ); - grTexMipMapMode( GR_TMU0, GR_MIPMAP_NEAREST_DITHER, FXTRUE ); - if (bVerboseMode) - tlConOutput( "MipMapMode: NEAR_TRILNR " ); - break; - } /* switch( mipMapMode ) */ - - - switch( filterMode ) - { - case BOTH_POINT: - grTexFilterMode( GR_TMU0, GR_TEXTUREFILTER_POINT_SAMPLED, GR_TEXTUREFILTER_POINT_SAMPLED ); - if (bVerboseMode) - tlConOutput( "FltrMode: Point Samp\n" ); - break; - - case MIN_BILNEAR: - grTexFilterMode( GR_TMU0, GR_TEXTUREFILTER_BILINEAR, GR_TEXTUREFILTER_POINT_SAMPLED ); - if (bVerboseMode) - tlConOutput( "FltrMode: MinBilnr\n" ); - break; - - case MAG_BILNEAR: - grTexFilterMode( GR_TMU0, GR_TEXTUREFILTER_POINT_SAMPLED, GR_TEXTUREFILTER_BILINEAR ); - if (bVerboseMode) - tlConOutput( "FltrMode: MagBilnr\n" ); - break; - - case BOTH_BILNEAR: - grTexFilterMode( GR_TMU0, GR_TEXTUREFILTER_BILINEAR, GR_TEXTUREFILTER_BILINEAR ); - if (bVerboseMode) - tlConOutput( "FltrMode: BothBilnr\n" ); - break; - } /* switch( filterMode ) */ - - - /* do the Fg texturing stuff */ - if ((mipMapMode != TRILINEAR) && (mipMapMode != DITHRD_TRILIN)) - { - /* setup the Fg texture states */ - grTexLodBiasValue( GR_TMU0, fBiasLevel ); - grTexCombine( GR_TMU0, GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_BLEND_OTHER, GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_CONSTANT, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_SRC_ALPHA, GR_BLEND_ONE_MINUS_SRC_ALPHA, - GR_BLEND_ONE, GR_BLEND_ZERO ); - - /* set the Fg texture */ - plTxMnTexSource( hCurrFgTxtre, GR_MIPMAPLEVELMASK_BOTH ); - grDrawTriangle( &fgVerts[0], &fgVerts[1], &fgVerts[3] ); - grDrawTriangle( &fgVerts[1], &fgVerts[2], &fgVerts[3] ); - } /* if */ - else - { - /* setup system for the Even MipMaps */ - grTexLodBiasValue( GR_TMU0, fBiasLevel ); - grTexCombine( GR_TMU0, GR_COMBINE_FUNCTION_BLEND_LOCAL, GR_COMBINE_FACTOR_LOD_FRACTION, - GR_COMBINE_FUNCTION_BLEND_LOCAL,GR_COMBINE_FACTOR_LOD_FRACTION, - FXFALSE, FXFALSE ); - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_BLEND_OTHER, GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_CONSTANT, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_SRC_ALPHA, GR_BLEND_ONE_MINUS_SRC_ALPHA, - GR_BLEND_ONE, GR_BLEND_ZERO ); - - /* render with the Even MipMaps */ - plTxMnTexSource( hCurrFgTxtre, GR_MIPMAPLEVELMASK_EVEN ); - grDrawTriangle( &fgVerts[0], &fgVerts[1], &fgVerts[3] ); - grDrawTriangle( &fgVerts[1], &fgVerts[2], &fgVerts[3] ); - - /* setup system for the Odd MipMaps */ - grTexCombine( GR_TMU0, GR_COMBINE_FUNCTION_BLEND_LOCAL, GR_COMBINE_FACTOR_LOD_FRACTION, - GR_COMBINE_FUNCTION_BLEND_LOCAL,GR_COMBINE_FACTOR_LOD_FRACTION, - FXFALSE, FXFALSE ); - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_BLEND_OTHER, GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_CONSTANT, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ONE, GR_BLEND_ZERO, GR_BLEND_ZERO ); - - /* render with the Odd MipMaps */ - plTxMnTexSource( hCurrFgTxtre, GR_MIPMAPLEVELMASK_ODD ); - grDrawTriangle( &fgVerts[0], &fgVerts[1], &fgVerts[3] ); - grDrawTriangle( &fgVerts[1], &fgVerts[2], &fgVerts[3] ); - } /* else */ - - /* do the swap */ - tlConRender(); - grBufferSwap( 1 ); - - /* dynamic resizing */ - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - /* handle any keyboard input */ - while( tlKbHit() ) - { - switch( tlGetCH() ) - { - static int nCurrAlpha = -1; - GrTexInfo tFgTexInfo; - - case '+': - doScaleScreenSurf( hCurrFgTxtre, SCALE_OUT, tCurrScle ); - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case '-': - doScaleScreenSurf( hCurrFgTxtre, SCALE_IN, tCurrScle ); - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case 'a': - tlConClear(); - bVerboseMode = FXFALSE; - tlConOutput("Verbose mode Off\n"); - nCurrAlpha = (nCurrAlpha == 0) ? 0 : - (nCurrAlpha < 0) ? (int) alpha-1: --nCurrAlpha; - fxColorValue = ( 0x00FFFFFF | (nCurrAlpha << 24) ); - grConstantColorValue(fxColorValue); - tlConOutput("Current fxColorValue is %-#8x\n", fxColorValue); - break; - - case 'A': - tlConClear(); - bVerboseMode = FXFALSE; - tlConOutput("Verbose mode Off\n"); - nCurrAlpha = (nCurrAlpha == 255) ? 255 : - (nCurrAlpha < 0) ? (int) alpha+1: ++nCurrAlpha; - fxColorValue = ( 0x00FFFFFF | (nCurrAlpha << 24) ); - grConstantColorValue(fxColorValue); - tlConOutput("Current fxColorValue is %-#8x\n", fxColorValue); - break; - - case 'b': - mipMapMode++; - mipMapMode%=5; - /* set or unset the trilinear bit on all the fg textures */ - if ((mipMapMode == TRILINEAR) || (mipMapMode == DITHRD_TRILIN)) - for (hTmpTxtre = hFstFgTxtre; hTmpTxtre <= hLstFgTxtre; ++hTmpTxtre ) - plTxMnSetTrilinear( hTmpTxtre, FXTRUE ); - else - for (hTmpTxtre = hFstFgTxtre; hTmpTxtre <= hLstFgTxtre; ++hTmpTxtre ) - plTxMnSetTrilinear( hTmpTxtre, FXFALSE ); - - plTxMnDownloadAll(); /* remember to reset the TMU mem */ - break; - - case 'B': - filterMode++; - filterMode%=4; - break; - - case 'c': - case 'C': - tlConClear(); - break; - - case 'd': - tlConClear(); - bVerboseMode = FXFALSE; - tlConOutput("Verbose mode Off\n"); - plTxMnSetMultiOffsetFix( plTxMnGetMultiOffsetFix() ? FXFALSE : FXTRUE ); - tlConOutput( plTxMnGetMultiOffsetFix() ? "Multibase offset fix in\n" : - "Multibase offset fix NOT\n"); - plTxMnDownloadAll(); /* reset the tmu mem */ - break; - - case 'D': - tlConClear(); - bVerboseMode = FXFALSE; - tlConOutput("Verbose mode Off\n"); - plTxMnSetMultiRevOrder( plTxMnGetMultiRevOrder() ? FXFALSE : FXTRUE ); - tlConOutput( plTxMnGetMultiRevOrder() ? "Multibase in rev order\n" : - "Multibase in linear order\n"); - plTxMnDownloadAll(); /* reset the tmu mem */ - break; - - case 'e': - if (fBiasLevel > -8.00f) - fBiasLevel -= fBiasInc; - - grTexLodBiasValue( GR_TMU0, fBiasLevel ); - break; - - case 'E': - if (fBiasLevel < 7.750f) - fBiasLevel += fBiasInc; - - grTexLodBiasValue( GR_TMU0, fBiasLevel ); - break; - - case 'h': - case 'H': - doHelp(); - break; - - case 'l': - case 'L': - getLodToDwnld(); - if (g_bDoLodDwnld) - { - hDwlnSrcTxtre = H_NULL; - plTxMnGetInfo( hCurrFgTxtre, &tFgTexInfo ); - - for ( hTmpTxtre = hFstDwnlTxtre; hTmpTxtre <= hLstDwnlTxtre; ++hTmpTxtre) - { - plTxMnGetInfo( hTmpTxtre, &tmpTexInfo ); - if ((tFgTexInfo.format == tmpTexInfo.format) && - (tFgTexInfo.aspectRatio == tmpTexInfo.aspectRatio)) - { /* if they are compatible */ - hDwlnSrcTxtre = hTmpTxtre; - hTmpTxtre = hLstDwnlTxtre; /* get first occurence, short circut */ - } - } - - if (hDwlnSrcTxtre) - plTxMnDwnldMipMapLod( hCurrFgTxtre, hDwlnSrcTxtre, g_nLodToDwnld ); - else /* else still H_NULL */ - tlConOutput("No cmptble txtre format avlable\n"); - } - break; - - case 'm': - if ( plTxMnGetMultibase(hCurrFgTxtre) ) - plTxMnSetMultibase( hCurrFgTxtre, FXFALSE ); - else - plTxMnSetMultibase( hCurrFgTxtre, FXTRUE ); - - plTxMnDownloadAll(); /* reset the tmu mem */ - break; - - case 'M': - bBgImage = bBgImage ? FXFALSE : FXTRUE; - break; - - case 'o': - plPopLod( hCurrFgTxtre, btmOfMipMap ); - plTxMnDownloadAll(); /* reset the tmu mem */ - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case 'O': - plPopLod( hCurrFgTxtre, topOfMipMap ); - plTxMnDownloadAll(); /* reset the tmu mem */ - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case 'p': - case 'P': - getLodPrtlToDwnld(); - if (g_bDoLodPrtlDwnld) - { - hDwlnSrcTxtre = H_NULL; - plTxMnGetInfo( hCurrFgTxtre, &tFgTexInfo ); - - for ( hTmpTxtre = hFstDwnlTxtre; hTmpTxtre <= hLstDwnlTxtre; ++hTmpTxtre) - { - plTxMnGetInfo( hTmpTxtre, &tmpTexInfo ); - if ((tFgTexInfo.format == tmpTexInfo.format) && - (tFgTexInfo.aspectRatio == tmpTexInfo.aspectRatio)) - { /* if they are compatible */ - hDwlnSrcTxtre = hTmpTxtre; - hTmpTxtre = hLstDwnlTxtre; /* get first occurence, short circut */ - } - } - - if (hDwlnSrcTxtre) - plTxMnDwnldMipMapLodPrtl( hCurrFgTxtre, hDwlnSrcTxtre, g_nLodToDwnld, - g_nLodPrtlFstRow, g_nLodPrtlLstRow ); - else /* else still H_NULL */ - tlConOutput("No cmptble txtre format avlable\n"); - } - break; - - case 'r': - case 'R': - for (hTmpTxtre = hFstFgTxtre; hTmpTxtre <= hLstFgTxtre; ++hTmpTxtre ) - { - plTxMnReset( hTmpTxtre ); - doResetFgVerts( hTmpTxtre ); - } /* reset d'em puppies */ - - mipMapMode = DISABLE; - plTxMnDownloadAll(); /* reset the tmu mem */ - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case 't': - if (hCurrFgTxtre == hFstFgTxtre) - hCurrFgTxtre = hLstFgTxtre; - else - --hCurrFgTxtre; - - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case 'T': - if (hCurrFgTxtre == hLstFgTxtre) - hCurrFgTxtre = hFstFgTxtre; - else - ++hCurrFgTxtre; - - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case 'u': - plPushLod( hCurrFgTxtre, btmOfMipMap ); - plTxMnDownloadAll(); /* reset the tmu mem */ - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case 'U': - plPushLod( hCurrFgTxtre, topOfMipMap ); - plTxMnDownloadAll(); /* reset the tmu mem */ - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case 'v': - case 'V': - bVerboseMode = bVerboseMode ? FXFALSE : FXTRUE; - break; - - case 'w': - if (tCurrScle != SCALE_1) - --tCurrScle; - break; - - case 'W': - if (tCurrScle != SCALE_32) - ++tCurrScle; - break; - - default: - frames = 0; - break; - } /* switch( tlGetCH() ) */ - } /* while( tlKbHit() ) */ - } /* while (frames--) */ - - /* get the funk out */ - doUnloadTextures(); - grGlideShutdown(); - - exit(1); -} /* main */ - - - -static void -doHelp( void ) -{ - grBufferClear( 0, 0, 0 ); - tlConClear(); - tlConOutput("Keymap: (case sensitive - second letter lower case)\n"); - tlConOutput(" b (lc): cycles mipmap modes\n"); - tlConOutput(" B (uc): cycles filter modes\n"); - tlConOutput(" T xor t: cycles through fg texture formats\n"); - tlConOutput(" m (lc): toggles multibase for fg texture\n"); - tlConOutput(" M (uc): toggles the bg image\n"); - tlConOutput(" d (lc): toggles the mltbse offset fix\n"); - tlConOutput(" D (uc): toggles the order of the mltbse segs\n"); - tlConOutput(" L or l: LOD download menu\n"); - tlConOutput(" P or p: partial LOD download menu\n"); - tlConOutput(" R or r: resets all fg textures states\n"); - tlConOutput(" O xor o: pop lod off TOP or btm of stack\n"); - tlConOutput(" U xor u: push lod back on TOP or btm of stack\n"); - tlConOutput(" V or v: toggle verbose mode\n"); - tlConOutput(" + xor -: change size of fg obj by LOD frac\n"); - tlConOutput(" W xor w: change LOD frac\n"); - tlConOutput(" E xor e: INC or dec LOD Bias\n"); - tlConOutput(" A xor a: INC or dec alpha const\n"); - tlConOutput(" C or c: clears console\n"); - tlConOutput(" H or h: Help\n"); - tlConOutput(" Q or q: Quit\n"); - tlConOutput("Press a key to continue...\n"); - tlConRender(); - grBufferSwap( 1 ); - tlGetCH(); - - tlConClear(); -} - - - -static hTexId_t -doLoadTexture( const char *lpzFileName, GrTexInfo *tEtTexInfo, - FxU16 *yColors, FxBool isDwnldble ) -{ - /* definitions */ - static FxU8 lstTexIndx = 0; /* last available texture index */ - GrTexInfo *lpTmpTexInfo; - surfInfo_t *lpSurfInfo; - myTexture_t *lpTmpMyTxtre; /* for ease of read */ - double dNonFrac, ret; - - /* assumptions */ - assert( lpzFileName || tEtTexInfo ); - assert( lstTexIndx < NUMTEXTURES ); - - /* initializations */ - lpTmpMyTxtre = &theTextures[lstTexIndx]; - lpTmpMyTxtre->lpzTexFileName = lpzFileName; - - - /* code */ - lpTmpMyTxtre->lpTlTexture = (TlTexture*) malloc(sizeof(TlTexture)); - assert( lpTmpMyTxtre->lpTlTexture ); - lpTmpTexInfo = &lpTmpMyTxtre->lpTlTexture->info; - - if (lpzFileName != NULL) - { /* load from disk */ - assert(tlLoadTexture( lpTmpMyTxtre->lpzTexFileName, - &lpTmpMyTxtre->lpTlTexture->info, - &lpTmpMyTxtre->lpTlTexture->tableType, - &lpTmpMyTxtre->lpTlTexture->tableData)); - lpTmpTexInfo = &lpTmpMyTxtre->lpTlTexture->info; - } - else - { /* else create in RAM from template && lod color array */ - *lpTmpTexInfo = *tEtTexInfo; - lpTmpTexInfo->data = malloc(grTexCalcMemRequired(lpTmpTexInfo->smallLod, - lpTmpTexInfo->largeLod, - lpTmpTexInfo->aspectRatio, - lpTmpTexInfo->format)); - assert(lpTmpTexInfo->data); - plCreateTlTexture(lpTmpMyTxtre->lpTlTexture, yColors); - } - - /* save off the starting surface screen coords for this texture */ - lpSurfInfo = &lpTmpMyTxtre->surfInfo; - lpSurfInfo->currLod = lpTmpTexInfo->largeLod; - - - lpSurfInfo->fStartX = - ((scrWidth - (float) getLodWidth(lpSurfInfo->currLod, - lpTmpTexInfo->aspectRatio) )/2.f); - ret = modf((double) lpSurfInfo->fStartX, &dNonFrac); - lpSurfInfo->rStartX = (float) dNonFrac; - - lpSurfInfo->fEndX = - (lpSurfInfo->fStartX + (float) getLodWidth(lpSurfInfo->currLod, - lpTmpTexInfo->aspectRatio)); - ret = modf((double) lpSurfInfo->fEndX, &dNonFrac); - lpSurfInfo->rEndX = (float) dNonFrac; - - lpSurfInfo->fStartY = - ((scrHeight - (float) getLodHeight(lpSurfInfo->currLod, - lpTmpTexInfo->aspectRatio) )/2.f); - ret = modf((double) lpSurfInfo->fStartY, &dNonFrac); - lpSurfInfo->rStartY = (float) dNonFrac; - - lpSurfInfo->fEndY = - (lpSurfInfo->fStartY + (float) getLodHeight(lpSurfInfo->currLod, - lpTmpTexInfo->aspectRatio)); - ret = modf((double) lpSurfInfo->fEndY, &dNonFrac); - lpSurfInfo->rEndY = (float) dNonFrac; - /* done with surface coords */ - - /* give it to plTxMn */ - lpTmpMyTxtre->hTexture = plTxMnLoadTxMngr( lpTmpMyTxtre->lpTlTexture ); - plTxMnSetDownload( lpTmpMyTxtre->hTexture, isDwnldble ); - - ++lstTexIndx; - - return( lpTmpMyTxtre->hTexture ); -} - - - -static void -getFgVerts( hTexId_t deTexId, GrVertex *deFgVerts ) -{ - /* definitions */ - surfInfo_t *lpSurfInfo; - int i; - GrTexInfo tTexInfo; - float fSmulti, fTmulti; - - /* assumptions */ - assert( deTexId < NUMTEXTURES ); - assert( deFgVerts ); - - /* parse the texture array for the right one */ - for ( i = 0; (i < NUMTEXTURES) && (theTextures[i].hTexture != deTexId) ; ++i ); - if (i == NUMTEXTURES) - return; /* texture not found */ - - /* initializations */ - lpSurfInfo = &theTextures[i].surfInfo; - tTexInfo = theTextures[i].lpTlTexture->info; - fSmulti = aspctToTxtreCrdFctrs[tTexInfo.aspectRatio].sMult; - fTmulti = aspctToTxtreCrdFctrs[tTexInfo.aspectRatio].tMult; - - /*---- - 0-1 - |/| - 3-2 - -----*/ - - deFgVerts[0].x = lpSurfInfo->rStartX+0.5f; - deFgVerts[0].y = lpSurfInfo->rStartY+0.5f; - deFgVerts[0].tmuvtx[0].sow = 0.f * (fSmulti) * deFgVerts[0].oow; - deFgVerts[0].tmuvtx[0].tow = 0.f * (fTmulti) * deFgVerts[0].oow; - - deFgVerts[1].x = lpSurfInfo->rEndX+0.5f; - deFgVerts[1].y = lpSurfInfo->rStartY+0.5f; - deFgVerts[1].tmuvtx[0].sow = 1.f * (fSmulti) * deFgVerts[1].oow; - deFgVerts[1].tmuvtx[0].tow = 0.f * (fTmulti) * deFgVerts[1].oow; - - deFgVerts[2].x = lpSurfInfo->rEndX+0.5f; - deFgVerts[2].y = lpSurfInfo->rEndY+0.5f; - deFgVerts[2].tmuvtx[0].sow = 1.f * (fSmulti) * deFgVerts[2].oow; - deFgVerts[2].tmuvtx[0].tow = 1.f * (fTmulti) * deFgVerts[2].oow; - - deFgVerts[3].x = lpSurfInfo->rStartX+0.5f; - deFgVerts[3].y = lpSurfInfo->rEndY+0.5f; - deFgVerts[3].tmuvtx[0].sow = 0.f * (fSmulti) * deFgVerts[3].oow; - deFgVerts[3].tmuvtx[0].tow = 1.f * (fTmulti) * deFgVerts[3].oow; -} - - - -static void -doScaleScreenSurf( hTexId_t deTexId, ScaleDir_t deScleDir, ScaleAmt_t deScleAmt ) -{ - /* definitions */ - myTexture_t *lpTmpMyTxtre; - surfInfo_t *lpSurfInfo; - GrTexInfo *lpTexInfo; - int i; - int nNumScles; - float fScleAmt; - GrLOD_t tLodToScle; - GrAspectRatio_t tCurrAspct; - double dNonFrac, ret; - const float fScleLCD = 32.f; //least common scale denominator - - /* assumptions */ - assert( deTexId < NUMTEXTURES ); - - /* parse the texture array for the right one */ - for ( i = 0; (i < NUMTEXTURES) && (theTextures[i].hTexture != deTexId) ; ++i ); - if (i == NUMTEXTURES) - return; - - /* initializations */ - lpTmpMyTxtre = &theTextures[i]; - lpSurfInfo = &lpTmpMyTxtre->surfInfo; - lpTexInfo = &lpTmpMyTxtre->lpTlTexture->info; - - if ((lpSurfInfo->currLod == GR_LOD_1) && (deScleDir == SCALE_IN)) - return; - - if ((lpSurfInfo->currLod >= GR_LOD_32) && (deScleAmt > SCALE_8)) - deScleAmt = SCALE_8; - - /* do everything as multiples of (1/8)LOD jmps, (1)LOD jmp becomes 8*1/8 */ - nNumScles = ( (int) fScleLCD) >> deScleAmt; - - /* scale by a frac of the next LOD your are scaling to */ - tLodToScle = lpSurfInfo->currLod +1; - - tCurrAspct = lpTexInfo->aspectRatio; /* ease of read */ - fScleAmt = 0.0f; /* init then go */ - for ( i = 0; i < nNumScles; ++i) - { - /* check to see if i am in another LOD, scale change */ - if (deScleDir == SCALE_IN) - { - if ( (lpSurfInfo->rEndX - lpSurfInfo->rStartX == - (float) getLodWidth(tLodToScle, tCurrAspct)) && - (lpSurfInfo->rEndY - lpSurfInfo->rStartY == - (float) getLodHeight(tLodToScle, tCurrAspct)) ) - { - ++lpSurfInfo->currLod; - tLodToScle = lpSurfInfo->currLod +1; - } - } - else - { - if ( (lpSurfInfo->rEndX - lpSurfInfo->rStartX == - (float) getLodWidth(lpSurfInfo->currLod, tCurrAspct)) && - (lpSurfInfo->rEndY - lpSurfInfo->rStartY == - (float) getLodHeight(lpSurfInfo->currLod, tCurrAspct)) ) - { - if (lpSurfInfo->currLod != GR_LOD_256) - --lpSurfInfo->currLod; - tLodToScle = lpSurfInfo->currLod +1;// == GR_LOD_256 ? GR_LOD_128 : lpSurfInfo->currLod; - } - } - - - if ( !((deScleDir == SCALE_OUT) && /* is there somtin' to do */ - (getLodWidth(tLodToScle, tCurrAspct) == getLodWidth(tLodToScle -1, tCurrAspct)))) - { - fScleAmt = ((float) getLodWidth(tLodToScle, tCurrAspct)) / fScleLCD / 2.f; - lpSurfInfo->fStartX += deScleDir * fScleAmt; - ret = modf((double) lpSurfInfo->fStartX, &dNonFrac); - lpSurfInfo->rStartX = (float) dNonFrac + - (ret > 0.5f ? 1.0f : ret == 0.0f ? 0.0f : 0.5f); - - lpSurfInfo->fEndX -= deScleDir * fScleAmt; - if ((lpSurfInfo->fStartX) == (lpSurfInfo->fEndX)) - lpSurfInfo->fEndX += 1.0f; - ret = modf((double) lpSurfInfo->fEndX, &dNonFrac); - lpSurfInfo->rEndX = (float) dNonFrac + - (ret > 0.5f ? 1.0f : ret == 0.0f ? 0.0f : 0.5f); - } - - - - if ( !((deScleDir == SCALE_OUT) && /* is there somtin' to do */ - (getLodHeight(tLodToScle, tCurrAspct) == getLodHeight(tLodToScle -1, tCurrAspct)))) - { - fScleAmt = ((float) getLodHeight(tLodToScle, tCurrAspct)) / fScleLCD / 2.f; - - lpSurfInfo->fStartY += deScleDir * fScleAmt; - ret = modf((double) lpSurfInfo->fStartY, &dNonFrac); - lpSurfInfo->rStartY = (float) dNonFrac + - (ret > 0.5f ? 1.0f : ret == 0.0f ? 0.0f : 0.5f); - - lpSurfInfo->fEndY -= deScleDir * fScleAmt; - if ((lpSurfInfo->fStartY) == (lpSurfInfo->fEndY)) - lpSurfInfo->fEndY += 1.0f; - ret = modf((double) lpSurfInfo->fEndY, &dNonFrac); - lpSurfInfo->rEndY = (float) dNonFrac + - (ret > 0.5f ? 1.0f : ret == 0.0f ? 0.0f : 0.5f); - } - } -} /* doScaleScreenSurf */ - - - -static int -getLodWidth( GrLOD_t lod, GrAspectRatio_t aspect ) -{ - int yAspctWdvdr[] = {0, 0, 0, 0, 1, 2, 3}; - int yLodFctr[] = {8, 7, 6, 5, 4, 3, 2, 1, 0}; - int val; - - val = yLodFctr[lod] > yAspctWdvdr[aspect] ? - 1 << yLodFctr[lod] >> yAspctWdvdr[aspect] : 1; - - return( val ); -} - - - -static int -getLodHeight( GrLOD_t lod, GrAspectRatio_t aspect ) -{ - int yAspctHdvdr[] = {3, 2, 1, 0, 0, 0, 0}; - int yLodFctr[] = {8, 7, 6, 5, 4, 3, 2, 1, 0}; - int val; - - val = yLodFctr[lod] > yAspctHdvdr[aspect] ? - 1 << yLodFctr[lod] >> yAspctHdvdr[aspect] : 1; - - return( val ); -} - - - -static void -doUnloadTextures( ) -{ - int i; - - for ( i = 0; i < NUMTEXTURES; ++i ) - { /* free the textures, if they love you they'll come back */ - free(theTextures[i].lpTlTexture->info.data); - free(theTextures[i].lpTlTexture); - } -} - - - -static void -getLodToDwnld( ) -{ - /* definitions */ - char ch; - - /* initializations */ - g_bDoLodDwnld = FXFALSE; - - /* code */ - tlConClear(); - grBufferClear( 0, 0, 0 ); - grBufferSwap( 1 ); - grBufferClear( 0, 0, 0 ); - tlConOutput("LOD Download menu\n"); - tlConOutput("Choose LOD 0-8 "); - tlConRender(); - grBufferSwap( 1 ); - ch = tlGetCH(); - g_nLodToDwnld = atoi(&ch); - - if ((g_nLodToDwnld >= GR_LOD_256) && (g_nLodToDwnld <= GR_LOD_1)) - { - tlConOutput("%d\n", g_nLodToDwnld); - tlConRender(); - grBufferSwap( 1 ); - g_bDoLodDwnld = FXTRUE; - } - else - tlConOutput("invalid LOD\n"); - - tlConRender(); - grBufferSwap( 1 ); -} - - - -static void -getLodPrtlToDwnld( ) -{ - /* definitions */ - char ch; - int i; - - /* initializations */ - g_nLodToDwnld = 0x0; - g_bDoLodPrtlDwnld = FXFALSE; - g_nLodPrtlFstRow = 0x0; - g_nLodPrtlLstRow = 0x0; - - /* code */ - tlConClear(); - grBufferClear( 0, 0, 0 ); - grBufferSwap( 1 ); - grBufferClear( 0, 0, 0 ); - tlConOutput("LOD Prtl Dwnld menu\n"); - tlConOutput("Choose LOD 0-8 "); - tlConRender(); - grBufferSwap( 1 ); - ch = tlGetCH(); - g_nLodToDwnld = atoi(&ch); - - if ((g_nLodToDwnld >= GR_LOD_256) && (g_nLodToDwnld <= GR_LOD_1)) - { - tlConOutput("%d\n", g_nLodToDwnld); - tlConRender(); - grBufferSwap( 1 ); - - tlConOutput("Entr Fst Row 000-255 "); - tlConRender(); - grBufferSwap( 1 ); - for ( i = 0; i < 3; ++i ) - { - ch = tlGetCH(); - tlConOutput("%c", ch); - tlConRender(); - grBufferSwap( 1 ); - g_nLodPrtlFstRow = (g_nLodPrtlFstRow * 0xA) + atoi(&ch); - } - tlConOutput(" %d\n", g_nLodPrtlFstRow); - tlConRender(); - grBufferSwap( 1 ); - - tlConOutput("Entr Lst Row 000-255 "); - tlConRender(); - grBufferSwap( 1 ); - for ( i = 0; i < 3; ++i ) - { - ch = tlGetCH(); - tlConOutput("%c", ch); - tlConRender(); - grBufferSwap( 1 ); - g_nLodPrtlLstRow = (g_nLodPrtlLstRow * 0xA) + atoi(&ch); - } - tlConOutput(" %d\n", g_nLodPrtlLstRow); - tlConRender(); - grBufferSwap( 1 ); - - if (((g_nLodPrtlFstRow >= 0x0) && (g_nLodPrtlFstRow < 0x100)) && - ((g_nLodPrtlLstRow >= 0x0) && (g_nLodPrtlLstRow < 0x100))) - g_bDoLodPrtlDwnld = FXTRUE; - else - tlConOutput("invalid Row(s)\n"); - } - else - tlConOutput("invalid LOD\n"); - - tlConRender(); - grBufferSwap( 1 ); -} - - - -static void -doResetFgVerts( hTexId_t deTexId ) -{ - /* definitions */ - surfInfo_t *lpSurfInfo; - GrTexInfo *lpTexInfo; - int i; - double ret, dNonFrac; - - /* code */ - - /* parse the texture array for the right one */ - for ( i = 0; (i < NUMTEXTURES) && (theTextures[i].hTexture != deTexId) ; ++i ); - if (i == NUMTEXTURES) - return; - - /* initializations */ - lpSurfInfo = &theTextures[i].surfInfo; - lpSurfInfo->currLod = theTextures[i].lpTlTexture->info.largeLod; - lpTexInfo = &theTextures[i].lpTlTexture->info; - - /* reset the surf info */ - lpSurfInfo->fStartX = - ((scrWidth - (float) getLodWidth(lpSurfInfo->currLod, - lpTexInfo->aspectRatio) )/2.f); - ret = modf((double) lpSurfInfo->fStartX, &dNonFrac); - lpSurfInfo->rStartX = (float) dNonFrac; - - lpSurfInfo->fEndX = - (lpSurfInfo->fStartX + (float) getLodWidth(lpSurfInfo->currLod, - lpTexInfo->aspectRatio)); - ret = modf((double) lpSurfInfo->fEndX, &dNonFrac); - lpSurfInfo->rEndX = (float) dNonFrac; - - lpSurfInfo->fStartY = - ((scrHeight - (float) getLodHeight(lpSurfInfo->currLod, - lpTexInfo->aspectRatio) )/2.f); - ret = modf((double) lpSurfInfo->fStartY, &dNonFrac); - lpSurfInfo->rStartY = (float) dNonFrac; - - lpSurfInfo->fEndY = - (lpSurfInfo->fStartY + (float) getLodHeight(lpSurfInfo->currLod, - lpTexInfo->aspectRatio)); - ret = modf((double) lpSurfInfo->fEndY, &dNonFrac); - lpSurfInfo->rEndY = (float) dNonFrac; - /* done with surface coords */ -} - diff --git a/glide2x/cvg/glide/tests/qatest00.h b/glide2x/cvg/glide/tests/qatest00.h deleted file mode 100644 index 45822c8..0000000 --- a/glide2x/cvg/glide/tests/qatest00.h +++ /dev/null @@ -1,94 +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 _QATEST00_H_ -#define _QATEST00_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#define RED_565 0xF800 -#define GRN_565 0x07E0 -#define BLU_565 0x001F -#define RED_1555 0x7C00 -#define GRN_1555 0x03E0 -#define BLU_1555 0x001F -#define RED_4444 0x0F00 -#define GRN_4444 0x00F0 -#define BLU_4444 0x000F -#define RED_332 0x00E0 -#define GRN_332 0x001C -#define BLU_332 0x0003 -#define RED_8332 0x00E0 -#define GRN_8332 0x001C -#define BLU_8332 0x0003 - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - -typedef enum { DISABLE, NEAREST, TRILINEAR, DITHRD_NREST, DITHRD_TRILIN } MipMapMode_t; -typedef enum { SCALE_IN=1, SCALE_OUT=-1 } ScaleDir_t; //sign -typedef enum { SCALE_1=0, SCALE_2, SCALE_4, SCALE_8, SCALE_16, SCALE_32 } ScaleAmt_t;//bitwise shift factor -typedef enum { BOTH_POINT, MIN_BILNEAR, MAG_BILNEAR, BOTH_BILNEAR } FilterMode_t; - -typedef struct { - float fStartX, fEndX; - float rStartX, rEndX; - float fStartY, fEndY; - float rStartY, rEndY; - GrLOD_t currLod; -} surfInfo_t; - -typedef struct { - const char *lpzTexFileName; - TlTexture *lpTlTexture; - hTexId_t hTexture; - surfInfo_t surfInfo; -} myTexture_t; - -typedef struct -{ - float sMult; - float tMult; -} TexCoordFactors; - - -static void doHelp( void ); -static hTexId_t doLoadTexture( const char *lpzFileName, GrTexInfo *tEtTexInfo, - FxU16 *yColors, FxBool isDwnldble ); -static void doUnloadTextures( ); -static void doScaleScreenSurf( hTexId_t deTexId, ScaleDir_t deDir, ScaleAmt_t deAmt ); -static void getFgVerts( hTexId_t deTexId, GrVertex *deFgVerts ); -static int getLodWidth( GrLOD_t lod, GrAspectRatio_t aspect ); -static int getLodHeight( GrLOD_t lod, GrAspectRatio_t aspect ); -static void getLodToDwnld( ); -static void getLodPrtlToDwnld( ); -static void doResetFgVerts( hTexId_t deTexId ); - -#ifdef NDEBUG -#undef NDEBUG -#endif - -#ifdef __cplusplus -} -#endif -#endif diff --git a/glide2x/cvg/glide/tests/qatest01.c b/glide2x/cvg/glide/tests/qatest01.c deleted file mode 100644 index b31e9f9..0000000 --- a/glide2x/cvg/glide/tests/qatest01.c +++ /dev/null @@ -1,171 +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 -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - -#define RED_565 0xF800 -#define GRN_565 0x07E0 -#define BLU_565 0x001F -#define INVBLU_565 0xFFE0 -#define INVGRN_565 0xF81F -#define INVRED_565 0x07FF -#define WHT_565 0xFFFF -#define BLK_565 0x0000 - -#define NUM_X_BLCKS 7 -#define NUM_Y_BLCKS 7 - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "QATEST01"; -static const char purpose[] = "Buffer Swap Alliance bug"; -static const char usage[] = "-n -r -d "; - - -int main( int argc, char **argv) -{ - /* Definitions */ - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - - GrLfbInfo_t myLfbInfo; - int nBlckWdth; - int nBlckHght; - - FxU16 yBlckClrs[NUM_Y_BLCKS][NUM_X_BLCKS] = - {{RED_565, GRN_565, BLU_565, INVRED_565, INVGRN_565, INVBLU_565, WHT_565}, - {RED_565, GRN_565, BLU_565, INVRED_565, INVGRN_565, INVBLU_565, WHT_565}, - {RED_565, GRN_565, BLU_565, INVRED_565, INVGRN_565, INVBLU_565, WHT_565}, - {RED_565, GRN_565, BLU_565, INVRED_565, INVGRN_565, INVBLU_565, WHT_565}, - {RED_565, GRN_565, BLU_565, INVRED_565, INVGRN_565, INVBLU_565, WHT_565}, - {RED_565, GRN_565, BLU_565, INVRED_565, INVGRN_565, INVBLU_565, WHT_565}, - {BLK_565, BLK_565, BLK_565, BLK_565, BLK_565, BLK_565, BLK_565}}; - - - /* Initializations */ - nBlckWdth = ((int) scrWidth / NUM_X_BLCKS); - nBlckHght = ((int) scrHeight / NUM_Y_BLCKS); - - /* Code */ - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &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_UPPER_LEFT, 2, 1 ) ); - - myLfbInfo.size = sizeof(GrLfbInfo_t); - if ( !grLfbLock(GR_LFB_WRITE_ONLY, GR_BUFFER_BACKBUFFER, GR_LFBWRITEMODE_565, - GR_ORIGIN_UPPER_LEFT, FXFALSE, &myLfbInfo)) - frames=0; - - while ( frames-- ) - { - int i, j, k, l; - FxU16 *lpPxl; - FxU32 stride = myLfbInfo.strideInBytes; - void *tmpLfb; - - tmpLfb = (void*) ((FxU16*)myLfbInfo.lfbPtr + 1 + 2*stride/2); - grBufferClear( 0xffffff, 0, GR_WDEPTHVALUE_FARTHEST ); - - for (i=0; i < NUM_Y_BLCKS; ++i) { - for (j=0; j < NUM_X_BLCKS; ++j) { - lpPxl = ((FxU16 *) tmpLfb + j*nBlckWdth) + - (i*nBlckHght*stride/2); - for(k=0; k < nBlckHght; ++k) { - for (l=0; l < nBlckWdth; ++l) { - *lpPxl = yBlckClrs[i][j]; - ++lpPxl; - } - lpPxl += (stride/2 - nBlckWdth); /* inc in pixel space */ - } - } - } - - grBufferSwap( 1 ); - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - if ( tlKbHit() ) frames = 0; - } - grLfbUnlock( GR_LFB_WRITE_ONLY, GR_BUFFER_BACKBUFFER ); - grGlideShutdown(); - exit(0); -} diff --git a/glide2x/cvg/glide/tests/rgb332.3df b/glide2x/cvg/glide/tests/rgb332.3df deleted file mode 100644 index f06219a..0000000 Binary files a/glide2x/cvg/glide/tests/rgb332.3df and /dev/null differ diff --git a/glide2x/cvg/glide/tests/rgb565.3df b/glide2x/cvg/glide/tests/rgb565.3df deleted file mode 100644 index e5fbeda..0000000 --- a/glide2x/cvg/glide/tests/rgb565.3df +++ /dev/null @@ -1,748 +0,0 @@ -3df v1.1 -rgb565 -lod range: 1 256 -aspect ratio: 1 1 -R‹R‹k/k/rÍjÍjÎjÍc/c/c/c/bŒbŒR‹R‹R -R -R‹R‹bŒbŒjÍj̓p{oƒp{ok-k-s/k/ƒÏƒÏ”2Œ1“ЋЃЃГЋЃЃЃЃГЋЃЃЃЃЃЃГЋЃЃÐc,c,ZJbJbŒbŒR‹R‹bŒbŒZÌZÌbŒbŒbŒbŒR‹R‹jÍjÍR‹R‹bŒbŒR‹R‹R‹R‹R‹R‹R -R -R -R -R‹R‹bŒbŒc-c-jÎjÍc/c/k/k/s/k/c/c/bŒbŒc/c/c/c/bŒbŒR‹R‹R -R -R‹R‹R -R -R‹R‹c/c/k/k/bJZJR -R -R‹R‹bŒbŒc/c/ZÌZÌbŒbŒR -R -R‹R‹R‹R‹bŒbŒk/k/“ГÐk/k/k-s-ƒÐƒÐƒÏƒÏ”2Œ1ƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÏƒÏ“ЋЃЃЃЃГЋЃЃÐk/k/bŒbŒR‹R‹ZJbJZÌZÌZJbJZÌZÌZÌZÌbŒbŒR‹R‹jÍjÍbŒbŒR‹R‹R‹R‹R‹R‹R -R -R -R -R‹R‹R‹R‹jÍjÍZÌZÌc/c/k/k/s/k/k/k/c/c/bŒbŒk/k/c/c/c/c/ƒÏƒÏZJbJR‹R‹R‹R‹R -R -R‹R‹k/k/rÍjÍjÎjÍc/c/c/c/bŒbŒR‹R‹R -R -R‹R‹bŒbŒjÍj̓p{oƒp{ok-k-s/k/ƒÏƒÏ”2Œ1“ЋЃЃГЋЃЃЃЃГЋЃЃЃЃЃЃГЋЃЃÐc,c,ZJbJbŒbŒR‹R‹bŒbŒZÌZÌbŒbŒbŒbŒR‹R‹jÍjÍR‹R‹bŒbŒR‹R‹R‹R‹R‹R‹R -R -R -R -R‹R‹bŒbŒc-c-jÎjÍc/c/k/k/s/k/c/c/bŒbŒc/c/c/c/bŒbŒR‹R‹R -R -R‹R‹R -R -R‹R‹c/c/k/k/bJZJR -R -R‹R‹bŒbŒc/c/ZÌZÌbŒbŒR -R -R‹R‹R‹R‹bŒbŒk/k/“ГÐk/k/k-s-ƒÐƒÐƒÏƒÏ”2Œ1ƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÏƒÏ“ЋЃЃЃЃГЋЃЃÐk/k/bŒbŒR‹R‹ZJbJZÌZÌZJbJZÌZÌZÌZÌbŒbŒR‹R‹jÍjÍbŒbŒR‹R‹R‹R‹R‹R‹R -R -R -R -R‹R‹R‹R‹jÍjÍZÌZÌc/c/k/k/s/k/k/k/c/c/bŒbŒk/k/c/c/c/c/ƒÏƒÏZJbJR‹R‹R‹R‹R -R -bbbbZZbbjËjË{.{.YÇYÇAGAGQEQEAGAGAÇAÇAGAGAEAEA†A†A†A†QEQEAÇAÇI†I†QÇQÇQÇQÇI‡I‡QÇQÇQÇQÇI†I†AGAGAEAEAEAEQÇQÇAGAGAEAEAGAGA†A†I†I†YÇYÇjŠjŠk/k/s-k-jËjËs-k-{,{,jÍjÍ{,{,{.{.{.{.k/k/s-k-jËjËrÍjÍk.k-s/k/jËjËr‰j‰bbZZjŠjŠjËjËr‰j‰jËjËrËjËjËjËrËjËjËjËrËjËjËjËrjY†Y†YEYEY†Y†iÇiÇs/k/bIbIY†Y†A&A&QÇQÇAGAGAÇAÇA†A†IEIEAGAGA†A†QEQEAÇAÇQÇQÇQÇQÇQÇQÇQÇQÇI†I†QÇQÇI†I†AGAGA$A$AÇAÇQÇQÇIEIEIEIEAGAGAÇAÇY†Y†bb{oƒpc,c,jÍjÍ{,{,jËjËs-k-k.k-{,{,{.{.k/k/s-k-{,{,jÍjÍ{.{.œ“œ“{.{.j‰j‰rIjIbbbIbIjŠjŠjËjËrËjËj‰j‰rËjËjŠjŠjËjËrËjËbŒbŒbbbbZZbbjËjË{.{.YÇYÇAGAGQEQEAGAGAÇAÇAGAGAEAEA†A†A†A†QEQEAÇAÇI†I†QÇQÇQÇQÇI‡I‡QÇQÇQÇQÇI†I†AGAGAEAEAEAEQÇQÇAGAGAEAEAGAGA†A†I†I†YÇYÇjŠjŠk/k/s-k-jËjËs-k-{,{,jÍjÍ{,{,{.{.{.{.k/k/s-k-jËjËrÍjÍk.k-s/k/jËjËr‰j‰bbZZjŠjŠjËjËr‰j‰jËjËrËjËjËjËrËjËjËjËrËjËjËjËrjY†Y†YEYEY†Y†iÇiÇs/k/bIbIY†Y†A&A&QÇQÇAGAGAÇAÇA†A†IEIEAGAGA†A†QEQEAÇAÇQÇQÇQÇQÇQÇQÇQÇQÇI†I†QÇQÇI†I†AGAGA$A$AÇAÇQÇQÇIEIEIEIEAGAGAÇAÇY†Y†bb{oƒpc,c,jÍjÍ{,{,jËjËs-k-k.k-{,{,{.{.k/k/s-k-{,{,jÍjÍ{.{.œ“œ“{.{.j‰j‰rIjIbbbIbIjŠjŠjËjËrËjËj‰j‰rËjËjŠjŠjËjËrËjËbŒbŒQEQE@å@åI$I$I$I$YÉYÉk-k-QEQEHäHä@ä@ä0Ä0ä0Ä0ä0Ä0ã0Ä0ã8Ä8äHäHäAEAEHäHä0Ä0ä@ä@ä0Ä0ä8ä8ã8Ä8ä8Ä8ä8Ä8ä8Ä8ä8ä8ã8Ä8äA$A$IEIE@ä@ä0Ä0ä0Ä0ä@å@åI$I$bIbI{.{.aÇaÇQEQEQEQEQEQEQEQEAGAGYEYEaÇaÇY†Y†I‡I‡aÇaÇaÇaÇbŒbŒc,c,QEQEQEQE@å@åQEQEI$I$HäHäYEYEYEYEYDYDYEYEYEYEYEYEYEYEYEYEYEYEYEYEY†Y†Y†Y†Y†Y†jÍjÍbb8Ä8ä@ä@ä@ä@ä0Ä0ã0Ä0ã8Ä8ä0Ä0ä@ä@äHäHäAEAE8Ã8Ä@ä@ä0Ä0ä@ä@ä0Ä0ä0Ä0ä8Ä8ä8Ä8ä8ä8ã8Ä8ä8Ä8äIEIE8Ä8ä8Ä8ä0Ä0ã8Ä8äQEQEYEYEk/k/rjYEYEA&A&QEQEQEQEQEQEYEYEI‡I‡a†a†aÇaÇI‡I‡Y†Y†jIjIƒÒƒÑZZQEQE@ä@äQEQEQEQEI$I$YEYEYDYDYEYEYDYDYEYEYEYEYEYEYEYEQEQE@å@åI$I$I$I$YÉYÉk-k-QEQEHäHä@ä@ä0Ä0ä0Ä0ä0Ä0ã0Ä0ã8Ä8äHäHäAEAEHäHä0Ä0ä@ä@ä0Ä0ä8ä8ã8Ä8ä8Ä8ä8Ä8ä8Ä8ä8ä8ã8Ä8äA$A$IEIE@ä@ä0Ä0ä0Ä0ä@å@åI$I$bIbI{.{.aÇaÇQEQEQEQEQEQEQEQEAGAGYEYEaÇaÇY†Y†I‡I‡aÇaÇaÇaÇbŒbŒc,c,QEQEQEQE@å@åQEQEI$I$HäHäYEYEYEYEYDYDYEYEYEYEYEYEYEYEYEYEYEYEYEYEY†Y†Y†Y†Y†Y†jÍjÍbb8Ä8ä@ä@ä@ä@ä0Ä0ã0Ä0ã8Ä8ä0Ä0ä@ä@äHäHäAEAE8Ã8Ä@ä@ä0Ä0ä@ä@ä0Ä0ä0Ä0ä8Ä8ä8Ä8ä8ä8ã8Ä8ä8Ä8äIEIE8Ä8ä8Ä8ä0Ä0ã8Ä8äQEQEYEYEk/k/rjYEYEA&A&QEQEQEQEQEQEYEYEI‡I‡a†a†aÇaÇI‡I‡Y†Y†jIjIƒÒƒÑZZQEQE@ä@äQEQEQEQEI$I$YEYEYDYDYEYEYDYDYEYEYEYEYEYEYEYEY†Y†YEYEA&A&@å@åaÇaÇjÍjÍQEQE@ä@ä8Ä8ä0Ä0ã(ä(ä(ä(ä8Ä8ä0Ä0ä8Ä8äAEAE@ä@ä0Ä0ä0Ä0ã8Ä8ä0Ä0ä(ä(ä8Ä8ä(ä(ä9$9$8Ä8ä8Ä8ä9E9E8Ä8ä8Ä8ä8Ä8ä8ä8ã8Ä8äQEQEjjs/k/I‡I‡QEQEA&A&YEYEI‡I‡Y†Y†I‡I‡Y†Y†I‡I‡aÇaÇI‡I‡a†a†{.{.bŒbŒY†Y†QEQEA&A&QEQEA&A&QEQEQEQEQEQEHäHäYEYEa†a†Y†Y†Y†Y†I‡I‡Y†Y†I‡I‡YEYEY†Y†Y†Y†bŒbŒR -R -HäHä@ä@ä0Ä0ã(ä(ä(ä(ä(ä(ä0Ä0ä@ä@ä8Ä8ä@å@å0Ã0ä8Ä8ä0Ä0ã(ä(ä0Ä0ä8Ä8ä8Ä8ä(ä(ä8Ä8äA$A$8Ä8ä9E9E@ä@ä8Ä8äA$A$8Ä8ä@å@åY†Y†k/k/bbAGAGQEQEAGAGYEYEI‡I‡aÇaÇI‡I‡aÇaÇI‡I‡Y†Y†YÉYÉjIjIƒo{pI‡I‡YEYEAGAGQEQEA&A&QEQEQEQEQEQEQEQEQEQEQEQEY†Y†QEQEY†Y†Y†Y†YEYEA&A&@å@åaÇaÇjÍjÍQEQE@ä@ä8Ä8ä0Ä0ã(ä(ä(ä(ä8Ä8ä0Ä0ä8Ä8äAEAE@ä@ä0Ä0ä0Ä0ã8Ä8ä0Ä0ä(ä(ä8Ä8ä(ä(ä9$9$8Ä8ä8Ä8ä9E9E8Ä8ä8Ä8ä8Ä8ä8ä8ã8Ä8äQEQEjjs/k/I‡I‡QEQEA&A&YEYEI‡I‡Y†Y†I‡I‡Y†Y†I‡I‡aÇaÇI‡I‡a†a†{.{.bŒbŒY†Y†QEQEA&A&QEQEA&A&QEQEQEQEQEQEHäHäYEYEa†a†Y†Y†Y†Y†I‡I‡Y†Y†I‡I‡YEYEY†Y†Y†Y†bŒbŒR -R -HäHä@ä@ä0Ä0ã(ä(ä(ä(ä(ä(ä0Ä0ä@ä@ä8Ä8ä@å@å0Ã0ä8Ä8ä0Ä0ã(ä(ä0Ä0ä8Ä8ä8Ä8ä(ä(ä8Ä8äA$A$8Ä8ä9E9E@ä@ä8Ä8äA$A$8Ä8ä@å@åY†Y†k/k/bbAGAGQEQEAGAGYEYEI‡I‡aÇaÇI‡I‡aÇaÇI‡I‡Y†Y†YÉYÉjIjIƒo{pI‡I‡YEYEAGAGQEQEA&A&QEQEQEQEQEQEQEQEQEQEQEQEY†Y†QEQEY†Y†Y†Y†A&A&@å@åA$A$YÉYÉc,c,YEYE8Ä8ä8Ä8ä ä ä0Ä0ä0Ä0ã(ä(ä8Ä8äA$A$@å@å8Ä8ä8Ä8äA$A$(ä(ä8Ä8ä(ä(ä8Ä8ä8Ä8ä9$9$8Ä8ä9$9$@å@åIEIE8Ä8ä8Ä8ä9$9$8Ä8äIEIEZZk/k/aÇaÇI‡I‡YEYEI‡I‡AGAGY†Y†I‡I‡aÇaÇI‡I‡Y†Y†I‡I‡aÇaÇ{.{.k/k/QEQEQEQEA&A&QEQEA&A&I†I†A&A&I‡I‡QEQEAGAGYEYEAGAGaÇaÇYÉYÉaÇaÇYÉYÉaÇaÇYÉYÉI‡I‡jÎjÍrj@ä@ä8Ä8ä ä ä0Ä0ä0Ä0ä0Ä0ã8Ä8ä8Ä8äA$A$A$A$8Ä8äA$A$(ä(ä8Ä8ä8Ä8ä(ä(ä8Ä8ä9$9$8Ä8ä8Ä8ä9E9E@å@åAEAE0Ä0ä0Ä0ã8Ä8äIEIEQEQEk/k/bJZJY†Y†Y†Y†YEYEI‡I‡AGAGI‡I‡Y†Y†I‡I‡aÇaÇI‡I‡Y†Y†jŠjŠ{oƒpYÈYÉQEQEA&A&@å@åQEQEA&A&AGAGA&A&I‡I‡QEQEYÉYÉQEQEAGAGY†Y†Y†Y†A&A&@å@åA$A$YÉYÉc,c,YEYE8Ä8ä8Ä8ä ä ä0Ä0ä0Ä0ã(ä(ä8Ä8äA$A$@å@å8Ä8ä8Ä8äA$A$(ä(ä8Ä8ä(ä(ä8Ä8ä8Ä8ä9$9$8Ä8ä9$9$@å@åIEIE8Ä8ä8Ä8ä9$9$8Ä8äIEIEZZk/k/aÇaÇI‡I‡YEYEI‡I‡AGAGY†Y†I‡I‡aÇaÇI‡I‡Y†Y†I‡I‡aÇaÇ{.{.k/k/QEQEQEQEA&A&QEQEA&A&I†I†A&A&I‡I‡QEQEAGAGYEYEAGAGaÇaÇYÉYÉaÇaÇYÉYÉaÇaÇYÉYÉI‡I‡jÎjÍrj@ä@ä8Ä8ä ä ä0Ä0ä0Ä0ä0Ä0ã8Ä8ä8Ä8äA$A$A$A$8Ä8äA$A$(ä(ä8Ä8ä8Ä8ä(ä(ä8Ä8ä9$9$8Ä8ä8Ä8ä9E9E@å@åAEAE0Ä0ä0Ä0ã8Ä8äIEIEQEQEk/k/bJZJY†Y†Y†Y†YEYEI‡I‡AGAGI‡I‡Y†Y†I‡I‡aÇaÇI‡I‡Y†Y†jŠjŠ{oƒpYÈYÉQEQEA&A&@å@åQEQEA&A&AGAGA&A&I‡I‡QEQEYÉYÉQEQEAGAGY†Y†QÇQÇI‡I‡A&A&@å@åbbc/c/YEYE8Ä8ä8Ä8ä(ä(ä(ä(ä8Ä8ä0Ä0ã(ä(ä8Ä8äA$A$8Ä8äA$A$8Ä8ä(ä(ä8Ä8ä(ä(ä0å0å9$9$(ä(ä8Ä8ä8Ä8ä9E9E@å@åAEAE0Ä0ä0Ä0ã8Ä8äQEQEYÉYÉjËjËYÉYÉaÇaÇI‡I‡YEYEI‡I‡AGAGY†Y†I‡I‡YÉYÉI‡I‡aÇaÇYÉYÉjËjËbŒbŒIEIE0æ0æ(ä(ä(ä(ä å å0å0å9E9EA&A&A&A&YEYEI‡I‡aÇaÇI‡I‡YÉYÉYÇYÇYÉYÉQÇQÇYÉYÉYÇYÇjÍjÍbJZJHäHä0Ä0ä0Ä0ä0Ä0ã(ä(ä(ä(ä0Ä0ä8Ä8ä8Ä8äA$A$8Ä8ä8Ä8ä8Ä8ä(ä(ä8Ä8ä(ä(ä9$9$(ä(ä8Ä8äA$A$8Ä8ä9E9E@å@å8ã8ä8Ä8ä8Ä8ä9E9EQEQEjÍjÍbbYÉYÉaÇaÇAGAGI†I†I‡I‡YEYEI‡I‡YÉYÉYEYEI‡I‡YÉYÉjIjIƒo{pAFAG9E9E0å0å(ä(ä(ä(ä(å(å9E9E0å0åA&A&AGAGYÇYÇI‡I‡YEYEYÉYÉQÇQÇI‡I‡A&A&@å@åbbc/c/YEYE8Ä8ä8Ä8ä(ä(ä(ä(ä8Ä8ä0Ä0ã(ä(ä8Ä8äA$A$8Ä8äA$A$8Ä8ä(ä(ä8Ä8ä(ä(ä0å0å9$9$(ä(ä8Ä8ä8Ä8ä9E9E@å@åAEAE0Ä0ä0Ä0ã8Ä8äQEQEYÉYÉjËjËYÉYÉaÇaÇI‡I‡YEYEI‡I‡AGAGY†Y†I‡I‡YÉYÉI‡I‡aÇaÇYÉYÉjËjËbŒbŒIEIE0æ0æ(ä(ä(ä(ä å å0å0å9E9EA&A&A&A&YEYEI‡I‡aÇaÇI‡I‡YÉYÉYÇYÇYÉYÉQÇQÇYÉYÉYÇYÇjÍjÍbJZJHäHä0Ä0ä0Ä0ä0Ä0ã(ä(ä(ä(ä0Ä0ä8Ä8ä8Ä8äA$A$8Ä8ä8Ä8ä8Ä8ä(ä(ä8Ä8ä(ä(ä9$9$(ä(ä8Ä8äA$A$8Ä8ä9E9E@å@å8ã8ä8Ä8ä8Ä8ä9E9EQEQEjÍjÍbbYÉYÉaÇaÇAGAGI†I†I‡I‡YEYEI‡I‡YÉYÉYEYEI‡I‡YÉYÉjIjIƒo{pAFAG9E9E0å0å(ä(ä(ä(ä(å(å9E9E0å0åA&A&AGAGYÇYÇI‡I‡YEYEYÉYÉYÇYÇAGAG@å@åI$I$ZZk/k/YEYE8Ä8ä8Ä8ä8Ä8ä(ä(ä(ä(ä0Ä0ã8Ä8ä8Ä8ä8Ä8äA$A$0Ä0ä0Ä0ã8Ä8ä8Ä8ä8ä8ã8Ä8ä8Ä8äA$A$8Ä8ä0Ä0ã8Ä8äIEIEHäHä0Ä0ä8ä8ã@å@åHäHäYÇYÇc,c,jjYÉYÉaÇaÇAGAGI‡I‡I‡I‡YÉYÉaÇaÇI‡I‡aÇaÇI‡I‡a†a†ZJbJZJbJ(ä(ä0å0å1†1†Ä Ä å å å å0æ0æ ä ä ä ä8Ä8äA&A&AGAGQÇQÇI†I†I‡I‡IEIEAGAGAGAGY†Y†c/c/ZZHãHä@ä@ä0Ä0ä0Ä0ã(ä(ä(ä(ä@ä@ä0Ä0ã8Ä8äA$A$8Ä8ä9$9$0Ä0ã8Ä8ä8ä8ã8Ä8ä8Ä8äA$A$8Ä8ä8Ä8ä0Ä0ãIEIE@å@å8ã8ä8Ä8ä8ä8ãI$I$QEQEbŒbŒbIbIjjI‡I‡aÇaÇI‡I‡I‡I‡I‡I‡YÉYÉaÇaÇI‡I‡YÉYÉY†Y†jjs/k/9E9E0å0å0æ0æ å å å å(å(å å å å å(ä(ä8Ä8äAÇAÇ8Ä8ä0å0åQÇQÇYÇYÇAGAG@å@åI$I$ZZk/k/YEYE8Ä8ä8Ä8ä8Ä8ä(ä(ä(ä(ä0Ä0ã8Ä8ä8Ä8ä8Ä8äA$A$0Ä0ä0Ä0ã8Ä8ä8Ä8ä8ä8ã8Ä8ä8Ä8äA$A$8Ä8ä0Ä0ã8Ä8äIEIEHäHä0Ä0ä8ä8ã@å@åHäHäYÇYÇc,c,jjYÉYÉaÇaÇAGAGI‡I‡I‡I‡YÉYÉaÇaÇI‡I‡aÇaÇI‡I‡a†a†ZJbJZJbJ(ä(ä0å0å1†1†Ä Ä å å å å0æ0æ ä ä ä ä8Ä8äA&A&AGAGQÇQÇI†I†I‡I‡IEIEAGAGAGAGY†Y†c/c/ZZHãHä@ä@ä0Ä0ä0Ä0ã(ä(ä(ä(ä@ä@ä0Ä0ã8Ä8äA$A$8Ä8ä9$9$0Ä0ã8Ä8ä8ä8ã8Ä8ä8Ä8äA$A$8Ä8ä8Ä8ä0Ä0ãIEIE@å@å8ã8ä8Ä8ä8ä8ãI$I$QEQEbŒbŒbIbIjjI‡I‡aÇaÇI‡I‡I‡I‡I‡I‡YÉYÉaÇaÇI‡I‡YÉYÉY†Y†jjs/k/9E9E0å0å0æ0æ å å å å(å(å å å å å(ä(ä8Ä8äAÇAÇ8Ä8ä0å0åQÇQÇY†Y†AGAGI†I†A&A&YÉYÉk/k/YÉYÉAGAG9E9E0å0å8Ä8ä(ä(ä0å0å(ä(ä0Ä0ä0Ä0ã ä ä0Ä0ã0Ä0ä0Ä0ä1$1$0Ä0ä0Ä0ä9$9$9E9E0å0å8Ä8ä0æ0æA&A&9E9E0å0åAGAGAGAGI†I†ZJbJbŒbŒI‡I‡AGAGI†I†I‡I‡aÇaÇAGAGY†Y†AGAGI‡I‡YEYEA&A&AGAG{,{,k/k/0Ã0ä9E9EI‡I‡A&A&@å@åA$A$9E9EA&A&@å@åAEAEY†Y†I‡I‡A&A&I†I†A&A&IEIEA&A&9E9EI‡I‡c/c/bŒbŒAGAGIEIE0å0å0å0å(ä(ä8Ä8ä(ä(ä(ä(ä0Ä0ä0Ä0ã ä ã0Ä0ã(ä(ä8Ä8ä(ä(ä8Ä8ä1$1$0æ0æ9E9E(ä(ä0å0åA&A&@å@å0æ0æAGAGAGAGAGAGYÉYÉZÌZÌYÉYÉAGAGAGAGQÇQÇI‡I‡Y†Y†I‡I‡YEYEI‡I‡AGAGAGAGQEQEbbƒÒƒÑ9†9†0å0åQÇQÇAGAGA$A$9E9E@å@å9E9E@å@åAEAEQEQEA&A&9E9EA&A&Y†Y†AGAGI†I†A&A&YÉYÉk/k/YÉYÉAGAG9E9E0å0å8Ä8ä(ä(ä0å0å(ä(ä0Ä0ä0Ä0ã ä ä0Ä0ã0Ä0ä0Ä0ä1$1$0Ä0ä0Ä0ä9$9$9E9E0å0å8Ä8ä0æ0æA&A&9E9E0å0åAGAGAGAGI†I†ZJbJbŒbŒI‡I‡AGAGI†I†I‡I‡aÇaÇAGAGY†Y†AGAGI‡I‡YEYEA&A&AGAG{,{,k/k/0Ã0ä9E9EI‡I‡A&A&@å@åA$A$9E9EA&A&@å@åAEAEY†Y†I‡I‡A&A&I†I†A&A&IEIEA&A&9E9EI‡I‡c/c/bŒbŒAGAGIEIE0å0å0å0å(ä(ä8Ä8ä(ä(ä(ä(ä0Ä0ä0Ä0ã ä ã0Ä0ã(ä(ä8Ä8ä(ä(ä8Ä8ä1$1$0æ0æ9E9E(ä(ä0å0åA&A&@å@å0æ0æAGAGAGAGAGAGYÉYÉZÌZÌYÉYÉAGAGAGAGQÇQÇI‡I‡Y†Y†I‡I‡YEYEI‡I‡AGAGAGAGQEQEbbƒÒƒÑ9†9†0å0åQÇQÇAGAGA$A$9E9E@å@å9E9E@å@åAEAEQEQEA&A&9E9EA&A&{.{.jËjËs-k-jËjËs-k-{.{.k-k-bJZJbŒbŒbŒbŒZJbJR -R -bJZJR‹R‹ZJbJc,c,ZJbJR‹R‹ZJbJR‹R‹ZJbJZJbJRŠRŠbŒbŒZJbJc,c,bŒbŒk,k,s/k/{.{.{.{.k-k-s.k-k-k-c,c,k-k-bŒbŒbŒbŒJJYÉYÉZJbJR -R -R‹R‹YÉYÉR‹R‹bŒbŒR‹R‹bŒbŒ{oƒpƒÐƒÐk/k/bŒbŒk-k-rËjË{,{,{.{.{.{.{oƒp{oƒps,{,ƒÐƒÐ“ЋЃЃЃЃÐ{oƒp{,{,k/k/k/s/k-k-{.{.{,{,bŒbŒbŒbŒbŒbŒZJbJZIZIR‹R‹ZJbJZJbJbŒbŒZÌZÌZJbJZJbJZJbJR‹R‹ZJbJR‹R‹jŠjŠZJbJbŒbŒZÌZÌjËjËs/k/ƒÐƒÐk,k,s-k-k.k-s-k-bŒbŒ{.{.k-k-bŒbŒZIZIJJR -R -bJZJbJZJR -R -R -R -ZÌZÌZJbJbŒbŒc/c/ƒÐƒÐ{.{.c,c,bŒbŒ{.{.jËjË{.{.{.{.{oƒp{oƒps,{,{oƒp‹Ð“Ð{oƒp{o{p{.{.jËjËs-k-jËjËs-k-{.{.k-k-bJZJbŒbŒbŒbŒZJbJR -R -bJZJR‹R‹ZJbJc,c,ZJbJR‹R‹ZJbJR‹R‹ZJbJZJbJRŠRŠbŒbŒZJbJc,c,bŒbŒk,k,s/k/{.{.{.{.k-k-s.k-k-k-c,c,k-k-bŒbŒbŒbŒJJYÉYÉZJbJR -R -R‹R‹YÉYÉR‹R‹bŒbŒR‹R‹bŒbŒ{oƒpƒÐƒÐk/k/bŒbŒk-k-rËjË{,{,{.{.{.{.{oƒp{oƒps,{,ƒÐƒÐ“ЋЃЃЃЃÐ{oƒp{,{,k/k/k/s/k-k-{.{.{,{,bŒbŒbŒbŒbŒbŒZJbJZIZIR‹R‹ZJbJZJbJbŒbŒZÌZÌZJbJZJbJZJbJR‹R‹ZJbJR‹R‹jŠjŠZJbJbŒbŒZÌZÌjËjËs/k/ƒÐƒÐk,k,s-k-k.k-s-k-bŒbŒ{.{.k-k-bŒbŒZIZIJJR -R -bJZJbJZJR -R -R -R -ZÌZÌZJbJbŒbŒc/c/ƒÐƒÐ{.{.c,c,bŒbŒ{.{.jËjË{.{.{.{.{oƒp{oƒps,{,{oƒp‹Ð“Ð{oƒp{o{pIEIEIEIEQEQEQEQEQEQEQEQEI$I$8Ä8äIEIEAEAEAEAE@å@åIEIEQEQEbbZJbJAÇAÇa†a†QEQEQEQEYEYEY†Y†YEYEQEQEIEIEQEQEQEQEQÇQÇIÇIÇbŒbŒZZQÇQÇQEQEY†Y†AGAGQEQEQEQEA&A&I†I†AGAGA†A†I†I†I‡I‡QÇQÇYÇYÇYÉYÉbbQÇQÇYÇYÇYÉYÉRRZZZZYÉYÉYÇYÇZZZZZJbJjŠjŠbbbbYÇYÇZZZZYÇYÇY†Y†Y†Y†Y†Y†QEQEQEQEQEQE8Ä8äAEAEI$I$A&A&IEIE@å@åQEQEY†Y†bŒbŒIÇIÇQÇQÇYEYEQEQEQEQEY†Y†YEYEY†Y†AEAEIEIEQEQEQEQEQÇQÇR‹R‹bIbIYÇYÇY†Y†I†I†Y†Y†AGAGIEIEQEQEAGAGQEQEAGAGAGAGQÇQÇI†I†YÉYÉYÇYÇYÉYÉYÇYÇRRYÇYÇYÉYÉZIZIZIZIYÇYÇRRZZZZbbbŒbŒbbbbAGAGA$A$A†A†IEIEIEIEQEQEQEQEQEQEQEQEI$I$8Ä8äIEIEAEAEAEAE@å@åIEIEQEQEbbZJbJAÇAÇa†a†QEQEQEQEYEYEY†Y†YEYEQEQEIEIEQEQEQEQEQÇQÇIÇIÇbŒbŒZZQÇQÇQEQEY†Y†AGAGQEQEQEQEA&A&I†I†AGAGA†A†I†I†I‡I‡QÇQÇYÇYÇYÉYÉbbQÇQÇYÇYÇYÉYÉRRZZZZYÉYÉYÇYÇZZZZZJbJjŠjŠbbbbYÇYÇZZZZYÇYÇY†Y†Y†Y†Y†Y†QEQEQEQEQEQE8Ä8äAEAEI$I$A&A&IEIE@å@åQEQEY†Y†bŒbŒIÇIÇQÇQÇYEYEQEQEQEQEY†Y†YEYEY†Y†AEAEIEIEQEQEQEQEQÇQÇR‹R‹bIbIYÇYÇY†Y†I†I†Y†Y†AGAGIEIEQEQEAGAGQEQEAGAGAGAGQÇQÇI†I†YÉYÉYÇYÇYÉYÉYÇYÇRRYÇYÇYÉYÉZIZIZIZIYÇYÇRRZZZZbbbŒbŒbbbbAGAGA$A$A†A†8Ä8ä0å0å@å@åA&A&@å@å@å@å8Ä8ä9E9E8Ä8ä@å@å@å@åA$A$IEIEA&A&jjc/c/Y†Y†YEYEa†a†YEYEY†Y†Y†Y†aÇaÇY†Y†AGAGQÇQÇA†A†IEIEI‡I‡c.c-ZZAGAGQEQEA&A&IEIE@å@å9E9EA&A&@å@åAEAE8Ä8äA&A&IEIEA&A&QEQEA&A&QEQEA&A&AGAGAEAE@å@åA$A$8Ä8äA&A&AGAGAGAGYEYEYÉYÉZZYEYEA&A&YEYEA&A&QEQEA&A&QEQE@å@å@å@åQEQE@å@å8Ä8ä9E9E8Ä8ä@å@å8Ä8ä9E9EA&A&QEQEY†Y†k/k/ZZYEYEY†Y†YEYEaÇaÇYEYEI‡I‡Y†Y†QÇQÇY†Y†I†I†AGAGAGAGbŒbŒZJbJI†I†A&A&AGAG@å@åQEQE@å@å9E9EA&A&8Ä8ä9E9EA&A&A&A&@å@åIEIEIEIEIEIEA&A&I†I†A&A&IEIE0å0å8Ä8ä@å@åA&A&AGAGQEQEY†Y†bbI‡I‡QEQE@ä@ä8Ä8ä0å0å8ä8Ä0å0å@å@åA&A&@å@å@å@å8Ä8ä9E9E8Ä8ä@å@å@å@åA$A$IEIEA&A&jjc/c/Y†Y†YEYEa†a†YEYEY†Y†Y†Y†aÇaÇY†Y†AGAGQÇQÇA†A†IEIEI‡I‡c.c-ZZAGAGQEQEA&A&IEIE@å@å9E9EA&A&@å@åAEAE8Ä8äA&A&IEIEA&A&QEQEA&A&QEQEA&A&AGAGAEAE@å@åA$A$8Ä8äA&A&AGAGAGAGYEYEYÉYÉZZYEYEA&A&YEYEA&A&QEQEA&A&QEQE@å@å@å@åQEQE@å@å8Ä8ä9E9E8Ä8ä@å@å8Ä8ä9E9EA&A&QEQEY†Y†k/k/ZZYEYEY†Y†YEYEaÇaÇYEYEI‡I‡Y†Y†QÇQÇY†Y†I†I†AGAGAGAGbŒbŒZJbJI†I†A&A&AGAG@å@åQEQE@å@å9E9EA&A&8Ä8ä9E9EA&A&A&A&@å@åIEIEIEIEIEIEA&A&I†I†A&A&IEIE0å0å8Ä8ä@å@åA&A&AGAGQEQEY†Y†bbI‡I‡QEQE@ä@ä8Ä8ä0å0å8Ä8äA$A$@å@åA$A$9E9E@å@å9$9$0å0å9E9E8Ä8ä9E9EA&A&@å@åY†Y†bbbŒbŒ@å@åYEYEY†Y†aÇaÇY†Y†Y†Y†Y†Y†aÇaÇI‡I‡QÇQÇAGAGI‡I‡AÇAÇbŒbŒaÇaÇI†I†A&A&IEIEA&A&@å@å@å@åIEIE@å@å9E9E@å@å9E9EA&A&QEQEA&A&QEQEA&A&AGAGQEQEA&A&IEIE0æ0æ9E9EA&A&IEIEA&A&QEQEa†a†YÉYÉAGAGYEYEI‡I‡A&A&YEYEA&A&QEQE@å@å@å@å9$9$@å@å8Ä8ä0å0å9E9E8Ä8ä9E9EA&A&@å@åIEIEI‡I‡jÎjÍI†I†YEYEY†Y†Y†Y†Y†Y†a†a†a†a†aÇaÇY†Y†I‡I‡I‡I‡I‡I‡9†9†ZIZIjŠjŠI‡I‡A&A&QEQE@å@å9E9EA&A&@å@åAEAE8Ä8äIEIE@å@å9E9EQEQEA&A&QEQEA&A&AGAGQEQE@å@åA&A&A&A&9$9$A&A&A&A&IEIEA&A&Y†Y†YÉYÉYEYEI‡I‡YEYEA&A&8Ä8ä8ä8ÄA$A$@å@åA$A$9E9E@å@å9$9$0å0å9E9E8Ä8ä9E9EA&A&@å@åY†Y†bbbŒbŒ@å@åYEYEY†Y†aÇaÇY†Y†Y†Y†Y†Y†aÇaÇI‡I‡QÇQÇAGAGI‡I‡AÇAÇbŒbŒaÇaÇI†I†A&A&IEIEA&A&@å@å@å@åIEIE@å@å9E9E@å@å9E9EA&A&QEQEA&A&QEQEA&A&AGAGQEQEA&A&IEIE0æ0æ9E9EA&A&IEIEA&A&QEQEa†a†YÉYÉAGAGYEYEI‡I‡A&A&YEYEA&A&QEQE@å@å@å@å9$9$@å@å8Ä8ä0å0å9E9E8Ä8ä9E9EA&A&@å@åIEIEI‡I‡jÎjÍI†I†YEYEY†Y†Y†Y†Y†Y†a†a†a†a†aÇaÇY†Y†I‡I‡I‡I‡I‡I‡9†9†ZIZIjŠjŠI‡I‡A&A&QEQE@å@å9E9EA&A&@å@åAEAE8Ä8äIEIE@å@å9E9EQEQEA&A&QEQEA&A&AGAGQEQE@å@åA&A&A&A&9$9$A&A&A&A&IEIEA&A&Y†Y†YÉYÉYEYEI‡I‡YEYEA&A&8Ä8ä8Ä8ä0æ0æ8Ä8ä9E9E8Ä8ä0å0å8Ä8ä9E9E@å@å0å0åA$A$9E9E@å@åIEIER -R -bŒbŒ8ã8äY†Y†a†a†Y†Y†a†a†a†a†aÇaÇa†a†I‡I‡QÇQÇI‡I‡AGAGZIZIZJbJYÉYÉIEIEA&A&A&A&IEIE@å@å9E9E@å@å9E9E@å@å9E9EA&A&A&A&AGAGI$I$A&A&IEIEA&A&AGAG@å@å9E9E8Ä8ä9E9EA&A&A&A&QEQEAGAGa†a†bbI‡I‡QEQEAGAGQEQEA&A&AGAGI$I$@å@å0å0å8Ä8ä9E9E8Ä8ä0æ0æA$A$0å0å@å@åA$A$9E9EA&A&YEYEjÍjÍA&A&QEQEY†Y†Y†Y†a†a†a†a†aÇaÇaÇaÇaÇaÇAGAGYÇYÇA†A†A&A&R‹R‹bbI‡I‡A&A&A&A&AEAEA&A&8Ä8äIEIE@å@å9E9E@å@å9E9EA&A&AGAGQEQEA&A&A&A&IEIEA&A&A&A&9E9E@å@å0å0åA†A†A&A&QEQEA&A&YEYEZJbJI‡I‡YEYEA&A&8Ä8ä@å@å8ä8Ä0æ0æ8ä8Ä9E9E8ä8Ä0å0å8ä8Ä9E9E@å@å0å0åA$A$9E9E@å@åIEIER -R -bŒbŒ8ã8äY†Y†a†a†Y†Y†a†a†a†a†aÇaÇa†a†I‡I‡QÇQÇI‡I‡AGAGZIZIZJbJYÉYÉIEIEA&A&A&A&IEIE@å@å9E9E@å@å9E9E@å@å9E9EA&A&A&A&AGAGI$I$A&A&IEIEA&A&AGAG@å@å9E9E8Ä8ä9E9EA&A&A&A&QEQEAGAGa†a†bbI‡I‡QEQEAGAGQEQEA&A&AGAGI$I$@å@å0å0å8Ä8ä9E9E8Ä8ä0æ0æA$A$0å0å@å@åA$A$9E9EA&A&YEYEjÍjÍA&A&QEQEY†Y†Y†Y†a†a†a†a†aÇaÇaÇaÇaÇaÇAGAGYÇYÇA†A†A&A&R‹R‹bbI‡I‡A&A&A&A&AEAEA&A&8Ä8äIEIE@å@å9E9E@å@å9E9EA&A&AGAGQEQEA&A&A&A&IEIEA&A&A&A&9E9E@å@å0å0åA†A†A&A&QEQEA&A&YEYEZJbJI‡I‡YEYEA&A&8Ä8ä@å@å8Ä8ä1$1$8Ä8ä0æ0æ8Ä8äA$A$(ä(ä0å0å@å@å9$9$@å@å9E9E8å8åA&A&YÉYÉZÌZÌY†Y†aÇaÇa†a†iÇiÇzzzzzzjjrjAGAGI†I†A†A†YÉYÉbŒbŒQÇQÇIEIEA&A&IEIEA&A&0å0å@å@å9E9E8å8åIEIEA&A&9E9EA&A&QEQEA&A&IEIEA&A&A&A&IEIE@å@å9E9E8Ä8ä(ä(äA&A&IEIEA&A&YEYEYÉYÉR -R -YEYEAGAGQEQEA&A&QEQEAGAGQEQE8å8å8Ä8ä9E9E8Ä8ä8Ä8ä9$9$0å0å9E9E@å@å8Ä8ä@å@å9E9EI‡I‡bŒbŒYÉYÉY…Y…iÇiÇrjiÇiÇzzzzaÇaÇiÇiÇQÇQÇAGAGAGAGI‡I‡bŒbŒYÉYÉIEIEA&A&IEIE@å@å9E9E8å8å@å@å@å@å9E9EA&A&@å@åA&A&IEIEA&A&A&A&IEIEA&A&AGAGA&A&8Ä8ä9E9E8Ä8ä9E9EA&A&QEQEQEQEY†Y†ZJbJYÉYÉQEQE@å@å8Ä8äA$A$8ä8Ä1$1$8Ä8ä0æ0æ8Ä8äA$A$(ä(ä0å0å@å@å9$9$@å@å9E9E8å8åA&A&YÉYÉZÌZÌY†Y†aÇaÇa†a†iÇiÇzzzzzzjjrjAGAGI†I†A†A†YÉYÉbŒbŒQÇQÇIEIEA&A&IEIEA&A&0å0å@å@å9E9E8å8åIEIEA&A&9E9EA&A&QEQEA&A&IEIEA&A&A&A&IEIE@å@å9E9E8Ä8ä(ä(äA&A&IEIEA&A&YEYEYÉYÉR -R -YEYEAGAGQEQEA&A&QEQEAGAGQEQE8å8å8Ä8ä9E9E8Ä8ä8Ä8ä9$9$0å0å9E9E@å@å8Ä8ä@å@å9E9EI‡I‡bŒbŒYÉYÉY…Y…iÇiÇrjiÇiÇzzzzaÇaÇiÇiÇQÇQÇAGAGAGAGI‡I‡bŒbŒYÉYÉIEIEA&A&IEIE@å@å9E9E8å8å@å@å@å@å9E9EA&A&@å@åA&A&IEIEA&A&A&A&IEIEA&A&AGAGA&A&8Ä8ä9E9E8Ä8ä9E9EA&A&QEQEQEQEY†Y†ZJbJYÉYÉQEQE@å@å8Ä8äA$A$8Ä8äA$A$8Ä8ä8Ä8äA$A$8Ä8ä8Ä8ä9$9$(ä(ä@å@å9$9$@å@åIEIEIEIEYÉYÉbŒbŒQÇQÇQÇQÇAGAGYÉYÉbbzzYÉYÉa†a†aÇaÇ@å@å9E9EA&A&R‹R‹ZIZIIEIEA&A&QEQEA&A&@å@åA$A$0å0åIEIE8å8å@å@å9E9EA&A&@å@åQEQEA&A&QEQEA&A&IEIEA&A&@å@å0å0åIEIE@å@åA&A&IEIEAGAGQEQEa†a†bŒbŒYEYEQEQEAGAGA&A&QEQEA&A&A&A&HäHä8ä8ã8Ä8äIEIE(ä(ä8Ä8ä8Ä8ä0å0åA$A$9E9EA&A&A&A&YEYEZÌZÌYÉYÉQÇQÇI‡I‡Y†Y†YÉYÉjjrjjjYÉYÉAGAG8Ä8ä9†9†9E9ER‹R‹I†I†AGAGQEQE@å@å9E9EA&A&8Ä8ä9E9EA&A&8Ä8ä9E9EIEIE@å@åIEIEA&A&QEQEA&A&IEIEA&A&@å@åA$A$9E9EA&A&@å@åIEIEA&A&QEQEYEYEZJbJYÉYÉQEQEQEQE8Ä8ä8Ä8ä8ä8ÄA$A$8Ä8ä8Ä8äA$A$8Ä8ä8Ä8ä9$9$(ä(ä@å@å9$9$@å@åIEIEIEIEYÉYÉbŒbŒQÇQÇQÇQÇAGAGYÉYÉbbzzYÉYÉa†a†aÇaÇ@å@å9E9EA&A&R‹R‹ZIZIIEIEA&A&QEQEA&A&@å@åA$A$0å0åIEIE8å8å@å@å9E9EA&A&@å@åQEQEA&A&QEQEA&A&IEIEA&A&@å@å0å0åIEIE@å@åA&A&IEIEAGAGQEQEa†a†bŒbŒYEYEQEQEAGAGA&A&QEQEA&A&A&A&HäHä8ä8ã8Ä8äIEIE(ä(ä8Ä8ä8Ä8ä0å0åA$A$9E9EA&A&A&A&YEYEZÌZÌYÉYÉQÇQÇI‡I‡Y†Y†YÉYÉjjrjjjYÉYÉAGAG8Ä8ä9†9†9E9ER‹R‹I†I†AGAGQEQE@å@å9E9EA&A&8Ä8ä9E9EA&A&8Ä8ä9E9EIEIE@å@åIEIEA&A&QEQEA&A&IEIEA&A&@å@åA$A$9E9EA&A&@å@åIEIEA&A&QEQEYEYEZJbJYÉYÉQEQEQEQE8Ä8ä8Ä8äA&A&A&A&9†9†A&A&9E9E9E9E9E9E9E9EA†A†0æ0æA&A&A†A†A&A&AGAGR -R -R‹R‹(ä(ä ä ä Ä Ã ÄÃ Ä Ä(å(å0æ0æ ä ä å åJJR -R -AÇAÇbŒbŒR‹R‹A&A&0æ0æA&A&0æ0æ9†9†0å0å0å0å8Ä8ä(ä(ä0å0å@å@å0æ0æAGAG9E9EA&A&A&A&A&A&A&A&@å@åAEAE8Ä8ä8Ä8ä9E9EA&A&AGAGY†Y†I‡I‡YÉYÉjÍjÍR -R -YÉYÉI‡I‡YÉYÉI‡I‡I‡I‡I‡I‡A&A&AGAGAÇAÇ9E9E@å@å1†1† ä ä8Ä8ä9E9EA&A&A&A&AGAGI‡I‡ZÌZÌAÇAÇ Ä Ä ä 䣣 ä ä(ä(ä0æ0æ Ä Ä(ä(äAGAGBBBBJJjÍjÍAGAGA&A&0æ0æA†A†8æ8æ0å0å@å@å8Ä8ä8Ä8ä0æ0æ8Ä8ä0æ0æAGAGA&A&A&A&9E9EA&A&A&A&I$I$@å@å0å0å8Ä8ä8Ä8äA†A†AGAGI‡I‡AGAGI‡I‡bŒbŒbŒbŒI‡I‡YÉYÉI‡I‡I‡I‡A&A&A&A&9†9†A&A&9E9E9E9E9E9E9E9EA†A†0æ0æA&A&A†A†A&A&AGAGR -R -R‹R‹(ä(ä ä ä Ä Ã ÄÃ Ä Ä(å(å0æ0æ ä ä å åJJR -R -AÇAÇbŒbŒR‹R‹A&A&0æ0æA&A&0æ0æ9†9†0å0å0å0å8Ä8ä(ä(ä0å0å@å@å0æ0æAGAG9E9EA&A&A&A&A&A&A&A&@å@åAEAE8Ä8ä8Ä8ä9E9EA&A&AGAGY†Y†I‡I‡YÉYÉjÍjÍR -R -YÉYÉI‡I‡YÉYÉI‡I‡I‡I‡I‡I‡A&A&AGAGAÇAÇ9E9E@å@å1†1† ä ä8Ä8ä9E9EA&A&A&A&AGAGI‡I‡ZÌZÌAÇAÇ Ä Ä ä 䣣 ä ä(ä(ä0æ0æ Ä Ä(ä(äAGAGBBBBJJjÍjÍAGAGA&A&0æ0æA†A†8æ8æ0å0å@å@å8Ä8ä8Ä8ä0æ0æ8Ä8ä0æ0æAGAGA&A&A&A&9E9EA&A&A&A&I$I$@å@å0å0å8Ä8ä8Ä8äA†A†AGAGI‡I‡AGAGI‡I‡bŒbŒbŒbŒI‡I‡YÉYÉI‡I‡I‡I‡k/k/c,c,k/k/rËjËbŒbŒƒÐƒÐc,c,ZJbJc,c,jŠjŠZJbJR -R -bŒbŒbŒbŒc,c,k-k-bJZJR -R -R‹R‹JJZJbJbŒbŒc,c,jÍj̓p{oƒÐƒÐk/k/s/k/{.{.{.{.k,k,{.{.k/k/s,k,k/k/ƒo{pk/s/c,c,jÍjÍc,c,bŒbŒ“ЋÐk/k/s/k/k-k-s.k-k-k-bŒbŒjËjËs/k/ƒÐƒÐk/k/c/c/{.{.ƒÐƒÐk/k/{.{.{.{.{.{.{.{.{.{.{.{.{.{.{oƒp{oƒps.{.{,{,bŒbŒjŠjŠjŠjŠbŒbŒjŠjŠI‡I‡R -R -R‹R‹ZJbJZJbJbŒbŒZÌZÌk-k-bŒbŒR -R -R‹R‹JJR -R -ZÌZÌbŒbŒc/c/k/k/ƒÐƒÐ{oƒp{.{.{.{.{.{.k,k,{.{.k,k,s/k/k-k-{.{.ƒÐƒÐZÌZÌc,c,c/c/bŒbŒ{Ï{σЃÐc,c,k/k/rÍjÍk.k-rÍjÍbŒbŒk-k-ƒÐƒÐƒÐƒÐZÌZÌk/k/ƒo{p{.{.{.{.{.{.{.{.{oƒp{.{.{.{.{.{.{oƒpk/s/c,c,k/k/rËjËbŒbŒƒÐƒÐc,c,ZJbJc,c,jŠjŠZJbJR -R -bŒbŒbŒbŒc,c,k-k-bJZJR -R -R‹R‹JJZJbJbŒbŒc,c,jÍj̓p{oƒÐƒÐk/k/s/k/{.{.{.{.k,k,{.{.k/k/s,k,k/k/ƒo{pk/s/c,c,jÍjÍc,c,bŒbŒ“ЋÐk/k/s/k/k-k-s.k-k-k-bŒbŒjËjËs/k/ƒÐƒÐk/k/c/c/{.{.ƒÐƒÐk/k/{.{.{.{.{.{.{.{.{.{.{.{.{.{.{oƒp{oƒps.{.{,{,bŒbŒjŠjŠjŠjŠbŒbŒjŠjŠI‡I‡R -R -R‹R‹ZJbJZJbJbŒbŒZÌZÌk-k-bŒbŒR -R -R‹R‹JJR -R -ZÌZÌbŒbŒc/c/k/k/ƒÐƒÐ{oƒp{.{.{.{.{.{.k,k,{.{.k,k,s/k/k-k-{.{.ƒÐƒÐZÌZÌc,c,c/c/bŒbŒ{Ï{σЃÐc,c,k/k/rÍjÍk.k-rÍjÍbŒbŒk-k-ƒÐƒÐƒÐƒÐZÌZÌk/k/ƒo{p{.{.{.{.{.{.{.{.{oƒp{.{.{.{.{.{.{oƒpY†Y†Y†Y†Y†Y†Y†Y†QÇQÇ{oƒpbŒbŒ@å@åIEIEI$I$@å@å9E9EIEIEAGAGQEQEA&A&QÇQÇI†I†I‡I‡Y†Y†AGAGI‡I‡QÇQÇQÇQÇQÇQÇQÇQÇQEQEIEIEIEIEA†A†I†I†QEQEQÇQÇaÇaÇQEQEjËj˓ГÐbbI‡I‡I‡I‡QÇQÇAÇAÇQEQEAÇAÇQEQEAGAGQÇQÇQEQEYÇYÇZZƒÒƒÑjËjËbbZZYÇYÇZZZZYÇYÇYÇYÇQÇQÇI†I†I‡I‡Y†Y†Y†Y†I‡I‡YEYEYEYEYEYEYEYEYEYEjËjËAGAGQEQEA&A&@å@åAEAE@å@åQEQEI†I†QEQEAGAGQÇQÇY†Y†AGAGI‡I‡I†I†QÇQÇQÇQÇYÇYÇQÇQÇAGAGQEQEIEIEQEQEAGAGQEQEQÇQÇY†Y†Y†Y†ZZ“ЋÐc,c,I‡I‡QÇQÇI†I†I†I†I†I†I†I†I†I†I†I†I†I†Y†Y†I†I†YÇYÇ{,{,{oƒpbbbbYÉYÉbbbbYÇYÇjjI†I†I‡I‡Y†Y†I†I†aÇaÇY†Y†Y†Y†Y†Y†Y†Y†QÇQÇ{oƒpbŒbŒ@å@åIEIEI$I$@å@å9E9EIEIEAGAGQEQEA&A&QÇQÇI†I†I‡I‡Y†Y†AGAGI‡I‡QÇQÇQÇQÇQÇQÇQÇQÇQEQEIEIEIEIEA†A†I†I†QEQEQÇQÇaÇaÇQEQEjËj˓ГÐbbI‡I‡I‡I‡QÇQÇAÇAÇQEQEAÇAÇQEQEAGAGQÇQÇQEQEYÇYÇZZƒÒƒÑjËjËbbZZYÇYÇZZZZYÇYÇYÇYÇQÇQÇI†I†I‡I‡Y†Y†Y†Y†I‡I‡YEYEYEYEYEYEYEYEYEYEjËjËAGAGQEQEA&A&@å@åAEAE@å@åQEQEI†I†QEQEAGAGQÇQÇY†Y†AGAGI‡I‡I†I†QÇQÇQÇQÇYÇYÇQÇQÇAGAGQEQEIEIEQEQEAGAGQEQEQÇQÇY†Y†Y†Y†ZZ“ЋÐc,c,I‡I‡QÇQÇI†I†I†I†I†I†I†I†I†I†I†I†I†I†Y†Y†I†I†YÇYÇ{,{,{oƒpbbbbYÉYÉbbbbYÇYÇjjI†I†I‡I‡Y†Y†I†I†aÇaÇQEQEQEQEY†Y†AGAGYEYEk-k-bbIEIEA&A&I$I$QEQEA&A&I$I$QEQEIEIEIEIEA&A&QEQEIEIEA&A&I†I†YEYEAGAGQEQEY†Y†AGAGQEQEA&A&IEIEI$I$IEIEQEQEQEQEY†Y†YEYEjËj˓ГÐR -R -IEIEQEQE@å@åQEQEQEQEAGAGQEQEQEQEQEQEQEQEYEYEYÉYÉ{.{.QÇQÇQEQEQEQEYEYEAGAGQEQEQEQEAGAGQEQEA&A&AGAGQEQEQEQEQEQEQEQEQEQEYEYEaÇaÇYEYEYÉYÉAGAGI$I$@å@åQEQEI$I$IEIEQEQEA&A&QEQE@å@åQEQEIEIEA&A&QEQEI†I†YEYEAGAGQEQEAGAGIEIEQEQEA&A&AEAEIEIEIEIEQEQEY…Y…Y†Y†bbƒÐƒÐjÍjÍQEQEQEQEQEQEQEQEA&A&QEQEA&A&QEQEQEQEA&A&Y†Y†YEYEjÍjÍbJZJQEQEAGAGQEQEYEYEA&A&YEYEA&A&QEQEA&A&I†I†QEQEAGAGQEQEQEQEY†Y†AGAGYEYEk-k-bbIEIEA&A&I$I$QEQEA&A&I$I$QEQEIEIEIEIEA&A&QEQEIEIEA&A&I†I†YEYEAGAGQEQEY†Y†AGAGQEQEA&A&IEIEI$I$IEIEQEQEQEQEY†Y†YEYEjËj˓ГÐR -R -IEIEQEQE@å@åQEQEQEQEAGAGQEQEQEQEQEQEQEQEYEYEYÉYÉ{.{.QÇQÇQEQEQEQEYEYEAGAGQEQEQEQEAGAGQEQEA&A&AGAGQEQEQEQEQEQEQEQEQEQEYEYEaÇaÇYEYEYÉYÉAGAGI$I$@å@åQEQEI$I$IEIEQEQEA&A&QEQE@å@åQEQEIEIEA&A&QEQEI†I†YEYEAGAGQEQEAGAGIEIEQEQEA&A&AEAEIEIEIEIEQEQEY…Y…Y†Y†bbƒÐƒÐjÍjÍQEQEQEQEQEQEQEQEA&A&QEQEA&A&QEQEQEQEA&A&Y†Y†YEYEjÍjÍbJZJQEQEAGAGQEQEYEYEA&A&YEYEA&A&QEQEA&A&I†I†QEQEAGAGQEQEY†Y†A&A&QEQEYEYEbŒbŒI‡I‡IEIEI$I$A&A&I$I$I$I$AGAGI$I$A&A&QEQEI$I$QEQEA&A&IEIEQEQEA&A&QEQEQEQEYEYEAGAGIEIEI$I$IEIEQEQEQEQEY†Y†Y†Y†Y…Y…QEQEjŠjŠ{Ð{ÐYÉYÉIEIEQEQEIEIEIEIEA&A&QEQEIEIEA&A&A&A&QEQEYEYEYÇYÇ{oƒpI‡I‡YEYEYEYEI‡I‡QEQEYEYEAGAGYEYEY†Y†QEQEA&A&I†I†AGAGQEQEA&A&Y†Y†I‡I‡YÉYÉY†Y†ZJbJAGAGHäHäQEQEI$I$QEQEA&A&I$I$QEQEA&A&IEIEIEIEQEQEA&A&I$I$A&A&QEQEQEQEQEQEQEQEA&A&I$I$IEIEQEQEQEQEQEQEY†Y†Y†Y†QEQEaÇaǃЃÐZJbJQEQEAGAGQEQEA&A&QEQEA&A&QEQEQEQEA&A&QEQEYEYEYEYE{.{.bŒbŒQEQEYEYEQEQEYEYEAGAGYEYEY†Y†AGAGQEQEAGAGQEQEQEQEQEQEY†Y†A&A&QEQEYEYEbŒbŒI‡I‡IEIEI$I$A&A&I$I$I$I$AGAGI$I$A&A&QEQEI$I$QEQEA&A&IEIEQEQEA&A&QEQEQEQEYEYEAGAGIEIEI$I$IEIEQEQEQEQEY†Y†Y†Y†Y…Y…QEQEjŠjŠ{Ð{ÐYÉYÉIEIEQEQEIEIEIEIEA&A&QEQEIEIEA&A&A&A&QEQEYEYEYÇYÇ{oƒpI‡I‡YEYEYEYEI‡I‡QEQEYEYEAGAGYEYEY†Y†QEQEA&A&I†I†AGAGQEQEA&A&Y†Y†I‡I‡YÉYÉY†Y†ZJbJAGAGHäHäQEQEI$I$QEQEA&A&I$I$QEQEA&A&IEIEIEIEQEQEA&A&I$I$A&A&QEQEQEQEQEQEQEQEA&A&I$I$IEIEQEQEQEQEQEQEY†Y†Y†Y†QEQEaÇaǃЃÐZJbJQEQEAGAGQEQEA&A&QEQEA&A&QEQEQEQEA&A&QEQEYEYEYEYE{.{.bŒbŒQEQEYEYEQEQEYEYEAGAGYEYEY†Y†AGAGQEQEAGAGQEQEQEQEQEQEA&A&QEQEAGAGQEQEbbR -R -@å@åI$I$I$I$QEQEQEQEI$I$QEQEQEQEQEQEQEQE@ä@äA&A&I$I$QEQEQEQEIEIEQEQEYEYEQEQEQEQEQEQEY†Y†YEYEY†Y†Y†Y†Y†Y†QÇQÇY…Y…jËj˃҃ÑI†I†QEQEA&A&A&A&QEQEA&A&QEQEA&A&I$I$A&A&QEQEAGAGiÇiǃo{pZZYEYEYEYEQEQEQEQEYEYEYEYEQEQEYEYEA&A&I†I†AGAGQEQEQEQEAGAGAGAGY†Y†YÉYÉYÉYÉbIbIQEQEI$I$I$I$I$I$QEQEI$I$QEQEQEQEQEQEI$I$@å@åI$I$QEQEA&A&QEQEIEIEQEQEQEQEQEQEQEQEQEQEQEQEYEYEY†Y†Y†Y†YEYEaÇaÇY…Y…ZZ{Ð{ÐbŒbŒ@å@åIEIEA&A&I$I$A&A&QEQEA&A&A&A&I$I$A&A&Y†Y†AGAGjËjËrÍjÍYEYEYEYEYEYEYEYEY†Y†AGAGQEQEYEYEQEQEAGAGQEQEQEQEQEQEA&A&QEQEAGAGQEQEbbR -R -@å@åI$I$I$I$QEQEQEQEI$I$QEQEQEQEQEQEQEQE@ä@äA&A&I$I$QEQEQEQEIEIEQEQEYEYEQEQEQEQEQEQEY†Y†YEYEY†Y†Y†Y†Y†Y†QÇQÇY…Y…jËj˃҃ÑI†I†QEQEA&A&A&A&QEQEA&A&QEQEA&A&I$I$A&A&QEQEAGAGiÇiǃo{pZZYEYEYEYEQEQEQEQEYEYEYEYEQEQEYEYEA&A&I†I†AGAGQEQEQEQEAGAGAGAGY†Y†YÉYÉYÉYÉbIbIQEQEI$I$I$I$I$I$QEQEI$I$QEQEQEQEQEQEI$I$@å@åI$I$QEQEA&A&QEQEIEIEQEQEQEQEQEQEQEQEQEQEQEQEYEYEY†Y†Y†Y†YEYEaÇaÇY…Y…ZZ{Ð{ÐbŒbŒ@å@åIEIEA&A&I$I$A&A&QEQEA&A&A&A&I$I$A&A&Y†Y†AGAGjËjËrÍjÍYEYEYEYEYEYEYEYEY†Y†AGAGQEQEYEYEQEQEAGAGQEQEQEQEIEIEQEQEA&A&QEQEAGAGZJbJbb@å@åQEQEHãHäI$I$QEQEQEQEQEQEHäHäHäHäQEQEQEQEI$I$QEQEQEQEQEQEHäHäY…Y…aÇaÇYEYEY†Y†QEQEY†Y†YEYEQEQEY†Y†Y…Y…aÇaÇa†a†jŠjŠ{oƒpRRA&A&QEQEA&A&QEQE@å@å9E9EQEQEA&A&IEIEQEQEAGAGY†Y†k/k/qÇiÇY†Y†YEYEYEYEYEYEYEYEAGAGYEYEY†Y†QEQEA&A&I†I†AGAGQEQEA&A&Y†Y†A&A&QÇQÇYÇYÇbŒbŒQEQEQEQE@ä@äI$I$QEQEQEQEQEQEQEQEHäHäI$I$QEQEQEQEQEQEI$I$QEQEQEQEYEYEYEYEYEYEYEYEI†I†YEYEY†Y†QEQEY†Y†Y†Y†Y†Y†Y…Y…bbƒÐƒÐZJbJQEQEA&A&QEQEIEIEA&A&A&A&AEAEIEIEA&A&IEIEQEQEYEYEjËjËbŒbŒYEYEY…Y…YEYEYEYEQEQEYEYEYEYEY†Y†QEQEAGAGQEQEA&A&IEIEQEQEA&A&QEQEAGAGZJbJbb@å@åQEQEHãHäI$I$QEQEQEQEQEQEHäHäHäHäQEQEQEQEI$I$QEQEQEQEQEQEHäHäY…Y…aÇaÇYEYEY†Y†QEQEY†Y†YEYEQEQEY†Y†Y…Y…aÇaÇa†a†jŠjŠ{oƒpRRA&A&QEQEA&A&QEQE@å@å9E9EQEQEA&A&IEIEQEQEAGAGY†Y†k/k/qÇiÇY†Y†YEYEYEYEYEYEYEYEAGAGYEYEY†Y†QEQEA&A&I†I†AGAGQEQEA&A&Y†Y†A&A&QÇQÇYÇYÇbŒbŒQEQEQEQE@ä@äI$I$QEQEQEQEQEQEQEQEHäHäI$I$QEQEQEQEQEQEI$I$QEQEQEQEYEYEYEYEYEYEYEYEI†I†YEYEY†Y†QEQEY†Y†Y†Y†Y†Y†Y…Y…bbƒÐƒÐZJbJQEQEA&A&QEQEIEIEA&A&A&A&AEAEIEIEA&A&IEIEQEQEYEYEjËjËbŒbŒYEYEY…Y…YEYEYEYEQEQEYEYEYEYEY†Y†QEQEAGAGQEQEA&A&@å@åQEQEQEQEYEYEY†Y†YÉYÉYÉYÉ@å@åHäHäI$I$A&A&HäHäQEQEQEQEQEQEQEQE@ä@äI$I$A&A&QEQEQEQEQEQEY†Y†Y…Y…a†a†QEQEQEQEY†Y†Y†Y†Y†Y†Y…Y…Y†Y†aÇaÇQ…Q…Q…Q…ZZƒÐƒÐYÉYÉQEQEA&A&IEIEA&A&A&A&I$I$A&A&IEIEA&A&AGAGI$I$AGAGk-k-QÇQÇY…Y…Y†Y†YEYEY†Y†YEYEYEYEaÇaÇYEYEYEYEQEQEAGAGQEQEQEQEIEIEAGAGQEQEQEQEA&A&ZJbJAGAGHãHä@å@åI$I$QEQEQEQEHäHäQEQEQEQEA&A&HäHäIEIEI$I$YEYEYEYEYEYEY†Y†YEYEY†Y†QEQEY†Y†Y†Y†Y†Y†QEQEY…Y…aÇaÇY…Y…YEYEY†Y†k/k/c-c-@å@åQEQEQEQE@å@åAGAGAEAEI$I$A&A&QEQEAGAGQEQE@å@åZJbJbŒbŒYEYEY…Y…a†a†YEYEY†Y†QEQEa†a†YEYEY†Y†QEQE@å@åIEIE@å@åQEQEQEQEYEYEY†Y†YÉYÉYÉYÉ@å@åHäHäI$I$A&A&HäHäQEQEQEQEQEQEQEQE@ä@äI$I$A&A&QEQEQEQEQEQEY†Y†Y…Y…a†a†QEQEQEQEY†Y†Y†Y†Y†Y†Y…Y…Y†Y†aÇaÇQ…Q…Q…Q…ZZƒÐƒÐYÉYÉQEQEA&A&IEIEA&A&A&A&I$I$A&A&IEIEA&A&AGAGI$I$AGAGk-k-QÇQÇY…Y…Y†Y†YEYEY†Y†YEYEYEYEaÇaÇYEYEYEYEQEQEAGAGQEQEQEQEIEIEAGAGQEQEQEQEA&A&ZJbJAGAGHãHä@å@åI$I$QEQEQEQEHäHäQEQEQEQEA&A&HäHäIEIEI$I$YEYEYEYEYEYEY†Y†YEYEY†Y†QEQEY†Y†Y†Y†Y†Y†QEQEY…Y…aÇaÇY…Y…YEYEY†Y†k/k/c-c-@å@åQEQEQEQE@å@åAGAGAEAEI$I$A&A&QEQEAGAGQEQE@å@åZJbJbŒbŒYEYEY…Y…a†a†YEYEY†Y†QEQEa†a†YEYEY†Y†QEQE@å@åIEIEA&A&AGAGI‡I‡AGAGYÉYÉjÍjÍR‹R‹A&A&9E9E0å0åIEIEA&A&A&A&AGAGI‡I‡AGAGAGAGI‡I‡I‡I‡AGAGI‡I‡I‡I‡YÉYÉAGAGAGAGI†I†AGAGAGAGAGAGAGAGYÇYÇRRYÉYÉbbbŒbŒbŒbŒk-k-bJZJ0å0åA&A&AGAGA&A&AÇAÇAGAGAGAGAGAGAGAGI‡I‡ZJbJZÌZÌ{.{.R -R -I‡I‡A&A&AGAGAGAGYÉYÉAGAGI‡I‡YÉYÉYÉYÉYÉYÉYÉYÉRRAGAGAGAGI‡I‡AGAGI‡I‡R -R -ZÌZÌI‡I‡8æ8æ9E9E@å@å8æ8æA&A&AGAGAGAGAGAGAGAGI‡I‡I‡I‡AGAGBBI‡I‡I‡I‡I‡I‡AGAGAGAGAGAGAGAGAGAGAGAGQÇQÇYÉYÉYÇYÇR -R -jŠjŠjËjËbŒbŒk,k,A&A&AGAGAGAGA†A†AGAGAGAGAGAGAÇAÇAGAGAGAGBBbŒbŒk/k/bŒbŒI†I†I‡I‡AGAGI‡I‡I†I†I‡I‡I‡I‡I‡I‡YÉYÉI‡I‡I‡I‡I‡I‡A&A&AGAGI‡I‡AGAGYÉYÉjÍjÍR‹R‹A&A&9E9E0å0åIEIEA&A&A&A&AGAGI‡I‡AGAGAGAGI‡I‡I‡I‡AGAGI‡I‡I‡I‡YÉYÉAGAGAGAGI†I†AGAGAGAGAGAGAGAGYÇYÇRRYÉYÉbbbŒbŒbŒbŒk-k-bJZJ0å0åA&A&AGAGA&A&AÇAÇAGAGAGAGAGAGAGAGI‡I‡ZJbJZÌZÌ{.{.R -R -I‡I‡A&A&AGAGAGAGYÉYÉAGAGI‡I‡YÉYÉYÉYÉYÉYÉYÉYÉRRAGAGAGAGI‡I‡AGAGI‡I‡R -R -ZÌZÌI‡I‡8æ8æ9E9E@å@å8æ8æA&A&AGAGAGAGAGAGAGAGI‡I‡I‡I‡AGAGBBI‡I‡I‡I‡I‡I‡AGAGAGAGAGAGAGAGAGAGAGAGQÇQÇYÉYÉYÇYÇR -R -jŠjŠjËjËbŒbŒk,k,A&A&AGAGAGAGA†A†AGAGAGAGAGAGAÇAÇAGAGAGAGBBbŒbŒk/k/bŒbŒI†I†I‡I‡AGAGI‡I‡I†I†I‡I‡I‡I‡I‡I‡YÉYÉI‡I‡I‡I‡I‡I‡k/k/ƒÐƒÐ{oƒpƒÐƒÐƒÐƒÐ{oƒp{.{.{Ï{Ïk/k/{.{.{oƒpk-k-k/s/k/k/k-s-k.k-k-s-bŒbŒk,k,s/k/c,c,bŒbŒk-k-{.{.k/k/s,k,ƒÐƒÐƒÐƒÐk/k/{Ï{Ï{oƒpƒÐƒÐ“ЋЃЃД0Œ0œ“œ“{Ï{Ï{oƒp{.{.ƒÐƒÐƒÐƒÐƒÐƒÐ{oƒpƒÑƒÒƒÐƒÐƒÐƒÐ{Ð{Ð{oƒp„0„0œ“œ““ϋσЃÐ{oƒp{.{.ƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÐ{oƒpƒÐƒÐ„0„0”“Œ“”“Œ“”“Œ“œ“œ““ЋЃЃÐ{Ð{Ð{Ð{Ѓ҃Ñ{Ï{Ï{oƒpk/k/{.{.{oƒpk-k-k/s/k/k/k/s/k,k,k/s/jËjËc,c,k/k/rÍjÍbŒbŒk/k/s-k-k/k/s,k,{oƒpƒÐƒÐ{Ï{Ï{.{.{oƒp{Ï{σЃЃσϓЋМ“œ“ƒÏƒÏ{Ð{Ð{.{.ƒÐƒÐ{oƒpƒÐƒÐ{oƒpƒÐƒÐƒÐƒÐƒÒƒÑ{Ð{Ðk/k/“ГМ“œ““ЋЃσσ҃Ñ{.{.{.{.ƒÐƒÐƒÒƒÑƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÐ”“Œ“”“Œ“”“Œ“k/s/ƒÐƒÐ{oƒpƒÐƒÐƒÐƒÐ{oƒp{.{.{Ï{Ïk/k/{.{.{oƒpk-k-k/s/k/k/k-s-k.k-k-s-bŒbŒk,k,s/k/c,c,bŒbŒk-k-{.{.k/k/s,k,ƒÐƒÐƒÐƒÐk/k/{Ï{Ï{oƒpƒÐƒÐ“ЋЃЃД0Œ0œ“œ“{Ï{Ï{oƒp{.{.ƒÐƒÐƒÐƒÐƒÐƒÐ{oƒpƒÑƒÒƒÐƒÐƒÐƒÐ{Ð{Ð{oƒp„0„0œ“œ““ϋσЃÐ{oƒp{.{.ƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÐ{oƒpƒÐƒÐ„0„0”“Œ“”“Œ“”“Œ“œ“œ““ЋЃЃÐ{Ð{Ð{Ð{Ѓ҃Ñ{Ï{Ï{oƒpk/k/{.{.{oƒpk-k-k/s/k/k/k/s/k,k,k/s/jËjËc,c,k/k/rÍjÍbŒbŒk/k/s-k-k/k/s,k,{oƒpƒÐƒÐ{Ï{Ï{.{.{oƒp{Ï{σЃЃσϓЋМ“œ“ƒÏƒÏ{Ð{Ð{.{.ƒÐƒÐ{oƒpƒÐƒÐ{oƒpƒÐƒÐƒÐƒÐƒÒƒÑ{Ð{Ðk/k/“ГМ“œ““ЋЃσσ҃Ñ{.{.{.{.ƒÐƒÐƒÒƒÑƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÐ”“Œ“”“Œ“”“Œ“QÇQÇA†A†QEQEAGAGQÇQÇA†A†QEQEAÇAÇQEQEAÇAÇZZZJbJQÇQÇAEAEQEQEIEIEIEIEQEQEIEIEIEIEIEIEI$I$IEIEYÇYÇYÇYÇJJI‡I‡IÇIÇZIZIQÇQÇAGAGA†A†I‡I‡AÇAÇQÇQÇYÇYÇYÇYÇZIZIIÇIÇZZQÇQÇZZQÇQÇZZQÇQÇQÇQÇI‡I‡QÇQÇQÇQÇA†A†I†I†AGAGYÇYÇbbZJbJZIZIAÇAÇIEIEA†A†A†A†AGAGAÇAÇAGAGQÇQÇAÇAÇA†A†I†I†I†I†AGAGQÇQÇIEIEAGAGI†I†QÇQÇQÇQÇZJbJJJIEIEQEQEQ…Q…IEIEIEIEIEIEIEIEQEQEAEAEIEIEQEQEZZYÉYÉJJQÇQÇIÇIÇYÉYÉAÇAÇAGAGQÇQÇAÇAÇQÇQÇI‡I‡ZZZIZIYÇYÇIÇIÇYÉYÉYÇYÇIÇIÇZIZIYÇYÇIÇIÇQÇQÇAGAGYÇYÇQÇQÇAGAGQÇQÇQÇQÇQÇQÇbbZJbJZIZI9E9EA&A&A†A†A†A†AGAGAÇAÇAGAGQÇQÇA†A†QEQEAGAGQÇQÇA†A†QEQEAÇAÇQEQEAÇAÇZZZJbJQÇQÇAEAEQEQEIEIEIEIEQEQEIEIEIEIEIEIEI$I$IEIEYÇYÇYÇYÇJJI‡I‡IÇIÇZIZIQÇQÇAGAGA†A†I‡I‡AÇAÇQÇQÇYÇYÇYÇYÇZIZIIÇIÇZZQÇQÇZZQÇQÇZZQÇQÇQÇQÇI‡I‡QÇQÇQÇQÇA†A†I†I†AGAGYÇYÇbbZJbJZIZIAÇAÇIEIEA†A†A†A†AGAGAÇAÇAGAGQÇQÇAÇAÇA†A†I†I†I†I†AGAGQÇQÇIEIEAGAGI†I†QÇQÇQÇQÇZJbJJJIEIEQEQEQ…Q…IEIEIEIEIEIEIEIEQEQEAEAEIEIEQEQEZZYÉYÉJJQÇQÇIÇIÇYÉYÉAÇAÇAGAGQÇQÇAÇAÇQÇQÇI‡I‡ZZZIZIYÇYÇIÇIÇYÉYÉYÇYÇIÇIÇZIZIYÇYÇIÇIÇQÇQÇAGAGYÇYÇQÇQÇAGAGQÇQÇQÇQÇQÇQÇbbZJbJZIZI9E9EA&A&A†A†A†A†AGAGAÇAÇAGAG@ä@ä8ä8ã@å@åHäHä8ä8ã8Ä8ä8Ä8äHäHä8ä8ã@å@åY†Y†R‹R‹HäHäHäHäHäHä@ä@ã@ä@ãHäHä8ä8ãHäHä8ä8ã8Ä8ä@å@åI$I$QEQEbŒbŒA&A&AEAE@ä@ä@ä@ä0Ä0ã8Ä8äAEAE@å@åHäHäAEAE@å@å@å@åQ…Q…QEQEQEQEQEQEQEQEQEQEA&A&I$I$A&A&I$I$A&A&@å@åIEIE@å@åIEIEQEQEjÍjÍI‡I‡8Ä8ä@å@å8Ä8ä9E9E8Ä8äA$A$8Ä8äA$A$8Ä8äIEIE8Ä8ä@å@åHäHä8ä8ã8Ä8ä8ä8ãHäHä8ä8ãAEAEZJbJI†I†HãHäI$I$@ä@äHäHä@ä@ãHäHä@ä@ä0Ä0ãHäHä8ä8ã@å@åI$I$jjR -R -8ã8äAEAE@ä@ä0Ä0ä8ä8ã@å@å@å@åAEAEHäHä@å@åHäHäIEIEQEQEIEIEQEQEQEQEI$I$QEQEA&A&I$I$QEQEA&A&@å@åAEAE8Ä8äIEIE@å@åj‰j‰bŒbŒ8Ä8ä8Ä8ä9E9E8Ä8äIEIE8Ä8ä8Ä8äA$A$@ä@ä8ä8ã@å@åHäHä8ä8ã8Ä8ä8Ä8äHäHä8ä8ã@å@åY†Y†R‹R‹HäHäHäHäHäHä@ä@ã@ä@ãHäHä8ä8ãHäHä8ä8ã8Ä8ä@å@åI$I$QEQEbŒbŒA&A&AEAE@ä@ä@ä@ä0Ä0ã8Ä8äAEAE@å@åHäHäAEAE@å@å@å@åQ…Q…QEQEQEQEQEQEQEQEQEQEA&A&I$I$A&A&I$I$A&A&@å@åIEIE@å@åIEIEQEQEjÍjÍI‡I‡8Ä8ä@å@å8Ä8ä9E9E8Ä8äA$A$8Ä8äA$A$8Ä8äIEIE8Ä8ä@å@åHäHä8ä8ã8Ä8ä8ä8ãHäHä8ä8ãAEAEZJbJI†I†HãHäI$I$@ä@äHäHä@ä@ãHäHä@ä@ä0Ä0ãHäHä8ä8ã@å@åI$I$jjR -R -8ã8äAEAE@ä@ä0Ä0ä8ä8ã@å@å@å@åAEAEHäHä@å@åHäHäIEIEQEQEIEIEQEQEQEQEI$I$QEQEA&A&I$I$QEQEA&A&@å@åAEAE8Ä8äIEIE@å@åj‰j‰bŒbŒ8Ä8ä8Ä8ä9E9E8Ä8äIEIE8Ä8ä8Ä8äA$A$HäHäHäHä8ä8ãHäHäI$I$8ã8ä8ã8äHäHä8ä8ãHäHäI†I†ZJbJHäHä@ä@ãHäHäA$A#HäHãI$I$HäHä8ä8ãA$A$8ä8ãI$I$8Ä8äI$I$ZJbJA†A†HäHä8Ä8ä8Ä8äA$A$8Ä8äAEAE@å@åAEAE@å@åI$I$IEIEQEQEA&A&HäHäQEQEQEQEQEQEQEQEA&A&QEQE@å@åAEAEAEAE8Ä8äIEIE@å@åQEQEk-k-RR@å@åA$A$9E9E8Ä8ä9E9E@å@å9E9E@å@å8Ä8ä9E9E8Ä8äHäHä@ä@ãI$I$0Ã0äHäHä8ä8ãHäHäHäHäbIbIAGAGHäHäHäHäHäHä@ä@ãHäHãI$I$8ã8äHäHä8ä8ãHäHäA$A$@ä@ãZZIÇIÇ@å@å@å@å8ã8äA$A$8Ä8äAEAE8ã8äAEAE@å@åIEIEIEIEIEIEQEQEA&A&QEQEQEQEQEQEQEQEA&A&QEQEA&A&HäHäAEAE8Ä8äIEIE@å@åA†A†jIjIbŒbŒA&A&@å@å8Ä8äA$A$@å@å@å@å8ã8ä@å@åHäHäHäHä8ä8ãHäHäI$I$8ã8ä8ã8äHäHä8ä8ãHäHäI†I†ZJbJHäHä@ä@ãHäHäA$A#HäHãI$I$HäHä8ä8ãA$A$8ä8ãI$I$8Ä8äI$I$ZJbJA†A†HäHä8Ä8ä8Ä8äA$A$8Ä8äAEAE@å@åAEAE@å@åI$I$IEIEQEQEA&A&HäHäQEQEQEQEQEQEQEQEA&A&QEQE@å@åAEAEAEAE8Ä8äIEIE@å@åQEQEk-k-RR@å@åA$A$9E9E8Ä8ä9E9E@å@å9E9E@å@å8Ä8ä9E9E8Ä8äHäHä@ä@ãI$I$0Ã0äHäHä8ä8ãHäHäHäHäbIbIAGAGHäHäHäHäHäHä@ä@ãHäHãI$I$8ã8äHäHä8ä8ãHäHäA$A$@ä@ãZZIÇIÇ@å@å@å@å8ã8äA$A$8Ä8äAEAE8ã8äAEAE@å@åIEIEIEIEIEIEQEQEA&A&QEQEQEQEQEQEQEQEA&A&QEQEA&A&HäHäAEAE8Ä8äIEIE@å@åA†A†jIjIbŒbŒA&A&@å@å8Ä8äA$A$@å@å@å@å8ã8ä@å@åHäHäHäHäA$A#8ä8ãHäHä8ä8ãHäHä8ä8ãHäHãHäHäY…Y…R‹R‹HäHäHäHäA$A#HäHäI$I$I$I$HäHä8ä8ãHäHäI$I$0Ã0äAEAEI$I$jŠjŠ@å@å8Ä8äA$A$8Ä8ä9E9E8Ä8ä8Ä8äAEAEHäHäAEAEIEIEI$I$A&A&I$I$QEQEQEQEQEQEA&A&I$I$8å8å@å@åAEAEI$I$@å@å8Ä8ä9E9EQEQEAGAGjËjËYÉYÉ8Ä8äA$A$8Ä8ä9E9E@å@å8Ä8ä8Ä8äA$A$8Ä8ä0å0å8ã8ä@å@åHäHä@ä@ãHäHä8ä8ã@ä@ãHäHäI$I$ZJbJA†A†HäHäHäHäA$A#HäHäI$I$@ã@äHäHäA$A$8ä8ãHäHäA$A$HäHäZZRR8Ä8äA$A$8Ä8äA$A$8Ä8ä9$9$@å@åA$A$AEAEI$I$QEQEA&A&@å@åIEIEHäHäQEQEQEQEA&A&@å@åHäHäA$A$A$A$IEIE8Ä8ä9E9EA&A&HäHäbIbIbŒbŒ8ã8äAEAE8Ä8ä9E9E8Ä8äI$I$8ã8ä8Ä8äHäHäHäHäA$A#8ä8ãHäHä8ä8ãHäHä8ä8ãHäHãHäHäY…Y…R‹R‹HäHäHäHäA$A#HäHäI$I$I$I$HäHä8ä8ãHäHäI$I$0Ã0äAEAEI$I$jŠjŠ@å@å8Ä8äA$A$8Ä8ä9E9E8Ä8ä8Ä8äAEAEHäHäAEAEIEIEI$I$A&A&I$I$QEQEQEQEQEQEA&A&I$I$8å8å@å@åAEAEI$I$@å@å8Ä8ä9E9EQEQEAGAGjËjËYÉYÉ8Ä8äA$A$8Ä8ä9E9E@å@å8Ä8ä8Ä8äA$A$8Ä8ä0å0å8ã8ä@å@åHäHä@ä@ãHäHä8ä8ã@ä@ãHäHäI$I$ZJbJA†A†HäHäHäHäA$A#HäHäI$I$@ã@äHäHäA$A$8ä8ãHäHäA$A$HäHäZZRR8Ä8äA$A$8Ä8äA$A$8Ä8ä9$9$@å@åA$A$AEAEI$I$QEQEA&A&@å@åIEIEHäHäQEQEQEQEA&A&@å@åHäHäA$A$A$A$IEIE8Ä8ä9E9EA&A&HäHäbIbIbŒbŒ8ã8äAEAE8Ä8ä9E9E8Ä8äI$I$8ã8ä8Ä8äHäHä8ä8ã@ä@ãHäHä8ä8ã@ä@ãHäHä@ä@ã@ä@ãI$I$I†I†bŒbŒHäHäI$I$HäHäI$I$I$I$I$I$I$I$I$I$8ã8äI$I$HäHäI$I$@å@åYÉYÉ9$9$8Ä8äA$A$8Ä8ä0Ä0ä9$9$0Ä0ã@å@åI$I$@å@åIEIEI$I$A&A&I$I$@å@åI$I$QEQE@å@åQEQE8Ä8äI$I$@å@å@å@åAEAEHäHäAEAEI$I$YEYEjÍjÍAÇAÇ0Ä0ä0Ä0ä8ä8ã@å@å8Ä8ä8Ä8ä9E9E8Ä8ä9E9E8Ä8ä8Ä8äI$I$@ã@ä@ã@äA#A$@ã@äHãHäI$I$HäHäRŠRŠI‡I‡HäHäI$I$I$I$I$I$I$I$I$I$I$I$8ã8äI$I$8ã8äIEIE@ã@äQÇQÇAGAG8ã8ä8Ä8äA$A$(ä(ä8Ä8ä0Ä0ãAEAE8Ä8äI$I$A&A&I$I$QEQEA&A&HäHäQEQEI$I$QEQE@å@å@å@åI$I$8Ä8äAEAE@å@å@å@åI$I$QEQEQEQEZZbŒbŒ0Ä0ä0Ä0ä0Ä0ãA&A&8Ä8ä8Ä8ä8Ä8äHäHäHäHä8ä8ã@ä@ãHäHä8ä8ã@ä@ãHäHä@ä@ã@ä@ãI$I$I†I†bŒbŒHäHäI$I$HäHäI$I$I$I$I$I$I$I$I$I$8ã8äI$I$HäHäI$I$@å@åYÉYÉ9$9$8Ä8äA$A$8Ä8ä0Ä0ä9$9$0Ä0ã@å@åI$I$@å@åIEIEI$I$A&A&I$I$@å@åI$I$QEQE@å@åQEQE8Ä8äI$I$@å@å@å@åAEAEHäHäAEAEI$I$YEYEjÍjÍAÇAÇ0Ä0ä0Ä0ä8ä8ã@å@å8Ä8ä8Ä8ä9E9E8Ä8ä9E9E8Ä8ä8Ä8äI$I$@ã@ä@ã@äA#A$@ã@äHãHäI$I$HäHäRŠRŠI‡I‡HäHäI$I$I$I$I$I$I$I$I$I$I$I$8ã8äI$I$8ã8äIEIE@ã@äQÇQÇAGAG8ã8ä8Ä8äA$A$(ä(ä8Ä8ä0Ä0ãAEAE8Ä8äI$I$A&A&I$I$QEQEA&A&HäHäQEQEI$I$QEQE@å@å@å@åI$I$8Ä8äAEAE@å@å@å@åI$I$QEQEQEQEZZbŒbŒ0Ä0ä0Ä0ä0Ä0ãA&A&8Ä8ä8Ä8ä8Ä8äHäHäHäHä@ä@ã@ä@ã@ä@ãHäHã@ä@ã@ä@ã@ä@ãHäHãHäHäQ…Q…jŠjŠ8Ä8äHäHäI$I$@ã@äI$I$I$I$HäHäI$I$HäHäA$A$I$I$8ã8äIEIEQEQE9E9E8ã8ä8Ä8äA$A$8ä8ã@å@åI$I$AEAEI$I$QEQEQEQEQEQEQEQEYEYEQEQEQEQEQEQEQEQEQEQEQEQEQEQEI$I$I$I$QEQEA&A&I$I$AGAGHäHäjŠjŠI‡I‡8Ä8ä8Ä8ä8Ä8ä9$9$8Ä8ä9$9$(ä(ä8Ä8ä8Ä8ä0Ä0äA$A$8ä8ãHäHä@ä@ã@ä@ã@ä@ãHäHãHäHäHäHäjIjIJJ@ã@äHäHä@ä@ãI$I$HäHäI$I$I$I$HäHäI$I$HäHäHäHäI$I$A†A†IEIE8Ä8ä8Ä8äHäHä0Ä0ãAEAEHäHäHäHäIEIEI$I$QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEHäHäQEQEQEQEI$I$QEQE@å@åIEIEQEQEQEQEYÉYÉZJbJ8ä8ã@å@å0Ã0ä8Ä8ä9$9$8Ä8äA$A$8ä8ãHäHä@ä@ã@ä@ã@ä@ãHäHã@ä@ã@ä@ã@ä@ãHäHãHäHäQ…Q…jŠjŠ8Ä8äHäHäI$I$@ã@äI$I$I$I$HäHäI$I$HäHäA$A$I$I$8ã8äIEIEQEQE9E9E8ã8ä8Ä8äA$A$8ä8ã@å@åI$I$AEAEI$I$QEQEQEQEQEQEQEQEYEYEQEQEQEQEQEQEQEQEQEQEQEQEQEQEI$I$I$I$QEQEA&A&I$I$AGAGHäHäjŠjŠI‡I‡8Ä8ä8Ä8ä8Ä8ä9$9$8Ä8ä9$9$(ä(ä8Ä8ä8Ä8ä0Ä0äA$A$8ä8ãHäHä@ä@ã@ä@ã@ä@ãHäHãHäHäHäHäjIjIJJ@ã@äHäHä@ä@ãI$I$HäHäI$I$I$I$HäHäI$I$HäHäHäHäI$I$A†A†IEIE8Ä8ä8Ä8äHäHä0Ä0ãAEAEHäHäHäHäIEIEI$I$QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEHäHäQEQEQEQEI$I$QEQE@å@åIEIEQEQEQEQEYÉYÉZJbJ8ä8ã@å@å0Ã0ä8Ä8ä9$9$8Ä8äA$A$8ä8ãA&A&A&A&I$I$A&A&QEQEA&A&8Ä8ä8Ä8ä@ä@ä8ä8ãAGAGbŒbŒJJQEQEA&A&I$I$QEQEI†I†Y†Y†A&A&AEAEIEIEIEIEIEIEAGAGbbI‡I‡I‡I‡AGAG8Ä8ä8ä8ã@å@åAEAEI$I$A&A&I$I$HäHä@å@åA&A&QEQE@å@å@å@åHäHäQEQE@å@åHäHäQEQEA&A&A&A&@å@åQEQEA&A&QEQEI‡I‡k/k/bJZJA&A&0æ0æ9$9$1†1†(ä(ä(Ä(Ä0å0å0å0åAGAGAÇAÇAGAGAGAGAGAGQEQE8å8å8Ä8ä@ä@ä0Ä0äAEAEZJbJR -R -AGAGIEIEI$I$IEIEI†I†YEYEA&A&IEIEAEAEIEIEIEIEQEQEYÉYÉJJAGAGI†I†A&A&8ã8ä@å@åAEAEI$I$A&A&I$I$QEQE8Ä8äHäHäA&A&HäHä@å@åHäHäQEQEA&A&HäHäIEIEHäHäAGAG@ä@äQEQEA&A&A&A&A&A&ZJbJR‹R‹8æ8æ0æ0æ9$9$A†A†(å(å ä ä(Ä(ÄA&A&A&A&A&A&I$I$A&A&QEQEA&A&8Ä8ä8Ä8ä@ä@ä8ä8ãAGAGbŒbŒJJQEQEA&A&I$I$QEQEI†I†Y†Y†A&A&AEAEIEIEIEIEIEIEAGAGbbI‡I‡I‡I‡AGAG8Ä8ä8ä8ã@å@åAEAEI$I$A&A&I$I$HäHä@å@åA&A&QEQE@å@å@å@åHäHäQEQE@å@åHäHäQEQEA&A&A&A&@å@åQEQEA&A&QEQEI‡I‡k/k/bJZJA&A&0æ0æ9$9$1†1†(ä(ä(Ä(Ä0å0å0å0åAGAGAÇAÇAGAGAGAGAGAGQEQE8å8å8Ä8ä@ä@ä0Ä0äAEAEZJbJR -R -AGAGIEIEI$I$IEIEI†I†YEYEA&A&IEIEAEAEIEIEIEIEQEQEYÉYÉJJAGAGI†I†A&A&8ã8ä@å@åAEAEI$I$A&A&I$I$QEQE8Ä8äHäHäA&A&HäHä@å@åHäHäQEQEA&A&HäHäIEIEHäHäAGAG@ä@äQEQEA&A&A&A&A&A&ZJbJR‹R‹8æ8æ0æ0æ9$9$A†A†(å(å ä ä(Ä(ÄA&A&bŒbŒc/c/k/k/bŒbŒk/k/s/k/bŒbŒZÌZÌZJbJR‹R‹bŒbŒc/c/{Ð{Ð{.{.k/k/s-k-{pƒo‹Ï“ϋГЃЃЃЃÐ{.{.ƒÏƒÏ“ЋЃЃЃЃЃЃЃЃÐk,k,s/k/RŠRŠbŒbŒbŒbŒbŒbŒbŒbŒc,c,ZÌZÌjÍjÍZÌZÌbŒbŒbŒbŒbŒbŒbŒbŒR‹R‹R‹R‹R -R -R‹R‹bŒbŒk/k/s/k/k/k/ƒo{pk/s/{Ð{М“œ“œ“œ“{oƒp{Ï{σЃЃЃÐk/k/c,c,k/k/ƒo{p{Ð{Ѓ҃ѓЋЃσσ҃Ñc,c,bŒbŒbŒbŒR‹R‹ZJbJbŒbŒjÍjÍs/k/ƒÐƒÐk/k/s-k-{.{.“ϋϓЋЃЃЃЃЃЃÐ{Ï{σЃЃЃÐ{.{.ƒÐƒÐ“ЋЃЃÐk-k-bŒbŒZJbJbŒbŒbŒbŒbŒbŒZÌZÌbŒbŒjÍjÍrÎjÍjÍjÍZÌZÌbŒbŒbŒbŒR‹R‹R‹R‹R -R -bŒbŒbŒbŒc/c/jÍjÍs/k/{oƒpk/k/k/s/k/k/k/s/k/k/c/c/k/k/ƒÐƒÐZJbJbŒbŒR‹R‹R‹R‹bŒbŒc/c/k/k/bŒbŒk/k/s/k/bŒbŒZÌZÌZJbJR‹R‹bŒbŒc/c/{Ð{Ð{.{.k/k/s-k-{pƒo‹Ï“ϋГЃЃЃЃÐ{.{.ƒÏƒÏ“ЋЃЃЃЃЃЃЃЃÐk,k,s/k/RŠRŠbŒbŒbŒbŒbŒbŒbŒbŒc,c,ZÌZÌjÍjÍZÌZÌbŒbŒbŒbŒbŒbŒbŒbŒR‹R‹R‹R‹R -R -R‹R‹bŒbŒk/k/s/k/k/k/ƒo{pk/s/{Ð{М“œ“œ“œ“{oƒp{Ï{σЃЃЃÐk/k/c,c,k/k/ƒo{p{Ð{Ѓ҃ѓЋЃσσ҃Ñc,c,bŒbŒbŒbŒR‹R‹ZJbJbŒbŒjÍjÍs/k/ƒÐƒÐk/k/s-k-{.{.“ϋϓЋЃЃЃЃЃЃÐ{Ï{σЃЃЃÐ{.{.ƒÐƒÐ“ЋЃЃÐk-k-bŒbŒZJbJbŒbŒbŒbŒbŒbŒZÌZÌbŒbŒjÍjÍrÎjÍjÍjÍZÌZÌbŒbŒbŒbŒR‹R‹R‹R‹R -R -bŒbŒbŒbŒc/c/jÍjÍs/k/{oƒpk/k/k/s/k/k/k/s/k/k/c/c/k/k/ƒÐƒÐZJbJbŒbŒR‹R‹R‹R‹bbY†Y†bbbbjŠjŠ{oƒpY†Y†IEIEA&A&QEQEAÇAÇIEIE@å@åA†A†AEAEQEQEA†A†AGAGI†I†QÇQÇQEQEAÇAÇI†I†I†I†IEIE@å@åA$A$AÇAÇI†I†QEQEIEIEA&A&AÇAÇYEYEjŠjŠ{oƒpjËjËjËrËjÍjÍjËrËk-k-jËrËk/k/{,{,jÍjÍ{,{,jÍjÍ{,{,k-k-s.k-jŠjŠbIbIZJbJbbbbbIbIjIjIjŠjŠj‰j‰jŠjŠjŠjŠjËjËr‰j‰jIjIrËjËjËjËrIjIbb{,{,bŒbŒQEQEQEQEIEIEA&A&AGAGA†A†9†9†AEAE@å@åIEIEQEQEA†A†AÇAÇI†I†QÇQÇI†I†I†I†Y†Y†IEIEA&A&A$A$AGAGI†I†AEAEAEAEA†A†QEQEI†I†bb{.{.k-k-jŠjŠc,c,jËjËs-k-jËjË{.{.jÍjÍ{.{.{,{,jÍjÍrËjË{.{.”0Œ0{.{.jIjIbIbIZZbbj‰j‰r‰j‰jŠjŠjËjËr‰j‰jŠjŠjËjËrIjIbŒbŒbbY†Y†bbbbjŠjŠ{oƒpY†Y†IEIEA&A&QEQEAÇAÇIEIE@å@åA†A†AEAEQEQEA†A†AGAGI†I†QÇQÇQEQEAÇAÇI†I†I†I†IEIE@å@åA$A$AÇAÇI†I†QEQEIEIEA&A&AÇAÇYEYEjŠjŠ{oƒpjËjËjËrËjÍjÍjËrËk-k-jËrËk/k/{,{,jÍjÍ{,{,jÍjÍ{,{,k-k-s.k-jŠjŠbIbIZJbJbbbbbIbIjIjIjŠjŠj‰j‰jŠjŠjŠjŠjËjËr‰j‰jIjIrËjËjËjËrIjIbb{,{,bŒbŒQEQEQEQEIEIEA&A&AGAGA†A†9†9†AEAE@å@åIEIEQEQEA†A†AÇAÇI†I†QÇQÇI†I†I†I†Y†Y†IEIEA&A&A$A$AGAGI†I†AEAEAEAEA†A†QEQEI†I†bb{.{.k-k-jŠjŠc,c,jËjËs-k-jËjË{.{.jÍjÍ{.{.{,{,jÍjÍrËjË{.{.”0Œ0{.{.jIjIbIbIZZbbj‰j‰r‰j‰jŠjŠjËjËr‰j‰jŠjŠjËjËrIjIbŒbŒQEQEA&A&HäHäHäHäaÇaÇk/k/QEQE@ä@ä8Ä8ä8Ä8ä(ä(ä0Ä0ä8Ä8ä0Ä0äHäHäAEAE@ä@ä8Ä8Ã8ä8ã8Ä8ä8Ä8ä8Ä8ä8Ä8ä8Ä8ä8Ä8ä9$9$8Ä8äA$A$IEIE8Ä8ä0Ä0ä0Ä0ã@å@åQEQEjjs/k/aÇaÇQEQEQEQEQEQEQEQEYEYEI‡I‡YEYEaÇaÇaÇaÇI‡I‡a†a†jÍjÍbŒbŒQEQEQEQEI$I$QEQEHäHäHäHäYEYEHäHäYEYEYEYEYEYEYEYEYEYEY†Y†QEQEYEYEYEYEYEYEbŒbŒjŠjŠ@ä@ä8Ä8äHäHä0Ä0ã8Ä8ä0Ä0ä0Ä0ä0Ä0ä@ä@ãAEAE@å@å8ã8äHäHä0Ä0ä@ä@ä0Ä0ä0Ä0ä8Ä8ä8Ä8ä8Ä8ä0Ä0ãA$A$IEIE8Ä8ä8Ä8ä0Ä0ã8Ä8äQEQEYEYEk/k/bIbIQEQEQEQEQEQEQEQEQEQEYEYEI‡I‡Y†Y†aÇaÇYEYEI‡I‡jIjI“ГÐR -R -QEQE@å@åIEIEHäHäQEQEYDYDYEYEHäHäYEYEYEYEYEYEYEYEYEYEQEQEA&A&HäHäHäHäaÇaÇk/k/QEQE@ä@ä8Ä8ä8Ä8ä(ä(ä0Ä0ä8Ä8ä0Ä0äHäHäAEAE@ä@ä8Ä8Ã8ä8ã8Ä8ä8Ä8ä8Ä8ä8Ä8ä8Ä8ä8Ä8ä9$9$8Ä8äA$A$IEIE8Ä8ä0Ä0ä0Ä0ã@å@åQEQEjjs/k/aÇaÇQEQEQEQEQEQEQEQEYEYEI‡I‡YEYEaÇaÇaÇaÇI‡I‡a†a†jÍjÍbŒbŒQEQEQEQEI$I$QEQEHäHäHäHäYEYEHäHäYEYEYEYEYEYEYEYEYEYEY†Y†QEQEYEYEYEYEYEYEbŒbŒjŠjŠ@ä@ä8Ä8äHäHä0Ä0ã8Ä8ä0Ä0ä0Ä0ä0Ä0ä@ä@ãAEAE@å@å8ã8äHäHä0Ä0ä@ä@ä0Ä0ä0Ä0ä8Ä8ä8Ä8ä8Ä8ä0Ä0ãA$A$IEIE8Ä8ä8Ä8ä0Ä0ã8Ä8äQEQEYEYEk/k/bIbIQEQEQEQEQEQEQEQEQEQEYEYEI‡I‡Y†Y†aÇaÇYEYEI‡I‡jIjI“ГÐR -R -QEQE@å@åIEIEHäHäQEQEYDYDYEYEHäHäYEYEYEYEYEYEYEYEYEYEY†Y†YEYEIEIE@å@åZZjÍjÍQEQE@ä@ä8Ä8ä0Ä0ã(ä(ä(ä(ä8Ä8ä0Ä0ã8Ä8äAEAE@ä@ä0Ä0ä0Ä0ã8Ä8ä(ä(ä8Ä8ä(ä(ä8Ä8ä9$9$8Ä8ä8Ä8ä9E9E@å@å8Ä8ä8Ä8ä9$9$8Ä8äI$I$bbk/k/I‡I‡QEQEA&A&YEYEI‡I‡I‡I‡I‡I‡aÇaÇI‡I‡Y†Y†I‡I‡aÇaÇ{.{.bŒbŒY†Y†AGAGQEQEA&A&QEQEQEQEAGAGYEYEQEQEQEQEYEYEa†a†Y†Y†YEYEAGAGa†a†YÉYÉYEYEbŒbŒbŒbŒHãHä8Ä8ä8Ä8ä(ä(ä0Ä0ã(ä(ä0Ä0ã0Ä0ã8Ä8äIEIE@ä@ä0Ä0ä0Ä0ã8Ä8ä0Ä0ã(ä(ä8Ä8ä(ä(ä8Ä8ä9$9$8Ä8ä8Ä8ä9E9E@ä@ä8Ä8ä8Ä8äA$A$@å@åY†Y†k/k/bbYEYEAGAGQEQEI‡I‡I‡I‡aÇaÇI‡I‡aÇaÇI‡I‡YÉYÉY†Y†jŠjŠ{oƒpQÆQÇQEQEQEQEQEQEA&A&QEQEQEQEQEQEQEQEQEQEYEYEI‡I‡YEYEYEYEY†Y†YEYEIEIE@å@åZZjÍjÍQEQE@ä@ä8Ä8ä0Ä0ã(ä(ä(ä(ä8Ä8ä0Ä0ã8Ä8äAEAE@ä@ä0Ä0ä0Ä0ã8Ä8ä(ä(ä8Ä8ä(ä(ä8Ä8ä9$9$8Ä8ä8Ä8ä9E9E@å@å8Ä8ä8Ä8ä9$9$8Ä8äI$I$bbk/k/I‡I‡QEQEA&A&YEYEI‡I‡I‡I‡I‡I‡aÇaÇI‡I‡Y†Y†I‡I‡aÇaÇ{.{.bŒbŒY†Y†AGAGQEQEA&A&QEQEQEQEAGAGYEYEQEQEQEQEYEYEa†a†Y†Y†YEYEAGAGa†a†YÉYÉYEYEbŒbŒbŒbŒHãHä8Ä8ä8Ä8ä(ä(ä0Ä0ã(ä(ä0Ä0ã0Ä0ã8Ä8äIEIE@ä@ä0Ä0ä0Ä0ã8Ä8ä0Ä0ã(ä(ä8Ä8ä(ä(ä8Ä8ä9$9$8Ä8ä8Ä8ä9E9E@ä@ä8Ä8ä8Ä8äA$A$@å@åY†Y†k/k/bbYEYEAGAGQEQEI‡I‡I‡I‡aÇaÇI‡I‡aÇaÇI‡I‡YÉYÉY†Y†jŠjŠ{oƒpQÆQÇQEQEQEQEQEQEA&A&QEQEQEQEQEQEQEQEQEQEYEYEI‡I‡YEYEYEYEY†Y†A&A&@å@å8Ä8äZZk/k/QEQE@ä@ä(ä(ä(ä(ä0Ä0ä0Ä0ã0Ä0ã8Ä8ä@å@åA$A$8Ä8ä8Ä8äA$A$(ä(ä8Ä8ä(ä(ä8Ä8ä1$1$8Ä8ä8Ä8ä9$9$@å@åA$A$8Ä8ä9$9$8Ä8ä8Ä8äIEIEbbk/k/YÇYÇaÇaÇYEYEAGAGAGAGY†Y†I‡I‡aÇaÇI‡I‡YÉYÉYEYEYÉYÉ{,{,k/k/QEQEQEQEA&A&AEAEA&A&AGAGQEQEI†I†YEYEAGAGQEQEAGAGa†a†Y†Y†YÉYÉYEYEYÉYÉiÇiÇbJZJbŒbŒHäHä0Ä0ä8ä8ã(ä(ä8Ä8ä(ä(ä0Ä0ã8Ä8ä8Ä8ä9E9E@ä@ä8Ä8ä@å@å0Ã0ä8Ä8ä(ä(ä8Ä8ä0å0å8Ä8ä9$9$8Ä8ä9E9EA&A&HäHä8Ä8ä(ä(ä8Ä8äA$A$YEYEk/k/bJZJY†Y†I‡I‡YEYEI‡I‡AGAGYEYEI‡I‡aÇaÇI‡I‡I‡I‡Y†Y†jŠjŠ{oƒpYÈYÉQEQEA&A&@å@åA†A†QEQEA&A&I‡I‡QEQEI‡I‡Y†Y†I‡I‡YEYEI‡I‡Y†Y†A&A&@å@å8Ä8äZZk/k/QEQE@ä@ä(ä(ä(ä(ä0Ä0ä0Ä0ã0Ä0ã8Ä8ä@å@åA$A$8Ä8ä8Ä8äA$A$(ä(ä8Ä8ä(ä(ä8Ä8ä1$1$8Ä8ä8Ä8ä9$9$@å@åA$A$8Ä8ä9$9$8Ä8ä8Ä8äIEIEbbk/k/YÇYÇaÇaÇYEYEAGAGAGAGY†Y†I‡I‡aÇaÇI‡I‡YÉYÉYEYEYÉYÉ{,{,k/k/QEQEQEQEA&A&AEAEA&A&AGAGQEQEI†I†YEYEAGAGQEQEAGAGa†a†Y†Y†YÉYÉYEYEYÉYÉiÇiÇbJZJbŒbŒHäHä0Ä0ä8ä8ã(ä(ä8Ä8ä(ä(ä0Ä0ã8Ä8ä8Ä8ä9E9E@ä@ä8Ä8ä@å@å0Ã0ä8Ä8ä(ä(ä8Ä8ä0å0å8Ä8ä9$9$8Ä8ä9E9EA&A&HäHä8Ä8ä(ä(ä8Ä8äA$A$YEYEk/k/bJZJY†Y†I‡I‡YEYEI‡I‡AGAGYEYEI‡I‡aÇaÇI‡I‡I‡I‡Y†Y†jŠjŠ{oƒpYÈYÉQEQEA&A&@å@åA†A†QEQEA&A&I‡I‡QEQEI‡I‡Y†Y†I‡I‡YEYEI‡I‡QÇQÇI‡I‡A&A&@å@åbbc/c/YEYE8Ä8ä8Ä8ä(ä(ä(ä(ä(ä(ä8Ä8ä0Ä0ã8Ä8ä8Ä8ä9$9$8Ä8ä8Ä8ä(ä(ä8Ä8ä(ä(ä0å0å8Ä8ä1$1$0å0å8Ä8äA$A$9E9E@å@å0Ã0ä8Ä8ä9E9EQEQEYÉYÉbŒbŒbbI‡I‡I‡I‡I‡I‡YEYEI‡I‡I‡I‡YEYEI‡I‡aÇaÇI‡I‡YÉYÉ{,{,bŒbŒIEIE0æ0æ(ä(ä(ä(ä(ä(ä0æ0æ1$1$0æ0æA&A&Y†Y†AGAGa†a†YÉYÉYÉYÉaÇaÇYÉYÉQÇQÇQÇQÇbŒbŒjËjË@ä@ä@ä@ä8Ä8ä8Ä8ä(ä(ä(ä(ä0Ä0ã(ä(ä8Ä8ä8Ä8ä8Ä8äA$A$8Ä8ä(ä(ä8Ä8ä(ä(ä8Ä8ä1$1$(ä(ä8Ä8äA$A$8Ä8ä9E9E@å@å8ã8ä8Ä8ä8Ä8äIEIEAGAGjËjËrjYÉYÉI‡I‡YEYEI‡I‡AGAGI‡I‡aÇaÇI‡I‡Y†Y†I‡I‡aÇaÇjIjIƒo{pAFAG9E9E0æ0æ!$!$(ä(ä(å(å0å0å0å0åA&A&AGAGYÉYÉAGAGAGAGYÇYÇQÇQÇI‡I‡A&A&@å@åbbc/c/YEYE8Ä8ä8Ä8ä(ä(ä(ä(ä(ä(ä8Ä8ä0Ä0ã8Ä8ä8Ä8ä9$9$8Ä8ä8Ä8ä(ä(ä8Ä8ä(ä(ä0å0å8Ä8ä1$1$0å0å8Ä8äA$A$9E9E@å@å0Ã0ä8Ä8ä9E9EQEQEYÉYÉbŒbŒbbI‡I‡I‡I‡I‡I‡YEYEI‡I‡I‡I‡YEYEI‡I‡aÇaÇI‡I‡YÉYÉ{,{,bŒbŒIEIE0æ0æ(ä(ä(ä(ä(ä(ä0æ0æ1$1$0æ0æA&A&Y†Y†AGAGa†a†YÉYÉYÉYÉaÇaÇYÉYÉQÇQÇQÇQÇbŒbŒjËjË@ä@ä@ä@ä8Ä8ä8Ä8ä(ä(ä(ä(ä0Ä0ã(ä(ä8Ä8ä8Ä8ä8Ä8äA$A$8Ä8ä(ä(ä8Ä8ä(ä(ä8Ä8ä1$1$(ä(ä8Ä8äA$A$8Ä8ä9E9E@å@å8ã8ä8Ä8ä8Ä8äIEIEAGAGjËjËrjYÉYÉI‡I‡YEYEI‡I‡AGAGI‡I‡aÇaÇI‡I‡Y†Y†I‡I‡aÇaÇjIjIƒo{pAFAG9E9E0æ0æ!$!$(ä(ä(å(å0å0å0å0åA&A&AGAGYÉYÉAGAGAGAGYÇYÇYÇYÇAGAG@å@åI$I$ZZk/k/YEYE@ä@ä@ä@ä0Ä0ã(ä(ä(Ä(Ä0Ä0ä0Ä0ä8ä8ã@å@å0Ã0äA$A$0Ä0ã8Ä8ä8Ä8äA$A$8ä8ã8Ä8ä8Ä8äHäHä0Ä0ä8ä8ãIEIE8Ä8ä8ä8ã8ä8ã@ä@ä@ä@äYÉYÉjËjËbbjjaÇaÇI‡I‡I‡I‡I‡I‡aÇaÇYÉYÉI‡I‡YÉYÉI‡I‡a†a†{,{,bŒbŒ(ä(ä0å0å1†1†Ä Ä å å å å å å(ä(ä(ä(ä8Ä8äAGAGAÇAÇY†Y†I‡I‡Y†Y†AGAGQEQEIEIEbŒbŒbŒbŒ@ä@ä(Ä(Ã0Ä0ã(ä(ä0Ä0ã(ä(ä(ä(ä8Ä8ä0Ä0ãA$A$8Ä8ä0Ä0ãA$A$8Ä8ä8Ä8ä8ä8ã8Ä8ä8Ä8äAEAE@ä@ä0Ä0ä8Ä8Ã8Ä8äIEIE@ä@ä0Ä0ã8ä8ãI$I$QEQEbŒbŒZJbJiÇiÇYÉYÉI‡I‡Y†Y†I‡I‡aÇaÇI‡I‡YÉYÉaÇaÇI‡I‡YÉYÉbb{oƒp0å0å0å0å0æ0æ å å å å å å0æ0æ(ä(ä(ä(ä0Ä0ãQÇQÇ0Ã0ä8Ä8äQÇQÇYÇYÇAGAG@å@åI$I$ZZk/k/YEYE@ä@ä@ä@ä0Ä0ã(ä(ä(Ä(Ä0Ä0ä0Ä0ä8ä8ã@å@å0Ã0äA$A$0Ä0ã8Ä8ä8Ä8äA$A$8ä8ã8Ä8ä8Ä8äHäHä0Ä0ä8ä8ãIEIE8Ä8ä8ä8ã8ä8ã@ä@ä@ä@äYÉYÉjËjËbbjjaÇaÇI‡I‡I‡I‡I‡I‡aÇaÇYÉYÉI‡I‡YÉYÉI‡I‡a†a†{,{,bŒbŒ(ä(ä0å0å1†1†Ä Ä å å å å å å(ä(ä(ä(ä8Ä8äAGAGAÇAÇY†Y†I‡I‡Y†Y†AGAGQEQEIEIEbŒbŒbŒbŒ@ä@ä(Ä(Ã0Ä0ã(ä(ä0Ä0ã(ä(ä(ä(ä8Ä8ä0Ä0ãA$A$8Ä8ä0Ä0ãA$A$8Ä8ä8Ä8ä8ä8ã8Ä8ä8Ä8äAEAE@ä@ä0Ä0ä8Ä8Ã8Ä8äIEIE@ä@ä0Ä0ã8ä8ãI$I$QEQEbŒbŒZJbJiÇiÇYÉYÉI‡I‡Y†Y†I‡I‡aÇaÇI‡I‡YÉYÉaÇaÇI‡I‡YÉYÉbb{oƒp0å0å0å0å0æ0æ å å å å å å0æ0æ(ä(ä(ä(ä0Ä0ãQÇQÇ0Ã0ä8Ä8äQÇQÇQÇQÇI‡I‡I†I†A&A&ZJbJc/c/bbAGAG8æ8æ0å0å0å0å0å0å8Ä8ä0å0å(ä(ä0Ä0ã(ä(ä0Ä0ã(ä(ä8Ä8ä1$1$(ä(ä8Ä8ä9†9†A&A&1†1†(ä(äA&A&A&A&0æ0æAGAGAGAGI‡I‡AGAGZJbJbŒbŒI‡I‡AGAGI†I†I‡I‡I‡I‡YEYEAGAGAGAGQÇQÇAGAGQEQEQEQE{.{.k/k/0Ã0äA&A&AGAGAGAGAEAEA&A&IEIEIEIEA&A&AEAEQÇQÇZZbbZJbJbbZJbJZJbJJJk/k/s/k/I‡I‡9†9†AGAG0æ0æ0å0å0æ0æ8Ä8ä(ä(ä8Ä8ä(ä(ä0Ä0ã ä ä(ä(ä(ä(ä8Ä8ä(ä(ä8Ä8ä9E9E8æ8æ0å0å0å0å9E9EA&A&0æ0æA†A†A&A&I‡I‡AGAGJJjÍjÍYÉYÉAÇAÇI†I†I‡I‡I‡I‡Y†Y†AGAGAGAGI‡I‡AGAGYEYEA&A&bbƒÒƒÑAGAG9E9EAGAGQÇQÇ8Ä8äA†A†A&A&IEIE9E9EA&A&QEQEAGAGA†A†A&A&QÇQÇI‡I‡I†I†A&A&ZJbJc/c/bbAGAG8æ8æ0å0å0å0å0å0å8Ä8ä0å0å(ä(ä0Ä0ã(ä(ä0Ä0ã(ä(ä8Ä8ä1$1$(ä(ä8Ä8ä9†9†A&A&1†1†(ä(äA&A&A&A&0æ0æAGAGAGAGI‡I‡AGAGZJbJbŒbŒI‡I‡AGAGI†I†I‡I‡I‡I‡YEYEAGAGAGAGQÇQÇAGAGQEQEQEQE{.{.k/k/0Ã0äA&A&AGAGAGAGAEAEA&A&IEIEIEIEA&A&AEAEQÇQÇZZbbZJbJbbZJbJZJbJJJk/k/s/k/I‡I‡9†9†AGAG0æ0æ0å0å0æ0æ8Ä8ä(ä(ä8Ä8ä(ä(ä0Ä0ã ä ä(ä(ä(ä(ä8Ä8ä(ä(ä8Ä8ä9E9E8æ8æ0å0å0å0å9E9EA&A&0æ0æA†A†A&A&I‡I‡AGAGJJjÍjÍYÉYÉAÇAÇI†I†I‡I‡I‡I‡Y†Y†AGAGAGAGI‡I‡AGAGYEYEA&A&bbƒÒƒÑAGAG9E9EAGAGQÇQÇ8Ä8äA†A†A&A&IEIE9E9EA&A&QEQEAGAGA†A†A&A&{,{,jÍjÍrËjËjÍjÍrËjË{.{.bŒbŒbŒbŒbŒbŒbŒbŒRŠRŠbbR‹R‹ZJbJbŒbŒc,c,bŒbŒR‹R‹ZJbJR‹R‹jŠjŠZJbJZJbJbŒbŒR -R -bŒbŒc,c,k-k-s/k/{Ï{Ï{,{,c,c,k/k/rËjËc,c,k/k/c,c,ZJbJR -R -R -R -R -R -R‹R‹ZJbJZJbJZJbJbŒbŒR‹R‹bŒbŒ{Ï{σЃÐk/k/c,c,k-k-{,{,jËjË{.{.{oƒp{oƒp{o{o{,{,“ЋГЋД2Œ1“ЋЃЃЃЃÐ{Ï{Ï{oƒpjËjË{.{.{.{.ZJbJbŒbŒRŠRŠbŒbŒZIZIZIZIbŒbŒR‹R‹c,c,ZÌZÌZJbJZJbJZJbJZJbJZJbJR‹R‹bŒbŒZJbJc,c,bŒbŒc,c,{.{.{Ï{Ï{.{.k-k-s.k-k-k-rÎjÍjËjËs-k-ZÌZÌZJbJRRR -R -R -R -R‹R‹ZJbJZJbJZJbJZÌZÌZJbJk/k/ƒÏƒÏk/k/s/k/c,c,{,{,jËjË{.{.{,{,{oƒp{oƒp{o{o{.{.“ϋσЃÐ{.{.{,{,jÍjÍrËjËjÍjÍrËjË{.{.bŒbŒbŒbŒbŒbŒbŒbŒRŠRŠbbR‹R‹ZJbJbŒbŒc,c,bŒbŒR‹R‹ZJbJR‹R‹jŠjŠZJbJZJbJbŒbŒR -R -bŒbŒc,c,k-k-s/k/{Ï{Ï{,{,c,c,k/k/rËjËc,c,k/k/c,c,ZJbJR -R -R -R -R -R -R‹R‹ZJbJZJbJZJbJbŒbŒR‹R‹bŒbŒ{Ï{σЃÐk/k/c,c,k-k-{,{,jËjË{.{.{oƒp{oƒp{o{o{,{,“ЋГЋД2Œ1“ЋЃЃЃЃÐ{Ï{Ï{oƒpjËjË{.{.{.{.ZJbJbŒbŒRŠRŠbŒbŒZIZIZIZIbŒbŒR‹R‹c,c,ZÌZÌZJbJZJbJZJbJZJbJZJbJR‹R‹bŒbŒZJbJc,c,bŒbŒc,c,{.{.{Ï{Ï{.{.k-k-s.k-k-k-rÎjÍjËjËs-k-ZÌZÌZJbJRRR -R -R -R -R‹R‹ZJbJZJbJZJbJZÌZÌZJbJk/k/ƒÏƒÏk/k/s/k/c,c,{,{,jËjË{.{.{,{,{oƒp{oƒp{o{o{.{.“ϋσЃÐ{.{.IEIE@å@åQEQEIEIEQEQEQEQEQEQE@ä@ä8Ä8äIEIEIEIE@å@åIEIEQEQEbbZJbJAGAGY…Y…YEYEQEQEYEYEY†Y†QEQEQEQEAEAEQ…Q…IEIEIEIEQÇQÇbŒbŒZZYEYEAGAGY†Y†AGAGQEQEIEIEIEIEA&A&A†A†IEIEAGAGY†Y†AGAGQÇQÇYÇYÇYÉYÉQÇQÇQÇQÇI‡I‡YÇYÇbbI‡I‡YÉYÉYÇYÇZZYÇYÇbbbŒbŒbbQÇQÇZZbIbIYÇYÇY†Y†YEYEQEQEHäHäYEYEQEQEQEQE8Ä8ä@å@åIEIEAEAE@å@åIEIEI$I$I‡I‡jËjËI‡I‡Y†Y†Y†Y†QEQEQEQEY†Y†QEQEQEQEIEIEIEIEQ…Q…QEQEAGAGZJbJbIbIQÇQÇAGAGY†Y†AGAGQEQEIEIEA&A&QEQEA&A&AGAGAGAGI†I†Y†Y†AGAGZZYÇYÇYÉYÉQÇQÇQÇQÇYÉYÉYÇYÇJJYÉYÉQÇQÇYÉYÉaÇaÇZZbŒbŒbbY†Y†AGAGA$A$9E9EIEIE@å@åQEQEIEIEQEQEQEQEQEQE@ä@ä8Ä8äIEIEIEIE@å@åIEIEQEQEbbZJbJAGAGY…Y…YEYEQEQEYEYEY†Y†QEQEQEQEAEAEQ…Q…IEIEIEIEQÇQÇbŒbŒZZYEYEAGAGY†Y†AGAGQEQEIEIEIEIEA&A&A†A†IEIEAGAGY†Y†AGAGQÇQÇYÇYÇYÉYÉQÇQÇQÇQÇI‡I‡YÇYÇbbI‡I‡YÉYÉYÇYÇZZYÇYÇbbbŒbŒbbQÇQÇZZbIbIYÇYÇY†Y†YEYEQEQEHäHäYEYEQEQEQEQE8Ä8ä@å@åIEIEAEAE@å@åIEIEI$I$I‡I‡jËjËI‡I‡Y†Y†Y†Y†QEQEQEQEY†Y†QEQEQEQEIEIEIEIEQ…Q…QEQEAGAGZJbJbIbIQÇQÇAGAGY†Y†AGAGQEQEIEIEA&A&QEQEA&A&AGAGAGAGI†I†Y†Y†AGAGZZYÇYÇYÉYÉQÇQÇQÇQÇYÉYÉYÇYÇJJYÉYÉQÇQÇYÉYÉaÇaÇZZbŒbŒbbY†Y†AGAGA$A$9E9E8Ä8ä9E9E@å@å@å@åA&A&@å@å8Ä8äA$A$0å0å8Ä8ä9E9E@å@åQEQEQEQEbbc/c/YEYEY†Y†YEYEY†Y†Y†Y†YEYEaÇaÇY†Y†I†I†AGAGQÇQÇIEIEI‡I‡c,c,YÉYÉAGAGAGAGA&A&IEIEA&A&@å@åIEIE@å@å@å@å9E9EA&A&A&A&IEIEQEQEA&A&QEQEA&A&AGAGI$I$A&A&0å0å8Ä8äA†A†A&A&AGAGYEYEYÉYÉZZQEQEQEQEA&A&QEQE@å@åQEQEA&A&I$I$A&A&@å@å@å@å8Ä8äA$A$8Ä8ä8Ä8ä9E9E@ä@äA&A&QEQEYEYEjÍjÍbbYEYEYEYEYEYEY†Y†YEYEaÇaÇY†Y†Y†Y†I†I†I†I†I†I†AGAGbŒbŒZJbJY†Y†A&A&IEIEA&A&@å@åIEIE@å@å9E9EA&A&8Ä8äIEIEA&A&A&A&QEQEA&A&QEQEA&A&AGAGQEQE@å@å9E9E0å0å@å@åA&A&QEQEAGAGa†a†bbI‡I‡QEQEA&A&8Ä8ä8Ä8ä8ä8Ä9E9E@å@å@å@åA&A&@å@å8Ä8äA$A$0å0å8Ä8ä9E9E@å@åQEQEQEQEbbc/c/YEYEY†Y†YEYEY†Y†Y†Y†YEYEaÇaÇY†Y†I†I†AGAGQÇQÇIEIEI‡I‡c,c,YÉYÉAGAGAGAGA&A&IEIEA&A&@å@åIEIE@å@å@å@å9E9EA&A&A&A&IEIEQEQEA&A&QEQEA&A&AGAGI$I$A&A&0å0å8Ä8äA†A†A&A&AGAGYEYEYÉYÉZZQEQEQEQEA&A&QEQE@å@åQEQEA&A&I$I$A&A&@å@å@å@å8Ä8äA$A$8Ä8ä8Ä8ä9E9E@ä@äA&A&QEQEYEYEjÍjÍbbYEYEYEYEYEYEY†Y†YEYEaÇaÇY†Y†Y†Y†I†I†I†I†I†I†AGAGbŒbŒZJbJY†Y†A&A&IEIEA&A&@å@åIEIE@å@å9E9EA&A&8Ä8äIEIEA&A&A&A&QEQEA&A&QEQEA&A&AGAGQEQE@å@å9E9E0å0å@å@åA&A&QEQEAGAGa†a†bbI‡I‡QEQEA&A&8Ä8ä8Ä8ä8Ä8ä8Ä8ä9E9E@å@å8Ä8äA$A$0å0å9$9$9E9E@å@å@å@åA$A$9E9EAGAGjjbŒbŒ@å@åYEYEaÇaÇYEYEaÇaÇY†Y†Y†Y†aÇaÇI‡I‡QÇQÇAGAGI‡I‡AÇAÇbŒbŒZZYEYEA&A&IEIE@å@å9E9E@å@åA&A&8Ä8ä9E9EA&A&A&A&@å@åIEIEA&A&QEQEA&A&AGAGQEQEA&A&A&A&9E9E0å0åAGAGIEIEA&A&QEQEa†a†YÉYÉAGAGYEYEI‡I‡QEQE@å@åA&A&QEQE8å8å@å@åA$A$9E9E8Ä8ä9E9E0å0å9E9E8Ä8äIEIE@å@åA&A&YÉYÉjÍjÍAGAGQEQEa†a†aÇaÇI‡I‡YEYEa†a†aÇaÇI‡I‡QÇQÇI‡I‡AGAGA†A†R -R -rIjIAGAGI†I†A&A&IEIE@å@å9E9EA&A&@å@åA$A$9E9EA&A&@å@åQEQEA&A&QEQE9E9EAGAGQEQE@å@åA†A†@å@å0å0åAGAGIEIEA&A&QEQEYEYEYÉYÉI†I†Y†Y†YEYEA&A&@å@å8ä8Ä8ä8Ä9E9E@å@å8ä8ÄA$A$0å0å9$9$9E9E@å@å@å@åA$A$9E9EAGAGjjbŒbŒ@å@åYEYEaÇaÇYEYEaÇaÇY†Y†Y†Y†aÇaÇI‡I‡QÇQÇAGAGI‡I‡AÇAÇbŒbŒZZYEYEA&A&IEIE@å@å9E9E@å@åA&A&8Ä8ä9E9EA&A&A&A&@å@åIEIEA&A&QEQEA&A&AGAGQEQEA&A&A&A&9E9E0å0åAGAGIEIEA&A&QEQEa†a†YÉYÉAGAGYEYEI‡I‡QEQE@å@åA&A&QEQE8å8å@å@åA$A$9E9E8Ä8ä9E9E0å0å9E9E8Ä8äIEIE@å@åA&A&YÉYÉjÍjÍAGAGQEQEa†a†aÇaÇI‡I‡YEYEa†a†aÇaÇI‡I‡QÇQÇI‡I‡AGAGA†A†R -R -rIjIAGAGI†I†A&A&IEIE@å@å9E9EA&A&@å@åA$A$9E9EA&A&@å@åQEQEA&A&QEQE9E9EAGAGQEQE@å@åA†A†@å@å0å0åAGAGIEIEA&A&QEQEYEYEYÉYÉI†I†Y†Y†YEYEA&A&@å@å8Ä8ä9E9E8Ä8ä0å0åA$A$0å0å8Ä8ä9E9E@å@å0å0å9$9$A&A&@å@åIEIEYÉYÉZÌZÌ8Ä8äYEYEaÇaÇY†Y†a†a†aÇaÇaÇaÇaÇaÇI‡I‡Y†Y†I‡I‡A†A†JJbŒbŒQÇQÇAGAGQEQEA&A&@å@åIEIE0å0åIEIE@å@å9E9E@å@å9E9EA&A&I†I†A&A&IEIEIEIEA&A&A&A&IEIE0å0å8Ä8ä9E9EA&A&AGAGI$I$YEYEYÉYÉYÉYÉQEQEI‡I‡QEQEA&A&QEQE8å8åA&A&@å@å8Ä8ä8Ä8ä9E9E8Ä8ä0å0å@å@å9E9E@å@å0å0åIEIE@å@åI†I†k-k-AGAGQEQEYEYEaÇaÇYEYEiÇiÇYÉYÉa†a†a†a†I‡I‡QÇQÇAGAGA†A†R -R -bbAGAGI†I†A&A&@å@å9E9EA&A&8Ä8äIEIE@å@å@å@å9E9EA&A&A&A&QEQEA&A&IEIEA&A&AGAGA&A&@å@å9E9E8Ä8äA†A†A&A&IEIEA&A&YEYEZJbJI‡I‡YEYEA&A&@å@å8Ä8ä8ä8Ä9E9E8ä8Ä0å0åA$A$0å0å8Ä8ä9E9E@å@å0å0å9$9$A&A&@å@åIEIEYÉYÉZÌZÌ8Ä8äYEYEaÇaÇY†Y†a†a†aÇaÇaÇaÇaÇaÇI‡I‡Y†Y†I‡I‡A†A†JJbŒbŒQÇQÇAGAGQEQEA&A&@å@åIEIE0å0åIEIE@å@å9E9E@å@å9E9EA&A&I†I†A&A&IEIEIEIEA&A&A&A&IEIE0å0å8Ä8ä9E9EA&A&AGAGI$I$YEYEYÉYÉYÉYÉQEQEI‡I‡QEQEA&A&QEQE8å8åA&A&@å@å8Ä8ä8Ä8ä9E9E8Ä8ä0å0å@å@å9E9E@å@å0å0åIEIE@å@åI†I†k-k-AGAGQEQEYEYEaÇaÇYEYEiÇiÇYÉYÉa†a†a†a†I‡I‡QÇQÇAGAGA†A†R -R -bbAGAGI†I†A&A&@å@å9E9EA&A&8Ä8äIEIE@å@å@å@å9E9EA&A&A&A&QEQEA&A&IEIEA&A&AGAGA&A&@å@å9E9E8Ä8äA†A†A&A&IEIEA&A&YEYEZJbJI‡I‡YEYEA&A&@å@å8Ä8ä8Ä8ä(ä(ä@å@å8Ä8ä9E9E8Ä8ä(ä(ä0å0å0å0åA$A$@å@å9E9E8Ä8ä9E9EbbZÌZÌYÇYÇa†a†iÇiÇrjzzzzzziÇiÇrjAGAGQÇQÇA&A&R -R -bJZJQÇQÇA&A&AGAG@å@åIEIE0å0å@å@å9E9E@å@å9E9EA&A&IEIE@å@åA&A&QEQEA&A&A&A&AGAGIEIE@å@å9E9E8Ä8ä8Ä8äA&A&IEIEA&A&YEYEYÉYÉbbI‡I‡QEQEA&A&A&A&QEQEA&A&I$I$8Ä8äAEAE8Ä8ä@å@å(ä(äA$A$0å0å@å@å9$9$@å@å8Ä8ä9E9EAGAGbŒbŒbbY†Y†aÇaÇiÇiÇzzzziÇiÇzziÇiÇQÇQÇAGAGI†I†AGAGbŒbŒYÉYÉA†A†QEQE9E9EA&A&A&A&8Ä8ä9E9E8å8å@å@åA&A&9E9EIEIEA&A&IEIEA&A&A&A&AGAGQEQE@å@å9E9E0å0å8Ä8ä9E9EA&A&A&A&YEYEY†Y†ZJbJaÇaÇA&A&A&A&@ä@ä8Ä8ä8ä8Ä(ä(ä@å@å8ä8Ä9E9E8ä8Ä(ä(ä0å0å0å0åA$A$@å@å9E9E8Ä8ä9E9EbbZÌZÌYÇYÇa†a†iÇiÇrjzzzzzziÇiÇrjAGAGQÇQÇA&A&R -R -bJZJQÇQÇA&A&AGAG@å@åIEIE0å0å@å@å9E9E@å@å9E9EA&A&IEIE@å@åA&A&QEQEA&A&A&A&AGAGIEIE@å@å9E9E8Ä8ä8Ä8äA&A&IEIEA&A&YEYEYÉYÉbbI‡I‡QEQEA&A&A&A&QEQEA&A&I$I$8Ä8äAEAE8Ä8ä@å@å(ä(äA$A$0å0å@å@å9$9$@å@å8Ä8ä9E9EAGAGbŒbŒbbY†Y†aÇaÇiÇiÇzzzziÇiÇzziÇiÇQÇQÇAGAGI†I†AGAGbŒbŒYÉYÉA†A†QEQE9E9EA&A&A&A&8Ä8ä9E9E8å8å@å@åA&A&9E9EIEIEA&A&IEIEA&A&A&A&AGAGQEQE@å@å9E9E0å0å8Ä8ä9E9EA&A&A&A&YEYEY†Y†ZJbJaÇaÇA&A&A&A&@ä@ä8Ä8ä8Ä8ä8Ä8ä9$9$8Ä8ä8Ä8äA$A$8Ä8ä8Ä8ä8Ä8ä9E9E8Ä8ä9E9EA&A&QEQEYÉYÉZÌZÌI‡I‡QÇQÇAGAGaÇaÇYÉYÉjjYÉYÉa†a†I‡I‡A&A&8Ä8äAÇAÇI‡I‡R -R -QEQEIEIEA&A&AEAE@å@å8Ä8ä9E9E@å@å8Ä8ä9E9EA&A&8Ä8äIEIEIEIEA&A&QEQEA&A&IEIE@å@å@å@å9E9E@å@å9†9†@å@åIEIEA&A&YEYEYÉYÉZJbJYEYEA&A&YEYEAGAGHäHäQEQE@å@å@å@åHäHä0Ä0ãIEIE(ä(ä8Ä8ä8Ä8ä9E9E8Ä8ä9E9EIEIEA&A&Y†Y†bŒbŒRRI‡I‡I†I†I‡I‡YÉYÉbbjjYÉYÉYÇYÇAGAG8Ä8äA†A†A&A&R‹R‹QÇQÇA&A&QEQE@å@å9E9E@å@å8Ä8ä@å@å9E9E8Ä8ä9E9EA&A&A&A&@å@åQEQEIEIEIEIEA&A&A&A&8Ä8ä9E9EA&A&@å@å9E9EQEQEA&A&QEQEYEYEZJbJYÉYÉQEQEQEQE8Ä8ä8Ä8ä8ä8Ä8ä8Ä9$9$8Ä8ä8Ä8äA$A$8Ä8ä8Ä8ä8Ä8ä9E9E8Ä8ä9E9EA&A&QEQEYÉYÉZÌZÌI‡I‡QÇQÇAGAGaÇaÇYÉYÉjjYÉYÉa†a†I‡I‡A&A&8Ä8äAÇAÇI‡I‡R -R -QEQEIEIEA&A&AEAE@å@å8Ä8ä9E9E@å@å8Ä8ä9E9EA&A&8Ä8äIEIEIEIEA&A&QEQEA&A&IEIE@å@å@å@å9E9E@å@å9†9†@å@åIEIEA&A&YEYEYÉYÉZJbJYEYEA&A&YEYEAGAGHäHäQEQE@å@å@å@åHäHä0Ä0ãIEIE(ä(ä8Ä8ä8Ä8ä9E9E8Ä8ä9E9EIEIEA&A&Y†Y†bŒbŒRRI‡I‡I†I†I‡I‡YÉYÉbbjjYÉYÉYÇYÇAGAG8Ä8äA†A†A&A&R‹R‹QÇQÇA&A&QEQE@å@å9E9E@å@å8Ä8ä@å@å9E9E8Ä8ä9E9EA&A&A&A&@å@åQEQEIEIEIEIEA&A&A&A&8Ä8ä9E9EA&A&@å@å9E9EQEQEA&A&QEQEYEYEZJbJYÉYÉQEQEQEQE8Ä8ä8Ä8äAGAGA†A†AGAGA†A†9E9E9E9E9E9E9†9†AGAG9†9†A&A&A&A&AGAGAGAGZJbJR‹R‹(ä(ä(ä(äÄ Ä£ £ Ä Ä(å(å0æ0æÄ Ä0æ0æR -R -BBBBc/c/ZJbJAGAG0æ0æA†A†A&A&AGAG0å0å0å0å@å@å0æ0æ8Ä8ä9E9EAGAGAGAGA&A&A&A&A&A&A&A&A&A&A&A&9E9E8å8å0å0å@å@åA†A†AGAGI‡I‡I‡I‡YÉYÉjÍjÍbJZJYÉYÉYÉYÉI‡I‡I‡I‡AGAGA&A&IEIE8Ä8ä9E9E8Ä8ä(ä(ä(ä(ä(ä(ä0å0å0æ0æAGAGA&A&AGAGRRc-c-AÇAÇ Ä Ä ÄÄ ÄÃ(Ä(ÃÄ Ä0æ0æ(ä(ä å åI‡I‡BBAÇAÇR -R -c/c/AGAGA&A&AGAG0æ0æAGAG0æ0æ9E9E0å0å@å@å1†1†8Ä8äA&A&AGAGA&A&A&A&A&A&A&A&A&A&A&A&IEIE8å8å8Ä8ä9E9EA&A&AGAGI‡I‡I‡I‡YÉYÉjŠjŠbŒbŒYÉYÉYÉYÉYÉYÉI‡I‡AGAGA†A†AGAGA†A†9E9E9E9E9E9E9†9†AGAG9†9†A&A&A&A&AGAGAGAGZJbJR‹R‹(ä(ä(ä(äÄ Ä£ £ Ä Ä(å(å0æ0æÄ Ä0æ0æR -R -BBBBc/c/ZJbJAGAG0æ0æA†A†A&A&AGAG0å0å0å0å@å@å0æ0æ8Ä8ä9E9EAGAGAGAGA&A&A&A&A&A&A&A&A&A&A&A&9E9E8å8å0å0å@å@åA†A†AGAGI‡I‡I‡I‡YÉYÉjÍjÍbJZJYÉYÉYÉYÉI‡I‡I‡I‡AGAGA&A&IEIE8Ä8ä9E9E8Ä8ä(ä(ä(ä(ä(ä(ä0å0å0æ0æAGAGA&A&AGAGRRc-c-AÇAÇ Ä Ä ÄÄ ÄÃ(Ä(ÃÄ Ä0æ0æ(ä(ä å åI‡I‡BBAÇAÇR -R -c/c/AGAGA&A&AGAG0æ0æAGAG0æ0æ9E9E0å0å@å@å1†1†8Ä8äA&A&AGAGA&A&A&A&A&A&A&A&A&A&A&A&IEIE8å8å8Ä8ä9E9EA&A&AGAGI‡I‡I‡I‡YÉYÉjŠjŠbŒbŒYÉYÉYÉYÉYÉYÉI‡I‡k/k/rËjËk/k/rËjËbŒbŒƒÐƒÐk/k/bJZJc,c,bbR‹R‹ZJbJZJbJZÌZÌjËjËs-k-ZJbJZJbJZJbJJJZJbJbŒbŒc/c/k-k-{Ï{σЃÐ{.{.{.{.{.{.{,{,k,k,s/k/k,k,s/k/c,c,ƒÒƒÑ{.{.c,c,c,c,c/c/bŒbŒƒÐƒÐk/k/s,k,k/k/c,c,{.{.c,c,jÍjÍs/k/ƒÐƒÐ{oƒpc,c,{oƒp{oƒp{o{o{.{.{.{.{oƒp{,{,{.{.{.{.{.{.k/k/jËrËk-k-jËrËjÍjÍbŒbŒZJbJR -R -R -R -JJR -R -ZIZIbŒbŒR‹R‹RŠRŠjÍjÍrËjËZJbJR‹R‹ZJbJR -R -bJZJbŒbŒc,c,k-k-{.{.ƒÐƒÐ{oƒpk-k-k-s.{,{,k-k-k,s,k/k/k,s,k/k/{.{.ƒÐƒÐk-k-bŒbŒk-k-ZÌZÌ{oƒp{oƒpc.c/k-k-s.k-k-k-s.k-bŒbŒk-k-ƒÐƒÐƒÒƒÑbŒbŒ{oƒp{oƒps.{.{.{.{.{.{.{.{oƒp{.{.{.{.k-k-{.{.k/s/jËjËk/s/jËjËbŒbŒƒÐƒÐk/k/bJZJc,c,bbR‹R‹ZJbJZJbJZÌZÌjËjËs-k-ZJbJZJbJZJbJJJZJbJbŒbŒc/c/k-k-{Ï{σЃÐ{.{.{.{.{.{.{,{,k,k,s/k/k,k,s/k/c,c,ƒÒƒÑ{.{.c,c,c,c,c/c/bŒbŒƒÐƒÐk/k/s,k,k/k/c,c,{.{.c,c,jÍjÍs/k/ƒÐƒÐ{oƒpc,c,{oƒp{oƒp{o{o{.{.{.{.{oƒp{,{,{.{.{.{.{.{.k/k/jËrËk-k-jËrËjÍjÍbŒbŒZJbJR -R -R -R -JJR -R -ZIZIbŒbŒR‹R‹RŠRŠjÍjÍrËjËZJbJR‹R‹ZJbJR -R -bJZJbŒbŒc,c,k-k-{.{.ƒÐƒÐ{oƒpk-k-k-s.{,{,k-k-k,s,k/k/k,s,k/k/{.{.ƒÐƒÐk-k-bŒbŒk-k-ZÌZÌ{oƒp{oƒpc.c/k-k-s.k-k-k-s.k-bŒbŒk-k-ƒÐƒÐƒÒƒÑbŒbŒ{oƒp{oƒps.{.{.{.{.{.{.{.{oƒp{.{.{.{.k-k-{.{.Y†Y†Y†Y†Y†Y†AGAGY†Y†ƒÐƒÐjŠjŠ8Ä8äQEQEA&A&@å@åAEAEAEAEQEQEA&A&QEQEAGAGQÇQÇAGAGI†I†AGAGQÇQÇI†I†Y†Y†QÇQÇI†I†QEQEIEIEIEIEIEIEA&A&QEQEQÇQÇY…Y…Y†Y†jŠjŠ“Ð‹ÐR -R -QÇQÇQEQEI†I†I†I†AGAGI†I†AGAGQEQEI†I†YEYEY†Y†YÉYɃЃÐjŠjŠbbZZQÇQÇYÇYÇYÉYÉY†Y†Y†Y†I‡I‡I†I†AGAGQÇQÇY†Y†YÉYÉY†Y†YÇYÇ{,{,bŒbŒIEIE@å@åI$I$AEAEI$I$A&A&8ã8äQEQEQEQEA&A&AGAGI†I†I‡I‡Y†Y†AGAGAGAGQÇQÇI†I†Y†Y†I‡I‡QÇQÇIEIEQEQEA&A&IEIEI†I†QEQEQEQEY†Y†Y†Y†ZZƒÏƒÏk-k-Y†Y†I†I†I†I†I†I†A&A&I†I†I†I†QEQEA&A&Y†Y†Y†Y†Y†Y†k-k-{.{.bbZZQÇQÇYÇYÇYÉYÉYÇYÇaÇaÇI†I†AGAGY†Y†I†I†Y†Y†Y†Y†Y†Y†Y†Y†AGAGY†Y†ƒÐƒÐjŠjŠ8Ä8äQEQEA&A&@å@åAEAEAEAEQEQEA&A&QEQEAGAGQÇQÇAGAGI†I†AGAGQÇQÇI†I†Y†Y†QÇQÇI†I†QEQEIEIEIEIEIEIEA&A&QEQEQÇQÇY…Y…Y†Y†jŠjŠ“Ð‹ÐR -R -QÇQÇQEQEI†I†I†I†AGAGI†I†AGAGQEQEI†I†YEYEY†Y†YÉYɃЃÐjŠjŠbbZZQÇQÇYÇYÇYÉYÉY†Y†Y†Y†I‡I‡I†I†AGAGQÇQÇY†Y†YÉYÉY†Y†YÇYÇ{,{,bŒbŒIEIE@å@åI$I$AEAEI$I$A&A&8ã8äQEQEQEQEA&A&AGAGI†I†I‡I‡Y†Y†AGAGAGAGQÇQÇI†I†Y†Y†I‡I‡QÇQÇIEIEQEQEA&A&IEIEI†I†QEQEQEQEY†Y†Y†Y†ZZƒÏƒÏk-k-Y†Y†I†I†I†I†I†I†A&A&I†I†I†I†QEQEA&A&Y†Y†Y†Y†Y†Y†k-k-{.{.bbZZQÇQÇYÇYÇYÉYÉYÇYÇaÇaÇI†I†AGAGY†Y†I†I†Y†Y†QEQEQEQEY†Y†AGAGYEYEk-k-R -R -IEIEI$I$I$I$QEQE@å@åQEQEQEQEA&A&QEQEA&A&QEQEIEIEA&A&QEQEAGAGQEQEAGAGQEQEYEYEA&A&IEIEA&A&IEIEIEIEQEQEYEYEY†Y†YEYEjËjË{Ð{ÐbIbIQEQEA&A&QEQEQEQEA&A&QEQEQEQEQEQEA&A&YEYEAGAGiÇiÇs/k/I†I†YEYEAGAGYEYEYEYEQEQEAGAGQEQEAGAGQEQEA&A&I†I†AGAGI†I†YEYEYEYEZJbJbŒbŒHäHäHäHäHäHä8ä8ã@å@åQEQEIEIE@å@åQEQEQEQEA&A&I$I$QEQEA&A&QEQEIEIEAGAGQEQEAGAGQEQEY†Y†IEIEIEIEA&A&IEIEI$I$IEIEQEQEY†Y†Y†Y†bbƒÐƒÐk-k-I$I$AGAGQEQEQEQEQEQEA&A&QEQEAGAGQEQEQEQEAGAGYEYE{,{,ZJbJQEQEQEQEYEYEI‡I‡QEQEQEQEA&A&QEQEAGAGQEQEQEQEAGAGQEQEQEQEY†Y†AGAGYEYEk-k-R -R -IEIEI$I$I$I$QEQE@å@åQEQEQEQEA&A&QEQEA&A&QEQEIEIEA&A&QEQEAGAGQEQEAGAGQEQEYEYEA&A&IEIEA&A&IEIEIEIEQEQEYEYEY†Y†YEYEjËjË{Ð{ÐbIbIQEQEA&A&QEQEQEQEA&A&QEQEQEQEQEQEA&A&YEYEAGAGiÇiÇs/k/I†I†YEYEAGAGYEYEYEYEQEQEAGAGQEQEAGAGQEQEA&A&I†I†AGAGI†I†YEYEYEYEZJbJbŒbŒHäHäHäHäHäHä8ä8ã@å@åQEQEIEIE@å@åQEQEQEQEA&A&I$I$QEQEA&A&QEQEIEIEAGAGQEQEAGAGQEQEY†Y†IEIEIEIEA&A&IEIEI$I$IEIEQEQEY†Y†Y†Y†bbƒÐƒÐk-k-I$I$AGAGQEQEQEQEQEQEA&A&QEQEAGAGQEQEQEQEAGAGYEYE{,{,ZJbJQEQEQEQEYEYEI‡I‡QEQEQEQEA&A&QEQEAGAGQEQEQEQEAGAGQEQEY†Y†A&A&QEQEYEYEZJbJRR@å@åQEQE@å@åI$I$QEQEQEQEA&A&I$I$QEQE@å@åIEIEI$I$IEIEA&A&IEIEQEQEQEQEY†Y†QEQEQEQEA&A&IEIEQEQEQEQEYEYEY†Y†QÇQÇYEYEjŠjŠƒÒƒÑI‡I‡QEQEAGAGQEQEA&A&QEQEA&A&QEQEA&A&QEQEAGAGYEYEYÇYǃЃÐI‡I‡YEYEYEYEYEYEAGAGYEYEYEYEAGAGYEYEI†I†AGAGQEQEA&A&I†I†I‡I‡YEYEjËjËbJZJI$I$@å@åHäHä0Ä0ãA$A$IEIEI$I$QEQE@å@åIEIEIEIEI$I$QEQEIEIEA&A&IEIEI$I$AGAGQEQEQEQEQEQEQEQEA&A&IEIEQEQEQEQEQEQEY†Y†Y†Y†QEQEaÇaǃЃÐZJbJAGAGQEQEQEQEA&A&A&A&QEQEQEQEA&A&QEQEIEIEYEYEYEYEjÍjÍbŒbŒYEYEYEYEYEYEAGAGQEQEYEYEYEYEI†I†YEYEA&A&I†I†QEQEQEQEY†Y†A&A&QEQEYEYEZJbJRR@å@åQEQE@å@åI$I$QEQEQEQEA&A&I$I$QEQE@å@åIEIEI$I$IEIEA&A&IEIEQEQEQEQEY†Y†QEQEQEQEA&A&IEIEQEQEQEQEYEYEY†Y†QÇQÇYEYEjŠjŠƒÒƒÑI‡I‡QEQEAGAGQEQEA&A&QEQEA&A&QEQEA&A&QEQEAGAGYEYEYÇYǃЃÐI‡I‡YEYEYEYEYEYEAGAGYEYEYEYEAGAGYEYEI†I†AGAGQEQEA&A&I†I†I‡I‡YEYEjËjËbJZJI$I$@å@åHäHä0Ä0ãA$A$IEIEI$I$QEQE@å@åIEIEIEIEI$I$QEQEIEIEA&A&IEIEI$I$AGAGQEQEQEQEQEQEQEQEA&A&IEIEQEQEQEQEQEQEY†Y†Y†Y†QEQEaÇaǃЃÐZJbJAGAGQEQEQEQEA&A&A&A&QEQEQEQEA&A&QEQEIEIEYEYEYEYEjÍjÍbŒbŒYEYEYEYEYEYEAGAGQEQEYEYEYEYEI†I†YEYEA&A&I†I†QEQEQEQEA&A&QEQEA&A&YEYER -R -YÉYÉ@å@åI$I$I$I$QEQEI$I$QEQEI$I$A&A&HäHäQEQEI$I$A&A&I$I$QEQEQEQEQEQEQEQEYEYEY†Y†QEQEQEQEQEQEYEYEY†Y†Y†Y†Y†Y†Y…Y…Y…Y…jËj˃ЃÐI‡I‡A&A&I$I$A&A&I$I$A&A&QEQEA&A&AEAEA&A&IEIEQEQEa†a†{oƒpbbYEYEYEYEY†Y†QEQEYEYEAGAGYEYEYEYEQEQEAGAGIEIEA&A&AGAGQÇQÇjjbJZJbŒbŒI$I$@ä@ä@å@å8ã8äI$I$I$I$QEQEA&A&QEQEHäHäQEQEQEQE@å@åI$I$A&A&I$I$QEQEQEQEQEQEYEYEY†Y†QEQEQEQEQEQEYEYEY†Y†Y†Y†Y†Y†Y†Y†Y…Y…bIbIƒÐƒÐZJbJAEAEQEQE8å8åQEQEA&A&QEQE@å@åIEIEA&A&A&A&QEQEYEYE{,{,bŒbŒYEYEY†Y†YEYEQEQEYEYEAGAGQEQEYEYEAGAGQEQEA&A&QEQEQEQEA&A&QEQEA&A&YEYER -R -YÉYÉ@å@åI$I$I$I$QEQEI$I$QEQEI$I$A&A&HäHäQEQEI$I$A&A&I$I$QEQEQEQEQEQEQEQEYEYEY†Y†QEQEQEQEQEQEYEYEY†Y†Y†Y†Y†Y†Y…Y…Y…Y…jËj˃ЃÐI‡I‡A&A&I$I$A&A&I$I$A&A&QEQEA&A&AEAEA&A&IEIEQEQEa†a†{oƒpbbYEYEYEYEY†Y†QEQEYEYEAGAGYEYEYEYEQEQEAGAGIEIEA&A&AGAGQÇQÇjjbJZJbŒbŒI$I$@ä@ä@å@å8ã8äI$I$I$I$QEQEA&A&QEQEHäHäQEQEQEQE@å@åI$I$A&A&I$I$QEQEQEQEQEQEYEYEY†Y†QEQEQEQEQEQEYEYEY†Y†Y†Y†Y†Y†Y†Y†Y…Y…bIbIƒÐƒÐZJbJAEAEQEQE8å8åQEQEA&A&QEQE@å@åIEIEA&A&A&A&QEQEYEYE{,{,bŒbŒYEYEY†Y†YEYEQEQEYEYEAGAGQEQEYEYEAGAGQEQEA&A&QEQEIEIEQEQEA&A&QEQEI‡I‡jjbJZJHäHäIEIEHãHäHäHäQEQEQEQEQEQEQEQEHäHäQEQEQEQEQEQEQEQEQEQEQEQEQEQEYEYEY†Y†Y†Y†QEQEY†Y†QEQEY†Y†YEYEaÇaÇY…Y…aÇaÇY†Y†bŒbŒ{Ï{ÏYÉYÉIEIEIEIEA&A&QEQEA&A&@å@åQEQEIEIEA&A&QEQEQEQEaÇaÇjÍjÍZZa†a†YEYEYEYEYEYEYEYEQEQEYEYEY†Y†QEQEA&A&QEQEAGAGIEIEY†Y†I‡I‡jÎjÍbŒbŒI$I$@ä@ä@å@å8ã8ä@å@åIEIEI$I$QEQEQEQEQEQEHäHäQEQEIEIEHäHäQEQEQEQEQEQEHäHäYEYEa†a†Y…Y…Y†Y†QEQEYEYEY†Y†QEQEY†Y†aÇaÇY…Y…a†a†bbk/k/c,c,I$I$A&A&AGAGI$I$A&A&A&A&AEAEQEQEA&A&IEIEQEQEYEYEbŒbŒbŒbŒY…Y…YEYEYEYEYEYEYEYEQEQEYEYEY†Y†YEYEAGAGQEQEA&A&IEIEQEQEA&A&QEQEI‡I‡jjbJZJHäHäIEIEHãHäHäHäQEQEQEQEQEQEQEQEHäHäQEQEQEQEQEQEQEQEQEQEQEQEQEQEYEYEY†Y†Y†Y†QEQEY†Y†QEQEY†Y†YEYEaÇaÇY…Y…aÇaÇY†Y†bŒbŒ{Ï{ÏYÉYÉIEIEIEIEA&A&QEQEA&A&@å@åQEQEIEIEA&A&QEQEQEQEaÇaÇjÍjÍZZa†a†YEYEYEYEYEYEYEYEQEQEYEYEY†Y†QEQEA&A&QEQEAGAGIEIEY†Y†I‡I‡jÎjÍbŒbŒI$I$@ä@ä@å@å8ã8ä@å@åIEIEI$I$QEQEQEQEQEQEHäHäQEQEIEIEHäHäQEQEQEQEQEQEHäHäYEYEa†a†Y…Y…Y†Y†QEQEYEYEY†Y†QEQEY†Y†aÇaÇY…Y…a†a†bbk/k/c,c,I$I$A&A&AGAGI$I$A&A&A&A&AEAEQEQEA&A&IEIEQEQEYEYEbŒbŒbŒbŒY…Y…YEYEYEYEYEYEYEYEQEQEYEYEY†Y†YEYEAGAGQEQEA&A&@å@åQEQEQEQEYEYEI‡I‡bbJJI$I$@ä@äI$I$A&A&QEQEI$I$QEQEI$I$QEQEI$I$@å@åIEIEI$I$QEQEYEYEYEYEYEYEaÇaÇQEQEQEQEYEYEY†Y†Y†Y†Y…Y…Y…Y…QÇQÇYEYEQ…Q…bbƒÐƒÐRRA&A&QEQEA&A&A&A&QEQE@å@åIEIEIEIEA&A&AGAGI$I$A&A&c/c/aÇaÇYEYEY†Y†YEYEY†Y†YEYEYEYEY†Y†YEYEQEQEQEQEQEQEIEIEIEIEIEIE@å@åbŒbŒbŒbŒ@ã@äHäHä8Ä8Ã@ä@ä8Ä8Ã8ä8ãI$I$QEQEQEQEI$I$QEQEI$I$I$I$QEQEI$I$QEQEQEQEY†Y†Y…Y…Y…Y…Y†Y†IEIEYEYEY†Y†Y†Y†Y…Y…Y…Y…Y†Y†Y…Y…QEQEY†Y†k/k/s-k-HäHäYEYEA&A&IEIEA&A&I$I$A&A&IEIEA&A&QEQEA&A&A&A&bIbIbŒbŒYEYEY…Y…YEYEY†Y†Y†Y†YEYEY†Y†Y…Y…YEYEQEQEA&A&HäHä@å@åQEQEQEQEYEYEI‡I‡bbJJI$I$@ä@äI$I$A&A&QEQEI$I$QEQEI$I$QEQEI$I$@å@åIEIEI$I$QEQEYEYEYEYEYEYEaÇaÇQEQEQEQEYEYEY†Y†Y†Y†Y…Y…Y…Y…QÇQÇYEYEQ…Q…bbƒÐƒÐRRA&A&QEQEA&A&A&A&QEQE@å@åIEIEIEIEA&A&AGAGI$I$A&A&c/c/aÇaÇYEYEY†Y†YEYEY†Y†YEYEYEYEY†Y†YEYEQEQEQEQEQEQEIEIEIEIEIEIE@å@åbŒbŒbŒbŒ@ã@äHäHä8Ä8Ã@ä@ä8Ä8Ã8ä8ãI$I$QEQEQEQEI$I$QEQEI$I$I$I$QEQEI$I$QEQEQEQEY†Y†Y…Y…Y…Y…Y†Y†IEIEYEYEY†Y†Y†Y†Y…Y…Y…Y…Y†Y†Y…Y…QEQEY†Y†k/k/s-k-HäHäYEYEA&A&IEIEA&A&I$I$A&A&IEIEA&A&QEQEA&A&A&A&bIbIbŒbŒYEYEY…Y…YEYEY†Y†Y†Y†YEYEY†Y†Y…Y…YEYEQEQEA&A&HäHäA&A&AGAGI‡I‡AGAGZJbJbŒbŒbŒbŒAGAG8æ8æA&A&A&A&A&A&AGAGAGAGJJI‡I‡AGAGRRAGAGI‡I‡I‡I‡I‡I‡YÉYÉAÇAÇI‡I‡AGAGAGAGAÇAÇI‡I‡AGAGYÉYÉRRbbZJbJjËjËrÍjÍc,c,ZJbJA&A&AGAGAGAGA&A&I‡I‡BBAGAGBBAGAGI‡I‡R‹R‹jÍjÍ{.{.R -R -AGAGI‡I‡AGAGI‡I‡I‡I‡JJI‡I‡YÉYÉYÉYÉJJR -R -I‡I‡JJI‡I‡R -R -ƒÐƒÐƒÐƒÐbbJJAGAGAGAG9E9EA&A&AGAGA&A&AGAGI‡I‡AGAGI‡I‡BBI‡I‡I‡I‡I‡I‡JJI‡I‡YÉYÉAGAGI‡I‡AGAGAÇAÇAGAGAGAGYÉYÉRRYÉYÉZJbJjŠjŠk-k-c,c,jÍjÍA&A&AGAGAGAGAGAGAGAGJJAGAGI‡I‡AGAGBBR -R -bŒbŒk/k/bŒbŒI‡I‡I‡I‡AGAGI‡I‡I‡I‡I‡I‡I‡I‡YÉYÉJJYÉYÉBBI‡I‡A&A&AGAGI‡I‡AGAGZJbJbŒbŒbŒbŒAGAG8æ8æA&A&A&A&A&A&AGAGAGAGJJI‡I‡AGAGRRAGAGI‡I‡I‡I‡I‡I‡YÉYÉAÇAÇI‡I‡AGAGAGAGAÇAÇI‡I‡AGAGYÉYÉRRbbZJbJjËjËrÍjÍc,c,ZJbJA&A&AGAGAGAGA&A&I‡I‡BBAGAGBBAGAGI‡I‡R‹R‹jÍjÍ{.{.R -R -AGAGI‡I‡AGAGI‡I‡I‡I‡JJI‡I‡YÉYÉYÉYÉJJR -R -I‡I‡JJI‡I‡R -R -ƒÐƒÐƒÐƒÐbbJJAGAGAGAG9E9EA&A&AGAGA&A&AGAGI‡I‡AGAGI‡I‡BBI‡I‡I‡I‡I‡I‡JJI‡I‡YÉYÉAGAGI‡I‡AGAGAÇAÇAGAGAGAGYÉYÉRRYÉYÉZJbJjŠjŠk-k-c,c,jÍjÍA&A&AGAGAGAGAGAGAGAGJJAGAGI‡I‡AGAGBBR -R -bŒbŒk/k/bŒbŒI‡I‡I‡I‡AGAGI‡I‡I‡I‡I‡I‡I‡I‡YÉYÉJJYÉYÉBBI‡I‡k/k/ƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÐ{oƒp{.{.{oƒpc-c-ƒÐƒÐk/k/{Ï{Ïc/c/k-k-{.{.bŒbŒk/k/bŒbŒk,k,s/k/c/c/bŒbŒk-k-{.{.c/c/k-k-{.{.ƒÐƒÐ{oƒpk/k/{Ï{σЃЃσσЃГЋД2Œ1ƒÐƒÐ{.{.{.{.ƒÐƒÐƒÐƒÐƒÐƒÐ{oƒpƒÐƒÐƒÐƒÐ{Ð{Ð{Ð{Ð{oƒp‹Ð“ÐŒ0”0‹Ð“ЋГÐ{oƒpsÏ{Ïk/k/“ГЃ҃Ñ{Ð{Ð{Ð{ГЋЃ҃є“Œ“”“Œ“œ“œ“œ“œ“œ“œ“”“Œ“œ“œ“”“Œ“ƒÐƒÐƒÐƒÐk/k/s/k/{.{.ƒÐƒÐk/k/s/k/k,k,s/k/k/k/s-k-bŒbŒc,c,k/k/bŒbŒk-k-bŒbŒk/k/s/k/k,k,s/k/ƒÒƒÑƒÐƒÐ{.{.{Ï{Ï{oƒpƒÐƒÐƒÏƒÏ“ЋД0Œ0“ЋЃЃÐk/k/{Ï{σЃЃЃЃЃÐ{Ð{Ѓ҃уЃÐ{Ð{Ðk/k/ƒÐƒÐ”2Œ1“ϋϓЋЃЃÐk/k/ƒÐƒÐƒÐƒÐ{Ð{ГЋÐ{Ð{ЃЃЃ҃є“Œ“œ“œ“ƒÒƒÑk/s/ƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÐ{oƒp{.{.{oƒpc-c-ƒÐƒÐk/k/{Ï{Ïc/c/k-k-{.{.bŒbŒk/k/bŒbŒk,k,s/k/c/c/bŒbŒk-k-{.{.c/c/k-k-{.{.ƒÐƒÐ{oƒpk/k/{Ï{σЃЃσσЃГЋД2Œ1ƒÐƒÐ{.{.{.{.ƒÐƒÐƒÐƒÐƒÐƒÐ{oƒpƒÐƒÐƒÐƒÐ{Ð{Ð{Ð{Ð{oƒp‹Ð“ÐŒ0”0‹Ð“ЋГÐ{oƒpsÏ{Ïk/k/“ГЃ҃Ñ{Ð{Ð{Ð{ГЋЃ҃є“Œ“”“Œ“œ“œ“œ“œ“œ“œ“”“Œ“œ“œ“”“Œ“ƒÐƒÐƒÐƒÐk/k/s/k/{.{.ƒÐƒÐk/k/s/k/k,k,s/k/k/k/s-k-bŒbŒc,c,k/k/bŒbŒk-k-bŒbŒk/k/s/k/k,k,s/k/ƒÒƒÑƒÐƒÐ{.{.{Ï{Ï{oƒpƒÐƒÐƒÏƒÏ“ЋД0Œ0“ЋЃЃÐk/k/{Ï{σЃЃЃЃЃÐ{Ð{Ѓ҃уЃÐ{Ð{Ðk/k/ƒÐƒÐ”2Œ1“ϋϓЋЃЃÐk/k/ƒÐƒÐƒÐƒÐ{Ð{ГЋÐ{Ð{ЃЃЃ҃є“Œ“œ“œ“ƒÒƒÑA†A†QEQEA&A&AGAGA†A†IEIEAGAGA†A†IEIEAGAGYÇYÇRŠRŠQEQEIEIEIEIEQEQEI$I$IEIEIEIEIEIEI$I$AEAEAEAEY†Y†Y†Y†R -R -IÇIÇQÇQÇAÇAÇQÇQÇA†A†IEIEAGAGQÇQÇAGAGYÇYÇYÇYÇRRYÇYÇIÇIÇYÇYÇYÇYÇIÇIÇYÉYÉQÇQÇI†I†I†I†I†I†I‡I‡I†I†I†I†I†I†I‡I‡Y†Y†bŒbŒZIZIAÇAÇA$A$9E9EA&A&A†A†A†A†A&A&AÇAÇIEIEAGAGAEAEA†A†A†A†QEQE9E9EI†I†AGAGQEQEAÇAÇjŠjŠI‡I‡IEIEIEIEQEQEIEIEHäHäIEIEIEIEIEIE@å@åI$I$I†I†aÇaÇRRRRAÇAÇQÇQÇQÇQÇA&A&AGAGAÇAÇQEQEAÇAÇQÇQÇQÇQÇYÇYÇRRQÇQÇQÇQÇYÇYÇQÇQÇQÇQÇQÇQÇAGAGQÇQÇQEQEI‡I‡QÇQÇA†A†I†I†QÇQÇY†Y†ZZZJbJRR9E9E9E9EIEIEA&A&AÇAÇA&A&A†A†A†A†QEQEA&A&AGAGA†A†IEIEAGAGA†A†IEIEAGAGYÇYÇRŠRŠQEQEIEIEIEIEQEQEI$I$IEIEIEIEIEIEI$I$AEAEAEAEY†Y†Y†Y†R -R -IÇIÇQÇQÇAÇAÇQÇQÇA†A†IEIEAGAGQÇQÇAGAGYÇYÇYÇYÇRRYÇYÇIÇIÇYÇYÇYÇYÇIÇIÇYÉYÉQÇQÇI†I†I†I†I†I†I‡I‡I†I†I†I†I†I†I‡I‡Y†Y†bŒbŒZIZIAÇAÇA$A$9E9EA&A&A†A†A†A†A&A&AÇAÇIEIEAGAGAEAEA†A†A†A†QEQE9E9EI†I†AGAGQEQEAÇAÇjŠjŠI‡I‡IEIEIEIEQEQEIEIEHäHäIEIEIEIEIEIE@å@åI$I$I†I†aÇaÇRRRRAÇAÇQÇQÇQÇQÇA&A&AGAGAÇAÇQEQEAÇAÇQÇQÇQÇQÇYÇYÇRRQÇQÇQÇQÇYÇYÇQÇQÇQÇQÇQÇQÇAGAGQÇQÇQEQEI‡I‡QÇQÇA†A†I†I†QÇQÇY†Y†ZZZJbJRR9E9E9E9EIEIEA&A&AÇAÇA&A&A†A†@å@åHäHä8ä8ã@å@åHäHä8ä8ã8ä8ãHäHä8ä8ã@å@åY…Y…ZJbJ@å@åHäHäHäHä@ä@ãHäHä@ä@ãHäHä0Ä0ã8ä8ãHäHä8ä8ãI$I$QEQEjŠjŠA&A&AEAE@å@å@ä@ä0Ä0ä@å@åA$A$8Ä8äAEAE@å@åHäHäAEAEQEQEQEQEQEQEQEQEQEQEI$I$A&A&IEIEQEQEQEQE@å@åIEIE@å@å9E9EA&A&QEQE{,{,AGAG@å@åA$A$@å@å9E9E@å@å8Ä8ä9E9E@ä@ä8Ä8äHäHä8Ä8äHäHä8ä8ã@å@å8ã8ä@å@å8ã8äHäHäAEAEbIbIAGAGHäHäHäHä@ä@ã@ä@ãHäHä@ä@ãHäHä8ä8ãHäHä8ä8ãI$I$@å@åbbR -R -8ã8ä@å@å8Ä8äA$A$0Ä0ãAEAE@å@å@å@åAEAEI$I$A&A&I$I$AGAGHäHäQEQEQEQEQEQEQEQEQEQEA&A&IEIEI$I$@å@å9E9E@å@åA&A&IEIEbIbIZJbJ8Ä8äIEIE8å8å8Ä8ä9E9E8Ä8ä8Ä8äAEAE@å@åHäHä8ä8ã@å@åHäHä8ä8ã8ä8ãHäHä8ä8ã@å@åY…Y…ZJbJ@å@åHäHäHäHä@ä@ãHäHä@ä@ãHäHä0Ä0ã8ä8ãHäHä8ä8ãI$I$QEQEjŠjŠA&A&AEAE@å@å@ä@ä0Ä0ä@å@åA$A$8Ä8äAEAE@å@åHäHäAEAEQEQEQEQEQEQEQEQEQEQEI$I$A&A&IEIEQEQEQEQE@å@åIEIE@å@å9E9EA&A&QEQE{,{,AGAG@å@åA$A$@å@å9E9E@å@å8Ä8ä9E9E@ä@ä8Ä8äHäHä8Ä8äHäHä8ä8ã@å@å8ã8ä@å@å8ã8äHäHäAEAEbIbIAGAGHäHäHäHä@ä@ã@ä@ãHäHä@ä@ãHäHä8ä8ãHäHä8ä8ãI$I$@å@åbbR -R -8ã8ä@å@å8Ä8äA$A$0Ä0ãAEAE@å@å@å@åAEAEI$I$A&A&I$I$AGAGHäHäQEQEQEQEQEQEQEQEQEQEA&A&IEIEI$I$@å@å9E9E@å@åA&A&IEIEbIbIZJbJ8Ä8äIEIE8å8å8Ä8ä9E9E8Ä8ä8Ä8äAEAEHäHä8ä8ãI$I$8ã8ä@å@åHäHä8ä8ã8ä8ã@ä@ãHäHäQÇQÇR -R -I$I$8ã8äI$I$I$I$8ã8äI$I$I$I$8ã8ä8Ä8äI$I$8Ä8äI$I$AEAEZJbJIEIE8Ä8ä8Ä8äA$A$8Ä8äA$A$8Ä8äIEIE8Ä8äQEQEAEAEI$I$A&A&QEQEA&A&HäHäYEYEAGAGIEIEI$I$A&A&@å@åIEIE@å@å8Ä8ä9E9EA&A&YEYEk-k-YÉYÉA$A$8Ä8ä9E9E8Ä8ä9E9E@å@å8Ä8ä8Ä8äAEAE@ã@äHäHäHäHäHäHä8ä8ãHäHä8ä8ã@ä@ã8ä8ãI$I$ZJbJA&A&HäHäI$I$HäHäA$A#HäHãI$I$8ã8ä8ã8äAEAE@ä@ä8ä8ãHäHäbbIÇIÇ@å@åAEAE8ã8ä@å@å8Ä8äAEAE8Ä8äAEAEI$I$A&A&I$I$QEQEA&A&QEQEQEQEYEYEA&A&QEQEA&A&I$I$A&A&I$I$A&A&8Ä8äIEIE@å@åIEIEbIbIjÍjÍ8Ä8äIEIE0å0å8Ä8äIEIE@ä@äHäHä@ä@äHäHä8ä8ãI$I$8ã8ä@å@åHäHä8ä8ã8ä8ã@ä@ãHäHäQÇQÇR -R -I$I$8ã8äI$I$I$I$8ã8äI$I$I$I$8ã8ä8Ä8äI$I$8Ä8äI$I$AEAEZJbJIEIE8Ä8ä8Ä8äA$A$8Ä8äA$A$8Ä8äIEIE8Ä8äQEQEAEAEI$I$A&A&QEQEA&A&HäHäYEYEAGAGIEIEI$I$A&A&@å@åIEIE@å@å8Ä8ä9E9EA&A&YEYEk-k-YÉYÉA$A$8Ä8ä9E9E8Ä8ä9E9E@å@å8Ä8ä8Ä8äAEAE@ã@äHäHäHäHäHäHä8ä8ãHäHä8ä8ã@ä@ã8ä8ãI$I$ZJbJA&A&HäHäI$I$HäHäA$A#HäHãI$I$8ã8ä8ã8äAEAE@ä@ä8ä8ãHäHäbbIÇIÇ@å@åAEAE8ã8ä@å@å8Ä8äAEAE8Ä8äAEAEI$I$A&A&I$I$QEQEA&A&QEQEQEQEYEYEA&A&QEQEA&A&I$I$A&A&I$I$A&A&8Ä8äIEIE@å@åIEIEbIbIjÍjÍ8Ä8äIEIE0å0å8Ä8äIEIE@ä@äHäHä@ä@äHäHäHäHä8ä8ãHäHä@ä@ã8ä8ã@ä@ãHäHãHäHä@ä@ãY…Y…R‹R‹8ã8äI$I$@å@åHäHäI$I$I$I$8ã8ä@å@åA#A$HäHäA$A$8ä8ãQEQEZJbJ8Ä8äAEAE8Ä8ä8Ä8äA$A$8Ä8äA$A$A$A$9E9E@å@åIEIEQEQE@å@åI$I$QEQEQEQEQEQEA&A&I$I$@å@å@å@åAEAE@å@åAEAE8ã8äIEIEQEQEQEQEjÍjÍI‡I‡8Ä8äA$A$8Ä8ä9E9E@å@å8Ä8ä9E9E8Ä8äHäHä0Ä0ä8ä8ãHäHäHäHä8ä8ã@ä@ãHäHä@ä@ãHäHäI$I$ZJbJAGAGI$I$I$I$HäHäA$A#I$I$HäHäHäHäA$A$@ä@ãHäHäA$A$@ä@ãbbRR8Ä8ä8Ä8ä8Ä8äA$A$8Ä8ä8Ä8äA$A$8Ä8äIEIE@å@åQEQEA&A&I$I$QEQE@ä@äQEQEQEQEHäHäA&A&@å@å@å@åAEAE@å@åA$A$8Ä8äIEIEQEQEbbZÌZÌ8Ä8äA&A&8ã8ä@å@å8Ä8ä8Ä8ä8ä8ã@å@åHäHäHäHä8ä8ãHäHä@ä@ã8ä8ã@ä@ãHäHãHäHä@ä@ãY…Y…R‹R‹8ã8äI$I$@å@åHäHäI$I$I$I$8ã8ä@å@åA#A$HäHäA$A$8ä8ãQEQEZJbJ8Ä8äAEAE8Ä8ä8Ä8äA$A$8Ä8äA$A$A$A$9E9E@å@åIEIEQEQE@å@åI$I$QEQEQEQEQEQEA&A&I$I$@å@å@å@åAEAE@å@åAEAE8ã8äIEIEQEQEQEQEjÍjÍI‡I‡8Ä8äA$A$8Ä8ä9E9E@å@å8Ä8ä9E9E8Ä8äHäHä0Ä0ä8ä8ãHäHäHäHä8ä8ã@ä@ãHäHä@ä@ãHäHäI$I$ZJbJAGAGI$I$I$I$HäHäA$A#I$I$HäHäHäHäA$A$@ä@ãHäHäA$A$@ä@ãbbRR8Ä8ä8Ä8ä8Ä8äA$A$8Ä8ä8Ä8äA$A$8Ä8äIEIE@å@åQEQEA&A&I$I$QEQE@ä@äQEQEQEQEHäHäA&A&@å@å@å@åAEAE@å@åA$A$8Ä8äIEIEQEQEbbZÌZÌ8Ä8äA&A&8ã8ä@å@å8Ä8ä8Ä8ä8ä8ã@å@åHäHä8ä8ã@ä@ã@ä@ãI$I$@ã@äHäHä8ä8ã@ä@ãI$I$QEQEbŒbŒ@å@åI$I$A#A$HäHäI$I$I$I$I$I$I$I$HäHäA$A#HäHäI$I$@å@åRR8Ä8ä8Ä8äI$I$0Ä0ä0Ä0ã9$9$8Ä8ä8Ä8äIEIE@å@åIEIEI$I$QEQEA&A&HäHäI$I$QEQEA&A&I$I$@å@åHäHäHäHäAEAEHäHä8Ä8äQEQEA&A&QEQEjËjËI‡I‡0Ä0ä0Ä0äA$A$8Ä8ä8Ä8ä9$9$8Ä8ä8Ä8äHäHä8ä8ãHäHä8ä8ãI$I$8ã8ä@ã@ä@ã@ä@ã@äHäHäI$I$jŠjŠAÇAÇHãHä@å@åI$I$I$I$HäHäI$I$I$I$HäHäA$A#8ä8ãI$I$HäHäIÇIÇAGAG8ã8äA$A$8Ä8ä0Ä0ä9$9$0Ä0ãAEAE@å@åIEIEI$I$A&A&HäHäQEQE@å@åQEQEHäHäQEQEA&A&HäHäHäHäI$I$8Ä8äIEIE@å@åAEAEI$I$QEQEbbbŒbŒ0Ã0ä8Ä8ä8Ä8ä9$9$0å0åA$A$8ä8ãHäHäHäHä8ä8ã@ä@ã@ä@ãI$I$@ã@äHäHä8ä8ã@ä@ãI$I$QEQEbŒbŒ@å@åI$I$A#A$HäHäI$I$I$I$I$I$I$I$HäHäA$A#HäHäI$I$@å@åRR8Ä8ä8Ä8äI$I$0Ä0ä0Ä0ã9$9$8Ä8ä8Ä8äIEIE@å@åIEIEI$I$QEQEA&A&HäHäI$I$QEQEA&A&I$I$@å@åHäHäHäHäAEAEHäHä8Ä8äQEQEA&A&QEQEjËjËI‡I‡0Ä0ä0Ä0äA$A$8Ä8ä8Ä8ä9$9$8Ä8ä8Ä8äHäHä8ä8ãHäHä8ä8ãI$I$8ã8ä@ã@ä@ã@ä@ã@äHäHäI$I$jŠjŠAÇAÇHãHä@å@åI$I$I$I$HäHäI$I$I$I$HäHäA$A#8ä8ãI$I$HäHäIÇIÇAGAG8ã8äA$A$8Ä8ä0Ä0ä9$9$0Ä0ãAEAE@å@åIEIEI$I$A&A&HäHäQEQE@å@åQEQEHäHäQEQEA&A&HäHäHäHäI$I$8Ä8äIEIE@å@åAEAEI$I$QEQEbbbŒbŒ0Ã0ä8Ä8ä8Ä8ä9$9$0å0åA$A$8ä8ãHäHäHäHä@ä@ã@ä@ãHäHã@ä@ã@ä@ã@ä@ã@ä@ãHäHãHäHäIEIEbŒbŒHäHä@ä@ãI$I$I$I$HãHäI$I$I$I$HäHäI$I$HäHäI$I$8ã8äI$I$I‡I‡A$A$8ä8ã8Ä8äA$A$8ä8ã@å@åAEAEI$I$QEQEI$I$QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEI$I$I$I$QEQEA&A&IEIEQEQEHäHäbŒbŒI‡I‡8ä8ãA$A$(ä(ä8Ä8ä9$9$8Ä8ä9$9$@å@åHäHä@ä@ãHäHäHäHä@ä@ãHäHãHäHä8ä8ãHäHãHäHãHäHäZKbJI‡I‡HäHä@ä@ãI$I$HãHäI$I$I$I$I$I$8ã8äHäHäI$I$HäHäI$I$QEQE9†9†@ä@ä8ä8ã8Ä8äA$A$8ä8ãAEAEHäHäIEIEHäHäYEYEQEQEQEQEYEYEQEQEQEQEQEQEQEQEQEQEQEQEHäHäQEQEIEIEHäHäIEIEQEQEQEQEQEQEYÉYÉZJbJ8Ä8ä8Ä8ä8Ä8ä(ä(ä8Ä8ä8Ä8ä8Ä8äHäHäHäHä@ä@ã@ä@ãHäHã@ä@ã@ä@ã@ä@ã@ä@ãHäHãHäHäIEIEbŒbŒHäHä@ä@ãI$I$I$I$HãHäI$I$I$I$HäHäI$I$HäHäI$I$8ã8äI$I$I‡I‡A$A$8ä8ã8Ä8äA$A$8ä8ã@å@åAEAEI$I$QEQEI$I$QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEI$I$I$I$QEQEA&A&IEIEQEQEHäHäbŒbŒI‡I‡8ä8ãA$A$(ä(ä8Ä8ä9$9$8Ä8ä9$9$@å@åHäHä@ä@ãHäHäHäHä@ä@ãHäHãHäHä8ä8ãHäHãHäHãHäHäZKbJI‡I‡HäHä@ä@ãI$I$HãHäI$I$I$I$I$I$8ã8äHäHäI$I$HäHäI$I$QEQE9†9†@ä@ä8ä8ã8Ä8äA$A$8ä8ãAEAEHäHäIEIEHäHäYEYEQEQEQEQEYEYEQEQEQEQEQEQEQEQEQEQEQEQEHäHäQEQEIEIEHäHäIEIEQEQEQEQEQEQEYÉYÉZJbJ8Ä8ä8Ä8ä8Ä8ä(ä(ä8Ä8ä8Ä8ä8Ä8äHäHäA&A&IEIEA&A&A&A&QEQEA&A&@å@å8Ä8ä@ä@ä8Ä8äAÇAÇbŒbŒYÉYÉAGAGIEIEIEIEQEQEQÇQÇY†Y†IEIEIEIEIEIEA&A&QÇQÇQEQEZJbJRRI‡I‡AGAGIEIE8Ä8äA$A$A&A&I$I$A&A&I$I$HäHä@å@åA&A&A&A&HäHä@å@å@å@åQEQE@å@åHäHäQEQEA&A&A&A&A&A&QEQEA&A&A&A&I‡I‡ZJbJJJ(Ä(Ä(Ä(Ã8Ä8ä0Ä0ã(ä(ä8Ä8ä8Ä8ä@ä@ã8ä8ã@ä@ã@ä@ãHäHãHäHäHäHä8ä8ã@ä@ãHäHäHäHäI$I$RŠRŠbŒbŒA&A&QEQEIEIEAGAGY…Y…QÇQÇQEQEA&A&QEQEAGAGQEQEAGAGZIZIYÉYÉI‡I‡I‡I‡IEIE8Ä8ä8Ä8äQEQEA&A&HäHäIEIEI$I$@å@å@å@åIEIE@å@å@å@å@å@åI$I$A&A&I$I$QEQEA&A&QEQE@å@åA&A&AGAGA&A&A&A&R -R -R‹R‹8æ8æ0æ0æ9E9EAGAG(å(å(ä(ä(ä(ä0æ0æA&A&IEIEA&A&A&A&QEQEA&A&@å@å8Ä8ä@ä@ä8Ä8äAÇAÇbŒbŒYÉYÉAGAGIEIEIEIEQEQEQÇQÇY†Y†IEIEIEIEIEIEA&A&QÇQÇQEQEZJbJRRI‡I‡AGAGIEIE8Ä8äA$A$A&A&I$I$A&A&I$I$HäHä@å@åA&A&A&A&HäHä@å@å@å@åQEQE@å@åHäHäQEQEA&A&A&A&A&A&QEQEA&A&A&A&I‡I‡ZJbJJJ(Ä(Ä(Ä(Ã8Ä8ä0Ä0ã(ä(ä8Ä8ä8Ä8ä@ä@ã8ä8ã@ä@ã@ä@ãHäHãHäHäHäHä8ä8ã@ä@ãHäHäHäHäI$I$RŠRŠbŒbŒA&A&QEQEIEIEAGAGY…Y…QÇQÇQEQEA&A&QEQEAGAGQEQEAGAGZIZIYÉYÉI‡I‡I‡I‡IEIE8Ä8ä8Ä8äQEQEA&A&HäHäIEIEI$I$@å@å@å@åIEIE@å@å@å@å@å@åI$I$A&A&I$I$QEQEA&A&QEQE@å@åA&A&AGAGA&A&A&A&R -R -R‹R‹8æ8æ0æ0æ9E9EAGAG(å(å(ä(ä(ä(ä0æ0æZÌZÌk/k/s/k/jÍjÍ{.{.k/k/rÍjÍR‹R‹R -R -bŒbŒZÌZÌc/c/ƒÐƒÐ{.{.k,k,{.{.ƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÐ{Ï{σЃЃЃЃЃÐ{.{.{Ï{ϓЋÐ{.{.c,c,bŒbŒbŒbŒbŒbŒbŒbŒc,c,jÍjÍrÎjÍc-c-jÎjÍc/c/jÍjÍbŒbŒbŒbŒbŒbŒbŒbŒR‹R‹bŒbŒjÍjÍc/c/{.{.{oƒp{oƒpk.k/k/s/k/k/k/s/k/k/bŒbŒZÌZÌR -R -c/c/k-k-bŒbŒbŒbŒbŒbŒjŠjŠZJbJbŒbŒ{,{,{.{.jËjËjŠjŠZJbJR‹R‹jŠjŠc/c/{.{.ƒÐƒÐk,k,s/k/{.{.ƒÏƒÏ“ЋЃЃЃσσЃÐ{Ï{σσσσσЃÐk/k/ƒÏƒÏƒÐƒÐk,k,ZÌZÌbŒbŒbŒbŒbŒbŒZÌZÌk-k-bŒbŒc/c/c,c,c/c/jÍjÍZÌZÌbŒbŒbŒbŒbŒbŒR‹R‹R‹R‹bŒbŒc/c/k/k/ƒo{pƒo{p{oƒok/k/k/s/k/k/{Ð{Ðk/k/s/k/“ЋÐZÌZÌR‹R‹ZÌZÌZÌZÌZÌZÌk/k/s/k/jÍjÍ{.{.k/k/rÍjÍR‹R‹R -R -bŒbŒZÌZÌc/c/ƒÐƒÐ{.{.k,k,{.{.ƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÐ{Ï{σЃЃЃЃЃÐ{.{.{Ï{ϓЋÐ{.{.c,c,bŒbŒbŒbŒbŒbŒbŒbŒc,c,jÍjÍrÎjÍc-c-jÎjÍc/c/jÍjÍbŒbŒbŒbŒbŒbŒbŒbŒR‹R‹bŒbŒjÍjÍc/c/{.{.{oƒp{oƒpk.k/k/s/k/k/k/s/k/k/bŒbŒZÌZÌR -R -c/c/k-k-bŒbŒbŒbŒbŒbŒjŠjŠZJbJbŒbŒ{,{,{.{.jËjËjŠjŠZJbJR‹R‹jŠjŠc/c/{.{.ƒÐƒÐk,k,s/k/{.{.ƒÏƒÏ“ЋЃЃЃσσЃÐ{Ï{σσσσσЃÐk/k/ƒÏƒÏƒÐƒÐk,k,ZÌZÌbŒbŒbŒbŒbŒbŒZÌZÌk-k-bŒbŒc/c/c,c,c/c/jÍjÍZÌZÌbŒbŒbŒbŒbŒbŒR‹R‹R‹R‹bŒbŒc/c/k/k/ƒo{pƒo{p{oƒok/k/k/s/k/k/{Ð{Ðk/k/s/k/“ЋÐZÌZÌR‹R‹ZÌZÌZÌZÌbbQEQEaÇaÇYÇYÇjIjIƒo{pI†I†QEQEIEIE9E9EAGAGAEAEHäHäA$A$9E9EQEQE9E9EIEIEAGAGQEQEAGAGQEQEA†A†QEQE@å@åA$A$9E9EI†I†AGAGAEAE@å@åAEAEAEAEQEQEjŠjŠk/k/rËjËbŒbŒjŠjŠjËjËrËjËjÍjÍrËjËk-k-rËjËjÍjÍrËjËjËjËc,c,k/k/rIjIbbZIZIQÇQÇbbj‰j‰rIjIj‰j‰rIjIjËjËrËjËjËjËjŠjŠ{,{,jËjËrIjIjIjIjŠjŠ{,{,ZJbJIEIE@å@åIEIEA†A†IEIEIEIEA$A$@å@åA$A$A†A†IEIEIEIEAGAGA†A†I†I†AGAGIEIEI†I†A&A&AEAEHäHä9†9†QEQEIEIE8Ä8äA†A†AEAEQEQEbb{.{.k-k-r‰j‰jËjËrËjËjËjËrÍjÍjËjË{.{.jËjËrÍjÍjËjËrËjË{.{.”2Œ1{,{,bIbIZZZZbbjIjIbIbIjIjIr‰j‰jIjIjŠjŠjŠjŠjŠjŠjIjIbbQEQEaÇaÇYÇYÇjIjIƒo{pI†I†QEQEIEIE9E9EAGAGAEAEHäHäA$A$9E9EQEQE9E9EIEIEAGAGQEQEAGAGQEQEA†A†QEQE@å@åA$A$9E9EI†I†AGAGAEAE@å@åAEAEAEAEQEQEjŠjŠk/k/rËjËbŒbŒjŠjŠjËjËrËjËjÍjÍrËjËk-k-rËjËjÍjÍrËjËjËjËc,c,k/k/rIjIbbZIZIQÇQÇbbj‰j‰rIjIj‰j‰rIjIjËjËrËjËjËjËjŠjŠ{,{,jËjËrIjIjIjIjŠjŠ{,{,ZJbJIEIE@å@åIEIEA†A†IEIEIEIEA$A$@å@åA$A$A†A†IEIEIEIEAGAGA†A†I†I†AGAGIEIEI†I†A&A&AEAEHäHä9†9†QEQEIEIE8Ä8äA†A†AEAEQEQEbb{.{.k-k-r‰j‰jËjËrËjËjËjËrÍjÍjËjË{.{.jËjËrÍjÍjËjËrËjË{.{.”2Œ1{,{,bIbIZZZZbbjIjIbIbIjIjIr‰j‰jIjIjŠjŠjŠjŠjŠjŠjIjIY†Y†@å@åIEIEHäHäbbk-k-QEQE@å@å8Ä8ä8Ä8ä0Ä0ä0Ä0ä0Ä0ä0Ä0ã@å@åIEIE@ä@ä0Ä0äHäHä0Ä0ã8Ä8ä8Ä8ä(ä(ä8Ä8ä8Ä8ä8Ä8ä8ä8ã@å@åAEAEHäHä0Ä0ä0Ä0ãAEAEHäHäjIjIs/k/YÇYÇQEQEQEQEQEQEQEQEQEQEI‡I‡Y†Y†aÇaÇY†Y†I‡I‡a†a†jÍjÍbŒbŒY†Y†A&A&I$I$QEQEHäHäQEQEYEYEYEYEQEQEYEYEYEYEYEYEYEYEYEYEYEYEYEYEYEYEYEYEjjAGAG8Ä8ä8Ä8ä8Ä8ä8Ä8ä0Ä0ã8Ä8ä(ä(ä8Ä8ä8ä8ã@å@åAEAE8ã8ä@ä@ä@ä@ä0Ä0ä@ä@ä0Ä0ã8Ä8ä8Ä8ä8Ä8ä8ä8ã8Ä8äIEIE@å@å8Ä8ä8Ä8ä8Ä8äQEQEYEYEk/k/bbYEYEQEQEQEQEQEQEQEQEYEYEI‡I‡Y†Y†aÇaÇI‡I‡a†a†jIjIƒÒƒÑYÉYÉHäHäI$I$QEQEQEQEHäHäHäHäYEYEHäHäYEYEYEYEYEYEYEYEYEYEY†Y†@å@åIEIEHäHäbbk-k-QEQE@å@å8Ä8ä8Ä8ä0Ä0ä0Ä0ä0Ä0ä0Ä0ã@å@åIEIE@ä@ä0Ä0äHäHä0Ä0ã8Ä8ä8Ä8ä(ä(ä8Ä8ä8Ä8ä8Ä8ä8ä8ã@å@åAEAEHäHä0Ä0ä0Ä0ãAEAEHäHäjIjIs/k/YÇYÇQEQEQEQEQEQEQEQEQEQEI‡I‡Y†Y†aÇaÇY†Y†I‡I‡a†a†jÍjÍbŒbŒY†Y†A&A&I$I$QEQEHäHäQEQEYEYEYEYEQEQEYEYEYEYEYEYEYEYEYEYEYEYEYEYEYEYEYEYEjjAGAG8Ä8ä8Ä8ä8Ä8ä8Ä8ä0Ä0ã8Ä8ä(ä(ä8Ä8ä8ä8ã@å@åAEAE8ã8ä@ä@ä@ä@ä0Ä0ä@ä@ä0Ä0ã8Ä8ä8Ä8ä8Ä8ä8ä8ã8Ä8äIEIE@å@å8Ä8ä8Ä8ä8Ä8äQEQEYEYEk/k/bbYEYEQEQEQEQEQEQEQEQEYEYEI‡I‡Y†Y†aÇaÇI‡I‡a†a†jIjIƒÒƒÑYÉYÉHäHäI$I$QEQEQEQEHäHäHäHäYEYEHäHäYEYEYEYEYEYEYEYEYEYEY†Y†AGAGI$I$A&A&iÇiÇrÍjÍAGAGHäHä0Ä0ä0Ä0ã0Ä0ã(ä(ä0Ä0ä@ä@ä8ä8ã@å@å8ã8ä8ã8ä8Ä8ä(ä(ä8Ä8ä(ä(ä8Ä8ä8Ä8ä1$1$8Ä8ä9$9$@å@åA$A$8Ä8ä8Ä8ä8Ä8ä8Ä8äQEQEjjs/k/I‡I‡QEQEQEQEAGAGYEYEI‡I‡aÇaÇI‡I‡aÇaÇI‡I‡aÇaÇYÉYÉ{,{,bŒbŒY†Y†AGAGQEQEA&A&QEQEQEQE@å@åQEQEQEQEYEYEYEYEY†Y†a†a†Y†Y†Y†Y†YÉYÉa†a†YÉYÉbbI‡I‡@å@åI$I$8Ä8ä8Ä8ä!$!$0Ä0ã(ä(ä8Ä8ä8Ä8äIEIE8Ä8ä0Ä0ä8ä8ã(ä(ä0Ä0ä0Ä0ä8Ä8ä(ä(ä8Ä8ä8Ä8ä9$9$9E9E8Ä8ä@å@å0Ã0ä9$9$8Ä8ä@å@åY†Y†k/k/bbAGAGAGAGQEQEI‡I‡YEYEI‡I‡aÇaÇI‡I‡aÇaÇI‡I‡aÇaÇjŠjŠ{.{.YÉYÉQEQEAGAGQEQEA&A&QEQEQEQEYEYEAGAGYEYEYEYEI‡I‡YEYEY†Y†Y†Y†AGAGI$I$A&A&iÇiÇrÍjÍAGAGHäHä0Ä0ä0Ä0ã0Ä0ã(ä(ä0Ä0ä@ä@ä8ä8ã@å@å8ã8ä8ã8ä8Ä8ä(ä(ä8Ä8ä(ä(ä8Ä8ä8Ä8ä1$1$8Ä8ä9$9$@å@åA$A$8Ä8ä8Ä8ä8Ä8ä8Ä8äQEQEjjs/k/I‡I‡QEQEQEQEAGAGYEYEI‡I‡aÇaÇI‡I‡aÇaÇI‡I‡aÇaÇYÉYÉ{,{,bŒbŒY†Y†AGAGQEQEA&A&QEQEQEQE@å@åQEQEQEQEYEYEYEYEY†Y†a†a†Y†Y†Y†Y†YÉYÉa†a†YÉYÉbbI‡I‡@å@åI$I$8Ä8ä8Ä8ä!$!$0Ä0ã(ä(ä8Ä8ä8Ä8äIEIE8Ä8ä0Ä0ä8ä8ã(ä(ä0Ä0ä0Ä0ä8Ä8ä(ä(ä8Ä8ä8Ä8ä9$9$9E9E8Ä8ä@å@å0Ã0ä9$9$8Ä8ä@å@åY†Y†k/k/bbAGAGAGAGQEQEI‡I‡YEYEI‡I‡aÇaÇI‡I‡aÇaÇI‡I‡aÇaÇjŠjŠ{.{.YÉYÉQEQEAGAGQEQEA&A&QEQEQEQEYEYEAGAGYEYEYEYEI‡I‡YEYEY†Y†Y†Y†A&A&@å@å8Ä8äZZbŒbŒY†Y†8Ä8ä0Ä0ä0Ä0ã(ä(ä0Ä0ã(ä(ä8Ä8ä8Ä8äIEIE8Ä8äA$A$8Ä8ä(ä(ä8Ä8ä8Ä8ä(ä(ä9$9$8Ä8ä9$9$8Ä8ä9E9EA&A&8ã8ä8Ä8ä8Ä8ä9$9$@å@åZZ{.{.YÇYÇaÇaÇI‡I‡YEYEI‡I‡I‡I‡YEYEI‡I‡aÇaÇI‡I‡I‡I‡a†a†{.{.k/k/QEQEQEQEA&A&AEAEA&A&AGAGQEQEI‡I‡A&A&I‡I‡QEQEAGAGaÇaÇYÉYÉaÇaÇYÉYÉYÉYÉYÉYÉjjI‡I‡@å@å8Ä8ä9$9$0Ä0ä0Ä0ã(ä(ä0Ä0ä0Ä0ä8Ä8ä9E9E@å@å8ã8ä@å@å0Ã0ä8Ä8ä(ä(ä8Ä8ä0å0å9$9$8Ä8ä8Ä8ä@å@å9E9E@å@å8ã8ä8Ä8ä9$9$@å@åQEQEk/k/bJZJa†a†Y†Y†I‡I‡A&A&I‡I‡I‡I‡aÇaÇI‡I‡aÇaÇI‡I‡Y†Y†jŠjŠ{oƒpI‡I‡QEQEQEQE@å@å9E9EAGAGAGAGAGAGQEQEY†Y†I‡I‡YEYEI‡I‡aÇaÇY†Y†A&A&@å@å8Ä8äZZbŒbŒY†Y†8Ä8ä0Ä0ä0Ä0ã(ä(ä0Ä0ã(ä(ä8Ä8ä8Ä8äIEIE8Ä8äA$A$8Ä8ä(ä(ä8Ä8ä8Ä8ä(ä(ä9$9$8Ä8ä9$9$8Ä8ä9E9EA&A&8ã8ä8Ä8ä8Ä8ä9$9$@å@åZZ{.{.YÇYÇaÇaÇI‡I‡YEYEI‡I‡I‡I‡YEYEI‡I‡aÇaÇI‡I‡I‡I‡a†a†{.{.k/k/QEQEQEQEA&A&AEAEA&A&AGAGQEQEI‡I‡A&A&I‡I‡QEQEAGAGaÇaÇYÉYÉaÇaÇYÉYÉYÉYÉYÉYÉjjI‡I‡@å@å8Ä8ä9$9$0Ä0ä0Ä0ã(ä(ä0Ä0ä0Ä0ä8Ä8ä9E9E@å@å8ã8ä@å@å0Ã0ä8Ä8ä(ä(ä8Ä8ä0å0å9$9$8Ä8ä8Ä8ä@å@å9E9E@å@å8ã8ä8Ä8ä9$9$@å@åQEQEk/k/bJZJa†a†Y†Y†I‡I‡A&A&I‡I‡I‡I‡aÇaÇI‡I‡aÇaÇI‡I‡Y†Y†jŠjŠ{oƒpI‡I‡QEQEQEQE@å@å9E9EAGAGAGAGAGAGQEQEY†Y†I‡I‡YEYEI‡I‡aÇaÇQÇQÇI‡I‡A&A&@å@åbbk/k/Y†Y†@ä@ä0Ä0ä0Ä0ã(ä(ä(ä(ä8Ä8ä(ä(ä8Ä8ä8Ä8ä8Ä8ä9$9$8Ä8ä(ä(ä8Ä8ä(ä(ä0å0å8Ä8ä(ä(ä8Ä8äA$A$8Ä8äIEIE8Ä8ä8Ä8ä(ä(ä@å@åIEIEYÇYÇk-k-YÇYÇYÉYÉYEYEI‡I‡A&A&I‡I‡I‡I‡aÇaÇI‡I‡I‡I‡aÇaÇYÉYÉjËjËbŒbŒA$A$0æ0æ(ä(ä(ä(ä(ä(ä0æ0æ(ä(ä9E9EA&A&YEYEAGAGa†a†YÉYÉYÉYÉYÉYÉZZYÉYÉQÇQÇZJbJYÉYÉHäHä0Ä0ã(ä(ä0Ä0ä0Ä0ä(ä(ä0Ä0ã(ä(ä8Ä8ä8Ä8ä@å@å8ã8ä8Ä8ä8Ä8ä(ä(ä8Ä8ä(ä(ä8Ä8ä(ä(äA$A$8Ä8ä9$9$9E9E@å@å8Ä8ä8Ä8ä(ä(äIEIEQEQEjÍjÍbbYÉYÉY†Y†I‡I‡YEYEI‡I‡YEYEI‡I‡I‡I‡I‡I‡Y†Y†YÉYÉjIjIƒo{pAFAG9E9E0æ0æ!$!$(ä(ä å å8Ä8ä9E9EA&A&AGAGYÇYÇAGAGA&A&ZZQÇQÇI‡I‡A&A&@å@åbbk/k/Y†Y†@ä@ä0Ä0ä0Ä0ã(ä(ä(ä(ä8Ä8ä(ä(ä8Ä8ä8Ä8ä8Ä8ä9$9$8Ä8ä(ä(ä8Ä8ä(ä(ä0å0å8Ä8ä(ä(ä8Ä8äA$A$8Ä8äIEIE8Ä8ä8Ä8ä(ä(ä@å@åIEIEYÇYÇk-k-YÇYÇYÉYÉYEYEI‡I‡A&A&I‡I‡I‡I‡aÇaÇI‡I‡I‡I‡aÇaÇYÉYÉjËjËbŒbŒA$A$0æ0æ(ä(ä(ä(ä(ä(ä0æ0æ(ä(ä9E9EA&A&YEYEAGAGa†a†YÉYÉYÉYÉYÉYÉZZYÉYÉQÇQÇZJbJYÉYÉHäHä0Ä0ã(ä(ä0Ä0ä0Ä0ä(ä(ä0Ä0ã(ä(ä8Ä8ä8Ä8ä@å@å8ã8ä8Ä8ä8Ä8ä(ä(ä8Ä8ä(ä(ä8Ä8ä(ä(äA$A$8Ä8ä9$9$9E9E@å@å8Ä8ä8Ä8ä(ä(äIEIEQEQEjÍjÍbbYÉYÉY†Y†I‡I‡YEYEI‡I‡YEYEI‡I‡I‡I‡I‡I‡Y†Y†YÉYÉjIjIƒo{pAFAG9E9E0æ0æ!$!$(ä(ä å å8Ä8ä9E9EA&A&AGAGYÇYÇAGAGA&A&ZZYÇYÇAGAGI$I$@å@åZZk/k/QEQEHäHä0Ä0ä0Ä0ä0Ä0ã(ä(ä0Ä0ä0Ä0ä8ä8ã@å@å8ã8ä0Ã0ä8Ä8ä8Ä8ä8ä8ã8Ä8äA$A$8Ä8ä8Ä8äA$A$0Ä0ã8Ä8äA$A$8Ä8ä8Ä8ä8ä8ãHäHäHäHäYÇYÇc,c,jjYÉYÉYÇYÇI‡I‡aÇaÇI‡I‡I‡I‡YÉYÉaÇaÇI‡I‡aÇaÇaÇaÇZJbJZJbJ(ä(ä9E9E0æ0æ å å å å!$!$ å å(ä(ä(ä(ä8Ä8äA&A&AGAGbbYÇYÇYÉYÉYÇYÇYÉYÉYÇYÇZJbJRR@ä@ä ä ã0Ä0ä0Ä0ã ä ä0Ä0ã(ä(ä@ä@ä0Ä0ä8ä8ãHäHä0Ä0äA$A$0Ä0ã8ä8ã8Ä8ä8ä8ã8Ä8äA$A$8Ä8ä0Ä0ã0Ä0ã@å@åI$I$0Ã0ä8ã8ä@å@åHäHäIEIEbŒbŒbIbIiÇiÇYÉYÉI‡I‡I‡I‡I‡I‡I‡I‡YÉYÉaÇaÇYÉYÉI‡I‡aÇaÇbbk/k/9E9E0å0å0æ0æ å å å å å å(å(å å å!$!$0Ä0äA†A†8Ä8ä8Ä8äAÇAÇYÇYÇAGAGI$I$@å@åZZk/k/QEQEHäHä0Ä0ä0Ä0ä0Ä0ã(ä(ä0Ä0ä0Ä0ä8ä8ã@å@å8ã8ä0Ã0ä8Ä8ä8Ä8ä8ä8ã8Ä8äA$A$8Ä8ä8Ä8äA$A$0Ä0ã8Ä8äA$A$8Ä8ä8Ä8ä8ä8ãHäHäHäHäYÇYÇc,c,jjYÉYÉYÇYÇI‡I‡aÇaÇI‡I‡I‡I‡YÉYÉaÇaÇI‡I‡aÇaÇaÇaÇZJbJZJbJ(ä(ä9E9E0æ0æ å å å å!$!$ å å(ä(ä(ä(ä8Ä8äA&A&AGAGbbYÇYÇYÉYÉYÇYÇYÉYÉYÇYÇZJbJRR@ä@ä ä ã0Ä0ä0Ä0ã ä ä0Ä0ã(ä(ä@ä@ä0Ä0ä8ä8ãHäHä0Ä0äA$A$0Ä0ã8ä8ã8Ä8ä8ä8ã8Ä8äA$A$8Ä8ä0Ä0ã0Ä0ã@å@åI$I$0Ã0ä8ã8ä@å@åHäHäIEIEbŒbŒbIbIiÇiÇYÉYÉI‡I‡I‡I‡I‡I‡I‡I‡YÉYÉaÇaÇYÉYÉI‡I‡aÇaÇbbk/k/9E9E0å0å0æ0æ å å å å å å(å(å å å!$!$0Ä0äA†A†8Ä8ä8Ä8äAÇAÇQÇQÇI‡I‡AGAGI†I†ZJbJk/k/R -R -AGAGAGAG9E9E0æ0æ0æ0æ9$9$0å0å(ä(ä0Ä0ã(ä(ä(ä(ä8Ä8ä1†1†(ä(ä8Ä8ä0æ0æ9E9EA†A†8æ8æ0æ0æAGAGAGAGA†A†AGAGAÇAÇI‡I‡I‡I‡R‹R‹bŒbŒI‡I‡AGAGAGAGQÇQÇAGAGI‡I‡Y†Y†I‡I‡AGAGAGAGA&A&QEQE{.{.k/k/(ä(äIEIEAÇAÇA&A&A&A&AGAGQEQEA&A&I†I†IEIEYÉYÉYÇYÇJJZJbJbbZJbJbIbIR -R -{.{.bŒbŒAÇAÇI‡I‡AGAG0æ0æA&A&1†1†(ä(ä0å0å8Ä8ä(ä(ä0Ä0ä!$!$0Ä0ã0æ0æ1$1$0æ0æ(ä(ä9E9EA&A&A&A&0æ0æ9†9†AGAGAGAGAGAGAGAGI‡I‡I‡I‡R -R -ZÌZÌR -R -I‡I‡AGAGQÇQÇY†Y†AGAGI‡I‡Y†Y†AGAGAGAGQEQEA&A&bbƒÒƒÑAGAG9E9EAGAGI‡I‡IEIEA&A&AGAGA†A†QEQEIEIEAGAGI‡I‡AÇAÇI†I†QÇQÇI‡I‡AGAGI†I†ZJbJk/k/R -R -AGAGAGAG9E9E0æ0æ0æ0æ9$9$0å0å(ä(ä0Ä0ã(ä(ä(ä(ä8Ä8ä1†1†(ä(ä8Ä8ä0æ0æ9E9EA†A†8æ8æ0æ0æAGAGAGAGA†A†AGAGAÇAÇI‡I‡I‡I‡R‹R‹bŒbŒI‡I‡AGAGAGAGQÇQÇAGAGI‡I‡Y†Y†I‡I‡AGAGAGAGA&A&QEQE{.{.k/k/(ä(äIEIEAÇAÇA&A&A&A&AGAGQEQEA&A&I†I†IEIEYÉYÉYÇYÇJJZJbJbbZJbJbIbIR -R -{.{.bŒbŒAÇAÇI‡I‡AGAG0æ0æA&A&1†1†(ä(ä0å0å8Ä8ä(ä(ä0Ä0ä!$!$0Ä0ã0æ0æ1$1$0æ0æ(ä(ä9E9EA&A&A&A&0æ0æ9†9†AGAGAGAGAGAGAGAGI‡I‡I‡I‡R -R -ZÌZÌR -R -I‡I‡AGAGQÇQÇY†Y†AGAGI‡I‡Y†Y†AGAGAGAGQEQEA&A&bbƒÒƒÑAGAG9E9EAGAGI‡I‡IEIEA&A&AGAGA†A†QEQEIEIEAGAGI‡I‡AÇAÇI†I†{,{,{,{,jÍjÍrËjËjËjË{.{.jËjËbJZJbŒbŒjŠjŠZJbJR -R -bJZJZIZIZÌZÌk/k/bJZJbŒbŒZIZIZJbJZJbJbŒbŒZIZIbŒbŒR‹R‹bŒbŒjËjËc,c,k/k/{.{.k,k,s/k/jÍjÍc,c,jËjËs-k-jÎjÍRŠRŠbbR -R -R‹R‹ZJbJZJbJR -R -bŒbŒbŒbŒZJbJZÌZ̃ЃÐ{.{.{Ï{Ïc/c/{,{,{.{.jËj˃o{p{.{.ƒÐƒÐ{oƒp{oƒp{o{oƒÐƒÐ{oƒpƒÐƒÐ{oƒp{.{.{.{.{,{,{,{,{,{,k-k-bJZJc,c,jŠjŠZJbJR -R -bbR‹R‹ZJbJc/c/bŒbŒZJbJR‹R‹bbZJbJbŒbŒZJbJRŠRŠbŒbŒRŠRŠk-k-bŒbŒk,k,ƒÐƒÐk-k-c,c,k-k-c,c,jËjËs-k-jËjËbŒbŒZIZIR -R -R -R -R‹R‹ZJbJR -R -R‹R‹bŒbŒZJbJbŒbŒk/k/ƒÐƒÐ{oƒpk/k/c,c,{,{,jÍjÍ{,{,{oƒp{oƒp{o{oƒp{oƒp{o“Ï‹Ï{.{.{oƒp{,{,{,{,jÍjÍrËjËjËjË{.{.jËjËbJZJbŒbŒjŠjŠZJbJR -R -bJZJZIZIZÌZÌk/k/bJZJbŒbŒZIZIZJbJZJbJbŒbŒZIZIbŒbŒR‹R‹bŒbŒjËjËc,c,k/k/{.{.k,k,s/k/jÍjÍc,c,jËjËs-k-jÎjÍRŠRŠbbR -R -R‹R‹ZJbJZJbJR -R -bŒbŒbŒbŒZJbJZÌZ̃ЃÐ{.{.{Ï{Ïc/c/{,{,{.{.jËj˃o{p{.{.ƒÐƒÐ{oƒp{oƒp{o{oƒÐƒÐ{oƒpƒÐƒÐ{oƒp{.{.{.{.{,{,{,{,{,{,k-k-bJZJc,c,jŠjŠZJbJR -R -bbR‹R‹ZJbJc/c/bŒbŒZJbJR‹R‹bbZJbJbŒbŒZJbJRŠRŠbŒbŒRŠRŠk-k-bŒbŒk,k,ƒÐƒÐk-k-c,c,k-k-c,c,jËjËs-k-jËjËbŒbŒZIZIR -R -R -R -R‹R‹ZJbJR -R -R‹R‹bŒbŒZJbJbŒbŒk/k/ƒÐƒÐ{oƒpk/k/c,c,{,{,jÍjÍ{,{,{oƒp{oƒp{o{oƒp{oƒp{o“Ï‹Ï{.{.{oƒp@å@å9E9EI$I$QEQEQEQEQEQE@ä@ä@å@åHäHäA$A$9E9E@å@åIEIEQEQEbbZJbJA†A†YEYEYEYEQEQEQEQEYEYEQEQEQEQEIEIEQEQEIEIEQEQEAÇAÇbŒbŒZZY†Y†AGAGQEQEAGAGI$I$A&A&QEQEA&A&IEIE9E9EAGAGAGAGQEQEQÇQÇQÇQÇYÇYÇI‡I‡QÇQÇI‡I‡QÇQÇQÇQÇI‡I‡QÇQÇYÉYÉQÇQÇYÇYÇbbZJbJY†Y†Y†Y†YÇYÇYEYEAGAGIEIEI$I$QEQE@å@å9E9EI$I$A&A&HäHä8ä8ãA&A&AEAE@å@åAEAEQEQEY†Y†bŒbŒI‡I‡Q…Q…YEYEQEQEQEQEYEYEQEQEYEYEIEIEIEIEQ…Q…IEIEQEQER‹R‹bbQÇQÇAGAGYEYEA&A&QEQEIEIEIEIEIEIE9E9EIEIEA&A&I†I†AGAGY†Y†QÇQÇQÇQÇYÉYÉQÇQÇI†I†QÇQÇQÇQÇYÉYÉI‡I‡YÇYÇQÇQÇYÇYÇYÉYÉjŠjŠbbQEQEAGAG0Ã0ä9E9E@å@å9E9EI$I$QEQEQEQEQEQE@ä@ä@å@åHäHäA$A$9E9E@å@åIEIEQEQEbbZJbJA†A†YEYEYEYEQEQEQEQEYEYEQEQEQEQEIEIEQEQEIEIEQEQEAÇAÇbŒbŒZZY†Y†AGAGQEQEAGAGI$I$A&A&QEQEA&A&IEIE9E9EAGAGAGAGQEQEQÇQÇQÇQÇYÇYÇI‡I‡QÇQÇI‡I‡QÇQÇQÇQÇI‡I‡QÇQÇYÉYÉQÇQÇYÇYÇbbZJbJY†Y†Y†Y†YÇYÇYEYEAGAGIEIEI$I$QEQE@å@å9E9EI$I$A&A&HäHä8ä8ãA&A&AEAE@å@åAEAEQEQEY†Y†bŒbŒI‡I‡Q…Q…YEYEQEQEQEQEYEYEQEQEYEYEIEIEIEIEQ…Q…IEIEQEQER‹R‹bbQÇQÇAGAGYEYEA&A&QEQEIEIEIEIEIEIE9E9EIEIEA&A&I†I†AGAGY†Y†QÇQÇQÇQÇYÉYÉQÇQÇI†I†QÇQÇQÇQÇYÉYÉI‡I‡YÇYÇQÇQÇYÇYÇYÉYÉjŠjŠbbQEQEAGAG0Ã0ä9E9E8Ä8ä@å@å9E9E@å@åA&A&@ä@ä@å@å8Ä8ä9$9$0å0åA&A&8Ä8äQEQEQEQEbbc/c/Y†Y†YEYEa†a†YEYEaÇaÇYEYEYÇYÇY†Y†Y†Y†I†I†AGAGAGAGIÇIÇk-k-YÉYÉQEQEA&A&A&A&QEQEA&A&A&A&@å@åAEAE@å@å9E9EA&A&I$I$A&A&QEQEA&A&QEQEA&A&AGAGAEAEA&A&8Ä8ä0å0åA&A&QEQEAGAGYEYEYÉYÉZZYEYEI‡I‡QEQEA&A&QEQEQEQEA&A&@å@åAEAE@å@å@å@åA$A$8Ä8ä9E9E8Ä8ä@å@åA$A$@å@åQEQEI‡I‡{,{,ZZY†Y†YEYEY†Y†YEYEaÇaÇY†Y†YÇYÇY†Y†I†I†AGAGQÇQÇA&A&bŒbŒZJbJI‡I‡QEQEA&A&A&A&IEIE@å@åA&A&@å@å9E9E@å@å9E9EA&A&QEQEA&A&QEQEA&A&QEQEA&A&QEQEA&A&0å0å0å0å9E9EA&A&AGAGYEYEYEYEbbI‡I‡YEYE@å@å0å0å8Ä8ä8ä8Ä@å@å9E9E@å@åA&A&@ä@ä@å@å8Ä8ä9$9$0å0åA&A&8Ä8äQEQEQEQEbbc/c/Y†Y†YEYEa†a†YEYEaÇaÇYEYEYÇYÇY†Y†Y†Y†I†I†AGAGAGAGIÇIÇk-k-YÉYÉQEQEA&A&A&A&QEQEA&A&A&A&@å@åAEAE@å@å9E9EA&A&I$I$A&A&QEQEA&A&QEQEA&A&AGAGAEAEA&A&8Ä8ä0å0åA&A&QEQEAGAGYEYEYÉYÉZZYEYEI‡I‡QEQEA&A&QEQEQEQEA&A&@å@åAEAE@å@å@å@åA$A$8Ä8ä9E9E8Ä8ä@å@åA$A$@å@åQEQEI‡I‡{,{,ZZY†Y†YEYEY†Y†YEYEaÇaÇY†Y†YÇYÇY†Y†I†I†AGAGQÇQÇA&A&bŒbŒZJbJI‡I‡QEQEA&A&A&A&IEIE@å@åA&A&@å@å9E9E@å@å9E9EA&A&QEQEA&A&QEQEA&A&QEQEA&A&QEQEA&A&0å0å0å0å9E9EA&A&AGAGYEYEYEYEbbI‡I‡YEYE@å@å0å0å8Ä8ä8Ä8ä9E9E8Ä8ä@å@å@å@å9E9E(ä(ä@å@å9E9E8Ä8ä9E9EA&A&@å@åI†I†ZJbJbŒbŒHäHäYEYEYÇYÇY†Y†Y†Y†Y†Y†Y†Y†aÇaÇI‡I‡QÇQÇI‡I‡AÇAÇAGAGbŒbŒbbIEIEA&A&IEIEA&A&8Ä8äIEIE9E9E@å@å@å@å9E9EA&A&IEIEA&A&AGAGQEQEA&A&AGAGQEQEA&A&A&A&@å@å9E9EA&A&A&A&QEQEAGAGa†a†YÉYÉAGAGYEYEAGAGQEQE@å@åA&A&QEQE@å@å@å@åA$A$9E9E8Ä8ä9E9E0å0å@å@å9$9$9E9E@å@åA&A&YÇYÇjÍjÍA&A&YEYEY†Y†aÇaÇY†Y†YEYEa†a†aÇaÇI‡I‡Y†Y†I‡I‡I‡I‡9†9†ZJbJbbAGAGAGAGIEIEA&A&A&A&8Ä8äIEIE@å@å9E9EA&A&A&A&A&A&@å@åQEQEA&A&QEQEA&A&I†I†A&A&A&A&9E9E@å@åA&A&A&A&QEQEAGAGYEYEbbI‡I‡YEYEI‡I‡@å@åA$A$8ä8Ä9E9E8ä8Ä@å@å@å@å9E9E(ä(ä@å@å9E9E8ä8Ä9E9EA&A&@å@åI†I†ZJbJbŒbŒHäHäYEYEYÇYÇY†Y†Y†Y†Y†Y†Y†Y†aÇaÇI‡I‡QÇQÇI‡I‡AÇAÇAGAGbŒbŒbbIEIEA&A&IEIEA&A&8Ä8äIEIE9E9E@å@å@å@å9E9EA&A&IEIEA&A&AGAGQEQEA&A&AGAGQEQEA&A&A&A&@å@å9E9EA&A&A&A&QEQEAGAGa†a†YÉYÉAGAGYEYEAGAGQEQE@å@åA&A&QEQE@å@å@å@åA$A$9E9E8Ä8ä9E9E0å0å@å@å9$9$9E9E@å@åA&A&YÇYÇjÍjÍA&A&YEYEY†Y†aÇaÇY†Y†YEYEa†a†aÇaÇI‡I‡Y†Y†I‡I‡I‡I‡9†9†ZJbJbbAGAGAGAGIEIEA&A&A&A&8Ä8äIEIE@å@å9E9EA&A&A&A&A&A&@å@åQEQEA&A&QEQEA&A&I†I†A&A&A&A&9E9E@å@åA&A&A&A&QEQEAGAGYEYEbbI‡I‡YEYEI‡I‡@å@åA$A$8Ä8ä(ä(ä@å@å9E9E8Ä8ä8Ä8ä(ä(ä9E9E8å8å@å@å9E9E@å@å9E9EA&A&bbZJbJIEIEQEQEa†a†Y†Y†a†a†aÇaÇaÇaÇa†a†aÇaÇAGAGI‡I‡A†A†AÇAÇZJbJYÉYÉIEIEA&A&IEIE@å@åA&A&9E9E8å8åA&A&8Ä8äIEIEA&A&A&A&IEIEA&A&IEIEA&A&QEQEA&A&A&A&9E9E8Ä8ä9E9EA&A&IEIEA&A&YEYEaÇaÇYÉYÉYEYEI‡I‡A&A&YEYEAGAGQEQE8å8åA&A&8Ä8ä8Ä8ä0å0å8Ä8ä(ä(äIEIE0å0å@å@å9E9E@å@å9E9EI‡I‡jÎjÍAGAGQ…Q…YEYEaÇaÇY†Y†aÇaÇaÇaÇa†a†aÇaÇI‡I‡I‡I‡AGAG9$9$R‹R‹bbAGAGQEQEIEIE@å@å9E9E@å@å9E9E@å@å9E9E@å@å9E9EA&A&QEQEA&A&IEIEA&A&A&A&I†I†A&A&@å@å@å@å1$1$A&A&AGAGAEAEQEQEI‡I‡jjI‡I‡I‡I‡I$I$0å0å8Ä8ä8ä8Ä(ä(ä@å@å9E9E8ä8Ä8ä8Ä(ä(ä9E9E8å8å@å@å9E9E@å@å9E9EA&A&bbZJbJIEIEQEQEa†a†Y†Y†a†a†aÇaÇaÇaÇa†a†aÇaÇAGAGI‡I‡A†A†AÇAÇZJbJYÉYÉIEIEA&A&IEIE@å@åA&A&9E9E8å8åA&A&8Ä8äIEIEA&A&A&A&IEIEA&A&IEIEA&A&QEQEA&A&A&A&9E9E8Ä8ä9E9EA&A&IEIEA&A&YEYEaÇaÇYÉYÉYEYEI‡I‡A&A&YEYEAGAGQEQE8å8åA&A&8Ä8ä8Ä8ä0å0å8Ä8ä(ä(äIEIE0å0å@å@å9E9E@å@å9E9EI‡I‡jÎjÍAGAGQ…Q…YEYEaÇaÇY†Y†aÇaÇaÇaÇa†a†aÇaÇI‡I‡I‡I‡AGAG9$9$R‹R‹bbAGAGQEQEIEIE@å@å9E9E@å@å9E9E@å@å9E9E@å@å9E9EA&A&QEQEA&A&IEIEA&A&A&A&I†I†A&A&@å@å@å@å1$1$A&A&AGAGAEAEQEQEI‡I‡jjI‡I‡I‡I‡I$I$0å0å8Ä8ä8Ä8ä9$9$0å0å8Ä8ä0å0å9E9E8Ä8ä0å0å@å@å8Ä8ä9E9E@å@å8Ä8äIEIEYÉYÉZÌZÌY†Y†YÇYÇiÇiÇrjzzzzzzzzYÉYÉY†Y†AGAG9†9†AÇAÇZJbJI‡I‡QEQEA&A&A&A&9E9E@å@å@å@å9E9E@å@å9E9E@å@åA†A†@å@åA&A&IEIEA&A&A&A&AGAGIEIE@å@å0å0å8Ä8ä9$9$A&A&A&A&QEQEA&A&a†a†ZJbJI‡I‡QEQEA&A&A&A&AGAGQEQEA&A&@å@åA$A$8Ä8ä9E9E8Ä8ä0å0å0å0åA$A$0å0åA&A&8Ä8äIEIEAGAGbŒbŒbbY†Y†iÇiÇa†a†zzzzzzzziÇiÇI‡I‡QÇQÇAGAGI‡I‡bŒbŒIÇIÇAGAGAGAGA&A&IEIE@å@å9E9E@å@å@å@å9E9EA&A&A&A&A&A&A&A&QEQE@å@åAGAGIEIEA&A&@å@å9E9E0å0å8Ä8ä9E9EA&A&QEQEA&A&YEYEZJbJYÉYÉQEQE8å8å@ä@ä8Ä8ä8ä8Ä9$9$0å0å8Ä8ä0å0å9E9E8Ä8ä0å0å@å@å8Ä8ä9E9E@å@å8Ä8äIEIEYÉYÉZÌZÌY†Y†YÇYÇiÇiÇrjzzzzzzzzYÉYÉY†Y†AGAG9†9†AÇAÇZJbJI‡I‡QEQEA&A&A&A&9E9E@å@å@å@å9E9E@å@å9E9E@å@åA†A†@å@åA&A&IEIEA&A&A&A&AGAGIEIE@å@å0å0å8Ä8ä9$9$A&A&A&A&QEQEA&A&a†a†ZJbJI‡I‡QEQEA&A&A&A&AGAGQEQEA&A&@å@åA$A$8Ä8ä9E9E8Ä8ä0å0å0å0åA$A$0å0åA&A&8Ä8äIEIEAGAGbŒbŒbbY†Y†iÇiÇa†a†zzzzzzzziÇiÇI‡I‡QÇQÇAGAGI‡I‡bŒbŒIÇIÇAGAGAGAGA&A&IEIE@å@å9E9E@å@å@å@å9E9EA&A&A&A&A&A&A&A&QEQE@å@åAGAGIEIEA&A&@å@å9E9E0å0å8Ä8ä9E9EA&A&QEQEA&A&YEYEZJbJYÉYÉQEQE8å8å@ä@ä8Ä8ä8Ä8ä8Ä8ä8Ä8ä9$9$8Ä8ä8Ä8ä0Ä0ã8Ä8ä8Ä8ä9E9E8Ä8ä9E9EA&A&QEQEYÉYÉbŒbŒAÇAÇI‡I‡AGAGY†Y†YÉYÉjjYÉYÉY†Y†Y†Y†0å0å9E9E@å@åR -R -R -R -QEQEA&A&IEIE@å@å9E9E@å@å8Ä8ä9E9E8Ä8ä9E9EA&A&8Ä8äIEIEIEIEA&A&QEQEA&A&IEIE8Ä8ä9E9E@å@åA$A$9E9EA&A&A&A&QEQEYEYEYÉYÉbŒbŒQEQEQEQEA&A&YEYEA&A&A&A&QEQE@ä@ä8Ä8ä8Ä8äAEAE0Ä0ä8Ä8ä8Ä8ä9E9E8Ä8äA$A$9E9EQEQEI‡I‡ZJbJR -R -QÇQÇAGAGQÇQÇI‡I‡jjYÉYÉaÇaÇI‡I‡QEQE(å(å9E9EI‡I‡R‹R‹Y†Y†IEIEA&A&@å@åA$A$@å@å0å0å9E9E8Ä8ä@å@å9E9E@å@åAEAE@å@åIEIEQEQEIEIE@å@åA&A&9E9E@å@åAEAE8Ä8äA&A&IEIEQEQEA&A&a†a†ZJbJYÉYÉQEQEQEQE8Ä8ä@å@å8ä8Ä8ä8Ä8ä8Ä9$9$8Ä8ä8Ä8ä0Ä0ã8Ä8ä8Ä8ä9E9E8Ä8ä9E9EA&A&QEQEYÉYÉbŒbŒAÇAÇI‡I‡AGAGY†Y†YÉYÉjjYÉYÉY†Y†Y†Y†0å0å9E9E@å@åR -R -R -R -QEQEA&A&IEIE@å@å9E9E@å@å8Ä8ä9E9E8Ä8ä9E9EA&A&8Ä8äIEIEIEIEA&A&QEQEA&A&IEIE8Ä8ä9E9E@å@åA$A$9E9EA&A&A&A&QEQEYEYEYÉYÉbŒbŒQEQEQEQEA&A&YEYEA&A&A&A&QEQE@ä@ä8Ä8ä8Ä8äAEAE0Ä0ä8Ä8ä8Ä8ä9E9E8Ä8äA$A$9E9EQEQEI‡I‡ZJbJR -R -QÇQÇAGAGQÇQÇI‡I‡jjYÉYÉaÇaÇI‡I‡QEQE(å(å9E9EI‡I‡R‹R‹Y†Y†IEIEA&A&@å@åA$A$@å@å0å0å9E9E8Ä8ä@å@å9E9E@å@åAEAE@å@åIEIEQEQEIEIE@å@åA&A&9E9E@å@åAEAE8Ä8äA&A&IEIEQEQEA&A&a†a†ZJbJYÉYÉQEQEQEQE8Ä8ä@å@åAGAGAGAGAÇAÇAÇAÇ9E9EA&A&AÇAÇA†A†AÇAÇAGAG0æ0æAGAGAGAGAGAGR‹R‹ZJbJ å å0Ä0ä ä ä££Ä Ä0æ0æ0æ0æ!$!$AGAGBBR‹R‹R -R -c/c/R‹R‹AGAGAGAG9†9†AGAGAGAG0æ0æ0æ0æ9E9E@å@å8æ8æ0æ0æAÇAÇAGAGAGAGAGAGA&A&A&A&AGAGAGAG@å@åIEIE0å0å8æ8æAGAGI‡I‡YÉYÉI‡I‡YÉYÉjÍjÍbJZJYÉYÉbbR -R -I‡I‡I‡I‡A&A&8æ8æ9E9E0æ0æ(ä(ä(ä(ä(ä(ä(ä(äA&A&0æ0æAGAGA†A†AGAGI‡I‡c.c-AÇAÇ Ä Ä ä ä ä ä Ä Ä(å(å0æ0æ å å0æ0æJJR‹R‹BBBBbŒbŒAGAGAGAGAGAGAGAG9†9†AGAG0å0å@å@å9E9E0æ0æ0å0åAGAGAGAGAGAGAGAGA&A&AGAGA&A&AGAGIEIE0å0å9E9E@å@åA†A†AGAGI‡I‡YÉYÉY†Y†bŒbŒbŒbŒYÉYÉYÉYÉYÉYÉJJAGAGAGAGAÇAÇAÇAÇ9E9EA&A&AÇAÇA†A†AÇAÇAGAG0æ0æAGAGAGAGAGAGR‹R‹ZJbJ å å0Ä0ä ä ä££Ä Ä0æ0æ0æ0æ!$!$AGAGBBR‹R‹R -R -c/c/R‹R‹AGAGAGAG9†9†AGAGAGAG0æ0æ0æ0æ9E9E@å@å8æ8æ0æ0æAÇAÇAGAGAGAGAGAGA&A&A&A&AGAGAGAG@å@åIEIE0å0å8æ8æAGAGI‡I‡YÉYÉI‡I‡YÉYÉjÍjÍbJZJYÉYÉbbR -R -I‡I‡I‡I‡A&A&8æ8æ9E9E0æ0æ(ä(ä(ä(ä(ä(ä(ä(äA&A&0æ0æAGAGA†A†AGAGI‡I‡c.c-AÇAÇ Ä Ä ä ä ä ä Ä Ä(å(å0æ0æ å å0æ0æJJR‹R‹BBBBbŒbŒAGAGAGAGAGAGAGAG9†9†AGAG0å0å@å@å9E9E0æ0æ0å0åAGAGAGAGAGAGAGAGA&A&AGAGA&A&AGAGIEIE0å0å9E9E@å@åA†A†AGAGI‡I‡YÉYÉY†Y†bŒbŒbŒbŒYÉYÉYÉYÉYÉYÉJJk/k/rËjËk/k/rËjËbŒbŒƒÐƒÐk/k/bIbIbŒbŒZIZIR‹R‹ZJbJZJbJc,c,bŒbŒjËjËbJZJR‹R‹ZJbJZJbJR‹R‹bŒbŒk-k-c,c,{oƒp{oƒpk-k-k-s.{,{,{,{,k-k-k.s-k-k-k/s/jËj˓ЋЃo{pc,c,c/c/c,c,k-k-ƒÐƒÐk/k/s-k-jÎjÍs-k-k/k/rËjËc,c,{.{.ƒÒƒÑ{Ð{Ðk/k/{.{.{oƒp{.{.{.{.{.{.{.{.{.{.{.{.{.{.k-k-{.{.k-k-bŒbŒjÍjÍc/c/ZJbJR -R -bJZJR‹R‹R -R -bŒbŒc,c,ZJbJZJbJZÌZÌbŒbŒjËjËbŒbŒZJbJR‹R‹bŒbŒbIbIZÌZÌk-k-rÎjÍk,k,ƒÐƒÐ{.{.{,{,{.{.{.{.k-k-s.k-k-k-s.k-k-k-s/k/ƒÒƒÑk,k,c/c/k-k-bŒbŒ{Ï{σЃÐc,c,k/k/s-k-k.k-s-k-bŒbŒk-k-ƒÐƒÐƒÒƒÑk/k/{.{.ƒÐƒÐ{oƒp{.{.{.{.{.{.{oƒps,{,{.{.k/k/{.{.k/s/jËjËk/s/jËjËbŒbŒƒÐƒÐk/k/bIbIbŒbŒZIZIR‹R‹ZJbJZJbJc,c,bŒbŒjËjËbJZJR‹R‹ZJbJZJbJR‹R‹bŒbŒk-k-c,c,{oƒp{oƒpk-k-k-s.{,{,{,{,k-k-k.s-k-k-k/s/jËj˓ЋЃo{pc,c,c/c/c,c,k-k-ƒÐƒÐk/k/s-k-jÎjÍs-k-k/k/rËjËc,c,{.{.ƒÒƒÑ{Ð{Ðk/k/{.{.{oƒp{.{.{.{.{.{.{.{.{.{.{.{.{.{.k-k-{.{.k-k-bŒbŒjÍjÍc/c/ZJbJR -R -bJZJR‹R‹R -R -bŒbŒc,c,ZJbJZJbJZÌZÌbŒbŒjËjËbŒbŒZJbJR‹R‹bŒbŒbIbIZÌZÌk-k-rÎjÍk,k,ƒÐƒÐ{.{.{,{,{.{.{.{.k-k-s.k-k-k-s.k-k-k-s/k/ƒÒƒÑk,k,c/c/k-k-bŒbŒ{Ï{σЃÐc,c,k/k/s-k-k.k-s-k-bŒbŒk-k-ƒÐƒÐƒÒƒÑk/k/{.{.ƒÐƒÐ{oƒp{.{.{.{.{.{.{oƒps,{,{.{.k/k/{.{.QÇQÇQEQEY†Y†YEYEY†Y†ƒÐƒÐRŠRŠ@å@åIEIEI$I$A&A&@å@åAEAEIEIEIEIEQEQEI†I†AGAGI†I†AGAGQEQEI†I†I†I†I‡I‡Y†Y†I†I†QEQEA&A&IEIEQEQEIEIEIEIEQEQEY†Y†QEQEjËj˓ГÐR -R -QEQEAGAGQEQEAGAGAEAEQEQEIEIEIEIEI†I†QEQEYEYEYÉYɃЃÐjIjIbbYÇYÇQÇQÇYÇYÇYÇYÇY†Y†QÇQÇQEQEAGAGQÇQÇQEQEI‡I‡QÇQÇQEQEjj{.{.QEQEA&A&IEIEQEQEQEQEA&A&IEIE@å@åAEAEQEQEQEQEA&A&QEQEAGAGY†Y†AGAGQEQEAGAGQEQEQÇQÇQÇQÇI†I†QEQEA&A&QEQEA&A&IEIEIEIEQEQEYEYEQÇQÇaÇaǃσÏbŒbŒY†Y†AGAGQEQEAGAGAEAEQEQEIEIEIEIEA&A&QEQEY†Y†Y†Y†jÍjÍ{.{.bbQÇQÇI‡I‡Y†Y†bbY†Y†I‡I‡QEQEI†I†I†I†QEQEY†Y†QÇQÇQEQEY†Y†YEYEY†Y†ƒÐƒÐRŠRŠ@å@åIEIEI$I$A&A&@å@åAEAEIEIEIEIEQEQEI†I†AGAGI†I†AGAGQEQEI†I†I†I†I‡I‡Y†Y†I†I†QEQEA&A&IEIEQEQEIEIEIEIEQEQEY†Y†QEQEjËj˓ГÐR -R -QEQEAGAGQEQEAGAGAEAEQEQEIEIEIEIEI†I†QEQEYEYEYÉYɃЃÐjIjIbbYÇYÇQÇQÇYÇYÇYÇYÇY†Y†QÇQÇQEQEAGAGQÇQÇQEQEI‡I‡QÇQÇQEQEjj{.{.QEQEA&A&IEIEQEQEQEQEA&A&IEIE@å@åAEAEQEQEQEQEA&A&QEQEAGAGY†Y†AGAGQEQEAGAGQEQEQÇQÇQÇQÇI†I†QEQEA&A&QEQEA&A&IEIEIEIEQEQEYEYEQÇQÇaÇaǃσÏbŒbŒY†Y†AGAGQEQEAGAGAEAEQEQEIEIEIEIEA&A&QEQEY†Y†Y†Y†jÍjÍ{.{.bbQÇQÇI‡I‡Y†Y†bbY†Y†I‡I‡QEQEI†I†I†I†QEQEY†Y†QEQEQEQEYEYEAGAGY†Y†jÍjÍbbIEIEA&A&I$I$I$I$IEIEQEQEQEQEA&A&I$I$A&A&QEQEQEQEA&A&I†I†YEYEI‡I‡QEQEAGAGQEQEA&A&QEQE@å@åAEAEI$I$AGAGYEYEY†Y†Y†Y†jŠjŠƒÐƒÐbbAGAGIEIEQEQEQEQEIEIEAGAGQEQEQEQEA&A&YEYEI‡I‡iÇiÇs/k/I‡I‡QEQEQEQEY†Y†A&A&QEQEY†Y†A&A&I†I†QEQEA&A&AGAGA†A†QEQEQEQEjjrÍjÍA&A&HäHäI$I$A&A&I$I$QEQEI$I$A&A&I$I$QEQEA&A&QEQEA&A&IEIEQEQEIEIEA&A&I†I†YEYEA&A&Y†Y†AGAGQEQEIEIEA&A&IEIEI$I$IEIEQEQEY†Y†Y†Y†aÇaǃЃÐk-k-QEQEAGAGI$I$AGAGQEQEQEQEAGAGI$I$AGAGQEQEYEYEYEYEk/k/bJZJIEIEYEYEQEQEYEYEA&A&Y†Y†QEQEA&A&I†I†AGAGQEQEYEYEQEQEQEQEYEYEAGAGY†Y†jÍjÍbbIEIEA&A&I$I$I$I$IEIEQEQEQEQEA&A&I$I$A&A&QEQEQEQEA&A&I†I†YEYEI‡I‡QEQEAGAGQEQEA&A&QEQE@å@åAEAEI$I$AGAGYEYEY†Y†Y†Y†jŠjŠƒÐƒÐbbAGAGIEIEQEQEQEQEIEIEAGAGQEQEQEQEA&A&YEYEI‡I‡iÇiÇs/k/I‡I‡QEQEQEQEY†Y†A&A&QEQEY†Y†A&A&I†I†QEQEA&A&AGAGA†A†QEQEQEQEjjrÍjÍA&A&HäHäI$I$A&A&I$I$QEQEI$I$A&A&I$I$QEQEA&A&QEQEA&A&IEIEQEQEIEIEA&A&I†I†YEYEA&A&Y†Y†AGAGQEQEIEIEA&A&IEIEI$I$IEIEQEQEY†Y†Y†Y†aÇaǃЃÐk-k-QEQEAGAGI$I$AGAGQEQEQEQEAGAGI$I$AGAGQEQEYEYEYEYEk/k/bJZJIEIEYEYEQEQEYEYEA&A&Y†Y†QEQEA&A&I†I†AGAGQEQEYEYEQEQEY†Y†A&A&QEQEYEYEZJbJJJI$I$QEQE@ä@äQEQEHäHäQEQEA&A&I$I$QEQEQEQEA&A&I$I$QEQEA&A&QEQEQEQEQEQEQEQEY†Y†QEQEA&A&IEIEQEQEQEQEYEYEaÇaÇY…Y…QEQEjËj˃o{pI‡I‡QEQEAGAGI$I$A&A&QEQEA&A&QEQEA&A&QEQEAGAGHäHäaÇaǃ҃ÑQÇQÇYEYEQEQEYEYEAGAGQEQEYEYEY†Y†AGAGQEQEA&A&I†I†QEQEA&A&YEYEZJbJZÌZÌQEQEHäHä@å@åI$I$A&A&HãHäQEQEQEQEI$I$A&A&I$I$QEQEI$I$IEIEA&A&I$I$IEIEA&A&QEQEYEYEI†I†YEYEQEQEIEIEA&A&QEQEQEQEQEQEY†Y†Y…Y…QEQEbbƒÐƒÐZJbJQEQEAGAGQEQEA&A&IEIEQEQEA&A&QEQEA&A&QEQEAGAGYEYE{,{,bŒbŒYEYEYEYEY†Y†AGAGQEQEYEYEI†I†QEQEYEYEAGAGQEQEAGAGQEQEY†Y†A&A&QEQEYEYEZJbJJJI$I$QEQE@ä@äQEQEHäHäQEQEA&A&I$I$QEQEQEQEA&A&I$I$QEQEA&A&QEQEQEQEQEQEQEQEY†Y†QEQEA&A&IEIEQEQEQEQEYEYEaÇaÇY…Y…QEQEjËj˃o{pI‡I‡QEQEAGAGI$I$A&A&QEQEA&A&QEQEA&A&QEQEAGAGHäHäaÇaǃ҃ÑQÇQÇYEYEQEQEYEYEAGAGQEQEYEYEY†Y†AGAGQEQEA&A&I†I†QEQEA&A&YEYEZJbJZÌZÌQEQEHäHä@å@åI$I$A&A&HãHäQEQEQEQEI$I$A&A&I$I$QEQEI$I$IEIEA&A&I$I$IEIEA&A&QEQEYEYEI†I†YEYEQEQEIEIEA&A&QEQEQEQEQEQEY†Y†Y…Y…QEQEbbƒÐƒÐZJbJQEQEAGAGQEQEA&A&IEIEQEQEA&A&QEQEA&A&QEQEAGAGYEYE{,{,bŒbŒYEYEYEYEY†Y†AGAGQEQEYEYEI†I†QEQEYEYEAGAGQEQEAGAGQEQEIEIEAGAGQEQEA&A&ZJbJYÉYÉA&A&I$I$I$I$I$I$QEQEQEQEQEQEQEQEQEQE@å@åIEIEI$I$A&A&I$I$QEQEQEQEQEQEY†Y†QEQEQEQEQEQEQEQEYEYEY…Y…aÇaÇY…Y…Y†Y†Y…Y…k-k-ƒp{oI‡I‡QEQEA&A&IEIEA&A&QEQEA&A&AEAEI$I$A&A&QEQEQEQEYÇYÇ{oƒpYÈYÉYEYEYEYEQEQEYEYEY†Y†YEYEQEQEYEYEAGAGQEQEA&A&I†I†AGAGAGAGZZjÍjÍQEQE@ä@ä@ä@äHäHäIEIEI$I$HäHäQEQEQEQEQEQEQEQEA&A&I$I$QEQE@å@åQEQEA&A&QEQEQEQEQEQEYEYEY†Y†QEQEQEQEQEQEQEQEY…Y…aÇaÇYEYEaÇaÇY…Y…bb{Ð{ÐZJbJIEIEIEIEA&A&I$I$A&A&QEQEA&A&IEIEA&A&IEIEQEQEQEQE{,{,bŒbŒYEYEYEYEQEQEYEYEYEYEYEYEYEYEYEYEAGAGQEQEA&A&QEQEQEQEIEIEAGAGQEQEA&A&ZJbJYÉYÉA&A&I$I$I$I$I$I$QEQEQEQEQEQEQEQEQEQE@å@åIEIEI$I$A&A&I$I$QEQEQEQEQEQEY†Y†QEQEQEQEQEQEQEQEYEYEY…Y…aÇaÇY…Y…Y†Y†Y…Y…k-k-ƒp{oI‡I‡QEQEA&A&IEIEA&A&QEQEA&A&AEAEI$I$A&A&QEQEQEQEYÇYÇ{oƒpYÈYÉYEYEYEYEQEQEYEYEY†Y†YEYEQEQEYEYEAGAGQEQEA&A&I†I†AGAGAGAGZZjÍjÍQEQE@ä@ä@ä@äHäHäIEIEI$I$HäHäQEQEQEQEQEQEQEQEA&A&I$I$QEQE@å@åQEQEA&A&QEQEQEQEQEQEYEYEY†Y†QEQEQEQEQEQEQEQEY…Y…aÇaÇYEYEaÇaÇY…Y…bb{Ð{ÐZJbJIEIEIEIEA&A&I$I$A&A&QEQEA&A&IEIEA&A&IEIEQEQEQEQE{,{,bŒbŒYEYEYEYEQEQEYEYEYEYEYEYEYEYEYEYEAGAGQEQEA&A&QEQEIEIEQEQEA&A&QEQEYEYER -R -bbI$I$HäHäI$I$QEQEQEQEHäHäQEQEQEQEHäHäI$I$QEQEQEQEQEQEQEQEQEQEQEQEYEYEY†Y†Y†Y†QEQEY†Y†YEYEY†Y†YEYEY†Y†Y†Y†aÇaÇY…Y…jŠjŠ{Ð{ÐYÉYÉIEIEIEIEA&A&QEQE@å@åIEIEA&A&IEIEA&A&QEQEAGAGa†a†k/k/aÇaÇY…Y…a†a†YEYEQEQEQEQEYEYEY†Y†QEQEQEQEA&A&I†I†YEYEAGAGQEQEZJbJk/k/I$I$@ä@ä@ä@äHäHäI$I$HäHäHäHäQEQEQEQEQEQEHäHäQEQEI$I$QEQEI$I$QEQEQEQEQEQEHäHäYEYEa†a†Y…Y…Y†Y†QEQEY†Y†YEYEY†Y†YEYEaÇaÇY…Y…Y†Y†bbk/k/c,c,QEQEA&A&QEQEA&A&IEIE@å@åIEIEA&A&IEIEA&A&QEQEQEQEjËjËbŒbŒYEYEY…Y…YEYEYEYEY†Y†QEQEYEYEY†Y†QEQEAGAGQEQEA&A&IEIEQEQEA&A&QEQEYEYER -R -bbI$I$HäHäI$I$QEQEQEQEHäHäQEQEQEQEHäHäI$I$QEQEQEQEQEQEQEQEQEQEQEQEYEYEY†Y†Y†Y†QEQEY†Y†YEYEY†Y†YEYEY†Y†Y†Y†aÇaÇY…Y…jŠjŠ{Ð{ÐYÉYÉIEIEIEIEA&A&QEQE@å@åIEIEA&A&IEIEA&A&QEQEAGAGa†a†k/k/aÇaÇY…Y…a†a†YEYEQEQEQEQEYEYEY†Y†QEQEQEQEA&A&I†I†YEYEAGAGQEQEZJbJk/k/I$I$@ä@ä@ä@äHäHäI$I$HäHäHäHäQEQEQEQEQEQEHäHäQEQEI$I$QEQEI$I$QEQEQEQEQEQEHäHäYEYEa†a†Y…Y…Y†Y†QEQEY†Y†YEYEY†Y†YEYEaÇaÇY…Y…Y†Y†bbk/k/c,c,QEQEA&A&QEQEA&A&IEIE@å@åIEIEA&A&IEIEA&A&QEQEQEQEjËjËbŒbŒYEYEY…Y…YEYEYEYEY†Y†QEQEYEYEY†Y†QEQEAGAGQEQEA&A&A&A&I$I$QEQEQEQEYÉYÉjjJJ@å@å@å@å@å@åHäHäIEIEQEQEI$I$QEQEQEQE@å@å@å@åIEIEHäHäQEQEQEQEYEYEYEYEa†a†QEQEQEQEY†Y†QEQEY†Y†QEQEaÇaÇQ…Q…QEQEYEYEZIZIƒÐƒÐRRA&A&QEQEA&A&@å@åIEIEA&A&@å@åQEQEIEIEA&A&QEQEIEIEbŒbŒYÉYÉYEYEYEYEYEYEY†Y†YEYEYEYEY†Y†a†a†QEQEQEQEQEQEA&A&QEQE@å@åZZk/k/QEQE@Ã@Ä@ä@ä@ä@äHäHäI$I$AEAEI$I$QEQEQEQEI$I$QEQE@ä@äI$I$A&A&I$I$QEQEQEQEYEYEYEYEY…Y…Y…Y…QEQEQEQEY†Y†QEQEY†Y†Y…Y…Y†Y†Y…Y…QEQEQÇQÇk-k-rÎjÍHäHäAGAGI$I$A&A&IEIEA&A&A&A&AEAEI$I$AGAGQEQE@å@åZJbJZJbJYEYEYEYEY†Y†YEYEYEYEYEYEY†Y†YEYEY†Y†IEIE@å@åHäHäA&A&I$I$QEQEQEQEYÉYÉjjJJ@å@å@å@å@å@åHäHäIEIEQEQEI$I$QEQEQEQE@å@å@å@åIEIEHäHäQEQEQEQEYEYEYEYEa†a†QEQEQEQEY†Y†QEQEY†Y†QEQEaÇaÇQ…Q…QEQEYEYEZIZIƒÐƒÐRRA&A&QEQEA&A&@å@åIEIEA&A&@å@åQEQEIEIEA&A&QEQEIEIEbŒbŒYÉYÉYEYEYEYEYEYEY†Y†YEYEYEYEY†Y†a†a†QEQEQEQEQEQEA&A&QEQE@å@åZZk/k/QEQE@Ã@Ä@ä@ä@ä@äHäHäI$I$AEAEI$I$QEQEQEQEI$I$QEQE@ä@äI$I$A&A&I$I$QEQEQEQEYEYEYEYEY…Y…Y…Y…QEQEQEQEY†Y†QEQEY†Y†Y…Y…Y†Y†Y…Y…QEQEQÇQÇk-k-rÎjÍHäHäAGAGI$I$A&A&IEIEA&A&A&A&AEAEI$I$AGAGQEQE@å@åZJbJZJbJYEYEYEYEY†Y†YEYEYEYEYEYEY†Y†YEYEY†Y†IEIE@å@åHäHäA&A&I‡I‡I‡I‡I‡I‡ZJbJbŒbŒbŒbŒAGAGAGAGA&A&AGAGA&A&AGAGAGAGJJI‡I‡I‡I‡RRI‡I‡JJYÉYÉI‡I‡YÉYÉRRAGAGRRAGAGI‡I‡I‡I‡I‡I‡YÉYÉZIZIZJbJjŠjŠjÍjÍrÎjÍc,c,ZJbJA&A&AGAGAGAGI‡I‡BBBBI‡I‡BBI‡I‡BBbŒbŒjÍjÍs/k/ZJbJI‡I‡I‡I‡I‡I‡I‡I‡JJI‡I‡YÉYÉJJR -R -R -R -bJZJR -R -bJZJbJZJs.k-ƒÒƒÑbbYÉYÉYÉYÉJJAGAGAGAGA&A&AGAGAGAGAGAGI‡I‡BBI‡I‡I‡I‡JJI‡I‡YÉYÉJJYÉYÉYÉYÉAÇAÇI‡I‡AGAGI‡I‡I‡I‡I‡I‡RRYÉYÉR -R -bJZJrËjË{.{.c,c,jÍjÍAGAGAGAGI‡I‡AGAGAÇAÇBBAGAGI‡I‡BBI‡I‡R -R -rÍjÍk/k/s/k/I‡I‡I‡I‡I‡I‡I‡I‡I‡I‡R -R -I‡I‡R -R -YÉYÉR -R -R -R -JJA&A&I‡I‡I‡I‡I‡I‡ZJbJbŒbŒbŒbŒAGAGAGAGA&A&AGAGA&A&AGAGAGAGJJI‡I‡I‡I‡RRI‡I‡JJYÉYÉI‡I‡YÉYÉRRAGAGRRAGAGI‡I‡I‡I‡I‡I‡YÉYÉZIZIZJbJjŠjŠjÍjÍrÎjÍc,c,ZJbJA&A&AGAGAGAGI‡I‡BBBBI‡I‡BBI‡I‡BBbŒbŒjÍjÍs/k/ZJbJI‡I‡I‡I‡I‡I‡I‡I‡JJI‡I‡YÉYÉJJR -R -R -R -bJZJR -R -bJZJbJZJs.k-ƒÒƒÑbbYÉYÉYÉYÉJJAGAGAGAGA&A&AGAGAGAGAGAGI‡I‡BBI‡I‡I‡I‡JJI‡I‡YÉYÉJJYÉYÉYÉYÉAÇAÇI‡I‡AGAGI‡I‡I‡I‡I‡I‡RRYÉYÉR -R -bJZJrËjË{.{.c,c,jÍjÍAGAGAGAGI‡I‡AGAGAÇAÇBBAGAGI‡I‡BBI‡I‡R -R -rÍjÍk/k/s/k/I‡I‡I‡I‡I‡I‡I‡I‡I‡I‡R -R -I‡I‡R -R -YÉYÉR -R -R -R -JJk/k/ƒÐƒÐ{Ð{Ð{oƒp{oƒpƒÐƒÐ{.{.k/k/s/k/{Ï{Ïk/k/{Ï{Ïk/k/s/k/k-k-rÎjÍbŒbŒk-k-bŒbŒk-k-c,c,bŒbŒk-k-s/k/k/k/c,c,{oƒp{Ð{ЃЃÐk/k/{Ï{Ï{Ï{σЃÐ{oƒpŒ0”0‹Ï“σЃÐ{.{.ƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÐ{oƒpƒÑƒÒƒÑƒÒƒÐƒÐ{oƒp{.{.‹Ð“М“œ“ƒÐƒÐ{oƒp{Ï{Ï{.{.ƒÐƒÐƒÐƒÐƒÒƒÑƒÐƒÐ{Ï{σ҃уЃД“Œ“œ“œ“”“Œ““ЋМ“œ“œ“œ“œ“œ“ƒÏƒÏƒÐƒÐk/k/{Ï{Ïk/k/s/k/{Ï{Ïk/k/s/k/k,k,s/k/jÍjÍc,c,jÍjÍbŒbŒk/k/c,c,bŒbŒbŒbŒk,k,s/k/k/k/{Ï{σЃÐ{oƒp{oƒpsÎ{Ïk/k/ƒÏƒÏƒÏƒÏ“ЋД0Œ0“ЋЃЃÐk/k/{Ï{σЃЃЃÐ{oƒpƒÑƒÒ“ЋЃ҃у҃Ñk/k/ƒÏƒÏ”0Œ0“ЋЃσσЃÐk/k/ƒÐƒÐƒÐƒÐƒÐƒÐ{Ð{ЃЃЃЃÐ{Ï{Ï”“Œ“œ“œ“ƒÐƒÐk/s/ƒÐƒÐ{Ð{Ð{oƒp{oƒpƒÐƒÐ{.{.k/k/s/k/{Ï{Ïk/k/{Ï{Ïk/k/s/k/k-k-rÎjÍbŒbŒk-k-bŒbŒk-k-c,c,bŒbŒk-k-s/k/k/k/c,c,{oƒp{Ð{ЃЃÐk/k/{Ï{Ï{Ï{σЃÐ{oƒpŒ0”0‹Ï“σЃÐ{.{.ƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÐ{oƒpƒÑƒÒƒÑƒÒƒÐƒÐ{oƒp{.{.‹Ð“М“œ“ƒÐƒÐ{oƒp{Ï{Ï{.{.ƒÐƒÐƒÐƒÐƒÒƒÑƒÐƒÐ{Ï{σ҃уЃД“Œ“œ“œ“”“Œ““ЋМ“œ“œ“œ“œ“œ“ƒÏƒÏƒÐƒÐk/k/{Ï{Ïk/k/s/k/{Ï{Ïk/k/s/k/k,k,s/k/jÍjÍc,c,jÍjÍbŒbŒk/k/c,c,bŒbŒbŒbŒk,k,s/k/k/k/{Ï{σЃÐ{oƒp{oƒpsÎ{Ïk/k/ƒÏƒÏƒÏƒÏ“ЋД0Œ0“ЋЃЃÐk/k/{Ï{σЃЃЃÐ{oƒpƒÑƒÒ“ЋЃ҃у҃Ñk/k/ƒÏƒÏ”0Œ0“ЋЃσσЃÐk/k/ƒÐƒÐƒÐƒÐƒÐƒÐ{Ð{ЃЃЃЃÐ{Ï{Ï”“Œ“œ“œ“ƒÐƒÐIEIEAEAEIEIEIEIEA&A&IEIE9E9EQEQE9E9EI†I†QÇQÇbŒbŒAEAEHäHäI$I$IEIEI$I$AEAEHäHäIEIE@å@åI$I$AEAEY…Y…QÇQÇYÉYÉAÇAÇI†I†I‡I‡AGAGA†A†IEIEAGAGA†A†QEQEI‡I‡YÇYÇIÇIÇQÇQÇI†I†QÇQÇY†Y†I‡I‡QÇQÇQEQEI†I†AGAGQEQEI†I†A&A&A†A†I†I†Y†Y†Y†Y†ZJbJR -R -A†A†9$9$9E9E9E9EA&A&A†A†8Ä8äA†A†AEAEAEAEAEAEQEQEAGAGIEIE9E9EQEQEIEIEIEIEAGAGbIbIRR@å@åI$I$IEIEIEIEHäHäIEIEHäHäIEIEHäHäAEAEQEQEbbI‡I‡RRAGAGAÇAÇAGAGA†A†A†A†AGAGA†A†QEQEI‡I‡QÇQÇQÇQÇQÇQÇQÇQÇI†I†QÇQÇY†Y†I‡I‡QÇQÇQEQEAGAGQEQEQÇQÇA&A&A†A†QEQEAGAGQÇQÇbbZJbJAÇAÇ@å@å9E9E9E9E9E9EA&A&9E9EIEIEIEIEAEAEIEIEIEIEA&A&IEIE9E9EQEQE9E9EI†I†QÇQÇbŒbŒAEAEHäHäI$I$IEIEI$I$AEAEHäHäIEIE@å@åI$I$AEAEY…Y…QÇQÇYÉYÉAÇAÇI†I†I‡I‡AGAGA†A†IEIEAGAGA†A†QEQEI‡I‡YÇYÇIÇIÇQÇQÇI†I†QÇQÇY†Y†I‡I‡QÇQÇQEQEI†I†AGAGQEQEI†I†A&A&A†A†I†I†Y†Y†Y†Y†ZJbJR -R -A†A†9$9$9E9E9E9EA&A&A†A†8Ä8äA†A†AEAEAEAEAEAEQEQEAGAGIEIE9E9EQEQEIEIEIEIEAGAGbIbIRR@å@åI$I$IEIEIEIEHäHäIEIEHäHäIEIEHäHäAEAEQEQEbbI‡I‡RRAGAGAÇAÇAGAGA†A†A†A†AGAGA†A†QEQEI‡I‡QÇQÇQÇQÇQÇQÇQÇQÇI†I†QÇQÇY†Y†I‡I‡QÇQÇQEQEAGAGQEQEQÇQÇA&A&A†A†QEQEAGAGQÇQÇbbZJbJAÇAÇ@å@å9E9E9E9E9E9EA&A&9E9EIEIE@å@åHäHä8ä8ã@å@å8ã8ä@å@å8ã8ä@å@åHäHä8ä8ãY†Y†ZJbJHäHäHäHäI$I$8ã8äHäHä@ä@ãHäHä8ä8ã8ä8ãHäHä8ä8ãAEAEYDYDjŠjŠA&A&A&A&8ã8ä8Ä8ä8Ä8ä8Ä8äAEAE@å@åAEAE@å@åHäHäAEAEQEQEQEQEQEQEQEQEQEQEHäHäQEQEIEIEQEQEA&A&I$I$@å@å9E9EA&A&A&A&QEQEk-k-I‡I‡8Ä8äIEIE8å8å8Ä8äIEIE0å0åAEAEHãHäHäHä@ä@ä@ä@ä@ä@ä@ä@ä8ä8ã8Ä8ä8ä8ã8Ä8ä@å@åIEIEbbAGAGI$I$HäHäHäHä8ä8ãHäHä@ä@ãHäHä0Ä0ãHäHä8ä8ãHäHäI$I$ZZR -R -8ã8äAEAE@ä@ä0Ä0ä8ä8ã@å@åAEAE@å@åI$I$8Ä8äQEQEA&A&QEQEQEQEQEQEQEQEHäHäQEQEA&A&IEIEIEIE@å@åAEAE@å@åAEAEIEIE@å@åj‰j‰bJZJ@å@åA$A$@å@å8Ä8ä9E9E@ä@ä@å@å8Ä8ä@å@åHäHä8ä8ã@å@å8ã8ä@å@å8ã8ä@å@åHäHä8ä8ãY†Y†ZJbJHäHäHäHäI$I$8ã8äHäHä@ä@ãHäHä8ä8ã8ä8ãHäHä8ä8ãAEAEYDYDjŠjŠA&A&A&A&8ã8ä8Ä8ä8Ä8ä8Ä8äAEAE@å@åAEAE@å@åHäHäAEAEQEQEQEQEQEQEQEQEQEQEHäHäQEQEIEIEQEQEA&A&I$I$@å@å9E9EA&A&A&A&QEQEk-k-I‡I‡8Ä8äIEIE8å8å8Ä8äIEIE0å0åAEAEHãHäHäHä@ä@ä@ä@ä@ä@ä@ä@ä8ä8ã8Ä8ä8ä8ã8Ä8ä@å@åIEIEbbAGAGI$I$HäHäHäHä8ä8ãHäHä@ä@ãHäHä0Ä0ãHäHä8ä8ãHäHäI$I$ZZR -R -8ã8äAEAE@ä@ä0Ä0ä8ä8ã@å@åAEAE@å@åI$I$8Ä8äQEQEA&A&QEQEQEQEQEQEQEQEHäHäQEQEA&A&IEIEIEIE@å@åAEAE@å@åAEAEIEIE@å@åj‰j‰bJZJ@å@åA$A$@å@å8Ä8ä9E9E@ä@ä@å@å8Ä8äHäHä8ä8ã@å@åHäHäHäHä8ä8ãHäHä8ä8ã@ä@ãHäHäI†I†bb8Ä8äI$I$HäHäI$I$HäHäA$A#HäHä8ä8ãI$I$8ã8ä@å@å@ã@äI$I$ZJbJIEIE8Ä8äAEAE8Ä8äAEAE8Ä8äAEAE@å@åHäHäAEAEIEIEI$I$A&A&I$I$A&A&YEYEQEQEQEQEIEIEA&A&A&A&@å@åQEQE9E9E8Ä8äIEIE@å@åQEQEk-k-YÉYÉ8Ä8äAEAE8Ä8ä9E9E8Ä8äA&A&HäHä@ä@ä@ä@ä8ä8ã@ä@äHäHäHäHä8ä8ãHäHä8ä8ãHäHä8ä8ãI$I$ZJbJAGAG@ã@äI$I$HäHä@ä@ãI$I$I$I$8ã8äA$A$8ä8ãI$I$0Ã0äI$I$ZZRR8Ä8ä@å@å8ã8äIEIE8Ä8ä8Ä8äAEAE@å@åAEAEIEIEI$I$A&A&I$I$A&A&QEQEYEYEYEYEIEIEA&A&I$I$IEIEA&A&AEAE8Ä8äIEIE0å0åQEQEbIbIbŒbŒIEIE@å@å8Ä8ä9E9EA&A&HäHä@ä@ä8ä8ãHäHä8ä8ã@å@åHäHäHäHä8ä8ãHäHä8ä8ã@ä@ãHäHäI†I†bb8Ä8äI$I$HäHäI$I$HäHäA$A#HäHä8ä8ãI$I$8ã8ä@å@å@ã@äI$I$ZJbJIEIE8Ä8äAEAE8Ä8äAEAE8Ä8äAEAE@å@åHäHäAEAEIEIEI$I$A&A&I$I$A&A&YEYEQEQEQEQEIEIEA&A&A&A&@å@åQEQE9E9E8Ä8äIEIE@å@åQEQEk-k-YÉYÉ8Ä8äAEAE8Ä8ä9E9E8Ä8äA&A&HäHä@ä@ä@ä@ä8ä8ã@ä@äHäHäHäHä8ä8ãHäHä8ä8ãHäHä8ä8ãI$I$ZJbJAGAG@ã@äI$I$HäHä@ä@ãI$I$I$I$8ã8äA$A$8ä8ãI$I$0Ã0äI$I$ZZRR8Ä8ä@å@å8ã8äIEIE8Ä8ä8Ä8äAEAE@å@åAEAEIEIEI$I$A&A&I$I$A&A&QEQEYEYEYEYEIEIEA&A&I$I$IEIEA&A&AEAE8Ä8äIEIE0å0åQEQEbIbIbŒbŒIEIE@å@å8Ä8ä9E9EA&A&HäHä@ä@ä8ä8ãHäHäHäHä8ä8ã@ä@ã@ä@ã@ä@ã8ä8ãHäHã@ä@ãHäHäQÇQÇZJbJ8Ä8äI$I$I$I$8ã8äI$I$I$I$HäHäA$A$8ä8ãHäHäA$A$HäHäI$I$ZJbJ9E9E8Ä8äA$A$8Ä8ä8Ä8ä8Ä8äA$A$8Ä8äAEAEHäHäAEAEQEQEA&A&I$I$QEQEHäHäQEQEA&A&QEQE8Ä8ä@å@åI$I$A$A$@å@å8Ä8äIEIEIEIEQEQEjÍjÍIÇIÇ8Ä8ä8Ä8äA$A$@å@å@å@å8Ä8ä8Ä8ä8ä8ã8ä8ãHäHä@ä@ä8ä8ãHäHä8ä8ã@ä@ãHäHä@ä@ãHäHäI$I$ZJbJAGAGI$I$HäHäI$I$I$I$HäHäA$A#HäHä8ä8ãHäHä8ä8ãAEAEHäHäbbI‡I‡8Ä8äA$A$8Ä8ä8Ä8ä9$9$8Ä8äA$A$8Ä8äAEAEI$I$AGAGI$I$A&A&HäHäQEQEI$I$A&A&QEQE@å@å8Ä8äIEIE@ä@ä@å@åA$A$8Ä8äQEQEQEQEbbZÌZÌ8Ä8ä8Ä8äA$A$@å@å8Ä8ä8ä8ã8ä8ã@å@åHäHäHäHä8ä8ã@ä@ã@ä@ã@ä@ã8ä8ãHäHã@ä@ãHäHäQÇQÇZJbJ8Ä8äI$I$I$I$8ã8äI$I$I$I$HäHäA$A$8ä8ãHäHäA$A$HäHäI$I$ZJbJ9E9E8Ä8äA$A$8Ä8ä8Ä8ä8Ä8äA$A$8Ä8äAEAEHäHäAEAEQEQEA&A&I$I$QEQEHäHäQEQEA&A&QEQE8Ä8ä@å@åI$I$A$A$@å@å8Ä8äIEIEIEIEQEQEjÍjÍIÇIÇ8Ä8ä8Ä8äA$A$@å@å@å@å8Ä8ä8Ä8ä8ä8ã8ä8ãHäHä@ä@ä8ä8ãHäHä8ä8ã@ä@ãHäHä@ä@ãHäHäI$I$ZJbJAGAGI$I$HäHäI$I$I$I$HäHäA$A#HäHä8ä8ãHäHä8ä8ãAEAEHäHäbbI‡I‡8Ä8äA$A$8Ä8ä8Ä8ä9$9$8Ä8äA$A$8Ä8äAEAEI$I$AGAGI$I$A&A&HäHäQEQEI$I$A&A&QEQE@å@å8Ä8äIEIE@ä@ä@å@åA$A$8Ä8äQEQEQEQEbbZÌZÌ8Ä8ä8Ä8äA$A$@å@å8Ä8ä8ä8ã8ä8ã@å@åHäHä8ä8ã@ä@ãHäHãI$I$8ã8äHãHäHäHä@ä@ãI$I$QEQEbŒbŒI$I$AEAEHäHäHäHäI$I$I$I$I$I$I$I$8ã8äAEAE@ã@äHäHäI$I$RR@å@å8Ä8äA$A$0Ä0ã9$9$8Ä8ä9$9$8Ä8äAEAEI$I$QEQEA&A&I$I$QEQE@å@åI$I$QEQE@å@åI$I$@å@åI$I$A$A$A&A&AEAEHäHäAEAEQEQEQEQEjËjËI‡I‡8Ä8ä(ä(ä8Ä8ä9E9E8Ä8äA$A$8Ä8äAEAEHäHä8ä8ãHäHäHäHä@ä@ã@ä@ã@ä@ã@ä@ã@ä@ãHäHäI$I$jŠjŠAÇAÇHäHäI$I$8ã8äI$I$I$I$I$I$I$I$AEAEHäHäI$I$HäHäHäHäQÇQÇA†A†8Ä8ä8Ä8äA$A$0Ä0ä0Ä0ãA$A$8Ä8äAEAEI$I$QEQEA&A&HäHäQEQEQEQE@ä@äQEQEQEQE@ä@äQEQE@å@åHäHäAEAEI$I$8Ä8äIEIEIEIEQEQEYÉYÉbŒbŒ0Ä0ä8Ä8ä8Ä8ä9$9$9$9$0å0åHäHä8ä8ãHäHä8ä8ã@ä@ãHäHãI$I$8ã8äHãHäHäHä@ä@ãI$I$QEQEbŒbŒI$I$AEAEHäHäHäHäI$I$I$I$I$I$I$I$8ã8äAEAE@ã@äHäHäI$I$RR@å@å8Ä8äA$A$0Ä0ã9$9$8Ä8ä9$9$8Ä8äAEAEI$I$QEQEA&A&I$I$QEQE@å@åI$I$QEQE@å@åI$I$@å@åI$I$A$A$A&A&AEAEHäHäAEAEQEQEQEQEjËjËI‡I‡8Ä8ä(ä(ä8Ä8ä9E9E8Ä8äA$A$8Ä8äAEAEHäHä8ä8ãHäHäHäHä@ä@ã@ä@ã@ä@ã@ä@ã@ä@ãHäHäI$I$jŠjŠAÇAÇHäHäI$I$8ã8äI$I$I$I$I$I$I$I$AEAEHäHäI$I$HäHäHäHäQÇQÇA†A†8Ä8ä8Ä8äA$A$0Ä0ä0Ä0ãA$A$8Ä8äAEAEI$I$QEQEA&A&HäHäQEQEQEQE@ä@äQEQEQEQE@ä@äQEQE@å@åHäHäAEAEI$I$8Ä8äIEIEIEIEQEQEYÉYÉbŒbŒ0Ä0ä8Ä8ä8Ä8ä9$9$9$9$0å0åHäHä8ä8ãHäHä@ä@ã@ä@ã@ä@ã@ä@ãHäHã8ä8ã@ä@ãHäHã@ä@ãIEIEjŠjŠ8Ä8äHäHäI$I$I$I$@ã@äI$I$I$I$I$I$HäHäI$I$HäHäI$I$I$I$AÇAÇ8Ä8äA$A$8ä8ã8Ä8ä8ä8ãAEAEHäHäIEIEI$I$QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEYEYEQEQEQEQEQEQEHäHäIEIEI$I$QEQEQEQEA&A&HäHäbŒbŒAÇAÇ@ä@ä0Ä0ä8ä8ã8Ä8ä8Ä8ä9$9$8ä8ãHäHä8ä8ãHäHã@ä@ãHäHã@ä@ãHäHã@ä@ã@ä@ã@ä@ãHäHã@ä@ãjŠjŠI‡I‡@ä@äHäHäI$I$@ã@äI$I$I$I$I$I$HäHäHäHäI$I$A$A$A$A#QEQEA&A&8Ä8äA$A$8ä8ã8Ä8äI$I$8Ä8äIEIEI$I$QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEHäHäQEQEHäHäIEIEI$I$QEQEQEQEA&A&YÇYÇZJbJ@ä@ä0Ä0ã8Ä8ä(ä(ä8Ä8ä0Ä0ã8ä8ãHäHäHäHä@ä@ã@ä@ã@ä@ã@ä@ãHäHã8ä8ã@ä@ãHäHã@ä@ãIEIEjŠjŠ8Ä8äHäHäI$I$I$I$@ã@äI$I$I$I$I$I$HäHäI$I$HäHäI$I$I$I$AÇAÇ8Ä8äA$A$8ä8ã8Ä8ä8ä8ãAEAEHäHäIEIEI$I$QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEYEYEQEQEQEQEQEQEHäHäIEIEI$I$QEQEQEQEA&A&HäHäbŒbŒAÇAÇ@ä@ä0Ä0ä8ä8ã8Ä8ä8Ä8ä9$9$8ä8ãHäHä8ä8ãHäHã@ä@ãHäHã@ä@ãHäHã@ä@ã@ä@ã@ä@ãHäHã@ä@ãjŠjŠI‡I‡@ä@äHäHäI$I$@ã@äI$I$I$I$I$I$HäHäHäHäI$I$A$A$A$A#QEQEA&A&8Ä8äA$A$8ä8ã8Ä8äI$I$8Ä8äIEIEI$I$QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEHäHäQEQEHäHäIEIEI$I$QEQEQEQEA&A&YÇYÇZJbJ@ä@ä0Ä0ã8Ä8ä(ä(ä8Ä8ä0Ä0ã8ä8ãHäHäAGAGAGAGY†Y†I‡I‡I‡I‡AGAGAGAGA&A&A&A&A&A&YÉYÉc/c/R -R -QEQEIEIEA&A&IEIEQEQEA&A&AGAG@å@åAEAE8Ä8äIEIEA&A&ZJbJRRAGAGAGAGI†I†@å@å@å@åIEIE@å@åIEIEI$I$A&A&HäHäA&A&A&A&@å@åA&A&HäHäA&A&QEQEA&A&QEQEI‡I‡I‡I‡A&A&I‡I‡I‡I‡AGAGYÉYÉZÌZÌR -R -AGAGAGAGAGAGAGAG1†1†AGAGAGAGI‡I‡AGAGAGAGYEYEAGAGI‡I‡YÉYÉA&A&A&A&A&A&A&A&I†I†bŒbŒbŒbŒI†I†A&A&IEIEQEQEA&A&QEQEA&A&IEIE8Ä8ä9E9EA&A&I$I$YÉYÉR‹R‹A†A†AGAGI†I†A&A&8Ä8äQEQEIEIEA&A&I$I$@å@åQEQE8æ8æA&A&@å@å@å@åA&A&HäHäAGAGQEQEA&A&YEYEI‡I‡AGAGI‡I‡I‡I‡AGAGI‡I‡bŒbŒbŒbŒAGAG1†1†AGAGAGAG9†9†0æ0æAGAGAGAGAGAGAGAGY†Y†I‡I‡I‡I‡AGAGAGAGA&A&A&A&A&A&YÉYÉc/c/R -R -QEQEIEIEA&A&IEIEQEQEA&A&AGAG@å@åAEAE8Ä8äIEIEA&A&ZJbJRRAGAGAGAGI†I†@å@å@å@åIEIE@å@åIEIEI$I$A&A&HäHäA&A&A&A&@å@åA&A&HäHäA&A&QEQEA&A&QEQEI‡I‡I‡I‡A&A&I‡I‡I‡I‡AGAGYÉYÉZÌZÌR -R -AGAGAGAGAGAGAGAG1†1†AGAGAGAGI‡I‡AGAGAGAGYEYEAGAGI‡I‡YÉYÉA&A&A&A&A&A&A&A&I†I†bŒbŒbŒbŒI†I†A&A&IEIEQEQEA&A&QEQEA&A&IEIE8Ä8ä9E9EA&A&I$I$YÉYÉR‹R‹A†A†AGAGI†I†A&A&8Ä8äQEQEIEIEA&A&I$I$@å@åQEQE8æ8æA&A&@å@å@å@åA&A&HäHäAGAGQEQEA&A&YEYEI‡I‡AGAGI‡I‡I‡I‡AGAGI‡I‡bŒbŒbŒbŒAGAG1†1†AGAGAGAG9†9†0æ0æAGAGAGAGc,c,{oƒpk/k/{.{.{oƒp{oƒpc.c/bŒbŒZJbJZÌZÌk/k/{.{.{Ï{Ïk/k/s-k-jËjË{.{.ƒÐƒÐ{Ï{Ï{oƒp{oƒpsm{m{pƒo{oƒpsÏ{Ï{.{.{.{.ƒÏƒÏ{.{.k-k-bJZJc,c,bŒbŒbŒbŒk-k-rÎjÍk/k/s/k/jÍjÍs/k/jÍjÍrÎjÍc/c/bŒbŒbŒbŒbŒbŒbŒbŒc/c/{oƒp{oƒp{o{oƒp{oƒp{o{oƒp{oƒp{o{o{Ð{Ðk/k/ƒÐƒÐƒÒƒÑƒÒƒÑƒÒƒÑƒÒƒÑ{Ð{Ð{oƒpc/c/k/k/s/k/jÍjÍbŒbŒc/c/bŒbŒZJbJZÌZÌjÍjÍs/k/{oƒp{.{.k/k/k-s-k.k-ƒo{p{Ï{Ï{oƒp{.{.ƒÐƒÐ{.{.{oƒp{Ï{Ï{.{.{.{.{oƒp{o{p{.{.jŠjŠZÌZÌbŒbŒbŒbŒbŒbŒk/k/s/k/c/c/k/k/s/k/jÍjÍrÎjÍjÍjÍc/c/bŒbŒbŒbŒbŒbŒc/c/k/k/ƒo{pƒo{p{oƒoƒÒƒÒk.k/ƒo{pk/s/ƒÑƒÒ{Ð{Ðk/k/ƒÒƒÑk/k/c/c/c/c/c/c/c,c,{oƒpk/k/{.{.{oƒp{oƒpc.c/bŒbŒZJbJZÌZÌk/k/{.{.{Ï{Ïk/k/s-k-jËjË{.{.ƒÐƒÐ{Ï{Ï{oƒp{oƒpsm{m{pƒo{oƒpsÏ{Ï{.{.{.{.ƒÏƒÏ{.{.k-k-bJZJc,c,bŒbŒbŒbŒk-k-rÎjÍk/k/s/k/jÍjÍs/k/jÍjÍrÎjÍc/c/bŒbŒbŒbŒbŒbŒbŒbŒc/c/{oƒp{oƒp{o{oƒp{oƒp{o{oƒp{oƒp{o{o{Ð{Ðk/k/ƒÐƒÐƒÒƒÑƒÒƒÑƒÒƒÑƒÒƒÑ{Ð{Ð{oƒpc/c/k/k/s/k/jÍjÍbŒbŒc/c/bŒbŒZJbJZÌZÌjÍjÍs/k/{oƒp{.{.k/k/k-s-k.k-ƒo{p{Ï{Ï{oƒp{.{.ƒÐƒÐ{.{.{oƒp{Ï{Ï{.{.{.{.{oƒp{o{p{.{.jŠjŠZÌZÌbŒbŒbŒbŒbŒbŒk/k/s/k/c/c/k/k/s/k/jÍjÍrÎjÍjÍjÍc/c/bŒbŒbŒbŒbŒbŒc/c/k/k/ƒo{pƒo{p{oƒoƒÒƒÒk.k/ƒo{pk/s/ƒÑƒÒ{Ð{Ðk/k/ƒÒƒÑk/k/c/c/c/c/c/c/YÇYÇYEYEaÇaÇaÇaÇZJbJ{.{.QEQEI$I$IEIE8Ä8äIEIE8Ä8äA$A$8Ä8äAEAEQEQE8Ä8äA†A†IEIEIEIEQEQEIEIEIEIEIEIE8Ä8äAEAE8ã8äI†I†QEQE8Ä8ä9E9EA&A&AEAEQEQEjŠjŠ{.{.bŒbŒj‰j‰jŠjŠbŒbŒjŠjŠjËjËrÍjÍjËjËrÍjÍjËjËbŒbŒjËjËrÍjÍbŒbŒjŠjŠZZYÉYÉbbbbZZbIbIjIjIbIbIjIjIbIbIjIjIbIbIbIbIjjbJZJrjbŒbŒZZ@å@åIEIEHäHäQEQEQEQE@å@åA$A$A$A$8Ä8äAEAEAEAEI$I$A$A$IEIEQEQEA†A†QEQEIEIEIEIEA&A&@å@å8ã8äA†A†IEIEAEAEHäHäA$A$9E9EQEQEYÇYÇ{oƒpbŒbŒj‰j‰jŠjŠjŠjŠjËjËbŒbŒjËjËrËjËjÍjÍrËjËjËjËrËjËjÍjÍ”2”2s.{.bbYÇYÇYÇYÇYÉYÉbbbbj‰j‰rIjIbbj‰j‰bIbIjIjIrIjIYÇYÇYEYEaÇaÇaÇaÇZJbJ{.{.QEQEI$I$IEIE8Ä8äIEIE8Ä8äA$A$8Ä8äAEAEQEQE8Ä8äA†A†IEIEIEIEQEQEIEIEIEIEIEIE8Ä8äAEAE8ã8äI†I†QEQE8Ä8ä9E9EA&A&AEAEQEQEjŠjŠ{.{.bŒbŒj‰j‰jŠjŠbŒbŒjŠjŠjËjËrÍjÍjËjËrÍjÍjËjËbŒbŒjËjËrÍjÍbŒbŒjŠjŠZZYÉYÉbbbbZZbIbIjIjIbIbIjIjIbIbIjIjIbIbIbIbIjjbJZJrjbŒbŒZZ@å@åIEIEHäHäQEQEQEQE@å@åA$A$A$A$8Ä8äAEAEAEAEI$I$A$A$IEIEQEQEA†A†QEQEIEIEIEIEA&A&@å@å8ã8äA†A†IEIEAEAEHäHäA$A$9E9EQEQEYÇYÇ{oƒpbŒbŒj‰j‰jŠjŠjŠjŠjËjËbŒbŒjËjËrËjËjÍjÍrËjËjËjËrËjËjÍjÍ”2”2s.{.bbYÇYÇYÇYÇYÉYÉbbbbj‰j‰rIjIbbj‰j‰bIbIjIjIrIjIY†Y†A&A&@ä@äI$I$YÉYÉjÍjÍQEQE@ä@ä@ä@ä8Ä8ä(ä(ä8Ä8ä(ä(ä8ä8ã@å@åIEIEHäHä0Ä0äHäHä0Ä0ä0Ä0ã8Ä8ä8Ä8ä8Ä8äA$A$8Ä8ä8Ä8ä9E9EA&A&8ã8ä8Ä8ä8Ä8ä@å@åQEQEbb{.{.Y†Y†QEQEA&A&QEQEQEQEYEYEI‡I‡Y†Y†aÇaÇI‡I‡Y†Y†a†a†{.{.c,c,A&A&QEQEHäHäQEQEHäHäQEQEYDYDQEQEHäHäYEYEYEYEYEYEYEYEYEYEI‡I‡YEYEYEYEI‡I‡YÉYÉI$I$QEQEA&A&HäHä0Ä0ä0Ä0ã(ä(ä8Ä8ä8Ä8ä8ä8ã@å@åAEAE@ä@ä0Ä0ä8Ä8ä8Ä8ä8Ä8ä(ä(ä8Ä8ä8ä8ã8Ä8ä8ä8ã8Ä8äQEQE8Ä8ä8Ä8ä8Ä8ä8Ä8äQEQEYEYEk/k/bIbIQEQEQEQEQEQEQEQEQEQEI‡I‡YEYEaÇaÇI‡I‡Y†Y†Y†Y†jŠjŠ{oƒpbbQEQE@å@åQEQEI$I$I$I$QEQEYEYEHäHäYEYEYEYEYEYEYEYEQEQEY†Y†A&A&@ä@äI$I$YÉYÉjÍjÍQEQE@ä@ä@ä@ä8Ä8ä(ä(ä8Ä8ä(ä(ä8ä8ã@å@åIEIEHäHä0Ä0äHäHä0Ä0ä0Ä0ã8Ä8ä8Ä8ä8Ä8äA$A$8Ä8ä8Ä8ä9E9EA&A&8ã8ä8Ä8ä8Ä8ä@å@åQEQEbb{.{.Y†Y†QEQEA&A&QEQEQEQEYEYEI‡I‡Y†Y†aÇaÇI‡I‡Y†Y†a†a†{.{.c,c,A&A&QEQEHäHäQEQEHäHäQEQEYDYDQEQEHäHäYEYEYEYEYEYEYEYEYEYEI‡I‡YEYEYEYEI‡I‡YÉYÉI$I$QEQEA&A&HäHä0Ä0ä0Ä0ã(ä(ä8Ä8ä8Ä8ä8ä8ã@å@åAEAE@ä@ä0Ä0ä8Ä8ä8Ä8ä8Ä8ä(ä(ä8Ä8ä8ä8ã8Ä8ä8ä8ã8Ä8äQEQE8Ä8ä8Ä8ä8Ä8ä8Ä8äQEQEYEYEk/k/bIbIQEQEQEQEQEQEQEQEQEQEI‡I‡YEYEaÇaÇI‡I‡Y†Y†Y†Y†jŠjŠ{oƒpbbQEQE@å@åQEQEI$I$I$I$QEQEYEYEHäHäYEYEYEYEYEYEYEYEQEQEY†Y†AGAGI$I$@å@åbbbŒbŒY†Y†8Ä8ä8Ä8ä0Ä0ã(ä(ä(ä(ä8Ä8ä8Ä8ä8Ä8äAEAE0Ä0ä8ä8ã8Ä8ä(ä(ä0Ä0ä8Ä8ä(ä(ä0å0å8Ä8ä0Ä0ãA$A$0å0åAEAEHäHä0Ä0ã9$9$8Ä8äI$I$jjs/k/QÇQÇYEYEAGAGQEQEI‡I‡aÇaÇAGAGY†Y†YÉYÉY†Y†YÉYÉaÇaÇ{,{,jÍjÍAGAGQEQEQEQEA&A&QEQEQEQE@å@åQEQEYEYEQEQEQEQEYEYEI‡I‡YEYEa†a†Y†Y†QEQEAGAGZZHäHäQEQEI$I$I$I$(ä(ä8Ä8ä0Ä0ã(ä(ä(ä(ä8Ä8äIEIE8Ä8ä0Ä0ã8Ä8ä8Ä8ä(ä(ä8Ä8ä(ä(ä8Ä8ä8Ä8ä9$9$8Ä8ä9$9$9E9E@ä@ä8Ä8ä9$9$8Ä8ä@å@åY†Y†k/k/bbYEYEAGAGA&A&YEYEI‡I‡aÇaÇI‡I‡aÇaÇI‡I‡Y†Y†YÉYÉjIjIƒo{pI‡I‡YEYEA&A&QEQEA&A&AGAGQEQEQEQEQEQEYEYEI‡I‡YEYEYEYEI‡I‡Y†Y†AGAGI$I$@å@åbbbŒbŒY†Y†8Ä8ä8Ä8ä0Ä0ã(ä(ä(ä(ä8Ä8ä8Ä8ä8Ä8äAEAE0Ä0ä8ä8ã8Ä8ä(ä(ä0Ä0ä8Ä8ä(ä(ä0å0å8Ä8ä0Ä0ãA$A$0å0åAEAEHäHä0Ä0ã9$9$8Ä8äI$I$jjs/k/QÇQÇYEYEAGAGQEQEI‡I‡aÇaÇAGAGY†Y†YÉYÉY†Y†YÉYÉaÇaÇ{,{,jÍjÍAGAGQEQEQEQEA&A&QEQEQEQE@å@åQEQEYEYEQEQEQEQEYEYEI‡I‡YEYEa†a†Y†Y†QEQEAGAGZZHäHäQEQEI$I$I$I$(ä(ä8Ä8ä0Ä0ã(ä(ä(ä(ä8Ä8äIEIE8Ä8ä0Ä0ã8Ä8ä8Ä8ä(ä(ä8Ä8ä(ä(ä8Ä8ä8Ä8ä9$9$8Ä8ä9$9$9E9E@ä@ä8Ä8ä9$9$8Ä8ä@å@åY†Y†k/k/bbYEYEAGAGA&A&YEYEI‡I‡aÇaÇI‡I‡aÇaÇI‡I‡Y†Y†YÉYÉjIjIƒo{pI‡I‡YEYEA&A&QEQEA&A&AGAGQEQEQEQEQEQEYEYEI‡I‡YEYEYEYEI‡I‡Y†Y†A&A&@å@å8Ä8äZZk/k/YEYE8Ä8ä8Ä8ä(ä(ä(ä(ä0Ä0ã(ä(ä8Ä8ä8Ä8äIEIE8Ä8ä8Ä8ä8Ä8ä8Ä8ä(ä(ä8Ä8ä(ä(ä9$9$8Ä8ä9$9$8Ä8ä9E9E@å@åHäHä(ä(ä8Ä8ä8Ä8äIEIEbbc/c/YÉYÉY†Y†I‡I‡YEYEI‡I‡AGAGY†Y†aÇaÇI‡I‡aÇaÇI‡I‡aÇaÇ{.{.jÍjÍQEQEQEQE@å@å9E9EA&A&AGAGAGAGAGAGQEQEQEQEAGAGQEQEI‡I‡YÉYÉY†Y†YÉYÉYEYEYÉYÉbb@ä@äQEQEHäHä8Ä8ä(ä(ä8Ä8ä(ä(ä(Ä(Ã8Ä8ä8Ä8äA&A&8ã8ä@å@åA$A$0Ä0ä0Ä0ä(ä(ä8Ä8ä1†1†0Ã0ä8Ä8ä9$9$0å0åIEIE8Ä8ä8Ä8ä(ä(ä8Ä8äIEIEQEQEk/k/bJZJY†Y†I‡I‡YEYEAGAGI‡I‡YEYEI‡I‡aÇaÇI‡I‡YÉYÉYEYEjŠjŠƒÒƒÑI‡I‡YEYEA&A&IEIE9E9EAGAGQEQEA&A&I‡I‡YEYEI‡I‡I‡I‡YEYEI‡I‡Y†Y†A&A&@å@å8Ä8äZZk/k/YEYE8Ä8ä8Ä8ä(ä(ä(ä(ä0Ä0ã(ä(ä8Ä8ä8Ä8äIEIE8Ä8ä8Ä8ä8Ä8ä8Ä8ä(ä(ä8Ä8ä(ä(ä9$9$8Ä8ä9$9$8Ä8ä9E9E@å@åHäHä(ä(ä8Ä8ä8Ä8äIEIEbbc/c/YÉYÉY†Y†I‡I‡YEYEI‡I‡AGAGY†Y†aÇaÇI‡I‡aÇaÇI‡I‡aÇaÇ{.{.jÍjÍQEQEQEQE@å@å9E9EA&A&AGAGAGAGAGAGQEQEQEQEAGAGQEQEI‡I‡YÉYÉY†Y†YÉYÉYEYEYÉYÉbb@ä@äQEQEHäHä8Ä8ä(ä(ä8Ä8ä(ä(ä(Ä(Ã8Ä8ä8Ä8äA&A&8ã8ä@å@åA$A$0Ä0ä0Ä0ä(ä(ä8Ä8ä1†1†0Ã0ä8Ä8ä9$9$0å0åIEIE8Ä8ä8Ä8ä(ä(ä8Ä8äIEIEQEQEk/k/bJZJY†Y†I‡I‡YEYEAGAGI‡I‡YEYEI‡I‡aÇaÇI‡I‡YÉYÉYEYEjŠjŠƒÒƒÑI‡I‡YEYEA&A&IEIE9E9EAGAGQEQEA&A&I‡I‡YEYEI‡I‡I‡I‡YEYEI‡I‡QÇQÇY†Y†@å@å9E9Ejjc/c/YEYE8Ä8ä8Ä8ä(ä(ä(ä(ä(ä(ä8Ä8ä0Ä0ã8Ä8ä8Ä8ä9$9$8Ä8ä9$9$(ä(ä8Ä8ä(ä(ä8Ä8ä1$1$8Ä8ä0å0å8Ä8äA$A$IEIE8Ä8ä8Ä8ä8Ä8äA$A$A&A&YÇYÇjÍjÍqÇiÇI‡I‡aÇaÇI‡I‡AGAGYEYEI‡I‡I‡I‡aÇaÇI‡I‡I‡I‡a†a†jÍjÍbŒbŒA$A$0æ0æ!$!$(ä(ä å å0æ0æ9$9$0å0åA&A&AGAGYEYEAGAGYEYEI‡I‡YÉYÉI‡I‡AGAGZZZJbJHäHäI$I$@å@å@ä@ä0Ä0ã(ä(ä(ä(ä(ä(ä8Ä8ä(ä(ä@å@å8ã8ä8Ä8ä8Ä8ä8Ä8ä(ä(ä0Ä0ã8Ä8ä(ä(ä8Ä8ä8Ä8ä8Ä8ä8Ä8äIEIE8Ä8äA$A$8Ä8ä8Ä8ä9E9EQEQEjÍjÍbbjjI‡I‡I‡I‡YEYEI‡I‡AGAGaÇaÇI‡I‡I‡I‡Y†Y†YÉYÉjjƒo{pAFAG9E9E å å(å(å(ä(ä(å(å0æ0æ9E9E0å0åAGAGbbA&A&AGAGZZQÇQÇY†Y†@å@å9E9Ejjc/c/YEYE8Ä8ä8Ä8ä(ä(ä(ä(ä(ä(ä8Ä8ä0Ä0ã8Ä8ä8Ä8ä9$9$8Ä8ä9$9$(ä(ä8Ä8ä(ä(ä8Ä8ä1$1$8Ä8ä0å0å8Ä8äA$A$IEIE8Ä8ä8Ä8ä8Ä8äA$A$A&A&YÇYÇjÍjÍqÇiÇI‡I‡aÇaÇI‡I‡AGAGYEYEI‡I‡I‡I‡aÇaÇI‡I‡I‡I‡a†a†jÍjÍbŒbŒA$A$0æ0æ!$!$(ä(ä å å0æ0æ9$9$0å0åA&A&AGAGYEYEAGAGYEYEI‡I‡YÉYÉI‡I‡AGAGZZZJbJHäHäI$I$@å@å@ä@ä0Ä0ã(ä(ä(ä(ä(ä(ä8Ä8ä(ä(ä@å@å8ã8ä8Ä8ä8Ä8ä8Ä8ä(ä(ä0Ä0ã8Ä8ä(ä(ä8Ä8ä8Ä8ä8Ä8ä8Ä8äIEIE8Ä8äA$A$8Ä8ä8Ä8ä9E9EQEQEjÍjÍbbjjI‡I‡I‡I‡YEYEI‡I‡AGAGaÇaÇI‡I‡I‡I‡Y†Y†YÉYÉjjƒo{pAFAG9E9E å å(å(å(ä(ä(å(å0æ0æ9E9E0å0åAGAGbbA&A&AGAGZZQÇQÇI‡I‡A&A&HãHäbbc/c/YEYE@ä@ä@ä@ä0Ä0ã(ä(ä(Ä(Ã0Ä0ä0Ä0ä8ä8ã@å@å0Ã0ä8ã8ä8Ä8ä8ä8ã8Ä8ä8ä8ã8Ä8ä8Ä8äA$A$8ä8ã0Ä0ä8ä8ã@å@åHäHä0Ä0ã8ä8ã8ä8ãI$I$YÉYÉbŒbŒaÇaÇbbI‡I‡I‡I‡aÇaÇI‡I‡I‡I‡YÉYÉaÇaÇI‡I‡YÉYÉY†Y†jŠjŠR -R -(ä(ä9E9E8æ8æ å å å å!$!$(å(å!$!$(ä(ä8Ä8äA&A&A†A†AGAGY†Y†I†I†I‡I‡YÇYÇbbR -R -0Ä0äHäHä8Ä8à ä ã(Ä(Ã0Ä0ã(Ä(Ä(Ä(Ã@ä@ä0Ä0ä8ä8ãHäHä1$1$8ä8ã0Ä0ã8Ä8ä8ä8ã8Ä8ä8ä8ã@å@åA$A$0Ä0ã0Ä0ã@å@åI$I$0Ã0ä0Ã0ä8ã8äI$I$QEQEbŒbŒbIbIYÉYÉiÇiÇI‡I‡I‡I‡I‡I‡YÉYÉI‡I‡aÇaÇI‡I‡YÉYÉaÇaÇbb{oƒp0æ0æ0å0å0æ0æ(å(å å å å å!$!$ å å ä ä0Ä0äA†A†8Ä8ä8Ä8äAGAGQÇQÇI‡I‡A&A&HãHäbbc/c/YEYE@ä@ä@ä@ä0Ä0ã(ä(ä(Ä(Ã0Ä0ä0Ä0ä8ä8ã@å@å0Ã0ä8ã8ä8Ä8ä8ä8ã8Ä8ä8ä8ã8Ä8ä8Ä8äA$A$8ä8ã0Ä0ä8ä8ã@å@åHäHä0Ä0ã8ä8ã8ä8ãI$I$YÉYÉbŒbŒaÇaÇbbI‡I‡I‡I‡aÇaÇI‡I‡I‡I‡YÉYÉaÇaÇI‡I‡YÉYÉY†Y†jŠjŠR -R -(ä(ä9E9E8æ8æ å å å å!$!$(å(å!$!$(ä(ä8Ä8äA&A&A†A†AGAGY†Y†I†I†I‡I‡YÇYÇbbR -R -0Ä0äHäHä8Ä8à ä ã(Ä(Ã0Ä0ã(Ä(Ä(Ä(Ã@ä@ä0Ä0ä8ä8ãHäHä1$1$8ä8ã0Ä0ã8Ä8ä8ä8ã8Ä8ä8ä8ã@å@åA$A$0Ä0ã0Ä0ã@å@åI$I$0Ã0ä0Ã0ä8ã8äI$I$QEQEbŒbŒbIbIYÉYÉiÇiÇI‡I‡I‡I‡I‡I‡YÉYÉI‡I‡aÇaÇI‡I‡YÉYÉaÇaÇbb{oƒp0æ0æ0å0å0æ0æ(å(å å å å å!$!$ å å ä ä0Ä0äA†A†8Ä8ä8Ä8äAGAGQÇQÇI‡I‡AGAGI‡I‡ZJbJc/c/ZJbJI‡I‡AGAGAGAG0æ0æ9E9E8æ8æ9E9E(ä(ä8Ä8ä(ä(ä(ä(ä1†1†0å0å9E9E0æ0æ9$9$9†9†AGAG0æ0æ0æ0æI‡I‡AGAGAÇAÇAGAGI‡I‡JJI‡I‡bŒbŒbŒbŒJJI‡I‡I†I†I‡I‡AGAGQÇQÇAGAGAGAGAGAGI†I†A&A&AGAG{oƒp{.{.0æ0æ9†9†AGAGI†I†AGAGAGAGAGAGAGAGQEQEI†I†ZZbbI‡I‡R -R -bJZJbbZJbJk/k/ƒo{pR -R -JJBBI‡I‡0æ0æAGAG0æ0æ0æ0æ9E9E(å(å8Ä8ä(ä(ä(ä(ä(ä(ä9E9E0å0å0å0å9E9E0æ0æAGAGA†A†8æ8æ9†9†AGAGAGAGAÇAÇAGAGR -R -I‡I‡R -R -ZÌZÌR -R -AGAGAGAGQÇQÇI‡I‡I‡I‡YEYEI‡I‡I‡I‡I‡I‡A&A&A&A&bbƒÒƒÑAÇAÇ9E9EAÇAÇI‡I‡AGAGQEQEA&A&AGAGY†Y†AGAGI†I†I‡I‡AÇAÇI‡I‡QÇQÇI‡I‡AGAGI‡I‡ZJbJc/c/ZJbJI‡I‡AGAGAGAG0æ0æ9E9E8æ8æ9E9E(ä(ä8Ä8ä(ä(ä(ä(ä1†1†0å0å9E9E0æ0æ9$9$9†9†AGAG0æ0æ0æ0æI‡I‡AGAGAÇAÇAGAGI‡I‡JJI‡I‡bŒbŒbŒbŒJJI‡I‡I†I†I‡I‡AGAGQÇQÇAGAGAGAGAGAGI†I†A&A&AGAG{oƒp{.{.0æ0æ9†9†AGAGI†I†AGAGAGAGAGAGAGAGQEQEI†I†ZZbbI‡I‡R -R -bJZJbbZJbJk/k/ƒo{pR -R -JJBBI‡I‡0æ0æAGAG0æ0æ0æ0æ9E9E(å(å8Ä8ä(ä(ä(ä(ä(ä(ä9E9E0å0å0å0å9E9E0æ0æAGAGA†A†8æ8æ9†9†AGAGAGAGAÇAÇAGAGR -R -I‡I‡R -R -ZÌZÌR -R -AGAGAGAGQÇQÇI‡I‡I‡I‡YEYEI‡I‡I‡I‡I‡I‡A&A&A&A&bbƒÒƒÑAÇAÇ9E9EAÇAÇI‡I‡AGAGQEQEA&A&AGAGY†Y†AGAGI†I†I‡I‡AÇAÇI‡I‡{,{,{,{,jÍjÍjŠjŠjÍjÍ{,{,bŒbŒbbZÌZÌZJbJZJbJR -R -ZIZIZJbJZJbJk/k/ZÌZÌZJbJZJbJbbZJbJRŠRŠbŒbŒjŠjŠZJbJbŒbŒc,c,jËjËs/k/{oƒpk-k-c,c,jÍjÍbŒbŒc,c,jËjËc,c,ZJbJZJbJRRZJbJZJbJZJbJR‹R‹bŒbŒbŒbŒbŒbŒjËjË{.{.{Ï{Ï{.{.{.{.{.{.{,{,{,{,{,{,{oƒp‹Ï“Ï{oƒp{o{oƒp{o“ЋЃЃÐk-k-ƒp{o{,{,jÍjÍ{,{,{,{,{.{.jÍjÍR -R -bJZJbŒbŒRŠRŠbIbIZIZIR‹R‹ZJbJk.k-ZÌZÌbŒbŒZJbJbbbŒbŒZJbJZJbJRŠRŠjŠjŠZJbJZÌZÌk-k-s.k-k/k/ƒo{pc,c,bŒbŒk-k-bŒbŒjËjËs-k-jŠjŠR‹R‹YÉYÉR -R -R‹R‹ZJbJZJbJZJbJZJbJZÌZÌbŒbŒk/k/ƒo{p{Ï{Ï{.{.k/k/{,{,jËjË{.{.{oƒp{oƒp{o{oƒp{oƒp{o“Ï‹Ï{oƒp{.{.{,{,{,{,jÍjÍjŠjŠjÍjÍ{,{,bŒbŒbbZÌZÌZJbJZJbJR -R -ZIZIZJbJZJbJk/k/ZÌZÌZJbJZJbJbbZJbJRŠRŠbŒbŒjŠjŠZJbJbŒbŒc,c,jËjËs/k/{oƒpk-k-c,c,jÍjÍbŒbŒc,c,jËjËc,c,ZJbJZJbJRRZJbJZJbJZJbJR‹R‹bŒbŒbŒbŒbŒbŒjËjË{.{.{Ï{Ï{.{.{.{.{.{.{,{,{,{,{,{,{oƒp‹Ï“Ï{oƒp{o{oƒp{o“ЋЃЃÐk-k-ƒp{o{,{,jÍjÍ{,{,{,{,{.{.jÍjÍR -R -bJZJbŒbŒRŠRŠbIbIZIZIR‹R‹ZJbJk.k-ZÌZÌbŒbŒZJbJbbbŒbŒZJbJZJbJRŠRŠjŠjŠZJbJZÌZÌk-k-s.k-k/k/ƒo{pc,c,bŒbŒk-k-bŒbŒjËjËs-k-jŠjŠR‹R‹YÉYÉR -R -R‹R‹ZJbJZJbJZJbJZJbJZÌZÌbŒbŒk/k/ƒo{p{Ï{Ï{.{.k/k/{,{,jËjË{.{.{oƒp{oƒp{o{oƒp{oƒp{o“Ï‹Ï{oƒp{.{.8Ä8äA&A&HäHäQEQEHäHäQEQE@å@å8Ä8äAEAE@å@åAEAEHäHäAEAEQEQEbbR‹R‹QEQEY†Y†QEQEYEYEYEYEQEQEQEQEQEQEAEAEIEIEQEQEAEAEI‡I‡bŒbŒbbAGAGQEQEI†I†AGAGI$I$A&A&I$I$A&A&IEIE@å@åA†A†AGAGQEQEY†Y†I‡I‡QÇQÇY†Y†I‡I‡QÇQÇI†I†YÇYÇI‡I‡I‡I‡QÇQÇYÇYÇaÇaÇYÉYÉZJbJQÇQÇYEYEQÇQÇQEQEAGAGQEQEHäHäYEYEI$I$QEQEQEQEA&A&HäHä8Ä8äAEAE@å@åAEAE@å@åQEQEY†Y†bŒbŒQÇQÇIEIEYEYEQEQEQEQEYEYEQEQEYEYEIEIEIEIEIEIEIEIEQEQER‹R‹bIbII‡I‡YEYEI†I†AGAGI$I$A&A&QEQEA&A&AEAEAEAEIEIEA&A&I†I†AGAGQÇQÇY†Y†QÇQÇI‡I‡I†I†Y†Y†I‡I‡I‡I‡I‡I‡QÇQÇYÇYÇaÇaÇI‡I‡bŒbŒaÇaÇQEQEIEIE8Ä8ä9$9$8ä8ÄA&A&HäHäQEQEHäHäQEQE@å@å8Ä8äAEAE@å@åAEAEHäHäAEAEQEQEbbR‹R‹QEQEY†Y†QEQEYEYEYEYEQEQEQEQEQEQEAEAEIEIEQEQEAEAEI‡I‡bŒbŒbbAGAGQEQEI†I†AGAGI$I$A&A&I$I$A&A&IEIE@å@åA†A†AGAGQEQEY†Y†I‡I‡QÇQÇY†Y†I‡I‡QÇQÇI†I†YÇYÇI‡I‡I‡I‡QÇQÇYÇYÇaÇaÇYÉYÉZJbJQÇQÇYEYEQÇQÇQEQEAGAGQEQEHäHäYEYEI$I$QEQEQEQEA&A&HäHä8Ä8äAEAE@å@åAEAE@å@åQEQEY†Y†bŒbŒQÇQÇIEIEYEYEQEQEQEQEYEYEQEQEYEYEIEIEIEIEIEIEIEIEQEQER‹R‹bIbII‡I‡YEYEI†I†AGAGI$I$A&A&QEQEA&A&AEAEAEAEIEIEA&A&I†I†AGAGQÇQÇY†Y†QÇQÇI‡I‡I†I†Y†Y†I‡I‡I‡I‡I‡I‡QÇQÇYÇYÇaÇaÇI‡I‡bŒbŒaÇaÇQEQEIEIE8Ä8ä9$9$8Ä8ä9E9EA&A&@å@åAEAE@å@å8Ä8äAEAE8Ä8ä8Ä8ä9E9E8Ä8äQEQEA&A&jjrÍjÍI‡I‡YEYEYEYEY†Y†I‡I‡YEYEa†a†YÇYÇI†I†I‡I‡Y†Y†AGAGAÇAÇk-k-YÇYÇAGAGAGAG@å@åQEQE@å@åIEIEA&A&@å@å9E9E@å@åA&A&IEIEIEIEA&A&QEQEA&A&AGAGQEQE@å@åA&A&9E9EIEIEA&A&A&A&AGAGYEYEaÇaÇYÉYÉQEQEY†Y†A&A&AGAGQEQEQEQEQEQE@å@å@å@åA&A&@ä@ä8Ä8ä@å@å9$9$0å0å8Ä8äIEIE8Ä8äI†I†Y†Y†jÍjÍZZYEYEa†a†YEYEY†Y†Y†Y†Y†Y†YÇYÇY†Y†AGAGQÇQÇI†I†A&A&ZÌZÌjIjII‡I‡AGAG@å@åIEIEA&A&A&A&@å@åAEAE@å@å8Ä8äIEIEA&A&A&A&QEQEA&A&QEQEA&A&AGAGQEQEA&A&0å0å8Ä8ä9E9EA&A&A&A&YEYEY†Y†bbI‡I‡YEYE@å@å0å0å8Ä8ä8ä8Ä9E9EA&A&@å@åAEAE@å@å8Ä8äAEAE8Ä8ä8Ä8ä9E9E8Ä8äQEQEA&A&jjrÍjÍI‡I‡YEYEYEYEY†Y†I‡I‡YEYEa†a†YÇYÇI†I†I‡I‡Y†Y†AGAGAÇAÇk-k-YÇYÇAGAGAGAG@å@åQEQE@å@åIEIEA&A&@å@å9E9E@å@åA&A&IEIEIEIEA&A&QEQEA&A&AGAGQEQE@å@åA&A&9E9EIEIEA&A&A&A&AGAGYEYEaÇaÇYÉYÉQEQEY†Y†A&A&AGAGQEQEQEQEQEQE@å@å@å@åA&A&@ä@ä8Ä8ä@å@å9$9$0å0å8Ä8äIEIE8Ä8äI†I†Y†Y†jÍjÍZZYEYEa†a†YEYEY†Y†Y†Y†Y†Y†YÇYÇY†Y†AGAGQÇQÇI†I†A&A&ZÌZÌjIjII‡I‡AGAG@å@åIEIEA&A&A&A&@å@åAEAE@å@å8Ä8äIEIEA&A&A&A&QEQEA&A&QEQEA&A&AGAGQEQEA&A&0å0å8Ä8ä9E9EA&A&A&A&YEYEY†Y†bbI‡I‡YEYE@å@å0å0å8Ä8ä8Ä8ä8Ä8äA$A$@å@å9$9$@å@å(ä(ä9E9E@å@å8Ä8ä9E9EA&A&A&A&QEQEZJbJZJbJAEAEYEYEa†a†Y†Y†a†a†a†a†aÇaÇaÇaÇI‡I‡Y†Y†AÇAÇAGAGAÇAÇbŒbŒZZQEQEA&A&IEIE@å@å9E9E@å@å9E9E@å@å9E9EA&A&9E9EA&A&QEQEA&A&IEIEA&A&AGAGQEQE@å@åA†A†A&A&A&A&A&A&IEIEA&A&YEYEYÉYÉI‡I‡Y†Y†YEYEI‡I‡QEQEAGAGQEQEA&A&A&A&8Ä8ä8Ä8äIEIE(ä(ä0å0åIEIE8Ä8ä9E9E@å@åIEIEA&A&aÇaÇbŒbŒAGAGQEQEa†a†Y†Y†Y†Y†a†a†a†a†aÇaÇI‡I‡QÇQÇI†I†I‡I‡A†A†ZJbJZJbJAGAGQEQEA&A&IEIE@å@åA$A$9E9EA&A&8Ä8äA&A&9E9EA&A&QEQEA&A&QEQEA&A&QEQEA&A&IEIEA&A&A&A&9$9$A&A&A&A&QEQEAGAGYEYEbbI‡I‡YEYEAGAGIEIE@å@å8ä8Ä8ä8ÄA$A$@å@å9$9$@å@å(ä(ä9E9E@å@å8Ä8ä9E9EA&A&A&A&QEQEZJbJZJbJAEAEYEYEa†a†Y†Y†a†a†a†a†aÇaÇaÇaÇI‡I‡Y†Y†AÇAÇAGAGAÇAÇbŒbŒZZQEQEA&A&IEIE@å@å9E9E@å@å9E9E@å@å9E9EA&A&9E9EA&A&QEQEA&A&IEIEA&A&AGAGQEQE@å@åA†A†A&A&A&A&A&A&IEIEA&A&YEYEYÉYÉI‡I‡Y†Y†YEYEI‡I‡QEQEAGAGQEQEA&A&A&A&8Ä8ä8Ä8äIEIE(ä(ä0å0åIEIE8Ä8ä9E9E@å@åIEIEA&A&aÇaÇbŒbŒAGAGQEQEa†a†Y†Y†Y†Y†a†a†a†a†aÇaÇI‡I‡QÇQÇI†I†I‡I‡A†A†ZJbJZJbJAGAGQEQEA&A&IEIE@å@åA$A$9E9EA&A&8Ä8äA&A&9E9EA&A&QEQEA&A&QEQEA&A&QEQEA&A&IEIEA&A&A&A&9$9$A&A&A&A&QEQEAGAGYEYEbbI‡I‡YEYEAGAGIEIE@å@å8Ä8ä9$9$0æ0æ8Ä8ä9E9E8Ä8ä8Ä8ä9E9E0å0å9E9E8å8å@å@å8Ä8äIEIEbbZÌZÌ@å@åY…Y…a†a†Y†Y†a†a†aÇaÇa†a†aÇaÇaÇaÇAGAGI‡I‡9†9†YÉYÉbŒbŒQÇQÇAGAGQEQE@å@åA&A&9E9E@å@å@å@å9E9EA&A&8Ä8äIEIEA&A&A&A&IEIEA&A&IEIEA&A&AGAGA&A&8Ä8äAGAGAEAEA&A&A&A&QEQEA&A&a†a†ZJbJAGAGQEQEA&A&QEQEAGAGA&A&QEQE8å8åA&A&8Ä8ä0å0å8Ä8ä8Ä8ä9E9E@å@å0å0å9E9E@å@å@å@åAGAGk-k-AGAGQ…Q…a†a†YEYEaÇaÇa†a†aÇaÇaÇaÇa†a†I‡I‡QÇQÇA&A&AÇAÇbŒbŒbbAGAGA&A&A&A&A&A&AEAE@å@å@å@å9E9E@å@å9E9EA&A&A&A&QEQEA&A&IEIEA&A&A&A&I†I†A&A&@å@å9E9E(ä(äA&A&AGAGA&A&QEQEYEYER -R -I‡I‡YEYEA&A&8Ä8ä8Ä8ä8ä8Ä9$9$0æ0æ8Ä8ä9E9E8Ä8ä8Ä8ä9E9E0å0å9E9E8å8å@å@å8Ä8äIEIEbbZÌZÌ@å@åY…Y…a†a†Y†Y†a†a†aÇaÇa†a†aÇaÇaÇaÇAGAGI‡I‡9†9†YÉYÉbŒbŒQÇQÇAGAGQEQE@å@åA&A&9E9E@å@å@å@å9E9EA&A&8Ä8äIEIEA&A&A&A&IEIEA&A&IEIEA&A&AGAGA&A&8Ä8äAGAGAEAEA&A&A&A&QEQEA&A&a†a†ZJbJAGAGQEQEA&A&QEQEAGAGA&A&QEQE8å8åA&A&8Ä8ä0å0å8Ä8ä8Ä8ä9E9E@å@å0å0å9E9E@å@å@å@åAGAGk-k-AGAGQ…Q…a†a†YEYEaÇaÇa†a†aÇaÇaÇaÇa†a†I‡I‡QÇQÇA&A&AÇAÇbŒbŒbbAGAGA&A&A&A&A&A&AEAE@å@å@å@å9E9E@å@å9E9EA&A&A&A&QEQEA&A&IEIEA&A&A&A&I†I†A&A&@å@å9E9E(ä(äA&A&AGAGA&A&QEQEYEYER -R -I‡I‡YEYEA&A&8Ä8ä8Ä8ä8Ä8ä(ä(äA$A$0å0å8Ä8ä9E9E8Ä8ä8Ä8ä0å0å@å@å9E9E8Ä8äIEIEA&A&JJbŒbŒYÇYÇa†a†jjrjzzzzzzzzjjAGAGQÇQÇA&A&JJZJbJAGAGQEQEA&A&9E9EIEIE8å8å@å@å9E9E8å8åA&A&IEIE@å@å9E9EA&A&QEQEA&A&A&A&AGAG@å@åAEAEIEIE@å@å9E9E@å@åIEIEA&A&YEYEaÇaÇR -R -YEYEI‡I‡A&A&QEQEAGAGQEQE@å@å@ä@ä8Ä8ä8Ä8ä9E9E8Ä8ä9E9E0å0å8Ä8ä9E9E8å8å8Ä8äIEIEAGAGbŒbŒZZaÇaÇiÇiÇrjzzzzzzzzjjI‡I‡AGAGI†I†AGAGbŒbŒI‡I‡I†I†AGAGIEIE@å@å@å@å9E9E0å0åA&A&8Ä8äIEIE9E9EA&A&A&A&IEIEA&A&IEIEA&A&A&A&IEIE0å0å@å@å8Ä8ä9E9EA&A&QEQEA&A&a†a†ZJbJYÉYÉQEQE@å@å8Ä8äA$A$8ä8Ä(ä(äA$A$0å0å8Ä8ä9E9E8Ä8ä8Ä8ä0å0å@å@å9E9E8Ä8äIEIEA&A&JJbŒbŒYÇYÇa†a†jjrjzzzzzzzzjjAGAGQÇQÇA&A&JJZJbJAGAGQEQEA&A&9E9EIEIE8å8å@å@å9E9E8å8åA&A&IEIE@å@å9E9EA&A&QEQEA&A&A&A&AGAG@å@åAEAEIEIE@å@å9E9E@å@åIEIEA&A&YEYEaÇaÇR -R -YEYEI‡I‡A&A&QEQEAGAGQEQE@å@å@ä@ä8Ä8ä8Ä8ä9E9E8Ä8ä9E9E0å0å8Ä8ä9E9E8å8å8Ä8äIEIEAGAGbŒbŒZZaÇaÇiÇiÇrjzzzzzzzzjjI‡I‡AGAGI†I†AGAGbŒbŒI‡I‡I†I†AGAGIEIE@å@å@å@å9E9E0å0åA&A&8Ä8äIEIE9E9EA&A&A&A&IEIEA&A&IEIEA&A&A&A&IEIE0å0å@å@å8Ä8ä9E9EA&A&QEQEA&A&a†a†ZJbJYÉYÉQEQE@å@å8Ä8äA$A$8Ä8äA$A$8Ä8ä8Ä8äA$A$8Ä8ä0Ä0ä1$1$8Ä8ä8Ä8äA$A$9E9EA&A&QEQEYÉYÉbŒbŒAÇAÇY†Y†A&A&AGAGYÉYÉjjI‡I‡Y†Y†I‡I‡8Ä8ä0æ0æ9E9EJJR -R -QEQEA&A&IEIE@å@å@å@å9E9E0å0å@å@å8Ä8äA$A$0å0åIEIEA&A&I$I$A&A&QEQEA&A&IEIEA&A&8Ä8äIEIE@å@å0å0åIEIEA&A&QEQEQEQEYÉYÉjËjËAGAGQEQEQEQEA&A&QEQEA&A&QEQEA&A&@å@å8ã8äAEAE0Ä0ä0Ä0ä0Ä0ã9E9E8Ä8äA&A&AEAEQEQEAGAGbŒbŒYÉYÉAÇAÇQEQEA&A&YÉYÉYÉYÉYÉYÉY†Y†I‡I‡QEQE(ä(ä9E9EAGAGR‹R‹I†I†A&A&QEQE8Ä8äIEIE0å0å8Ä8ä@å@åA$A$9E9E@å@å@å@å9E9EI$I$A&A&QEQEA&A&QEQEA&A&8Ä8ä@å@åA$A$9E9EA&A&IEIEA&A&QEQEYEYEZJbJYÉYÉQEQEQEQE8Ä8ä8Ä8ä8ä8ÄA$A$8Ä8ä8Ä8äA$A$8Ä8ä0Ä0ä1$1$8Ä8ä8Ä8äA$A$9E9EA&A&QEQEYÉYÉbŒbŒAÇAÇY†Y†A&A&AGAGYÉYÉjjI‡I‡Y†Y†I‡I‡8Ä8ä0æ0æ9E9EJJR -R -QEQEA&A&IEIE@å@å@å@å9E9E0å0å@å@å8Ä8äA$A$0å0åIEIEA&A&I$I$A&A&QEQEA&A&IEIEA&A&8Ä8äIEIE@å@å0å0åIEIEA&A&QEQEQEQEYÉYÉjËjËAGAGQEQEQEQEA&A&QEQEA&A&QEQEA&A&@å@å8ã8äAEAE0Ä0ä0Ä0ä0Ä0ã9E9E8Ä8äA&A&AEAEQEQEAGAGbŒbŒYÉYÉAÇAÇQEQEA&A&YÉYÉYÉYÉYÉYÉY†Y†I‡I‡QEQE(ä(ä9E9EAGAGR‹R‹I†I†A&A&QEQE8Ä8äIEIE0å0å8Ä8ä@å@åA$A$9E9E@å@å@å@å9E9EI$I$A&A&QEQEA&A&QEQEA&A&8Ä8ä@å@åA$A$9E9EA&A&IEIEA&A&QEQEYEYEZJbJYÉYÉQEQEQEQE8Ä8ä8Ä8äAÇAÇAGAGI‡I‡BB0æ0æAÇAÇAGAGAÇAÇAÇAÇAÇAÇAGAGAGAGAGAGI‡I‡R‹R‹ZJbJ å å å å!$!$ Ä Ä ÄÄ0æ0æAGAG å åAGAGR‹R‹R -R -R -R -R‹R‹bŒbŒAÇAÇAGAGAGAGAÇAÇAGAGAGAG8æ8æ9E9E8æ8æ0æ0æAGAGAÇAÇAGAGAGAGAGAGAGAGAGAGA&A&I†I†A&A&AGAGA&A&A&A&AGAGI‡I‡YÉYÉI‡I‡jjs/k/ZJbJYÉYÉR -R -YÉYÉYÉYÉYÉYÉYÉYÉI‡I‡A&A&A&A&0æ0æ9†9†9E9EA&A&0æ0æAGAGA†A†AGAGAGAGZJbJk/k/JJ ä ä ÄÄ ä ä ÄÄ(ä(ä0æ0æ0æ0æ1†1†BBbŒbŒR -R -R -R -s-k-BBI‡I‡AGAGAGAGAGAGAGAG9†9†8æ8æ0æ0æ0æ0æA†A†AGAGAGAGAGAGAGAGAGAGAGAGA&A&AGAGA&A&A&A&A†A†8æ8æA†A†I‡I‡YÉYÉI‡I‡YÉYÉjËjËrÍjÍR -R -YÉYÉR -R -YÉYÉAÇAÇAGAGI‡I‡BB0æ0æAÇAÇAGAGAÇAÇAÇAÇAÇAÇAGAGAGAGAGAGI‡I‡R‹R‹ZJbJ å å å å!$!$ Ä Ä ÄÄ0æ0æAGAG å åAGAGR‹R‹R -R -R -R -R‹R‹bŒbŒAÇAÇAGAGAGAGAÇAÇAGAGAGAG8æ8æ9E9E8æ8æ0æ0æAGAGAÇAÇAGAGAGAGAGAGAGAGAGAGA&A&I†I†A&A&AGAGA&A&A&A&AGAGI‡I‡YÉYÉI‡I‡jjs/k/ZJbJYÉYÉR -R -YÉYÉYÉYÉYÉYÉYÉYÉI‡I‡A&A&A&A&0æ0æ9†9†9E9EA&A&0æ0æAGAGA†A†AGAGAGAGZJbJk/k/JJ ä ä ÄÄ ä ä ÄÄ(ä(ä0æ0æ0æ0æ1†1†BBbŒbŒR -R -R -R -s-k-BBI‡I‡AGAGAGAGAGAGAGAG9†9†8æ8æ0æ0æ0æ0æA†A†AGAGAGAGAGAGAGAGAGAGAGAGA&A&AGAGA&A&A&A&A†A†8æ8æA†A†I‡I‡YÉYÉI‡I‡YÉYÉjËjËrÍjÍR -R -YÉYÉR -R -YÉYÉk/k/rËjËk/k/rËjËbŒbŒƒÏƒÏk/k/bIbIbŒbŒZIZIR -R -R‹R‹ZJbJRŠRŠjÍjÍrËjËZJbJZJbJZJbJR -R -bJZJc,c,bŒbŒc/c/{.{.{Ï{Ïk-k-rËjË{.{.jËjËs/k/k-k-s.k-k-k-c,c,{oƒp{Ð{Ðk-k-c,c,k/k/c,c,{oƒpk/k/k/s/k-k-k-s.k-k-c,c,jÍjÍ{.{.“ЋÐ{Ð{Ðk/k/ƒo{pƒo{p{.{.{oƒp{.{.{.{.{,{,{.{.{.{.{.{.{,{,jÍjÍ{.{.jÍjÍ{,{,{Ð{ÐjŠjŠYÉYÉZJbJZIZIR‹R‹bbR‹R‹ZJbJZJbJc,c,jŠjŠbŒbŒbbbŒbŒR -R -R‹R‹bŒbŒjËjËs/k/k-k-ƒp{o{,{,jÍjÍs.k-jËjË{,{,k/k/s-k-k.k-s-k-k/k/ƒÒƒÑk,k,s/k/{,{,ZÌZÌk/k/{Ð{Ðk/k/s-k-k.k-s-k-k.k-bŒbŒk,k,“ГЃ҃Ñk-k-s/k/ƒÐƒÐ{.{.{oƒp{.{.{.{.{,{,{.{.{,{,k/k/{,{,k/s/jËjËk/s/jËjËbŒbŒƒÏƒÏk/k/bIbIbŒbŒZIZIR -R -R‹R‹ZJbJRŠRŠjÍjÍrËjËZJbJZJbJZJbJR -R -bJZJc,c,bŒbŒc/c/{.{.{Ï{Ïk-k-rËjË{.{.jËjËs/k/k-k-s.k-k-k-c,c,{oƒp{Ð{Ðk-k-c,c,k/k/c,c,{oƒpk/k/k/s/k-k-k-s.k-k-c,c,jÍjÍ{.{.“ЋÐ{Ð{Ðk/k/ƒo{pƒo{p{.{.{oƒp{.{.{.{.{,{,{.{.{.{.{.{.{,{,jÍjÍ{.{.jÍjÍ{,{,{Ð{ÐjŠjŠYÉYÉZJbJZIZIR‹R‹bbR‹R‹ZJbJZJbJc,c,jŠjŠbŒbŒbbbŒbŒR -R -R‹R‹bŒbŒjËjËs/k/k-k-ƒp{o{,{,jÍjÍs.k-jËjË{,{,k/k/s-k-k.k-s-k-k/k/ƒÒƒÑk,k,s/k/{,{,ZÌZÌk/k/{Ð{Ðk/k/s-k-k.k-s-k-k.k-bŒbŒk,k,“ГЃ҃Ñk-k-s/k/ƒÐƒÐ{.{.{oƒp{.{.{.{.{,{,{.{.{,{,k/k/{,{,QEQEY†Y†QEQEYEYEY†Y†ƒÐƒÐRŠRŠ@å@åIEIEI$I$@å@å@å@åAEAEQEQEQEQEIEIEA&A&AGAGI†I†I†I†AGAGI†I†AGAGQEQEQÇQÇQEQEA&A&I$I$IEIEIEIEIEIEAEAEQEQEYEYEQEQEjËj˃҃ÑYÉYÉQEQEA†A†QEQEIEIEIEIEIEIEIEIEA&A&QEQEQEQEQEQEYÇYÇ{oƒpjŠjŠQÇQÇQÇQÇY†Y†QÇQÇI‡I‡Y†Y†Y†Y†A&A&I†I†AGAGYEYEYÇYÇY†Y†YEYEY†Y†a†a†k/k/ZZI$I$A&A&I$I$QEQE@å@å@å@åAEAEQEQEA&A&QEQEIEIEAGAGI†I†AGAGQEQEA&A&QÇQÇQEQEQÇQÇAGAGIEIEI$I$A&A&IEIEQEQEA&A&QEQEYEYEQEQEbbƒÐƒÐbŒbŒQEQEAGAGQEQEA†A†QEQEIEIEA&A&AEAEQEQEIEIEQEQEY†Y†jÍjÍs,k,ZZYÇYÇI‡I‡Y†Y†I‡I‡Y†Y†Y†Y†AGAGQEQEAGAGQEQEY†Y†QEQEY†Y†QEQEYEYEY†Y†ƒÐƒÐRŠRŠ@å@åIEIEI$I$@å@å@å@åAEAEQEQEQEQEIEIEA&A&AGAGI†I†I†I†AGAGI†I†AGAGQEQEQÇQÇQEQEA&A&I$I$IEIEIEIEIEIEAEAEQEQEYEYEQEQEjËj˃҃ÑYÉYÉQEQEA†A†QEQEIEIEIEIEIEIEIEIEA&A&QEQEQEQEQEQEYÇYÇ{oƒpjŠjŠQÇQÇQÇQÇY†Y†QÇQÇI‡I‡Y†Y†Y†Y†A&A&I†I†AGAGYEYEYÇYÇY†Y†YEYEY†Y†a†a†k/k/ZZI$I$A&A&I$I$QEQE@å@å@å@åAEAEQEQEA&A&QEQEIEIEAGAGI†I†AGAGQEQEA&A&QÇQÇQEQEQÇQÇAGAGIEIEI$I$A&A&IEIEQEQEA&A&QEQEYEYEQEQEbbƒÐƒÐbŒbŒQEQEAGAGQEQEA†A†QEQEIEIEA&A&AEAEQEQEIEIEQEQEY†Y†jÍjÍs,k,ZZYÇYÇI‡I‡Y†Y†I‡I‡Y†Y†Y†Y†AGAGQEQEAGAGQEQEY†Y†QEQEY†Y†AGAGI†I†YEYEjÍjÍYÉYÉIEIEI$I$A&A&IEIEHäHäIEIEQEQEA&A&I$I$A&A&QEQEQEQEA&A&QEQEAGAGQEQEQEQEY†Y†AGAGQEQEIEIEA&A&QEQE@å@åQEQEY…Y…Y†Y†Y†Y†jŠjŠ“Ð‹ÐZZQEQEAGAGI$I$AGAGQEQEA&A&QEQEQEQEA&A&QEQEYEYEjjs/k/AGAGY†Y†QEQEYEYEAGAGQEQEYEYEA&A&I†I†AGAGQEQEA&A&YEYEYEYEY†Y†Y†Y†Y†Y†bŒbŒbbA&A&HäHäQEQEA&A&I$I$QEQE@å@åQEQEA&A&IEIEQEQEIEIEIEIEQEQEA&A&Y†Y†AGAGQEQEAGAGYEYEQEQEA&A&IEIEIEIE@å@åIEIEYEYEY†Y†Y…Y…bbƒÐƒÐjËjËQEQEI†I†QEQEQEQEA&A&QEQEAGAGHäHäQEQEAGAGYEYEYEYE{.{.ZJbJQEQEQEQEYEYEAGAGQEQEYEYEAGAGQEQEA&A&I†I†QEQEYEYEQEQEY†Y†AGAGI†I†YEYEjÍjÍYÉYÉIEIEI$I$A&A&IEIEHäHäIEIEQEQEA&A&I$I$A&A&QEQEQEQEA&A&QEQEAGAGQEQEQEQEY†Y†AGAGQEQEIEIEA&A&QEQE@å@åQEQEY…Y…Y†Y†Y†Y†jŠjŠ“Ð‹ÐZZQEQEAGAGI$I$AGAGQEQEA&A&QEQEQEQEA&A&QEQEYEYEjjs/k/AGAGY†Y†QEQEYEYEAGAGQEQEYEYEA&A&I†I†AGAGQEQEA&A&YEYEYEYEY†Y†Y†Y†Y†Y†bŒbŒbbA&A&HäHäQEQEA&A&I$I$QEQE@å@åQEQEA&A&IEIEQEQEIEIEIEIEQEQEA&A&Y†Y†AGAGQEQEAGAGYEYEQEQEA&A&IEIEIEIE@å@åIEIEYEYEY†Y†Y…Y…bbƒÐƒÐjËjËQEQEI†I†QEQEQEQEA&A&QEQEAGAGHäHäQEQEAGAGYEYEYEYE{.{.ZJbJQEQEQEQEYEYEAGAGQEQEYEYEAGAGQEQEA&A&I†I†QEQEYEYEQEQEI†I†QEQEA&A&YEYEZJbJYÉYÉ@å@åIEIEHäHäI$I$QEQEIEIEI$I$A&A&HäHäQEQEQEQEA&A&IEIEI$I$QEQEAGAGQEQEQEQEQEQEQEQEIEIEIEIEQEQEQEQEY†Y†Y†Y†Y…Y…YEYEjËj˃o{pI‡I‡I†I†QEQEA&A&QEQEA&A&QEQEA&A&A&A&QEQEAGAGQEQEYÉYÉ{oƒpYÆYÇYEYEYEYEYEYEAGAGQEQEYEYEY†Y†YEYEAGAGQEQEA&A&I†I†I‡I‡YEYEYÉYÉaÇaÇbŒbŒZJbJHäHäQEQEI$I$I$I$A&A&I$I$QEQEI$I$A&A&I$I$QEQEA&A&I$I$A&A&I$I$IEIEQEQEQEQEQEQEY†Y†IEIEIEIEAEAEQEQEQEQEYEYEY†Y†Y…Y…Y…Y…bb{oƒpZJbJQEQEAGAGQEQEA&A&QEQEA&A&QEQEQEQEA&A&QEQEQEQEYEYEjÍjÍbŒbŒYEYEYEYEYEYEYEYEAGAGY†Y†QEQEQEQEY†Y†A&A&AGAGQEQEQEQEI†I†QEQEA&A&YEYEZJbJYÉYÉ@å@åIEIEHäHäI$I$QEQEIEIEI$I$A&A&HäHäQEQEQEQEA&A&IEIEI$I$QEQEAGAGQEQEQEQEQEQEQEQEIEIEIEIEQEQEQEQEY†Y†Y†Y†Y…Y…YEYEjËj˃o{pI‡I‡I†I†QEQEA&A&QEQEA&A&QEQEA&A&A&A&QEQEAGAGQEQEYÉYÉ{oƒpYÆYÇYEYEYEYEYEYEAGAGQEQEYEYEY†Y†YEYEAGAGQEQEA&A&I†I†I‡I‡YEYEYÉYÉaÇaÇbŒbŒZJbJHäHäQEQEI$I$I$I$A&A&I$I$QEQEI$I$A&A&I$I$QEQEA&A&I$I$A&A&I$I$IEIEQEQEQEQEQEQEY†Y†IEIEIEIEAEAEQEQEQEQEYEYEY†Y†Y…Y…Y…Y…bb{oƒpZJbJQEQEAGAGQEQEA&A&QEQEA&A&QEQEQEQEA&A&QEQEQEQEYEYEjÍjÍbŒbŒYEYEYEYEYEYEYEYEAGAGY†Y†QEQEQEQEY†Y†A&A&AGAGQEQEQEQEA&A&QEQEQEQEAGAGjjR -R -I$I$I$I$I$I$QEQEI$I$QEQEQEQEQEQEQEQEI$I$A&A&HäHäIEIEIEIEQEQEQEQEYEYEYEYEQEQEQEQEQEQEQEQEY†Y†YEYEY†Y†Y†Y†Y†Y†Y…Y…k-k-ƒp{oI‡I‡QEQEA&A&A&A&I$I$A&A&QEQEIEIEA&A&QEQEIEIEQEQEaÇaÇ{.{.bbYEYEYEYEYEYEYEYEYEYEAGAGQEQEY†Y†QEQEA&A&AGAGAGAGQEQEI‡I‡I‡I‡YÉYÉjËjËR -R -HäHäI$I$QEQEHäHäHäHäQEQEQEQEQEQEQEQEQEQEHäHäQEQE@å@åQEQEA&A&QEQEHäHäYEYEYEYEQÇQÇQEQEQEQEQEQEYEYEYEYEaÇaÇY…Y…Y†Y†Y…Y…bIbIƒÐƒÐR‹R‹QEQEA&A&A&A&I$I$A&A&QEQEA&A&IEIEA&A&QEQEAGAGQEQE{,{,jËjËYEYEYEYEYEYEY†Y†QEQEQEQEYEYEY†Y†QEQEA&A&QEQEQEQEQEQEA&A&QEQEQEQEAGAGjjR -R -I$I$I$I$I$I$QEQEI$I$QEQEQEQEQEQEQEQEI$I$A&A&HäHäIEIEIEIEQEQEQEQEYEYEYEYEQEQEQEQEQEQEQEQEY†Y†YEYEY†Y†Y†Y†Y†Y†Y…Y…k-k-ƒp{oI‡I‡QEQEA&A&A&A&I$I$A&A&QEQEIEIEA&A&QEQEIEIEQEQEaÇaÇ{.{.bbYEYEYEYEYEYEYEYEYEYEAGAGQEQEY†Y†QEQEA&A&AGAGAGAGQEQEI‡I‡I‡I‡YÉYÉjËjËR -R -HäHäI$I$QEQEHäHäHäHäQEQEQEQEQEQEQEQEQEQEHäHäQEQE@å@åQEQEA&A&QEQEHäHäYEYEYEYEQÇQÇQEQEQEQEQEQEYEYEYEYEaÇaÇY…Y…Y†Y†Y…Y…bIbIƒÐƒÐR‹R‹QEQEA&A&A&A&I$I$A&A&QEQEA&A&IEIEA&A&QEQEAGAGQEQE{,{,jËjËYEYEYEYEYEYEY†Y†QEQEQEQEYEYEY†Y†QEQEA&A&QEQEQEQEIEIEQEQEA&A&QEQEI‡I‡jjR -R -@å@åI$I$I$I$QEQEQEQEQEQEQEQEQEQEI$I$A&A&QEQEIEIEHäHäYEYEQEQEQEQEY…Y…aÇaÇYEYEY†Y†Y†Y†QEQEY†Y†QEQEaÇaÇY…Y…aÇaÇY†Y†jŠjŠƒÐƒÐRRA&A&QEQEA&A&QEQEA&A&A&A&@å@åIEIEIEIEA&A&QEQEaÇaÇjÍjÍZZYEYEaÇaÇQEQEYEYEYEYEYEYEY†Y†QEQEQEQEA&A&I†I†AGAGQEQEAGAGY†Y†I‡I‡{.{.bIbIHäHäQEQEHäHäI$I$HäHäQEQEQEQEQEQEQEQEI$I$QEQE@å@åQEQEQEQEI$I$QEQEQEQEYEYEaÇaÇYEYEQEQEY†Y†YEYEY†Y†Y…Y…Y†Y†Y†Y†aÇaÇY…Y…ZZ{oƒpZJbJAGAGQEQEA&A&QEQEA&A&@å@åAEAEIEIEA&A&IEIEQEQEQEQEjËjËbŒbŒYEYEa†a†YEYEYEYEYEYEAGAGYEYEYEYEY†Y†A&A&I†I†A&A&IEIEQEQEA&A&QEQEI‡I‡jjR -R -@å@åI$I$I$I$QEQEQEQEQEQEQEQEQEQEI$I$A&A&QEQEIEIEHäHäYEYEQEQEQEQEY…Y…aÇaÇYEYEY†Y†Y†Y†QEQEY†Y†QEQEaÇaÇY…Y…aÇaÇY†Y†jŠjŠƒÐƒÐRRA&A&QEQEA&A&QEQEA&A&A&A&@å@åIEIEIEIEA&A&QEQEaÇaÇjÍjÍZZYEYEaÇaÇQEQEYEYEYEYEYEYEY†Y†QEQEQEQEA&A&I†I†AGAGQEQEAGAGY†Y†I‡I‡{.{.bIbIHäHäQEQEHäHäI$I$HäHäQEQEQEQEQEQEQEQEI$I$QEQE@å@åQEQEQEQEI$I$QEQEQEQEYEYEaÇaÇYEYEQEQEY†Y†YEYEY†Y†Y…Y…Y†Y†Y†Y†aÇaÇY…Y…ZZ{oƒpZJbJAGAGQEQEA&A&QEQEA&A&@å@åAEAEIEIEA&A&IEIEQEQEQEQEjËjËbŒbŒYEYEa†a†YEYEYEYEYEYEAGAGYEYEYEYEY†Y†A&A&I†I†A&A&I$I$A&A&QEQEQEQEY†Y†YÉYÉYÉYÉ8ã8ä@å@åHäHäHäHäAEAEI$I$HäHäQEQE@å@åI$I$I$I$QEQEIEIEQEQEYEYEYEYEYEYEYEYEQEQEIEIEQEQEYEYEY†Y†QEQEY…Y…Y†Y†QEQEYEYEZIZI{.{.R -R -AEAEQEQEA&A&@å@åIEIEA&A&AEAEQEQEA&A&QEQEA&A&QEQEjÍjÍYÉYÉYEYEYEYEYEYEY†Y†YEYEYEYEQEQEY†Y†YEYEQEQEA&A&QEQEA&A&Y†Y†A&A&QÇQÇbŒbŒbb@å@åHäHäI$I$@å@åI$I$@å@åIEIEI$I$HäHäQEQE@ä@äI$I$A&A&I$I$QEQEYEYEQEQEYEYEYEYEYEYEIEIEQEQEY†Y†YEYEY†Y†QEQEY…Y…Y…Y…QEQEYÇYÇk-k-s.k-HäHäQEQEA&A&@å@åA†A†I$I$@å@åIEIEIEIEA&A&AGAG@ä@äZJbJZJbJYEYEYEYEY†Y†YEYEY†Y†QEQEYEYEY…Y…YEYEQEQE@å@åHäHäI$I$A&A&QEQEQEQEY†Y†YÉYÉYÉYÉ8ã8ä@å@åHäHäHäHäAEAEI$I$HäHäQEQE@å@åI$I$I$I$QEQEIEIEQEQEYEYEYEYEYEYEYEYEQEQEIEIEQEQEYEYEY†Y†QEQEY…Y…Y†Y†QEQEYEYEZIZI{.{.R -R -AEAEQEQEA&A&@å@åIEIEA&A&AEAEQEQEA&A&QEQEA&A&QEQEjÍjÍYÉYÉYEYEYEYEYEYEY†Y†YEYEYEYEQEQEY†Y†YEYEQEQEA&A&QEQEA&A&Y†Y†A&A&QÇQÇbŒbŒbb@å@åHäHäI$I$@å@åI$I$@å@åIEIEI$I$HäHäQEQE@ä@äI$I$A&A&I$I$QEQEYEYEQEQEYEYEYEYEYEYEIEIEQEQEY†Y†YEYEY†Y†QEQEY…Y…Y…Y…QEQEYÇYÇk-k-s.k-HäHäQEQEA&A&@å@åA†A†I$I$@å@åIEIEIEIEA&A&AGAG@ä@äZJbJZJbJYEYEYEYEY†Y†YEYEY†Y†QEQEYEYEY…Y…YEYEQEQE@å@åHäHäAGAGI‡I‡I‡I‡YÉYÉbŒbŒjÍjÍZÌZÌI‡I‡AGAGAÇAÇAGAGAGAGAGAGJJR -R -I‡I‡JJI‡I‡R -R -I‡I‡bJZJI‡I‡YÉYÉJJI‡I‡JJI‡I‡JJI‡I‡RRYÉYÉR‹R‹ZJbJjËjË{,{,k/k/s-k-ZJbJA&A&I‡I‡I‡I‡AÇAÇJJBBI‡I‡R -R -BBBBbŒbŒk/k/ƒo{pbŒbŒjjbIbIYÉYÉiÇiÇbbbbR -R -rjbŒbŒZJbJZJbJYÉYÉI‡I‡ZJbJR‹R‹YÉYÉc,c,bŒbŒYÇYÇZZYÉYÉA&A&AÇAÇAGAGAGAGI‡I‡R -R -BBYÉYÉJJYÉYÉJJR -R -YÉYÉJJbbBBI‡I‡I‡I‡JJI‡I‡I‡I‡R -R -R -R -bJZJbŒbŒ{,{,k-k-rÎjÍc,c,AGAGAGAGRRAGAGBBR -R -BBR -R -I‡I‡BBZJbJjÎj̓o{pc/c/YÈYÉI‡I‡I‡I‡BBYÉYÉJJR -R -bbR -R -R -R -R -R -R -R -AGAGI‡I‡I‡I‡YÉYÉbŒbŒjÍjÍZÌZÌI‡I‡AGAGAÇAÇAGAGAGAGAGAGJJR -R -I‡I‡JJI‡I‡R -R -I‡I‡bJZJI‡I‡YÉYÉJJI‡I‡JJI‡I‡JJI‡I‡RRYÉYÉR‹R‹ZJbJjËjË{,{,k/k/s-k-ZJbJA&A&I‡I‡I‡I‡AÇAÇJJBBI‡I‡R -R -BBBBbŒbŒk/k/ƒo{pbŒbŒjjbIbIYÉYÉiÇiÇbbbbR -R -rjbŒbŒZJbJZJbJYÉYÉI‡I‡ZJbJR‹R‹YÉYÉc,c,bŒbŒYÇYÇZZYÉYÉA&A&AÇAÇAGAGAGAGI‡I‡R -R -BBYÉYÉJJYÉYÉJJR -R -YÉYÉJJbbBBI‡I‡I‡I‡JJI‡I‡I‡I‡R -R -R -R -bJZJbŒbŒ{,{,k-k-rÎjÍc,c,AGAGAGAGRRAGAGBBR -R -BBR -R -I‡I‡BBZJbJjÎj̓o{pc/c/YÈYÉI‡I‡I‡I‡BBYÉYÉJJR -R -bbR -R -R -R -R -R -R -R -k/k/ƒÐƒÐ{oƒpk/k/ƒÐƒÐ{.{.{.{.{Ï{Ïc,c,{oƒpk/k/ƒo{pk-k-c/c/jËjËs/k/bŒbŒc,c,bŒbŒk-k-bŒbŒbŒbŒc,c,k/k/s,k,c/c/{.{.ƒÒƒÑƒÐƒÐk/k/{.{.{Ï{σЃÐ{oƒp‹Ï“ϋГЃЃÐ{Ï{Ï{.{.ƒÐƒÐ{Ð{Ѓ҃Ñ{oƒp‹Ð“Ð{Ð{Ѓ҃Ñ{.{.{.{.“ЋГЋЃЃÐ{oƒp{Ï{Ï{,{,ƒÐƒÐ{Ð{Ѓ҃Ñ{.{.ƒÐƒÐƒÐƒÐƒÐƒÐ”0Œ0œ“œ“{Ð{ГЋЃ҃є0Œ0ƒÐƒÐc,c,{.{.{.{.{.{.k,k,ƒo{p{.{.ƒÐƒÐk-k-c/c/k-k-rËjËbŒbŒbŒbŒbŒbŒk-k-bŒbŒbŒbŒc,c,jÍjÍs/k/k/k/s/k/ƒÐƒÐƒÐƒÐk/k/{Ï{Ï{.{.ƒÏƒÏ{Ï{Ï{oƒpŒ0”0‹Ð“Ð{.{.ƒÐƒÐk/k/“ГЃЃЃЃЃЃÐ{oƒp{Ð{Ð{oƒps.{.ƒÐƒÐ“ЋЃσσЃÐ{.{.{Ï{Ï{oƒp{oƒpsÐ{Ð{oƒp{oƒpsÐ{Ð{Ð{Д2Œ1œ“œ“ƒÐƒÐk/s/ƒÐƒÐ{oƒpk/k/ƒÐƒÐ{.{.{.{.{Ï{Ïc,c,{oƒpk/k/ƒo{pk-k-c/c/jËjËs/k/bŒbŒc,c,bŒbŒk-k-bŒbŒbŒbŒc,c,k/k/s,k,c/c/{.{.ƒÒƒÑƒÐƒÐk/k/{.{.{Ï{σЃÐ{oƒp‹Ï“ϋГЃЃÐ{Ï{Ï{.{.ƒÐƒÐ{Ð{Ѓ҃Ñ{oƒp‹Ð“Ð{Ð{Ѓ҃Ñ{.{.{.{.“ЋГЋЃЃÐ{oƒp{Ï{Ï{,{,ƒÐƒÐ{Ð{Ѓ҃Ñ{.{.ƒÐƒÐƒÐƒÐƒÐƒÐ”0Œ0œ“œ“{Ð{ГЋЃ҃є0Œ0ƒÐƒÐc,c,{.{.{.{.{.{.k,k,ƒo{p{.{.ƒÐƒÐk-k-c/c/k-k-rËjËbŒbŒbŒbŒbŒbŒk-k-bŒbŒbŒbŒc,c,jÍjÍs/k/k/k/s/k/ƒÐƒÐƒÐƒÐk/k/{Ï{Ï{.{.ƒÏƒÏ{Ï{Ï{oƒpŒ0”0‹Ð“Ð{.{.ƒÐƒÐk/k/“ГЃЃЃЃЃЃÐ{oƒp{Ð{Ð{oƒps.{.ƒÐƒÐ“ЋЃσσЃÐ{.{.{Ï{Ï{oƒp{oƒpsÐ{Ð{oƒp{oƒpsÐ{Ð{Ð{Д2Œ1œ“œ“ƒÐƒÐAEAE@å@åAEAEAEAEIEIE8Ä8äA†A†I$I$@å@åAGAGQÇQÇR‹R‹IEIEHãHäI$I$I$I$AEAEHäHäI$I$AEAEHäHäI$I$A$A$Y…Y…QÇQÇYÉYÉAÇAÇQEQEAÇAÇQEQE9E9EIEIEIEIE9E9EAGAGY…Y…QÇQÇI†I†I‡I‡QÇQÇQEQEQÇQÇI†I†Y†Y†I†I†AGAGIEIEQEQEI†I†IEIEIEIEA&A&QÇQÇQEQEbŒbŒRRIEIE8Ä8ä9E9E8Ä8ä9E9EA&A&A$A$@å@å9†9†IEIE@å@å9E9EIEIEA&A&AEAEAEAE@å@åA†A†QEQEZJbJAÇAÇHäHäI$I$IEIEHäHäIEIEI$I$HäHäI$I$A$A$8Ä8äQEQEYÇYÇYÇYÇJJIEIEAGAGAÇAÇAEAEAEAEIEIEA&A&QEQEAGAGY…Y…I‡I‡QÇQÇQÇQÇA†A†Y†Y†I†I†Y†Y†I†I†AGAGQEQEA&A&I†I†QEQE9E9EAGAGQEQEI†I†jjR -R -AÇAÇA&A&8Ä8äA$A$9E9EA&A&9E9E@å@åAEAE@å@åAEAEAEAEIEIE8Ä8äA†A†I$I$@å@åAGAGQÇQÇR‹R‹IEIEHãHäI$I$I$I$AEAEHäHäI$I$AEAEHäHäI$I$A$A$Y…Y…QÇQÇYÉYÉAÇAÇQEQEAÇAÇQEQE9E9EIEIEIEIE9E9EAGAGY…Y…QÇQÇI†I†I‡I‡QÇQÇQEQEQÇQÇI†I†Y†Y†I†I†AGAGIEIEQEQEI†I†IEIEIEIEA&A&QÇQÇQEQEbŒbŒRRIEIE8Ä8ä9E9E8Ä8ä9E9EA&A&A$A$@å@å9†9†IEIE@å@å9E9EIEIEA&A&AEAEAEAE@å@åA†A†QEQEZJbJAÇAÇHäHäI$I$IEIEHäHäIEIEI$I$HäHäI$I$A$A$8Ä8äQEQEYÇYÇYÇYÇJJIEIEAGAGAÇAÇAEAEAEAEIEIEA&A&QEQEAGAGY…Y…I‡I‡QÇQÇQÇQÇA†A†Y†Y†I†I†Y†Y†I†I†AGAGQEQEA&A&I†I†QEQE9E9EAGAGQEQEI†I†jjR -R -AÇAÇA&A&8Ä8äA$A$9E9EA&A&9E9E@å@å@å@åHäHä8ä8ãI$I$8Ä8ä@å@å8ã8ä8ã8ä@å@åHäHäI†I†jŠjŠ@ä@ä@å@åHäHäHäHä@ä@ãHäHäHäHä8ä8ã8ä8ã8ä8ã@å@åI$I$IEIEjŠjŠA&A&IEIE8Ä8ä@å@å8Ä8ä8Ä8ä9E9EQEQE8Ä8äA&A&HäHäIEIEQEQEQEQEQEQEQEQEQEQEQEQEA&A&I$I$QEQEA&A&@å@åIEIE@å@å9E9EA&A&QEQE{,{,I‡I‡@å@å9E9E8Ä8äIEIE@å@å9E9E8Ä8ä9E9E@ä@ä@å@åHäHäHäHä8ä8ã@å@å8ã8ä8ã8äHäHä8ä8ãIEIEZJbJAGAGHäHäHäHäHäHä8ä8ãHäHãHäHä9$9$0Ä0ãHäHäA$A$8ä8ãI$I$bbYÉYÉA$A$@å@å8Ä8ä8Ä8ä8Ä8äAEAE8Ä8äIEIE@å@åAEAE@å@åIEIEQEQEQEQEQEQEQEQEQEQEQEQEA&A&IEIEIEIEI$I$A&A&@å@åA$A$9E9EQEQEZJbJbŒbŒHäHä8Ä8ä9E9E@å@å@å@å8Ä8ä@å@åA$A$@å@åHäHä8ä8ãI$I$8Ä8ä@å@å8ã8ä8ã8ä@å@åHäHäI†I†jŠjŠ@ä@ä@å@åHäHäHäHä@ä@ãHäHäHäHä8ä8ã8ä8ã8ä8ã@å@åI$I$IEIEjŠjŠA&A&IEIE8Ä8ä@å@å8Ä8ä8Ä8ä9E9EQEQE8Ä8äA&A&HäHäIEIEQEQEQEQEQEQEQEQEQEQEQEQEA&A&I$I$QEQEA&A&@å@åIEIE@å@å9E9EA&A&QEQE{,{,I‡I‡@å@å9E9E8Ä8äIEIE@å@å9E9E8Ä8ä9E9E@ä@ä@å@åHäHäHäHä8ä8ã@å@å8ã8ä8ã8äHäHä8ä8ãIEIEZJbJAGAGHäHäHäHäHäHä8ä8ãHäHãHäHä9$9$0Ä0ãHäHäA$A$8ä8ãI$I$bbYÉYÉA$A$@å@å8Ä8ä8Ä8ä8Ä8äAEAE8Ä8äIEIE@å@åAEAE@å@åIEIEQEQEQEQEQEQEQEQEQEQEQEQEA&A&IEIEIEIEI$I$A&A&@å@åA$A$9E9EQEQEZJbJbŒbŒHäHä8Ä8ä9E9E@å@å@å@å8Ä8ä@å@åA$A$HäHäI$I$8ã8ä@å@åHäHä8ä8ãHäHä8ä8ã@ä@ãHäHäI†I†bb8Ä8äI$I$HäHäA$A#HäHãI$I$8ã8äHäHä8ä8ãAEAEHäHä8ä8ãI$I$ZJbJIEIE@å@å8Ä8äA$A$9E9E8Ä8ä@å@å8Ä8äAEAEI$I$IEIEA&A&I$I$A&A&QEQEQEQEQEQEQEQEQEQEA&A&A&A&I$I$A&A&@å@åA$A$@å@å9E9EYEYEjÍjÍYÉYÉ8Ä8äAEAE8Ä8ä@å@å9$9$@å@å9E9EA&A&8Ä8äHäHä0Ä0ãIEIEHäHä@ä@ã8ä8ãHäHä8ä8ãHäHäHäHäbIbIAGAG@ã@äI$I$@ã@äHãHäI$I$I$I$8ã8äHäHä8ä8ã8ä8ã@å@åI$I$bbJJ8Ä8äA$A$8Ä8ä9E9E8Ä8ä@å@åAEAE@å@åAEAEHäHäIEIEIEIEI$I$A&A&QEQEQEQEQEQEQEQEA&A&I$I$A&A&@å@åIEIE8Ä8ä9E9EA&A&QEQEjjZÌZÌA&A&@å@å8Ä8äA$A$9E9EHäHä8ä8ãHäHäHäHäI$I$8ã8ä@å@åHäHä8ä8ãHäHä8ä8ã@ä@ãHäHäI†I†bb8Ä8äI$I$HäHäA$A#HäHãI$I$8ã8äHäHä8ä8ãAEAEHäHä8ä8ãI$I$ZJbJIEIE@å@å8Ä8äA$A$9E9E8Ä8ä@å@å8Ä8äAEAEI$I$IEIEA&A&I$I$A&A&QEQEQEQEQEQEQEQEQEQEA&A&A&A&I$I$A&A&@å@åA$A$@å@å9E9EYEYEjÍjÍYÉYÉ8Ä8äAEAE8Ä8ä@å@å9$9$@å@å9E9EA&A&8Ä8äHäHä0Ä0ãIEIEHäHä@ä@ã8ä8ãHäHä8ä8ãHäHäHäHäbIbIAGAG@ã@äI$I$@ã@äHãHäI$I$I$I$8ã8äHäHä8ä8ã8ä8ã@å@åI$I$bbJJ8Ä8äA$A$8Ä8ä9E9E8Ä8ä@å@åAEAE@å@åAEAEHäHäIEIEIEIEI$I$A&A&QEQEQEQEQEQEQEQEA&A&I$I$A&A&@å@åIEIE8Ä8ä9E9EA&A&QEQEjjZÌZÌA&A&@å@å8Ä8äA$A$9E9EHäHä8ä8ãHäHäHäHä8ä8ãHäHä8ä8ãHäHã8ä8ã@ä@ãHäHä@ä@ãI$I$QÇQÇZJbJ@å@åI$I$I$I$HäHäI$I$I$I$HäHäA$A$8ä8ãHäHäA$A$HäHäI$I$ZJbJ9E9E8Ä8äA$A$8Ä8ä8Ä8ä9$9$8Ä8äA$A$9E9EA&A&I$I$QEQEA&A&I$I$A&A&HäHäQEQEQEQE8å8å@å@å@å@åAEAEHäHäA$A$8Ä8äIEIEIEIEQEQEjÍjÍIÇIÇ8Ä8ä8Ä8äA$A$9E9E8Ä8ä9E9E@ä@ä8Ä8ä@å@åHäHä8ä8ãHäHäHäHä8ä8ã@ä@ã@ä@ãHäHãHäHäI$I$ZJbJAGAGI$I$HäHäI$I$I$I$I$I$HäHäA$A$8ä8ãI$I$8Ä8äI$I$HäHäZIZIAÇAÇ8Ä8äA$A$8Ä8ä8Ä8äA$A$8Ä8äA$A$8Ä8äAEAEIEIEI$I$QEQEA&A&I$I$QEQEHäHäA&A&QEQE8Ä8äA&A&HäHäA$A$IEIE8Ä8äA&A&I$I$QEQER -R -bŒbŒ@ä@ä8ä8ãA$A$0å0å@å@å8ã8ä8ã8ä@å@åHäHä8ä8ãHäHä8ä8ãHäHã8ä8ã@ä@ãHäHä@ä@ãI$I$QÇQÇZJbJ@å@åI$I$I$I$HäHäI$I$I$I$HäHäA$A$8ä8ãHäHäA$A$HäHäI$I$ZJbJ9E9E8Ä8äA$A$8Ä8ä8Ä8ä9$9$8Ä8äA$A$9E9EA&A&I$I$QEQEA&A&I$I$A&A&HäHäQEQEQEQE8å8å@å@å@å@åAEAEHäHäA$A$8Ä8äIEIEIEIEQEQEjÍjÍIÇIÇ8Ä8ä8Ä8äA$A$9E9E8Ä8ä9E9E@ä@ä8Ä8ä@å@åHäHä8ä8ãHäHäHäHä8ä8ã@ä@ã@ä@ãHäHãHäHäI$I$ZJbJAGAGI$I$HäHäI$I$I$I$I$I$HäHäA$A$8ä8ãI$I$8Ä8äI$I$HäHäZIZIAÇAÇ8Ä8äA$A$8Ä8ä8Ä8äA$A$8Ä8äA$A$8Ä8äAEAEIEIEI$I$QEQEA&A&I$I$QEQEHäHäA&A&QEQE8Ä8äA&A&HäHäA$A$IEIE8Ä8äA&A&I$I$QEQER -R -bŒbŒ@ä@ä8ä8ãA$A$0å0å@å@å8ã8ä8ã8ä@å@åHäHä@ä@ã8ä8ãHäHä@ä@ãHäHã@ä@ã@ä@ã@ä@ãI$I$QEQEbŒbŒHäHäI$I$8ã8äI$I$I$I$IEIEHãHäI$I$HäHäA$A#HäHäI$I$I$I$JJ8Ä8ä8Ä8äA$A$8Ä8ä1$1$0Ä0ãA$A$8Ä8äIEIEI$I$A&A&I$I$A&A&QEQEHäHäQEQEHäHäA&A&I$I$@å@åHäHäI$I$@å@åAEAE8Ä8äIEIEQEQEQEQEjËjËI‡I‡(ä(ä8Ä8ä8Ä8ä8Ä8ä@å@å8Ä8ä8Ä8äAEAEHäHä8ä8ãHäHä8ä8ãHäHä@ä@ã@ä@ã@ä@ã@ä@ãHäHäI$I$ZJbJI‡I‡@ä@ãI$I$I$I$8ã8äIEIEI$I$HäHäI$I$HäHäI$I$A$A$HäHäQÇQÇA&A&8Ä8ä8Ä8äA$A$0Ä0ä0Ä0ãA$A$8Ä8äAEAEI$I$QEQEA&A&I$I$QEQE@å@åQEQEQEQEHäHäQEQE@ä@ä@å@åI$I$@å@åAEAE@å@åAEAEI$I$QEQEbbbŒbŒ0Ã0ä8Ä8ä8Ä8ä9$9$8Ä8ä9E9E@ä@äHäHäHäHä@ä@ã8ä8ãHäHä@ä@ãHäHã@ä@ã@ä@ã@ä@ãI$I$QEQEbŒbŒHäHäI$I$8ã8äI$I$I$I$IEIEHãHäI$I$HäHäA$A#HäHäI$I$I$I$JJ8Ä8ä8Ä8äA$A$8Ä8ä1$1$0Ä0ãA$A$8Ä8äIEIEI$I$A&A&I$I$A&A&QEQEHäHäQEQEHäHäA&A&I$I$@å@åHäHäI$I$@å@åAEAE8Ä8äIEIEQEQEQEQEjËjËI‡I‡(ä(ä8Ä8ä8Ä8ä8Ä8ä@å@å8Ä8ä8Ä8äAEAEHäHä8ä8ãHäHä8ä8ãHäHä@ä@ã@ä@ã@ä@ã@ä@ãHäHäI$I$ZJbJI‡I‡@ä@ãI$I$I$I$8ã8äIEIEI$I$HäHäI$I$HäHäI$I$A$A$HäHäQÇQÇA&A&8Ä8ä8Ä8äA$A$0Ä0ä0Ä0ãA$A$8Ä8äAEAEI$I$QEQEA&A&I$I$QEQE@å@åQEQEQEQEHäHäQEQE@ä@ä@å@åI$I$@å@åAEAE@å@åAEAEI$I$QEQEbbbŒbŒ0Ã0ä8Ä8ä8Ä8ä9$9$8Ä8ä9E9E@ä@äHäHäHäHä@ä@ãHäHã@ä@ãHäHã@ä@ãHäHä@ä@ãHäHãHäHäIEIEc,c,HäHä8ä8ãI$I$HäHäHäHãI$I$I$I$HäHä@ä@ãI$I$I$I$8ã8äIEIEAGAGA$A$A$A$8ä8ã8ä8ã8Ä8äAEAEI$I$QEQEI$I$QEQEQEQEQEQEYEYEQEQEQEQEQEQEQEQEYEYEQEQEQEQEQEQEHäHäQEQEI$I$QEQEQEQEA&A&QEQEbŒbŒAGAG@å@åA$A$0Ä0ã9$9$(ä(ä9E9E8Ä8ä@å@å@ã@ä@ã@äHäHäHäHãHäHã@ä@ã@ä@ã@ä@ãHäHãHäHãHäHäjŠjŠAÇAÇHäHäHäHäI$I$@ã@äI$I$I$I$HãHäHäHä@ä@ãI$I$HäHäA$A#QEQEA†A†8ã8ä@å@å8ã8äA$A$8ä8ãAEAEI$I$QEQEHäHäQEQEYEYEQEQEAGAGYEYEHäHäYEYEA&A&YEYEQEQEYEYEQEQEHäHäIEIEHäHäQEQEYEYEA&A&YÉYÉZJbJ8ä8ã8Ä8ä9$9$(ä(ä8Ä8ä8Ä8ä0Ä0ãHäHäHäHä@ä@ãHäHã@ä@ãHäHã@ä@ãHäHä@ä@ãHäHãHäHäIEIEc,c,HäHä8ä8ãI$I$HäHäHäHãI$I$I$I$HäHä@ä@ãI$I$I$I$8ã8äIEIEAGAGA$A$A$A$8ä8ã8ä8ã8Ä8äAEAEI$I$QEQEI$I$QEQEQEQEQEQEYEYEQEQEQEQEQEQEQEQEYEYEQEQEQEQEQEQEHäHäQEQEI$I$QEQEQEQEA&A&QEQEbŒbŒAGAG@å@åA$A$0Ä0ã9$9$(ä(ä9E9E8Ä8ä@å@å@ã@ä@ã@äHäHäHäHãHäHã@ä@ã@ä@ã@ä@ãHäHãHäHãHäHäjŠjŠAÇAÇHäHäHäHäI$I$@ã@äI$I$I$I$HãHäHäHä@ä@ãI$I$HäHäA$A#QEQEA†A†8ã8ä@å@å8ã8äA$A$8ä8ãAEAEI$I$QEQEHäHäQEQEYEYEQEQEAGAGYEYEHäHäYEYEA&A&YEYEQEQEYEYEQEQEHäHäIEIEHäHäQEQEYEYEA&A&YÉYÉZJbJ8ä8ã8Ä8ä9$9$(ä(ä8Ä8ä8Ä8ä0Ä0ãHäHäA&A&A&A&A&A&IEIEAGAGA&A&0å0å8Ä8ä0Ä0ä8Ä8äAGAGbŒbŒJJAGAGQEQEA&A&Y†Y†QÇQÇI‡I‡I†I†AGAGA†A†AGAGI†I†Y†Y†R -R -R -R -QÇQÇAGAGA&A&0Ä0äHäHä8Ä8äA&A&@ä@äI$I$@å@å8Ä8ä@å@åA&A&8å8å@ä@ä@å@åA&A&I$I$@ä@äQEQEIEIEA&A&@å@åAGAGA&A&A&A&AGAGR‹R‹AGAG0Ã0ä ä ä0Ä0ä0Ä0ã0Ä0ã(Ä(Ã0Ä0äHäHäAEAEA&A&QEQEA&A&A&A&I‡I‡8å8å0å0å@ä@ä0Ä0ãA&A&ZJbJR‹R‹I‡I‡A&A&@å@åQEQEYÇYÇQÇQÇAGAGI†I†AGAGA†A†I†I†AGAGbbR -R -YÉYÉAÇAÇA&A&8Ä8ä8Ä8ä@å@å@å@å@å@åIEIE@ä@ä8Ä8ä@å@å@å@åA&A&@ä@äA&A&I$I$A&A&HäHä8Ä8äQEQEA&A&@å@åA&A&AGAGA&A&A&A&ZJbJR -R -0æ0æ0æ0æ9†9†I‡I‡ å å(ä(ä(å(å8æ8æA&A&A&A&A&A&IEIEAGAGA&A&0å0å8Ä8ä0Ä0ä8Ä8äAGAGbŒbŒJJAGAGQEQEA&A&Y†Y†QÇQÇI‡I‡I†I†AGAGA†A†AGAGI†I†Y†Y†R -R -R -R -QÇQÇAGAGA&A&0Ä0äHäHä8Ä8äA&A&@ä@äI$I$@å@å8Ä8ä@å@åA&A&8å8å@ä@ä@å@åA&A&I$I$@ä@äQEQEIEIEA&A&@å@åAGAGA&A&A&A&AGAGR‹R‹AGAG0Ã0ä ä ä0Ä0ä0Ä0ã0Ä0ã(Ä(Ã0Ä0äHäHäAEAEA&A&QEQEA&A&A&A&I‡I‡8å8å0å0å@ä@ä0Ä0ãA&A&ZJbJR‹R‹I‡I‡A&A&@å@åQEQEYÇYÇQÇQÇAGAGI†I†AGAGA†A†I†I†AGAGbbR -R -YÉYÉAÇAÇA&A&8Ä8ä8Ä8ä@å@å@å@å@å@åIEIE@ä@ä8Ä8ä@å@å@å@åA&A&@ä@äA&A&I$I$A&A&HäHä8Ä8äQEQEA&A&@å@åA&A&AGAGA&A&A&A&ZJbJR -R -0æ0æ0æ0æ9†9†I‡I‡ å å(ä(ä(å(å8æ8æR‹k/jÍrÍc/c/bŒR‹R -R‹bŒj̓p{ok-k/ƒÏ”2‹ÐƒÐ“ЃЃГЃЃЃГЃÐc,ZJbŒR‹bŒZÌbŒbŒR‹jÍR‹bŒR‹R‹R‹R -R -R‹bŒc-jÍc/k/k/c/bŒc/c/bŒR‹R -R‹R -R‹c/k/bJR -R‹bŒc/ZÌbŒR -R‹R‹bŒk/“Ðk/k-ƒÐƒÏ”2ƒÐƒÐƒÐƒÐƒÏ“ЃЃГЃÐk/bŒR‹ZJZÌZJZÌZÌbŒR‹jÍbŒR‹R‹R‹R -R -R‹R‹jÍZÌc/k/k/s/c/bŒk/c/c/ƒÏZJR‹R‹R -bbZbjË{.YÇAGQEAGAÇAGAEA†A†QEAÇI†QÇQÇI‡QÇQÇI†AGAEAEQÇAGAEAGA†I†YÇjŠk/k-rËk-{,jÍ{,{.{.k/k-rËjÍk-k/rËj‰bZjŠjËj‰rËjËjËjËrËjËjËjY†YEY†iÇk/bIY†A&QÇAGAÇA†IEAGA†QEAÇQÇQÇQÇQÇI†QÇI†AGA$AÇQÇIEIEAGAÇY†b{oc,jÍ{,jËk-s-{,{.k/k-{,jÍ{.œ“{.j‰jIbbIjŠjËjËr‰jËjŠjËjËbŒQE@åI$I$YÉk-QEHä@ä0Ä0ä0Ä0ã8ÄHäAEHä0ä@ä0Ä8ä8ä8Ä8ä8Ä8ä8äA$IE@ä0Ä0ä@åI$bI{.aÇQEQEQEQEAGYEaÇY†I‡aÇaÇbŒc,QEQE@åQEI$HäYEYEYDYEYEYEYEYEYEYEY†Y†Y†jÍb8Ä@ä@ä0ä0Ã8ä0Ä@äHäAE8Ä@ä0Ä@ä0ä0Ä8ä8Ä8ä8ä8ÄIE8ä8Ä0ä8ÄQEYEk/jYEA&QEQEQEYEI‡a†aÇI‡Y†jIƒÒZQE@äQEQEI$YEYDYEYDYEYEYEYEY†YEA&@åaÇjÍQE@ä8Ä0ä(ä(ä8Ä0ä8ÄAE@ä0ä0Ä8ä0Ä(ä8ä(ä9$8Ä8ä9E8Ä8ä8Ä8ä8äQEjk/I‡QEA&YEI‡Y†I‡Y†I‡aÇI‡a†{.bŒY†QEA&QEA&QEQEQEHäYEa†Y†Y†I‡Y†I‡YEY†Y†bŒR -Hä@ä0Ä(ä(ä(ä0ä@ä8Ä@å0ã8Ä0ä(ä0Ä8ä8Ä(ä8äA$8Ä9E@ä8äA$8Ä@åY†k/bAGQEAGYEI‡aÇI‡aÇI‡Y†YÉjIƒoI‡YEAGQEA&QEQEQEQEQEQEY†QEY†Y†A&@åA$YÉc,YE8Ä8ä ä0Ä0ä(ä8ÄA$@å8Ä8äA$(ä8Ä(ä8ä8Ä9$8Ä9$@åIE8Ä8ä9$8ÄIEZk/aÇI‡YEI‡AGY†I‡aÇI‡Y†I‡aÇ{.k/QEQEA&QEA&I†A&I‡QEAGYEAGaÇYÉaÇYÉaÇYÉI‡jÍj@ä8Ä ä0ä0Ä0ä8Ä8äA$A$8ÄA$(ä8Ä8ä(ä8Ä9$8Ä8ä9E@åAE0Ä0ã8ÄIEQEk/bJY†Y†YEI‡AGI‡Y†I‡aÇI‡Y†jŠ{oYÉQEA&@åQEA&AGA&I‡QEYÉQEAGY†QÇI‡A&@åbc/YE8Ä8ä(ä(ä8Ä0ä(ä8ÄA$8ÄA$8Ä(ä8ä(ä0å9$(ä8Ä8ä9E@åAE0Ä0ã8ÄQEYÉjËYÉaÇI‡YEI‡AGY†I‡YÉI‡aÇYÉjËbŒIE0æ(ä(ä å0å9EA&A&YEI‡aÇI‡YÉYÇYÉQÇYÉYÇjÍbJ@ä0Ä0ä0Ä(ä(ä0ä8Ä8äA$8Ä8ä8Ä(ä8ä(ä9$(ä8ÄA$8Ä9E@å8ã8ä8Ä9EQEjÍbYÉaÇAGI†I‡YEI‡YÉYEI‡YÉjIƒoAG9E0å(ä(ä(å9E0åA&AGYÇI‡YEYÉYÇAG@åI$Zk/YE8Ä8ä8Ä(ä(ä0ä8Ä8ä8ÄA$0Ä0ä8Ä8ä8ä8Ä8äA$8Ä0ä8ÄIEHä0ä8ä@åHäYÇc,jYÉaÇAGI‡I‡YÉaÇI‡aÇI‡a†ZJbJ(ä0å1†Ä å å0æ ä ä8ÄA&AGQÇI†I‡IEAGAGY†c/ZHã@ä0Ä0ä(ä(ä@ä0Ä8äA$8Ä9$0Ä8ä8ã8Ä8äA$8Ä8ä0ÄIE@å8ã8ä8äI$QEbŒbIjI‡aÇI‡I‡I‡YÉaÇI‡YÉY†jk/9E0å0æ å å(å å å(ä8ÄAÇ8Ä0åQÇY†AGI†A&YÉk/YÉAG9E0å8Ä(ä0å(ä0ä0Ä ä0ã0Ä0ä1$0Ä0ä9$9E0å8Ä0æA&9E0åAGAGI†ZJbŒI‡AGI†I‡aÇAGY†AGI‡YEA&AG{,k/0Ã9EI‡A&@åA$9EA&@åAEY†I‡A&I†A&IEA&9EI‡c/bŒAGIE0å0å(ä8Ä(ä(ä0ä0Ä ã0ä(ä8Ä(ä8ä1$0æ9E(ä0åA&@å0æAGAGAGYÉZÌYÉAGAGQÇI‡Y†I‡YEI‡AGAGQEbƒÒ9…0åQÇAGA$9E@å9E@åAEQEA&9EA&{.jËk-rËk-{.k-bJbŒbŒZJR -bJR‹ZJc,bJR‹ZJR‹ZJbJRŠbŒZJc,bŒk,k/{.{.k-k-s.c,k-bŒbŒJYÉZJR -R‹YÉR‹bŒR‹bŒ{oƒÐk/bŒk-jË{,{.{.{oƒp{,ƒÐ“ЃЃÐ{o{,k/k/s-{.{,bŒbŒbŒZJZIR‹ZJbJbŒZÌZJbJZJR‹ZJR‹jŠZJbŒZÌjËk/ƒÐk,k-s-k.bŒ{.k-bŒZIJR -bJZJR -R -ZÌZJbŒc/ƒÐ{.c,bŒ{.jË{.{.{oƒp{,{o“Ð{oƒpIEIEQEQEQEQEI$8ÄIEAEAE@åIEQEbZJAÇa†QEQEYEY†YEQEIEQEQEQÇIÇbŒZQÇQEY†AGQEQEA&I†AGA†I†I‡QÇYÇYÉbQÇYÇYÉRZZYÉYÇZZZJjŠbbYÇZZYÇY†Y†Y†QEQEQE8ÄAEI$A&IE@åQEY†bŒIÇQÇYEQEQEY†YEY†AEIEQEQEQÇR‹bIYÇY†I†Y†AGIEQEAGQEAGAGQÇI†YÉYÇYÉYÇRYÇYÉZIZIYÇRZZbbŒbbAGA$A†8Ä0å@åA&@å@å8Ä9E8ä@å@åA$IEA&jc/Y†YEa†YEY†Y†aÇY†AGQÇA†IEI‡c-ZAGQEA&IE@å9EA&@åAE8ÄA&IEA&QEA&QEA&AGAE@åA$8ÄA&AGAGYEYÉZYEA&YEA&QEA&QE@å@åQE@å8Ä9E8ä@å8Ä9EA&QEY†k/ZYEY†YEaÇYEI‡Y†QÇY†I†AGAGbŒZJI†A&AG@åQE@å9EA&8Ä9EA&A&@åIEIEIEA&I†A&IE0å8Ä@åA&AGQEY†bI‡QE@ä8Ä0å8äA$@åA$9E@å9$0å9E8Ä9EA&@åY†bbŒ@åYEY†aÇY†Y†Y†aÇI‡QÇAGI‡AÇbŒaÇI†A&IEA&@å@åIE@å9E@å9EA&QEA&QEA&AGQEA&IE0æ9EA&IEA&QEa†YÉAGYEI‡A&YEA&QE@å@å9$@å8Ä0å9E8ä9EA&@åIEI‡jÍI†YEY†Y†Y†a†a†aÇY†I‡I‡I‡9†ZIjŠI‡A&QE@å9EA&@åAE8ÄIE@å9EQEA&QEA&AGQE@åA&A&9$A&A&IEA&Y†YÉYEI‡YEA&8Ä8Ä0æ8ä9E8Ä0å8ä9E@å0åA$9E@åIER -bŒ8ãY†a†Y†a†a†aÇa†I‡QÇI‡AGZIZJYÉIEA&A&IE@å9E@å9E@å9EA&A&AGI$A&IEA&AG@å9E8Ä9EA&A&QEAGa†bI‡QEAGQEA&AGI$@å0å8Ä9E8ä0æA$0å@åA$9EA&YEjÍA&QEY†Y†a†a†aÇaÇaÇAGYÇA†A&R‹bI‡A&A&AEA&8ÄIE@å9E@å9EA&AGQEA&A&IEA&A&9E@å0åA†A&QEA&YEZJI‡YEA&8Ä@å8ä1$8Ä0æ8äA$(ä0å@å9$@å9E8åA&YÉZÌY†aÇa†iÇzzzjjAGI†A†YÉbŒQÇIEA&IEA&0å@å9E8åIEA&9EA&QEA&IEA&A&IE@å9E8Ä(äA&IEA&YEYÉR -YEAGQEA&QEAGQE8å8Ä9E8ä8Ä9$0å9E@å8Ä@å9EI‡bŒYÉY…iÇjqÇzzaÇiÇQÇAGAGI‡bŒYÉIEA&IE@å9E8å@å@å9EA&@åA&IEA&A&IEA&AGA&8Ä9E8ä9EA&QEQEY†ZJYÉQE@å8ÄA$8ÄA$8Ä8äA$8Ä8ä9$(ä@å9$@åIEIEYÉbŒQÇQÇAGYÉbzYÉa†aÇ@å9EA&R‹ZIIEA&QEA&@åA$0åIE8å@å9EA&@åQEA&QEA&IEA&@å0åIE@åA&IEAGQEa†bŒYEQEAGA&QEA&A&Hä8ã8ÄIE(ä8ä8Ä0åA$9EA&A&YEZÌYÉQÇI‡Y†YÉjjrYÉAG8Ä9†9ER‹I†AGQE@å9EA&8Ä9EA&8Ä9EIE@åIEA&QEA&IEA&@åA$9EA&@åIEA&QEYEZJYÉQEQE8Ä8äA&A&9†A&9E9E9E9EA†0æA&A†A&AGR -R‹(ä ä Ä Ã Ä(å0æ ä åJR -AÇbŒR‹A&0æA&0æ9†0å0å8Ä(ä0å@å0æAG9EA&A&A&A&@åAE8Ä8ä9EA&AGY†I‡YÉjÍR -YÉI‡YÉI‡I‡I‡A&AGAÇ9E@å1† ä8Ä9EA&A&AGI‡ZÌAÇ Ä ä£ ä(ä0æ Ä(äAGBBJjÍAGA&0æA†8æ0å@å8Ä8ä0æ8Ä0æAGA&A&9EA&A&I$@å0å8Ä8äA†AGI‡AGI‡bŒbŒI‡YÉI‡I‡k/c,k/jËbŒƒÐc,ZJc,jŠZJR -bŒbŒc,k-bJR -R‹JZJbŒc,j̓pƒÐk/k/{.{.k,{.k/k,s/{ok/c,jÍc,bŒ“Ðk/k/k-s-k.bŒjËk/ƒÐk/c/{.ƒÐk/{.{.{.{.{.{.{.{oƒp{.{,bŒjŠjŠbŒjŠI‡R -R‹ZJbJbŒZÌk-bŒR -R‹JR -ZÌbŒc/k/ƒÐ{o{.{.{.k,{.k,k/s-{.ƒÐZÌc,c/bŒ{σÐc,k/jÍs-jÎbŒk-ƒÐƒÐZÌk/ƒos.{.{.{.{o{.{.{.{oY†Y†Y†Y†QÇ{obŒ@åIEI$@å9EIEAGQEA&QÇI†I‡Y†AGI‡QÇQÇQÇQÇQEIEIEA†I†QEQÇaÇQEjË“ÐbI‡I‡QÇAÇQEAÇQEAGQÇQEYÇZƒÒjËbZYÇZZYÇYÇQÇI†I‡Y†Y†I‡YEYEYEYEYEjËAGQEA&@åAE@åQEI†QEAGQÇY†AGI‡I†QÇQÇYÇQÇAGQEIEQEAGQEQÇY†Y†Z“Ðc,I‡QÇI†I†I†I†I†I†I†Y†I†YÇ{,{obbYÉbbYÇjI†I‡Y†I†aÇQEQEY†AGYEk-bIEA&I$QEA&I$QEIEIEA&QEIEA&I†YEAGQEY†AGQEA&IEI$IEQEQEY†YEjË“ÐR -IEQE@åQEQEAGQEQEQEQEYEYÉ{.QÇQEQEYEAGQEQEAGQEA&AGQEQEQEQEQEYEaÇYEYÉAGI$@åQEI$IEQEA&QE@åQEIEA&QEI†YEAGQEAGIEQEA&AEIEIEQEY…Y†bƒÐjÍQEQEQEQEA&QEA&QEQEA&Y†YEjÍbJQEAGQEYEA&YEA&QEA&I†QEAGQEY†A&QEYEbŒI‡IEI$A&I$I$AGI$A&QEI$QEA&IEQEA&QEQEYEAGIEI$IEQEQEY†Y†Y…QEjŠ{ÐYÉIEQEIEIEA&QEIEA&A&QEYEYÇ{oI‡YEYEI‡QEYEAGYEY†QEA&I†AGQEA&Y†I‡YÉY†ZJAGHäQEI$QEA&I$QEA&IEIEQEA&I$A&QEQEQEQEA&I$IEQEQEQEY†Y†QEaǃÐZJQEAGQEA&QEA&QEQEA&QEYEYE{.bŒQEYEQEYEAGYEY†AGQEAGQEQEQEA&QEAGQEbR -@åI$I$QEQEI$QEQEQEQE@äA&I$QEQEIEQEYEQEQEQEY†YEY†Y†Y†QÇY…j˃ÒI…QEA&A&QEA&QEA&I$A&QEAGiǃoZYEYEQEQEYEYEQEYEA&I†AGQEQEAGAGY†YÉYÉbIQEI$I$I$QEI$QEQEQEI$@åI$QEA&QEIEQEQEQEQEQEQEYEY†Y†YEaÇY…Z{ÐbŒ@åIEA&I$A&QEA&A&I$A&Y†AGjËjÍYEYEYEYEY†AGQEYEQEAGQEQEIEQEA&QEAGZJb@åQEHãI$QEQEQEHäHäQEQEI$QEQEQEHäY…aÇYEY†QEY†YEQEY†Y…aÇa†jŠ{oRA&QEA&QE@å9EQEA&IEQEAGY†k/iÇY†YEYEYEYEAGYEY†QEA&I†AGQEA&Y†A&QÇYÇbŒQEQE@äI$QEQEQEQEHäI$QEQEQEI$QEQEYEYEYEYEI†YEY†QEY†Y†Y†Y…bƒÐZJQEA&QEIEA&A&AEIEA&IEQEYEjËbŒYEY…YEYEQEYEYEY†QEAGQEA&@åQEQEYEY†YÉYÉ@åHäI$A&HäQEQEQEQE@äI$A&QEQEQEY†Y…a†QEQEY†Y†Y†Y…Y†aÇQ…Q…ZƒÐYÉQEA&IEA&A&I$A&IEA&AGI$AGk-QÇY…Y†YEY†YEYEaÇYEYEQEAGQEQEIEAGQEQEA&ZJAGHã@åI$QEQEHäQEQEA&HäIEI$YEYEYEY†YEY†QEY†Y†Y†QEY…aÇY…YEY†k/c-@åQEQE@åAGAEI$A&QEAGQE@åZJbŒYEY…a†YEY†QEa†YEY†QE@åIEA&AGI‡AGYÉjÍR‹A&9E0åIEA&A&AGI‡AGAGI‡I‡AGI‡I‡YÉAGAGI†AGAGAGAGYÇRYÉbbŒbŒk-bJ0åA&AGA&AÇAGAGAGAGI‡ZJZÌ{.R -I‡A&AGAGYÉAGI‡YÉYÉYÉYÉRAGAGI‡AGI‡R -ZÌI‡8æ9E@å8æA&AGAGAGAGI‡I‡AGBI‡I‡I‡AGAGAGAGAGAGQÇYÉYÇR -jŠjËbŒk,A&AGAGA†AGAGAGAÇAGAGBbŒk/bŒI†I‡AGI‡I†I‡I‡I‡YÉI‡I‡I‡k/ƒÐ{oƒÐƒÐ{o{.{Ïk/{.{os.k/k/k-s-k-bŒk,k/c,bŒk-{.k/k,ƒÐƒÐk/{Ï{oƒÐ“ЃД0œ“{Ï{o{.ƒÐƒÐƒÐ{oƒÒƒÐƒÐ{Ð{o„0œ““σÐ{o{.ƒÐƒÐƒÐƒÐ{oƒÐ„0”“Œ“”“œ““ЃÐ{Ð{ЃÒ{Î{ps/{.{ok.s/k/k/k,s/jËc,k/jÍbŒk/s-k/k,ƒoƒÐ{Ï{.{o{σЃϓМ“ƒÏ{Ð{.ƒÐ{oƒÐ{oƒÐƒÐƒÒ{Ðk/“М““ЃσÒ{.{.ƒÐƒÒƒÐƒÐƒÐƒÐ”“Œ“”“QÇA†QEAGQÇA†QEAÇQEAÇZZJQÇAEQEIEIEQEIEIEIEI$IEYÇYÇJI‡IÇZIQÇAGA†I‡AÇQÇYÇYÇZIIÇZQÇZQÇZQÇQÇI‡QÇQÇA†I†AGYÇbZJZIAÇIEA†A†AGAÇAGQÇAÇA†I†I†AGQÇIEAGI†QÇQÇZJJIEQEQ…IEIEIEIEQEAEIEQEZYÉJQÇIÇYÉAÇAGQÇAÇQÇI‡ZZIYÇIÇYÉYÇIÇZIYÇIÇQÇAGYÇQÇAGQÇQÇQÇbZJZI9EA&A†A†AGAÇAG@ä8ã@åHä8ä8Ä8äHä8ä@åY†R‹HäHäHä@ä@ãHä8äHä8ã8Ä@åI$QEbŒA&AE@ä@ä0Ä8äAE@åHäAE@å@åQ…QEQEQEQEQEA&I$A&I$A&@åIE@åIEQEjÍI‡8Ä@å8ä9E8ÄA$8ÄA$8ÄIE8ä@åHä8ä8Ä8ãHä8äAEZJI†HãI$@äHä@äHä@ä0ÄHä8ã@åI$jR -8ãAE@ä0Ä8ä@å@åAEHä@åHäIEQEIEQEQEI$QEA&I$QEA&@åAE8ÄIE@åj‰bŒ8Ä8ä9E8ÄIE8ä8ÄA$HäHä8äHäI$8ã8äHä8ãHäI†ZJHä@äHäA#HäI$Hä8ãA$8äI$8ÄI$ZJA†Hä8Ä8äA$8ÄAE@åAE@åI$IEQEA&HäQEQEQEQEA&QE@åAEAE8ÄIE@åQEk-R@åA$9E8Ä9E@å9E@å8ä9E8ÄHä@äI$0ÃHä8äHäHäbIAGHäHäHä@äHãI$8ãHä8äHäA$@äZIÇ@å@å8ãA$8ÄAE8äAE@åIEIEIEQEA&QEQEQEQEA&QEA&HäAE8ÄIE@åA†jIbŒA&@å8ÄA$@å@å8ã@åHäHäA$8ãHä8äHä8ãHäHäY…R‹HäHäA$HäI$I$Hä8ãHäI$0ÃAEI$jŠ@å8ÄA$8Ä9E8ä8ÄAEHäAEIEI$A&I$QEQEQEA&I$8å@åAEI$@å8Ä9EQEAGjËYÉ8ÄA$8Ä9E@å8ä8ÄA$8Ä0å8ã@åHä@äHä8ã@äHäI$ZJA†HäHäA$HäI$@ãHäA$8äHäA$HäZR8ÄA$8ÄA$8Ä9$@åA$AEI$QEA&@åIEHäQEQEA&@åHäA$A$IE8Ä9EA&HäbIbŒ8ãAE8Ä9E8äI$8ã8ÄHä8ä@ãHä8ä@ãHä@ä@ãI$I†bŒHäI$HäI$I$I$I$I$8ãI$HäI$@åYÉ9$8ÄA$8Ä0ä9$0Ä@åI$@åIEI$A&I$@åI$QE@åQE8ÄI$@å@åAEHäAEI$YEjÍAÇ0Ä0ä8ä@å8Ä8ä9E8Ä9E8ä8ÄI$@ã@äA#@äHãI$HäRŠI‡HäI$I$I$I$I$I$8ãI$8ãIE@äQÇAG8ã8ÄA$(ä8Ä0äAE8ÄI$A&I$QEA&HäQEI$QE@å@åI$8ÄAE@å@åI$QEQEZbŒ0Ä0ä0ÄA&8Ä8ä8ÄHäHä@ä@ã@äHã@ä@ã@äHãHäQ…jŠ8ÄHäI$@ãI$I$HäI$HäA$I$8ãIEQE9E8ã8ÄA$8ä@åI$AEI$QEQEQEQEYEQEQEQEQEQEQEQEI$I$QEA&I$AGHäjŠI‡8Ä8ä8Ä9$8Ä9$(ä8Ä8ä0ÄA$8äHä@ã@ä@ãHäHäHäjIJ@ãHä@äI$HäI$I$HäI$HäHäI$A†IE8Ä8äHä0ÄAEHäHäIEI$QEQEQEQEQEQEQEQEQEHäQEQEI$QE@åIEQEQEYÉZJ8ã@å0Ä8ä9$8ÄA$8äA&A&I$A&QEA&8Ä8ä@ä8äAGbŒJQEA&I$QEI†Y†A&AEIEIEIEAGbI‡I‡AG8Ä8ã@åAEI$A&I$Hä@åA&QE@å@åHäQE@åHäQEA&A&@åQEA&QEI‡k/bJ9&0æ9$1†(ä(Ä0å0åAGAÇAGAGAGQE8å8Ä@ä0äAEZJR -AGIEI$IEI†YEA&IEAEIEIEQEYÉJAGI†A&8ã@åAEI$A&I$QE8ÄHäA&Hä@åHäQEA&HäIEHäAG@äQEA&A&A&ZJR‹8æ0æ9$A†(å ä(ÄA&bŒc/k/bŒk/k/bŒZÌZJR‹bŒc/{Ð{.k/k-ƒp‹Î“ЃЃÐ{.ƒÏ“ЃЃЃЃÐk,k/RŠbŒbŒbŒbŒc,ZÌjÍZÌbŒbŒbŒbŒR‹R‹R -R‹bŒk/k/s/{ok/{М“œ“{o{σЃÐk/c,k/ƒosЃғЃσÒc,bŒbŒR‹ZJbŒjÍs/ƒÐk/k-{.“ϋЃЃЃÐ{σЃÐ{.ƒÐ“ЃÐk-bŒZJbŒbŒbŒZÌbŒjÍjÍrÎZÌbŒbŒR‹R‹R -bŒbŒc/jÍk/ƒok/k/k/s/k/c/k/ƒÐZJbŒR‹R‹bY†bbjŠ{oY†IEA&QEAÇIE@åA†AEQEA†AGI†QÇQEAÇI†I†IE@åA$AÇI†QEIEA&AÇYEjŠ{orËjËjÍjËs-jËk/{,jÍ{,jÍ{,k-k-jŠbIZJbbbIjIjŠj‰jŠjŠjËj‰rIjËjËjIb{,bŒQEQEIEA&AGA†9†AE@åIEQEA†AÇI†QÇI†I†Y†IEA&A$AGI†AEAEA†QEI†b{.k-jŠc,jËk-rË{.jÍ{.{,jÍjË{.”0s.rIbIZbj‰j‰jŠjËj‰jŠjËjIbŒQEA&HäHäaÇk/QE@ä8Ä8ä(ä0Ä8ä0ÄHäAE@ä8Ä8ã8Ä8ä8Ä8ä8Ä8ä9$8ÄA$IE8Ä0ä0Ä@åQEjk/aÇQEQEQEQEYEI‡YEaÇaÇI‡a†jÍbŒQEQEI$QEHäHäYEHäYEYEYEYEYEY†QEYEYEYEbŒjŠ@ä8ÄHä0ä8Ä0ä0Ä0ä@äAE@å8ãHä0Ä@ä0ä0Ä8ä8Ä8ä0ÄA$IE8Ä8ä0Ä8äQEYEk/bIQEQEQEQEQEYEI‡Y†aÇYEI‡jI“ÐR -QE@åIEHäQEYDYEHäYEYEYEYEYEY†YEIE@åZjÍQE@ä8Ä0ä(ä(ä8Ä0ä8ÄAE@ä0ä0Ä8ä(ä8Ä(ä8ä9$8Ä8ä9E@å8Ä8ä9$8ÄI$bk/I‡QEA&YEI‡I‡I‡aÇI‡Y†I‡aÇ{.bŒY†AGQEA&QEQEAGYEQEQEYEa†Y†YEAGa†YÉYEbŒbŒHã8Ä8ä(ä0Ä(ä0ã0Ä8äIE@ä0Ä0ä8Ä0ã(ä8Ä(ä8ä9$8Ä8ä9E@ä8Ä8äA$@åY†k/bYEAGQEI‡I‡aÇI‡aÇI‡YÉY†jŠ{oQÇQEQEQEA&QEQEQEQEQEYEI‡YEYEY†A&@å8ÄZk/QE@ä(ä(ä0Ä0ä0Ã8ä@åA$8Ä8äA$(ä8Ä(ä8ä1$8Ä8ä9$@åA$8Ä9$8Ä8äIEbk/YÇaÇYEAGAGY†I‡aÇI‡YÉYEYÉ{,k/QEQEA&AEA&AGQEI†YEAGQEAGa†Y†YÉYEYÉiÇbJbŒHä0Ä8ä(ä8ä(ä0Ä8ä8Ä9E@ä8ä@å0Ã8ä(ä8Ä0å8ä9$8Ä9EA&Hä8Ä(ä8äA$YEk/bJY†I‡YEI‡AGYEI‡aÇI‡I‡Y†jŠ{oYÉQEA&@åA†QEA&I‡QEI‡Y†I‡YEI‡QÇI‡A&@åbc/YE8Ä8ä(ä(ä(ä8Ä0ä8Ä8ä9$8Ä8ä(ä8Ä(ä0å8ä1$0å8ÄA$9E@å0Ã8ä9EQEYÉbŒbI‡I‡I‡YEI‡I‡YEI‡aÇI‡YÉ{,bŒIE0æ(ä(ä(ä0æ1$0æA&Y†AGa†YÉYÉaÇYÉQÇQÇbŒjË@ä@ä8Ä8ä(ä(ä0Ä(ä8ä8Ä8äA$8Ä(ä8ä(ä8Ä1$(ä8ÄA$8Ä9E@å8ã8ä8ÄIEAGjËjYÉI‡YEI‡AGI‡aÇI‡Y†I‡aÇjIƒoAG9E0æ!$(ä(å0å0åA&AGYÉAGAGYÇYÇAG@åI$Zk/YE@ä@ä0Ä(ä(Ä0Ä0ä8ä@å0ÃA$0Ä8ä8ÄA$8ä8Ä8äHä0Ä8äIE8ä8ã8ä@ä@äYÉjËbjaÇI‡I‡I‡aÇYÉI‡YÉI‡a†{,bŒ(ä0å1†Ä å å å(ä(ä8ÄAGAÇY†I‡Y†AGQEIEbŒbŒ@ä(Ã0Ä(ä0ã(ä(ä8Ä0äA$8Ä0äA$8Ä8ä8ä8Ä8äAE@ä0Ä8Ä8ÄIE@ä0ã8äI$QEbŒZJqÇYÉI‡Y†I‡aÇI‡YÉaÇI‡YÉb{o0å0å0æ å å å0æ(ä(ä0ÄQÇ0Ã8äQÇQÇI‡I†A&ZJc/bAG8æ0å0å0å8Ä0å(ä0ã(ä0Ä(ä8ä1$(ä8Ä9†A&1†(äA&A&0æAGAGI‡AGZJbŒI‡AGI†I‡I‡YEAGAGQÇAGQEQE{.k/0ÃA&AGAGAEA&IEIEA&AEQÇZbZJbbJZJJk/k/I‡9†AG0æ0å0æ8Ä(ä8ä(ä0Ä ä(ä(ä8ä(ä8Ä9E8æ0å0å9EA&0æA†A&I‡AGJjÍYÉAÇI†I‡I‡Y†AGAGI‡AGYEA&bƒÒAF9EAGQÇ8ÄA†A&IE9EA&QEAGA†A&{,jÍjËrÍjË{.bŒbŒbŒbŒRŠbR‹ZJbŒc,bŒR‹ZJR‹jŠZJbJbŒR -bŒc,k-k/{Ï{,c,k/jËc,k/c,bJR -R -R -R‹ZJbJZJbŒR‹bŒ{σÐk/c,k-{,jË{.{oƒp{o{,“ЋД2‹ÐƒÐƒÐ{Ï{orË{.{.ZJbŒRŠbŒZIZIbŒR‹c,ZÌZJbJZJbJZJR‹bŒZJc,bŒc,{.{Ï{.k-k-s.jÍjËk-ZÌZJRR -R -R‹ZJbJZJZÌZJs/ƒÏk/k/c,{,jË{.{,{oƒp{o{.“σÐ{.IE@åQEIEQEQEQE@ä8ÄIEIE@åIEQEbZJAGY…YEQEYEY†QEQEAEQ…IEIEQÇbŒZYEAGY†AGQEIEIEA&A†IEAGY†AGQÇYÇYÉQÇQÇI‡YÇbI‡YÉYÇZYÇbbŒbQÇZbIYÇY†YEQEHäYEQEQE8Ä@åIEAE@åIEI$I‡jËI‡Y†Y†QEQEY†QEQEIEIEQ…QEAGZJbIQÇAGY†AGQEIEA&QEA&AGAGI†Y†AGZYÇYÉQÇQÇYÉYÇJYÉQÇYÉaÇZbŒbY†AGA$9E8Ä9E@å@åA&@å8ÄA$0å8Ä9E@åQEQEbc/YEY†YEY†Y†YEaÇY†I†AGQÇIEI‡c,YÉAGAGA&IEA&@åIE@å@å9EA&A&IEQEA&QEA&AGI$A&0å8ÄA†A&AGYEYÉZQEQEA&QE@åQEA&I$A&@å@å8ÄA$8Ä8ä9E@äA&QEYEjÍbYEYEYEY†YEaÇY†Y†I†I†I†AGbŒZJY†A&IEA&@åIE@å9EA&8ÄIEA&A&QEA&QEA&AGQE@å9E0å@åA&QEAGa†bI‡QEA&8Ä8ä8ä8Ä9E@å8äA$0å9$9E@å@åA$9EAGjbŒ@åYEaÇYEaÇY†Y†aÇI‡QÇAGI‡AÇbŒZYEA&IE@å9E@åA&8Ä9EA&A&@åIEA&QEA&AGQEA&A&9E0åAGIEA&QEa†YÉAGYEI‡QE@åA&QE8å@åA$9E8Ä9E0å9E8äIE@åA&YÉjÍAGQEa†aÇI‡YEa†aÇI‡QÇI‡AGA†R -jIAGI†A&IE@å9EA&@åA$9EA&@åQEA&QE9EAGQE@åA†@å0åAGIEA&QEYEYÉI†Y†YEA&@å8Ä9E8ä0åA$0å8Ä9E@å0å9$A&@åIEYÉZÌ8ÄYEaÇY†a†aÇaÇaÇI‡Y†I‡A†JbŒQÇAGQEA&@åIE0åIE@å9E@å9EA&I†A&IEIEA&A&IE0å8Ä9EA&AGI$YEYÉYÉQEI‡QEA&QE8åA&@å8Ä8ä9E8Ä0å@å9E@å0åIE@åI†k-AGQEYEaÇYEiÇYÉa†a†I‡QÇAGA†R -bAGI†A&@å9EA&8ÄIE@å@å9EA&A&QEA&IEA&AGA&@å9E8ÄA†A&IEA&YEZJI‡YEA&@å8Ä8ä(ä@å8Ä9E8ä(ä0å0åA$@å9E8Ä9EbZÌYÇa†iÇjzzziÇjAGQÇA&R -bJQÇA&AG@åIE0å@å9E@å9EA&IE@åA&QEA&A&AGIE@å9E8Ä8äA&IEA&YEYÉbI‡QEA&A&QEA&I$8ÄAE8ä@å(äA$0å@å9$@å8Ä9EAGbŒbY†aÇiÇzziÇziÇQÇAGI†AGbŒYÉA†QE9EA&A&8Ä9E8å@åA&9EIEA&IEA&A&AGQE@å9E0å8Ä9EA&A&YEY†ZJaÇA&A&@ä8Ä8Ä8ä9$8Ä8äA$8Ä8ä8Ä9E8ä9EA&QEYÉZÌI‡QÇAGaÇYÉjYÉa†I‡A&8ÄAÇI‡R -QEIEA&AE@å8Ä9E@å8ä9EA&8ÄIEIEA&QEA&IE@å@å9E@å9†@åIEA&YEYÉZJYEA&YEAGHäQE@å@åHä0ÃIE(ä8ä8Ä9E8ä9EIEA&Y†bŒRI‡I†I‡YÉbjYÉYÇAG8ÄA†A&R‹QÇA&QE@å9E@å8Ä@å9E8ä9EA&A&@åQEIEIEA&A&8Ä9EA&@å9EQEA&QEYEZJYÉQEQE8Ä8äAGA†AGA†9E9E9E9†AG9†A&A&AGAGZJR‹(ä(äÄ £ Ä(å0æÄ0æR -BBc/ZJAG0æA†A&AG0å0å@å0æ8Ä9EAGAGA&A&A&A&A&A&9E8å0å@åA†AGI‡I‡YÉjÍbJYÉYÉI‡I‡AGA&IE8Ä9E8ä(ä(ä(ä0å0æAGA&AGRc-AÇ ÄÄ Ä(ÃÄ0æ(ä åI‡BAÇR -c/AGA&AG0æAG0æ9E0å@å1†8ÄA&AGA&A&A&A&A&A&IE8å8Ä9EA&AGI‡I‡YÉjŠbŒYÉYÉYÉI‡k/jËs/jËbŒƒÐk/bJc,bR‹ZJbJZÌjËk-bJZJbJJZJbŒc/k-{σÐ{.{.{.{,k,k/s,k/c,ƒÒ{.c,c,c/bŒƒÐk/k,s/c,{.c,jÍk/ƒÐ{oc,ƒp{o{o{.{.{o{,{.{.{.k/jËs-jËjÍbŒZJR -R -JR -ZIbŒR‹RŠjÍjËbJR‹ZJR -bJbŒc,k-{.ƒÐ{os.k-{,k-k,s/k,k/{.ƒÐk-bŒk-ZÌ{oƒpc/k-k-s-k.bŒk-ƒÐƒÒbŒ{oƒp{.{.{.{.{o{.{.k-{.Y†Y†Y†AGY†ƒÐjŠ8ÄQEA&@åAEAEQEA&QEAGQÇAGI†AGQÇI†Y†QÇI†QEIEIEIEA&QEQÇY…Y†jŠ“ÐR -QÇQEI†I†AGI†AGQEI†YEY†YɃÐjŠbZQÇYÇYÉY†Y†I‡I†AGQÇY†YÉY†YÇ{,bŒIE@åI$AEI$A&8ãQEQEA&AGI†I‡Y†AGAGQÇI†Y†I‡QÇIEQEA&IEI†QEQEY†Y†ZƒÏk-Y†I†I†I†A&I†I†QEA&Y†Y†Y†k-{.bZQÇYÇYÉYÇaÇI†AGY†I†Y†QEQEY†AGYEk-R -IEI$I$QE@åQEQEA&QEA&QEIEA&QEAGQEAGQEYEA&IEA&IEIEQEYEY†YEjË{ÐbIQEA&QEQEA&QEQEQEA&YEAGiÇk/I†YEAGYEYEQEAGQEAGQEA&I†AGI†YEYEZJbŒHäHäHä8ä@åQEIE@åQEQEA&I$QEA&QEIEAGQEAGQEY†IEIEA&IEI$IEQEY†Y†bƒÐk-I$AGQEQEQEA&QEAGQEQEAGYE{,ZJQEQEYEI‡QEQEA&QEAGQEQEAGQEY†A&QEYEZJR@åQE@åI$QEQEA&I$QE@åIEI$IEA&IEQEQEY†QEQEA&IEQEQEYEY†QÇYEjŠƒÒI‡QEAGQEA&QEA&QEA&QEAGYEYǃÐI‡YEYEYEAGYEYEAGYEI†AGQEA&I†I‡YEjËbJI$@åHä0ÃA$IEI$QE@åIEIEI$QEIEA&IEI$AGQEQEQEQEA&IEQEQEQEY†Y†QEaǃÐZJAGQEQEA&A&QEQEA&QEIEYEYEjÍbŒYEYEYEAGQEYEYEI†YEA&I†QEQEA&QEA&YER -YÉ@åI$I$QEI$QEI$A&HäQEI$A&I$QEQEQEQEYEY†QEQEQEYEY†Y†Y†Y…Y…j˃ÐI‡A&I$A&I$A&QEA&AEA&IEQEa†{obYEYEY†QEYEAGYEYEQEAGIEA&AGQÇjbJbŒI$@ä@å8ãI$I$QEA&QEHäQEQE@åI$A&I$QEQEQEYEY†QEQEQEYEY†Y†Y†Y†Y…bIƒÐZJAEQE8åQEA&QE@åIEA&A&QEYE{,bŒYEY†YEQEYEAGQEYEAGQEA&QEIEQEA&QEI‡jbJ@äIEHãHäQEQEQEQEHäQEQEQEQEQEQEQEYEY†Y†QEY†QEY†YEaÇY…aÇY†bŒ{ÏYÉIEIEA&QEA&@åQEIEA&QEQEaÇjÍZa†YEYEYEYEQEYEY†QEA&QEAGIEY†I‡jÍbŒI$@ä@å8ã@åIEI$QEQEQEHäQEIEHäQEQEQEHäYEa†Y…Y†QEYEY†QEY†aÇY…a†bk/c,I$A&AGI$A&A&AEQEA&IEQEYEbŒbŒY…YEYEYEYEQEYEY†YEAGQEA&@åQEQEYEI‡bJI$@äI$A&QEI$QEI$QEI$@åIEI$QEYEYEYEaÇQEQEYEY†Y†Y…Y…QÇYEQ…bƒÐRA&QEA&A&QE@åIEIEA&AGI$A&c/aÇYEY†YEY†YEYEY†YEQEQEQEIEIEIE@åbŒbŒ@ãHä8Ä@ä8Ã8äI$QEQEI$QEI$I$QEI$QEQEY†Y…Y…Y†IEYEY†Y†Y…Y…Y†Y…QEY†k/k-HäYEA&IEA&I$A&IEA&QEA&A&bIbŒYEY…YEY†Y†YEY†Y…YEQEA&HäA&AGI‡AGZJbŒbŒAG8æA&A&A&AGAGJI‡AGRAGI‡I‡I‡YÉAÇI‡AGAGAÇI‡AGYÉRbZJrËjÍc,ZJA&AGAGA&I‡BAGBAGI‡R‹jÍ{.R -AGI‡AGI‡I‡JI‡YÉYÉJR -I‡JI‡R -ƒÐƒÐbJAGAG9EA&AGA&AGI‡AGI‡BI‡I‡I‡JI‡YÉAGI‡AGAÇAGAGYÉRYÉZJjŠk-c,jÍA&AGAGAGAGJAGI‡AGBR -bŒk/bŒI‡I‡AGI‡I‡I‡I‡YÉJYÉBI‡k/ƒÐƒÐƒÐƒÐ{o{.{pc-ƒÐk/{Ïc/k-{.bŒk/bŒk,k/c/bŒk-{.c/k-{.ƒÐ{os/{σЃσГЌ2ƒÐ{.{.ƒÐƒÐƒÐ{oƒÐƒÐ{Ð{Ð{o“Д0‹Ð“Ð{o{Ïk/“ЃÒ{Ð{ГЃҔ“Œ“œ“œ“œ“”“œ“”“ƒÐƒÐk/k/{.ƒÐk/k/s,k/k/k-bŒc,k/bŒk-bŒk/k/s,k/ƒÒƒÐ{.{Ï{oƒÐƒÏ“ÐŒ0“ЃÐk/{σЃЃÐ{Ѓ҃Ð{Ðk/ƒÐ”2‹Î“ЃÐk/ƒÐƒÐ{ГÐsЃЃҔ“œ“ƒÒA†QEA&AGA†IEAGA†IEAGYÇRŠQEIEIEQEI$IEIEIEI$AEAEY†Y†R -IÇQÇAÇQÇA†IEAGQÇAGYÇYÇRYÇIÇYÇYÇIÇYÉQÇI†I†I†I‡I†I†I†I‡Y†bŒZIAÇA$9EA&A†A†A&AÇIEAGAEA†A†QE9EI†AGQEAÇjŠI‡IEIEQEIEHäIEIEIE@åI$I†aÇRRAÇQÇQÇA&AGAÇQEAÇQÇQÇYÇRQÇQÇYÇQÇQÇQÇAGQÇQEI‡QÇA†I†QÇY†ZZJR9E9EIEA&AÇA&A†@åHä8ã@åHä8ä8ãHä8ä@åY…ZJ@åHäHä@äHä@ãHä0Ä8ãHä8äI$QEjŠA&AE@å@ä0Ä@åA$8ÄAE@åHäAEQEQEQEQEQEI$A&IEQEQE@åIE@å9EA&QE{,AG@åA$@å9E@å8Ä9E@ä8äHä8ÄHä8ä@å8ã@å8äHäAEbIAGHäHä@ä@ãHä@äHä8ãHä8äI$@åbR -8ã@å8ÄA$0ÄAE@å@åAEI$A&I$AGHäQEQEQEQEQEA&IEI$@å9E@åA&IEbIZJ8ÄIE8å8ä9E8Ä8äAEHä8ãI$8ã@åHä8ä8ã@äHäQÇR -I$8ãI$I$8ãI$I$8ã8ÄI$8ÄI$AEZJIE8Ä8äA$8ÄA$8ÄIE8äQEAEI$A&QEA&HäYEAGIEI$A&@åIE@å8Ä9EA&YEk-YÉA$8Ä9E8ä9E@å8Ä8äAE@ãHäHäHä8äHä8ã@ä8ãI$ZJA&HäI$HäA#HäI$8ã8äAE@ä8ãHäbIÇ@åAE8ã@å8ÄAE8äAEI$A&I$QEA&QEQEYEA&QEA&I$A&I$A&8ÄIE@åIEbIjÍ8ÄIE0å8äIE@äHä@äHäHä8äHä@ã8ä@ãHäHä@ãY…R‹8ãI$@åHäI$I$8ã@åA$HäA$8äQEZJ8ÄAE8ä8ÄA$8ÄA$A$9E@åIEQE@åI$QEQEQEA&I$@å@åAE@åAE8ãIEQEQEjÍI‡8ÄA$8Ä9E@å8ä9E8ÄHä0ä8äHäHä8ä@ãHä@äHäI$ZJAGI$I$HäA#I$HäHäA$@äHäA$@äbR8Ä8ä8ÄA$8Ä8äA$8ÄIE@åQEA&I$QE@äQEQEHäA&@å@åAE@åA$8ÄIEQEbZÌ8ÄA&8ã@å8Ä8ä8ä@åHä8ä@ã@äI$@ãHä8ä@ãI$QEbŒ@åI$A#HäI$I$I$I$HäA#HäI$@åR8Ä8äI$0Ä0ã9$8Ä8äIE@åIEI$QEA&HäI$QEA&I$@åHäHäAEHä8ÄQEA&QEjËI‡0Ä0äA$8Ä8ä9$8Ä8äHä8äHä8ãI$8ã@ä@ã@äHäI$jŠAÇHã@åI$I$HäI$I$HäA#8äI$HäIÇAG8ãA$8Ä0ä9$0ÄAE@åIEI$A&HäQE@åQEHäQEA&HäHäI$8ÄIE@åAEI$QEbbŒ0Ã8ä8Ä9$0åA$8äHäHä@ä@ãHä@ã@ä@ã@äHãHäIEbŒHä@äI$I$HãI$I$HäI$HäI$8ãI$I‡A$8ä8ÄA$8ä@åAEI$QEI$QEQEQEQEQEQEQEQEQEQEQEI$I$QEA&IEQEHäbŒI‡8ãA$(ä8Ä9$8Ä9$@åHä@äHäHä@äHãHä8äHãHäHäZJI‡Hä@äI$HãI$I$I$8ãHäI$HäI$QE9†@ä8ã8ÄA$8äAEHäIEHäYEQEQEYEQEQEQEQEQEQEHäQEIEHäIEQEQEQEYÉZJ8Ä8ä8Ä(ä8ä8Ä8äHäA&IEA&A&QEA&@å8Ä@ä8äAÇbŒYÉAGIEIEQEQÇY†IEIEIEA&QÇQEZJRI‡AGIE8ÄA$A&I$A&I$Hä@åA&A&Hä@å@åQE@åHäQEA&A&A&QEA&A&I‡ZJJ(Ä(Ã8Ä0ä(ä8Ä8ä@ä8ã@ä@ãHäHäHä8ä@ãHäHäI$RŠbŒA&QEIEAGY…QÇQEA&QEAGQEAGZIYÉI‡I‡IE8Ä8äQEA&HäIEI$@å@åIE@å@å@åI$A&I$QEA&QE@åA&AGA&A&R -R‹8æ0æ9EAG(å(ä(ä0æZÌk/k/rÍ{.k/jÍR‹R -bŒZÌc/ƒÐ{.k,{.ƒÐƒÐƒÐƒÐƒÐ{σЃЃÐ{.{Ï“Ðs.c,bŒbŒbŒbŒc,jÍjÍc.jÍc/jÍbŒbŒbŒbŒR‹bŒjÍc/{.{oƒpk/k/k/s/k/bŒZÌR -c/k-bŒbŒbŒjŠZJbŒ{,{.jËjŠZJR‹jŠc/{.ƒÐk,k/{.ƒÏ“ЃЃσÐ{σσσÐk/ƒÏƒÐk,ZÌbŒbŒbŒZÌk-bŒc/c,c/jÍZÌbŒbŒbŒR‹R‹bŒc/k/ƒo{p{os/k/k/{Ðk/k/“ÐZÌR‹ZÌZÌbQEaÇYÇjIƒoA†QEIE9EAGAEHäA$9EQE9EIEAGQEAGQEA†QE@åA$9EI†AGAE@åAEAEQEjŠk/jËbŒjŠjËjËrÍjËk-jËrÍjËjËc,k/jIbZIQÇbj‰jIr‰jIjËjËrËjŠ{,jËjIjIjŠ{,ZJIE@åIEA†IEIEA$@åA$A†IEIEAGA†I†AGIEI†A&AEHä9†QEIE8ÄA†AEQEb{.k-j‰rËjËjËjÍrË{.jËjÍjËrË{.Œ2{,bIZZbjIbIjIj‰rIjŠjŠjŠjIY†@åIEHäbk-QE@å8Ä8ä0Ä0ä0Ä0ä@åIE@ä0ÄHä0ä8Ä8ä(ä8Ä8ä8Ä8ä@åAEHä0ä0ÄAEHäjIk/YÇQEQEQEQEQEI‡Y†aÇY†I‡a†jÍbŒY†A&I$QEHäQEYEYEQEYEYEYEYEYEYEYEYEYEjAG8Ä8ä8Ä8ä0Ä8ä(ä8Ä8ä@åAE8ã@ä@ä0ä@ä0Ä8ä8Ä8ä8ä8ÄIE@å8ä8Ä8äQEYEk/bYEQEQEQEQEYEI‡Y†aÇI‡a†jIƒÒYÈHäI$QEQEHäHäYEHäYEYEYEYEYEY†AGI$A&iÇjÍAGHä0Ä0ä0Ã(ä0ä@ä8ä@å8ã8ä8Ä(ä8ä(ä8Ä8ä1$8Ä9$@åA$8Ä8ä8Ä8äQEjk/I‡QEQEAGYEI‡aÇI‡aÇI‡aÇYÉ{,bŒY†AGQEA&QEQE@åQEQEYEYEY†a†Y†Y†YÉa†YÉbI‡@åI$8Ä8ä!$0Ä(ä8ä8ÄIE8ä0Ä8ä(ä0ä0Ä8ä(ä8Ä8ä9$9E8Ä@å0ã9$8Ä@åY†k/bAGAGQEI‡YEI‡aÇI‡aÇI‡aÇjŠ{.YÉQEAGQEA&QEQEYEAGYEYEI‡YEY†Y†A&@å8ÄZbŒY†8Ä0ä0Ä(ä0ã(ä8Ä8äIE8ÄA$8Ä(ä8ä8Ä(ä9$8Ä9$8Ä9EA&8ã8Ä8ä9$@åZ{.YÇaÇI‡YEI‡I‡YEI‡aÇI‡I‡a†{.k/QEQEA&AEA&AGQEI‡A&I‡QEAGaÇYÉaÇYÉYÉYÉjI‡@å8Ä9$0Ä0ä(ä0Ä0ä8Ä9E@å8ã@å0ä8Ä(ä8ä0å9$8Ä8ä@å9E@å8ã8Ä9$@åQEk/bJa†Y†I‡A&I‡I‡aÇI‡aÇI‡Y†jŠ{oI‡QEQE@å9EAGAGAGQEY†I‡YEI‡aÇQÇI‡A&@åbk/Y†@ä0Ä0ä(ä(ä8Ä(ä8ä8Ä8ä9$8Ä(ä8ä(ä0å8Ä(ä8äA$8ÄIE8ä8Ä(ä@åIEYÇk-YÇYÉYEI‡A&I‡I‡aÇI‡I‡aÇYÉjËbŒA$0æ(ä(ä(ä0æ(ä9EA&YEAGa†YÉYÉYÉZYÉQÇZJYÉHä0Ã(ä0ä0Ä(ä0ä(ä8Ä8ä@å8ã8Ä8ä(ä8Ä(ä8ä(äA$8Ä9$9E@å8Ä8ä(äIEQEjÍbYÉY†I‡YEI‡YEI‡I‡I‡Y†YÉjIƒoAG9E0æ!$(ä å8Ä9EA&AGYÇAGA&ZYÇAGI$@åZk/QEHä0Ä0ä0Ä(ä0ä0Ä8ä@å8ã0ä8Ä8ä8ä8ÄA$8Ä8äA$0Ä8äA$8Ä8ä8äHäHäYÇc,jYÉYÇI‡aÇI‡I‡YÉaÇI‡aÇaÇZJbJ(ä9E0æ å å!$ å(ä(ä8ÄA&AGbYÇYÉYÇYÉYÇZJR@ä ã0Ä0ä ä0Ã(ä@ä0ä8äHä0ÄA$0Ä8ã8ä8ä8ÄA$8Ä0ä0Ã@åI$0Ã8ä@åHäIEbŒbIiÇYÉI‡I‡I‡I‡YÉaÇYÉI‡aÇbk/9E0å0æ å å å(å å!$0ÄA†8Ä8äAÇQÇI‡AGI†ZJs/R -AGAG9E0æ0æ9$0å(ä0Ã(ä(ä8ä1†(ä8Ä0æ9EA†8æ0æAGAGA†AGAÇI‡I‡R‹bŒI‡AGAGQÇAGI‡Y†I‡AGAGA&QE{.k/(äIEAÇA&A&AGQEA&I†IEYÉYÇJZJbbJbIR -{.bŒAÇI‡AG0æA&1†(ä0å8Ä(ä0ä!$0Ä0æ1$0æ(ä9EA&A&0æ9†AGAGAGAGI‡I‡R -ZÌR -I‡AGQÇY†AGI‡Y†AGAGQEA&bƒÒAF9EAGI‡IEA&AGA†QEIEAGI‡AÇI†{,{,jÍjËrË{.jËZJbŒjŠZJR -bJZIZÌk/bJbŒZIZJbJbŒZIbŒR‹bŒjËc,k/{.k,k/rÍc,jËk-rÍRŠbR -R‹ZJbJR -bŒbŒZJZ̃Ð{.{Ïc/{,{.j˃os.ƒÐ{oƒp{oƒÐ{oƒÐ{o{.{.{,{,{,k-bJc,jŠZJR -bR‹ZJc/bŒZJR‹bZJbŒbJRŠbŒRŠk-bŒk,ƒÐk-c,k-c,jËk-rËbŒZIR -R -R‹ZJR -R‹bŒZJbŒk/ƒÐ{os/c,{,jÍ{,{oƒp{oƒp{o“Ïs.ƒo@å9EI$QEQEQE@ä@åHäA$9E@åIEQEbZJA†YEYEQEQEYEQEQEIEQEIEQEAÇbŒZY†AGQEAGI$A&QEA&IE9EAGAGQEQÇQÇYÇI‡QÇI‡QÇQÇI‡QÇYÉQÇYÇbZJY†Y†YÇYEAGIEI$QE@å9EI$A&Hä8ãA&AE@åAEQEY†bŒI‡Q…YEQEQEYEQEYEIEIEQ…IEQER‹bQÇAGYEA&QEIEIEIE9EIEA&I†AGY†QÇQÇYÉQÇI†QÇQÇYÉI‡YÇQÇYÇYÉjŠbQEAG0Ã9E8Ä@å9E@åA&@ä@å8Ä9$0åA&8ÄQEQEbc/Y†YEa†YEaÇYEYÇY†Y†I†AGAGIÇk-YÉQEA&A&QEA&A&@åAE@å9EA&I$A&QEA&QEA&AGAEA&8Ä0åA&QEAGYEYÉZYEI‡QEA&QEQEA&@åAE@å@åA$8Ä9E8ä@åA$@åQEI‡{,ZY†YEY†YEaÇY†YÇY†I†AGQÇA&bŒZJI‡QEA&A&IE@åA&@å9E@å9EA&QEA&QEA&QEA&QEA&0å0å9EA&AGYEYEbI‡YE@å0å8Ä8ä9E8Ä@å@å9E(ä@å9E8ä9EA&@åI†ZJbŒHäYEYÇY†Y†Y†Y†aÇI‡QÇI‡AÇAGbŒbIEA&IEA&8ÄIE9E@å@å9EA&IEA&AGQEA&AGQEA&A&@å9EA&A&QEAGa†YÉAGYEAGQE@åA&QE@å@åA$9E8Ä9E0å@å9$9E@åA&YÇjÍA&YEY†aÇY†YEa†aÇI‡Y†I‡I‡9†ZJbAGAGIEA&A&8ÄIE@å9EA&A&A&@åQEA&QEA&I†A&A&9E@åA&A&QEAGYEbI‡YEI‡@åA$8Ä(ä@å9E8ä8Ä(ä9E8å@å9E@å9EA&bZJIEQEa†Y†a†aÇaÇa†aÇAGI‡A†AÇZJYÉIEA&IE@åA&9E8åA&8ÄIEA&A&IEA&IEA&QEA&A&9E8Ä9EA&IEA&YEaÇYÉYEI‡A&YEAGQE8åA&8Ä8ä0å8Ä(äIE0å@å9E@å9EI‡jÍAGQ…YEaÇY†aÇaÇa†aÇI‡I‡AG9$R‹bAGQEIE@å9E@å9E@å9E@å9EA&QEA&IEA&A&I†A&@å@å1$A&AGAEQEI‡jI‡I‡I$0å8Ä8ä9$0å8Ä0å9E8ä0å@å8Ä9E@å8äIEYÉZÌY†YÇiÇjzzzzYÉY†AG9†AÇZJI‡QEA&A&9E@å@å9E@å9E@åA†@åA&IEA&A&AGIE@å0å8Ä9$A&A&QEA&a†ZJI‡QEA&A&AGQEA&@åA$8Ä9E8ä0å0åA$0åA&8ÄIEAGbŒbY†iÇa†zzzziÇI‡QÇAGI‡bŒIÇAGAGA&IE@å9E@å@å9EA&A&A&A&QE@åAGIEA&@å9E0å8Ä9EA&QEA&YEZJYÉQE8å@ä8Ä8Ä8ä8Ä9$8Ä8ä0Ä8ä8Ä9E8ä9EA&QEYÉbŒAÇI‡AGY†YÉjYÉY†Y†0å9E@åR -R -QEA&IE@å9E@å8Ä9E8ä9EA&8ÄIEIEA&QEA&IE8Ä9E@åA$9EA&A&QEYEYÉbŒQEQEA&YEA&A&QE@ä8Ä8äAE0Ä8ä8Ä9E8äA$9EQEI‡ZJR -QÇAGQÇI‡jYÉaÇI‡QE(å9EI‡R‹Y†IEA&@åA$@å0å9E8Ä@å9E@åAE@åIEQEIE@åA&9E@åAE8ÄA&IEQEA&a†ZJYÉQEQE8Ä@åAGAGAÇAÇ9EA&AÇA†AÇAG0æAGAGAGR‹ZJ å0Ä ä£Ä0æ0æ!$AGBR‹R -c/R‹AGAG9†AGAG0æ0æ9E@å8æ0æAÇAGAGAGA&A&AGAG@åIE0å8æAGI‡YÉI‡YÉjÍbJYÉbR -I‡I‡A&8æ9E0æ(ä(ä(ä(äA&0æAGA†AGI‡c-AÇ Ä ä ä Ä(å0æ å0æJR‹BBbŒAGAGAGAG9†AG0å@å9E0æ0åAGAGAGAGA&AGA&AGIE0å9E@åA†AGI‡YÉY†bŒbŒYÉYÉYÉJk/jËs/jËbŒƒÐk/bIbŒZIR‹ZJbJc,bŒjËbJR‹ZJbJR‹bŒk-c,{oƒpk-k-{,{,k-k-s.k/jË“Ð{oc,c/c,k-ƒÐk/k-rÍk.k/jËc,{.ƒÒ{Ðk/{.{o{.{.{.{.{.{.{.k-{.k-bŒjÍc/ZJR -bJR‹R -bŒc,ZJbJZÌbŒjËbŒZJR‹bŒbIZÌk-jÍs,ƒÐ{.{,{.{.k-k-s.k-k-k/ƒÒk,c/k-bŒ{σÐc,k/k-s-k.bŒk-ƒÐƒÒk.{.ƒÐ{o{.{.{.{o{,{.k/{.QÇQEY†YEY†ƒÐRŠ@åIEI$A&@åAEIEIEQEI†AGI†AGQEI†I†I‡Y†I†QEA&IEQEIEIEQEY†QEjË“ÐR -QEAGQEAGAEQEIEIEI†QEYEYɃÐjIbYÇQÇYÇYÇY†QÇQEAGQÇQEI‡QÇQEj{.QEA&IEQEQEA&IE@åAEQEQEA&QEAGY†AGQEAGQEQÇQÇI†QEA&QEA&IEIEQEYEQÇaǃÏbŒY†AGQEAGAEQEIEIEA&QEY†Y†jÍ{.bQÇI‡Y†bY†I‡QEI†I†QEY†QEQEYEAGY†jÍbIEA&I$I$IEQEQEA&I$A&QEQEA&I†YEI‡QEAGQEA&QE@åAEI$AGYEY†Y†jŠƒÐbAGIEQEQEIEAGQEQEA&YEI‡iÇk/I‡QEQEY†A&QEY†A&I†QEA&AGA†QEQEjjÍA&HäI$A&I$QEI$A&I$QEA&QEA&IEQEIEA&I†YEA&Y†AGQEIEA&IEI$IEQEY†Y†aǃÐk-QEAGI$AGQEQEAGI$AGQEYEYEk/bJAEYEQEYEA&Y†QEA&I†AGQEYEQEY†A&QEYEZJJI$QE@äQEHäQEA&I$QEQEA&I$QEA&QEQEQEQEY†QEA&IEQEQEYEaÇY…QEj˃oI‡QEAGI$A&QEA&QEA&QEAGHäaǃÒQÆYEQEYEAGQEYEY†AGQEA&I†QEA&YEZJZÌQEHä@åI$A&HãQEQEI$A&I$QEI$IEA&I$IEA&QEYEI†YEQEIEA&QEQEQEY†Y…QEbƒÐZJQEAGQEA&IEQEA&QEA&QEAGYE{,bŒYEYEY†AGQEYEI†QEYEAGQEAGQEIEAGQEA&ZJYÉA&I$I$I$QEQEQEQEQE@åIEI$A&I$QEQEQEY†QEQEQEQEYEY…aÇY…Y†Y…k-ƒpI‡QEA&IEA&QEA&AEI$A&QEQEYÇ{oYÉYEYEQEYEY†YEQEYEAGQEA&I†AGAGZjÍQE@ä@äHäIEI$HäQEQEQEQEA&I$QE@åQEA&QEQEQEYEY†QEQEQEQEY…aÇYEaÇY…b{ÐZJIEIEA&I$A&QEA&IEA&IEQEQE{,bŒYEYEQEYEYEYEYEYEAGQEA&QEIEQEA&QEYER -bI$HäI$QEQEHäQEQEHäI$QEQEQEQEQEQEYEY†Y†QEY†YEY†YEY†Y†aÇY…jŠ{ÐYÉIEIEA&QE@åIEA&IEA&QEAGa†k/aÇY…a†YEQEQEYEY†QEQEA&I†YEAGQEZJs/I$@ä@äHäI$HäHäQEQEQEHäQEI$QEI$QEQEQEHäYEa†Y…Y†QEY†YEY†YEaÇY…Y†bk/c,QEA&QEA&IE@åIEA&IEA&QEQEjËbŒYEY…YEYEY†QEYEY†QEAGQEA&A&I$QEQEYÉjJ@å@å@åHäIEQEI$QEQE@å@åIEHäQEQEYEYEa†QEQEY†QEY†QEaÇQ…QEYEZIƒÐRA&QEA&@åIEA&@åQEIEA&QEIEbŒYÉYEYEYEY†YEYEY†a†QEQEQEA&QE@åZk/QE@Ã@ä@äHäI$AEI$QEQEI$QE@äI$A&I$QEQEYEYEY…Y…QEQEY†QEY†Y…Y†Y…QEQÇk-jÍHäAGI$A&IEA&A&AEI$AGQE@åZJbJYEYEY†YEYEYEY†YEY†IE@åHäA&I‡I‡I‡ZJbŒbŒAGAGA&AGA&AGAGJI‡I‡RI‡JYÉI‡YÉRAGRAGI‡I‡I‡YÉZIZJjŠjÍjÍc,bJ9&AGAGI‡BBI‡BI‡BbŒjÍk/bJI‡I‡I‡I‡JI‡YÉJR -R -bJR -bJZJs.ƒÑbYÉYÉJAGAGA&AGAGAGI‡BI‡I‡JI‡YÉJYÉYÉAÇI‡AGI‡I‡I‡RYÉR -bJjË{.c,jÍAGAGI‡AGAÇBAGI‡BI‡R -jÍs/k/I‡I‡I‡I‡I‡R -I‡R -YÉR -R -Jk/ƒÐ{Ð{oƒpƒÐ{.k/k/{Ïk/{Ïk/k/s-jÍbŒk-bŒk-c,bŒk-k/s/c,{o{ЃÐk/{Ï{σÐ{o”0“σÐ{.ƒÐƒÐƒÐƒÐ{oƒÒƒÒƒÐ{o{.“М“ƒÐ{o{Ï{.ƒÐƒÐƒÒƒÐ{σ҃Д“œ“”“‹Ðœ“œ“œ“ƒÏƒÐk/{Ïk/k/{Ïk/k/s,k/jÍc,jÍbŒk/c,bŒbŒk,k/s/{σÐ{oƒp{Ïk/ƒÏƒÏ“ÐŒ0“ЃÐk/{σЃÐ{oƒÒ“Ѓ҃Ñk/ƒÏ”0‹ÐƒÏƒÐk/ƒÐƒÐƒÐ{ЃЃÐ{Ï”“œ“ƒÐIEAEIEIEA&IE9EQE9EI†QÇbŒAEHäI$IEI$AEHäIE@åI$AEY…QÇYÉAÇI†I‡AGA†IEAGA†QEI‡YÇIÇQÇI†QÇY†I‡QÇQEI†AGQEI†A&A†I†Y†Y†ZJR -A†9$9E9EA&A†8ÄA†AEAEAEQEAGIE9EQEIEIEAGbIR@åI$IEIEHäIEHäIEHäAEQEbI‡RAGAÇAGA†A†AGA†QEI‡QÇQÇQÇQÇI†QÇY†I‡QÇQEAGQEQÇA&A†QEAGQÇbZJAÇ@å9E9E9EA&9EIE@åHä8ã@å8ä@å8ã@åHä8äY†ZJHäHäI$8ãHä@äHä8ã8äHä8ãAEYDjŠA&A&8ã8Ä8ä8ÄAE@åAE@åHäAEQEQEQEQEQEHäQEIEQEA&I$@å9EA&A&QEk-I‡8ÄIE8å8äIE0åAEHãHä@ä@ä@ä@ä8ä8Ä8ã8ä@åIEbAGI$HäHä8äHä@ãHä0ÄHä8ãHäI$ZR -8ãAE@ä0Ä8ä@åAE@åI$8ÄQEA&QEQEQEQEHäQEA&IEIE@åAE@åAEIE@åj‰bJ8åA$@å8Ä9E@ä@å8äHä8ã@åHäHä8äHä8ã@äHäI†b8ÄI$HäI$HäA#Hä8äI$8ã@å@äI$ZJIE8ÄAE8äAE8ÄAE@åHäAEIEI$A&I$A&YEQEQEIEA&A&@åQE9E8ÄIE@åQEk-YÉ8ÄAE8ä9E8ÄA&Hä@ä@ä8ä@äHäHä8äHä8ãHä8äI$ZJAG@ãI$Hä@äI$I$8ãA$8äI$0ÃI$ZR8Ä@å8ãIE8ä8ÄAE@åAEIEI$A&I$A&QEYEYEIEA&I$IEA&AE8ÄIE0åQEbIbŒIE@å8Ä9EA&Hä@ä8äHäHä8ä@ã@ä@ã8äHã@äHäQÇZJ8ÄI$I$8ãI$I$HäA$8äHäA$HäI$ZJ9E8ÄA$8Ä8ä8ÄA$8ÄAEHäAEQEA&I$QEHäQEA&QE8Ä@åI$A$@å8ÄIEIEQEjÍIÇ8Ä8äA$@å@å8Ä8ä8ä8ãHä@ä8äHä8ã@äHä@ãHäI$ZJAGI$HäI$I$HäA#Hä8äHä8ãAEHäbI‡8ÄA$8Ä8ä9$8ÄA$8ÄAEI$AGI$A&HäQEI$A&QE@å8ÄIE@ä@åA$8ÄQEQEbZÌ8Ä8äA$@å8Ä8ä8ã@åHä8ä@ãHäI$8ãHäHä@ãI$QEbŒI$AEHäHäI$I$I$I$8ãAE@äHäI$R@å8ÄA$0Ä9$8Ä9$8ÄAEI$QEA&I$QE@åI$QE@åI$@åI$A$A&AEHäAEQEQEjËI‡8Ä(ä8ä9E8ÄA$8ÄAEHä8äHäHä@ä@ã@ä@ã@äHäI$jŠAÇHäI$8ãI$I$I$I$AEHäI$HäHäQÇA†8Ä8äA$0Ä0äA$8ÄAEI$QEA&HäQEQE@äQEQE@äQE@åHäAEI$8ÄIEIEQEYÉbŒ0Ä8ä8Ä9$9$0åHä8äHä@ä@ã@ä@ãHä8ã@äHã@äIEjŠ8ÄHäI$I$@ãI$I$I$HäI$HäI$I$AÇ8ÄA$8ä8Ä8ãAEHäIEI$QEQEQEQEQEQEQEQEYEQEQEQEHäIEI$QEQEA&HäbŒAÇ@ä0Ä8ä8ä8Ä9$8äHä8ãHä@ãHä@ãHä@ã@ä@ãHä@ãjŠI‡@äHäI$@ãI$I$I$HäHäI$A$A#QEA&8ÄA$8ä8ÄI$8ÄIEI$QEQEQEQEQEQEQEQEQEQEQEHäQEHäIEI$QEQEA&YÇZJ@ä0Ä8ä(ä8Ä0ä8ãHäAGAGY†I‡I‡AGAGA&A&A&YÉc/R -QEIEA&IEQEA&AG@åAE8ÄIEA&ZJRAGAGI†@å@åIE@åIEI$A&HäA&A&@åA&HäA&QEA&QEI‡I‡A&I‡I‡AGYÉZÌR -AGAGAGAG1†AGAGI‡AGAGYEAGI‡YÉA&A&A&A&I†bŒbŒI†A&IEQEA&QEA&IE8Ä9EA&I$YÉR‹A†AGI†A&8ÄQEIEA&I$@åQE8æA&@å@åA&HäAGQEA&YEI‡AGI‡I‡AGI‡bŒbŒAG1†AGAG9†0æAGAGc,{os/{.{oƒpc/bŒZJZÌk/{.{Ïk/k-rË{.ƒÐ{Ï{oƒp{m{oƒpsÏ{.{.ƒÏ{.k-bJc,bŒbŒk-jÍs/k/jÍk/rÍjÍc/bŒbŒbŒbŒc/{oƒp{oƒp{o{oƒp{o{Ðk/ƒÐƒÒƒÑƒÒƒÑ{Ð{oc/k/s/jÍbŒc/bŒZJZÌjÍk/ƒo{.k/k-k-ƒp{Ï{o{.ƒÐ{.{o{Ï{.{.{oƒp{.jŠZÌbŒbŒbŒk/k/c/k/s/jÍjÍjÎc/bŒbŒbŒc/k/ƒo{p{oƒÒk/ƒok/ƒÒ{Ðk/ƒÒk.c/c/c/YÇYEaÇaÇZJ{.QEI$IE8ÄIE8äA$8ÄAEQE8äA†IEIEQEIEIEIE8ÄAE8ãI†QE8Ä9EA&AEQEjŠ{.bŒj‰jŠbŒjŠjËjÍrËjÍjËbŒjËjÍbŒjŠZYÉbbZbIjIbIjIbIjIbIbIjbJjbŒZ@åIEHäQEQE@åA$A$8ÄAEAEI$A$IEQEA†QEIEIEA&@å8ãA†IEAEHäA$9EQEYÇ{obŒj‰jŠjŠjËbŒjËjËrÍjËjËjËrÍŒ2{.bYÇYÇYÉbbj‰jIbj‰bIjIrIY†A&@äI$YÉjÍQE@ä@ä8Ä(ä8ä(ä8ä@åIEHä0ÄHä0ä0Ä8ä8Ä8äA$8Ä8ä9EA&8ã8Ä8ä@åQEb{.Y†QEA&QEQEYEI‡Y†aÇI‡Y†a†{.c,A&QEHäQEHäQEYDQEHäYEYEYEYEYEI‡YEYEI‡YÉI$QEA&Hä0Ä0ä(ä8Ä8ä8ä@åAE@ä0Ä8ä8Ä8ä(ä8Ä8ä8ä8ã8ÄQE8ä8Ä8ä8ÄQEYEk/bIQEQEQEQEQEI‡YEaÇI‡Y†Y†jŠ{obQE@åQEI$I$QEYEHäYEYEYEYEQEY†AGI$@åbbŒY†8Ä8ä0Ä(ä(ä8ä8Ä8äAE0Ä8ä8ä(ä0Ä8ä(ä0å8Ä0äA$0åAEHä0Ã9$8ÄI$jk/QÇYEAGQEI‡aÇAGY†YÉY†YÉaÇ{,jÍAGQEQEA&QEQE@åQEYEQEQEYEI‡YEa†Y†QEAGZHäQEI$I$(ä8Ä0ä(ä(ä8ÄIE8ä0Ä8ä8Ä(ä8ä(ä8Ä8ä9$8Ä9$9E@ä8Ä9$8Ä@åY†k/bYEAGA&YEI‡aÇI‡aÇI‡Y†YÉjIƒoI‡YEA&QEA&AGQEQEQEYEI‡YEYEI‡Y†A&@å8ÄZk/YE8Ä8ä(ä(ä0Ä(ä8ä8ÄIE8ä8Ä8ä8Ä(ä8ä(ä9$8Ä9$8Ä9E@åHä(ä8ä8ÄIEbc/YÉY†I‡YEI‡AGY†aÇI‡aÇI‡aÇ{.jÍQEQE@å9EA&AGAGAGQEQEAGQEI‡YÉY†YÉYEYÉb@äQEHä8Ä(ä8ä(ä(Ä8Ä8äA&8ã@åA$0Ä0ä(ä8Ä1†0Ã8ä9$0åIE8Ä8ä(ä8ÄIEQEk/bJY†I‡YEAGI‡YEI‡aÇI‡YÉYEjŠƒÒI‡YEA&IE9EAGQEA&I‡YEI‡I‡YEI‡QÇY†@å9Ejc/YE8Ä8ä(ä(ä(ä8Ä0ä8Ä8ä9$8Ä9$(ä8Ä(ä8ä1$8Ä0å8äA$IE8Ä8ä8ÄA$A&YÇjÍiÇI‡aÇI‡AGYEI‡I‡aÇI‡I‡a†jÍbŒA$0æ!$(ä å0æ9$0åA&AGYEAGYEI‡YÉI‡AGZZJHäI$@å@ä0Ã(ä(ä(ä8ä(ä@å8ä8Ä8ä8Ä(ä0ä8Ä(ä8ä8Ä8ä8ÄIE8äA$8Ä8ä9EQEjÍbjI‡I‡YEI‡AGaÇI‡I‡Y†YÉjƒoAG9E å(å(ä(å0æ9E0åAGbA&AGZQÇI‡A&Hãbc/YE@ä@ä0Ä(ä(Ã0Ä0ä8ä@å0Ã8ä8ä8ã8Ä8ä8ä8ÄA$8ä0Ä8ã@åHä0ä8ã8äI$YÉbŒaÇbI‡I‡aÇI‡I‡YÉaÇI‡YÉY†jŠR -(ä9E8æ å å!$(å!$(ä8ÄA&A†AGY†I†I‡YÇbR -0ÄHä8Ä ã(Ä0Ã(Ä(Ä@ä0Ä8äHä1$8ä0Ã8ä8ä8Ä8ã@åA$0Ä0ã@åI$0Ã0ä8ãI$QEbŒbIYÉiÇI‡I‡I‡YÉI‡aÇI‡YÉaÇb{o0æ0å0æ(å å å!$ å ä0ÄA†8Ä8äAGQÇI‡AGI‡ZJc/bJI‡AGAG0æ9E8æ9E(ä8Ä(ä(ä1†0å9E0æ9$9†AG0æ0æI‡AGAÇAGI‡JI‡bŒbŒJI‡I†I‡AGQÇAGAGAGI†A&AG{o{.0æ9†AGI†AGAGAGAGQEI†ZbI‡R -bJbZJs/{oR -JBI‡0æAG0æ0æ9E(å8Ä(ä(ä(ä9E0å0å9E0æAGA†8æ9†AGAGAÇAGR -I‡R -ZÌR -AGAGQÇI‡I‡YEI‡I‡I‡A&A&bƒÒAÆ9EAÇI‡AGQEA&AGY†AGI†I‡AÇI‡{,{,jÍjŠjÍ{,bŒbZÌZJbJR -ZIZJbJk/ZÌZJbJbZJRŠbŒjŠZJbŒc,jËk/ƒok.c,jÍbŒc,jËc,ZJbJRZJbJZJR‹bŒbŒbŒjË{.{Ï{.{.{.{,{,{,{o“Ï{oƒp{o“ЃÐk-ƒps,rÍ{,{,{.jÍR -bJbŒRŠbIZIR‹ZJs-ZÌbŒZJbbŒZJbJRŠjŠZJZÌk-k-s/{oc,bŒk-bŒjËk-jŠR‹YÉR -R‹ZJbJZJbJZÌbŒk/ƒosÏ{.k/{,jË{.{oƒp{oƒp{o“Ï{o{.8ÄA&HäQEHäQE@å8ÄAE@åAEHäAEQEbR‹QEY†QEYEYEQEQEQEAEIEQEAEI‡bŒbAGQEI†AGI$A&I$A&IE@åA†AGQEY†I‡QÇY†I‡QÇI†YÇI‡I‡QÇYÇaÇYÉZJQÇYEQÇQEAGQEHäYEI$QEQEA&Hä8ÄAE@åAE@åQEY†bŒQÇIEYEQEQEYEQEYEIEIEIEIEQER‹bII‡YEI†AGI$A&QEA&AEAEIEA&I†AGQÇY†QÇI‡I†Y†I‡I‡I‡QÇYÇaÇI‡bŒaÇQEIE8Ä9$8ä9EA&@åAE@å8ÄAE8ä8Ä9E8äQEA&jjÍI‡YEYEY†I‡YEa†YÇI†I‡Y†AGAÇk-YÇAGAG@åQE@åIEA&@å9E@åA&IEIEA&QEA&AGQE@åA&9EIEA&A&AGYEaÇYÉQEY†A&AGQEQEQE@å@åA&@ä8Ä@å9$0å8ÄIE8äI†Y†jÍZYEa†YEY†Y†Y†YÇY†AGQÇI†A&ZÌjII‡AG@åIEA&A&@åAE@å8ÄIEA&A&QEA&QEA&AGQEA&0å8Ä9EA&A&YEY†bI‡YE@å0å8Ä8Ä8äA$@å9$@å(ä9E@å8Ä9EA&A&QEZJbJAEYEa†Y†a†a†aÇaÇI‡Y†AÇAGAÇbŒZQEA&IE@å9E@å9E@å9EA&9EA&QEA&IEA&AGQE@åA†A&A&A&IEA&YEYÉI‡Y†YEI‡QEAGQEA&A&8Ä8äIE(ä0åIE8Ä9E@åIEA&aÇbŒAGQEa†Y†Y†a†a†aÇI‡QÇI†I‡A†ZJbJAGQEA&IE@åA$9EA&8ÄA&9EA&QEA&QEA&QEA&IEA&A&9$A&A&QEAGYEbI‡YEAGIE@å8ä9$0æ8Ä9E8ä8Ä9E0å9E8å@å8äIEbZÌ@åY…a†Y†a†aÇa†aÇaÇAGI‡9†YÉbŒQÇAGQE@åA&9E@å@å9EA&8ÄIEA&A&IEA&IEA&AGA&8ÄAGAEA&A&QEA&a†ZJAGQEA&QEAGA&QE8åA&8Ä0å8ä8Ä9E@å0å9E@å@åAGk-AGQ…a†YEaÇa†aÇaÇa†I‡QÇA&AÇbŒbAGA&A&A&AE@å@å9E@å9EA&A&QEA&IEA&A&I†A&@å9E(äA&AGA&QEYER -I‡YEA&8Ä8ä8Ä(äA$0å8Ä9E8ä8Ä0å@å9E8äIEA&JbŒYÇa†jjzzzzjAGQÇA&JZJAGQEA&9EIE8å@å9E8åA&IE@å9EA&QEA&A&AG@åAEIE@å9E@åIEA&YEaÇR -YEI‡A&QEAGQE@å@ä8Ä8ä9E8Ä9E0å8ä9E8å8ÄIEAGbŒZaÇiÇjzzzzjI‡AGI†AGbŒI‡I†AGIE@å@å9E0åA&8ÄIE9EA&A&IEA&IEA&A&IE0å@å8Ä9EA&QEA&a†ZJYÉQE@å8ÄA$8äA$8Ä8äA$8Ä0ä1$8Ä8äA$9EA&QEYÉbŒAÇY†A&AGYÉjI‡Y†I‡8Ä0æ9EJR -QEA&IE@å@å9E0å@å8ÄA$0åIEA&I$A&QEA&IEA&8ÄIE@å0åIEA&QEQEYÉjËAGQEQEA&QEA&QEA&@å8ãAE0Ä0ä0Ä9E8äA&AEQEAGbŒYÉAÇQEA&YÉYÉYÉY†I‡QE(ä9EAGR‹I†A&QE8ÄIE0å8ä@åA$9E@å@å9EI$A&QEA&QEA&8Ä@åA$9EA&IEA&QEYEZJYÉQEQE8Ä8äAÇAGI‡B0æAÇAGAÇAÇAÇAGAGAGI‡R‹ZJ å å!$ Ä Ä0æAG åAGR‹R -R -R‹bŒAÇAGAGAÇAGAG8æ9E8æ0æAGAÇAGAGAGAGAGA&I†A&AGA&A&AGI‡YÉI‡jk/bJYÉR -YÉYÉYÉYÉI‡A&A&0æ9†9EA&0æAGA†AGAGZJs/B ä Ä äÄ(ä0æ0æ1†BbŒR -R -s-:I‡AGAGAGAG9†8æ0æ0æA†AGAGAGAGAGAGA&AGA&A&A†8æA†I‡YÉI‡YÉjËjÍR -YÉR -YÉk/jËs/jËbŒƒÏk/bIbŒZIR -R‹ZJRŠjÍjËbJZJbJR -bJc,bŒc/{.{Ïk-jË{.jËk/s-k-k.c,{o{Ðk-c,k/c,{os/k/k-k-s.c,jÍ{.“ÐsÐs/{oƒps.ƒo{.{.{,{.{.{.{,jÍ{.jÍ{,{ÐjŠYÉZJZIR‹bR‹ZJbJc,jŠbŒbbŒR -R‹bŒjËk/s-{p{,jÍk-rË{,k/k-k-s.k/ƒÑk,k/{,ZÌk/{Ðk/k-s-k.k-bŒk,“ЃÒk-k/ƒÐ{.{o{.{.{,{.{,k/{,QEY†QEYEY†ƒÐRŠ@åIEI$@å@åAEQEQEIEA&AGI†I†AGI†AGQEQÇQEA&I$IEIEIEAEQEYEQEj˃ÒYÈQEA†QEIEIEIEIEA&QEQEQEYÇ{ojŠQÇQÇY†QÇI‡Y†Y†A&I†AGYEYÇY†YEY†a†k/ZI$A&I$QE@å@åAEQEA&QEIEAGI†AGQEA&QÇQEQÇAGIEI$A&IEQEA&QEYEQEbƒÐbŒQEAGQEA†QEIEA&AEQEIEQEY†jÍk,ZYÇI‡Y†I‡Y†Y†AGQEAGQEY†QEY†AGI†YEjÍYÉIEI$A&IEHäIEQEA&I$A&QEQEA&QEAGQEQEY†AGQEIEA&QE@åQEY…Y†Y†jŠ“ÐZQEAGI$AGQEA&QEQEA&QEYEjk/AGY†QEYEAGQEYEA&I†AGQEA&YEYEY†Y†Y†bŒbA&HäQEA&I$QE@åQEA&IEQEIEIEQEA&Y†AGQEAGYEQEA&IEIE@åIEYEY†Y…bƒÐjËQEI†QEQEA&QEAGHäQEAGYEYE{.ZJQEQEYEAGQEYEAGQEA&I†QEYEQEI†QEA&YEZJYÉ@åIEHäI$QEIEI$A&HäQEQEA&IEI$QEAGQEQEQEQEIEIEQEQEY†Y†Y…YEj˃oI‡I†QEA&QEA&QEA&A&QEAGQEYÉ{oYÇYEYEYEAGQEYEY†YEAGQEA&I†I‡YEYÉaÇbŒZJHäQEI$I$A&I$QEI$A&I$QEA&I$A&I$IEQEQEQEY†IEIEAEQEQEYEY†Y…Y…b{obJQEAGQEA&QEA&QEQEA&QEQEYEjÍbŒYEYEYEYEAGY†QEQEY†A&AGQEQEA&QEQEAGjR -I$I$I$QEI$QEQEQEQEI$A&HäIEIEQEQEYEYEQEQEQEQEY†YEY†Y†Y†Y…k-ƒpI‡QEA&A&I$A&QEIEA&QEIEQEaÇ{.bYEYEYEYEYEAGQEY†QEA&AGAGQEI‡I‡YÉjËR -HäI$QEHäHäQEQEQEQEQEHäQE@åQEA&QEHäYEYEQÇQEQEQEYEYEaÇY…Y†Y…bIƒÐR‹QEA&A&I$A&QEA&IEA&QEAGQE{,jËYEYEYEY†QEQEYEY†QEA&QEQEIEQEA&QEI‡jR -@åI$I$QEQEQEQEQEI$A&QEIEHäYEQEQEY…aÇYEY†Y†QEY†QEaÇY…aÇY†jŠƒÐRA&QEA&QEA&A&@åIEIEA&QEaÇjÍZYEaÇQEYEYEYEY†QEQEA&I†AGQEAGY†I‡{.bIHäQEHäI$HäQEQEQEQEI$QE@åQEQEI$QEQEYEaÇYEQEY†YEY†Y…Y†Y†aÇY…Z{obJAGQEA&QEA&@åAEIEA&IEQEQEjËbŒYEa†YEYEYEAGYEYEY†A&I†A&I$A&QEQEY†YÉYÉ8ã@åHäHäAEI$HäQE@åI$I$QEIEQEYEYEYEYEQEIEQEYEY†QEY…Y†QEYEZI{.R -AEQEA&@åIEA&AEQEA&QEA&QEjÍYÉYEYEYEY†YEYEQEY†YEQEA&QEA&Y†A&QÇbŒb@åHäI$@åI$@åIEI$HäQE@äI$A&I$QEYEQEYEYEYEIEQEY†YEY†QEY…Y…QEYÇk-k-HäQEA&@åA†I$@åIEIEA&AG@äZJbJYEYEY†YEY†QEYEY…YEQE@åHäAGI‡I‡YÉbŒjÍZÌI‡AGAÇAGAGAGJR -I‡JI‡R -I‡bJI‡YÉJI‡JI‡JI‡RYÉR‹ZJrË{,k/k-bJ9&I‡I‡AÇJBI‡R -BBbŒk/ƒobŒjbIYÉiÇbbR -jbŒbJZJYÉI‡ZJR‹YÉc,bŒYÇZYÉA&AÇAGAGI‡R -BYÉJYÉJR -YÉJbBI‡I‡JI‡I‡R -R -bJbŒ{,k-jÍc,AGAGRAGBR -BR -I‡BZJrÍ{pc/YÈI‡I‡BYÉJR -bR -R -R -R -k/ƒÐ{os/ƒÐ{.{.{Ïc,{os/{ok.c/jËs/bŒc,bŒk-bŒbŒc,k/k,c/{.ƒÒƒÐk/{.{σÐ{o“ϓЃÐ{Ï{.ƒÐ{ЃÒ{o“Ð{ЃÒ{.{.“ЋЃÐ{o{Ï{,ƒÐ{ЃÒ{.ƒÐƒÐƒÐ”0œ“{ГЃҔ0ƒÐc,{.{.{.k,ƒos.ƒÐk-c/k-jËbŒbŒbŒk-bŒbŒc,jÍk/s/k/ƒÐƒÐk/{Ï{.ƒÏ{Ï{o”0“Ðs.ƒÐk/“ЃЃЃÐ{o{Ð{o{.ƒÐ“ЃσÐ{.{Ï{oƒp{Ð{oƒpsÐ{Д2œ“ƒÐAE@åAEAEIE8ÄA†I$@åAGQÇR‹IEHãI$I$AEHäI$AEHäI$A$Y…QÇYÉAÇQEAÇQE9EIEIE9EAGY…QÇI†I‡QÇQEQÇI†Y†I†AGIEQEI†IEIEA&QÇQEbŒRIE8Ä9E8ä9EA&A$@å9†IE@å9EIEA&AEAE@åA†QEZJAÇHäI$IEHäIEI$HäI$A$8ÄQEYÇYÇJIEAGAÇAEAEIEA&QEAGY…I‡QÇQÇA†Y†I†Y†I†AGQEA&I†QE9EAGQEI†jR -AÇA&8ÄA$9EA&9E@å@åHä8ãI$8Ä@å8ã8ä@åHäI†jŠ@ä@åHäHä@äHäHä8ä8ã8ä@åI$IEjŠA&IE8Ä@å8ä8Ä9EQE8äA&HäIEQEQEQEQEQEQEA&I$QEA&@åIE@å9EA&QE{,I‡@å9E8ÄIE@å9E8ä9E@ä@åHäHä8ä@å8ã8äHä8ãIEZJAGHäHäHä8äHãHä9$0ÄHäA$8äI$bYÉA$@å8Ä8ä8ÄAE8äIE@åAE@åIEQEQEQEQEQEQEA&IEIEI$A&@åA$9EQEZJbŒHä8Ä9E@å@å8ä@åA$HäI$8ã@åHä8äHä8ã@äHäI†b8ÄI$HäA#HäI$8ãHä8äAEHä8ãI$ZJIE@å8ÄA$9E8Ä@å8äAEI$IEA&I$A&QEQEQEQEQEA&A&I$A&@åA$@å9EYEjÍYÉ8ÄAE8ä@å9$@å9EA&8ÄHä0äIEHä@ã8äHä8ãHäHäbIAG@ãI$@ãHäI$I$8ãHä8ä8ã@åI$bJ8ÄA$8Ä9E8ä@åAE@åAEHäIEIEI$A&QEQEQEQEA&I$A&@åIE8Ä9EA&QEjZÌA&@å8ÄA$9EHä8äHäHä8äHä8ãHä8ã@äHä@ãI$QÇZJ@åI$I$HäI$I$HäA$8äHäA$HäI$ZJ9E8ÄA$8Ä8ä9$8ÄA$9EA&I$QEA&I$A&HäQEQE8å@å@åAEHäA$8ÄIEIEQEjÍIÇ8Ä8äA$9E8Ä9E@ä8ä@åHä8äHäHä8ä@ã@äHãHäI$ZJAGI$HäI$I$I$HäA$8äI$8ÄI$HäZIAÇ8ÄA$8Ä8äA$8ÄA$8ÄAEIEI$QEA&I$QEHäA&QE8ÄA&HäA$IE8ÄA&I$QER -bŒ@ä8ãA$0å@å8ã8ä@åHä@ä8ãHä@äHã@ä@ã@äI$QEbŒHäI$8ãI$I$IEHãI$HäA$HäI$I$J8Ä8äA$8Ä1$0ÄA$8ÄIEI$A&I$A&QEHäQEHäA&I$@åHäI$@åAE8ÄIEQEQEjËI‡(ä8Ä8ä8Ä@å8ä8ÄAEHä8äHä8ãHä@ä@ã@ä@ãHäI$ZJI‡@äI$I$8ãIEI$HäI$HäI$A$HäQÇA&8Ä8äA$0Ä0äA$8ÄAEI$QEA&I$QE@åQEQEHäQE@ä@åI$@åAE@åAEI$QEbbŒ0Ã8ä8Ä9$8Ä9E@äHäHä@äHã@äHã@äHä@ãHäHäIEc,Hä8ãI$HäHäI$I$Hä@ãI$I$8ãIEAGA$A$8ä8ã8ÄAEI$QEI$QEQEQEYEQEQEQEQEYEQEQEQEHäQEI$QEQEA&QEbŒAG@åA$0Ã9$(ä9E8Ä@å@ã@äHäHãHä@ã@ä@ãHäHãHäjŠAÇHäHäI$@ãI$I$HãHä@äI$HäA#QEA†8ã@å8äA$8ãAEI$QEHäQEYEQEAGYEHäYEA&YEQEYEQEHäIEHäQEYEA&YÉZJ8ã8Ä9$(ä8Ä8ä0ÄHäA&A&A&IEAGA&0å8Ä0ä8ÄAGbŒJAGQEA&Y†QÇI‡I†AGA†AGI†Y†R -R -QÇAGA&0ÄHä8äA&@äI$@å8Ä@åA&8å@ä@åA&I$@äQEIEA&@åAGA&A&AGR‹AG0à ä0ä0Ä0ã(Ä0ÄHäAEA&QEA&A&I‡8å0å@ä0ÃA&ZJR‹I‡A&@åQEYÇQÇAGI†AGA†I†AGbR -YÉAÇA&8Ä8ä@å@å@åIE@ä8Ä@å@åA&@äA&I$A&Hä8ÄQEA&@åA&AGA&A&ZJR -0æ0æ9†I‡ å(ä(å8æbjbkkR QÈR -bjZJbËrËj¬j«b‹j«ZjQéR bÌbÌjìbÌbÍbŒb¬kjìb‹jÌjÌbŠb‹bÌb*QÈj¬ZJQÈJ bjZJb«jÌjËj«b‹b«b‹QéR j«bÍjÌbÌbÌbŒbÌsOríj«b¬jís bŠZkQEAjjI%0ä0ä0ÄA$8ä0ä0ä0ä8ä990äIj«QfQEIfY†Q‡a¦jÍQeI%I%QEY$YfYfQfY…b -If8ä0ä0ä@ä8ä0ä0ä8Ä0ä8ä98äAbJY§IEQfQ†a§Q‡zíQ†I%IEQEYEYeYeI†Ab‹I0ä0ä(äA8ä0ä0ä0å0ä9A0äAbkY§QfIgQ‡Q§Y§jíI%9%1%AFIFQfY¨YÈYÈb*Q†0ä(ä0ä8ä98ä0ä0ä0ä99%8ä9b*YèYfI‡QfY§Q‡ríIf199%IFQ§QgQgA%b‹IF10ä0ä0Ä0ä0ä0ä8ä90äA%9A%bjQ¨Q†Q‡Q‡Y‡Ifj¬11F119IfI†AFAFZKQ§9(ä0ä0ä0ä0ä0ä8ä90äA9A%Z -YÈQ§Q‡Q‡Q‡QfrÌ1%9F119AF9EZ)b(b*QÈQèI¨QÈbjRQÈYèYèRZ)b¬bŠbJZ)QéI§QÈQèZ*Z)j¬bjbjjŠj¬rËrÌjìjjbJb)YéQèQÇQÈb*R)YÈQèYèQèZbÌbŠbJZ*Z I§QÈQèZ Z -b«b‹bjbŠj«rÌj«bj8äA9999%I%bkQEa†Y†Y¦I‡IfRJQ§A%A%A%9%9I%IFA&AEA9%AFYfQ§QFI%IF@åA199%A%bJQ†YeY†Y†Q§IgIèYèAFA%99A%A%IEA&AEA&9A&QeY§IF8å0å98ä199%AZKQea†iÇiÇQ§Afb*I†A&99%A%9%AFA%A%A&99%A&Y†Y¨IFIEIF8å90å9%8ä9%b -Qfa¦iÇiÇY§IfQéQ§A&9%A9%9AFA%A&A&9%9%I%QFYéI%8ä999$9%1A%AFZ*9F9%IfAFAfA‡Zk9%A&9%90å9AFA%A&A99%IfY‡b*IgQgAfA9E10ä9%A&R)A‡9%AfIfAG9¦R)AFA&998å9A%AFA%A99%IFIfbKQfA&bJbIjíZ*ZI§QéZ)QèQèQéZjj«Z*bJZIbjj«s ZJbjZJZ*Z)bj{ob‹j«j‹bjbJjjjKbaèbJI‡IÈQÈZ)QéIÈR ZJb‹bJb*Z)bjbjsnZjZJZŠZJbJZIƒbŠjŒj‹j‹bJjkQeIFb Q†A%I$I%IEI%AEIFIEQfI%IEQeYebjÍIEI%IEIEIEY‡bkQEQfQEQfA&IeIEQfY†Q¨IIDI%IEI%AFIEQEIFI%AEIEYeY¦s.IEIEI&IEI%Yej­QEQEQFIFAFQEIEIFQ§Q‡I$QEQEI$I%I%QEIEYeQeYfYeY¦bb¬I%IFA%A%IEQgj«YeQEQEYeAFIfIEIfYÈYÈI$I$QEI%I$QEI%QEQEQeYeYfY†YÆsA%I%A%AFA%QejÌYeYEQeYeIFIEA&QfYéI§AA%IFIfI%IFIfQ‡QfIfQfY¦YÇZ)j¬A%A&AfAFAFQéb‹QfIfQfY‡Y‡Q‡IFIfI‡Qé9AI%IFAFIFQ†QfIfIfQfQ‡YÇbjíA%AFAFAFIFI¨b¬QfQfQ†QfQ‡IFb‹bkb«bŠZJj¬ZJZ)Z Z)RbJbŠb¬b«b‹j«s jËj«jÌjÌjËb¬jìj‹j‹s b«b‹bìk jìb«b¬bjbkb«ZkbIZ)Z)Z Z)b‹bËb‹b‹bËrìjìj‹j¬jÌjÌZ‹zìj«j‹jÌjÌb‹bÌk @ä@ä8ä@ä8äQèHäAA@ä8äAYÈA%8ä8äA%A%AIEQEQEA%I%A%AIEZj@å9$999@äA8ä@äQ§A%I@äA8äAQ†AfA8ä9A%A%IEIEQEI%IEA9$A%jk8å9A8ä@äA8ä@äAZIAI$IAAQ‡8ä919AIDA%I%I%AAA%9QEZJ8ä98å91@ä@äAAQ§AEII$I9AIfAE98ä9AI%A%I%QEAAA%9I%bJ198ä8äAAA8ä@äYèAEIIEI%A$A%Q†AF98äI$I%I%IEI%I%I%I%I%A%IFbj8å1%0ä0å9%A%A%8ä@äQ§I‡AIEI$I%I$IfAfA%9AI%I%I%I%I%I%I%I%A%IEZ*8å919bJbjsZ QÈR*ZJZ*b‹j«bŠj«bjb«ZIQèZ jìjÌbÌjÌbÌb¬bÌs.jÌj̃Ns {-jìrÌsNzìs-YéIÈZ ZkZ)bjj«j«b«bJb‹bjQèYéb«jÌjíbÌjÍb¬j¬sOs j«j¬jÌs b‹ZkQEAjkI$0Ä(ä0ÄA%8ä0ä0ä8ä9990äIj‹QfQEQfQ‡Y¦Y‡jÍQeI%I%Q%QEYeYeQfYfb‹8ä8ä0ä0ÄA$8ä8ä0ä0ä8ä8ä98äAbJY§IEQfQ‡Y¦Y‡{ Q‡IEI%QEQ%QeYEI†@åb‹I(ä0ä0Ä8ä8ä0ä0ä0å0ä998äA%bKYÇIfQfQ‡Y§Qˆs A%1%99EQFIfY§Y§YÇbŒ8ä8ä(ä0ä8ä8ä0ä0ä0å0ä9A0äAZ)aèQfIgQ†Y‡Q§rìIf19%9&IFQ‡QfQ‡A%b¬Qf0ä0å0ä0ä0ä0ä199%0å9A%A&bJY§Q§QgQ‡I‡Qfs 0ä1F19%9I§YèYÈQ§jí9%10å0ä0ä0ä0ä0ä8ä90å99%A%Z*YèI‡Q‡IgQ§QgrÌ9%9F191IEAFZ Zb)QÈQÉI§QèbjQéYèYèYÈQèZ)bÌbib*Z*RI¨IÈYÈZ Z*b«bŠbjbjr«rÌrÌzìj‹bjb)YèIÈQÈQÇZŠZ YÈYèQèRZ(b¬j‹ZJZ R Q§I¨QèZ Z)b‹bkbŠbjj‹rÍjjZJ8ä9A999IEbkQEYfY†a¦I‡IfRJQ‡AFA%A99%A%I&AFI%9&9%A&Y†Q‡IFI%I%A991AA&b*Q†aeQfa¦Q‡I†IÉYèAEAA%9%A%A%I&AEI&9%9A&QeQ¨QE8å18å9199%9bjQeaÇqÇiÇQ‡I†Z*I†A&A%9%9%A%A&A%AFA%19IEY‡Q§IFI%A%990å999Z)Q†a§iÇiÇY§IfIéQ§AE9&9A9%A&A%AFA%9%9%A%QFYéA%8å9%9%9%9%9E9AFZK9E9%AgAFAgA§Z*A&AE9919%IFA%A&999EIFQˆb*Q‡IFA&A9(ä19AFZJA†1%AFIgAf9†R*AFA&9%99%9A&A%A&A%99%IFQgbJQ‡IFbIZ*rìZ*QèIÈQèZ QèIÈYéZjb«b)b)Z)bjjËs ZJZJZJZ*bIbK{nj«j‹jkjjZJbjbJj«Z*I‡I¦I¨QèZ QèQÈQéZij‹bJZ)ZIbIbk{nZ)ZJZJZJZ*b){oj‹j‹jkjjbJbJQeIFbI‡I$I%IEI%A%IEAEQFQeI%IEQEY†bjÌIFIEI%IEIFY†b‹QEQFQEIFIFAFQfaèQÈ@ä8äIEI%IEI$IFIEIFQeIEIEIEYeY§sNIEIEI&IEIEQFj¬QEQfQEIEIFIeIEI&YÇQgI$I%QEIQEI%QEQEY…QeQeY†Y†b(j¬A%I%A%AEI&Y…j‹YeYeQFYeIFAEQfb*YÈ@ä9I%IEI%I%I%QEQ%Y…QeYeYfY¦aÇk A%I%A%AEA&QEj¬YeYEQEYeIFI%A&QfZ QÈAA%IFI†IFIFQfQ†QgIfQ†Y§YçbIbÌA&A&AfA†AGQèbŒQfQfQ†Q‡Q†I‡I†ZKbJAE9A%IEIFIfIfI†Y‡Q†IfIfY§YÇb)k I%AFAfIFAfI©j¬QfQfQ†Q‡Q¦Afbjb‹b‹ZJZjbÌZ)Z Z Z)R bIbkb‹b‹bŠb«rÌj«j‹jËj¬b«b‹jËj«j‹jíb«Z‹bÌjírìjìjÌZjb*bÌZJZ*YéZIQéZ)bŠb¬j‹Zkj«jËrÌb«jËjÌb¬bŠjÌj«b‹rìb«Z‹bÌjÌ@ä9@ä8ä@äYèAIA8äAAQÇA%8å8ä9AA$IEI%QEA%I%A%9IEbJ9999A@ä8ä@ä8äQÇAIAA9AQfAf98ä9A%I%I%IEQEIEA%I9%A%bjA0äAA@ä@äA@äAYèAAI$AAAQ§8ä8ä99A%IEA%Q$I&AAA%AIEZ*8ä98å8ä8ä@äA@ä@äYÇAEIIIAAIeAF8ä99AA%I%I%I%AAA9QEbJ8ä8ä8å8äAAA8ä@äR IFI$IEQ%I$AEQ‡AfA%8äA%I$I%I%I%I%I%I%A%IEI&R)0ä0ä0ä8ä@ä@äHä8äHäQÇI‡I$I%QeAI%I†IgA%8äA%I$I%I%I%I%I%I%I%AEI&Z*0å90ä0åZJjjs R QÈR*bJZ)bŠb‹b‹j‹ZJbŠZ*QÈQéjìjÍjÌjÌjÌb¬jÌk.rÌb‹j¬j«bjjíj«j‹bjrìYèIèZ ZJZ)bjb‹b‹bŠbŠZJbiIéYèjÌjÌjìjÌjÍb¬b«so{ j«j¬jÌzìZ‹b‹IFI%jjA%0Ä0ä0äA8ä0ä8ä0ä8ä9A0ÄA%r«QfIEQfQ‡Y¦Y§jÍIfI%QEQ%QEYeYeYfY†Y§8å8ä0ä0ä998ä0ä0ä8Ä9A0äAbJY§IEQfQ†Y§Y‡rìQgIEI%Q%QEQfYeI†@åbkI%0ä(ä0ä8ä90ä0ä0å0ä9A0äAbŠYÇQfIgQ†Q‡Y§jíA%19&AEIFIfYÈYÈYÈYè8ä0ä(ä0ä8å8ä8ä0ä0å18ä9%8ä9b)YèQ‡IfY‡Q‡Q§rìIf91%9&IFQfQ§Q‡AEb¬If9(å0ä0ä0ä10ä99%99%AEIFZŠQ¨Q‡Q‡Q‡I‡Y†j¬1%1&1%99%Q‡ZYèYèbk9E11%0ä0ä0ä0ä0å991A%9IFR*YèQ‡I‡Q‡Q‡Qfj¬9%9&1%1&9$AFAfZ(Zb)QÇQÈI§QÇbŒQèYÇYÈYèQèZ(b¬bjZ)Z QèQ§IÈQÈZ)Z b‹b‹bjbjr«j¬j«jkbJb)Z(QèQèI§QÇbkQéYÇYÈQçQèZ)b«bŠZ)Z ZI§IÈQÈZ Z b‹b‹bjbjjŒrÌjjZ*9998ä19IEbkQEY†Y†Y¦Q‡A‡Z*Q†A&A%A%A9%A%IFA&AEA9&IEQgQ§QfI%I%A9999$AbJQ†Y†Yea§Q†I‡IèQÈIEA&A9%9%A&I%IFAE9&9AFQEYÈQE8å0ä9118å9%A%Z*QeiÇiÇqÇQ‡A†R QfA&9%9%9A%A&A%AFA%19%I%YfYÈAFIFA%A10å99%9Z -Q†a¦iÇiÇY§IgIéI§IEA%9%9%A%A&A%A&A%99AEIFYèI%8å99f99E9F9AFZK9F1IfAFAgI¨ZkAFAF9%199&AFA&AF9A%9&QgQ‡bJQ‡I‡IF910ä19AfZ)A‡1EAFAGIf9§R*IfA&9%999%A&AEA&AE9%9%IfQ‡bKQ‡IfbIb)ríZ)QÈI¨RZIèQÈR ZJj‹Z)b)Z)bJj«s R*bjZ*Z)Z)bJ{oj‹j‹jjbJbJbJZ)jÍQ§QÈQÈQèQèYèQÉR QèbJbŠb)b*Z)b)bjsNZJZJbiZ*Z)b){pbŠj‹jkbJbJbJQeIFaéI¦I%I$IEI%I%IEIEQfQeI&AEQEY…bj¬IFI%AEIEIFY†bŒQEIFYeIfI%AfQEbkIA$I%I%I$IEA%IEAEQEQfIEA%QEYeY¦sNIFI%IEIEIFQEjÍQEQeQFIEIfQFIEIEQ¨Q†IQEI%QEI%I%QEQEYeQeYeY†Y†b(j¬AEI%A%AEI&Q†j‹YeQEYeQeIFIeAGb‹I@äI$I%QEI%I$I%IEQ%Y…QeQeY†a†YÆkIEA%I%A&AEQEjÌYeYEYeYeIFI%A&Qfb*I¨AA&IEI†IFIfQ‡Y†Q‡IfQfYÇYèbJbËA&AFA§AfA†Z blQfQfQ†Y§Q¨Q¨Q¨k QfIfA%A&IFI†IEIfQ‡Y‡Q†IfQfYÇYÈbIjíA&IFA†AFA†QÉj¬QfQfQ‡Q‡Q§IgbjbjbkZ*ZjbÌZ*Z ZYéQèZJbjb«bkZŠb‹j«j‹j«j«j¬b‹bJjÌb‹jŠjíb‹ZŠbÌjÌj«rìb‹ZjZ*b«ZJZ Z YéRZ bkb«b‹ZŠb‹j«rËb‹j«j‹j¬bkj«jŠb‹ríZ‹bŠZ«j«@ä@ä8ä@ä@äYÇAAA@äA9YÇA98åA%A%A$I%QEI%IEA%A%9%I%bk999A@ä@ä8ä8ä@äQ§A%IAA8äAQ†AfA99A%I$A%IEQ%AEIEA%AA%bjA9A8ä@ä@ãA@äAYèA$AI$I9AQ¦998ä9A%IEI%II%AA$A%AIEZJ0ä98ä9@ä@ä@ä@ä@äYÇAEIII$AAQf9%98ä9A%I%I%I$I%I%AA9QEZJ8Ä90ä@äA%IEA%AAZ)IFI$I%A%AAI‡AF9%AA%I$I%IFI%I%IEQEIFIfIFRJ9A%9%A&A%I%IFAAQèI§I%A$I%AA%IEA‡A%9I%I%I%I%I%I%IEI%IFIfIFbJ9%91A%bjjjsZ IÈZ Z*Z(ZJbjbjbjZJZIZ QèQéríjÌjÍjÌjÍj¬bÌsrÌj¬r¬jÌ{ s s j¬j¬Z -QéYèR Z*Z)Z)bjbjbJZJZJbJQÇQéjÌjÍjÌjÌjíj¬jÌ{os j‹jŒs rÌjÌj¬IfIbKI%8ä(ä0äA8ä0ä8Ä0ä8ä9A0äAr‹QeIFQfQ†Y§Y§s IEI%I%QEQ%YEQeYfIfQfIE8ä0ä0ä990Ä8ä0ä8ä8äA8äAbJY¦IFQeQ‡Y§Y†ríQ†I%A%QEQ%QeQfQ†9j‹I0ä(ä0ä8ä8ä0ä0ä10å9A0äAbkY§Q†IgY‡Y§Y‡jÍA%11&9&IEIFQ‡Y¨Q‡Q†I0ä0ä0Ä98ä8ä(ä18Ä0äA%0ä9b)aèQgIfQ‡Q‡Y§ríIf11%A&AFQ‡Q‡I§I&b¬Q‡9118ä(ä9199%9AF9%IfbKQÇI‡Q‡I‡I‡QgjÌ1%9&1&1&A%Q§Q‡QèbJR -Af10å10ä110å9A&1A%9%IfZ*QÈQ§I‡Q‡Q‡QgrÌ1E9F9&1%9%AfAfZYèb I‡QèI§QÇbkYèYÇQÇYèQèZ(b¬bjZ ZQèI§QÈQÈZ Z)b‹bjbJbir¬j¬j‹bjb)b b)Q¨IÈIÇQÇbkR Y§YèYÇQèZ)b‹b‹Z)YèZ I§IÈQÈQèZ)bkbŠbJbjj‹rÍjjZ)8äA99$8å9%I%bkQeYfY†a¦I‡IfRJQ†A&A%A%9%9%IEA&AFI%9FA%A&Y†Q‡QfIFIE8åA0ä99AEb*Q†YeY†a¦I‡I†IéYèA%A%9%A9%A%I&IEAF99%A&QeYÈI%90ä99919A%ZJQeiÇiÇqÇQ‡A†Z*IfA%9%A9%A9&IEA&A%A%9%I&YfQÈIFIFI%8å18å91%AR -Q¦i§iÇqçY§AfR -Q‡AFA999EA&A%A&AE91I&QEQéI%8äAE9F9%9F9EAFIFZK9E1AgAFI‡AˆRJAfAFAF98å9fI&AFA&A%A&9%QgY§bkQ‡Q‡Q‡A&91%99&IFZKA§1AFAGA†I¨RJA‡A&A&91%A&AEAFA&A&A%9&IgQ†bkQ‡Igb)b)rìZ)QÈIˆQçZ QÈQÈR R -bŠZZ)Z)b)j«s.ZIZJZ*Z)Z)bJ{nb‹jjjkb)bJjJb)jIjìQ‡QÇI‡QÈZQÈQÉQèbIbkZZ Z)b)bjsOb*R)bjR*Z)b){ob‹j‹jkbJb)bJQeAFaèIgI%I$IEAIEI%IEIFQeIEIEIEY†bj¬IeI%IFI%IFY†bkYeIFYEIeIFIFQfY§bJII$I%I%A%IEI%IEIEQfIEIEI%Y…YÆsIeIEI&IEIFYEj¬QEQEQfIEIFQEIEIEY§I‡I$QEQEQEA%I$QEQeYeQfYeYfY¦b(j¬I%A%A&A%IEY†j‹YeYEQEQfI%AgIfQ‡j‹II$I%QEQEI%I%IEQ%Y†QeYeY†Y†YækIEA%A&AEI%IFrËYeYeQFYeIFIEAFQfb*IÈAFA&IeIgIfI‡Y‡Q¦Q†I†Q‡QÇaèbŠj¬AFAFA§I‡A¦Z -j¬a§Y¦a§Y§YèQ§Q§IÈb‹QfIFAEIFI‡IfI†Q‡Y¦Q†I†QgQÇYèbik I&AfI§A‡A†QÉjÍQfQ§Q§Y§Q§IgZJZJbJZjZ*b¬Z)ZQèZ QÈZ)bjb‹b‹Zjbjr‹b«b‹j«j‹b‹b*j‹bkbŠk ZJbjb‹b‹b‹bŠZ)Z*ZJj«RJZYÈYéQèZ bkb‹Z‹ZjbŠj‹j‹b‹j«j«b‹bJj‹b‹bjr¬Z‹ZJb‹b«I9@ä8ä@äYç@äAI@ä9AQÇA%8å8äA%AA%IEQEQEA%I%A9%IEbJ9999%@äA@ä8ä@äQ§A%IAA8ä9Y†Af8ä8å9%A%A%IEIEQEI%AEA%9IEbk@å99A@ä@ä@ã@äAYèIAI$IAAQ¦8å919A%I%A%I%I%AAA%AIEZJ0ä999@ä@ä@ä@ã@äY§A%I$A$IAAQf9%98ä9A%I%IEI%IA$AA%9Q$bK0ä99@äAAA%8ä8äZ AEI%QEIEA%AEI‡I†99AI$AI%I%I%I$I%I%IEA&Qé10ä0ä8äAI$A%8ä@äQ§I¨AIEIEA%IEIfI‡9%8äAI%IA&II%I%I%A%I%A&Z -0å9E0å0äYÈZ)AgI§QÈQÈQÈI‡Z)Z Z)b)b‹YèYèbYÇZ*AfI§QÈIÈQÇI§Z Z)Z)Z)j¬Yèb)YèIFQÈ0ä0ä0ä8ä19QÈQ‡Q‡Q‡Qé1%A%Q‡Q‡Yé0ä0ä0ä0ä99I§Y§Q‡Q‡Z 1%9%IfI‡I‡AfYéQ§YÇQÇZJQ§I‡I‡Q§QèQÈb)b QÈI‡IfQÉYÇYÇQÇZJQ§I‡I‡Q§QèQÈb)QÈ919%Q¨IfY†I‡QÈ9%9A&A%9AFY¨IfA&99I§IfY§I†IÈA%9A%A&9%A%QÈI%YÇZ*I†Q§I‡Q§YèQÇb)bJQÈQÇbkaèYèYÈYÇYèIfQ‡I‡QÇYèQÇbb‹QÇQÈjjYèYèYèIFQ¨I$IEIFQeQfQ†açQéAEIFZ)QfYfIfIFQÈI$IEIEQfQeQfYÇZ)AFAFZ)YeQfIfQ§QÈRQ§I†Q‡Z IÈZYèZYèQèbJIÈRQèQÇQèQ§I§I‡ZIÈYèZZYèYèbJQÈQèA@äI†II%A$IF9A%I%I%A%A%YÈ90å9AIEIEI$A$If9A%I%I%AA%QÈ98åYÈZ)AgI§QÇI¨QÇI‡Z)Z b)Z)j‹b)b)b)jIZ)AgI§QÇIÈQ§I‡Z b)Z)b)j¬Yèb)YèIFYè0ä0ä0ä0ä99QÈQ§Q‡Q‡R 1%A%Q§Y§Qé0ä0ä0ä0ä99I§Y§Q‡Q‡Z 1%9&IfI‡I‡AfZ Q§YÇQÇZJQ§IgI‡Q§QèQÈb)b QÈI‡AfYèY§YÇQÈZ*Q§I‡IgQ§QèQÈb)QÈ919%QÈIfY‡I‡QÈA%9A%AF9AEYÈIFA19I¨IfY‡I†IÈA&99%A&A%A%YÈI&YÇZ*Q†Q§I†Q¨YèQÇb)bjQÈQÇjkYèYèQÈbQ‡AfQ‡I‡QÇYèQÇaèb‹QÈQÇjkYèYèYÈIFQÈI%IEIEQfQfQ†aèRAFIFb)QfQfIfYèQ‡A$IFIEQfQfQ†aÇZ)AFAFZ YfQfIfQ§Q§R Q‡I†Q‡RQÈQèYèZQèYèbJIÈQèYèQÈQèQ§I†I‡ZIÈQèYèZYèQèbJIÈQèAAIfI%I$A$If9A%I%I%IA%Q§0ä8ä@äAIEIEI%AIf9A%I%I%I%A%QÇ8å8äQÈb)AgI‡IÇI¨I§I‡Z)Z b)b)b‹YèYèb)aèYèAfI‡IÇIÇI§I‡Z Z)b)Z)r¬Yèb ZIFYè0å0ä0ä199QèQ§Q‡Q‡Qé1%A%Q¨YèI§10ä8ä0ä99Q§Y¨Q‡Q‡Z 1%A&I†I†IgAfZ Y¦Y§QÈZ*I§IfI‡Q§QèQÈb YèQ§I‡AfQèY§Y§QÇZ*Q§IfIgQ§QèQÈb)Q§919%QÈIfY‡I‡QÈ9%9A&AF9AFYÈIfA%0å9%I§I†Y‡I‡IÈA%9A&A%9&A%YÈAFYÇZ)IfQ§I‡QÇYÈQÇb(bJQÈQ§j‹YèYèQÈb)IfI‡Q†I‡Q§YèQ§Yèb‹QÇQ¨jkYèYÈYèIFQÈI%IEIFQfQfY†bQéAFIfb QfQ†Q†Z*I%I%IEIEQfQfQ†açZ*AFAFb)QfYfIfQ§I§Z Q‡I†I†Z IÇQèYèYèQèQèbJIÈQèYèI§QèQ§I†I†Z IÇQèYèYèYèQèbJIÈQÈAAI‡I%I$AAf9A%I%I%I%AEQÈ99AAIfIEI$AIf9A%I%I%I%A%YÈ99YÈZ)AgI‡I§I§I§I†Z)b Z)b*j‹Yèb b)b Q§AfI‡I§I§I‡I‡Z Z)b)b*r¬Yèb Z IFYé10å0ä999QÈQ§Q‡Q‡R 1%A&Q‡YÈI‡0ä0å90ä99QÇQ¨Q‡Q‡Z 1%A&IfI†IgAfYéY¦YÇQÇZJI§IfI‡Q§QÈQÈb)YèQ§IgAfQèY§Y§QÇZ*Q§IfI‡Q§QÈQÈb)Q§9%9%9%QÈIfY‡I‡QÈAE9A&AFA%AFYÈIfI&19%Q¨I†Y‡I‡IèA&9AEA&9%AFYÈIFQÇb)IfI‡I‡Q§QÇQÇb)bjQÇQ¨jjYèYÈYÈaèYéIfQ†I‡Q§YÇQ§bb‹QÇQ¨jjYèYÈYÇIFQÈI%IeIFQfQ†Q†bYéAfIfb*Y†Y†I‡Q‡YèI%IeIFQfQ†Q†açZ*AFIfZ*YfQ†QfQ§I§YèI†I†I‡ZI§QÈYèYèQÈQÈbII¨QèQÇI‡YèQ§IfIfZI¨QÈYèYèQÈQèb)I¨QÈA@äI†I%I$A%If9A%I%I%I$A%Q¨0ä8äAAIEIFI$A%If9AI%I%I%A%Q§98äQÈ9%AfAFYèYÈQèQ§YÈ9EAfAFQèYÈRQ§AFI‡Q†QèAFIfI‡YÈAfI‡Q§QÈAfIfI‡Q§QÇIfQ†Q§b I†Z Y§Q§IFQ†Q§b)I†Z Y§IfI†IfI‡Q†Q‡QÈAfIfI‡IEI‡I†Q‡QÈAfQÈ9%AfAFYèYÈR YÇZ 9%AfAFYèYÈR Q§AFI‡Q¦QÈAfIfI‡YÈAFI‡Q§QÈAfIfI‡Q§QÇIfQ†Q§b)I‡ZQ§YÈIEQ†Q§b)I‡YèY§IFI†IfI†I‡Q†QÈAfIfI†IFI†I‡Q†QÈAfQÈ9%AfAFYèYèQéQ§Yè9EAFAfYèYÈR Q§AFI‡Q¦QÈAfIfI‡YÈAFI‡Q§QÈAfIfI‡Q§QÇIfQ†Q§b)I‡aèQ§QÈIfQ†Q§b)I†aéQ§IfI‡IEI‡I†Q‡QÈAfIfQ‡IEI‡I†Q‡QÈAfQÈAEAFAFYèYÈQéQÇYÈ9%AFAFYèYÈR Q§AFI‡Q†QèAFIgI‡YÈAFI‡Q§QèAFIfI‡Q§QÇIfQ†Q§b)I‡bQ§YÈIfQ†Q§b)I‡bQ§IFI†IFI†I‡Q†QÈAfIFI†IEI‡I†Q‡Q§AfIfI‡I§QÈI‡I‡I§Q§I‡Q†Q§Q¨I†Q†Q§Q¨I†I‡Q§QÈI‡I†I§Q¨I‡Q†Q§Q§I‡Q†Q§Q§IfI‡Q§Q¨I†I‡Q§Q¨I‡Q†Q§QÇI‡Q†Q§Q§I†I‡Q§QÈIfI‡Q§Q¨I†Q‡Q§Q§Q‡I†Q§Q§I†Q¨I†Q¨I‡Q§I‡Q§I†Q§I‡Q§I†Q¨I†Q§Q§Q§Q‡I§Q§ \ No newline at end of file diff --git a/glide2x/cvg/glide/tests/sst1img.bat b/glide2x/cvg/glide/tests/sst1img.bat deleted file mode 100644 index 91d13fd..0000000 --- a/glide2x/cvg/glide/tests/sst1img.bat +++ /dev/null @@ -1,48 +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_SRCIMG%]==[] goto Default - -goto Output - -:Default -set FX_GLIDE_TEST_SRCIMG=%BUILD_ROOT_SST1%\glide\images - -:Output -set sdir=%FX_GLIDE_TEST_SRCIMG% - -@echo on -test00 -d %sdir%\test00.vgm -sleep 1 -test01 -d %sdir%\test01.vgm -sleep 1 -test02 -d %sdir%\test02.vgm -sleep 1 -test03 -d %sdir%\test03.vgm -sleep 1 -test04 -d %sdir%\test04.vgm -sleep 1 -test05 -d %sdir%\test05.vgm -sleep 1 -test06 -d %sdir%\test06.vgm -sleep 1 -test07 -d %sdir%\test07.vgm -sleep 1 -test08 -d %sdir%\test08.vgm -sleep 1 -test09 -d %sdir%\test09.vgm -sleep 1 -test10 -d %sdir%\test10.vgm -sleep 1 -test13 -d %sdir%\test13.vgm -sleep 1 -test16 -d %sdir%\test16.vgm -sleep 1 -test17 -d %sdir%\test17.vgm -sleep 1 -test18 -d %sdir%\test18.vgm -sleep 1 -test19 -d %sdir%\test19.vgm -sleep 1 diff --git a/glide2x/cvg/glide/tests/test00.c b/glide2x/cvg/glide/tests/test00.c deleted file mode 100644 index 275e702..0000000 --- a/glide2x/cvg/glide/tests/test00.c +++ /dev/null @@ -1,137 +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 -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test00"; -static const char purpose[] = "Clear screen to blue"; -static const char usage[] = "-n -r -d "; - -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; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while(( rv = tlGetOpt( argc, argv, "nrd", &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 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, 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 ); - - tlConOutput( "Press a key to quit\n" ); - - while( frames-- && tlOkToRender()) { - grBufferClear( 0xff0000, 0, GR_WDEPTHVALUE_FARTHEST ); - tlConRender(); - grBufferSwap( 1 ); - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - exit(0); -} - diff --git a/glide2x/cvg/glide/tests/test01.c b/glide2x/cvg/glide/tests/test01.c deleted file mode 100644 index 94e50ed..0000000 --- a/glide2x/cvg/glide/tests/test01.c +++ /dev/null @@ -1,157 +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 -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test01"; -static const char purpose[] = "draws a diagonal line of points from top-left to bottom-right"; -static const char usage[] = "-n -r -d "; - -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; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &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 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, 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 - flat shading */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grConstantColorValue( 0xFFFFFF ); - - - tlConOutput( "Press a key to quit\n" ); - while( frames-- && tlOkToRender()) { - int i; - GrVertex vtx; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - grBufferClear( 0x0, 0, GR_WDEPTHVALUE_FARTHEST ); - - - for( i = 0; i < 100; i++ ) { - float pos = ((float)i)/100.0f; - - vtx.x = tlScaleX( pos ), vtx.y = tlScaleY( pos ); - grDrawPoint( &vtx ); - } - - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - exit(0); -} - - - - - diff --git a/glide2x/cvg/glide/tests/test02.c b/glide2x/cvg/glide/tests/test02.c deleted file mode 100644 index 03a74a3..0000000 --- a/glide2x/cvg/glide/tests/test02.c +++ /dev/null @@ -1,159 +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 -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test02"; -static const char purpose[] = "draws a parabolic envelope of lines"; -static const char usage[] = "-n -r -d "; - -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; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &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 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, 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, 0xff0000 ); - - /* Set up Render State - flat shading */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grConstantColorValue( 0xFFFFFF ); - - - tlConOutput( "Press a key to quit\n" ); - while( frames-- && tlOkToRender()) { - int i; - GrVertex vtxA, vtxB; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00, 0, GR_WDEPTHVALUE_FARTHEST ); - - for( i = 0; i < 100; i++ ) { - float pos = ((float)i)/100.0f; - - vtxA.x = tlScaleX( pos ), vtxA.y = tlScaleY( 0.0f ); - vtxB.x = tlScaleX( 1.0f), vtxB.y = tlScaleY( pos ); - - grDrawLine( &vtxA, &vtxB ); - } - - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - exit(0); -} - - - - - diff --git a/glide2x/cvg/glide/tests/test03.c b/glide2x/cvg/glide/tests/test03.c deleted file mode 100644 index 2205235..0000000 --- a/glide2x/cvg/glide/tests/test03.c +++ /dev/null @@ -1,154 +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 -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test03"; -static const char purpose[] = "draws gouraud shaded lines"; -static const char usage[] = "-n -r -d "; - -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; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &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 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, 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 - gouraud shading */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - - tlConOutput( "Press a key to quit\n" ); - while( frames-- && tlOkToRender() ) { - GrVertex vtxA, vtxB; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - - grBufferClear( 0x00, 0, GR_WDEPTHVALUE_FARTHEST ); - - vtxA.x = tlScaleX( 0.0f ), vtxA.y = tlScaleY( 0.0f ); - vtxA.r = 255.0f, vtxA.g = 0.0f, vtxA.b = 0.0f; - - vtxB.x = tlScaleX( 1.0f ), vtxB.y = tlScaleY( 1.0f ); - vtxB.r = 0.0f, vtxB.g = 255.0f, vtxB.b = 0.0f; - - grDrawLine( &vtxA, &vtxB ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - exit(0); -} - - - - - diff --git a/glide2x/cvg/glide/tests/test04.c b/glide2x/cvg/glide/tests/test04.c deleted file mode 100644 index 3c33d77..0000000 --- a/glide2x/cvg/glide/tests/test04.c +++ /dev/null @@ -1,157 +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 -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test04"; -static const char purpose[] = "draws gouraud shaded triangle"; -static const char usage[] = "-n -r -d "; - -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; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &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 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, 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 - gouraud shading */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - - tlConOutput( "Press a key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00, 0, GR_WDEPTHVALUE_FARTHEST ); - - vtxA.x = tlScaleX( 0.3f ), vtxA.y = tlScaleY( 0.3f ); - vtxA.r = 255.0f, vtxA.g = 0.0f, vtxA.b = 0.0f; - - vtxB.x = tlScaleX( 0.8f ), vtxB.y = tlScaleY( 0.4f ); - vtxB.r = 0.0f, vtxB.g = 255.0f, vtxB.b = 0.0f; - - vtxC.x = tlScaleX( 0.5f ), vtxC.y = tlScaleY( 0.8f ); - vtxC.r = 0.0f, vtxC.g = 0.0f, vtxC.b = 255.0f; - - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - exit(0); -} - - - - - diff --git a/glide2x/cvg/glide/tests/test05.c b/glide2x/cvg/glide/tests/test05.c deleted file mode 100644 index 11829a4..0000000 --- a/glide2x/cvg/glide/tests/test05.c +++ /dev/null @@ -1,191 +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 -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test05"; -static const char purpose[] = "renders two interpenetrating triangles with z-buffering"; -static const char usage[] = "-n -r -d "; - -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; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &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 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, 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 - flat shading + Z-buffering */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grDepthBufferMode( GR_DEPTHBUFFER_ZBUFFER ); - grDepthBufferFunction( GR_CMP_GREATER ); - grDepthMask( FXTRUE ); - - tlConOutput( "Press a key to quit\n" ); - - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - float zDist; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - grBufferClear( 0x00, 0, GR_ZDEPTHVALUE_FARTHEST ); - - vtxA.x = tlScaleX( 0.25f ), vtxA.y = tlScaleY( 0.21f ); - vtxB.x = tlScaleX( 0.75f ), vtxB.y = tlScaleY( 0.21f ); - vtxC.x = tlScaleX( 0.5f ), vtxC.y = tlScaleY( 0.79f ); - - /*----------------------------------------------------------- - Depth values should be scaled from reciprocated Depth Value - then scaled from 0 to 65535.0. - - ooz = ( 1.0f / Z ) * 65535.0f = 65535.0f / Z - -----------------------------------------------------------*/ - - zDist = 10.0f; - vtxA.ooz = vtxB.ooz = vtxC.ooz = ( 65535.0f / zDist ); - - grConstantColorValue( 0x00808080 ); - - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - - vtxA.x = tlScaleX( 0.86f ), vtxA.y = tlScaleY( 0.21f ); - vtxB.x = tlScaleX( 0.86f ), vtxB.y = tlScaleY( 0.79f ); - vtxC.x = tlScaleX( 0.14f ), vtxC.y = tlScaleY( 0.5f ); - - /*----------------------------------------------------------- - Depth values should be scaled from reciprocated Depth Value - then scaled to ( 0, 65535 ) - - ooz = ( 1.0f / Z ) * 65535.0f = 65535.0f / Z - -----------------------------------------------------------*/ - - zDist = 12.5f; - vtxA.ooz = vtxB.ooz = ( 65535.0f / zDist ); - zDist = 7.5f; - vtxC.ooz = ( 65535.0f / zDist ); - - grConstantColorValue( 0x0000FF00 ); - - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - exit(0); -} - - - - - diff --git a/glide2x/cvg/glide/tests/test06.c b/glide2x/cvg/glide/tests/test06.c deleted file mode 100644 index 9ef1cd6..0000000 --- a/glide2x/cvg/glide/tests/test06.c +++ /dev/null @@ -1,188 +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 -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test06"; -static const char purpose[] = "renders two interpenetrating triangles with w-buffering"; -static const char usage[] = "-n -r -d "; - -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; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &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 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, remArgs[0]); - } - } - - 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 - flat shading + w-buffering */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grDepthBufferMode( GR_DEPTHBUFFER_WBUFFER ); - grDepthBufferFunction( GR_CMP_LESS ); - grDepthMask( FXTRUE ); - - tlConOutput( "Press a key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - float wDist; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00, 0, GR_WDEPTHVALUE_FARTHEST ); - - vtxA.x = tlScaleX( 0.25f ), vtxA.y = tlScaleY( 0.21f ); - vtxB.x = tlScaleX( 0.75f ), vtxB.y = tlScaleY( 0.21f ); - vtxC.x = tlScaleX( 0.5f ), vtxC.y = tlScaleY( 0.79f ); - - /*----------------------------------------------------------- - OOW Values are in the range (1,1/65535) - - This can be the exact same computed 1/W that you use - for texture mapping. This saves on host computation and - vertex data transferred across the PCI bus. - -----------------------------------------------------------*/ - wDist = 10.0f; - vtxA.oow = vtxB.oow = vtxC.oow = ( 1.0f / wDist ); - - grConstantColorValue( 0x00808080 ); - - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - - vtxA.x = tlScaleX( 0.86f ), vtxA.y = tlScaleY( 0.21f ); - vtxB.x = tlScaleX( 0.86f ), vtxB.y = tlScaleY( 0.79f ); - vtxC.x = tlScaleX( 0.14f ), vtxC.y = tlScaleY( 0.5f ); - - /*----------------------------------------------------------- - OOW Values are in the range (1,1/65535) - - This can be the exact same computed 1/W that you use - for texture mapping. This saves on host computation and - vertex data transferred across the PCI bus. - -----------------------------------------------------------*/ - wDist = 12.5f; - vtxA.oow = vtxB.oow = ( 1.0f / wDist ); - wDist = 7.5f; - vtxC.oow = ( 1.0f / wDist ); - - grConstantColorValue( 0x0000FF00 ); - - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - exit(0); -} - - - - - diff --git a/glide2x/cvg/glide/tests/test07.c b/glide2x/cvg/glide/tests/test07.c deleted file mode 100644 index 6541771..0000000 --- a/glide2x/cvg/glide/tests/test07.c +++ /dev/null @@ -1,171 +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 -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test07"; -static const char purpose[] = "alpha blending test"; -static const char usage[] = "-n -r -d "; - -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; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &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 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, 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 - flat shading + alpha blend on constant alpha */ - 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_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_SRC_ALPHA, GR_BLEND_ONE_MINUS_SRC_ALPHA, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - - - tlConOutput( "Press a key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00, 0, 0 ); - - vtxA.x = tlScaleX( 0.25f ), vtxA.y = tlScaleY( 0.21f ); - vtxB.x = tlScaleX( 0.75f ), vtxB.y = tlScaleY( 0.21f ); - vtxC.x = tlScaleX( 0.5f ), vtxC.y = tlScaleY( 0.79f ); - - grConstantColorValue( 0xFF0000FF ); - - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - - vtxA.x = tlScaleX( 0.86f ), vtxA.y = tlScaleY( 0.21f ); - vtxB.x = tlScaleX( 0.86f ), vtxB.y = tlScaleY( 0.79f ); - vtxC.x = tlScaleX( 0.14f ), vtxC.y = tlScaleY( 0.5f ); - - grConstantColorValue( 0x80FF0000 ); - - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - exit(0); -} - - - - - diff --git a/glide2x/cvg/glide/tests/test08.c b/glide2x/cvg/glide/tests/test08.c deleted file mode 100644 index 90d26ec..0000000 --- a/glide2x/cvg/glide/tests/test08.c +++ /dev/null @@ -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 -** -*/ - -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test08"; -static const char purpose[] = "fogging"; -static const char usage[] = "-n -r -d "; - -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; - FxBool scrgrab = FXFALSE; - char filename[256]; - - GrFog_t fogtable[GR_FOG_TABLE_SIZE]; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &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 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, 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 - gouraud shading + fog */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grFogMode( GR_FOG_WITH_TABLE ); - grFogColorValue( 0xff00ff00 ); - guFogGenerateExp( fogtable, .01f ); - grFogTable( fogtable ); - - tlConOutput( "Press a key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - float wDist; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00, 0, 0 ); - - vtxA.x = tlScaleX( 0.0f ), vtxA.y = tlScaleY( 0.0f ); - vtxA.r = 0.0f, vtxA.g = 0.0f, vtxA.b = 64.0f; - wDist = 20.0f; - vtxA.oow = ( 1.0f / wDist ); - - vtxB.x = tlScaleX( 0.016f ), vtxB.y = tlScaleY( 1.0f ); - vtxB.r = 0.0f, vtxB.g = 0.0f, vtxB.b = 128.0f; - wDist = 2000.0f; - vtxB.oow = ( 1.0f / wDist ); - - vtxC.x = tlScaleX( 1.0f ), vtxC.y = tlScaleY( 0.0208f ); - vtxC.r = 0.0f, vtxC.g = 0.0f, vtxC.b = 64.0f; - wDist = 20.0f; - vtxC.oow = ( 1.0f / wDist ); - - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - exit(0); -} - - - - - diff --git a/glide2x/cvg/glide/tests/test09.c b/glide2x/cvg/glide/tests/test09.c deleted file mode 100644 index 9a9d0de..0000000 --- a/glide2x/cvg/glide/tests/test09.c +++ /dev/null @@ -1,212 +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 -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test09"; -static const char purpose[] = "chromakey - render a red and blue" - " triangle but chromakey one out"; -static const char usage[] = "-n -r -d "; - -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; - FxBool scrgrab = FXFALSE; - char filename[256]; - FxU8 subframe = 0; - - unsigned long chromaColor; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &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 'd': - scrgrab = FXTRUE; - frames = 2; - strcpy(filename, 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 - gouraud shading + enable chromakey on blue */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grChromakeyMode( GR_CHROMAKEY_ENABLE ); - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - - chromaColor = BLUE; - grChromakeyValue( chromaColor ); - - tlConOutput( "Press to toggle chomakey color\n" ); - tlConOutput( "Press any other key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - switch( chromaColor ) { - case RED: - tlConOutput( "Chromakey RED \r" ); - break; - case BLUE: - tlConOutput( "Chromakey BLUE\r" ); - break; - } - - grBufferClear( 0x00, 0, 0 ); - - vtxA.x = tlScaleX( 0.5f ), vtxA.y = tlScaleY( 0.1f ); - vtxB.x = tlScaleX( 0.8f ), vtxB.y = tlScaleY( 0.9f ); - vtxC.x = tlScaleX( 0.2f ), vtxC.y = tlScaleY( 0.9f ); - - grConstantColorValue( RED ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - grSstOrigin( GR_ORIGIN_LOWER_LEFT ); - - grConstantColorValue( BLUE ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - grSstOrigin( GR_ORIGIN_UPPER_LEFT ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - char fname[256], tmp[32]; - FxU16 cnt; - - cnt = strcspn(filename, "."); - strncpy(fname, filename, cnt); - fname[cnt] = 0; - sprintf(tmp,"_%d", subframe); - strcat(fname, tmp); - strcat(fname, filename+cnt); - if (!tlScreenDump(fname, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - - /* cycle through all mode */ - if ( chromaColor == RED ) - chromaColor = BLUE; - else - chromaColor = RED; - grChromakeyValue( chromaColor ); - - subframe++; - /* scrgrab = FXFALSE; */ - } - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case ' ': - if ( chromaColor == RED ) - chromaColor = BLUE; - else - chromaColor = RED; - grChromakeyValue( chromaColor ); - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} - - - - - diff --git a/glide2x/cvg/glide/tests/test10.c b/glide2x/cvg/glide/tests/test10.c deleted file mode 100644 index f3f58a1..0000000 --- a/glide2x/cvg/glide/tests/test10.c +++ /dev/null @@ -1,207 +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 -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test10"; -static const char purpose[] = "culling test - render a red and blue" - " triangle but cull one out - red positive" - ", blue negative"; -static const char usage[] = "-n -r -d "; - -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; - FxBool scrgrab = FXFALSE; - char filename[256]; - FxU8 subframe = 0; - - GrCullMode_t cullMode; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &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 'd': - scrgrab = FXTRUE; - frames = 2; - strcpy(filename, 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 */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - cullMode = GR_CULL_POSITIVE; - grCullMode( cullMode ); - - tlConOutput( "Press to toggle cull orientation\n" ); - tlConOutput( "Press any other key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - switch( cullMode ) { - case GR_CULL_POSITIVE: - tlConOutput( "CULL POSITIVE\r" ); - break; - case GR_CULL_NEGATIVE: - tlConOutput( "CULL NEGATIVE\r" ); - break; - } - - grBufferClear( 0x00, 0, 0 ); - - vtxA.x = tlScaleX( 0.5f ), vtxA.y = tlScaleY( 0.1f ); - vtxB.x = tlScaleX( 0.8f ), vtxB.y = tlScaleY( 0.9f ); - vtxC.x = tlScaleX( 0.2f ), vtxC.y = tlScaleY( 0.9f ); - - grConstantColorValue( 0x000000ff ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - grSstOrigin( GR_ORIGIN_LOWER_LEFT ); - - grConstantColorValue( 0x00ff0000 ); - grDrawTriangle( &vtxA, &vtxC, &vtxB ); - - grSstOrigin( GR_ORIGIN_UPPER_LEFT ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - char fname[256], tmp[32]; - FxU16 cnt; - - cnt = strcspn(filename, "."); - strncpy(fname, filename, cnt); - fname[cnt] = 0; - sprintf(tmp,"_%d", subframe); - strcat(fname, tmp); - strcat(fname, filename+cnt); - if (!tlScreenDump(fname, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - - /* cycle through all mode */ - if ( cullMode == GR_CULL_POSITIVE ) - cullMode = GR_CULL_NEGATIVE; - else - cullMode = GR_CULL_POSITIVE; - grCullMode( cullMode ); - - subframe++; - } - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case ' ': - if ( cullMode == GR_CULL_POSITIVE ) - cullMode = GR_CULL_NEGATIVE; - else - cullMode = GR_CULL_POSITIVE; - grCullMode( cullMode ); - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} - - - - - diff --git a/glide2x/cvg/glide/tests/test11.c b/glide2x/cvg/glide/tests/test11.c deleted file mode 100644 index 305bc66..0000000 --- a/glide2x/cvg/glide/tests/test11.c +++ /dev/null @@ -1,260 +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 -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test11"; -static const char purpose[] = "simple lfb read/write test"; -static const char usage[] = "-n -r "; - -static int rRandom(int s, int e); -static unsigned int iRandom (unsigned int maxr); - -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; - - static unsigned short colorBuf[64][64]; - static unsigned short grabBuf[64][64]; - - int x,y; - - /* 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(0); - } - 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_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - disable dithering*/ - grDitherMode( GR_DITHER_DISABLE ); - - - /* Create Source Bitmap to be copied to framebuffer */ - for( y = 0; y < 64; y++ ) { - for( x = 0; x < 64; x++ ) { - FxU8 red = x << 2; - FxU8 grn = y << 2; - FxU8 blu = ( x + y )<<1; - colorBuf[y][x] = (red & 0xF8) << 8; - colorBuf[y][x] |= (grn & 0xFC) << 3; - colorBuf[y][x] |= (blu & 0xF8) >> 3; - } - } - - - tlConOutput( "Press any key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrLfbInfo_t info; - int startX, startY; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00, 0, 0 ); - - /* prepare info structure */ - info.size = sizeof( GrLfbInfo_t ); - - /* lock back buffer */ - if ( grLfbLock( GR_LFB_WRITE_ONLY, - GR_BUFFER_BACKBUFFER, - GR_LFBWRITEMODE_565, - GR_ORIGIN_UPPER_LEFT, - FXFALSE, - &info )==FXFALSE) { - tlConOutput( "Error, failed to take write lock\n" ); - break; - } - - if ( tlScaleX(1.0f) < 64.0 || - tlScaleY(1.0f) < 64.0 ) - exit(1); - - /* generate random start position */ - startX = (int)rRandom( 64, (int)tlScaleX(1.0f) - 65 ); - startY = (int)rRandom( 64, (int)tlScaleY(1.0f) - 65 ); - - /* render image to back buffer */ - for( y = 0; y < 64; y++ ) { - for( x = 0; x < 64; x++ ) { - FxU16 *pixel = - (FxU16*)(((char*)info.lfbPtr) + - (y+startY)*info.strideInBytes+ - (x+startX)*2); - *pixel = colorBuf[y][x]; - } - } - /* unlock the backbuffer */ - grLfbUnlock( GR_LFB_WRITE_ONLY, GR_BUFFER_BACKBUFFER ); - - /* swap to front buffer */ - grBufferSwap( 1 ); - grBufferClear( 0,0,0 ); - - tlSleep( 1 ); - - /* lock the front buffer */ - if ( grLfbLock( GR_LFB_READ_ONLY, - GR_BUFFER_FRONTBUFFER, - GR_LFBWRITEMODE_ANY, - GR_ORIGIN_UPPER_LEFT, - FXFALSE, - &info )==FXFALSE) { - tlConOutput( "Error, failed to take read lock\n" ); - break; - } - - /* grab the source image out of the front buffer */ - for( y = 0; y < 64; y++ ) { - for( x = 0; x < 64; x++ ) { - FxU16 *pixel = - (FxU16*)(((char*)info.lfbPtr) + - (y+startY)*info.strideInBytes+ - (x+startX)*2); - grabBuf[y][x] = *pixel; - } - } - /* unlock the front buffer */ - grLfbUnlock( GR_LFB_READ_ONLY, GR_BUFFER_FRONTBUFFER ); - - tlConClear(); - - /* compare the source image to the readback image */ - if ( memcmp( colorBuf, grabBuf, sizeof( colorBuf ) ) ) { - tlConOutput( "Failed readback test\n" ); - } else { - tlConOutput( "Passed readback test\n" ); - } - - grBufferSwap( 1 ); - tlConOutput( "Press any key to quit\n" ); - tlConRender(); - grBufferSwap( 1 ); - - tlSleep( 1 ); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - 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); -} - - - diff --git a/glide2x/cvg/glide/tests/test12.c b/glide2x/cvg/glide/tests/test12.c deleted file mode 100644 index 4abd5e1..0000000 --- a/glide2x/cvg/glide/tests/test12.c +++ /dev/null @@ -1,345 +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 -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test12"; -static const char purpose[] = "lfb write modes, render buffer, pixpipe, yorigin test"; -static const char usage[] = "-n -r "; - - -static const char *originString[] = { - "GR_ORIGIN_UPPER_LEFT ", - "GR_ORIGIN_LOWER_RIGHT" -}; - -static const char *renderBufferString[] = { - "GR_BUFFER_FRONTBUFFER", - "GR_BUFFER_BACKBUFFER " -}; - -static const char *writeModeString[] = { - "GR_LFBWRITEMODE_565 ", - "GR_LFBWRITEMODE_555 ", - "GR_LFBWRITEMODE_1555 ", - "GR_LFBWRITEMODE_RESERVED1 ", - "GR_LFBWRITEMODE_888 ", - "GR_LFBWRITEMODE_8888 ", - "GR_LFBWRITEMODE_RESERVED2 ", - "GR_LFBWRITEMODE_RESERVED3 ", - "GR_LFBWRITEMODE_RESERVED4 ", - "GR_LFBWRITEMODE_RESERVED5 ", - "GR_LFBWRITEMODE_RESERVED6 ", - "GR_LFBWRITEMODE_RESERVED7 ", - "GR_LFBWRITEMODE_565_DEPTH ", - "GR_LFBWRITEMODE_555_DEPTH ", - "GR_LFBWRITEMODE_1555_DEPTH", - "GR_LFBWRITEMODE_ZA16 " -}; - -static const char *pixPipeString[] = { - "PIXELPIPE DISABLED", - "PIXELPIPE ENABLED " -}; - -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; - - TlTexture texture; - - GrOriginLocation_t lfbOrigin; - GrOriginLocation_t sstOrigin; - GrLfbWriteMode_t writeMode; - GrBuffer_t lfbBuffer; - GrBuffer_t sstBuffer; - GrBuffer_t curBuffer; - GrLfbInfo_t info; - FxBool pixPipe; - - /* 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; - } - } - - if ( resolution == GR_RESOLUTION_NONE ) { - tlErrorMessage( "Error!: Frontbuffer rendering not supported in a window\n" ); - exit(1); - } - - 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, 0.5f, - 60, 15, 0xffffff ); - - - /* Load source bitmap from a .3df file */ - assert( tlLoadTexture( "decal1.3df", - &texture.info, - &texture.tableType, - &texture.tableData ) ); - - lfbOrigin = GR_ORIGIN_UPPER_LEFT; - sstOrigin = GR_ORIGIN_UPPER_LEFT; - lfbBuffer = GR_BUFFER_BACKBUFFER; - sstBuffer = GR_BUFFER_BACKBUFFER; - curBuffer = GR_BUFFER_BACKBUFFER; - pixPipe = FXFALSE; - writeMode = GR_LFBWRITEMODE_565; - - info.size = sizeof( info ); - - while( frames-- && tlOkToRender()) { - - static const char *console = { - "Current Buffer: %s\n" - "1 - lock yOrigin (%s)\n" - "2 - glide yOrigin (%s)\n" - "3 - lfb render buffer (%s)\n" - "4 - glide render buffer (%s)\n" - "5 - pixpipe enable (%s)\n" - "6 - lfb write mode (%s)\n" - "Press any other key to quit\n" - }; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grRenderBuffer( GR_BUFFER_BACKBUFFER ); - grBufferClear( 0, 0, 0 ); - grRenderBuffer( GR_BUFFER_FRONTBUFFER ); - grBufferClear( 0, 0, 0 ); - grRenderBuffer( GR_BUFFER_BACKBUFFER ); - - - /* set Glide State */ - grRenderBuffer( sstBuffer ); - grSstOrigin( sstOrigin ); - - /* Attempt Lock */ - if ( grLfbLock( GR_LFB_WRITE_ONLY, - lfbBuffer, - writeMode, - lfbOrigin, - pixPipe, - &info ) ) { - int x, y; - FxU32 *longData = info.lfbPtr; - FxU16 *shortData = info.lfbPtr; - FxU16 *srcData = texture.info.data; - FxU32 longStride = info.strideInBytes >> 2; - FxU32 shortStride = info.strideInBytes >> 1; - FxU32 longColor; - FxU16 shortColor; - for( y = 0; y < 256; y++ ) - for( x = 0; x < 256; x++ ) { - switch( writeMode ) { - case GR_LFBWRITEMODE_565: - shortData[y*shortStride+x] = - srcData[y*256+x]; - break; - case GR_LFBWRITEMODE_555: - case GR_LFBWRITEMODE_1555: - shortColor = srcData[y*256+x]; - shortColor = - (0x8000) | // Alpha == 1 - ((shortColor >> 1) & 0x7C00) | - ((shortColor >> 1) & 0x03E0) | - ((shortColor) & 0x1f); - shortData[y*shortStride+x] = - shortColor; - break; - case GR_LFBWRITEMODE_888: - case GR_LFBWRITEMODE_8888: - longColor = srcData[y*256+x]; - longColor = - (0xFF000000) | - ((longColor<<8)&0x00F80000) | - ((longColor<<5)&0x0000FC00) | - ((longColor<<3)&0x000000F8); - longData[y*longStride+x] = longColor; - break; - case GR_LFBWRITEMODE_565_DEPTH: - longColor = srcData[y*256+x]; - longData[y*longStride+x] = longColor; - break; - case GR_LFBWRITEMODE_1555_DEPTH: - case GR_LFBWRITEMODE_555_DEPTH: - longColor = srcData[y*256+x]; - longColor = - (0x00008000) | - ((longColor>>1) & 0x00007C00) | - ((longColor>>1) & 0x000003E0) | - ((longColor ) & 0x0000001f); - longData[y*longStride+x] = longColor; - default: - break; - } - - } - - grLfbUnlock( GR_LFB_WRITE_ONLY, - lfbBuffer ); - - grRenderBuffer( GR_BUFFER_BACKBUFFER ); - - tlConClear(); - curBuffer = GR_BUFFER_BACKBUFFER; - tlConOutput( console, - renderBufferString[curBuffer], - originString[lfbOrigin], - originString[sstOrigin], - renderBufferString[lfbBuffer], - renderBufferString[sstBuffer], - pixPipeString[pixPipe], - writeModeString[writeMode] ); - tlConRender(); - grBufferSwap( 1 ); - tlSleep( 1 ); - tlConClear(); - curBuffer = GR_BUFFER_FRONTBUFFER; - tlConOutput( console, - renderBufferString[curBuffer], - originString[lfbOrigin], - originString[sstOrigin], - renderBufferString[lfbBuffer], - renderBufferString[sstBuffer], - pixPipeString[pixPipe], - writeModeString[writeMode] ); - tlConRender(); - grBufferSwap( 1 ); - tlSleep( 1 ); - } else { - grRenderBuffer( GR_BUFFER_BACKBUFFER ); - tlConClear(); - tlConOutput( console, - renderBufferString[curBuffer], - originString[lfbOrigin], - originString[sstOrigin], - renderBufferString[lfbBuffer], - renderBufferString[sstBuffer], - pixPipeString[pixPipe], - writeModeString[writeMode] ); - tlConOutput( "\nLock Failed....no output\n" ); - tlConRender(); - grBufferSwap( 1 ); - tlSleep( 1 ); - } - - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case '1': - lfbOrigin = !lfbOrigin; - break; - case '2': - sstOrigin = !sstOrigin; - break; - case '3': - lfbBuffer = !lfbBuffer; - break; - case '4': - sstBuffer = !sstBuffer; - break; - case '5': - pixPipe = !pixPipe; - break; - case '6': - writeMode++; - if ( writeMode > GR_LFBWRITEMODE_ZA16 ) - writeMode = GR_LFBWRITEMODE_565; - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} /* main */ - - - diff --git a/glide2x/cvg/glide/tests/test13.c b/glide2x/cvg/glide/tests/test13.c deleted file mode 100644 index 740c29c..0000000 --- a/glide2x/cvg/glide/tests/test13.c +++ /dev/null @@ -1,174 +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 -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test13"; -static const char purpose[] = "iterated alpha test - blue triangle fades towards one vertex\n"; -static const char usage[] = "-n -r -d "; - -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; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &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 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, 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, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - iterated alpha + constant color */ - 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 ); - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - - tlConOutput( "Press any key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00, 0, 0 ); - - vtxA.x = tlScaleX( 0.5f ), vtxA.y = tlScaleY( 0.1f ); - vtxB.x = tlScaleX( 0.8f ), vtxB.y = tlScaleY( 0.9f ); - vtxC.x = tlScaleX( 0.2f ), vtxC.y = tlScaleY( 0.9f ); - vtxA.a = vtxB.a = vtxC.a = 255.0f; - - grConstantColorValue( RED ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - grSstOrigin( GR_ORIGIN_LOWER_LEFT ); - - vtxA.a = 0.0f; - grConstantColorValue( BLUE ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - grSstOrigin( GR_ORIGIN_UPPER_LEFT ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - while( tlKbHit() ) { - switch( tlGetCH() ) { - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} diff --git a/glide2x/cvg/glide/tests/test14.c b/glide2x/cvg/glide/tests/test14.c deleted file mode 100644 index 42170ed..0000000 --- a/glide2x/cvg/glide/tests/test14.c +++ /dev/null @@ -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 -** -*/ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test14"; -static const char purpose[] = "depth bias test: vary depth bias \n" - "over time with two interpenetrating triangles"; -static const char usage[] = "-n -r "; - -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; - - short zBias; - short zDelta; - - /* 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_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - iterated alpha + z buffering */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grDepthBufferMode( GR_DEPTHBUFFER_ZBUFFER ); - grDepthBufferFunction( GR_CMP_GREATER ); - grDepthMask( FXTRUE ); - - zBias = 0; - zDelta = 10; - -#define RED 0x000000ff -#define GREEN 0x0000ff00 -#define BLUE 0x00ff0000 -#define GRAY 0x00808080 - -#define MAX_ZBIAS 500 -#define MIN_ZBIAS -500 - - tlConOutput( "Press any key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - float zDist; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - if ( ( zBias > MAX_ZBIAS ) || - ( zBias < MIN_ZBIAS ) ) { - zDelta = -zDelta; - } - zBias += zDelta; - - tlConOutput( "DepthBiasLevel: %+.03d \r", zBias ); - - grBufferClear( 0x00, 0, GR_ZDEPTHVALUE_FARTHEST ); - - vtxA.x = tlScaleX( 0.25f ), vtxA.y = tlScaleY( 0.21f ); - vtxB.x = tlScaleX( 0.75f ), vtxB.y = tlScaleY( 0.21f ); - vtxC.x = tlScaleX( 0.5f ), vtxC.y = tlScaleY( 0.79f ); - zDist = 10.0f; - vtxA.ooz = vtxB.ooz = vtxC.ooz = ( 65535.0f / zDist ); - - grConstantColorValue( GRAY ); - - grDepthBiasLevel( zBias ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - vtxA.x = tlScaleX( 0.86f ), vtxA.y = tlScaleY( 0.21f ); - vtxB.x = tlScaleX( 0.86f ), vtxB.y = tlScaleY( 0.79f ); - vtxC.x = tlScaleX( 0.14f ), vtxC.y = tlScaleY( 0.5f ); - zDist = 12.5f; - vtxA.ooz = vtxB.ooz = ( 65535.0f / zDist ); - zDist = 7.5f; - vtxC.ooz = ( 65535.0f / zDist ); - - grConstantColorValue( GREEN ); - - grDepthBiasLevel( 0 ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} diff --git a/glide2x/cvg/glide/tests/test15.c b/glide2x/cvg/glide/tests/test15.c deleted file mode 100644 index 95d820d..0000000 --- a/glide2x/cvg/glide/tests/test15.c +++ /dev/null @@ -1,217 +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 -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test15"; -static const char purpose[] = "clip rectangle testing - clip rectangle travels around screen"; -static const char usage[] = "-n -r "; - -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; - - float clipX, clipY, clipSize, clipSizeDelta, clipPosDelta; - - /* 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_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - iterated alpha + z buffering */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - - clipX = 0.2f; - clipY = 0.5f; - clipSize = 0.3f; - - clipSizeDelta = 0.005f; - clipPosDelta = 0.01f; - -#define CLIPSIZE_MIN 0.05f -#define CLIPSIZE_MAX 0.6f - -#define GRAY 0x00808080 -#define BLACK 0x00000000 - - tlConOutput( "+/- - grow/shrink clip rectangle\n" ); - tlConOutput( "a/d - clip window left/right \n" ); - tlConOutput( "w/s - clip window up/down \n" ); - tlConOutput( "Press any other key to quit\n" ); - while( frames-- && tlOkToRender()) { - int x, y; - GrVertex vtxA, vtxB, vtxC; - int minx, miny, maxx, maxy; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grClipWindow( (int)tlScaleX(0.0f),(int)tlScaleY(0.0f), - (int)tlScaleX(1.0f),(int)tlScaleY(1.0f) ); - grBufferClear( BLACK, 0, GR_ZDEPTHVALUE_FARTHEST ); - - /* Set Clipping Rectangle */ - minx = (int)tlScaleX(clipX); - miny = (int)tlScaleY(clipY); - if ( (clipX+clipSize)>1.0f ) - maxx = (int)tlScaleX( 1.0f ); - else - maxx = (int)tlScaleX( clipX + clipSize ); - if ( (clipY+clipSize)>1.0f ) - maxy = (int)tlScaleY( 1.0f ); - else - maxy = (int)tlScaleY( clipY + clipSize ); - grClipWindow( minx, miny, maxx, maxy ); - - /* Draw 10x10 grid of triangles */ - for( y = 0; y < 10; y++ ) { - for( x = 0; x < 10; x++ ) { - /* - A - |\ - B-C - */ - vtxA.x = vtxB.x = tlScaleX( ((float)x)/10.0f ); - vtxA.y = tlScaleY( ((float)y)/10.0f ); - vtxB.y = vtxC.y = tlScaleY( (((float)y)/10.0f) + 0.1f ); - vtxC.x = tlScaleX( (((float)x)/10.0f) + 0.1f ); - - grConstantColorValue( GRAY ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - } - } - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case '+': - if ( clipSize < CLIPSIZE_MAX ) - clipSize += clipSizeDelta; - break; - case '-': - if ( clipSize > CLIPSIZE_MIN ) - clipSize -= clipSizeDelta; - break; - case 'a': - case 'A': - if ( clipX > 0.0f ) - clipX -= clipPosDelta; - if ( clipX < 0.0f ) clipX = 0.0f; - break; - case 'd': - case 'D': - if ( clipX < 1.0f ) - clipX += clipPosDelta; - break; - case 'w': - case 'W': - if ( clipY > 0.0f ) - clipY -= clipPosDelta; - if ( clipY < 0.0f ) clipY = 0.0f; - break; - case 's': - case 'S': - if ( clipY < 1.0f ) - clipY += clipPosDelta; - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} diff --git a/glide2x/cvg/glide/tests/test16.c b/glide2x/cvg/glide/tests/test16.c deleted file mode 100644 index a696250..0000000 --- a/glide2x/cvg/glide/tests/test16.c +++ /dev/null @@ -1,201 +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 -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test16"; -static const char purpose[] = "test grShamelessPlug and grSplash"; -static const char usage[] = "-n -r -d "; - -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; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &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 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, 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, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - flat shading */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - -#define BLUE 0x00ff0000 -#define RED 0x000000ff -#define BLACK 0x00000000 - - tlConOutput( "p - toggle shameless plug on/off\n" ); - tlConOutput( "s - run the splash screen\n" ); - tlConOutput( "r - render splash continuously\n" ); - tlConOutput( "Press any other key to quit\n" ); - while( frames-- && tlOkToRender()) { - int x, y; - GrVertex vtxA, vtxB, vtxC, vtxD; - static int plug; - static int render; - static int frame = 1; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( BLACK, 0, GR_ZDEPTHVALUE_FARTHEST ); - - /* Draw 10x10 grid of triangles */ - for( y = 0; y < 10; y++ ) { - for( x = 0; x < 10; x++ ) { - /* - A-D - |\| - B-C - */ - vtxA.x = vtxB.x = tlScaleX( ((float)x)/10.0f ); - vtxA.y = vtxD.y = tlScaleY( ((float)y)/10.0f ); - vtxB.y = vtxC.y = tlScaleY( (((float)y)/10.0f) + 0.1f ); - vtxC.x = vtxD.x = tlScaleX( (((float)x)/10.0f) + 0.1f ); - - grConstantColorValue( RED ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - grConstantColorValue( BLUE ); - grDrawTriangle( &vtxA, &vtxC, &vtxD ); - } - } - - - if ( render ) { - grSplash( tlScaleX( 0.0f ), tlScaleY( 0.79f ), - tlScaleX( 0.2f ), tlScaleY( 0.2f ), - frame ); - frame++; - } - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case 'p': - case 'P': - plug = !plug; - grGlideShamelessPlug( plug ); - break; - case 's': - case 'S': - grSplash( 0.0f, 0.0f, scrWidth, scrHeight, 0 ); - break; - case 'r': - case 'R': - render = !render; - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} diff --git a/glide2x/cvg/glide/tests/test17.c b/glide2x/cvg/glide/tests/test17.c deleted file mode 100644 index d2e7a01..0000000 --- a/glide2x/cvg/glide/tests/test17.c +++ /dev/null @@ -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 -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test17"; -static const char purpose[] = "texturing example, decal, rgb lit, white lit, flat lit"; -static const char usage[] = "-n -r -d "; - -typedef enum { DECAL, FLATLIT, RGBLIT, WHITELIT, SPECALPHA } TextureMode; -const char *textureModeNames[] = { - "DECAL TEXTURE ", - "FLAT SHADING * TEXTURE ", - "ITERATED RGB * TEXTURE ", - "INTENSITY LIGHTING * TEXTURE ", - "(ITRGB * TEXTURE)+WHITE SPECULAR" -}; - -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; - FxBool scrgrab = FXFALSE; - char filename[256]; - FxU8 subframe = 0; - - TlTexture texture; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &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 'd': - scrgrab = FXTRUE; - frames = 5; - strcpy(filename, 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, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - Decal Texture - color combine set in render loop */ - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_NONE, - GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - - /* Load texture data into system ram */ - assert( tlLoadTexture( "miro.3df", - &texture.info, - &texture.tableType, - &texture.tableData ) ); - /* Download texture data to TMU */ - grTexDownloadMipMap( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - if ( texture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - texture.tableType, - &texture.tableData ); - } - - /* Select Texture As Source of all texturing operations */ - grTexSource( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - - /* Enable Bilinear Filtering + Mipmapping */ - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR ); - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_NEAREST, - FXFALSE ); - - tlConOutput( "m - change lighting mode\n" ); - tlConOutput( "Press any other key to quit\n\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC, vtxD; - static TextureMode textureMode; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0, 0, GR_ZDEPTHVALUE_FARTHEST ); - - tlConOutput( "Current Texture Mode: %s\r", - textureModeNames[textureMode] ); - - switch( textureMode ) { - case DECAL: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - break; - case FLATLIT: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_LOCAL, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - break; - case RGBLIT: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_LOCAL, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - break; - case WHITELIT: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_LOCAL_ALPHA, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - break; - case SPECALPHA: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA, - GR_COMBINE_FACTOR_LOCAL, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - break; - } - - /*---- - A-B - |\| - C-D - -----*/ - vtxA.oow = 1.0f; - vtxB = vtxC = vtxD = vtxA; - - vtxA.x = vtxC.x = tlScaleX( 0.2f ); - vtxB.x = vtxD.x = tlScaleX( 0.8f ); - vtxA.y = vtxB.y = tlScaleY( 0.2f ); - vtxC.y = vtxD.y = tlScaleY( 0.8f ); - - vtxA.tmuvtx[0].sow = vtxC.tmuvtx[0].sow = 0.0f; - vtxB.tmuvtx[0].sow = vtxD.tmuvtx[0].sow = 255.0f; - vtxA.tmuvtx[0].tow = vtxB.tmuvtx[0].tow = 0.0f; - vtxC.tmuvtx[0].tow = vtxD.tmuvtx[0].tow = 255.0f; - - vtxA.r = 255.0f, vtxA.g = 0.0f, vtxA.b = 0.0f, vtxA.a = 255.0f; - vtxB.r = 0.0f, vtxB.g = 255.0f, vtxB.b = 0.0f, vtxB.a = 128.0f; - vtxC.r = 0.0f, vtxC.g = 0.0f, vtxC.b = 255.0f, vtxC.a = 128.0f; - vtxD.r = 0.0f, vtxD.g = 0.0f, vtxD.b = 0.0f, vtxD.a = 0.0f; - - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - - grConstantColorValue( 0x00ff0000 ); - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - /* grab the frame buffer */ - if (scrgrab) { - char fname[256], tmp[32]; - FxU16 cnt; - - cnt = strcspn(filename, "."); - strncpy(fname, filename, cnt); - fname[cnt] = 0; - sprintf(tmp,"_%d", subframe); - strcat(fname, tmp); - strcat(fname, filename+cnt); - if (!tlScreenDump(fname, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - - /* cycle through all mode */ - textureMode++; - if ( textureMode > SPECALPHA ) textureMode = DECAL; - - subframe++; - } - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case 'm': - case 'M': - textureMode++; - if ( textureMode > SPECALPHA ) textureMode = DECAL; - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} diff --git a/glide2x/cvg/glide/tests/test18.c b/glide2x/cvg/glide/tests/test18.c deleted file mode 100644 index 20bdaa5..0000000 --- a/glide2x/cvg/glide/tests/test18.c +++ /dev/null @@ -1,258 +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 -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test18"; -static const char purpose[] = "alpha texture test"; -static const char usage[] = "-n -r -d "; - -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; - FxBool scrgrab = FXFALSE; - char filename[256]; - - TlTexture texture; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &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 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, 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, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - Decal Texture - alpha blend */ - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - - /* Load texture data into system ram */ - assert( tlLoadTexture( "alpha.3df", - &texture.info, - &texture.tableType, - &texture.tableData ) ); - /* Download texture data to TMU */ - grTexDownloadMipMap( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - if ( texture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - texture.tableType, - &texture.tableData ); - } - - /* Select Texture As Source of all texturing operations */ - grTexSource( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - - /* Enable Bilinear Filtering + Mipmapping */ - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR ); - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_NEAREST, - FXFALSE ); - - tlConOutput( "Press any key to quit\n\n" ); - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC, vtxD; - int x,y; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0, 0, GR_ZDEPTHVALUE_FARTHEST ); - - /* Draw 10x10 grid of triangles */ - - 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_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_ONE, - GR_BLEND_ZERO, - GR_BLEND_ZERO, - GR_BLEND_ZERO ); - for( y = 0; y < 10; y++ ) { - for( x = 0; x < 10; x++ ) { - /* - A-D - |\| - B-C - */ - vtxA.x = vtxB.x = tlScaleX( ((float)x)/10.0f ); - vtxA.y = vtxD.y = tlScaleY( ((float)y)/10.0f ); - vtxB.y = vtxC.y = tlScaleY( (((float)y)/10.0f) + 0.1f ); - vtxC.x = vtxD.x = tlScaleX( (((float)x)/10.0f) + 0.1f ); - - grConstantColorValue( RED ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - grConstantColorValue( BLUE ); - grDrawTriangle( &vtxA, &vtxC, &vtxD ); - } - } - - /*---- - A-B - |\| - C-D - -----*/ - vtxA.oow = 1.0f; - vtxB = vtxC = vtxD = vtxA; - - vtxA.x = vtxC.x = tlScaleX( 0.2f ); - vtxB.x = vtxD.x = tlScaleX( 0.8f ); - vtxA.y = vtxB.y = tlScaleY( 0.2f ); - vtxC.y = vtxD.y = tlScaleY( 0.8f ); - - vtxA.tmuvtx[0].sow = vtxC.tmuvtx[0].sow = 0.0f; - vtxB.tmuvtx[0].sow = vtxD.tmuvtx[0].sow = 255.0f; - vtxA.tmuvtx[0].tow = vtxB.tmuvtx[0].tow = 0.0f; - vtxC.tmuvtx[0].tow = vtxD.tmuvtx[0].tow = 255.0f; - - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grAlphaCombine( 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 ); - - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - while( tlKbHit() ) { - switch( tlGetCH() ) { - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} diff --git a/glide2x/cvg/glide/tests/test19.c b/glide2x/cvg/glide/tests/test19.c deleted file mode 100644 index 7867175..0000000 --- a/glide2x/cvg/glide/tests/test19.c +++ /dev/null @@ -1,369 +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 -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test19"; -static const char purpose[] = "texture filter modes test"; -static const char usage[] = "-n -r -d "; - -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; - -typedef struct { - GrTexInfo info; - GrTexTable_t tableType; - TextureTable tableData; -} Texture; - -#define NO_TABLE ((GrTexTable_t)(~0)) - -static int loadTexture( const char *filename, - GrTexInfo *info, - GrTexTable_t *tableType, - void *table ); -static GrTexTable_t texTableType( GrTextureFormat_t format ); - -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; - FxBool scrgrab = FXFALSE; - char filename[256]; - FxU8 subframe = 0; - - Texture texture; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &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 'd': - scrgrab = FXTRUE; - frames = 4; - strcpy(filename, 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, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - Decal Texture - DISABLE mipmapping */ - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_DISABLE, - FXFALSE ); - - /* Load texture data into system ram */ - assert( loadTexture( "miro.3df", - &texture.info, - &texture.tableType, - &texture.tableData ) ); - /* Download texture data to TMU */ - grTexDownloadMipMap( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - if ( texture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - texture.tableType, - &texture.tableData ); - } - - /* Select Texture As Source of all texturing operations */ - grTexSource( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - - - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - - - tlConOutput( "m - toggle magnify/minify texture\n" ); - tlConOutput( "f - toggle pointSample/Bilinear\n" ); - tlConOutput( "Press any other key to quit\n\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC, vtxD; - - static int minify; - static int bilerp; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0, 0, GR_ZDEPTHVALUE_FARTHEST ); - - /*---- - A-B - |\| - C-D - -----*/ - vtxA.oow = 1.0f; - vtxB = vtxC = vtxD = vtxA; - - if ( minify ) { - vtxA.x = vtxC.x = tlScaleX( 0.0f ); - vtxB.x = vtxD.x = tlScaleX( 1.0f ); - vtxA.y = vtxB.y = tlScaleY( 0.0f ); - vtxC.y = vtxD.y = tlScaleY( 1.0f ); - } else { /* magnify */ - vtxA.x = vtxC.x = tlScaleX( 0.45f ); - vtxB.x = vtxD.x = tlScaleX( 0.55f ); - vtxA.y = vtxB.y = tlScaleY( 0.45f ); - vtxC.y = vtxD.y = tlScaleY( 0.55f ); - } - - vtxA.tmuvtx[0].sow = vtxC.tmuvtx[0].sow = 0.0f; - vtxB.tmuvtx[0].sow = vtxD.tmuvtx[0].sow = 255.0f; - vtxA.tmuvtx[0].tow = vtxB.tmuvtx[0].tow = 0.0f; - vtxC.tmuvtx[0].tow = vtxD.tmuvtx[0].tow = 255.0f; - - if ( bilerp ) { - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR ); - tlConOutput( "GR_TEXTUREFILTER_BILINEAR \r" ); - } else { - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_POINT_SAMPLED, - GR_TEXTUREFILTER_POINT_SAMPLED ); - tlConOutput( "GR_TEXTUREFILTER_POINT_SAMPLED\r" ); - } - - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - /* grab the frame buffer */ - if (scrgrab) { - char fname[256], tmp[32]; - FxU16 cnt; - - cnt = strcspn(filename, "."); - strncpy(fname, filename, cnt); - fname[cnt] = 0; - sprintf(tmp,"_%d", subframe); - strcat(fname, tmp); - strcat(fname, filename+cnt); - if (!tlScreenDump(fname, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - - subframe++; - - /* cycle through all mode */ - switch (subframe) - { - case 0: - minify = 0; - bilerp = 0; - break; - case 1: - minify = 0; - bilerp = 1; - break; - case 2: - minify = 1; - bilerp = 0; - break; - case 3: - minify = 1; - bilerp = 1; - break; - } - } - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case 'm': - case 'M': - minify = !minify; - break; - case 'f': - case 'F': - bilerp = !bilerp; - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} - - -/*------------------------------------------------------ - Load Texture - - This example loads textures from a .3df file. 3DF files - containe pre-computed mipmaps data along with any - necessary supplementary information, for example - palettes, ncc-tables, level-of-detail description, - aspect ratio or format - - The gu3dfGetInfo and gu3dfLoad APIs load A 3DF file - into Gu3DfInfo structure from a file on disk. Data - can then be extracted from the gu3DfInfo structure - to initialize a GrTexInfo structure used in the - glide texturing routines. Also note that texture table - ( either NCC or Palette ) management is left up to the - application programmer. - ------------------------------------------------------*/ -static int loadTexture( const char *filename, - GrTexInfo *info, - GrTexTable_t *tableType, - void *table ) { - Gu3dfInfo tdfInfo; - int rv = 0; - - assert( filename ); - assert( info ); - assert( tableType ); - assert( table ); - if ( gu3dfGetInfo( filename, &tdfInfo ) ) { - tdfInfo.data = malloc( tdfInfo.mem_required ); - assert( tdfInfo.data ); - if ( gu3dfLoad( filename, &tdfInfo ) ) { - info->smallLod = tdfInfo.header.small_lod; - info->largeLod = tdfInfo.header.large_lod; - info->aspectRatio = tdfInfo.header.aspect_ratio; - info->format = tdfInfo.header.format; - info->data = tdfInfo.data; - *tableType = texTableType( info->format ); - switch( *tableType ) { - case GR_TEXTABLE_NCC0: - case GR_TEXTABLE_NCC1: - case GR_TEXTABLE_PALETTE: - memcpy( table, &(tdfInfo.table), sizeof( TextureTable ) ); - break; - default: - break; - } - rv = 1; - } - } - return rv; -} - -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; -} diff --git a/glide2x/cvg/glide/tests/test20.c b/glide2x/cvg/glide/tests/test20.c deleted file mode 100644 index f99640f..0000000 --- a/glide2x/cvg/glide/tests/test20.c +++ /dev/null @@ -1,320 +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 -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test20"; -static const char purpose[] = "mipmap modes"; -static const char usage[] = "-n -r "; - -typedef enum { DISABLE, NEAREST, TRILINEAR } MipMapMode; - - -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; - - TlTexture texture; - TlVertex3D srcVerts[4]; - float distance, dDelta; - - MipMapMode mipMapMode; - - /* 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 - Decal Texture - bilinear */ - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR ); - - /* Load texture data into system ram */ - assert( tlLoadTexture( "decal1.3df", - &texture.info, - &texture.tableType, - &texture.tableData ) ); - /* Download texture data to TMU */ - grTexDownloadMipMap( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - if ( texture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - texture.tableType, - &texture.tableData ); - } - - /* Select Texture As Source of all texturing operations */ - grTexSource( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - - /* Initialize Source 3D data - Rectangle on X/Z Plane - Centered about Y Axis - - 0--1 Z+ - | | | - 2--3 - X+ - - */ - srcVerts[0].x = -0.5f, srcVerts[0].y = 0.0f, srcVerts[0].z = 0.5f, srcVerts[0].w = 1.0f; - srcVerts[1].x = 0.5f, srcVerts[1].y = 0.0f, srcVerts[1].z = 0.5f, srcVerts[1].w = 1.0f; - srcVerts[2].x = -0.5f, srcVerts[2].y = 0.0f, srcVerts[2].z = -0.5f, srcVerts[2].w = 1.0f; - srcVerts[3].x = 0.5f, srcVerts[3].y = 0.0f, srcVerts[3].z = -0.5f, srcVerts[3].w = 1.0f; - - srcVerts[0].s = 0.0f, srcVerts[0].t = 0.0f; - srcVerts[1].s = 1.0f, srcVerts[1].t = 0.0f; - srcVerts[2].s = 0.0f, srcVerts[2].t = 1.0f; - srcVerts[3].s = 1.0f, srcVerts[3].t = 1.0f; - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - -#define MAX_DIST 2.5f -#define MIN_DIST 1.0f - - distance = 1.0f; - dDelta = 0.01f; - - mipMapMode = DISABLE; - - tlConOutput( "m - change mipmapping mode\n" ); - tlConOutput( "Press any other key to quit\n\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC, vtxD; - TlVertex3D xfVerts[4]; - TlVertex3D prjVerts[4]; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00404040, 0, GR_ZDEPTHVALUE_FARTHEST ); - - - switch( mipMapMode ) { - case DISABLE: - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_DISABLE, - FXFALSE ); - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - tlConOutput( "GR_MIPMAP_DISABLE \r" ); - break; - case NEAREST: - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_NEAREST, - FXFALSE ); - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - tlConOutput( "GR_MIPMAP_NEAREST \r" ); - break; - case TRILINEAR: - tlConOutput( "GR_MIPMAP_TRILINEAR\r" ); - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_NEAREST, - FXTRUE ); - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_BLEND_LOCAL, - GR_COMBINE_FACTOR_LOD_FRACTION, - GR_COMBINE_FUNCTION_BLEND_LOCAL, - GR_COMBINE_FACTOR_LOD_FRACTION, - FXFALSE, - FXFALSE ); - break; - } - - - /*---- - A-B - |\| - C-D - -----*/ - vtxA.oow = 1.0f; - vtxB = vtxC = vtxD = vtxA; - - distance += dDelta; - if ( distance > MAX_DIST || - distance < MIN_DIST ) { - dDelta *= -1.0f; - distance += dDelta; - } - - tlSetMatrix( tlIdentity() ); - tlMultMatrix( tlXRotation( -20.0f ) ); - tlMultMatrix( tlTranslation( 0.0f, -0.3f, distance ) ); - - tlTransformVertices( xfVerts, srcVerts, 4 ); - tlProjectVertices( prjVerts, xfVerts, 4 ); - - vtxA.x = tlScaleX( prjVerts[0].x ); - vtxA.y = tlScaleY( prjVerts[0].y ); - vtxA.oow = 1.0f / prjVerts[0].w; - - vtxB.x = tlScaleX( prjVerts[1].x ); - vtxB.y = tlScaleY( prjVerts[1].y ); - vtxB.oow = 1.0f / prjVerts[1].w; - - vtxC.x = tlScaleX( prjVerts[2].x ); - vtxC.y = tlScaleY( prjVerts[2].y ); - vtxC.oow = 1.0f / prjVerts[2].w; - - vtxD.x = tlScaleX( prjVerts[3].x ); - vtxD.y = tlScaleY( prjVerts[3].y ); - vtxD.oow = 1.0f / prjVerts[3].w; - - vtxA.tmuvtx[0].sow = prjVerts[0].s * 255.0f * vtxA.oow; - vtxA.tmuvtx[0].tow = prjVerts[0].t * 255.0f * vtxA.oow; - - vtxB.tmuvtx[0].sow = prjVerts[1].s * 255.0f * vtxB.oow; - vtxB.tmuvtx[0].tow = prjVerts[1].t * 255.0f * vtxB.oow; - - vtxC.tmuvtx[0].sow = prjVerts[2].s * 255.0f * vtxC.oow; - vtxC.tmuvtx[0].tow = prjVerts[2].t * 255.0f * vtxC.oow; - - vtxD.tmuvtx[0].sow = prjVerts[3].s * 255.0f * vtxD.oow; - vtxD.tmuvtx[0].tow = prjVerts[3].t * 255.0f * vtxD.oow; - - - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - - if ( mipMapMode == TRILINEAR ) { - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ONE, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_BLEND_LOCAL, - GR_COMBINE_FACTOR_ONE_MINUS_LOD_FRACTION, - GR_COMBINE_FUNCTION_BLEND_LOCAL, - GR_COMBINE_FACTOR_ONE_MINUS_LOD_FRACTION, - FXFALSE, - FXFALSE ); - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ZERO, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - } - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case 'm': - case 'M': - mipMapMode++; - mipMapMode%=3; - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} - - - diff --git a/glide2x/cvg/glide/tests/test21.c b/glide2x/cvg/glide/tests/test21.c deleted file mode 100644 index 1fc7ad3..0000000 --- a/glide2x/cvg/glide/tests/test21.c +++ /dev/null @@ -1,374 +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 -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test21"; -static const char purpose[] = "texture compositing"; -static const char usage[] = "-n -r "; - -typedef enum { LIGHTMAP, SPECULAR, DETAIL } Mode; - -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; - - TlTexture baseTexture; - unsigned long baseTextureAddr; - TlTexture lightTexture; - unsigned long lightTextureAddr; - TlTexture detailTexture; - unsigned long detailTextureAddr; - - TlVertex3D srcVerts[4]; - float distance, dDelta; - - Mode mode; - - /* 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 - decal - bilinear - nearest mipmapping */ - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_NEAREST, - FXFALSE ); - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR ); - - /* Load texture data into system ram */ - assert( tlLoadTexture( "decal1.3df", - &baseTexture.info, - &baseTexture.tableType, - &baseTexture.tableData ) ); - assert( tlLoadTexture( "light.3df", - &lightTexture.info, - &lightTexture.tableType, - &lightTexture.tableData ) ); - assert( tlLoadTexture( "lava.3df", - &detailTexture.info, - &detailTexture.tableType, - &detailTexture.tableData ) ); - - /* Download texture data to TMU */ - baseTextureAddr = grTexMinAddress( GR_TMU0 ); - grTexDownloadMipMap( GR_TMU0, - baseTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &baseTexture.info ); - if ( baseTexture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - baseTexture.tableType, - &baseTexture.tableData ); - } - - lightTextureAddr = - baseTextureAddr + - grTexTextureMemRequired( GR_MIPMAPLEVELMASK_BOTH, - &baseTexture.info ); - grTexDownloadMipMap( GR_TMU0, - lightTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &lightTexture.info ); - if ( lightTexture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - lightTexture.tableType, - &lightTexture.tableData ); - } - - detailTextureAddr = - lightTextureAddr + - grTexTextureMemRequired( GR_MIPMAPLEVELMASK_BOTH, - &lightTexture.info ); - grTexDownloadMipMap( GR_TMU0, - detailTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &detailTexture.info ); - if ( detailTexture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - detailTexture.tableType, - &detailTexture.tableData ); - } - - /* Initialize Source 3D data - Rectangle on X/Z Plane - Centered about Y Axis - - 0--1 Z+ - | | | - 2--3 - X+ - - */ - srcVerts[0].x = -0.5f, srcVerts[0].y = 0.0f, srcVerts[0].z = 0.5f, srcVerts[0].w = 1.0f; - srcVerts[1].x = 0.5f, srcVerts[1].y = 0.0f, srcVerts[1].z = 0.5f, srcVerts[1].w = 1.0f; - srcVerts[2].x = -0.5f, srcVerts[2].y = 0.0f, srcVerts[2].z = -0.5f, srcVerts[2].w = 1.0f; - srcVerts[3].x = 0.5f, srcVerts[3].y = 0.0f, srcVerts[3].z = -0.5f, srcVerts[3].w = 1.0f; - - srcVerts[0].s = 0.0f, srcVerts[0].t = 0.0f; - srcVerts[1].s = 1.0f, srcVerts[1].t = 0.0f; - srcVerts[2].s = 0.0f, srcVerts[2].t = 1.0f; - srcVerts[3].s = 1.0f, srcVerts[3].t = 1.0f; - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - -#define MAX_DIST 2.5f -#define MIN_DIST 1.0f - - distance = 1.0f; - dDelta = 0.01f; - - mode = LIGHTMAP; - - tlConOutput( "m - change texture compositing mode\n" ); - tlConOutput( "Press any other key to quit\n\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC, vtxD; - TlVertex3D xfVerts[4]; - TlVertex3D prjVerts[4]; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00404040, 0, GR_ZDEPTHVALUE_FARTHEST ); - - - /* 3D Transformations */ - /*---- - A-B - |\| - C-D - -----*/ - vtxA.oow = 1.0f; - vtxB = vtxC = vtxD = vtxA; - - distance += dDelta; - if ( distance > MAX_DIST || - distance < MIN_DIST ) { - dDelta *= -1.0f; - distance += dDelta; - } - - tlSetMatrix( tlIdentity() ); - tlMultMatrix( tlXRotation( -20.0f ) ); - tlMultMatrix( tlTranslation( 0.0f, -0.3f, distance ) ); - - tlTransformVertices( xfVerts, srcVerts, 4 ); - tlProjectVertices( prjVerts, xfVerts, 4 ); - - vtxA.x = tlScaleX( prjVerts[0].x ); - vtxA.y = tlScaleY( prjVerts[0].y ); - vtxA.oow = 1.0f / prjVerts[0].w; - - vtxB.x = tlScaleX( prjVerts[1].x ); - vtxB.y = tlScaleY( prjVerts[1].y ); - vtxB.oow = 1.0f / prjVerts[1].w; - - vtxC.x = tlScaleX( prjVerts[2].x ); - vtxC.y = tlScaleY( prjVerts[2].y ); - vtxC.oow = 1.0f / prjVerts[2].w; - - vtxD.x = tlScaleX( prjVerts[3].x ); - vtxD.y = tlScaleY( prjVerts[3].y ); - vtxD.oow = 1.0f / prjVerts[3].w; - - vtxA.tmuvtx[0].sow = prjVerts[0].s * 255.0f * vtxA.oow; - vtxA.tmuvtx[0].tow = prjVerts[0].t * 255.0f * vtxA.oow; - - vtxB.tmuvtx[0].sow = prjVerts[1].s * 255.0f * vtxB.oow; - vtxB.tmuvtx[0].tow = prjVerts[1].t * 255.0f * vtxB.oow; - - vtxC.tmuvtx[0].sow = prjVerts[2].s * 255.0f * vtxC.oow; - vtxC.tmuvtx[0].tow = prjVerts[2].t * 255.0f * vtxC.oow; - - vtxD.tmuvtx[0].sow = prjVerts[3].s * 255.0f * vtxD.oow; - vtxD.tmuvtx[0].tow = prjVerts[3].t * 255.0f * vtxD.oow; - - /* Render First Pass */ - switch( mode ) { - case LIGHTMAP: - case SPECULAR: - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, - FXFALSE ); - break; - case DETAIL: - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_BLEND_LOCAL, - GR_COMBINE_FACTOR_DETAIL_FACTOR, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, - FXFALSE ); - grTexDetailControl( GR_TMU0, 2, 7, 1.0f ); - break; - } - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ZERO, - GR_BLEND_ONE, GR_BLEND_ZERO ); - grTexSource( GR_TMU0, - baseTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &baseTexture.info ); - - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - - /* Render Second Pass */ - switch( mode ) { - case LIGHTMAP: - grAlphaBlendFunction( GR_BLEND_DST_COLOR, GR_BLEND_ZERO, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - grTexSource( GR_TMU0, - lightTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &lightTexture.info ); - tlConOutput( "LIGHTMAP - TEXTURE MODULATE \r" ); - break; - case DETAIL: - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_BLEND_LOCAL, - GR_COMBINE_FACTOR_ONE_MINUS_DETAIL_FACTOR, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ONE, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - grTexSource( GR_TMU0, - detailTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &detailTexture.info ); - tlConOutput( "DETAIL - BLEND ON LOD \r" ); - break; - case SPECULAR: - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ONE, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - grTexSource( GR_TMU0, - lightTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &lightTexture.info ); - tlConOutput( "SPECULAR - TEXTURE ACCUMULATE\r" ); - break; - } - - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case 'm': - case 'M': - mode++; - mode%=3; - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} - - - diff --git a/glide2x/cvg/glide/tests/test22.c b/glide2x/cvg/glide/tests/test22.c deleted file mode 100644 index 042cf3d..0000000 --- a/glide2x/cvg/glide/tests/test22.c +++ /dev/null @@ -1,306 +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 -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test22"; -static const char purpose[] = "fog with multi-pass texturing"; -static const char usage[] = "-n -r "; - -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; - - TlTexture baseTexture; - unsigned long baseTextureAddr; - TlTexture lightTexture; - unsigned long lightTextureAddr; - - GrFog_t fogtable[GR_FOG_TABLE_SIZE]; - - TlVertex3D srcVerts[4]; - float distance, dDelta; - - /* 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 - decal - bilinear - nearest mipmapping - fogging */ - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_NEAREST, - FXFALSE ); - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR ); - grFogColorValue( 0x404040 ); - guFogGenerateExp( fogtable, .2f ); - grFogTable( fogtable ); - - /* Load texture data into system ram */ - assert( tlLoadTexture( "decal1.3df", - &baseTexture.info, - &baseTexture.tableType, - &baseTexture.tableData ) ); - assert( tlLoadTexture( "light.3df", - &lightTexture.info, - &lightTexture.tableType, - &lightTexture.tableData ) ); - - /* Download texture data to TMU */ - baseTextureAddr = grTexMinAddress( GR_TMU0 ); - grTexDownloadMipMap( GR_TMU0, - baseTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &baseTexture.info ); - if ( baseTexture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - baseTexture.tableType, - &baseTexture.tableData ); - } - - lightTextureAddr = - baseTextureAddr + - grTexTextureMemRequired( GR_MIPMAPLEVELMASK_BOTH, - &baseTexture.info ); - grTexDownloadMipMap( GR_TMU0, - lightTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &lightTexture.info ); - if ( lightTexture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - lightTexture.tableType, - &lightTexture.tableData ); - } - - /* Initialize Source 3D data - Rectangle on X/Z Plane - Centered about Y Axis - - 0--1 Z+ - | | | - 2--3 - X+ - - */ - srcVerts[0].x = -0.5f, srcVerts[0].y = 0.0f, srcVerts[0].z = 0.5f, srcVerts[0].w = 1.0f; - srcVerts[1].x = 0.5f, srcVerts[1].y = 0.0f, srcVerts[1].z = 0.5f, srcVerts[1].w = 1.0f; - srcVerts[2].x = -0.5f, srcVerts[2].y = 0.0f, srcVerts[2].z = -0.5f, srcVerts[2].w = 1.0f; - srcVerts[3].x = 0.5f, srcVerts[3].y = 0.0f, srcVerts[3].z = -0.5f, srcVerts[3].w = 1.0f; - - srcVerts[0].s = 0.0f, srcVerts[0].t = 0.0f; - srcVerts[1].s = 1.0f, srcVerts[1].t = 0.0f; - srcVerts[2].s = 0.0f, srcVerts[2].t = 1.0f; - srcVerts[3].s = 1.0f, srcVerts[3].t = 1.0f; - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - -#define MAX_DIST 10.0f -#define MIN_DIST 1.0f - - distance = 1.0f; - dDelta = 0.05f; - - tlConOutput( "Press any key to quit\n\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC, vtxD; - TlVertex3D xfVerts[4]; - TlVertex3D prjVerts[4]; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00404040, 0, GR_ZDEPTHVALUE_FARTHEST ); - - - /* 3D Transformations */ - /*---- - A-B - |\| - C-D - -----*/ - vtxA.oow = 1.0f; - vtxB = vtxC = vtxD = vtxA; - - distance += dDelta; - if ( distance > MAX_DIST || - distance < MIN_DIST ) { - dDelta *= -1.0f; - distance += dDelta; - } - - tlSetMatrix( tlIdentity() ); - tlMultMatrix( tlXRotation( -90.0f ) ); - tlMultMatrix( tlTranslation( 0.0f, 0.0f, distance ) ); - - tlTransformVertices( xfVerts, srcVerts, 4 ); - tlProjectVertices( prjVerts, xfVerts, 4 ); - - vtxA.x = tlScaleX( prjVerts[0].x ); - vtxA.y = tlScaleY( prjVerts[0].y ); - vtxA.oow = 1.0f / prjVerts[0].w; - - vtxB.x = tlScaleX( prjVerts[1].x ); - vtxB.y = tlScaleY( prjVerts[1].y ); - vtxB.oow = 1.0f / prjVerts[1].w; - - vtxC.x = tlScaleX( prjVerts[2].x ); - vtxC.y = tlScaleY( prjVerts[2].y ); - vtxC.oow = 1.0f / prjVerts[2].w; - - vtxD.x = tlScaleX( prjVerts[3].x ); - vtxD.y = tlScaleY( prjVerts[3].y ); - vtxD.oow = 1.0f / prjVerts[3].w; - - vtxA.tmuvtx[0].sow = prjVerts[0].s * 255.0f * vtxA.oow; - vtxA.tmuvtx[0].tow = prjVerts[0].t * 255.0f * vtxA.oow; - - vtxB.tmuvtx[0].sow = prjVerts[1].s * 255.0f * vtxB.oow; - vtxB.tmuvtx[0].tow = prjVerts[1].t * 255.0f * vtxB.oow; - - vtxC.tmuvtx[0].sow = prjVerts[2].s * 255.0f * vtxC.oow; - vtxC.tmuvtx[0].tow = prjVerts[2].t * 255.0f * vtxC.oow; - - vtxD.tmuvtx[0].sow = prjVerts[3].s * 255.0f * vtxD.oow; - vtxD.tmuvtx[0].tow = prjVerts[3].t * 255.0f * vtxD.oow; - - /* Render First Pass */ - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ZERO, - GR_BLEND_ONE, GR_BLEND_ZERO ); - grTexSource( GR_TMU0, - baseTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &baseTexture.info ); - - grFogMode( GR_FOG_ADD2 | GR_FOG_WITH_TABLE ); - - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - - /* Render Second Pass */ - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_PREFOG_COLOR, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - grTexSource( GR_TMU0, - lightTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &lightTexture.info ); - - grFogMode( GR_FOG_MULT2 | GR_FOG_WITH_TABLE ); - - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} - - - diff --git a/glide2x/cvg/glide/tests/test23.c b/glide2x/cvg/glide/tests/test23.c deleted file mode 100644 index ff48f4d..0000000 --- a/glide2x/cvg/glide/tests/test23.c +++ /dev/null @@ -1,260 +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 -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test23"; -static const char purpose[] = "anti-aliased points test"; -static const char usage[] = "-n -r "; - -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; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - - Mode mode; - int speed; - - int i; - 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 ); - grFogMode( GR_FOG_WITH_TABLE ); - grFogColorValue( 0x0 ); - guFogGenerateExp( fogtable, .8f ); - grFogTable( fogtable ); - 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; - speed = 0; - - tlConOutput( "a - toggles anti-aliasing\n" ); - tlConOutput( "s - toggles speed of rotation\n" ); - tlConOutput( "Press any key to quit\n\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA; - static TlVertex3D xfVerts[100]; - static TlVertex3D prjVerts[100]; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x0, 0, GR_ZDEPTHVALUE_FARTHEST ); - - /* 3D Transformations */ - if ( speed ) { - angle += 1.0f; - } else { - angle += 0.05f; - } - if ( angle >= 360.0f ) angle -= 360.0f; - - tlSetMatrix( tlIdentity() ); - tlMultMatrix( tlYRotation( angle ) ); - tlMultMatrix( tlTranslation( 0.0f, 0.0f, 1.5f ) ); - - tlTransformVertices( xfVerts, srcVerts, 100 ); - tlProjectVertices( prjVerts, xfVerts, 100 ); - - grConstantColorValue( 0xffffffff ); - - switch( mode ) { - case NORMAL: - tlConOutput( "NORMAL POINTS \r" ); - break; - case ANTIALIASED: - tlConOutput( "ANTIALIASED POINTS \r" ); - break; - } - - for( i = 0; i < 100; i++ ) { - vtxA.x = tlScaleX( prjVerts[i].x ); - vtxA.y = tlScaleY( prjVerts[i].y ); - vtxA.oow = 1.0f / prjVerts[i].w; - vtxA.a = 255.0f; - switch( mode ) { - case NORMAL: - grDrawPoint( &vtxA ); - break; - case ANTIALIASED: - grAADrawPoint( &vtxA ); - break; - } - } - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case 'a': - case 'A': - mode++; - mode%=2; - break; - case 's': - case 'S': - speed = !speed; - 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); -} - - - - diff --git a/glide2x/cvg/glide/tests/test24.c b/glide2x/cvg/glide/tests/test24.c deleted file mode 100644 index 1d6b088..0000000 --- a/glide2x/cvg/glide/tests/test24.c +++ /dev/null @@ -1,255 +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 -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#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 -r "; - -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; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - - Mode mode; - - int i; - 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 ); - grFogMode( GR_FOG_WITH_TABLE ); - grFogColorValue( 0x0 ); - guFogGenerateExp( fogtable, .9f ); - grFogTable( fogtable ); - 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 ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - 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)) - - 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; - } - } - - tlConRender(); - 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); -} - - - - diff --git a/glide2x/cvg/glide/tests/test25.c b/glide2x/cvg/glide/tests/test25.c deleted file mode 100644 index 7864a0f..0000000 --- a/glide2x/cvg/glide/tests/test25.c +++ /dev/null @@ -1,898 +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 -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -#define SNAP_COORD(v) ( ( v ) = (( float )( ( long )( ( v ) * 16 ) )) / 16.0f ) - -#define WREFWIDTH 640.f -#define WREFHEIGHT 480.f - -#define WINSCALEX(x) ((x/WREFWIDTH) * wWidth) -#define WINSCALEY(y) ((y/WREFHEIGHT) * wHeight) - -#ifndef M_PI -#define M_PI 3.14159265358979323846f -#endif -#define DEG2RAD( x ) ( (x) * M_PI / 180.0f ) - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test25"; -static const char purpose[] = "anti-aliased triangle test"; -static const char usage[] = "-n -r -b -t -aalphavalue"; - - -static void doHelp( void ) { - grBufferClear( 0, 0, 0 ); - tlConOutput("Keymap:\n"); - tlConOutput(" A or a: toggle Antialiasing\n"); - tlConOutput(" C or c: toggle Compositing\n"); - tlConOutput(" B or b: toggle Bilinear\n"); - tlConOutput(" F or f: toggle Front buffer \n"); - tlConOutput(" H, h, or ?: Help\n"); - tlConOutput(" I or i: toggle background Image\n"); - tlConOutput(" L or l: Draw lines\n"); - tlConOutput(" N or n: print performance Numbers\n"); - tlConOutput(" P or p: Pause rendering\n"); - tlConOutput(" R or r: Print screen Resolution\n"); - tlConOutput(" Q or q or esc: Quit\n"); - tlConOutput(" S or s: toggle hidden Surface removal (backface culling)\n"); - tlConOutput(" T or t: toggle Texturing\n"); - tlConOutput(" U or u: toggle shameless Plug\n"); - tlConOutput(" V or v: toggle VGA/Voodoo\n"); - tlConOutput("Press a key to continue...\n"); - tlConRender(); - grBufferSwap( 1 ); - tlGetCH(); - tlConClear(); -} - -typedef float Matrix[4][4]; -typedef float Point[3]; - -void MatMakeXRot( Matrix m, float radians ) -{ - float c = (float)cos( radians ); - float s = (float)sin( radians ); - - m[0][0] = 1.0f; m[0][1] = 0.0f; m[0][2] = 0.0f; m[0][3] = 0.0f; - m[1][0] = 0.0f; m[1][1] = c; m[1][2] = s; m[1][3] = 0.0f; - m[2][0] = 0.0f; m[2][1] = -s; m[2][2] = c; m[2][3] = 0.0f; - m[3][0] = 0.0f; m[3][1] = 0.0f; m[3][2] = 0.0f; m[3][3] = 1.0f; -} - -void MatMakeYRot( Matrix m, float radians ) -{ - float c = (float)cos( radians ); - float s = (float)sin( radians ); - - m[0][0] = c; m[0][1] = 0.0f; m[0][2] = -s; m[0][3] = 0.0f; - m[1][0] = 0.0f; m[1][1] = 1.0f; m[1][2] = 0.0f; m[1][3] = 0.0f; - m[2][0] = s; m[2][1] = 0.0f; m[2][2] = c; m[2][3] = 0.0f; - m[3][0] = 0.0f; m[3][1] = 0.0f; m[3][2] = 0.0f; m[3][3] = 1.0f; -} - -void MatMakeZRot( Matrix m, float radians ) -{ - float c = (float)cos( radians ); - float s = (float)sin( radians ); - - m[0][0] = c; m[0][1] = s; m[0][2] = 0.0f; m[0][3] = 0.0f; - m[1][0] = -s; m[1][1] = c; m[1][2] = 0.0f; m[1][3] = 0.0f; - m[2][0] = 0.0f; m[2][1] = 0.0f; m[2][2] = 1.0f; m[2][3] = 0.0f; - m[3][0] = 0.0f; m[3][1] = 0.0f; m[3][2] = 0.0f; m[3][3] = 1.0f; -} - -void MatMakeIdent( Matrix m ) -{ - int i, j; - - for( i = 0; i < 4; i++ ) - { - for( j = 0; j < 4; j++ ) - { - if( i == j ) - m[i][j] = 1.0f; - else - m[i][j] = 0.0f; - } - } -} - -void PointMatMult( GrVertex *result, GrVertex *v, Matrix m ) -{ - float w; - GrVertex ptmp; - - ptmp = *v; - ptmp.x = ( v->x * m[0][0] ) + ( v->y * m[1][0] ) + - ( v->z * m[2][0] ) + m[3][0]; - ptmp.y = ( v->x * m[0][1] ) + ( v->y * m[1][1] ) + - ( v->z * m[2][1] ) + m[3][1]; - ptmp.z = ( v->x * m[0][2] ) + ( v->y * m[1][2] ) + - ( v->z * m[2][2] ) + m[3][2]; - w = ( v->x * m[0][3] ) + ( v->y * m[1][3] ) + - ( v->z * m[2][3] ) + m[3][3]; - if( w != 0.0f ) { ptmp.x /= w; ptmp.y /= w; ptmp.z /= w; } - *result = ptmp; -} - -static int screenFulls[] = { - 320*200, - 320*240, - 400*256, - 512*384, - 640*200, - 640*350, - 640*400, - 640*480, - 800*600, - 960*720, - 856*480 -}; - -#define NTRIS 1 -#define NFRAMES 20 -#define NVERTS 3 - -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; - - float - minColor = 10.f, /* Vertex min color */ - maxColor = 245.f; /* Vertex max color */ - - GrVertex - localVerts[3], /* Vertices in world coordinates */ - texVerts[4]; /* Texture vertices for background */ - - float - alpha = 192.0f, /* Alpha for blending tringle over background */ - y_angle = 0.0f; /* rotation amount */ - - int - firstTime = 0; /* Used for performance calculations */ - - GrPassthruMode_t - passthruMode = GR_PASSTHRU_SHOW_SST1; /* For toggling passthru */ - - FxBool - plugging = FXFALSE, /* Show shameless plug */ - printPerf = FXFALSE, /* Print performance numbers */ - lines = FXFALSE, /* Draw lines instead of triangles */ - blend = FXFALSE, /* Blend the triangle over the background */ - texturing = FXFALSE, /* Texture the tiangle */ - antialias = FXTRUE, /* Antialias the triangle? */ - bilinear = FXTRUE, /* Perform bilinear filtering on the texture? */ - render = FXTRUE, /* Draw? */ - backbuffer = FXTRUE, /* Draw to backbuffer? */ - background = FXTRUE; /* Draw background? */ - - GrOriginLocation_t - origin = GR_ORIGIN_LOWER_LEFT; /* Origin */ - - FxU32 - swapDelay = 1, /* Arg to grBufferSwap */ - trisDrawn, /* # triangles drawn */ - trisProcessed, /* # triangles through pipeline */ - lastFrame = 0, /* Number of last frame we did perf stats */ - frameNum = 0L; /* id of each frame drawn */ - - GrCullMode_t - cullMode = GR_CULL_DISABLE; /* backface culling */ - - - GrMipMapId_t - triDecal, /* Triangle decal texture */ - bgDecal; /* Background decal texture */ - - Gu3dfInfo - bgInfo, /* Info on background texture */ - triInfo; /* Info on triangle texture */ - - GrColorCombineFnc_t - ccFnc = GR_COLORCOMBINE_ITRGB; /* Start of w/ Gouraud shading */ - - char - *bgFileName = NULL, /* Name of background texture file */ - *triFileName = NULL; /* Name of triangle texture file */ - - int - frameCount = 0; - - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrbtea", &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 'b': - bgFileName = strdup( remArgs[0] ); - break; - case 't': - triFileName = strdup( remArgs[0] ); - break; - case 'a': - alpha = (float)atof( 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, - origin, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 80, 40, 0xffffff ); - - if(frames == -1) { - doHelp(); - } - - localVerts[0].x = 0.f; - localVerts[0].y = 0.75f; - localVerts[0].z = 0.0f; - localVerts[0].tmuvtx[0].sow = 255.f; - localVerts[0].tmuvtx[0].tow = 255.f; - localVerts[0].oow = 1.f; - localVerts[0].r = maxColor; - localVerts[0].g = minColor; - localVerts[0].b = minColor; - localVerts[0].a = 255.f; - - localVerts[1].x = -0.75f; - localVerts[1].y = -0.75f; - localVerts[1].z = 0.0f; - localVerts[1].tmuvtx[0].sow = 0.f; - localVerts[1].tmuvtx[0].tow = 255.f; - localVerts[1].oow = 1.f; - localVerts[1].r = minColor; - localVerts[1].g = maxColor; - localVerts[1].b = minColor; - localVerts[1].a = 255.f; - - localVerts[2].x = 0.75f; - localVerts[2].y = -0.75f; - localVerts[2].z = 0.0f; - localVerts[2].tmuvtx[0].sow = 255.f; - localVerts[2].tmuvtx[0].tow = 0.f; - localVerts[2].oow = 1.f; - localVerts[2].r = minColor; - localVerts[2].g = minColor; - localVerts[2].b = maxColor; - localVerts[2].a = 255.f; - - texVerts[0].x = 0.f; - texVerts[0].y = 0.f; - texVerts[0].a = 255.f; - texVerts[0].oow = 1.f; - texVerts[0].tmuvtx[0].sow = 0.f * texVerts[0].oow; - texVerts[0].tmuvtx[0].tow = 255.f * texVerts[0].oow; - - texVerts[1].x = scrWidth; - texVerts[1].y = 0.f; - texVerts[1].a = 255.f; - texVerts[1].oow = 1.f; - texVerts[1].tmuvtx[0].sow = 255.f * texVerts[1].oow; - texVerts[1].tmuvtx[0].tow = 255.f * texVerts[1].oow; - - texVerts[2].x = scrWidth; - texVerts[2].y = scrHeight; - texVerts[2].a = 255.f; - texVerts[2].oow = 1.f; - texVerts[2].tmuvtx[0].sow = 255.f * texVerts[2].oow; - texVerts[2].tmuvtx[0].tow = 0.f * texVerts[2].oow; - - texVerts[3].x = 0.f; - texVerts[3].y = scrHeight; - texVerts[3].a = 255.f; - texVerts[3].oow = 1.f; - texVerts[3].tmuvtx[0].sow = 0.f * texVerts[3].oow; - texVerts[3].tmuvtx[0].tow = 0.f * texVerts[3].oow; - - if (bgFileName == NULL) - bgFileName = "miro.3df"; - if (triFileName == NULL) - triFileName = "matt1.3df"; - - /* Read in background texture file */ - if ( gu3dfGetInfo( bgFileName, &bgInfo ) ) { - bgInfo.data = malloc( bgInfo.mem_required ); - - if ( bgInfo.data == 0 ) { - fprintf( stderr, "out of memory for texture file %s\n", bgFileName ); - grGlideShutdown(); - exit( -1 ); - } - - if ( !gu3dfLoad( bgFileName, &bgInfo ) ) { - fprintf( stderr, "could not load texture file %s\n", bgFileName ); - grGlideShutdown(); - exit( -1 ); - } - - bgDecal = guTexAllocateMemory( 0, GR_MIPMAPLEVELMASK_BOTH, - bgInfo.header.width, bgInfo.header.height, - bgInfo.header.format, - GR_MIPMAP_NEAREST, - bgInfo.header.small_lod, bgInfo.header.large_lod, - bgInfo.header.aspect_ratio, - GR_TEXTURECLAMP_WRAP, GR_TEXTURECLAMP_WRAP, - GR_TEXTUREFILTER_BILINEAR, GR_TEXTUREFILTER_BILINEAR, - 0.0F, - FXFALSE ); - if ( bgDecal == GR_NULL_MIPMAP_HANDLE ) { - fprintf( stderr, "could not allocate memory for texture file %s\n", bgFileName ); - grGlideShutdown(); - exit( -1 ); - } - guTexDownloadMipMap( bgDecal, bgInfo.data, &bgInfo.table.nccTable ); - free( bgInfo.data ); - } else { - fprintf( stderr, "could not get info on %s\n", bgFileName ); - grGlideShutdown(); - exit( -1 ); - } - - if ( gu3dfGetInfo( triFileName, &triInfo ) ) { - triInfo.data = malloc( triInfo.mem_required ); - - if ( triInfo.data == 0 ) { - fprintf( stderr, "out of memory for texture file %s\n", triFileName ); - grGlideShutdown(); - exit( -1 ); - } - - if ( !gu3dfLoad( triFileName, &triInfo ) ) { - fprintf( stderr, "could not load texture file %s\n", triFileName ); - grGlideShutdown(); - exit( -1 ); - } - - triDecal = guTexAllocateMemory( 0, GR_MIPMAPLEVELMASK_BOTH, - triInfo.header.width, - triInfo.header.height, - triInfo.header.format, - GR_MIPMAP_NEAREST, - triInfo.header.small_lod, - triInfo.header.large_lod, - triInfo.header.aspect_ratio, - GR_TEXTURECLAMP_WRAP, - GR_TEXTURECLAMP_WRAP, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR, - 0.0F, - FXFALSE ); - if ( triDecal == GR_NULL_MIPMAP_HANDLE ) { - fprintf( stderr, "could not allocate memory for %s\n", triFileName ); - grGlideShutdown(); - exit( -1 ); - } - guTexDownloadMipMap( triDecal, triInfo.data, &triInfo.table.nccTable ); - free( triInfo.data ); - } else { - fprintf( stderr, "could not get info on %s\n", triFileName ); - grGlideShutdown(); - exit( -1 ); - } - - grTexCombineFunction(GR_TMU0, GR_TEXTURECOMBINE_DECAL); - grRenderBuffer(backbuffer == FXTRUE ? GR_BUFFER_BACKBUFFER : GR_BUFFER_FRONTBUFFER); - - /* Set up alpha blending for AA and compositing... */ - guAlphaSource( GR_ALPHASOURCE_ITERATED_ALPHA ); - grAlphaBlendFunction( GR_BLEND_SRC_ALPHA, - GR_BLEND_ONE_MINUS_SRC_ALPHA, GR_BLEND_ONE, - GR_BLEND_ZERO ); - grAlphaTestFunction( GR_CMP_ALWAYS ); - - - while ( 1 ) { - Matrix rotm; - GrVertex xformedVerts[4]; - int i; - - - MatMakeYRot( rotm, DEG2RAD( y_angle ) ); - - if (resolution == GR_RESOLUTION_NONE) - tlGetResolutionConstant("0", - &scrWidth, - &scrHeight ); - - - for( i = 0; i < 4; i++ ) { - PointMatMult( &xformedVerts[i], &localVerts[i], rotm ); - xformedVerts[i].x = xformedVerts[i].x / ( xformedVerts[i].z + 2.0f ); - xformedVerts[i].y = xformedVerts[i].y / ( xformedVerts[i].z + 2.0f ); - xformedVerts[i].x *= scrWidth / 2.0f; - xformedVerts[i].y *= scrHeight / 2.0f; - xformedVerts[i].x += scrWidth / 2.0f; - xformedVerts[i].y += scrHeight / 2.0f; - xformedVerts[i].oow = 1.f / ((xformedVerts[i].z + 2) * scrHeight); - xformedVerts[i].tmuvtx[0].sow *= xformedVerts[i].oow; - xformedVerts[i].tmuvtx[0].tow *= xformedVerts[i].oow; - SNAP_COORD( xformedVerts[i].x ); - SNAP_COORD( xformedVerts[i].y ); - } - - guColorCombineFunction( ccFnc ); - - /* grLfbBypassMode(GR_LFBBYPASS_ENABLE); */ - - if (render == FXTRUE) { - ++frameNum; - if ((frameNum % NFRAMES) == 0) { - if (printPerf) { - if (!firstTime) { - GrSstPerfStats_t - pStats; - FxU32 - lfbWritePixels, - nFrames = frameNum - lastFrame, - fillPixels = nFrames * screenFulls[resolution], - totFail; - - lastFrame = frameNum; - - grSstPerfStats(&pStats); - grTriStats(&trisProcessed, &trisDrawn); - - totFail = pStats.chromaFail + pStats.zFuncFail + - pStats.aFuncFail; - - lfbWritePixels = pStats.pixelsOut - pStats.pixelsIn - fillPixels; - - tlConOutput("In the last %d frames:\n", nFrames); - tlConOutput(" Pixels Processed: %d\n", - pStats.pixelsIn); - tlConOutput(" Chroma Failures: %d\n", - pStats.chromaFail); - tlConOutput(" Z Compare Failures: %d\n", - pStats.zFuncFail); - tlConOutput(" Alpha Compare Failures: %d\n", - pStats.aFuncFail); - tlConOutput(" Fast Fill Pixels: %d\n", - fillPixels); - tlConOutput(" LFB Write Pixels: %d\n", - lfbWritePixels); - tlConOutput(" Total Pixels Drawn: %d\n", - pStats.pixelsOut); - tlConOutput(" Triangles Processed %d\n", - trisProcessed); - tlConOutput(" Triangles Drawn %d\n", - trisDrawn); - - if ( - (pStats.pixelsOut - lfbWritePixels - fillPixels - pStats.pixelsIn) != totFail) - tlConOutput("Error: %d != %d\n", - pStats.pixelsOut - lfbWritePixels - fillPixels, - totFail); - - grSstResetPerfStats(); - } else { - lastFrame = frameNum; - grSstResetPerfStats(); - firstTime = 0; - } - } - } - grBufferClear( 0xffffffff, 0, GR_WDEPTHVALUE_FARTHEST ); - - if (background == FXTRUE) { - GrState - oldState; - - texVerts[0].x = 0.f; - texVerts[0].y = 0.f; - - texVerts[1].x = scrWidth; - texVerts[1].y = 0.f; - - texVerts[1].x = scrWidth; - texVerts[1].y = 0.f; - - texVerts[2].x = scrWidth; - texVerts[2].y = scrHeight; - - texVerts[3].x = 0.f; - texVerts[3].y = scrHeight; - - grGlideGetState(&oldState); - - grAlphaBlendFunction( - GR_BLEND_ONE, GR_BLEND_ZERO, - GR_BLEND_ONE, GR_BLEND_ZERO); - - grColorCombine( - GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, FXFALSE - ); - - guTexSource(bgDecal); - - for (i = 0; i < NTRIS; i++) { - grDrawTriangle(&texVerts[0], &texVerts[1], &texVerts[2]); - grDrawTriangle(&texVerts[2], &texVerts[3], &texVerts[0]); - } - grGlideSetState(&oldState); - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - - } - - if (texturing == FXTRUE) - guTexSource(bgDecal); - - if (texturing) - guTexSource(triDecal); - - if (antialias == FXTRUE) { - if (lines == FXTRUE) { - grAADrawLine(&xformedVerts[0], &xformedVerts[1]); - grAADrawLine(&xformedVerts[1], &xformedVerts[2]); - grAADrawLine(&xformedVerts[2], &xformedVerts[0]); - } else { - grAADrawTriangle( - &xformedVerts[0], &xformedVerts[1], - &xformedVerts[2], FXTRUE, FXTRUE, FXTRUE - ); - } - } else { - if (lines == FXTRUE) { - grDrawLine(&xformedVerts[0], &xformedVerts[1]); - grDrawLine(&xformedVerts[1], &xformedVerts[2]); - grDrawLine(&xformedVerts[2], &xformedVerts[0]); - } else { - grDrawTriangle( - &xformedVerts[0], &xformedVerts[1], - &xformedVerts[2] - ); - } - } - - if (plugging) - grSplash(0.f, 0.f, scrWidth / 5.f, scrHeight / 5.f, frameNum); - - if (backbuffer) { - tlConRender(); - grBufferSwap( swapDelay ); - } - } - - if (tlKbHit()) { - char c = (char) tlGetCH(); - - switch (c) { - case 'a': - case 'A': - if (antialias == FXFALSE) { - tlConOutput("Turning ON Antialiasing\n"); - antialias = FXTRUE; - } else { - tlConOutput("Turning OFF Antialiasing\n"); - antialias = FXFALSE; - } - break; - case 'B': - case 'b': - if (bilinear == FXFALSE) { - bilinear = FXTRUE; - tlConOutput("Turning ON BiLinear blending\n"); - guTexChangeAttributes( - triDecal, bgInfo.header.width, - bgInfo.header.height, - bgInfo.header.format, GR_MIPMAP_NEAREST, - bgInfo.header.small_lod, - bgInfo.header.large_lod, - bgInfo.header.aspect_ratio, - GR_TEXTURECLAMP_WRAP, GR_TEXTURECLAMP_WRAP, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR); - } else { - bilinear = FXFALSE; - tlConOutput("Turning OFF BiLinear blending\n"); - guTexChangeAttributes( - triDecal, bgInfo.header.width, - bgInfo.header.height, - bgInfo.header.format, GR_MIPMAP_NEAREST, - bgInfo.header.small_lod, - bgInfo.header.large_lod, - bgInfo.header.aspect_ratio, - GR_TEXTURECLAMP_WRAP, GR_TEXTURECLAMP_WRAP, - GR_TEXTUREFILTER_POINT_SAMPLED, - GR_TEXTUREFILTER_POINT_SAMPLED); - } - break; - - case 'c': - case 'C': - if (blend == FXTRUE) { - blend = FXFALSE; - localVerts[0].a = 255.0f; - localVerts[1].a = 255.0f; - localVerts[2].a = 255.0f; - localVerts[3].a = 255.0f; - } else { - blend = FXTRUE; - localVerts[0].a = alpha; - localVerts[1].a = alpha; - localVerts[2].a = alpha; - localVerts[3].a = alpha; - } - break; - - case 'd': - case 'D': - tlConOutput("vtxa = (%.2f, %.2f), vtxb = (%.2f, %.2f), vtxc = (%.2f, %.2f)\n", - xformedVerts[0].x, xformedVerts[0].y, - xformedVerts[1].x, xformedVerts[1].y, - xformedVerts[2].x, xformedVerts[2].y - ); - break; - - case 'f': - case 'F': - if (backbuffer == FXTRUE) { - backbuffer = FXFALSE; - grRenderBuffer(GR_BUFFER_FRONTBUFFER); - } else { - backbuffer = FXTRUE; - grRenderBuffer(GR_BUFFER_BACKBUFFER); - } - break; - - case 'g': - case 'G': -#if 0 - grLfbBegin(); - - grLfbWriteMode(GR_LFBWRITEMODE_565); - grLfbOrigin(GR_ORIGIN_UPPER_LEFT); - grLfbGetReadPtr(GR_BUFFER_FRONTBUFFER); - tlConOutput("Press a key to get front buffer\n"); - while (!tlKbHit()); - c = (char) tlGetCH(); - guFbReadRegion(0,0,(int)wWidth,(int)scrHeight,scrnImage,(int)wWidth * sizeof(FxU16)); - tlConOutput("Press a key to put image in back buffer and swap\n"); - while (!tlKbHit()); - tlGetCH(); - - grLfbGetWritePtr(GR_BUFFER_BACKBUFFER); - guFbWriteRegion(0,0,(int)wWidth,(int)scrHeight,scrnImage,(int)wWidth * sizeof(FxU16)); - grBufferSwap(swapDelay); - - tlConOutput("Press a key to continue...\n"); - while (!tlKbHit()); - tlGetCH(); - - grLfbEnd(); -#endif - break; - - case 'h': - case 'H': - case '?': - doHelp(); - break; - - case 'i': - case 'I': - if (background == FXTRUE) { - background = FXFALSE; - tlConOutput("Turning off background\n"); - } else { - tlConOutput("Turning on background\n"); - background = FXTRUE; - } - break; - - case 'l': - case 'L': - if (lines == FXTRUE) { - lines = FXFALSE; - tlConOutput("Turning OFF lines\n"); - } else { - lines = FXTRUE; - tlConOutput("Turning ON lines\n"); - } - break; - case 'm': - case 'M': - ccFnc = GR_COLORCOMBINE_TEXTURE_TIMES_ITRGB; - break; - - case 'n': - case 'N': - if (printPerf == FXFALSE) { - printPerf = FXTRUE; - firstTime = 1; - grSstResetPerfStats(); - grResetTriStats(); - } else { - printPerf= FXFALSE; - } - break; - - case 'o': - case 'O': - if (origin == GR_ORIGIN_LOWER_LEFT) - origin = GR_ORIGIN_UPPER_LEFT; - else - origin = GR_ORIGIN_LOWER_LEFT; - - grSstOrigin(origin); - break; - - case 'p': - case 'P': - if (render == FXTRUE) - render = FXFALSE; - else - render = FXTRUE; - break; - - case 'q': - case 'Q': - case 27: - grGlideShutdown(); - exit(0); - break; - - case 'r': - case 'R': - tlConOutput("Screen Resolution is %s\n", tlGetResolutionString( resolution ) ); - break; - - case 'S': - case 's': - if (cullMode == GR_CULL_DISABLE) { - cullMode = GR_CULL_NEGATIVE; - tlConOutput("Turning ON backface culling (hidden Surface removal)\n"); - } else { - cullMode = GR_CULL_DISABLE; - tlConOutput("Turning OFF backface culling (hidden Surface removal)\n"); - } - grCullMode(cullMode); - break; - case 'T': - case 't': - if (texturing == FXFALSE) { - tlConOutput("Turning ON texturing\n"); - ccFnc = GR_COLORCOMBINE_DECAL_TEXTURE; - texturing = FXTRUE; - } else { - tlConOutput("Turning OFF texturing\n"); - ccFnc = GR_COLORCOMBINE_ITRGB; - texturing = FXFALSE; - } - break; - case 'u': - case 'U': - if (plugging == FXTRUE) - plugging = FXFALSE; - else - plugging = FXTRUE; - - grGlideShamelessPlug(plugging); - break; - - case 'v': - case 'V': - if (passthruMode == GR_PASSTHRU_SHOW_VGA) { - passthruMode = GR_PASSTHRU_SHOW_SST1; - tlConOutput("Changing Passthru to show Voodoo\n"); - } - else { - passthruMode = GR_PASSTHRU_SHOW_VGA; - tlConOutput("Changing Passthru to show VGA\n"); - } - /* grSstPassthruMode(passthruMode); */ - break; - - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case '0': - { - char str[256]; - swapDelay = (int) c - 0x30; - sprintf(str, "Swapdelay = %ld\n", swapDelay); - tlConOutput(str); - } - break; - } - } - - if (render) { - y_angle += 2.f; - if( y_angle > 360.0f ) - y_angle -= 360.0f; - } - frameCount++; - if(frameCount < 0) - frameCount = 0; - if(frames == frameCount) - break; - } - grGlideShutdown(); - exit(0); -} diff --git a/glide2x/cvg/glide/tests/test26.c b/glide2x/cvg/glide/tests/test26.c deleted file mode 100644 index 08a09e9..0000000 --- a/glide2x/cvg/glide/tests/test26.c +++ /dev/null @@ -1,370 +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 -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test26"; -static const char purpose[] = "tests grLfbWriteRegion, and grLfbReadRegion"; -static const char usage[] = "-b <# color buffers> -d <# aux buffers> -n -r "; - -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 " -}; - - -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; - int bufCount = 2; - int auxBuf = 1; - - TlTexture texture; - void *image; - void *readImage; - FxU32 bpp; - - GrLfbSrcFmt_t sourceFormat; - - static FxU32 imageWidth; - static FxU32 imageHeight; - - static void imageConvert( void *dst, - void *src, - GrLfbSrcFmt_t format, - FxU32 *bpp ); - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "bdnr", &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 'b': - bufCount = atoi(remArgs[0]); - if (bufCount < 2) bufCount = 2; - if (bufCount > 3) bufCount = 3; - break; - - case 'd': - auxBuf = atoi(remArgs[0]); - if (auxBuf > 1) auxBuf = 1; - if (auxBuf < 0) auxBuf = 0; - break; - - 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_UPPER_LEFT, - bufCount, auxBuf ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xffffff ); - - /* Set up Render State - disable dithering */ - grDitherMode( GR_DITHER_DISABLE ); - - /* Load image from disk */ - assert( tlLoadTexture( "decal1.3df", - &texture.info, - &texture.tableType, - &texture.tableData ) ); - - imageWidth = 256; - imageHeight = 256; - image = calloc( imageWidth * imageHeight, sizeof( FxU32 ) ); - readImage = calloc( imageWidth * imageHeight, sizeof( FxU32 ) ); - - if ( ( imageWidth > (FxU32)scrWidth ) || - ( imageHeight > (FxU32)scrHeight ) ) { - char errMsg[1024]; - sprintf(errMsg, - "imgWidth: %d, imgHeight: %d\nscrWidth: %d, scrHeight: %d\n", - (int) imageWidth, (int) imageHeight, - (int) scrWidth, (int) scrHeight); - - tlErrorMessage(errMsg); - exit(1); - } - - sourceFormat = GR_LFB_SRC_FMT_565; - - imageConvert( image, texture.info.data, sourceFormat, &bpp ); - - while( frames-- ) { - static int x = 0, y = 0; - - if (!tlOkToRender()) - continue; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00303030, 0, 0 ); - - - if ( ( imageWidth < (FxU32)tlScaleX(1.0f) ) && - ( imageHeight < (FxU32)tlScaleY(1.0f) ) && - grLfbWriteRegion( GR_BUFFER_BACKBUFFER, - x, y, sourceFormat, - imageWidth, imageHeight, 256*bpp, image ) ) { - tlConClear(); - tlConOutput( "Width - %d\n", imageWidth); - tlConOutput( "1 - lfb source format (%s)\n" - "+/- - change width of source image copied\n" - " any other key to quit\n\n", - sourceFormatString[sourceFormat] ); - - if ( sourceFormat == GR_LFB_SRC_FMT_565 ) { - memcpy(readImage, image, 256 * 256 * sizeof(FxU16)); - grLfbReadRegion( GR_BUFFER_BACKBUFFER, - x, y, imageWidth, imageHeight, - 256 * 2, readImage ); - if ( memcmp( image, readImage, 256*256*2 ) ) { - FILE* bufFile = fopen("fuckme.txt", "w"); - - if (bufFile != NULL) { - int i, j; - const FxU16* imagePtr = (const FxU16*)image; - const FxU16* readPtr = (const FxU16*)readImage; - - for(i = 0; i < 256; i++) { - for(j = 0; j < 256; j++) { - if (imagePtr[i * 256 + j] != readPtr[i * 256 + j]) { - fprintf(bufFile, "(0x%X 0x%X) : 0x%hX : 0x%hX\n", - j, i, imagePtr[i * 256 + j], readPtr[i * 256 + j]); - } - } - } - fclose(bufFile); - } - - grBufferSwap(1); - grBufferSwap(1); - - tlConOutput( "Failed Readback Test\n" ); - - grBufferClear(0x00303030, 0, 0); - grLfbWriteRegion(GR_BUFFER_BACKBUFFER, - x, y, sourceFormat, - imageWidth, imageHeight, - 256 * bpp, readImage); - - grBufferSwap(1); - grBufferSwap(1); - } else { - tlConOutput( "Passed Readback Test\n" ); - } - } - } else { - tlConClear(); - tlConOutput( "1 - lfb source format (%s)\n" - "+/- - change width of source image copied\n" - "any other key to quit\n\n", - sourceFormatString[sourceFormat] ); - tlConOutput( "grLfbWriteRegion Failed\n" ); - } - - x++; - if ( x + 256 >= (int)tlScaleX(1.0f) ) { - x = 0; y++; - } - if ( y + 256 >= (int)tlScaleY(1.0f) ) { - y = 0; - } - - tlConRender(); - grBufferSwap( 1 ); - while( tlKbHit() ) { - switch( tlGetCH() ) { - case '1': - sourceFormat++; - if ( sourceFormat > GR_LFB_SRC_FMT_ZA16 ) - sourceFormat = GR_LFB_SRC_FMT_565; - imageConvert( image, texture.info.data, sourceFormat, &bpp ); - break; - case '+': - if ( imageWidth < 256 ) imageWidth++; - break; - case '-': - if ( imageWidth > 0 ) imageWidth--; - break; - default: - frames = 0; - break; - } - - imageHeight = imageWidth; - } - } - - grGlideShutdown(); - 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 = 256; - FxU32 shortStride = 256; - 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 < 256; y++ ) { - for( x = 0; x < 256; x++ ) { - switch( format ) { - case GR_LFB_SRC_FMT_565: - shortData[y*shortStride+x] = srcData[y*256+x]; - break; - - case GR_LFB_SRC_FMT_555: - case GR_LFB_SRC_FMT_1555: - shortColor = srcData[y*256+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*256+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*256+x]; - longData[y*longStride+x] = longColor; - break; - - case GR_LFB_SRC_FMT_1555_DEPTH: - case GR_LFB_SRC_FMT_555_DEPTH: - longColor = srcData[y*256+x]; - longColor = ((0x00008000) | - ((longColor>>1) & 0x00007C00) | - ((longColor>>1) & 0x000003E0) | - ((longColor ) & 0x0000001f)); - longData[y*longStride+x] = longColor; - break; - - default: - break; - } - } - } -} - - - diff --git a/glide2x/cvg/glide/tests/test27.c b/glide2x/cvg/glide/tests/test27.c deleted file mode 100644 index 95cbf3a..0000000 --- a/glide2x/cvg/glide/tests/test27.c +++ /dev/null @@ -1,204 +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 -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test27"; -static const char purpose[] = "Cycle the 3D hardware on and off"; -static const char usage[] = "-n -r "; - -static int rRandom(int s, int e); -static unsigned int iRandom (unsigned int maxr); - -#define SNAP_BIAS ((float)(3<<18)) - -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; - int doNothing = 0; - - int cycles; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "Nnr", &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 'N': - doNothing = 1; - 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 ); - - - cycles = 0; - while( frames-- && tlOkToRender()) { - GrVertex a, b, c; - char inchar; - - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, - 1 ) ); - - /* - * Don't like gotos? In the immortal words of Schwarzenegger - * (Total Recall): "...so sue me d**khead" - */ - if (doNothing) goto doNothing; - - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xffffff ); - - - /* deal with dynamic resizing */ - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, &scrWidth, &scrHeight); - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - tlConOutput( "Press to cycle hardware\n" ); - tlConOutput( "Any other key to quit\n" ); - - grBufferClear( 0x000000, 0, GR_WDEPTHVALUE_FARTHEST ); - - a.r = a.g = a.b = 0.0f; - b = c = a; - - a.x = tlScaleX(((float)rRandom( 0, 100 ))/100.0f) + SNAP_BIAS; - a.y = tlScaleY(((float)rRandom( 0, 100 ))/100.0f) + SNAP_BIAS; - a.r = 255.0f; - - b.x = tlScaleX(((float)rRandom( 0, 100 ))/100.0f) + SNAP_BIAS; - b.y = tlScaleY(((float)rRandom( 0, 100 ))/100.0f) + SNAP_BIAS; - b.g = 255.0f; - - c.x = tlScaleX(((float)rRandom( 0, 100 ))/100.0f) + SNAP_BIAS; - c.y = tlScaleY(((float)rRandom( 0, 100 ))/100.0f) + SNAP_BIAS; - c.b = 255.0f; - - grDrawTriangle( &a, &b, &c ); - - tlConOutput( "Cycle: %d\r", cycles ); - tlConRender(); - grBufferSwap( 1 ); - -doNothing: - inchar = tlGetCH(); - if ( inchar != ' ' ) frames = 0; - - grSstWinClose(); - cycles++; - } - - 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); -} - - - diff --git a/glide2x/cvg/glide/tests/test28.c b/glide2x/cvg/glide/tests/test28.c deleted file mode 100644 index 79e5d32..0000000 --- a/glide2x/cvg/glide/tests/test28.c +++ /dev/null @@ -1,229 +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 -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - -#include -#include - -#define PI 3.141592653589793 -#define RAD_TO_DEG(t) ((t) * 180.0 / PI) -#define DEG_TO_RAD(t) ((t) * PI / 180.0) - -typedef struct _RGB { - float r, g, b; -} RGB, *RGBPtr; - - -#define FUDGE(x) ((x) * 255.0f) -#define PHASE(x, y, m) (((x) + (y)) % (m)) - -static float -value(float n1, float n2, float hue) -{ - float retval; - - if (hue > 360.0f) hue -= 360.0f; - if (hue < 0.0f) hue += 360.0f; - - if (hue < 60.0f) { - retval = n1 + (n2 - n1) * hue / 60.0f; - } else if (hue < 180.0f) { - retval = n2; - } else if (hue < 240.0f) { - retval = n1 + (n2 - 1.0f) * (240.0f - hue) / 60.0f; - } else { - retval = n1; - } -// assert((retval >= 0.0f) && (retval <= 1.0f)); - if (retval < 0.0f) retval = 0.0f; - if (retval > 1.0f) retval = 1.0f; - return FUDGE(retval); -} - -static void -hlsToRGB(float h, float l, float s, RGBPtr color) -{ - float p1, p2; - - p2 = (l <= 0.5f) ? l * (1.0f + s) : l + s - l * s; - p1 = 2 * l - p2; - - if (s == 0.0f) { - color->r = color->g = color->b = l; - } else { - color->r = value(p1, p2, h+120.0f); - color->g = value(p1, p2, h); - color->b = value(p1, p2, h-120.0f); - } - -} /* end hlsToRGB() */ - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test28"; -static const char purpose[] = "planar polygon test"; -static const char usage[] = "-n -r "; - -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; -#define NVERT 5 - GrVertex vtx[NVERT]; - int index[NVERT]; - int frames = -1; - int i, idx; -#define NHUE 360 - RGB hues[NHUE]; - - /* 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_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xffffff ); - - /* Set up Render State - gouraud shading */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - -// grRenderBuffer(GR_BUFFER_FRONTBUFFER); /* debug only */ - - tlConOutput( "Press a key to quit\n" ); - - /* init a table of hues */ - for (i=0; i -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test29"; -static const char purpose[] = "oow diff hint"; -static const char usage[] = "-n -r "; - -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; - - TlTexture texture; - TlVertex3D srcVerts[4]; - float distance, dDelta; - - /* 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 - Decal Texture - bilinear */ - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_POINT_SAMPLED, - GR_TEXTUREFILTER_POINT_SAMPLED ); - - /* Load texture data into system ram */ - assert( tlLoadTexture( "decal1.3df", - &texture.info, - &texture.tableType, - &texture.tableData ) ); - /* Download texture data to TMU */ - grTexDownloadMipMap( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - if ( texture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - texture.tableType, - &texture.tableData ); - } - - /* Select Texture As Source of all texturing operations */ - grTexSource( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_NEAREST, - FXFALSE ); - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - - /* enable oow depth buffering */ - grDepthBufferMode( GR_DEPTHBUFFER_WBUFFER ); - grDepthBufferFunction( GR_CMP_LESS ); - grDepthMask( FXTRUE ); - - /* Set hint to separate w for depth and tex */ - grHints( GR_HINT_STWHINT, GR_STWHINT_W_DIFF_TMU0 ); - /* oow for the texture coords will be set to one - in effect disabling perspective correction */ - - /* Initialize Source 3D data - Rectangle on X/Z Plane - Centered about Y Axis - - 0--1 Z+ - | | | - 2--3 - X+ - - */ - srcVerts[0].x = -0.5f, srcVerts[0].y = 0.0f, srcVerts[0].z = 0.5f, srcVerts[0].w = 1.0f; - srcVerts[1].x = 0.5f, srcVerts[1].y = 0.0f, srcVerts[1].z = 0.5f, srcVerts[1].w = 1.0f; - srcVerts[2].x = -0.5f, srcVerts[2].y = 0.0f, srcVerts[2].z = -0.5f, srcVerts[2].w = 1.0f; - srcVerts[3].x = 0.5f, srcVerts[3].y = 0.0f, srcVerts[3].z = -0.5f, srcVerts[3].w = 1.0f; - - srcVerts[0].s = 0.0f, srcVerts[0].t = 0.0f; - srcVerts[1].s = 1.0f, srcVerts[1].t = 0.0f; - srcVerts[2].s = 0.0f, srcVerts[2].t = 1.0f; - srcVerts[3].s = 1.0f, srcVerts[3].t = 1.0f; - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - -#define MAX_DIST 2.5f -#define MIN_DIST 1.0f - - distance = 1.0f; - dDelta = 0.01f; - - tlConOutput( "Press any key to quit\n\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC, vtxD; - TlVertex3D xfVerts[4]; - TlVertex3D prjVerts[4]; - - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - - grBufferClear( 0x00404040, 0, GR_WDEPTHVALUE_FARTHEST ); - - - /*---- - A-B - |\| - C-D - -----*/ - vtxA.oow = 1.0f; - vtxB = vtxC = vtxD = vtxA; - - distance += dDelta; - if ( distance > MAX_DIST || - distance < MIN_DIST ) { - dDelta *= -1.0f; - distance += dDelta; - } - - tlSetMatrix( tlIdentity() ); - tlMultMatrix( tlXRotation( -20.0f ) ); - tlMultMatrix( tlTranslation( 0.0f, -0.3f, distance ) ); - - tlTransformVertices( xfVerts, srcVerts, 4 ); - tlProjectVertices( prjVerts, xfVerts, 4 ); - - vtxA.x = tlScaleX( prjVerts[0].x ); - vtxA.y = tlScaleY( prjVerts[0].y ); - vtxA.oow = 1.0f / prjVerts[0].w; - - vtxB.x = tlScaleX( prjVerts[1].x ); - vtxB.y = tlScaleY( prjVerts[1].y ); - vtxB.oow = 1.0f / prjVerts[1].w; - - vtxC.x = tlScaleX( prjVerts[2].x ); - vtxC.y = tlScaleY( prjVerts[2].y ); - vtxC.oow = 1.0f / prjVerts[2].w; - - vtxD.x = tlScaleX( prjVerts[3].x ); - vtxD.y = tlScaleY( prjVerts[3].y ); - vtxD.oow = 1.0f / prjVerts[3].w; - - vtxA.tmuvtx[0].oow = 1.0f; - vtxA.tmuvtx[0].sow = prjVerts[0].s * 255.0f * vtxA.tmuvtx[0].oow; - vtxA.tmuvtx[0].tow = prjVerts[0].t * 255.0f * vtxA.tmuvtx[0].oow; - - vtxB.tmuvtx[0].oow = 1.0f; - vtxB.tmuvtx[0].sow = prjVerts[1].s * 255.0f * vtxB.tmuvtx[0].oow; - vtxB.tmuvtx[0].tow = prjVerts[1].t * 255.0f * vtxB.tmuvtx[0].oow; - - vtxC.tmuvtx[0].oow = 1.0f; - vtxC.tmuvtx[0].sow = prjVerts[2].s * 255.0f * vtxC.tmuvtx[0].oow; - vtxC.tmuvtx[0].tow = prjVerts[2].t * 255.0f * vtxC.tmuvtx[0].oow; - - vtxD.tmuvtx[0].oow = 1.0f; - vtxD.tmuvtx[0].sow = prjVerts[3].s * 255.0f * vtxD.tmuvtx[0].oow; - vtxD.tmuvtx[0].tow = prjVerts[3].t * 255.0f * vtxD.tmuvtx[0].oow; - - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} - - - diff --git a/glide2x/cvg/glide/tests/testdesc.txt b/glide2x/cvg/glide/tests/testdesc.txt deleted file mode 100644 index 2bd5594..0000000 --- a/glide2x/cvg/glide/tests/testdesc.txt +++ /dev/null @@ -1,46 +0,0 @@ -************************************************* -TEST NAMES - -test00 - buffer clear -test01 - draw points -test02 - draw lines -test03 - gouraud lines -test04 - gouraud triangle -test05 - z buffer -test06 - w buffer -test07 - alpha blend -test08 - fog -test09 - chromakey -test10 - backface culling -test11 - lfb -test12 - lfb + renderbuffer + yorigin -test13 - iterated alpha -test14 - depth bias -test15 - clip rectangle -test16 - shameless plug and splash screen -test17 - decal texture - rgb lit texture - white lit texture -test18 - texture alpha -test19 - texture filters -test20 - mipmap modes ( nomip, mip, trilinear ) -test21 - texture compositing ( lightmap, detail, specular ) -test22 - multi-pass fog -test23 - anti-aliased points -test24 - anti-aliased lines -test25 - anti-aliased triangles -test26 - grLfbWriteRegion -test27 - cycle 3d hardware on and off, excersie open/close -test28 - planar polygon test -test29 - simple palette texture test -test30 - hints - separate texture, polygon oow -test32 - Mindlessly simple multiple board test - -qatest00 - Texture download, multibase, LOD downloads, Partial LODs -qatest01 - Alliance Buffer Swap bug - -Tests that should be done -* - anti-aliased polygons -* - clipped polygons -* - gratuitous c++ test -* - alpha test -* - alpha selects lighting -* - cockpit bit diff --git a/glide2x/cvg/glide/tests/testimg.bat b/glide2x/cvg/glide/tests/testimg.bat deleted file mode 100644 index 04431eb..0000000 --- a/glide2x/cvg/glide/tests/testimg.bat +++ /dev/null @@ -1,48 +0,0 @@ -@echo off -REM -REM if FX_GLIDE_TEST_DSTIMG is not initiated, the default directory is -REM \3dfx\devel\sst1\glide\images -REM -if [%FX_GLIDE_TEST_DSTIMG%]==[] goto Default - -goto Output - -:Default -set FX_GLIDE_TEST_DSTIMG=%BUILD_ROOT_SST1%\glide\images - -:Output -set tdir=%FX_GLIDE_TEST_DSTIMG% - -@echo on -test00 -d %tdir%\test00.tst -sleep 1 -test01 -d %tdir%\test01.tst -sleep 1 -test02 -d %tdir%\test02.tst -sleep 1 -test03 -d %tdir%\test03.tst -sleep 1 -test04 -d %tdir%\test04.tst -sleep 1 -test05 -d %tdir%\test05.tst -sleep 1 -test06 -d %tdir%\test06.tst -sleep 1 -test07 -d %tdir%\test07.tst -sleep 1 -test08 -d %tdir%\test08.tst -sleep 1 -test09 -d %tdir%\test09.tst -sleep 1 -test10 -d %tdir%\test10.tst -sleep 1 -test13 -d %tdir%\test13.tst -sleep 1 -test16 -d %tdir%\test16.tst -sleep 1 -test17 -d %tdir%\test17.tst -sleep 1 -test18 -d %tdir%\test18.tst -sleep 1 -test19 -d %tdir%\test19.tst -sleep 1 diff --git a/glide2x/cvg/glide/tests/tldata.inc b/glide2x/cvg/glide/tests/tldata.inc deleted file mode 100644 index c8682db..0000000 --- a/glide2x/cvg/glide/tests/tldata.inc +++ /dev/null @@ -1,69 +0,0 @@ - - -static unsigned char fontData[] = { -0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, -0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - diff --git a/glide2x/cvg/glide/tests/tlib.c b/glide2x/cvg/glide/tests/tlib.c deleted file mode 100644 index 408d306..0000000 --- a/glide2x/cvg/glide/tests/tlib.c +++ /dev/null @@ -1,1787 +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 -#include -#ifndef __linux__ -#include -#else -#include -#endif -#include -#include -#include -#include -#include - -#include - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) -#include -#else -#endif - -#ifdef __DJGPP__ -#include -int crt0_startup_flags = _CRT0_FLAG_NONMOVE_SBRK; -#endif - -#include "tlib.h" - -static FxBool okToRender = FXTRUE; -static FxBool fullScreen = FXTRUE; - - -FxBool -tlOkToRender() -{ - return okToRender; -} /* tlOkToRender */ - -/*------------------------------------------------------------------- - Function:tlGetOpt - Date: 2/26 - Implementor(s): jdt - Library: Test Library - Description: - Incrementally search an argument list for matches. - Arguments: - argc - first argument to main - argv - second argument to main - tags - string of non-whitespace characters to be search for in the - argument string - match - pointer to storage for matched character - remArgs - pointer to storage for remaining arglist after any match - Return: - 1 if matched - 0 if no more arguments - -1 if unrecognized - -------------------------------------------------------------------*/ -int tlGetOpt( int argc, char *argv[], - const char *tags, char *match, - char **remArgs[] ){ - static int firstCall; - static int lastArg; - - int rv = 0; - - if ( !firstCall ) { - lastArg = 1; - firstCall = 1; - } - - while( (lastArg|[]{}! "; - -static const int fontWidth = 9*2; -static const int fontHeight = 12*2; -static const int charsPerLine = 14; - -static int fontInitialized; - -static void putTex( FxU32 addr, void *storage ); -static void consoleScroll( void ); -static void drawChar( char character, float x, float y, float w, float h ); - -#include "tldata.inc" - -/*------------------------------------------------------------------- - Function: tlSetConsole - Date: 2/28 - Implementor(s): jdt - Library: Test Library - Description: - Initialize Console for printing. The console will scroll text - 60 column text in the window described by minx, miny, maxx, maxy. - Arguments: - minX, minY - upper left corner of console - maxX, maxY - lower right corner of console - rows - rows of text to display - columns - columns to display before scroll - Return: - none - -------------------------------------------------------------------*/ -static char *consoleGrid; -static int consoleRows; -static int consoleColumns; -static int consoleX; -static int consoleY; -static int consoleColor; -static float consoleOriginX; -static float consoleOriginY; -static float consoleCharWidth; -static float consoleCharHeight; - -void tlConSet( float minX, float minY, - float maxX, float maxY, - int columns, int rows, - int color ) { - int entry; - char xCoord; - char yCoord; - - fontInfo.smallLod = GR_LOD_128; - fontInfo.largeLod = GR_LOD_128; - fontInfo.aspectRatio = GR_ASPECT_2x1; - fontInfo.format = GR_TEXFMT_ALPHA_8; - fontInfo.data = &fontData[0]; - - if ( getenv( "FX_GLIDE_NO_FONT" ) ) { - fontInitialized = 0; - return; - } - - for( entry = 1; entry < 128; entry++ ) { - char *hit = strchr( fontString, entry ); - if ( hit ) { - int offset = hit - fontString; - - xCoord = ( offset % charsPerLine ) * fontWidth; - yCoord = ( offset / charsPerLine ) * fontHeight; - - fontTable[entry][0] = xCoord; - fontTable[entry][1] = yCoord; - } - } - - if ( consoleGrid ) free( consoleGrid ); - - consoleGrid = calloc( sizeof( char ), rows * columns ); - memset( consoleGrid, 32, rows*columns ); - consoleRows = rows; - consoleColumns = columns; - consoleX = consoleY = 0; - - consoleColor = color; - consoleOriginX = minX; - consoleOriginY = minY; - consoleCharWidth = ( (maxX - minX)/(float)columns ); - consoleCharHeight = ( (maxY - minY)/(float)rows ); - - fontAddress = grTexMaxAddress( 0 ) - - grTexCalcMemRequired( fontInfo.smallLod, fontInfo.largeLod, - fontInfo.aspectRatio, fontInfo.format ); - - fontInitialized = 1; - - return; -}; - -#ifdef __linux__ -static void strupr(char *str) { - while (*str) { - if (islower(*str)) *str=toupper(*str); - str++; - } -} -#endif - -/*------------------------------------------------------------------- - Function: tlConOutput - Date: 2/28 - Implementor(s): jdt - Library: Test Library - Description: - Output a printf style string to the console - Arguments: - fmt - format string - ... - other args - Return: - int - number of chars printed - -------------------------------------------------------------------*/ -int tlConOutput( const char *fmt, ... ) { - int rv = 0; - va_list argptr; - - if( fontInitialized ) { - static char buffer[1024]; - const char *c; - - va_start( argptr, fmt ); - rv = vsprintf( buffer, fmt, argptr ); - va_end( argptr ); - - strupr( buffer ); - - c = buffer; - - /* update console grid */ - - while( *c ) { - switch( *c ) { - case '\n': - consoleY++; - case '\r': - consoleX = 0; - if ( consoleY >= consoleRows ) { - consoleY = consoleRows - 1; - consoleScroll(); - } - break; - default: - if ( consoleX >= consoleColumns ) { - consoleX = 0; - consoleY++; - if ( consoleY >= consoleRows ) { - consoleY = consoleRows - 1; - consoleScroll(); - } - } - consoleGrid[(consoleY*consoleColumns)+consoleX]=*c; - consoleX++; - break; - } - c++; - } - } - - return rv; -} - -/*------------------------------------------------------------------- - Function: tlConClear - Date: 3/1 - Implementor(s): jdt - Library: Test Library - Description: - Clear the console - Arguments: - none - Return: - none - -------------------------------------------------------------------*/ -void tlConClear() { - memset( consoleGrid, 32, consoleRows*consoleColumns ); - consoleX = consoleY = 0; - return; -} - - -/*------------------------------------------------------------------- - Function: tlConRender - Date: 2/28 - Implementor(s): jdt - Library: test library - Description: - Render the console - Arguments: - none - Return: - none - -------------------------------------------------------------------*/ -void tlConRender( void ) { - if( fontInitialized ) { - int x, y; - - grGlideGetState( &state ); - - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_LOCAL, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_SRC_ALPHA, GR_BLEND_ONE_MINUS_SRC_ALPHA, - GR_BLEND_ONE, GR_BLEND_ZERO ); - grAlphaTestFunction( GR_CMP_ALWAYS ); - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR ); - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_DISABLE, - FXFALSE ); - grDepthBufferFunction( GR_CMP_ALWAYS ); - grAlphaTestReferenceValue( 0x1 ); - grSstOrigin( GR_ORIGIN_UPPER_LEFT ); - grCullMode( GR_CULL_DISABLE ); - grTexDownloadMipMap( 0, fontAddress, GR_MIPMAPLEVELMASK_BOTH, - &fontInfo ); - grTexSource( 0, fontAddress, - GR_MIPMAPLEVELMASK_BOTH, &fontInfo ); - grClipWindow( (int)tlScaleX(0.0f),(int)tlScaleY(0.0f), - (int)tlScaleX(1.0f),(int)tlScaleY(1.0f) ); - - for( y = 0; y < consoleRows; y++ ) { - float charX = consoleOriginX; - float charY = consoleOriginY+(consoleCharHeight*y); - for( x = 0; x < consoleColumns; x++ ) { - drawChar( consoleGrid[(y*consoleColumns)+x], - charX, charY, - consoleCharWidth, - consoleCharHeight ); - charX += consoleCharWidth; - } - } - - grGlideSetState(&state); - } - - return; -} - -/*------------------------------------------------------------------- - Function: tlSleep - Date: 3/1 - Implementor(s): jdt - Library: Test Library - Description: - Block for a number of seconds - Arguments: - seconds - number of seconds before function returns - Return: - none - -------------------------------------------------------------------*/ -void tlSleep( int seconds ) { - time_t time0 = time( 0 ); - while( (time(0)-time0) < seconds ); -} - -/*------------------------------------------------------------------- - Function: tlIdentity - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - Return an identity matrix - Arguments: - none - Return: - const pointer to identity matrix - -------------------------------------------------------------------*/ -static TlMatrix currentMatrix; - -#define DEGREE (.01745328f) - -const float *tlIdentity( void ) { - static TlMatrix m; - m[0][0] = 1.0f, m[0][1] = 0.0f, m[0][2] = 0.0f, m[0][3] = 0.0f; - m[1][0] = 0.0f, m[1][1] = 1.0f, m[1][2] = 0.0f, m[1][3] = 0.0f; - m[2][0] = 0.0f, m[2][1] = 0.0f, m[2][2] = 1.0f, m[2][3] = 0.0f; - m[3][0] = 0.0f, m[3][1] = 0.0f, m[3][2] = 0.0f, m[3][3] = 1.0f; - return &m[0][0]; -} - -/*------------------------------------------------------------------- - Function: tlXRotation - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - Generate a rotation about the x axis - Arguments: - degrees - number of degrees to rotate - Return: - const point to rotation matrix - -------------------------------------------------------------------*/ -const float *tlXRotation( float degrees ) { - static TlMatrix m; - float c = (float)cos( degrees * DEGREE ); - float s = (float)sin( degrees * DEGREE ); - m[0][0] = 1.0f, m[0][1] = 0.0f, m[0][2] = 0.0f, m[0][3] = 0.0f; - m[1][0] = 0.0f, m[1][1] = c, m[1][2] = s, m[1][3] = 0.0f; - m[2][0] = 0.0f, m[2][1] = -s, m[2][2] = c, m[2][3] = 0.0f; - m[3][0] = 0.0f, m[3][1] = 0.0f, m[3][2] = 0.0f, m[3][3] = 1.0f; - return &m[0][0]; -} - - -/*------------------------------------------------------------------- - Function: tlYRotation - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - Generate a rotation about the y axis - Arguments: - degrees - number of degrees to rotate - Return: - const point to rotation matrix - -------------------------------------------------------------------*/ -const float *tlYRotation( float degrees ) { - static TlMatrix m; - float c = (float)cos( degrees * DEGREE ); - float s = (float)sin( degrees * DEGREE ); - m[0][0] = c, m[0][1] = 0.0f, m[0][2] = -s, m[0][3] = 0.0f; - m[1][0] = 0.0f, m[1][1] = 1.0f, m[1][2] = 0.0f, m[1][3] = 0.0f; - m[2][0] = s, m[2][1] = 0.0f, m[2][2] = c, m[2][3] = 0.0f; - m[3][0] = 0.0f, m[3][1] = 0.0f, m[3][2] = 0.0f, m[3][3] = 1.0f; - return &m[0][0]; -} - - -/*------------------------------------------------------------------- - Function: tlZRotation - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - Generate about the z axis - Arguments: - degrees - number of degrees to rotate - Return: - const point to rotation matrix - -------------------------------------------------------------------*/ -const float *tlZRotation( float degrees ) { - static TlMatrix m; - float c = (float)cos( degrees * DEGREE ); - float s = (float)sin( degrees * DEGREE ); - m[0][0] = c, m[0][1] = s, m[0][2] = 0.0f, m[0][3] = 0.0f; - m[1][0] = -s, m[1][1] = c, m[1][2] = 0.0f, m[1][3] = 0.0f; - m[2][0] = 0.0f, m[2][1] = 0.0f, m[2][2] = 1.0f, m[2][3] = 0.0f; - m[3][0] = 0.0f, m[3][1] = 0.0f, m[3][2] = 0.0f, m[3][3] = 1.0f; - return &m[0][0]; -} - -/*------------------------------------------------------------------- - Function: tlTranslation - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - Generate a translation matrix - Arguments: - x, y, z - offsets to translate origin - Return: - const point to translation matrix - -------------------------------------------------------------------*/ -const float *tlTranslation( float x, float y, float z ) { - static TlMatrix m; - m[0][0] = 1.0f, m[0][1] = 0.0f, m[0][2] = 0.0f, m[0][3] = 0.0f; - m[1][0] = 0.0f, m[1][1] = 1.0f, m[1][2] = 0.0f, m[1][3] = 0.0f; - m[2][0] = 0.0f, m[2][1] = 0.0f, m[2][2] = 1.0f, m[2][3] = 0.0f; - m[3][0] = x, m[3][1] = y, m[3][2] = z, m[3][3] = 1.0f; - return &m[0][0]; -} - -/*------------------------------------------------------------------- - Function: tlSetMatrix - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - Set the current matrix. This matrix translates the object into - View space from local coordiantes during calls to transformVertices - All spaces are considered to by -1.0->1.0 normalized. - Arguments: - m - pointer to matrix - Return: - none - -------------------------------------------------------------------*/ -void tlSetMatrix( const float *m ) { - memcpy( currentMatrix, m, sizeof( TlMatrix ) ); - return; -} - -/*------------------------------------------------------------------- - Function: tlMultMatrix - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - Multiply the current matrix by the provided matrix - Arguments: - matrix to post-cat to the current matrix - Return: - none - -------------------------------------------------------------------*/ -void tlMultMatrix( const float *m ) { - TlMatrix result; - TlMatrix mat; - int i, j; - - memcpy( mat, m, sizeof( TlMatrix ) ); - - for( j = 0; j < 4; j++ ) { - for( i = 0; i < 4; i++ ) { - result[j][i] = - currentMatrix[j][0] * mat[0][i] + - currentMatrix[j][1] * mat[1][i] + - currentMatrix[j][2] * mat[2][i] + - currentMatrix[j][3] * mat[3][i]; - } - } - memcpy( currentMatrix, result, sizeof( TlMatrix ) ); - -} - -/*------------------------------------------------------------------- - Function: tlTransformVertices - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - Transform a list of vertices from model space into view space - Arguments: - dstVerts - memory to store transformed vertices - srcVerts - array of vertices to be transformed - length - number of vertices to transform - Return: - none - -------------------------------------------------------------------*/ -void tlTransformVertices( TlVertex3D *dstVerts, TlVertex3D *srcVerts, unsigned length ) { - TlVertex3D tmp, v; - TlMatrix m; - unsigned i; - - memcpy( m, currentMatrix, sizeof( TlMatrix ) ); - for( i = 0; i < length; i++ ) { - v = srcVerts[i]; - tmp = v; - tmp.x = v.x * m[0][0] + v.y * m[1][0] + v.z * m[2][0] + v.w * m[3][0]; - tmp.y = v.x * m[0][1] + v.y * m[1][1] + v.z * m[2][1] + v.w * m[3][1]; - tmp.z = v.x * m[0][2] + v.y * m[1][2] + v.z * m[2][2] + v.w * m[3][2]; - tmp.w = v.x * m[0][3] + v.y * m[1][3] + v.z * m[2][3] + v.w * m[3][3]; - dstVerts[i] = tmp; - } - return; -} - -/*------------------------------------------------------------------- - Function: tlProjectVertices - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - perspective project a set of vertices into normalized 2D space (0,1) - Arguments: - dstVerts - memory to store projected vertices - srcVerts - array of vertices to be transformed - length - number of vertices to transform - Return: - none - -------------------------------------------------------------------*/ -#define VP_OFFSET 1.0f -#define VP_SCALE 0.5f - -void tlProjectVertices( TlVertex3D *dstVerts, TlVertex3D *srcVerts, unsigned length ) { - TlVertex3D tmp, v; - TlMatrix m; - unsigned i; - - /* simplified perspective proj matrix assume unit clip volume */ - m[0][0] = 1.0f, m[0][1] = 0.0f, m[0][2] = 0.0f, m[0][3] = 0.0f; - m[1][0] = 0.0f, m[1][1] = 1.0f, m[1][2] = 0.0f, m[1][3] = 0.0f; - m[2][0] = 0.0f, m[2][1] = 0.0f, m[2][2] = 1.0f, m[2][3] = 1.0f; - m[3][0] = 0.0f, m[3][1] = 0.0f, m[3][2] = 0.0f, m[3][3] = 0.0f; - - for( i = 0; i < length; i++ ) { - v = srcVerts[i]; - tmp = v; - tmp.x = v.x * m[0][0] + v.y * m[1][0] + v.z * m[2][0] + v.w * m[3][0]; - tmp.y = v.x * m[0][1] + v.y * m[1][1] + v.z * m[2][1] + v.w * m[3][1]; - tmp.z = v.x * m[0][2] + v.y * m[1][2] + v.z * m[2][2] + v.w * m[3][2]; - tmp.w = v.x * m[0][3] + v.y * m[1][3] + v.z * m[2][3] + v.w * m[3][3]; - tmp.x /= tmp.w, tmp.y /= tmp.w, tmp.z /= tmp.w; - tmp.x += VP_OFFSET, tmp.x *= VP_SCALE; - tmp.y += VP_OFFSET, tmp.y *= VP_SCALE; - dstVerts[i] = tmp; - } -} - - -/*------------------------------------------------------------------- - Function: tlLoadTexture - Date: 3/3 - Implementor(s): jdt - Library: Test Libarary - Description: - Load Texture - - This example loads textures from a .3df file. 3DF files - containe pre-computed mipmaps data along with any - necessary supplementary information, for example - palettes, ncc-tables, level-of-detail description, - aspect ratio or format - - The gu3dfGetInfo and gu3dfLoad APIs load A 3DF file - into Gu3DfInfo structure from a file on disk. Data - can then be extracted from the gu3DfInfo structure - to initialize a GrTexInfo structure used in the - glide texturing routines. Also note that texture table - ( either NCC or Palette ) management is left up to the - application programmer. - Arguments: - filename - name of .3df file on disk - info - Pointer to GrTexInfo - tableType - pointer to tabletype - table - pointer to table data - Return: - 0 - fail - 1 - pass - -------------------------------------------------------------------*/ -static GrTexTable_t texTableType( GrTextureFormat_t format ); - -int tlLoadTexture( const char *filename, - GrTexInfo *info, - GrTexTable_t *tableType, - void *table ) { - Gu3dfInfo tdfInfo; - int rv = 0; - - assert( filename ); - assert( info ); - assert( tableType ); - assert( table ); - if ( gu3dfGetInfo( filename, &tdfInfo ) ) { - tdfInfo.data = malloc( tdfInfo.mem_required ); - assert( tdfInfo.data ); - if ( gu3dfLoad( filename, &tdfInfo ) ) { - info->smallLod = tdfInfo.header.small_lod; - info->largeLod = tdfInfo.header.large_lod; - info->aspectRatio = tdfInfo.header.aspect_ratio; - info->format = tdfInfo.header.format; - info->data = tdfInfo.data; - *tableType = texTableType( info->format ); - switch( *tableType ) { - case GR_TEXTABLE_NCC0: - case GR_TEXTABLE_NCC1: - case GR_TEXTABLE_PALETTE: - memcpy( table, &(tdfInfo.table), sizeof( TlTextureTable ) ); - break; - default: - break; - } - rv = 1; - } - } - return rv; -} - - - -/*-------------------------------------------------------------------- - Static Helpers - --------------------------------------------------------------------*/ - -static void consoleScroll( void ) { - memmove( consoleGrid, - consoleGrid + consoleColumns, - (consoleRows-1)*consoleColumns ); - memset( consoleGrid+(consoleRows-1)*consoleColumns, - 32, - consoleColumns ); -} - -static void drawChar( char character, float x, float y, float w, float h ) { - GrVertex a, b, c, d; - /* a---b - |\ | - | \ | - | \| - c---d */ - - if ( character == 32 ) return; - - a.oow = b.oow = c.oow = d.oow = 1.0f; - - a.x = c.x = tlScaleX(x); - a.y = b.y = tlScaleY(y); - d.x = b.x = tlScaleX(x+w); - d.y = c.y = tlScaleY(y+h); - - grConstantColorValue( consoleColor ); - - a.tmuvtx[0].sow = c.tmuvtx[0].sow = (float)fontTable[(int) character][0]; - a.tmuvtx[0].tow = b.tmuvtx[0].tow = (float)fontTable[(int) character][1]; - d.tmuvtx[0].sow = b.tmuvtx[0].sow = a.tmuvtx[0].sow + (float)fontWidth; - d.tmuvtx[0].tow = c.tmuvtx[0].tow = a.tmuvtx[0].tow + (float)fontHeight; - - grDrawTriangle( &a, &d, &c ); - grDrawTriangle( &a, &b, &d ); - return; -} - - - - -static void readRegion( void *data, - int x, int y, - int w, int h ); -static void writeRegion( void *data, - int x, int y, - int w, int h ); - - -static void putTex( FxU32 addr, void *storage ) { - GrTexInfo texInfo; - - texInfo.smallLod = GR_LOD_256; - texInfo.largeLod = GR_LOD_256; - texInfo.aspectRatio = GR_ASPECT_1x1; - texInfo.format = GR_TEXFMT_RGB_565; - texInfo.data = storage; - - grTexDownloadMipMap( 0, addr, GR_MIPMAPLEVELMASK_BOTH, &fontInfo ); -} - -static void readRegion( void *data, - int sx, int sy, - int w, int h ) { - int x; int y; - GrLfbInfo_t info; - - info.size = sizeof( info ); - - assert( grLfbLock( GR_LFB_READ_ONLY, - GR_BUFFER_BACKBUFFER, - GR_LFBWRITEMODE_ANY, - GR_ORIGIN_UPPER_LEFT, - FXFALSE, - &info ) ); - - for( y = 0; y < h; y++ ) { - unsigned short *dst = ((unsigned short *)data+ - (w*y)); - unsigned short *src = (unsigned short*)(((char*)info.lfbPtr) - +(info.strideInBytes*(sy+y)) - +(sx<<1)); - for( x = 0; x < w; x++ ) { - *dst++ = *src++; - } - } - - - assert( grLfbUnlock( GR_LFB_READ_ONLY, GR_BUFFER_BACKBUFFER ) ); - return; -} -static void writeRegion( void *data, - int sx, int sy, - int w, int h ) { - int x; int y; - GrLfbInfo_t info; - - info.size = sizeof( info ); - - assert( grLfbLock( GR_LFB_WRITE_ONLY, - GR_BUFFER_BACKBUFFER, - GR_LFBWRITEMODE_ANY, - GR_ORIGIN_UPPER_LEFT, - FXFALSE, - &info ) ); - - for( y = 0; y < h; y++ ) { - unsigned short *src = ((unsigned short *)data+ - (w*y)); - unsigned short *dst = (unsigned short*)(((char*)info.lfbPtr) - +(info.strideInBytes*(sy+y)) - +(sx<<1)); - for( x = 0; x < w; x++ ) { - *dst++ = *src++; - } - } - - assert( grLfbUnlock( GR_LFB_WRITE_ONLY, GR_BUFFER_BACKBUFFER ) ); - return; -} - - -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; -} - -/* - * SimpleRleDecode - * simple rle decoder - * Arguments: - * width : width of the image - * height : height of the image - * pixelsize : 1-4 - * *mem : compressed data - * *buff : uncompressed data - * Return: - * TRUE if decode sucessful. otherwise FALSE - * The simple rle file file format - * width: 2 bytes - * height: 2 bytes - * compression type: 1 byte (0: literal data, 1: rle) - * depth: 1 byte (16 for sst1) - * image data - * 1st byte: control byte. msb = 1 indicate a run, msb = 0 indicate a literal string - * bit 7-0 is counter. it is zero based. - * next depth/8 bytes: pixel data - */ -FxBool -SimpleRleDecode -( - FxU16 width, - FxU16 height, - FxU8 pixelsize, - FxU8 *mem, - FxU8 *buff -) -{ - FxU32 count = width * height; - FxU8 run, lit; - - while (count) { - if (*mem & 0x80) { - run = *mem & 0x7f; - run++; - mem++; - count -= run; - while (run) { - memcpy(buff, mem, pixelsize); - run--; - buff+=pixelsize; - } - mem+=pixelsize; - } - else { - lit = *mem; - lit++; - mem++; - count -= lit; - while (lit) { - memcpy(buff, mem, pixelsize); - lit--; - buff+=pixelsize; - mem+=pixelsize; - } - } - if (count < 0) - return FXFALSE; - } - return FXTRUE; -} - -/* - * WritePixel - * write rle run/literal strings - * Arguments: - * flag: TRUE if it is a run. otherwise it is a string - * count: number of run/literal (0 based) - * *buff: output area - * *tmp: source area - * pixelsize: pixel size (1-4) - * Return: - * none - */ -static void -WritePixel -( - FxBool flag, - FxU8 count, - FxU8 *buff, - FxU8 *tmp, - FxU8 pixelsize -) -{ - FxU8 val; - FxU32 i; - - if (flag) { - val = 0x80 | count; - count = 0; - } - else - val = count; - - *buff = val; - buff++; - for (i = 0; i <= count; i++) { - memcpy(buff, tmp, pixelsize); - buff+=pixelsize; - tmp+=4; - } -} - -/* - * SimpleRleEncode - * simple rle encoder - * Arguments: - * pixelcount : number of pixels - * pixelsize : 1-4 - * *mem : source image - * *buff : compressed data - * Return: - * none - */ -static FxU32 -SimpleRleEncode -( - FxU32 pixelcount, /* number of pixels */ - FxU8 pixelsize, /* size of pixel (in bytes) 1-4 */ - FxU8 *mem, /* src image */ - FxU8 *buff /* compressed data */ -) -{ - FxU8 *src = buff; - FxU8 run = 0, lit = 0; - FxU32 tmp[130]; - FxU32 pval = 0, cval = 0; - FxU32 i; - FxU32 tt; - FxBool flag = FXFALSE; - - /* determine run or literal */ - mem+=pixelsize; - - for (i = 1; i < pixelcount; i++) { - if (i > 300000) - tt = 1; - memcpy(&pval, mem-pixelsize, pixelsize); - memcpy(&cval, mem, pixelsize); - if (cval == pval) { - flag = FXFALSE; - if (lit) { - WritePixel(FXFALSE, (FxU8)(lit - 1), buff, (FxU8 *)&tmp[0], pixelsize); - buff += (1 + pixelsize * lit); - lit = 0; - } - run++; - if (run == 128) { - WritePixel(FXTRUE, (FxU8)(run - 1), buff, (FxU8 *)&tmp[0], pixelsize); - buff += (1 + pixelsize); - run -= 128; - } - memcpy(&tmp[0], mem, pixelsize); - } - else { - flag = FXTRUE; - if (run) { - WritePixel(FXTRUE, run, buff, (FxU8 *)&tmp[0], pixelsize); - buff += (1 + pixelsize); - run = 0; - } - else { - if (lit == 128) { - WritePixel(FXFALSE, (FxU8)(lit - 1), buff, (FxU8 *)&tmp[0], pixelsize); - buff += (1 + pixelsize * lit); - lit -= 128; - } - memcpy(&tmp[lit], mem-pixelsize, pixelsize); - lit++; - } - } - mem+=pixelsize; - } - /* last pixel */ - if (flag) { - if (lit == 128) { - WritePixel(FXFALSE, (FxU8)(lit - 1), buff, (FxU8 *)&tmp[0], pixelsize); - buff += (1 + pixelsize * lit); - lit -= 128; - } - memcpy(&tmp[lit], mem-pixelsize, pixelsize); - WritePixel(FXFALSE, (FxU8)lit, buff, (FxU8 *)&tmp[0], pixelsize); - lit++; - buff += (1 + pixelsize * lit); - lit = 0; - } - else if (run) { - WritePixel(FXTRUE, run, buff, (FxU8 *)&tmp[0], pixelsize); - buff += (1 + pixelsize); - run = 0; - } - - return( (FxU32) (buff - src)); -} - -/*------------------------------------------------------------------- - Function: tlScreenDump - Date: 6/6/97 - Implementor(s): - Library: test library - Description: - dump the lfb data - Arguments: - filename - filename - width - width for frame buffer - height - height for frame buffer - Return: - none - -------------------------------------------------------------------*/ -FxBool -tlScreenDump -( - const char *filename, - FxU16 width, - FxU16 height -) -{ - FILE *fp; - FxU16 *pixel, *region; - FxU8 *buff; - FxU32 count, signature; - FxU8 type, depth; - - fp = fopen(filename, "wb"); - if (fp == NULL) - return(FXFALSE); - - region = malloc(width * height * sizeof(FxU16)); - buff = malloc(width * height * sizeof(FxU16) * 2); - grLfbReadRegion( GR_BUFFER_FRONTBUFFER, - 0, 0, width, height, - width*2, region ); - - pixel = (FxU16 *)region; - - count = SimpleRleEncode( (FxU32)width * (FxU32)height, 2, (FxU8 *)region, (FxU8 *)buff); - - /* header of the file */ - type = LFB_DATA_RLE; - depth = 16; - signature = IMAGE_SRLE; - fwrite(&signature, sizeof(FxU32), 1, fp); - fwrite(&width, sizeof(FxU16), 1, fp); - fwrite(&height, sizeof(FxU16), 1, fp); - fwrite(&depth, sizeof(FxU8), 1, fp); - fwrite(&type, sizeof(FxU8), 1, fp); - - /* LFB data */ - fwrite(buff, count, 1, fp); - - free(buff); - free(region); - fclose(fp); - - return FXTRUE; -} - -#ifdef __linux__ -#include - -/*------------------------------------------------------------------- - Function: tlKbHit - Date: 2/28 - Implementor(s): jdt - Library: test library - Description: - Returns true if there are pending characters in the input queue - Arguments: - none - Return: - nonzero if keys in queue - -------------------------------------------------------------------*/ -int tlKbHit( void ) { - return lin_kbhit(); -} - -/*------------------------------------------------------------------- - Function: tlGetCH - Date: 2/28 - Implementor(s): jdt - Library: test library - Description: - Returns character from top of input fifo, blocks if fifo is empty - Arguments: - none - Return: - character - -------------------------------------------------------------------*/ -char tlGetCH( void ) { - return lin_getch(); -} - -FxBool -tlErrorMessage( char *err) { - return !!fprintf(stderr, err); -} /* tlErrorMessage */ - -#else -#ifdef __DOS32__ -/*------------------------------------------------------------------- - Function: tlKbHit - Date: 2/28 - Implementor(s): jdt - Library: test library - Description: - Returns true if there are pending characters in the input queue - Arguments: - none - Return: - nonzero if keys in queue - -------------------------------------------------------------------*/ -int tlKbHit( void ) { - return kbhit(); -} - -/*------------------------------------------------------------------- - Function: tlGetCH - Date: 2/28 - Implementor(s): jdt - Library: test library - Description: - Returns character from top of input fifo, blocks if fifo is empty - Arguments: - none - Return: - character - -------------------------------------------------------------------*/ -char tlGetCH( void ) { - return getch(); -} - -FxBool -tlErrorMessage( char *err) { - fprintf(stderr, err); -} /* tlErrorMessage */ - -#else /* __WIN32__ */ - - -/* This segment simulates main() for Windows, creates a window, etc. */ -#define WIN32_LEAN_AND_MEAN -#include - -/* Forward declarations */ -HWND hWndMain; -char ** commandLineToArgv(LPSTR lpCmdLine, int *pArgc); - -/* - * MainWndproc - * - * Callback for all Windows messages - */ -static int qhead = 0; -static int qtail = 0; -static int queue[256] = {0}; - -long FAR PASCAL -MainWndproc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) -{ - PAINTSTRUCT ps; - HDC hdc; - - extern GrHwConfiguration hwconfig; - - switch( message ) - { - case WM_SETCURSOR: - if (Res != GR_RESOLUTION_NONE) { - SetCursor(NULL); - return 0; - } - break; - - case WM_CREATE: - break; - - case WM_PAINT: - hdc = BeginPaint( hWnd, &ps ); - EndPaint( hWnd, &ps ); - return 1; - - case WM_CLOSE: - queue[qhead++] = 'q'; qhead &= 255; - break; - - case WM_DESTROY: - break; - - case WM_MOVE: - if (!grSstControl(GR_CONTROL_MOVE)) { - PostMessage( hWndMain, WM_CLOSE, 0, 0 ); - return 0; - } - break; - - case WM_ACTIVATE: - if (hwconfig.SSTs[0].type == GR_SSTTYPE_VOODOO) { - if (wParam & WA_INACTIVE) - grSstControl(GR_CONTROL_DEACTIVATE); - else { - grSstControl(GR_CONTROL_ACTIVATE); -#if 0 - grHints(GR_HINT_H3DENABLE,1); -#endif - } - } else - return 0; - break; - - case WM_DISPLAYCHANGE: - case WM_SIZE: - { - extern void getWindowSize(float *width, float *height); - float width, height; - - getWindowSize(&width, &height); -#ifndef H3D - tlSetScreen( width, height); -#endif - } - if (!grSstControl(GR_CONTROL_RESIZE)) { - MessageBox( hWnd, "Resize failed due to lack of sufficient buffer memory.\n", "Allocation Failure", MB_OK | MB_APPLMODAL ); - PostMessage( hWndMain, WM_CLOSE, 0, 0 ); - okToRender = FXFALSE; - return 0; - } else { - okToRender = FXTRUE; - } - break; - - case WM_CHAR: - if (!isascii(wParam)) break; -#if 0 - printf("Posting keystroke %.02x\n", wParam); - fflush(stdout); -#endif - /* queue[qhead++] = tolower(wParam); */ - queue[qhead++] = wParam; - qhead &= 255; - break; - - default: - break; - } - return DefWindowProc(hWnd, message, wParam, lParam); - -} /* MainWndproc */ - -/* - * initApplication - * - * Do that Windows initialization stuff... - */ -static FxBool -initApplication( HANDLE hInstance, int nCmdShow ) -{ - WNDCLASS wc; - FxBool rc; - - wc.style = CS_DBLCLKS; - wc.lpfnWndProc = MainWndproc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = hInstance; - wc.hIcon = LoadIcon( NULL, IDI_APPLICATION); /* generic icon */ - wc.hCursor = LoadCursor( NULL, IDC_ARROW ); - wc.hbrBackground = GetStockObject( BLACK_BRUSH ); - wc.lpszMenuName = NULL; - wc.lpszClassName = "WinGlideClass"; - rc = RegisterClass( &wc ); - if( !rc ) { - return FALSE; - } - - hWndMain = - CreateWindowEx( -#if 0 - WS_EX_APPWINDOW gives you regular borders? - WS_EX_TOPMOST Works as advertised. -#endif - WS_EX_APPWINDOW, - "WinGlideClass", - "Glide Test", - WS_OVERLAPPED | - WS_CAPTION | - WS_THICKFRAME | - WS_MAXIMIZEBOX | - WS_MINIMIZEBOX | - WS_VISIBLE | /* so we don't have to call ShowWindow */ - WS_POPUP | /* non-app window */ - WS_SYSMENU, /* so we get an icon in the tray */ - CW_USEDEFAULT, - CW_USEDEFAULT, - 0x110, /* GetSystemMetrics(SM_CXSCREEN), */ - 0x120, /* GetSystemMetrics(SM_CYSCREEN), */ - NULL, - NULL, - hInstance, - NULL - ); - - if( !hWndMain ) { - return FALSE; - } - - SetCursor(NULL); - - ShowWindow( hWndMain, SW_NORMAL); - UpdateWindow( hWndMain ); - - return TRUE; - -} /* initApplication */ - -/* - * WinMain - */ -int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, - LPSTR lpCmdLine, int nCmdShow ) -{ - if( !initApplication(hInstance, nCmdShow) ) - return FALSE; - - { - /* - * Since printfs go into the bit bucket on Win32, - * put up a message in the window. - */ - HDC hDC = GetDC(hWndMain); - char *message = "Press any Key to continue!"; - RECT rect; - - GetClientRect(hWndMain, &rect); - SetTextColor(hDC, RGB(0, 255, 255)); - SetBkColor(hDC, RGB(0, 0, 0)); - SetTextAlign(hDC, TA_CENTER); - ExtTextOut(hDC, rect.right/2, rect.bottom/2, ETO_OPAQUE, &rect, - message, strlen(message), NULL); - ReleaseDC(hWndMain, hDC); - GdiFlush(); - } - - { - int argc; - char **argv; - extern int main(int argc, char **argv); - - argv = commandLineToArgv(lpCmdLine, &argc); - main(argc, argv); - } - - printf("Exiting winMain()\n"); - fflush(stdout); - - DestroyWindow(hWndMain); - return 0; - -} /* WinMain */ - -FxBool -tlErrorMessage( char *err) -{ - /* make the cursor visible */ - SetCursor(LoadCursor( NULL, IDC_ARROW )); - - /* - ** warn user if there is one - */ - printf("Error %s..\n", err); - fflush(stdout); - - MessageBox( hWndMain, err, "ERROR", MB_OK ); - return FALSE; -} /* tlErrorMessage */ - -/* - * Converts lpCmdLine to WinMain into argc, argv - */ -static char *fakeName = "WinTest"; -static char *argvbuf[32]; -static char cmdLineBuffer[1024]; -char ** -commandLineToArgv(LPSTR lpCmdLine, int *pArgc) -{ - char *p, *pEnd; - int argc = 0; - - argvbuf[argc++] = fakeName; - - if (lpCmdLine == NULL) { - *pArgc = argc; - return argvbuf; - } - - strcpy(cmdLineBuffer, lpCmdLine); - p = cmdLineBuffer; - pEnd = p + strlen(cmdLineBuffer); - if (pEnd >= &cmdLineBuffer[1022]) pEnd = &cmdLineBuffer[1022]; - - fflush(stdout); - - while (1) { - /* skip over white space */ - fflush(stdout); - - while (*p == ' ') p++; - if (p >= pEnd) break; - - argvbuf[argc++] = p; - if (argc >= 32) break; - - /* skip till there's a 0 or a white space */ - while (*p && (*p != ' ')) p++; - - if (*p == ' ') *p++ = 0; - } - - *pArgc = argc; - return argvbuf; -} - -/*------------------------------------------------------------------- - Function: tlKbHit - Date: 2/28 - Implementor(s): jdt - Library: test library - Description: - Returns true if there are pending characters in the input queue - Arguments: - none - Return: - nonzero if keys in queue - -------------------------------------------------------------------*/ -int -tlKbHit( void ) -{ - MSG msg; - - if (qhead != qtail) { - return 1; - } - - while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { - TranslateMessage(&msg); - DispatchMessage(&msg); /* this might change qhead */ - if (qhead != qtail) { - return 1; - } - } - return 0; -} - -/*------------------------------------------------------------------- - Function: tlGetCH - Date: 2/28 - Implementor(s): jdt - Library: test library - Description: - Returns character from top of input fifo, blocks if fifo is empty - Arguments: - none - Return: - character - -------------------------------------------------------------------*/ -char -tlGetCH( void ) -{ - MSG msg; - char rv; - - if (qtail != qhead) { - rv = queue[qtail++]; - qtail &= 255; - return rv; - } - - while (GetMessage( &msg, NULL, 0, 0 )) { - TranslateMessage(&msg); - DispatchMessage(&msg); - - if (qtail != qhead) { - rv = queue[qtail++]; - qtail &= 255; - return rv; - } - } - - /* Should never get here!! */ - /* printf("Bad exit..\n"); */ - /* fflush(stdout); */ -} - -void -tlExit() -{ - PostMessage( hWndMain, WM_CLOSE, 0, 0 ); -} - - -void -getWindowSize(float *width, float *height) -{ - RECT rect; - - if (fullScreen) { - GetWindowRect(hWndMain, &rect); - *width = (float) (rect.right-rect.left); - *height = (float) (rect.bottom-rect.top); - } - else { - GetClientRect(hWndMain, &rect); - *width = (float) (rect.right-rect.left); - *height = (float) (rect.bottom-rect.top); - } -} - - -#endif /* __DOS32__ */ -#endif /* __linux__ */ diff --git a/glide2x/cvg/glide/tests/tlib.h b/glide2x/cvg/glide/tests/tlib.h deleted file mode 100644 index d21dce9..0000000 --- a/glide2x/cvg/glide/tests/tlib.h +++ /dev/null @@ -1,141 +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$ -** -*/ - - -#ifndef _TLIB_H_ -#define _TLIB_H_ -#ifdef __cplusplus -extern "C" { -#endif - - -/* If not debugging, change the meaning of the ANSI assert - * so that it is a harmless wrapper rather than ((void)0) as in - */ -#ifndef DEBUG -#define NDEBUG -#endif - -int tlGetOpt( int argc, char *argv[], const char *tags, char *match, char **remArgs[] ); - -int tlGetResolutionConstant( const char *identifier, float *width, float *height ); -void tlGetDimsByConst(const int res, float *w, float *h); -const char *tlGetResolutionString( int res ); -const char *tlGetResolutionList( void ); - -void tlSetScreen( float width, float height ); -float tlScaleX( float coord ); -float tlScaleY( float coord ); - -void tlConSet( float minX, float minY, - float maxX, float maxY, - int columns, int rows, - int color ); -int tlConOutput( const char *fmt, ... ); -void tlConClear(); -void tlConRender(); - -int tlKbHit( void ); -char tlGetCH( void ); - -void tlSleep( int seconds ); - -#define LFB_DATA_LITERAL 0 -#define LFB_DATA_RLE 1 -#define IMAGE_SRLE (((FxU32)'S' << 24) | ((FxU32)'R' << 16) | ((FxU32)'L' << 8) | ((FxU32)'E')) - -FxBool SimpleRleDecode(FxU16 width,FxU16 height,FxU8 pixelsize, FxU8 *mem,FxU8 *buff); -void tlGrabRect(void *memory, FxU32 minx, FxU32 miny, FxU32 maxx, FxU32 maxy); -FxBool tlScreenDump(const char *filename, FxU16 width, FxU16 height); - -typedef struct { - float x; - float y; - float z; - float w; - float s; - float t; - float r; - float g; - float b; - float a; -} TlVertex3D; - -typedef float TlMatrix[4][4]; - -const float *tlIdentity( void ); -const float *tlZRotation( float degrees ); -const float *tlYRotation( float degrees ); -const float *tlXRotation( float degrees ); -const float *tlTranslation( float x, float y, float z ); -void tlSetMatrix( const float *m ); -void tlMultMatrix( const float *m ); -void tlTransformVertices( TlVertex3D *dstList, - TlVertex3D *srcList, - unsigned length ); -void tlProjectVertices( TlVertex3D *dstList, - TlVertex3D *srcList, - unsigned length ); - -FxBool tlOkToRender(void); - -FxBool -tlErrorMessage(char *err); - -typedef FxU32 TlPalette[256]; -typedef struct { - FxU8 yRGB[16]; - FxI16 iRGB[4][3]; - FxI16 qRGB[4][3]; - FxU32 packed_data[12]; -} TlNCCTable; - -typedef union { - TlPalette palette; - TlNCCTable nccTable; -} TlTextureTable; - -typedef struct { - GrTexInfo info; - GrTexTable_t tableType; - TlTextureTable tableData; -} TlTexture; - -#define NO_TABLE ((GrTexTable_t)(~0)) - -int tlLoadTexture( const char *filename, - GrTexInfo *info, - GrTexTable_t *tableType, - void *table ); - -/* We are making function calls from within assert() */ -#ifdef NDEBUG -#undef NDEBUG -#endif - -#ifdef __cplusplus -} -#endif -#endif diff --git a/glide2x/cvg/glide/tests/yiq.3df b/glide2x/cvg/glide/tests/yiq.3df deleted file mode 100644 index 40b79d5..0000000 Binary files a/glide2x/cvg/glide/tests/yiq.3df and /dev/null differ diff --git a/glide2x/cvg/include/makefile b/glide2x/cvg/include/makefile deleted file mode 100644 index 28ecd22..0000000 --- a/glide2x/cvg/include/makefile +++ /dev/null @@ -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 = *.h - -!include $(BUILD_ROOT_SWLIBS)/include/nmake/3dfx.mak diff --git a/glide2x/cvg/include/makefile.linux b/glide2x/cvg/include/makefile.linux deleted file mode 100644 index 11ef236..0000000 --- a/glide2x/cvg/include/makefile.linux +++ /dev/null @@ -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 = $(wildcard *.h) - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak diff --git a/glide2x/cvg/incsrc/cvg.h b/glide2x/cvg/incsrc/cvg.h deleted file mode 100644 index 19a3096..0000000 --- a/glide2x/cvg/incsrc/cvg.h +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef __H3_H__ -#define __H3_H__ - -/* -** 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 <3dfx.h> -#include -#include -#include -#include -#include - -#endif /* !__H3_H__ */ diff --git a/glide2x/cvg/incsrc/cvgdefs.h b/glide2x/cvg/incsrc/cvgdefs.h deleted file mode 100644 index 759b569..0000000 --- a/glide2x/cvg/incsrc/cvgdefs.h +++ /dev/null @@ -1,944 +0,0 @@ -/*-*-c++-*-*/ -#ifndef __CVGDEFS_H__ -#define __CVGDEFS_H__ - -/* -** 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$ -*/ - -//----------------------- CMDFIFO Section --------------------------- -//----------------------- CMDFIFO Section --------------------------- -//----------------------- CMDFIFO Section --------------------------- - -// CVG/H3 abstraction -#define SST_IS_CMDFIFO_ENABLED(sst) (sst->fbiInit7 & SST_EN_CMDFIFO) - -//----------------- SST cmdFifoBase bits --------------------------- -#define SST_CMDFIFO_START_SHIFT 0 -#define SST_CMDFIFO_START (0x3FF<= 0; -1 if < 0) -#define ISIGN(x) (((x) | 0x40000000L) >> 30) -#define FSIGN(f) ISIGN(*(long *)&f) - -#define BIT(n) (1UL<<(n)) -#define SST_MASK(n) (0xFFFFFFFFL >> (32-(n))) -#define SST_MASK64(n) FX_MASK64(n) - -//----------------- SST binary point locations --------------- -#define SST_LOD_SIZE 6 -#define SST_LOD_FRACBITS 2 -#define SST_XY_SIZE 16 -#define SST_XY_INTBITS 12 -#define SST_XY_FRACBITS 4 -#define SST_RGBA_SIZE 24 -#define SST_RGBA_INTBITS 8 -#define SST_RGBA_FRACBITS 12 -#define SST_Z_SIZE 32 -#define SST_Z_INTBITS 16 -#define SST_Z_FRACBITS 12 -// NOTE: below are ONLY for the fixed point registers -#define SST_ST_SIZE 32 -#define SST_ST_INTBITS 14 -#define SST_ST_FRACBITS 18 -#define SST_W_SIZE 32 -#define SST_W_INTBITS 2 -#define SST_W_FRACBITS 30 - -//----------------- SST status bits --------------------------- -#define SST_FIFOLEVEL 0x3F -#define SST_VRETRACE BIT(6) -#define SST_FBI_BUSY BIT(7) -#define SST_TMU_BUSY BIT(8) -#define SST_TREX_BUSY SST_TMU_BUSY -#define SST_BUSY BIT(9) -#define SST_DISPLAYED_BUFFER_SHIFT 10 -#define SST_DISPLAYED_BUFFER (0x3< - -#include - -// Allow SourceSafe to track Revision values -#define HAL_H_REV "$Revision$" - -// Just to unconfuse myself: -// -// CHIP FBI-REV TMU-REV DEV-ID -// SST1-0.6u 1 0 1 -// SST1-0.5u 2 1 1 -// SST-96 2 (1) 2 -// H3 3 4 4 -// H4 ? ? 4? -#define SST_DEVICE_ID_SST1 1 -#define SST_DEVICE_ID_SST96 2 -#define SST_DEVICE_ID_H3 3 - -#define MBYTE(n) (((FxU32)(n))<<20) -#define DEAD 0xDEAD - -// Maximum number of boards and TMUs supported -#define HAL_MAX_BOARDS 16 - -//---------------------------------------------------------------------- -// the root of all Hal information -//---------------------------------------------------------------------- -typedef struct { - int csim; - int hsim; - int hw; - FxU32 boardsFound; // number of boards found - FxDeviceInfo boardInfo[HAL_MAX_BOARDS]; - - int pollLimit; // number of pixels to poll msg Q after - int pollCount; // current pixel counter - int video; // video output enabled - FxU32 csimLastRead; -} HalInfo; - -//---------------------------------------------------------------------- -/* -** SST Hardware Initialization routine protypes -** -** If all initialization routines are called, it is assumed they are called -** in the following order: -** 0. fxHalInit(); -** 1. fxHalMapBoard(); -** 2. fxHalInitRegisters(); -** 3. fxHalInitGamma(); -** 4. fxHalInitVideo(); -** 5. fxHalShutdown(); -** -** fxHalShutdown() is called at the end of an application to turn off -** the graphics subsystem -** -*/ - -FX_ENTRY void FX_CALL fxHalPutenv(char *buf); -FX_ENTRY HalInfo * FX_CALL fxHalInit(FxU32 flags); -FX_ENTRY FxU32 FX_CALL fxHalNumBoardsInSystem(void); -FX_ENTRY SstRegs * FX_CALL fxHalMapBoard(FxU32 boardNum); -FX_ENTRY FxBool FX_CALL fxHalInitCmdFifo( SstRegs *sst, int which, - FxU32 fifoStart, FxU32 size, - FxBool directExec, FxBool disableHoles, - FxSet32Proc set32); -FX_ENTRY FxBool FX_CALL fxHalInitRegisters(SstRegs *sst); -FX_ENTRY FxBool FX_CALL fxHalInitRenderingRegisters(SstRegs *sst); -FX_ENTRY FxBool FX_CALL fxHalInitGamma(SstRegs *sst, FxFloat gamma); -FX_ENTRY FxBool FX_CALL fxHalInitGammaRGB(SstRegs *sst, FxFloat r, FxFloat g, FxFloat b); -FX_ENTRY FxBool FX_CALL fxHalInitVideo(SstRegs *sst, FxU32 resolution, - FxU32 refresh, sst1VideoTimingStruct *); -FX_ENTRY FxBool FX_CALL fxHalIdle(SstRegs *sst); -FX_ENTRY FxBool FX_CALL fxHalIdleNoNOP(SstRegs *sst); -FX_ENTRY FxBool FX_CALL fxHalIdleFBINoNOP( SstRegs *sst ); -FX_ENTRY FxBool FX_CALL fxHalShutdown(SstRegs *sst); -FX_ENTRY FxBool FX_CALL fxHalInitUSWC(SstRegs *sst); -FX_ENTRY void FX_CALL fxHalShutdownAll(void); -FX_ENTRY FxBool FX_CALL fxHalGetDeviceInfo(SstRegs *sst, FxDeviceInfo *); -FX_ENTRY FxBool FX_CALL fxHalInitSLI(SstRegs *sst, SstRegs *sst1); - -FX_ENTRY FxBool FX_CALL fxHalVsync(SstRegs *sst); -FX_ENTRY FxBool FX_CALL fxHalVsyncNot(SstRegs *sst); - - - #define GET8(s) s - #define GET16(s) s - #define GET(s) s - #define SET8(d,s) d = s - #define SET16(d,s) d = s - #define SET(d,s) d = s - #define SETF(d,s) (*(float *)&(d)) = s - -//--------------------------------------------------------------------------- -// internal HAL stuff not meant for external use -//--------------------------------------------------------------------------- -#if defined(BUILD_HAL) || defined(BUILD_DIAGS) - -// GMT: Init code SET/GET always go thru subroutines (allows for P6 fencing) -#define IGET(A) fxHalRead32((FxU32 *) &(A)) -#define ISET(A,D) fxHalWrite32((FxU32 *) &(A), D) - -// this is the FAKE address where the hardware lives -// we use a large address so attempts to write to it get an access violation -// and it has 28 zero bits so that we can easily figure out the board number -// and the offset into the board -#define SST_FAKE_ADDRESS_MAKE(i) (SstRegs *)((i+1)<<28) -#define SST_FAKE_ADDRESS_GET_BOARD(a) ((((FxU32)a>>28)&0xF)-1) -#define SST_FAKE_ADDRESS_GET_OFFSET(a) ((FxU32)a&0x0FFFFFFF) -#define SST_FAKE_ADDRESS_GET_BASE(a) ((FxI32)a&~0x0FFFFFFF) - -extern HalInfo halInfo; - -// internal HAL routines -FxU32 fxHalRead32(FxU32 *addr); -void fxHalWrite32(FxU32 *addr, FxU32 data); - -FxBool fxHalIdleFBI( SstRegs *sst ); - -void fxHalResetBoardInfo( FxDeviceInfo *info ); -FxBool fxHalFillDeviceInfo( SstRegs *sst ); -// FxBool fxHalGetFbiInfo( SstRegs *sst, FxDeviceInfo *info ); -// FxBool fxHalGetTmuInfo( SstRegs *sst, FxDeviceInfo *info ); -FxBool fxHalVaddrToBoardNumber( SstRegs *sst, FxU32 *boardNumber ); - -// GUI interface -FX_ENTRY void FX_CALL guiNewViewWindow(FxU32 boardNumber, const char *name); -void guiReadMessageQueue(void); -FxBool guiOpen( FxU32 boardNumber ); -void guiShutdown( SstRegs *sst ); - -#endif /* BUILD_HAL */ - -#endif /* !__FXHAL_H__ */ diff --git a/glide2x/cvg/incsrc/gdebug.h b/glide2x/cvg/incsrc/gdebug.h deleted file mode 100644 index 0889b47..0000000 --- a/glide2x/cvg/incsrc/gdebug.h +++ /dev/null @@ -1,138 +0,0 @@ -/*-*-c++-*-*/ -#ifndef __GDEBUG_H__ -#define __GDEBUG_H__ - -/* -** 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 - -#if defined(FX_DLL_ENABLE) -#define FX_DLL_DEFINITION - -#endif -#include - -#define GDBG_MAX_LEVELS 512 - -#ifndef GETENV -#define GETENV(a) getenv(a) -#endif - -// if debug info turned on then GDBG_INFO does something -#ifdef GDBG_INFO_ON - -// Standard C provides no clean way to do this, but the GNU C tools do.. -#ifdef __GNUC__ - -#define GDBG_INFO(level, format, args...) \ - gdbg_info(level, format , ## args) -#define GDBG_INFO_MORE(level, format, args...) \ - gdbg_info_more(level, format , ## args) -#define GDBG_PRINTF(format, args...) \ - gdbg_printf(format , ## args) - -#else - -#define GDBG_INFO gdbg_info -#define GDBG_INFO_MORE gdbg_info_more -#define GDBG_PRINTF gdbg_printf - -#endif - -#define GDBG_ERROR_SET_CALLBACK gdbg_error_set_callback -#define GDBG_ERROR_CLEAR_CALLBACK gdbg_error_clear_callback - -#define GDBG_GET_DEBUGLEVEL gdbg_get_debuglevel -#define GDBG_SET_DEBUGLEVEL gdbg_set_debuglevel - -// otherwise GDBG_INFO does nothing -#else - -#if defined(__WATCOMC__) || defined(__WATCOM_CPLUSPLUS__) -/* Turn off the dead code warnings. Also changed the macro definitions - * to use an 'if' rather than the ternary operator because the - * type of the result sub-expressions must match. - * - * w111: Meaningless use of an expression - * w201: Unreachable code - */ -#pragma disable_message (111, 201) -#endif /* defined(__WATCOMC__) || defined(__WATCOM_CPLUSPLUS__) */ - -// Standard C provides no clean way to do this, but the GNU C tools do.. -#ifdef __GNUC__ - -#define GDBG_INFO(level, format, args...) -#define GDBG_INFO_MORE(level, format, args...) -#define GDBG_PRINTF(format, args...) - -#else - -#define GDBG_INFO 0 && (unsigned long) -#define GDBG_INFO_MORE 0 && (unsigned long) -#define GDBG_PRINTF 0 && (unsigned long) - -#define GDBG_ERROR_SET_CALLBACK 0 && (unsigned long) -#define GDBG_ERROR_CLEAR_CALLBACK 0 && (unsigned long) - -#endif - -#define GDBG_GET_DEBUGLEVEL(x) 0 -#define GDBG_SET_DEBUGLEVEL(a,b) - - -#endif - -#define GDBG_INIT gdbg_init -#define GDBG_SHUTDOWN gdbg_shutdown -#define GDBG_ERROR gdbg_error -#define GDBG_GET_ERRORS gdbg_get_errors -#define GDBG_SET_FILE gdbg_set_file - -FX_ENTRY void FX_CALL gdbg_init(void); -FX_ENTRY void FX_CALL gdbg_parse(const char *env); -FX_ENTRY void FX_CALL gdbg_shutdown(void); -FX_ENTRY void FX_CALL gdbg_vprintf(const char *format, va_list); -FX_ENTRY void FX_CALL gdbg_printf(const char *format, ...); -FX_ENTRY int FX_CALL gdbg_info(const int level, const char *format, ...); -FX_ENTRY int FX_CALL gdbg_info_more(const int level, const char *format, ...); -FX_ENTRY void FX_CALL gdbg_error(const char *name, const char *format, ...); -FX_ENTRY int FX_CALL gdbg_get_errors(void); -FX_ENTRY int FX_CALL gdbg_set_file(const char *name); -FX_ENTRY int FX_CALL gdbg_get_debuglevel(const int level); -FX_ENTRY void FX_CALL gdbg_set_debuglevel(const int level, const int value); - -// these routines allow for a library (like Glide) to get called back -typedef void (*GDBGErrorProc)(const char* const procName, - const char* const format, - va_list args); -FX_ENTRY int FX_CALL gdbg_error_set_callback(GDBGErrorProc p); -FX_ENTRY void FX_CALL gdbg_error_clear_callback(GDBGErrorProc p); - -// these routines allow for some GUI code to get called once in a while -// so that it can keep the UI alive by reading the message queue -typedef void (*GDBGKeepAliveProc)(int adjust); -FX_ENTRY void FX_CALL gdbg_set_keepalive(GDBGKeepAliveProc p); - -#endif /* !__GDEBUG_H__ */ diff --git a/glide2x/cvg/incsrc/h3.h b/glide2x/cvg/incsrc/h3.h deleted file mode 100644 index 19a3096..0000000 --- a/glide2x/cvg/incsrc/h3.h +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef __H3_H__ -#define __H3_H__ - -/* -** 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 <3dfx.h> -#include -#include -#include -#include -#include - -#endif /* !__H3_H__ */ diff --git a/glide2x/cvg/incsrc/makefile b/glide2x/cvg/incsrc/makefile deleted file mode 100644 index f57770c..0000000 --- a/glide2x/cvg/incsrc/makefile +++ /dev/null @@ -1,29 +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$ -# - -HEADERS=cvg.h cvgdefs.h cvginfo.h cvgregs.h fxhal.h gdebug.h h3.h sst1vid.h vxd.h - -INSTALL_DESTINATION=$(BUILD_ROOT)\cvg - -!include $(BUILD_ROOT_SWLIBS)/include/nmake/3dfx.mak - diff --git a/glide2x/cvg/incsrc/makefile.linux b/glide2x/cvg/incsrc/makefile.linux deleted file mode 100644 index fd733c1..0000000 --- a/glide2x/cvg/incsrc/makefile.linux +++ /dev/null @@ -1,29 +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$ -# - -HEADERS=$(wildcard *.h) - -INSTALL_DESTINATION=$(BUILD_ROOT)/cvg - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak - diff --git a/glide2x/cvg/incsrc/sst1vid.h b/glide2x/cvg/incsrc/sst1vid.h deleted file mode 100644 index 5112a0b..0000000 --- a/glide2x/cvg/incsrc/sst1vid.h +++ /dev/null @@ -1,112 +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$ -** -** 5 3/10/98 2:33p Psmith -** separating cvg tree from h3/h4 trees - * - * 4 9/09/97 7:35p Sellers - * Added 400x300 resolution - * - * 3 8/24/97 9:31a Sellers - * moved new video timing to sst1vid.h - * redefined 1600x1280 to be 1600x1200 - * - * 2 6/05/97 11:14p Pgj - * - * 5 7/24/96 3:43p Sellers - * added 512x384 @ 60 Hz for arcade monitors - * added 512x256 @ 60 Hz for arcade monitors - * - * 4 7/18/96 10:58a Sellers - * fixed FT and TF clock delay values for lower frequencies with - * .5/.5 combos - * - * 3 6/18/96 6:54p Sellers - * added sst1InitShutdownSli() to fix Glide Splash screen problems with - * SLI - * - * 2 6/13/96 7:45p Sellers - * added "voodoo.ini" support - * added DirectX support - * misc cleanup - * - * 2 6/11/96 1:43p Sellers - * added support for 60, 75, 85, and 120 Hz refresh rates for "most" - * resolutions - * - * 1 5/08/96 5:43p Paik - * Video definitions -*/ -#ifndef __SST1VID_H__ -#define __SST1VID_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Video defines */ - -typedef FxI32 GrScreenRefresh_t; -#define GR_REFRESH_60Hz 0x0 -#define GR_REFRESH_70Hz 0x1 -#define GR_REFRESH_72Hz 0x2 -#define GR_REFRESH_75Hz 0x3 -#define GR_REFRESH_80Hz 0x4 -#define GR_REFRESH_90Hz 0x5 -#define GR_REFRESH_100Hz 0x6 -#define GR_REFRESH_85Hz 0x7 -#define GR_REFRESH_120Hz 0x8 -#define GR_REFRESH_NONE 0xff - -typedef FxI32 GrScreenResolution_t; -#define GR_RESOLUTION_320x200 0x0 -#define GR_RESOLUTION_320x240 0x1 -#define GR_RESOLUTION_400x256 0x2 -#define GR_RESOLUTION_512x384 0x3 -#define GR_RESOLUTION_640x200 0x4 -#define GR_RESOLUTION_640x350 0x5 -#define GR_RESOLUTION_640x400 0x6 -#define GR_RESOLUTION_640x480 0x7 -#define GR_RESOLUTION_800x600 0x8 -#define GR_RESOLUTION_960x720 0x9 -#define GR_RESOLUTION_856x480 0xa -#define GR_RESOLUTION_512x256 0xb -#define GR_RESOLUTION_1024x768 0xC -#define GR_RESOLUTION_1280x1024 0xD -#define GR_RESOLUTION_1600x1200 0xE -#define GR_RESOLUTION_400x300 0xF -#define GR_RESOLUTION_NONE 0xff - -#ifdef GR_RESOLUTION_MAX -#undef GR_RESOLUTION_MAX -#endif -#ifdef GR_RESOLUTION_MIN -#undef GR_RESOLUTION_MIN -#endif -#define GR_RESOLUTION_MIN GR_RESOLUTION_320x200 -#define GR_RESOLUTION_MAX GR_RESOLUTION_1600x1200 - -#ifdef __cplusplus -} -#endif - -#endif /* __SST1VID_H__ */ diff --git a/glide2x/cvg/incsrc/vxd.h b/glide2x/cvg/incsrc/vxd.h deleted file mode 100644 index 02eedff..0000000 --- a/glide2x/cvg/incsrc/vxd.h +++ /dev/null @@ -1,39 +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$ -*/ - -#ifndef _VXD_H_ -#define _VXD_H_ - -#if defined(KERNEL) && !defined(KERNEL_NT) -#define WANTVXDWRAPS -#define DEBUG -#include -#include -#include -#include -#pragma VxD_LOCKED_CODE_SEG -//#pragma VxD_LOCKED_DATA_SEG -#endif /* #ifdef KERNEL */ - -#endif /* #ifndef _VXD_H_ */ diff --git a/glide2x/cvg/init/canopus.c b/glide2x/cvg/init/canopus.c deleted file mode 100644 index 701468b..0000000 --- a/glide2x/cvg/init/canopus.c +++ /dev/null @@ -1,182 +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$ -** -** Initialization code for initializing canpus cards w/ assymetric -** inter-chip buses. -** -*/ - -#ifdef _WIN32 -#pragma optimize ("",off) -#endif -#include -#include -#include -#ifdef BUILD_FOR_SST1 -#include -#else -#include <3dfx.h> -#include -#include -#endif -#define FX_DLL_DEFINITION -#include -#include -#include - -#include "canopus.h" - -/* - * Syntax: LarsF (8/2/97) - * sst1InitComputeClkParamsATT_Int(Frequ, *clkTiming); - * - *---------------------------------------------------------------------------- - * Description: - * Calculates the PLL Parameter for the given Frequency in Hz - * - * Input : Frequ - Frequency in Hz - * *clkTiming - pointer to timing structure - * Output: *clkTiming - pointer to timing structure which would be filled - * Return: 1 - Sucess, 0 - Error - */ -FxBool -sst1InitComputeClkParamsATT_Int(FFLOAT dwFreq, sst1ClkTimingStruct *clkTiming) -{ -#define MMAX (126+2) /* physical limit of the M parameter */ -#define NMID 18 /* PLL: middle N test range */ -#define NDELTA 15 /* PLL: +/- N test range */ -#define FI (14318180l) /* PLL: PLL frequenz in HZ */ - - FxU32 lPDiv, lRatio; - FxU16 sN, sM, sP; - FxU16 sNBest, sMBest; - FxU32 lError, lActual; - FxU32 lBestErr, lBestFreq; - - // first check range of Frequ - if ((dwFreq < 15000000) || (dwFreq > 240000000)) return FXFALSE; - - // get the best P divider for the given Frequency - if (dwFreq < 30000000) { - sP = 3; /* divide by 16 */ - lPDiv = 8; - } else if ( dwFreq < 60000000 ) { - sP = 2; /* divide by 8 */ - lPDiv = 4; - } else if ( dwFreq < 120000000 ) { - sP = 1; /* divide by 4 */ - lPDiv = 2; - } else { - sP = 0; /* divide by 1 */ - lPDiv = 1; - } - - // next find the best N/M combination - lBestErr = 99999999; - sNBest = 0; - sMBest = 0; - lRatio = (unsigned long)((dwFreq*10l)/(FI/100l)) * lPDiv; // lRatio in [1/1000] - for ( sN= (NMID-NDELTA); sN <= (NMID+NDELTA); sN++ ) { - sM = (unsigned short)((lRatio * sN + 500) / 1000l); - if (sM > MMAX) sM = MMAX; - - lActual = (unsigned long)((FI * sM) / (sN * lPDiv)); - lError = (lActual > dwFreq) ? (lActual - dwFreq) : (dwFreq - lActual); - if ( lError < lBestErr ) { - sNBest = sN; - sMBest = sM; - lBestErr = lError; - lBestFreq = lActual; - } /* if best */ - - /* increment M also */ - sM++; - if (sM > MMAX) sM = MMAX; - - lActual = (unsigned long)((FI * sM) / (sN * lPDiv)); - lError = (lActual > dwFreq) ? (lActual - dwFreq) : (dwFreq - lActual); - if ( lError < lBestErr) { - sNBest = sN; - sMBest = sM; - lBestErr = lError; - lBestFreq = lActual; - } /* if best */ - } /* for sN */ - - if(sNBest == 0) return(FXFALSE); - - sM = sMBest-2; - sN = sNBest-2; - - clkTiming->freq = (float)(dwFreq / 1000000.0f); - clkTiming->clkTiming_M = sM; - clkTiming->clkTiming_P = sP; - clkTiming->clkTiming_N = sN; - if(dwFreq < 37000000) { - clkTiming->clkTiming_L = 0xa; - clkTiming->clkTiming_IB = 0x6; - } else if(dwFreq < 45000000) { - clkTiming->clkTiming_L = 0xc; - clkTiming->clkTiming_IB = 0x4; - } else if(dwFreq < 58000000) { - clkTiming->clkTiming_L = 0x8; - clkTiming->clkTiming_IB = 0x4; - } else if(dwFreq < 66000000) { - clkTiming->clkTiming_L = 0xa; - clkTiming->clkTiming_IB = 0x6; - } else { - clkTiming->clkTiming_L = 0xa; - clkTiming->clkTiming_IB = 0x8; - } - - return FXTRUE; -} /* sst1InitComputeClkParamsATT_Int() */ - -/* -** sst1UsrSetGrxClk(): -** Initialize FBI and TREX Memory clocks to a user value -** NOTE: sst1InitCalcGrxClk() must be called prior to sst1InitGrxClk() -** NOTE: sst1InitGrxClk() resets the PCI fifo and the graphics subsystem of FBI -** -*/ -FxBool -sst1SetGrxClk_Canopus(FxU32* sstbase, FFLOAT grxclk) -{ - FxBool RetVal; - sst1ClkTimingStruct sstGrxClk; - - if(!sst1InitCheckBoard(sstbase)) - return(FXFALSE); - - if(!sst1InitComputeClkParamsATT_Int(grxclk * CLOCK_MULTIPLIER, &sstGrxClk)) - return(FXFALSE); - - sst1CurrentBoard->initGrxClkDone = 0; // Allow clk to be reset to user value. - - RetVal = sst1InitSetGrxClk(sstbase, &sstGrxClk); - - sst1CurrentBoard->initGrxClkDone = 0; // Allow clk to be set to the choosen value again - - return(RetVal); -} - diff --git a/glide2x/cvg/init/canopus.h b/glide2x/cvg/init/canopus.h deleted file mode 100644 index e9a3385..0000000 --- a/glide2x/cvg/init/canopus.h +++ /dev/null @@ -1,45 +0,0 @@ -/*-*-c++-*-*/ -/* -** 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$ -** -*/ - -#ifndef _CANOPUS_H_ -#define _CANOPUS_H_ - -// if we use FFLOAT as an integer, we need to handle clocks in Hz -#define CLOCK_MULTIPLIER 1000000L -typedef unsigned long FFLOAT; -typedef unsigned long DDOUBLE; - -/* FixMe!! Is this right? */ -#define CANOPUS_ID 0x10UL - -/* whacked.c */ -extern FxBool -sst1InitComputeClkParamsATT_Int(FFLOAT freq, sst1ClkTimingStruct* clkTiming); - -extern FxBool -sst1SetGrxClk_Canopus(FxU32* sstbase, FFLOAT grxclk); - -#endif /* _CANOPUS_H_ */ diff --git a/glide2x/cvg/init/dac.c b/glide2x/cvg/init/dac.c deleted file mode 100644 index f924bd2..0000000 --- a/glide2x/cvg/init/dac.c +++ /dev/null @@ -1,1374 +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$ -** -** Initialization code for initializing supported SST-1 DACs -** -*/ -#ifdef _WIN32 -#pragma optimize ("",off) -#endif -#include -#include -#include -#ifdef BUILD_FOR_SST1 -#include -#else -#include <3dfx.h> -#include -#include -#endif -#define FX_DLL_DEFINITION -#include -#include -#include - -#include "canopus.h" - -/* -** sst1InitDacRd(): -** Read external DAC registers -** NOTE: The video unit of FBI must be in reset before calling this routine. -** The rendering engines of FBI and TREX must be idle before calling -** this routine. -** fbiInit23 register remapping (PCI config. initEnable[2]=1) must be -** enabled before calling this routine -** -** Valid addresses are 0 <= addr <= 3 -** -*/ -FX_EXPORT FxU32 FX_CSTYLE sst1InitDacRd(FxU32 *sstbase, FxU32 addr) -{ - SstRegs *sst = (SstRegs *) sstbase; - FxU32 retVal; - static FxBool firstPass = FXTRUE; - static int helper; - - if(firstPass == FXTRUE) { - firstPass = FXFALSE; - helper = (GETENV(("SSTV2_DEBUGDAC"))) ? 1 : 0; - } - - ISET(sst->dacData, ((addr) << SST_DACDATA_ADDR_SHIFT) | SST_DACDATA_RD); - sst1InitIdleFBINoNOP(sstbase); - retVal = IGET(sst->fbiInit2) & SST_DACDATA_DATA; - if(helper) - INIT_PRINTF(("dacRd(0x%x,0x%x)\n", addr, retVal)); - - return(retVal); -} - -/* -** sst1InitDacWr(): -** Write to external DAC registers -** NOTE: The video unit of FBI must be in reset before calling this routine. -** The rendering engines of FBI and TREX must be idle before calling -** this routine. -** -** Valid addresses are 0 <= addr <= 3 -** -*/ -FX_EXPORT void FX_CSTYLE sst1InitDacWr(FxU32 *sstbase, FxU32 addr, FxU32 data) -{ - SstRegs *sst = (SstRegs *) sstbase; - static FxBool firstPass = FXTRUE; - static int helper; - - if(firstPass == FXTRUE) { - firstPass = FXFALSE; - helper = (GETENV(("SSTV2_DEBUGDAC"))) ? 1 : 0; - } - - ISET(sst->dacData, - (data & SST_DACDATA_DATA) | - ((addr) << SST_DACDATA_ADDR_SHIFT) | - SST_DACDATA_WR); - sst1InitIdleFBINoNOP(sstbase); - - if(helper) - INIT_PRINTF(("dacWr(0x%x,0x%x)\n", addr, data)); -} - -/* -** sst1InitExecuteDacRdWr(): -** Execute DAC read/write command sequence defined in "voodoo2.ini" file -** -*/ -FxBool sst1InitExecuteDacRdWr(FxU32 *sstbase, sst1InitDacRdWrStruct - *dacRdWrBase) -{ - sst1InitDacRdWrStruct *dacRdWrPtr = dacRdWrBase; - FxU32 data; - FxBool retVal = FXTRUE; - int helper = (GETENV(("SSTV2_DEBUGDAC"))) ? 1 : 0; - - while(dacRdWrPtr) { - if(dacRdWrPtr->type == DACRDWR_TYPE_WR) { - sst1InitDacWr(sstbase, dacRdWrPtr->addr, dacRdWrPtr->data); - } else if(dacRdWrPtr->type == DACRDWR_TYPE_RDMODWR) { - data = sst1InitDacRd(sstbase, dacRdWrPtr->addr); - if(helper) - INIT_PRINTF(("dacRdWr(Read=0x%x)\n", data)); - data &= dacRdWrPtr->mask; - sst1InitDacWr(sstbase, dacRdWrPtr->addr, (data | dacRdWrPtr->data)); - } else if(dacRdWrPtr->type == DACRDWR_TYPE_WRMOD_POP) { - data = iniStack[--iniStackPtr]; - if(iniStackPtr < 0) { - retVal = FXFALSE; - break; - } - if(helper) - INIT_PRINTF(("dacWrModPop(Stack=0x%x,Mask=0x%x)\n", data, - dacRdWrPtr->mask)); - data &= dacRdWrPtr->mask; - sst1InitDacWr(sstbase, dacRdWrPtr->addr, (data | dacRdWrPtr->data)); - } else if(dacRdWrPtr->type == DACRDWR_TYPE_RDNOCHECK) { - sst1InitDacRd(sstbase, dacRdWrPtr->addr); - } else if(dacRdWrPtr->type == DACRDWR_TYPE_RDPUSH) { - data = sst1InitDacRd(sstbase, dacRdWrPtr->addr); - iniStack[iniStackPtr++] = data; - if(iniStackPtr == DACRDWR_MAX_PUSH) { - retVal = FXFALSE; - break; - } - } else if(dacRdWrPtr->type == DACRDWR_TYPE_RDCHECK) { - if(sst1InitDacRd(sstbase, dacRdWrPtr->addr) != dacRdWrPtr->data) { - retVal = FXFALSE; - break; - } - } else { - retVal = FXFALSE; - break; - } - dacRdWrPtr = dacRdWrPtr->nextRdWr; - } - return(retVal); -} - -/* -** sst1InitDacDetect(): -** Detect type of on-board DAC -** NOTE: sst1InitDacDetect() resets the PCI fifo and the graphics subsystem -** of FBI -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitDacDetect(FxU32 * sstbase) -{ - FxU32 n; - FxU32 fbiInit1_save; - FxU32 fbiInit2_save; - SstRegs *sst = (SstRegs *) sstbase; - FxBool retVal = FXFALSE; - int helper = (GETENV(("SSTV2_DEBUGDAC"))) ? 1 : 0; - - if(!sst) - return(FXFALSE); - - if(helper) - INIT_PRINTF(("sst1InitDacDetect(): Entered...\n")); - - if (sst1InitCheckBoard(sstbase) == FXFALSE) - return (FXFALSE); - - /* check to see if we are a single board SLI slave, if - * so we have no dac... - */ - //if (sst1CurrentBoard->singleBrdSLISlave) { - // sst1CurrentBoard->fbiVideoDacType = SST_FBI_DACTYPE_PROXY; - // return FXTRUE; - //} - - sst1InitIdleFBINoNOP(sstbase); - - /* Save init register states before overwriting them */ - fbiInit1_save = IGET(sst->fbiInit1); - fbiInit2_save = IGET(sst->fbiInit2); - - /* Reset video unit to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_RESET); - /* Turn off dram refresh to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit2, IGET(sst->fbiInit2) & ~SST_EN_DRAM_REFRESH); - sst1InitIdleFBINoNOP(sstbase); - - /* Enable reads from the DAC (multiplexed on the fbiInit2 address) */ - /* Disallow writes to pass through the PCI FIFO */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, SST_INITWR_EN | SST_FBIINIT23_REMAP); - sst1InitIdleFBINoNOP(sstbase); - - if(sst1InitUseVoodooFile == FXTRUE) { - retVal = sst1InitDacDetectINI(sstbase); - } else { - if((retVal = sst1InitDacDetectICS(sstbase)) == FXTRUE) - goto done; - if((retVal = sst1InitDacDetectATT(sstbase)) == FXTRUE) - goto done; - retVal = sst1InitDacDetectTI(sstbase); - } - -done: - /* Disable fbiinit23 address remapping */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, SST_INITWR_EN | SST_PCI_FIFOWR_EN); - - /* Restore init register states */ - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit1, fbiInit1_save); - ISET(sst->fbiInit2, fbiInit2_save); - sst1InitIdleFBINoNOP(sstbase); - return(retVal); -} - -/* -** sst1InitDacDetectINI(): -** Detect DAC based on rules supplied in "voodoo2.ini" -** -*/ -FxBool sst1InitDacDetectINI(FxU32 * sstbase) -{ - sst1InitDacStruct *dacPtr; - FxU32 j; - FxBool retVal = FXFALSE; - - dacPtr = dacStructBase; - while(dacPtr) { - if(dacPtr->detect) { - /* Loop multiple times, as some DACs go into never-never land... */ - for(j=0; j<100; j++) { - if((retVal = sst1InitExecuteDacRdWr(sstbase, dacPtr->detect)) - == FXTRUE) { - iniDac = dacPtr; - break; - } - } - if(retVal == FXTRUE) - break; - } - dacPtr = dacPtr->nextDac; - } - return(retVal); -} - -FxBool sst1InitDacDetectATT(FxU32 * sstbase) -{ - FxU32 n, j, dacmir, dacdir; - int helper = (GETENV(("SSTV2_DEBUGDAC"))) ? 1 : 0; - - if(helper) - INIT_PRINTF(("sst1InitDacDetectATT(): Entered...\n")); - - /* Detect ATT */ - /* Sometimes the DACs seem to go into never-never land, so */ - /* try and initialize the DAC multiple times */ - n = 0; - while(1) { - if(++n > 100) - break; - - /* Must guarantee that no rendering is being performed */ - sst1InitIdleFBINoNOP(sstbase); - - /* Reset current state of DAC command register 0 (CR0) via the read */ - /* mask register (RMR) */ - sst1InitDacWr(sstbase, SST_DACREG_WMA, 0x0); /* reset backdoor fsm */ - sst1InitDacRd(sstbase, SST_DACREG_RMR); /* RMR must be read 5 times */ - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); /* Returns contents of CR0 */ - - /* Enable indexed programming by setting CR0[0] = 1 */ - sst1InitDacWr(sstbase, SST_DACREG_WMA, 0x0); /* reset backdoor fsm */ - sst1InitDacRd(sstbase, SST_DACREG_RMR); /* RMR must be read 4 times */ - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacWr(sstbase, SST_DACREG_RMR, - SST_DACREG_CR0_INDEXED_ADDRESSING | SST_DACREG_CR0_8BITDAC); - - /* NOW DAC IS IN INDEXED ADDRESS MODE... */ - - /* Check the manufacturing ID */ - j = 0; - DAC_INDEXWRADDR(SST_DACREG_INDEX_MIR); - dacmir = DAC_INDEXRD(); - if(dacmir == SST_DACREG_INDEX_MIR_ATT_DEFAULT) - j++; - else - continue; - - /* Check the device ID */ - DAC_INDEXWRADDR(SST_DACREG_INDEX_DIR); - dacdir = DAC_INDEXRD(); - if(dacmir == SST_DACREG_INDEX_MIR_ATT_DEFAULT && - dacdir == SST_DACREG_INDEX_DIR_ATT_DEFAULT) - j++; - else - continue; - if(j == 2) { - /* Found ATT DAC... */ - sst1CurrentBoard->fbiVideoDacType = SST_FBI_DACTYPE_ATT; - sst1InitIdleFBINoNOP(sstbase); - /* Disable indexed-mode addressing */ - sst1InitDacWr(sstbase, SST_DACREG_INDEXADDR, SST_DACREG_INDEX_CR0); - sst1InitDacWr(sstbase, SST_DACREG_INDEXDATA, - sst1InitDacRd(sstbase, SST_DACREG_INDEXDATA) & - ~SST_DACREG_CR0_INDEXED_ADDRESSING); - if(helper) - INIT_PRINTF(("sst1InitDacDetectATT(): Exiting...\n")); - return(FXTRUE); - } - } - if(helper) - INIT_PRINTF(("sst1InitDacDetectATT(): Exiting...\n")); - return(FXFALSE); -} - -FxBool sst1InitDacDetectTI(FxU32 * sstbase) -{ - FxU32 n, j, dacmir, dacdir; - int helper = (GETENV(("SSTV2_DEBUGDAC"))) ? 1 : 0; - - if(helper) - INIT_PRINTF(("sst1InitDacDetectTI(): Entered...\n")); - - /* Detect TI */ - /* Sometimes the DACs seem to go into never-never land, so */ - /* try and initialize the DAC multiple times */ - n = 0; - while(1) { - if(++n > 100) - break; - - /* Must guarantee that no rendering is being performed */ - sst1InitIdleFBINoNOP(sstbase); - - /* Reset current state of DAC command register 0 (CR0) via the read */ - /* mask register (RMR) */ - sst1InitDacWr(sstbase, SST_DACREG_WMA, 0x0); /* reset backdoor fsm */ - sst1InitDacRd(sstbase, SST_DACREG_RMR); /* RMR must be read 5 times */ - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); /* Returns contents of CR0 */ - - /* Enable indexed programming by setting CR0[0] = 1 */ - sst1InitDacWr(sstbase, SST_DACREG_WMA, 0x0); /* reset backdoor fsm */ - sst1InitDacRd(sstbase, SST_DACREG_RMR); /* RMR must be read 4 times */ - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacWr(sstbase, SST_DACREG_RMR, - SST_DACREG_CR0_INDEXED_ADDRESSING | SST_DACREG_CR0_8BITDAC); - - /* NOW DAC IS IN INDEXED ADDRESS MODE... */ - - /* Check the manufacturing ID */ - j = 0; - DAC_INDEXWRADDR(SST_DACREG_INDEX_MIR); - dacmir = DAC_INDEXRD(); - if(dacmir == SST_DACREG_INDEX_MIR_TI_DEFAULT) - j++; - else - continue; - - /* Check the device ID */ - DAC_INDEXWRADDR(SST_DACREG_INDEX_DIR); - dacdir = DAC_INDEXRD(); - if(dacmir == SST_DACREG_INDEX_MIR_TI_DEFAULT && - dacdir == SST_DACREG_INDEX_DIR_TI_DEFAULT) - j++; - else - continue; - if(j == 2) { - /* Found TI DAC... */ - sst1CurrentBoard->fbiVideoDacType = SST_FBI_DACTYPE_TI; - sst1InitIdleFBINoNOP(sstbase); - /* Disable indexed-mode addressing */ - sst1InitDacWr(sstbase, SST_DACREG_INDEXADDR, SST_DACREG_INDEX_CR0); - sst1InitDacWr(sstbase, SST_DACREG_INDEXDATA, - sst1InitDacRd(sstbase, SST_DACREG_INDEXDATA) & - ~SST_DACREG_CR0_INDEXED_ADDRESSING); - if(helper) - INIT_PRINTF(("sst1InitDacDetectTI(): Exiting...\n")); - return(FXTRUE); - } - } - if(helper) - INIT_PRINTF(("sst1InitDacDetectTI(): Exiting...\n")); - return(FXFALSE); -} - -FxBool sst1InitDacDetectICS(FxU32 * sstbase) -{ - FxU32 n; - int helper = (GETENV(("SSTV2_DEBUGDAC"))) ? 1 : 0; - - if(helper) - INIT_PRINTF(("sst1InitDacDetectICS(): Entered...\n")); - - /* Detect ICS... */ - /* Sometimes the DACs seem to go into never-never land, so */ - /* try and initialize the DAC multiple times */ - n = 0; - while(1) { - FxU32 gclk1, vclk1, vclk7; - - if(++n > 100) - break; - /* Must guarantee that no rendering is being performed */ - sst1InitIdleFBINoNOP(sstbase); - - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_RD, - SST_DACREG_ICS_PLLADDR_GCLK1); - gclk1 = sst1InitDacRd(sstbase, SST_DACREG_ICS_PLLADDR_DATA); - sst1InitDacRd(sstbase, SST_DACREG_ICS_PLLADDR_DATA); - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_RD, - SST_DACREG_ICS_PLLADDR_VCLK1); - vclk1 = sst1InitDacRd(sstbase, SST_DACREG_ICS_PLLADDR_DATA); - sst1InitDacRd(sstbase, SST_DACREG_ICS_PLLADDR_DATA); - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_RD, - SST_DACREG_ICS_PLLADDR_VCLK7); - vclk7 = sst1InitDacRd(sstbase, SST_DACREG_ICS_PLLADDR_DATA); - sst1InitDacRd(sstbase, SST_DACREG_ICS_PLLADDR_DATA); - if((gclk1 == SST_DACREG_ICS_PLLADDR_GCLK1_DEFAULT) && - (vclk1 == SST_DACREG_ICS_PLLADDR_VCLK1_DEFAULT) && - (vclk7 == SST_DACREG_ICS_PLLADDR_VCLK7_DEFAULT)) { - /* found ICS DAC... */ - sst1CurrentBoard->fbiVideoDacType = SST_FBI_DACTYPE_ICS; - if(helper) - INIT_PRINTF(("sst1InitDacDetectICS(): Exiting...\n")); - return(FXTRUE); - } - } - - - if(helper) - INIT_PRINTF(("sst1InitDacDetectICS(): Exiting...\n")); - return(FXFALSE); -} - -/* -** sst1InitCalcGrxClk(): -** Determine graphics clock frequency -** NOTE: sst1InitCalcGrxClk() must be called prior to sst1InitGrxClk() -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitCalcGrxClk(FxU32 *sstbase) -{ - FxU32 clkFreq; - SstRegs *sst = (SstRegs *) sstbase; - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - if(GETENV(("SSTV2_GRXCLK"))) { - INIT_PRINTF(("sst1InitCalcGrxClk(): Overriding default clk frequency with SST_GRXCLK\n")); - clkFreq = ATOI(GETENV(("SSTV2_GRXCLK"))); - if(clkFreq < 16) - clkFreq = 16; - } else { - if(sst1CurrentBoard->numberTmus == 1 && - sst1CurrentBoard->fbiMemSize == 2 && - sst1CurrentBoard->tmuMemSize[0] == 2) - clkFreq = 83; - else - // clkFreq = 50 + (value of fb_data[63:58] latched during reset) - clkFreq = 50 + ((IGET(sst->fbiInit7) >> 2) & 0x3f); - } - sst1CurrentBoard->fbiGrxClkFreq = clkFreq; - sst1CurrentBoard->tmuGrxClkFreq = clkFreq; - return(FXTRUE); -} - -/* -** sst1InitGrxClk(): -** Initialize FBI and TREX Memory clocks -** NOTE: sst1InitCalcGrxClk() must be called prior to sst1InitGrxClk() -** NOTE: sst1InitGrxClk() resets the PCI fifo and the graphics subsystem of FBI -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitGrxClk(FxU32 *sstbase) -{ - sst1ClkTimingStruct sstGrxClk; - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - if(sst1CurrentBoard->initGrxClkDone) - return(FXTRUE); - sst1CurrentBoard->initGrxClkDone = 1; - - INIT_PRINTF(("sst1InitGrxClk(): Setting up %d MHz Graphics Clock...\n", - sst1CurrentBoard->fbiGrxClkFreq)); - if(sst1CurrentBoard->sliDetected) { - sst1CurrentBoard->fbiGrxClkFreq -= 5; - sst1CurrentBoard->tmuGrxClkFreq -= 5; - } - if(sst1InitComputeClkParams((float) sst1CurrentBoard->fbiGrxClkFreq, - &sstGrxClk) == FXFALSE) - return(FXFALSE); - - return(sst1InitSetGrxClk(sstbase, &sstGrxClk)); -} - -/* -** sst1InitComputeClkParams(): -** Compute PLL parameters for given clock frequency -** -*/ -FX_EXPORT FxBool FX_CSTYLE -sst1InitComputeClkParams(float freq, sst1ClkTimingStruct* clkTiming) -{ - /* If we're using a canopus board then we need to use the - * integer-ized version of the clock parameter computation. This - * only supports the att dac. - * - * NB: The bits in fbiInit5 are only moderatly documented as being - * the value of the power-on strapping bits. fbiInit5[8:5] is what - * sst1GetFbiInfo uses to set the internal fbiBoardID, but the - * canopus board currently does not seem to have these set to - * anything while other boards (including the reference design) - * return non-zero values. - * - * NB: There is also a possible race condition here in reading these - * bits before the hw is actually reset. I don't think it could - * happen, but the value could be whacky if the hw was in some - * really horrible state when this is called to set the initial - * clock to 16mhz before doing the rest of the reset. - */ - sst1CurrentBoard->fbiBoardID = ((IGET(sst1CurrentBoard->virtAddr[0]->fbiInit5) >> 0x05UL) & 0x0FUL); - if (sst1CurrentBoard->fbiBoardID == CANOPUS_ID) { - return sst1InitComputeClkParamsATT_Int((FFLOAT)(freq * CLOCK_MULTIPLIER), clkTiming); - } else if(sst1CurrentBoard->fbiVideoDacType == SST_FBI_DACTYPE_TI) { - return sst1InitComputeClkParamsTI(freq, clkTiming); - } else if (sst1CurrentBoard->fbiVideoDacType == SST_FBI_DACTYPE_PROXY) { - FxU32 i; - FxBool retval; - sst1DeviceInfoStruct *saveBoard; - - /* if we are a single board SLI (proxy dac) we need to do all changes - * to the master's dac, since it's also ours... - */ - for (i=0;i 0) && (&sst1BoardInfo[i] == sst1CurrentBoard)) { - saveBoard = sst1CurrentBoard; - sst1CurrentBoard = &sst1BoardInfo[i-1]; - retval = sst1InitComputeClkParams(freq, clkTiming); - sst1CurrentBoard = saveBoard; - } - } - - return retval; - } else { - return sst1InitComputeClkParamsATT(freq, clkTiming); - } -} - -/* -** sst1InitComputeClkParamsATT(): -** Compute PLL parameters for given clock frequency (ATT DACs) -** -*/ -FxBool sst1InitComputeClkParamsATT(float freq, sst1ClkTimingStruct - *clkTiming) -{ - float vcoFreqDivide, freqMultRatio, clkError; - float clkErrorMin; - FxU32 p, n, m, nPlusTwo; - int mPlusTwo; - - /* Calculate P parameter */ - p = 4; - if(((freq * (float) 1.) >= (float) 120.) && - ((freq * (float) 1.) <= (float) 240.)) { - vcoFreqDivide = (float) 1.; - p = 0; - } - if(((freq * (float) 2.) >= (float) 120.) && - ((freq * (float) 2.) <= (float) 240.)) { - vcoFreqDivide = (float) 2.; - p = 1; - } - if(((freq * (float) 4.) >= (float) 120.) && - ((freq * (float) 4.) <= (float) 240.)) { - vcoFreqDivide = (float) 4.; - p = 2; - } - if(((freq * (float) 8.) >= (float) 120.) && - ((freq * (float) 8.) <= (float) 240.)) { - vcoFreqDivide = (float) 8.; - p = 3; - } - if(p > 3) - return(FXFALSE); - - /* Divide by 14.318 */ - freqMultRatio = (freq * vcoFreqDivide) * (float) 0.06984216; - - /* Calculate proper N and M parameters which yield the lowest error */ - clkErrorMin = (float) 9999.; n = 0; - for(nPlusTwo = 3; nPlusTwo < 32; nPlusTwo++) { -#ifdef DIRECTX - mPlusTwo = FTOL( (((float) nPlusTwo * freqMultRatio) + (float) 0.5) ); - clkError = ((float) mPlusTwo * ITOF_INV( nPlusTwo ) ) - freqMultRatio; -#else - mPlusTwo = (int) (((float) nPlusTwo * freqMultRatio) + (float) 0.5); - clkError = ((float) mPlusTwo / (float) nPlusTwo) - freqMultRatio; -#endif - if(clkError < (float) 0.0) - clkError = -clkError; - if((clkError < clkErrorMin) && ((mPlusTwo - 2) < 127)) { - clkErrorMin = clkError; - n = nPlusTwo - 2; - m = mPlusTwo - 2; - } - } - if(n == 0) - return(FXFALSE); - - clkTiming->freq = freq; - clkTiming->clkTiming_M = m; - clkTiming->clkTiming_P = p; - clkTiming->clkTiming_N = n; - if(freq < (float) 37.) { - clkTiming->clkTiming_L = 0xa; - clkTiming->clkTiming_IB = 0x6; - } else if(freq < (float) 45.) { - clkTiming->clkTiming_L = 0xc; - clkTiming->clkTiming_IB = 0x4; - } else if(freq < (float) 58.) { - clkTiming->clkTiming_L = 0x8; - clkTiming->clkTiming_IB = 0x4; - } else if(freq < (float) 66.) { - clkTiming->clkTiming_L = 0xa; - clkTiming->clkTiming_IB = 0x6; - } else { - clkTiming->clkTiming_L = 0xa; - clkTiming->clkTiming_IB = 0x8; - } -#if 0 - { - float calc; - - calc = ((float) 14.318 * (float) (m + 2)) / - ((float) (n + 2) * vcoFreqDivide); - printf("freq:%.3f calc:%.3f\n", freq, calc); - printf("m:%d p:%d n:%d\n", m, p, n); - fflush(stdout); - } -#endif - return(FXTRUE); -} - -/* -** sst1InitComputeClkParamsTI(): -** Compute PLL parameters for given clock frequency (TI DACs) -** -*/ -FxBool sst1InitComputeClkParamsTI(float freq, sst1ClkTimingStruct - *clkTiming) -{ - float clkError, clkErrorMin; - FxU32 p, n, m, pBest, nBest, mBest; - float lowVCO, highVCO; - - //lowVCO = (float) 120.; highVCO = (float) 240.; - lowVCO = (float) 80.; highVCO = (float) 150.; - - /* Loop through all the possible combinations and find the frequency - with the least error */ - clkErrorMin = (float) 9999.; nBest = 9999; - for(p=0; p<4; p++) { - for(m=0; m<64; m++) { - for(n=0; n<5; n++) { - float clkFreq, vcoFreq; - float pFreqDivide; - float mPlusTwo = (float) m + (float) 2.0; - float nPlusTwo = (float) n + (float) 2.0; - - if(p == 0) pFreqDivide = (float) 1.0; - else if(p == 1) pFreqDivide = (float) 2.0; - else if(p == 2) pFreqDivide = (float) 4.0; - else pFreqDivide = (float) 8.0; - - clkFreq = ((float) 14.31818 * mPlusTwo) / (nPlusTwo * pFreqDivide); - vcoFreq = ((float) 14.31818 * mPlusTwo) / (nPlusTwo); - clkError = freq - clkFreq; - if(clkError < (float) 0.0) - clkError = -clkError; - if(clkError < clkErrorMin && vcoFreq >= lowVCO && - vcoFreq <= highVCO) { - clkErrorMin = clkError; - pBest = p; - mBest = m; - nBest = n; - } - } - } - } - - if(nBest == 9999) return(FXFALSE); - - clkTiming->freq = freq; - clkTiming->clkTiming_M = mBest; - clkTiming->clkTiming_P = pBest; - clkTiming->clkTiming_N = nBest; - // L and IB params are not used by TI DACs... - clkTiming->clkTiming_L = 0; - clkTiming->clkTiming_IB = 0; - -#if 0 - { - float clkFreq, vcoFreq, pFreqDivide; - - if(clkTiming->clkTiming_P == 0) pFreqDivide = (float) 1.0; - else if(clkTiming->clkTiming_P == 1) pFreqDivide = (float) 2.0; - else if(clkTiming->clkTiming_P == 2) pFreqDivide = (float) 4.0; - else pFreqDivide = (float) 8.0; - - clkFreq = ((float) 14.31818 * (float) (clkTiming->clkTiming_M + 2)) / - ((float) (clkTiming->clkTiming_N + 2) * pFreqDivide); - vcoFreq = ((float) 14.31818 * (float) (clkTiming->clkTiming_M + 2)) / - ((float) (clkTiming->clkTiming_N + 2)); - - printf("freq:%.3f calc:%.3f\n", freq, clkFreq); - printf("m:%d p:%d n:%d vco:%.2f\n", clkTiming->clkTiming_M, - clkTiming->clkTiming_P, clkTiming->clkTiming_N, vcoFreq); - printf("lowVCO:%.2f highVCO:%.2f\n", lowVCO, highVCO); - fflush(stdout); - } -#endif - return(FXTRUE); -} - -/* -** sst1InitSetVidClkATT(): -** Set video clock for ATT Dacs -** -*/ -FxBool sst1InitSetVidClkATT(FxU32 *sstbase, sst1ClkTimingStruct - *sstVidClk) -{ - if(sst1InitDacIndexedEnable(sstbase, 1) == FXFALSE) - return(FXFALSE); - - DAC_INDEXWRADDR(SST_DACREG_INDEX_AD0); - DAC_INDEXWR((sstVidClk->clkTiming_M) << SST_DACREG_CLKREG_MSHIFT); - DAC_INDEXWRADDR(SST_DACREG_INDEX_AD1); - DAC_INDEXWR(((sstVidClk->clkTiming_P) << SST_DACREG_CLKREG_PSHIFT) | - ((sstVidClk->clkTiming_N) - << SST_DACREG_CLKREG_NSHIFT)); - DAC_INDEXWRADDR(SST_DACREG_INDEX_AD2); - DAC_INDEXWR(((sstVidClk->clkTiming_L) << SST_DACREG_CLKREG_LSHIFT) | - ((sstVidClk->clkTiming_IB) << SST_DACREG_CLKREG_IBSHIFT)); - DAC_INDEXWRADDR(SST_DACREG_INDEX_CC); - DAC_INDEXWR((DAC_INDEXRD() | (0x3 << SST_DACREG_CC_ACLK_SEL_SHIFT) | - SST_DACREG_CC_ACLK_SELECT_AD)); - DAC_INDEXWRADDR(SST_DACREG_INDEX_CC); - - if(sst1InitDacIndexedEnable(sstbase, 0) == FXFALSE) - return(FXFALSE); - - return(FXTRUE); -} - -/* -** sst1InitSetVidClkICS(): -** Set video clock for ICS Dacs -** -*/ -FxBool sst1InitSetVidClkICS(FxU32 *sstbase, sst1ClkTimingStruct - *sstVidClk) -{ - FxU32 n, fbiInit1_save, fbiInit2_save, pllCtrl, cfgInitEnable; - SstRegs *sst = (SstRegs *) sstbase; - - sst1InitIdleFBINoNOP(sstbase); - - /* Save init register states before overwriting them */ - fbiInit1_save = IGET(sst->fbiInit1); - fbiInit2_save = IGET(sst->fbiInit2); - - /* Reset video unit to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_RESET); - /* Turn off dram refresh to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit2, IGET(sst->fbiInit2) & ~SST_EN_DRAM_REFRESH); - sst1InitIdleFBINoNOP(sstbase); - - /* Enable reads from the DAC (multiplexed on the fbiInit2 address) */ - /* Disallow writes to pass through the PCI FIFO */ - PCICFG_RD(SST1_PCI_INIT_ENABLE, cfgInitEnable); - PCICFG_WR(SST1_PCI_INIT_ENABLE, cfgInitEnable | SST_FBIINIT23_REMAP); - sst1InitIdleFBINoNOP(sstbase); - - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_RD, - SST_DACREG_ICS_PLLADDR_CTRL); - pllCtrl = sst1InitDacRd(sstbase, SST_DACREG_ICS_PLLADDR_DATA); - - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_WR, - SST_DACREG_ICS_PLLADDR_VCLK0); - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_DATA, - sstVidClk->clkTiming_M); - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_DATA, - (((sstVidClk->clkTiming_P) << 5) | sstVidClk->clkTiming_N)); - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_WR, - SST_DACREG_ICS_PLLADDR_CTRL); - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_DATA, - ((pllCtrl & ~SST_DACREG_ICS_PLLCTRL_CLK0FREQ) | - SST_DACREG_ICS_PLLCTRL_CLK0SEL)); - sst1InitIdleFBINoNOP(sstbase); - - /* Disable fbiinit23 address remapping */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, cfgInitEnable); - - /* Restore init register states */ - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit1, fbiInit1_save); - ISET(sst->fbiInit2, fbiInit2_save); - sst1InitIdleFBINoNOP(sstbase); - - return(FXTRUE); -} - -/* -** sst1InitSetVidClkINI(): -** Set video clock for DACs defined in "voodoo2.ini" -** -*/ -FxBool sst1InitSetVidClkINI(FxU32 *sstbase, FxU32 width, - FxU32 height, FxU32 refresh, FxU32 video16BPP) -{ - FxU32 n, fbiInit1_save, fbiInit2_save, cfgInitEnable; - sst1InitDacSetVideoStruct *setVideo; - SstRegs *sst = (SstRegs *) sstbase; - int helper = (GETENV(("SSTV2_DEBUGDAC"))) ? 1 : 0; - FxBool retVal = FXFALSE; - - if(helper) - INIT_PRINTF(("sst1InitSetVidClkINI(): Entered...\n")); - - if(iniDac == (sst1InitDacStruct *) NULL) - return(FXFALSE); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - sst1InitIdleFBINoNOP(sstbase); - - /* Save init register states before overwriting them */ - fbiInit1_save = IGET(sst->fbiInit1); - fbiInit2_save = IGET(sst->fbiInit2); - - /* Reset video unit to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_RESET); - /* Turn off dram refresh to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit2, IGET(sst->fbiInit2) & ~SST_EN_DRAM_REFRESH); - sst1InitIdleFBINoNOP(sstbase); - - /* Enable reads from the DAC (multiplexed on the fbiInit2 address) */ - /* Disallow writes to pass through the PCI FIFO */ - PCICFG_RD(SST1_PCI_INIT_ENABLE, cfgInitEnable); - PCICFG_WR(SST1_PCI_INIT_ENABLE, cfgInitEnable | SST_FBIINIT23_REMAP); - sst1InitIdleFBINoNOP(sstbase); - - setVideo = iniDac->setVideo; - while(setVideo) { - if((setVideo->width == width) && (setVideo->height == height) && - (setVideo->refresh == refresh) && - (setVideo->video16BPP == video16BPP)) { - if((retVal = sst1InitExecuteDacRdWr(sstbase, - setVideo->setVideoRdWr)) == FXTRUE) { - retVal = FXTRUE; - break; - } - } - setVideo = setVideo->nextSetVideo; - } - - /* Disable fbiinit23 address remapping */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, cfgInitEnable); - - /* Restore init register states */ - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit1, fbiInit1_save); - ISET(sst->fbiInit2, fbiInit2_save); - sst1InitIdleFBINoNOP(sstbase); - - return(retVal); -} - -/* -** sst1InitSetGrxClkATT(): -** Set graphics clock for ATT Dacs -** NOTE: sst1InitSetGrxClkATT() resets the PCI fifo and the graphics subsystem -** of FBI -** -*/ -FxBool sst1InitSetGrxClkATT(FxU32 *sstbase, sst1ClkTimingStruct - *sstGrxClk) -{ - FxU32 n; - SstRegs *sst = (SstRegs *) sstbase; - - /* Reset graphics unit before we change grx clk */ - ISET(sst->fbiInit0, IGET(sst->fbiInit0) | - (SST_GRX_RESET | SST_PCI_FIFO_RESET)); - sst1InitIdleFBINoNOP(sstbase); - - /* Enable DAC indexed addressing */ - /* sst1InitDacIndexedEnable resets the video module, turns off dram refresh */ - /* and disallows writes to the PCI fifo */ - if(sst1InitDacIndexedEnable(sstbase, 1) == FXFALSE) - return(FXFALSE); - - DAC_INDEXWRADDR(SST_DACREG_INDEX_BD0); - DAC_INDEXWR((sstGrxClk->clkTiming_M) << SST_DACREG_CLKREG_MSHIFT); - DAC_INDEXWRADDR(SST_DACREG_INDEX_BD1); - DAC_INDEXWR(((sstGrxClk->clkTiming_P) << SST_DACREG_CLKREG_PSHIFT) | - ((sstGrxClk->clkTiming_N) << SST_DACREG_CLKREG_NSHIFT)); - DAC_INDEXWRADDR(SST_DACREG_INDEX_BD2); - DAC_INDEXWR(((sstGrxClk->clkTiming_L) << SST_DACREG_CLKREG_LSHIFT) | - ((sstGrxClk->clkTiming_IB) << SST_DACREG_CLKREG_IBSHIFT)); - DAC_INDEXWRADDR(SST_DACREG_INDEX_CC); - DAC_INDEXWR((DAC_INDEXRD() | (0x3 << SST_DACREG_CC_BCLK_SEL_SHIFT) | - SST_DACREG_CC_BCLK_SELECT_BD)); - sst1InitIdleFBINoNOP(sstbase); - - /* Turn off DAC indexed addressing */ - - /* Disabling dac indexed mode re-enables writes to pass through the */ - /* PCI fifo (and restores video refresh and dram refresh if previously */ - /* enabled) */ - if(sst1InitDacIndexedEnable(sstbase, 0) == FXFALSE) - return(FXFALSE); - - /* Wait for graphics clock to stabilize */ - for(n=0; n<200000; n++) - sst1InitReturnStatus(sstbase); - - /* Unreset PCI FIFO and graphic subsystem */ - ISET(sst->fbiInit0, IGET(sst->fbiInit0) & ~SST_PCI_FIFO_RESET); - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit0, IGET(sst->fbiInit0) & ~SST_GRX_RESET); - sst1InitIdleFBINoNOP(sstbase); - - return(FXTRUE); -} - -/* -** sst1InitSetGrxClkICS(): -** Set graphics clock for ICS Dacs -** NOTE: sst1InitSetGrxClkICS() resets the PCI fifo and the graphics subsystem -** of FBI -** -*/ -FxBool sst1InitSetGrxClkICS(FxU32 *sstbase, sst1ClkTimingStruct - *sstGrxClk) -{ - FxU32 n, fbiInit1_save, fbiInit2_save, pllCtrl, cfgInitEnable; - SstRegs *sst = (SstRegs *) sstbase; - - /* Reset graphics unit before we change grx clk */ - ISET(sst->fbiInit0, IGET(sst->fbiInit0) | - (SST_GRX_RESET | SST_PCI_FIFO_RESET)); - sst1InitIdleFBINoNOP(sstbase); - - /* Save init register states before overwriting them */ - fbiInit1_save = IGET(sst->fbiInit1); - fbiInit2_save = IGET(sst->fbiInit2); - - /* Reset video unit to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_RESET); - /* Turn off dram refresh to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit2, IGET(sst->fbiInit2) & ~SST_EN_DRAM_REFRESH); - sst1InitIdleFBINoNOP(sstbase); - - /* Enable reads from the DAC (multiplexed on the fbiInit2 address) */ - /* Disallow writes to pass through the PCI FIFO */ - PCICFG_RD(SST1_PCI_INIT_ENABLE, cfgInitEnable); - PCICFG_WR(SST1_PCI_INIT_ENABLE, cfgInitEnable | SST_FBIINIT23_REMAP); - sst1InitIdleFBINoNOP(sstbase); - - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_RD, - SST_DACREG_ICS_PLLADDR_CTRL); - pllCtrl = sst1InitDacRd(sstbase, SST_DACREG_ICS_PLLADDR_DATA); - - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_WR, - SST_DACREG_ICS_PLLADDR_GCLK0); - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_DATA, - sstGrxClk->clkTiming_M); - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_DATA, - (((sstGrxClk->clkTiming_P) << 5) | sstGrxClk->clkTiming_N)); - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_WR, - SST_DACREG_ICS_PLLADDR_CTRL); - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_DATA, - (pllCtrl & ~SST_DACREG_ICS_PLLCTRL_CLK1SEL)); - sst1InitIdleFBINoNOP(sstbase); - - /* Disable fbiinit23 address remapping */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, cfgInitEnable); - - /* Restore init register states */ - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit1, fbiInit1_save); - ISET(sst->fbiInit2, fbiInit2_save); - sst1InitIdleFBINoNOP(sstbase); - - /* Wait for graphics clock to stabilize */ - for(n=0; n<200000; n++) - sst1InitReturnStatus(sstbase); - - /* Unreset PCI FIFO and graphic subsystem */ - ISET(sst->fbiInit0, IGET(sst->fbiInit0) & ~SST_PCI_FIFO_RESET); - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit0, IGET(sst->fbiInit0) & ~SST_GRX_RESET); - sst1InitIdleFBINoNOP(sstbase); - - return(FXTRUE); -} - -/* -** sst1InitSetGrxClkINI(): -** Set graphics clock for dac specified in "voodoo2.ini" file -** NOTE: sst1InitSetGrxClkINI() resets the PCI fifo and the graphics subsystem -** of FBI -** -*/ -FxBool sst1InitSetGrxClkINI(FxU32 *sstbase, sst1ClkTimingStruct - *sstGrxClk) -{ - FxU32 n, fbiInit1_save, fbiInit2_save, cfgInitEnable; - sst1InitDacSetMemClkStruct *setMemClk; - FxBool retVal = FXFALSE; - SstRegs *sst = (SstRegs *) sstbase; - - if(iniDac == (sst1InitDacStruct *) NULL) - return(FXFALSE); - - /* Reset graphics unit before we change grx clk */ - ISET(sst->fbiInit0, IGET(sst->fbiInit0) | - (SST_GRX_RESET | SST_PCI_FIFO_RESET)); - sst1InitIdleFBINoNOP(sstbase); - - /* Save init register states before overwriting them */ - fbiInit1_save = IGET(sst->fbiInit1); - fbiInit2_save = IGET(sst->fbiInit2); - - /* Reset video unit to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_RESET); - /* Turn off dram refresh to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit2, IGET(sst->fbiInit2) & ~SST_EN_DRAM_REFRESH); - sst1InitIdleFBINoNOP(sstbase); - - /* Enable reads from the DAC (multiplexed on the fbiInit2 address) */ - /* Disallow writes to pass through the PCI FIFO */ - PCICFG_RD(SST1_PCI_INIT_ENABLE, cfgInitEnable); - PCICFG_WR(SST1_PCI_INIT_ENABLE, cfgInitEnable | SST_FBIINIT23_REMAP); - sst1InitIdleFBINoNOP(sstbase); - - setMemClk = iniDac->setMemClk; - while(setMemClk) { - if(setMemClk->frequency == (FxU32) sstGrxClk->freq) { - if((retVal = sst1InitExecuteDacRdWr(sstbase, - setMemClk->setMemClkRdWr)) == FXTRUE) { - retVal = FXTRUE; - break; - } - } - setMemClk = setMemClk->nextSetMemClk; - } - /* Disable fbiinit23 address remapping */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, cfgInitEnable); - - /* Restore init register states */ - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit1, fbiInit1_save); - - ISET(sst->fbiInit2, fbiInit2_save); - sst1InitIdleFBINoNOP(sstbase); - - /* Wait for graphics clock to stabilize */ - if(retVal == FXTRUE) { - for(n=0; n<200000; n++) - sst1InitReturnStatus(sstbase); - } - - /* Unreset PCI FIFO and graphic subsystem */ - ISET(sst->fbiInit0, IGET(sst->fbiInit0) & ~SST_PCI_FIFO_RESET); - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit0, IGET(sst->fbiInit0) & ~SST_GRX_RESET); - sst1InitIdleFBINoNOP(sstbase); - - return(retVal); -} - -/* -** sst1InitSetVidModeATT(): -** Set video Mode for ATT dacs -** -*/ -FxBool sst1InitSetVidModeATT(FxU32 *sstbase, FxU32 video16BPP) -{ - if(sst1InitDacIndexedEnable(sstbase, 1) == FXFALSE) - return(FXFALSE); - - /* Set 16 or 24-bit pixel output */ - if(video16BPP) { - DAC_INDEXWRADDR(SST_DACREG_INDEX_CR0); - DAC_INDEXWR((DAC_INDEXRD() & ~SST_DACREG_CR0_COLOR_MODE) | - SST_DACREG_CR0_COLOR_MODE_16BPP | SST_DACREG_CR0_8BITDAC); - } else { - DAC_INDEXWRADDR(SST_DACREG_INDEX_CR0); - DAC_INDEXWR((DAC_INDEXRD() & ~SST_DACREG_CR0_COLOR_MODE) | - SST_DACREG_CR0_COLOR_MODE_24BPP | SST_DACREG_CR0_8BITDAC); - } - - if(sst1InitDacIndexedEnable(sstbase, 0) == FXFALSE) - return(FXFALSE); - - - return(FXTRUE); -} - -/* -** sst1InitSetVidModeICS(): -** Set video Mode for ICS dacs -** -*/ -FxBool sst1InitSetVidModeICS(FxU32 *sstbase, FxU32 video16BPP) -{ - FxU32 n, fbiInit1_save, fbiInit2_save, cfgInitEnable; - SstRegs *sst = (SstRegs *) sstbase; - - sst1InitIdleFBINoNOP(sstbase); - - /* Save init register states before overwriting them */ - fbiInit1_save = IGET(sst->fbiInit1); - fbiInit2_save = IGET(sst->fbiInit2); - - /* Reset video unit to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_RESET); - /* Turn off dram refresh to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit2, IGET(sst->fbiInit2) & ~SST_EN_DRAM_REFRESH); - sst1InitIdleFBINoNOP(sstbase); - - /* Enable reads from the DAC (multiplexed on the fbiInit2 address) */ - /* Disallow writes to pass through the PCI FIFO */ - PCICFG_RD(SST1_PCI_INIT_ENABLE, cfgInitEnable); - PCICFG_WR(SST1_PCI_INIT_ENABLE, cfgInitEnable | SST_FBIINIT23_REMAP); - sst1InitIdleFBINoNOP(sstbase); - - if(video16BPP) - sst1InitDacWr(sstbase, SST_DACREG_ICS_CMD, - SST_DACREG_ICS_COLORMODE_16BPP); - else - sst1InitDacWr(sstbase, SST_DACREG_ICS_CMD, - SST_DACREG_ICS_COLORMODE_24BPP); - sst1InitIdleFBINoNOP(sstbase); - - /* Disable fbiinit23 address remapping */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, cfgInitEnable); - - /* Restore init register states */ - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit1, fbiInit1_save); - ISET(sst->fbiInit2, fbiInit2_save); - sst1InitIdleFBINoNOP(sstbase); - - return(FXTRUE); -} - -/* -** sst1InitSetVidModeINI(): -** Set video Mode for DACs defined in "voodoo2.ini" -** -*/ -FxBool sst1InitSetVidModeINI(FxU32 *sstbase, FxU32 video16BPP) -{ - FxU32 n, fbiInit1_save, fbiInit2_save, cfgInitEnable; - sst1InitDacSetVideoModeStruct *setVideoMode; - FxBool retVal = FXFALSE; - SstRegs *sst = (SstRegs *) sstbase; - - if(iniDac == (sst1InitDacStruct *) NULL) - return(FXFALSE); - - sst1InitIdleFBINoNOP(sstbase); - - /* Save init register states before overwriting them */ - fbiInit1_save = IGET(sst->fbiInit1); - fbiInit2_save = IGET(sst->fbiInit2); - - /* Reset video unit to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_RESET); - /* Turn off dram refresh to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit2, IGET(sst->fbiInit2) & ~SST_EN_DRAM_REFRESH); - sst1InitIdleFBINoNOP(sstbase); - - /* Enable reads from the DAC (multiplexed on the fbiInit2 address) */ - /* Disallow writes to pass through the PCI FIFO */ - PCICFG_RD(SST1_PCI_INIT_ENABLE, cfgInitEnable); - PCICFG_WR(SST1_PCI_INIT_ENABLE, cfgInitEnable | SST_FBIINIT23_REMAP); - sst1InitIdleFBINoNOP(sstbase); - - setVideoMode = iniDac->setVideoMode; - while(setVideoMode) { - if(setVideoMode->video16BPP == video16BPP) { - if((retVal = sst1InitExecuteDacRdWr(sstbase, - setVideoMode->setVideoModeRdWr)) == FXTRUE) { - retVal = FXTRUE; - break; - } - } - setVideoMode = setVideoMode->nextSetVideoMode; - } - sst1InitIdleFBINoNOP(sstbase); - - /* Disable fbiinit23 address remapping */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, cfgInitEnable); - - /* Restore init register states */ - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit1, fbiInit1_save); - ISET(sst->fbiInit2, fbiInit2_save); - sst1InitIdleFBINoNOP(sstbase); - - return(retVal); -} - -/* -** sst1InitDacIndexedEnable(): -** Initialize DAC for indexed-mode addressing -** NOTE: When DAC indexed-mode addressing is enabled, video timing and -** DRAM refresh are both reset (disabled) -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitDacIndexedEnable(FxU32 *sstbase, - FxU32 Enable) -{ - FxU32 n, j, dacmir, dacdir, cr0_save; - static FxU32 fbiInit1_save = 0; - static FxU32 fbiInit2_save = 0; - static FxU32 cfgInitEnable; - SstRegs *sst = (SstRegs *) sstbase; - - if(!sst) - return(FXFALSE); - - sst1InitIdleFBINoNOP(sstbase); - if(!Enable) { - /* Disable indexed-mode addressing */ - sst1InitDacWr(sstbase, SST_DACREG_INDEXADDR, SST_DACREG_INDEX_CR0); - sst1InitDacWr(sstbase, SST_DACREG_INDEXDATA, - sst1InitDacRd(sstbase, SST_DACREG_INDEXDATA) & - ~SST_DACREG_CR0_INDEXED_ADDRESSING); - - /* Disable fbiinit23 address remapping */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, cfgInitEnable); - - /* Restore init register states */ - sst1InitIdleFBINoNOP(sstbase); - if(fbiInit1_save) /* Have we previously enabled indexed addressing? */ - ISET(sst->fbiInit1, fbiInit1_save); - if(fbiInit2_save) /* Have we previously enabled indexed addressing? */ - ISET(sst->fbiInit2, fbiInit2_save); - sst1InitIdleFBINoNOP(sstbase); - return(FXTRUE); - } - - /* Save init register states before overwriting them */ - fbiInit1_save = IGET(sst->fbiInit1); - fbiInit2_save = IGET(sst->fbiInit2); - - /* Reset video unit to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_RESET); - /* Turn off dram refresh to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit2, IGET(sst->fbiInit2) & ~SST_EN_DRAM_REFRESH); - sst1InitIdleFBINoNOP(sstbase); - - /* Enable reads from the DAC (multiplexed on the fbiInit2 address) */ - /* Disallow writes to pass through the PCI FIFO */ - PCICFG_RD(SST1_PCI_INIT_ENABLE, cfgInitEnable); - PCICFG_WR(SST1_PCI_INIT_ENABLE, cfgInitEnable | SST_FBIINIT23_REMAP); - sst1InitIdleFBINoNOP(sstbase); - - /* Sometimes the DACs seem to go into never-never land, so */ - /* try and initialize the DAC multiple times */ - n = 0; - while(1) { - if(++n > 100) { - INIT_PRINTF(("sst1InitDacIndexedEnable() ERROR: Could not Initialize DAC\n")); - return(FXFALSE); - } - - /* Must guarantee that no rendering is being performed */ - sst1InitIdleFBINoNOP(sstbase); - - /* Reset current state of DAC command register 0 (CR0) via the read */ - /* mask register (RMR) */ - sst1InitDacWr(sstbase, SST_DACREG_WMA, 0x0); /* reset backdoor fsm */ - sst1InitDacRd(sstbase, SST_DACREG_RMR); /* RMR must be read 5 times */ - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); - cr0_save = sst1InitDacRd(sstbase, SST_DACREG_RMR); - - /* Enable indexed programming by setting CR0[0] = 1 */ - sst1InitDacWr(sstbase, SST_DACREG_WMA, 0x0); /* reset backdoor fsm */ - sst1InitDacRd(sstbase, SST_DACREG_RMR); /* RMR must be read 4 times */ - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacWr(sstbase, SST_DACREG_RMR, ((cr0_save & 0xf0) | - SST_DACREG_CR0_INDEXED_ADDRESSING | SST_DACREG_CR0_8BITDAC)); - - /* NOW DAC IS IN INDEXED ADDRESS MODE... */ - - /* Check the manufacturing ID for sanity */ - j = 0; - DAC_INDEXWRADDR(SST_DACREG_INDEX_MIR); - dacmir = DAC_INDEXRD(); - - if((dacmir == SST_DACREG_INDEX_MIR_ATT_DEFAULT) || - (dacmir == SST_DACREG_INDEX_MIR_TI_DEFAULT)) - j++; - else - continue; - - /* Check the device ID for sanity */ - DAC_INDEXWRADDR(SST_DACREG_INDEX_DIR); - dacdir = DAC_INDEXRD(); - if((dacmir == SST_DACREG_INDEX_MIR_ATT_DEFAULT && - dacdir == SST_DACREG_INDEX_DIR_ATT_DEFAULT) || - (dacmir == SST_DACREG_INDEX_MIR_TI_DEFAULT && - dacdir == SST_DACREG_INDEX_DIR_TI_DEFAULT)) - j++; - else - continue; - if(j == 2) - break; - } - sst1InitIdleFBINoNOP(sstbase); - return(FXTRUE); -} - -#ifdef _WIN32 -#pragma optimize ("",on) -#endif diff --git a/glide2x/cvg/init/gamma.c b/glide2x/cvg/init/gamma.c deleted file mode 100644 index 329522e..0000000 --- a/glide2x/cvg/init/gamma.c +++ /dev/null @@ -1,256 +0,0 @@ -/*-*-c++-*-*/ -/* -** 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$ -** -** Initialization code for loading SST-1 gamma tables -** -*/ -#ifdef _WIN32 -#pragma optimize ("",off) -#endif -#include -#include -#include -#ifdef BUILD_FOR_SST1 -#include -#else -#include <3dfx.h> -#include -#include -#endif -#define FX_DLL_DEFINITION -#include -#include -#include - -/* OK, so this should be 1.7, but sometime during the - * late stages of the original v2 release hell we changed - * it to 1.3 to make id (or someone happy). - */ -#define kDefaultVoodoo2Gamma 1.3 - -/* -** sst1InitGamma(): -** Load the video color-lookup tables with the specified gamma function -** -** Returns: -** FXTRUE if successfully initializes SST-1 gamma tables -** FXFALSE if cannot initialize SST-1 gamma tables -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitGamma(FxU32 *sstbase, double gamma) -{ - if(sstbase == NULL) return(FXFALSE); - if(!sst1InitCheckBoard(sstbase)) return(FXFALSE); - - return sst1InitGammaRGB(sstbase, gamma, gamma, gamma); -} - -FX_EXPORT FxBool FX_CSTYLE sst1InitGammaRGB(FxU32 *sstbase, - double gammaR, - double gammaG, - double gammaB) -{ - FxU32 - x, - gammaTableR[256], - gammaTableG[256], - gammaTableB[256]; - FxBool - sstVideoIsReset; - SstRegs * - sst = (SstRegs *) sstbase; - static FxBool - calledBefore = FXFALSE; - static double - userGammaR = kDefaultVoodoo2Gamma, - userGammaG = kDefaultVoodoo2Gamma, - userGammaB = kDefaultVoodoo2Gamma; - - if(sstbase == NULL) return(FXFALSE); - if(!sst1InitCheckBoard(sstbase)) return(FXFALSE); - - if(!sst1CurrentBoard->fbiInitGammaDone) - INIT_PRINTF(("sst1InitGammaRGB(): Setting GammaRGB = (%.2f,%.2f,%.2f)\n", - gammaR, gammaG, gammaB)); - - /* Get the user set definitions (cp or environment) */ - if(!calledBefore) { - calledBefore = FXTRUE; - - if(GETENV(("SSTV2_RGAMMA"))) { - userGammaR = (double) ATOF(GETENV(("SSTV2_RGAMMA"))); - } - if(GETENV(("SSTV2_GGAMMA"))) { - userGammaG = (double) ATOF(GETENV(("SSTV2_GGAMMA"))); - } - if(GETENV(("SSTV2_BGAMMA"))) { - userGammaB = (double) ATOF(GETENV(("SSTV2_BGAMMA"))); - } - if(GETENV(("SSTV2_GAMMA"))) { - userGammaR = (double) ATOF(GETENV(("SSTV2_GAMMA"))); - userGammaG = userGammaR; - userGammaB = userGammaR; - } - } - - gammaR *= (userGammaR / kDefaultVoodoo2Gamma); - gammaG *= (userGammaG / kDefaultVoodoo2Gamma); - gammaB *= (userGammaB / kDefaultVoodoo2Gamma); - - // Initialize the gamma table - for(x=0; x<256; x++) { - gammaTableR[x] = FTOL (POW(x/255.0F, 1.0F/gammaR) * 255.0F + 0.5F); - gammaTableG[x] = FTOL (POW(x/255.0F, 1.0F/gammaG) * 255.0F + 0.5F); - gammaTableB[x] = FTOL (POW(x/255.0F, 1.0F/gammaB) * 255.0F + 0.5F); - } - - // Store gamma values in board info structure - sst1CurrentBoard->fbiGammaRed = gammaR; - sst1CurrentBoard->fbiGammaGreen = gammaG; - sst1CurrentBoard->fbiGammaBlue = gammaB; - - // SST-1 video reset must be inactive to load gamma tables - if(IGET(sst->fbiInit1) & SST_VIDEO_RESET) { - sstVideoIsReset = FXTRUE; - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit1, IGET(sst->fbiInit1) & ~SST_VIDEO_RESET); - // wait for video reset to be deasserted - sst1InitIdleFBINoNOP(sstbase); - } else { - sstVideoIsReset = FXFALSE; - } - - // SST-1 requires every eighth entry of the gamma table to be loaded, - // so only 32 basic writes are required. A 33rd write is used to load - // the top entry of the gamma table. The 33rd entry is necessary because - // SST-1 performs linear interpolation between each gamma table entry to - // generate 256 unique gamma-corrected values. - for(x=0; x<32; x++) { - FxU32 gcR = gammaTableR[(x<<3)]; - FxU32 gcG = gammaTableG[(x<<3)]; - FxU32 gcB = gammaTableB[(x<<3)]; - ISET(sst->clutData, ((x<clutData, ((32 << SST_CLUTDATA_INDEX_SHIFT) | - (GAMMA_COMP_FLOOR(gammaTableR[255]) << SST_CLUTDATA_RED_SHIFT) | - (GAMMA_COMP_FLOOR(gammaTableG[255]) << SST_CLUTDATA_RED_SHIFT) | - (GAMMA_COMP_FLOOR(gammaTableB[255]) << SST_CLUTDATA_RED_SHIFT))); -#undef GAMMA_COMP_FLOOR - - if(sstVideoIsReset) { - // wait for gamma table writes to complete - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_RESET); - sst1InitIdleFBINoNOP(sstbase); - } - - if(!sst1CurrentBoard->fbiInitGammaDone) { - sst1CurrentBoard->fbiInitGammaDone = 1; - INIT_PRINTF(("sst1InitGammaRGB() exiting with status %d...\n", FXTRUE)); - } - - return FXTRUE; -} - -FX_EXPORT FxBool FX_CSTYLE sst1InitGammaTable(FxU32 *sstbase, FxU32 nentries, FxU32 *r, FxU32 *g, FxU32 *b) -{ - FxU32 x; - FxU32 gammaTableR[256]; - FxU32 gammaTableG[256]; - FxU32 gammaTableB[256]; - FxBool sstVideoIsReset; - SstRegs *sst = (SstRegs *) sstbase; - - if(!sstbase) - return(FXFALSE); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - // Initialize the gamma table - for(x=0; x < nentries; x++) { - gammaTableR[x] = *r; - gammaTableG[x] = *g; - gammaTableB[x] = *b; - r++; g++; b++; - } - - // SST-1 video reset must be inactive to load gamma tables - if(IGET(sst->fbiInit1) & SST_VIDEO_RESET) { - sstVideoIsReset = FXTRUE; - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit1, IGET(sst->fbiInit1) & ~SST_VIDEO_RESET); - // wait for video reset to be deasserted - sst1InitIdleFBINoNOP(sstbase); - } else - sstVideoIsReset = FXFALSE; - - // SST-1 requires every eighth entry of the gamma table to be loaded, - // so only 32 basic writes are required. A 33rd write is used to load - // the top entry of the gamma table. The 33rd entry is necessary because - // SST-1 performs linear interpolation between each gamma table entry to - // generate 256 unique gamma-corrected values. - for(x=0; x < nentries; x++) { - FxU32 gcR = gammaTableR[(x)]; - FxU32 gcG = gammaTableG[(x)]; - FxU32 gcB = gammaTableB[(x)]; - ISET(sst->clutData, ((x<clutData, (32<fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_RESET); - sst1InitIdleFBINoNOP(sstbase); - } - - return(FXTRUE); -} - -#ifdef _WIN32 -#pragma optimize ("",on) -#endif diff --git a/glide2x/cvg/init/gdebug.c b/glide2x/cvg/init/gdebug.c deleted file mode 100644 index 8791d6d..0000000 --- a/glide2x/cvg/init/gdebug.c +++ /dev/null @@ -1,491 +0,0 @@ -/*-*-c++-*-*/ -#include "vxd.h" - -/* -** 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 -#include -#include -#include - -#include <3dfx.h> - -#if __MWERKS__ -/* Dork w/ the console window */ -#include - -/* So the debug level comes from the right place */ -#include -#include -#endif /* __MWERKS__ */ - -#define FX_DLL_DEFINITION -#include -#include -#include - -#if defined(__WIN32__) && !defined(KERNEL) -#include -#endif /* defined(__WIN32__) && !defined(KERNEL) */ - -#define USE_DEBUG_STRING (__DOS32__ || __WIN32__) -#if USE_DEBUG_STRING -static FxBool UseDebugString = 0; -#endif /* USE_DEBUG_STRING */ - -#ifdef KERNEL_NT - -void __stdcall -EngDebugPrint( - char * StandardPrefix, - const char * DebugMessage, - va_list ap - ); - -#endif - -static char *gdbg_myname = "gd"; // default library name -static char gdbg_debuglevel[GDBG_MAX_LEVELS]; // array of debuglevel controls - -static long gdbg_errors = 0; - - -#ifdef KERNEL -// gdbgout is array to store strings for debug output -//#include -static char gdbgout[512]; - -// for setting levels interactively through the debugger while you're -// running in the KERNEL mode -void setLevel(int level, int value) -{ - if (level >= GDBG_MAX_LEVELS) - level = GDBG_MAX_LEVELS - 1; - - gdbg_debuglevel[level] = value; -} - - -#ifndef KERNEL_NT -// when the simulator runs in kernal mode there is no C runtime library -// so we need to call a kernal printf. -extern int __cdecl klvfprintf(FILE *stream, - const char *format, - va_list arg ) ; -#endif - -static FILE *gdbg_msgfile; // GDBG info/error file -#else /* #ifdef KERNEL */ - -static FILE *gdbg_msgfile = NULL; /* stdout; */ // GDBG info/error file - -//---------------------------------------------------------------------- -// initialize gdbg_level from an environment variable -//---------------------------------------------------------------------- -static const char *setRange(const char *buf, int val) -{ - int r0,r1,pos; - - sscanf(buf,"%i%n",&r0,&pos); // parse the first integer - if (buf[pos]=='-' || buf[pos]==':') { // if there's a second - buf += pos+1; - sscanf(buf,"%i%n",&r1,&pos); // then parse it - } - else - r1 = r0; - - if (r0 < 0) r0 = 0; // sanity checks - if (r1 >= GDBG_MAX_LEVELS) r1 = GDBG_MAX_LEVELS-1; - if (r1 < r0) r1 = r0; - - while (r0 <= r1) // now set the debuglevel levels - gdbg_debuglevel[r0++] = val; - - return buf + pos; // and return rest of string -} - -FX_EXPORT void FX_CSTYLE -gdbg_parse(const char *env) -{ - int level, pos; - - do { - if (env[0] == ',') // advance past commas - env++; - if (env[0] == '+') // if + then enable a range - env = setRange(env+1,1); - else if (env[0] == '-') // if - then disable a range - env = setRange(env+1,0); - else { // else just a number - if (sscanf(env,"%i%n",&level,&pos) <= 0) return; - if (pos==0) return; // oops, guess not - if (level >= GDBG_MAX_LEVELS) level = GDBG_MAX_LEVELS-1; - while (level >= 0) // enable the range [0,#] - gdbg_debuglevel[level--] = 1; - env += pos; - } - } while (env[0] == ','); -} - -#endif /* #ifndef KERNEL */ - -FX_EXPORT void FX_CSTYLE -gdbg_init(void) -{ - static int done=0; // only execute once - char *env; - - if (done) return; - - /* I can't init gdbg_msgfile to stdout since it isn't constant so - * I do it now */ - gdbg_msgfile = stdout; - - -#if __MWERKS__ - SIOUXSettings.standalone = false; - SIOUXSettings.setupmenus = false; - SIOUXSettings.autocloseonquit = true; - SIOUXSettings.asktosaveonclose = false; -#endif - -#ifdef KERNEL - // put code in here to set the default level - gdbg_debuglevel[0] = 1; // always enable level 0 - gdbg_debuglevel[120] = 1; // always enable level 0 - done = 1; - env = 0; - return; -#else /* #ifdef KERNEL */ - done = 1; - gdbg_debuglevel[0] = 1; // always enable level 0 - env = GETENV("GDBG_FILE"); - if (env != NULL) GDBG_SET_FILE(env); - env = GETENV("GDBG_LEVEL"); - if (env == NULL) env = "0"; - gdbg_parse(env); - gdbg_info(1,"gdbg_init(): debug level = %s\n",env); -#endif /* #ifndef KERNEL */ -} - -FX_EXPORT void FX_CSTYLE -gdbg_shutdown(void) -{ - gdbg_info(1,"gdbg_shutdown()\n"); -#ifndef KERNEL - if (gdbg_msgfile != stdout) { // close any existing output file -#if USE_DEBUG_STRING - if (!UseDebugString) -#endif /* USE_DEBUG_STRING */ - fclose(gdbg_msgfile); - gdbg_msgfile = stdout; - } -#endif /* #ifndef KERNEL */ -} - -#if defined(KERNEL) && !defined(KERNEL_NT) - extern void MyPrintf(); -#endif /* #ifdef KERNEL */ - -#ifdef KERNEL_NT -//---------------------------------------------------------------------- -// NT Debug print helper routine -//---------------------------------------------------------------------- -static void gdbg_NTPrint( const char *format, ... ) -{ - va_list arglist; - - va_start(arglist, format); - EngDebugPrint( "\nHAL: ", format, arglist ); - va_end(arglist); -} -#endif // KERNEL_NT - -static GDBGKeepAliveProc keepAliveProc; - -FX_EXPORT void FX_CSTYLE gdbg_set_keepalive(GDBGKeepAliveProc p) -{ - keepAliveProc = p; -} - -//---------------------------------------------------------------------- -// the MAIN message display suboutine - ALL messages come thru here -//---------------------------------------------------------------------- -FX_EXPORT void FX_CSTYLE -gdbg_vprintf (const char *format,va_list args) -{ - if (gdbg_msgfile != NULL) { -#ifdef KERNEL - // shouldn't get here now - //commented out for now -KMW - //nwvsprintf(gdbgout,format,args); - //OutputDebugString("\n"); - //OutputDebugString("HAL: "); - //OutputDebugString(gdbgout); -#else -#if USE_DEBUG_STRING - if (UseDebugString) { - static char msgBuf[1024]; - - vsprintf(msgBuf, format, args); - -#if __DOS32__ - pciOutputDebugString(msgBuf); -#elif __WIN32 - OutputDebugString(msgBuf); -#else - fprintf(stderr, msgBuf); -#endif /* !__DOS32__ */ - } else -#endif /* USE_DEBUG_STRING */ - { - vfprintf(gdbg_msgfile,format,args); - // if there is a keepAlive callback, then call it - fflush(gdbg_msgfile); - } - - if (keepAliveProc) keepAliveProc(100); -#endif /* !KERNEL */ - } -} - -FX_EXPORT void FX_CSTYLE -gdbg_printf (const char *format, ...) -{ -#ifndef KERNEL - va_list args; - - va_start(args, format); - gdbg_vprintf(format,args); - va_end(args); -#elif defined( KERNEL_NT ) - va_list args; - - va_start(args, format); - EngDebugPrint( "\nHAL: ", format, args ); - va_end(args); -#else - __asm lea eax, (format+4); - __asm mov ebx, format; - MyPrintf(); -#endif /* #ifndef KERNEL */ - -} - -//---------------------------------------------------------------------- -// INFO message subroutines -//---------------------------------------------------------------------- - -//---------------------------------------------------------------------- -// display an INFO message if level <= debug level and return whether -// debug level high enough to allow display -//---------------------------------------------------------------------- -FX_EXPORT int FX_CSTYLE -gdbg_info (const int level, const char *format, ...) -{ - va_list args; -#ifndef KERNEL_NT - char newformat[4095]; -#endif - - if (!gdbg_debuglevel[level>=GDBG_MAX_LEVELS ? GDBG_MAX_LEVELS-1 : level]) - return(0); -#ifndef KERNEL - va_start(args, format); - sprintf(newformat, "%s.%d:\t", gdbg_myname,level); - strcat(newformat,format); - gdbg_vprintf(newformat,args); - va_end(args); -#elif defined( KERNEL_NT ) - gdbg_NTPrint( "%s.%d:\t", gdbg_myname, level ); - va_start(args, format); - EngDebugPrint( "", format, args ); - va_end(args); -#else /* #ifndef KERNEL */ - Debug_Printf("%s.%d:\t", gdbg_myname, level); - __asm lea eax, (format+4); - __asm mov ebx, format; - MyPrintf(); - FXUNUSED(args); - FXUNUSED(newformat[0]); -#endif /* #ifndef KERNEL */ - - return (1); -} - - -//---------------------------------------------------------------------- -// same as gdbg_info but does not display INFO header -//---------------------------------------------------------------------- -FX_EXPORT int FX_CSTYLE -gdbg_info_more (const int level, const char *format, ...) -{ - va_list args; - - if (!gdbg_debuglevel[level>=GDBG_MAX_LEVELS ? GDBG_MAX_LEVELS-1 : level]) - return(0); -#ifndef KERNEL - va_start(args, format); - gdbg_vprintf(format,args); - va_end(args); -#elif defined( KERNEL_NT ) - va_start(args, format); - EngDebugPrint( "\nHAL: ", format, args ); - va_end(args); -#else - __asm lea eax, (format+4); - __asm mov ebx, format; - MyPrintf(); - FXUNUSED(args); -#endif /* #ifndef KERNEL */ - return (1); -} - -static GDBGErrorProc errorProcList[3]; - -FX_EXPORT int FX_CSTYLE gdbg_error_set_callback(GDBGErrorProc p) -{ - int i; - const int count = sizeof(errorProcList) / sizeof(errorProcList[0]); - - for(i = 0; i < count; i++) { - if (errorProcList[i] == p) { - break; - } else if (errorProcList[i] == NULL) { - errorProcList[i] = p; - break; - } - } - - return (i < count); -} - -FX_EXPORT void FX_CSTYLE gdbg_error_clear_callback(GDBGErrorProc p) -{ - int i; - const int count = sizeof(errorProcList) / sizeof(errorProcList[0]); - - for(i = 0; i < count; i++) { - if (errorProcList[i] == p) { - errorProcList[i] = NULL; - break; - } - } -} - -//---------------------------------------------------------------------- -// ALL errors must come thru here, this subroutine adds a preamble -// and then displays the message and increments the error counter -//---------------------------------------------------------------------- -FX_EXPORT void FX_CSTYLE -gdbg_error (const char *kind, const char *format, ...) -{ -#ifndef KERNEL - va_list args; - - char newformat[1024]; - - va_start(args, format); - sprintf(newformat, "%s error (%s): ", gdbg_myname,kind); - strcat(newformat,format); // add a preamble to message - gdbg_vprintf(newformat,args); - gdbg_errors++; // increment the error counter - va_end(args); - - { - int i; - const int count = sizeof(errorProcList) / sizeof(errorProcList[0]); - - for(i = 0; i < count; i++) { - if (errorProcList[i] != NULL) { - va_start(args, format); - (*errorProcList[i])(kind, newformat, args); - va_end(args); - } - } - } -#elif defined( KERNEL_NT ) - va_list args; - - gdbg_NTPrint( "%s error (%s): ", gdbg_myname, kind); - va_start(args, format); - EngDebugPrint( "", format, args ); - va_end(args); -#else - Debug_Printf("%s error (%s): ", gdbg_myname, kind); - __asm lea eax, (format+4); - __asm mov ebx, format; - MyPrintf(); -#endif /* #ifndef KERNEL */ -} - -// return the error counter -FX_EXPORT int FX_CSTYLE -gdbg_get_errors(void) -{ - return gdbg_errors; -} - -// return a debuglevel level -FX_EXPORT int FX_CSTYLE -gdbg_get_debuglevel(const int level) -{ - return gdbg_debuglevel[level>=GDBG_MAX_LEVELS ? GDBG_MAX_LEVELS-1 : level]; -} - -// set a debuglevel level -FX_EXPORT void FX_CSTYLE -gdbg_set_debuglevel(const int level, const int value) -{ - gdbg_debuglevel[level>=GDBG_MAX_LEVELS ? GDBG_MAX_LEVELS-1 : level] = value; -} - -// open up a new output file -FX_EXPORT int FX_CSTYLE -gdbg_set_file(const char *name) -{ -#ifndef KERNEL - FILE *outf; - - if (gdbg_msgfile != stdout) { // close any existing output file - fclose(gdbg_msgfile); - gdbg_msgfile = stdout; - } - -#if USE_DEBUG_STRING - if (!strcmp(name, "DEBUG")) { - gdbg_msgfile = (FILE *) 1; - UseDebugString = 1; - } else -#endif /* USE_DEBUG_STRING */ - { - outf = fopen(name,"w"); // open up a new one - if (outf) gdbg_msgfile = outf; - } - - return (outf != NULL); -#else /* #ifndef KERNEL */ - return 0; -#endif /* #ifndef KERNEL */ -} diff --git a/glide2x/cvg/init/info.c b/glide2x/cvg/init/info.c deleted file mode 100644 index f4f36b1..0000000 --- a/glide2x/cvg/init/info.c +++ /dev/null @@ -1,657 +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$ -** -** Routines to detect memory size, strapping pin, and other initialization -** configuration information. -** -*/ -#ifdef _WIN32 -#pragma optimize ("",off) -#endif -#include -#include -#ifdef BUILD_FOR_SST1 -#include -#else -#include <3dfx.h> -#include -#include -#endif -#define FX_DLL_DEFINITION -#include -#include -#include - -#define XY_ONE (1<lfbMode, SST_LFB_RGBALANES_ARGB | SST_LFB_READFRONTBUFFER); - sst1InitIdle(sstbase); - if (x & 1) { - INIT_PRINTF(("ERROR: readAndSum4x4 must have an even X (%d)\n", x)); - return(FXFALSE); - } - - /* get 16 pixels (4 x 4 array) from frame buffer and sum the colors */ - *r_sum = 0; - *g_sum = 0; - *b_sum = 0; - - for (rd_y = 0; rd_y < 4; rd_y++) { /* read 4 scanlines */ - for (rd_x = 0; rd_x < 4; rd_x ++) { - if ((rd_x & 1)==0) { /* read 2 pixels at a time */ - rd_col = - IGET(sstbase[(SST_LFB_ADDR + (y+rd_y)*2048 + (x+rd_x)*2) >> 2]); - } - else rd_col >>= 16; - rd_r = ((rd_col >> 11) & 0x1f) << 3; - rd_g = ((rd_col >> 5) & 0x3f) << 2; - rd_b = ((rd_col >> 0) & 0x1f) << 3; - *r_sum += rd_r; - *g_sum += rd_g; - *b_sum += rd_b; - INIT_INFO((4,"%d,%d = rd_col: 0x%04x rgb: %02x %02x %02x\n", - rd_x, rd_y, (rd_col & 0xffff), rd_r, rd_g, rd_b)); - } - } - INIT_INFO((3,"sums: r_sum=0x%03x g_sum=0x%03x b_sum=0x%03x\n", - *r_sum, *g_sum, *b_sum)); - return(FXTRUE); -} - -/* xxx - Give these guys some meaningful comments */ -static FxI32 rb_tbl[0xFFF+1]; -static FxI32 g_tbl[0xFFF+1]; - -/* draw a right angle triangle */ -static void -drawTriangle(SstRegs *sst, int x, int y, int tSize) -{ - ISET(sst->vA.x,x); - ISET(sst->vA.y,y); - ISET(sst->vB.x,x+XY_ONE*tSize); - ISET(sst->vB.y,y); - ISET(sst->vC.x,x); - ISET(sst->vC.y,y+XY_ONE*tSize); - ISET(sst->s,0); - ISET(sst->t,0); - ISET(sst->w,0); - ISET(sst->dsdx,1<dtdx,0); - ISET(sst->dwdx,0); - ISET(sst->dsdy,0); - ISET(sst->dtdy,1<dwdy,0); - ISET(sst->triangleCMD,0); -} - -static FxBool -initSumTables(FxU32 *sstbase) -{ - int x=0,y=0; - FxU32 tst_color; - FxU32 r_sum, g_sum, b_sum; - SstRegs *sst = (SstRegs *) sstbase; - - /* init sum array */ - for (r_sum = 0; r_sum <= 0xfff; r_sum++) { - rb_tbl[r_sum] = -1; - g_tbl[r_sum] = -1; - } - - ISET(sst->fbzColorPath, SST_RGBSEL_C1 | SST_CC_PASS); - ISET(sst->fbzMode, SST_DRAWBUFFER_FRONT | SST_RGBWRMASK | SST_ENDITHER); - - /* fill sum array */ - for (tst_color = 0; tst_color <= 255; tst_color++) { - INIT_INFO((2,"tst_color=0x%02x\n", tst_color)); - ISET(sst->c1, (tst_color << 16) | (tst_color << 8) | tst_color); - - drawTriangle(sst, x,y,36); - if(readAndSum4x4(sstbase, x,y, &r_sum,&g_sum,&b_sum) == FXFALSE) - return(FXFALSE); - - /* check sums for uniqueness and then store away */ - if (r_sum != b_sum) { - INIT_PRINTF(("ERROR: b_sum=0x%03x r_sum=0x%03x\n", r_sum, b_sum)); - return(FXFALSE); - } - if (rb_tbl[r_sum] != -1) { - INIT_PRINTF(("ERROR: non-unique r/b_sum=0x%03x\n", r_sum)); - return(FXFALSE); - } - rb_tbl[r_sum] = tst_color; - if (g_tbl[g_sum] != -1) { - INIT_PRINTF(("ERROR: non-unique g_sum=0x%03x\n", g_sum)); - return(FXFALSE); - } - g_tbl[g_sum] = tst_color; - } - return(FXTRUE); -} - -/* remove dither to derive actual 24-bit RGB value */ -static FxBool -unDither(FxU32 r_sum, FxU32 g_sum, FxU32 b_sum, FxU32 *result) -{ - if (rb_tbl[r_sum] == -1 || g_tbl[g_sum] == -1 || rb_tbl[b_sum] == -1) - { - INIT_PRINTF(("ERROR: unDither: invalid color sum\n")); - return(FXFALSE); - } - *result = (rb_tbl[r_sum] << 16) | (g_tbl[g_sum] << 8) | rb_tbl[b_sum]; - return(FXTRUE); -} - -static FxBool -getTmuConfigData(FxU32 *sstbase, sst1DeviceInfoStruct *info) -{ - int x=0, y=0; - FxU32 r_sum, g_sum, b_sum; - SstRegs *sst = (SstRegs *) sstbase; - FxU32 tmuRevision; - - /* set trex's (all 3) to output configuration bits */ - ISET(SST_TREX(sst,0)->trexInit1, info->tmuInit1[0] | (1 << 18)); - ISET(SST_TREX(sst,1)->trexInit1, info->tmuInit1[1] | (1 << 18)); - ISET(SST_TREX(sst,2)->trexInit1, info->tmuInit1[2] | (1 << 18)); - - /* render into the frame buffer */ - ISET(sst->fbzColorPath, - SST_RGBSEL_TREXOUT | SST_CC_PASS | SST_ENTEXTUREMAP); - ISET(sst->texBaseAddr, 0); - ISET(sst->textureMode, SST_AI88 | SST_TC_PASS | SST_TCA_PASS); - ISET(sst->tLOD, 0); - drawTriangle(sst,x,y,36); - - readAndSum4x4(sstbase, x,y, &r_sum,&g_sum,&b_sum); - if(GETENV(("SSTV2_TEXMAP_DISABLE"))) { - info->tmuConfig = 0x0; - } else { - if(unDither(r_sum,g_sum,b_sum,&info->tmuConfig) == FXFALSE) - return(FXFALSE); - } - - ///////////////////////// - // Get new revision... - ///////////////////////// - ISET(SST_TREX(sst,0)->trexInit1, info->tmuInit1[0] | (1 << 18) | - (5 << SST_TEX_SEND_CONFIG_SEL_SHIFT)); - ISET(SST_TREX(sst,1)->trexInit1, info->tmuInit1[1] | (1 << 18)); - ISET(SST_TREX(sst,2)->trexInit1, info->tmuInit1[2] | (1 << 18)); - - /* render into the frame buffer */ - ISET(sst->fbzColorPath, - SST_RGBSEL_TREXOUT | SST_CC_PASS | SST_ENTEXTUREMAP); - ISET(sst->texBaseAddr, 0); - ISET(sst->textureMode, SST_AI88 | SST_TC_PASS | SST_TCA_PASS); - ISET(sst->tLOD, 0); - drawTriangle(sst,x,y,36); - - readAndSum4x4(sstbase, x,y, &r_sum,&g_sum,&b_sum); - if(unDither(r_sum,g_sum,b_sum,&tmuRevision) == FXFALSE) - return(FXFALSE); - - info->tmuFab[0] = (tmuRevision >> 4) & 0xf; - info->tmuFab[1] = (tmuRevision >> 12) & 0xf; - info->tmuFab[2] = (tmuRevision >> 20) & 0xf; - - /* Adjust configuration structure for "new" revision ID */ - info->tmuConfig &= ~(0x7 | (0x7<<7) | (0x7<<14)); - info->tmuConfig |= (((tmuRevision & 0x7) + 3) | - ((((tmuRevision >> 8) & 0x7) + 3) << 7) | - ((((tmuRevision >> 16) & 0x7) + 3) << 14)); - - /* reset trex's init registers */ - ISET(SST_TREX(sst,0)->trexInit1, info->tmuInit1[0]); - ISET(SST_TREX(sst,1)->trexInit1, info->tmuInit1[1]); - ISET(SST_TREX(sst,2)->trexInit1, info->tmuInit1[2]); - - if(GETENV(("SSTV2_TMUCFG"))) - SSCANF(GETENV(("SSTV2_TMUCFG")), "%ld", &info->tmuConfig); - - return(FXTRUE); -} - -#define SENSE2 0x92F56EB0 -#define SENSE1 0xF2A916B5 -#define SENSE0 0xBADBEEF1 - -static FxU32 sense(FxU32 *sstbase, sst1DeviceInfoStruct *info, FxU32 tmu, - FxU32 mem, FxU32 init) -{ - SstRegs *sst = (SstRegs *) sstbase; - FxU32 *texAddr = (tmu<<(21-2)) + (FxU32 *)SST_TEX_ADDRESS(sst); - - /* set the Init0 register to enable ? MBytes of memory */ - sst1InitIdle(sstbase); - ISET(SST_TREX(sst,tmu)->trexInit0, init | (info->tmuInit0[tmu] & ~0x7000)); - sst1InitIdle(sstbase); - - ISET(sst->texBaseAddr, 0x200000>>3); /* set to 2 MB */ - ISET(texAddr[0], SENSE2); /* write a random value */ - - ISET(sst->texBaseAddr, 0x100000>>3); /* set to 1 MB */ - ISET(texAddr[0], SENSE1); /* write a random value */ - - ISET(sst->texBaseAddr, 0x000000>>3); /* set to 0 MB */ - ISET(texAddr[0], SENSE0); /* write a random value */ - - ISET(sst->texBaseAddr, mem>>3); /* reset to 2 MB */ - drawTriangle(sst,0,0,4); /* draw a 4x4 right triangle */ - sst1InitIdle(sstbase); - - mem = IGET(sstbase[SST_LFB_ADDR>>2]); - INIT_INFO((2,"data=0x%08x\n", mem)); - - /* reset the Init0 register back to its previous value */ - sst1InitIdle(sstbase); - ISET(SST_TREX(sst,tmu)->trexInit0, info->tmuInit0[tmu]); - sst1InitIdle(sstbase); - return mem; -} - -FX_EXPORT FxBool FX_CSTYLE -sst1InitGetTmuMemory(FxU32 *sstbase, sst1DeviceInfoStruct *info, FxU32 tmu, - FxU32 *TmuMemorySize) -{ - FxU32 i,data; - SstRegs *sst = (SstRegs *) sstbase; - - INIT_INFO((1,"sst1InitGetTmuMemory(0x%x, , %d)\n", sstbase,tmu)); - - if(GETENV(("SSTV2_TMU_MEMSIZE"))) { - *TmuMemorySize = ATOI(GETENV(("SSTV2_TMU_MEMSIZE"))); - // If user specifies 2 MBytes on a 4 MBytes board, disable the - // second RAS so that apps which may incorrectly store data in the - // upper 2 Mbytes will not function properly... - if(*TmuMemorySize == 2) { - info->tmuInit0[tmu] &= ~SST_EN_TEX_MEM_SECOND_RAS; - sst1InitIdle(sstbase); - ISET(SST_TREX(sst,tmu)->trexInit0, info->tmuInit0[tmu]); - sst1InitIdle(sstbase); - } - return(FXTRUE); - } - - ISET(sst->lfbMode, SST_LFB_RGBALANES_ARGB | SST_LFB_READFRONTBUFFER); - ISET(sst->fbzMode, SST_DRAWBUFFER_FRONT | SST_RGBWRMASK); - ISET(sst->fbzColorPath, - SST_RGBSEL_TREXOUT | SST_CC_PASS | SST_ENTEXTUREMAP); - ISET(sst->textureMode, SST_RGB565 | SST_TC_REPLACE | SST_TCA_REPLACE); - ISET(sst->tLOD, 0); - - /* setup all downstream TMUs to be in pass-thru mode */ - for (i=0; itextureMode, SST_TC_PASS | SST_TCA_PASS); - - /* first see if we have 4 Mbytes by writing a texel at 2MB followed by - a texel at 1MB and 0MB and then rendering using the texel at 2MB - if we have less memory it should not render correctly since we trash - the memory locations it would wrap to - */ - - data = sense(sstbase,info,tmu,0x200000, 0x5000); - if (data == SENSE2) {*TmuMemorySize = 4; return(FXTRUE);} - - /* set the Init0 register to enable 2 MBytes of memory and repeat test */ - data = sense(sstbase,info,tmu,0x100000, 0x2000); - if (data == SENSE1) {*TmuMemorySize = 2; return(FXTRUE);} - - /* set the Init0 register to enable 1 MBytes of memory and repeat test */ - data = sense(sstbase,info,tmu,0x000000, 0x2000); - if (data == SENSE0) {*TmuMemorySize = 1; return(FXTRUE);} - - INIT_PRINTF(("sst1InitGetTmuMemory() ERROR: Could not detect memory size.\n")); - return(FXFALSE); -} - -/*--------------------------------------------------------------------------- - NOTES: - assumes that board and registers are initialized - destroys part of the framebuffer - ---------------------------------------------------------------------------*/ -FX_EXPORT FxBool FX_CSTYLE -sst1InitGetTmuInfo(FxU32 *sstbase, sst1DeviceInfoStruct *info) -{ - FxU32 trev; - - if(initSumTables(sstbase) == FXFALSE) - return(FXFALSE); - if(getTmuConfigData(sstbase,info) == FXFALSE) - return(FXFALSE); - - info->numberTmus = 1; - if(GETENV(("SSTV2_TEXMAP_DISABLE"))) { - info->tmuRevision = 4; - sst1InitGetTmuMemory(sstbase, info, 0, &info->tmuMemSize[0]); - info->tmuMemSize[0] = 2; - } else { - /* Get TMU memory size */ - info->tmuRevision = info->tmuConfig & 0x7; - if(sst1InitGetTmuMemory(sstbase, info, 0, &info->tmuMemSize[0]) == - FXFALSE) - return(FXFALSE); - } - - INIT_INFO((1,"TMU0 memory = %d MB\n", info->tmuMemSize[0])); - if (info->tmuConfig & FXBIT(6)) { /* if TMU 1 exists */ - info->numberTmus++; /* increment TMU count */ - trev = (info->tmuConfig>>7) & 0x7; /* get its revision */ -#if 0 // Ignore for now... - if (info->tmuRevision != trev) { - INIT_PRINTF(("sst1InitGetDeviceInfo: ERROR, multiple different TMU revision IDs detected\n")); - return(FXFALSE); - } -#endif - if(sst1InitGetTmuMemory(sstbase, info, 1, &info->tmuMemSize[1]) == FXFALSE) - return(FXFALSE); - } - if (info->tmuConfig & FXBIT(13)) { /* if TMU 2 exists */ - info->numberTmus++; /* increment TMU count */ - trev = (info->tmuConfig>>14) & 0x7; /* get its revision */ -#if 0 // Ignore for now... - if (info->tmuRevision != trev) { - INIT_PRINTF(("sst1InitGetDeviceInfo: ERROR, multiple different TMU revision IDs detected\n")); - return(FXFALSE); - } -#endif - if(sst1InitGetTmuMemory(sstbase, info, 2, &info->tmuMemSize[2]) == FXFALSE) - return(FXFALSE); - } - if(GETENV(("SSTV2_NUM_TMUS"))) - info->numberTmus = ATOI(GETENV(("SSTV2_NUM_TMUS"))); - - INIT_INFO((1,"numberTMus = %d\n", info->numberTmus)); - return(FXTRUE); -} - -/* -** fbiMemSize(): -** Returns size (in MBytes) of FBI frame buffer memory -** Returns 0 on error -** NOTE: fbiMemSize() destroys the contents in memory -** -*/ -#define LFB_PUTPIXEL(X, Y, DATA) \ - ISET(lfbptr[((SST_LFB_ADDR+(X<<1)+(Y<<11))>>1)], DATA) -#define LFB_GETPIXEL(X, Y) \ - IGET(lfbptr[((SST_LFB_ADDR+(X<<1)+(Y<<11))>>1)]) - -static int fbiMemSize(FxU32 *sstbase) -{ - SstRegs *sst = (SstRegs *) sstbase; - volatile unsigned short *lfbptr = (unsigned short *) sstbase; - FxU32 init0Save = IGET(sst->fbiInit0); - FxU32 init1Save = IGET(sst->fbiInit1); - FxU32 init2Save = IGET(sst->fbiInit2); - int retval = 0; - - if(GETENV(("SSTV2_FBI_MEMSIZE"))) - return(ATOI(GETENV(("SSTV2_FBI_MEMSIZE")))); - - /* Enable dram refresh, disable memory fifo, and setup memory */ - /* for rendering */ - ISET(sst->fbiInit0, IGET(sst->fbiInit0) & ~SST_MEM_FIFO_EN); - ISET(sst->fbiInit2, IGET(sst->fbiInit2) | SST_EN_DRAM_REFRESH); - sst1InitIdleFBI(sstbase); - - /* Setup Basic rendering datapath */ - ISET(sst->fbzColorPath, SST_CC_MONE); - ISET(sst->fogMode, 0x0); - ISET(sst->fbzMode, SST_RGBWRMASK | SST_ZAWRMASK | SST_DRAWBUFFER_FRONT); - sst1InitIdleFBI(sstbase); - - sst1InitSetResolution(sstbase, &SST_VREZ_800X600_60, 1); - sst1InitIdleFBI(sstbase); - - ISET(sst->lfbMode, SST_LFB_ZZ | SST_LFB_WRITEFRONTBUFFER | - SST_LFB_READDEPTHABUFFER); - sst1InitIdleFBI(sstbase); - - /* Check for 4 MBytes... */ - /* Write to Zbuffer in 800x600 resolution in upper 2 MBytes of memory */ - LFB_PUTPIXEL(128, 100, 0xdead); /* maps to row:0x216, col:0x80, bank:0x1 */ - LFB_PUTPIXEL(0, 0, 0x0); - LFB_PUTPIXEL(798, 599, 0xffff); - LFB_PUTPIXEL(200, 200, 0x55aa); /* maps to row:0x23d, col:0x104, bank:0x0 */ - LFB_PUTPIXEL(20, 20, 0xffff); - LFB_PUTPIXEL(400, 400, 0x0); - sst1InitIdleFBI(sstbase); - if((LFB_GETPIXEL(128, 100) == 0xdead) && - (LFB_GETPIXEL(200, 200) == 0x55aa)) { - retval = 4; - ISET(sst->lfbMode, (SST_LFB_565 | SST_LFB_READBACKBUFFER)); - sst1InitIdleFBI(sstbase); - goto fbiMemSizeDone; - } - - /* Check for 2 MBytes... */ - /* Write to color buffer in 640x480 resolution */ - sst1InitSetResolution(sstbase, &SST_VREZ_640X480_60, 0); - ISET(sst->lfbMode, SST_LFB_565 | SST_LFB_WRITEFRONTBUFFER | - SST_LFB_READFRONTBUFFER); - sst1InitIdleFBI(sstbase); - LFB_PUTPIXEL(50, 100, 0xdead); /* maps to row:0x1e, col:0x99, bank:0x0 */ - LFB_PUTPIXEL(0, 0, 0x0); - LFB_PUTPIXEL(638, 479, 0xffff); - ISET(sst->lfbMode, SST_LFB_565 | SST_LFB_WRITEBACKBUFFER | - SST_LFB_READFRONTBUFFER); - sst1InitIdleFBI(sstbase); - LFB_PUTPIXEL(178, 436, 0xaa55); /* maps to row:0x11e, col:0x99, bank:0x0 */ - LFB_PUTPIXEL(20, 20, 0x0); - LFB_PUTPIXEL(400, 400, 0xffff); - sst1InitIdleFBI(sstbase); - if(LFB_GETPIXEL(50, 100) != 0xdead) - goto check1MByte; - ISET(sst->lfbMode, (SST_LFB_565 | SST_LFB_READBACKBUFFER)); - sst1InitIdleFBI(sstbase); - if(LFB_GETPIXEL(178, 436) == 0xaa55) { - retval = 2; - goto fbiMemSizeDone; - } - -check1MByte: - ISET(sst->lfbMode, SST_LFB_565 | SST_LFB_WRITEFRONTBUFFER | - SST_LFB_READFRONTBUFFER); - sst1InitIdleFBI(sstbase); - LFB_PUTPIXEL(10, 10, 0xdead); /* maps to row:0x0, col:0x145, bank:0x0 */ - LFB_PUTPIXEL(8, 8, 0x0); - LFB_PUTPIXEL(340, 340, 0xffff); - LFB_PUTPIXEL(100, 200, 0x5a5a); /* maps to row:0x3c, col:0x112, bank:0x1 */ - LFB_PUTPIXEL(66, 0, 0x0); - LFB_PUTPIXEL(360, 360, 0xffff); - sst1InitIdleFBI(sstbase); - if((LFB_GETPIXEL(10, 10) == 0xdead) && - (LFB_GETPIXEL(100, 200) == 0x5a5a)) - retval = 1; - -fbiMemSizeDone: - /* Restore init registers to original state */ - ISET(sst->fbiInit0, init0Save); - ISET(sst->fbiInit1, init1Save); - ISET(sst->fbiInit2, init2Save); - sst1InitIdleFBI(sstbase); - - return(retval); -} - -FX_EXPORT FxBool FX_CSTYLE -sst1InitGetFbiInfo(FxU32 *sstbase, sst1DeviceInfoStruct *info) -{ - SstRegs *sst = (SstRegs *) sstbase; - - info->fbiMemSize = fbiMemSize(sstbase); - - /* Detect board identification and memory speed */ - if(GETENV(("SSTV2_FBICFG"))) - SSCANF(GETENV(("SSTV2_FBICFG")), "%ld", &info->fbiConfig); - else - info->fbiConfig = (IGET(sst->fbiInit3) & SST_FBI_MEM_TYPE) >> - SST_FBI_MEM_TYPE_SHIFT; - - info->fbiBoardID = (IGET(sst->fbiInit5) >> 5) & 0xf; - if(IGET(sst->fbiInit7) & BIT(0)) - info->fbiBoardID |= 0x10; - - /* Detect scanline interleaving */ - info->sliPaired = sst1InitSliPaired(sstbase); - info->sliDetected = sst1InitSliDetect(sstbase); - - return FXTRUE; -} - -/* -** sst1InitGetDeviceInfo(): -** Read device specific information -** NOTE: info pointer must point to an Info structure which has already -** been allocated -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitGetDeviceInfo(FxU32 *sstbase, - sst1DeviceInfoStruct *info) -{ - FxBool retval; - - if((retval = sst1InitCheckBoard(sstbase)) == FXTRUE) - *info = *sst1CurrentBoard; - return(retval); -} - -/* -** sst1InitFillDeviceInfo(): -** Fill in device information -** NOTE: This routine destroys current contents in frame buffer memory -** -** -*/ -FxBool sst1InitFillDeviceInfo(FxU32 *sstbase, sst1DeviceInfoStruct *info) -{ - if(!sstbase) - return(FXFALSE); - - if(info->tmuRevision != 0xdead) - return FXTRUE; /* if already got it, return */ - - if(GETENV(("SSTV2_NODEVICEINFO"))) { - /* fill device info struct with sane values... */ - INIT_PRINTF(("sst1DeviceInfo: Filling info Struct with default values...\n")); - - if(GETENV(("SSTV2_FBICFG"))) - SSCANF(GETENV(("SSTV2_FBICFG")), "%ld", &info->fbiConfig); - else - info->fbiConfig = 0x0; - - if(GETENV(("SSTV2_TMUCFG"))) - SSCANF(GETENV(("SSTV2_TMUCFG")), "%ld", &info->tmuConfig); - else - info->tmuConfig = 0x0; - - info->numberTmus = 1; - if (info->tmuConfig & FXBIT(6)) /* if TMU 1 exists */ - info->numberTmus++; - if (info->tmuConfig & FXBIT(13)) /* if TMU 2 exists */ - info->numberTmus++; - - info->tmuRevision = info->tmuConfig & 0x7; - - if(GETENV(("SSTV2_FBI_MEMSIZE"))) - info->fbiMemSize = ATOI(GETENV(("SSTV2_FBI_MEMSIZE"))); - else - info->fbiMemSize = 2; - - if(GETENV(("SSTV2_TMU_MEMSIZE"))) - info->tmuMemSize[0] = ATOI(GETENV(("SSTV2_TMU_MEMSIZE"))); - else - info->tmuMemSize[0] = 2; - info->tmuMemSize[1] = info->tmuMemSize[0]; - info->tmuMemSize[2] = info->tmuMemSize[0]; - } else { - int i; - - for(i=0; i<5; i++) { - if(i) - INIT_PRINTF(("sst1InitFillDeviceInfo(): Retry #%d for chip GetInfo()...\n", i)); - /* GetFbiInfo() must be called before GetTmuInfo() */ - if(sst1InitGetFbiInfo(sstbase, info) == FXFALSE) - continue; - /* get the revision ID of each TMU and verify that they are all the - same */ - if(sst1InitGetTmuInfo(sstbase, info) == FXFALSE) - continue; - break; - } - if(i == 5) - return(FXFALSE); - } - // Measure silicon performance - sst1InitMeasureSiProcess(sstbase, 0); // measure NAND-tree - sst1InitMeasureSiProcess(sstbase, 1); // measure NOR-tree - - INIT_PRINTF(("sst1DeviceInfo: Board ID: %d\n", info->fbiBoardID)); - INIT_PRINTF(("sst1DeviceInfo: FbiConfig:0x%x, TmuConfig:0x%x\n", - info->fbiConfig, info->tmuConfig)); - INIT_PRINTF(("sst1DeviceInfo: FBI Revision:%d, TMU Revison:%d, Num TMUs:%d\n", - info->fbiRevision, info->tmuRevision, info->numberTmus)); - INIT_PRINTF(("sst1DeviceInfo: FBI Memory:%d, TMU[0] Memory:%d", - info->fbiMemSize, info->tmuMemSize[0])); - if(info->numberTmus > 1) - INIT_PRINTF((", TMU[1] Memory:%d", info->tmuMemSize[1])); - if(info->numberTmus > 2) - INIT_PRINTF((", TMU[2] Memory:%d", info->tmuMemSize[2])); - INIT_PRINTF(("\n")); - if(sst1InitUseVoodooFile == FXTRUE) { - if(iniDac == (sst1InitDacStruct *) NULL) - INIT_PRINTF(("sst1DeviceInfo: Dac Type: Unknown")); - else - INIT_PRINTF(("sst1DeviceInfo: Dac Type: %s %s\n", - iniDac->dacManufacturer, iniDac->dacDevice)); - } else { - INIT_PRINTF(("sst1DeviceInfo: Dac Type: ")); - if(info->fbiVideoDacType == SST_FBI_DACTYPE_ATT) - INIT_PRINTF(("AT&T ATT20C409\n")); - else if(info->fbiVideoDacType == SST_FBI_DACTYPE_ICS) - INIT_PRINTF(("ICS ICS5342\n")); - else if(info->fbiVideoDacType == SST_FBI_DACTYPE_TI) - INIT_PRINTF(("TI TVP3409\n")); - else if(info->fbiVideoDacType == SST_FBI_DACTYPE_PROXY) - INIT_PRINTF(("(SLI PROXY)\n")); - else - INIT_PRINTF(("Unknown\n")); - } - INIT_PRINTF(("sst1DeviceInfo: SLI Detected:%d\n", info->sliDetected)); - - return(FXTRUE); -} -#ifdef _WIN32 -#pragma optimize ("",on) -#endif diff --git a/glide2x/cvg/init/init.rc b/glide2x/cvg/init/init.rc deleted file mode 100644 index 5e37b40..0000000 --- a/glide2x/cvg/init/init.rc +++ /dev/null @@ -1,65 +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 -#include "rcver.h" - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// -#define VERSIONNAME "sst1init.dll\0" - -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. InitCode DLL\0" - VALUE "FileVersion", VERSIONSTR - VALUE "InternalName", VERSIONNAME - VALUE "LegalCopyright", "Copyright \251 3Dfx Interactive, Inc. 1996\0" - VALUE "OriginalFilename", VERSIONNAME - VALUE "ProductName", "InitCode for Voodoo Graphics\251 and Windows\256 95\0" - VALUE "ProductVersion", VERSIONSTR - END - END - BLOCK "VarFileInfo" - BEGIN - /* the following line should be extended for localized versions */ - VALUE "Translation", 0x409, 1252 - END -END diff --git a/glide2x/cvg/init/makefile b/glide2x/cvg/init/makefile deleted file mode 100644 index c6f25d0..0000000 --- a/glide2x/cvg/init/makefile +++ /dev/null @@ -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 -# -# $Revision$ -# $Date$ -# - -# local defines, options, includes -LCDEFS = -DGDBG_INFO_ON -DINIT_DOS -LCOPTS = -LCINCS = -I$(BUILD_ROOT)\cvg\include -I$(BUILD_ROOT_SWLIBS)\include - -# sources -HEADERS = sst1init.h -INSTALL_DESTINATION = $(BUILD_ROOT)\cvg -CFILES = sst1init.c info.c print.c parse.c gamma.c util.c \ - sli.c video.c dac.c gdebug.c - -SUBLIBRARIES = $(BUILD_ROOT_SWLIBS)\lib\fxpci.lib - -!if "$(FX_DLL_BUILD_INIT)"=="1" -FX_DLL_LIBRARY = 1 -!endif - -# targets -LIBRARIES = sst1init.lib -RCFILE = init.rc - -!include $(BUILD_ROOT_SWLIBS)/include/nmake/3dfx.mak - -init.res: rcver.h -sst1init.obj: rcver.h diff --git a/glide2x/cvg/init/makefile.linux b/glide2x/cvg/init/makefile.linux deleted file mode 100644 index e5f47e3..0000000 --- a/glide2x/cvg/init/makefile.linux +++ /dev/null @@ -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 -# -# $Revision$ -# $Date$ -# - -# local defines, options, includes -LCDEFS = -DINIT_LINUX -LCOPTS = -LCINCS = -I$(BUILD_ROOT)/cvg/include -I$(BUILD_ROOT_SWLIBS)/include - -# sources -HEADERS = sst1init.h -INSTALL_DESTINATION = $(BUILD_ROOT)/cvg -CFILES = sst1init.c info.c print.c parse.c gamma.c util.c \ - sli.c video.c dac.c gdebug.c canopus.c - -SUBLIBRARIES = $(BUILD_ROOT_SWLIBS)/lib/libfxpci.a - -ifeq ($(FX_DLL_BUILD_INIT),1) -FX_DLL_LIBRARY = 1 -endif - -# targets -LIBRARIES = libsst1init.a -RCFILE = init.rc - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak - -init.res: rcver.h -sst1init.obj: rcver.h - -# -# This library must be compiled without the big optimization options -# for some strange reason -# -ifndef DEBUG -CFLAGS = -g $(GCFLAGS) $(LCFLAGS) $(VCFLAGS) -endif diff --git a/glide2x/cvg/init/parse.c b/glide2x/cvg/init/parse.c deleted file mode 100644 index 5a3d4af..0000000 --- a/glide2x/cvg/init/parse.c +++ /dev/null @@ -1,1024 +0,0 @@ -/*-*-c++-*-*/ -/* -** 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$ -** -** Parsing code for grabbing information from "voodoo2.ini" initialization file -** -*/ -#ifdef _WIN32 -#pragma optimize ("",off) -#endif -#include -#include -#include -#include - -#if __WIN32__ -#include - -/* Path relative to HKEY_LOCAL_MACHINE */ -#define REGSTR_PATH_3DFXSW "Software\\3Dfx Interactive\\Voodoo2" -#define REGSTR_PATH_GLIDE REGSTR_PATH_3DFXSW"\\Glide" -#endif /* __WIN32__ */ - -#include <3dfx.h> -#include -#include -#define FX_DLL_DEFINITION -#include -#include -#include - -static int sst1InitFgets(char *, FILE *); -static int sst1InitFgetc(FILE *); -#ifndef INIT_LINUX -static int sst1InitParseFieldDac(char *); -#endif -static int sst1InitParseFieldCfg(char *); -#ifndef INIT_LINUX -static int sst1InitParseDacRdWrString(char *, sst1InitDacStruct *); -static int sst1InitParseDacRdWr(char *, sst1InitDacRdWrStruct *); -static int sst1InitParseSetVideoString(char *, sst1InitDacStruct *); -static int sst1InitParseSetMemClkString(char *, sst1InitDacStruct *); -static int sst1InitParseSetVideoModeString(char *, sst1InitDacStruct *); -#endif -static void sst1InitToLower(char *string); -#if __DOS32__ -static void sst1InitFixFilename(char *dst, char *src); -#endif - -static FxBool checkedFileP = FXFALSE; - -#ifndef INIT_LINUX -/* -** sst1InitVoodooFile(): -** Find and setup "voodoo2.ini" file if possible -** -** Returns: -** FxTRUE if "voodoo2.ini" file is found, opened with no errors, and -** constains the dac programming data. -** FXFALSE if cannot find file, error opening file, or has no dac data in it. -** -*/ -FX_ENTRY FxBool FX_CALL sst1InitVoodooFile() -{ - static FxBool retVal = FXFALSE; - -#ifndef DIRECTX - int inCfg, inDac; - FILE *file = (FILE *) NULL; - char buffer[1024], filename[256]; - int helper = (getenv(("SSTV2_DEBUGDAC"))) ? 1 : 0; - - filename[0] = '\0'; - if (checkedFileP) goto __errExit; - -#if __DOS32__ - { - char fixedFilename[512], *tmpPtr; - char path[512]; - int i; - - - if(getenv("VOODOO2_FILE")) { - /* Override voodoo2.ini name */ - strncpy(filename, getenv("VOODOO2_FILE"), 255); - if(!(file = fopen(filename, "r"))) goto __errExit; - } else { - /* Override path setting */ - if(getenv("VOODOO2_PATH")) - strncpy(path, getenv("VOODOO2_PATH"), 511); - else if(getenv("PATH")) { - strcpy(path, ".;"); - strncat(path, getenv("PATH"), 511 - strlen (path)); - } else - strcpy(path, ".;"); - - i = 0; - while(1) { - if(!i) { - if((tmpPtr = strtok(path, ";")) == NULL) - break; - } else { - if((tmpPtr = strtok(NULL, ";")) == NULL) - break; - } - strcpy(filename, tmpPtr); - sst1InitFixFilename(fixedFilename, filename); - if(fixedFilename[strlen(fixedFilename)-1] == '\\') - sprintf(filename, "%svoodoo2.var", filename); - else - sprintf(filename, "%s\\voodoo2.var", filename); - i++; - if((file = fopen(filename, "r"))) - break; - } - } - } -#elif __MWERKS__ - { - FSSpec iniSpec = { - 0, 0, - "\pvoodoo2.var" - }; - Boolean foundP = false; - - /* Check the app's directory */ - if (!foundP) { - ProcessSerialNumber curApp; - ProcessInfoRec appInfo; - FSSpec appSpec; - - if (GetCurrentProcess(&curApp) != noErr) goto __errAppDir; - - /* We only care about the app's location */ - appInfo.processInfoLength = sizeof(ProcessInfoRec); - appInfo.processName = NULL; - appInfo.processAppSpec = &appSpec; - if (GetProcessInformation(&curApp, &appInfo) != noErr) goto __errAppDir; - - { - CInfoPBRec thePB; - - thePB.hFileInfo.ioCompletion = NULL; - thePB.hFileInfo.ioNamePtr = iniSpec.name; - thePB.hFileInfo.ioVRefNum = appSpec.vRefNum; - thePB.hFileInfo.ioDirID = appSpec.parID; - - thePB.hFileInfo.ioFDirIndex = 0; - - foundP = ((PBGetCatInfoSync(&thePB) == noErr) && - ((thePB.hFileInfo.ioFlAttrib & (0x01 << 4)) == 0)); - if (foundP) { - iniSpec.vRefNum = appSpec.vRefNum; - iniSpec.parID = appSpec.parID; - } - } - - __errAppDir: - ; - } - - /* Check the mac's version of the 'search path' */ - if (!foundP) { - OSType folderList[] = { kPreferencesFolderType, kExtensionFolderType }; - int i; - - for(i = 0; i < sizeof(folderList) / sizeof(folderList[0]); i++) { - short vRefNum; - long dirId; - - if (FindFolder(kOnSystemDisk, folderList[i], false, - &vRefNum, &dirId) == noErr) { - - CInfoPBRec thePB; - - thePB.hFileInfo.ioCompletion = NULL; - thePB.hFileInfo.ioNamePtr = iniSpec.name; - thePB.hFileInfo.ioVRefNum = vRefNum; - thePB.hFileInfo.ioDirID = dirId; - - thePB.hFileInfo.ioFDirIndex = 0; - - foundP = ((PBGetCatInfoSync(&thePB) == noErr) && - ((thePB.hFileInfo.ioFlAttrib & (0x01 << 4)) == 0)); - if (foundP) { - iniSpec.vRefNum = vRefNum; - iniSpec.parID = dirId; - - break; - } - } - } - } - - if (foundP) { - short wdRefNum; - long wdDirId; - - /* Change working directories, just in case the app did something else */ - if (HGetVol(NULL, &wdRefNum, &wdDirId) != noErr) goto __errFile; - if (HSetVol(NULL, iniSpec.vRefNum, iniSpec.parID) != noErr) goto __errFile; - - /* NB: We leave the name trashed after this */ - p2cstr(iniSpec.name); - file = fopen((const char*)iniSpec.name, "r"); - - HSetVol(NULL, wdRefNum, wdDirId); - - __errFile: - ; - } - } -#endif - - if(file == NULL) goto __errExit; - - inCfg = inDac = 0; - while(sst1InitFgets(buffer, file)) { - buffer[strlen(buffer)-1] = (char) NULL; - if(!strcmp(buffer, "[VOODOO2]")) { - inCfg = 1; inDac = 0; - continue; - } else if (!strcmp(buffer, "[DAC]")) { - inCfg = 0; inDac = 1; - retVal = FXTRUE; - continue; - } else if(buffer[0] == '[') { - inCfg = 0; inDac = 0; - continue; - } - - if(inCfg) { - if(!sst1InitParseFieldCfg(buffer)) { - if(helper) INIT_PRINTF(("sst1InitVoodooFile(): ERROR in [CFG] section of .ini file...\n")); - retVal = FXFALSE; - break; - } - } else if(inDac) { - if(!sst1InitParseFieldDac(buffer)) { - if(helper) INIT_PRINTF(("sst1InitVoodooFile(): ERROR in [DAC] section of .ini file...\n")); - retVal = FXFALSE; - break; - } - } - } - if (file != NULL) fclose(file); - INIT_PRINTF(("sst1Init Routines(): Using Initialization file '%s'\n", filename)); - -__errExit: - checkedFileP = FXTRUE; -#endif /* !DIRECTX */ - - return retVal; -} - -#else - -/* -** sst1InitVoodooFile(): -** Find and setup "voodoo2.ini" file if possible -** -** Returns: -** FxTRUE if "voodoo2.ini" file is found, opened with no errors, and -** constains the dac programming data. -** FXFALSE if cannot find file, error opening file, or has no dac data in it. -** -*/ -FX_ENTRY FxBool FX_CALL sst1InitVoodooFile() { - static FxBool retVal = FXFALSE; - FILE *file = 0; - char buffer[1024], filename[256]; - char *tmpPtr; - char path[512]; - int i; - - filename[0] = '\0'; - if (checkedFileP) goto __errExit; - - if (getenv("VOODOO2_FILE")) { - /* Override voodoo2.ini name */ - strncpy(filename, getenv("VOODOO2_FILE"), 255); - if (!(file = fopen(filename, "r"))) - goto __errExit; - } else { - /* Override path setting */ - if (getenv("VOODOO2_PATH")) { - strncpy(path, getenv("VOODOO2_PATH"), 511); - } else { - strcpy(path, "/etc/conf.3dfx"); - } - - i = 0; - while(1) { - if (!i) { - if ((tmpPtr = strtok(path, ":")) == NULL) - break; - } else { - if ((tmpPtr = strtok(NULL, ":")) == NULL) - break; - } - strncpy(filename, tmpPtr, 255); - if (filename[strlen(filename)-1] == '\\') - snprintf(filename, 255, "%s/voodoo2", filename); - else - snprintf(filename, 255, "%s/voodoo2", filename); - i++; - if ((file = fopen(filename, "r"))) - break; - } - } - if (!file) { - retVal = FXFALSE; - goto __errExit; - } - while(sst1InitFgets(buffer, file)) { - buffer[strlen(buffer)-1] = 0; - if (buffer[0]=='#') continue; - if (!sst1InitParseFieldCfg(buffer)) { - retVal = FXFALSE; - break; - } - } - INIT_PRINTF(("sst1Init Routines(): Using Initialization file '%s'\n", filename)); - -__errExit: - if (file) fclose(file); - checkedFileP = FXTRUE; - - return retVal; -} -#endif - -#if defined(INIT_DOS) || defined(INIT_LINUX) - -#if __DOS32__ -static void sst1InitFixFilename(char *dst, char *src) -{ - while(*src) { - *dst++ = *src; - if(*src == '\\') - *dst++ = *src; - src++; - } - *dst = (char) NULL; -} -#endif - - -static int sst1InitFgets(char *string, FILE *stream) -{ - int validChars = 0; - char *ptr = string; - int charRead; - - while(0 != ((charRead = sst1InitFgetc(stream)))) { - *ptr++ = (char) charRead; - validChars++; - if(charRead == '\n') { - *ptr++ = (char) NULL; - break; - } - } - return(validChars); -} - -static int sst1InitFgetc(FILE *stream) -{ - static int column = 0; - static int validChars = 0; - int charRead, charReadL; - int inComment; - - inComment = 0; - while(1) { - charRead = fgetc(stream); - if(inComment == 1) { - if(charRead <= 0) - return(0); - else if(charRead == '\n') - inComment = 0; - column = 0; - validChars = 0; - continue; - } else if(column == 0 && charRead == '#') { - /* Comment line */ - inComment = 1; - column = 0; - validChars = 0; - } else if(charRead <= 0) { - return(0); - } else { - if(charRead == '\n') { - if(validChars > 0) { - validChars = 0; - column = 0; - return(charRead); - } else - continue; - } else { - if(isspace(charRead)) - continue; - validChars++; - column++; - charReadL = (islower(charRead)) ? toupper(charRead) : charRead; - return(charReadL); - } - } - } -} - -static int sst1InitParseFieldCfg(char *string) -{ - char *envName, *envVal; - sst1InitEnvVarStruct *envVarsPtr; - - if((envName = strtok(string, "=")) == NULL) - return(0); - if((envVal = strtok((char *) NULL, "=")) == NULL) - /* Valid environment variable, NULL value */ - return(1); - - /* .ini canonical form is now lower case */ - sst1InitToLower(envName); - sst1InitToLower(envVal); - - if(envVarsBase == (sst1InitEnvVarStruct *) NULL) { - if((envVarsPtr = malloc(sizeof(sst1InitEnvVarStruct))) == - (sst1InitEnvVarStruct *) NULL) - return(0); - envVarsBase = envVarsPtr; - } else { - envVarsPtr = envVarsBase; - while(1) { - if(envVarsPtr->nextVar == (sst1InitEnvVarStruct *) NULL) - break; - else - envVarsPtr = envVarsPtr->nextVar; - } - if((envVarsPtr->nextVar = malloc(sizeof(sst1InitEnvVarStruct))) == - (sst1InitEnvVarStruct *) NULL) - return(0); - envVarsPtr = envVarsPtr->nextVar; - } - envVarsPtr->nextVar = (sst1InitEnvVarStruct *) NULL; - strcpy(envVarsPtr->envVariable, envName); - strcpy(envVarsPtr->envValue, envVal); - - return(1); -} - -#ifndef INIT_LINUX -static int sst1InitParseFieldDac(char *string) -{ - char *dacFieldReference, *dacFieldValue; - static sst1InitDacStruct *dacPtr = (sst1InitDacStruct *) NULL; - - if((dacFieldReference = strtok(string, "=")) == NULL) - return(0); - if(!strcmp(dacFieldReference, "MANUFACTURER")) { - /* Add new dac device */ - if(dacStructBase == (sst1InitDacStruct *) NULL) { - if((dacPtr = malloc(sizeof(sst1InitDacStruct))) == - (sst1InitDacStruct *) NULL) - return(0); - dacStructBase = dacPtr; - } else { - dacPtr = dacStructBase; - while(1) { - if(dacPtr->nextDac == (sst1InitDacStruct *) NULL) - break; - else - dacPtr = dacPtr->nextDac; - } - if((dacPtr->nextDac = malloc(sizeof(sst1InitDacStruct))) == - (sst1InitDacStruct *) NULL) - return(0); - dacPtr = dacPtr->nextDac; - } - dacPtr->nextDac = (sst1InitDacStruct *) NULL; - dacPtr->dacManufacturer[0] = (char) NULL; - dacPtr->dacDevice[0] = (char) NULL; - dacPtr->detect = (sst1InitDacRdWrStruct *) NULL; - dacPtr->setVideo = (sst1InitDacSetVideoStruct *) NULL; - dacPtr->setMemClk = (sst1InitDacSetMemClkStruct *) NULL; - dacPtr->setVideoMode = (sst1InitDacSetVideoModeStruct *) NULL; - if((dacFieldValue = strtok((char *) NULL, "=")) == NULL) - return(0); - strcpy(dacPtr->dacManufacturer, dacFieldValue); - } else if(!strcmp(dacFieldReference, "DEVICE")) { - if((dacFieldValue = strtok((char *) NULL, "=")) == NULL) - return(0); - strcpy(dacPtr->dacDevice, dacFieldValue); - } else if(!strcmp(dacFieldReference, "DETECT")) { - if((dacFieldValue = strtok((char *) NULL, "=")) == NULL) - return(0); - sst1InitToLower(dacFieldValue); - if(!sst1InitParseDacRdWrString(dacFieldValue, dacPtr)) - return(0); - } else if(!strcmp(dacFieldReference, "SETVIDEO")) { - if((dacFieldValue = strtok((char *) NULL, "=")) == NULL) - return(0); - sst1InitToLower(dacFieldValue); - if(!sst1InitParseSetVideoString(dacFieldValue, dacPtr)) - return(0); - } else if(!strcmp(dacFieldReference, "SETMEMCLK")) { - if((dacFieldValue = strtok((char *) NULL, "=")) == NULL) - return(0); - sst1InitToLower(dacFieldValue); - if(!sst1InitParseSetMemClkString(dacFieldValue, dacPtr)) - return(0); - } else if(!strcmp(dacFieldReference, "SETVIDEOMODE")) { - if((dacFieldValue = strtok((char *) NULL, "=")) == NULL) - return(0); - sst1InitToLower(dacFieldValue); - if(!sst1InitParseSetVideoModeString(dacFieldValue, dacPtr)) - return(0); - } else - return(0); - - return(1); -} - -static int sst1InitParseDacRdWrString(char *string, sst1InitDacStruct *dacBase) -{ - int cntr = 0; - int i; - sst1InitDacRdWrStruct *dacRdWrPtr; - char *dacRdWrCmd; - char stringCpy[2048]; - - while(1) { - strcpy(stringCpy, string); - if((dacRdWrCmd = strtok(stringCpy, ";")) == NULL) - return(0); - if(cntr == 0) { - if(!(dacBase->detect = malloc(sizeof(sst1InitDacRdWrStruct)))) - return(0); - dacRdWrPtr = dacBase->detect; - } else { - for(i=0; i<(cntr-1); i++) { - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) - return(0); - } - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) { - break; - } - if(!(dacRdWrPtr->nextRdWr = malloc(sizeof(sst1InitDacRdWrStruct)))) - return(0); - - dacRdWrPtr = dacRdWrPtr->nextRdWr; - } - dacRdWrPtr->nextRdWr = (sst1InitDacRdWrStruct *) NULL; - if(!sst1InitParseDacRdWr(dacRdWrCmd, dacRdWrPtr)) - return(0); - cntr++; - } - return(1); -} - -static int sst1InitParseDacRdWr(char *string, sst1InitDacRdWrStruct *dacRdWrPtr) -{ - char *addr, *data, *mask, *addrDataCmd; - char stringCpy[2048]; - - strcpy(stringCpy, string); - - if(stringCpy[5] == '(') { - stringCpy[5] = (char) NULL; - addrDataCmd = &stringCpy[6]; - } else if(stringCpy[7] == '(') { - stringCpy[7] = (char) NULL; - addrDataCmd = &stringCpy[8]; - } else if(stringCpy[8] == '(') { - stringCpy[8] = (char) NULL; - addrDataCmd = &stringCpy[9]; - } else if(stringCpy[9] == '(') { - stringCpy[9] = (char) NULL; - addrDataCmd = &stringCpy[10]; - } else - return(0); - - if(!strcmp(stringCpy, "dacwr")) { - if((addr = strtok(addrDataCmd, ",")) == NULL) - return(0); - if((data = strtok(NULL, ",")) == NULL) - return(0); - if(data[strlen(data)-1] != ')') - return(0); - data[strlen(data)-1] = (char) NULL; - dacRdWrPtr->type = DACRDWR_TYPE_WR; - SSCANF(addr, "%i", &dacRdWrPtr->addr); - SSCANF(data, "%i", &dacRdWrPtr->data); - } else if(!strcmp(stringCpy, "dacwrpop")) { - if((addr = strtok(addrDataCmd, ",")) == NULL) - return(0); - if((mask = strtok(NULL, ",")) == NULL) - return(0); - if((data = strtok(NULL, ",")) == NULL) - return(0); - if(data[strlen(data)-1] != ')') - return(0); - data[strlen(data)-1] = (char) NULL; - dacRdWrPtr->type = DACRDWR_TYPE_WRMOD_POP; - SSCANF(addr, "%i", &dacRdWrPtr->addr); - SSCANF(mask, "%i", &dacRdWrPtr->mask); - SSCANF(data, "%i", &dacRdWrPtr->data); - } else if(!strcmp(stringCpy, "dacrdwr")) { - if((addr = strtok(addrDataCmd, ",")) == NULL) - return(0); - if((mask = strtok(NULL, ",")) == NULL) - return(0); - if((data = strtok(NULL, ",")) == NULL) - return(0); - if(data[strlen(data)-1] != ')') - return(0); - data[strlen(data)-1] = (char) NULL; - dacRdWrPtr->type = DACRDWR_TYPE_RDMODWR; - SSCANF(addr, "%i", &dacRdWrPtr->addr); - SSCANF(mask, "%i", &dacRdWrPtr->mask); - SSCANF(data, "%i", &dacRdWrPtr->data); - } else if(!strcmp(stringCpy, "dacrd")) { - if((addr = strtok(addrDataCmd, ",")) == NULL) - return(0); - if(addr[strlen(addr)-1] == ')') { - dacRdWrPtr->type = DACRDWR_TYPE_RDNOCHECK; - SSCANF(addr, "%i", &dacRdWrPtr->addr); - } else { - dacRdWrPtr->type = DACRDWR_TYPE_RDCHECK; - if((data = strtok(NULL, ",")) == NULL) - return(0); - if(data[strlen(data)-1] != ')') - return(0); - data[strlen(data)-1] = (char) NULL; - SSCANF(addr, "%i", &dacRdWrPtr->addr); - SSCANF(data, "%i", &dacRdWrPtr->data); - } - } else if(!strcmp(stringCpy, "dacrdpush")) { - if((addr = strtok(addrDataCmd, ",")) == NULL) - return(0); - if(addr[strlen(addr)-1] == ')') { - dacRdWrPtr->type = DACRDWR_TYPE_RDPUSH; - SSCANF(addr, "%i", &dacRdWrPtr->addr); - } else - return(0); - } else { - return(0); - } - - return(1); -} - -static int sst1InitParseSetVideoString(char *string, sst1InitDacStruct *dacBase) -{ - int cntr = 0; - int i; - sst1InitDacRdWrStruct *dacRdWrPtr; - sst1InitDacSetVideoStruct *dacSetVideoPtr; - char *dacRdWrCmd; - char stringCpy[2048]; - - while(1) { - strcpy(stringCpy, string); - if((dacRdWrCmd = strtok(stringCpy, ";")) == NULL) - return(0); - if(cntr == 0) { - if(!dacBase->setVideo) { - if(!(dacBase->setVideo = - malloc(sizeof(sst1InitDacSetVideoStruct)))) - return(0); - dacSetVideoPtr = dacBase->setVideo; - } else { - dacSetVideoPtr = dacBase->setVideo; - while(1) { - if(!dacSetVideoPtr->nextSetVideo) - break; - dacSetVideoPtr = dacSetVideoPtr->nextSetVideo; - } - if(!(dacSetVideoPtr->nextSetVideo = - malloc(sizeof(sst1InitDacSetVideoStruct)))) - return(0); - dacSetVideoPtr = dacSetVideoPtr->nextSetVideo; - } - dacSetVideoPtr->nextSetVideo = (sst1InitDacSetVideoStruct *) NULL; - /* Width */ - SSCANF(dacRdWrCmd, "%i", &dacSetVideoPtr->width); - /* Height */ - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) - return(0); - SSCANF(dacRdWrCmd, "%i", &dacSetVideoPtr->height); - /* Refresh */ - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) - return(0); - SSCANF(dacRdWrCmd, "%i", &dacSetVideoPtr->refresh); - /* video16BPP */ - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) - return(0); - SSCANF(dacRdWrCmd, "%i", &dacSetVideoPtr->video16BPP); - /* First DacRdWr */ - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) - return(0); - if(!(dacSetVideoPtr->setVideoRdWr = - malloc(sizeof(sst1InitDacRdWrStruct)))) - return(0); - dacRdWrPtr = dacSetVideoPtr->setVideoRdWr; - } else { - for(i=0; i<(cntr+3); i++) { - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) - return(0); - } - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) { - break; - } - if(!(dacRdWrPtr->nextRdWr = malloc(sizeof(sst1InitDacRdWrStruct)))) - return(0); - dacRdWrPtr = dacRdWrPtr->nextRdWr; - } - dacRdWrPtr->nextRdWr = (sst1InitDacRdWrStruct *) NULL; - if(!sst1InitParseDacRdWr(dacRdWrCmd, dacRdWrPtr)) - return(0); - cntr++; - } - return(1); -} - -static int sst1InitParseSetMemClkString(char *string, - sst1InitDacStruct *dacBase) -{ - int cntr = 0; - int i; - sst1InitDacRdWrStruct *dacRdWrPtr; - sst1InitDacSetMemClkStruct *dacSetMemClkPtr; - char *dacRdWrCmd; - char stringCpy[2048]; - - while(1) { - strcpy(stringCpy, string); - if((dacRdWrCmd = strtok(stringCpy, ";")) == NULL) - return(0); - if(cntr == 0) { - if(!dacBase->setMemClk) { - if(!(dacBase->setMemClk = - malloc(sizeof(sst1InitDacSetMemClkStruct)))) - return(0); - dacSetMemClkPtr = dacBase->setMemClk; - } else { - dacSetMemClkPtr = dacBase->setMemClk; - while(1) { - if(!dacSetMemClkPtr->nextSetMemClk) - break; - dacSetMemClkPtr = dacSetMemClkPtr->nextSetMemClk; - } - if(!(dacSetMemClkPtr->nextSetMemClk = - malloc(sizeof(sst1InitDacSetMemClkStruct)))) - return(0); - dacSetMemClkPtr = dacSetMemClkPtr->nextSetMemClk; - } - dacSetMemClkPtr->nextSetMemClk = (sst1InitDacSetMemClkStruct *) - NULL; - /* Frequency */ - SSCANF(dacRdWrCmd, "%i", &dacSetMemClkPtr->frequency); - - /* First DacRdWr */ - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) - return(0); - if(!(dacSetMemClkPtr->setMemClkRdWr = - malloc(sizeof(sst1InitDacRdWrStruct)))) - return(0); - dacRdWrPtr = dacSetMemClkPtr->setMemClkRdWr; - } else { - for(i=0; i<(cntr); i++) { - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) - return(0); - } - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) { - break; - } - if(!(dacRdWrPtr->nextRdWr = malloc(sizeof(sst1InitDacRdWrStruct)))) - return(0); - dacRdWrPtr = dacRdWrPtr->nextRdWr; - } - dacRdWrPtr->nextRdWr = (sst1InitDacRdWrStruct *) NULL; - if(!sst1InitParseDacRdWr(dacRdWrCmd, dacRdWrPtr)) - return(0); - cntr++; - } - return(1); -} - -static int sst1InitParseSetVideoModeString(char *string, - sst1InitDacStruct *dacBase) -{ - int cntr = 0; - int i; - sst1InitDacRdWrStruct *dacRdWrPtr; - sst1InitDacSetVideoModeStruct *dacSetVideoModePtr; - char *dacRdWrCmd; - char stringCpy[2048]; - - while(1) { - strcpy(stringCpy, string); - if((dacRdWrCmd = strtok(stringCpy, ";")) == NULL) - return(0); - if(cntr == 0) { - if(!dacBase->setVideoMode) { - if(!(dacBase->setVideoMode = - malloc(sizeof(sst1InitDacSetVideoModeStruct)))) - return(0); - dacSetVideoModePtr = dacBase->setVideoMode; - } else { - dacSetVideoModePtr = dacBase->setVideoMode; - while(1) { - if(!dacSetVideoModePtr->nextSetVideoMode) - break; - dacSetVideoModePtr = dacSetVideoModePtr->nextSetVideoMode; - } - if(!(dacSetVideoModePtr->nextSetVideoMode = - malloc(sizeof(sst1InitDacSetVideoModeStruct)))) - return(0); - dacSetVideoModePtr = dacSetVideoModePtr->nextSetVideoMode; - } - dacSetVideoModePtr->nextSetVideoMode = - (sst1InitDacSetVideoModeStruct *) NULL; - /* video16BPP */ - SSCANF(dacRdWrCmd, "%i", &dacSetVideoModePtr->video16BPP); - - /* First DacRdWr */ - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) - return(0); - if(!(dacSetVideoModePtr->setVideoModeRdWr = - malloc(sizeof(sst1InitDacRdWrStruct)))) - return(0); - dacRdWrPtr = dacSetVideoModePtr->setVideoModeRdWr; - } else { - for(i=0; i<(cntr); i++) { - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) - return(0); - } - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) { - break; - } - if(!(dacRdWrPtr->nextRdWr = malloc(sizeof(sst1InitDacRdWrStruct)))) - return(0); - dacRdWrPtr = dacRdWrPtr->nextRdWr; - } - dacRdWrPtr->nextRdWr = (sst1InitDacRdWrStruct *) NULL; - if(!sst1InitParseDacRdWr(dacRdWrCmd, dacRdWrPtr)) - return(0); - cntr++; - } - return(1); -} -#endif - -static void sst1InitToLower(char *string) -{ - char *ptr = string; - - while(*ptr) { - *ptr = (isupper(*ptr)) ? tolower(*ptr) : *ptr; - ptr++; - } -} - -#if __WIN32__ -FxBool GetRegistryKey(HKEY hKey, const char* keyName, - char* regValBuf, FxU32 bufSize) -{ - DWORD type; - DWORD tsize = bufSize; - FxBool retVal = FXFALSE; - - // Don't worry about default if query fails, its handled higher up - if(!RegQueryValueEx(hKey, keyName, NULL, &type, (CONST LPBYTE)regValBuf, &tsize)) { - switch(type) { - case REG_DWORD: - { - DWORD dValue = *(DWORD*)regValBuf; - sprintf(regValBuf, "%d", dValue); - } - /* Fall through */ - - case REG_SZ: - retVal = FXTRUE; - break; - } - } - - return retVal; -} -#endif /* __WIN32__ */ - -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); -} - -/* -** sst1InitGetenv(): -** Getenv() for INIT routines. -** -** If the actual environment variable exists (determined by a call to -** the system getenv() routine), then that pointer is returned. Otherwise, -** if the variable is defined in the [CFG] section of "voodoo2.ini", then -** a pointer to the value defined in "voodoo2.ini" is returned. Otherwise, -** NULL is returned -** -*/ -FX_ENTRY char* FX_CALL sst1InitGetenv(char *string) -{ - const char* retVal; - - /* Does the real environment variable exist? - * This overrides everything for glide. - */ - retVal = myGetenv(string); - if (retVal == NULL) { -#if __WIN32__ - /* On windows check to see if the control panel thingee - * has added entries for glide or voodoo^2. - */ - { - /* List of the various registry paths to check. These - * should be in the order that you want them checked in. - */ - static const char* regPathList[] = { - REGSTR_PATH_GLIDE, - REGSTR_PATH_3DFXSW - }; - HKEY hKey; - int i; - - for(i = 0; (retVal == NULL) && (i < sizeof(regPathList) / sizeof(regPathList[0])); i++) { - if (!RegOpenKey(HKEY_LOCAL_MACHINE, regPathList[i], &hKey)) { -#define kRegKeyBufSize 256 - static char regKeyBuf[kRegKeyBufSize]; - - regKeyBuf[0] = '\0'; - if (GetRegistryKey(hKey, string, regKeyBuf, kRegKeyBufSize)) retVal = regKeyBuf; - RegCloseKey(hKey); - } - } - } -#endif /* __WIN32__ */ - - /* Does the requested environment variable exist in "voodoo2.ini"? */ - /* Dump CFG Data... */ - if (!checkedFileP) { - static FxBool inProc = FXFALSE; - - if (!inProc) { - inProc = FXTRUE; - sst1InitVoodooFile(); - inProc = FXFALSE; - } - } - - { - sst1InitEnvVarStruct *envVarsPtr = envVarsBase; - char tempSearchString[kMaxEnvVarLen]; - - /* Put the search into canonical form */ - strcpy(tempSearchString, string); - sst1InitToLower(tempSearchString); - - while(envVarsPtr) { - if(!strcmp(tempSearchString, envVarsPtr->envVariable)) { - retVal = envVarsPtr->envValue; - break; - } - envVarsPtr = (sst1InitEnvVarStruct *) envVarsPtr->nextVar; - } - } - } - - return (char*)retVal; -} -#endif /* INIT_DOS */ - -#ifdef _WIN32 -#pragma optimize ("",on) -#endif diff --git a/glide2x/cvg/init/print.c b/glide2x/cvg/init/print.c deleted file mode 100644 index 15e5e39..0000000 --- a/glide2x/cvg/init/print.c +++ /dev/null @@ -1,88 +0,0 @@ -/*-*-c++-*-*/ -/* -** 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$ -** -** Print functions for SST-1 Initialization routines -*/ -#ifdef _WIN32 -#pragma optimize ("",off) -#endif -#include -#include -#include -#ifdef BUILD_FOR_SST1 -#include -#else -#include <3dfx.h> -#include -#include -#endif -#include -#define FX_DLL_DEFINITION -#include -#include -#include - -#ifdef INIT_OUTPUT - -FX_ENTRY void FX_CALL sst1InitVPrintf(const char *, va_list); - -FX_ENTRY void FX_CALL sst1InitPrintf(const char *format, ...) -{ - va_list args; - static FxBool firstPass = FXTRUE; - static FxBool printIt = FXFALSE; - - if(firstPass == FXTRUE) { - sst1InitMsgFile = stdout; - firstPass = FXFALSE; - if(GETENV(("SSTV2_INITDEBUG")) || GDBG_GET_DEBUGLEVEL(5)) - printIt = FXTRUE; - if(GETENV(("SSTV2_INITDEBUG_FILE"))) { - printIt = ((sst1InitMsgFile = fopen(GETENV(("SSTV2_INITDEBUG_FILE")), "w")) != NULL); - if (!printIt) { - fprintf(stderr, "sst1InitPrintf(): Could not open file '%s' for logging...\n", - GETENV(("SSTV2_INITDEBUG_FILE"))); - } - } - } - - if(printIt == FXFALSE) - return; - - va_start(args, format); - sst1InitVPrintf(format, args); - va_end(args); -} - -FX_ENTRY void FX_CALL sst1InitVPrintf(const char *format, va_list args) -{ - vfprintf(sst1InitMsgFile, format, args); - fflush(sst1InitMsgFile); -} - -#endif - -#ifdef _WIN32 -#pragma optimize ("",on) -#endif diff --git a/glide2x/cvg/init/rcver.h b/glide2x/cvg/init/rcver.h deleted file mode 100644 index a041667..0000000 --- a/glide2x/cvg/init/rcver.h +++ /dev/null @@ -1,5 +0,0 @@ -#define MANVERSION 1 -#define MANREVISION 1 -#define BUILD_NUMBER 1 - -#define VERSIONSTR "Voodoo2 InitCode " "$Revision$" "\0" diff --git a/glide2x/cvg/init/sli.c b/glide2x/cvg/init/sli.c deleted file mode 100644 index de62b5c..0000000 --- a/glide2x/cvg/init/sli.c +++ /dev/null @@ -1,741 +0,0 @@ -/*-*-c++-*-*/ -/* -** 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$ -** -** Initialization code for initializing scanline interleaving -** -*/ -#ifdef _WIN32 -#pragma optimize ("",off) -#endif -#include -#include -#include -#ifdef BUILD_FOR_SST1 -#include -#else -#include <3dfx.h> -#include -#include -#endif -#define FX_DLL_DEFINITION -#include -#include -#include - -/* -** sst1InitSli(): -** Setup Multiple SST-1 subsystems for Scanline Interleaving -** sstbase0 defined to be the SLI Master -** sstbase1 defined to be the SLI Slave -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitSli(FxU32 *sstbase0, FxU32 *sstbase1) -{ - FxU32 j, n, MasterPhysAddr, cntr; - SstRegs *sstMaster = (SstRegs *) sstbase0; - SstRegs *sstSlave = (SstRegs *) sstbase1; - FxU32 masterVInClkDel, masterVOutClkDel; - FxU32 slaveVInClkDel, slaveVOutClkDel; - FxU32 masterPVOutClkDel, slavePVOutClkDel; - FxU32 pciFifoLwm, memFifoLwm; - FxU32 memOffsetOrig, tilesInXOrig; - FxU32 memOffsetNew; - int memFifoEntriesNew; - FxU32 memSizeInPages; - FxU32 memFifoRowBaseNew; - FxU32 swapAlgorithm = SST_SWAP_SLISYNC; - FxU32 videoWindowActive = 0x1; - FxU32 videoWindowActiveDrag = 0xf; - sst1DeviceInfoStruct *sst1M, *sst1S; - - if(sst1InitCheckBoard(sstbase1) == FXFALSE) - return(FXFALSE); - if(!sst1CurrentBoard->sliDetected) - return(FXFALSE); - sst1S = sst1CurrentBoard; - - if(sst1InitCheckBoard(sstbase0) == FXFALSE) - return(FXFALSE); - if(!sst1CurrentBoard->sliDetected) - return(FXFALSE); - sst1M = sst1CurrentBoard; - - // Verify that the board configurations are identical - // - // NB: Some of the tests are no longer necessary because - // the init code clients are doing the magic to make the - // board appear as the minimum value for things like memory. - if(/* (sst1M->fbiMemSize != sst1S->fbiMemSize) || */ - /*(sst1M->tmuMemSize[0] != sst1S->tmuMemSize[0]) || */ - (sst1M->numberTmus != sst1S->numberTmus) || - (sst1M->fbiBoardID != sst1S->fbiBoardID) || - /* (sst1M->fbiRevision != sst1S->fbiRevision) || */ - /* (sst1M->tmuRevision != sst1S->tmuRevision) || */ - (sst1M->fbiVideoStruct != sst1S->fbiVideoStruct)) { - INIT_PRINTF(("sst1InitSli() ERROR: Boards types must be identical...\n")); - return(FXFALSE); - } - - // Verify that no video scanline doubling is being used... - if(sst1M->fbiVideoStruct->miscCtrl & BIT(1)) { - INIT_PRINTF(("sst1InitSli() ERROR: Scanline doubling not supported with SLI...\n")); - return(FXFALSE); - } - - INIT_PRINTF(("sst1InitSli(): Enabling Scanline Interleaving...\n")); - - // sst1Initidle() routines must be properly executed... - initIdleEnabled = 1; - - // User override of swap algorithm... - if(GETENV(("SSTV2_SLISWAP"))) { - FxU32 swapAlg = ATOI(GETENV(("SSTV2_SLISWAP"))); - - if(swapAlg == 1) { - INIT_PRINTF(("sst1InitSli(): Using dac_data[0] for swapping(%d, %d)...\n", videoWindowActive, videoWindowActiveDrag)); - swapAlgorithm = SST_SWAP_DACDATA0; - } - } - - // Get values setup by sst1InitVideo()... - memOffsetOrig = (IGET(sstMaster->fbiInit2) & SST_VIDEO_BUFFER_OFFSET) >> - SST_VIDEO_BUFFER_OFFSET_SHIFT; - tilesInXOrig = (IGET(sstMaster->fbiInit1) & SST_VIDEO_TILES_IN_X) >> - SST_VIDEO_TILES_IN_X_SHIFT; - if(IGET(sstMaster->fbiInit1) & SST_VIDEO_TILES_IN_X_MSB) - tilesInXOrig += 16; - - if(tilesInXOrig & 0x1) { - // (e.g. 800x600 resolution) - /* - Integer formula for: - memOffset = - (TRUNC((xDimension/64)+.99) * - TRUNC((((yDimension/2)+1)/32)+.99)) - */ - memOffsetNew = (tilesInXOrig * - ((((sst1CurrentBoard->fbiVideoHeight>>1)+1) + 31) >> 5)); - } else { - // (e.g. 640x480 resolution) - // Calculate number of tiles in the vertical dimension - // Must add entire row of tiles at the bottom for fixes for - // Y-Origin at lower left - memOffsetNew = tilesInXOrig * - (((sst1CurrentBoard->fbiVideoHeight >> 1) + 32) >> 5); - } - - if(sst1CurrentBoard->fbiMemSize == 1) - memSizeInPages = 256; - else if(sst1CurrentBoard->fbiMemSize == 2) - memSizeInPages = 512; - else - memSizeInPages = 1024; - - memFifoRowBaseNew = (sst1CurrentBoard->fbiVideoColBuffs + - sst1CurrentBoard->fbiVideoAuxBuffs) * memOffsetNew; - - memFifoEntriesNew = (65536 - (int) - (((int) (memSizeInPages - 1) - - (int) memFifoRowBaseNew) * 512)) >> 5; - if(memFifoEntriesNew <= 256) - memFifoEntriesNew = 0x100; // max. memory fifo size... - else if(memFifoEntriesNew >= 2048) { - INIT_PRINTF(("sst1InitSli(): Invalid memFifoEntriesNew 0x%x\n", - memFifoEntriesNew)); - return(FXFALSE); - } - - INIT_PRINTF(("sst1InitSli(): Allocating %d Color Buffers and %d Aux Buffer(s)...\n", sst1CurrentBoard->fbiVideoColBuffs, sst1CurrentBoard->fbiVideoAuxBuffs)); - INIT_PRINTF(("sst1InitSli(): Allocating Memory/Command Fifo starting at page %d...\n", memFifoRowBaseNew)); - INIT_PRINTF(("sst1InitSli(): Memory FIFO Entries: %d...\n", - 65536 - (memFifoEntriesNew << 5))); -#if 0 - INIT_PRINTF(("sst1InitSli(): memOffsetOrig:%d, tilesInXOrig:%d\n", - memOffsetOrig, tilesInXOrig)); - INIT_PRINTF(("sst1InitSli(): memOffsetNew:%d, memFifoEntriesNew:0x%x\n", - memOffsetNew, memFifoEntriesNew)); -#endif - - // Setup SLI Slave... - cntr = 0; - while(1) { - if(sst1InitCheckBoard(sstbase1) == FXFALSE) - return(FXFALSE); - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); - PCICFG_WR(SST1_PCI_INIT_ENABLE, - ((j & ~SST_SCANLINE_SLV_OWNPCI) | SST_SCANLINE_SLI_SLV)); - ISET(sstSlave->fbiInit1, IGET(sstSlave->fbiInit1) | - (SST_VIDEO_RESET | SST_EN_SCANLINE_INTERLEAVE)); - sst1InitIdleFBINoNOP(sstbase1); - ISET(SST_TREX(sstSlave,0)->trexInit1, sst1CurrentBoard->tmuInit1[0] | - SST_EN_TEX_SCANLINE_INTERLEAVE | SST_TEX_SCANLINE_INTERLEAVE_SLAVE); - sst1InitIdle(sstbase1); - ISET(SST_TREX(sstSlave,1)->trexInit1, sst1CurrentBoard->tmuInit1[1] | - SST_EN_TEX_SCANLINE_INTERLEAVE | SST_TEX_SCANLINE_INTERLEAVE_SLAVE); - sst1InitIdle(sstbase1); - ISET(SST_TREX(sstSlave,2)->trexInit1, sst1CurrentBoard->tmuInit1[2] | - SST_EN_TEX_SCANLINE_INTERLEAVE | SST_TEX_SCANLINE_INTERLEAVE_SLAVE); - sst1InitIdle(sstbase1); - sst1InitIdleFBINoNOP(sstbase1); - ISET(sstSlave->fbiInit2, (IGET(sstSlave->fbiInit2) & - ~SST_SWAP_ALGORITHM) | swapAlgorithm); - sst1InitIdleFBINoNOP(sstbase1); - // Initialize Y-Origin - ISET(sstSlave->fbiInit3, (IGET(sstSlave->fbiInit3) & ~SST_YORIGIN_TOP) | - (sst1CurrentBoard->fbiVideoHeight << SST_YORIGIN_TOP_SHIFT)); - sst1InitIdleFBINoNOP(sstbase1); - ISET(sstSlave->fbiInit2, (IGET(sstSlave->fbiInit2) & - ~SST_VIDEO_BUFFER_OFFSET) | - (memOffsetNew << SST_VIDEO_BUFFER_OFFSET_SHIFT)); - sst1CurrentBoard->fbiVideoMemOffset = memOffsetNew; - sst1InitIdleFBINoNOP(sstbase1); - // Initialize memory fifo - ISET(sstSlave->fbiInit0, (IGET(sstSlave->fbiInit0) & - ~SST_MEM_FIFO_HWM) | (memFifoEntriesNew << SST_MEM_FIFO_HWM_SHIFT)); - sst1InitIdleFBINoNOP(sstbase1); - ISET(sstSlave->fbiInit4, (IGET(sstSlave->fbiInit4) & - ~SST_MEM_FIFO_ROW_BASE) | - (memFifoRowBaseNew << SST_MEM_FIFO_ROW_BASE_SHIFT)); - sst1InitIdleFBINoNOP(sstbase1); - // Fix video dimensions - ISET(sstSlave->videoDimensions, - (((sst1CurrentBoard->fbiVideoHeight+2) << SST_VIDEO_YDIM_SHIFT) | - ((sst1CurrentBoard->fbiVideoWidth-1) << SST_VIDEO_XDIM_SHIFT))); - sst1InitIdleFBINoNOP(sstbase1); - // Setup video clocks - ISET(sstSlave->fbiInit5, (IGET(sstSlave->fbiInit5) & - ~(SST_VIDEO_CLK_SLAVE_OE_EN | SST_VID_CLK_2X_OUT_OE_EN)) | - SST_VID_CLK_DAC_DATA16_SEL); - ISET(sstSlave->fbiInit1, IGET(sstSlave->fbiInit1) & - ~SST_VIDEO_VID_CLK_SLAVE); - sst1CurrentBoard->fbiInit6 &= ~SST_SLI_SYNC_MASTER; - sst1CurrentBoard->fbiInit6 = ((sst1CurrentBoard->fbiInit6 & - ~(SST_SLI_SWAP_VACTIVE | SST_SLI_SWAP_VACTIVE_DRAG)) | - (videoWindowActive<fbiInit6, sst1CurrentBoard->fbiInit6); - - slaveVInClkDel = 0; - slaveVOutClkDel = 0; - slavePVOutClkDel = 0; - - if(GETENV(("SSTV2_SLIS_VOUT_CLKDEL"))) - SSCANF(GETENV(("SSTV2_SLIS_VOUT_CLKDEL")), "%ld", &slaveVOutClkDel); - if(GETENV(("SSTV2_SLIS_PVOUT_CLKDEL"))) - SSCANF(GETENV(("SSTV2_SLIS_PVOUT_CLKDEL")), "%ld", &slavePVOutClkDel); - if(GETENV(("SSTV2_SLIS_VIN_CLKDEL"))) - SSCANF(GETENV(("SSTV2_SLIS_VIN_CLKDEL")), "%ld", &slaveVInClkDel); - INIT_PRINTF(("sst1InitSli(): slaveVinClkdel=0x%x, slaveVOutClkDel=0x%x, slavePVOutClkDel=0x%x\n", - slaveVInClkDel, slaveVOutClkDel, slavePVOutClkDel)); - if(sst1CurrentBoard->fbiVideo16BPP) - // 16-bit Video Output - ISET(sstSlave->fbiInit1, (IGET(sstSlave->fbiInit1) & - ~(SST_VIDEO_VCLK_2X_OUTPUT_DEL | SST_VIDEO_VCLK_DEL | - SST_VIDEO_VCLK_SEL | SST_VIDEO_VCLK_2X_INPUT_DEL)) | - SST_EN_SCANLINE_INTERLEAVE | - // SST_VIDEO_VID_CLK_SLAVE | - // SST_VIDEO_VID_CLK_2X | - // SST_VIDEO_INVERT_VID_CLK_2X | - SST_VIDEO_VCLK_SEL | - SST_PCI_WRWS_1 | - (slaveVInClkDel << SST_VIDEO_VCLK_DEL_SHIFT) | - (slaveVOutClkDel << SST_VIDEO_VCLK_2X_OUTPUT_DEL_SHIFT) | - (slavePVOutClkDel << SST_VIDEO_VCLK_2X_INPUT_DEL_SHIFT)); - else - // 24-bit Video Output - ISET(sstSlave->fbiInit1, (IGET(sstSlave->fbiInit1) & - ~(SST_VIDEO_VCLK_2X_OUTPUT_DEL | SST_VIDEO_VCLK_DEL | - SST_VIDEO_VCLK_SEL | SST_VIDEO_VCLK_2X_INPUT_DEL)) | - SST_EN_SCANLINE_INTERLEAVE | - // SST_VIDEO_VID_CLK_SLAVE | - // SST_VIDEO_VID_CLK_2X | - // SST_VIDEO_INVERT_VID_CLK_2X | - (0x0 << SST_VIDEO_VCLK_SEL_SHIFT) | - SST_PCI_WRWS_1 | - (slaveVInClkDel << SST_VIDEO_VCLK_DEL_SHIFT) | - (slaveVOutClkDel << SST_VIDEO_VCLK_2X_OUTPUT_DEL_SHIFT) | - (slavePVOutClkDel << SST_VIDEO_VCLK_2X_INPUT_DEL_SHIFT)); - sst1InitIdleFBINoNOP(sstbase1); - ISET(sstSlave->fbiInit1, IGET(sstSlave->fbiInit1) & - ~(SST_VIDEO_DATA_OE_EN | - SST_VIDEO_BLANK_OE_EN | - SST_VIDEO_BLANK_EN | - SST_VIDEO_DCLK_OE_EN | - SST_VIDEO_HVSYNC_OE_EN)); - sst1InitIdleFBINoNOP(sstbase1); - // Initialize pci and memory fifos... - pciFifoLwm = 16; - memFifoLwm = 26; - if(!GETENV(("SSTV2_PCIFIFO_LWM"))) - ISET(sstSlave->fbiInit0, (IGET(sstSlave->fbiInit0) & - ~SST_PCI_FIFO_LWM) | (pciFifoLwm << SST_PCI_FIFO_LWM_SHIFT)); - sst1InitIdleFBINoNOP(sstbase1); - if(!GETENV(("SSTV2_MEMFIFO_LWM"))) - ISET(sstSlave->fbiInit4, (IGET(sstSlave->fbiInit4) & - ~SST_MEM_FIFO_LWM) | (memFifoLwm << SST_MEM_FIFO_LWM_SHIFT)); - sst1InitIdleFBINoNOP(sstbase1); - INIT_PRINTF(("sst1InitSli(): Slave pciFifoLwm:%d, memFifoLwm:%d\n", - ((IGET(sstSlave->fbiInit0) & SST_PCI_FIFO_LWM) >> - SST_PCI_FIFO_LWM_SHIFT), - ((IGET(sstSlave->fbiInit4) & SST_MEM_FIFO_LWM) >> - SST_MEM_FIFO_LWM_SHIFT))); - sst1InitIdleFBINoNOP(sstbase1); - sst1InitIdleFBINoNOP(sstbase1); - ISET(sstSlave->fbiInit1, IGET(sstSlave->fbiInit1) | - (SST_EN_SCANLINE_INTERLEAVE | SST_VIDEO_RESET)); - sst1InitIdleFBINoNOP(sstbase1); - sst1InitIdleFBINoNOP(sstbase1); - sst1InitIdleFBINoNOP(sstbase1); - ISET(sstSlave->fbiInit1, IGET(sstSlave->fbiInit1) & ~SST_VIDEO_RESET); - sst1InitIdleFBINoNOP(sstbase1); - sst1InitIdleFBINoNOP(sstbase1); - if(IGET(sstSlave->fbiInit1) & SST_VIDEO_RESET) { - INIT_PRINTF(("sst1InitSli(): Could not unReset Slave Video...\n")); - if(++cntr < 10) - continue; - else - return(FXFALSE); - } - if(!(IGET(sstSlave->fbiInit1) & SST_EN_SCANLINE_INTERLEAVE)) { - INIT_PRINTF(("sst1InitSli(): Could not setup SLI Slave...\n")); - if(++cntr < 10) - continue; - else - return(FXFALSE); - } - break; - } - - // Setup SLI Master... - if(sst1InitCheckBoard(sstbase0) == FXFALSE) - return(FXFALSE); - ISET(sstMaster->fbiInit1, IGET(sstMaster->fbiInit1) | SST_VIDEO_RESET); - ISET(SST_TREX(sstMaster,0)->trexInit1, sst1CurrentBoard->tmuInit1[0] | - SST_EN_TEX_SCANLINE_INTERLEAVE); - sst1InitIdle(sstbase0); - ISET(SST_TREX(sstMaster,1)->trexInit1, sst1CurrentBoard->tmuInit1[1] | - SST_EN_TEX_SCANLINE_INTERLEAVE); - sst1InitIdle(sstbase0); - ISET(SST_TREX(sstMaster,2)->trexInit1, sst1CurrentBoard->tmuInit1[2] | - SST_EN_TEX_SCANLINE_INTERLEAVE); - sst1InitIdle(sstbase0); - sst1InitIdleFBINoNOP(sstbase0); - ISET(sstMaster->fbiInit2, (IGET(sstMaster->fbiInit2) & - ~SST_SWAP_ALGORITHM) | swapAlgorithm); - sst1InitIdleFBINoNOP(sstbase0); - // Initialize Y-Origin - ISET(sstMaster->fbiInit3, (IGET(sstMaster->fbiInit3) & ~SST_YORIGIN_TOP) | - ((sst1CurrentBoard->fbiVideoHeight) << SST_YORIGIN_TOP_SHIFT)); - sst1InitIdleFBINoNOP(sstbase0); - if(sst1CurrentBoard->fbiVideoWidth == 960) - ISET(sstMaster->fbiInit0, IGET(sstMaster->fbiInit0) & ~SST_MEM_FIFO_EN); - ISET(sstMaster->fbiInit2, (IGET(sstMaster->fbiInit2) & - ~SST_VIDEO_BUFFER_OFFSET) | - (memOffsetNew << SST_VIDEO_BUFFER_OFFSET_SHIFT)); - sst1CurrentBoard->fbiVideoMemOffset = memOffsetNew; - sst1InitIdleFBINoNOP(sstbase0); - // // Initialize memory fifo - ISET(sstMaster->fbiInit0, (IGET(sstMaster->fbiInit0) & ~SST_MEM_FIFO_HWM) | - (memFifoEntriesNew << SST_MEM_FIFO_HWM_SHIFT)); - sst1InitIdleFBINoNOP(sstbase0); - ISET(sstMaster->fbiInit4, (IGET(sstMaster->fbiInit4) & - ~SST_MEM_FIFO_ROW_BASE) | - (memFifoRowBaseNew << SST_MEM_FIFO_ROW_BASE_SHIFT)); - sst1InitIdleFBINoNOP(sstbase0); - // Fix video dimensions - ISET(sstMaster->videoDimensions, - (((sst1CurrentBoard->fbiVideoHeight+2) << SST_VIDEO_YDIM_SHIFT) | - ((sst1CurrentBoard->fbiVideoWidth-1) << SST_VIDEO_XDIM_SHIFT))); - sst1InitIdleFBINoNOP(sstbase0); - // Setup video clocks - ISET(sstMaster->fbiInit5, IGET(sstMaster->fbiInit5) | - SST_VIDEO_CLK_SLAVE_OE_EN | SST_VID_CLK_2X_OUT_OE_EN | - SST_VID_CLK_DAC_DATA16_SEL); - ISET(sstMaster->fbiInit1, IGET(sstMaster->fbiInit1) & - ~SST_VIDEO_VID_CLK_SLAVE); - sst1CurrentBoard->fbiInit6 |= SST_SLI_SYNC_MASTER; - sst1CurrentBoard->fbiInit6 = ((sst1CurrentBoard->fbiInit6 & - ~(SST_SLI_SWAP_VACTIVE | SST_SLI_SWAP_VACTIVE_DRAG)) | - (videoWindowActive<fbiInit6, sst1CurrentBoard->fbiInit6); - - // Following work well up to around 100 MHz... - // masterVInClkDel = 2; - // masterVOutClkDel = 0; - // masterPVOutClkDel = 0; - // Following seem to work up to 800x600@85 Hz (112 MHz) - masterVInClkDel = 3; - masterVOutClkDel = 2; - masterPVOutClkDel = 0; - if(GETENV(("SSTV2_SLIM_VOUT_CLKDEL"))) - SSCANF(GETENV(("SSTV2_SLIM_VOUT_CLKDEL")), "%ld", &masterVOutClkDel); - if(GETENV(("SSTV2_SLIM_PVOUT_CLKDEL"))) - SSCANF(GETENV(("SSTV2_SLIM_PVOUT_CLKDEL")), "%ld", &masterPVOutClkDel); - if(GETENV(("SSTV2_SLIM_VIN_CLKDEL"))) - SSCANF(GETENV(("SSTV2_SLIM_VIN_CLKDEL")), "%ld", &masterVInClkDel); - INIT_PRINTF(("sst1InitSli(): masterVinClkdel=0x%x, masterVOutClkDel=0x%x, masterPVOutClkDel=0x%x\n", - masterVInClkDel, masterVOutClkDel, masterPVOutClkDel)); - if(sst1CurrentBoard->fbiVideo16BPP) - // 16-bit Video Output - ISET(sstMaster->fbiInit1, (IGET(sstMaster->fbiInit1) & - ~(SST_VIDEO_VCLK_2X_OUTPUT_DEL | SST_VIDEO_VCLK_DEL | - SST_VIDEO_VCLK_SEL | SST_VIDEO_VCLK_2X_INPUT_DEL | - SST_VIDEO_BLANK_EN)) | - SST_EN_SCANLINE_INTERLEAVE | - // SST_VIDEO_VID_CLK_2X | - // SST_VIDEO_INVERT_VID_CLK_2X | - SST_VIDEO_VCLK_SEL | - SST_PCI_WRWS_1 | - SST_VIDEO_DATA_OE_EN | - SST_VIDEO_DCLK_OE_EN | - SST_VIDEO_HVSYNC_OE_EN | - (masterVInClkDel << SST_VIDEO_VCLK_DEL_SHIFT) | - (masterVOutClkDel << SST_VIDEO_VCLK_2X_OUTPUT_DEL_SHIFT) | - (masterPVOutClkDel << SST_VIDEO_VCLK_2X_INPUT_DEL_SHIFT)); - else { - // 24-bit Video Output - ISET(sstMaster->fbiInit1, (IGET(sstMaster->fbiInit1) & - ~(SST_VIDEO_VCLK_2X_OUTPUT_DEL | SST_VIDEO_VCLK_DEL | - SST_VIDEO_VCLK_SEL | SST_VIDEO_VCLK_2X_INPUT_DEL | - SST_VIDEO_BLANK_EN)) | - SST_EN_SCANLINE_INTERLEAVE | - // SST_VIDEO_VID_CLK_2X | - // SST_VIDEO_INVERT_VID_CLK_2X | - (0x0 << SST_VIDEO_VCLK_SEL_SHIFT) | - SST_PCI_WRWS_1 | - SST_VIDEO_DATA_OE_EN | - SST_VIDEO_DCLK_OE_EN | - SST_VIDEO_HVSYNC_OE_EN | - (masterVInClkDel << SST_VIDEO_VCLK_DEL_SHIFT) | - (masterVOutClkDel << SST_VIDEO_VCLK_2X_OUTPUT_DEL_SHIFT) | - (masterPVOutClkDel << SST_VIDEO_VCLK_2X_INPUT_DEL_SHIFT)); - sst1InitReturnStatus(sstbase0); - ISET(sstMaster->fbiInit5, IGET(sstMaster->fbiInit5) | - SST_VIDEO_CLK_SLAVE_OE_EN | SST_VID_CLK_2X_OUT_OE_EN); - } - sst1InitIdleFBINoNOP(sstbase0); - // Initialize pci and memory fifos... - pciFifoLwm = 16; - memFifoLwm = 26; - if(!GETENV(("SSTV2_PCIFIFO_LWM"))) - ISET(sstMaster->fbiInit0, (IGET(sstMaster->fbiInit0) & - ~SST_PCI_FIFO_LWM) | (pciFifoLwm << SST_PCI_FIFO_LWM_SHIFT)); - sst1InitIdleFBINoNOP(sstbase0); - if(!GETENV(("SSTV2_MEMFIFO_LWM"))) - ISET(sstMaster->fbiInit4, (IGET(sstMaster->fbiInit4) & - ~SST_MEM_FIFO_LWM) | (memFifoLwm << SST_MEM_FIFO_LWM_SHIFT)); - sst1InitIdleFBINoNOP(sstbase0); - INIT_PRINTF(("sst1InitSli(): Master pciFifoLwm:%d, memFifoLwm:%d\n", - ((IGET(sstMaster->fbiInit0) & SST_PCI_FIFO_LWM) >> - SST_PCI_FIFO_LWM_SHIFT), - ((IGET(sstMaster->fbiInit4) & SST_MEM_FIFO_LWM) >> - SST_MEM_FIFO_LWM_SHIFT))); - ISET(sstMaster->fbiInit1, IGET(sstMaster->fbiInit1) & ~SST_VIDEO_RESET); - sst1InitIdleFBINoNOP(sstbase0); - - // Master - if(sst1InitCheckBoard(sstbase0) == FXFALSE) - return(FXFALSE); - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); - PCICFG_WR(SST1_PCI_INIT_ENABLE, - (j & ~(SST_SCANLINE_SLV_OWNPCI | SST_SCANLINE_SLI_SLV))); - MasterPhysAddr = sst1CurrentBoard->physAddr[0]; - sst1InitReturnStatus(sstbase0); // flush pci packer with reads - sst1InitReturnStatus(sstbase0); - sst1InitReturnStatus(sstbase0); - - // Slave - if(sst1InitCheckBoard(sstbase1) == FXFALSE) - return(FXFALSE); - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); - PCICFG_WR(SST1_PCI_INIT_ENABLE, - ((j & ~(SST_SCANLINE_SLV_OWNPCI)) | SST_SCANLINE_SLI_SLV)); - - /* dpc - 19 may 1998 - FixMe - * Min the clock values for the two boards so that they are - * happy running together. - */ -#define MIN(__a, __b) (((__a) < (__b)) ? (__a) : (__b)) - { - sst1DeviceInfoStruct* infoMaster; - sst1DeviceInfoStruct* infoSlave; - - if (!sst1InitCheckBoard(sstbase0)) return FXFALSE; - infoMaster = sst1CurrentBoard; - - if (!sst1InitCheckBoard(sstbase1)) return FXFALSE; - infoSlave = sst1CurrentBoard; - - /* fbi and tmu clock freqs should be equal since they are - * both set from sst1InitCalcGrxClk. - */ - if (infoMaster->fbiGrxClkFreq != infoSlave->fbiGrxClkFreq) { - /* Recompute the actual clock rates before any clocking down - * due to sli for some board revisions. - */ - if (!sst1InitCalcGrxClk(sstbase0)) return FXFALSE; - if (!sst1InitCalcGrxClk(sstbase1)) return FXFALSE; - - /* Save the min clock of the two boards */ - infoMaster->fbiGrxClkFreq = - infoMaster->tmuGrxClkFreq = - infoSlave->fbiGrxClkFreq = - infoSlave->tmuGrxClkFreq = MIN(infoMaster->fbiGrxClkFreq, infoSlave->fbiGrxClkFreq); - - /* Clear the clock setting bits */ - infoMaster->initGrxClkDone = - infoSlave->initGrxClkDone = FXFALSE; - - /* Reset the clocks for each board */ - if (!sst1InitGrxClk(sstbase0)) return FXFALSE; - if (!sst1InitGrxClk(sstbase1)) return FXFALSE; - - /* Now check for the memory configurations of the devices. - * They no longer need to match, but any future calls to - * sst1InitGetDeviceInfo should now reflect the current - * minimized state of the world. - */ - { - FxU32 memSize, i; - - if (infoMaster->fbiMemSize != infoSlave->fbiMemSize) { - memSize = MIN(infoMaster->fbiMemSize, infoSlave->fbiMemSize); - infoMaster->fbiMemSize = - infoSlave->fbiMemSize = memSize; - } - - for(i = 0; i < infoMaster->numberTmus; i++) { - if (infoMaster->tmuMemSize[i] != infoSlave->tmuMemSize[i]) { - memSize = MIN(infoMaster->tmuMemSize[i], infoSlave->tmuMemSize[i]); - infoMaster->tmuMemSize[i] = - infoSlave->tmuMemSize[i] = memSize; - } - } - } - } - } -#undef MIN - - // Enable SLI Bus Snooping for the Slave - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); - PCICFG_WR(SST1_PCI_INIT_ENABLE, (j & ~SST_SLI_SNOOP_MEMBASE) | - ((MasterPhysAddr>>24 & 0xff) << SST_SLI_SNOOP_MEMBASE_SHIFT)); - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); - PCICFG_WR(SST1_PCI_INIT_ENABLE, j | SST_SLI_SNOOP_EN); - sst1InitReturnStatus(sstbase1); // flush pci packer with reads - sst1InitReturnStatus(sstbase1); - sst1InitReturnStatus(sstbase1); - - // Reset video unit in both Master and Slave - // Then, reset graphics unit in both Master and Slave - // Finally, deassert both resets to guarantee that Master and Slave - // see the same vsyncs (and maintain the same swap buffer counter) - - // Probit writes to PCI fifo while resetting graphics core - if(sst1InitCheckBoard(sstbase0) == FXFALSE) - return(FXFALSE); - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); - PCICFG_WR(SST1_PCI_INIT_ENABLE, j & ~SST_PCI_FIFOWR_EN); - if(sst1InitCheckBoard(sstbase1) == FXFALSE) - return(FXFALSE); - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); - PCICFG_WR(SST1_PCI_INIT_ENABLE, j & ~SST_PCI_FIFOWR_EN); - - // Reset Video core... - if(sst1InitCheckBoard(sstbase0) == FXFALSE) - return(FXFALSE); - ISET(sstMaster->fbiInit1, IGET(sstMaster->fbiInit1) | SST_VIDEO_RESET); - sst1InitReturnStatus(sstbase0); - ISET(sstSlave->fbiInit1, IGET(sstSlave->fbiInit1) | SST_VIDEO_RESET); - sst1InitReturnStatus(sstbase1); - - // Reset Graphics core... - ISET(sstMaster->fbiInit0, IGET(sstMaster->fbiInit0) | SST_GRX_RESET); - sst1InitReturnStatus(sstbase0); - ISET(sstSlave->fbiInit0, IGET(sstSlave->fbiInit0) | SST_GRX_RESET); - sst1InitReturnStatus(sstbase1); - - // Allow resets to propogate... - sst1InitReturnStatus(sstbase0); - sst1InitReturnStatus(sstbase1); - sst1InitReturnStatus(sstbase0); - sst1InitReturnStatus(sstbase1); - - // De-assert reset to Graphics core... - ISET(sstMaster->fbiInit0, IGET(sstMaster->fbiInit0) & ~SST_GRX_RESET); - sst1InitReturnStatus(sstbase0); - ISET(sstSlave->fbiInit0, IGET(sstSlave->fbiInit0) & ~SST_GRX_RESET); - sst1InitReturnStatus(sstbase1); - - // De-assert reset to Video core... - ISET(sstMaster->fbiInit1, IGET(sstMaster->fbiInit1) & ~SST_VIDEO_RESET); - sst1InitReturnStatus(sstbase0); - ISET(sstSlave->fbiInit1, IGET(sstSlave->fbiInit1) & ~SST_VIDEO_RESET); - sst1InitReturnStatus(sstbase1); - - // Allow writes to PCI fifo... - if(sst1InitCheckBoard(sstbase0) == FXFALSE) - return(FXFALSE); - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); - PCICFG_WR(SST1_PCI_INIT_ENABLE, j | SST_PCI_FIFOWR_EN); - // Update info structure for initEnable - sst1CurrentBoard->fbiInitEnable = j | SST_PCI_FIFOWR_EN; - - if(sst1InitCheckBoard(sstbase1) == FXFALSE) - return(FXFALSE); - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); - PCICFG_WR(SST1_PCI_INIT_ENABLE, j | SST_PCI_FIFOWR_EN); - // Update info structure for initEnable - sst1CurrentBoard->fbiInitEnable = j | SST_PCI_FIFOWR_EN; - - if(sst1InitCheckBoard(sstbase0) == FXFALSE) - return(FXFALSE); - - // Clear fbistat registers after clearing screen - ISET(sstMaster->nopCMD, 0x1); - - sst1CurrentBoard->sliSlaveVirtAddr = sstbase1; - - sst1InitIdle(sstbase0); - - // Synchronize Boards - for(j=0; j<3; j++) { - while(!(sst1InitReturnStatus(sstbase0) & SST_VRETRACE)) - ; - IGET(sstMaster->status); - ISET(sstMaster->swapbufferCMD, 0x0); // Do not wait for vRetrace... - IGET(sstMaster->status); - sst1InitIdle(sstbase0); - } - while(!(sst1InitReturnStatus(sstbase0) & SST_VRETRACE)) - ; - IGET(sstMaster->status); - ISET(sstMaster->swapbufferCMD, 0x1); // Sync to vRetrace... - IGET(sstMaster->status); - sst1InitIdle(sstbase0); - - if(GETENV(("SSTV2_IGNORE_IDLE"))) - initIdleEnabled = 0; - - INIT_PRINTF(("sst1InitSli() exiting with status %d...\n", FXTRUE)); - return(FXTRUE); -} - -/* -** sst1InitShutdownSli(): -** Shutdown SLI configuration -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitShutdownSli(FxU32 *sstbase) -{ - SstRegs *sstMaster = (SstRegs *) sstbase; - SstRegs *sstSlave; - FxU32 n, j, cntr; - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - sstSlave = (SstRegs *) sst1CurrentBoard->sliSlaveVirtAddr; - - if(sst1CurrentBoard->sliSlaveVirtAddr != (FxU32 *) NULL) { - INIT_PRINTF(("sst1InitShutdownSli(): Disabling Scanline Interleaving...\n")); - sst1CurrentBoard->sliSlaveVirtAddr = (FxU32 *) NULL; - - cntr = 0; - while(1) { - if(sst1InitCheckBoard((FxU32 *) sstSlave) == FXFALSE) - return(FXFALSE); - // Turn off scanline interleaving and snooping in slave... - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); - PCICFG_WR(SST1_PCI_INIT_ENABLE, j & ~(SST_SCANLINE_SLV_OWNPCI | - SST_SCANLINE_SLI_SLV | SST_SLI_SNOOP_EN | - SST_SLI_SNOOP_MEMBASE)); - ISET(sstSlave->fbiInit1, IGET(sstSlave->fbiInit1) & - ~SST_EN_SCANLINE_INTERLEAVE); - sst1InitIdle((FxU32 *) sstSlave); - - if(IGET(sstSlave->fbiInit1) & SST_EN_SCANLINE_INTERLEAVE) { - if(++cntr < 10) - continue; - else { - INIT_PRINTF(("sst1InitShutdown(): Could not disable Slave SLI...\n")); - return(FXFALSE); - } - } - break; - } - if(sst1InitCheckBoard((FxU32 *) sstMaster) == FXFALSE) - return(FXFALSE); - ISET(sstMaster->fbiInit1, IGET(sstMaster->fbiInit1) & - ~SST_EN_SCANLINE_INTERLEAVE); - sst1InitIdle((FxU32 *) sstMaster); - } - return(FXTRUE); -} - -/* -** sst1InitSliDetect(): -** Determine if scanline interleave has been detected (either through -** power-up settings or through SST_SLIDETECT) -** -*/ -FX_ENTRY FxU32 FX_CALL sst1InitSliDetect(FxU32 *sstbase) -{ - FxU32 sliDetected; - - if(GETENV(("SSTV2_SLIDETECT"))) - sliDetected = ATOI(GETENV(("SSTV2_SLIDETECT"))); - else - sliDetected = sst1InitSliPaired(sstbase); - - return sliDetected; -} - -/* -** sst1InitSliPaired(): -** Determine if scanline interleave has been detected through -** power-up settings. -** -*/ -FX_ENTRY FxU32 FX_CALL -sst1InitSliPaired(FxU32 *sstbase) -{ - static int firstTime = 1; - static FxU32 sliPaired = 0; - - if(firstTime) { - SstRegs* sst = (SstRegs *) sstbase; - - sliPaired = (((IGET(sst->fbiInit5) & SST_SLI_DETECT) == SST_SLI_DETECT) && - (boardsInSystem > 1)); - firstTime = 0; - } - - return sliPaired; -} - -#ifdef _WIN32 -#pragma optimize ("",on) -#endif diff --git a/glide2x/cvg/init/sst1init.c b/glide2x/cvg/init/sst1init.c deleted file mode 100644 index 340e13a..0000000 --- a/glide2x/cvg/init/sst1init.c +++ /dev/null @@ -1,1332 +0,0 @@ -/*-*-c++-*-*/ -/* -** 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$ -** -*/ - -/* -** Initialization code for SST-1 board. -** -** NOTE: This code must compiled with optimizations DISABLED!! -** -** The following environment variables can optionally be used to alter -** functionality (A value of X is a "don't care"): -** -** Variable Value Description -** -------- ----- ----------- -** SSTV2_ARCADE X Allow special configs for arcade use -** SSTV2_ALLOC_AUX {0,1} Number of aux. buffers to allocate -** SSTV2_ALLOC_COLOR {2,3} Number of color buffers to allocate -** SSTV2_BACKPORCH hex Specify value of backPorch video register -** SSTV2_BOARDS val Specify number of SST-1 boards in system -** SSTV2_CMDFIFO_DIRECT X Enable Direct Execution of CMDFIFO -** SSTV2_CMDFIFO_NOHOLES X Disable hole counting feature in CMDFIFO -** SSTV2_DEBUGDAC X Print out debug information for DAC -** reads and writes -** SSTV2_DEVICEID X Specify the device ID value passed to -** the PCI library -** SSTV2_DIMENSIONS hex Specify value of videoDimensions register -** SSTV2_FASTMEM_RAS_READS X Allow fast ras reads -** SSTV2_FASTPCIRD X Enable fast PCI reads -** SSTV2_FBICFG hex Specify FBI configuration strapping bits -** SSTV2_FBI_MEMSIZE val Specify amount of frame buffer memory -** SSTV2_FT_CLKDEL hex Fbi-to-Trex clock delay value -** SSTV2_GAMMA float Floating point value for gamma correction -** SSTV2_GRXCLK val 16 <= Frequency < 80 (50 is default) -** SSTV2_HSYNC hex Specify value of hSync video register -** SSTV2_IGNORE_CLKDELAYS X Ignore calls to sst1InitSetClkDelays() -** SSTV2_IGNORE_IDLE X Ignore calls to sst1InitIdle*() -** SSTV2_IGNORE_INIT_GAMMA X Bypass sst1InitGamma call and return -** SSTV2_IGNORE_INIT_REGISTERS X Bypass sst1InitRegisters call and return -** SSTV2_IGNORE_INIT_VIDEO X Bypass sst1InitVideo call and return -** SSTV2_INITDEBUG X Enable debug output -** SSTV2_INITDEBUG_FILE file File to direct all debug output -** SSTV2_MEMFIFO 0 Disable FBI Memory FIFO -** SSTV2_MEMFIFO 1 Enable FBI Memory FIFO -** SSTV2_MEMFIFO_ENTRIES hex Set number of entries in memory fifo -** SSTV2_MEMFIFO_HWM hex Set memory fifo high water mark -** SSTV2_MEMFIFO_LFB {0,1} Specify LFB writes through Memory FIFO -** SSTV2_MEMFIFO_LWM hex Set memory fifo low water mark -** SSTV2_MEMFIFO_TEX {0,1} Specify Texture writes through Mem FIFO -** SSTV2_MEMOFFSET hex Specify value of memoffset video register -** SSTV2_NOCHECKHANG X Do not Check for FBI Hangs for texturing -** SSTV2_NODEVICEINFO X Ignore calls to sst1InitFillDeviceInfo() -** SSTV2_NOSHUTDOWN X Do not turn off monitor refresh on call -** to sst1InitShutdown() -** SSTV2_NUM_TMUS {1,2,3} Specify number of TMUs detected -** SSTV2_PCIFIFO_LWM hex Set pci fifo low water mark -** SSTV2_PFT_CLKDEL hex Preliminary Fbi-to-Trex clock delay value -** SSTV2_PTF0_CLKDEL hex Prelim TMU2Fbi clock delay value (TMU #0) -** SSTV2_PTF1_CLKDEL hex Prelim TMU2Fbi clock delay value (TMU #1) -** SSTV2_PTF2_CLKDEL hex Prelim TMU2Fbi clock delay value (TMU #2) -** SSTV2_SIPROCESS_CNTR hex Silicon process monitor PCI counter load -** SSTV2_SLIDETECT {0,1} Specify Scanline Interleaving detection -** SSTV2_SLIM_VIN_CLKDEL hex Specify FBI internal video clock delay -** (SLI Master) -** SSTV2_SLIM_VOUT_CLKDEL hex Specify FBI external video clock delay -** (SLI Master) -** SSTV2_SLIS_VIN_CLKDEL hex Specify FBI internal video clock delay -** (SLI Slave) -** SSTV2_SLIS_VOUT_CLKDEL hex Specify FBI external video clock delay -** (SLI Slave) -** SSTV2_SCREENREFRESH {60,75, Select monitor refresh rate -** 85,120} -** SSTV2_SCREENREZ {512, Select monitor resolution (512x384) -** 512256, (512x256) -** 640400, (640x400) -** 640, (640x480) -** 800, (800x600) -** 856, (856x600) -** 960, (960x720) -** 1024} (1024x768) -** SSTV2_SLOWMEM_RTW X Insert wait state for read-to-write -** transitions -** SSTV2_SLOWMEM_WTR X Insert wait state for write-to-read -** transitions -** SSTV2_SLOWPCIWR X Enable 1 wait-state PCI writes -** SSTV2_SLISWAP 1 Use dac_data[0] for SLI swapping -** SSTV2_SWAPBOARDS X Swap order of mapping boards -** SSTV2_TEXMAP_DISABLE X Disable texture mapping -** SSTV2_TF0_CLKDEL hex Trex-to-Fbi clock delay value (TMU #0) -** SSTV2_TF1_CLKDEL hex Trex-to-Fbi clock delay value (TMU #1) -** SSTV2_TF2_CLKDEL hex Trex-to-Fbi clock delay value (TMU #2) -** SSTV2_TF_FIFO_THRESH hex Set TREX-to-FBI FIFO threshold -** SSTV2_TILESINX hex Specify value of tilesInX video register -** SSTV2_TMUCFG hex Specify TMU configuration strapping bits -** SSTV2_TMUMEM X Enable accurate determination of TMU mem -** SSTV2_TMU_MEMSIZE val Specify amount of texture memory -** SSTV2_TREX0INIT0 hex Set trexInit0 register value - TMU #0 -** SSTV2_TREX0INIT1 hex Set trexInit1 register value - TMU #0 -** SSTV2_TREX1INIT0 hex Set trexInit0 register value - TMU #1 -** SSTV2_TREX1INIT1 hex Set trexInit1 register value - TMU #1 -** SSTV2_TREX2INIT0 hex Set trexInit0 register value - TMU #2 -** SSTV2_TREX2INIT1 hex Set trexInit1 register value - TMU #2 -** SSTV2_VIN_CLKDEL hex Specify FBI internal video clock delay -** SSTV2_VOUT_CLKDEL hex Specify FBI external video clock delay -** SSTV2_VGA_PASS {0,1} Force VGA_PASS output to {0,1} -** SSTV2_VIDCLK2X val Video clock frequency (2x dot clock) -** SSTV2_VIDEO_24BPP 0 Select 16-bit video output -** SSTV2_VIDEO_24BPP 1 Select 24-bit video output -** SSTV2_VIDEO_DISABLE X Turn off Video/Monitor refresh in FBI -** SSTV2_VIDEO_FILTER_DISABLE X Disable video filtering -** SSTV2_VIDEO_FILTER_THRESHOLD hex Set video filtering threshold -** SSTV2_VIDEO_NOCLEAR X Do not clear buffers in sst1InitVideo() -** SSTV2_VIDEO_CLEARCOLOR hex Clear screen color -** SSTV2_VFIFO_THRESH {0-31} Select video fifo threshold -** SSTV2_VSYNC hex Specify value of vSync video register -** SSTV2_NOREMAP 0 Don't try to remap single board sli. -** -** VOODOO2_FILE name Filename used in place of "voodoo2.ini" -** VOODOO2_PATH path Path used to locate "voodoo2.ini" file -** -*/ - -#ifdef _WIN32 -#pragma optimize ("",off) -#endif -#include -#include -#include -#ifdef BUILD_FOR_SST1 -#include -#else -#include <3dfx.h> -#include -#include -#endif -#include -#define SST1INIT_ALLOCATE // Allocate variables in sst1init.h -#define FX_DLL_DEFINITION -#include -#if !macintosh && !__linux__ -#include -#endif -#include -#include -#include "rcver.h" - -#ifdef __WIN32__ -#include -#endif - -// Allow SourceSafe to track Revision -static char codeIdent[] = "@#%" VERSIONSTR ; - -/* -** sst1InitMapBoard(): -** Find and map SST-1 board into virtual memory -** -** Returns: -** FxU32 pointer to base of SST-1 board if successful mapping occurs -** FXFALSE if cannot map or find SST-1 board -** -*/ -FX_EXPORT FxU32 * FX_CSTYLE sst1InitMapBoard(FxU32 BoardNumber) -{ - return(sst1InitMapBoardDirect(BoardNumber, FXTRUE)); -} - -// Use this flag to force a info clear when doing a -// sst1InitMapBoard() for the first time. sst1InitShutdown() -// will also set this flag to TRUE to force a clear -// next time around. -static FxU32 clearBoardInfo = FXTRUE; - -FX_EXPORT FxU32 * FX_CSTYLE sst1InitMapBoardDirect(FxU32 BoardNumber, - FxBool resetSLI) -{ - static FxU32 firstTime = 1; - FxU32 vendorID = _3DFX_PCI_ID; // 3Dfx Vendor ID - FxU32 deviceID; // 0x0002 - Look for a Voodoo2 board (0xFFFF - Find any 3Dfx board) - FxU32 sizeOfCard = 0x1000000; // 16 MBytes of addr space for SST-1 - FxU32 *sstbase; - FxU32 n; - FxU32 j; - FxU32 sstv2_noremap = 0; - - if( GETENV( ("SSTV2_DEVICEID") ) ) - SSCANF(GETENV(("SSTV2_DEVICEID")), "%ld", &deviceID); - else - deviceID = 0x0002; - - // Open PCI library (necessary for multiple calls to init routines, after - // PCI library is closed by pciClose() call in sst1InitShutdown(). - // - // NB: It is safe to do this even if we never called pciClose. - pciOpen(); - - /* NB: firstTime does not get cleared until we actually find a - * board and get one mapped (A little weird to begin w/, but - * probably not worth changing at this late date). However, - * sst1InitMapBoard usually gets called up to MAX_PCI_DEVICES - * which means that we'll be re-counting and re-mapping boards - * over and over which is just whacked. Now, if we fail to find - * any suitable boards via sst1InitNumBoardsInSystem we clear the - * firstTime flag, and carry on checking for the non-existant - * board which will (of course) fail to map. - */ - if(firstTime) { - // Make Watcom happy - codeIdent[0] = '@'; - headersIdent[0] = '@'; - - // Find "voodoo2.ini" file if it exists... - sst1InitUseVoodooFile = sst1InitVoodooFile(); - - if( GETENV( ("SSTV2_NOREMAP") ) ) { - SSCANF(GETENV(("SSTV2_NOREMAP")), "%ld", &sstv2_noremap); - } else { - sstv2_noremap = 0; - } -#if !macintosh && !__linux__ - if (!sstv2_noremap) { - fxremap(); /* remap single board SLI */ - } -#endif - if(!(boardsInSystem = sst1InitNumBoardsInSystem())) { - firstTime = FXTRUE; - return(NULL); - } - } - - if( clearBoardInfo ) { - INIT_PRINTF(("sst1Init Routines")); -#ifdef FX_DLL_ENABLE - INIT_PRINTF(("(DLL)")); -#endif - INIT_PRINTF((": %s\n", VERSIONSTR)); - INIT_PRINTF(("sst1InitMapBoard(): BoardsInSystem = %d\n", - boardsInSystem)); - - // Clear board info structure - sst1InitClearBoardInfo(); - - clearBoardInfo = FXFALSE; - -#if !DIRECTX - /* dpc - 26 feb 1998 - * If glide is running on windows the a pciClose will close - * the vxd etc. This is not functionally longer fatal, but w/o - * it we will not be able to do things like set the caching on - * the board's memory etc. This is bad. - * - * The actual cost of doing the re-mapping again is pretty low - * because both the pci library and the init code are caching the - * addresses of the board. However, the call to the pciLibrary - * to map the board has the side affect of causing the vxd to be - * loaded. It is this that is responsible for setting up caching. - */ - firstTime = FXTRUE; -#endif /* !DIRECTX */ - } - - if(firstTime) { - int boardLoopStart = 0; - int boardLoopStop = SST1INIT_MAX_BOARDS; - int boardLoopInc = 1; - int index = 0; - - sst1InitClearBoardInfo(); - if(GETENV(("SSTV2_SWAPBOARDS"))) { - boardLoopStart = SST1INIT_MAX_BOARDS-1; - boardLoopStop = -1; - boardLoopInc = -1; - } - - for(j=0; j> 13) & 0x7); - { - FxU32 oldFbiRevision, newFbiRevision; - - PCICFG_RD(PCI_REVISION_ID, oldFbiRevision); - PCICFG_RD(SST1_PCI_INIT_ENABLE, newFbiRevision); - sst1BoardInfo[index].fbiFab = - (newFbiRevision & SST_CHUCK_MFTG_ID) >> - SST_CHUCK_MFTG_ID_SHIFT; - newFbiRevision = (newFbiRevision & SST_CHUCK_REVISION_ID) >> - SST_CHUCK_REVISION_ID_SHIFT; - if(oldFbiRevision != 0x2 && newFbiRevision < 4) - return(NULL); - sst1BoardInfo[index].fbiRevision = newFbiRevision; - } - PCICFG_RD(PCI_DEVICE_ID, sst1BoardInfo[index].deviceID); - PCICFG_RD(PCI_VENDOR_ID, sst1BoardInfo[index].vendorID); - - // Enable Memory accesses to SST-1 - // Must be set for PnP BIOS which do not enable memory mapped - // accesses (sst1InitSliDetect reads memory mapped regs) - PCICFG_WR(PCI_COMMAND, SST_PCIMEM_ACCESS_EN); - index++; - } else { - FxU32 code = pciGetErrorCode(); - if (code != PCI_ERR_NOERR) { -#ifdef __WIN32__ - MessageBox(NULL, pciGetErrorString(), NULL, MB_OK); - INIT_PRINTF(("sst1InitMapBoard(): 0x%X\n", GetLastError())); -#endif // __WIN32__ - - - INIT_PRINTF(("pciError(): %s", pciGetErrorString())); - - exit(-1); - } - } - } - } - - if(resetSLI) { - // Search through all known boards for SLI enabled... - FxU32 k; - SstRegs *sst; - - for(k=0; kfbiInit1) & SST_EN_SCANLINE_INTERLEAVE) { - INIT_PRINTF(("sst1InitMapBoard(): Disabling Scanline Interleaving (board #%d)...\n", (k+1))); - // Disable SLI Snooping... - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); - PCICFG_WR(SST1_PCI_INIT_ENABLE, j & - ~(SST_SCANLINE_SLV_OWNPCI | SST_SCANLINE_SLI_SLV | - SST_SLI_SNOOP_EN | SST_SLI_SNOOP_MEMBASE)); - ISET(sst->fbiInit1, IGET(sst->fbiInit1) & - ~SST_EN_SCANLINE_INTERLEAVE); - sst1InitReturnStatus(sstbase); - } - - // Tristate video output signals, so two boards connected as SLI - // do not have contention problems when SSTV2_SLIDETECT=0 - if(firstTime) - sst1InitVideoShutdown(sstbase, FXFALSE); - } - } - firstTime = 0; - - // Max number of supported boards in system - if(BoardNumber > SST1INIT_MAX_BOARDS) return(NULL); - - if(!(sstbase = (FxU32 *) sst1BoardInfo[BoardNumber].virtAddr[0])) - return (NULL); - - INIT_PRINTF(("sst1InitMapBoard(): vAddr:0x%x pAddr:0x%x Dev:0x%x Board:%d\n", - (FxU32) sst1BoardInfo[BoardNumber].virtAddr[0], - (FxU32) sst1BoardInfo[BoardNumber].physAddr[0], - (FxU32) sst1BoardInfo[BoardNumber].deviceNumber, BoardNumber)); - - // Default settings - sst1BoardInfo[BoardNumber].vgaPassthruDisable = SST_EN_VGA_PASSTHRU; - sst1BoardInfo[BoardNumber].vgaPassthruEnable = 0x0; - sst1BoardInfo[BoardNumber].fbiVideo16BPP = 0; - - if(GETENV(("SSTV2_VGA_PASS"))) { - INIT_PRINTF(("sst1InitMapBoard(): Using SST_VGA_PASS=%d\n", - ATOI(GETENV(("SSTV2_VGA_PASS"))))); - if(ATOI(GETENV(("SSTV2_VGA_PASS")))) { - sst1BoardInfo[BoardNumber].vgaPassthruEnable = SST_EN_VGA_PASSTHRU; - sst1BoardInfo[BoardNumber].vgaPassthruDisable = 0x0; - } else { - sst1BoardInfo[BoardNumber].vgaPassthruDisable = SST_EN_VGA_PASSTHRU; - sst1BoardInfo[BoardNumber].vgaPassthruEnable = 0x0; - } - } - - return(sstbase); -} - -/* -** sst1InitRegisters(): -** Initialize registers and memory and return to power-on state -** -** Returns: -** FXTRUE if successfully initializes SST-1 -** FXFALSE if cannot initialize SST-1 -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitRegisters(FxU32 *sstbase) -{ - FxU32 n, tf_fifo_thresh; - FxU32 ft_clkdel, tf0_clkdel, tf1_clkdel, tf2_clkdel; - sst1ClkTimingStruct sstGrxClk; - SstRegs *sst = (SstRegs *) sstbase; - - if(!sst) - return(FXFALSE); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - if(GETENV(("SSTV2_IGNORE_INIT_REGISTERS"))) { - INIT_PRINTF(("WARNING: Ignoring sst1InitRegisters()...\n")); - sst1InitIdleFBINoNOP(sstbase); - return(FXTRUE); - } - - if(GETENV(("SSTV2_TEXMAP_DISABLE"))) - INIT_PRINTF(("sst1InitRegisters() WARNING: Disabling texture mapping\n")); - // Open PCI library (necessary for multiple calls to init routines, after - // PCI library is closed by pciClose() call in sst1InitShutdown() - pciOpen(); - - // Enable writes to the FBIINIT registers - // Do not allow writes into the pci fifo until everything is reset - PCICFG_WR(SST1_PCI_INIT_ENABLE, SST_INITWR_EN); - - // Reset Snoop registers to default values - PCICFG_WR(SST1_PCI_BUS_SNOOP0, SST_PCI_BUS_SNOOP_DEFAULT); - PCICFG_WR(SST1_PCI_BUS_SNOOP1, SST_PCI_BUS_SNOOP_DEFAULT); - sst1InitReturnStatus(sstbase); // Stall - can't call IdleFbi because - sst1InitReturnStatus(sstbase); // FBI could be hung at this stage - sst1InitReturnStatus(sstbase); - - // Adjust Trex-to-Fbi FIFO - if(GETENV(("SSTV2_TF_FIFO_THRESH"))) - SSCANF(GETENV(("SSTV2_TF_FIFO_THRESH")), "%ld", &tf_fifo_thresh); - else - tf_fifo_thresh = 0x8; - INIT_PRINTF(("sst1InitRegisters(): Setting TREX-to-FBI FIFO THRESHOLD to 0x%x...\n", - tf_fifo_thresh)); - - // Set ft_clkdel for 16 MHz bringup - ft_clkdel = 0x8; // Okay for 16 MHz startup... - if(GETENV(("SSTV2_PFT_CLKDEL"))) - SSCANF(GETENV(("SSTV2_PFT_CLKDEL")), "%ld", &ft_clkdel); - INIT_PRINTF(("sst1InitRegisters(): Setting PRELIM FT-CLK delay to 0x%x...\n", ft_clkdel)); - - // SST_FBIINIT3_DEFAULT is set to disable texture mapping, so if - // TMUs are hung, it will not affect FBI - ISET(sst->fbiInit3, - (SST_FBIINIT3_DEFAULT & ~(SST_FT_CLK_DEL_ADJ | SST_TF_FIFO_THRESH)) | - (ft_clkdel << SST_FT_CLK_DEL_ADJ_SHIFT) | - (tf_fifo_thresh << SST_TF_FIFO_THRESH_SHIFT)); - - // Wait for Fbi-to-Trex clock delay value to propogate - sst1InitReturnStatus(sstbase); // Stall - can't call IdleFbi because - sst1InitReturnStatus(sstbase); // FBI could be hung at this stage - sst1InitReturnStatus(sstbase); - - // Reset graphics and video units - // Must reset video unit before graphics unit, otherwise video unit could - // potentially hang waiting for the graphics unit to respond - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_RESET); - - // Don't wait for idle because graphics could be hung... - sst1InitReturnStatus(sstbase); - sst1InitReturnStatus(sstbase); - sst1InitReturnStatus(sstbase); - ISET(sst->fbiInit0, - IGET(sst->fbiInit0) | (SST_GRX_RESET | SST_PCI_FIFO_RESET)); - - sst1InitIdleFBINoNOP(sstbase); - - // Unreset PCI FIFO... - ISET(sst->fbiInit0, IGET(sst->fbiInit0) & ~SST_PCI_FIFO_RESET); - sst1InitIdleFBINoNOP(sstbase); - - // Unreset graphics subsystem - // THIS MUST BE PRESENT OTHERWISE THE PCI FIFO WILL NEVER DRAIN! - ISET(sst->fbiInit0, IGET(sst->fbiInit0) & ~SST_GRX_RESET); - sst1InitIdleFBINoNOP(sstbase); - - // Reset all FBI and TREX Init registers - ISET(sst->fbiInit0, SST_FBIINIT0_DEFAULT); - ISET(sst->fbiInit1, SST_FBIINIT1_DEFAULT); - ISET(sst->fbiInit2, SST_FBIINIT2_DEFAULT); - ISET(sst->fbiInit3, - (SST_FBIINIT3_DEFAULT & ~(SST_FT_CLK_DEL_ADJ | SST_TF_FIFO_THRESH)) | - (ft_clkdel << SST_FT_CLK_DEL_ADJ_SHIFT) | - (tf_fifo_thresh << SST_TF_FIFO_THRESH_SHIFT)); - ISET(sst->fbiInit4, SST_FBIINIT4_DEFAULT); - ISET(sst->fbiInit5, SST_FBIINIT5_DEFAULT); - ISET(sst->fbiInit6, SST_FBIINIT6_DEFAULT); - sst1CurrentBoard->fbiInit6 = SST_FBIINIT6_DEFAULT; - ISET(sst->fbiInit7, SST_FBIINIT7_DEFAULT); - sst1InitIdleFBINoNOP(sstbase); // Wait until init regs are reset - - // Enable writes to the FBIINIT registers and allow pushes onto PCI FIFO - PCICFG_WR(SST1_PCI_INIT_ENABLE, (SST_INITWR_EN | SST_PCI_FIFOWR_EN)); - - // Determine DAC Type - if(sst1InitDacDetect(sstbase) == FXFALSE) { - INIT_PRINTF(("sst1InitRegisters(): Could not detect DAC...\n")); - return(FXFALSE); - } - - // set TREX0 init values - if(GETENV(("SSTV2_TREX0INIT0"))) { - INIT_PRINTF(("sst1InitRegisters(): Using SST_TREX0INIT0 environment variable\n")); - SSCANF(GETENV(("SSTV2_TREX0INIT0")), "%ld", - &sst1CurrentBoard->tmuInit0[0]); - } else - sst1CurrentBoard->tmuInit0[0] = SST_TREX0INIT0_DEFAULT; - - INIT_PRINTF(("sst1InitRegisters(): Storing TREX0INIT0=0x%x\n", - sst1CurrentBoard->tmuInit0[0])); - if(GETENV(("SSTV2_TREX0INIT1"))) { - - INIT_PRINTF(("sst1InitRegisters(): Using SST_TREX0INIT1 environment variable\n")); - SSCANF(GETENV(("SSTV2_TREX0INIT1")), "%ld", - &sst1CurrentBoard->tmuInit1[0]); - } else - sst1CurrentBoard->tmuInit1[0] = SST_TREX0INIT1_DEFAULT; - if(GETENV(("SSTV2_PTF0_CLKDEL"))) { - SSCANF(GETENV(("SSTV2_PTF0_CLKDEL")), "%ld", &tf0_clkdel); - sst1CurrentBoard->tmuInit1[0] = (sst1CurrentBoard->tmuInit1[0] & - ~SST_TEX_TF_CLK_DEL_ADJ) | - (tf0_clkdel<tmuInit1[0])); - - // set TREX1 init values - if(GETENV(("SSTV2_TREX1INIT0"))) { - INIT_PRINTF(("sst1InitRegisters(): Using SST_TREX1INIT0 environment variable\n")); - SSCANF(GETENV(("SSTV2_TREX1INIT0")), "%ld", - &sst1CurrentBoard->tmuInit0[1]); - } else - sst1CurrentBoard->tmuInit0[1] = SST_TREX1INIT0_DEFAULT; - INIT_PRINTF(("sst1InitRegisters(): Storing TREX1INIT0=0x%x\n", - sst1CurrentBoard->tmuInit0[1])); - if(GETENV(("SSTV2_TREX1INIT1"))) { - INIT_PRINTF(("sst1InitRegisters(): Using SST_TREX1INIT1 environment variable\n")); - SSCANF(GETENV(("SSTV2_TREX1INIT1")), "%ld", - &sst1CurrentBoard->tmuInit1[1]); - } else - sst1CurrentBoard->tmuInit1[1] = SST_TREX1INIT1_DEFAULT; - if(GETENV(("SSTV2_PTF1_CLKDEL"))) { - SSCANF(GETENV(("SSTV2_PTF1_CLKDEL")), "%ld", &tf1_clkdel); - sst1CurrentBoard->tmuInit1[1] = (sst1CurrentBoard->tmuInit1[1] & - ~SST_TEX_TF_CLK_DEL_ADJ) | - (tf1_clkdel<tmuInit1[1])); - - - // set TREX2 init values - if(GETENV(("SSTV2_TREX2INIT0"))) { - INIT_PRINTF(("sst1InitRegisters(): Using SST_TREX2INIT0 environment variable\n")); - SSCANF(GETENV(("SSTV2_TREX2INIT0")), "%ld", - &sst1CurrentBoard->tmuInit0[2]); - } else - sst1CurrentBoard->tmuInit0[2] = SST_TREX2INIT0_DEFAULT; - INIT_PRINTF(("sst1InitRegisters(): Storing TREX2INIT0=0x%x\n", - sst1CurrentBoard->tmuInit0[2])); - if(GETENV(("SSTV2_TREX2INIT1"))) { - INIT_PRINTF(("sst1InitRegisters(): Using SST_TREX2INIT1 environment variable\n")); - SSCANF(GETENV(("SSTV2_TREX2INIT1")), "%ld", - &sst1CurrentBoard->tmuInit1[2]); - } else - sst1CurrentBoard->tmuInit1[2] = SST_TREX2INIT1_DEFAULT; - if(GETENV(("SSTV2_PTF2_CLKDEL"))) { - SSCANF(GETENV(("SSTV2_PTF2_CLKDEL")), "%ld", &tf2_clkdel); - sst1CurrentBoard->tmuInit1[2] = (sst1CurrentBoard->tmuInit1[2] & - ~SST_TEX_TF_CLK_DEL_ADJ) | - (tf2_clkdel<tmuInit1[2])); - - // Set clock at 16 MHz to properly transmit TREX configuration registers - // Note that setting the clock will automatically reset the TMUs... - // sst1InitResetTmus() also will de-assert TEXMAP_DISABLE in fbiInit3 - // unless SSTV2_TEXMAP_DISABLE is set - if(!sst1InitComputeClkParams(16.0f, &sstGrxClk)) - return(FXFALSE); - if(!sst1InitSetGrxClk(sstbase, &sstGrxClk)) - return(FXFALSE); - sst1CurrentBoard->initGrxClkDone = 0; - - // Set PCI wait-states - if(GETENV(("SSTV2_SLOWPCIWR"))) { - INIT_PRINTF(("sst1InitRegisters(): Setting up SLOW PCI Writes...\n")); - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_PCI_WRWS_1); - } else - ISET(sst->fbiInit1, IGET(sst->fbiInit1) & ~SST_PCI_WRWS_1); - - if(GETENV(("SSTV2_FASTPCIRD"))) { - INIT_PRINTF(("sst1InitRegisters(): Setting up FAST PCI Reads...\n")); - ISET(sst->fbiInit4, IGET(sst->fbiInit4) & ~SST_PCI_RDWS_2); - } - sst1InitIdleFBINoNOP(sstbase); - - // Enable Linear frame buffer reads - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_LFB_READ_EN); - - // Swapbuffer algorithm is based on VSync initially - ISET(sst->fbiInit2, (IGET(sst->fbiInit2) & ~SST_SWAP_ALGORITHM) | - SST_SWAP_VSYNC); - - // Enable LFB read-aheads - ISET(sst->fbiInit4, IGET(sst->fbiInit4) | SST_EN_LFB_RDAHEAD); - - // Enable triangle alternate register mapping - ISET(sst->fbiInit3, IGET(sst->fbiInit3) | SST_ALT_REGMAPPING); - - // Enable Endian Byte Swapping - ISET(sst->fbiInit0, IGET(sst->fbiInit0) | SST_EN_ENDIAN_SWAPPING); - - // Setup DRAM Refresh - ISET(sst->fbiInit2, (IGET(sst->fbiInit2) & ~SST_DRAM_REFRESH_CNTR) | - SST_DRAM_REFRESH_16MS); - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit2, IGET(sst->fbiInit2) | SST_EN_DRAM_REFRESH); - sst1InitIdleFBINoNOP(sstbase); - - { - // Setup memory timings... - FxU32 fbiInit1 = IGET(sst->fbiInit1); - FxU32 fbiInit2 = IGET(sst->fbiInit2) | - SST_EN_DRAM_RD_AHEAD_FIFO | SST_EN_FAST_RD_AHEAD_WR; - - if(GETENV(("SSTV2_SLOWMEM_WTR"))) { - INIT_PRINTF(("sst1InitRegisters(): Running slow write-to-read memory timing...\n")); - fbiInit1 |= SST_DISEN_RD_AHEAD_WR_RD; - } - if(GETENV(("SSTV2_SLOWMEM_RTW"))) { - INIT_PRINTF(("sst1InitRegisters(): Running slow read-to-write memory timing...\n")); - fbiInit2 &= ~SST_EN_FAST_RD_AHEAD_WR; - } - if(GETENV(("SSTV2_FASTMEM_RAS_READS"))) { - INIT_PRINTF(("sst1InitRegisters(): Enabling fast RAS read memory timing...\n")); - fbiInit2 |= SST_EN_FAST_RAS_READ; - } - ISET(sst->fbiInit1, fbiInit1); - sst1InitReturnStatus(sstbase); - ISET(sst->fbiInit2, fbiInit2); - sst1InitReturnStatus(sstbase); - } - - // Return all other registers to their power-on state - sst1InitIdleFBINoNOP(sstbase); - sst1InitSetResolution(sstbase, &SST_VREZ_640X480_60, 0); - sst1InitIdleFBINoNOP(sstbase); - - // Get DRAMs up and running (refresh is already enabled)... - ISET(sst->c1, 0x0); - ISET(sst->c0, 0x0); - ISET(sst->zaColor, 0x0); - ISET(sst->clipLeftRight, 100); // draw into 50x50 area - ISET(sst->clipBottomTop, 100); - ISET(sst->fbzMode, SST_RGBWRMASK | SST_ZAWRMASK); - ISET(sst->fastfillCMD, 0x0); // Frontbuffer & Z/A - ISET(sst->nopCMD, 0x1); // Clear fbistat registers after clearing screen - sst1InitIdleFBINoNOP(sstbase); - - sst1InitRenderingRegisters(sstbase); - sst1CurrentBoard->tmuRevision = 0xdead; // Force sst1InitFillDeviceInfo() - if(sst1InitFillDeviceInfo(sstbase, sst1CurrentBoard) == FXFALSE) { - INIT_PRINTF(("sst1InitRegisters(): ERROR filling DeviceInfo...\n")); - - return(FXFALSE); - } - - sst1InitIdleFBINoNOP(sstbase); - sst1InitRenderingRegisters(sstbase); - sst1InitIdleFBINoNOP(sstbase); - - // LFB writes stored in memory FIFO? - if(GETENV(("SSTV2_MEMFIFO_LFB"))) - n = ATOI(GETENV(("SSTV2_MEMFIFO_LFB"))); - else - n = 1; - if(n) { - INIT_PRINTF(("sst1InitRegisters(): LFB Writes go through memory FIFO...\n")); - ISET(sst->fbiInit0, IGET(sst->fbiInit0) | SST_EN_LFB_MEMFIFO); - sst1InitIdleFBINoNOP(sstbase); - } - - // Texture memory writes stored in memory FIFO? - if(GETENV(("SSTV2_MEMFIFO_TEX"))) - n = ATOI(GETENV(("SSTV2_MEMFIFO_TEX"))); - else - n = 1; - if(n) { - INIT_PRINTF(("sst1InitRegisters(): TEXTURE Writes go through memory FIFO...\n")); - ISET(sst->fbiInit0, IGET(sst->fbiInit0) | SST_EN_TEX_MEMFIFO); - sst1InitIdleFBINoNOP(sstbase); - } - - ISET(sst->vRetrace, 0x0); - ISET(sst->backPorch, 0x0); - ISET(sst->videoDimensions, 0x0); - ISET(sst->hSync, 0x0); - ISET(sst->vSync, 0x0); - ISET(sst->videoFilterRgbThreshold, 0x0); - - sst1InitIdleFBINoNOP(sstbase); // Wait until init regs are reset - - // Update info structure for initEnable - PCICFG_RD(SST1_PCI_INIT_ENABLE, sst1CurrentBoard->fbiInitEnable); - - INIT_PRINTF(("sst1InitRegisters(): exiting with status %d...\n", FXTRUE)); - return(FXTRUE); -} - -FX_EXPORT void FX_CSTYLE sst1InitRenderingRegisters(FxU32 *sstbase) -{ - FxU32 i; - SstRegs *sst = (SstRegs *) sstbase; - - ISET(sst->vA.x, 0x0); ISET(sst->vA.y, 0x0); - ISET(sst->vB.x, 0x0); ISET(sst->vB.y, 0x0); - ISET(sst->vC.x, 0x0); ISET(sst->vC.y, 0x0); - - ISET(sst->r, 0x0); ISET(sst->g, 0x0); - ISET(sst->b, 0x0); ISET(sst->z, 0x0); - ISET(sst->a, 0x0); ISET(sst->s, 0x0); - ISET(sst->t, 0x0); ISET(sst->w, 0x0); - - ISET(sst->drdx, 0x0); ISET(sst->dgdx, 0x0); - ISET(sst->dbdx, 0x0); ISET(sst->dzdx, 0x0); - ISET(sst->dadx, 0x0); ISET(sst->dsdx, 0x0); - ISET(sst->dtdx, 0x0); ISET(sst->dwdx, 0x0); - - ISET(sst->drdy, 0x0); ISET(sst->dgdy, 0x0); - ISET(sst->dbdy, 0x0); ISET(sst->dzdy, 0x0); - ISET(sst->dady, 0x0); ISET(sst->dsdy, 0x0); - ISET(sst->dtdy, 0x0); ISET(sst->dwdy, 0x0); - - ISET(sst->fbzColorPath, 0x0); - ISET(sst->fogMode, 0x0); - ISET(sst->alphaMode, 0x0); - ISET(sst->fbzMode, 0x0); - ISET(sst->lfbMode, 0x0); - ISET(sst->clipLeftRight, 0x0); - ISET(sst->clipBottomTop, 0x0); - - ISET(sst->fogColor, 0x0); - ISET(sst->zaColor, 0x0); - ISET(sst->chromaKey, 0x0); - ISET(sst->chromaRange, 0x0); - ISET(sst->stipple, 0x0); - ISET(sst->c0, 0x0); - ISET(sst->c1, 0x0); - - ISET(sst->sSetupMode, 0x0); - ISET(sst->sVx, 0x0); - ISET(sst->sVy, 0x0); - ISET(sst->sARGB, 0x0); - ISET(sst->sRed, 0x0); - ISET(sst->sGreen, 0x0); - ISET(sst->sBlue, 0x0); - ISET(sst->sAlpha, 0x0); - ISET(sst->sVz, 0x0); - ISET(sst->sOowfbi, 0x0); - ISET(sst->sOow0, 0x0); - ISET(sst->sSow0, 0x0); - ISET(sst->sTow0, 0x0); - ISET(sst->sOow1, 0x0); - ISET(sst->sSow1, 0x0); - ISET(sst->sTow1, 0x0); - - ISET(sst->nopCMD, 0x3); // Clear fbistat and trianglesOut registers - - for(i=0; i<32; i++) - ISET(sst->fogTable[i], 0x0); - - ISET(sst->bltSrcBaseAddr, 0x0); - ISET(sst->bltDstBaseAddr, 0x0); - ISET(sst->bltXYstrides, 0x0); - ISET(sst->bltSrcChromaRange, 0x0); - ISET(sst->bltDstChromaRange, 0x0); - ISET(sst->bltClipX, 0x0); - ISET(sst->bltClipY, 0x0); - ISET(sst->bltSrcXY, 0x0); - ISET(sst->bltDstXY, 0x0); - ISET(sst->bltSize, 0x0); - ISET(sst->bltRop, 0x0); - ISET(sst->bltColor, 0x0); - ISET(sst->bltCommand, 0x0); - - // clear TMU registers - ISET(sst->textureMode, 0x0); - ISET(sst->tLOD, 0x0); - ISET(sst->tDetail, 0x0); - ISET(sst->texBaseAddr, 0x0); - ISET(sst->texBaseAddr1, 0x0); - ISET(sst->texBaseAddr2, 0x0); - ISET(sst->texBaseAddr38, 0x0); - - for(i=0; i<12; i++) - ISET(sst->nccTable0[i], 0x0); - for(i=0; i<12; i++) - ISET(sst->nccTable1[i], 0x0); - sst1InitIdle(sstbase); - - ISET(sst->tchromaKey, 0x0); - ISET(sst->tchromaRange, 0x0); - -} - -/* -** sst1InitShutdown(): -** Shutdown SST-1 -** Resets state of VGA_PASS to return monitor control back to the VGA -** Powers-down the DAC -** Resets the graphics clock in FBI to conserve power -** -** Returns: -** FXTRUE if successfully shuts down SST-1 -** FXFALSE if cannot shut down the SST-1 -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitShutdown(FxU32 *sstbase) -{ - SstRegs *sstMaster = (SstRegs *) sstbase; - SstRegs *sstSlave; - SstRegs *sstPtr; - FxU32 n; - FxU32 sliEnabled; - sst1ClkTimingStruct sstGrxClk; - - if(!sstbase) - return(FXFALSE); - - if(sst1InitCheckBoard((FxU32 *) sstbase) == FXFALSE) - return(FXFALSE); - - // sst1Initidle() routines must be properly executed... - initIdleEnabled = 1; - - sliEnabled = (sst1CurrentBoard->sliSlaveVirtAddr != (FxU32 *) NULL) ? 1 : 0; - sstSlave = (SstRegs *) sst1CurrentBoard->sliSlaveVirtAddr; - -#if 0 - // If the command fifo is enabled, we can't issue a NOP first, so wait - // until the PCI fifo is empty... - sst1InitPciFifoIdleLoop(sstbase); - if(sst1CurrentBoard->sliSlaveVirtAddr) - sst1InitPciFifoIdleLoop(sst1CurrentBoard->sliSlaveVirtAddr); -#else - sst1InitIdle(sstbase); -#endif - - // Disable the command fifo if enabled... - if(sst1CurrentBoard->fbiCmdFifoEn || - (IGET(sstMaster->fbiInit7) & SST_EN_CMDFIFO)) - sst1InitCmdFifo(sstbase, FXFALSE, (void *) NULL, (void *) NULL, - (void *) NULL, NULL); - - sst1InitIdle(sstbase); - - if(sliEnabled && !GETENV(("SSTV2_NOSHUTDOWN"))) { - if(sst1InitShutdownSli(sstbase) == FXFALSE) - return(FXFALSE); - } - - if(GETENV(("SSTV2_NOSHUTDOWN"))) - INIT_PRINTF(("sst1InitShutdown(): Bypassing shutdown with SSTV2_NOSHUTDOWN\n")); - - n = 0; - while(!GETENV(("SSTV2_NOSHUTDOWN"))) { - if(!n) - sstPtr = sstMaster; - else - sstPtr = sstSlave; - - if(sst1InitCheckBoard((FxU32 *) sstPtr) == FXFALSE) - return(FXFALSE); - - INIT_PRINTF(("sst1InitShutdown(): Shutting down SST-1 #%d...\n", n)); - - // Reset video unit to guarantee no contentions on the memory bus - // Blank DAC so VGA Passthru works properly - ISET(sstPtr->fbiInit1, - IGET(sstPtr->fbiInit1) | (SST_VIDEO_RESET | SST_VIDEO_BLANK_EN)); - // Turn off dram refresh to guarantee no contentions on the - // memory bus - ISET(sstPtr->fbiInit2, IGET(sstPtr->fbiInit2) & ~SST_EN_DRAM_REFRESH); - - // Reset graphics subsystem - ISET(sstPtr->fbiInit0, - IGET(sstPtr->fbiInit0) | (SST_GRX_RESET | SST_PCI_FIFO_RESET)); - sst1InitIdleFBINoNOP((FxU32 *) sstPtr); - ISET(sstPtr->fbiInit0, IGET(sstPtr->fbiInit0) & ~SST_PCI_FIFO_RESET); - - sst1InitIdleFBINoNOP((FxU32 *) sstPtr); - ISET(sstPtr->fbiInit0, IGET(sstPtr->fbiInit0) & ~SST_GRX_RESET); - sst1InitIdleFBINoNOP((FxU32 *) sstPtr); - - // Turnaround VGA_PASS to allow VGA monitor - sst1InitVgaPassCtrl((FxU32 *) sstPtr, 1); - sst1InitIdleFBINoNOP((FxU32 *) sstPtr); - - // Set clock at 30 MHz to reduce power consumption... - sst1InitComputeClkParams((float) 30.0, &sstGrxClk); - if(sst1InitSetGrxClk((FxU32 *) sstPtr, &sstGrxClk) == FXFALSE) - INIT_PRINTF(("sst1InitShutdown() WARNING: sst1InitSetGrxClk failed...Continuing...\n")); - sst1CurrentBoard->initGrxClkDone = 0; - -#ifndef __linux__ - pciUnmapPhysical((FxU32)sst1CurrentBoard->virtAddr[0], 0x1000000UL); -#endif - if((++n > 1) || !sliEnabled) - break; - } - - /* sst1InitIdle(sstbase); */ - -#if !DIRECTX - // - // HACK alert. - // - // There's a pciClose(), but nobody calls it. This is needed by the - // DOS DPMI services to close fxmemmap.vxd. - // - // Note that the call to pciClose must be after the shutdown sequence, - // as the shutdown sequence uses PCI configuration reads/writes... - // - pciClose(); -#endif /* !DIRECTX */ - - INIT_PRINTF(("sst1InitShutdown(): Returning with status %d...\n", FXTRUE)); -#ifdef INIT_OUTPUT - if ( sst1InitMsgFile != stdout ) - fclose(sst1InitMsgFile); -#endif - - // Make sure that the board info structures are - // cleared next time sst1InitMapBoard() is called. - clearBoardInfo = FXTRUE; - - return(FXTRUE); -} - -/* -** sst1InitCheckBoard(): -** Set internal global variables for multiple SST-1 support -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitCheckBoard(FxU32 *sstbase) -{ - FxU32 n; - FxBool returnVal = FXFALSE; - - for(n=0; n 0) { - if (sst1BoardInfo[boardNum - 1].sliSlaveVirtAddr == (FxU32*)sstBaseAddr) { - tempAddr = sst1BoardInfo[boardNum - 1].virtAddr[0]; - } - } - - if ((tempAddr == NULL) && (boardNum < boardsInSystem)) { - if (sst1BoardInfo[boardNum + 1].sliSlaveVirtAddr == (FxU32*)sstBaseAddr) { - tempAddr = sst1BoardInfo[boardNum + 1].virtAddr[0]; - } - } - - if (tempAddr != NULL) sstBaseAddr = tempAddr; - } - - return (FxU32*)sstBaseAddr; -} - -/* -** sst1InitClearBoardInfo(): -** Clear board configuration information -** -*/ -void sst1InitClearBoardInfo(void) -{ - FxU32 n, j; - - for(n=0; nphysAddr[0]? - */ - pciGetConfigData(PCI_BASE_ADDRESS_0, sst1CurrentBoard->deviceNumber, &physAddr); - - // For some reason, there sometimes is a 008 at the end of the - // physical address, so mask that puppy RTF out - physAddr &= 0xfffff000; - - /* dpc - 23 jan 1998 - Warning!!!!! - * We are no longer mapping the entire board range as uswc because - * this causes weird problems on some systems. We are now mapping - * the 3d register area as uncacheable (since no one should be - * writing here anyway, except to bump the swapbufferCMD register) - * and the command fifo range and lfb range as uswc. - * - * NB: It is still unclear why this is happening because the - * memory page containing the registers is never really explicitly - * written to until we are shutting down so changing its caching - * characteristics should have no bearing on anything. */ - { -#define kCacheSizeWriteCombine (0x08UL << 20UL) -#define kCacheSizeUncacheable (0x1000UL) - FxBool hasWC = pciFindMTRRMatch(physAddr, kCacheSizeWriteCombine, - PciMemTypeWriteCombining, - &sst1CurrentBoard->mtrrWriteCombine); - FxBool hasUC = pciFindMTRRMatch(physAddr, kCacheSizeUncacheable, - PciMemTypeUncacheable, - &sst1CurrentBoard->mtrrUncacheable); - - if (!hasWC) { - if (pciFindFreeMTRR(&sst1CurrentBoard->mtrrWriteCombine)) { - hasWC = pciSetMTRR(sst1CurrentBoard->mtrrWriteCombine, - physAddr, kCacheSizeWriteCombine, - PciMemTypeWriteCombining); - if (!hasWC) INIT_PRINTF(("sst1InitCaching(): Could not set wc mtrr\n")); - } else { - INIT_PRINTF(("sst1InitCaching(): Could not find wc mtrr\n")); - } - } else { - INIT_PRINTF(("sst1InitCaching(): Already have wc\n")); - } - - if (!hasUC) { - if (pciFindFreeMTRR(&sst1CurrentBoard->mtrrUncacheable)) { - hasUC = pciSetMTRR(sst1CurrentBoard->mtrrUncacheable, - physAddr, kCacheSizeUncacheable, - PciMemTypeUncacheable); - if (!hasUC) INIT_PRINTF(("sst1InitCaching(): Could not set uc mtrr\n")); - } else { - INIT_PRINTF(("sst1InitCaching(): Could not find uc mtrr\n")); - } - } else { - INIT_PRINTF(("sst1InitCaching(): Already have uc\n")); - } - - /* We only succeed if we have them both since having only uswc - * seems to cause problems. - */ - retVal = (hasWC && hasUC); - if (!retVal) goto __errExit; - - INIT_PRINTF(("sst1InitCaching(): wc(0x%X) : uc(0x%X)\n", - sst1CurrentBoard->mtrrWriteCombine, - sst1CurrentBoard->mtrrUncacheable)); - } - } else { - /* This always succeeds */ - retVal = FXTRUE; - -__errExit: - if (sst1CurrentBoard->mtrrUncacheable != 0) { - pciSetMTRR(sst1CurrentBoard->mtrrUncacheable, 0, 0, 0); - sst1CurrentBoard->mtrrUncacheable = 0; - } - - if (sst1CurrentBoard->mtrrWriteCombine != 0) { - pciSetMTRR(sst1CurrentBoard->mtrrWriteCombine, 0, 0, 0); - sst1CurrentBoard->mtrrWriteCombine = 0; - } - } - - return retVal; -} // sst1InitSetCaching - - - -/* -** sst1InitCachingAMD -** -** Sets up memory caching for AMD K6 and AMD K7 systems for the entire -** 16mb virtual address space of the card. For K7, goes through -** sst1InitCaching -** -*/ - -#define kCacheSizeWriteCombineAMD (0x08UL << 20UL) /* 8 MB */ -#define kCacheSizeUncacheableAMD (0x20000UL) /* 128 KB */ - -FX_ENTRY FxBool FX_CSTYLE -sst1InitCachingAMD(FxU32* sstBase, FxBool enableP, FxBool hasP2MTRR) -{ - FxBool retVal = sst1InitCheckBoard(sstBase); - - if (!retVal) return FXFALSE; - - /* The K7 has MTRRs that are exactly compatible to the P6/PII, so - we just do the work through the existing sst1InitCaching function - */ - - if (hasP2MTRR) { - return sst1InitCaching(sstBase, enableP); - } - - /* If it's not a K7, we must have a K6 with WC support, i.e. a K6-2 with - CXT core or a Sharptooth, otherwise we wouldn't have gotten here. - */ - - if (enableP && (GETENV("SSTV2_IGNORE_CACHING") == NULL)) { - FxU32 physAddr; - - /* Get the board's base. Isn't this the same as what we - * carry around in sst1CurrentBoard->physAddr[0]? - */ - - pciGetConfigData(PCI_BASE_ADDRESS_0, sst1CurrentBoard->deviceNumber, &physAddr); - - /* For some reason, there sometimes is a 008 at the end of the - * physical address, so mask that puppy RTF out - */ - - physAddr &= 0xfffff000; - - /* dpc - 23 jan 1998 - Warning!!!!! - * We are no longer mapping the entire board range as uswc because - * this causes weird problems on some systems. We are now mapping - * the 3d register area as uncacheable (since no one should be - * writing here anyway, except to bump the swapbufferCMD register) - * and the command fifo range and lfb range as uswc. - * - * NB: It is still unclear why this is happening because the - * memory page containing the registers is never really explicitly - * written to until we are shutting down so changing its caching - * characteristics should have no bearing on anything. - * - * This might no be necessary for K6, as K6 maintains strong write - * ordering in WC regions. We do this here compatible to PII just in - * case. Note: Overlapping WC and UC regions results in UC type on K6, - * just like on PII. Note: the smallest MTRR region size on K6 is 128 KB, - * while on PII it is 4 KB. We make the UC region as small as we can. - */ - - /* For K6, we don't do any elaborate allocation, as it only has two - * variable size memory regions, and we need both for Voodoo2. So, we - * just jam the data into the two available MTRRs. - */ - - pciSetMTRRAmdK6 (0, physAddr, kCacheSizeWriteCombineAMD, PciMemTypeWriteCombining); - pciSetMTRRAmdK6 (1, physAddr, kCacheSizeUncacheableAMD, PciMemTypeUncacheable); - - } else { /* disable MTRRs */ - - /* This always succeeds */ - - retVal = FXTRUE; - - /* Since AMD recommends a "free for all" policy for allocating MTRRs - on K6, we do nothing for "disable". Any software that wants to grab - the MTRRs can just do so. Leaving the MTRR enabled might actually - beneficial in a situation like the following: We run a D3D app, then - a Glide app, then a D3D app, but the second time around D3D doesn't - re-initialize, since it's still active, so it doesn't reprogram the - MTRRs. - */ - - // pciSetMTRRAmdK6 (0, 0, 0, 0); /* size == 0 implies disable */ - // pciSetMTRRAmdK6 (1, 0, 0, 0); /* size == 0 implies disable */ - - } - - return retVal; -} // sst1InitSetCachingAMD - -#ifdef _WIN32 -#pragma optimize ("",on) -#endif diff --git a/glide2x/cvg/init/sst1init.h b/glide2x/cvg/init/sst1init.h deleted file mode 100644 index 3356272..0000000 --- a/glide2x/cvg/init/sst1init.h +++ /dev/null @@ -1,1839 +0,0 @@ -/*-*-c++-*-*/ -/* -** 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$ -** -*/ - -#ifndef __SST1INIT_H__ -#define __SST1INIT_H__ - -/* -** -** $Revision$ -** $Date$ -** -** SST-1 Initialization routine protypes -** -** If all initialization routines are called, it is assumed they are called -** in the following order: -** 1. sst1InitMapBoard(); -** 2. sst1InitRegisters(); -** 3. sst1InitGamma(); -** 4. sst1InitVideoBuffers(); -** 5. sst1InitSli(); [Optional] -** 6. sst1InitCmdFifo(); -** -** sst1InitShutdown() is called at the end of an application to turn off -** the SST-1 graphics subsystem -** -*/ - -/* sst1init.h assumes "glide.h" and "sst.h" are already included */ - -/* Init code debug print routine */ -#ifdef INIT_DOS /* Glide version... */ -#define INIT_OUTPUT -#define INIT_PRINTF(a) sst1InitPrintf a -#define INIT_INFO(A) -#endif -#ifdef INIT_LINUX -#define INIT_OUTPUT -#define INIT_PRINTF(a) sst1InitPrintf a -#define INIT_INFO(A) -#endif - -#ifndef DIRECTX -#undef GETENV -#undef ATOI -#undef ATOF -#undef SSCANF -#undef POW -#define GETENV(A) sst1InitGetenv(A) -#define ATOI(A) atoi(A) -#define ATOF(A) atof(A) -#define SSCANF( A, B, C ) sscanf( A, B, C ) -#define POW( A, B ) pow( A, B ) -#define FTOL( X ) ((FxU32)(X)) - -// Video resolution declarations -#include "sst1vid.h" - -// Info Structure declaration -#include "cvginfo.h" - -#else /* DIRECTX */ -#include "ddglobal.h" -#ifdef _WIN32 -#pragma optimize ("",off) /* ddglobal.h tuns this on for retail builds */ -#endif -#undef INIT_PRINTF -#undef INIT_INFO -#undef GETENV -#undef ATOI -#undef ATOF -#undef FTOL -#undef ITOF_INV -#undef SSCANF -#undef POW -/* #define INIT_PRINTF(a) */ -#ifdef FXTRACE - #define INIT_PRINTF DDPRINTF -#else - #define INIT_PRINTF 1 ? (void) 0 : (void) -#endif -#define INIT_INFO(A) -#define GETENV(A) ddgetenv(A) -#define ATOI(A) ddatoi(A) -#define ATOF(A) ddatof(A) -#define FTOL(A) ddftol(A) -#define ITOF_INV(A) dd_itof_inv(A) -#define SSCANF( A, B, C ) ddsscanf( A, B, C ) -#define POW( A, B ) ddpow( A, B ) - -#endif /* DIRECTX */ - -/* Defines to writing to/reading from SST-1 */ -#if 0 -#define IGET(A) A -#define ISET(A,D) A = (D) -#else -#define IGET(A) sst1InitRead32((FxU32 *) &(A)) -#define ISET(A,D) sst1InitWrite32((FxU32 *) &(A), D) -#endif - -/* -** P6 Fence -** -** Here's the stuff to do P6 Fencing. This is required for the -** certain things on the P6 -*/ -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef SST1INIT_ALLOCATE - FxU32 p6FenceVar; -#else - extern FxU32 p6FenceVar; -#endif - -#if defined(__WATCOMC__) -void -p6Fence(void); -# pragma aux p6Fence = \ - "xchg eax, p6FenceVar" \ - modify [eax]; -# define P6FENCE p6Fence() -#elif defined(__MSC__) -# define P6FENCE {_asm xchg eax, p6FenceVar} -#elif defined(macintosh) && __POWERPC__ && defined(__MWERKS__) -# define P6FENCE __eieio() -#elif defined (__GNUC__) && defined(__i386__) -# define P6FENCE asm("xchg %%eax,%0" : /*outputs*/ : "m" (p6FenceVar) : \ - "eax"); -#else -# error "P6 Fencing in-line assembler code needs to be added for this compiler" -#endif - -#ifdef __cplusplus -} -#endif - -#ifndef _FXPCI_H_ -#include -#endif -#include - -/*--------------------------------------------------------*/ -/* Following defines need to go in "cvgdefs.h" eventually */ -#define SST_CMDFIFO_ADDR BIT(21) - -/*--------- SST PCI Configuration Command bits --------------*/ -#define SST_PCIMEM_ACCESS_EN BIT(1) - -/*------- SST PCI Configuration Register defaults -----------*/ -#define SST_PCI_INIT_ENABLE_DEFAULT 0x0 -#define SST_PCI_BUS_SNOOP_DEFAULT 0x0 - -/*--- SST PCI Init Enable Configuration Register defaults ---*/ -#define SST_SLI_OWNPCI SST_SCANLINE_SLV_OWNPCI -#define SST_SLI_MASTER_OWNPCI 0x0 -#define SST_SLI_SLAVE_OWNPCI SST_SCANLINE_SLV_OWNPCI -#define SST_CHUCK_REVISION_ID_SHIFT 12 -#define SST_CHUCK_REVISION_ID (0xF< -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef SST1INIT_ALLOCATE - FILE *sst1InitMsgFile = NULL; /*stdout;*/ -#else -extern FILE *sst1InitMsgFile; -#endif - -#ifdef __cplusplus -} -#endif - -#endif - -/* Maximum number of SST-1 boards supported in system */ -#define SST1INIT_MAX_BOARDS 16 - -/* Maximum number of read pushes in "voodoo.ini" file */ -#define DACRDWR_MAX_PUSH 16 - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef SST1INIT_ALLOCATE - static char headersIdent[] = "@#%Voodoo2 InitHeaders $Revision$"; - FxBool sst1InitUseVoodooFile = FXFALSE; - sst1InitEnvVarStruct *envVarsBase = (sst1InitEnvVarStruct *) NULL; - sst1InitDacStruct *dacStructBase = (sst1InitDacStruct *) NULL; - sst1InitDacStruct *iniDac = (sst1InitDacStruct *) NULL; - sst1InitDacSetVideoStruct *iniVideo = (sst1InitDacSetVideoStruct *) NULL; - sst1InitDacSetMemClkStruct *iniMemClk = (sst1InitDacSetMemClkStruct *) NULL; - FxU32 iniStack[DACRDWR_MAX_PUSH]; - int iniStackPtr = 0; - sst1DeviceInfoStruct *sst1CurrentBoard; - FxU32 sst1InitDeviceNumber; - sst1DeviceInfoStruct sst1BoardInfo[SST1INIT_MAX_BOARDS]; - FxU32 boardsInSystem; - FxU32 boardsInSystemReally; - FxU32 initIdleEnabled = 1; - - - const PciRegister SST1_PCI_CFG_SCRATCH = { 0x50, 4, READ_WRITE }; - const PciRegister SST1_PCI_SIPROCESS = { 0x54, 4, READ_WRITE }; -#else - extern FxBool sst1InitUseVoodooFile; - extern sst1InitEnvVarStruct *envVarsBase; - extern sst1InitDacStruct *dacStructBase; - extern sst1InitDacStruct *iniDac; - extern sst1InitDacSetVideoStruct *iniVideo; - extern sst1InitDacSetMemClkStruct *iniMemClk; - extern FxU32 iniStack[]; - extern int iniStackPtr; - extern sst1DeviceInfoStruct *sst1CurrentBoard; - extern FxU32 sst1InitDeviceNumber; - extern sst1DeviceInfoStruct sst1BoardInfo[SST1INIT_MAX_BOARDS]; - extern FxU32 boardsInSystem; - extern FxU32 boardsInSystemReally; - extern FxU32 initIdleEnabled; - - extern PciRegister SST1_PCI_CFG_SCRATCH; - extern PciRegister SST1_PCI_SIPROCESS; -#endif /* SST1INIT_ALLOCATE */ - -#ifdef __3Dfx_PCI_CFG__ -/* This is really ugly, but it makes us happy w/ the top of the tree - * pci library which is happier than Gary's library. - */ -#define SST1_PCI_INIT_ENABLE PCI_SST1_INIT_ENABLE -#define SST1_PCI_BUS_SNOOP0 PCI_SST1_BUS_SNOOP_0 -#define SST1_PCI_BUS_SNOOP1 PCI_SST1_BUS_SNOOP_1 -#define SST1_PCI_CFG_STATUS PCI_SST1_CFG_STATUS -#else /* !__3Dfx_PCI_CFG__ */ -#define SST1_PCI_BUS_SNOOP0 SST1_PCI_BUS_SNOOP_0 -#define SST1_PCI_BUS_SNOOP1 SST1_PCI_BUS_SNOOP_1 -#endif /* !__3Dfx_PCI_CFG__ */ - -#ifdef __cplusplus -} -#endif - -#ifdef SST1INIT_VIDEO_ALLOCATE -/* SST1INIT_VIDEO_ALLOCATE is only #defined in video.c - - Define useful clock and video timings - Clocks generated are follows: - Clock Freq. (MHz) = - [14.318 * (clkTiming_M+2)] / [(clkTiming_N+2) * (2^clkTiming_P)] - - Solving for clkTiming_M yields: - clkTiming_M = - [ [(Clock Freq (Mhz)) * (clkTiming_N+2) * (2^clkTiming_P)] / 14.318 ] - 2 - - NOTE: [14.318 * (clkTiming_M+2)] / (clkTiming_N+2) should be between - 120 and 240 - NOTE: Max. M is 127 - NOTE: Max. N is 31 - NOTE: Max. P is 3 - NOTE: Max. L is 15 - NOTE: Max. IB is 15 -*/ - - -/* H3D video timing structures */ -#ifdef H3D -/* This guy's not used anywhere */ -sst1VideoTimingStruct SST_VREZ_640X502_60 = { - 96, /* hSyncOn */ - 704, /* hSyncOff */ - 2, /* vSyncOn */ - 523, /* vSyncOff */ - 38, /* hBackPorch */ - 15, /* vBackPorch */ - 640, /* xDimension */ - 502, /* yDimension */ - 60, /* refreshRate */ - 0, /* miscCtrl */ - 160, /* memOffset */ - 20, /* tilesInX */ - 25, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 25.175F, /* clkFreq16bpp */ - 50.350F /* clkFreq24bpp */ -}; - - -/* Line doubled 640x480...line doubling done externally */ -sst1VideoTimingStruct SST_VREZ_640X960LD_60 = { - 45, /* hSyncOn */ - 785, /* hSyncOff */ - 3, /* vSyncOn */ - 1044, /* vSyncOff */ - 100, /* hBackPorch */ - 18, /* vBackPorch */ - 640, /* xDimension */ - 502, /* yDimension */ - 60, /* refreshRate */ - 0, /* miscCtrl */ - 160, /* memOffset */ - 20, /* tilesInX */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 50.82F, /* clkFreq16bpp */ - 101.64F /* clkFreq24bpp */ -}; - - -/* Full resolution 640x480... */ -sst1VideoTimingStruct SST_VREZ_640X960_60 = { - 45, /* hSyncOn */ - 785, /* hSyncOff */ - 3, /* vSyncOn */ - 1044, /* vSyncOff */ - 100, /* hBackPorch */ - 18, /* vBackPorch */ - 640, /* xDimension */ - 1004, /* yDimension */ - 60, /* refreshRate */ - 0, /* miscCtrl */ - 320, /* memOffset */ - 20, /* tilesInX */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 50.82F, /* clkFreq16bpp */ - 101.64F /* clkFreq24bpp */ -}; - - -/* Line doubled 800x600...line doubling done externally */ -sst1VideoTimingStruct SST_VREZ_800X1200LD_45 = { - 63, /* hSyncOn */ - 983, /* hSyncOff */ - 3, /* vSyncOn */ - 1242, /* vSyncOff */ - 150, /* hBackPorch */ - 27, /* vBackPorch */ - 800, /* xDimension */ - 608, /* yDimension */ - 42, /* refreshRate */ - 0, /* miscCtrl */ - 247, /* memOffset */ - 26, /* tilesInX */ - 19, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 56.25F, /* clkFreq16bpp */ - 112.5F /* clkFreq24bpp */ -}; - -sst1VideoTimingStruct SST_VREZ_800X630_60 = { - 127, /* hSyncOn */ - 927, /* hSyncOff */ - 4, /* vSyncOn */ - 656, /* vSyncOff */ - 86, /* hBackPorch */ - 23, /* vBackPorch */ - 800, /* xDimension */ - 630, /* yDimension */ - 60, /* refreshRate */ - 0, /* miscCtrl */ - 260, /* memOffset */ - 26, /* tilesInX */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 40.0F, /* clkFreq16bpp */ - 80.0F /* clkFreq24bpp */ -}; - - -/* Full res 800x600...so far, ain't nobody got enough memory */ -sst1VideoTimingStruct SST_VREZ_800X1200_45 = { - 63, /* hSyncOn */ - 983, /* hSyncOff */ - 3, /* vSyncOn */ - 1244, /* vSyncOff */ - 150, /* hBackPorch */ - 27, /* vBackPorch */ - 800, /* xDimension */ - 1216, /* yDimension */ - 42, /* refreshRate */ - 0, /* miscCtrl */ - 494, /* memOffset */ - 26, /* tilesInX */ - 19, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 56.25F, /* clkFreq16bpp */ - 112.5F /* clkFreq24bpp */ -}; - -sst1VideoTimingStruct SST_VREZ_960X742_60 = { - 103, /* hSyncOn */ - 1151, /* hSyncOff */ - 3, /* vSyncOn */ - 765, /* vSyncOff */ - 142, /* hBackPorch */ - 22, /* vBackPorch */ - 960, /* xDimension */ - 742, /* yDimension */ - 60, /* refreshRate */ - 0, /* miscCtrl */ - 360, /* memOffset */ - 30, /* tilesInX */ - 19, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 56.219F, /* clkFreq16bpp */ - 112.437F /* clkFreq24bpp */ -}; - -#endif - - -sst1VideoTimingStruct SST_VREZ_320X200_70 = { - 96, /* hSyncOn */ - 704, /* hSyncOff */ - 2, /* vSyncOn */ - 447, /* vSyncOff */ - 48, /* hBackPorch */ - 35, /* vBackPorch */ - 320, /* xDimension */ - 200, /* yDimension */ - 70, /* refreshRate */ - 0x3, /* miscCtrl */ - 35, /* memOffset */ - 10, /* tilesInX */ - 25, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 25.175F, /* clkFreq16bpp */ - 50.350F /* clkFreq24bpp */ -}; - -sst1VideoTimingStruct SST_VREZ_320X200_75 = { - 99, /* hSyncOn */ - 733, /* hSyncOff */ - 3, /* vSyncOn */ - 429, /* vSyncOff */ - 52, /* hBackPorch */ - 25, /* vBackPorch */ - 320, /* xDimension */ - 200, /* yDimension */ - 75, /* refreshRate */ - 0x3, /* miscCtrl */ - 35, /* memOffset */ - 10, /* tilesInX */ - 25, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 27.0F, /* clkFreq16bpp */ - 54.0F /* clkFreq24bpp */ -}; - -sst1VideoTimingStruct SST_VREZ_320X200_85 = { - 63, /* hSyncOn */ - 767, /* hSyncOff */ - 3, /* vSyncOn */ - 442, /* vSyncOff */ - 94, /* hBackPorch */ - 41, /* vBackPorch */ - 320, /* xDimension */ - 200, /* yDimension */ - 85, /* refreshRate */ - 0x3, /* miscCtrl */ - 35, /* memOffset */ - 10, /* tilesInX */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 31.5F, /* clkFreq16bpp */ - 63.0F /* clkFreq24bpp */ -}; - -sst1VideoTimingStruct SST_VREZ_320X200_120 = { - 67, /* hSyncOn */ - 798, /* hSyncOff */ - 3, /* vSyncOn */ - 424, /* vSyncOff */ - 94, /* hBackPorch */ - 16, /* vBackPorch */ - 320, /* xDimension */ - 200, /* yDimension */ - 120, /* refreshRate */ - 0x3, /* miscCtrl */ - 35, /* memOffset */ - 10, /* tilesInX */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 44.47F, /* clkFreq16bpp */ - 88.94F /* clkFreq24bpp */ -}; - -sst1VideoTimingStruct SST_VREZ_320X240_60 = { - 96, /* hSyncOn */ - 704, /* hSyncOff */ - 2, /* vSyncOn */ - 523, /* vSyncOff */ - 38, /* hBackPorch */ - 25, /* vBackPorch */ - 320, /* xDimension */ - 240, /* yDimension */ - 60, /* refreshRate */ - 0x3, /* miscCtrl */ - 40, /* memOffset */ - 10, /* tilesInX */ - 25, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 25.175F, /* clkFreq16bpp */ - 50.350F /* clkFreq24bpp */ -}; - -sst1VideoTimingStruct SST_VREZ_320X240_75 = { - 63, /* hSyncOn */ - 775, /* hSyncOff */ - 3, /* vSyncOn */ - 497, /* vSyncOff */ - 118, /* hBackPorch */ - 16, /* vBackPorch */ - 320, /* xDimension */ - 240, /* yDimension */ - 75, /* refreshRate */ - 0x3, /* miscCtrl */ - 40, /* memOffset */ - 10, /* tilesInX */ - 25, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 31.5F, /* clkFreq16bpp */ - 63.0F /* clkFreq24bpp */ -}; - -sst1VideoTimingStruct SST_VREZ_320X240_85 = { - 55, /* hSyncOn */ - 776, /* hSyncOff */ - 3, /* vSyncOn */ - 506, /* vSyncOff */ - 78, /* hBackPorch */ - 25, /* vBackPorch */ - 320, /* xDimension */ - 240, /* yDimension */ - 85, /* refreshRate */ - 0x3, /* miscCtrl */ - 40, /* memOffset */ - 10, /* tilesInX */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 36.0F, /* clkFreq16bpp */ - 72.0F /* clkFreq24bpp */ -}; - -sst1VideoTimingStruct SST_VREZ_320X240_120 = { - 45, /* hSyncOn */ - 785, /* hSyncOff */ - 3, /* vSyncOn */ - 506, /* vSyncOff */ - 100, /* hBackPorch */ - 18, /* vBackPorch */ - 320, /* xDimension */ - 240, /* yDimension */ - 120, /* refreshRate */ - 0x3, /* miscCtrl */ - 40, /* memOffset */ - 10, /* tilesInX */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 50.82F, /* clkFreq16bpp */ - 101.64F /* clkFreq24bpp */ -}; - -sst1VideoTimingStruct SST_VREZ_400X300_60 = { - 39, /* hSyncOn */ - 471, /* hSyncOff */ - 3, /* vSyncOn */ - 619, /* vSyncOff */ - 54, /* hBackPorch */ - 18, /* vBackPorch */ - 400, /* xDimension */ - 300, /* yDimension */ - 60, /* refreshRate */ - 0x2, /* miscCtrl */ - 70, /* memOffset */ - 14, /* tilesInX */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 19.108F, /* clkFreq16bpp */ - 38.216F /* clkFreq24bpp */ -}; - -sst1VideoTimingStruct SST_VREZ_400X300_75 = { - 39, /* hSyncOn */ - 487, /* hSyncOff */ - 3, /* vSyncOn */ - 624, /* vSyncOff */ - 62, /* hBackPorch */ - 23, /* vBackPorch */ - 400, /* xDimension */ - 300, /* yDimension */ - 75, /* refreshRate */ - 0x2, /* miscCtrl */ - 70, /* memOffset */ - 14, /* tilesInX */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 24.829F, /* clkFreq16bpp */ - 49.658F /* clkFreq24bpp */ -}; - -sst1VideoTimingStruct SST_VREZ_400X300_85 = { - 39, /* hSyncOn */ - 487, /* hSyncOff */ - 3, /* vSyncOn */ - 627, /* vSyncOff */ - 62, /* hBackPorch */ - 26, /* vBackPorch */ - 400, /* xDimension */ - 300, /* yDimension */ - 85, /* refreshRate */ - 0x2, /* miscCtrl */ - 70, /* memOffset */ - 14, /* tilesInX */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 28.274F, /* clkFreq16bpp */ - 56.548F /* clkFreq24bpp */ -}; - -sst1VideoTimingStruct SST_VREZ_400X300_120 = { - 39, /* hSyncOn */ - 503, /* hSyncOff */ - 3, /* vSyncOn */ - 640, /* vSyncOff */ - 70, /* hBackPorch */ - 39, /* vBackPorch */ - 400, /* xDimension */ - 300, /* yDimension */ - 120, /* refreshRate */ - 0x2, /* miscCtrl */ - 70, /* memOffset */ - 14, /* tilesInX */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 41.975F, /* clkFreq16bpp */ - 83.950F /* clkFreq24bpp */ -}; - -/* 512x256@60 only syncs to Arcade-style monitors */ -sst1VideoTimingStruct SST_VREZ_512X256_60 = { - 41, /* hSyncOn */ - 626, /* hSyncOff */ - 4, /* vSyncOn */ - 286, /* vSyncOff */ - 65, /* hBackPorch */ - 24, /* vBackPorch */ - 512, /* xDimension */ - 256, /* yDimension */ - 60, /* refreshRate */ - 0, /* miscCtrl */ - 64, /* memOffset */ - 16, /* tilesInX */ - 25, /* vFifoThreshold */ - FXFALSE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 23.334F, /* clkFreq16bpp */ - 23.334F /* clkFreq24bpp */ -}; - -#if 0 -// For Arcade monitors... -sst1VideoTimingStruct SST_VREZ_512X384_60 = { - 23, /* hSyncOn */ - 640, /* hSyncOff */ - 3, /* vSyncOn */ - 411, /* vSyncOff */ - 90, /* hBackPorch */ - 24, /* vBackPorch */ - 512, /* xDimension */ - 384, /* yDimension */ - 60, /* refreshRate */ - 0, /* miscCtrl */ - 96, /* memOffset */ - 16, /* tilesInX */ - 23, /* vFifoThreshold */ - FXFALSE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 33.0F, /* clkFreq16bpp */ - 33.0F /* clkFreq24bpp */ -}; -#else -// For PC monitors... -sst1VideoTimingStruct SST_VREZ_512X384_60 = { - 55, /* hSyncOn */ - 615, /* hSyncOff */ - 3, /* vSyncOn */ - 792, /* vSyncOff */ - 78, /* hBackPorch */ - 23, /* vBackPorch */ - 512, /* xDimension */ - 384, /* yDimension */ - 60, /* refreshRate */ - 0x2, /* miscCtrl */ - 96, /* memOffset */ - 16, /* tilesInX */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 32.054F, /* clkFreq16bpp */ - 64.108F /* clkFreq24bpp */ -}; -#endif - -sst1VideoTimingStruct SST_VREZ_512X384_72 = { - 51, /* hSyncOn */ - 591, /* hSyncOff */ - 3, /* vSyncOn */ - 430, /* vSyncOff */ - 55, /* hBackPorch */ - 25, /* vBackPorch */ - 512, /* xDimension */ - 384, /* yDimension */ - 72, /* refreshRate */ - 0, /* miscCtrl */ - 96, /* memOffset */ - 16, /* tilesInX */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 20.093F, /* clkFreq16bpp */ - 40.186F /* clkFreq24bpp */ -}; - -sst1VideoTimingStruct SST_VREZ_512X384_75 = { - 55, /* hSyncOn */ - 631, /* hSyncOff */ - 3, /* vSyncOn */ - 799, /* vSyncOff */ - 86, /* hBackPorch */ - 30, /* vBackPorch */ - 512, /* xDimension */ - 384, /* yDimension */ - 75, /* refreshRate */ - 0x2, /* miscCtrl */ - 96, /* memOffset */ - 16, /* tilesInX */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 41.383F, /* clkFreq16bpp */ - 82.766F /* clkFreq24bpp */ -}; - -sst1VideoTimingStruct SST_VREZ_512X384_75_NOSCANDOUBLE = { - 47, /* hSyncOn */ - 591, /* hSyncOff */ - 3, /* vSyncOn */ - 399, /* vSyncOff */ - 62, /* hBackPorch */ - 14, /* vBackPorch */ - 512, /* xDimension */ - 384, /* yDimension */ - 75, /* refreshRate */ - 0, /* miscCtrl */ - 96, /* memOffset */ - 16, /* tilesInX */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 19.296F, /* clkFreq16bpp */ - 38.592F /* clkFreq24bpp */ -}; - -sst1VideoTimingStruct SST_VREZ_512X384_85 = { - 55, /* hSyncOn */ - 631, /* hSyncOff */ - 3, /* vSyncOn */ - 804, /* vSyncOff */ - 86, /* hBackPorch */ - 35, /* vBackPorch */ - 512, /* xDimension */ - 384, /* yDimension */ - 85, /* refreshRate */ - 0x2, /* miscCtrl */ - 96, /* memOffset */ - 16, /* tilesInX */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 47.193F, /* clkFreq16bpp */ - 94.386F /* clkFreq24bpp */ -}; - -sst1VideoTimingStruct SST_VREZ_512X384_85_NOSCANDOUBLE = { - 55, /* hSyncOn */ - 599, /* hSyncOff */ - 3, /* vSyncOn */ - 401, /* vSyncOff */ - 70, /* hBackPorch */ - 16, /* vBackPorch */ - 512, /* xDimension */ - 384, /* yDimension */ - 85, /* refreshRate */ - 0, /* miscCtrl */ - 96, /* memOffset */ - 16, /* tilesInX */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 22.527F, /* clkFreq16bpp */ - 45.054F /* clkFreq24bpp */ -}; - -sst1VideoTimingStruct SST_VREZ_512X384_120 = { - 25, /* hSyncOn */ - 650, /* hSyncOff */ - 3, /* vSyncOn */ - 409, /* vSyncOff */ - 110, /* hBackPorch */ - 25, /* vBackPorch */ - 512, /* xDimension */ - 384, /* yDimension */ - 120, /* refreshRate */ - 0, /* miscCtrl */ - 96, /* memOffset */ - 16, /* tilesInX */ - 25, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 33.5F, /* clkFreq16bpp */ - 67.0F /* clkFreq24bpp */ -}; - -/* Verified 10/21/96 */ -sst1VideoTimingStruct SST_VREZ_640X400_70 = { - 96, /* hSyncOn */ - 704, /* hSyncOff */ - 2, /* vSyncOn */ - 447, /* vSyncOff */ - 48, /* hBackPorch */ - 35, /* vBackPorch */ - 640, /* xDimension */ - 400, /* yDimension */ - 70, /* refreshRate */ - 0, /* miscCtrl */ - 130, /* memOffset */ - 20, /* tilesInX */ - 25, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 25.175F, /* clkFreq16bpp */ - 50.350F /* clkFreq24bpp */ -}; - -/* Verified 10/21/96 */ -sst1VideoTimingStruct SST_VREZ_640X400_75 = { - 99, /* hSyncOn */ - 733, /* hSyncOff */ - 3, /* vSyncOn */ - 429, /* vSyncOff */ - 52, /* hBackPorch */ - 25, /* vBackPorch */ - 640, /* xDimension */ - 400, /* yDimension */ - 75, /* refreshRate */ - 0, /* miscCtrl */ - 130, /* memOffset */ - 20, /* tilesInX */ - 25, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 27.0F, /* clkFreq16bpp */ - 54.0F /* clkFreq24bpp */ -}; - -/* VESA Standard */ -/* Verified 10/21/96 */ -sst1VideoTimingStruct SST_VREZ_640X400_85 = { - 63, /* hSyncOn */ - 767, /* hSyncOff */ - 3, /* vSyncOn */ - 442, /* vSyncOff */ - 94, /* hBackPorch */ - 41, /* vBackPorch */ - 640, /* xDimension */ - 400, /* yDimension */ - 85, /* refreshRate */ - 0, /* miscCtrl */ - 130, /* memOffset */ - 20, /* tilesInX */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 31.5F, /* clkFreq16bpp */ - 63.0F /* clkFreq24bpp */ -}; - -/* Verified 10/21/96 */ -sst1VideoTimingStruct SST_VREZ_640X400_120 = { - 67, /* hSyncOn */ - 798, /* hSyncOff */ - 3, /* vSyncOn */ - 424, /* vSyncOff */ - 94, /* hBackPorch */ - 16, /* vBackPorch */ - 640, /* xDimension */ - 400, /* yDimension */ - 120, /* refreshRate */ - 0, /* miscCtrl */ - 130, /* memOffset */ - 20, /* tilesInX */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 44.47F, /* clkFreq16bpp */ - 88.94F /* clkFreq24bpp */ -}; - -/* VESA Standard */ -/* Verified 10/21/96 */ -sst1VideoTimingStruct SST_VREZ_640X480_60 = { - 96, /* hSyncOn */ - - 704, /* hSyncOff */ - 2, /* vSyncOn */ - 523, /* vSyncOff */ - 38, /* hBackPorch */ - 25, /* vBackPorch */ - 640, /* xDimension */ - 480, /* yDimension */ - 60, /* refreshRate */ - 0, /* miscCtrl */ - 150, /* memOffset */ - 20, /* tilesInX */ - 25, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 25.175F, /* clkFreq16bpp */ - 50.350F /* clkFreq24bpp */ -}; - -/* VESA Standard */ -/* Verified 10/21/96 */ -sst1VideoTimingStruct SST_VREZ_640X480_75 = { - 63, /* hSyncOn */ - 775, /* hSyncOff */ - 3, /* vSyncOn */ - 497, /* vSyncOff */ - 118, /* hBackPorch */ - 16, /* vBackPorch */ - 640, /* xDimension */ - 480, /* yDimension */ - 75, /* refreshRate */ - 0, /* miscCtrl */ - 150, /* memOffset */ - 20, /* tilesInX */ - 25, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 31.5F, /* clkFreq16bpp */ - 63.0F /* clkFreq24bpp */ -}; - -/* VESA Standard */ -/* Verified 10/21/96 */ -sst1VideoTimingStruct SST_VREZ_640X480_85 = { - 55, /* hSyncOn */ - 776, /* hSyncOff */ - 3, /* vSyncOn */ - 506, /* vSyncOff */ - 78, /* hBackPorch */ - 25, /* vBackPorch */ - 640, /* xDimension */ - 480, /* yDimension */ - 85, /* refreshRate */ - 0, /* miscCtrl */ - 150, /* memOffset */ - 20, /* tilesInX */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 36.0F, /* clkFreq16bpp */ - 72.0F /* clkFreq24bpp */ -}; - -/* Verified 10/21/96 */ -sst1VideoTimingStruct SST_VREZ_640X480_120 = { - 45, /* hSyncOn */ - 785, /* hSyncOff */ - 3, /* vSyncOn */ - 506, /* vSyncOff */ - 100, /* hBackPorch */ - 18, /* vBackPorch */ - 640, /* xDimension */ - 480, /* yDimension */ - 120, /* refreshRate */ - 0, /* miscCtrl */ - 150, /* memOffset */ - 20, /* tilesInX */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 50.82F, /* clkFreq16bpp */ - 101.64F /* clkFreq24bpp */ -}; - -/* VESA Standard */ -/* Verified 10/21/96 */ -// 800x600 requires 832x608 amount of memory usage... -sst1VideoTimingStruct SST_VREZ_800X600_60 = { - 127, /* hSyncOn */ - 927, /* hSyncOff */ - 4, /* vSyncOn */ - 624, /* vSyncOff */ - 86, /* hBackPorch */ - 23, /* vBackPorch */ - 800, /* xDimension */ - 600, /* yDimension */ - 60, /* refreshRate */ - 0, /* miscCtrl */ - 247, /* memOffset */ - 26, /* tilesInX */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 40.0F, /* clkFreq16bpp */ - 80.0F /* clkFreq24bpp */ -}; - -/* VESA Standard */ -/* Verified 10/21/96 */ -sst1VideoTimingStruct SST_VREZ_800X600_75 = { - 79, /* hSyncOn */ - 975, /* hSyncOff */ - 3, /* vSyncOn */ - 622, /* vSyncOff */ - 158, /* hBackPorch */ - 21, /* vBackPorch */ - 800, /* xDimension */ - 600, /* yDimension */ - 75, /* refreshRate */ - 0, /* miscCtrl */ - 247, /* memOffset */ - 26, /* tilesInX */ - 21, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 49.5F, /* clkFreq16bpp */ - 99.0F /* clkFreq24bpp */ -}; - -/* VESA Standard */ -/* Verified 10/21/96 */ -sst1VideoTimingStruct SST_VREZ_800X600_85 = { - 63, /* hSyncOn */ - 983, /* hSyncOff */ - 3, /* vSyncOn */ - 628, /* vSyncOff */ - 150, /* hBackPorch */ - 27, /* vBackPorch */ - 800, /* xDimension */ - 600, /* yDimension */ - 85, /* refreshRate */ - 0, /* miscCtrl */ - 247, /* memOffset */ - 26, /* tilesInX */ - 19, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 56.25F, /* clkFreq16bpp */ - 112.5F /* clkFreq24bpp */ -}; - -sst1VideoTimingStruct SST_VREZ_800X600_120 = { - 87, /* hSyncOn */ - 999, /* hSyncOff */ - 3, /* vSyncOn */ - 640, /* vSyncOff */ - 142, /* hBackPorch */ - 39, /* vBackPorch */ - 800, /* xDimension */ - 600, /* yDimension */ - 120, /* refreshRate */ - 0, /* miscCtrl */ - 247, /* memOffset */ - 26, /* tilesInX */ - 17, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXFALSE, /* video24BPPIsOK */ - 83.950F, /* clkFreq16bpp */ - 83.950F /* clkFreq24bpp -- unsupported */ -}; - -// 856x480 requires 896x480 amount of memory usage... -sst1VideoTimingStruct SST_VREZ_856X480_60 = { - 136, /* hSyncOn */ - 1008, /* hSyncOff */ - 2, /* vSyncOn */ - 523, /* vSyncOff */ - 100, /* hBackPorch */ - 23, /* vBackPorch */ - 856, /* xDimension */ - 480, /* yDimension */ - 60, /* refreshRate */ - 0, /* miscCtrl */ - 210, /* memOffset */ - 28, /* tilesInX */ - 16, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 36.0F, /* clkFreq16bpp */ - 72.0F /* clkFreq24bpp */ -}; - -// 960x720 requires 960x736 amount of memory usage... -sst1VideoTimingStruct SST_VREZ_960X720_60 = { - 103, /* hSyncOn */ - 1151, /* hSyncOff */ - 3, /* vSyncOn */ - 743, /* vSyncOff */ - 142, /* hBackPorch */ - 22, /* vBackPorch */ - 960, /* xDimension */ - 720, /* yDimension */ - 60, /* refreshRate */ - 0, /* miscCtrl */ - 345, /* memOffset */ - 30, /* tilesInX */ - 19, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 56.219F, /* clkFreq16bpp */ - 112.437F /* clkFreq24bpp */ -}; - -sst1VideoTimingStruct SST_VREZ_960X720_75 = { - 103, /* hSyncOn */ - 1183, /* hSyncOff */ - 3, /* vSyncOn */ - 749, /* vSyncOff */ - 158, /* hBackPorch */ - 28, /* vBackPorch */ - 960, /* xDimension */ - 720, /* yDimension */ - 75, /* refreshRate */ - 0, /* miscCtrl */ - 345, /* memOffset */ - 30, /* tilesInX */ - 19, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXFALSE, /* video24BPPIsOK */ - 72.643F, /* clkFreq16bpp */ - 72.643F /* clkFreq24bpp -- unsupported */ -}; - -sst1VideoTimingStruct SST_VREZ_960X720_85 = { - 103, /* hSyncOn */ - 1199, /* hSyncOff */ - 3, /* vSyncOn */ - 753, /* vSyncOff */ - 166, /* hBackPorch */ - 32, /* vBackPorch */ - 960, /* xDimension */ - 720, /* yDimension */ - 85, /* refreshRate */ - 0, /* miscCtrl */ - 345, /* memOffset */ - 30, /* tilesInX */ - 19, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXFALSE, /* video24BPPIsOK */ - 83.795F, /* clkFreq16bpp */ - 83.795F /* clkFreq24bpp -- unsupported */ -}; - -sst1VideoTimingStruct SST_VREZ_1024X768_60 = { - 136, /* hSyncOn */ - 1208, /* hSyncOff */ - 6, /* vSyncOn */ - 800, /* vSyncOff */ - 160, /* hBackPorch */ - 29, /* vBackPorch */ - 1024, /* xDimension */ - 768, /* yDimension */ - 60, /* refreshRate */ - 0, /* miscCtrl */ - 384, /* memOffset */ - 32, /* tilesInX */ - 16, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXFALSE, /* video24BPPIsOK */ - 65.0F, /* clkFreq16bpp */ - 130.0F /* clkFreq24bpp */ -}; - -sst1VideoTimingStruct SST_VREZ_1024X768_75 = { - 96, /* hSyncOn */ - 1216, /* hSyncOff */ - 3, /* vSyncOn */ - 797, /* vSyncOff */ - 176, /* hBackPorch */ - 28, /* vBackPorch */ - 1024, /* xDimension */ - 768, /* yDimension */ - 75, /* refreshRate */ - 0, /* miscCtrl */ - 384, /* memOffset */ - 32, /* tilesInX */ - 16, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXFALSE, /* video24BPPIsOK */ - 78.75F, /* clkFreq16bpp */ - 78.75F /* clkFreq24bpp -- unsupported */ -}; - -sst1VideoTimingStruct SST_VREZ_1024X768_85 = { - 96, /* hSyncOn */ - 1280, /* hSyncOff */ - 3, /* vSyncOn */ - 805, /* vSyncOff */ - 208, /* hBackPorch */ - 36, /* vBackPorch */ - 1024, /* xDimension */ - 768, /* yDimension */ - 85, /* refreshRate */ - 0, /* miscCtrl */ - 384, /* memOffset */ - 32, /* tilesInX */ - 16, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXFALSE, /* video24BPPIsOK */ - 94.5F, /* clkFreq16bpp */ - 94.5F /* clkFreq24bpp -- unsupported */ -}; - -#else /* SST1INIT_VIDEO_ALLOCATE */ - - -#ifdef __cplusplus -extern "C" { -#endif - -extern sst1VideoTimingStruct SST_VREZ_640X480_60; -extern sst1VideoTimingStruct SST_VREZ_800X600_60; - -#ifdef __cplusplus -} -#endif - -#endif /* SST1INIT_VIDEO_ALLOCATE */ - -#endif /* !__SST1INIT_H__ */ diff --git a/glide2x/cvg/init/util.c b/glide2x/cvg/init/util.c deleted file mode 100644 index a42c750..0000000 --- a/glide2x/cvg/init/util.c +++ /dev/null @@ -1,1185 +0,0 @@ -/*-*-c++-*-*/ -/* -** 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$ -** -** Utility routines for SST-1 Initialization code -** -*/ -#ifdef _WIN32 -#pragma optimize ("",off) -#endif -#include -#include -#include -#ifdef BUILD_FOR_SST1 -#include -#else -#include <3dfx.h> -#include -#include -#endif -#define FX_DLL_DEFINITION -#include -#include -#include - -#include "canopus.h" - -/* -** sst1InitIdle(): -** Return idle condition of SST-1 -** -** Returns: -** FXTRUE if SST-1 is idle (fifos are empty, graphics engines are idle) -** FXFALSE if SST-1 has not been mapped -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitIdle(FxU32 *sstbase) -{ - if(!sstbase) - return(FXFALSE); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - if(!initIdleEnabled) - return(FXTRUE); - - if(sst1CurrentBoard->fbiLfbLocked) { - if(sst1CurrentBoard->sliSlaveVirtAddr == (FxU32 *) NULL) - // SLI not enabled... - sst1InitPciFifoIdleLoop(sstbase); - else { - // Check idle for Master... - sst1InitPciFifoIdleLoop(sstbase); - // Check idle for Slave... - sst1InitPciFifoIdleLoop(sst1CurrentBoard->sliSlaveVirtAddr); - } - } else { - if(sst1CurrentBoard->sliSlaveVirtAddr == (FxU32 *) NULL) - // SLI not enabled... - sst1InitIdleLoop(sstbase, FXTRUE); - else { - // Check idle for Master... - sst1InitIdleLoop(sstbase, FXTRUE); - - // Check idle for Slave... - // Note that the Slave does not need another NOP command, because - // it will snoop the NOP command sent to the Master above. - // Sending a NOP command to the Slave also confuses the callback - // write routines for the command fifo which are not setup to - // handle any other base addresses other than the Master's... - sst1InitIdleLoop(sst1CurrentBoard->sliSlaveVirtAddr, FXFALSE); - } - } - return(FXTRUE); -} - -static FxBool -sst1InitIdleWithTimeoutLoop(FxU32 *sstbase, FxBool issueNOP, FxU32 timeout) -{ - FxU32 cntr, loop; - SstRegs *sst = (SstRegs *) sstbase; - - if(issueNOP) ISET(sst->nopCMD, 0x0); - - cntr = loop = 0; - while(++loop < timeout) { - if(!(sst1InitReturnStatus(sstbase) & SST_BUSY)) { - if(++cntr >= 3) - break; - } else - cntr = 0; - } - - return (loop < timeout); -} - -FxBool -sst1InitIdleFBIWithTimeout(FxU32 *sstbase, FxBool issueNop, FxU32 timeout) -{ - int retVal; - - if(!sstbase) - return(FXFALSE); - - if(!sst1InitCheckBoard(sstbase)) - return(FXFALSE); - - if(sst1CurrentBoard->sliSlaveVirtAddr == (FxU32 *) NULL) { - // SLI not enabled... - retVal = sst1InitIdleWithTimeoutLoop(sstbase, issueNop, timeout); - } else { - // Check idle for Master... - if(!sst1InitIdleWithTimeoutLoop(sstbase, issueNop, timeout)) - return(FXFALSE); - - // Check idle for Slave... - // Note that the Slave does not need another NOP command, because - // it will snoop the NOP command sent to the Master above. - // Sending a NOP command to the Slave also confuses the callback - // write routines for the command fifo which are not setup to - // handle any other base addresses other than the Master's... - retVal = sst1InitIdleWithTimeoutLoop(sst1CurrentBoard->sliSlaveVirtAddr, - FXFALSE, - timeout); - } - - return retVal; -} - -FX_EXPORT FxBool FX_CSTYLE sst1InitIdleNoNOP(FxU32 *sstbase) -{ - if(!sstbase) - return(FXFALSE); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - if(!initIdleEnabled) - return(FXTRUE); - - if(sst1CurrentBoard->fbiLfbLocked) { - if(sst1CurrentBoard->sliSlaveVirtAddr == (FxU32 *) NULL) - // SLI not enabled... - sst1InitPciFifoIdleLoop(sstbase); - else { - // Check idle for Master... - sst1InitPciFifoIdleLoop(sstbase); - // Check idle for Slave... - sst1InitPciFifoIdleLoop(sst1CurrentBoard->sliSlaveVirtAddr); - } - } else { - if(sst1CurrentBoard->sliSlaveVirtAddr == (FxU32 *) NULL) - // SLI not enabled... - sst1InitIdleLoop(sstbase, FXFALSE); - else { - // Check idle for Master... - sst1InitIdleLoop(sstbase, FXFALSE); - // Check idle for Slave... - sst1InitIdleLoop(sst1CurrentBoard->sliSlaveVirtAddr, FXFALSE); - } - } - return(FXTRUE); -} - -void sst1InitIdleLoop(FxU32 *sstbase, FxBool issueNOP) -{ - FxU32 cntr; - SstRegs *sst = (SstRegs *) sstbase; - - if(issueNOP) - ISET(sst->nopCMD, 0x0); - - cntr = 0; - while(1) { - if(!(sst1InitReturnStatus(sstbase) & SST_BUSY)) { - if(++cntr >= 3) - break; - } else - cntr = 0; - } -} - -void sst1InitPciFifoIdleLoop(FxU32 *sstbase) -{ - FxU32 cntr; - - cntr = 0; - while(1) { - if(((sst1InitReturnStatus(sstbase) & SST_FIFOLEVEL)) == 0x3f) { - // Since sst1InitPciFifoIdleLoop is only called when we're trying - // to "fake" idle during lfb locks, wait for 6 passes to give the - // hardware time to drain - if(++cntr >= 6) - break; - } else - cntr = 0; - } -} - -/* -** sst1InitIdleFBI(): -** Return idle condition of FBI (ignoring idle status of TMU) -** -** Returns: -** FXTRUE if FBI is idle (fifos are empty, graphics engines are idle) -** FXFALSE if FBI has not been mapped -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitIdleFBI(FxU32 *sstbase) -{ - FxU32 cntr; - SstRegs *sst = (SstRegs *) sstbase; - - if(!sst) - return(FXFALSE); - - ISET(sst->nopCMD, 0x0); - cntr = 0; - while(1) { - if(!(sst1InitReturnStatus(sstbase) & SST_FBI_BUSY)) { - if(++cntr >= 3) - break; - } else - cntr = 0; - } - return(FXTRUE); -} - -/* -** sst1InitIdleFBINoNOP(): -** Return idle condition of FBI (ignoring idle status of TMU) -** sst1InitIdleFBINoNOP() differs from sst1InitIdleFBI() in that no NOP command -** is issued to flush the graphics pipeline. -** -** Returns: -** FXTRUE if FBI is idle (fifos are empty, graphics engines are idle) -** FXFALSE if FBI has not been mapped -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitIdleFBINoNOP(FxU32 *sstbase) -{ - FxU32 cntr; - SstRegs *sst = (SstRegs *) sstbase; - - if(!sst) - return(FXFALSE); - - // ISET(sst->nopCMD, 0x0); - cntr = 0; - while(1) { - if(!(sst1InitReturnStatus(sstbase) & SST_FBI_BUSY)) { - if(++cntr > 5) - break; - } else - cntr = 0; - } - return(FXTRUE); -} - -// Included so compiler doesn't optimize out loop code waiting on status bits -FX_EXPORT FxU32 FX_CSTYLE sst1InitReturnStatus(FxU32 *sstbase) -{ - SstRegs *sst = (SstRegs *) sstbase; - - return(IGET(sst->status)); -} - - -/* -** sst1InitClearSwapPending(): -** Clear any swaps pending in the status register -** NOTE: The video unit of FBI must be initialized before calling this routine -** -** Returns: -** FXTRUE -** -*/ -FX_ENTRY FxBool FX_CALL sst1InitClearSwapPending(FxU32 *sstbase) -{ - SstRegs *sst = (SstRegs *) sstbase; - FxU32 displayedBuffer, i; - - INIT_PRINTF(("sst1InitClearSwapPending() WARNING: Clearing pending swapbufferCMDs...\n")); - - sst1InitIdle(sstbase); - displayedBuffer = - (IGET(sst->status) & SST_DISPLAYED_BUFFER) >> - SST_DISPLAYED_BUFFER_SHIFT; - - // Wait until vsync is inactive to guarantee that swaps queue in the - // PCI fifo properly - while(!(IGET(sst->status) & SST_VRETRACE) || - ((IGET(sst->vRetrace) & 0xfff) > 100) || ((IGET(sst->vRetrace) & 0xfff) - < 10)) - ; - - // First swap syncs to Vsync...Subsequent ones do not... - ISET(sst->swapbufferCMD, 0x1); - ISET(sst->nopCMD, 0x0); - for(i=0; i<17; i++) { - ISET(sst->swapbufferCMD, 0x0); - ISET(sst->nopCMD, 0x0); - } - if(displayedBuffer) { - ISET(sst->swapbufferCMD, 0x0); - ISET(sst->nopCMD, 0x0); - } - sst1InitIdle(sstbase); - - return(FXTRUE); -} - -/* -** sst1InitVgaPassCtrl(): -** Control VGA passthrough setting -** -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitVgaPassCtrl(FxU32 *sstbase, FxU32 enable) -{ - SstRegs *sst = (SstRegs *) sstbase; - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - //if (sst1CurrentBoard->singleBrdSLISlave) { - // enable = 1; - //} - - if(enable) { - // VGA controls monitor - ISET(sst->fbiInit0, (IGET(sst->fbiInit0) & ~SST_EN_VGA_PASSTHRU) | - sst1CurrentBoard->vgaPassthruEnable); - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_BLANK_EN); - } else { - // SST-1 controls monitor - ISET(sst->fbiInit0, (IGET(sst->fbiInit0) & ~SST_EN_VGA_PASSTHRU) | - sst1CurrentBoard->vgaPassthruDisable); - ISET(sst->fbiInit1, IGET(sst->fbiInit1) & ~SST_VIDEO_BLANK_EN); - } - - return(FXTRUE); -} - -/* -** sst1InitResetTmus(): -** Reset TMUs -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitResetTmus(FxU32 *sstbase) -{ - volatile int delay; - SstRegs *sst = (SstRegs *) sstbase; - FxU32 allowTexturing = (GETENV(("SSTV2_TEXMAP_DISABLE"))) ? 0 : 1; - - if(!sst) - return(FXFALSE); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - // Ignore stalls on FT Bus - ISET(sst->fbiInit3, IGET(sst->fbiInit3) | SST_TEXMAP_DISABLE); - // Delay - for(delay=0;delay<10000;) - delay++; - -// while(++cntr < 6) { - - INIT_PRINTF(("sst1InitResetTmus(): Reset Graphics ")); - - do - { - INIT_PRINTF((".")); - - // Set Default initialization values for all TMUs... - ISET(SST_TREX(sst,0)->trexInit0, sst1CurrentBoard->tmuInit0[0]); - ISET(SST_TREX(sst,1)->trexInit0, sst1CurrentBoard->tmuInit0[1]); - // Delay - for(delay=0;delay<10000;) - delay++; - - ISET(SST_TREX(sst,0)->trexInit1, sst1CurrentBoard->tmuInit1[0]); - ISET(SST_TREX(sst,1)->trexInit1, sst1CurrentBoard->tmuInit1[1]); - // Delay - for(delay=0;delay<10000;) - delay++; - - // Reset TMU FIFOs and graphics core for all TMUs... - ISET(SST_TREX(sst,0)->trexInit1, sst1CurrentBoard->tmuInit1[0] | SST_TEX_RESET_FIFO | SST_TEX_RESET_GRX); - ISET(SST_TREX(sst,1)->trexInit1, sst1CurrentBoard->tmuInit1[1] | SST_TEX_RESET_FIFO | SST_TEX_RESET_GRX); - // Delay - for(delay=0;delay<10000;) - delay++; - - ISET(SST_TREX(sst,1)->trexInit1, sst1CurrentBoard->tmuInit1[1]); - - // Allow unreset to propagate backwards... - // Delay - for(delay=0;delay<10000;) - delay++; - - ISET(SST_TREX(sst,0)->trexInit1, sst1CurrentBoard->tmuInit1[0]); - // Delay - for(delay=0;delay<10000;) - delay++; - - // Reset in the downstream TMU may cause glitches in FBI's TF FIFO - // Waiting for Idle in FBI will not stall on something in the TF FIFO, - // as the TF FIFO empty signal is not part of FBI's "busy" bit -// sst1InitIdleFBIWithTimeout(sstbase, FXTRUE, 100000); - sst1InitResetFbi(sstbase); -/* - fbiInit0 = IGET(sst->fbiInit0) | SST_GRX_RESET | SST_PCI_FIFO_RESET; - - ISET(sst->fbiInit0, fbiInit0); - // Delay - for(delay=0;delay<10000;) - delay++; - - fbiInit0 &= ~SST_PCI_FIFO_RESET; - ISET(sst->fbiInit0, fbiInit0); - // Delay - for(delay=0;delay<10000;) - delay++; - - fbiInit0 &= ~SST_GRX_RESET; - ISET(sst->fbiInit0, fbiInit0); - // Delay - for(delay=0;delay<10000;) - delay++; -*/ - - if(allowTexturing) - { - ISET(sst->fbiInit3, IGET(sst->fbiInit3) & ~SST_TEXMAP_DISABLE); - for(delay=0;delay<10000;) - delay++; - } - - delay = 0; - - while( sst1InitReturnStatus(sstbase) & (SST_TMU_BUSY | SST_FBI_BUSY) && (delay < 50000) ) - delay++; - - }while( delay == 50000 ); - - INIT_PRINTF(("\n")); - -// INIT_PRINTF(("sst1InitResetTmus(): Could not reset graphics (0x%08lx)\n", ret)); -// else -// break; -// } -// if(cntr == 6) { -// INIT_PRINTF(("sst1InitResetTmus(): Could not reset TMUs...\n")); -// return(FXFALSE); -// } - - // Fix problem where first Texture downloads to TMU weren't being - // received properly - ISET(*(long *) (0xf00000 + (long) sstbase), 0xdeadbeef); - sst1InitIdle(sstbase); - - return(FXTRUE); -} - -/* -** sst1InitResetFbi(): -** Reset FBI graphics engine and frontend PCI Fifo... -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitResetFbi(FxU32 *sstbase) -{ - volatile int delay; -// int i; - FxU32 fbiInit0; - SstRegs *sst = (SstRegs *) sstbase; -/* - for(i=0;i<20000;i++) sst1InitReturnStatus(sstbase); - ISET(sst->fbiInit0, IGET(sst->fbiInit0) | SST_GRX_RESET | SST_PCI_FIFO_RESET); - for(i=0;i<20000;i++) sst1InitReturnStatus(sstbase); - ISET(sst->fbiInit0, IGET(sst->fbiInit0) & ~SST_PCI_FIFO_RESET); - for(i=0;i<20000;i++) sst1InitReturnStatus(sstbase); - ISET(sst->fbiInit0, IGET(sst->fbiInit0) & ~SST_GRX_RESET); - for(i=0;i<20000;i++) sst1InitReturnStatus(sstbase); -*/ - fbiInit0 = IGET(sst->fbiInit0) | SST_GRX_RESET | SST_PCI_FIFO_RESET; - - ISET(sst->fbiInit0, fbiInit0); - // Delay - for(delay=0;delay<10000;) - delay++; - - fbiInit0 &= ~SST_PCI_FIFO_RESET; - ISET(sst->fbiInit0, fbiInit0); - // Delay - for(delay=0;delay<10000;) - delay++; - - fbiInit0 &= ~SST_GRX_RESET; - ISET(sst->fbiInit0, fbiInit0); - // Delay - for(delay=0;delay<10000;) - delay++; - - return(FXTRUE); -} - -#if SET_BSWAP -#if __POWERPC__ && defined(__MWERKS__) -#define GET(s) __lwbrx(s, 0 ) -#define SET(d, s) __stwbrx((s), (d), 0); -#else /* !__MWERKS__ */ -#error "Define byte swapped macros for GET/SET" -#endif /* !__MWERKS__ */ -#else /* !SET_BSWAP */ -#ifdef GET -#undef GET -#endif -#ifdef SET -#undef SET -#endif -#define GET(s) (*s) -#define SET(d, s) ((*d) = s) -#endif /* !SET_BSWAP */ - -/* -** sst1InitWrite32(): -** Write 32-bit Word to specified address -** -*/ -FX_EXPORT void FX_CSTYLE sst1InitWrite32(FxU32 *addr, FxU32 data) -{ - /* If the client software is using the command fifo then they are - * responsible for passing a callback that can be used to put - * register writes from the init code into the command fifo that - * they are managing. However, some registers cannot be accessed via - * the command fifo, and, inconveniently, these are not contiguously - * allocated. - */ - const FxU32 addrOffset = ((const FxU32)addr - (const FxU32)sst1CurrentBoard->virtAddr[0]); - FxBool directWriteP = ((sst1CurrentBoard == NULL) || - (sst1CurrentBoard->set32 == NULL) || - sst1CurrentBoard->fbiLfbLocked || - (addrOffset == 0x004) || /* intrCtrl */ - ((addrOffset >= 0x1E0) && (addrOffset <= 0x200)) || /* cmdFifoBase ... fbiInit4 */ - ((addrOffset >= 0x208) && (addrOffset <= 0x224)) || /* backPorch ... vSync */ - ((addrOffset >= 0x22C) && (addrOffset <= 0x23C)) || /* dacData ... borderColor */ - ((addrOffset >= 0x244) && (addrOffset <= 0x24C))); /* fbiInit5 ... fbiInit7 */ - - if (directWriteP) { - P6FENCE; - SET(addr, data); - P6FENCE; - } else { - (*sst1CurrentBoard->set32)(addr, data); - } -} - -/* -** sst1InitRead32(): -** Read 32-bit Word from specified address -** -*/ -FX_EXPORT FxU32 FX_CSTYLE sst1InitRead32(FxU32 *addr) -{ - P6FENCE; - return GET(addr); -} - -/* -** -** sst1InitCmdFifo(): - -** Setup Command Fifo. -** -** The 'enable' parameter either enables or disables the Command Fifo. -** -** Upon return, the 'virtAddrStart' parameter is filled with the starting -** virtual address where command fifo packets should be stored. The -** 'memAddrStart' parameter is filled with the address of where the command -** fifo is stored in frame buffer memory. The 'memAddrStart' value is often -** used by the JMP command to jump to the beginning of the command fifo. -** The 'size' parameter is filled with the size of the command fifo. -** The values of 'virtAddrstart', 'memAddrStart' and 'size' -** are dependent on the amount of frame buffer memory detected as well as the -** video resolution setup by sst1InitVideo(). 'virtAddrstart', -** 'memAddrStart' and 'size' are all specified in bytes. -** -*/ -FX_ENTRY FxBool FX_CALL sst1InitCmdFifo(FxU32 *sstbase, FxBool enable, - FxU32 *virtAddrStart, FxU32 *memAddrStart, FxU32 *size, FxSet32Proc set32Proc) -{ - SstRegs *sst = (SstRegs *) sstbase; - FxU32 fbiInit, fifoStart, fifoSize; - FxBool directExec = (GETENV(("SSTV2_CMDFIFO_DIRECT"))) ? FXTRUE : FXFALSE; - FxBool disableHoles = (GETENV(("SSTV2_CMDFIFO_NOHOLES"))) ? FXTRUE : FXFALSE; - - if(!sst) - return(FXFALSE); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - if(sst1CurrentBoard->fbiCmdFifoEn || (IGET(sst->fbiInit7) & SST_EN_CMDFIFO)) - sst1InitIdleNoNOP(sstbase); - else - sst1InitIdle(sstbase); - - if(enable == FXFALSE) { - // Remove any client set callbacks before continuing since - // these must go straight to the hw. - sst1CurrentBoard->set32 = NULL; - sst1CurrentBoard->fbiCmdFifoEn = 0; - - // Disable Command Fifo - INIT_PRINTF(("sst1InitCmdFifo(): Disabling Command Fifo...\n")); - ISET(sst->fbiInit7, IGET(sst->fbiInit7) & ~SST_EN_CMDFIFO); - - // Reset graphics core to force disable to take effect... - ISET(sst->fbiInit0, IGET(sst->fbiInit0) | SST_GRX_RESET | - SST_EN_LFB_MEMFIFO | SST_EN_TEX_MEMFIFO); - sst1InitReturnStatus(sstbase); - sst1InitReturnStatus(sstbase); - sst1InitReturnStatus(sstbase); - ISET(sst->fbiInit0, IGET(sst->fbiInit0) & ~SST_GRX_RESET); - - if(sst1CurrentBoard->sliSlaveVirtAddr) { - SstRegs *slaveSst = (SstRegs *) sst1CurrentBoard->sliSlaveVirtAddr; - - ISET(slaveSst->fbiInit7, IGET(slaveSst->fbiInit7) & ~SST_EN_CMDFIFO); - // Reset graphics core to force disable to take effect... - ISET(slaveSst->fbiInit0, IGET(slaveSst->fbiInit0) | SST_GRX_RESET | - SST_EN_LFB_MEMFIFO | SST_EN_TEX_MEMFIFO); - sst1InitReturnStatus(sst1CurrentBoard->sliSlaveVirtAddr); - sst1InitReturnStatus(sst1CurrentBoard->sliSlaveVirtAddr); - sst1InitReturnStatus(sst1CurrentBoard->sliSlaveVirtAddr); - ISET(slaveSst->fbiInit0, IGET(slaveSst->fbiInit0) & ~SST_GRX_RESET); - - if(sst1InitCheckBoard(sst1CurrentBoard->sliSlaveVirtAddr) == FXFALSE) - return(FXFALSE); - sst1CurrentBoard->set32 = NULL; - sst1CurrentBoard->fbiCmdFifoEn = 0; - } - return(FXTRUE); - } - - sst1InitIdle(sstbase); - fbiInit = IGET(sst->fbiInit4); - fifoStart = - (fbiInit & SST_MEM_FIFO_ROW_BASE) >> SST_MEM_FIFO_ROW_BASE_SHIFT; - fifoStart <<= 12; // Convert page-address into byte-address - - if(sst1CurrentBoard->fbiMemSize == 4) - fifoSize = (1024 - (fifoStart >> 12)) << 12; - else if(sst1CurrentBoard->fbiMemSize == 2) - fifoSize = (512 - (fifoStart >> 12)) << 12; - else - fifoSize = (256 - (fifoStart >> 12)) << 12; - if(fifoSize > (256<<10)) - fifoSize = (256<<10); - - *virtAddrStart = (FxU32) (((FxU32) sstbase) + SST_CMDFIFO_ADDR); - *memAddrStart = fifoStart; - *size = fifoSize; - - if(!sst1InitCmdFifoDirect(sstbase, 0, - fifoStart, fifoSize, - directExec, disableHoles, - set32Proc)) { - INIT_PRINTF(("sst1InitCmdFifo(): sst1InitCmdFifoDirect() failed...\n")); - return(FXFALSE); - } - - if(sst1CurrentBoard->sliSlaveVirtAddr) { - if(!sst1InitCmdFifoDirect(sst1CurrentBoard->sliSlaveVirtAddr, 0, - fifoStart, fifoSize, - directExec, disableHoles, - set32Proc)) { - INIT_PRINTF(("sst1InitCmdFifo(): sst1InitCmdFifoDirect() failed for SLI Slave...\n")); - return(FXFALSE); - } - } - - INIT_PRINTF(("sst1InitCmdFifo() exiting with status %d...\n", FXTRUE)); - return(FXTRUE); -} - -/* -** -** sst1InitCmdFifoDirect(): -** Explicitly initialize Command FIFO. This routine is typically not -** called directly from apps, but is included so that csim diags can -** call it directly. -** -** The 'start' and 'size' parameters are specified in bytes. -** The 'which' parameter is not used, but is included for H3 compatibility. -** -*/ -FX_ENTRY FxBool FX_CALL sst1InitCmdFifoDirect(FxU32 *sstbase, FxU32 which, - FxU32 start, FxU32 size, FxBool directExec, FxBool disableHoles, - FxSet32Proc set32Proc) -{ - SstRegs *sst = (SstRegs *) sstbase; - FxU32 fbiInit7, initEnable, n; - FxU32 pageStart = start >> 12; - FxU32 pageEnd = (start+size-1) >> 12; - - if(!sst) - return(FXFALSE); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - // sst1Initidle() routines must be properly executed... - initIdleEnabled = 1; - - INIT_PRINTF(("sst1InitCmdFifoDirect(): Start:0x%x bytes, Size:%d(0x%x) bytes\n", - start, size, size)); - INIT_PRINTF(("sst1InitCmdFifoDirect(): DirectExec:%d, DisableHoles:%d\n", - directExec, disableHoles)); - INIT_PRINTF(("sst1InitCmdFifoDirect(): pageStart:%d, pageEnd:%d\n", - pageStart, pageEnd)); - INIT_PRINTF(("sst1InitCmdFifoDirect(): set32Proc: 0x%X\n", - (FxU32)set32Proc)); - - if(sst1CurrentBoard->fbiCmdFifoEn || (IGET(sst->fbiInit7) & SST_EN_CMDFIFO)) - sst1InitIdleNoNOP(sstbase); - else - sst1InitIdle(sstbase); - // Disable memory-backed fifo, and disallow lfb and texture writes - // through command fifo... - ISET(sst->fbiInit0, (IGET(sst->fbiInit0) & - ~(SST_MEM_FIFO_EN | SST_EN_LFB_MEMFIFO | SST_EN_TEX_MEMFIFO))); - sst1InitReturnStatus(sstbase); - - fbiInit7 = IGET(sst->fbiInit7); - fbiInit7 &= ~(SST_EN_CMDFIFO | - SST_EN_CMDFIFO_OFFSCREEN | SST_CMDFIFO_DISABLE_HOLES | - SST_CMDFIFO_REGS_SYNC_WRITES | SST_CMDFIFO_REGS_SYNC_READS | - SST_CMDFIFO_RDFETCH_THRESH | SST_CMDFIFO_PCI_TIMEOUT); - fbiInit7 |= SST_CMDFIFO_REGS_SYNC_WRITES | SST_CMDFIFO_REGS_SYNC_READS | - (0x10<fbiInit7, fbiInit7); // turn off the command fifo - sst1InitReturnStatus(sstbase); - - // Disable all writes to the PCI fifo while we're setting up CMDFIFO - PCICFG_RD(SST1_PCI_INIT_ENABLE, initEnable); - PCICFG_WR(SST1_PCI_INIT_ENABLE, - ((initEnable & ~(SST_INITWR_EN | SST_PCI_FIFOWR_EN)) | SST_INITWR_EN)); - - // Setup command fifo... - ISET(sst->cmdFifoBase, (pageEnd << SST_CMDFIFO_END_SHIFT) | pageStart); - sst1InitReturnStatus(sstbase); // prevent PCI bursts... - ISET(sst->cmdFifoReadPtr, start); - sst1InitReturnStatus(sstbase); - ISET(sst->cmdFifoAmin, start-4); - sst1InitReturnStatus(sstbase); - ISET(sst->cmdFifoAmax, start-4); - sst1InitReturnStatus(sstbase); - ISET(sst->cmdFifoDepth, 0); - sst1InitReturnStatus(sstbase); - ISET(sst->cmdFifoHoles, 0); - sst1InitReturnStatus(sstbase); - sst1InitIdle(sstbase); - - // Turn on command fifo... - ISET(sst->fbiInit7, fbiInit7 | SST_EN_CMDFIFO | - (directExec ? 0 : SST_EN_CMDFIFO_OFFSCREEN) | - (disableHoles ? SST_CMDFIFO_DISABLE_HOLES : 0)); - // Can't perform sst1InitIdle() here because it will generate - // writes to the CMDFIFO since the CMDFIFO is now enabled... - sst1InitReturnStatus(sstbase); - - // Enable writes to be pushed onto the CMDFIFO... - PCICFG_WR(SST1_PCI_INIT_ENABLE, - (initEnable | SST_INITWR_EN | SST_PCI_FIFOWR_EN)); - - sst1CurrentBoard->fbiCmdFifoEn = 1; - if(GETENV(("SSTV2_IGNORE_IDLE"))) - initIdleEnabled = 0; - - /* Set the client callbacks, if necessary. */ - sst1CurrentBoard->set32 = set32Proc; - - return(FXTRUE); -} - -/* -** -** sst1InitLfbLock(): -** Used to workaround a hw bug when performing lfb and texture writes when -** the command fifo is enabled. The routines sst1InitLfbLock() and -** sst1InitLfbUnlock() dynamically disable the command fifo so that lfb -** and texture accesses do not pass through the command fifo. -** WARNING: No register writes of any kind may be performed between a -** sst1InitLfbLock() and sst1InitLfbUnlock() pair -- only lfb reads and -** writes are allowed. -*/ -FX_ENTRY FxBool FX_CALL sst1InitLfbLock(FxU32* sstbase) -{ - if(!sstbase) - return(FXFALSE); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - // Idle the hardware... - sst1InitIdle(sstbase); - - if(sst1InitLfbLockDirect(sstbase) == FXFALSE) - return(FXFALSE); - - if(sst1CurrentBoard->sliSlaveVirtAddr) { - // SLI Enabled - if(sst1InitLfbLockDirect(sst1CurrentBoard->sliSlaveVirtAddr) == FXFALSE) - return(FXFALSE); - } - - return(FXTRUE); -} - -FX_ENTRY FxBool FX_CALL sst1InitLfbLockDirect(FxU32* sstbase) -{ - SstRegs *sst = (SstRegs *) sstbase; - - if(!sst) - return(FXFALSE); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - if((!(IGET(sst->fbiInit7) & SST_EN_CMDFIFO) && - !sst1CurrentBoard->fbiCmdFifoEn) || sst1CurrentBoard->fbiLfbLocked) - return(FXTRUE); - - // Force direct writes... - sst1CurrentBoard->fbiLfbLocked = 1; - - ISET(sst->fbiInit7, IGET(sst->fbiInit7) & ~SST_EN_CMDFIFO_OFFSCREEN); - sst1InitReturnStatus(sstbase); - sst1InitReturnStatus(sstbase); - sst1InitReturnStatus(sstbase); - - return(FXTRUE); -} - -/* -** -** sst1InitLfbUnlock(): -** Used to workaround a hw bug when performing lfb and texture writes when -** the command fifo is enabled. The routines sst1InitLfbLock() and -** sst1InitLfbUnlock() dynamically disable the command fifo so that lfb -** and texture accesses do not pass through the command fifo. -** WARNING: No register writes of any kind may be performed between a -** sst1InitLfbLock() and sst1InitLfbUnlock() pair -- only lfb reads and -** writes are allowed. -*/ - -FX_ENTRY FxBool FX_CALL sst1InitLfbUnlock(FxU32* sstbase) -{ - if(!sstbase) - return(FXFALSE); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - // Idle the hardware. Since lfb lock is set, a NOP will not be issued, and - // sst1InitPciFifoIdleLoop() will be used instead of sst1InitIdleLoop()... - sst1InitIdle(sstbase); - - if(sst1CurrentBoard->sliSlaveVirtAddr) { - // SLI Enabled - if(sst1InitLfbUnlockDirect(sst1CurrentBoard->sliSlaveVirtAddr) == - FXFALSE) - return(FXFALSE); - } - if(sst1InitLfbUnlockDirect(sstbase) == FXFALSE) - return(FXFALSE); - - // After the command fifo is re-enabled, make sure the chip is really idle... - sst1InitIdle(sstbase); - - return(FXTRUE); -} - -FX_ENTRY FxBool FX_CALL sst1InitLfbUnlockDirect(FxU32* sstbase) -{ - SstRegs *sst = (SstRegs *) sstbase; - - if(!sst) - return(FXFALSE); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - if(!sst1CurrentBoard->fbiCmdFifoEn || !sst1CurrentBoard->fbiLfbLocked) - return(FXTRUE); - - ISET(sst->fbiInit7, IGET(sst->fbiInit7) | SST_EN_CMDFIFO_OFFSCREEN); - - sst1CurrentBoard->fbiLfbLocked = 0; - - sst1InitReturnStatus(sstbase); - sst1InitReturnStatus(sstbase); - sst1InitReturnStatus(sstbase); - - return(FXTRUE); -} - -/* -** -** sst1InitPrintInitRegs(): -** Print Initialization Registers -** -*/ -FX_EXPORT void FX_CSTYLE sst1InitPrintInitRegs(FxU32 *sstbase) -{ - SstRegs *sst = (SstRegs *) sstbase; - - INIT_PRINTF(("FBI Initialization Registers:\n")); - INIT_PRINTF(("-----------------------------\n")); - INIT_PRINTF(("fbiInit0:0x%08x fbiInit1:0x%08x\n", - IGET(sst->fbiInit0), IGET(sst->fbiInit1))); - INIT_PRINTF(("fbiInit2:0x%08x fbiInit3:0x%08x\n", - IGET(sst->fbiInit2), IGET(sst->fbiInit3))); - INIT_PRINTF(("fbiInit4:0x%08x fbiInit5:0x%08x\n", - IGET(sst->fbiInit4), IGET(sst->fbiInit5))); - INIT_PRINTF(("fbiInit6:0x%08x fbiInit7:0x%08x\n", - IGET(sst->fbiInit6), IGET(sst->fbiInit7))); - INIT_PRINTF(("videoDimensions:0x%08x\n\n", - IGET(sst->videoDimensions))); - INIT_PRINTF(("FBI Command Fifo Registers:\n")); - INIT_PRINTF(("---------------------------\n")); - INIT_PRINTF(("cmdFifoBase: 0x%08x\tcmdFifoBump:0x%x\n", - IGET(sst->cmdFifoBase), IGET(sst->cmdFifoBump))); - INIT_PRINTF(("cmdFifoReadPtr: 0x%08x\tcmdFifoAmin:0x%x\n", - IGET(sst->cmdFifoReadPtr), IGET(sst->cmdFifoAmin))); - INIT_PRINTF(("cmdFifoAmax: 0x%08x\tcmdFifoDepth:0x%x\n", - IGET(sst->cmdFifoAmax), IGET(sst->cmdFifoDepth))); - INIT_PRINTF(("cmdFifoHoles: 0x%08x\n", IGET(sst->cmdFifoHoles))); -} - -/* -** -** sst1InitMeasureSiProcess(): -** Use silicon process register to measure silicon performance -** -*/ -FX_EXPORT FxU32 FX_CSTYLE sst1InitMeasureSiProcess(FxU32 *sstbase, FxU32 which) -{ - FxU32 n, siProcess, nandOsc, norOsc; - FxU32 pciCntrLoad = 0xfff; - FxU32 cntr; - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - if(GETENV(("SSTV2_SIPROCESS_CNTR"))) { - SSCANF(GETENV(("SSTV2_SIPROCESS_CNTR")), "%ld", &pciCntrLoad); - INIT_PRINTF(("sst1InitMeasureSiProcess(): Using PCI Counter preload value of 0x%x...\n", pciCntrLoad)); - } - - if(!which) { - //////////////////////////////// - // Test NAND oscillator tree... - //////////////////////////////// - PCICFG_WR(SST1_PCI_SIPROCESS, - (pciCntrLoad<fbiNandTree = nandOsc; - - INIT_PRINTF(("sst1InitInfo(): NAND-tree: %d\n", nandOsc)); - } else { - //////////////////////////////// - // Test NOR oscillator tree... - //////////////////////////////// - PCICFG_WR(SST1_PCI_SIPROCESS, - (pciCntrLoad<fbiNorTree = norOsc; - - INIT_PRINTF(("sst1InitInfo(): NOR-tree : %d\n", norOsc)); - } - return(siProcess); -} - -/* -** -** sst1InitCalcTClkDelay() -** Calculate optimal TF/TT Clock delay values -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitCalcTClkDelay(FxU32 *sstbase, - FxU32 tmuNumber, FxU32 tClkDelay) -{ - SstRegs *sst = (SstRegs *) sstbase; - volatile FxU32 *texAddr; - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - ISET(sst->tLOD, 0x0); - ISET(sst->tDetail, 0x0); - ISET(sst->texBaseAddr, 0x0); - ISET(sst->fogMode, 0x0); - ISET(sst->alphaMode, 0x0); - ISET(sst->fbzMode, SST_ENCHROMAKEY); - ISET(sst->fbzColorPath, SST_RGBSEL_TREXOUT | SST_CC_PASS | SST_ENTEXTUREMAP); - //texAddr = (numTmu<<(21-2)) + (FxU32 *) SST_TEX_ADDRESS(sst); - texAddr = (0<<(21-2)) + (FxU32 *) SST_TEX_ADDRESS(sst); - ISET(texAddr[0], 0x0); - texAddr = (1<<(21-2)) + (FxU32 *) SST_TEX_ADDRESS(sst); - ISET(texAddr[0], 0x0); - texAddr = (2<<(21-2)) + (FxU32 *) SST_TEX_ADDRESS(sst); - ISET(texAddr[0], 0x0); - - ISET(SST_TREX(sst,tmuNumber)->trexInit1, - (sst1CurrentBoard->tmuInit1[tmuNumber] & ~SST_TEX_TF_CLK_DEL_ADJ) | - (tClkDelay<nopCMD, 0x3); - sst1InitCheckTmuMemConst(sstbase, tmuNumber, 0xff0000); - sst1InitCheckTmuMemConst(sstbase, tmuNumber, 0x00ffff); - sst1InitCheckTmuMemConst(sstbase, tmuNumber, 0xf0f0f0); - sst1InitCheckTmuMemConst(sstbase, tmuNumber, 0x0f0f0f); - sst1InitCheckTmuMemConst(sstbase, tmuNumber, 0x55aa55); - sst1InitCheckTmuMemConst(sstbase, tmuNumber, 0xaa55aa); - sst1InitCheckTmuMemConst(sstbase, tmuNumber, 0x5a5a5a); - sst1InitCheckTmuMemConst(sstbase, tmuNumber, 0xa5a5a5); - - if(!sst1InitIdleFBIWithTimeout(sstbase, FXTRUE, 10000)) - return(FXFALSE); - - if(IGET(sst->stats.fbiChromaFail)) - return(FXFALSE); - else - return(FXTRUE); -} - -#define COLOR32TOCOLOR24_6666(X) \ - ((((X >> 2) & 0x3F) << 0) | \ - (((X >> 10) & 0x3F) << 6) | \ - (((X >> 18) & 0x3F) << 12) | \ - (((X >> 26) & 0x3F) << 18)) -#define COLOR24_6666TOCOLOR32(X) \ - (((((X >> 0) & 0x3F) << 2) | (((X >> 4) & 0x3) << 0)) | \ - ((((X >> 6) & 0x3F) << 10) | (((X >> 10) & 0x3) << 8)) | \ - ((((X >> 12) & 0x3F) << 18) | (((X >> 16) & 0x3) << 16)) | \ - ((((X >> 18) & 0x3F) << 26) | (((X >> 22) & 0x3) << 24))) - -void sst1InitCheckTmuMemConst(FxU32 *sstbase, FxU32 tmuNumber, - FxU32 dataExpect32) -{ - SstRegs *sst = (SstRegs *) sstbase; - FxU32 dataExpect6666 = COLOR32TOCOLOR24_6666(dataExpect32); - FxU32 dataExpect6666To32 = COLOR24_6666TOCOLOR32(dataExpect6666) & 0xffffff; - - ISET(sst->chromaKey, dataExpect6666To32); - ISET(sst->chromaRange, dataExpect6666To32 | SST_ENCHROMARANGE | - SST_CHROMARANGE_BLUE_EX | SST_CHROMARANGE_GREEN_EX | - SST_CHROMARANGE_RED_EX | SST_CHROMARANGE_BLOCK_OR); - - if(!tmuNumber) { - ISET(sst->textureMode, SST_P8_ARGB6666 | SST_TC_REPLACE | SST_TCA_ZERO); - } else if(tmuNumber == 1) { - // Force downstream TMU to passthrough upstream data - ISET(SST_TREX(sst,0)->textureMode, SST_P8_ARGB6666 | SST_TC_PASS | - SST_TCA_PASS); - ISET(SST_TREX(sst,1)->textureMode, SST_P8_ARGB6666 | SST_TC_REPLACE | - SST_TCA_ZERO); - ISET(SST_TREX(sst,2)->textureMode, SST_P8_ARGB6666 | SST_TC_REPLACE | - SST_TCA_ZERO); - } else { - // Force downstream TMUs to passthrough upstream data - ISET(SST_TREX(sst,0)->textureMode, SST_P8_ARGB6666 | SST_TC_PASS | - SST_TCA_PASS); - ISET(SST_TREX(sst,1)->textureMode, SST_P8_ARGB6666 | SST_TC_PASS | - SST_TCA_PASS); - ISET(SST_TREX(sst,2)->textureMode, SST_P8_ARGB6666 | SST_TC_REPLACE | - SST_TCA_ZERO); - } - // Specify color in palette entry 0... - //sst->nccTable0[4]=BIT(31) | ((index>>1)<<24) | (palette[index] & 0xffffff); - ISET(sst->nccTable0[4], BIT(31) | COLOR32TOCOLOR24_6666(dataExpect32)); - sst1InitDrawRectUsingTris(sstbase, 0, 0, 128); - - return; -} - -void sst1InitDrawRectUsingTris(FxU32 *sstbase, FxU32 x, FxU32 y, FxU32 tSize) -{ - SstRegs *sst = (SstRegs *) sstbase; - - ISET(sst->vA.x, (x<vA.y, (y<vB.x, ((x+tSize)<vB.y, (y<vC.x, ((x+tSize)<vC.y, ((y+tSize)<s, 0); - ISET(sst->t, 0); - ISET(sst->w, 0); - ISET(sst->r, (0xff<g, 0); - ISET(sst->b, 0); - ISET(sst->dsdx, 0); - ISET(sst->dtdx, 0); - ISET(sst->dwdx, 0); - ISET(sst->dsdy, 0); - ISET(sst->dtdy, 0); - ISET(sst->dwdy, 0); - ISET(sst->triangleCMD, 0); - ISET(sst->vB.x, (x<vB.y, ((y+tSize)<triangleCMD, 0xFFFFFFFF); -} - -#ifdef _WIN32 -#pragma optimize ("",on) -#endif diff --git a/glide2x/cvg/init/video.c b/glide2x/cvg/init/video.c deleted file mode 100644 index fe7b1f5..0000000 --- a/glide2x/cvg/init/video.c +++ /dev/null @@ -1,1467 +0,0 @@ -/*-*-c++-*-*/ -/* -** 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$ -** -** Initialization code for initializing SST-1 video unit -** -*/ -#ifdef _WIN32 -#pragma optimize ("",off) -#endif -#include -#include -#include -#ifdef BUILD_FOR_SST1 -#include -#else -#include <3dfx.h> -#include -#include -#endif -#define FX_DLL_DEFINITION -#include -#define SST1INIT_VIDEO_ALLOCATE // allocate data structures for video timing -#include -#include - -#ifdef H3D -#include -#endif - -#include "canopus.h" - -/* -** sst1InitVideo(): -** Initialize video (including DAC setup) for the specified resolution -** -** Note: sst1InitVideo() is included for compatibility with SST-1 apps only -** and should not be used for Voodoo2. Use sst1InitVideoBuffers() instead. -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitVideo(FxU32 *sstbase, - GrScreenResolution_t screenResolution, GrScreenRefresh_t screenRefresh, - void *placeHolder) -{ - FxU32 memSizeInPages; - sst1VideoTimingStruct *videoTiming; - FxU32 colorBuffs, auxBuffs; - - if(!sstbase) - return(FXFALSE); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - if(GETENV(("SSTV2_IGNORE_INIT_VIDEO"))) { - INIT_PRINTF(("WARNING: Ignoring sst1InitVideo()...\n")); - sst1InitIdleFBINoNOP(sstbase); - return(FXTRUE); - } - - if(!(videoTiming = sst1InitFindVideoTimingStruct(screenResolution, - screenRefresh))) - return(FXFALSE); - - if(sst1CurrentBoard->fbiMemSize == 1) - memSizeInPages = 256; - else if(sst1CurrentBoard->fbiMemSize == 2) - memSizeInPages = 512; - else - memSizeInPages = 1024; - if(sst1CurrentBoard->sliDetected) - memSizeInPages <<= 1; - - // Do we have enough memory for the desired resolution? - if(memSizeInPages > (3 * videoTiming->memOffset)) { - colorBuffs = 2; - auxBuffs = 1; - } else if(memSizeInPages > (2 * videoTiming->memOffset)) { - colorBuffs = 2; - auxBuffs = 0; - } else { - INIT_PRINTF(("sst1InitVideo(): Insufficient memory available for desired resolution...\n")); - return(FXFALSE); - } - - return(sst1InitVideoBuffers(sstbase, screenResolution, screenRefresh, - colorBuffs, auxBuffs, (sst1VideoTimingStruct *) NULL, FXTRUE)); -} - -/* -** sst1InitVideoBuffers(): -** Initialize video (including DAC setup) for the specified resolution -** -** Returns: -** FXTRUE if successfully initializes specified SST-1 video resolution -** FXFALSE if cannot initialize SST-1 to specified video resolution -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitVideoBuffers(FxU32 *sstbase, - GrScreenResolution_t screenResolution, GrScreenRefresh_t screenRefresh, - FxU32 nColorBuffs, FxU32 nAuxBuffs, sst1VideoTimingStruct *altVideoTiming, - FxBool switchPassThru) -{ - FxU32 n, vtmp; - SstRegs *sst = (SstRegs *) sstbase; - sst1VideoTimingStruct *sstVideoRez; - FxU32 video16BPP; - FxU32 memFifoLwm, memFifoHwm, pciFifoLwm; - FxU32 vInClkDel, vOutClkDel; - FxU32 tf0_clkdel, tf1_clkdel, tf2_clkdel; - FxU32 ft_clkdel, memSizeInPages; - FxU32 nCol, nAux, miscCtrl; - int memFifoEntries; - - if(!sst) - return(FXFALSE); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - if(GETENV(("SSTV2_IGNORE_INIT_VIDEO"))) { - INIT_PRINTF(("WARNING: Ignoring sst1InitVideo()...\n")); - sst1InitIdleFBINoNOP(sstbase); - return(FXTRUE); - } - - if(altVideoTiming && !GETENV(("SSTV2_SCREENREZ")) && - !GETENV(("SSTV2_SCREENREFRESH"))) - sstVideoRez = altVideoTiming; - else { - if(!(sstVideoRez = sst1InitFindVideoTimingStruct(screenResolution, - screenRefresh))) - return(FXFALSE); - } - - nCol = nColorBuffs; - nAux = nAuxBuffs; - - // Disallow unsupported buffer combinations... - if(nCol < 2 || nCol > 3 || nAux > 1) - return(FXFALSE); - - if(sst1CurrentBoard->fbiMemSize == 1) - memSizeInPages = 256; - else if(sst1CurrentBoard->fbiMemSize == 2) - memSizeInPages = 512; - else - memSizeInPages = 1024; - if(sst1CurrentBoard->sliDetected) - memSizeInPages <<= 1; - - // To be compatible with Voodoo1, if there is enough memory to - // allocate an aux buffer, then do it... - if(nCol == 2 && nAux == 0) { - if(memSizeInPages > (3 * sstVideoRez->memOffset)) { - INIT_PRINTF(("sst1InitVideo(): Allocating 1 Aux Buffer for SST-1 Compatibility...\n")); - nAux++; - } - } - - if(GETENV(("SSTV2_ALLOC_COLOR"))) - nCol = ATOI(GETENV(("SSTV2_ALLOC_COLOR"))); - if(GETENV(("SSTV2_ALLOC_AUX"))) - nAux = ATOI(GETENV(("SSTV2_ALLOC_AUX"))); - - // Disallow unsupported buffer combinations (from environment vars)... - if(nCol < 2 || nCol > 3 || nAux > 1) - return(FXFALSE); - - // - // Do we have enough memory for the desired resolution? - // - if(memSizeInPages < ((nCol + nAux) * sstVideoRez->memOffset)) { - INIT_PRINTF(("sst1InitVideo(): Insufficient memory available for desired resolution.\n")); - return(FXFALSE); - } - if(GETENV(("SSTV2_VIDEO_24BPP"))) - sst1CurrentBoard->fbiVideo16BPP = - (ATOI(GETENV(("SSTV2_VIDEO_24BPP")))) ^ 0x1; - else { - sst1CurrentBoard->fbiVideo16BPP = 0; - - if(sst1CurrentBoard->fbiVideo16BPP && (sstVideoRez->video16BPPIsOK == - FXFALSE)) - sst1CurrentBoard->fbiVideo16BPP = 0; - if(!sst1CurrentBoard->fbiVideo16BPP && (sstVideoRez->video24BPPIsOK == - FXFALSE)) - sst1CurrentBoard->fbiVideo16BPP = 1; - - if(altVideoTiming == (sst1VideoTimingStruct *) NULL) { - // Determine when cannot output 24bpp video... - // Cannot run at high frequencies across SLI connector... - if(sst1CurrentBoard->sliDetected && - sstVideoRez->clkFreq24bpp > 90.0F) - sst1CurrentBoard->fbiVideo16BPP = 1; - } - } - video16BPP = sst1CurrentBoard->fbiVideo16BPP; - - // Reset Video Refresh Unit - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_RESET); - - // Setup SST video timing registers - if(GETENV(("SSTV2_HSYNC"))) { - SSCANF(GETENV(("SSTV2_HSYNC")), "%ld", &vtmp); - INIT_PRINTF(("sst1InitVideo(): Using SST_HSYNC=0x%x\n", vtmp)); - ISET(sst->hSync, vtmp); - } else - ISET(sst->hSync, ((sstVideoRez->hSyncOff << SST_VIDEO_HSYNC_OFF_SHIFT) | - (sstVideoRez->hSyncOn << SST_VIDEO_HSYNC_ON_SHIFT))); - if(GETENV(("SSTV2_VSYNC"))) { - SSCANF(GETENV(("SSTV2_VSYNC")), "%ld", &vtmp); - INIT_PRINTF(("sst1InitVideo(): Using SST_VSYNC=0x%x\n", vtmp)); - ISET(sst->vSync, vtmp); - } else - ISET(sst->vSync, ((sstVideoRez->vSyncOff << SST_VIDEO_VSYNC_OFF_SHIFT) | - (sstVideoRez->vSyncOn << SST_VIDEO_VSYNC_ON_SHIFT))); - if(GETENV(("SSTV2_BACKPORCH"))) { - SSCANF(GETENV(("SSTV2_BACKPORCH")), "%ld", &vtmp); - INIT_PRINTF(("sst1InitVideo(): Using SST_BACKPORCH=0x%x\n", vtmp)); - ISET(sst->backPorch, vtmp); - } else - ISET(sst->backPorch, - ((sstVideoRez->vBackPorch << SST_VIDEO_VBACKPORCH_SHIFT) | - (sstVideoRez->hBackPorch << SST_VIDEO_HBACKPORCH_SHIFT))); - if(GETENV(("SSTV2_DIMENSIONS"))) { - SSCANF(GETENV(("SSTV2_DIMENSIONS")), "%ld", &vtmp); - INIT_PRINTF(("sst1InitVideo(): Using SST_DIMENSIONS=0x%x\n", vtmp)); - sstVideoRez->yDimension = (vtmp >> SST_VIDEO_YDIM_SHIFT) & 0x3ff; - sstVideoRez->xDimension = vtmp & 0x3ff; - } - ISET(sst->videoDimensions, - ((sstVideoRez->yDimension << SST_VIDEO_YDIM_SHIFT) | - ((sstVideoRez->xDimension-1) << SST_VIDEO_XDIM_SHIFT))); - if(GETENV(("SSTV2_MEMOFFSET"))) { - SSCANF(GETENV(("SSTV2_MEMOFFSET")), "%ld", &vtmp); - INIT_PRINTF(("sst1InitVideo(): Using video memOffset=0x%x\n", vtmp)); - sstVideoRez->memOffset = vtmp; - } - if(GETENV(("SSTV2_TILESINX"))) { - SSCANF(GETENV(("SSTV2_TILESINX")), "%ld", &vtmp); - INIT_PRINTF(("sst1InitVideo(): Using video tilesInX=0x%x\n", vtmp)); - sstVideoRez->tilesInX = vtmp; - } - - // Update info structure - sst1CurrentBoard->fbiVideoWidth = sstVideoRez->xDimension; - sst1CurrentBoard->fbiVideoHeight = sstVideoRez->yDimension; - sst1CurrentBoard->fbiVideoRefresh = sstVideoRez->refreshRate; - sst1CurrentBoard->fbiVideoColBuffs = nCol; - sst1CurrentBoard->fbiVideoAuxBuffs = nAux; - sst1CurrentBoard->fbiVideoMemOffset = sstVideoRez->memOffset; - sst1CurrentBoard->fbiVideoTilesInX = sstVideoRez->tilesInX; - sst1CurrentBoard->fbiVideoStruct = sstVideoRez; - - // Setup SST memory mapper for desired resolution - if(sst1CurrentBoard->fbiMemSize == 4) - sst1InitSetResolution(sstbase, sstVideoRez, 1); - else - sst1InitSetResolution(sstbase, sstVideoRez, 0); - - // Calculate graphics clock frequency - if(sst1InitCalcGrxClk(sstbase) == FXFALSE) - return(FXFALSE); - - // Setup video fifo - // NOTE: Lower values for the video fifo threshold improve video fifo - // underflow problems - if(GETENV(("SSTV2_VFIFO_THRESH"))) { - INIT_PRINTF(("sst1InitVideo(): Overriding Default Video Fifo Threshold %d and Storing %d\n", - sstVideoRez->vFifoThreshold, ATOI(GETENV(("SSTV2_VFIFO_THRESH"))))); - ISET(sst->fbiInit3, (IGET(sst->fbiInit3) & ~SST_VIDEO_FIFO_THRESH) | - - ((ATOI(GETENV(("SSTV2_VFIFO_THRESH")))) - << SST_VIDEO_FIFO_THRESH_SHIFT)); - } else { - FxU32 vFifoThresholdVal = sstVideoRez->vFifoThreshold; - - if(sst1CurrentBoard->fbiGrxClkFreq < 45) - // Lower threshold value for slower graphics clocks - vFifoThresholdVal = sstVideoRez->vFifoThreshold - 4; - - ISET(sst->fbiInit3, (IGET(sst->fbiInit3) & ~SST_VIDEO_FIFO_THRESH) | - (vFifoThresholdVal << SST_VIDEO_FIFO_THRESH_SHIFT)); - } - - INIT_PRINTF(("sst1InitVideo() Setting up video for resolution (%d, %d), Refresh:%d Hz...\n", - sstVideoRez->xDimension, sstVideoRez->yDimension, - sstVideoRez->refreshRate)); - INIT_PRINTF(("sst1InitVideo(): Video Fifo Threshold = %d\n", - (IGET(sst->fbiInit3) & SST_VIDEO_FIFO_THRESH) >> - SST_VIDEO_FIFO_THRESH_SHIFT)); - - // Initialize Y-Origin - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit3, (IGET(sst->fbiInit3) & ~SST_YORIGIN_TOP) | - ((sstVideoRez->yDimension - 1) << SST_YORIGIN_TOP_SHIFT)); - - sst1InitIdleFBINoNOP(sstbase); - - memFifoLwm = 23; - if(GETENV(("SSTV2_MEMFIFO_LWM"))) - SSCANF(GETENV(("SSTV2_MEMFIFO_LWM")), "%ld", &memFifoLwm); - memFifoHwm = 54; - if(GETENV(("SSTV2_MEMFIFO_HWM"))) - SSCANF(GETENV(("SSTV2_MEMFIFO_HWM")), "%ld", &memFifoHwm); - pciFifoLwm = 13; - if(GETENV(("SSTV2_PCIFIFO_LWM"))) - SSCANF(GETENV(("SSTV2_PCIFIFO_LWM")), "%ld", &pciFifoLwm); - INIT_PRINTF(("sst1InitVideo(): pciFifoLwm:%d memFifoLwm:%d memFifoHwm:%d\n", - pciFifoLwm, memFifoLwm, memFifoHwm)); - - // Setup Memory FIFO - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit4, IGET(sst->fbiInit4) & - ~(SST_MEM_FIFO_ROW_BASE | SST_MEM_FIFO_ROW_ROLL | SST_MEM_FIFO_LWM)); - sst1InitIdleFBINoNOP(sstbase); - if(sst1CurrentBoard->fbiMemSize == 1) - ISET(sst->fbiInit4, IGET(sst->fbiInit4) | - (0xff << SST_MEM_FIFO_ROW_ROLL_SHIFT)); - else if (sst1CurrentBoard->fbiMemSize == 2) - ISET(sst->fbiInit4, IGET(sst->fbiInit4) | - (0x1ff << SST_MEM_FIFO_ROW_ROLL_SHIFT)); - else - // 4 MBytes frame buffer memory... - ISET(sst->fbiInit4, IGET(sst->fbiInit4) | - (0x3ff << SST_MEM_FIFO_ROW_ROLL_SHIFT)); - sst1InitIdleFBINoNOP(sstbase); - - // Setup buffer management... - if(sst1InitAllocBuffers(sstbase, nCol, nAux) == FXFALSE) - return(FXFALSE); - - INIT_PRINTF(("sst1InitVideo(): Allocating %d Color Buffers and %d Aux Buffer(s)...\n", - sst1CurrentBoard->fbiVideoColBuffs, sst1CurrentBoard->fbiVideoAuxBuffs)); - ISET(sst->fbiInit4, IGET(sst->fbiInit4) | - (((nCol+nAux)*sstVideoRez->memOffset) << SST_MEM_FIFO_ROW_BASE_SHIFT)); - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit4, IGET(sst->fbiInit4) | - (memFifoLwm << SST_MEM_FIFO_LWM_SHIFT)); - sst1InitIdleFBINoNOP(sstbase); - - // Set PCI FIFO LWM - ISET(sst->fbiInit0, (IGET(sst->fbiInit0) & ~SST_PCI_FIFO_LWM) | - (pciFifoLwm << SST_PCI_FIFO_LWM_SHIFT)); - sst1InitIdleFBINoNOP(sstbase); - - // Enable Memory Fifo... - if(GETENV(("SSTV2_MEMFIFO"))) - n = ATOI(GETENV(("SSTV2_MEMFIFO"))); - else - n = 1; - - if(n) { - sst1CurrentBoard->fbiMemoryFifoEn = 1; - memFifoEntries = (65536 - (int) - (((int) (memSizeInPages - 1) - - (int) ((nCol+nAux) * sstVideoRez->memOffset)) * 512)) >> 5; - if(memFifoEntries <= 256) - memFifoEntries = 0x100; // max. memory fifo size... - else if(memFifoEntries >= 2048) { - INIT_PRINTF(("sst1InitVideo(): Invalid memFifoEntries 0x%x\n", - memFifoEntries)); - return(FXFALSE); - } - if(GETENV(("SSTV2_MEMFIFO_ENTRIES"))) - SSCANF(GETENV(("SSTV2_MEMFIFO_ENTRIES")), "%d", &memFifoEntries); - INIT_PRINTF(("sst1InitVideo(): Enabling Memory FIFO (Entries=%d)...\n", - 65536 - (memFifoEntries << 5))); - - sst1CurrentBoard->memFifoStatusLwm = (memFifoEntries << 5) | 0x1f; - ISET(sst->fbiInit0, (IGET(sst->fbiInit0) & ~(SST_MEM_FIFO_EN | - SST_MEM_FIFO_HWM | SST_PCI_FIFO_LWM | SST_MEM_FIFO_BURST_HWM)) | - (memFifoEntries << SST_MEM_FIFO_HWM_SHIFT) | - (pciFifoLwm << SST_PCI_FIFO_LWM_SHIFT) | - (memFifoHwm << SST_MEM_FIFO_BURST_HWM_SHIFT) | - SST_MEM_FIFO_EN); - INIT_PRINTF(("sst1InitVideo(): Setting memory FIFO LWM to 0x%x (%d)\n", - sst1CurrentBoard->memFifoStatusLwm, - sst1CurrentBoard->memFifoStatusLwm)); - } - - vInClkDel = 1; - if(GETENV(("SSTV2_VIN_CLKDEL"))) - SSCANF(GETENV(("SSTV2_VIN_CLKDEL")), "%ld", &vInClkDel); - - vOutClkDel = 0; - if(GETENV(("SSTV2_VOUT_CLKDEL"))) - SSCANF(GETENV(("SSTV2_VOUT_CLKDEL")), "%ld", &vOutClkDel); - - INIT_PRINTF(("sst1InitVideo(): vInClkDel=0x%x vOutClkDel=0x%x\n", - - vInClkDel, vOutClkDel)); - - // Setup miscellaneous control - miscCtrl = 0; - if(sstVideoRez->miscCtrl & BIT(0)) - miscCtrl |= SST_SCAN_DOUBLE_HORIZ; - if(sstVideoRez->miscCtrl & BIT(1)) - miscCtrl |= SST_SCAN_DOUBLE_VERT; - if(sstVideoRez->miscCtrl & BIT(2)) - miscCtrl |= SST_INVERT_HSYNC; - if(sstVideoRez->miscCtrl & BIT(3)) - miscCtrl |= SST_INVERT_VSYNC; - - // Drive dac output signals and select input video clock - if(video16BPP) { - INIT_PRINTF(("sst1InitVideo(): Setting 16BPP video mode...\n")); - ISET(sst->fbiInit1, (IGET(sst->fbiInit1) & ~SST_VIDEO_MASK) | - (SST_VIDEO_DATA_OE_EN | - SST_VIDEO_BLANK_OE_EN | - SST_VIDEO_HVSYNC_OE_EN | - SST_VIDEO_DCLK_OE_EN | - SST_VIDEO_VID_CLK_2X | - (vInClkDel << SST_VIDEO_VCLK_DEL_SHIFT) | - (vOutClkDel << SST_VIDEO_VCLK_2X_OUTPUT_DEL_SHIFT) | - SST_VIDEO_VCLK_SEL)); - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit5, IGET(sst->fbiInit5) | miscCtrl); - } else { - INIT_PRINTF(("sst1InitVideo(): Setting 24BPP video mode...\n")); -#if 0 - // Old clock settings -- probably use for true 24-bit dac output - ISET(sst->fbiInit1, (IGET(sst->fbiInit1) & ~SST_VIDEO_MASK) | - (SST_VIDEO_DATA_OE_EN | - SST_VIDEO_BLANK_OE_EN | - SST_VIDEO_HVSYNC_OE_EN | - SST_VIDEO_DCLK_OE_EN | - SST_VIDEO_VID_CLK_2X | - SST_VIDEO_VCLK_DIV2 | - (vInClkDel << SST_VIDEO_VCLK_DEL_SHIFT) | - (vOutClkDel << SST_VIDEO_VCLK_2X_OUTPUT_DEL_SHIFT) | - SST_VIDEO_24BPP_EN)); -#else - ISET(sst->fbiInit1, (IGET(sst->fbiInit1) & ~SST_VIDEO_MASK) | - (SST_VIDEO_DATA_OE_EN | - SST_VIDEO_BLANK_OE_EN | - SST_VIDEO_HVSYNC_OE_EN | - SST_VIDEO_DCLK_OE_EN | - // SST_VIDEO_VID_CLK_2X | // BIT(17) - // SST_VIDEO_VCLK_DIV2 | // MUX select 0x1 - (0x0 << SST_VIDEO_VCLK_SEL_SHIFT) | // MUX select 0x0 - (vInClkDel << SST_VIDEO_VCLK_DEL_SHIFT) | - (vOutClkDel << SST_VIDEO_VCLK_2X_OUTPUT_DEL_SHIFT) | - SST_VIDEO_24BPP_EN)); - ISET(sst->fbiInit5, IGET(sst->fbiInit5) | - SST_VIDEO_CLK_SLAVE_OE_EN | SST_VID_CLK_2X_OUT_OE_EN | - SST_VID_CLK_DAC_DATA16_SEL | miscCtrl); -#endif - sst1InitIdleFBINoNOP(sstbase); - if(!GETENV(("SSTV2_VIDEO_FILTER_DISABLE"))) { - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_FILTER_EN); - if(GETENV(("SSTV2_VIDEO_FILTER_THRESHOLD"))) { - SSCANF(GETENV(("SSTV2_VIDEO_FILTER_THRESHOLD")), "%ld", &n); - INIT_PRINTF(("sst1InitVideo(): Setting Video Filtering Treshold to 0x%x...\n", n)); - - ISET(sst->videoFilterRgbThreshold, n); - } else - // ISET(sst->videoFilterRgbThreshold, 0x180c18); - ISET(sst->videoFilterRgbThreshold, 0x080408); - } else - INIT_PRINTF(("sst1InitVideo(): Disabling Video Filtering...\n")); - } - - // Setup prelim. clock delay values... - if(sst1CurrentBoard->fbiBoardID == 0x3) { - // Early 4-layer 4220 board -- Runs at 83 MHz by default... - if(sst1CurrentBoard->fbiGrxClkFreq <= 80) { - ft_clkdel = 0x5; - tf0_clkdel = 0x7; - tf1_clkdel = 0x8; - tf2_clkdel = 0x8; - } else { - ft_clkdel = 0x4; - tf0_clkdel = 0x6; - tf1_clkdel = 0x7; - tf2_clkdel = 0x7; - } - } else if(sst1CurrentBoard->fbiBoardID == 0x2) { - // 4400 8-layer bringup board -- Runs at 90 MHz by default... - ft_clkdel = 0x4; - tf0_clkdel = 0x6; - tf1_clkdel = 0x6; - tf2_clkdel = 0x6; - } else { - // Setup basic values... - ft_clkdel = 0x4; - tf0_clkdel = 0x6; - tf1_clkdel = 0x6; - tf2_clkdel = 0x6; - } - - ISET(sst->fbiInit3, (IGET(sst->fbiInit3) & ~SST_FT_CLK_DEL_ADJ) | - (ft_clkdel << SST_FT_CLK_DEL_ADJ_SHIFT)); - sst1InitIdleFBINoNOP(sstbase); - - sst1CurrentBoard->tmuInit1[0] = (sst1CurrentBoard->tmuInit1[0] & - ~SST_TEX_TF_CLK_DEL_ADJ) | (tf0_clkdel<tmuInit1[1] = (sst1CurrentBoard->tmuInit1[1] & - ~SST_TEX_TF_CLK_DEL_ADJ) | (tf1_clkdel<tmuInit1[2] = (sst1CurrentBoard->tmuInit1[2] & - ~SST_TEX_TF_CLK_DEL_ADJ) | (tf2_clkdel<fbiBoardID == CANOPUS_ID) { - // Setup graphics clock to 90 MHz for clockdelay measurement - if (!sst1SetGrxClk_Canopus(sstbase, 90)) - return(FXFALSE); - - // Calculate final clock delay values... - if(!sst1InitSetClkDelays(sstbase)) { - INIT_PRINTF(("sst1InitVideo() ERROR: Could not calculate clock delay values...\n")); - return(FXFALSE); - } - } - - - // Setup graphics clock - if(sst1InitGrxClk(sstbase) == FXFALSE) - return(FXFALSE); - - // Setup video mode - if(sst1InitSetVidMode(sstbase, video16BPP) == FXFALSE) - return(FXFALSE); - - // Adjust Video Clock -#ifndef DIRECTX - if(GETENV(("SSTV2_VIDCLK2X"))) { - float vidClkFreq; - - SSCANF(GETENV(("SSTV2_VIDCLK2X")), "%f", &vidClkFreq); - if(sst1InitSetVidClk(sstbase, vidClkFreq) == FXFALSE) - return(FXFALSE); - } else { -#endif - if(sst1InitUseVoodooFile == FXTRUE) { - if(sst1InitSetVidClkINI(sstbase, sst1CurrentBoard->fbiVideoWidth, - sst1CurrentBoard->fbiVideoHeight, - sst1CurrentBoard->fbiVideoRefresh, video16BPP) == FXFALSE) - return(FXFALSE); - } else { - if(video16BPP) { - if(sst1InitSetVidClk(sstbase, sstVideoRez->clkFreq16bpp) == - FXFALSE) - return(FXFALSE); - } else { - if(sst1InitSetVidClk(sstbase, sstVideoRez->clkFreq24bpp) == - FXFALSE) - return(FXFALSE); - } - } -#ifndef DIRECTX - } -#endif - - // Wait for video clock to stabilize - for(n=0; n<200000; n++) - sst1InitReturnStatus(sstbase); - - // Run Video Reset Module - ISET(sst->fbiInit1, IGET(sst->fbiInit1) & ~SST_VIDEO_RESET); - sst1InitIdleFBINoNOP(sstbase); - - ISET(sst->fbiInit2, IGET(sst->fbiInit2) | SST_EN_DRAM_REFRESH); - - sst1InitIdleFBINoNOP(sstbase); - - // Calculate final clock delay values... - if(sst1InitSetClkDelays(sstbase) == FXFALSE) { - INIT_PRINTF(("sst1InitVideo() ERROR: Could not calculate clock delay values...\n")); - return(FXFALSE); - } - - // Clear memory... - if(!GETENV(("SSTV2_VIDEO_NOCLEAR"))) { - FxU32 clearColor = 0x0; - FxU32 pagesToFill; - - if(GETENV(("SSTV2_VIDEO_CLEARCOLOR"))) - SSCANF(GETENV(("SSTV2_VIDEO_CLEARCOLOR")), "%ld", &clearColor); - - if(sst1CurrentBoard->fbiMemSize == 1) - pagesToFill = 256; - else if(sst1CurrentBoard->fbiMemSize == 2) - pagesToFill = 512; - else - pagesToFill = 1024; - - ISET(sst->bltColor, clearColor); - ISET(sst->bltDstXY, 0x0); - ISET(sst->bltSize, ((pagesToFill-1)<<16) | 511); - ISET(sst->bltCommand, SSTG_FRECTFILL | SSTG_GO); - sst1InitIdle(sstbase); - } else - INIT_PRINTF(("sst1InitVideo(): Not Clearing Frame Buffer...\n")); - - // Clear fbistat registers after clearing screen - ISET(sst->nopCMD, 0x3); - - // Only switch passthrough and do monitor detection if - // requested. - if(switchPassThru == FXTRUE) - { - // 3D now owns monitor... - sst1InitVgaPassCtrl(sstbase, 0); - - // Detect presence of monitor... - sst1InitMonitorDetect(sstbase); - INIT_PRINTF(("sst1InitVideo(): Monitor Detected:%d\n", - sst1CurrentBoard->monitorDetected)); - - // sst1InitMonitorDetect() trashes the gamma table. Reload to the - // original value if sst1InitGamma() has already been called -- otherwise - // load a 1.0 gamma table - if(sst1CurrentBoard->fbiInitGammaDone) - sst1InitGammaRGB(sstbase, sst1CurrentBoard->fbiGammaRed, - sst1CurrentBoard->fbiGammaGreen, sst1CurrentBoard->fbiGammaBlue); - else { - // Do not display gamma values when called by sst1InitVideo()... - sst1CurrentBoard->fbiInitGammaDone = 1; - sst1InitGammaRGB(sstbase, (double) 1.0, (double) 1.0, (double) 1.0); - sst1CurrentBoard->fbiInitGammaDone = 0; - } - } - - if(GETENV(("SSTV2_VIDEO_DISABLE"))) { - INIT_PRINTF(("sst1InitVideo(): Disabling video timing...\n")); - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_RESET); - sst1InitIdleFBINoNOP(sstbase); - } - sst1InitIdle(sstbase); - - if(((IGET(sst->status) & SST_SWAPBUFPENDING) >> - SST_SWAPBUFPENDING_SHIFT) > 0) - sst1InitClearSwapPending(sstbase); - - // Since initVideo() is the last init call, if the user wants to - // disable idling, do it here. This way, all the calls to initIdle - // required within the init code still idle the hardware. - if(GETENV(("SSTV2_IGNORE_IDLE"))) { - INIT_PRINTF(("sst1InitVideo(): Ignoring calls to sst1InitIdle()...\n")); - initIdleEnabled = 0; - } - - // Update info structure for initEnable - PCICFG_RD(SST1_PCI_INIT_ENABLE, sst1CurrentBoard->fbiInitEnable); - - // If this board is SLI-capable, tristate the video output signals so - // that monitor detection will work properly for the second board. The - // video output signals will be re-enabled during SLI initialization for - // the Master board - if(sst1CurrentBoard->sliDetected) { - INIT_PRINTF(("sst1InitVideo(): Disabling video output signals for proper monitor detection...\n")); - sst1InitVideoShutdown(sstbase, FXFALSE); - } - - INIT_PRINTF(("sst1InitVideo() exiting with status %d...\n", FXTRUE)); - return(FXTRUE); -} - -/* -** sst1InitAllocBuffers(): -** Initialize video for buffer management -** -*/ -static FxBool -sst1InitAllocBuffersDirect(FxU32 *sstbase, FxU32 nColorBuffs, FxU32 nAuxBuffs) -{ - SstRegs *sst = (SstRegs *) sstbase; - FxU32 nCol = nColorBuffs; - FxU32 nAux = nAuxBuffs; - - if(!sst) - return(FXFALSE); - - // Setup buffer management... - if(nCol == 2 && nAux == 0) - ISET(sst->fbiInit5, (IGET(sst->fbiInit5) & ~SST_BUFFER_ALLOC) | - SST_BUFFER_ALLOC_2C0Z); - else if(nCol == 2 && nAux == 1) - ISET(sst->fbiInit5, (IGET(sst->fbiInit5) & ~SST_BUFFER_ALLOC) | - SST_BUFFER_ALLOC_2C1Z); - else if(nCol == 3 && nAux == 0) - ISET(sst->fbiInit5, (IGET(sst->fbiInit5) & ~SST_BUFFER_ALLOC) | - SST_BUFFER_ALLOC_3C0Z); - else if(nCol == 3 && nAux == 1) - ISET(sst->fbiInit5, (IGET(sst->fbiInit5) & ~SST_BUFFER_ALLOC) | - SST_BUFFER_ALLOC_3C1Z); - else { - INIT_PRINTF(("sst1InitAllocBuffers(): Unsupported Color/Aux buffer combination (%d/%d)\n", - nCol, nAux)); - return(FXFALSE); - } - sst1InitReturnStatus(sstbase); - - return(FXTRUE); -} - -FX_EXPORT FxBool FX_CSTYLE -sst1InitAllocBuffers(FxU32 *sstbase, FxU32 nColorBuffs, FxU32 nAuxBuffs) -{ - SstRegs *sst = (SstRegs *) sstbase; - FxBool retVal; - - if(!sst) - return(FXFALSE); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - retVal = sst1InitAllocBuffersDirect(sstbase, - nColorBuffs, nAuxBuffs); - - if (retVal && sst1CurrentBoard->sliDetected) { - /* NB: When writing to the slave we need to make sure that it does - * not have a client callback installed. - */ - FxSet32Proc saveProc = sst1CurrentBoard->set32; - sst1CurrentBoard->set32 = NULL; - - sst1InitAllocBuffersDirect(sst1CurrentBoard->sliSlaveVirtAddr, - nColorBuffs, nAuxBuffs); - - sst1CurrentBoard->set32 = saveProc; - } - - return retVal; -} - -/* -** sst1InitVideoShutdown(): -** Shutdown video by not driving video outputs -** Do not reset the video engine -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitVideoShutdown(FxU32 *sstbase, - FxBool switchPassThruToVGA) -{ - SstRegs *sst = (SstRegs *) sstbase; - - if(!sst) - return(FXFALSE); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - ISET(sst->fbiInit1, (IGET(sst->fbiInit1) & ~(SST_VIDEO_DATA_OE_EN | - SST_VIDEO_DCLK_OE_EN | SST_VIDEO_HVSYNC_OE_EN)) | SST_VIDEO_BLANK_EN); - sst1InitReturnStatus(sstbase); - ISET(sst->fbiInit5, IGET(sst->fbiInit5) & ~( - SST_VIDEO_CLK_SLAVE_OE_EN | SST_VID_CLK_2X_OUT_OE_EN)); - sst1InitReturnStatus(sstbase); - - if(switchPassThruToVGA == FXTRUE) - // 2D/VGA now owns monitor... - sst1InitVgaPassCtrl(sstbase, 1); - - return(FXTRUE); -} - -/* -** sst1InitSetVidMode(): -** Set video Mode -** -*/ -FxBool sst1InitSetVidMode(FxU32 *sstbase, FxU32 video16BPP) -{ - int helper = (GETENV(("SSTV2_DEBUGDAC"))) ? 1 : 0; - - if(helper) - INIT_PRINTF(("sst1InitSetVidMode(): Entered...\n")); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - if(sst1InitUseVoodooFile == FXTRUE) { - return(sst1InitSetVidModeINI(sstbase, video16BPP)); - } else { - if((sst1CurrentBoard->fbiVideoDacType == SST_FBI_DACTYPE_ATT) || - (sst1CurrentBoard->fbiVideoDacType == SST_FBI_DACTYPE_TI)) - return(sst1InitSetVidModeATT(sstbase, video16BPP)); - else if(sst1CurrentBoard->fbiVideoDacType == SST_FBI_DACTYPE_ICS) - return(sst1InitSetVidModeICS(sstbase, video16BPP)); - else if(sst1CurrentBoard->fbiVideoDacType == SST_FBI_DACTYPE_PROXY) - return(FXTRUE); /* single board SLI - jeske */ - else - return(FXFALSE); - } -} - -/* -** sst1InitSetResolution(): -** Setup FBI video resolution registers -** This routine is used by sst1InitVideo() -** -** -*/ -FX_EXPORT void FX_CSTYLE sst1InitSetResolution(FxU32 *sstbase, - sst1VideoTimingStruct *sstVideoRez, - FxU32 Banked) -{ - SstRegs *sst = (SstRegs *) sstbase; - - if(Banked) - ISET(sst->fbiInit2, (IGET(sst->fbiInit2) & ~SST_VIDEO_BUFFER_OFFSET) | - (sstVideoRez->memOffset << SST_VIDEO_BUFFER_OFFSET_SHIFT) | - SST_DRAM_BANKING_CONFIG | SST_EN_DRAM_BANKED); - else - ISET(sst->fbiInit2, (IGET(sst->fbiInit2) & ~SST_VIDEO_BUFFER_OFFSET) | - (sstVideoRez->memOffset << SST_VIDEO_BUFFER_OFFSET_SHIFT)); - - ISET(sst->fbiInit1, (IGET(sst->fbiInit1) & ~SST_VIDEO_TILES_MASK) | - (((sstVideoRez->tilesInX>>1) & 0xF)<tilesInX>>5) & 0x1)<fbiInit6 = - (sst1CurrentBoard->fbiInit6 & ~SST_VIDEO_TILES_IN_X_LSB) | - ((sstVideoRez->tilesInX & 0x1)<fbiInit6, sst1CurrentBoard->fbiInit6); -} - -/* -** sst1InitSetVidClk(): -** Set video clock -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitSetVidClk(FxU32 *sstbase, float vidClkFreq) -{ - sst1ClkTimingStruct vidClkTiming; - int helper = (GETENV(("SSTV2_DEBUGDAC"))) ? 1 : 0; - - if(helper) - - INIT_PRINTF(("sst1InitSetVidClk(): Entered...\n")); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - if(sst1InitComputeClkParams(vidClkFreq, &vidClkTiming) == FXFALSE) - return(FXFALSE); - - INIT_PRINTF(("sst1InitSetVidClk(): Setting up %.2f MHz Video Clock...\n", - vidClkFreq)); - - if((sst1CurrentBoard->fbiVideoDacType == SST_FBI_DACTYPE_ATT) || - (sst1CurrentBoard->fbiVideoDacType == SST_FBI_DACTYPE_TI)) - return(sst1InitSetVidClkATT(sstbase, &vidClkTiming)); - else if(sst1CurrentBoard->fbiVideoDacType == SST_FBI_DACTYPE_ICS) - return(sst1InitSetVidClkICS(sstbase, &vidClkTiming)); - else if(sst1CurrentBoard->fbiVideoDacType == SST_FBI_DACTYPE_PROXY) - return(FXTRUE); /* single board sli - jeske */ - else - return(FXFALSE); -} - -/* -** sst1InitSetGrxClk(): -** Set graphics clock -** NOTE: sst1InitSetGrxClk() resets the PCI fifo and the graphics subsystem -** of FBI -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitSetGrxClk(FxU32 *sstbase, - sst1ClkTimingStruct *sstGrxClk) -{ - FxBool retVal = FXFALSE; - int helper = (GETENV(("SSTV2_DEBUGDAC"))) ? 1 : 0; - SstRegs *sst = (SstRegs *) sstbase; - - if(helper) - INIT_PRINTF(("sst1InitSetGrxClk(): Entered...\n")); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - if(sst1InitUseVoodooFile == FXTRUE) { - retVal = sst1InitSetGrxClkINI(sstbase, sstGrxClk); - } else { - if((sst1CurrentBoard->fbiVideoDacType == SST_FBI_DACTYPE_ATT) || - (sst1CurrentBoard->fbiVideoDacType == SST_FBI_DACTYPE_TI)) - retVal = sst1InitSetGrxClkATT(sstbase, sstGrxClk); - else if(sst1CurrentBoard->fbiVideoDacType == SST_FBI_DACTYPE_ICS) - retVal = sst1InitSetGrxClkICS(sstbase, sstGrxClk); - else if(sst1CurrentBoard->fbiVideoDacType == SST_FBI_DACTYPE_PROXY) { - /* single board SLI - jeske*/ - FxU32 i; - - /* Reset graphics unit before we change grx clk */ - ISET(sst->fbiInit0, IGET(sst->fbiInit0) | - (SST_GRX_RESET | SST_PCI_FIFO_RESET)); - sst1InitIdleFBINoNOP(sstbase); - - - for (i=0;i 0) && (&sst1BoardInfo[i] == sst1CurrentBoard)) { - retVal = sst1InitSetGrxClk((FxU32 *)sst1BoardInfo[i-1].virtAddr[0], - sstGrxClk); - break; - } - } - - /* Wait for graphics clock to stabilize */ - { int n; - for(n=0; n<200000; n++) - sst1InitReturnStatus(sstbase); - - /* Unreset PCI FIFO and graphic subsystem */ - ISET(sst->fbiInit0, IGET(sst->fbiInit0) & ~SST_PCI_FIFO_RESET); - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit0, IGET(sst->fbiInit0) & ~SST_GRX_RESET); - sst1InitIdleFBINoNOP(sstbase); - } - - } - } - if(retVal == FXFALSE) - return(FXFALSE); - - // Always reset TMUs after a clock change... - return(sst1InitResetTmus(sstbase)); -} - -/* -** sst1InitVideoBorder(): -** Initialize video color border -** -** The 'mask' parameter specifies which border(s) to enable: -** SST_COLOR_BORDER_LEFT_EN: Left edge -** SST_COLOR_BORDER_RIGHT_EN: Right edge -** SST_COLOR_BORDER_TOP_EN: Top edge -** SST_COLOR_BORDER_BOTTOM_EN: Bottom edge -** The 'color' parameter is in XXRRGGBB format -** -** Returns: -** FXTRUE if successfully initializes video color border -** FXFALSE if cannot initialize video color border -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitVideoBorder(FxU32 *sstbase, - FxU32 mask, - FxU32 color) -{ - - FxU32 fbiInit5; - SstRegs *sst = (SstRegs *) sstbase; - - if(!sst) - return(FXFALSE); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - INIT_PRINTF(("sst1InitVideoBorder(): Setting border color to 0x%x...\n", - color)); - - fbiInit5 = IGET(sst->fbiInit5) & - ~(SST_COLOR_BORDER_LEFT_EN | SST_COLOR_BORDER_RIGHT_EN | - SST_COLOR_BORDER_TOP_EN | SST_COLOR_BORDER_BOTTOM_EN); - fbiInit5 |= - (mask & SST_COLOR_BORDER_LEFT_EN) ? SST_COLOR_BORDER_LEFT_EN : 0; - fbiInit5 |= - (mask & SST_COLOR_BORDER_RIGHT_EN) ? SST_COLOR_BORDER_RIGHT_EN : 0; - fbiInit5 |= - (mask & SST_COLOR_BORDER_TOP_EN) ? SST_COLOR_BORDER_TOP_EN : 0; - fbiInit5 |= - (mask & SST_COLOR_BORDER_BOTTOM_EN) ? SST_COLOR_BORDER_BOTTOM_EN : 0; - - ISET(sst->borderColor, color); - ISET(sst->fbiInit5, fbiInit5); - - return(FXTRUE); -} - -/* -** sst1InitFindVideoTimingStruct(): -** Find SST-1 video timing data structure from GrScreenResolution_t and -** GrScreenRefresh_t input params -** -*/ - -FX_EXPORT sst1VideoTimingStruct* FX_CSTYLE -sst1InitFindVideoTimingStruct(GrScreenResolution_t screenResolution, - GrScreenRefresh_t screenRefresh) -{ - GrScreenResolution_t screenRez = screenResolution; - GrScreenRefresh_t refreshRate = screenRefresh; - - // Override Screen resolution with environment variables - if(GETENV(("SSTV2_SCREENREZ"))) { - FxU32 screenRezEnv = ATOI(GETENV(("SSTV2_SCREENREZ"))); - - switch(screenRezEnv) { - case 512256: - screenRez = GR_RESOLUTION_512x256; - break; - case 512: - screenRez = GR_RESOLUTION_512x384; - break; - case 640400: - screenRez = GR_RESOLUTION_640x400; - break; - case 800: - screenRez = GR_RESOLUTION_800x600; - break; - case 856: - screenRez = GR_RESOLUTION_856x480; - break; - case 960: - screenRez = GR_RESOLUTION_960x720; - break; - case 1024: - screenRez = GR_RESOLUTION_1024x768; - break; - default: - screenRez = GR_RESOLUTION_640x480; - break; - } - } - - // Override Screen resolution with environment variables - if(GETENV(("SSTV2_SCREENREFRESH"))) { - FxU32 refreshRateEnv = ATOI(GETENV(("SSTV2_SCREENREFRESH"))); - - switch(refreshRateEnv) { - case 75: - refreshRate = GR_REFRESH_75Hz; - break; - case 85: - refreshRate = GR_REFRESH_85Hz; - break; - case 120: - refreshRate = GR_REFRESH_120Hz; - break; - default: - refreshRate = GR_REFRESH_60Hz; - break; - } - } - - switch(screenRez) { - - case(GR_RESOLUTION_512x256): - return(&SST_VREZ_512X256_60); - break; - - case(GR_RESOLUTION_512x384): - - if( GETENV( ("SSTV2_REFRESH_512x384") ) ) - refreshRate = sst1InitConvertRefreshRate( ATOI( GETENV( ("SSTV2_REFRESH_512x384") ) ) ); - - if(refreshRate == GR_REFRESH_120Hz) - return(&SST_VREZ_512X384_120); - else if(refreshRate == GR_REFRESH_85Hz) { - if(sst1CurrentBoard->sliDetected) - return(&SST_VREZ_512X384_85_NOSCANDOUBLE); - else - return(&SST_VREZ_512X384_85); - } else if(refreshRate == GR_REFRESH_75Hz) { - if(sst1CurrentBoard->sliDetected) - return(&SST_VREZ_512X384_75_NOSCANDOUBLE); - else - return(&SST_VREZ_512X384_75); - } else { - if(sst1CurrentBoard->sliDetected) - return(&SST_VREZ_512X384_72); - else - return(&SST_VREZ_512X384_60); - } - break; - - case(GR_RESOLUTION_640x400): - - if( GETENV( ("SSTV2_REFRESH_640x400") ) ) - refreshRate = sst1InitConvertRefreshRate( ATOI( GETENV( ("SSTV2_REFRESH_640x400") ) ) ); - - if(refreshRate == GR_REFRESH_120Hz) - return(&SST_VREZ_640X400_120); - else if(refreshRate == GR_REFRESH_85Hz) - return(&SST_VREZ_640X400_85); - else if(refreshRate == GR_REFRESH_75Hz) - return(&SST_VREZ_640X400_75); - else - return(&SST_VREZ_640X400_70); - break; - - case(GR_RESOLUTION_640x480): - - if( GETENV( ("SSTV2_REFRESH_640x480") ) ) - refreshRate = sst1InitConvertRefreshRate( ATOI( GETENV( ("SSTV2_REFRESH_640x480") ) ) ); - - if(refreshRate == GR_REFRESH_120Hz) - return(&SST_VREZ_640X480_120); - else if(refreshRate == GR_REFRESH_85Hz) - return(&SST_VREZ_640X480_85); - else if(refreshRate == GR_REFRESH_75Hz) - return(&SST_VREZ_640X480_75); - else - return(&SST_VREZ_640X480_60); - break; - - case(GR_RESOLUTION_800x600): - - if( GETENV( ("SSTV2_REFRESH_800x600") ) ) - refreshRate = sst1InitConvertRefreshRate( ATOI( GETENV( ("SSTV2_REFRESH_800x600") ) ) ); - - if(refreshRate == GR_REFRESH_120Hz) - return(&SST_VREZ_800X600_120); - else if(refreshRate == GR_REFRESH_85Hz) - return(&SST_VREZ_800X600_85); - else if(refreshRate == GR_REFRESH_75Hz) - return(&SST_VREZ_800X600_75); - else - return(&SST_VREZ_800X600_60); - break; - - case(GR_RESOLUTION_856x480): - return(&SST_VREZ_856X480_60); - break; - - case(GR_RESOLUTION_960x720): - if( GETENV( ("SSTV2_REFRESH_960x720") ) ) - refreshRate = sst1InitConvertRefreshRate( ATOI( GETENV( ("SSTV2_REFRESH_960x720") ) ) ); - - if(refreshRate == GR_REFRESH_85Hz) - return(&SST_VREZ_960X720_85); - else if(refreshRate == GR_REFRESH_75Hz) - return(&SST_VREZ_960X720_75); - else - return(&SST_VREZ_960X720_60); - break; - - case(GR_RESOLUTION_1024x768): - - if( GETENV( ("SSTV2_REFRESH_1024x768") ) ) - refreshRate = sst1InitConvertRefreshRate( ATOI( GETENV( ("SSTV2_REFRESH_1024x768") ) ) ); - - if(refreshRate == GR_REFRESH_85Hz) - return(&SST_VREZ_1024X768_85); - else if(refreshRate == GR_REFRESH_75Hz) - return(&SST_VREZ_1024X768_75); - else - return(&SST_VREZ_1024X768_60); - break; - -#ifdef H3D - /* In the following cases, sli can't handle line doubled LD modes */ - /* therefore, we need to return a non-line doubled mode if we're */ - /* sli-ing */ - - case (GR_RESOLUTION_640x240_AUTOFLIPPED): - case (GR_RESOLUTION_640x480_AUTOFLIPPED): - if (sst1CurrentBoard->sliDetected) - return(&SST_VREZ_640X960_60); - else - return(&SST_VREZ_640X960LD_60); - break; - - case (GR_RESOLUTION_800x300_AUTOFLIPPED): - case (GR_RESOLUTION_800x600_AUTOFLIPPED): - if (sst1CurrentBoard->sliDetected) - return(&SST_VREZ_800X630_60); - else - return(&SST_VREZ_800X1200LD_45); - break; - - case (GR_RESOLUTION_960x360_AUTOFLIPPED): - case (GR_RESOLUTION_960x720_AUTOFLIPPED): - if (sst1CurrentBoard->sliDetected) - return(&SST_VREZ_960X742_60); - else - return((sst1VideoTimingStruct *) NULL); - break; - - case (GR_RESOLUTION_1024x384_AUTOFLIPPED): - case (GR_RESOLUTION_1024x768_AUTOFLIPPED): - if (sst1CurrentBoard->sliDetected) - return(&SST_VREZ_1024X768_60); - else - return((sst1VideoTimingStruct *) NULL); - break; - -#endif - - default: - INIT_PRINTF(("sst1InitFindVideoTimingStruc(): Unsupported Resolution...\n")); - return((sst1VideoTimingStruct *) NULL); - break; - } -} - -FxU32 sst1InitConvertRefreshRate( FxU32 refreshRate ) -{ - switch( refreshRate ) - { - case 75: - return( GR_REFRESH_75Hz ); - case 85: - return( GR_REFRESH_85Hz ); - case 120: - return( GR_REFRESH_120Hz ); - default: - return( GR_REFRESH_60Hz ); - } -} - -/* -** -** sst1InitMonitorDetect() -** Detect whether or not a monitor is connected to the board -** -*/ - -FX_EXPORT FxBool FX_CSTYLE sst1InitMonitorDetect(FxU32 *sstbase) -{ - SstRegs *sst = (SstRegs *) sstbase; - FxU32 gammaArray[32]; - FxU32 j, k; - FxU32 gammaCorrectConstant = 0x5c; - - if(!sst) - return(FXFALSE); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - /* check to see if we are a single board SLI slave, and if - * so, then don't detect a monitor - jeske - */ - //if (sst1CurrentBoard->singleBrdSLISlave) { - // sst1CurrentBoard->monitorDetected = 0; - // return (FXTRUE); - // } - - if(GETENV(("SSTV2_MDETECT_CONST"))) { - SSCANF(GETENV(("SSTV2_MDETECT_CONST")), "%ld", &gammaCorrectConstant); - INIT_PRINTF(("sst1InitMonitorDetect(): Using value 0x%x for constant gamma value...\n", gammaCorrectConstant)); - } - - // Force gamma to always output clearColor value... - for(j=0; j<32; j++) - gammaArray[j] = gammaCorrectConstant; - //gammaArray[j] = 0xff; // 0xff never detects monitor... - //gammaArray[j] = 0x0; // 0x0 always detects monitor... - sst1InitGammaTable(sstbase, 32, gammaArray, gammaArray, gammaArray); - - // Wait for for monitor to sync... - sst1InitIdle(sstbase); - for(k=0; k<(sst1CurrentBoard->fbiVideoRefresh>>2); k++) { - // Wait for inactive vsync... - do { - j = IGET(sst->status); - } while(!(j & SST_VRETRACE)); - - // Wait for active vsync - do { - j = IGET(sst->status); - } while(j & SST_VRETRACE); - } - - while(1) { - FxU32 firstInit6 = IGET(sst->fbiInit6) & SST_GPIO_3; - FxU32 hvRetrace = IGET(sst->hvRetrace); - FxU32 vBeam = hvRetrace & 0x1fff; - FxU32 hBeam = (hvRetrace>>16) & 0x7ff; - FxU32 secondInit6 = IGET(sst->fbiInit6) & SST_GPIO_3; - - if((vBeam > (sst1CurrentBoard->fbiVideoStruct->vBackPorch + 10)) && - (vBeam < (sst1CurrentBoard->fbiVideoStruct->vBackPorch + - sst1CurrentBoard->fbiVideoHeight - 10)) && - (hBeam > (sst1CurrentBoard->fbiVideoStruct->hBackPorch + - sst1CurrentBoard->fbiVideoStruct->hSyncOn + 10)) && - (hBeam < (sst1CurrentBoard->fbiVideoStruct->hBackPorch + - sst1CurrentBoard->fbiVideoStruct->hSyncOn + - sst1CurrentBoard->fbiVideoWidth - 10))) { - if(firstInit6 == secondInit6) { - if(firstInit6) - sst1CurrentBoard->monitorDetected = 1; - else - sst1CurrentBoard->monitorDetected = 0; - break; - } - } - } - - - // Override with environment variable... - if(GETENV(("SSTV2_MDETECT"))) - sst1CurrentBoard->monitorDetected = - (ATOI(GETENV(("SSTV2_MDETECT")))) ? 1 : 0; - - return(FXTRUE); -} - -/* -** -** sst1InitSetClkDelays(): -** Calculate FT, TF0, and TF1 clock delay values... -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitSetClkDelays(FxU32 *sstbase) -{ - FxU32 tf0_clkdel, tf1_clkdel, tf2_clkdel, ft_clkdel; - SstRegs *sst = (SstRegs *) sstbase; - - if(sst1CurrentBoard->fbiBoardID == 0x3) { - // Early 4-layer 4220 board -- Runs at 83 MHz by default... - if(sst1CurrentBoard->fbiGrxClkFreq <= 80) { - ft_clkdel = 0x5; - tf0_clkdel = 0x7; - tf1_clkdel = 0x8; - tf2_clkdel = 0x8; - } else { - ft_clkdel = 0x4; - tf0_clkdel = 0x6; - tf1_clkdel = 0x7; - tf2_clkdel = 0x7; - } - goto setDelays; - } - - if(GETENV(("SSTV2_IGNORE_CLKDELAYS"))) { - INIT_PRINTF(("sst1InitSetClkDelays() WARNING: Bypassing dynamic clock delay detection...\n")); - ft_clkdel = 0x4; - tf0_clkdel = 0x6; - tf1_clkdel = 0x6; - tf2_clkdel = 0x6; - goto setDelays; - } - - // FT Clock Delay... - if(sst1CurrentBoard->fbiNandTree < 5000) - // Account for very slow processes... - ft_clkdel = 0x3; - else - ft_clkdel = 0x4; - - { - const char - *tf2Str = GETENV("SSTV2_INIT_TF2_RESET_DELAY"), - *tf1Str = GETENV("SSTV2_INIT_TF1_RESET_DELAY"), - *tf0Str = GETENV("SSTV2_INIT_TF0_RESET_DELAY"); - const FxU32 - tf2 = ((tf2Str == NULL) ? 11 : atoi(tf2Str)), - tf1 = ((tf1Str == NULL) ? 11 : atoi(tf1Str)), - tf0 = ((tf0Str == NULL) ? 9 : atoi(tf0Str)); - - // TF2 Clock Delay... - if(sst1CurrentBoard->numberTmus > 2) { - if(sst1InitCalcTClkDelay(sstbase, 2, tf2) == FXTRUE) - // Test failed. Fast process TMUs... - tf2_clkdel = 0x7; - else - tf2_clkdel = 0x6; - } else - tf2_clkdel = 0x6; - - // TF1 Clock Delay... - if(sst1CurrentBoard->numberTmus > 1) { - if(sst1InitCalcTClkDelay(sstbase, 1, tf1) == FXTRUE) - // Test failed. Fast process TMUs... - tf1_clkdel = 0x7; - else - tf1_clkdel = 0x6; - } else - tf1_clkdel = 0x6; - - // Reset FBI & TMU, and put TF1 clock delay value back to default... - if(sst1InitResetTmus(sstbase) == FXFALSE) { - INIT_PRINTF(("sst1InitSetClkDelays() ERROR(1): Could not reset TMUs...\n")); - return(FXFALSE); - } - - // TF0 Clock Delay... - if(sst1InitCalcTClkDelay(sstbase, 0, tf0) == FXTRUE) - // Test failed. Fast process TMUs... - tf0_clkdel = 0x7; - else - tf0_clkdel = 0x6; - } - - // Reset FBI & TMU, and put TF0 clock delay value back to default... - if(sst1InitResetTmus(sstbase) == FXFALSE) { - INIT_PRINTF(("sst1InitSetClkDelays() ERROR(2): Could not reset TMUs...\n")); - return(FXFALSE); - } - - // Adjust for lower frequencies... - if(sst1CurrentBoard->fbiGrxClkFreq < 80) { - ft_clkdel++; - tf0_clkdel++; - tf1_clkdel++; - tf2_clkdel++; - } - -setDelays: - - // Override with environment variables - if(GETENV(("SSTV2_FT_CLKDEL"))) - SSCANF(GETENV(("SSTV2_FT_CLKDEL")), "%ld", &ft_clkdel); - if(GETENV(("SSTV2_TF0_CLKDEL"))) - SSCANF(GETENV(("SSTV2_TF0_CLKDEL")), "%ld", &tf0_clkdel); - if(GETENV(("SSTV2_TF1_CLKDEL"))) - SSCANF(GETENV(("SSTV2_TF1_CLKDEL")), "%ld", &tf1_clkdel); - if(GETENV(("SSTV2_TF2_CLKDEL"))) - SSCANF(GETENV(("SSTV2_TF2_CLKDEL")), "%ld", &tf2_clkdel); - - INIT_PRINTF(("sst1InitSetClkDelays(): Setting FBI-to-TREX clock delay to 0x%x...\n", ft_clkdel)); - INIT_PRINTF(("sst1InitSetClkDelays(): Setting TREX#0 TREX-to-FBI clock delay to 0x%x\n", - tf0_clkdel)); - INIT_PRINTF(("sst1InitSetClkDelays(): Setting TREX#1 TREX-to-FBI clock delay to 0x%x\n", - tf1_clkdel)); - INIT_PRINTF(("sst1InitSetClkDelays(): Setting TREX#2 TREX-to-FBI clock delay to 0x%x\n", - tf2_clkdel)); - - ISET(sst->fbiInit3, (IGET(sst->fbiInit3) & ~SST_FT_CLK_DEL_ADJ) | - (ft_clkdel << SST_FT_CLK_DEL_ADJ_SHIFT)); - sst1InitIdleFBINoNOP(sstbase); - - sst1CurrentBoard->tmuInit1[0] = (sst1CurrentBoard->tmuInit1[0] & - ~SST_TEX_TF_CLK_DEL_ADJ) | (tf0_clkdel<tmuInit1[1] = (sst1CurrentBoard->tmuInit1[1] & - ~SST_TEX_TF_CLK_DEL_ADJ) | (tf1_clkdel<tmuInit1[2] = (sst1CurrentBoard->tmuInit1[2] & - ~SST_TEX_TF_CLK_DEL_ADJ) | (tf2_clkdel< -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -/*--------------------------------------------------------------------------- -** guFbReadRegion -*/ -GR_ENTRY(guFbReadRegion, void, ( const int srcX, const int srcY, const int w, const int h, const void *dst, const int strideInBytes ) ) -{ - int x, y; - FxU32 *lfbPtr, lfbReadAddr; - FxU32 *longPtr; - unsigned char *charPtr; - unsigned short *shortPtr; - - GR_BEGIN_NOFIFOCHECK("guFbReadRegion",99); - GDBG_INFO_MORE(gc->myLevel,"(%d,%d,%d,%d, 0x%x,%d)\n",srcX,srcY,w,h,dst,strideInBytes); - GR_CHECK_F(myName, - (srcX < 0) || ((srcX + w) > (float) gc->state.screen_width), - "invalid combination of x & w"); - GR_CHECK_F(myName, - (srcY < 0) || ((srcY + h) > (float) gc->state.screen_height), - "invalid combination of y & h"); - GR_CHECK_F(myName, strideInBytes&1, "strideInBytes not a multiple of 2" ); - - grSstIdle(); - charPtr = (unsigned char *) dst; - lfbReadAddr = (FxU32) gc->lfb_ptr; - for(y=srcY; y<(srcY+h); y++) { - x = srcX; - shortPtr = (unsigned short *) charPtr; - lfbPtr = (FxU32 *) (lfbReadAddr + (y << 11) + ((x&0x3fe) << 1)); - - /* Left Edge */ - if(x & 1) { - x++; - *shortPtr++ = (unsigned short) (GR_GET(*lfbPtr++) >> 16); - } - - /* Middle */ - longPtr = (FxU32 *) shortPtr; - for( ; x < (srcX+w-1); x+=2) - *longPtr++ = GR_GET(*lfbPtr++); - - /* Right Edge */ - if(x < (srcX+w)) { - shortPtr = (unsigned short *) longPtr; - *shortPtr = (unsigned short) GR_GET(*lfbPtr); - } - charPtr = (unsigned char *) ((FxU32) charPtr + (FxU32) strideInBytes); - } /* Y loop */ - - GR_END(); -} /* guFbReadRegion */ - -/*--------------------------------------------------------------------------- -** guFbWriteRegion -** -** WARNING: GMT: SST_LFB_WRITE_SWAP16 changes pixel addressing!!! -** so grLfbWriteColorSwizzle() might break things -*/ -GR_ENTRY(guFbWriteRegion, void, - ( const int dstX, const int dstY, - const int w, const int h, - const void *src, const int strideInBytes)) -{ - FxU32 - lfbMode; /* lfbMode SST-1 register */ - int x,y=h; - - GR_BEGIN_NOFIFOCHECK("guFbWriteRegion",99); - GDBG_INFO_MORE(gc->myLevel,"(%d,%d,%d,%d, 0x%x,%d)\n",dstX,dstY,w,h,src,strideInBytes); - GR_CHECK_F(myName, - (dstX < 0) || ((dstX + w) > (float) gc->state.screen_width), - "invalid combination of x & w"); - GR_CHECK_F(myName, - (dstY < 0) || ((dstY + h) > (float) gc->state.screen_height), - "invalid combination of y & h"); - GR_CHECK_F(myName, strideInBytes&1, "strideInBytes not a multiple of 2" ); - - /* - ** Get the format bits out of the lfbMode shadow register to determine - ** the size of pixels written to the frame buffer - */ - lfbMode = gc->state.fbi_config.lfbMode; - - /* We'll be reading an FxU32 at a time, so determine the pixel - ** increment by dividing the pixelSize by the size of FxU32 - */ - if ((lfbMode & SST_LFB_FORMAT) < GR_LFBWRITEMODE_888) { - FxU16 *lfbPtr; /* pointer for storing to lfb */ - const FxU16 *src16 = src; - - lfbPtr = (FxU16 *) (((FxU32) gc->lfb_ptr) + (dstY << 11) + (dstX << 1)); - while (y-- > 0) { /* for each row */ - /* 16-bit source pixels - * There are 2 cases that we have, - * 1) src & dst are offset by one short (see code below) - * 2) src & dst are aligned together - */ - GR_SET_EXPECTED_SIZE((((dstX & 0x01) + /* Unaligned start dest pixel */ - (w >> 1) + /* Aligned dest pixels */ - (w & 0x01)) << 2), /* Unaligned end src pixel */ - ((dstX & 0x01) + (w >> 1) + (w & 0x01))); - { - /* case 2) left, middle, right */ - x = 0; - if (dstX & 1) { - GR_SET16(lfbPtr[0], src16[0]); - x++; - } - - for (; x < w - 1; x += 2) GR_SET(*(FxU32*)&(lfbPtr[x]), *(const FxU32*)&(src16[x])); - if (x < w) GR_SET16(lfbPtr[w - 1], src16[w - 1]); - } - GR_CHECK_SIZE(); - - /* advance to next src and dst rows */ - src16 += (strideInBytes >> 1); - lfbPtr += 1024; - } - - } else { /* 32-bit source pixels */ - FxU32 *lfbPtr; /* pointer for storing to lfb */ - const FxU32 *src32 = src; - - GR_CHECK_F(myName, strideInBytes&2, "strideInBytes not a multiple of 4" ); - - lfbPtr = (FxU32 *) (((FxU32) gc->lfb_ptr) + (dstY << 12) + (dstX << 2)); - while (y-- > 0) { /* for each row */ - GR_SET_EXPECTED_SIZE(w << 2, w); - { - for (x = 0; x < w; x++) GR_SET(lfbPtr[x], src32[x]); - } - GR_CHECK_SIZE(); - - /* advance to next src and dst rows */ - src32 += strideInBytes >> 2; - lfbPtr += 1024; - } - } - GR_END(); -} /* guFbWriteRegion */ - diff --git a/glide2x/h3/glide/src/ddgump.c b/glide2x/h3/glide/src/ddgump.c deleted file mode 100644 index b06051c..0000000 --- a/glide2x/h3/glide/src/ddgump.c +++ /dev/null @@ -1,597 +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:25 joseph -** Initial checkin into SourceForge. -** -** -** 3 3/17/99 6:16p Dow -** Phantom Menace and other fixes. - * - * 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 -#include -#include "fxglide.h" -#include "gump.h" - -/* gump.c */ -extern GrMPState _gumpState; - -#ifndef GLIDE3_ALPHA -/* -** _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 */ -#ifdef GLIDE3 - grDrawTriangle((void *)a, (void *)b, (void *)c); -#else - grDrawTriangle(a, b, c); -#endif - - /* 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 */ -#ifdef GLIDE3 - grDrawTriangle((void *)a, (void *)b, (void *)c); -#else - grDrawTriangle(a, b, c); -#endif - - /* 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 */ -#ifdef GLIDE3 - grDrawTriangle((void *)a, (void *)b, (void *)c); -#else - grDrawTriangle(a, b, c); -#endif - - /* 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 */ -#ifdef GLIDE3 - grDrawTriangle((void *)a, (void *)b, (void *)c); -#else - grDrawTriangle(a, b, c); -#endif - - /* 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 */ -#ifdef GLIDE3 - grDrawTriangle((void *)a, (void *)b, (void *)c); -#else - grDrawTriangle(a, b, c); -#endif - } - - 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(); -} - -#endif /* GLIDE3_ALPHA */ diff --git a/glide2x/h3/glide/src/diglide.c b/glide2x/h3/glide/src/diglide.c deleted file mode 100644 index 6f0fbbb..0000000 --- a/glide2x/h3/glide/src/diglide.c +++ /dev/null @@ -1,400 +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 3/17/99 6:16p Dow -** Phantom Menace and other fixes. -** -** 38 3/17/99 1:37p Atai -** use grHints to enable/disable uma hack -** -** 37 4/14/98 6:41p Peter -** Merge w/ cvg glide cleanup -** -** 36 3/28/98 11:24a Dow -** itwoç -** -** 35 1/20/98 10:50a 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 -#include <3dfx.h> -#include - -#define FX_DLL_DEFINITION -#include -#include -#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 GLIDE_FP_CLAMP - gdbg_info(80, "\tTSU Value Clamping failures: %7ld\n", _GlideRoot.stats.tsuValClamp); -#if HOOPTI_TRI_SETUP_COMPARE - gdbg_info(80, "\tTSU Exponent Clamping failures: %7ld\n", _GlideRoot.stats.tsuExpClamp); -#endif /* HOOPTI_TRI_SETUP_COMPARE */ -#endif /* GLIDE_FP_CLAMP */ -} - -#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; -#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 & 0x00ff; - blue = (*color >> 16) & 0xff; - *color &= 0xff00ff00; - *color |= ((red << 16) | blue); - break; - - case GR_COLORFORMAT_RGBA: - blue = (*color & 0x0000ff00) >> 8; - green = (*color & 0x00ff0000) >> 16; - red = (*color & 0xff000000) >> 24; - alpha = (*color & 0x000000ff); - *color = (alpha << 24) | (red << 16) | (green << 8) | blue; - break; - - case GR_COLORFORMAT_BGRA: - blue = (*color & 0xff000000) >> 24; - green = (*color & 0x00ff0000) >> 16; - red = (*color & 0x0000ff00) >> 8; - alpha = (*color & 0x000000ff); - *color = (alpha << 24) | (red << 16) | (green << 8) | blue; - 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); -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) - _grValidateState(); -#endif - *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_ENABLE_UMA: - _GlideRoot.environment.enUma = (hints) ? FXTRUE : FXFALSE; - 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 - -#if USE_PACKET_FIFO && (WTF_P_COMDEX || WTF_P_COMDEX_RESET) - /* Work around for apps that call some grXXX state call - * before calling grSstWinOpen which inits the command fifo. - * See gsst.c:grSstWinOpen for more of this. - */ - { - const FxBool fifoSwapP = _grDummyFifo(FXTRUE); - GR_ASSERT(fifoSwapP); - } -#endif /* USE_PACKET_FIFO && (WTF_P_COMDEX || WTF_P_COMDEX_RESET) */ - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) - _grResetTriStats(); -#else - grResetTriStats(); -#endif - GDBG_INFO(281,"grGlideInit --done---------------------------------------\n"); -} /* grGlideInit */ - - -/*--------------------------------------------------------------------------- -** grGlideShamelessPlug - grGlideShamelessPlug -** -** Returns: -** -** Notes: -** -*/ -#ifndef GLIDE3_ALPHA -GR_DIENTRY(grGlideShamelessPlug, void, (const FxBool mode)) -{ - GDBG_INFO(80,"grGlideShamelessPlug(%d)\n",mode); - _GlideRoot.environment.shamelessPlug = mode; -} /* grGlideShamelessPlug */ -#endif - - -/*--------------------------------------------------------------------------- -** grResetTriStats - Set triangle counters to zero. -*/ -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -void FX_CSTYLE -_grResetTriStats(void) -#else -GR_DIENTRY(grResetTriStats, void, (void)) -#endif -{ - 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; -} diff --git a/glide2x/h3/glide/src/digutex.c b/glide2x/h3/glide/src/digutex.c deleted file mode 100644 index d4a06d8..0000000 --- a/glide2x/h3/glide/src/digutex.c +++ /dev/null @@ -1,603 +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 3/17/99 6:16p Dow -** Phantom Menace and other fixes. -** -** 11 2/16/99 4:14p Peter -** made texture table declarations consistent - * - * 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 - * Remove 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 -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -#ifndef GLIDE3_ALPHA -/*--------------------------------------------------------------------------- -** 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 )) -{ - GR_BEGIN_NOFIFOCHECK("guTexGetCurrentMipMap",99); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",tmu); - GR_CHECK_TMU( myName, tmu ); - - GR_RETURN(gc->state.current_mm[tmu]); -} /* 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 )) -{ - GR_BEGIN_NOFIFOCHECK("guTexMemQueryAvail",99); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",tmu); - GR_CHECK_TMU( myName, tmu ); - GR_RETURN(gc->tmu_state[tmu].total_mem - gc->tmu_state[tmu].freemem_base); -} /* 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 */ - -#endif /* !GLIDE3_ALPHA */ - -#if defined(GLIDE3) -/*--------------------------------------------------------------------------- -** guTexMemReset -** -** Clears out texture buffer memory. -*/ -void FX_CSTYLE -_guTexMemReset(void) -{ - int i; - - GR_BEGIN_NOFIFOCHECK("guTexMemReset",99); - GDBG_INFO_MORE(gc->myLevel,"()\n"); - -#ifndef GLIDE3_ALPHA - memset( gc->mm_table.data, 0, sizeof( gc->mm_table.data ) ); - gc->mm_table.free_mmid = 0; -#endif /* !GLIDE3_ALPHA */ - - 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 */ -#endif /* defined(GLIDE3) */ diff --git a/glide2x/h3/glide/src/disst.c b/glide2x/h3/glide/src/disst.c deleted file mode 100644 index 645cb1f..0000000 --- a/glide2x/h3/glide/src/disst.c +++ /dev/null @@ -1,230 +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 3/17/99 6:16p Dow -** Phantom Menace and other fixes. -** -** 26 11/30/98 6:39p Mikec -** Make sure grSstQueryBoards returns the right num_sst. -** -** 25 5/22/98 2:37p Peter -** complete the lie that is glide2x on Banshee -** -** 24 5/08/98 10:58a Dow -** Fixed accvio in debug version -** -** 23 3/28/98 11:24a Dow -** itwoç -** -** 20 2/08/98 3:08p Dow -** FIFO Works - * - * 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 - * Neutered multiplatform multiheaded monster - * - * 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 -#include -#include <3dfx.h> - -#include - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - - -/*--------------------------------------------------------------------------- -** grSstQueryBoards -** -** NOTE: it is OK to call this routine before grGlideInit -*/ -#ifndef GLIDE3_ALPHA -GR_DIENTRY(grSstQueryBoards, FxBool, ( GrHwConfiguration *hwc )) -{ - GDBG_INIT(); - GDBG_INFO(80,"grSstQueryBoards(0x%x)\n",hwc); - hwc->num_sst = (_grSstDetectResources() - ? _GlideRoot.hwConfig.num_sst - : 0); - return FXTRUE; -} /* grSstQueryBoards */ -#endif - -/*--------------------------------------------------------------------------- -** grSstQueryHardware -** -*/ -GR_DIENTRY(grSstQueryHardware, FxBool, ( GrHwConfiguration *hwc )) -{ - FxBool retVal; - - GDBG_INFO(80, "grSstQueryHardware(0x%x)\n", hwc); - - /* init and copy the data back to the user's structure */ - retVal = _GlideRoot.hwConfig.num_sst > 0; - *hwc = _GlideRoot.hwConfig; - - return retVal; - -} /* grSstQueryHardware */ - -/*--------------------------------------------------------------------------- -** grSstSelect -*/ -GR_DIENTRY(grSstSelect, void, ( int which )) -{ - if ( which >= _GlideRoot.hwConfig.num_sst ) - GrErrorCallback( "grSstSelect: non-existent SST", FXTRUE ); - - _GlideRoot.current_sst = which; - _GlideRoot.curGC = &_GlideRoot.GCs[which]; -#ifdef GLIDE_MULTIPLATFORM - _GlideRoot.curGCFuncs = _GlideRoot.curGC->gcFuncs; -#endif - - /* now begin a normal Glide routine's flow */ - { - GR_BEGIN_NOFIFOCHECK("grSstSelect",80); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",which); - - _GlideRoot.packerFixAddress = ( FxU32 ) gc->tex_ptr; - _GlideRoot.packerFixAddress += ( ( ( FxU32 ) 3 ) << 21 ); - _GlideRoot.packerFixAddress += ( ( ( FxU32 ) 1 ) << 17 ); - - /* Now that we have selected a board, we can build the offests and register - lists for the optimized triangle setup code */ - _grRebuildDataList(); - - /* dpc - 22 may 1997 - FixMe! - * We don't need to move around the driver init - * functions since we're using the hal crap. - * Is there anything else that we need to do? - */ -#if GLIDE_INIT_HAL - -#else /* !GLIDE_INIT_HAL */ - /* dpc - 5 sep 1997 - FixMe! - * initDeviceSelect( which ); - */ -#endif /* !GLIDE_INIT_HAL */ - - 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; -} - -/* this is an un-documented external for arcade developers */ -extern FX_ENTRY void FX_CALL -grSstVidMode(FxU32 whichSst, FxVideoTimingInfo* vidTimings); - -/*--------------------------------------------------------------------------- -** 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 */ - diff --git a/glide2x/h3/glide/src/distate.c b/glide2x/h3/glide/src/distate.c deleted file mode 100644 index f296689..0000000 --- a/glide2x/h3/glide/src/distate.c +++ /dev/null @@ -1,946 +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 3/17/99 6:16p Dow -** Phantom Menace and other fixes. - * - * 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 - -#define FX_DLL_DEFINITION -#include -#include -#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 */ diff --git a/glide2x/h3/glide/src/distrip.c b/glide2x/h3/glide/src/distrip.c deleted file mode 100644 index 43b925a..0000000 --- a/glide2x/h3/glide/src/distrip.c +++ /dev/null @@ -1,451 +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 3/17/99 6:16p Dow -** Phantom Menace and other fixes. -** -** 16 12/03/98 11:27p Dow -** Code 'cleanup' heç - * - * 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 effage - * - * 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 effage in Glide3 parameter data - * - * 1 9/23/97 2:04p Dow - * DI code for strips -** -*/ -#ifdef GLIDE3 - -#include <3dfx.h> -#include - -#define FX_DLL_DEFINITION -#include -#include -#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 */ diff --git a/glide2x/h3/glide/src/ditex.c b/glide2x/h3/glide/src/ditex.c deleted file mode 100644 index 8d64848..0000000 --- a/glide2x/h3/glide/src/ditex.c +++ /dev/null @@ -1,698 +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 3/17/99 6:16p Dow -** Phantom Menace and other fixes. -** -** 24 2/16/99 4:14p Peter -** sanitized source/download -** -** 23 2/10/99 2:24p Peter -** corrected alignment textures within an alignment allocation unit -** -** 22 12/03/98 11:27p Dow -** Code 'cleanup' heç -** -** 21 10/20/98 7:12p Peter -** static build hapiiness -** -** 20 7/19/98 4:34p Mikec -** Relaxed 2MB span constraint on downloadmipmap. -** -** 19 5/18/98 2:41p Dow -** 16-byte boundaries -** -** 18 4/14/98 6:41p Peter -** Merge w/ cvg glide cleanup - * - * 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 effage. - * - * 3 2/12/97 12:34p Dow - * Fixed Hanson effage - * - * 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 -#include -#include "fxglide.h" - -const FxU32 _gr_aspect_index_table[] = -{ - 3, - 2, - 1, - 0, - 1, - 2, - 3, -}; - -/* size in texels */ -const FxU32 _grMipMapHostSize[4][9] = -{ - { /* 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[G3_ASPECT_TRANSLATE(GR_ASPECT_1x8)+1][G3_LOD_TRANSLATE(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] + _grMipMapHostSize[3 - 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] + _grMipMapHostSize[3 - 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, - FxBool roundP) -{ -#define FN_NAME "_grTexTextureMemRequired" - FxU32 memrequired; - - GR_CHECK_W(FN_NAME, - small_lod < large_lod, - "small_lod bigger than large_lod"); - GR_CHECK_F(FN_NAME, - (evenOdd > GR_MIPMAPLEVELMASK_BOTH) || (evenOdd == 0), - "invalid evenOdd mask"); - - /* mirror aspect ratios because it does not matter for - * the size computation which dimension is shrunk. - */ - 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); - - /* Sum all the mipmap levels that match the xor mask for the lod */ - while (large_lod <= small_lod) { - if ((large_lod ^ evenOdd) & 1) { - memrequired += _grMipMapSize[aspect][large_lod]; - } - large_lod++; - } - } - - /* Convert from texels to bytes */ - if ( format >= GR_TEXFMT_16BIT ) - memrequired <<= 1; - - if (roundP) { - memrequired += SST_TEXTURE_ALIGN_MASK; - memrequired &= ~SST_TEXTURE_ALIGN_MASK; - } - - return memrequired; -#undef FN_NAME -} /* _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; - - if ( aspect > G3_ASPECT_TRANSLATE(GR_ASPECT_1x1) ) /* mirror aspect ratios */ - aspect = G3_ASPECT_TRANSLATE(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; - - /* Clamp the size down. The hw is still going to use the complete - * size computation, but it always starts from an aligned baseAddr - * so we need to take this into account before doing the subtraction - * otherwise we'll be on the wrong 'side' of the minimum aligned - * allocation unit. - */ - sum_of_lod_sizes &= ~SST_TEXTURE_ALIGN_MASK; - - 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 )) -{ - FxU32 memrequired; - - memrequired = _grTexTextureMemRequired(small_lod, large_lod, - aspect, format, - GR_MIPMAPLEVELMASK_BOTH, - FXTRUE); - 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 - SST_TEXTURE_ALIGN); -#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, - FXTRUE); - - 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; - - 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 + grTexTextureMemRequired( evenOdd, info ) > 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" ); - - 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 ); - } - 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); - 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 | defined(__linux__))) -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)) */ diff --git a/glide2x/h3/glide/src/fifo.c b/glide2x/h3/glide/src/fifo.c deleted file mode 100644 index 40e4988..0000000 --- a/glide2x/h3/glide/src/fifo.c +++ /dev/null @@ -1,861 +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 3/17/99 6:16p Dow -** Phantom Menace and other fixes. -** -** 39 3/14/99 1:42p Peter -** really invokve the ggggsoph -** -** 38 3/13/99 9:48p Dow -** -** 37 12/05/98 1:06p Dow -** Made some eschatology automatic -** -** 36 10/21/98 10:41a Atai -** -** 35 7/24/98 2:03p Dow -** AGP Stuff -** -** 34 7/23/98 3:19p Dow -** Bump & Grind Fix -** -** 33 7/23/98 1:17a Dow -** Bump & Grind -** -** 32 7/06/98 6:49p Jdt -** Protected in-memory command fifo code -** -** 31 6/15/98 5:55p Hanson -** Added ifdef for hpflip interface code -** -** 30 6/15/98 4:27p Hanson -** Fixed bug in my interface -** -** 29 6/15/98 3:52p Hanson -** Added interface for hpflip. Functions are not exported. -** Function added: -** _grGetCommandTransportInfo -** _grSetCommandTransportInfo -** -** No support for these functions is needed. It just makes my life a lot -** easier, to synch up with the latest glide. -** -** 28 5/29/98 4:30p Peter -** Chris's swap pending thing -** -** 27 4/22/98 11:48a Dow -** Fixed level -** -** 26 4/22/98 8:41a Dow -** AGP Workaround -** -** 25 4/05/98 2:32p Dow -** Fixed non-debug compiler error -** -** 24 4/03/98 2:04p Dow -** Dos Glide Mods -** -** 23 3/28/98 11:24a Dow -** itwoç -** -** 21 2/17/98 12:50p Dow -** Added conditional fifo id. -** -** 20 2/08/98 3:08p Dow -** FIFO Works - * - * 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 -#include - -#if defined(__WIN32__) -#include -#endif - -#include <3dfx.h> -#include - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - - -#if GDBG_INFO_ON - -static const char* h3SstRegNames[] = { - "status", - "intrCtrl", - "vAx", - "vAy", - "vBx", - "vBy", - "vCx", - "vCx", - "r", - "g", - "b", - "z", - "a", - "s", - "t", - "w", - "drdx", - "dgdx", - "dbdx", - "dzdx", - "dadx", - "dsdx", - "dtdx", - "dwdx", - "drdy", - "dgdy", - "dbdy", - "dzdy", - "dady", - "dsdy", - "dtdy", - "dwdy", - "triangleCMD", - "reservedA", - "FvAx", - "FvAy", - "FvBx", - "FvBy", - "FvCx", - "FvCy", - "Fr", - "Fg", - "Fb", - "Fz", - "Fa", - "Fs", - "Ft", - "Fw", - "Fdrdx", - "Fdgdx", - "Fdbdx", - "Fdzdx", - "Fdadx", - "Fdsdx", - "Fdtdx", - "Fdwdx", - "Fdrdy", - "Fdgdy", - "Fdbdy", - "Fdzdy", - "Fdady", - "Fdsdy", - "Fdtdy", - "Fdwdy", - "FtriangleCMD", - "fbzColorPath", - "fogMode", - "alphaMode", - "fbzMode", - "lfbMode", - "clipLeftRight", - "clipBottomTop", - "nopCMD", - "fastfillCMD", - "swapbufferCMD", - "fogColor", - "zaColor", - "chromaKey", - "chromaRange", - "userIntrCmd", - "stipple", - "c0", - "c1", - "fbiPixelsIn", - "fbiChromaFail", - "fbiZfuncFail", - "fbiAfuncFail", - "fbiPixelsOut", - "fogTable00", - "fogTable01", - "fogTable02", - "fogTable03", - "fogTable04", - "fogTable05", - "fogTable06", - "fogTable07", - "fogTable08", - "fogTable09", - "fogTable0a", - "fogTable0b", - "fogTable0c", - "fogTable0d", - "fogTable0e", - "fogTable0f", - "fogTable10", - "fogTable11", - "fogTable12", - "fogTable13", - "fogTable14", - "fogTable15", - "fogTable16", - "fogTable17", - "fogTable18", - "fogTable19", - "fogTable1a", - "fogTable1b", - "fogTable1c", - "fogTable1d", - "fogTable1e", - "fogTable1f", - "reservedB0", - "reservedB1", - "reservedB2", - "colBufferAddr", - "colBufferStride", - "auxBufferAddr", - "auxBufferStride", - "reservedC", - "clipLeftRight1", - "clipBottomTop1", - "reservedD0", - "reservedD1", - "reservedD2", - "reservedD3", - "reservedD4", - "reservedD5", - "reservedE0", - "reservedE1", - "reservedE2", - "reservedE3", - "reservedE4", - "reservedE5", - "reservedE6", - "reservedE7", - "reservedF0", - "reservedF1", - "reservedF2", - "swapBufferPend", - "leftOverlayBuf", - "rightOverlayBuf", - "fbiSwapHistory", - "fbiTrianglesOut", - "sSetupMode", - "sVx", - "sVy", - "sARGB", - "sRed", - "sGreen", - "sBlue", - "sAlpha", - "sVz", - "sOowfbi", - "sOow0", - "sSow0", - "sTow0", - "sOow1", - "sSow1", - "sTow1", - "sDrawTriCMD", - "sBeginTriCMD", - "reservedG0", - "reservedG1", - "reservedG2", - "reservedG3", - "reservedG4", - "reservedG5", - "reservedH0", - "reservedH1", - "reservedH2", - "reservedH3", - "reservedH4", - "reservedH5", - "reservedH6", - "reservedH7", - "reservedI0", - "reservedI1", - "reservedI2", - "reservedI3", - "reservedI4", - "reservedI5", - "reservedI6", - "reservedI7", - "textureMode", - "tLOD", - "tDetail", - "texBaseAddr", - "texBaseAddr1", - "texBaseAddr2", - "texBaseAddr38", - "trexInit0", - "trexInit1", - "nccTable0-0", - "nccTable0-1", - "nccTable0-2", - "nccTable0-3", - "nccTable0-4", - "nccTable0-5", - "nccTable0-6", - "nccTable0-7", - "nccTable0-8", - "nccTable0-9", - "nccTable0-a", - "nccTable0-b", - "nccTable1-0", - "nccTable1-1", - "nccTable1-2", - "nccTable1-3", - "nccTable1-4", - "nccTable1-5", - "nccTable1-6", - "nccTable1-7", - "nccTable1-8", - "nccTable1-9", - "nccTable1-a", - "nccTable1-b", - "tChromaKeyMin", - "tChromaKeyMax", -}; - -static const char * h3SstIORegNames[] = { - "status", - "pciInit0", - "sipMonitor", - "lfbMemoryConfig", - "miscInit0", - "miscInit1", - "dramInit0", - "dramInit1", - "agpInit", - "tmuGbeInit", - "vgaInit0", - "vgaInit1", - "dramCommand", - "dramData", - "reservedZ0" - "reservedZ0" - "pllCtrl0", - "pllCtrl1", - "pllCtrl2", - "dacMode", - "dacAddr", - "dacData", - "vidMaxRGBDelta", - "vidProcCfg", - "hwCurPatAddr", - "hwCurLoc", - "hwCurC0", - "hwCurC1", - "vidInFormat", - "vidInStatus", - "vidSerialParallelPort", - "vidInXDecimDeltas", - "vidInDecimInitErrs", - "vidInYDecimDeltas", - "vidPixelBufThold", - "vidChromaMin", - "vidChromaMax", - "vidCurrentLine", - "vidScreenSize", - "vidOverlayStartCoords", - "vidOverlayEndScreenCoord", - "vidOverlayDudx", - "vidOverlayDudxOffsetSrcWidth", - "vidOverlayDvdy", - "vgaRegister[0]", - "vgaRegister[1]", - "vgaRegister[2]", - "vgaRegister[3]", - "vgaRegister[4]", - "vgaRegister[5]", - "vgaRegister[6]", - "vgaRegister[7]", - "vgaRegister[8]", - "vgaRegister[9]", - "vgaRegister[a]", - "vgaRegister[b]", - "vidOverlayDvdyOffset", - "vidDesktopStartAddr", - "vidDesktopOverlayStride", - "vidInAddr0", - "vidInAddr1", - "vidInAddr2", - "vidInStride", - "vidCurrOverlayStartAddr", -} ; - - -#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", h3SstRegNames[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, - h3SstRegNames[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", h3SstRegNames[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, - h3SstRegNames[index & 0xFF]); -} /* _grFifoFWriteDebug */ - -extern void -_grH3FifoDump_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); - } -} - -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) -{ -#define FN_NAME "_grGet32" - GR_BEGIN_NOFIFOCHECK(FN_NAME, 88); - GDBG_INFO_MORE(gc->myLevel, "(0x%X)\n", sstAddr); - GR_RETURN(GR_GET(*sstAddr)); -#undef FN_NAME -} /* _grGet32 */ - -#if FIFO_ASSERT_FULL -const FxU32 kFifoCheckMask = 0xFFFF; -FxU32 gFifoCheckCount = 0; -#endif - -void -_grBumpNGrind() -{ -#define FN_NAME "_grCheckForBump" - GR_BEGIN_NOFIFOCHECK(FN_NAME, 400); - - P6FENCE; - GR_CAGP_SET(bump, gc->cmdTransportInfo.fifoPtr - gc->cmdTransportInfo.lastBump); - gc->cmdTransportInfo.lastBump = gc->cmdTransportInfo.fifoPtr; - gc->cmdTransportInfo.bumpPos = gc->cmdTransportInfo.fifoPtr + (gc->cmdTransportInfo.bumpSize); - if (gc->cmdTransportInfo.bumpPos > gc->cmdTransportInfo.fifoEnd) - gc->cmdTransportInfo.bumpPos = gc->cmdTransportInfo.fifoEnd; - - GR_ASSERT(gc->cmdTransportInfo.bumpPos != 0); - GR_ASSERT(gc->cmdTransportInfo.lastBump != 0); -#undef FN_NAME -} /* _grCheckForBump */ - -void GR_CDECL -_FifoMakeRoom(const FxI32 blockSize, const char* fName, const int fLine) -{ -#define FN_NAME "_FifoMakeRoom" - FxU32 wrapAddr = 0x00UL; - FxU32 checks; - - GR_BEGIN_NOFIFOCHECK(FN_NAME, 400); - - if (!gc->cmdTransportInfo.autoBump) - GR_BUMP_N_GRIND; - - - 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); - -#endif /* GDBG_INFO_ON */ - - ASSERT_FAULT_IMMED((gc->cmdTransportInfo.roomToReadPtr >= 0) && - (gc->cmdTransportInfo.roomToEnd >= 0)); - } - - checks = 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; - - checks++; - -#ifdef GDBG_INFO_ON - if (checks > 1000) { - FxU32 - baseAddrL, - baseSize, - readPtrL, - aMin, - aMax, - depth, - holeCount; - - baseAddrL = GR_CAGP_GET(baseAddrL); - baseSize = GR_CAGP_GET(baseSize); - readPtrL = GR_CAGP_GET(readPtrL); - aMin = GR_CAGP_GET(aMin); - aMax = GR_CAGP_GET(aMax); - depth = GR_CAGP_GET(depth); - holeCount = GR_CAGP_GET(holeCount); - - GDBG_PRINTF("Fifo check timeout:\n"); - GDBG_PRINTF("\tbaseAddrL = 0x%x\n", baseAddrL); - GDBG_PRINTF("\tbaseSize = 0x%x\n", baseSize); - GDBG_PRINTF("\treadPtrL = 0x%x\n", readPtrL); - GDBG_PRINTF("\tdepth = 0x%x\n", depth); - GDBG_PRINTF("\tholeCount = 0x%x\n", holeCount); - GDBG_PRINTF("\taMin = 0x%x\n", aMin); - GDBG_PRINTF("\taMax = 0x%x\n", aMax); - - if ( - (readPtrL < (baseAddrL << 12)) || - (readPtrL > ((baseAddrL + baseSize + 1) << 12)) - ) { - GDBG_PRINTF("FATAL ERROR: Read Pointer out of command buffer extents\n"); - exit(-1); - } - checks = 0; - } -#endif - - GR_ASSERT((curReadPtr >= (FxU32)gc->cmdTransportInfo.fifoStart) && - (curReadPtr < (FxU32)gc->cmdTransportInfo.fifoEnd)); - - roomToReadPtr += curReadDist; - - _GlideRoot.stats.fifoStalls++; - _GlideRoot.stats.fifoStallDepth += GR_CAGP_GET(depth); - - /* 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(); - { - P6FENCE; - if (!gc->cmdTransportInfo.autoBump) { - SET(*gc->cmdTransportInfo.fifoPtr++, gc->cmdTransportInfo.fifoJmpHdr[0]); - SET(*gc->cmdTransportInfo.fifoPtr++, gc->cmdTransportInfo.fifoJmpHdr[1]); - GR_CAGP_SET(bump, 2); - - gc->cmdTransportInfo.lastBump = gc->cmdTransportInfo.fifoStart; - } else - SET(*gc->cmdTransportInfo.fifoPtr, gc->cmdTransportInfo.fifoJmpHdr[0]); - } - - P6FENCE; - - 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_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_DEBUG_FIFO - { - FxU32* fifoPtr = gc->cmdTransportInfo.fifoShadowPtr; - - while(fifoPtr < gc->cmdTransportInfo.fifoShadowBase + (kDebugFifoSize >> 2)) - *fifoPtr++ = 0x00UL; - gc->cmdTransportInfo.fifoShadowPtr = gc->cmdTransportInfo.fifoShadowBase; - } -#endif - - 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 - 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_CAGP_GET(depth), GR_CAGP_GET(holeCount), GR_GET(hw->status)); -#endif /* GDBG_INFO_ON */ - - /* NB: Work around for the buffer swap pending bug in the status - * register. All of the logic for keeping track of that is in - * grBufferNumPending() - */ - grBufferNumPending(); - - FIFO_ASSERT(); - GR_TRACE_EXIT(FN_NAME); -#undef FN_NAME -} - -void -_grH3FifoDump_Linear(const FxU32* const linearPacketAddr) -{ -#ifdef GDBG_INFO_ON - FXUNUSED(h3SstIORegNames); -#endif -} - - -FxU32 -_grHwFifoPtr(FxBool ignored) -{ - FxU32 rVal; -#if 1 - FxU32 status, readPtrL1, readPtrL2; - GR_DCL_GC; - - FXUNUSED(ignored); - - do { - readPtrL1 = GET(gc->cRegs->cmdFifo0.readPtrL); - status = GET(gc->ioRegs->status); - readPtrL2 = GET(gc->cRegs->cmdFifo0.readPtrL); - } while (readPtrL1 != readPtrL2); - rVal = ((FxU32)gc->cmdTransportInfo.fifoStart) + readPtrL2 - - (FxU32) gc->cmdTransportInfo.fifoOffset; -#else - GR_DCL_GC; - rVal = - (FxU32) gc->cmdTransportInfo.fifoStart + - GET(gc->cRegs->cmdFifo0.readPtrL) - - gc->cmdTransportInfo.fifoOffset; -#endif - return rVal; - -} /* _grHwFifoPtr */ - -#endif /* USE_PACKET_FIFO */ diff --git a/glide2x/h3/glide/src/fxbldno.c b/glide2x/h3/glide/src/fxbldno.c deleted file mode 100644 index 9a94817..0000000 --- a/glide2x/h3/glide/src/fxbldno.c +++ /dev/null @@ -1,55 +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 3/17/99 6:16p Dow -** Phantom Menace and other fixes. - * - * 1 7/25/97 9:05a Pgj - * generate fxbldno.h which defines BUILD_NUMBER - * - */ - -#include -#include -#include - -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() */ diff --git a/glide2x/h3/glide/src/fxgasm.c b/glide2x/h3/glide/src/fxgasm.c deleted file mode 100644 index 42d59a1..0000000 --- a/glide2x/h3/glide/src/fxgasm.c +++ /dev/null @@ -1,271 +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 -#include -#include - -#include <3dfx.h> -#include - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -/*---------------------------------------------------------------------- - * macros for creating assembler offset files - *----------------------------------------------------------------------*/ - -#ifndef __linux__ -#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\t= %08xh\n",pname,((int)&p.o)-(int)&p); \ - else printf("%s\t= %10d\n",pname,((int)&p.o)-(int)&p) - -#define OFFSET2(p,o,pname) if (hex) \ - printf("%s\t= %08xh\n",pname,((int)&o)-(int)&p); \ - else printf("%s\t= %10d\n",pname,((int)&o)-(int)&p) - -#define SIZEOF(p,pname) if (hex) \ - printf("SIZEOF_%s\t= %08xh\n",pname,sizeof(p)); \ - else printf("SIZEOF_%s\t= %10d\n",pname,sizeof(p)) -#else -#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("#define %s\t 0x%08x\n",pname,((int)&p.o)-(int)&p); \ - else printf("#define %s\t %10d\n",pname,((int)&p.o)-(int)&p) -#define OFFSET2(p,o,pname) if (hex) \ - printf("#define %s\t 0x%08x\n",pname,((int)&o)-(int)&p); \ - else printf("#define %s\t %10d\n",pname,((int)&o)-(int)&p) - -#define SIZEOF(p,pname) if (hex) \ - printf("#define SIZEOF_%s\t 0x%08x\n",pname,sizeof(p)); \ - else printf("#define SIZEOF_%s\t %10d\n",pname,sizeof(p)) -#endif - -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%XUL\n", - offsetof(struct _GlideRoot_s, curGC)); - - printf("#define kTriProcOffset 0x%XUL\n", - offsetof(struct GrGC_s, archDispatchProcs.triSetupProc)); -#endif /* GLIDE_DISPATCH_SETUP */ - - printf("/* The # of 2-byte entries in the hw fog table */\n"); - printf("#define kInternalFogTableEntryCount 0x%XUL\n", - sizeof(dummyRegs.fogTable) >> 1); - - printf("\n"); - printf("#endif /* __FX_INLINE_H__ */\n"); - - return 0; - } - - hex = 1; - } - -#if !GLIDE_HW_TRI_SETUP - printf("SST_CHIP_MASK = 0%xh\n",SST_CHIP_MASK); -#endif - - 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.lfbLockCount, "lfbLockCount"); - - HEADER("GC Stuff for Chris"); - OFFSET(gc, totBuffers, "gc_totBuffers"); - OFFSET(gc, strideInTiles, " gc_strideInTiles"); - OFFSET(gc, heightInTiles, "gc_heightInTiles"); - OFFSET(gc, bufferStride, "gc_tileStride"); - OFFSET(gc, bufSizeInTiles, "gc_bufSizeInTiles"); - OFFSET(gc, bufSize, "gc_bufSize"); - OFFSET(gc, fbOffset, "gc_fbOffset"); - OFFSET(gc, tramOffset, "gc_tramOffset"); - OFFSET(gc, base_ptr, "gc_base_ptr"); - OFFSET(gc, reg_ptr, "gc_reg_ptr"); - OFFSET(gc, tex_ptr, "gc_tex_ptr"); - OFFSET(gc, lfb_ptr, "gc_lfb_ptr"); - -#ifdef GLIDE_INIT_HWC - OFFSET(gc, bInfo, "gc_bInfo"); -#endif - -#if GLIDE_MULTIPLATFORM - OFFSET(gc, gcFuncs, "gc_gcFuncs"); -#endif - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) - OFFSET(gc, oemInit, "gc_oemInit"); -#endif - - OFFSET(gc, cmdTransportInfo.fifoStart, "gc_cmdTransportInfo_fifoStart"); - OFFSET(gc, cmdTransportInfo.fifoEnd, "gc_cmdTransportInfo_fifoEnd"); - OFFSET(gc, cmdTransportInfo.fifoOffset, "gc_cmdTransportInfo_fifoOffset"); - OFFSET(gc, cmdTransportInfo.fifoSize, "gc_cmdTransportInfo_fifoSize"); - OFFSET(gc, cmdTransportInfo.fifoJmpHdr, "gc_cmdTransportInfo_fifoJmpHdr"); - - OFFSET(gc, cmdTransportInfo.fifoPtr, "gc_cmdTransportInfo_fifoPtr"); - OFFSET(gc, cmdTransportInfo.fifoRead, "gc_cmdTransportInfo_fifoRead"); - -#if GLIDE_USE_DEBUG_FIFO - OFFSET(gc, cmdTransportInfo.fifoShadowBase, "gc_cmdTransportInfo_fifoShadowBase"); - OFFSET(gc, cmdTransportInfo.fifoShadowPtr, "gc_cmdTransportInfo_fifoShadowPtr"); -#endif /* GLIDE_USE_DEBUG_FIFO */ - - /* Fifo checking information. In units of usuable bytes until - * the appropriate condition. - */ - OFFSET(gc, cmdTransportInfo.fifoRoom, "gc_cmdTransportInfo_fifoRoom"); - OFFSET(gc, cmdTransportInfo.roomToReadPtr, "gc_cmdTransportInfo_roomToReadPtr"); - OFFSET(gc, cmdTransportInfo.roomToEnd, "gc_cmdTransportInfo_roomToEnd"); - - OFFSET(gc, cmdTransportInfo.lfbLockCount, "gc_cmdTransportInfo_lfbLockCount"); - - OFFSET(gc, ioRegs, "gc_ioRegs"); - OFFSET(gc, cRegs, "gc_cRegs"); - OFFSET(gc, gRegs, "gc_gRegs"); - OFFSET(gc, sstRegs, "gc_sstRegs"); - - OFFSET(gc, rawLfb, "gc_rawLfb"); - OFFSET(gc, nBuffers, "gc_nBuffers"); - OFFSET(gc, curBuffer, "gc_curBuffer"); - OFFSET(gc, frontBuffer, "gc_frontBuffer"); - OFFSET(gc, backBuffer, "gc_backBuffer"); - OFFSET(gc, buffers, "gc_buffers"); - - OFFSET(gc, counter, "gc_counter"); - - OFFSET(gc, expected_counter, "gc_expected_counter"); - - OFFSET(gc, checkCounter, "gc_checkCounter"); - OFFSET(gc, checkPtr, "gc_checkPtr"); - - - - 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; -} diff --git a/glide2x/h3/glide/src/fxglide.h b/glide2x/h3/glide/src/fxglide.h deleted file mode 100644 index bf512fe..0000000 --- a/glide2x/h3/glide/src/fxglide.h +++ /dev/null @@ -1,3378 +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 3/17/99 6:16p Dow -** Phantom Menace and other fixes. -** -** 243 3/17/99 5:08p Peter -** removed whacky stuff now that the command fifo threshold stuff appears -** to make all happy (including the k7) -** -** 242 3/17/99 1:37p Atai -** use grHints to enable/disable uma hack -** -** 241 3/16/99 11:51a Atai -** Back door (set FX_GLIDE_ENABLE_UMA=1) to enable unified texture memory. -** TMUn memory size will the whole texture memory space. The offset for -** each TMU points to the start address of the memory pool. -** -** 240 3/15/99 10:51p Dow -** Vile Hack -** -** 239 3/14/99 1:42p Peter -** really invokve the ggggsoph -** -** 238 3/13/99 9:48p Dow -** -** 237 3/12/99 2:28p Dow -** Great-great-great grandson of packer workaround -** -** 236 3/10/99 10:40a Peter -** bump-n-grind workaround for katmai until the bug is better -** characterized -** -** 235 3/04/99 3:15p Atai -** mods for direct write -** -** 234 3/02/99 2:21p Peter -** wax is a chip id -** -** 233 2/19/99 5:54p Peter -** new splash screen -** -** 232 2/18/99 7:11p Kcd -** Added P6FENCE for MacOS -** -** 231 2/16/99 4:14p Peter -** made texture table declarations consistent -** -** 230 2/10/99 2:24p Peter -** corrected alignment textures within an alignment allocation unit -** -** 229 12/09/98 2:07p Peter -** More Norbert's stuff for the other 3DNow!(tm) partners -** -** 228 12/03/98 11:27p Dow -** Code 'cleanup' heç -** -** 227 12/02/98 2:53p Dow -** NT/9X Registry reading fix -** -** 226 11/18/98 7:57p Dow -** Added grxclk -** -** 225 11/12/98 2:50p Atai -** fixed register get -** -** 224 11/02/98 5:34p Atai -** merge direct i/o code -** -** 223 10/21/98 4:20p Atai -** gamma stuff -** -** 222 10/21/98 10:41a Atai -** -** 221 10/20/98 4:39p Atai -** update tramOffset and tramSize -** -** 220 10/19/98 2:11p Peter -** ctrisetup happiness -** -** 219 10/09/98 6:57p Peter -** dynamic 3DNow!(tm) mods -** -** 218 9/04/98 11:36a Peter -** re-open fix for nt (thanks to taco/rob/nt bob) -** -** 217 8/27/98 6:33p Atai -** added environment.tmuMemory -** -** 216 7/29/98 3:09p Dow -** SDRAM Fixes -** -** 215 7/24/98 2:03p Dow -** AGP Stuff -** -** 214 7/23/98 3:19p Dow -** Bump & Grind Fix -** -** 213 7/23/98 1:17a Dow -** Bump & Grind -** -** 212 7/14/98 2:48p Mikec -** Added Glide environment variable FX_GLIDE_EMUL_RUSH allow Banshee glide -** to report itself as Rush to the application. Set it to 1 to enable Rush -** reporting. By default Glide still reports itself as Voodoo Graphics. -** -** 211 7/09/98 12:00p Jdt -** -** 210 7/09/98 11:49a Jdt -** -** 209 7/09/98 11:33a Jdt -** fixed fencing for dos build -** -** 208 7/06/98 7:03p Jdt -** in-memory fifo test code, minor changes to init-time variables -** -** 207 7/02/98 12:12p Dow -** LFB Fixes -** -** 206 6/24/98 10:55a Peter -** gary's trilinear hell bug -** -** 205 6/19/98 2:33p Mikec -** Fixed my triple buffering effage when getting lfb buffers we need to -** re-allocate the size of the render buffer -** -** 204 6/16/98 6:12p Dow -** Rearranged texture memory -** -** 203 6/12/98 9:21a Peter -** lfb read for triple buffering -** -** 202 6/10/98 9:49a Peter -** lfb buffer addressing -** -** 201 5/28/98 1:46p Dow -** Swap Pending Workaround -** -** 200 5/21/98 4:47p Dow -** Direct Register Writes Work -** -** 199 5/18/98 3:20p Peter -** pts more resistant to changing rounding modes -** -** 198 5/13/98 11:42a Dow -** -** 197 5/12/98 2:42p Dow -** -** 196 5/12/98 1:36p Mc -** -** 195 5/06/98 5:34p Dow -** 2D FastFill Workaround -** -** 194 4/22/98 8:41a Dow -** AGP Workaround -** -** 193 4/14/98 6:41p Peter -** Merge w/ cvg glide cleanup -** -** 192 4/05/98 2:18p Dow -** DOS Glide Stuff -** -** 191 4/03/98 2:04p Dow -** Dos Glide Mods -** -** 190 3/28/98 12:31p Dow -** Added Fencing -** -** 189 3/28/98 11:24a Dow -** itwoç -** -** 184 2/17/98 12:50p Dow -** -** 183 2/08/98 3:08p Dow -** FIFO Works -** -** 182 2/03/98 8:45p Dow -** Prep for cmd fifo stuff -** -** 181 2/02/98 4:31p Dow -** IO w/o HAL now possible -** -** 180 2/01/98 7:52p Peter -** grLfbWriteRegion byte count problems -** -** 179 1/29/98 9:54p Dow -** This is Banshee -** -** 178 1/20/98 11:03a Peter -** env var to force triple buffering - * - * 176 1/16/98 7:03p Peter - * fixed volatile - * - * 175 1/16/98 10:47a Peter - * fixed idle effage - * - * 174 1/15/98 1:12p Peter - * dispatch w/o packing - * - * 173 1/13/98 12:42p Atai - * fixed grtexinfo, grVertexLayout, and draw triangle - * - * 172 1/10/98 4:01p Atai - * inititialize vertex layout, viewport, added defines - * - * 168 1/07/98 11:18a Atai - * remove GrMipMapInfo and GrGC.mm_table in glide3 - * - * 167 1/07/98 10:22a Peter - * lod dithering env var - * - * 166 1/06/98 6:47p Atai - * undo grSplash and remove gu routines - * - * 165 1/05/98 6:06p Atai - * glide extension stuff - * - * 164 12/18/97 10:52a Atai - * fixed grGet(GR_VIDEO_POS) - * - * 163 12/17/97 4:45p Peter - * groundwork for CrybabyGlide - * - * 162 12/17/97 4:05p Atai - * added grChromaRange(), grGammaCorrecionRGB(), grRest(), and grGet() - * functions - * - * 160 12/15/97 5:52p Atai - * disable obsolete glide2 api for glide3 - * - * 156 12/09/97 12:20p Peter - * mac glide port - * - * 155 12/09/97 10:28a Peter - * cleaned up some frofanity - * - * 154 12/09/97 9:46a Atai - * added viewport varibales - * - * 152 11/25/97 12:09p Peter - * nested calls to grLfbLock vs init code locking on v2 - * - * 151 11/21/97 6:05p Atai - * use one datalist (tsuDataList) in glide3 - * - * 150 11/21/97 3:20p Peter - * direct writes tsu registers - * - * 149 11/19/97 4:33p Atai - * #define GLIDE3_VERTEX_LAYOUT 1 - * - * 148 11/19/97 3:51p Dow - * Tex stuff for h3, def of GETENV when using fxHal - * - * 147 11/18/97 6:11p Peter - * fixed glide3 effage - * - * 146 11/18/97 4:36p Peter - * chipfield stuff cleanup and w/ direct writes - * - * 145 11/18/97 3:25p Atai - * redefine vData - * - * 144 11/17/97 4:55p Peter - * watcom warnings/chipfield stuff - * - * 143 11/15/97 7:43p Peter - * more comdex silliness - * - * 142 11/14/97 11:10p Peter - * open vs hw init confusion - * - * 141 11/14/97 5:02p Peter - * more comdex stuff - * - * 140 11/14/97 12:09a Peter - * comdex thing and some other stuff - * - * 139 11/12/97 2:35p Peter - * fixed braino - * - * 138 11/12/97 2:27p Peter - * - * 137 11/12/97 11:38a Dow - * - * 136 11/12/97 11:15a Peter - * fixed tri/strip param send and used cvgdef.h constant - * - * 135 11/12/97 9:21a Dow - * Changed offset defs to those in h3defs.h - * - * 134 11/07/97 11:22a Atai - * remove GR_*_SMOOTH. use GR_SMOOTH - * - * 133 11/06/97 3:46p Peter - * dos ovl build problem - * - * 132 11/06/97 3:38p Dow - * More banshee stuff - * - * 131 11/04/97 6:35p Atai - * 1. sync with data structure changes - * 2. break up aa triangle routine - * - * 130 11/04/97 5:04p Peter - * cataclysm part deux - * - * 129 11/04/97 4:00p Dow - * Banshee Mods - * - * 128 11/03/97 3:43p Peter - * h3/cvg cataclysm - * - * 127 10/29/97 2:45p Peter - * C version of Taco's packing code - * -** -*/ - -/* -** fxglide.h -** -** Internal declarations for use inside Glide. -** -** GLIDE_LIB: Defined if building the Glide Library. This macro -** should ONLY be defined by a makefile intended to build -** GLIDE.LIB or glide.a. -** -** GLIDE_NUM_TMU: Number of physical TMUs installed. Valid values are 1 -** and 2. If this macro is not defined by the application -** it is automatically set to the value 2. -** -*/ - -#ifndef __FXGLIDE_H__ -#define __FXGLIDE_H__ - -/* -** ----------------------------------------------------------------------- -** INCLUDE FILES -** ----------------------------------------------------------------------- -*/ -#include -#include -#include -#include -#include - -#include <3dfx.h> -#include -#include - -#include - -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) -#define WIN32_LEANER_AND_MEANER -#include -#include "fxsplash.h" -#endif /* (GLIDE_PLATFORM & GLIDE_OS_WIN32) */ - -/* Compilation hacks for h3 */ - -/* Reserved fbzMode bits */ -#define SST_DRAWBUFFER_SHIFT 14 -#define SST_DRAWBUFFER (0x3 << SST_DRAWBUFFER_SHIFT) -#define SST_DRAWBUFFER_FRONT (0 << SST_DRAWBUFFER_SHIFT) -#define SST_DRAWBUFFER_BACK (1 << SST_DRAWBUFFER_SHIFT) - -/* Reserved textureMode bits */ -#define SST_SEQ_8_DOWNLD BIT(31) - -/* hack for UMA via grHints */ -#define GR_HINT_ENABLE_UMA 0x10000000 - -#if GLIDE_INIT_HAL - -#include - -#ifdef GETENV -#undef GETENV -#endif -#ifdef __linux__ -/* We want to allow file based initialization */ -#define GETENV hwcGetenv -#endif - -/* dpc - 2 june 1997 - * Moved the fence check out to avoid empty if body warning w/ gcc. - * This only applies to systems that require the p6 fencing. - */ -#define P6FENCE_CHECK if (i & 2) P6FENCE - - -#else /* !defined(GLIDE_INIT_HAL) */ - -#include - -/* HACK HACK HACK */ -#define IDLE_HW(__hwPtr) (while (gc->ioRegs->status & (0x1f << 8))) - -#define HWC_BASE_ADDR_MASK 0x03UL - -#endif /* !GLIDE_INIT_HAL */ - -#if GLIDE_MULTIPLATFORM -#include "gcfuncs.h" -#endif - -/* isolate this 'hack' here so as to make the code look cleaner */ -#ifdef __WATCOMC__ -#define GR_CDECL __cdecl -#else -#define GR_CDECL -#endif - -#ifdef GLIDE3 - -#define GLIDE3_VERTEX_LAYOUT 1 -/* -** grGet defines -*/ -#define VOODOO2_FOG_TABLE_SIZE 80 -#define VOODOO_FOG_TABLE_SIZE 64 -#define VOODOO_GAMMA_TABLE_SIZE 32 -#define SST1_BITS_DEPTH 16 -#define SST1_ZDEPTHVALUE_NEAREST 0xFFFF -#define SST1_ZDEPTHVALUE_FARTHEST 0x0000 -#define SST1_WDEPTHVALUE_NEAREST 0x0000 -#define SST1_WDEPTHVALUE_FARTHEST 0xFFFF - -/* -** ----------------------------------------------------------------------- -** STUFF FOR STRIPS -** ----------------------------------------------------------------------- -*/ - -#define GR_COLOR_OFFSET_RED (0 << 2) -#define GR_COLOR_OFFSET_GREEN (1 << 2) -#define GR_COLOR_OFFSET_BLUE (2 << 2) -#define GR_COLOR_OFFSET_ALPHA (3 << 2) - -#define GR_VERTEX_OFFSET_X (0 << 2) -#define GR_VERTEX_OFFSET_Y (1 << 2) -#define GR_VERTEX_OFFSET_Z (2 << 2) -#define GR_VERTEX_OFFSET_WFBI (3 << 2) - -#define GR_TEXTURE_OFFSET_S (0 << 2) -#define GR_TEXTURE_OFFSET_T (1 << 2) -#define GR_TEXTURE_OFFSET_W (2 << 2) - -#define GR_DLIST_END 0x00 -#define GR_VTX_PTR 0x00 -#define GR_VTX_PTR_ARRAY 0x01 -#define GR_SCALE_OOW 0x00 -#define GR_SCALE_COLOR 0x01 -#define GR_SCALE_STW 0x02 - -typedef struct { - FxU32 - param, /* vertex, color, textureN */ - components, /* which ones? */ - type, /* data type */ - mode; /* enable / disable */ - FxI32 - offset; -} GrVParamInfo; - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -/* -** data structure for for oeminit dll -*/ -typedef struct { - FxU32 version; - FxU32 vendorID; - FxU32 deviceID; - FxU32 *linearAddress; - GrScreenResolution_t res; - GrScreenRefresh_t refresh; - FxU32 reserved[4]; -} OemInitInfo; -#endif - -/*============================================================ - ** State Monster Stuff: - **============================================================*/ -#define GR_FLUSH_STATE() \ -if (gc->state.invalid) _grValidateState() - - -/* Look in distate.c:grValidateState (NOTVALID macro) to see how these - are used I wanted to keep the mixed-case register names here, and - that's why they are mixed case */ -#define alphaModeBIT FXBIT(0) -#define fbzColorPathBIT FXBIT(1) -#define fbzModeBIT FXBIT(2) -#define chromaKeyBIT FXBIT(3) -#define clipRegsBIT FXBIT(4) -#define zaColorBIT FXBIT(5) -#define fogModeBIT FXBIT(6) -#define fogColorBIT FXBIT(7) -#define lfbModeBIT FXBIT(8) -#define c0c1BIT FXBIT(9) - -/*============================================================ - ** Video Stuff: - **============================================================*/ -#define VRETRACEMASK 0x00000fff -#define HRETRACEPOS 16 - -#else -/* Make sure GR_FLUSH_STATE is a noop if not Glide 3 */ -#define GR_FLUSH_STATE() -#endif /* GLIDE3 */ - - -/*==========================================================================*/ -/* -** GrState -** -** If something changes in here, then go into glide.h, and look for a -** declaration of the following form: -** -** #define GLIDE_STATE_PAD_SIZE N -** #ifndef GLIDE_LIB -** typedef struct { -** char pad[GLIDE_STATE_PAD_SIZE]; -** } GrState; -** #endif -** -** Then change N to sizeof(GrState) AS DECLARED IN THIS FILE! -** -*/ - -struct _GrState_s { - GrCullMode_t /* these go in front for cache hits */ - cull_mode; /* cull neg, cull pos, don't cull */ - - GrHint_t - paramHints; /* Tells us if we need to pointcast a - parameter to a specific chip */ - FxI32 - fifoFree; /* # free entries in FIFO */ - FxU32 - paramIndex, /* Index into array containing - parameter indeces to be sent ot the - triangle setup code */ - tmuMask; /* Tells the paramIndex updater which - TMUs need values */ - struct { - FxU32 fbzColorPath; - FxU32 fogMode; - FxU32 alphaMode; - FxU32 fbzMode; - FxU32 lfbMode; - FxU32 clipLeftRight; - FxU32 clipBottomTop; - - FxU32 fogColor; - FxU32 zaColor; - FxU32 chromaKey; - FxU32 chromaRange; - - FxU32 stipple; - FxU32 color0; - FxU32 color1; - } fbi_config; /* fbi register shadow */ - - struct tmu_config_t { - FxU32 textureMode; - FxU32 tLOD; - FxU32 tDetail; - FxU32 texBaseAddr; - FxU32 texBaseAddr_1; - FxU32 texBaseAddr_2; - FxU32 texBaseAddr_3_8; - GrMipMapMode_t mmMode; /* saved to allow MM en/dis */ - GrLOD_t smallLod, largeLod; /* saved to allow MM en/dis */ - FxU32 evenOdd; - GrNCCTable_t nccTable; - } tmu_config[GLIDE_NUM_TMU]; /* tmu register shadow */ - - FxBool /* Values needed to determine which */ - ac_requires_it_alpha, /* parameters need gradients computed */ - ac_requires_texture, /* when drawing triangles */ - cc_requires_it_rgb, - cc_requires_texture, - cc_delta0mode, /* Use constants for flat shading */ - allowLODdither, /* allow LOD dithering */ - checkFifo; /* Check fifo status as specified by hints */ - -#ifdef GLIDE3 - FxU16 -#else - FxU32 -#endif - lfb_constant_depth; /* Constant value for depth buffer (LFBs) */ - GrAlpha_t - lfb_constant_alpha; /* Constant value for alpha buffer (LFBs) */ - - FxU32 - num_buffers; /* 2 or 3 */ - - GrColorFormat_t - color_format; /* ARGB, RGBA, etc. */ - - GrOriginLocation_t /* lower left, upper left */ - origin; - - GrMipMapId_t - current_mm[GLIDE_NUM_TMU]; /* Which guTex** thing is the TMU set - up for? THIS NEEDS TO GO!!! */ - - float - clipwindowf_xmin, clipwindowf_ymin, /* Clipping info */ - clipwindowf_xmax, clipwindowf_ymax; - FxU32 - screen_width, screen_height; /* Screen width and height */ - float - a, r, g, b; /* Constant color values for Delta0 mode */ - -#ifdef GLIDE3 - /* viewport and clip space coordinate related stuff */ - - struct { - float - n, f; - FxFloat - ox, oy, oz; - FxFloat - hwidth, hheight, hdepth; - } Viewport; - -#endif - -#ifdef GLIDE3 - /* Strip Stuff */ -#if !GLIDE3_VERTEX_LAYOUT - struct { - GrVParamInfo - vertexInfo, /* Info about vertex data*/ - zInfo, - colorInfo, /* Info about color data */ - tex0Info, /* Info about tmu0 data */ - tex1Info; /* Info about tmu1 data */ - FxU32 - vSize, - vStride; - } vData; -#else /* GLIDE3_VERTEX_LAYOUT */ - struct { - GrVParamInfo - vertexInfo, /* xy */ - zInfo, /* z(ooz) */ - wInfo, /* w(oow) */ - aInfo, /* a float */ - rgbInfo, /* rgb float */ - pargbInfo, /* pargb byte */ - st0Info, /* st0 */ - st1Info, /* st1 */ - qInfo, /* q */ - q0Info, /* q0 */ - q1Info; /* q1 */ - FxU32 - vStride, /* vertex stride */ - vSize; /* vertex size */ - FxU32 - colorType; /* float or byte */ - } vData; -#endif /* GLIDE3_VERTEX_LAYOUT */ - - /*============================================================ - ** State Monster Stuff: - **============================================================*/ - /* - ** The following DWORD is used to determine what state (if any) needs to - ** be flushed when a rendering primative occurs. - */ - FxU32 - invalid; - /* invalid contains bits representing: - alphaMode register: - modified by grAlphaBlendFunction, grAlphaTestFunction, - grAlphaTestReferenceValue - - fbzColorPath register: - modified by grAlphaCombine, grAlphaControlsITRGBLighting, - grColorCombine - - fbzMode register: - modified by grChromaKeyMode, grDepthBufferFunction, - grDeptBufferMode, grDepthMask, grDitherMode, grRenderBuffer, - grSstOrigin, grColorMask - - chromaKey register: - modified by grChromaKeyValue - - clipLeftRight, clipBottomTop registers: - modified by grClipWindow - - zaColor register: - modified by grDepthBiasLevel - - fogMode register: - modified by grFogMode - - fogColor register: - modified by grFocColorValue - - lfbMode register: - modified by grLfbWriteColorFormat, grLfbWriteColorSwizzle - - c0 & c1 registers: - modified by grConstanColorValue - */ - - /* - ** Argument storage for State Monster: - ** - ** NOTE that the data structure element names are IDENTICAL to the function - ** argment names. This is very important, as there are macros in distate.c - ** that require that. - */ - struct { - struct { - GrAlphaBlendFnc_t rgb_sf; - GrAlphaBlendFnc_t rgb_df; - GrAlphaBlendFnc_t alpha_sf; - GrAlphaBlendFnc_t alpha_df; - } grAlphaBlendFunctionArgs; - struct { - GrCmpFnc_t fnc; - } grAlphaTestFunctionArgs; - struct { - GrAlpha_t value; - } grAlphaTestReferenceValueArgs; - struct { - GrCombineFunction_t function; - GrCombineFactor_t factor; - GrCombineLocal_t local; - GrCombineOther_t other; - FxBool invert; - } grAlphaCombineArgs; - struct { - FxBool enable; - } grAlphaControlsITRGBLightingArgs; - struct { - GrCombineFunction_t function; - GrCombineFactor_t factor; - GrCombineLocal_t local; - GrCombineOther_t other; - FxBool invert; - } grColorCombineArgs; - struct { - FxBool rgb; - FxBool alpha; - } grColorMaskArgs; - struct { - GrChromakeyMode_t mode; - } grChromakeyModeArgs; - struct { - GrColor_t color; - } grChromakeyValueArgs; -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) - struct { - GrColor_t range; - GrChromaRangeMode_t mode; - } grChromaRangeArgs; -#endif - struct { - FxBool enable; - } grDepthMaskArgs; - struct { - GrCmpFnc_t fnc; - } grDepthBufferFunctionArgs; - struct { - GrDepthBufferMode_t mode; - } grDepthBufferModeArgs; - struct { - GrDitherMode_t mode; - } grDitherModeArgs; - struct { - GrBuffer_t buffer; - } grRenderBufferArgs; - struct { - GrOriginLocation_t origin; - } grSstOriginArgs; - struct { - FxU32 minx; - FxU32 miny; - FxU32 maxx; - FxU32 maxy; - } grClipWindowArgs; - struct { - FxU32 level; - } grDepthBiasLevelArgs; - struct { - GrFogMode_t mode; - } grFogModeArgs; - struct { - GrColor_t color; - } grFogColorValueArgs; - struct { - GrColorFormat_t colorFormat; - } grLfbWriteColorFormatArgs; - struct { - FxBool swizzleBytes; - FxBool swapWords; - } grLfbWriteColorSwizzleArgs; - struct { - GrColor_t color; - } grConstantColorValueArgs; - } stateArgs; - struct{ - GrEnableMode_t primitive_smooth_mode; - GrEnableMode_t shameless_plug_mode; - GrEnableMode_t video_smooth_mode; - } grEnableArgs; - struct{ - GrCoordinateSpaceMode_t coordinate_space_mode; - } grCoordinateSpaceArgs; -#endif /* GLIDE3 end grenable mode*/ -}; - -#if GLIDE_DISPATCH_SETUP -/* gpci.c - * - * Set of procs for the current cpu type. These are selected out of - * the _archXXXX proc list that is selected at grGlideInit time. - * - * TriProc vector - * 0 - No Culling - * 1 - Culling (Postive/Negative) - * - * _GlideRoot.curTriProcs - * 0 - Generic dataList w/ all parameters - * 1 - Packed rgb (GLIDE_PACKED_RGB) - * 2 - Packed argb (GLIDE_PACKED_RGB) - */ - -#define NUM_TRI_PROC_LISTS 1 - -typedef FxI32 (FX_CALL* GrTriSetupProc)(const GrVertex*, const GrVertex*, const GrVertex*); -typedef GrTriSetupProc GrTriSetupProcVector[2]; -typedef GrTriSetupProcVector GrTriSetupProcArchVector[NUM_TRI_PROC_LISTS]; - -/* Decalrations of the dispatchable procs found in xdraw2.asm and - * xtexdl.c for teh triangle and texture download procs respectively. - */ -extern FxI32 FX_CALL _trisetup_Default_Default(const GrVertex*, const GrVertex*, const GrVertex*); -extern FxI32 FX_CALL _trisetup_Default_cull(const GrVertex*, const GrVertex*, const GrVertex*); - -#if GL_AMD3D -extern FxI32 FX_CALL _trisetup_3DNow_Default(const GrVertex*, const GrVertex*, const GrVertex*); -extern FxI32 FX_CALL _trisetup_3DNow_cull(const GrVertex*, const GrVertex*, const GrVertex*); -#endif /* GL_AMD3D */ -#endif /* GLIDE_DISPATCH_SETUP */ - -struct GrGC_s; - -/* _GlideRoot.curTexProcs is an array of (possibly specialized - * function pointers indexed by texture format size (8/16 bits) and - * texture line width (1/2/4/>4). - * - * xtexdl.c - */ -typedef void (FX_CALL* GrTexDownloadProc)(struct GrGC_s* gc, const FxU32 tmuBaseAddr, - const FxI32 maxS, const FxI32 minT, const FxI32 maxT, - void* texData); -typedef GrTexDownloadProc GrTexDownloadProcVector[2][4]; - -extern void FX_CALL _grTexDownload_Default_8_1(struct GrGC_s* gc, const FxU32 tmuBaseAddr, - const FxI32 maxS, const FxI32 minT, const FxI32 maxT, - void* texData); -extern void FX_CALL _grTexDownload_Default_8_2(struct GrGC_s* gc, const FxU32 tmuBaseAddr, - const FxI32 maxS, const FxI32 minT, const FxI32 maxT, - void* texData); -extern void FX_CALL _grTexDownload_Default_8_4(struct GrGC_s* gc, const FxU32 tmuBaseAddr, - const FxI32 maxS, const FxI32 minT, const FxI32 maxT, - void* texData); -extern void FX_CALL _grTexDownload_Default_8_WideS(struct GrGC_s* gc, const FxU32 tmuBaseAddr, - const FxI32 maxS, const FxI32 minT, const FxI32 maxT, - void* texData); - -extern void FX_CALL _grTexDownload_Default_16_1(struct GrGC_s* gc, const FxU32 tmuBaseAddr, - const FxI32 maxS, const FxI32 minT, const FxI32 maxT, - void* texData); -extern void FX_CALL _grTexDownload_Default_16_2(struct GrGC_s* gc, const FxU32 tmuBaseAddr, - const FxI32 maxS, const FxI32 minT, const FxI32 maxT, - void* texData); -extern void FX_CALL _grTexDownload_Default_16_4(struct GrGC_s* gc, const FxU32 tmuBaseAddr, - const FxI32 maxS, const FxI32 minT, const FxI32 maxT, - void* texData); -extern void FX_CALL _grTexDownload_Default_16_WideS(struct GrGC_s* gc, const FxU32 tmuBaseAddr, - const FxI32 maxS, const FxI32 minT, const FxI32 maxT, - void* texData); - -#if GL_AMD3D -/* xtexdl.asm */ -extern void FX_CALL _grTexDownload_3DNow_MMX(struct GrGC_s* gc, const FxU32 tmuBaseAddr, - const FxI32 maxS, const FxI32 minT, const FxI32 maxT, - void* texData); -#endif /* GL_AMD3D */ - -typedef struct GrGC_s { - FxU32 - totBuffers, - strideInTiles, - heightInTiles, - bufferStride, - bufSizeInTiles, - bufSize, - fbOffset, - tramOffset[2], - tramSize[2], - *base_ptr, /* base address of SST */ - *reg_ptr, /* pointer to base of SST registers */ - *tex_ptr, /* texture memory address */ - *lfb_ptr, /* linear frame buffer address */ - *slave_ptr; /* Scanline Interleave Slave address */ - -#ifdef GLIDE_INIT_HWC - hwcBoardInfo - *bInfo; -#endif - -#if GLIDE_MULTIPLATFORM - GrGCFuncs - gcFuncs; -#endif - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) - void *oemInit; -#endif - - -#define kMaxVertexParam (20 + (12 * GLIDE_NUM_TMU) + 3) - struct dataList_s { - int i; - FxFloat* addr; - } regDataList[kMaxVertexParam]; - int tsuDataList[kMaxVertexParam]; - - struct { -#if GLIDE_DISPATCH_SETUP - /* Current triangle rendering proc specialized for culling/no - * culling and optionally for packed rgb at compile time. - */ - GrTriSetupProc triSetupProc; -#endif /* GLIDE_DISPATCH_SETUP */ - - /* Vector of texture download procs specialized by size - * and processor vendor type. - */ - GrTexDownloadProcVector* texDownloadProcs; - } archDispatchProcs; - -#ifdef GLIDE3 -#if 0 - /* scale factor for clip space and viewport code */ - int scaleDataList[kMaxVertexParam]; -#endif -#endif - - GrState - state; /* state of Glide/SST */ - - /* Here beginneth the Swap Pending Workaround (tm) */ -#define MAX_BUFF_PENDING 0x7 - FxU32 - swapsPending, /* swaps in unexecuted region of FIFO */ - lastSwapCheck, /* Position at last check */ - curSwap, /* Position in the array below */ - bufferSwaps[MAX_BUFF_PENDING];/* Position in FIFO of buffer swaps */ - /* Here endeth the Swap Pending Workaround */ - - struct cmdTransportInfo { - FxU32 triPacketHdr; /* Pre-computed packet header for - * independent triangles. - */ - - FxU32 cullStripHdr; /* Pre-computed packet header for generic - * case of packet 3 triangles. This needs - * command type and # of vertices to be complete. - */ - - FxU32 paramMask; /* Mask for specifying parameters of - * non-triangle packets. The parameter - * bits[21:10] mimic the packet3 header - * controlling which fields are sent, and - * pc[28] controls whether any color - * information is sent as packed. - */ - - /* Basic command fifo characteristics. These should be - * considered logically const after their initialization. - */ - FxU32* fifoStart; /* Virtual address of start of fifo */ - FxU32* fifoEnd; /* Virtual address of fba fifo */ - FxU32 fifoOffset; /* Offset from hw base to fifo start */ - FxU32 fifoSize; /* Size in bytes of the fifo */ - FxU32 fifoJmpHdr[2];/* Type0 packet for jmp to fifo start - only first DWORD is used for memory - fifo--both are used for AGP FIFO - */ - -#ifdef TACO_MEMORY_FIFO_HACK - FxU32 *vFifoStart; - FxU32 *vFifoEnd; -#endif - - FxU32* fifoPtr; /* Current write pointer into fifo */ - FxU32 fifoRead; /* Last known hw read ptr. - * This is the sli master, if enabled. - */ - -#if GLIDE_USE_DEBUG_FIFO - FxU32* fifoShadowBase; /* Buffer that shadows the hw fifo for debugging */ - FxU32* fifoShadowPtr; -#endif /* GLIDE_USE_DEBUG_FIFO */ - - /* Fifo checking information. In units of usuable bytes until - * the appropriate condition. - */ - FxI32 fifoRoom; /* Space until next fifo check */ - FxI32 roomToReadPtr;/* Bytes until last known hw ptr */ - FxI32 roomToEnd; /* # of bytes until last usable address before fifoEnd */ - - FxBool lfbLockCount; /* Have we done an lfb lock? Count of the locks. */ - FxBool - autoBump; /* Are we auto bumping (aka hole counting?) */ - FxU32 - *lastBump, /* Last ptr where we bumped. */ - *bumpPos; /* Nex place to bump */ - FxU32 - bumpSize; /* # of DWORDS per bump */ - - } cmdTransportInfo; - - - SstIORegs - *ioRegs; /* I/O remap regs */ - SstCRegs - *cRegs; /* AGP/Cmd xfer/misc regs */ - SstGRegs - *gRegs; /* 2D regs */ - SstRegs - *sstRegs; /* Graphics Regs (3D Regs) */ - FxU32 - *rawLfb, /* Poiinter to vAddr of baseAddress1 */ - nBuffers, - curBuffer, - frontBuffer, - backBuffer, - buffers[4], - lfbBuffers[4]; /* Tile relative addresses of the color/aux - * buffers for lfbReads. - */ - - FxU32 lockPtrs[2]; /* pointers to locked buffers */ - FxU32 fbStride; - - struct { - FxU32 freemem_base; - FxU32 total_mem; - FxU32 next_ncc_table; - GrMipMapId_t ncc_mmids[2]; - const GuNccTable *ncc_table[2]; - } tmu_state[GLIDE_NUM_TMU]; - - int - grSstRez, /* Video Resolution of board */ - grSstRefresh, /* Video Refresh of board */ - fbuf_size, /* in MB */ - num_tmu, /* number of TMUs attached */ - grColBuf, - grAuxBuf, - grHwnd; - - /* Overlay Hack: This flag indicates if the overlay hack is on. - * This is probably the wrong place for this kind of thing*/ - int desktopOverlay; - - FxBool - scanline_interleaved; - -#ifndef GLIDE3_ALPHA - struct { - GrMipMapInfo data[MAX_MIPMAPS_PER_SST]; - GrMipMapId_t free_mmid; - } mm_table; /* mip map table */ -#endif - - FxBool tmuLodDisable[GLIDE_NUM_TMU]; - - /* DEBUG and SANITY variables */ - FxI32 myLevel; /* debug level */ - FxI32 counter; /* counts bytes sent to HW */ - FxI32 expected_counter; /* the number of bytes expected to be sent */ - - FxU32 checkCounter; - FxU32 checkPtr; - - FxVideoTimingInfo* vidTimings;/* init code overrides */ - - FxU32 nColBuffers; - FxBool open; /* Has GC Been Opened? */ - FxBool hwInitP; /* Has the hw associated w/ GC been initted and - mapped? This is managed in - _grDetectResources:gpci.c the first time - that the board is detected, and in - grSstWinOpen:gsst.c if the hw has been - shutdown in a call to grSstWinClose. - */ - -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) - /* Splash screen/shameless plug crap */ - struct { - HMODULE - moduleHandle; - GrSplashInitProc - initProc; - GrSplashShutdownProc - shutdownProc; - GrSplashProc - splashProc; - GrSplashPlugProc - plugProc; - } pluginInfo; -#endif /* (GLIDE_PLATFORM & GLIDE_OS_WIN32) */ -} GrGC; - - -/* -** The Root Of All EVIL! -** -** The root of all Glide data, all global data is in here -** stuff near the top is accessed a lot -*/ -struct _GlideRoot_s { - /* NOTE!!!! p6Fencer this must be the very first structure element always */ - int p6Fencer; /* xchg to here to keep this in cache!!! */ - int current_sst; - FxU32 CPUType; - GrGC *curGC; /* point to the current GC */ - FxU32 packerFixAddress; /* address to write packer fix to */ - FxBool windowsInit; /* Is the Windows part of glide initialized? */ - - FxI32 curTriSize; /* the size in bytes of the current triangle */ -#if GLIDE_HW_TRI_SETUP - FxI32 curVertexSize; /* Size in bytes of a single vertex's parameters */ -#endif - -#if !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP - FxU32 paramCount; - FxI32 curTriSizeNoGradient; /* special for _trisetup_nogradients */ -#endif /* !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP */ - -#if GLIDE_MULTIPLATFORM - GrGCFuncs - curGCFuncs; /* Current dd Function pointer table */ -#endif - int initialized; - - struct { /* constant pool (minimizes cache misses) */ - float f0; - float fHalf; - float f1; - float f255; - float ftemp1, ftemp2; /* temps to convert floats to ints */ - -#if GLIDE_PACKED_RGB -#define kPackBiasA _GlideRoot.pool.fBiasHi -#define kPackBiasR _GlideRoot.pool.fBiasHi -#define kPackBiasG _GlideRoot.pool.fBiasHi -#define kPackBiasB _GlideRoot.pool.fBiasLo - -#define kPackShiftA 16UL -#define kPackShiftR 8UL -#define kPackShiftG 0UL -#define kPackShiftB 0UL - -#define kPackMaskA 0x00FF00UL -#define kPackMaskR 0x00FF00UL -#define kPackMaskG 0x00FF00UL -#define kPackMaskB 0x00FFUL - - float fBiasHi; - float fBiasLo; -#endif /* GLIDE_PACKED_RGB */ - } pool; - - struct { /* environment data */ - FxBool ignoreReopen; - FxBool triBoundsCheck; /* check triangle bounds */ - FxBool noSplash; /* don't draw it */ - FxBool shamelessPlug; /* translucent 3Dfx logo in lower right */ - FxI32 swapInterval; /* swapinterval override */ - FxI32 swFifoLWM; - FxU32 snapshot; /* register trace snapshot */ - FxBool disableDitherSub; /* Turn off dither subtraction? */ - FxBool texLodDither; /* Always do lod-dithering */ - FxI32 tmuMemory; /* tmuMemory */ - FxBool enUma; /* enable uma */ - float gammaR, gammaG, gammaB; /* Gamma settings */ - - /* Force alternate buffer strategy */ - FxI32 nColorBuffer; - FxI32 nAuxBuffer; - FxI32 emulRush; /* Banshee reports as Rush flag */ - FxI32 grxClk; - FxBool autoBump; /* Auto bump or do it manually? */ - FxU32 bumpSize; - } environment; - - struct { - FxU32 bufferSwaps; /* number of buffer swaps */ - FxU32 pointsDrawn; - FxU32 linesDrawn; - FxU32 trisProcessed; - FxU32 trisDrawn; - - FxU32 texDownloads; /* number of texDownload calls */ - FxU32 texBytes; /* number of texture bytes downloaded */ - - FxU32 palDownloads; /* number of palette download calls */ - FxU32 palBytes; /* number of palette bytes downloaded */ - - FxU32 nccDownloads; /* # of NCC palette download calls */ - FxU32 nccBytes; /* # of NCC palette bytes downloaded */ - -#if USE_PACKET_FIFO - FxU32 fifoWraps; - FxU32 fifoWrapDepth; - FxU32 fifoStalls; - FxU32 fifoStallDepth; -#endif /* USE_PACKET_FIFO */ - } stats; - - GrHwConfiguration hwConfig; - - GrGC GCs[MAX_NUM_SST]; /* one GC per board */ - -#if GLIDE_DISPATCH_SETUP -#define TRISETUP_NORGB (*_GlideRoot.curTriProcs + 0) -#if GLIDE_PACKED_RGB -#define TRISETUP_RGB (*_GlideRoot.curTriProcs + 1) -#define TRISETUP_ARGB (*_GlideRoot.curTriProcs + 2) -#else /* !GLIDE_PACKED_RGB */ -#define TRISETUP_RGB TRISETUP_NORGB -#define TRISETUP_ARGB TRISETUP_NORGB -#endif /* !GLIDE_PACKED_RGB */ -#define PROC_SELECT_TRISETUP(__procVector, __cullMode) (__procVector)[(__cullMode) != GR_CULL_DISABLE] - - GrTriSetupProcArchVector* curTriProcs; -#endif /* GLIDE_DISPATCH_SETUP */ - - GrTexDownloadProcVector* curTexProcs; -#define PROC_SELECT_TEXDOWNLOAD() _GlideRoot.curTexProcs - FxBool OSWin95; -}; - -extern struct _GlideRoot_s GR_CDECL _GlideRoot; -#if GLIDE_MULTIPLATFORM -extern GrGCFuncs _curGCFuncs; -#endif - -#if defined(__WATCOMC__) -/* - * P6 Fence - * - * Here's the stuff to do P6 Fencing. This is required for the - * certain things on the P6 - * - * dpc - 21 may 1997 - FixMe! - * This was yoinked from sst1/include/sst1init.h, and should be - * merged back into something if we decide that we need it later. - */ -extern FxU32 p6FenceVar; - -void -p6Fence(void); -#pragma aux p6Fence = \ -"xchg eax, p6FenceVar" \ -modify [eax]; - - -#define P6FENCE p6Fence() -#elif defined(__MSC__) -/* Turn off the no return value warning for the function definition. - * - * NB: The function returns a value so that we can use it in places - * that require a value via the comma operator w/o resorting to casts - * everywhere the macro is invoked. - * - * NB: I checked the compiled code to make sure that it was inlined - * everywhere that we would possibly care that it was inlines. - */ -# pragma warning(disable : 4035) - __inline FxU32 _grP6Fence(void) - { - __asm xchg eax, _GlideRoot.p6Fencer - } -# define P6FENCE _grP6Fence() -# pragma warning(default : 4035) -#elif defined(macintosh) && defined(__POWERPC__) && defined(__MWERKS__) -#define P6FENCE __eieio() -#elif defined(__GNUC__) && defined(__i386__) -#define P6FENCE asm("xchg %%eax, %0" : : "m" (_GlideRoot.p6Fencer) : "eax"); -#else -#error "P6 Fencing in-line assembler code needs to be added for this compiler" -#endif /* Compiler specific fence commands */ - -/*==========================================================================*/ -/* Macros for declaring functions */ -#define GR_DDFUNC(name, type, args) \ - type FX_CSTYLE name args - -#define GR_ENTRY(name, type, args) \ - FX_EXPORT type FX_CSTYLE name args - -#define GR_DIENTRY(name, type, args) \ - FX_EXPORT type FX_CSTYLE name args - -#ifdef GLIDE3 -#define GR_STATE_ENTRY(name, type, args) \ - type _##name## args -#else -#define GR_STATE_ENTRY(name, type, args) \ - GR_ENTRY(name, type, args) -#endif - -/*==========================================================================*/ - -#define STATE_REQUIRES_IT_DRGB FXBIT(0) -#define STATE_REQUIRES_IT_ALPHA FXBIT(1) -#define STATE_REQUIRES_OOZ FXBIT(2) -#define STATE_REQUIRES_OOW_FBI FXBIT(3) -#define STATE_REQUIRES_W_TMU0 FXBIT(4) -#define STATE_REQUIRES_ST_TMU0 FXBIT(5) -#define STATE_REQUIRES_W_TMU1 FXBIT(6) -#define STATE_REQUIRES_ST_TMU1 FXBIT(7) -#define STATE_REQUIRES_W_TMU2 FXBIT(8) -#define STATE_REQUIRES_ST_TMU2 FXBIT(9) - -#define GR_TMUMASK_TMU0 FXBIT(GR_TMU0) -#define GR_TMUMASK_TMU1 FXBIT(GR_TMU1) -#define GR_TMUMASK_TMU2 FXBIT(GR_TMU2) - -/* -** Parameter gradient offsets -** -** These are the offsets (in bytes)of the DPDX and DPDY registers from -** from the P register -*/ -#ifdef GLIDE_USE_ALT_REGMAP -#define DPDX_OFFSET 0x4 -#define DPDY_OFFSET 0x8 -#else -#define DPDX_OFFSET 0x20 -#define DPDY_OFFSET 0x40 -#endif - -#if (GLIDE_PLATFORM & GLIDE_HW_SST1) -#define GLIDE_DRIVER_NAME "Voodoo Graphics" -#elif (GLIDE_PLATFORM & GLIDE_HW_SST96) -#define GLIDE_DRIVER_NAME "Voodoo Rush" -#elif (GLIDE_PLATFORM & GLIDE_HW_CVG) -#define GLIDE_DRIVER_NAME "Voodoo^2" -#elif (GLIDE_PLATFORM & GLIDE_HW_H3) -#define GLIDE_DRIVER_NAME "Banshee" -#else -#define GLIDE_DRIVER_NAME "HOOPTI???" -#endif - -/*==========================================================================*/ -#ifndef FX_GLIDE_NO_FUNC_PROTO - -void _grMipMapInit(void); - -#if GLIDE_DISPATCH_SETUP -#define TRISETUP (*gc->archDispatchProcs.triSetupProc) -#else /* !GLIDE_DISPATCH_SETUP */ -FxI32 FX_CSTYLE -_trisetup_asm(const GrVertex *va, const GrVertex *vb, const GrVertex *vc); -FxI32 FX_CSTYLE -_trisetup(const GrVertex *va, const GrVertex *vb, const GrVertex *vc); -FxI32 FX_CSTYLE -_trisetup_nogradients(const GrVertex *va, const GrVertex *vb, const GrVertex *vc); - -/* GMT: BUG need to make this dynamically switchable - That is not a bug. It is an opinion! - */ -#if GLIDE_USE_C_TRISETUP -# if (GLIDE_PLATFORM & GLIDE_HW_CVG) && USE_PACKET_FIFO -# define TRISETUP _trisetup_nogradients -# else /* !((GLIDE_PLATFORM & GLIDE_HW_CVG) && USE_PACKET_FIFO) */ -# define TRISETUP _trisetup_nogradients -# endif /* !((GLIDE_PLATFORM & GLIDE_HW_CVG) && USE_PACKET_FIFO) */ -#else /* !GLIDE_USE_C_TRISETUP */ -# define TRISETUP _trisetup_asm -#endif /* !GLIDE_USE_C_TRISETUP */ -#endif /* !GLIDE_DISPATCH_SETUP */ - -#ifdef GLIDE3 -void -_grValidateState(); - -void FX_CSTYLE -_grDrawVertexList(FxU32 listType, FxI32 mode, FxI32 count, void *pointers); - -void -_grAlphaBlendFunction( - GrAlphaBlendFnc_t rgb_sf, GrAlphaBlendFnc_t rgb_df, - GrAlphaBlendFnc_t alpha_sf, GrAlphaBlendFnc_t alpha_df - ); -void -_grAlphaTestFunction( GrCmpFnc_t function ); - -void -_grAlphaTestReferenceValue( GrAlpha_t value ); - -void -_grAlphaCombine( - GrCombineFunction_t function, GrCombineFactor_t factor, - GrCombineLocal_t local, GrCombineOther_t other, - FxBool invert - ); - -void -_grAlphaControlsITRGBLighting( FxBool enable ); - -void -_grColorCombine( - GrCombineFunction_t function, GrCombineFactor_t factor, - GrCombineLocal_t local, GrCombineOther_t other, - FxBool invert ); - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -void -_grChromaModeExt(GrChromakeyMode_t mode); -void -_grChromaRangeExt( GrColor_t min, GrColor_t max , GrChromaRangeMode_t mode); -void -_grTexChromaModeExt(GrChipID_t tmu, GrChromakeyMode_t mode); -void -_grTexChromaRangeExt(GrChipID_t tmu, GrColor_t min, GrColor_t max); -#else -void -_grChromakeyValue( GrColor_t value ); -#endif - -void -_grChromakeyMode( GrChromakeyMode_t mode ); - -void -_grDepthMask( FxBool mask ); - -void -_grDepthBufferFunction( GrCmpFnc_t function ); - -void -_grDepthBufferMode( GrDepthBufferMode_t mode ); - -void -_grDitherMode( GrDitherMode_t mode ); - -void -_grRenderBuffer( GrBuffer_t buffer ); - -void -_grColorMask( FxBool rgb, FxBool a ); - -void -_grSstOrigin(GrOriginLocation_t origin); - -void -_grClipWindow( FxU32 minx, FxU32 miny, FxU32 maxx, FxU32 maxy ); - -void -_grDepthBiasLevel( FxI16 level ); - -void -_grFogMode( GrFogMode_t mode ); - -void -_grFogColorValue( GrColor_t fogcolor ); - -void -_grLfbWriteColorFormat(GrColorFormat_t colorFormat); - -void -_grLfbWriteColorSwizzle(FxBool swizzleBytes, FxBool swapWords); - -void -_grConstantColorValue( GrColor_t value ); - -#endif - -#ifdef GLIDE3 /* glide 3 m point, m aa point, m line, m aa line routine */ - -void FX_CSTYLE -_grDrawPoints(FxI32 mode, FxI32 count, void *pointers); - -void FX_CSTYLE -_grDrawLineStrip(FxI32 mode, FxI32 count, FxI32 ltype, void *pointers); - -void FX_CSTYLE -_grDrawTriangles(FxI32 mode, FxI32 count, void *pointers); - -void FX_CSTYLE -_grAADrawPoints(FxI32 mode, FxI32 count, void *pointers); - -void FX_CSTYLE -_grAADrawLineStrip(FxI32 mode, FxI32 ltype, FxI32 count, void *pointers); - -void FX_CSTYLE -_grAADrawLines(FxI32 mode, FxI32 count, void *pointers); - -void FX_CSTYLE -_grAADrawTriangles(FxI32 mode, FxI32 ttype, FxI32 count, void *pointers); - -void FX_CSTYLE -_grAAVpDrawTriangles(FxI32 mode, FxI32 ttype, FxI32 count, void *pointers); - -void FX_CSTYLE -_grAADrawVertexList(FxU32 type, FxI32 mode, FxI32 count, void *pointers); - -#endif - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -void FX_CSTYLE -_guTexMemReset(void); - -int FX_CSTYLE -_grBufferNumPending(void); - -FxBool FX_CSTYLE -_grSstIsBusy(void); - -void FX_CSTYLE -_grSstResetPerfStats(void); - -void FX_CSTYLE -_grResetTriStats(void); - -FxU32 FX_CSTYLE -_grSstStatus(void); - -FxU32 FX_CSTYLE -_grSstVideoLine(void); - -FxBool FX_CSTYLE -_grSstVRetraceOn(void); - -#endif - -#endif /* FX_GLIDE_NO_FUNC_PROTO */ - -/*==========================================================================*/ -/* -** Function Prototypes -*/ -void -_grClipNormalizeAndGenerateRegValues(FxU32 minx, FxU32 miny, FxU32 maxx, - FxU32 maxy, FxU32 *clipLeftRight, - FxU32 *clipBottomTop); - -void -_grSwizzleColor(GrColor_t *color); - -void -_grDisplayStats(void); - -void -_GlideInitEnvironment(void); - -void FX_CSTYLE -_grColorCombineDelta0Mode(FxBool delta0Mode); - -void -_doGrErrorCallback(const char *name, const char *msg, FxBool fatal); - -void _grErrorDefaultCallback(const char *s, FxBool fatal); - -#ifdef __WIN32__ -void _grErrorWindowsCallback(const char *s, FxBool fatal); -#endif /* __WIN32__ */ - -extern void -(*GrErrorCallback)(const char *string, FxBool fatal); - -void GR_CDECL -_grFence(void); - -int -_guHeapCheck(void); - -void FX_CSTYLE -_grRebuildDataList(void); - -void -_grReCacheFifo(FxI32 n); - -FxI32 GR_CDECL -_grSpinFifo(FxI32 n); - -void -_grShamelessPlug(void); - -FxBool -_grSstDetectResources(void); - -FxU16 -_grTexFloatLODToFixedLOD(float value); - -void FX_CSTYLE -_grTexDetailControl(GrChipID_t tmu, FxU32 detail); - -void FX_CSTYLE -_grTexDownloadNccTable(GrChipID_t tmu, FxU32 which, - const GuNccTable *ncc_table, - int start, int end); - -void FX_CSTYLE -_grTexDownloadPalette(GrChipID_t tmu, - GuTexPalette *pal, - int start, int end); - -FxU32 -_grTexCalcBaseAddress(FxU32 start_address, GrLOD_t largeLod, - GrAspectRatio_t aspect, GrTextureFormat_t fmt, - FxU32 odd_even_mask); - -void -_grTexForceLod(GrChipID_t tmu, int value); - -FxU32 -_grTexTextureMemRequired(GrLOD_t small_lod, GrLOD_t large_lod, - GrAspectRatio_t aspect, GrTextureFormat_t format, - FxU32 evenOdd, - FxBool roundP); -void FX_CSTYLE -_grUpdateParamIndex(void); - -/* ddgump.c */ -void FX_CSTYLE -_gumpTexCombineFunction(int virtual_tmu); - -/* disst.c - this is an un-documented external for arcade developers */ -extern FX_ENTRY void FX_CALL -grSstVidMode(FxU32 whichSst, FxVideoTimingInfo* vidTimings); - -/* glfb.c */ -extern FxBool -_grLfbWriteRegion(FxBool pixPipelineP, - GrBuffer_t dst_buffer, FxU32 dst_x, FxU32 dst_y, - GrLfbSrcFmt_t src_format, - FxU32 src_width, FxU32 src_height, - FxI32 src_stride, - const void *src_data); - -/* gglide.c - Flushes the current state in gc->state.fbi_config to the hw. - */ -extern void -_grFlushCommonStateRegs(void); - -#if USE_PACKET_FIFO -/* cvg.c */ -extern void -_grSet32(volatile FxU32* const sstAddr, const FxU32 val); - -extern FxU32 -_grGet32(volatile FxU32* const sstAddr); -#endif /* USE_PACKET_FIFO */ - -/*==========================================================================*/ -/* GMT: have to figure out when to include this and when not to -*/ -#if defined(GLIDE_DEBUG) || defined(GLIDE_ASSERT) || defined(GLIDE_SANITY_ASSERT) || defined(GLIDE_SANITY_SIZE) - #define DEBUG_MODE 1 - #include -#endif - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) || (GLIDE_PLATFORM & GLIDE_HW_H3) - -#if ASSERT_FAULT -#define ASSERT_FAULT_IMMED(__x) if (!(__x)) { \ - *(FxU32*)NULL = 0; \ - _grAssert(#__x, __FILE__, __LINE__); \ - } -#else -#define ASSERT_FAULT_IMMED(__x) GR_ASSERT(__x) -#endif - -#if !USE_PACKET_FIFO -/* NOTE: fifoFree is the number of entries, each is 8 bytes */ -#define GR_CHECK_FOR_ROOM(n,p) \ -{ \ - FxI32 fifoFree = gc->state.fifoFree - (n); \ - if (fifoFree < 0) \ - fifoFree = _grSpinFifo(n); \ - gc->state.fifoFree = fifoFree;\ -} -#elif USE_PACKET_FIFO -/* Stuff to manage the command fifo on cvg - * - * NB: All of the addresses are in 'virtual' address space, and the - * sizes are in bytes. - */ - -/* The Voodoo^2 fifo is 4 byte aligned */ -#define FIFO_ALIGN_MASK 0x03 - -/* We claim space at the end of the fifo for: - * 1 nop (2 32-bit words) - * 1 jmp (1 32-bit word) - * 1 pad word - */ -#define FIFO_END_ADJUST (sizeof(FxU32) << 2) - -/* NB: This should be used sparingly because it does a 'real' hw read - * which is *SLOW*. - * - * NB: This address is always in sli master relative coordinates. - */ -FxU32 _grHwFifoPtr(FxBool); -#define HW_FIFO_PTR(a) _grHwFifoPtr(a) - -#if FIFO_ASSERT_FULL -extern const FxU32 kFifoCheckMask; -extern FxU32 gFifoCheckCount; - -#define FIFO_ASSERT() \ -if ((gFifoCheckCount++ & kFifoCheckMask) == 0) { \ - const FxU32 cmdFifoDepth = GR_GET(((SstRegs*)(gc->reg_ptr))->cmdFifoDepth); \ - const FxU32 maxFifoDepth = ((gc->cmdTransportInfo.fifoSize - FIFO_END_ADJUST) >> 2); \ - if(cmdFifoDepth > maxFifoDepth) { \ - gdbg_printf("cmdFifoDepth > size: 0x%X : 0x%X\n", \ - cmdFifoDepth, maxFifoDepth); \ - ASSERT_FAULT_IMMED(cmdFifoDepth <= maxFifoDepth); \ - } else if (cmdFifoDepth + (gc->cmdTransportInfo.fifoRoom >> 2) > maxFifoDepth) { \ - gdbg_printf("cmdFifoDepth + fifoRoom > size: (0x%X : 0x%X) : 0x%X\n", \ - cmdFifoDepth, (gc->cmdTransportInfo.fifoRoom >> 2), maxFifoDepth); \ - ASSERT_FAULT_IMMED(cmdFifoDepth + (gc->cmdTransportInfo.fifoRoom >> 2) <= maxFifoDepth); \ - } \ -} \ -ASSERT_FAULT_IMMED(HW_FIFO_PTR(FXTRUE) >= (FxU32)gc->cmdTransportInfo.fifoStart); \ -ASSERT_FAULT_IMMED(HW_FIFO_PTR(FXTRUE) < (FxU32)gc->cmdTransportInfo.fifoEnd); \ -ASSERT_FAULT_IMMED((FxU32)gc->cmdTransportInfo.fifoRoom < gc->cmdTransportInfo.fifoSize); \ -ASSERT_FAULT_IMMED((FxU32)gc->cmdTransportInfo.fifoPtr < (FxU32)gc->cmdTransportInfo.fifoEnd) -#else /* !FIFO_ASSERT_FULL */ -#define FIFO_ASSERT() \ -ASSERT_FAULT_IMMED((FxU32)gc->cmdTransportInfo.fifoRoom < gc->cmdTransportInfo.fifoSize); \ -ASSERT_FAULT_IMMED((FxU32)gc->cmdTransportInfo.fifoPtr < (FxU32)gc->cmdTransportInfo.fifoEnd) -#endif /* !FIFO_ASSERT_FULL */ - -void GR_CDECL -_FifoMakeRoom(const FxI32 blockSize, const char* fName, const int fLine); - -#if defined( TACO_MEMORY_FIFO_HACK ) -extern void _FifoFlush( void ); -#endif - -#ifndef GLIDE_DEBUG -#define GR_BUMP_N_GRIND \ -do { \ - P6FENCE; \ - GR_CAGP_SET(bump, gc->cmdTransportInfo.fifoPtr - gc->cmdTransportInfo.lastBump); \ - gc->cmdTransportInfo.lastBump = gc->cmdTransportInfo.fifoPtr; \ - gc->cmdTransportInfo.bumpPos = gc->cmdTransportInfo.fifoPtr + (gc->cmdTransportInfo.bumpSize); \ - if (gc->cmdTransportInfo.bumpPos > gc->cmdTransportInfo.fifoEnd) \ - gc->cmdTransportInfo.bumpPos = gc->cmdTransportInfo.fifoEnd; \ -} while(0) -#else -/* fifo.c */ -void _grBumpNGrind(void); -#define GR_BUMP_N_GRIND _grBumpNGrind() -#endif - -#define CHECK_FOR_BUMP(__writeSize) \ -if (!gc->cmdTransportInfo.autoBump && \ - ((gc->cmdTransportInfo.fifoPtr + __writeSize) > gc->cmdTransportInfo.bumpPos)) \ - GR_BUMP_N_GRIND; - -#define GR_CHECK_FOR_ROOM(__n, __p) \ -do { \ - const FxU32 writeSize = (__n) + ((__p) * sizeof(FxU32)); /* Adjust for size of hdrs */ \ - ASSERT(((FxU32)(gc->cmdTransportInfo.fifoPtr) & FIFO_ALIGN_MASK) == 0); /* alignment */ \ - ASSERT(writeSize < gc->cmdTransportInfo.fifoSize - sizeof(FxU32)); \ - /* CHECK_FOR_BUMP(writeSize); */ /* now done in _FifoMakeRoom */ \ - FIFO_ASSERT(); \ - if (gc->cmdTransportInfo.fifoRoom < (FxI32)writeSize) { \ - GDBG_INFO(280, "Fifo Addr Check: (0x%X : 0x%X)\n", \ - gc->cmdTransportInfo.fifoRoom, writeSize); \ - _FifoMakeRoom(writeSize, __FILE__, __LINE__); \ - } \ - ASSERT((FxU32)gc->cmdTransportInfo.fifoRoom >= writeSize); \ - FIFO_ASSERT(); \ -} while(0) -#else -#error "GR_CHECK_FOR_ROOM not defined" -#endif - -#elif (GLIDE_PLATFORM & GLIDE_HW_H3) - -#define GR_CHECK_FOR_ROOM(__n, __p) - -#endif /* GLIDE_PLATFORM & GLIDE_HW_?? */ - -#ifdef GLIDE_SANITY_SIZE -#if USE_PACKET_FIFO -#define GR_CHECK_FIFO_PTR() \ -if (gc->cmdTransportInfo.autoBump) {\ - if((FxU32)gc->cmdTransportInfo.fifoPtr != gc->checkPtr + gc->checkCounter)\ - GDBG_ERROR("GR_ASSERT_FIFO", "(%s : %d) : " \ - "fifoPtr should be 0x%X (0x%X : 0x%X) but is 0x%X\n", \ - __FILE__, __LINE__, gc->checkPtr + gc->checkCounter, \ - gc->checkPtr, gc->checkCounter, gc->cmdTransportInfo.fifoPtr);\ - ASSERT_FAULT_IMMED((FxU32)gc->cmdTransportInfo.fifoPtr == gc->checkPtr + gc->checkCounter);\ -} - -#define GR_SET_FIFO_PTR(__n, __p) \ - gc->checkPtr = (FxU32)gc->cmdTransportInfo.fifoPtr; \ - gc->checkCounter = ((__n) + ((__p) << 2)) -#else -#define GR_CHECK_FIFO_PTR() -#define GR_SET_FIFO_PTR(__n, __p) -#endif - -# define GR_CHECK_SIZE() \ - if(gc->counter != gc->expected_counter) \ - GDBG_ERROR("GR_ASSERT_SIZE","byte counter should be %d but is %d\n", \ - gc->expected_counter,gc->counter); \ - GR_CHECK_FIFO_PTR(); \ - gc->checkPtr = (FxU32)gc->cmdTransportInfo.fifoPtr; \ - gc->checkCounter = 0; \ - ASSERT(gc->counter == gc->expected_counter); \ - gc->counter = gc->expected_counter = 0 - -# define GR_CHECK_SIZE_DIRECT() \ - if(gc->counter != gc->expected_counter) \ - GDBG_ERROR("GR_ASSERT_SIZE","byte counter should be %d but is %d\n", \ - gc->expected_counter,gc->counter); \ - gc->checkCounter = 0; \ - ASSERT(gc->counter == gc->expected_counter); \ - gc->counter = gc->expected_counter = 0 - - - -# define GR_SET_EXPECTED_SIZE(n,p) \ - ASSERT(gc->counter == 0); \ - ASSERT(gc->expected_counter == 0); \ - GR_CHECK_FOR_ROOM(n,p); \ - gc->expected_counter = n; \ - GR_SET_FIFO_PTR(n, p) - -# define GR_INC_SIZE(n) gc->counter += n -#else - /* define to do nothing */ -# define GR_CHECK_SIZE() -# define GR_CHECK_SIZE_DIRECT() -# define GR_SET_EXPECTED_SIZE(n,p) GR_CHECK_FOR_ROOM(n,p) -# define GR_INC_SIZE(n) -#endif - -#define GR_DCL_GC GrGC *gc = _GlideRoot.curGC -#if GLIDE_INIT_HAL -#define GR_DCL_HW SstRegs *hw = (SstRegs *)gc->sstRegs -#else -#define GR_DCL_HW SstRegs *hw = (SstRegs *)gc->sstRegs -#endif -#ifdef DEBUG_MODE -#define ASSERT(exp) GR_ASSERT(exp) - -#define GR_BEGIN_NOFIFOCHECK(name,level) \ - GR_DCL_GC; \ - GR_DCL_HW; \ - const FxI32 saveLevel = gc->myLevel; \ - static char myName[] = name; \ - GR_ASSERT(gc != NULL); \ - GR_ASSERT(hw != NULL); \ - gc->myLevel = level; \ - gc->checkPtr = (FxU32)gc->cmdTransportInfo.fifoPtr; \ - GDBG_INFO(gc->myLevel,myName); \ - FXUNUSED(saveLevel); \ - FXUNUSED(hw) -#define GR_TRACE_EXIT(__n) \ - gc->myLevel = saveLevel; \ - GDBG_INFO(281, "%s --done---------------------------------------\n", __n) -#define GR_TRACE_RETURN(__l, __n, __v) \ - gc->myLevel = saveLevel; \ - GDBG_INFO((__l), "%s() => 0x%x---------------------\n", (__n), (__v), (__v)) -#else /* !DEBUG_MODE */ -#define ASSERT(exp) -#define GR_BEGIN_NOFIFOCHECK(name,level) \ - GR_DCL_GC; \ - GR_DCL_HW; \ - FXUNUSED(hw) -#define GR_TRACE_EXIT(__n) -#define GR_TRACE_RETURN(__l, __n, __v) -#endif /* !DEBUG_MODE */ - -#define GR_BEGIN(name,level,size, packetNum) \ - GR_BEGIN_NOFIFOCHECK(name,level); \ - GR_SET_EXPECTED_SIZE(size, packetNum) - -#define GR_END() {GR_CHECK_SIZE(); GR_TRACE_EXIT(myName);} - -#define GR_RETURN(val) \ - if (GDBG_GET_DEBUGLEVEL(gc->myLevel)) { \ - GR_CHECK_SIZE(); \ - } \ - else \ - GR_END(); \ - GR_TRACE_RETURN(gc->myLevel, myName, val); \ - return val - -#if defined(GLIDE_SANITY_ASSERT) -#define GR_ASSERT(exp) ((void)((!(exp)) ? (_grAssert(#exp, __FILE__, __LINE__),0) : 0xFFFFFFFF)) -#else -#define GR_ASSERT(exp) ((void)(0 && ((FxU32)(exp)))) -#endif - -#define INTERNAL_CHECK(__name, __cond, __msg, __fatalP) \ - if (__cond) _doGrErrorCallback(__name, __msg, __fatalP) - -#if defined(GLIDE_DEBUG) -#define GR_CHECK_F(name,condition,msg) INTERNAL_CHECK(name, condition, msg, FXTRUE) -#define GR_CHECK_W(name,condition,msg) INTERNAL_CHECK(name, condition, msg, FXFALSE) -#else -#define GR_CHECK_F(name,condition,msg) -#define GR_CHECK_W(name,condition,msg) -#endif - -#if GLIDE_CHECK_COMPATABILITY -#define GR_CHECK_COMPATABILITY(__name, __cond, __msg) INTERNAL_CHECK(__name, __cond, __msg, FXTRUE) -#else -#define GR_CHECK_COMPATABILITY(__name, __cond, __msg) GR_CHECK_F(__name, __cond, __msg) -#endif /* !GLIDE_CHECK_COMPATABILITY */ - -/* macro define some basic and common GLIDE debug checks */ -#define GR_CHECK_TMU(name,tmu) \ - GR_CHECK_COMPATABILITY(name, tmu < GR_TMU0 || tmu >= gc->num_tmu , "invalid TMU specified") - -void -_grAssert(char *, char *, int); - -#if USE_PACKET_FIFO -#ifdef GDBG_INFO_ON -void _grFifoWriteDebug(FxU32 addr, FxU32 val, FxU32 fifoPtr); -#define DEBUGFIFOWRITE(a,b,c) \ -_grFifoWriteDebug((FxU32) a, (FxU32) b, (FxU32) c) -void _grFifoFWriteDebug(FxU32 addr, float val, FxU32 fifoPtr); -#define DEBUGFIFOFWRITE(a,b,c) \ -_grFifoFWriteDebug((FxU32) a, (float) b, (FxU32) c) -#else /* ~GDBG_INFO_ON */ -#define DEBUGFIFOWRITE(a,b,c) -#define DEBUGFIFOFWRITE(a,b,c) -#endif /* !GDBG_INFO_ON */ -#endif /* USE_PACKET_FIFO */ - -/* HW Setting macros. We redefine the default macros to: - * - add extra tracing - * - work around hw bugs - * - do platform specific whacky things. - */ -# if SET_BSWAP -# undef GET -# undef GET16 -# undef SET -# undef SET16 -# undef SETF - -# if __POWERPC__ && defined(__MWERKS__) -# define GET(s) __lwbrx( (void*)&(s), 0 ) -# define GET16(s) __lwbrx( (void*)&(s), 0 ) -# define SET(d, s) __stwbrx((s), (void*)&(d), 0) -# define SET16(d, s) __sthbrx((s), (void*)&(d), 0 ) -# define SETF(d, s) { \ - const float temp = (s); \ - __stwbrx( *((FxU32*)&temp), (void*)&(d), 0 ); \ - } -# define SET_LINEAR(d, s) SET((d), (s)) -# define SET_LINEAR_16(d, s) SET((d), ((((FxU32)(s)) >> 16UL) | \ - (((FxU32)(s)) << 16UL))) -# define SET_LINEAR_8(d, s) ((d) = (s)) -# else /* !defined(__MWERKS__) && POWERPC */ -# error "Define byte swapped macros for GET/SET" -# endif /* !defined(__MWERKS__) && POWERPC */ -# else /* !SET_BSWAP */ -# undef GET -# undef GET16 - -# define GET(s) s -# define GET16(s) s -# endif /* !SET_BSWAP */ - - -#if GLIDE_USE_DEBUG_FIFO -#define kDebugFifoSize 0x1000UL -#endif /* GLIDE_USE_DEBUG_FIFO */ - -#ifndef SET_LINEAR -#define SET_LINEAR(__addr, __val) SET(__addr, __val) -#define SET_LINEAR_16(__addr, __val) SET(__addr, __val) -#define SET_LINEAR_8(__addr, __val) SET(__addr, __val) -#endif /* !defined(SET_LINEAR) */ - -/* Extract the fp exponent from a floating point value. - * NB: The value passed to this macro must be convertable - * into an l-value. - */ -#define kFPExpMask 0x7F800000UL -#define kFPZeroMask 0x80000000UL -#define kFPExpShift 0x17UL -#define FP_FLOAT_EXP(__fpVal) ((FxU32)(((*(const FxU32*)(&(__fpVal))) & kFPExpMask) >> kFPExpShift)) -#define FP_FLOAT_ZERO(__fpVal) (((*(const FxU32*)(&(__fpVal))) & ~kFPZeroMask) == 0x00) - -/* The two most commonly defined macros in the known universe */ -#define MIN(__x, __y) (((__x) < (__y)) ? (__x) : (__y)) -#define MAX(__x, __y) (((__x) < (__y)) ? (__y) : (__x)) - -/* Simple macro to make selecting a value against a boolean flag - * simpler w/o a conditional. - * - * NB: This requires that the boolean value being passed in be the - * result of one of the standard relational operators. - */ -#define MaskSelect(__b, __val) (~(((FxU32)(__b)) - 1UL) & (__val)) - -/* Chipfield ids that glide uses. */ -#define kChipFieldShift (8UL + 3UL) -typedef enum { - eChipBroadcast = 0x00UL, - eChipFBI = 0x01UL, - eChipTMU0 = 0x02UL, - eChipTMU1 = 0x04UL, - eChipTMU2 = 0x08UL, - eChipAltBroadcast = 0x0FUL, -} FifoChipField; - -#define BROADCAST_ID eChipBroadcast - -#define WAX_ID FX_BIT(14) - -/* Although these are named reg_group_xxx they are generic options for - * grouping register writes and should be fine w/ and w/o the fifo - * being enabled. - */ -#if GDBG_INFO_ON -#define REG_GROUP_DCL(__regMask, __regBase, __groupNum, __checkP) \ -const FxBool _checkP = (__checkP); \ -const FxU32 _groupNum = (__groupNum);\ -const FxU32 _regMask = (__regMask); \ -FxU32 _regCheckMask = (__regMask); \ -FxU32 _regBase = offsetof(SstRegs, __regBase) - -#define REG_GROUP_DCL_WAX(__regMask, __regBase, __groupNum, __checkP) \ -const FxBool _checkP = (__checkP); \ -const FxU32 _groupNum = (__groupNum);\ -const FxU32 _regMask = (__regMask); \ -FxU32 _regCheckMask = (__regMask); \ -FxU32 _regBase = offsetof(SstGRegs, __regBase) - - -#define REG_GROUP_ASSERT(__regAddr, __val, __floatP) \ -{ \ - const FxU32 curRegAddr = offsetof(SstRegs, __regAddr); \ - const FxU32 curRegIndex = (curRegAddr - _regBase) >> 2; \ - const FxU32 curRegBit = (0x01UL << curRegIndex); \ - const float floatVal = (const float)(__val); \ - GDBG_INFO(gc->myLevel + 200, "\t(0x%X : 0x%X) : 0x%X\n", \ - curRegIndex, curRegAddr, *(const FxU32*)&floatVal); \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - !gc->open, \ - "Called before grSstWinOpen()"); \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - (gc->cmdTransportInfo.lfbLockCount != 0), \ - "Called within grLfbLock/grLfbUnlockPair"); \ - GR_ASSERT((_regMask & curRegBit) == curRegBit); /* reg allocated in mask */ \ - if (curRegIndex > 0) \ - GR_ASSERT(((0xFFFFFFFFUL >> (32 - curRegIndex)) & _regCheckMask) == 0x00); /* All previous regs done */ \ - _regCheckMask ^= curRegBit; /* Mark current reg */ \ -} - -#define REG_GROUP_ASSERT_WAX(__regAddr, __val, __floatP) \ -{ \ - const FxU32 curRegAddr = offsetof(SstGRegs, __regAddr); \ - const FxU32 curRegIndex = (curRegAddr - _regBase) >> 2; \ - const FxU32 curRegBit = (0x01UL << curRegIndex); \ - const float floatVal = (const float)(__val); \ - GDBG_INFO(220, "\t(0x%X : 0x%X) : 0x%X\n", \ - curRegIndex, curRegAddr, *(const FxU32*)&floatVal); \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - !gc->open, \ - "Called before grSstWinOpen()"); \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - (gc->cmdTransportInfo.lfbLockCount != 0), \ - "Called within grLfbLock/grLfbUnlockPair"); \ - GR_ASSERT((_regMask & curRegBit) == curRegBit); /* reg allocated in mask */ \ - if (curRegIndex > 0) \ - GR_ASSERT(((0xFFFFFFFFUL >> (32 - curRegIndex)) & _regCheckMask) == 0x00); /* All previous regs done */ \ - _regCheckMask ^= curRegBit; /* Mark current reg */ \ -} - -#else /* !GDBG_INFO_ON */ -#define REG_GROUP_DCL(__regMask, __regBase, __groupNum, __checkP) -#define REG_GROUP_DCL_WAX(__regMask, __regBase, __groupNum, __checkP) -#define REG_GROUP_ASSERT(__regAddr, __val, __floatP) -#define REG_GROUP_ASSERT_WAX(__regAddr, __val, __floatP) -#endif /* !GDBG_INFO_ON */ - -#if GLIDE_HW_TRI_SETUP -enum { - kSetupStrip = 0x00, - kSetupFan = 0x01, - kSetupCullDisable = 0x00, - kSetupCullEnable = 0x02, - kSetupCullPositive = 0x00, - kSetupCullNegative = 0x04, - kSetupPingPongNorm = 0x00, - kSetupPingPongDisable = 0x08 -}; -#endif /* GLIDE_HW_TRI_SETUP */ - -#define REGNUM(__reg) (offsetof(SstRegs, __reg) >> 2) -#define REGNUM_WAX(_reg) (offsetof(SstGRegs, __reg) >> 2) - -#define PACKET_HEADER_ADD(__start, __reg, __header) \ -do {\ - GDBG_PRINTF("%x, %x\n", REGNUM(__reg), REGNUM(__start));\ - GR_ASSERT((REGNUM(__reg) - REGNUM(__start)) <= 14);\ - __header |= ((1 << (REGNUM(__reg) - REGNUM(__start))) << 15);\ -} while (0) - - -#if USE_PACKET_FIFO - -#define REGNUM(__reg) (offsetof(SstRegs, __reg) >> 2) -#define REGNUM_WAX(_reg) (offsetof(SstGRegs, __reg) >> 2) - -/* The shift below is a bit tricky. Watch out! */ -#define FIFO_REG(__chipField, __field) \ - (GR_ASSERT(((FxU32)(__chipField)) < 0x10UL), \ - ((((FxU32)offsetof(SstRegs, __field)) << 1) | (((FxU32)(__chipField)) << kChipFieldShift))) - -/* And here's the WAX version */ -/* The shift below is a bit tricky. Watch out! */ -#define FIFO_REG_WAX(__field) ((((FxU32)offsetof(SstGRegs, __field)) << 1) | FXBIT(14)) - -/* The REG_GROUP_XXX macros do writes to a monotonically increasing - * set of registers. There are three flavors of the macros w/ - * different restrictions etc. - * - * NB: Care must be taken to order the REG_GROUP_SET macro uses to - * match the actual register order, otherwise all hell breaks loose. - */ - -/* Write to __groupNum registers (max 14) starting at __regBase under - * the control of __groupMask (lsb->msb). - */ -#define REG_GROUP_BEGIN(__chipId, __regBase, __groupNum, __groupMask) \ -GR_ASSERT(((__groupNum) >= 1) && ((__groupNum) <= 21)); \ -GR_ASSERT(((__groupMask) & (SSTCP_PKT4_MASK >> SSTCP_PKT4_MASK_SHIFT)) != 0x00); \ -GR_SET_EXPECTED_SIZE(sizeof(FxU32) * (__groupNum), 1); \ -REG_GROUP_BEGIN_INTERNAL(__chipId, __regBase, __groupNum, \ - __groupMask, (((__groupMask) << SSTCP_PKT4_MASK_SHIFT) | \ - FIFO_REG(__chipId, __regBase) | \ - SSTCP_PKT4), \ - FXTRUE) - -#define REG_GROUP_BEGIN_WAX(__regBase, __groupNum, __groupMask) \ -GR_ASSERT(((__groupNum) >= 1) && ((__groupNum) <= 21)); \ -GR_ASSERT(((__groupMask) & (SSTCP_PKT4_MASK >> SSTCP_PKT4_MASK_SHIFT)) != 0x00); \ -GR_SET_EXPECTED_SIZE(sizeof(FxU32) * (__groupNum), 1); \ -REG_GROUP_BEGIN_INTERNAL_WAX(__regBase, __groupNum, __groupMask, \ -(((__groupMask) << SSTCP_PKT4_MASK_SHIFT) | FIFO_REG_WAX(__regBase) | \ -SSTCP_PKT4), FXTRUE) - -/* Same as the non-NO_CHECK variant, but GR_SET_EXPECTED_SIZE must - * have already been called to allocate space for this write. - */ -#define REG_GROUP_NO_CHECK_BEGIN(__chipId, __regBase, __groupNum, __groupMask) \ -GR_ASSERT(((__groupNum) >= 1) && ((__groupNum) <= 21)); \ -GR_ASSERT(((__groupMask) & (SSTCP_PKT4_MASK >> SSTCP_PKT4_MASK_SHIFT)) != 0x00); \ -GR_ASSERT(gc->expected_counter >= (FxI32)((__groupNum) * sizeof(FxU32))); \ -REG_GROUP_BEGIN_INTERNAL(__chipId, __regBase, __groupNum, \ - __groupMask, \ - (((__groupMask) << SSTCP_PKT4_MASK_SHIFT) | \ - FIFO_REG(__chipId, __regBase) | \ - SSTCP_PKT4), \ - FXFALSE) - -/* Register writes (<= 32) sequentially starting at __regBase */ -#define REG_GROUP_LONG_BEGIN(__chipId, __regBase, __groupNum) \ -GR_ASSERT(((__groupNum) >= 1) && ((__groupNum) <= 32)); \ -GR_SET_EXPECTED_SIZE(sizeof(FxU32) * (__groupNum), 1); \ -REG_GROUP_BEGIN_INTERNAL(__chipId, __regBase, __groupNum, \ - (0xFFFFFFFF >> (32 - (__groupNum))), \ - (((__groupNum) << SSTCP_PKT1_NWORDS_SHIFT) | \ - FIFO_REG(__chipId, __regBase) | \ - SSTCP_INC | \ - SSTCP_PKT1), \ - FXTRUE) - -#define GETREG(reg) (reg) - -#define REG_GROUP_BEGIN_INTERNAL(__chipId, __regBase, __groupNum, __groupMask, __pktHdr, __checkP) \ -{ \ - GR_DCL_GC; \ - volatile FxU32* _regGroupFifoPtr = gc->cmdTransportInfo.fifoPtr; \ - REG_GROUP_DCL(__groupMask, __regBase, __groupNum, __checkP); \ - GR_ASSERT(((__pktHdr) & 0xE0000000UL) == 0x00UL); \ - FIFO_ASSERT(); \ - GR_ASSERT(GETREG(gc->cRegs->cmdFifo0.readPtrL) >= gc->cmdTransportInfo.fifoOffset);\ - GR_ASSERT(GETREG(gc->cRegs->cmdFifo0.readPtrL) < (gc->cmdTransportInfo.fifoOffset + gc->cmdTransportInfo.fifoSize));\ - GDBG_INFO(120, "REG_GROUP_BEGIN:\n");\ - GDBG_INFO(120, "\tFile: %s Line %d\n", __FILE__, __LINE__);\ - GDBG_INFO(120, "\t_regGroupFifoPtr: 0x%x\n", (FxU32)_regGroupFifoPtr - (FxU32)gc->rawLfb);\ - GDBG_INFO(120, "\t__pktHdr: 0x%x\n", __pktHdr);\ - GDBG_INFO(120, "\t__groupNum: 0x%x\n", __groupNum);\ - GDBG_INFO(120, "\t__groupMask: 0x%x\n", (__groupMask));\ - GDBG_INFO(120, "\t__chipId: 0x%x\n", __chipId);\ - GDBG_INFO(120, "\t__regBase: 0x%x\n", offsetof(SstRegs, __regBase));\ - GDBG_INFO(120, "\tfifoPtr: 0x%x\n", (FxU32)gc->cmdTransportInfo.fifoPtr - (FxU32)gc->cmdTransportInfo.fifoStart - (FxU32)gc->rawLfb); \ - GDBG_INFO(120, "\tfifoRoom: 0x%x\n", gc->cmdTransportInfo.fifoRoom);\ - GDBG_INFO(120, "\treadPtrL: 0x%x\n", GETREG(gc->cRegs->cmdFifo0.readPtrL));\ - SET(*_regGroupFifoPtr++, (__pktHdr)) - -#define REG_GROUP_BEGIN_INTERNAL_WAX(__regBase, __groupNum, __groupMask, __pktHdr, __checkP) \ -{ \ - GR_DCL_GC; \ - volatile FxU32* _regGroupFifoPtr = gc->cmdTransportInfo.fifoPtr; \ - REG_GROUP_DCL_WAX(__groupMask, __regBase, __groupNum, __checkP); \ - GR_ASSERT(((__pktHdr) & 0xE0000000UL) == 0x00UL); \ - FIFO_ASSERT(); \ - GR_ASSERT(gc->cRegs->cmdFifo0.readPtrL >= gc->cmdTransportInfo.fifoOffset);\ - GR_ASSERT(gc->cRegs->cmdFifo0.readPtrL < (gc->cmdTransportInfo.fifoOffset + gc->cmdTransportInfo.fifoSize));\ - GDBG_INFO(220, "REG_GROUP_BEGIN_WAX:\n");\ - GDBG_INFO(220, "\tFile: %s Line %d\n", __FILE__, __LINE__);\ - GDBG_INFO(220, "\t_regGroupFifoPtr: 0x%x\n", (FxU32)_regGroupFifoPtr - (FxU32)gc->rawLfb);\ - GDBG_INFO(220, "\t__pktHdr: 0x%x\n", __pktHdr);\ - GDBG_INFO(220, "\t__groupNum: 0x%x\n", __groupNum);\ - GDBG_INFO(220, "\t__groupMask: 0x%x\n", (__groupMask));\ - GDBG_INFO(220, "\t__regBase: 0x%x\n", offsetof(SstGRegs, __regBase));\ - GDBG_INFO(220, "\tfifoPtr: 0x%x\n", (FxU32)gc->cmdTransportInfo.fifoPtr - (FxU32)gc->cmdTransportInfo.fifoStart - (FxU32)gc->rawLfb); \ - GDBG_INFO(220, "\tfifoRoom: 0x%x\n", gc->cmdTransportInfo.fifoRoom);\ - GDBG_INFO(220, "\treadPtrL: 0x%x\n", gc->cRegs->cmdFifo0.readPtrL);\ - GDBG_INFO(220, "\tStart Reg: 0x%x\n", (__pktHdr & 0x7fff) >> 3);\ - GDBG_INFO(220, "\tReg Mask: 0x%x\n", (__pktHdr >> 15) & 0x3fff);\ - GDBG_INFO(220, "\tReg Type: %s\n", ((__pktHdr >> 14) & 1) ? "2D" : "3D");\ - SET(*_regGroupFifoPtr++, (__pktHdr)) - - -#define REG_GROUP_SET(__regBase, __regAddr, __val) \ -do { \ - REG_GROUP_ASSERT(__regAddr, __val, FXFALSE); \ - FXUNUSED(__regBase); \ - GDBG_INFO(120, "fifoReadPtr(HW): 0x%x\n", GETREG(gc->cRegs->cmdFifo0.readPtrL));\ - GR_ASSERT(GETREG(gc->cRegs->cmdFifo0.readPtrL) >= gc->cmdTransportInfo.fifoOffset);\ - GR_ASSERT(GETREG(gc->cRegs->cmdFifo0.readPtrL) < (gc->cmdTransportInfo.fifoOffset + gc->cmdTransportInfo.fifoSize));\ - GDBG_INFO(120, "REG_GROUP_SET:\n");\ - GDBG_INFO(120, "\tFile: %s Line %d\n", __FILE__, __LINE__);\ - GDBG_INFO(120, "\tfifoPtr: 0x%x, Val: 0x%x\n", (FxU32) _regGroupFifoPtr - (FxU32)gc->rawLfb, __val);\ - SET(*_regGroupFifoPtr++, (__val)); \ - GR_INC_SIZE(sizeof(FxU32)); \ -} while(0) - -#define REG_GROUP_SET_WAX(__regBase, __regAddr, __val) \ -do { \ - REG_GROUP_ASSERT_WAX(__regAddr, __val, FXFALSE); \ - FXUNUSED(__regBase); \ - GDBG_INFO(220, "fifoReadPtr(HW): 0x%x\n", gc->cRegs->cmdFifo0.readPtrL);\ - GR_ASSERT(gc->cRegs->cmdFifo0.readPtrL >= gc->cmdTransportInfo.fifoOffset);\ - GR_ASSERT(gc->cRegs->cmdFifo0.readPtrL < (gc->cmdTransportInfo.fifoOffset + gc->cmdTransportInfo.fifoSize));\ - GDBG_INFO(220, "REG_GROUP_SET_WAX:\n");\ - GDBG_INFO(220, "\tFile: %s Line %d\n", __FILE__, __LINE__);\ - GDBG_INFO(220, "\tfifoPtr: 0x%x, Val: 0x%x\n", (FxU32) _regGroupFifoPtr - (FxU32)gc->rawLfb, __val);\ - SET(*_regGroupFifoPtr++, (__val)); \ - GR_INC_SIZE(sizeof(FxU32)); \ -} while(0) - -#define REG_GROUP_SETF(__regBase, __regAddr, __val) \ -do { \ - REG_GROUP_ASSERT(__regAddr, __val, FXTRUE); \ - FXUNUSED(__regBase); \ - SETF(*(FxFloat*)_regGroupFifoPtr++, (__val)); \ - GR_INC_SIZE(sizeof(FxFloat)); \ -} while(0) - -#if GLIDE_FP_CLAMP -#define REG_GROUP_SETF_CLAMP(__regBase, __regAddr, __val) \ -do { \ - const FxU32 fpClampVal = FP_FLOAT_CLAMP(__val); \ - REG_GROUP_ASSERT(__regAddr, fpClampVal, FXTRUE); \ - FXUNUSED(__regBase); \ - SETF(*(FxFloat*)_regGroupFifoPtr++, fpClampVal); \ - GR_INC_SIZE(sizeof(FxU32)); \ -} while(0) -#else -#define REG_GROUP_SETF_CLAMP(__regBase, __regAddr, __val) \ - REG_GROUP_SETF(__regBase, __regAddr, __val) -#endif - -#define REG_GROUP_NO_CHECK_END() \ - ASSERT(!_checkP); \ - ASSERT((((FxU32)_regGroupFifoPtr - (FxU32)gc->cmdTransportInfo.fifoPtr) >> 2) == _groupNum + 1); \ - gc->cmdTransportInfo.fifoRoom -= ((FxU32)_regGroupFifoPtr - (FxU32)gc->cmdTransportInfo.fifoPtr); \ - gc->cmdTransportInfo.fifoPtr = (FxU32*)_regGroupFifoPtr; \ - FIFO_ASSERT(); \ -} - -#define REG_GROUP_END() \ - ASSERT(_checkP); \ - ASSERT((((FxU32)_regGroupFifoPtr - (FxU32)gc->cmdTransportInfo.fifoPtr) >> 2) == _groupNum + 1); \ - gc->cmdTransportInfo.fifoRoom -= ((FxU32)_regGroupFifoPtr - (FxU32)gc->cmdTransportInfo.fifoPtr); \ - gc->cmdTransportInfo.fifoPtr = (FxU32*)_regGroupFifoPtr; \ - GDBG_INFO(gc->myLevel + 200, "\tGroupEnd: (0x%X : 0x%X) : (0x%X : 0x%X)\n", \ - _regGroupFifoPtr, gc->cmdTransportInfo.fifoRoom, \ - HW_FIFO_PTR(FXTRUE), gc->cmdTransportInfo.fifoPtr); \ - FIFO_ASSERT(); \ -} \ -GR_CHECK_SIZE() - - -#if !GLIDE_HW_TRI_SETUP || HOOPTI_TRI_SETUP_COMPARE -/* Send all of the triangle parameters in a single cmd fifo packet to - * the chip until the tsu is fixed. - */ -#define kNumTriParam 0x1FUL - -#define TRI_NO_TSU_BEGIN(__floatP) \ -GR_CHECK_COMPATABILITY(FN_NAME, \ - !gc->open, \ - "Called before grSstWinOpen()"); \ -GR_CHECK_COMPATABILITY(FN_NAME, \ - (gc->cmdTransportInfo.lfbLockCount != 0), \ - "Called within grLfbLock/grLfbUnlockPair"); \ -GR_SET_EXPECTED_SIZE(sizeof(FxU32) * kNumTriParam, 1); \ -{ \ - FxU32* noTsuFifoPtr = gc->cmdTransportInfo.fifoPtr; \ - volatile FxU32* regBaseAddr = &hw->FvA.x; \ - FIFO_ASSERT(); \ - GR_ASSERT(__floatP); \ - SET(*noTsuFifoPtr++, ((kNumTriParam << SSTCP_PKT1_NWORDS_SHIFT) | /* size (32bit words) */ \ - SSTCP_INC | /* sequential writes */ \ - FIFO_REG(BROADCAST_ID, FvA.x) | /* chip[14:10] num[9:3] */ \ - SSTCP_PKT1)); /* type (1) */ \ - GDBG_INFO(gc->myLevel, "TRI_NO_TSU_BEGIN: (fbiRegs->%svA : 0x%X)\n", \ - ((__floatP) ? "F" : ""), (FxU32)noTsuFifoPtr) - -#define TRI_NO_TSU_SET(__addr, __val) \ -do { \ - const FxU32 hwWriteAddr = (FxU32)(__addr); \ - ASSERT(hwWriteAddr == (FxU32)regBaseAddr); \ - SET(*noTsuFifoPtr++, (__val)); \ - GR_INC_SIZE(sizeof(FxU32)); \ - regBaseAddr++; \ -} while(0) - -#define TRI_NO_TSU_SETF(__addr, __val) \ -do { \ - const FxU32 hwWriteAddr = (FxU32)(__addr); \ - const FxFloat hwFloatVal = __val; \ - ASSERT(hwWriteAddr == (FxU32)regBaseAddr); \ - GDBG_INFO(gc->myLevel + 200, FN_NAME": FloatVal 0x%X : (0x%X : %g)\n", \ - ((FxU32)hwWriteAddr - (FxU32)hw) >> 2, \ - *(const FxU32*)&hwFloatVal, hwFloatVal); \ - SETF(*noTsuFifoPtr++, hwFloatVal); \ - GR_INC_SIZE(sizeof(FxU32)); \ - regBaseAddr++; \ -} while(0) - -#define TRI_NO_TSU_END() \ - gc->cmdTransportInfo.fifoRoom -= ((FxU32)noTsuFifoPtr - \ - (FxU32)gc->cmdTransportInfo.fifoPtr); \ - gc->cmdTransportInfo.fifoPtr = noTsuFifoPtr; \ - FIFO_ASSERT(); \ -} -#endif /* !GLIDE_HW_TRI_SETUP || HOOPTI_TRI_SETUP_COMPARE */ - -#define STORE_FIFO(__chipId, __base, __field, __val) \ -do { \ - FxU32* curFifoPtr = gc->cmdTransportInfo.fifoPtr; \ - FXUNUSED(__base); \ - GR_ASSERT(((FxU32)(curFifoPtr) & FIFO_ALIGN_MASK) == 0); /* alignment */ \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - !gc->open, \ - "Called before grSstWinOpen()"); \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - (gc->cmdTransportInfo.lfbLockCount != 0), \ - "Called within grLfbLock/grLfbUnlockPair"); \ - DEBUGFIFOWRITE(&((SstRegs*)(__base))->__field, __val, curFifoPtr); \ - SET(*curFifoPtr++, ((0x01 << SSTCP_PKT1_NWORDS_SHIFT) | /* size (32bit words) */ \ - FIFO_REG(__chipId, __field) | /* chip[14:10] num[9:3] */ \ - SSTCP_PKT1)); /* type (1) */ \ - SET(*curFifoPtr++, __val); \ - gc->cmdTransportInfo.fifoPtr += 2; \ - gc->cmdTransportInfo.fifoRoom -= (sizeof(FxU32) << 1); \ - FIFO_ASSERT(); \ - GR_INC_SIZE(sizeof(FxU32)); /* Size of actual write not including header */ \ -} while(0) - -#define STORE_FIFO_WAX(__chipId, __base, __field, __val) \ -do { \ - FxU32* curFifoPtr = gc->cmdTransportInfo.fifoPtr; \ - FXUNUSED(__base); \ - GR_ASSERT(((FxU32)(curFifoPtr) & FIFO_ALIGN_MASK) == 0); /* alignment */ \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - !gc->open, \ - "Called before grSstWinOpen()"); \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - (gc->cmdTransportInfo.lfbLockCount != 0), \ - "Called within grLfbLock/grLfbUnlockPair"); \ - DEBUGFIFOWRITE(&((SstGRegs*)(__base))->__field, __val, curFifoPtr); \ - SET(*curFifoPtr++,\ - ((0x01 << SSTCP_PKT1_NWORDS_SHIFT) | /* size (32bit words) */ \ - FIFO_REG_WAX(__field) | /* chip[14:10] num[9:3] */ \ - SSTCP_PKT1 | FXBIT(14))); /* type (1) */ \ - SET(*curFifoPtr++, __val); \ - gc->cmdTransportInfo.fifoPtr += 2; \ - gc->cmdTransportInfo.fifoRoom -= (sizeof(FxU32) << 1); \ - FIFO_ASSERT(); \ - GR_INC_SIZE(sizeof(FxU32)); /* Size of actual write not including header */ \ -} while(0) - - -#define STORE_FIFO_INDEX(__chipId, __base, __regIndex, __val) \ -do { \ - FxU32* curFifoPtr = gc->cmdTransportInfo.fifoPtr; \ - FXUNUSED(__base); \ - GR_ASSERT(((FxU32)(curFifoPtr) & FIFO_ALIGN_MASK) == 0); /* alignment */ \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - !gc->open, \ - "Called before grSstWinOpen()"); \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - (gc->cmdTransportInfo.lfbLockCount != 0), \ - "Called within grLfbLock/grLfbUnlockPair"); \ - DEBUGFIFOWRITE(&((FxU32*)(__base))[__regIndex], __val, curFifoPtr); \ - SET(*curFifoPtr++, ((0x01 << SSTCP_PKT1_NWORDS_SHIFT) | /* size (32bit words) */ \ - ((__chipId) << kChipFieldShift) | /* chip[14:10] */ \ - ((__regIndex) << 3) | /* Reg Num[9:3] */ \ - SSTCP_PKT1)); /* type (1) */ \ - SET(*curFifoPtr++, __val); \ - gc->cmdTransportInfo.fifoPtr += 2; \ - gc->cmdTransportInfo.fifoRoom -= (sizeof(FxU32) << 1); \ - FIFO_ASSERT(); \ - GR_INC_SIZE(sizeof(FxU32)); /* Size of actual write not including header */ \ -} while(0) - -#define STOREF_FIFO_INDEX(__chipId, __base, __regIndex, __val) \ -do { \ - FxU32* curFifoPtr = gc->cmdTransportInfo.fifoPtr; \ - FXUNUSED(__base); \ - GR_ASSERT(((FxU32)(curFifoPtr) & FIFO_ALIGN_MASK) == 0); /* alignment */ \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - !gc->open, \ - "Called before grSstWinOpen()"); \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - (gc->cmdTransportInfo.lfbLockCount != 0), \ - "Called within grLfbLock/grLfbUnlockPair"); \ - DEBUGFIFOFWRITE(&((FxU32*)(__base))[__regIndex], __val, curFifoPtr); \ - SET(*curFifoPtr++, ((0x01 << SSTCP_PKT1_NWORDS_SHIFT) | /* size (32bit words) */ \ - ((__chipId) << kChipFieldShift) | /* chip[14:10] */ \ - ((__regIndex) << 3) | /* Reg Num[9:3] */ \ - SSTCP_PKT1)); /* type (1) */ \ - SETF(*curFifoPtr++, __val); \ - gc->cmdTransportInfo.fifoPtr += 2; \ - gc->cmdTransportInfo.fifoRoom -= (sizeof(FxU32) << 1); \ - FIFO_ASSERT(); \ - GR_INC_SIZE(sizeof(FxU32)); /* Size of actual write not including header */ \ -} while(0) - -#define STORE16_FIFO(__chipId, __base, __field, __val) \ -do { \ - FxU32* curFifoPtr = gc->cmdTransportInfo.fifoPtr; \ - const FxU32 temp32 = (((FxU32)(__val)) & 0x0000FFFF); \ - FXUNUSED(__base); \ - ASSERT(((FxU32)(curFifoPtr) & FIFO_ALIGN_MASK) == 0); /* alignment */ \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - !gc->open, \ - "Called before grSstWinOpen()"); \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - (gc->cmdTransportInfo.lfbLockCount != 0), \ - "Called within grLfbLock/grLfbUnlockPair"); \ - DEBUGFIFOWRITE(&((SstRegs*)(__base))->__field, __val, curFifoPtr); \ - SET(*curFifoPtr++, ((0x01 << SSTCP_PKT1_NWORDS_SHIFT) | /* size (32bit words) */ \ - FIFO_REG(__chipId, __field) | /* chip[14:10] num[9:3] */ \ - SSTCP_PKT1)); /* type (1) */ \ - SET(*curFifoPtr++, temp32); \ - gc->cmdTransportInfo.fifoPtr += 2; \ - gc->cmdTransportInfo.fifoRoom -= (sizeof(FxU32) << 1); \ - FIFO_ASSERT(); \ - GR_INC_SIZE(sizeof(FxU32)); /* Size of actual write not including header */ \ -} while(0) - -#define STOREF_FIFO(__chipId, __base, __field, __val) \ -do { \ - FxU32* curFifoPtr = gc->cmdTransportInfo.fifoPtr; \ - FXUNUSED(__base); \ - ASSERT(((FxU32)(curFifoPtr) & FIFO_ALIGN_MASK) == 0); /* alignment */ \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - !gc->open, \ - "Called before grSstWinOpen()"); \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - (gc->cmdTransportInfo.lfbLockCount != 0), \ - "Called within grLfbLock/grLfbUnlockPair"); \ - DEBUGFIFOFWRITE(&((SstRegs*)(__base))->__field, __val, curFifoPtr); \ - SET(*curFifoPtr++, ((0x01 << SSTCP_PKT1_NWORDS_SHIFT) | /* size (32bit words) */ \ - FIFO_REG(__chipId, __field) | /* chip[14:10] num[9:3] */ \ - SSTCP_PKT1)); /* type (1) */ \ - SETF(*(FxFloat*)curFifoPtr, __val); \ - curFifoPtr++; \ - gc->cmdTransportInfo.fifoPtr += 2; \ - gc->cmdTransportInfo.fifoRoom -= (sizeof(FxU32) << 1); \ - FIFO_ASSERT(); \ - GR_INC_SIZE(sizeof(FxU32)); /* Size of actual write not including header */ \ -} while(0) - -/* There are now three different flavors of the packet 3 macros for - * your coding pleasure. In increasing order of complexity and control - * they are TRI_BEGIN, TRI_STRIP_BEGIN, TRI_PACKET_BEGIN. - * - * NB: All of these macros must be terminated w/ a matching invocation of - * TRI_END otherwise all sorts of hell will break loose. - * - * TRI_BEGIN: - * The simplest form that draws a single indepependent triangle whose - * parameters and culling are all the glide defaults for grDrawTriangle. - * - * TRI_STRIP_BEGIN: - * setupMode: [kSetupStrip | kSetupFan]. Culling defaults to the current - * glide setting, w/ strips/fans defaulting to ping-pong culling - * nVertex: The number of vertices for the current packet (max 15). - * vertexSize: Size in bytes of the parameters for the vertices making up - * the current packet. - * cmd: [SSTCP_PKT3_BDDBDD (Independent) - * SSTCP_PKT3_BDDDDD (Start strip/fan) - * SSTCP_PKT3_DDDDDD (Continue strip)] - * - * TRI_PACKET_BEGIN: - * setupMode: The same as with TRI_STRIP_BEGIN, except that the caller - * needs to specify the culling bits kSetupCullXXX/kSetupPingPongXXX. - * params: Bits matching the descriptin of the sMode register describing - * which parameters are specified in the packet. - * nVertex: See TRI_STRIP_BEGIN. - * vertexSize: See TRI_STRIP_BEGIN. - * cmd: See TRI_STRIP_BEGIN. - */ -#define TRI_PACKET_BEGIN(__setupMode, __params, __nVertex, __vertexSize, __cmd) \ -{ \ - FxU32* tPackPtr = gc->cmdTransportInfo.fifoPtr; \ - const FxU32 packetVal = (((__setupMode) << SSTCP_PKT3_SMODE_SHIFT) | /* [27:22] */ \ - (__params) | /* pack[28] params[21:10] */ \ - ((__nVertex) << SSTCP_PKT3_NUMVERTEX_SHIFT) | /* [9:6] */ \ - (__cmd) | /* command [5:3] */ \ - SSTCP_PKT3); /* type [2:0] */ \ - TRI_ASSERT_DECL(__nVertex, __vertexSize, packetVal); \ - SET(*tPackPtr++, packetVal) - -#define TRI_STRIP_BEGIN(__setupMode, __nVertex, __vertexSize, __cmd) \ -{ \ - FxU32* tPackPtr = gc->cmdTransportInfo.fifoPtr; \ - const FxU32 packetVal = (((__setupMode) << SSTCP_PKT3_SMODE_SHIFT) | /* [27:22] */ \ - ((__nVertex) << SSTCP_PKT3_NUMVERTEX_SHIFT) | /* [9:6] */ \ - (__cmd) | /* command [5:3] */ \ - gc->cmdTransportInfo.cullStripHdr); \ - TRI_ASSERT_DECL(__nVertex, __vertexSize, packetVal); \ - SET(*tPackPtr++, packetVal) - -#define TRI_BEGIN() \ -{ \ - FxU32* tPackPtr = gc->cmdTransportInfo.fifoPtr; \ - TRI_ASSERT_DECL(3, _GlideRoot.curVertexSize, gc->cmdTransportInfo.triPacketHdr); \ - SET(*tPackPtr++, gc->cmdTransportInfo.triPacketHdr) - -#if GDBG_INFO_ON -extern void -_grH3FifoDump_TriHdr(const FxU32 triPacketHdr); -extern void -_grH3FifoDump_Linear(const FxU32* const linearPacketAddr); - -#define DEBUGFIFODUMP_TRI(__packetAddr) _grH3FifoDump_TriHdr(__packetAddr) -#define DEBUGFIFODUMP_LINEAR(__packetAddr) _grH3FifoDump_Linear(__packetAddr) - -#define TRI_ASSERT_DECL(__nVerts, __vertSize, __packetHdr) \ - const FxU32 nVertex = (__nVerts); \ - const FxU32 sVertex = (__vertSize); \ - FxU32 pCount = 0; \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - !gc->open, \ - "Called before grSstWinOpen()"); \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - (gc->cmdTransportInfo.lfbLockCount != 0), \ - "Called within grLfbLock/grLfbUnlockPair"); \ - GR_ASSERT(((FxU32)(tPackPtr) & FIFO_ALIGN_MASK) == 0); /* alignment */ \ - GR_ASSERT((((__nVerts) * (__vertSize)) + sizeof(FxU32)) <= (FxU32)gc->cmdTransportInfo.fifoRoom); \ - GR_ASSERT((((FxU32)tPackPtr) + ((__nVerts) * (__vertSize)) + sizeof(FxU32)) < \ - (FxU32)gc->cmdTransportInfo.fifoEnd); \ - GR_ASSERT(nVertex < 0x10); \ - GR_ASSERT(nVertex > 0x00); \ - GR_ASSERT(((__packetHdr) & 0xE0000000UL) == 0x00UL); \ - FIFO_ASSERT(); \ - GDBG_INFO(120, "Triangle(0x%X): (0x%X : 0x%X)\n", (__packetHdr), __nVerts, __vertSize); \ - DEBUGFIFODUMP_TRI(__packetHdr) -#define CLAMP_DUMP(__val, __floatVal) \ - pCount++; \ - GDBG_INFO(gc->myLevel + 200, "\t(0x%X) : V#: 0x%X - P#: 0x%X - ParamVal: (%f : 0x%X)\n", \ - (FxU32)tPackPtr, \ - ((FxU32)tPackPtr - ((FxU32)gc->cmdTransportInfo.fifoPtr + sizeof(FxU32))) / sVertex, \ - (((FxU32)tPackPtr - ((FxU32)gc->cmdTransportInfo.fifoPtr + sizeof(FxU32))) % sVertex) >> 2, \ - (((__val) < 786432.875) ? (__val) : ((__val) - 786432.875)), \ - (__floatVal)) -#define SETF_DUMP(__val) \ - pCount++; \ - GDBG_INFO(gc->myLevel + 200, "\t(0x%X) : V#: 0x%X - P#: 0x%X - ParamVal: %f\n", \ - (FxU32)tPackPtr, \ - ((FxU32)tPackPtr - ((FxU32)gc->cmdTransportInfo.fifoPtr + sizeof(FxU32))) / sVertex, \ - (((FxU32)tPackPtr - ((FxU32)gc->cmdTransportInfo.fifoPtr + sizeof(FxU32))) % sVertex) >> 2, \ - (((__val) < 786432.875) ? (__val) : ((__val) - 786432.875))) -#define SET_DUMP(__val) \ - pCount++; \ - GDBG_INFO(gc->myLevel + 200, "\t(0x%X) : V#: 0x%X - P#: 0x%X - ParamVal: 0x%X\n", \ - (FxU32)tPackPtr, \ - ((FxU32)tPackPtr - ((FxU32)gc->cmdTransportInfo.fifoPtr + sizeof(FxU32))) / sVertex, \ - (((FxU32)tPackPtr - ((FxU32)gc->cmdTransportInfo.fifoPtr + sizeof(FxU32))) % sVertex) >> 2, \ - (__val)) -#define TRI_ASSERT() \ - GR_ASSERT(pCount == (nVertex * (sVertex >> 2))); \ - ASSERT(((FxU32)tPackPtr - (FxU32)gc->cmdTransportInfo.fifoPtr) == (nVertex * sVertex) + sizeof(FxU32)) -#else /* !GDBG_INFO_ON */ -#define DEBUGFIFODUMP_TRI(__packetAddr) -#define DEBUGFIFODUMP_LINEAR(__packetAddr) - -#define CLAMP_DUMP(__val, __floatVal) -#define SETF_DUMP(__val) -#define SET_DUMP(__val) - -#define TRI_ASSERT_DECL(__nVerts, __vertSize, __packetHdr) -#define TRI_ASSERT() -#endif /* !GDBG_INFO_ON */ - -/* Get the integer representation of the color component. Currently, - * following in the 'Glide is not an API for kids' tradition we'll - * probably do something silly like wrap around zero. - */ -#if GLIDE_PACKED_RGB -#define RGBA_COMP(__fpVal, __fpBias, __fpShift, __fpMask) \ -((_GlideRoot.pool.ftemp1 = (float)((float)(__fpVal) + (float)(__fpBias))), \ - GR_ASSERT((__fpVal) >= 0.0f), \ - GR_ASSERT((__fpVal) < 256.0f), \ - (((*(const FxU32*)&_GlideRoot.pool.ftemp1) & (__fpMask)) << (__fpShift))) - -#define RGBA_COMP_CLAMP(__fpVal, __compToken) \ - RGBA_COMP(__fpVal, kPackBias##__compToken, kPackShift##__compToken, kPackMask##__compToken) -#endif /* GLIDE_PACKED_RGB */ - -/* First stage tsu-subtractor chec/fix. - * Mmm..... sequence operator. - */ -#if GLIDE_FP_CLAMP -#define kFPClampThreshold 0x20UL -#define FP_FLOAT_CLAMP(__fpVal) ((FP_FLOAT_EXP(__fpVal) < kFPClampThreshold) \ - ? (_GlideRoot.stats.tsuValClamp++, 0x00UL) \ - : *(const FxU32*)(&(__fpVal))) - -#define TRI_SETF_CLAMP(__val) \ -do { \ - const FxU32 floatCastVal = FP_FLOAT_CLAMP(__val); \ - CLAMP_DUMP(__val, floatCastVal); \ - SET(*tPackPtr++, floatCastVal); \ - GR_INC_SIZE(sizeof(FxFloat)); \ -} while(0) -#else -#define TRI_SETF_CLAMP(__val) \ - TRI_SETF(__val) -#endif - -#define TRI_SETF(__val) \ -do { \ - SETF_DUMP(__val); \ - SETF(*tPackPtr++, (__val)); \ - GR_INC_SIZE(sizeof(FxFloat)); \ -} while(0) - -#define TRI_SET(__val) \ -do { \ - SET_DUMP(__val); \ - SET(*tPackPtr++, (__val)); \ - GR_INC_SIZE(sizeof(FxU32)); \ -} while(0) - -#define TRI_END \ - TRI_ASSERT(); \ - gc->cmdTransportInfo.fifoRoom -= ((FxU32)tPackPtr - (FxU32)gc->cmdTransportInfo.fifoPtr); \ - gc->cmdTransportInfo.fifoPtr = tPackPtr; \ - GDBG_INFO(gc->myLevel + 200, "\tTriEnd: (0x%X : 0x%X)\n", tPackPtr, gc->cmdTransportInfo.fifoRoom); \ - FIFO_ASSERT(); \ -} - -#define FIFO_LINEAR_WRITE_BEGIN(__numWords, __type, __addr, __maskW2, __maskWN, __f, __l) \ -{ \ - FxU32* packetPtr = gc->cmdTransportInfo.fifoPtr; \ - const FxU32 writeSize = (__numWords); /* Add size of packet header */ \ - const FxU32 hdr1 = ((__type) | \ - (((FxU32)(__maskW2)) << SSTCP_PKT5_BYTEN_W2_SHIFT) | \ - (((FxU32)(__maskWN)) << SSTCP_PKT5_BYTEN_WN_SHIFT) | \ - (writeSize << SSTCP_PKT5_NWORDS_SHIFT) | \ - SSTCP_PKT5); \ - const FxU32 hdr2 = ((FxU32)(__addr)) & SSTCP_PKT5_BASEADDR; \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - !gc->open, \ - "Called before grSstWinOpen()"); \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - (gc->cmdTransportInfo.lfbLockCount != 0), \ - "Called within grLfbLock/grLfbUnlockPair"); \ - GR_ASSERT(((FxU32)(packetPtr) & FIFO_ALIGN_MASK) == 0); /* alignment */ \ - GR_ASSERT((__numWords) > 0); /* packet size */ \ - GR_ASSERT((__numWords) < ((0x01 << 19) - 2)); \ - GR_ASSERT((((FxU32)(__numWords) + 2) << 2) <= (FxU32)gc->cmdTransportInfo.fifoRoom); \ - GR_ASSERT(((FxU32)packetPtr + (((FxU32)(__numWords) + 2) << 2)) < \ - (FxU32)gc->cmdTransportInfo.fifoEnd); \ - GR_ASSERT((hdr2 & 0xE0000000UL) == 0x00UL); \ - GR_ASSERT(1 /* (((FxU32)(__type)) >= ((FxU32)SSTCP_PKT5_3DLFB)) && \ - (((FxU32)(__type)) <= ((FxU32)SSTCP_PKT5_TEXPORT))*/); \ - FIFO_ASSERT(); \ - GDBG_INFO(120, "LinearWrite(0x%X : 0x%X)\n", hdr1, hdr2); \ - GDBG_INFO(gc->myLevel + 200, "\tFile: %s - Line: %ld\n", __f, __l); \ - GDBG_INFO(gc->myLevel + 200, "\tType: 0x%X\n", (FxU32)(__type)); \ - GDBG_INFO(gc->myLevel + 200, "\tAddr: 0x%X\n", (FxU32)(__addr)); \ - GDBG_INFO(gc->myLevel + 200, "\tMaskW2: 0x%X\n", (FxU32)(__maskW2)); \ - GDBG_INFO(gc->myLevel + 200, "\tMaskWN: 0x%X\n", (FxU32)(__maskWN)); \ - GDBG_INFO(gc->myLevel + 200, "\twriteSize: 0x%X\n", writeSize); \ - GDBG_INFO(gc->myLevel + 200, "\thdr 1: 0x%X\n", hdr1); \ - GDBG_INFO(gc->myLevel + 200, "\thdr 2: 0x%X\n", hdr2); \ - SET(*packetPtr++, hdr1); \ - SET(*packetPtr++, hdr2); \ - GR_INC_SIZE(sizeof(FxU32)) - -#define FIFO_LINEAR_WRITE_SET(__val) \ -do { \ - GDBG_INFO(gc->myLevel + 205, "\t0x%X : 0x%X\n", packetPtr, (__val)); \ - GDBG_INFO(gc->myLevel + 205, "fifPtr: 0x%x, val: 0x%x\n\n", packetPtr, __val);\ - GR_ASSERT(GETREG(gc->cRegs->cmdFifo0.readPtrL) >= gc->cmdTransportInfo.fifoOffset);\ - GR_ASSERT(GETREG(gc->cRegs->cmdFifo0.readPtrL) < (gc->cmdTransportInfo.fifoOffset + gc->cmdTransportInfo.fifoSize));\ - SET_LINEAR(*packetPtr++, (__val)); \ - GR_INC_SIZE(sizeof(FxU32)); \ -} while(0) - -#define FIFO_LINEAR_WRITE_SET_16(__val) \ -do { \ - GDBG_INFO(gc->myLevel + 205, "\t0x%X : 0x%X\n", packetPtr, (__val)); \ - SET_LINEAR_16(*packetPtr++, (__val)); \ - GR_INC_SIZE(sizeof(FxU32)); \ -} while(0) - -#define FIFO_LINEAR_WRITE_SET_8(__val) \ -do { \ - GDBG_INFO(gc->myLevel + 205, "\t0x%X : 0x%X\n", packetPtr, (__val)); \ - SET_LINEAR_8(*packetPtr++, (__val)); \ - GR_INC_SIZE(sizeof(FxU32)); \ -} while(0) - -#define FIFO_LINEAR_WRITE_END \ - DEBUGFIFODUMP_LINEAR(gc->cmdTransportInfo.fifoPtr); \ - GR_ASSERT((((FxU32)packetPtr - (FxU32)gc->cmdTransportInfo.fifoPtr) >> 2) == writeSize + 2); \ - gc->cmdTransportInfo.fifoRoom -= ((FxU32)packetPtr - (FxU32)gc->cmdTransportInfo.fifoPtr); \ - gc->cmdTransportInfo.fifoPtr = packetPtr; \ - GDBG_INFO(gc->myLevel + 200, "\tLinearEnd: (0x%X : 0x%X)\n", \ - packetPtr, gc->cmdTransportInfo.fifoRoom); \ - FIFO_ASSERT(); \ -} - -# define GR_GET(s) GET(s) -# define GR_CAGP_GET(__reg) GET(gc->cRegs->cmdFifo0.__reg) -# define GR_CAGP_SET(__reg, __val) SET(gc->cRegs->cmdFifo0.__reg, __val) -# define GR_GET16(s) ((FxU16)GET16(s)) -# define GR_SET(c, h, f, s) STORE_FIFO(c, h, f, s) -# define GR_SET_WAX(c, h, f, s) STORE_FIFO_WAX(c, h, f, s) -# define GR_SET_INDEX(c, h, r, s) STORE_FIFO_INDEX(c, h, r, s) -# define GR_SET16(c, h, f, s) STORE16_FIFO(c, h, f, s) -# define GR_SETF(c, h, f, s) STOREF_FIFO(c, h, f, s) -# define GR_SETF_INDEX(c, h, r, s) STOREF_FIFO_INDEX(c, h, r, s) -# define GR_SET_DIRECT(__bc, __hw, __reg, __val) gc->sstRegs->__reg = __val;GR_INC_SIZE(sizeof(__val)) -# define GR_SET_IO(c, h, f, s) (gc->ioRegs)->f = s -#else /* !USE_PACKET_FIFO */ -# ifndef DIRECT_IO -# define GR_GET(s) GET(s) -# define GR_CAGP_GET(__reg) GET(gc->cRegs->cmdFifo0__reg) -# define GR_GET16(s) ((FxU16)GET16(s)) -# define GR_SET(c, h, f, s) do {SET((h)->f, s); GR_INC_SIZE(4);} while(0) -# define GR_SET_INDEX(c, h, r, s) do {SET(((FxU32*)(h))[r], s); GR_INC_SIZE(sizeof(FxU32));} while(0) -# define GR_SETF(c, h, f, s) do {SETF(h->f, s); GR_INC_SIZE(4);} while(0) -# define GR_SETF_INDEX(c, h, r, s) do {SETF(((FxU32*)(h))[r], s); GR_INC_SIZE(sizeof(FxU32));} while(0) -# define GR_SET16(c, h, f, s) do {SET16((h)->f, s); GR_INC_SIZE(2);} while(0) -# define GR_SET_IO(c,h,f,s) GR_SET(c, h, f, s) -# define GR_SET_DIRECT(c,h,f,s) GR_SET(c, h, f, s) -# else -# define GR_GET(s) GET(s) -# define GR_CAGP_GET(__reg) gc->cRegs->cmdFifo0.reg -# define GR_GET16(s) ((FxU16)GET16(s)) -# define GR_SET(c, h, f, s) {(gc->sstRegs)->f = s; GR_INC_SIZE(4);} -# define GR_SETF(c, h, f, s) {((volatile float) (gc->sstRegs)->f) = (float) (s); GR_INC_SIZE(4);} -# define GR_SET_INDEX(c, h, r, s) {((FxU32 *)(gc->sstRegs))[r] = s; GR_INC_SIZE(4);} -# define GR_SETF_INDEX(c, h, r, s) {((volatile float *)(gc->sstRegs))[r] = (float) (s); GR_INC_SIZE(4);} -# define GR_SET16(c, h, f, s) {*((FxU16 *)((gc->sstRegs)->f)) = s; GR_INC_SIZE(4);} -# define GR_SET_DIRECT(__b, __ptr, __reg, __val) \ -{\ - __ptr->__reg = __val;\ - GR_INC_SIZE(4);\ -} -# define GR_SET_IO(c, h, f, s) (gc->ioRegs)->f = s -# endif -#endif /* !USE_PACKET_FIFO */ - -/* Macros to do linear writes to lfb/tex memory. - * - * LINEAR_WRITE_BEGIN - Setup stuff for the linear write. - * - * numWords: The number of words to actually write to the destination - * address. This does *NOT* include the packet headers etc for any - * command fifos etc. - * - * type: One of the kLinearWriteXXX enum values above. This can - * control what the legal values for addr and maskXX are. - * - * addr: Base address to the start the write. - * - * maskXX: Control what bytes in a write are active, these are active - * low. W2 controls the masking of the first 32bit word written, and - * WN controls all of the other writes. - * - * LINEAR_WRITE_SET - Writes are done in 32-bit increments, and must - * be properly aligned etc. This can only be used inside of a - * LINEAR_WRITE_BEGIN/LINEAR_WRITE_END pair. - * - * LINEAR_WRITE_EDGE - Write to a 16-bit value to an address. The - * address must be aligned for at 16-bit access, and should not appear - * within a LINEAR_WRITE_BEGIN/LINEAR_WRITE_END pair. - * - * LINEAR_WRITE_END - Finish off any stuff for the linear write. - */ - -#if USE_PACKET_FIFO -#define LINEAR_WRITE_BEGIN(__numWords, __type, __addr, __maskW2, __maskWN) \ -{ \ - GR_SET_EXPECTED_SIZE(((FxU32)((__numWords) + 1) << 2), 1); \ - FIFO_LINEAR_WRITE_BEGIN(__numWords, __type, __addr, __maskW2, __maskWN, __FILE__, __LINE__) -#define LINEAR_WRITE_SET(__addr, __val) \ - FIFO_LINEAR_WRITE_SET(__val) -#define LINEAR_WRITE_SET_16(__addr, __val) \ - FIFO_LINEAR_WRITE_SET_16(__val) -#define LINEAR_WRITE_SET_8(__addr, __val) \ - FIFO_LINEAR_WRITE_SET_8(__val) -#define LINEAR_WRITE_END() \ - FIFO_LINEAR_WRITE_END; \ - GR_CHECK_SIZE(); \ -} - -/* Macro to write the edge cases of a linear write, for example to the - * lfb w/ a 16-bit pixel value. We do some address manipulation here - * since the cmd fifo only addresses 32-bit quantities, but allows us - * to mask of crap for the actual write. - * - */ -#if (GLIDE_PLATFORM & GLIDE_ENDIAN_LITTLE) -#define kWordMask 0x0CUL -#define kWordShift 0 -#elif (GLIDE_PLATFORM & GLIDE_ENDIAN_BIG) -#define kWordMask 0x03UL -#define kWordShift 16 -#else -#error "Must define processor endian-ness for LINEAR_WRITE_EDGE" -#endif /* Endian-ness check */ - -#define LINEAR_WRITE_EDGE(__type, __addr, __val, __alignedP) \ -do { \ - LINEAR_WRITE_BEGIN(1, __type, \ - ((FxU32)__addr & ~0x03UL), \ - ((__alignedP) ? kWordMask : (0x0F & (~kWordMask))), 0x00); \ - FIFO_LINEAR_WRITE_SET(((FxU32)(__val)) << ((__alignedP) ? kWordShift : (16 - kWordShift))); \ - LINEAR_WRITE_END(); \ -} while(0) -#else /* !USE_PACKET_FIFO */ -# define LINEAR_WRITE_BEGIN(__numWords, __type, __addr, __maskW2, __maskWN) \ -{ \ - GR_SET_EXPECTED_SIZE(((__numWords) << 2), (__numWords)) -# define LINEAR_WRITE_SET(__addr, __val) \ -do { \ - FxU32* tempAddr = (FxU32*)(__addr); \ - SET(*tempAddr, __val); \ - GR_INC_SIZE(sizeof(FxU32)); \ -} while(0) - -# define LINEAR_WRITE_SET_16(__addr, __val)\ - LINEAR_WRITE_SET(__addr, (FxU32) __val) -# define LINEAR_WRITE_SET_8(__addr, __val) \ - LINEAR_WRITE_SET(__addr, (FxU32) __val) - -# define LINEAR_WRITE_EDGE(__type, __addr, __val, __alignedP) \ -do { \ - FxU32* tempAddr = (FxU32*)(__addr); \ - SET16(*tempAddr, __val); \ - GR_INC_SIZE(sizeof(FxU32)); \ -} while(0) -# define LINEAR_WRITE_END() \ - GR_CHECK_SIZE(); \ -} - -/* The REG_GROUP_XXX macros do writes to a monotonically increasing - * set of registers. There are three flavors of the macros w/ - * different restrictions etc. - * - * NB: Care must be taken to order the REG_GROUP_SET macro uses to - * match the actual register order, otherwise all hell breaks loose. - */ - -/* Write to __groupNum registers (max 14) starting at __regBase under - * the control of __groupMask (lsb->msb). - */ -#define REG_GROUP_BEGIN(__chipId, __regBase, __groupNum, __groupMask) \ -GR_ASSERT(((__groupNum) >= 1) && ((__groupNum) <= 21)); \ -GR_ASSERT(((__groupMask) & (SSTCP_PKT4_MASK >> SSTCP_PKT4_MASK_SHIFT)) != 0x00); \ -GR_SET_EXPECTED_SIZE(sizeof(FxU32) * (__groupNum), 1); \ -REG_GROUP_BEGIN_INTERNAL(__regBase, __groupNum, __groupMask, FXTRUE) - -#define REG_GROUP_BEGIN_WAX( __regBase, __groupNum, __groupMask) \ -GR_ASSERT(((__groupNum) >= 1) && ((__groupNum) <= 21)); \ -GR_ASSERT(((__groupMask) & (SSTCP_PKT4_MASK >> SSTCP_PKT4_MASK_SHIFT)) != 0x00); \ -GR_SET_EXPECTED_SIZE(sizeof(FxU32) * (__groupNum), 1); \ -REG_GROUP_BEGIN_INTERNAL_WAX(__regBase, __groupNum, __groupMask, FXTRUE) - -/* Same as the non-NO_CHECK variant, but GR_SET_EXPECTED_SIZE must - * have already been called to allocate space for this write. - */ -#define REG_GROUP_NO_CHECK_BEGIN(__chipId, __regBase, __groupNum, __groupMask) \ -GR_ASSERT(((__groupNum) >= 1) && ((__groupNum) <= 21)); \ -GR_ASSERT(((__groupMask) & (SSTCP_PKT4_MASK >> SSTCP_PKT4_MASK_SHIFT)) != 0x00); \ -GR_ASSERT(gc->expected_counter >= (FxI32)((__groupNum) * sizeof(FxU32))); \ -REG_GROUP_BEGIN_INTERNAL(__regBase, __groupNum, __groupMask, FXFALSE) - -/* Register writes (<= 32) sequentially starting at __regBase */ -#define REG_GROUP_LONG_BEGIN(__chipId, __regBase, __groupNum) \ -GR_ASSERT(((__groupNum) >= 1) && ((__groupNum) <= 32)); \ -GR_SET_EXPECTED_SIZE(sizeof(FxU32) * (__groupNum), 1); \ -REG_GROUP_BEGIN_INTERNAL(__regBase, __groupNum, (0xFFFFFFFF >> (32 - (__groupNum))), FXTRUE) - -#define REG_GROUP_BEGIN_INTERNAL(__regBase, __groupNum, __groupMask, __checkP) \ -{ \ - GR_DCL_GC; \ - REG_GROUP_DCL(__groupMask, __regBase, __groupNum, __checkP); \ - GDBG_INFO(gc->myLevel + 100, "REG_GROUP_BEGIN: (0x%X : 0x%X)\n", \ - (__groupMask), offsetof(SstRegs, __regBase) >> 2) - -#define REG_GROUP_BEGIN_INTERNAL_WAX(__regBase, __groupNum, __groupMask, __checkP) \ -{ \ - GR_DCL_GC; \ - REG_GROUP_DCL_WAX(__groupMask, __regBase, __groupNum, __checkP); \ - GDBG_INFO(220, "REG_GROUP_BEGIN_WAX: (0x%X : 0x%X)\n", \ - (__groupMask), offsetof(SstGRegs, __regBase) >> 2) - - -#define REG_GROUP_SET(__regBase, __regAddr, __val) \ -do { \ - REG_GROUP_ASSERT(__regAddr, __val, FXFALSE); \ - SET(((SstRegs*)(__regBase))->__regAddr, (__val)); \ - GR_INC_SIZE(sizeof(FxU32)); \ -} while(0) - -#define REG_GROUP_SET_WAX(__regBase, __regAddr, __val) \ -do { \ - SET(((SstGRegs*)((FxU32) __regBase + SST_2D_OFFSET))->__regAddr, (__val)); \ - GR_INC_SIZE(sizeof(FxU32)); \ -} while(0) - - -#define REG_GROUP_SETF(__regBase, __regAddr, __val) \ -do { \ - REG_GROUP_ASSERT(__regAddr, __val, FXTRUE); \ - SETF(((SstRegs*)(__regBase))->__regAddr, (__val)); \ - GR_INC_SIZE(sizeof(FxFloat)); \ -} while(0) - -#if GLIDE_FP_CLAMP -#define REG_GROUP_SETF_CLAMP(__regBase, __regAddr, __val) \ -do { \ - const FxU32 fpClampVal = FP_FLOAT_CLAMP(__val); \ - REG_GROUP_ASSERT(__regAddr, fpClampVal, FXTRUE); \ - SET(((FxU32*)(__regBase))[offsetof(SstRegs, __regAddr) >> 2], fpClampVal); \ - GR_INC_SIZE(sizeof(FxU32)); \ -} while(0) -#else -#define REG_GROUP_SETF_CLAMP(__regBase, __regAddr, __val) \ - REG_GROUP_SETF(__regBase, __regAddr, __val) -#endif - -#define REG_GROUP_NO_CHECK_END() \ - ASSERT(!_checkP); \ -} - -#define REG_GROUP_END() \ - ASSERT(_checkP); \ -} \ -GR_CHECK_SIZE() - -#if !GLIDE_HW_TRI_SETUP || HOOPTI_TRI_SETUP_COMPARE -/* Send all of the triangle parameters in a single cmd fifo packet to - * the chip until the tsu is fixed. - */ -#define kNumTriParam 0x1FUL - -#define TRI_NO_TSU_BEGIN(__floatP) \ -GR_CHECK_COMPATABILITY(FN_NAME, \ - !gc->open, \ - "Called before grSstWinOpen()"); \ -GR_CHECK_COMPATABILITY(FN_NAME, \ - (gc->cmdTransportInfo.lfbLockCount != 0), \ - "Called within grLfbLock/grLfbUnlockPair"); \ -GR_SET_EXPECTED_SIZE(sizeof(FxU32) * kNumTriParam, 1); \ -{ \ - volatile FxU32* regBaseAddr = (volatile FxU32*)((__floatP) \ - ? &hw->FvA \ - : &hw->vA); \ - GDBG_INFO(gc->myLevel, "TRI_NO_TSU_BEGIN: fbiRegs->%svA\n", \ - ((__floatP) ? "F" : "")) - -#define TRI_NO_TSU_SET(__addr, __val) \ -do { \ - const FxU32* hwWriteAddr = (const FxU32*)(__addr); \ - ASSERT(hwWriteAddr == regBaseAddr); \ - SET(*hwWriteAddr, (__val)); \ - GR_INC_SIZE(sizeof(FxU32)); \ - regBaseAddr++; \ -} while(0) - -#define TRI_NO_TSU_SETF(__addr, __val) \ -do { \ - const FxU32* hwWriteAddr = (const FxU32*)(__addr); \ - const FxFloat hwFloatVal = __val; \ - ASSERT(hwWriteAddr == regBaseAddr); \ - GDBG_INFO(gc->myLevel + 200, FN_NAME": FloatVal 0x%X : (0x%X : %g)\n", \ - ((FxU32)hwWriteAddr - (FxU32)hw) >> 2, \ - *(const FxU32*)&hwFloatVal, hwFloatVal); \ - SETF(*hwWriteAddr, hwFloatVal); \ - GR_INC_SIZE(sizeof(FxU32)); \ - regBaseAddr++; \ -} while(0) - -#define TRI_NO_TSU_END() \ -} -#endif /* !GLIDE_HW_TRI_SETUP || HOOPTI_TRI_SETUP_COMPARE */ - -#endif /* !USE_PACKET_FIFO */ - -/* Offsets to 'virtual' addresses in the hw */ -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) -#define HW_REGISTER_OFFSET SST_3D_OFFSET -#define HW_FIFO_OFFSET 0x00200000UL -#elif (GLIDE_PLATFORM & GLIDE_HW_H3) -#define HW_IO_REG_REMAP SST_IO_OFFSET -#define HW_CMD_AGP_OFFSET SST_CMDAGP_OFFSET -#define HW_2D_REG_OFFSET SST_2D_OFFSET -#define HW_3D_REG_OFFSET SST_3D_OFFSET -#define HW_REGISTER_OFFSET HW_3D_REG_OFFSET -#else -#error "Must define virtual address spaces for this hw" -#endif - -#define HW_FIFO_OFFSET 0x00200000UL -#define HW_LFB_OFFSET SST_LFB_OFFSET -#define HW_TEXTURE_OFFSET SST_TEX_OFFSET - -/* This is the alignmnet requirement for texBaseAddr. Actually, - * nothing bad is going to happen, but when the hw lops bits off of - * the address the wrong texels are going to appear. - */ -#define SST_TEXTURE_ALIGN 0x10UL -#define SST_TEXTURE_ALIGN_MASK (SST_TEXTURE_ALIGN - 0x01UL) - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) || (GLIDE_PLATFORM & GLIDE_HW_H3) -#define HW_BASE_PTR(__b) (__b) -#else -#error "Need HW_BASE_PTR to convert hw address into board address." -#endif - -#define HW_REG_PTR(__b) ((FxU32*)(((FxU32)(__b)) + HW_REGISTER_OFFSET)) -#define HW_LFB_PTR(__b) ((FxU32*)(((FxU32)(__b)) + HW_LFB_OFFSET)) -#define HW_TEX_PTR(__b) ((FxU32*)(((FxU32)(__b)) + HW_TEXTURE_OFFSET)) - -/* access a floating point array with a byte index */ -#define FARRAY(p,i) (*(float *)((i)+(int)(p))) -#define ArraySize(__a) (sizeof(__a) / sizeof((__a)[0])) - -void rle_decode_line_asm(FxU16 *tlut,FxU8 *src,FxU16 *dest); - -extern FxU16 rle_line[256]; -extern FxU16 *rle_line_end; - -#define RLE_CODE 0xE0 -#define NOT_RLE_CODE 31 - -#ifdef __WATCOMC__ -#pragma aux rle_decode_line_asm parm [edx] [edi] [esi] value [edi] modify exact [eax ebx ecx edx esi edi] = \ -" next_pixel: " \ -" xor ecx,ecx " \ -" mov al,byte ptr[edi] " \ -" mov cl,byte ptr[edi] " \ -" inc edi " \ -" " \ -" and al,0xE0 " \ -" cmp al,0xE0 " \ -" jne unique " \ -" " \ -" and cl,0x1F " \ -" mov al,cl " \ -" jz done_rle " \ -" " \ -" mov cl,byte ptr[edi] " \ -" inc edi " \ -" mov bx,word ptr[edx+ecx*2] " \ -" " \ -" copy_block: " \ -" mov word ptr[esi],bx " \ -" add esi,0x2 " \ -" dec al " \ -" jz next_pixel " \ -" jmp copy_block " \ -" " \ -" unique: " \ -" mov bx,word ptr[edx+ecx*2] " \ -" mov word ptr[esi],bx " \ -" add esi,0x2 " \ -" jmp next_pixel " \ -" done_rle: "; -#endif /* __WATCOMC__ */ - -#if GDBG_INFO_ON -/* cvg.c */ -extern void -_grErrorCallback(const char* const procName, - const char* const format, - va_list args); -#endif - -/* Returns 16:16 pair indicating the cpu's manufacturer and its - * capabilities. Non-Intel processors should have a vendor id w/ the - * high bit set so that it appears to be a negative #. The value of - * the capability field is assumed to be a monotonically increasing - * inclusive set. - * - * Unknown: - * 0xFFFF:0xFFFF - * - * Intel: 0x0000 - * 4: 486 and lower - * 5: Pentium - * 6: P6 Core w/ MTRR's - * 7: P6 Core w/ KNI - * - * AMD: 0x8001 - * 1: MMX - * 2: 3DNow!(tm) - * 4: K6-type MTRRs - * 8: P2-type MTRRs - * - * Cyrix: 0x8002 - * 1: MMX - * 2: 3DNow!(tm) - * - * IDT: 0x8003 - * 1: MMX - * 2: 3DNow!(tm) - * - */ - -enum { - kCPUVendorIntel = 0x0000, - kCPUVendorAMD = 0x8001, - kCPUVendorCyrix = 0x8002, - kCPUVendorIDT = 0x8003, - kCPUVendorUnknown = 0xFFFF -}; -extern FxI32 GR_CDECL -_cpu_detect_asm(void); - -extern void GR_CDECL -single_precision_asm(void); - -extern void GR_CDECL -double_precision_asm(void); - -#ifdef GLIDE3 -/* -** Macro to handle clip space and viewport stuff -*/ -#define TRI_SETF_SCALE_ADVANCE(_ptr,_scaler) \ - TRI_SETF(FARRAY(_ptr, i)*_scaler); dataElem++; i = gc->tsuDataList[dataElem] - -#define DA_SETF_SCALE_ADVANCE(_ptr,_scaler) \ - DA_SETF(FARRAY(_ptr, i)*_scaler); dataElem++; i = gc->tsuDataList[dataElem] - -#define DA_VP_SETFS(_s,_oow) \ -{ \ - FxI32 i, dataElem=0; \ - i = gc->tsuDataList[dataElem]; \ - if (gc->state.paramIndex & (STATE_REQUIRES_IT_DRGB | STATE_REQUIRES_IT_ALPHA)) { \ - if (gc->state.vData.colorType == GR_FLOAT) { \ - if (gc->state.paramIndex & STATE_REQUIRES_IT_DRGB) { \ - DA_SETF_SCALE_ADVANCE(_s,_GlideRoot.pool.f255); \ - DA_SETF_SCALE_ADVANCE(_s,_GlideRoot.pool.f255); \ - DA_SETF_SCALE_ADVANCE(_s,_GlideRoot.pool.f255); \ - } \ - if (gc->state.paramIndex & STATE_REQUIRES_IT_ALPHA) { \ - DA_SETF_SCALE_ADVANCE(_s,_GlideRoot.pool.f255); \ - } \ - } \ - else { \ - DA_SETF(FARRAY(_s, i)); \ - dataElem++; \ - i = gc->tsuDataList[dataElem]; \ - } \ - } \ - if (gc->state.paramIndex & STATE_REQUIRES_OOZ) { \ - DA_SETF(FARRAY(_s, i)*_oow*gc->state.Viewport.hdepth + gc->state.Viewport.oz); \ - dataElem++; \ - i = gc->tsuDataList[dataElem]; \ - } \ - if (gc->state.paramIndex & STATE_REQUIRES_OOW_FBI) { \ - if (gc->state.vData.qInfo.offset) { \ - DA_SETF(FARRAY(_s, gc->state.vData.qInfo.offset)*_oow); \ - } else { \ - DA_SETF(_oow); \ - } \ - dataElem++; \ - i = gc->tsuDataList[dataElem]; \ - } \ - while (i != GR_DLIST_END) { \ - DA_SETF_SCALE_ADVANCE(_s,_oow*_GlideRoot.pool.f255); \ - } \ -} - -#define TRI_VP_SETFS(_s,_oow) \ -{ \ - FxI32 i, dataElem=0; \ - i = gc->tsuDataList[dataElem]; \ - if (gc->state.paramIndex & (STATE_REQUIRES_IT_DRGB | STATE_REQUIRES_IT_ALPHA)) { \ - if (gc->state.vData.colorType == GR_FLOAT) { \ - if (gc->state.paramIndex & STATE_REQUIRES_IT_DRGB) { \ - TRI_SETF_SCALE_ADVANCE(_s,_GlideRoot.pool.f255); \ - TRI_SETF_SCALE_ADVANCE(_s,_GlideRoot.pool.f255); \ - TRI_SETF_SCALE_ADVANCE(_s,_GlideRoot.pool.f255); \ - } \ - if (gc->state.paramIndex & STATE_REQUIRES_IT_ALPHA) { \ - TRI_SETF_SCALE_ADVANCE(_s,_GlideRoot.pool.f255); \ - } \ - } \ - else { \ - TRI_SETF(FARRAY(_s, i)); \ - dataElem++; \ - i = gc->tsuDataList[dataElem]; \ - } \ - } \ - if (gc->state.paramIndex & STATE_REQUIRES_OOZ) { \ - TRI_SETF(FARRAY(_s, i)*_oow*gc->state.Viewport.hdepth+gc->state.Viewport.oz); \ - dataElem++; \ - i = gc->tsuDataList[dataElem]; \ - } \ - if (gc->state.paramIndex & STATE_REQUIRES_OOW_FBI) { \ - if (gc->state.vData.qInfo.offset) { \ - TRI_SETF(FARRAY(_s, gc->state.vData.qInfo.offset)*_oow); \ - } else { \ - TRI_SETF(_oow); \ - } \ - dataElem++; \ - i = gc->tsuDataList[dataElem]; \ - } \ - while (i != GR_DLIST_END) { \ - TRI_SETF_SCALE_ADVANCE(_s,_oow*_GlideRoot.pool.f255); \ - } \ -} - -#define AA_TRI_VP_SETFS(_s,_oow) \ -{ \ - FxI32 i, dataElem=0; \ - i = gc->tsuDataList[dataElem]; \ - if (gc->state.paramIndex & (STATE_REQUIRES_IT_DRGB | STATE_REQUIRES_IT_ALPHA)) { \ - if (gc->state.vData.colorType == GR_FLOAT) { \ - if (gc->state.paramIndex & STATE_REQUIRES_IT_DRGB) { \ - TRI_SETF_SCALE_ADVANCE(_s,_GlideRoot.pool.f255); \ - TRI_SETF_SCALE_ADVANCE(_s,_GlideRoot.pool.f255); \ - TRI_SETF_SCALE_ADVANCE(_s,_GlideRoot.pool.f255); \ - } \ - TRI_SETF(0.0f); \ - } \ - else { \ - FxU32 argb; \ - argb = *((FxU32 *)((int)_s + i)) & 0x00ffffff; \ - TRI_SETF(*((float *)&argb)); \ - dataElem++; \ - i = gc->tsuDataList[dataElem]; \ - } \ - } \ - if (gc->state.paramIndex & STATE_REQUIRES_OOZ) { \ - TRI_SETF(FARRAY(_s, i)*_oow*gc->state.Viewport.hdepth + gc->state.Viewport.oz); \ - dataElem++; \ - i = gc->tsuDataList[dataElem]; \ - } \ - if (gc->state.paramIndex & STATE_REQUIRES_OOW_FBI) { \ - if (gc->state.vData.qInfo.offset) { \ - TRI_SETF(FARRAY(_s, gc->state.vData.qInfo.offset)*_oow); \ - } else { \ - TRI_SETF(_oow); \ - } \ - dataElem++; \ - i = gc->tsuDataList[dataElem]; \ - } \ - while (i != GR_DLIST_END) { \ - TRI_SETF_SCALE_ADVANCE(_s,_oow*_GlideRoot.pool.f255); \ - } \ -} - -#endif - -/* -** The lod and aspect ratio changes will be done after we split the tree. -** Currently, we change the definition but patch it back to the original value -** so it is the same glide2. -** To smooth the transition from glide2 defs to glide3 defs, we introduce the -** translation layer. -*/ -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -#ifndef GLIDE3_DEBUG -//#define GLIDE3_DEBUG 1 -#endif -#ifdef GLIDE3_DEBUG -#define TEX_INFO(ptr,field) ptr##field -#define G3_LOD_TRANSLATE(lod) (lod) -#define G3_ASPECT_TRANSLATE(aspect) (aspect) -#else -#define TEX_INFO(ptr,field) ptr##field##Log2 -#define G3_LOD_TRANSLATE(lod) (0x8-lod) -#define G3_ASPECT_TRANSLATE(aspect) (0x3-(aspect)) -#endif /* GLIDE3_DEBUG */ -#else -#define TEX_INFO(ptr,field) ptr##field -#define G3_LOD_TRANSLATE(lod) (lod) -#define G3_ASPECT_TRANSLATE(aspect) (aspect) -#endif - -/* externals from ditex.c */ -extern const FxU32 _grMipMapHostSize[4][9]; -extern const int _grMipMapHostWH[GR_ASPECT_1x8 + 1][GR_LOD_1 + 1][2]; -extern const FxU32 _gr_aspect_index_table[]; -extern const FxU32 _gr_aspect_xlate_table[]; -extern const FxU32 _gr_evenOdd_xlate_table[]; - -#endif /* __FXGLIDE_H__ */ - diff --git a/glide2x/h3/glide/src/fxsplash.h b/glide2x/h3/glide/src/fxsplash.h deleted file mode 100644 index 8d4e013..0000000 --- a/glide2x/h3/glide/src/fxsplash.h +++ /dev/null @@ -1,57 +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 3/17/99 6:16p Dow -** Phantom Menace and other fixes. -** -** 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_ */ diff --git a/glide2x/h3/glide/src/g3df.c b/glide2x/h3/glide/src/g3df.c deleted file mode 100644 index e0f443b..0000000 --- a/glide2x/h3/glide/src/g3df.c +++ /dev/null @@ -1,568 +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:27 joseph -** Initial checkin into SourceForge. -** -** -** 3 3/17/99 6:16p Dow -** Phantom Menace and other fixes. -** -** 19 2/16/99 4:14p Peter -** made texture table declarations consistent -** -** 18 4/03/98 2:04p Dow -** Dos Glide Mods - * - * 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 - * - * 7 5/21/97 6:05a Peter - * - * 6 3/09/97 10:31a Dow - * Added GR_DIENTRY for di glide functions -** -*/ -#include -#include -#include - -#include <3dfx.h> - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -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 - */ -#ifdef __GNUC__ - /* This function is not found in libgcc.a */ - { - char* tempStr = (char*)color_format; - while(*tempStr != '\0') *tempStr++ = toupper(*tempStr); - } -#else - { - extern char* strupr(char*); - strupr(color_format); - } -#endif /* __GNUC__ */ - - 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; -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -#ifdef GLIDE3_DEBUG - for(lod = Info->header.large_lod; lod <= Info->header.small_lod; lod++) { -#else - for(lod = Info->header.large_lod; lod >= Info->header.small_lod; lod--) { -#endif -#else - for(lod = Info->header.large_lod; lod <= Info->header.small_lod; lod++) { -#endif - Info->mem_required += (_grMipMapHostSize[_gr_aspect_index_table[G3_ASPECT_TRANSLATE(Info->header.aspect_ratio)]] - [G3_LOD_TRANSLATE(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, - G3_LOD_TRANSLATE(info->header.small_lod), - G3_LOD_TRANSLATE(info->header.large_lod), - G3_ASPECT_TRANSLATE(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, - G3_LOD_TRANSLATE(info->header.small_lod), - G3_LOD_TRANSLATE(info->header.large_lod), - G3_ASPECT_TRANSLATE(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; -} - - - diff --git a/glide2x/h3/glide/src/gaa.c b/glide2x/h3/glide/src/gaa.c deleted file mode 100644 index f0b2029..0000000 --- a/glide2x/h3/glide/src/gaa.c +++ /dev/null @@ -1,2370 +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 3/17/99 6:16p Dow -** Phantom Menace and other fixes. -** -** 69 12/03/98 11:27p Dow -** Code 'cleanup' heç -** -** 68 11/02/98 11:36a Jeske -** splash speckle mini-workaround for grAADrawTriangle() -** -** 67 10/20/98 2:17p Jeske -** added diag specific aa triangle draw -** -** 66 5/18/98 3:20p Peter -** crybaby warning about alpha not being enabled for aa primatives -** -** 65 4/23/98 4:46p Peter -** John's aa line stuff -** -** 64 3/28/98 11:24a Dow -** itwoç - * - * 61 1/15/98 2:46p Atai - * fixed grDrawPoint and grDrawLine in aa mode - * - * 60 12/17/97 4:45p Peter - * groundwork for CrybabyGlide - * - * 59 12/12/97 12:43p Atai - * move i and dateElem into the set up loop - * - * 57 12/08/97 10:40a Atai - * modify draw vertex primitive routines to do grDrawVertexArrayLinear() - * - * 56 12/05/97 4:26p Peter - * watcom warnings - * - * 55 11/24/97 4:40p Peter - * aa prims vs packing - * - * 54 11/21/97 6:05p Atai - * use one datalist (tsuDataList) in glide3 - * - * 53 11/21/97 3:20p Peter - * direct writes tsu registers - * - * 52 11/18/97 6:11p Peter - * fixed glide3 effage - * - * 51 11/18/97 4:36p Peter - * chipfield stuff cleanup and w/ direct writes - * - * 50 11/18/97 3:26p Atai - * update vData - * optimize state monster - * - * 49 11/17/97 4:55p Peter - * watcom warnings/chipfield stuff - * - * 48 11/06/97 6:10p Atai - * update GrState size - * rename grDrawArray to grDrawVertexArray - * update _grDrawPoint and _grDrawVertexList - * - * 47 11/04/97 6:35p Atai - * 1. sync with data structure changes - * 2. break up aa triangle routine - * - * 46 11/04/97 5:04p Peter - * cataclysm part deux - * - * 45 11/04/97 4:57p Atai - * use byte offset - * - * 44 11/03/97 3:43p Peter - * h3/cvg cataclysm - * - * 43 11/03/97 3:19p Atai - * optimization - * - * 42 10/29/97 2:45p Peter - * C version of Taco's packing code - * - * 41 10/29/97 2:24p Atai - * re-work aa draw routines to increase sbench number - * - * 40 10/21/97 8:38p Atai - * added lines routine for grDrawArray - * - * 39 10/21/97 3:22p Peter - * hand pack rgb - * - * 38 10/19/97 12:51p Peter - * no tsu happiness - * - * 37 10/17/97 3:15p Peter - * removed unused addr field from datalist - * - * 36 10/17/97 10:15a Peter - * packed rgb state cleanup - * - * 35 10/16/97 5:33p Peter - * argb != rgba - * - * 34 10/16/97 3:40p Peter - * packed rgb - * - * 33 10/16/97 1:50p Atai - * fix drawarray bugs - * - * 32 10/14/97 7:33p Atai - * fix compiler error - * - * 31 10/14/97 5:40p Atai - * added grculltest - * - * 30 10/14/97 4:36p Atai - * added aa points, strip line and trianlges for drawarray - * - * 29 10/09/97 8:02p Dow - * State Monster 1st Cut - * - * 28 10/08/97 5:19p Peter - * optinally clamp only texture params - * - * 27 10/08/97 11:32a Peter - * pre-computed packet headers for packet 3 - * - * 26 9/20/97 4:42p Peter - * tri_setf fixup/big fifo - * - * 25 9/16/97 2:49p Peter - * fixed watcom unhappiness w/ static initializers - * - * 24 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 - * - * 23 9/10/97 10:13p Peter - * fifo logic from GaryT, non-normalized fp first cut - * - * 22 8/30/97 5:58p Tarolli - * cleanups - * - * 21 7/29/97 4:31p Atai - * replace old edge sense routine - * - * 19 7/28/97 2:42p Peter - * aa points? - * - * 18 7/26/97 3:04p Peter - * cleanup - * - * 17 7/25/97 11:40a Peter - * removed dHalf, change field name to match real use for cvg - * - * 16 6/30/97 3:21p Peter - * more aa through cmd fifo - * - * 15 6/20/97 1:17p Peter - * changes for new CVG_TRI macros -** -*/ - -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -/* -** ----------------------------------------------------------------------- -** -** Antialiasing rendering functions -** -** ----------------------------------------------------------------------- -*/ - -#ifndef GLIDE3_ALPHA -/*--------------------------------------------------------------------------- -** grAADrawPoint -** -** |-w-| -** A---B - -** |\ /| | -** | E | h -** |/ \| | -** D --C - -** w = h = 2pixels -*/ -GR_ENTRY(grAADrawPoint, void, (const GrVertex *e)) -{ -#define FN_NAME "grAADrawPoint" -#ifdef GLIDE3 - _grAADrawPoints(GR_VTX_PTR_ARRAY, 1, (void *)&e); -#else - GR_DCL_GC; - GrCullMode_t cullSave; - -#if GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP - const FxU32 vertexParamOffset = _GlideRoot.curVertexSize; -#endif /* GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP */ - - GDBG_INFO(94,"grAADrawPoint(0x%x)\n",e); - - /* turn off culling so triangles unconditionally draw */ - cullSave = gc->state.cull_mode; - gc->state.cull_mode = GR_CULL_DISABLE; - - GR_CHECK_COMPATABILITY(FN_NAME, - ((gc->cmdTransportInfo.paramMask & (SST_SETUP_A << SSTCP_PKT3_PMASK_SHIFT)) == 0), - "Antialiasing require enabling alpha"); - -#if GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP - /* We draw this as a 4 triangle fan centered around E. */ - GR_SET_EXPECTED_SIZE(vertexParamOffset * 6, 1); - TRI_STRIP_BEGIN(kSetupFan, - 0x06UL, vertexParamOffset, - SSTCP_PKT3_BDDDDD); - - { - const float ptX = e->x; - const float ptY = e->y; - const float* const fp = (const float* const)e; - - /* Send down the original point center */ - TRI_SETF(ptX); - TRI_SETF(ptY); - - { - const int* dataList = gc->tsuDataList; - -#if GLIDE_PACKED_RGB - if ((gc->cmdTransportInfo.paramMask & SSTCP_PKT3_PACKEDCOLOR) != 0) { - FxU32 packedColor = 0x00; - - if (*dataList == (GR_VERTEX_R_OFFSET << 2)) { - packedColor = (RGBA_COMP_CLAMP(FARRAY(fp, (GR_VERTEX_B_OFFSET << 2)), B) | - RGBA_COMP_CLAMP(FARRAY(fp, (GR_VERTEX_G_OFFSET << 2)), G) | - RGBA_COMP_CLAMP(FARRAY(fp, (GR_VERTEX_R_OFFSET << 2)), R)); - - dataList++; - } - - packedColor |= RGBA_COMP_CLAMP(FARRAY(fp, (GR_VERTEX_A_OFFSET << 2)), A); - TRI_SET(packedColor); - } else { - TRI_SETF(FARRAY(fp, (GR_VERTEX_A_OFFSET << 2))); - } - dataList++; -#endif /* GLIDE_PACKED_RGB */ - -#if GLIDE_FP_CLAMP_TEX - while(*dataList != 0) { - TRI_SETF(FARRAY(fp, *dataList)); - dataList++; - } - - dataList++; -#endif /* GLIDE_FP_CLAMP_TEX */ - - while(*dataList != 0) { - TRI_SETF_CLAMP(FARRAY(fp, *dataList)); - dataList++; - } - } - - /* Send the 'surrounding' vertices w/ alpha == 0.0f. To avoid - * the vertex copying from the previous version we carry around - * a table of offsets that we add into the original point to get - * the new points. - */ - { - int v; - static const float xAdjust[] = { 1.0f, -1.0f, -1.0f, 1.0f, 1.0f }; - static const float yAdjust[] = { -1.0f, -1.0f, 1.0f, 1.0f, -1.0f }; - - ASSERT(ArraySize(xAdjust) == ArraySize(yAdjust)); - - for(v = 0; v < ArraySize(xAdjust); v++) { - TRI_SETF(ptX + xAdjust[v]); - TRI_SETF(ptY + yAdjust[v]); - - { - const int* dataList = gc->tsuDataList; - -#if GLIDE_PACKED_RGB - if ((gc->cmdTransportInfo.paramMask & SSTCP_PKT3_PACKEDCOLOR) != 0) { - FxU32 packedColor = 0x00; - - if (*dataList == (GR_VERTEX_R_OFFSET << 2)) { - packedColor = (RGBA_COMP_CLAMP(FARRAY(fp, (GR_VERTEX_B_OFFSET << 2)), B) | - RGBA_COMP_CLAMP(FARRAY(fp, (GR_VERTEX_G_OFFSET << 2)), G) | - RGBA_COMP_CLAMP(FARRAY(fp, (GR_VERTEX_R_OFFSET << 2)), R)); - - dataList++; - } - - TRI_SET(packedColor); - } else { - TRI_SETF(0.0f); - } -#else /* !GLIDE_PACKED_RGB */ - /* Parameters up to alpha. - * - * NB: It is up to the user to correctly set this up - * so that the alpha is sent. - */ - while(*dataList != (GR_VERTEX_A_OFFSET << 2)) { - TRI_SETF(FARRAY(fp, *dataList)); - dataList++; - } - - /* Send constant Alpha == 0.0f */ - TRI_SETF(0.0f); -#endif /* !GLIDE_PACKED_RGB */ - - /* Skip the actual alpha value in the data list */ - dataList++; - -#if GLIDE_FP_CLAMP_TEX - while(*dataList != 0) { - TRI_SETF(FARRAY(fp, *dataList)); - dataList++; - } - - dataList++; -#endif /* GLIDE_FP_CLAMP_TEX */ - - /* Anything else in the dataList */ - while(*dataList != 0) { - TRI_SETF_CLAMP(FARRAY(fp, *dataList)); - dataList++; - } - } - } - } - } - - TRI_END; - GR_CHECK_SIZE(); -#else - { - GrVertex a, b; - - /* - ** make corners of a square - */ - a = - b = *e; - - a.tmuvtx[0].oow = - b.tmuvtx[0].oow = _GlideRoot.pool.f1; - - a.x -= _GlideRoot.pool.f1; - a.y -= _GlideRoot.pool.f1; - - b.x += _GlideRoot.pool.f1; - b.y -= _GlideRoot.pool.f1; - - a.a = - b.a = _GlideRoot.pool.f0; - - grDrawTriangle(&a, &b, e); /* A B E */ - - b.x -= 2.0F; /* compute point D */ - b.y += 2.0F; - grDrawTriangle(&a, e, &b); /* A E D */ - - a.x += 2.0F; /* compute point C */ - a.y += 2.0F; - grDrawTriangle(&b, e, &a); /* D E C */ - - b.x += 2.0F; - b.y -= 2.0F; - grDrawTriangle(&a, e, &b); /* C E B */ - } -#endif /* GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP */ - - /* Restore culling mode */ - gc->state.cull_mode = cullSave; -#endif -#undef FN_NAME -} /* grAADrawPoint */ -#endif /* !GLIDE3_ALPHA */ - -#if GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP -static void -grAADrawStrip(const FxU32 cullMode, const float* const vectorList[], const FxU32 vectorNum) -{ -#define FN_NAME "grAADrawStrip" - const FxU32 vertexParamOffset = _GlideRoot.curVertexSize; - - GR_BEGIN_NOFIFOCHECK(FN_NAME, gc->myLevel); - GDBG_INFO_MORE(gc->myLevel, "(): 0x%X\n", vectorNum); - - GR_FLUSH_STATE(); - - GR_SET_EXPECTED_SIZE(vertexParamOffset * vectorNum, 1); - TRI_PACKET_BEGIN(cullMode, gc->cmdTransportInfo.paramMask, - vectorNum, vertexParamOffset, - SSTCP_PKT3_BDDDDD); - { - FxU32 v; - - for(v = 0; v < vectorNum; v++) { - const float* const vector = vectorList[v]; - - TRI_SETF(vector[GR_VERTEX_X_OFFSET]); - TRI_SETF(vector[GR_VERTEX_Y_OFFSET]); - - { - const int* dataList = gc->tsuDataList; - -#if GLIDE_PACKED_RGB - if ((gc->cmdTransportInfo.paramMask & SSTCP_PKT3_PACKEDCOLOR) != 0) { - 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++; - } - - packedColor |= RGBA_COMP_CLAMP(FARRAY(vector, (GR_VERTEX_A_OFFSET << 2)), A); - TRI_SET(packedColor); - } else { - TRI_SETF(FARRAY(vector, (GR_VERTEX_A_OFFSET << 2))); - } - dataList++; -#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(); -#undef FN_NAME -} -#else /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ -/* -** grAADrawEdgeTriangle -*/ -static void -grAADrawEdgeTriangle(float *va, float *vb, float *vc) -{ - float - *fa = va, - *fb = vb, - *fc = vc, - dpAB, dpBC, - dpdx, dpdy, /* Change in parameter WRT x & y */ - area; - float - ooa, dxAB, dxBC, dyAB, dyBC; - float negateArea = -1.f; - - GR_BEGIN_NOFIFOCHECK("grAADrawEdgeTriangle",gc->myLevel); - GDBG_INFO_MORE(gc->myLevel,"()\n"); - GR_FLUSH_STATE(); - - /* - ** Sort the vertices. - ** Whenever the radial order is reversed (from counter-clockwise to - ** clockwise), we need to change the area of the triangle. Note - ** that we know the first two elements are X & Y by looking at the - ** grVertex structure. - */ - if (va[1] < vb[1]) { - if (vb[1] > vc[1]) { /* acb */ - if (va[1] < vc[1]) { - fa = va; - fb = vc; - fc = vb; - negateArea *= -1.f; - } else { /* cab */ - fa = vc; - fb = va; - fc = vb; - } - /* else it's already sorted */ - } - } else { - if (vb[1] < vc[1]) { /* bac */ - if (va[1] < vc[1]) { - fa = vb; - fb = va; - fc = vc; - negateArea *= -1.f; - } else { /* bca */ - fa = vb; - fb = vc; - fc = va; - } - } else { /* cba */ - fa = vc; - fb = vb; - fc = va; - negateArea *= -1.f; - } - } - - /* Compute Area */ - dxAB = fa[0] - fb[0]; - dxBC = fb[0] - fc[0]; - - dyAB = fa[1] - fb[1]; - dyBC = fb[1] - fc[1]; - - area = dxAB * dyBC - dxBC * dyAB; - - /* Zero-area triangles are BAD!! */ - if (area == 0.0f) goto all_done; - - ooa = 1.0f / area; - - /* - ** Divide the deltas by the area for gradient calculation. - */ - dxBC *= ooa; - dyAB *= ooa; - dxAB *= ooa; - dyBC *= ooa; - - GR_SET_EXPECTED_SIZE(((10 + (_GlideRoot.paramCount - 1)) << 2), - 10 + (_GlideRoot.paramCount - 1)); - - /* write out X & Y for vertex A */ - GR_SETF(BROADCAST_ID, hw, FvA.x, fa[0]); - GR_SETF(BROADCAST_ID, hw, FvA.y, fa[1]); - - /* write out X & Y for vertex B */ - GR_SETF(BROADCAST_ID, hw, FvB.x, fb[0]); - GR_SETF(BROADCAST_ID, hw, FvB.y, fb[1]); - - /* write out X & Y for vertex C */ - GR_SETF(BROADCAST_ID, hw, FvC.x, fc[0]); - GR_SETF(BROADCAST_ID, hw, FvC.y, fc[1]); - - dpAB = (fa[GR_VERTEX_A_OFFSET] - fb[GR_VERTEX_A_OFFSET]); - dpBC = (fb[GR_VERTEX_A_OFFSET] - fc[GR_VERTEX_A_OFFSET]); - dpdx = dpAB * dyBC - dpBC * dyAB; - dpdy = dpBC * dxAB - dpAB * dxBC; - - /* Write the alpha data */ - GR_SETF(BROADCAST_ID, hw, Fa, fa[GR_VERTEX_A_OFFSET]); - GR_SETF(BROADCAST_ID, hw, Fdadx , dpdx); - GR_SETF(BROADCAST_ID, hw, Fdady , dpdy); - - { - const struct dataList_s* dlp = gc->regDataList; - int i = dlp->i; - - /* We already put the alpha out, and this is guaranteed to - * be included in the dataList via convention. - */ - while (i != (GR_VERTEX_A_OFFSET << 2)) { - GR_SETF_INDEX(BROADCAST_ID, hw, ((FxU32*)dlp->addr - (FxU32*)hw), FARRAY(fa, i)); - dlp++; - i = dlp->i; - } - - dlp++; - i = dlp->i; - - while (i != 0) { - GR_SETF_INDEX(BROADCAST_ID, hw, ((FxU32*)dlp->addr - (FxU32*)hw), FARRAY(fa, i)); - dlp++; - i = dlp->i; - } - - /* Draw the triangle by writing the area to the triangleCMD register */ - GR_SETF(BROADCAST_ID, hw, FtriangleCMD, area); - } - -all_done: - GR_END(); -} /* grAADrawEdgeTriangle */ -#endif /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - -#ifndef GLIDE3_ALPHA -#if (GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) -#define FUCAST( X ) (*(FxU32*)&(X)) -GR_ENTRY(grAADrawLine, void, (const GrVertex *v1, const GrVertex *v2)) -{ -#define FN_NAME "grAADrawLine" - GR_DCL_GC; - GrVertex *_v1, *_v2; - const FxU32 vertexParamOffset = _GlideRoot.curVertexSize; - const int* datalist; - float xoff, yoff; - float alpha; - float dx, dy; /* delta X and Y */ - float adx, ady;/* |dX| and |dY| */ - - GR_CHECK_COMPATABILITY(FN_NAME, - ((gc->cmdTransportInfo.paramMask & (SST_SETUP_A << SSTCP_PKT3_PMASK_SHIFT)) == 0), - "Antialiasing require enabling alpha"); - - GR_SET_EXPECTED_SIZE( vertexParamOffset * 6, 1 ); - TRI_PACKET_BEGIN( 0, - gc->cmdTransportInfo.paramMask, - 6, - vertexParamOffset, - SSTCP_PKT3_BDDDDD ); - - /* y sort*/ - if (v2->y < v1->y) { - _v1 = (void*) v2; - _v2 = (void*) v1; - } else { - _v1 = (void*) v1; - _v2 = (void*) v2; - } - -#define v1 _v1 -#define v2 _v2 - /* compute deltas and absolute deltas */ - - dx = v2->x - v1->x; - dy = v2->y - v1->y; - - adx = (float)(FUCAST( dx ) & 0x7fffffff); - ady = (float)(FUCAST( dy ) & 0x7fffffff); - - if ( adx >= ady ) { - xoff = 0.0f; - yoff = 1.0f; - } else { - xoff = 1.0f; - yoff = 0.0f; - } - - /* A---B Alpha = 0.0 - | \ | - V1-V2 Alpha = 1.0 ( user ) - | \ | - E---F Alpha = 0.0 - */ - - /* B Vertex */ - TRI_SETF( v2->x + xoff ); - TRI_SETF( v2->y - yoff ); - - alpha = v2->a; - v2->a = 0.0f; - datalist = gc->tsuDataList; - - while( *datalist != 0 ) { - TRI_SETF(FARRAY(v2, *datalist)); - datalist++; - } - - v2->a = alpha; - - /* A Vertex */ - datalist = gc->tsuDataList; - - TRI_SETF( v1->x + xoff ); - TRI_SETF( v1->y - yoff ); - - alpha = v1->a; - v1->a = 0.0f; - datalist = gc->tsuDataList; - - while( *datalist != 0 ) { - TRI_SETF(FARRAY(v1, *datalist)); - datalist++; - } - - v1->a = alpha; - - /* V2 Vertex */ - datalist = gc->tsuDataList; - - TRI_SETF( v2->x ); - TRI_SETF( v2->y ); - - while( *datalist != 0 ) { - TRI_SETF(FARRAY(v2, *datalist)); - datalist++; - } - - /* V1 Vertex */ - datalist = gc->tsuDataList; - - TRI_SETF( v1->x ); - TRI_SETF( v1->y ); - - while( *datalist != 0 ) { - TRI_SETF(FARRAY(v1, *datalist)); - datalist++; - } - - /* F Vertex */ - datalist = gc->tsuDataList; - - TRI_SETF( v2->x - xoff ); - TRI_SETF( v2->y + yoff ); - - alpha = v2->a; - v2->a = 0.0f; - datalist = gc->tsuDataList; - - while( *datalist != 0 ) { - TRI_SETF(FARRAY(v2, *datalist)); - datalist++; - } - - v2->a = alpha; - - /* E Vertex */ - datalist = gc->tsuDataList; - - TRI_SETF( v1->x - xoff ); - TRI_SETF( v1->y + yoff ); - - alpha = v1->a; - v1->a = 0.0f; - datalist = gc->tsuDataList; - - - while( *datalist != 0 ) { - TRI_SETF(FARRAY(v1, *datalist)); - datalist++; - } - v1->a = alpha; -#undef v1 -#undef v2 - - TRI_END; - GR_CHECK_SIZE(); -#undef FN_NAME -} -#else /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ -/*--------------------------------------------------------------------------- -** grAADrawLine -*/ -GR_ENTRY(grAADrawLine, void, (const GrVertex *v1, const GrVertex *v2)) -{ -#ifdef GLIDE3 - float *vlist[2]; - vlist[0] = (float *)v1; - vlist[1] = (float *)v2; - _grAADrawLineStrip(GR_VTX_PTR_ARRAY, GR_LINE_STRIP, 2, vlist); -#else - float dx, dy; /* delta X and Y */ - float adx, ady; /* |dX| and |dY| */ - GrVertex a, b, e, f; /* four vertices outlining the line */ - GR_DCL_GC; - - /* turn off culling so triangles unconditionally draw. - * - * NB: On cvg we control this via the command packet. - */ - GrCullMode_t cullSave = gc->state.cull_mode; - gc->state.cull_mode = GR_CULL_DISABLE; - - GDBG_INFO(95, "grAADrawLine (%f %f) -> (%f %f)\n", - v1->x, v1->y, v2->x, v2->y); - - GR_FLUSH_STATE(); - - /* draw from low Y to high Y */ - if (v2->y < v1->y) { - const GrVertex* tv = v1; v1 = v2; v2 = tv; - } - - /* compute deltas and absolute deltas */ - dx = adx = v2->x - v1->x; - dy = ady = v2->y - v1->y; - if (adx < 0) - adx = -adx; - if (ady < 0) - ady = -ady; - - a = *v1; - e = *v1; - b = *v2; - f = *v2; - - if (adx >= ady) { /* X major line */ - a.y -= _GlideRoot.pool.f1; - a.a = 0.F; - b.y -= _GlideRoot.pool.f1; - b.a = 0.F; - e.y += _GlideRoot.pool.f1; - e.a = 0.F; - f.y += _GlideRoot.pool.f1; - f.a = 0.F; - - grDrawTriangle(&a, v2, &b); - grDrawTriangle(&a, v2, v1); - grDrawTriangle(v1, &f, &e); - grDrawTriangle(v1, v2, &f); - } else { /* Y major line */ - a.x += _GlideRoot.pool.f1; - a.a = 0.F; - b.x += _GlideRoot.pool.f1; - b.a = 0.F; - e.x -= _GlideRoot.pool.f1; - e.a = 0.F; - f.x -= _GlideRoot.pool.f1; - f.a = 0.F; - - grDrawTriangle(&a, &b, v2); - grDrawTriangle(v1, &a, v2); - grDrawTriangle(v1, &f, &e); - grDrawTriangle(v1, v2, &f); - } - - gc->state.cull_mode = cullSave; -#endif /* GLIDE3 */ -} /* grAADrawLine */ -#endif /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ -#endif /* !GLIDE3_ALPHA */ - -typedef enum { - aaEdgeSenseTop, - aaEdgeSenseLeft, - aaEdgeSenseBottom, - aaEdgeSenseRight -} aaEdgeSense; - -/* -** grAADrawTriEdge -*/ -static void -grAADrawTriEdge(const GrVertex *a, const GrVertex *b, aaEdgeSense sense) -{ - GrVertex c = *a, d = *b; - - c.a = 0.f; - d.a = 0.f; - - switch (sense) { - case aaEdgeSenseTop: - c.y += _GlideRoot.pool.f1; - d.y += _GlideRoot.pool.f1; - break; - - case aaEdgeSenseLeft: - c.x -= _GlideRoot.pool.f1; - d.x -= _GlideRoot.pool.f1; - break; - - case aaEdgeSenseBottom: - c.y -= _GlideRoot.pool.f1; - d.y -= _GlideRoot.pool.f1; - break; - - case aaEdgeSenseRight: - c.x += _GlideRoot.pool.f1; - d.x += _GlideRoot.pool.f1; - break; - } - -#if GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP - { - /* Maintain the same culling mode that we would have used for - * the inner triangle. - */ - GR_DCL_GC; - const FxU32 cullMode = gc->state.cull_mode; - const FxU32 sMode = ((cullMode != GR_CULL_DISABLE) - ? (kSetupCullEnable | ((cullMode == GR_CULL_POSITIVE) - ? kSetupCullPositive - : kSetupCullNegative)) - : kSetupCullDisable); - const float* lVertexList[4]; - - lVertexList[0] = &c.x; - lVertexList[1] = &d.x; - lVertexList[2] = &a->x; - lVertexList[3] = &b->x; - - grAADrawStrip(kSetupStrip | sMode, - lVertexList, - sizeof(lVertexList) / sizeof(lVertexList[0])); - } -#else /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - if (a->y < b->y) { - grAADrawEdgeTriangle((float *) a, (float *) &c, (float *) &d); - grAADrawEdgeTriangle((float *) a, (float *) &d, (float *) b); - } else { - grAADrawEdgeTriangle((float *) b, (float *) &d, (float *) &c); - grAADrawEdgeTriangle((float *) b, (float *) &c, (float *) a); - } -#endif /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ -} /* grAADrawTriEdge */ - -#define DXSQUARED(i,j) ((i->x - j->x) * (i->x - j->x)) -#define DYSQUARED(i,j) ((i->y - j->y) * (i->y - j->y)) - -/* -** -*/ -static aaEdgeSense -aaCalcEdgeSense(const GrVertex *a, const GrVertex *b, const GrVertex *c) -{ - const GrVertex *tv; - float dx, dy; - - if (a->y >= b->y) { - tv = a; a = b; b = tv; - } - dx = a->x - b->x; - dy = a->y - b->y; - - if (dx == 0.f) { - return ((c->x > a->x) ? aaEdgeSenseLeft : aaEdgeSenseRight); - } - else if (dy == 0.0f) { - return ((c->y > a->y) ? aaEdgeSenseBottom : aaEdgeSenseTop); - } - else { - float dcax, dcay, dcbx, dcby, cp; - dcax = a->x - c->x; - dcay = a->y - c->y; - dcbx = b->x - c->x; - dcby = b->y - c->y; - cp = dcax * dcby - dcay * dcbx; - - if (dx > 0.0f) { - if (dx >= -dy) /* X-major line */ - return ((cp > 0.0f) ? aaEdgeSenseTop : aaEdgeSenseBottom); - else /* Y-major line */ - return ((cp > 0.0f) ? aaEdgeSenseRight : aaEdgeSenseLeft); - } - else { - if (dx <= dy) /* X-major line */ - return ((cp < 0.0f) ? aaEdgeSenseTop : aaEdgeSenseBottom); - else /* Y-major line */ - return ((cp < 0.0f) ? aaEdgeSenseLeft : aaEdgeSenseRight); - } - } -} /* aaCalcEdgeSense */ - -/*--------------------------------------------------------------------------- -** grAADrawTriangle -** -** NOTE: This doesn't quite work yet -*/ -GR_ENTRY(grAADrawTriangle, - void, - (const GrVertex *a, const GrVertex *b, const GrVertex *c, - FxBool ab_antialias, FxBool bc_antialias, FxBool ca_antialias)) -{ -#define FN_NAME "grAADrawTriangle" - FxU32 - fbzMode, /* What we write to fbzMode */ - fbzModeOld; /* Squirrel away current fbzMode */ - aaEdgeSense - sense; /* Edge sense for edge polygons */ - - GR_BEGIN_NOFIFOCHECK(FN_NAME, 96); - GDBG_INFO_MORE(gc->myLevel,"(0x%x,0x%x,0x%x,%d,%d,%d)\n", - a,b,c,ab_antialias,bc_antialias,ca_antialias); - - GR_CHECK_COMPATABILITY(FN_NAME, - ((gc->cmdTransportInfo.paramMask & (SST_SETUP_A << SSTCP_PKT3_PMASK_SHIFT)) == 0), - "Antialiasing require enabling alpha"); - - GR_FLUSH_STATE(); - - fbzModeOld = gc->state.fbi_config.fbzMode; - - /* backfaced or zero area */ - if (TRISETUP(a, b, c) <= 0) return; - - /* Disable depth buffer writes for edge triangles */ - fbzMode = fbzModeOld; - fbzMode &= ~(SST_ZAWRMASK); - -#if 1 /* speckle mini-workaround, another one below... - jeske */ - GR_SET_EXPECTED_SIZE(4 * 2, 1 * 2); - GR_SET(BROADCAST_ID, hw, nopCMD, 0); - GR_SET(BROADCAST_ID, hw, fbzMode, fbzMode); -#else - GR_SET_EXPECTED_SIZE(4,1); - GR_SET(BROADCAST_ID, hw, fbzMode, fbzMode); -#endif - GR_CHECK_SIZE(); - - if (ab_antialias) { - sense = aaCalcEdgeSense(a, b, c); - grAADrawTriEdge(a, b, sense); - } - - if (bc_antialias) { - sense = aaCalcEdgeSense(b, c, a); - grAADrawTriEdge(b, c, sense); - } - - if (ca_antialias) { - sense = aaCalcEdgeSense(c, a, b); - grAADrawTriEdge(c, a, sense); - } - - /* Restore the old fbzMode */ -#if 1 /* speckle mini-workaround, another one above... - jeske */ - GR_SET_EXPECTED_SIZE(4 * 2, 1 * 2); - GR_SET(BROADCAST_ID, hw, nopCMD, 0); - GR_SET(BROADCAST_ID, hw, fbzMode, fbzModeOld); -#else - GR_SET_EXPECTED_SIZE(4,1); - GR_SET(BROADCAST_ID, hw, fbzMode, fbzModeOld); -#endif - GR_END(); -#undef FN_NAME -} /* grAADrawTriangle */ - -/*--------------------------------------------------------------------------- -** grAADrawPolygon -** NOTE: This routine does not do backface culling!!! -*/ - -GR_ENTRY(grAADrawPolygon, void, (const int nverts, const int ilist[], const GrVertex vlist[])) -{ -#define FN_NAME "grAADrawPolygon" - int - i = 1; /* index into ilist */ - const GrVertex - *a, *b, *c; /* What we end up sending */ - aaEdgeSense - sense; /* Edge sense for edge polygons */ - - GR_BEGIN_NOFIFOCHECK("grAADrawPolygon",97); - GDBG_INFO_MORE(gc->myLevel,"(%d,0x%x,0x%x)\n",nverts,ilist,vlist); - - GR_CHECK_COMPATABILITY(FN_NAME, - ((gc->cmdTransportInfo.paramMask & (SST_SETUP_A << SSTCP_PKT3_PMASK_SHIFT)) == 0), - "Antialiasing require enabling alpha"); - - GR_FLUSH_STATE(); - - for (i=1; i < nverts - 1; i++) { - a = &vlist[ilist[0]]; - b = &vlist[ilist[i]]; - c = &vlist[ilist[i+1]]; - if (TRISETUP (a, b, c) <= 0) /* backfaced or zero area */ - continue; - - /* - ** Always draw the BC edge. - ** On the first triangle, additionally draw the AB edge. - ** On the last triangle, draw the CA edge. - */ - if (i == 1) { - sense = aaCalcEdgeSense(a, b, c); - grAADrawTriEdge(a, b, sense); - - } else if (i == (nverts - 2)) { - sense = aaCalcEdgeSense(c, a, b); - grAADrawTriEdge(c, a, sense); - } - - sense = aaCalcEdgeSense(b, c, a); - grAADrawTriEdge(b, c, sense); - } - - GR_END(); -#undef FN_NAME -} /* grAADrawPolygon */ - -/*--------------------------------------------------------------------------- -** grAADrawPolygonVertexList -** NOTE: This routine does not do backface culling!!! -*/ - -GR_ENTRY(grAADrawPolygonVertexList, void, (const int nverts, const GrVertex vlist[])) -{ -#define FN_NAME "grAADrawPolygonVertexList" - int - i = 1; /* index into ilist */ - const GrVertex - *a, *b, *c; /* What we end up sending */ - aaEdgeSense - sense; /* Edge sense for edge polygons */ - FxI32 - res; - - GR_BEGIN_NOFIFOCHECK("grAADrawPolygonVertexList",97); - GDBG_INFO_MORE(gc->myLevel,"(%d,0x%x)\n",nverts,vlist); - - GR_CHECK_COMPATABILITY(FN_NAME, - ((gc->cmdTransportInfo.paramMask & (SST_SETUP_A << SSTCP_PKT3_PMASK_SHIFT)) == 0), - "Antialiasing require enabling alpha"); - - GR_FLUSH_STATE(); - - for (i=1; i < nverts - 1; i++) { - a = &vlist[0]; - b = &vlist[i]; - c = &vlist[i+1]; - - res = TRISETUP (a, b, c); - if (res <= 0) /* backfaced or zero area */ - continue; - - /* - ** Always draw the BC edge. - ** On the first triangle, additionally draw the AB edge. - ** On the last triangle, draw the CA edge. - */ - if (i == 1) { - sense = aaCalcEdgeSense(a, b, c); - grAADrawTriEdge(a, b, sense); - - } else if (i == (nverts - 2)) { - sense = aaCalcEdgeSense(c, a, b); - grAADrawTriEdge(c, a, sense); - } - - sense = aaCalcEdgeSense(b, c, a); - grAADrawTriEdge(b, c, sense); - - } - GR_END(); -#undef FN_NAME -} /* grAADrawPolygonVertexList */ - -#ifdef GLIDE3 /* glide 3. draw aa points, and aa strip line routine */ -#define OK_TO_SKIP_XY -#define ZEROALPHA(_ss) *((FxU32 *)&_ss)=*((FxU32 *)&_ss)&0x00ffffff - -/*------------------------------------------------------------------- - Function: _grAADrawPoints - Date: 13-Oct-97 - Implementor(s): atai - Description: - Draw anti-alias points - Arguments: - - Return: - -------------------------------------------------------------------*/ -void FX_CSTYLE -_grAADrawPoints(FxI32 mode, FxI32 count, void *pointers) -{ -#define FN_NAME "_grAADrawPoints" - - /* - * the aa point routine is similar to grAADrawPoint routine - * except the data set up is from the pointer array and - * its data layout - */ - GR_DCL_GC; - GrCullMode_t cullSave; - float *e, ptX, ptY; - FxU32 ia; - FxU32 i; - FxU32 vsize; - FxI32 stride = mode; - - GDBG_INFO(94,"_grAADrawPoints(0x%x)\n",e); - - GDBG_INFO_MORE(gc->myLevel, "(count = %d, pointers = 0x%x)\n", - count, pointers); - - /* turn off culling so triangles unconditionally draw */ - cullSave = gc->state.cull_mode; - gc->state.cull_mode = GR_CULL_DISABLE; - - if (stride == 0) - stride = gc->state.vData.vStride; - - GR_FLUSH_STATE(); - - if (gc->state.vData.colorType == GR_FLOAT) - ia = gc->state.vData.aInfo.offset; - else - ia = gc->state.vData.pargbInfo.offset; - - vsize = gc->state.vData.vSize * 6; - - if (gc->state.grCoordinateSpaceArgs.coordinate_space_mode == GR_WINDOW_COORDS) { - while (count--) { - FxU32 dataElem = 0; - - /* We draw this as a 4 triangle fan centered around E. */ - GR_SET_EXPECTED_SIZE(vsize, 1); - TRI_STRIP_BEGIN(kSetupFan, - 0x06UL, gc->state.vData.vSize, - SSTCP_PKT3_BDDDDD); - - e = pointers; - if (mode) - e = *(float **)e; - (float *)pointers += stride; - - ptX = FARRAY(e, GR_VERTEX_X_OFFSET << 2); - ptY = FARRAY(e, GR_VERTEX_Y_OFFSET << 2); - - /* Send down the original point center */ - TRI_SETF(ptX); - TRI_SETF(ptY); - - dataElem = 0; - i = gc->tsuDataList[dataElem]; - while (i != GR_DLIST_END) { - TRI_SETF(FARRAY(e, i)); - dataElem++; - i = gc->tsuDataList[dataElem]; - } - - /* Send the 'surrounding' vertices w/ alpha == 0.0f. To avoid - * the vertex copying from the previous version we carry around - * a table of offsets that we add into the original point to get - * the new points. - */ - { - int v; - static const float xAdjust[] = { 1.0f, -1.0f, -1.0f, 1.0f, 1.0f }; - static const float yAdjust[] = { -1.0f, -1.0f, 1.0f, 1.0f, -1.0f }; - - ASSERT(ArraySize(xAdjust) == ArraySize(yAdjust)); - - if (gc->state.vData.colorType == GR_FLOAT) { - - for(v = 0; v < ArraySize(xAdjust); v++) { - TRI_SETF(ptX + xAdjust[v]); - TRI_SETF(ptY + yAdjust[v]); - - dataElem = 0; - - i = gc->tsuDataList[dataElem]; - - while (i != GR_DLIST_END) { - if (i == ia) { - TRI_SETF(0.0f); - } - else { - TRI_SETF(FARRAY(e, i)); - } - dataElem++; - i = gc->tsuDataList[dataElem]; - } - } - } - else { - for(v = 0; v < ArraySize(xAdjust); v++) { - TRI_SETF(ptX + xAdjust[v]); - TRI_SETF(ptY + yAdjust[v]); - - dataElem = 0; - - i = gc->tsuDataList[dataElem]; - - while (i != GR_DLIST_END) { - FxU32 argb; - - if (i == ia) { - argb = *((FxU32 *)((int)e + i)) & 0x00ffffff; - TRI_SETF(*((float *)&argb)); - } - else { - TRI_SETF(FARRAY(e, i)); - } - dataElem++; - i = gc->tsuDataList[dataElem]; - } - } - } - - } - TRI_END; - GR_CHECK_SIZE(); - } - } - else { - /* - * first cut of clip space coordinate code. - */ - - float oow; - - while (count--) { - FxU32 dataElem = 0; - - /* We draw this as a 4 triangle fan centered around E. */ - GR_SET_EXPECTED_SIZE(vsize, 1); - TRI_STRIP_BEGIN(kSetupFan, - 0x06UL, gc->state.vData.vSize, - SSTCP_PKT3_BDDDDD); - - e = pointers; - if (mode) - e = *(float **)e; - oow = 1.0f / FARRAY(e, gc->state.vData.wInfo.offset); - (float *)pointers += stride; - - ptX = FARRAY(e, GR_VERTEX_X_OFFSET << 2) - *oow*gc->state.Viewport.hwidth+gc->state.Viewport.ox; - ptY = FARRAY(e, GR_VERTEX_Y_OFFSET << 2) - *oow*gc->state.Viewport.hheight+gc->state.Viewport.oy; - - /* Send down the original point center */ - TRI_SETF(ptX); - TRI_SETF(ptY); - - TRI_VP_SETFS(e,oow); - - /* Send the 'surrounding' vertices w/ alpha == 0.0f. To avoid - * the vertex copying from the previous version we carry around - * a table of offsets that we add into the original point to get - * the new points. - */ - { - int v; - static const float xAdjust[] = { 1.0f, -1.0f, -1.0f, 1.0f, 1.0f }; - static const float yAdjust[] = { -1.0f, -1.0f, 1.0f, 1.0f, -1.0f }; - - ASSERT(ArraySize(xAdjust) == ArraySize(yAdjust)); - - if (gc->state.vData.colorType == GR_FLOAT) { - - for(v = 0; v < ArraySize(xAdjust); v++) { - TRI_SETF(ptX + xAdjust[v]); - TRI_SETF(ptY + yAdjust[v]); - AA_TRI_VP_SETFS(e, oow); - } - } - else { - for(v = 0; v < ArraySize(xAdjust); v++) { - TRI_SETF(ptX + xAdjust[v]); - TRI_SETF(ptY + yAdjust[v]); - AA_TRI_VP_SETFS(e, oow); - } - } - - } - TRI_END; - GR_CHECK_SIZE(); - } - } - - gc->state.cull_mode = cullSave; - -#undef FN_NAME -} /* _grAADrawPoints */ - - -/*------------------------------------------------------------------- - Function: _grAADrawLineStrip - Date: 13-Oct-97 - Implementor(s): atai - Description: - Draw anti-alias strip line - Arguments: - - Return: - -------------------------------------------------------------------*/ -void FX_CSTYLE -_grAADrawLineStrip(FxI32 mode, FxI32 ltype, FxI32 count, void *pointers) -{ -#define FN_NAME "_grAADrawLineStrip" -#if 1 - /* - * the aa line strip routine is similar to grAADrawLine routine - * except the data set up is from the pointer array and - * its data layout - */ - GR_DCL_GC; - float adx, ady; /* |dX| and |dY| */ - float **lPtrs = (float **) pointers; - float *v1, *v2; - float v1a, v2a; - FxU32 ia, vNum = 0; - FxU32 vsize; - FxU32 sCount; - FxI32 stride = mode; - - GDBG_INFO(95,"_grAADrawLineStrip(count = %d, pointers = 0x%x)\n", - count, pointers); - - if (gc->state.vData.colorType == GR_FLOAT) { - ia = gc->state.vData.aInfo.offset; - v1a = 0.0f; - v2a = 0.0f; - } - else - ia = gc->state.vData.pargbInfo.offset; - - GR_FLUSH_STATE(); - - if (stride == 0) - stride = gc->state.vData.vStride; - if (ltype == GR_LINES) - sCount = count >> 1; /* line list */ - else - sCount = count-1; /* strip line */ - - vsize = 6 * gc->state.vData.vSize; - - if (gc->state.grCoordinateSpaceArgs.coordinate_space_mode == GR_WINDOW_COORDS) { - while (sCount--) { - v1 = (float *)pointers; - v2 = (float *)pointers + 1; - if (mode) { - v1 = *(float **)v1; - v2 = *(float **)v2; - } - (float *)pointers += stride; - if (ltype == GR_LINES) - (float *)pointers += stride; - - /* draw from low Y to high Y */ - if (FARRAY(v2, GR_VERTEX_Y_OFFSET << 2) < FARRAY(v1, GR_VERTEX_Y_OFFSET << 2)) { - float* tv = v1; v1 = v2; v2 = tv; - } - - /* compute deltas and absolute deltas */ - adx = FARRAY(v2, GR_VERTEX_X_OFFSET << 2) - FARRAY(v1, GR_VERTEX_X_OFFSET << 2); - ady = FARRAY(v2, GR_VERTEX_Y_OFFSET << 2) - FARRAY(v1, GR_VERTEX_Y_OFFSET << 2); - if (adx < 0) - adx = -adx; - if (ady < 0) - ady = -ady; - - if (gc->state.vData.colorType != GR_FLOAT) { - *((FxU32 *)&v1a)=*((FxU32 *)((int)v1 + ia))&0x00ffffff; - *((FxU32 *)&v2a)=*((FxU32 *)((int)v2 + ia))&0x00ffffff; - } - - GR_SET_EXPECTED_SIZE(vsize, 1); - TRI_STRIP_BEGIN(kSetupStrip, 6, gc->state.vData.vSize, SSTCP_PKT3_BDDDDD); - - if (adx >= ady) { /* X major line */ - FxU32 i, dataElem; - - /* point 1 (b) = (v2)*/ - TRI_SETF(FARRAY(v2, GR_VERTEX_X_OFFSET << 2)); - TRI_SETF(FARRAY(v2, GR_VERTEX_Y_OFFSET << 2) - _GlideRoot.pool.f1); - dataElem = 0; - i = gc->tsuDataList[dataElem]; - while (i != GR_DLIST_END) { - if (i == ia) { TRI_SETF(v2a); } else { TRI_SETF(FARRAY(v2, i)); } - dataElem++; i = gc->tsuDataList[dataElem]; - } - - /* point 2 (a) = (v1)*/ - TRI_SETF(FARRAY(v1, GR_VERTEX_X_OFFSET << 2)); - TRI_SETF(FARRAY(v1, GR_VERTEX_Y_OFFSET << 2) - _GlideRoot.pool.f1); - dataElem = 0; - i = gc->tsuDataList[dataElem]; - while (i != GR_DLIST_END) { - if (i == ia) { TRI_SETF(v1a); } else { TRI_SETF(FARRAY(v1, i)); } - dataElem++; i = gc->tsuDataList[dataElem]; - } - - /* point 3 (v2) = (v2)*/ - TRI_SETF(FARRAY(v2, GR_VERTEX_X_OFFSET << 2)); - TRI_SETF(FARRAY(v2, GR_VERTEX_Y_OFFSET << 2)); - dataElem = 0; - i = gc->tsuDataList[dataElem]; - while (i != GR_DLIST_END) { - TRI_SETF(FARRAY(v2, i)); - dataElem++; i = gc->tsuDataList[dataElem]; - } - - /* point 4 (v1) = (v1)*/ - TRI_SETF(FARRAY(v1, GR_VERTEX_X_OFFSET << 2)); - TRI_SETF(FARRAY(v1, GR_VERTEX_Y_OFFSET << 2)); - dataElem = 0; - i = gc->tsuDataList[dataElem]; - while (i != GR_DLIST_END) { - TRI_SETF(FARRAY(v1, i)); - dataElem++; i = gc->tsuDataList[dataElem]; - } - - /* point 5 (f) = (v2)*/ - TRI_SETF(FARRAY(v2, GR_VERTEX_X_OFFSET << 2)); - TRI_SETF(FARRAY(v2, GR_VERTEX_Y_OFFSET << 2) + _GlideRoot.pool.f1); - dataElem = 0; - i = gc->tsuDataList[dataElem]; - while (i != GR_DLIST_END) { - if (i == ia) { TRI_SETF(v2a); } else { TRI_SETF(FARRAY(v2, i)); } - dataElem++; i = gc->tsuDataList[dataElem]; - } - - /* point 6 (a) = (v1)*/ - TRI_SETF(FARRAY(v1, GR_VERTEX_X_OFFSET << 2)); - TRI_SETF(FARRAY(v1, GR_VERTEX_Y_OFFSET << 2) + _GlideRoot.pool.f1); - dataElem = 0; - i = gc->tsuDataList[dataElem]; - while (i != GR_DLIST_END) { - if (i == ia) { TRI_SETF(v1a); } else { TRI_SETF(FARRAY(v1, i)); } - dataElem++; i = gc->tsuDataList[dataElem]; - } - - } else { /* Y major line */ - FxU32 i, dataElem; - - /* point 1 (b) = (v2)*/ - TRI_SETF(FARRAY(v2, GR_VERTEX_X_OFFSET << 2) + _GlideRoot.pool.f1); - TRI_SETF(FARRAY(v2, GR_VERTEX_Y_OFFSET << 2)); - dataElem = 0; - i = gc->tsuDataList[dataElem]; - while (i != GR_DLIST_END) { - if (i == ia) { TRI_SETF(v2a); } else { TRI_SETF(FARRAY(v2, i)); } - dataElem++; i = gc->tsuDataList[dataElem]; - } - - /* point 2 (a) = (v1)*/ - TRI_SETF(FARRAY(v1, GR_VERTEX_X_OFFSET << 2) + _GlideRoot.pool.f1); - TRI_SETF(FARRAY(v1, GR_VERTEX_Y_OFFSET << 2)); - dataElem = 0; - i = gc->tsuDataList[dataElem]; - while (i != GR_DLIST_END) { - if (i == ia) { TRI_SETF(v1a); } else { TRI_SETF(FARRAY(v1, i)); } - dataElem++; i = gc->tsuDataList[dataElem]; - } - - /* point 3 (v2) = (v2)*/ - TRI_SETF(FARRAY(v2, GR_VERTEX_X_OFFSET << 2)); - TRI_SETF(FARRAY(v2, GR_VERTEX_Y_OFFSET << 2)); - dataElem = 0; - i = gc->tsuDataList[dataElem]; - while (i != GR_DLIST_END) { - TRI_SETF(FARRAY(v2, i)); - dataElem++; i = gc->tsuDataList[dataElem]; - } - - /* point 4 (v1) = (v1)*/ - TRI_SETF(FARRAY(v1, GR_VERTEX_X_OFFSET << 2)); - TRI_SETF(FARRAY(v1, GR_VERTEX_Y_OFFSET << 2)); - dataElem = 0; - i = gc->tsuDataList[dataElem]; - while (i != GR_DLIST_END) { - TRI_SETF(FARRAY(v1, i)); - dataElem++; i = gc->tsuDataList[dataElem]; - } - - /* point 5 (f) = (v2)*/ - TRI_SETF(FARRAY(v2, GR_VERTEX_X_OFFSET << 2) - _GlideRoot.pool.f1); - TRI_SETF(FARRAY(v2, GR_VERTEX_Y_OFFSET << 2)); - dataElem = 0; - i = gc->tsuDataList[dataElem]; - while (i != GR_DLIST_END) { - if (i == ia) { TRI_SETF(v2a); } else { TRI_SETF(FARRAY(v2, i)); } - dataElem++; i = gc->tsuDataList[dataElem]; - } - - /* point 6 (a) = (v1)*/ - TRI_SETF(FARRAY(v1, GR_VERTEX_X_OFFSET << 2) - _GlideRoot.pool.f1); - TRI_SETF(FARRAY(v1, GR_VERTEX_Y_OFFSET << 2)); - dataElem = 0; - i = gc->tsuDataList[dataElem]; - while (i != GR_DLIST_END) { - if (i == ia) { TRI_SETF(v1a); } else { TRI_SETF(FARRAY(v1, i)); } - dataElem++; i = gc->tsuDataList[dataElem]; - } - - } - TRI_END; - GR_CHECK_SIZE(); - } - } - else { - float oowa, oowb, owa, owb, tmp1, tmp2, fax, fay, fbx, fby; - - if (ltype == GR_LINE_STRIP) { - v1 = (float *)pointers; - if (mode) { - v1 = *(float **)v1; - } - oowb = 1.0f / FARRAY(v1, gc->state.vData.wInfo.offset); - } - while (sCount--) { - if (ltype == GR_LINES) { - v1 = (float *)pointers; - v2 = (float *)pointers + 1; - if (mode) { - v1 = *(float **)v1; - v2 = *(float **)v2; - } - (float *)pointers += stride; - if (ltype == GR_LINES) - (float *)pointers += stride; - owa = oowa = 1.0f / FARRAY(v1, gc->state.vData.wInfo.offset); - owb = oowb = 1.0f / FARRAY(v2, gc->state.vData.wInfo.offset); - } - else { - owa = oowa = oowb; - v1 = (float *)pointers; - v2 = (float *)pointers + 1; - if (mode) { - v1 = *(float **)v1; - v2 = *(float **)v2; - } - (float *)pointers += stride; - owb = oowb = 1.0f / FARRAY(v2, gc->state.vData.wInfo.offset); - } - - fay = tmp1 = FARRAY(v1, GR_VERTEX_Y_OFFSET << 2) - *oowa*gc->state.Viewport.hheight+gc->state.Viewport.oy; - fby = tmp2 = FARRAY(v2, GR_VERTEX_Y_OFFSET << 2) - *oowb*gc->state.Viewport.hheight+gc->state.Viewport.oy; - - /* draw from low Y to high Y */ - if (tmp2 < tmp1) { - float* tv = v1; v1 = v2; v2 = tv; - owa = oowb; owb = oowa; - fay = tmp2; - fby = tmp1; - } - fax = FARRAY(v1, GR_VERTEX_X_OFFSET << 2) - *owa*gc->state.Viewport.hwidth+gc->state.Viewport.ox; - fbx = FARRAY(v2, GR_VERTEX_X_OFFSET << 2) - *owb*gc->state.Viewport.hwidth+gc->state.Viewport.ox; - - /* compute deltas and absolute deltas */ - adx = fbx - fax; - ady = fby - fay; - if (adx < 0) - adx = -adx; - if (ady < 0) - ady = -ady; - /* - if (gc->state.vData.colorType != GR_FLOAT) { - *((FxU32 *)&v1a)=*((FxU32 *)((int)v1 + ia))&0x00ffffff; - *((FxU32 *)&v2a)=*((FxU32 *)((int)v2 + ia))&0x00ffffff; - } - */ - - GR_SET_EXPECTED_SIZE(vsize, 1); - TRI_STRIP_BEGIN(kSetupStrip, 6, gc->state.vData.vSize, SSTCP_PKT3_BDDDDD); - - if (adx >= ady) { /* X major line */ - - /* point 1 (b) = (v2)*/ - TRI_SETF(fbx); - TRI_SETF(fby - _GlideRoot.pool.f1); - AA_TRI_VP_SETFS(v2, owb); - - /* point 2 (a) = (v1)*/ - TRI_SETF(fax); - TRI_SETF(fay - _GlideRoot.pool.f1); - AA_TRI_VP_SETFS(v1, owa); - - /* point 3 (v2) = (v2)*/ - TRI_SETF(fbx); - TRI_SETF(fby); - TRI_VP_SETFS(v2, owb); - - /* point 4 (v1) = (v1)*/ - TRI_SETF(fax); - TRI_SETF(fay); - TRI_VP_SETFS(v1, owa); - - /* point 5 (f) = (v2)*/ - TRI_SETF(fbx); - TRI_SETF(fby + _GlideRoot.pool.f1); - AA_TRI_VP_SETFS(v2, owb); - - /* point 6 (a) = (v1)*/ - TRI_SETF(fax); - TRI_SETF(fay + _GlideRoot.pool.f1); - AA_TRI_VP_SETFS(v1, owa); - - } else { /* Y major line */ - - /* point 1 (b) = (v2)*/ - TRI_SETF(fbx + _GlideRoot.pool.f1); - TRI_SETF(fby); - AA_TRI_VP_SETFS(v2, owb); - - /* point 2 (a) = (v1)*/ - TRI_SETF(fax + _GlideRoot.pool.f1); - TRI_SETF(fay); - AA_TRI_VP_SETFS(v1, owa); - - /* point 3 (v2) = (v2)*/ - TRI_SETF(fbx); - TRI_SETF(fby); - TRI_VP_SETFS(v2, owb); - - /* point 4 (v1) = (v1)*/ - TRI_SETF(fax); - TRI_SETF(fay); - TRI_VP_SETFS(v1, owa); - - /* point 5 (f) = (v2)*/ - TRI_SETF(fbx - _GlideRoot.pool.f1); - TRI_SETF(fby); - AA_TRI_VP_SETFS(v2, owb); - - /* point 6 (a) = (v1)*/ - TRI_SETF(fax - _GlideRoot.pool.f1); - TRI_SETF(fay); - AA_TRI_VP_SETFS(v1, owa); - } - TRI_END; - GR_CHECK_SIZE(); - } - } -#endif - -#undef FN_NAME -} /* _grAADrawLineStrip */ - -/*------------------------------------------------------------------- - Function: aaDrawArrayEdgeSense - Date: 13-Oct-97 - Implementor(s): atai - Description: - Pass the line a, b. Use c to calculate edge sense. - Create new vertices from a, b. - Arguments: - - Return: - -------------------------------------------------------------------*/ -static void -aaDrawArrayEdgeSense(float *a, float *b, float *c) -{ -#define FN_NAME "aaDrawArrayEdgeSense" - GR_DCL_GC; - - float dx, dy, v2x, v2y; - float *fa, *fb, v1a, v2a; - FxU32 ia; - aaEdgeSense sense; - - if (FARRAY(a, GR_VERTEX_Y_OFFSET << 2) >= FARRAY(b, GR_VERTEX_Y_OFFSET << 2)) { - fa = b; fb = a; - } - else { - fa = a; fb = b; - } - dx = FARRAY(fa, GR_VERTEX_X_OFFSET << 2) - FARRAY(fb, GR_VERTEX_X_OFFSET << 2); - dy = FARRAY(fa, GR_VERTEX_Y_OFFSET << 2) - FARRAY(fb, GR_VERTEX_Y_OFFSET << 2); - - if (dx == 0.f) { - sense = (FARRAY(c, GR_VERTEX_X_OFFSET << 2) > FARRAY(fa, GR_VERTEX_X_OFFSET << 2)) ? aaEdgeSenseLeft : aaEdgeSenseRight; - } - else if (dy == 0.0f) { - sense = (FARRAY(c, GR_VERTEX_Y_OFFSET << 2) > FARRAY(fa, GR_VERTEX_Y_OFFSET << 2)) ? aaEdgeSenseBottom : aaEdgeSenseTop; - } - else { - float dcax, dcay, dcbx, dcby, cp; - dcax = FARRAY(fa, GR_VERTEX_X_OFFSET << 2) - FARRAY(c, GR_VERTEX_X_OFFSET << 2); - dcay = FARRAY(fa, GR_VERTEX_Y_OFFSET << 2) - FARRAY(c, GR_VERTEX_Y_OFFSET << 2); - dcbx = FARRAY(fb, GR_VERTEX_X_OFFSET << 2) - FARRAY(c, GR_VERTEX_X_OFFSET << 2); - dcby = FARRAY(fb, GR_VERTEX_Y_OFFSET << 2) - FARRAY(c, GR_VERTEX_Y_OFFSET << 2); - cp = dcax * dcby - dcay * dcbx; - - if (dx > 0.0f) { - if (dx >= -dy) /* X-major line */ - sense = (cp > 0.0f) ? aaEdgeSenseTop : aaEdgeSenseBottom; - else /* Y-major line */ - sense = (cp > 0.0f) ? aaEdgeSenseRight : aaEdgeSenseLeft; - } - else { - if (dx <= dy) /* X-major line */ - sense = (cp < 0.0f) ? aaEdgeSenseTop : aaEdgeSenseBottom; - else /* Y-major line */ - sense = (cp < 0.0f) ? aaEdgeSenseLeft : aaEdgeSenseRight; - } - } - - /* v1(a), v2(b), a, b */ - GR_SET_EXPECTED_SIZE(gc->state.vData.vSize << 2, 1); - TRI_STRIP_BEGIN(kSetupStrip, 4, gc->state.vData.vSize, SSTCP_PKT3_BDDDDD); - switch (sense) { - case aaEdgeSenseTop: - TRI_SETF(FARRAY(a, GR_VERTEX_X_OFFSET << 2)); - v2x = FARRAY(b, GR_VERTEX_X_OFFSET << 2); - TRI_SETF(FARRAY(a, GR_VERTEX_Y_OFFSET << 2) + _GlideRoot.pool.f1); - v2y = FARRAY(b, GR_VERTEX_Y_OFFSET << 2) + _GlideRoot.pool.f1; - break; - - case aaEdgeSenseLeft: - TRI_SETF(FARRAY(a, GR_VERTEX_X_OFFSET << 2) - _GlideRoot.pool.f1); - v2x = FARRAY(b, GR_VERTEX_X_OFFSET << 2) - _GlideRoot.pool.f1; - TRI_SETF(FARRAY(a, GR_VERTEX_Y_OFFSET << 2)); - v2y = FARRAY(b, GR_VERTEX_Y_OFFSET << 2); - break; - - case aaEdgeSenseBottom: - TRI_SETF(FARRAY(a, GR_VERTEX_X_OFFSET << 2)); - v2x = FARRAY(b, GR_VERTEX_X_OFFSET << 2); - TRI_SETF(FARRAY(a, GR_VERTEX_Y_OFFSET << 2) - _GlideRoot.pool.f1); - v2y = FARRAY(b, GR_VERTEX_Y_OFFSET << 2) - _GlideRoot.pool.f1; - break; - - case aaEdgeSenseRight: - TRI_SETF(FARRAY(a, GR_VERTEX_X_OFFSET << 2) + _GlideRoot.pool.f1); - v2x = FARRAY(b, GR_VERTEX_X_OFFSET << 2) + _GlideRoot.pool.f1; - TRI_SETF(FARRAY(a, GR_VERTEX_Y_OFFSET << 2)); - v2y = FARRAY(b, GR_VERTEX_Y_OFFSET << 2); - break; - } - - if (gc->state.vData.colorType == GR_FLOAT) { - ia = gc->state.vData.aInfo.offset; - v1a = v2a = 0.f; - } - else { - ia = gc->state.vData.pargbInfo.offset; - *((FxU32 *)&v1a)=*((FxU32 *)((int)a + ia))&0x00ffffff; - *((FxU32 *)&v2a)=*((FxU32 *)((int)b + ia))&0x00ffffff; - } - - { - FxU32 i, dataElem; - dataElem = 0; - i = gc->tsuDataList[dataElem]; - while (i != GR_DLIST_END) { - if (i == ia) { - TRI_SETF(v1a); - } - else { - TRI_SETF(FARRAY(a, i)); - } - dataElem++; - i = gc->tsuDataList[dataElem]; - } - TRI_SETF(v2x); - dataElem = 0; - TRI_SETF(v2y); - i = gc->tsuDataList[dataElem]; - while (i != GR_DLIST_END) { - if (i == ia) { - TRI_SETF(v2a); - } - else { - TRI_SETF(FARRAY(b, i)); - } - dataElem++; - i = gc->tsuDataList[dataElem]; - } - dataElem = 0; - TRI_SETF(FARRAY(a, GR_VERTEX_X_OFFSET << 2)); - TRI_SETF(FARRAY(a, GR_VERTEX_Y_OFFSET << 2)); - i = gc->tsuDataList[dataElem]; - while (i != GR_DLIST_END) { - TRI_SETF(FARRAY(a, i)); - dataElem++; - i = gc->tsuDataList[dataElem]; - } - dataElem = 0; - TRI_SETF(FARRAY(b, GR_VERTEX_X_OFFSET << 2)); - TRI_SETF(FARRAY(b, GR_VERTEX_Y_OFFSET << 2)); - i = gc->tsuDataList[dataElem]; - while (i != GR_DLIST_END) { - TRI_SETF(FARRAY(b, i)); - dataElem++; - i = gc->tsuDataList[dataElem]; - } - } - TRI_END; - GR_CHECK_SIZE(); -#undef FN_NAME -} /* aaCalcEdgeSense */ - -/*------------------------------------------------------------------- - Function: _grAADrawTriangles - Date: 13-Oct-97 - Implementor(s): atai - Description: - Draw anti-alias triangles - Arguments: - - Return: - -------------------------------------------------------------------*/ -void FX_CSTYLE -_grAADrawTriangles(FxI32 mode, FxI32 ttype, FxI32 count, void *pointers) -{ -#define FN_NAME "_grAADrawTriangles" - - GR_DCL_GC; - - float **lPtr = (float **)pointers; - FxI32 tCount = 3; - FxU32 fbzModeOld; /* Squirrel away current fbzMode */ - FxI32 stride = mode; - - GDBG_INFO(96, "_grAADrawTriangles (count = %d, pointers = 0x%x)\n", - count, pointers); - - if (ttype == GR_TRIANGLES) - _grDrawTriangles(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; - - /* backfaced or zero area */ - while (tCount <= count) { - float *a, *b, *c; - - GR_BEGIN_NOFIFOCHECK("_grAADrawTri",96); - - a = pointers; - b = (float *)pointers + 1; - c = (float *)pointers + 2; - if (mode) { - a = *(float **)a; - b = *(float **)b; - c = *(float **)c; - } - (float *)pointers += stride*3; - - /* move culling test to here */ - { - float *fa = a; - float *fb = b; - float *fc = c; - float dxAB, dxBC, dyAB, dyBC; - /* - ** Sort the vertices. - ** Whenever the radial order is reversed (from counter-clockwise to - ** clockwise), we need to change the area of the triangle. Note - ** that we know the first two elements are X & Y by looking at the - ** grVertex structure. - */ - { - int ay = *(int *)&a[GR_VERTEX_Y_OFFSET]; - int by = *(int *)&b[GR_VERTEX_Y_OFFSET]; - int cy = *(int *)&c[GR_VERTEX_Y_OFFSET]; - int culltest = gc->state.cull_mode; - - if (ay < 0) ay ^= 0x7FFFFFFF; - if (by < 0) by ^= 0x7FFFFFFF; - if (cy < 0) cy ^= 0x7FFFFFFF; - - if (ay < by) { - if (by > cy) { /* acb */ - if (ay < cy) { - fa = a; - fb = c; - fc = b; - culltest ^= 1; - } else { /* cab */ - fa = c; - fb = a; - fc = b; - } - /* else it's already sorted */ - } - } else { - if (by < cy) { /* bac */ - if (ay < cy) { - fa = b; - fb = a; - fc = c; - culltest ^= 1; - } else { /* bca */ - fa = b; - fb = c; - fc = a; - } - } else { /* cba */ - fa = c; - fb = b; - fc = a; - culltest ^= 1; - } - } - - /* 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; - - /* 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[GR_VERTEX_X_OFFSET]), FloatVal(fa[GR_VERTEX_Y_OFFSET]), - FloatVal(fb[GR_VERTEX_X_OFFSET]), FloatVal(fb[GR_VERTEX_Y_OFFSET]), - FloatVal(fc[GR_VERTEX_X_OFFSET]), FloatVal(fc[GR_VERTEX_Y_OFFSET]), - _GlideRoot.pool.ftemp1, gc->state.cull_mode, culltest); - - goto done; - } - - /* Backface culling, use sign bit as test */ - if ((gc->state.cull_mode != GR_CULL_DISABLE) && - ((j ^ (culltest << 31)) >= 0)) { - - GDBG_INFO(291, FN_NAME": Culling (%g %g) (%g %g) (%g %g) : (%g : 0x%X : 0x%X)\n", - FloatVal(fa[GR_VERTEX_X_OFFSET]), FloatVal(fa[GR_VERTEX_Y_OFFSET]), - FloatVal(fb[GR_VERTEX_X_OFFSET]), FloatVal(fb[GR_VERTEX_Y_OFFSET]), - FloatVal(fc[GR_VERTEX_X_OFFSET]), FloatVal(fc[GR_VERTEX_Y_OFFSET]), - _GlideRoot.pool.ftemp1, gc->state.cull_mode, culltest); - - goto done; - } - } - } - } /* end culling test */ - - aaDrawArrayEdgeSense(a, b, c); - - aaDrawArrayEdgeSense(b, c, a); - - aaDrawArrayEdgeSense(c, a, b); - - done: - lPtr += 3; - tCount+=3; - } - - gc->state.fbi_config.fbzMode = fbzModeOld; - gc->state.invalid |= fbzModeBIT; - GR_FLUSH_STATE(); - -#undef FN_NAME -} /* _grAADrawTriangles */ - - -/*------------------------------------------------------------------- - Function: aaVpDrawArrayEdgeSense - Date: 11-Dec-97 - Implementor(s): atai - Description: - Pass the line a, b. Use c to calculate edge sense. (clip space) - Create new vertices from a, b. - Arguments: - - Return: - -------------------------------------------------------------------*/ -static void -aaVpDrawArrayEdgeSense(float *a, float *b, float *c, float oowa, float oowb) -{ -#define FN_NAME "aaVpDrawArrayEdgeSense" - GR_DCL_GC; - - float dx, dy, v2x, v2y; - float *fa, *fb, v1a, v2a; - float fax, fay, fbx, fby; - FxU32 ia; - aaEdgeSense sense; - - if (FARRAY(a, GR_VERTEX_Y_OFFSET << 2) >= FARRAY(b, GR_VERTEX_Y_OFFSET << 2)) { - fa = b; fb = a; - } - else { - fa = a; fb = b; - } - dx = FARRAY(fa, GR_VERTEX_X_OFFSET << 2) - FARRAY(fb, GR_VERTEX_X_OFFSET << 2); - dy = FARRAY(fa, GR_VERTEX_Y_OFFSET << 2) - FARRAY(fb, GR_VERTEX_Y_OFFSET << 2); - - if (dx == 0.f) { - sense = (FARRAY(c, GR_VERTEX_X_OFFSET << 2) > FARRAY(fa, GR_VERTEX_X_OFFSET << 2)) ? aaEdgeSenseLeft : aaEdgeSenseRight; - } - else if (dy == 0.0f) { - sense = (FARRAY(c, GR_VERTEX_Y_OFFSET << 2) > FARRAY(fa, GR_VERTEX_Y_OFFSET << 2)) ? aaEdgeSenseBottom : aaEdgeSenseTop; - } - else { - float dcax, dcay, dcbx, dcby, cp; - dcax = FARRAY(fa, GR_VERTEX_X_OFFSET << 2) - FARRAY(c, GR_VERTEX_X_OFFSET << 2); - dcay = FARRAY(fa, GR_VERTEX_Y_OFFSET << 2) - FARRAY(c, GR_VERTEX_Y_OFFSET << 2); - dcbx = FARRAY(fb, GR_VERTEX_X_OFFSET << 2) - FARRAY(c, GR_VERTEX_X_OFFSET << 2); - dcby = FARRAY(fb, GR_VERTEX_Y_OFFSET << 2) - FARRAY(c, GR_VERTEX_Y_OFFSET << 2); - cp = dcax * dcby - dcay * dcbx; - - if (dx > 0.0f) { - if (dx >= -dy) /* X-major line */ - sense = (cp > 0.0f) ? aaEdgeSenseTop : aaEdgeSenseBottom; - else /* Y-major line */ - sense = (cp > 0.0f) ? aaEdgeSenseRight : aaEdgeSenseLeft; - } - else { - if (dx <= dy) /* X-major line */ - sense = (cp < 0.0f) ? aaEdgeSenseTop : aaEdgeSenseBottom; - else /* Y-major line */ - sense = (cp < 0.0f) ? aaEdgeSenseLeft : aaEdgeSenseRight; - } - } - - /* v1(a), v2(b), a, b */ - GR_SET_EXPECTED_SIZE(gc->state.vData.vSize << 2, 1); - TRI_STRIP_BEGIN(kSetupStrip, 4, gc->state.vData.vSize, SSTCP_PKT3_BDDDDD); - fax = FARRAY(a, GR_VERTEX_X_OFFSET << 2)*oowa*gc->state.Viewport.hwidth+gc->state.Viewport.ox; - fay = FARRAY(a, GR_VERTEX_Y_OFFSET << 2)*oowa*gc->state.Viewport.hheight+gc->state.Viewport.oy; - fbx = FARRAY(b, GR_VERTEX_X_OFFSET << 2)*oowb*gc->state.Viewport.hwidth+gc->state.Viewport.ox; - fby = FARRAY(b, GR_VERTEX_Y_OFFSET << 2)*oowb*gc->state.Viewport.hheight+gc->state.Viewport.oy; - - switch (sense) { - case aaEdgeSenseTop: - TRI_SETF(fax); - v2x = fbx; - TRI_SETF(fay + _GlideRoot.pool.f1); - v2y = fby + _GlideRoot.pool.f1; - break; - - case aaEdgeSenseLeft: - TRI_SETF(fax - _GlideRoot.pool.f1); - v2x = fbx - _GlideRoot.pool.f1; - TRI_SETF(fay); - v2y = fby; - break; - - case aaEdgeSenseBottom: - TRI_SETF(fax); - v2x = fbx; - TRI_SETF(fay - _GlideRoot.pool.f1); - v2y = fby - _GlideRoot.pool.f1; - break; - - case aaEdgeSenseRight: - TRI_SETF(fax + _GlideRoot.pool.f1); - v2x = fbx + _GlideRoot.pool.f1; - TRI_SETF(fay); - v2y = fby; - break; - } - - if (gc->state.vData.colorType == GR_FLOAT) { - ia = gc->state.vData.aInfo.offset; - v1a = v2a = 0.f; - } - else { - ia = gc->state.vData.pargbInfo.offset; - *((FxU32 *)&v1a)=*((FxU32 *)((int)a + ia))&0x00ffffff; - *((FxU32 *)&v2a)=*((FxU32 *)((int)b + ia))&0x00ffffff; - } - - { - - AA_TRI_VP_SETFS(a,oowa); - - TRI_SETF(v2x); - TRI_SETF(v2y); - - AA_TRI_VP_SETFS(b,oowb); - - TRI_SETF(FARRAY(a, GR_VERTEX_X_OFFSET << 2)); - TRI_SETF(FARRAY(a, GR_VERTEX_Y_OFFSET << 2)); - TRI_VP_SETFS(a,oowa); - - TRI_SETF(FARRAY(b, GR_VERTEX_X_OFFSET << 2)); - TRI_SETF(FARRAY(b, GR_VERTEX_Y_OFFSET << 2)); - TRI_VP_SETFS(b,oowb); - - } - TRI_END; - GR_CHECK_SIZE(); -#undef FN_NAME -} - -/*------------------------------------------------------------------- - Function: _grAAVpDrawTriangles - Date: 11-Dec-97 - Implementor(s): atai - Description: - Draw anti-alias triangles (clip coords) - Arguments: - - Return: - -------------------------------------------------------------------*/ -void FX_CSTYLE -_grAAVpDrawTriangles(FxI32 mode, FxI32 ttype, FxI32 count, void *pointers) -{ -#define FN_NAME "_grAAVpDrawTriangles" - - GR_DCL_GC; - - float **lPtr = (float **)pointers; - FxI32 tCount = 3; - FxU32 fbzModeOld; /* Squirrel away current fbzMode */ - FxI32 stride = mode; - - GDBG_INFO(96, "_grAADrawTriangles (count = %d, pointers = 0x%x)\n", - count, pointers); - - if (ttype == GR_TRIANGLES) - _grDrawTriangles(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; - - /* backfaced or zero area */ - while (tCount <= count) { - float *a, *b, *c; - float oowa, oowb, oowc; - - GR_BEGIN_NOFIFOCHECK("_grAADrawTri",96); - - a = pointers; - b = (float *)pointers + 1; - c = (float *)pointers + 2; - if (mode) { - a = *(float **)a; - b = *(float **)b; - c = *(float **)c; - } - (float *)pointers += stride*3; - oowa = 1.0f / FARRAY(a, gc->state.vData.wInfo.offset); - oowb = 1.0f / FARRAY(b, gc->state.vData.wInfo.offset); - oowc = 1.0f / FARRAY(c, gc->state.vData.wInfo.offset); - - - /* move culling test to here */ - { - float *fa = a; - float *fb = b; - float *fc = c; - float dxAB, dxBC, dyAB, dyBC; - /* - ** Sort the vertices. - ** Whenever the radial order is reversed (from counter-clockwise to - ** clockwise), we need to change the area of the triangle. Note - ** that we know the first two elements are X & Y by looking at the - ** grVertex structure. - */ - { - float fay = a[GR_VERTEX_Y_OFFSET]*oowa*gc->state.Viewport.hheight*gc->state.Viewport.oy; - float fby = b[GR_VERTEX_Y_OFFSET]*oowb*gc->state.Viewport.hheight*gc->state.Viewport.oy; - float fcy = c[GR_VERTEX_Y_OFFSET]*oowc*gc->state.Viewport.hheight*gc->state.Viewport.oy; - int ay = *(int *)&fay; - int by = *(int *)&fby; - int cy = *(int *)ф - int culltest = gc->state.cull_mode; - - if (ay < 0) ay ^= 0x7FFFFFFF; - if (by < 0) by ^= 0x7FFFFFFF; - if (cy < 0) cy ^= 0x7FFFFFFF; - - if (ay < by) { - if (by > cy) { /* acb */ - if (ay < cy) { - fa = a; - fb = c; - fc = b; - - culltest ^= 1; - } else { /* cab */ - fa = c; - fb = a; - fc = b; - } - /* else it's already sorted */ - } - } else { - if (by < cy) { /* bac */ - if (ay < cy) { - fa = b; - fb = a; - fc = c; - culltest ^= 1; - } else { /* bca */ - fa = b; - fb = c; - fc = a; - } - } else { /* cba */ - fa = c; - fb = b; - fc = a; - culltest ^= 1; - } - } - - /* 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; - - /* 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[GR_VERTEX_X_OFFSET]), FloatVal(fa[GR_VERTEX_Y_OFFSET]), - FloatVal(fb[GR_VERTEX_X_OFFSET]), FloatVal(fb[GR_VERTEX_Y_OFFSET]), - FloatVal(fc[GR_VERTEX_X_OFFSET]), FloatVal(fc[GR_VERTEX_Y_OFFSET]), - _GlideRoot.pool.ftemp1, gc->state.cull_mode, culltest); - - goto done; - } - - /* Backface culling, use sign bit as test */ - if ((gc->state.cull_mode != GR_CULL_DISABLE) && - ((j ^ (culltest << 31)) >= 0)) { - - GDBG_INFO(291, FN_NAME": Culling (%g %g) (%g %g) (%g %g) : (%g : 0x%X : 0x%X)\n", - FloatVal(fa[GR_VERTEX_X_OFFSET]), FloatVal(fa[GR_VERTEX_Y_OFFSET]), - FloatVal(fb[GR_VERTEX_X_OFFSET]), FloatVal(fb[GR_VERTEX_Y_OFFSET]), - FloatVal(fc[GR_VERTEX_X_OFFSET]), FloatVal(fc[GR_VERTEX_Y_OFFSET]), - _GlideRoot.pool.ftemp1, gc->state.cull_mode, culltest); - - goto done; - } - } - } - } /* end culling test */ - - aaVpDrawArrayEdgeSense(a, b, c, oowa, oowb); - - aaVpDrawArrayEdgeSense(b, c, a, oowb, oowc); - - aaVpDrawArrayEdgeSense(c, a, b, oowc, oowa); - - done: - lPtr += 3; - tCount+=3; - } - - gc->state.fbi_config.fbzMode = fbzModeOld; - gc->state.invalid |= fbzModeBIT; - GR_FLUSH_STATE(); - -#undef FN_NAME -} /* _grAAVpDrawTriangles */ - -#endif /* GLIDE3 */ - diff --git a/glide2x/h3/glide/src/gbanner.c b/glide2x/h3/glide/src/gbanner.c deleted file mode 100644 index d9ff64b..0000000 --- a/glide2x/h3/glide/src/gbanner.c +++ /dev/null @@ -1,145 +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 3/17/99 6:16p Dow -** Phantom Menace and other fixes. -** -** 19 2/19/99 5:54p Peter -** new splash screen - * - * 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 - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -void -_grShamelessPlug(void) -{ - GR_BEGIN_NOFIFOCHECK("_grShamelessPlug", 80); - GDBG_INFO_MORE(gc->myLevel, "()\n"); - -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) - if (gc->pluginInfo.plugProc != NULL) { - FxU32 - plugWidth, plugHeight, - plugStride; - GrLfbWriteMode_t - plugFormat; - const void* - plugData = (*gc->pluginInfo.plugProc)(&plugWidth, &plugHeight, - &plugStride, - &plugFormat); - - if (plugData != NULL) { -#ifdef GLIDE_PLUG - GrState state; - - 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); - - grChromakeyValue(0x0000); - - grChromakeyMode(GR_CHROMAKEY_ENABLE); - grLfbConstantAlpha((FxU8) 0x40); - grLfbWriteColorFormat(GR_COLORFORMAT_ARGB); - - _grLfbWriteRegion(FXTRUE, GR_BUFFER_BACKBUFFER, - gc->state.screen_width - (plugWidth + 1), - gc->state.screen_height - (plugHeight + 1), - GR_LFBWRITEMODE_565, - plugWidth, plugHeight, - plugStride, - plugData); - - grGlideSetState(&state); -#endif /* GLIDE_PLUG */ - } - } -#endif /* (GLIDE_PLATFORM & GLIDE_OS_WIN32) */ - - GR_END(); -} /* _grShamelessPlug */ diff --git a/glide2x/h3/glide/src/gdraw.c b/glide2x/h3/glide/src/gdraw.c deleted file mode 100644 index 917e413..0000000 --- a/glide2x/h3/glide/src/gdraw.c +++ /dev/null @@ -1,1819 +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:27 joseph - ** Initial checkin into SourceForge. - ** -** -** 3 3/17/99 6:16p Dow -** Phantom Menace and other fixes. -** -** 96 6/02/98 8:03p Peter -** Mmmmm.... points -** -** 95 6/01/98 6:44p Peter -** snapped/unsnapped points -** -** 94 5/18/98 3:20p Peter -** pts more resistant to changing rounding modes - * - * 92 1/15/98 2:46p Atai - * fixed grDrawPoint and grDrawLine in aa mode - * - * 90 12/17/97 4:45p Peter - * groundwork for CrybabyGlide - * - * 89 12/15/97 5:52p Atai - * disable obsolete glide2 api for glide3 - * - * 85 12/08/97 12:06p Atai - * change prototype for grDrawPoint, grDrawLine, grDrawTriangel - * - * 83 11/21/97 6:05p Atai - * use one datalist (tsuDataList) in glide3 - * - * 82 11/21/97 3:20p Peter - * direct writes tsu registers - * - * 81 11/19/97 4:33p Atai - * make vSize debug variable - * - * 80 11/18/97 4:36p Peter - * chipfield stuff cleanup and w/ direct writes - * - * 79 11/17/97 4:55p Peter - * watcom warnings/chipfield stuff - * - * 78 11/16/97 2:20p Peter - * cleanup - * - * 77 11/15/97 7:43p Peter - * more comdex silliness - * - ** - */ -#include - -#include <3dfx.h> - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -#if GLIDE_DISPATCH_SETUP -#include "fxinline.h" -#endif - -#define SST_XY_HALF (1 << (SST_XY_FRACBITS - 1)) -#define SST_XY_ONE (1 << SST_XY_FRACBITS) - -#define OUTBOUNDSX(a) ((a->x < 0.f ? 1 : 0) || (a->x > gc->state.screen_width ? 1 : 0)) -#define OUTBOUNDSY(a) ((a->y < 0.f ? 1 : 0) || (a->y > gc->state.screen_height ? 1 : 0)) -#define OUTBOUNDS(a) (OUTBOUNDSX(a) || OUTBOUNDSY(a)) - -/*--------------------------------------------------------------------------- -** grDrawPoint -*/ - -#ifdef GLIDE3 -GR_ENTRY(grDrawPoint, void, (void *p)) -#else -GR_ENTRY(grDrawPoint, void, (const GrVertex *p)) -#endif -{ -#define FN_NAME "grDrawPoint" -#ifdef GLIDE3 - GR_DCL_GC; - if (gc->state.grEnableArgs.primitive_smooth_mode) - _grAADrawPoints(GR_VTX_PTR_ARRAY, 1, (void *)&p); - else - _grDrawPoints(GR_VTX_PTR_ARRAY, 1, (void *)&p); -#else - FxU32 x, y; - GR_BEGIN_NOFIFOCHECK(FN_NAME, 90); - GDBG_INFO_MORE(gc->myLevel, "(0x%X) : (%f %f)\n", p, p->x, p->y); - - GR_FLUSH_STATE(); - - /* we snap to an integer by adding a large enough number that it - * shoves all fraction bits off the right side of the mantissa. - * - * NB: IEEE rounds to nearest integer by default, but applications - * can change the rounding mode so that it is difficult to get the - * correct truncation/ceiling operation w/ a simple adjustment to - * the bias. - * - * NB: The constant kNumMantissaBits defines how many bits of - * integer precision a coordinate can have. This needs to be atleast - * as large as the maximum hw screen resolution. We later use this - * to compute a logical 1/2 value to fill an entire pixel. - */ -#define kNumMantissaBits 18UL - { - const float bias = (const float)(3UL << kNumMantissaBits); - - /* Convert to 32-bit representation */ -#define FP_TRUNC_BIAS(__fpVal, __fpBias) \ - ((__fpVal) < (__fpBias) ? (float)((__fpVal) + (__fpBias)) : (__fpVal)) - _GlideRoot.pool.ftemp1 = FP_TRUNC_BIAS(p->x, bias); - _GlideRoot.pool.ftemp2 = FP_TRUNC_BIAS(p->y, bias); - - /* Mask off the real fractional bits from the mantissa */ - x = ((*(FxU32*)&_GlideRoot.pool.ftemp1 & (0xFFFFFFFFUL << (22UL - kNumMantissaBits))) + - (0x01UL << (22UL - kNumMantissaBits))); - y = ((*(FxU32*)&_GlideRoot.pool.ftemp2 & (0xFFFFFFFFUL << (22UL - kNumMantissaBits))) + - (0x01UL << (22UL - kNumMantissaBits))); - } - - /* draw a little triangle, with the lower left corner at pixel center. */ -#if GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP - /* The approach here is to split the triangle into two packets, one - * that sends just the coordinates of the last two points of the - * triangle w/ no other parameter information, and then the - * centered point w/ all of the parameter information. The first - * packet is has a BDD command, but is incomplete, so nothing - * draws, the next packet has a DDD command so will complete the - * triangle from the first packet sent. - */ - GR_SET_EXPECTED_SIZE((sizeof(FxU32) << 2) + /* Size of Initial coordinate packet */ - _GlideRoot.curVertexSize, /* The full coordinate vertex */ - 2); /* We do two split packets */ - TRI_PACKET_BEGIN(kSetupStrip | kSetupCullDisable, 0x00, - 0x02, sizeof(FxU32) << 1, SSTCP_PKT3_BDDDDD); - { - /* Lower right corner */ - TRI_SET(x); - TRI_SET(y); - - /* Upper right corner. */ - y -= (0x01UL << (21UL - kNumMantissaBits)); - TRI_SET(x); - TRI_SET(y); - - /* Upper Left corner */ - x -= (0x01UL << (21UL - kNumMantissaBits)); - } - TRI_END; - - /* Packet w/ actual point coordinate and parameter data */ - TRI_PACKET_BEGIN(kSetupStrip | kSetupCullDisable, gc->cmdTransportInfo.paramMask, - 1, _GlideRoot.curVertexSize, SSTCP_PKT3_DDDDDD); - { - TRI_SET(x); - TRI_SET(y); - - /* Vertex parameters */ - { - const int* dataList = gc->tsuDataList; - -#if GLIDE_PACKED_RGB - if ((gc->cmdTransportInfo.paramMask & SSTCP_PKT3_PACKEDCOLOR) != 0) { - FxU32 packedColor = 0x00; - - if (*dataList == (GR_VERTEX_R_OFFSET << 2)) { - packedColor = (RGBA_COMP_CLAMP(FARRAY(p, (GR_VERTEX_B_OFFSET << 2)), B) | - RGBA_COMP_CLAMP(FARRAY(p, (GR_VERTEX_G_OFFSET << 2)), G) | - RGBA_COMP_CLAMP(FARRAY(p, (GR_VERTEX_R_OFFSET << 2)), R)); - - dataList++; - } - - if (*dataList == (GR_VERTEX_A_OFFSET << 2)) { - packedColor |= RGBA_COMP_CLAMP(FARRAY(p, (GR_VERTEX_A_OFFSET << 2)), A); - dataList++; - } - - TRI_SET(packedColor); - } -#endif /* GLIDE_PACKED_RGB */ - -#if GLIDE_FP_CLAMP_TEX - while(*dataList != 0) { - TRI_SETF(FARRAY(p, *dataList)); - dataList++; - } - - dataList++; -#endif /* GLIDE_FP_CLAMP_TEX */ - - while(*dataList != 0) { - TRI_SETF_CLAMP(FARRAY(p, *dataList)); - dataList++; - } - } - } - TRI_END; - GR_CHECK_SIZE(); - - _GlideRoot.stats.pointsDrawn++; -#else /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - /* GMT: gross overestimate of fifo requirements */ - GR_SET_EXPECTED_SIZE(_GlideRoot.curTriSize, _GlideRoot.curTriSize >> 2); - { - const struct dataList_s* dlp = gc->regDataList; - int i; - -#ifdef GLIDE_USE_ALT_REGMAP - hw = SST_WRAP(hw,128); /* use alternate register mapping */ -#endif - - GR_SET(BROADCAST_ID, hw, vA.x, x); - GR_SET(BROADCAST_ID, hw, vA.y, y); - - x += (0x01UL << (22UL - kNumMantissaBits)); - GR_SET(BROADCAST_ID, hw, vB.x, x); - GR_SET(BROADCAST_ID, hw, vB.y, y); - - y += (0x01UL << (22UL - kNumMantissaBits)); - GR_SET(BROADCAST_ID, hw, vC.x, x); - GR_SET(BROADCAST_ID, hw, vC.y, y); - - i = _GlideRoot.stats.pointsDrawn++; - _GlideRoot.stats.pointsDrawn = ++i; - - dlp = gc->regDataList; - i = dlp->i; - - /* we don't care what the slopes are because the pixel center that is drawn */ - /* is exactly at vertex A - isn't that wonderful */ - while (i) { - GR_SETF_INDEX(BROADCAST_ID, hw, ((FxU32*)dlp->addr - (FxU32*)hw), FARRAY(p,i)); - dlp++; - i = dlp->i; - } - - GR_SET(BROADCAST_ID, hw, triangleCMD, 1); - } - GR_CHECK_SIZE(); -#endif /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - - GR_END(); -#endif -#undef FN_NAME -} /* grDrawPoint */ - -/*--------------------------------------------------------------------------- - ** grDrawLine - ** - ** NOTE: 1. this will not fill the last pixel in line because - ** B2 or C is on the right edge and the right edge is not - ** drawn. - ** (0,0) - ** - ** A(x1,y1-0.5)+ - ** | \ - ** | \ \ - ** (x1,y1)* \ - ** | * \ - ** | *\ \ - ** B1(x1,y1+0.5)+ * \ - ** \ \ * +B2(x2,y2-0.5) - ** \ * | - ** \ \ * | - ** \ \ + (x2,y2) - ** \ | - ** \ | - ** +C(x2,y2+0.5) - */ - -#ifdef GLIDE3 -GR_ENTRY(grDrawLine, void, (void *a, void *b)) -#else -GR_ENTRY(grDrawLine, void, (const GrVertex *a, const GrVertex *b)) -#endif -{ -#define FN_NAME "grDrawLine" -#ifdef GLIDE3 - GR_DCL_GC; - float *vlist[2]; - vlist[0] = (float *)a; - vlist[1] = (float *)b; - if (gc->state.grEnableArgs.primitive_smooth_mode) - _grAADrawLineStrip(GR_VTX_PTR_ARRAY, GR_LINES, 2, vlist); - else - _grDrawLineStrip(GR_VTX_PTR_ARRAY, GR_LINE_STRIP, 2, vlist); -#else - int i, j; - -#define DX _GlideRoot.pool.ftemp1 -#define ADY _GlideRoot.pool.ftemp2 - - GR_BEGIN_NOFIFOCHECK("grDrawLine", 91); - GDBG_INFO_MORE(gc->myLevel, "A: (%f %f) B: (%f %f)\n", - a->x, a->y, b->x, b->y); - - - GR_FLUSH_STATE(); - - /* - ** compute absolute deltas and draw from low Y to high Y - */ - ADY = b->y - a->y; - i = *(long *)&ADY; - if (i < 0) { - const GrVertex *tv; - tv = a; a = b; b = tv; - i ^= 0x80000000; /* ady = -ady; */ - (*(long *)&ADY) = i; - } - - DX = b->x - a->x; - j = *(long *)&DX; - if (j < 0) { - j ^= 0x80000000; /* adx = -adx; */ - } - - /* check for zero-length lines */ - if ((j >= i) && (j == 0)) goto all_done; - -#if GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP - /* One packet w/ 4 vertices */ - GR_SET_EXPECTED_SIZE((_GlideRoot.curVertexSize << 2), 1); - { - const float* const fa = (float*)a; - const float* const fb = (float*)b; - - /* Draw the triangle pair as a strip of 4 vertices. - * We can skip all of the gradient calculation stuff. - * - * NB: There are two cases, x/y major lines, and each of these - * loops are unrolled to send one set of endpoints of the 'line' - * per iteration since we can use the same bias per iteration. - */ - TRI_PACKET_BEGIN(kSetupCullDisable | kSetupStrip, gc->cmdTransportInfo.paramMask, - 0x04UL, _GlideRoot.curVertexSize, SSTCP_PKT3_BDDDDD); - { - float fBias = - _GlideRoot.pool.fHalf; - int vIndex; - - /* x macjor */ - if (j >= i) { - for(vIndex = 0; vIndex < 2; vIndex++) { - TRI_SETF(fb[GR_VERTEX_X_OFFSET]); - TRI_SETF(fb[GR_VERTEX_Y_OFFSET] + fBias); - - { - const int* dataList = gc->tsuDataList; - -#if GLIDE_PACKED_RGB - if ((gc->cmdTransportInfo.paramMask & SSTCP_PKT3_PACKEDCOLOR) != 0) { - FxU32 packedColor = 0x00; - - if (*dataList == (GR_VERTEX_R_OFFSET << 2)) { - packedColor = (RGBA_COMP_CLAMP(FARRAY(fb, (GR_VERTEX_B_OFFSET << 2)), B) | - RGBA_COMP_CLAMP(FARRAY(fb, (GR_VERTEX_G_OFFSET << 2)), G) | - RGBA_COMP_CLAMP(FARRAY(fb, (GR_VERTEX_R_OFFSET << 2)), R)); - - dataList++; - } - - if (*dataList == (GR_VERTEX_A_OFFSET << 2)) { - packedColor |= RGBA_COMP_CLAMP(FARRAY(fb, (GR_VERTEX_A_OFFSET << 2)), A); - dataList++; - } - - TRI_SET(packedColor); - } -#endif /* GLIDE_PACKED_RGB */ - -#if GLIDE_FP_CLAMP_TEX - while(*dataList != 0) { - TRI_SETF(FARRAY(fb, *dataList)); - dataList++; - } - - dataList++; -#endif /* GLIDE_FP_CLAMP_TEX */ - - while(*dataList != 0) { - TRI_SETF_CLAMP(FARRAY(fb, *dataList)); - dataList++; - } - } - - TRI_SETF(fa[GR_VERTEX_X_OFFSET]); - TRI_SETF(fa[GR_VERTEX_Y_OFFSET] + fBias); - - { - const int* dataList = gc->tsuDataList; - -#if GLIDE_PACKED_RGB - if ((gc->cmdTransportInfo.paramMask & SSTCP_PKT3_PACKEDCOLOR) != 0) { - FxU32 packedColor = 0x00; - - if (*dataList == (GR_VERTEX_R_OFFSET << 2)) { - packedColor = (RGBA_COMP_CLAMP(FARRAY(fa, (GR_VERTEX_B_OFFSET << 2)), B) | - RGBA_COMP_CLAMP(FARRAY(fa, (GR_VERTEX_G_OFFSET << 2)), G) | - RGBA_COMP_CLAMP(FARRAY(fa, (GR_VERTEX_R_OFFSET << 2)), R)); - - dataList++; - } - - if (*dataList == (GR_VERTEX_A_OFFSET << 2)) { - packedColor |= RGBA_COMP_CLAMP(FARRAY(fa, (GR_VERTEX_A_OFFSET << 2)), A); - dataList++; - } - - TRI_SET(packedColor); - } -#endif /* GLIDE_PACKED_RGB */ - -#if GLIDE_FP_CLAMP_TEX - while(*dataList != 0) { - TRI_SETF(FARRAY(fa, *dataList)); - dataList++; - } - - dataList++; -#endif /* GLIDE_FP_CLAMP_TEX */ - - while (*dataList != 0) { - TRI_SETF_CLAMP(FARRAY(fa, *dataList)); - dataList++; - } - } - - fBias *= -1.0f; - } - } else { /* y major */ - for(vIndex = 0; vIndex < 2; vIndex++) { - TRI_SETF(fb[GR_VERTEX_X_OFFSET] + fBias); - TRI_SETF(fb[GR_VERTEX_Y_OFFSET]); - - { - const int* dataList = gc->tsuDataList; - -#if GLIDE_PACKED_RGB - if ((gc->cmdTransportInfo.paramMask & SSTCP_PKT3_PACKEDCOLOR) != 0) { - FxU32 packedColor = 0x00; - - if (*dataList == (GR_VERTEX_R_OFFSET << 2)) { - packedColor = (RGBA_COMP_CLAMP(FARRAY(fb, (GR_VERTEX_B_OFFSET << 2)), B) | - RGBA_COMP_CLAMP(FARRAY(fb, (GR_VERTEX_G_OFFSET << 2)), G) | - RGBA_COMP_CLAMP(FARRAY(fb, (GR_VERTEX_R_OFFSET << 2)), R)); - - dataList++; - } - - if (*dataList == (GR_VERTEX_A_OFFSET << 2)) { - packedColor |= RGBA_COMP_CLAMP(FARRAY(fb, (GR_VERTEX_A_OFFSET << 2)), A); - dataList++; - } - - TRI_SET(packedColor); - } -#endif /* GLIDE_PACKED_RGB */ - -#if GLIDE_FP_CLAMP_TEX - while(*dataList != 0) { - TRI_SETF(FARRAY(fb, *dataList)); - dataList++; - } - - dataList++; -#endif /* GLIDE_FP_CLAMP_TEX */ - - while (*dataList != 0) { - TRI_SETF_CLAMP(FARRAY(fb, *dataList)); - dataList++; - } - } - - TRI_SETF(fa[GR_VERTEX_X_OFFSET] + fBias); - TRI_SETF(fa[GR_VERTEX_Y_OFFSET]); - - { - const int* dataList = gc->tsuDataList; - -#if GLIDE_PACKED_RGB - if ((gc->cmdTransportInfo.paramMask & SSTCP_PKT3_PACKEDCOLOR) != 0) { - FxU32 packedColor = 0x00; - - if (*dataList == (GR_VERTEX_R_OFFSET << 2)) { - packedColor = (RGBA_COMP_CLAMP(FARRAY(fa, (GR_VERTEX_B_OFFSET << 2)), B) | - RGBA_COMP_CLAMP(FARRAY(fa, (GR_VERTEX_G_OFFSET << 2)), G) | - RGBA_COMP_CLAMP(FARRAY(fa, (GR_VERTEX_R_OFFSET << 2)), R)); - - dataList++; - } - - if (*dataList == (GR_VERTEX_A_OFFSET << 2)) { - packedColor |= RGBA_COMP_CLAMP(FARRAY(fa, (GR_VERTEX_A_OFFSET << 2)), A); - dataList++; - } - - TRI_SET(packedColor); - } -#endif /* GLIDE_PACKED_RGB */ - -#if GLIDE_FP_CLAMP_TEX - while(*dataList != 0) { - TRI_SETF(FARRAY(fa, *dataList)); - dataList++; - } - - dataList++; -#endif /* GLIDE_FP_CLAMP_TEX */ - - while (*dataList != 0) { - TRI_SETF_CLAMP(FARRAY(fa, *dataList)); - dataList++; - } - } - - fBias *= -1.0f; - } - } - } - TRI_END; - } - GR_CHECK_SIZE(); -#else /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ -#ifdef GLIDE_USE_ALT_REGMAP - hw = SST_WRAP(hw,128); /* use alternate register mapping */ -#endif - - GR_SET_EXPECTED_SIZE(12 + _GlideRoot.curTriSize, (_GlideRoot.curTriSize + 12) >> 2); - { - float m, dp; - struct dataList_s* dlp; - - /* - ** X major line - */ - if (j >= i) { /* if (adx > ady) */ - if (j == 0) goto all_done; /* check for zero-length lines */ - /* start up divide and overlap with as much integer stuff as possible*/ - m = _GlideRoot.pool.f1 / DX; - dlp = gc->regDataList; - GR_SETF(BROADCAST_ID, hw, FvA.x, a->x); - dp = b->x; - GR_SETF(BROADCAST_ID, hw, FvB.x, dp); - GR_SETF(BROADCAST_ID, hw, FvC.x, dp); - - GR_SETF(BROADCAST_ID, hw, FvA.y, a->y - _GlideRoot.pool.fHalf); - - dp = b->y; - GR_SETF(BROADCAST_ID, hw, FvB.y, dp - _GlideRoot.pool.fHalf); - - i = dlp->i; - GR_SETF(BROADCAST_ID, hw, FvC.y, dp + _GlideRoot.pool.fHalf); - - while (i) { - dp = FARRAY(a,i); - GR_SETF_INDEX(BROADCAST_ID, hw, - ((FxU32*)dlp->addr - (FxU32*)hw), dp); - - dp = FARRAY(b,i) - dp; - GR_SETF_INDEX(BROADCAST_ID, hw, - ((FxU32*)&dlp->addr[DPDX_OFFSET >> 2] - (FxU32*)hw), dp * m); - - dlp++; - i = dlp->i; - GR_SETF_INDEX(BROADCAST_ID, hw, - ((FxU32*)&dlp->addr[DPDY_OFFSET >> 2] - (FxU32*)hw), _GlideRoot.pool.f0); - } - GR_SETF(BROADCAST_ID, hw, FtriangleCMD,_GlideRoot.pool.ftemp1); - - GR_SETF(BROADCAST_ID, hw, FvB.x,a->x); - GR_SETF(BROADCAST_ID, hw, FvB.y,a->y + _GlideRoot.pool.fHalf); - GR_SETF(BROADCAST_ID, hw, FtriangleCMD,-_GlideRoot.pool.ftemp1); - } - - /* - ** Y major line - */ - else { - m = _GlideRoot.pool.f1 / ADY; - dlp = gc->regDataList; - GR_SETF(BROADCAST_ID, hw, FvA.y,a->y); - dp = b->y; - GR_SETF(BROADCAST_ID, hw, FvB.y,dp); - GR_SETF(BROADCAST_ID, hw, FvC.y,dp); - - GR_SETF(BROADCAST_ID, hw, FvA.x,a->x - _GlideRoot.pool.fHalf); - - dp = b->x; - GR_SETF(BROADCAST_ID, hw, FvB.x,dp - _GlideRoot.pool.fHalf); - - i = dlp->i; - GR_SETF(BROADCAST_ID, hw, FvC.x,dp + _GlideRoot.pool.fHalf); - - while (i) { - dp = FARRAY(a,i); - GR_SETF_INDEX(BROADCAST_ID, hw, ((FxU32*)dlp->addr - (FxU32*)hw), dp); - - dp = FARRAY(b,i) - dp; - GR_SETF_INDEX(BROADCAST_ID, hw, - ((FxU32*)&dlp->addr[DPDX_OFFSET >> 2] - (FxU32*)hw), _GlideRoot.pool.f0); - - dlp++; - i = dlp->i; - GR_SETF_INDEX(BROADCAST_ID, hw, - ((FxU32*)&dlp->addr[DPDY_OFFSET >> 2] - (FxU32*)hw), dp * m); - } - GR_SET(BROADCAST_ID, hw, triangleCMD, 0xFFFFFFFF); - - GR_SETF(BROADCAST_ID, hw, FvB.x, a->x + _GlideRoot.pool.fHalf); - GR_SETF(BROADCAST_ID, hw, FvB.y, a->y); - GR_SET(BROADCAST_ID, hw, triangleCMD, 1); - } - } - GR_CHECK_SIZE(); -#endif /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - -all_done: /* come here on degenerate lines */ - _GlideRoot.stats.linesDrawn++; - - GR_END(); -#endif -#undef FN_NAME -} /* grDrawLine */ - -/*--------------------------------------------------------------------------- - ** grDrawTriangle - */ - -#ifdef GLIDE3 -GR_ENTRY(grDrawTriangle, void, (void *a, void *b, void *c)) -#else -GR_ENTRY(grDrawTriangle, void, (const GrVertex *a, const GrVertex *b, const GrVertex *c)) -#endif -{ -#define FN_NAME grDrawTriangle -#if defined(GLIDE_USE_C_TRISETUP) || defined(__WATCOMC__) || defined(GLIDE_DEBUG) - GR_BEGIN_NOFIFOCHECK("grDrawTriangle",92); - 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"); - - GR_FLUSH_STATE(); - - /* Silly warning killer */ - if (0) goto all_done; - -#ifdef GLIDE_DEBUG -#if 0 - if (0) { /* GMT: only use this if needed */ - FxU32 statBits; /* bits we care about in status register */ - FxU32 status; - - status = GR_GET(hw->status); - if ((statBits = status & SST_FIFOLEVEL) < _GlideRoot.stats.minPciFIFOFree) - _GlideRoot.stats.minPciFIFOFree = statBits; - - statBits = (status >> SST_MEMFIFOLEVEL_SHIFT) & 0xffff; - if (statBits < _GlideRoot.stats.minMemFIFOFree) - _GlideRoot.stats.minMemFIFOFree = statBits; - } -#endif - - if (_GlideRoot.environment.triBoundsCheck) { -#ifndef GLIDE3 - if (OUTBOUNDS(a) || OUTBOUNDS(b) || OUTBOUNDS(c)) { - GDBG_PRINTF("Triangle out of bounds:\n"); - GDBG_PRINTF("a->x = %3.2f, a->y = %3.2f\n", a->x, a->y); - GDBG_PRINTF("b->x = %3.2f, b->y = %3.2f\n", b->x, b->y); - GDBG_PRINTF("c->x = %3.2f, c->y = %3.2f\n", c->x, c->y); - GDBG_PRINTF("Culling triangle based on these bogus values.\n"); - goto all_done; - } -#endif - } -#endif /* GLIDE_DEBUG */ - - /* _trisetup and _trisetup_asm return 0 if culled, 1 if drawn */ -#if GLIDE_DEBUG && !GLIDE_USE_C_TRISETUP - /* HackAlert: Nuke the fifo ptr checking stuff here if we're just - * debugging teh asm tri code. - */ - if (TRISETUP(a, b, c) != 0) { - gc->checkPtr = (FxU32)gc->cmdTransportInfo.fifoPtr; - gc->checkCounter = 0; - } -#else - TRISETUP(a, b, c); -#endif - -all_done: - GR_END(); -#else -#if defined(__MSC__) - { - extern struct _GlideRoot_s _GlideRoot; - - _asm { - mov eax, [_GlideRoot + kCurGCOffset]; - mov eax, [eax + kTriProcOffset]; - jmp eax; - } - } -#endif -#if defined( __linux__ ) - - /* Here's the basic strategy for this dispatch code: - * We jump to _GlideRoot.curGC->archDispatchProcs.triSetupProc - * which contains code that looks like a function, we leave the - * paramters passed to grDrawTriangle on the stack and the dispatched - * function picks them up. However we have to compensate for - * the compiler pushing anything on the stack. The following describes - * why and when we have to pop. - * - * BIG_OPT: gcc pushes a frame pointer to maintain things, BIG_OPT - * turns on -fomit-frame-pointer so we don't have to pop it. - * - * PIC: When using position independant code gcc stores eip in ebx - * so it saves ebx from the previous call automatically. - * Therefore, once we have the jump address we have to pop ebx - * to restore the stack. - * - * The syntax is further complicated by the fact that gcc can (and will) - * emit code between the asm statements, so they all need to be in a single - * asm statement, wrapped with #ifdef's. This means we have fun with - * deciding if we need to list trashed registers and when we need commas - * between them. - */ - - asm ( -#if defined(PIC) - "popl %%ebx\n\t" -#endif -#if !defined(BIG_OPT) - "popl %%ebp\n\t" -#endif - "jmp *%0" - : /* no outputs */ - :"m" (_GlideRoot.curGC->archDispatchProcs.triSetupProc) -#if defined (PIC) || !defined (BIG_OPT) - : -#endif -#if defined (PIC) - "ebx" -#endif -#if defined (PIC) && !defined (BIG_OPT) - , -#endif -#if !defined(BIG_OPT) - "ebp" -#endif - ); -#endif -#endif -#undef FN_NAME -} /* grDrawTriangle */ - -#ifndef GLIDE3_ALPHA -/*--------------------------------------------------------------------------- - ** grDrawPlanarPolygon - ** - ** Brute force "triangle-fan" implementation of a convex polygon drawer. - */ -GR_ENTRY(grDrawPlanarPolygon, - void, - (int nVerts, const int iList[], const GrVertex vList[])) -{ - GR_BEGIN_NOFIFOCHECK("grDrawPlanarPolygon",93); - GDBG_INFO_MORE(gc->myLevel,"(%d,0x%x,0x%x)\n",nVerts,iList,vList); - GR_CHECK_F(myName, !iList || !vList, "NULL pointer passed"); - - GR_FLUSH_STATE(); - -#if GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP - grDrawPolygon(nVerts, iList, vList); -#else /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - { - int n,i = nVerts-2; - const GrVertex *firstv = &vList[iList[0]]; - - for (i = 1; i < nVerts - 1; i++) { - n = TRISETUP(firstv, &vList[iList[i]], &vList[iList[i+1]]); - if (n > 0) break; /* stop after 1st non-zero-area triangle */ - if (n < 0) goto all_done; - } - /* now all the gradients are loaded into the chip, so we just have to */ - /* draw all the rest of the triangles */ - for (i = i+1; i < nVerts - 1; i++) { - _trisetup_nogradients(firstv, &vList[iList[i]], &vList[iList[i+1]]); - } - } -all_done: -#endif /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - - GR_END(); -} /* grDrawPlanarPolygon */ - -/*--------------------------------------------------------------------------- - ** grDrawPlanarPolygonVertexList - ** - ** Brute force "triangle-fan" implementation of a convex polygon drawer. - */ - -GR_ENTRY(grDrawPlanarPolygonVertexList, void, (int nVerts, const GrVertex vList[])) -{ - GR_BEGIN_NOFIFOCHECK("grDrawPlanarPolygonVertexList",93); - GDBG_INFO_MORE(gc->myLevel,"(%d,0x%x)\n",nVerts,vList); - GR_CHECK_F(myName, !vList, "NULL pointer passed"); - - GR_FLUSH_STATE(); - -#if GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP - grDrawPolygonVertexList(nVerts, vList); -#else /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - { - int n,i = nVerts-2; - const GrVertex *firstv = &vList[0]; - - for (i = 1; i < nVerts - 1; i++) { - n = TRISETUP(firstv, &vList[i], &vList[i+1]); - if (n > 0) break; /* stop after 1st non-zero-area triangle */ - if (n < 0) goto all_done; - } - /* now all the gradients are loaded into the chip, so we just have to */ - /* draw all the rest of the triangles */ - for (i = i+1; i < nVerts - 1; i++) { - _trisetup_nogradients(firstv, &vList[i], &vList[i+1]); - } - -all_done: - ; - } -#endif /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - - GR_END(); -} /* grDrawPlanarPolygonVertexList */ - -#if GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP -#define kMaxPacket3Vertex 0x0FUL - -/* Packet 3 requires at least one vertex, if there isn't enough room - * in the fifo then force a wrap now and write up to the max. - */ -#define FIFO_VERT(__vertSize, __polyVerts) \ - ((gc->cmdTransportInfo.fifoRoom < (FxI32)(sizeof(FxU32) + (__vertSize))) \ - ? (__polyVerts) \ - : MIN((__polyVerts), ((gc->cmdTransportInfo.fifoRoom - sizeof(FxU32)) / (__vertSize)))) - -#define FIFO_MAX_VERT(__polyVerts) MIN(kMaxPacket3Vertex, (__polyVerts)) -#endif /* GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP */ - -/*--------------------------------------------------------------------------- - ** grDrawPolygon - ** - ** Brute force "triangle-fan" implementation of a convex polygon drawer. - */ - -GR_ENTRY(grDrawPolygon, void, (int nVerts, const int iList[], const GrVertex vList[])) -{ -#define FN_NAME "grDrawPolygon" - GR_BEGIN_NOFIFOCHECK("grDrawPolygon",93); - GDBG_INFO_MORE(gc->myLevel,"(%d,0x%x,0x%x)\n",nVerts,iList,vList); - GR_CHECK_F(myName, !iList || !vList, "NULL pointer passed"); - - GR_FLUSH_STATE(); - - /* Zero length vertex lists are allowed, but we can't send them to - * the hw. - */ - if (nVerts <= 0) goto __exitNoVerts; - -#if GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP - { - const FxU32 vertexParamOffset = _GlideRoot.curVertexSize; - const int* vertexIndexP = iList; - FxU32 packVertMax = FIFO_MAX_VERT(nVerts); /* Max possible verts for this packet */ - FxU32 packVerts = FIFO_VERT(vertexParamOffset, packVertMax); /* # verts for this packet */ - FxU32 packType = SSTCP_PKT3_BDDDDD; - -__doPolyVertexSend: - { - const FxU32 packSize = packVerts * vertexParamOffset; - FxU32 vertexOffset; - - GR_ASSERT((packSize % vertexParamOffset) == 0); - GR_ASSERT(packSize >= vertexParamOffset); - - GR_SET_EXPECTED_SIZE(packSize, 1); - TRI_STRIP_BEGIN(kSetupFan, - packSize / vertexParamOffset, vertexParamOffset, - packType); - for(vertexOffset = 0; vertexOffset < packSize; vertexOffset += vertexParamOffset) { - const float* vertex = (const float*)(vList + *vertexIndexP++); - - TRI_SETF(vertex[GR_VERTEX_X_OFFSET]); - TRI_SETF(vertex[GR_VERTEX_Y_OFFSET]); - - { - const int* dataList = gc->tsuDataList; - -#if GLIDE_PACKED_RGB - { - FxBool doColorP = FXFALSE; - FxU32 packedColor = 0x00; - - if (*dataList == (GR_VERTEX_R_OFFSET << 2)) { - packedColor = (RGBA_COMP_CLAMP(FARRAY(vertex, (GR_VERTEX_B_OFFSET << 2)), B) | - RGBA_COMP_CLAMP(FARRAY(vertex, (GR_VERTEX_G_OFFSET << 2)), G) | - RGBA_COMP_CLAMP(FARRAY(vertex, (GR_VERTEX_R_OFFSET << 2)), R)); - doColorP = FXTRUE; - dataList++; - } - - if (*dataList == (GR_VERTEX_A_OFFSET << 2)) { - packedColor |= RGBA_COMP_CLAMP(FARRAY(vertex, (GR_VERTEX_A_OFFSET << 2)), A); - doColorP = FXTRUE; - dataList++; - } - - if (doColorP) TRI_SET(packedColor); - } -#endif /* GLIDE_PACKED_RGB */ - -#if GLIDE_FP_CLAMP_TEX - while(*dataList != 0) { - TRI_SETF(FARRAY(vertex, *dataList)); - dataList++; - } - - dataList++; -#endif /* GLIDE_FP_CLAMP_TEX */ - - while (*dataList != 0) { - TRI_SETF_CLAMP(FARRAY(vertex, *dataList)); - dataList++; - } - } - } - TRI_END; - GR_CHECK_SIZE(); - } - - /* Are there more vertices that need to be sent for this - * polygon? Reset the parameters and do the rest of them. - */ - if (vertexIndexP < iList + nVerts) { - /* Reset the # of verts maxing out the send based on the - * space left in the fifo and the max packet size. - */ - nVerts -= packVerts; - packVertMax = FIFO_MAX_VERT(nVerts); /* Max possible verts for this packet */ - packVerts = FIFO_VERT(vertexParamOffset, packVertMax); /* # verts for this packet */ - - packType = SSTCP_PKT3_DDDDDD; - - GDBG_INFO(120, "\tSending continueing polygon data (0x%X : 0x%X)\n", nVerts, packVerts); - - goto __doPolyVertexSend; - } - } -#else /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - { - int i; - for (i = 1; i < nVerts - 1; i++) { - grDrawTriangle(&vList[iList[0]], &vList[iList[i]], &vList[iList[i+1]]); - } - } -#endif /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - -__exitNoVerts: - GR_END(); -#undef FN_NAME -} /* grDrawPolygon */ - -/*--------------------------------------------------------------------------- - ** grDrawPolygonVertexList - ** - ** Brute force "triangle-fan" implementation of a convex polygon drawer. - */ - -GR_ENTRY(grDrawPolygonVertexList, void, (int nVerts, const GrVertex vList[])) -{ -#define FN_NAME "grDrawPolygonVertexList" - GR_BEGIN_NOFIFOCHECK("grDrawPolygonVertexList", 92); - GDBG_INFO_MORE(gc->myLevel,"(%d,0x%x)\n",nVerts,vList); - GR_CHECK_F(myName, !vList, "NULL pointer passed"); - - GR_FLUSH_STATE(); - - /* Zero length vertex lists are allowed, but we can't send them to - * the hw. - */ - if (nVerts <= 0) goto __exitNoVerts; - -#if GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP - { - const FxU32 vertexParamOffset = _GlideRoot.curVertexSize; - const GrVertex* vertexListP = vList; - FxU32 packVertMax = FIFO_MAX_VERT(nVerts); /* Max possible verts for this packet */ - FxU32 packVerts = FIFO_VERT(vertexParamOffset, packVertMax); /* # verts for this packet */ - FxU32 packType = SSTCP_PKT3_BDDDDD; - -__doPolyVertexSend: - GR_ASSERT(packVerts > 0); - GR_ASSERT(packVerts <= kMaxPacket3Vertex); - - { - const FxU32 packSize = packVerts * vertexParamOffset; - FxU32 vertexOffset; - - GR_SET_EXPECTED_SIZE(packSize, 1); - TRI_STRIP_BEGIN(kSetupFan, packVerts, vertexParamOffset, packType); - - for(vertexOffset = 0; vertexOffset < packSize; vertexOffset += vertexParamOffset) { - const float* vertex = (const float*)vertexListP++; - - TRI_SETF(vertex[GR_VERTEX_X_OFFSET]); - TRI_SETF(vertex[GR_VERTEX_Y_OFFSET]); - - { - const int* dataList = gc->tsuDataList; - -#if GLIDE_PACKED_RGB - { - FxBool doColorP = FXFALSE; - FxU32 packedColor = 0x00; - - if (*dataList == (GR_VERTEX_R_OFFSET << 2)) { - packedColor = (RGBA_COMP_CLAMP(FARRAY(vertex, (GR_VERTEX_B_OFFSET << 2)), B) | - RGBA_COMP_CLAMP(FARRAY(vertex, (GR_VERTEX_G_OFFSET << 2)), G) | - RGBA_COMP_CLAMP(FARRAY(vertex, (GR_VERTEX_R_OFFSET << 2)), R)); - doColorP = FXTRUE; - dataList++; - } - - if (*dataList == (GR_VERTEX_A_OFFSET << 2)) { - packedColor |= RGBA_COMP_CLAMP(FARRAY(vertex, (GR_VERTEX_A_OFFSET << 2)), A); - doColorP = FXTRUE; - dataList++; - } - - if (doColorP) TRI_SET(packedColor); - } -#endif /* GLIDE_PACKED_RGB */ - -#if GLIDE_FP_CLAMP_TEX - while(*dataList != 0) { - TRI_SETF(FARRAY(vertex, *dataList)); - dataList++; - } - - dataList++; -#endif /* GLIDE_FP_CLAMP_TEX */ - - while (*dataList != 0) { - TRI_SETF_CLAMP(FARRAY(vertex, *dataList)); - dataList++; - } - } - } - TRI_END; - GR_CHECK_SIZE(); - } - - /* More verts? */ - if (vertexListP < vList + nVerts) { - /* Reset the # of verts maxing out the send based on the - * space left in the fifo and the max packet size. - */ - nVerts -= packVerts; - packVertMax = FIFO_MAX_VERT(nVerts); /* Max possible verts for this packet */ - packVerts = FIFO_VERT(vertexParamOffset, packVertMax); /* # verts for this packet */ - - /* Packet type to continue strip */ - packType = SSTCP_PKT3_DDDDDD; - - GDBG_INFO(120, "\tSending continueing polygon data (0x%X : 0x%X)\n", packVerts, nVerts); - - goto __doPolyVertexSend; - } - } -#else /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - { - int i; - - for (i = 1; i < nVerts - 1; i++) { - grDrawTriangle(&vList[0], &vList[i], &vList[i+1]); - } - } -#endif /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - -__exitNoVerts: - GR_END(); -#undef FN_NAME -} /* grDrawPolygonVertexList */ -#endif /* !GLIDE3_ALPHA */ - -/*--------------------------------------------------------------------------- - ** _grColorCombineDelta0Mode - ** - ** GMT: when we are in delta0 mode, color comes from the RGB iterators - ** but the slopes are 0.0. So when we enter delta0 mode we set - ** the iterators up and then we leave them alone during primitive - ** rendering - */ - -GR_DDFUNC(_grColorCombineDelta0Mode, void, (FxBool delta0mode)) -{ -#define FN_NAME "_grColorCombineDelta0Mode" - GR_BEGIN_NOFIFOCHECK("_grColorCombineDelta0Mode",85); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",delta0mode); - - if (delta0mode) { - GR_SET_EXPECTED_SIZE(9 << 2, 9); - { - GR_SETF(BROADCAST_ID, hw, Fr, gc->state.r); - GR_SETF(BROADCAST_ID, hw, Fg, gc->state.g); - GR_SETF(BROADCAST_ID, hw, Fb, gc->state.b); - GR_SET(BROADCAST_ID, hw, drdx, 0); - GR_SET(BROADCAST_ID, hw, drdy, 0); - GR_SET(BROADCAST_ID, hw, dgdx, 0); - GR_SET(BROADCAST_ID, hw, dgdy, 0); - GR_SET(BROADCAST_ID, hw, dbdx, 0); - GR_SET(BROADCAST_ID, hw, dbdy, 0); - } - GR_CHECK_SIZE(); - } - - gc->state.cc_delta0mode = delta0mode; - GR_END(); -#undef FN_NAME -} /* _grColorCombineDeltaMode */ - -#ifdef GLIDE3 /* glide 3. draw points, and strip line routine */ - -#define DA_BEGIN \ -{ \ - FxU32* packetPtr = gc->cmdTransportInfo.fifoPtr; \ - FxU32 packetVal; - -#define DA_CONT(__setupMode, __params, __nVertex, __vertexSize, __cmd) \ - packetVal = (((__setupMode) << SSTCP_PKT3_SMODE_SHIFT) | /* [27:22] */ \ - (__params) | /* pack[28] params[21:10] */ \ - ((__nVertex) << SSTCP_PKT3_NUMVERTEX_SHIFT) | /* [9:6] */ \ - (__cmd) | /* command [5:3] */ \ - SSTCP_PKT3); /* type [2:0] */ \ - SET(*packetPtr++, packetVal); - -#define DA_SETF(__val) \ - SETF(*packetPtr++, (__val)); \ - GR_INC_SIZE(sizeof(FxFloat)) - -#define DA_END \ - gc->cmdTransportInfo.fifoRoom -= ((FxU32)packetPtr - (FxU32)gc->cmdTransportInfo.fifoPtr); \ - gc->cmdTransportInfo.fifoPtr = packetPtr; \ - FIFO_ASSERT(); \ -} - -/*------------------------------------------------------------------- - Function: _grDrawPoints - Date: 13-Oct-97 - Implementor(s): atai - Description: - Draw array points - Arguments: - - Return: - -------------------------------------------------------------------*/ -void FX_CSTYLE -_grDrawPoints(FxI32 mode, FxI32 count, void *pointers) -{ -#define FN_NAME "_grDrawPoints" - - /* - * the point routine is similar to grDrawPoint routine - * except the data set up is from the pointer array and - * its data layout - */ - float bias = (float)(3 << 22); - FxI32 stride = mode; - - GR_BEGIN_NOFIFOCHECK(FN_NAME, 90); - - GDBG_INFO_MORE(gc->myLevel, "(count = %d, pointers = 0x%x)\n", - count, pointers); - - GR_FLUSH_STATE(); - - /* - * In the sbench example, we observe larger buffer, less fifo - * size updating and less checking make the routine run faster. - * Here we use a point buffer of size 100. We also remove the size - * check outside the buffer loop - */ -#define POINTS_BUFFER 100 - - if (stride == 0) - stride = gc->state.vData.vStride; - - if (gc->state.grCoordinateSpaceArgs.coordinate_space_mode == GR_WINDOW_COORDS) { - while (count > 0) { - float *vPtr; - FxI32 k, i; - FxI32 vcount = count >= POINTS_BUFFER ? POINTS_BUFFER : count; - GR_SET_EXPECTED_SIZE(((sizeof(FxU32) << 2) + gc->state.vData.vSize) * vcount, vcount << 1); - - /* begin points routine */ - DA_BEGIN; - - for (k = 0; k < vcount; k++) { - - vPtr = pointers; - if (mode) - vPtr = *(float **)vPtr; - - (float *)pointers += stride; - - GDBG_INFO_MORE(gc->myLevel, "(%f %f)\n", FARRAY(vPtr,GR_VERTEX_X_OFFSET << 2), FARRAY(vPtr,GR_VERTEX_Y_OFFSET << 2)); - - /* we snap to an integer by adding a large enough number that it - * shoves all fraction bits off the right side of the mantissa. - * - * NB: IEEE rounds to nearest integer by default, but to get the ceiling - * effect everywhere we adjust the bias by a little bit more than 0.5. - */ - { - float fx = FARRAY(vPtr, GR_VERTEX_X_OFFSET << 2) + _GlideRoot.pool.fHalf; - float fy = FARRAY(vPtr, GR_VERTEX_Y_OFFSET << 2) + _GlideRoot.pool.fHalf; - FxU32 dataElem; - - DA_CONT(kSetupStrip | kSetupCullDisable, 0x00, - 0x02, sizeof(FxU32) << 1, SSTCP_PKT3_BDDDDD); - - fx += bias; - fy += bias; - - /* Convert to 32-bit representation */ - _GlideRoot.pool.ftemp1 = (const float)fx; - _GlideRoot.pool.ftemp2 = (const float)fy; - - /* draw a little triangle, with the lower left corner at pixel center. */ - - /* The approach here is to split the triangle into two packets, one - * that sends just the coordinates of the last two points of the - * triangle w/ no other parameter information, and then the - * centered point w/ all of the parameter information. The first - * packet is has a BDD command, but is incomplete, so nothing - * draws, the next packet has a DDD command so will complete the - * triangle from the first packet sent. - */ - - /* Correct the bias to get rid of the fractional bits */ - - fx = (volatile float)_GlideRoot.pool.ftemp1 - bias; - fy = (volatile float)_GlideRoot.pool.ftemp2 - bias; - - /* Remainder of the coordinates packet */ - DA_SETF(fx); - DA_SETF(fy); - - GR_ASSERT((fx >= floor(FARRAY(vPtr, GR_VERTEX_X_OFFSET << 2))) && - (fx <= floor(FARRAY(vPtr, GR_VERTEX_X_OFFSET << 2) + 1.0f)) && - (fy >= floor(FARRAY(vPtr, GR_VERTEX_Y_OFFSET << 2))) && - (fy <= floor(FARRAY(vPtr, GR_VERTEX_Y_OFFSET << 2) + 1.0f))); - - fy -= _GlideRoot.pool.fHalf; - DA_SETF(fx); - dataElem = 0; - DA_SETF(fy); - - fx -= _GlideRoot.pool.fHalf; - - /* Packet w/ actual point coordinate and parameter data */ - DA_CONT(kSetupStrip | kSetupCullDisable, gc->cmdTransportInfo.paramMask, - 1, gc->state.vData.vSize, SSTCP_PKT3_DDDDDD); - - i = gc->tsuDataList[dataElem]; - DA_SETF(fx); - DA_SETF(fy); - while (i != GR_DLIST_END) { - DA_SETF(FARRAY(vPtr, i)); - dataElem++; - i = gc->tsuDataList[dataElem]; - } - } - _GlideRoot.stats.pointsDrawn++; - } - DA_END; - GR_CHECK_SIZE(); - /* end points routine */ - - count -= POINTS_BUFFER; - } - } - else { - /* - * first cut of clip space coordinate code. - */ - - float oow; - - while (count > 0) { - float *vPtr; - FxI32 k; - FxI32 vcount = count >= POINTS_BUFFER ? POINTS_BUFFER : count; - GR_SET_EXPECTED_SIZE(((sizeof(FxU32) << 2) + gc->state.vData.vSize) * vcount, vcount << 1); - - /* begin points routine */ - DA_BEGIN; - - for (k = 0; k < vcount; k++) { - - vPtr = pointers; - if (mode) - vPtr = *(float **)vPtr; - oow = 1.0f / FARRAY(vPtr, gc->state.vData.wInfo.offset); - (float *)pointers += stride; - - { - float fx = FARRAY(vPtr, GR_VERTEX_X_OFFSET << 2)*oow*gc->state.Viewport.hwidth - + gc->state.Viewport.ox + _GlideRoot.pool.fHalf; - float fy = FARRAY(vPtr, GR_VERTEX_Y_OFFSET << 2)*oow*gc->state.Viewport.hheight - + gc->state.Viewport.oy + _GlideRoot.pool.fHalf; - DA_CONT(kSetupStrip | kSetupCullDisable, 0x00, - 0x02, sizeof(FxU32) << 1, SSTCP_PKT3_BDDDDD); - fx += bias; - fy += bias; - /* Convert to 32-bit representation */ - _GlideRoot.pool.ftemp1 = (const float)fx; - _GlideRoot.pool.ftemp2 = (const float)fy; - fx = (volatile float)_GlideRoot.pool.ftemp1 - bias; - fy = (volatile float)_GlideRoot.pool.ftemp2 - bias; - /* Remainder of the coordinates packet */ - DA_SETF(fx); - DA_SETF(fy); - GR_ASSERT((fx >= floor(FARRAY(vPtr, GR_VERTEX_X_OFFSET << 2)*oow*gc->state.Viewport.hwidth+gc->state.Viewport.ox)) && - (fx <= floor(FARRAY(vPtr, GR_VERTEX_X_OFFSET << 2)*oow*gc->state.Viewport.hwidth+gc->state.Viewport.ox + 1.0f)) && - (fy >= floor(FARRAY(vPtr, GR_VERTEX_Y_OFFSET << 2)*oow*gc->state.Viewport.hheight+gc->state.Viewport.oy)) && - (fy <= floor(FARRAY(vPtr, GR_VERTEX_Y_OFFSET << 2)*oow*gc->state.Viewport.hheight+gc->state.Viewport.oy + 1.0f))); - - fy -= _GlideRoot.pool.fHalf; - DA_SETF(fx); - DA_SETF(fy); - - fx -= _GlideRoot.pool.fHalf; - - /* Packet w/ actual point coordinate and parameter data */ - DA_CONT(kSetupStrip | kSetupCullDisable, gc->cmdTransportInfo.paramMask, - 1, gc->state.vData.vSize, SSTCP_PKT3_DDDDDD); - - DA_SETF(fx); - DA_SETF(fy); - DA_VP_SETFS(vPtr, oow); - } - _GlideRoot.stats.pointsDrawn++; - } - DA_END; - GR_CHECK_SIZE(); - /* end points routine */ - - count -= POINTS_BUFFER; - } - } - -#undef FN_NAME -} /* _grDrawPoints */ - -/*------------------------------------------------------------------- - Function: _grDrawLineStrip - Date: 13-Oct-97 - Implementor(s): atai - Description: - Draw strip line - Arguments: - - Return: - -------------------------------------------------------------------*/ -void FX_CSTYLE -_grDrawLineStrip(FxI32 mode, FxI32 ltype, FxI32 count, void *pointers) -{ -#define FN_NAME "_grDrawLineStrip" - -#if 1 - /* - * the line routine is similar to grDrawLine routine - * except the data set up is from the pointer array and - * its data layout - */ - int j; - FxI32 sCount; - FxU32 vertexParamOffset; - FxI32 stride = mode; - -#define DX _GlideRoot.pool.ftemp1 -#define ADY _GlideRoot.pool.ftemp2 - - GR_BEGIN_NOFIFOCHECK("_grDrawLineStrip", 91); - - GDBG_INFO_MORE(gc->myLevel, "(count = %d, pointers = 0x%x)\n", - count, pointers); - - vertexParamOffset = gc->state.vData.vSize; - - GR_FLUSH_STATE(); - -#define LINES_BUFFER 100 - - if (stride == 0) - stride = gc->state.vData.vStride; - if (ltype == GR_LINES) - sCount = count >> 1; /* line list */ - else - sCount = count-1; /* strip line */ - - if (gc->state.grCoordinateSpaceArgs.coordinate_space_mode == GR_WINDOW_COORDS) { - while (sCount > 0) { - FxI32 k, i; - FxI32 vcount = sCount >= LINES_BUFFER ? LINES_BUFFER : sCount; - - GR_SET_EXPECTED_SIZE((gc->state.vData.vSize << 2) * vcount, vcount); - DA_BEGIN; - for (k = 0; k < vcount; k++) { - float *a = (float *)pointers; - float *b = (float *)pointers + 1; - if (mode) { - a = *(float **)a; - b = *(float **)b; - } - (float *)pointers += stride; - if (ltype == GR_LINES) - (float *)pointers += stride; - - /* - ** compute absolute deltas and draw from low Y to high Y - */ - ADY = FARRAY(b, GR_VERTEX_Y_OFFSET << 2) - FARRAY(a, GR_VERTEX_Y_OFFSET << 2); - i = *(long *)&ADY; - if (i < 0) { - float *tv; - tv = a; a = b; b = tv; - i ^= 0x80000000; /* ady = -ady; */ - (*(long *)&ADY) = i; - } - - DX = FARRAY(b, GR_VERTEX_X_OFFSET << 2) - FARRAY(a, GR_VERTEX_X_OFFSET << 2); - j = *(long *)&DX; - if (j < 0) { - j ^= 0x80000000; /* adx = -adx; */ - } - - /* check for zero-length lines */ - if ((j >= i) && (j == 0)) goto all_done; - - /* Draw the triangle pair as a strip of 4 vertices. - * We can skip all of the gradient calculation stuff. - * - * NB: There are two cases, x/y major lines, and each of these - * loops are unrolled to send one set of endpoints of the 'line' - * per iteration since we can use the same bias per iteration. - */ - DA_CONT(kSetupCullDisable | kSetupStrip, gc->cmdTransportInfo.paramMask, - 0x04UL, vertexParamOffset, SSTCP_PKT3_BDDDDD); - { - FxU32 dataElem; - /* x major */ - if (j >= i) { - DA_SETF(FARRAY(b, GR_VERTEX_X_OFFSET << 2)); - dataElem = 0; - DA_SETF(FARRAY(b, GR_VERTEX_Y_OFFSET << 2) - _GlideRoot.pool.fHalf); - i = gc->tsuDataList[dataElem]; - while (i != GR_DLIST_END) { - DA_SETF(FARRAY(b, i)); - dataElem++; - i = gc->tsuDataList[dataElem]; - } - - DA_SETF(FARRAY(a, GR_VERTEX_X_OFFSET << 2)); - dataElem = 0; - DA_SETF(FARRAY(a, GR_VERTEX_Y_OFFSET << 2) - _GlideRoot.pool.fHalf); - i = gc->tsuDataList[dataElem]; - while (i != GR_DLIST_END) { - DA_SETF(FARRAY(a, i)); - dataElem++; - i = gc->tsuDataList[dataElem]; - } - - DA_SETF(FARRAY(b, GR_VERTEX_X_OFFSET << 2)); - dataElem = 0; - DA_SETF(FARRAY(b, GR_VERTEX_Y_OFFSET << 2) + _GlideRoot.pool.fHalf); - i = gc->tsuDataList[dataElem]; - while (i != GR_DLIST_END) { - DA_SETF(FARRAY(b, i)); - dataElem++; - i = gc->tsuDataList[dataElem]; - } - - DA_SETF(FARRAY(a, GR_VERTEX_X_OFFSET << 2)); - dataElem = 0; - DA_SETF(FARRAY(a, GR_VERTEX_Y_OFFSET << 2) + _GlideRoot.pool.fHalf); - i = gc->tsuDataList[dataElem]; - while (i != GR_DLIST_END) { - DA_SETF(FARRAY(a, i)); - dataElem++; - i = gc->tsuDataList[dataElem]; - } - } else { /* y major */ - DA_SETF(FARRAY(b, GR_VERTEX_X_OFFSET << 2) - _GlideRoot.pool.fHalf); - dataElem = 0; - DA_SETF(FARRAY(b, GR_VERTEX_Y_OFFSET << 2)); - i = gc->tsuDataList[dataElem]; - while (i != GR_DLIST_END) { - DA_SETF(FARRAY(b, i)); - dataElem++; - i = gc->tsuDataList[dataElem]; - } - - DA_SETF(FARRAY(a, GR_VERTEX_X_OFFSET << 2) - _GlideRoot.pool.fHalf); - dataElem = 0; - DA_SETF(FARRAY(a, GR_VERTEX_Y_OFFSET << 2)); - i = gc->tsuDataList[dataElem]; - while (i != GR_DLIST_END) { - DA_SETF(FARRAY(a, i)); - dataElem++; - i = gc->tsuDataList[dataElem]; - } - - DA_SETF(FARRAY(b, GR_VERTEX_X_OFFSET << 2) + _GlideRoot.pool.fHalf); - dataElem = 0; - DA_SETF(FARRAY(b, GR_VERTEX_Y_OFFSET << 2)); - i = gc->tsuDataList[dataElem]; - while (i != GR_DLIST_END) { - DA_SETF(FARRAY(b, i)); - dataElem++; - i = gc->tsuDataList[dataElem]; - } - - DA_SETF(FARRAY(a, GR_VERTEX_X_OFFSET << 2) + _GlideRoot.pool.fHalf); - dataElem = 0; - DA_SETF(FARRAY(a, GR_VERTEX_Y_OFFSET << 2)); - i = gc->tsuDataList[dataElem]; - while (i != GR_DLIST_END) { - DA_SETF(FARRAY(a, i)); - dataElem++; - i = gc->tsuDataList[dataElem]; - } - } - } - _GlideRoot.stats.linesDrawn++; - all_done: - ; - } - DA_END; - GR_CHECK_SIZE(); - sCount -= POINTS_BUFFER; - } - } - else { - - float oowa, oowb, owa, owb, tmp1, tmp2, fax, fay, fbx, fby; - - while (sCount > 0) { - FxI32 k, i; - FxI32 vcount = sCount >= LINES_BUFFER ? LINES_BUFFER : sCount; - float *a,*b; - GR_SET_EXPECTED_SIZE((gc->state.vData.vSize << 2) * vcount, vcount); - DA_BEGIN; - if (ltype == GR_LINE_STRIP) { - a = (float *)pointers; - if (mode) { - a = *(float **)a; - } - oowb = 1.0f / FARRAY(a, gc->state.vData.wInfo.offset); - } - for (k = 0; k < vcount; k++) { - if (ltype == GR_LINES) { - a = (float *)pointers; - b = (float *)pointers + 1; - if (mode) { - a = *(float **)a; - b = *(float **)b; - } - (float *)pointers += stride; - owa = oowa = 1.0f / FARRAY(a, gc->state.vData.wInfo.offset); - owb = oowb = 1.0f / FARRAY(b, gc->state.vData.wInfo.offset); - (float *)pointers += stride; - } - else { - owa = oowa = oowb; - a = (float *)pointers; - b = (float *)pointers + 1; - if (mode) { - a = *(float **)a; - b = *(float **)b; - } - (float *)pointers += stride; - owb = oowb = 1.0f / FARRAY(b, gc->state.vData.wInfo.offset); - } - fay = tmp1 = FARRAY(a, GR_VERTEX_Y_OFFSET << 2) - *oowa*gc->state.Viewport.hheight+gc->state.Viewport.oy; - fby = tmp2 = FARRAY(b, GR_VERTEX_Y_OFFSET << 2) - *oowb*gc->state.Viewport.hheight+gc->state.Viewport.oy; - - /* - ** compute absolute deltas and draw from low Y to high Y - */ - ADY = tmp2 - tmp1; - i = *(long *)&ADY; - if (i < 0) { - float *tv; - owa = oowb; owb = oowa; - fay = tmp2; - fby = tmp1; - tv = a; a = b; b = tv; - i ^= 0x80000000; /* ady = -ady; */ - (*(long *)&ADY) = i; - } - fax = FARRAY(a, GR_VERTEX_X_OFFSET << 2) - *owa*gc->state.Viewport.hwidth+gc->state.Viewport.ox; - fbx = FARRAY(b, GR_VERTEX_X_OFFSET << 2) - *owb*gc->state.Viewport.hwidth+gc->state.Viewport.ox; - - DX = fbx - fax; - j = *(long *)&DX; - if (j < 0) { - j ^= 0x80000000; /* adx = -adx; */ - } - - /* check for zero-length lines */ - if ((j >= i) && (j == 0)) goto all_done_vp; - - DA_CONT(kSetupCullDisable | kSetupStrip, gc->cmdTransportInfo.paramMask, - 0x04UL, vertexParamOffset, SSTCP_PKT3_BDDDDD); - { - /* x major */ - if (j >= i) { - DA_SETF(fbx); - DA_SETF(fby - _GlideRoot.pool.fHalf); - DA_VP_SETFS(b,oowb); - - DA_SETF(fax); - DA_SETF(fay - _GlideRoot.pool.fHalf); - DA_VP_SETFS(a,oowa); - - DA_SETF(fbx); - DA_SETF(fby + _GlideRoot.pool.fHalf); - DA_VP_SETFS(b,oowb); - - DA_SETF(fax); - DA_SETF(fay + _GlideRoot.pool.fHalf); - DA_VP_SETFS(a,oowa); - - } else { /* y major */ - DA_SETF(fbx - _GlideRoot.pool.fHalf); - DA_SETF(fby); - DA_VP_SETFS(b,oowb); - - DA_SETF(fax - _GlideRoot.pool.fHalf); - DA_SETF(fay); - DA_VP_SETFS(a,oowa); - - DA_SETF(fbx + _GlideRoot.pool.fHalf); - DA_SETF(fby); - DA_VP_SETFS(b,oowb); - - DA_SETF(fax + _GlideRoot.pool.fHalf); - DA_SETF(fay); - DA_VP_SETFS(a,oowa); - } - } - _GlideRoot.stats.linesDrawn++; - all_done_vp: - ; - } - DA_END; - GR_CHECK_SIZE(); - sCount -= POINTS_BUFFER; - } - } - -#endif - -#undef FN_NAME -} /* _grDrawLineStrip */ - -/*------------------------------------------------------------------- - Function: _grDrawTriangles - Date: 13-Oct-97 - Implementor(s): atai - Description: - Draw triangles - Arguments: - mode - 0 if grDrawVertexArrayLinear - 1 if grDrawVertexArray - count - number of triangles. - pointer - pointer to vertex data (mode = 0) or vertex array (mode = 1) - Return: - -------------------------------------------------------------------*/ -void FX_CSTYLE -_grDrawTriangles(FxI32 mode, FxI32 count, void *pointers) -{ -#define FN_NAME "_grDrawTriangles" - - FxI32 -#ifdef GLIDE_DEBUG - vSize, -#endif - k; - FxI32 stride = mode; - float *vPtr; - - GR_BEGIN_NOFIFOCHECK(FN_NAME, 90); - - GDBG_INFO_MORE(gc->myLevel, "(count = %d, pointers = 0x%x)\n", - count, pointers); - - GR_FLUSH_STATE(); - -#ifdef GLIDE_DEBUG - GDBG_INFO(110, "%s: vSize = %d\n", FN_NAME, vSize); - - GDBG_INFO(110, "%s: paramMask = 0x%x\n", FN_NAME, gc->cmdTransportInfo.paramMask); -#endif - - if (stride == 0) - stride = gc->state.vData.vStride; - - - if (gc->state.grCoordinateSpaceArgs.coordinate_space_mode == GR_WINDOW_COORDS) { - while (count > 0) { - FxI32 vcount = count >=15 ? 15 : count; - GR_SET_EXPECTED_SIZE(vcount * gc->state.vData.vSize, 1); - TRI_STRIP_BEGIN(kSetupStrip, vcount, gc->state.vData.vSize, SSTCP_PKT3_BDDBDD); - - for (k = 0; k < vcount; k++) { - FxI32 i; - FxU32 dataElem = 0; - - vPtr = pointers; - if (mode) - vPtr = *(float **)vPtr; - (float *)pointers += stride; - - i = gc->tsuDataList[dataElem]; - - TRI_SETF(FARRAY(vPtr, GR_VERTEX_X_OFFSET << 2)); - TRI_SETF(FARRAY(vPtr, GR_VERTEX_Y_OFFSET << 2)); - while (i != GR_DLIST_END) { - TRI_SETF(FARRAY(vPtr, i)); - dataElem++; - i = gc->tsuDataList[dataElem]; - } - } - TRI_END; - GR_CHECK_SIZE(); - count -= 15; - } - } - else { - /* - * first cut of clip space coordinate code, no optimization. - */ - float oow; - - while (count > 0) { - FxI32 vcount = count >= 15 ? 15 : count; - - GR_SET_EXPECTED_SIZE(vcount * gc->state.vData.vSize, 1); - TRI_STRIP_BEGIN(kSetupStrip, vcount, gc->state.vData.vSize, SSTCP_PKT3_BDDBDD); - - for (k = 0; k < vcount; k++) { - vPtr = pointers; - if (mode) - vPtr = *(float **)pointers; - 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; - } - } - -#undef FN_NAME -} /* _grDrawTriangles */ - -#endif /* GLIDE3 */ diff --git a/glide2x/h3/glide/src/gerror.c b/glide2x/h3/glide/src/gerror.c deleted file mode 100644 index 851cbf2..0000000 --- a/glide2x/h3/glide/src/gerror.c +++ /dev/null @@ -1,282 +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 3/17/99 6:16p Dow -** Phantom Menace and other fixes. -** -** 35 7/06/98 7:03p Jdt -** Error checking function definition simplified -** -** 34 6/16/98 9:36a Dow -** made error messages more like I want them -** -** 33 3/28/98 11:24a Dow -** itwoç -** -** 29 2/17/98 12:50p Dow -** More informative debug messages. -** -** 28 2/08/98 3:08p Dow -** FIFO Works - * - * 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 -#ifdef __DOS__ -# include -#endif - -#ifdef __WIN32__ -# include -#endif - -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include -#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 - /* Remove 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 -_grErrorDefaultCallback( const char *s, FxBool fatal ) -{ - if ( fatal ) { - GDBG_ERROR("glide", s); - grGlideShutdown(); - MessageBox(NULL, s, NULL, MB_OK); - } -} -#else -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) */ - } -} -#endif - -#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) -{ - static int depth; - - if (depth) - return; - - depth++; - -#if GLIDE_INIT_HAL - -#else /* !GLIDE_INIT_HAL */ - /* initRestoreVideo(); */ -#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 USE_PACKET_FIFO - /* Spew about the state of the fifo since that's what most of the - * assertions are about anyway. - */ - { - GR_DCL_GC; - GR_DCL_HW; - - gdbg_printf("Command Fifo:\n"); - gdbg_printf("\tSoftware:\n"); - gdbg_printf("\t\tfifoPtr: 0x%x\n", (FxU32) - gc->cmdTransportInfo.fifoPtr - (FxU32) gc->rawLfb); - gdbg_printf("\t\tfifoOffset: 0x%x\n", - gc->cmdTransportInfo.fifoOffset); - gdbg_printf("\t\tfifoEnd: 0x%x\n", - gc->cmdTransportInfo.fifoEnd - (FxU32) gc->rawLfb); - gdbg_printf("\tfifoSize: 0x%x\n", - gc->cmdTransportInfo.fifoSize); - gdbg_printf("\t\troomToReadPtr: 0x%x\n", - gc->cmdTransportInfo.roomToReadPtr); - gdbg_printf("\t\troomToEnd: 0x%x\n", - gc->cmdTransportInfo.roomToEnd); - gdbg_printf("\tHardware:\n"); - gdbg_printf("\t\treadPtrL: 0x%x\n", GR_CAGP_GET(readPtrL)); - gdbg_printf("\t\tdepth: 0x%x\n", GR_CAGP_GET(depth)); - gdbg_printf("\t\tholeCount: 0x%x\n", GR_CAGP_GET(holeCount)); - gdbg_printf("\t\tbaseAddrL: 0x%x\n", GR_CAGP_GET(baseAddrL)); - gdbg_printf("\t\taMin: 0x%x\n", GR_CAGP_GET(aMin)); - gdbg_printf("\t\taMax: 0x%x\n", GR_CAGP_GET(aMax)); - gdbg_printf("\t\tStatus: 0x%x\n", GR_GET(hw->status)); - -#if GLIDE_USE_DEBUG_FIFO && 0 - if (gc->cmdTransportInfo.fifoShadowBase != NULL) { - const FxU32* fifoPtr = gc->cmdTransportInfo.fifoShadowBase; - - GDBG_PRINTF("Shadow Fifo: \n"); - 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++); - - free(gc->cmdTransportInfo.fifoShadowBase); - } -#endif /* GLIDE_USE_DEBUG_FIFO */ - } -#endif /* (GLIDE_PLATFORM & GLIDE_HW_CVG) && USE_PACKET_FIFO */ - - gdbg_printf("ABNORMAL TERMINATION\n"); - - grGlideShutdown(); - - depth--; - - exit(-1); - -} /* _grAssert */ diff --git a/glide2x/h3/glide/src/gglide.c b/glide2x/h3/glide/src/gglide.c deleted file mode 100644 index ffd767a..0000000 --- a/glide2x/h3/glide/src/gglide.c +++ /dev/null @@ -1,2850 +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:27 joseph -** Initial checkin into SourceForge. -** -** -** 3 3/17/99 6:16p Dow -** Phantom Menace and other fixes. -** -** 194 3/10/99 6:38p Peter -** removed cruft -** -** 193 3/10/99 10:40a Peter -** bump-n-grind workaround for katmai until the bug is better -** characterized -** -** 192 3/02/99 2:21p Peter -** wax is a chip id -** -** 191 12/09/98 6:02p Atai -** grTexCombine did the right thing for the un-used TMU. Initialize the -** 2nd TMU value to take care of "set FX_GLIDE_NUM_TMU=1" -** -** 190 12/09/98 5:00p Atai -** set MAXLOD = MINLOD = 8 in _grUpdateParamIndex if ST1 is not used -** -** 189 12/05/98 1:04p Dow -** Fixed call to GDBG_INFO -** -** 188 12/03/98 11:27p Dow -** Code 'cleanup' heç -** -** 187 11/24/98 4:21p Jeske -** make sure we don't try to apply the banshee (rev<3) fogTable hack to -** avengers with (rev<3) -** -** 186 11/18/98 6:29p Dow -** Fixed clear problem on banshee/avenger -** -** 185 11/18/98 5:17p Atai -** fixed for direct write -** -** 184 10/21/98 10:41a Atai -** -** 183 10/20/98 5:34p Atai -** added #ifdefs for hwc -** -** 182 10/09/98 6:57p Peter -** dynamic 3DNow!(tm) mods -** -** 181 10/08/98 10:15a Dow -** Triple Buffering fix -** -** 180 9/01/98 12:47p Peter -** print correct pending value -** -** 179 8/29/98 10:04p Peter -** sdram clear fixes -** -** 178 8/27/98 9:54p Peter -** clear aux buffer w/ rgb not rbg -** -** 177 8/27/98 1:55p Peter -** use converted color on sdram boards -** -** 176 8/20/98 6:34p Dow -** Fixed swapInterval from broken effing speck -** -** 175 8/14/98 1:38p Dow -** Fixed swapinterval -** -** 174 7/29/98 3:09p Dow -** SDRAM Fixes -** -** 173 7/23/98 4:38p Dow -** Fixed Fog on B* -** -** 172 7/23/98 3:19p Dow -** Bump & Grind Fix -** -** 171 7/06/98 7:04p Jdt -** Buffer flushing logic added -** -** 170 6/26/98 10:08a Jdt -** -** 169 6/23/98 4:49p Dow -** Fixed CDA buffer hack. -** -** 168 6/03/98 1:39p Dow -** CMDFifo/AGP read workaround -** -** 167 5/31/98 9:03a Dow -** 800x600 resolution -** -** 166 5/29/98 4:30p Peter -** Chris's swap pending thing -** -** 165 5/29/98 10:44a Dow -** cmd/agp reg read workaround. -** -** 164 5/28/98 1:46p Dow -** Swap Pending Workaround -** -** 163 5/27/98 9:45a Peter -** grBufferClear is constrained by clipping -** -** 162 5/22/98 6:24p Atai -** texturing out of render buffer hack -** -** 161 5/20/98 8:14p Dow -** device rev -** -** 160 5/18/98 3:21p Peter -** dynamic culling changes -** -** 159 5/13/98 11:42a Dow -** -** 158 5/13/98 9:12a Dow -** -** 157 5/12/98 2:42p Dow -** -** 156 5/06/98 5:34p Dow -** 2D FastFill Workaround -** -** 155 4/24/98 3:48p Dow -** Better hack for bufferpending bug -** -** 154 4/21/98 9:57a Dow -** Better workaround for buffer pending bug -** -** 153 4/16/98 3:58p Peter -** 1x1 lod fix, sorry John -** -** 152 4/14/98 6:41p Peter -** Fixed grRenderBuffer/merge w/ cvg glide cleanup -** -** 151 4/03/98 2:04p Dow -** Dos Glide Mods -** -** 150 3/28/98 11:24a Dow -** itwoç -** -** 145 2/17/98 12:40p Peter -** fog table fix -** -** 144 2/08/98 3:08p Dow -** FIFO Works -** -** 143 2/03/98 8:45p Dow -** Prep for cmd fifo stuff -** -** 142 1/29/98 9:54p Dow -** This is Banshee -** -** 141 1/23/98 3:07p Peter -** uswc nightmare -** -** 140 1/19/98 1:45p Atai -** fixed non-debug mode assignement -** -** 139 1/19/98 11:07a Atai -** remove assignment before validate the state - * - * 137 1/15/98 1:12p Peter - * only one culler please - * - * 136 1/13/98 7:48p Atai - * fixed gu3dfGetInfo, grBufferClear, and GrState size - * - * 135 1/13/98 12:42p Atai - * fixed grtexinfo, grVertexLayout, and draw triangle - * - * 134 1/09/98 7:29p Atai - * fixed grBufferSwap for glide3 - * - * 133 1/08/98 9:25p Peter - * infinite recurrsion in debugging assert - * - * 132 1/08/98 9:23p Peter - * fixed macro effage - * - * 131 1/08/98 7:09p Peter - * real hw stuff modulo makefile change - * - * 130 1/08/98 4:58p Atai - * tex table broadcast, grVertexLayout enable/disable, stq, and some - * defines - * - * 129 1/07/98 5:22p Atai - * fixed grGet compiler error - * - * 128 1/07/98 10:22a Peter - * merged John's ooz fix - * - * 127 1/06/98 3:53p Atai - * remove grHint, modify grLfbWriteRegion and grGet - * - * 126 1/05/98 6:06p Atai - * glide extension stuff - * - * 125 12/22/97 12:40p Peter - * added new grColorCombine factor for OpenGL - * - * 124 12/18/97 2:13p Peter - * fogTable cataclysm - * - * 123 12/17/97 4:45p Peter - * groundwork for CrybabyGlide - * - * 122 12/17/97 4:06p Atai - * added grChromaRange(), grGammaCorrecionRGB(), grRest(), and grGet() - * functions - * - * 120 12/16/97 11:38a Atai - * added grChromaRange() - * - * 118 12/08/97 10:49a Atai - * rename some state variables - * - * 117 12/03/97 11:35a Peter - * reset for swapping - * - * 116 11/21/97 6:05p Atai - * use one datalist (tsuDataList) in glide3 - * - * 115 11/21/97 3:20p Peter - * direct writes tsu registers - * - * 114 11/18/97 6:11p Peter - * fixed glide3 effage - * - * 113 11/18/97 4:36p Peter - * chipfield stuff cleanup and w/ direct writes - * - * 112 11/18/97 3:27p Atai - * update vData - * optimize state monster - * - * 111 11/17/97 4:55p Peter - * watcom warnings/chipfield stuff - * - * 110 11/16/97 2:20p Peter - * cleanup - * - * 109 11/15/97 7:43p Peter - * more comdex silliness - * - * 108 11/14/97 5:02p Peter - * more comdex stuff - * - * 107 11/14/97 12:09a Peter - * comdex thing and some other stuff - * - * 106 11/13/97 4:39p Atai - * enable _grUpdateParamIndex for grGlideSetState - * - * 105 11/12/97 9:54p Peter - * fixed all the effage from new config - * - * 104 11/12/97 2:27p Peter - * - * 103 11/12/97 11:16a Peter - * cleaned up assertions - * - * 102 11/06/97 3:38p Dow - * More banshee stuff - * - * 101 11/04/97 5:59p Peter - * more of the same - * - * 100 11/03/97 3:43p Peter - * h3/cvg cataclysm - * - * 99 11/01/97 10:01a Peter - * tri dispatch stuff - * -** -*/ - -#include -#include <3dfx.h> -#include - -#define FX_DLL_DEFINITION -#include -#include - -#include "fxglide.h" -#include "fxinline.h" - -#include "rcver.h" -static char glideIdent[] = "@#%" VERSIONSTR ; - -#if GLIDE_HW_TRI_SETUP -static void -_grUpdateTriPacketHdr(FxU32 paramMask, - const GrCullMode_t mode); -#endif /* GLIDE_HW_TRI_SETUP */ - -/*--------------------------------------------------------------------------- -** grAlphaBlendFunction -** -** GMT: BUG if grColorMask() turns off alphaplanes then destination alpha -** blending wont work! -*/ - -GR_STATE_ENTRY(grAlphaBlendFunction, void, - (GrAlphaBlendFnc_t rgb_sf, GrAlphaBlendFnc_t rgb_df, - GrAlphaBlendFnc_t alpha_sf, GrAlphaBlendFnc_t alpha_df)) -{ -#define FN_NAME "grAlphaBlendFunction" - FxU32 alphamode; - GR_BEGIN_NOFIFOCHECK("grAlphaBlendFunction", 85); - GDBG_INFO_MORE(gc->myLevel, "(%d,%d,%d,%d)\n", - rgb_sf, rgb_df, alpha_sf, alpha_df); - - /* Watcom warning suppressor */ - glideIdent[0] = glideIdent[0]; - - alphamode = gc->state.fbi_config.alphaMode; - if (alpha_sf != GR_BLEND_ONE && alpha_sf != GR_BLEND_ZERO) { - GR_CHECK_W(myName, 1, "unsupported alpha source blend function"); - alpha_sf = GR_BLEND_ONE; - } - if (alpha_df != GR_BLEND_ONE && alpha_df != GR_BLEND_ZERO) { - GR_CHECK_W(myName, 1, "unsupported alpha destination blend function"); - alpha_df = GR_BLEND_ZERO; - } - if (rgb_sf == GR_BLEND_ONE && rgb_df == GR_BLEND_ZERO && - alpha_sf == GR_BLEND_ONE && alpha_df == GR_BLEND_ZERO) - alphamode &= ~SST_ENALPHABLEND; - else - alphamode |= SST_ENALPHABLEND; - - alphamode &= ~(SST_RGBSRCFACT | SST_RGBDSTFACT | SST_ASRCFACT | SST_ADSTFACT); - - alphamode |= (((FxU32) rgb_sf) << SST_RGBSRCFACT_SHIFT) | - (((FxU32) rgb_df) << SST_RGBDSTFACT_SHIFT) | - (((FxU32) alpha_sf) << SST_ASRCFACT_SHIFT) | - (((FxU32) alpha_df) << SST_ADSTFACT_SHIFT); - - gc->state.fbi_config.alphaMode = alphamode; - -#if !GLIDE3 - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, alphaMode, alphamode); - GR_CHECK_SIZE(); -#endif -#undef FN_NAME -} /* grAlphaBlendFunction */ - -/*--------------------------------------------------------------------------- -** grAlphaCombine -*/ - -GR_STATE_ENTRY(grAlphaCombine, void, - (GrCombineFunction_t function, GrCombineFactor_t factor, - GrCombineLocal_t local, GrCombineOther_t other, FxBool invert)) -{ -#define FN_NAME "grAlphaCombine" - FxU32 fbzColorPath; - FxU32 oldTextureEnabled; - - GR_BEGIN_NOFIFOCHECK("grAlphaCombine",85); - GDBG_INFO_MORE(gc->myLevel,"(%d,%d,%d,%d,%d)\n",function,factor,local,other,invert); - GR_CHECK_W(myName, - function < GR_COMBINE_FUNCTION_ZERO || - function > GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA, - "unsupported alpha combine function"); - GR_CHECK_W(myName, - (factor & 0x7) < GR_COMBINE_FACTOR_ZERO || - (factor & 0x7) > GR_COMBINE_FACTOR_TEXTURE_ALPHA || - factor > GR_COMBINE_FACTOR_ONE_MINUS_TEXTURE_ALPHA, - "unsupported alpha combine scale factor"); - - GR_CHECK_W(myName, - local < GR_COMBINE_LOCAL_ITERATED || local > GR_COMBINE_LOCAL_DEPTH, - "unsupported alpha combine local color"); - GR_CHECK_W(myName, - other < GR_COMBINE_OTHER_ITERATED || other > GR_COMBINE_OTHER_CONSTANT, - "unsupported alpha combine other color"); - - fbzColorPath = gc->state.fbi_config.fbzColorPath; - oldTextureEnabled = fbzColorPath & SST_ENTEXTUREMAP; - fbzColorPath &= ~(SST_ENTEXTUREMAP | - SST_ASELECT | - SST_ALOCALSELECT | - SST_CCA_ZERO_OTHER | - SST_CCA_SUB_CLOCAL | - SST_CCA_MSELECT | - SST_CCA_REVERSE_BLEND | - SST_CCA_ADD_CLOCAL | - SST_CCA_ADD_ALOCAL | - SST_CCA_INVERT_OUTPUT); - - /* setup reverse blending first, then strip off the the high bit */ - if ((factor & 0x8) == 0) - fbzColorPath |= SST_CCA_REVERSE_BLEND; - factor &= 0x7; - - /* NOTE: we use boolean OR instead of logical to avoid branches */ - gc->state.ac_requires_texture = (factor == GR_COMBINE_FACTOR_TEXTURE_ALPHA) | - (other == GR_COMBINE_OTHER_TEXTURE); - gc->state.ac_requires_it_alpha = (local == GR_COMBINE_LOCAL_ITERATED) | - (other == GR_COMBINE_OTHER_ITERATED); - - /* setup scale factor bits */ - fbzColorPath |= factor << SST_CCA_MSELECT_SHIFT; - - /* setup local color bits */ - fbzColorPath |= local << SST_ALOCALSELECT_SHIFT; - - /* setup other color bits */ - fbzColorPath |= other << SST_ASELECT_SHIFT; - - - /* setup invert output bits */ - if (invert) - fbzColorPath |= SST_CCA_INVERT_OUTPUT; - - /* setup core color combine unit bits */ - switch (function) { - case GR_COMBINE_FUNCTION_ZERO: - fbzColorPath |= SST_CCA_ZERO_OTHER; - break; - - case GR_COMBINE_FUNCTION_LOCAL: - case GR_COMBINE_FUNCTION_LOCAL_ALPHA: - fbzColorPath |= SST_CCA_ZERO_OTHER | SST_CCA_ADD_ALOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER: - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL: - case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA: - fbzColorPath |= SST_CCA_ADD_ALOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL: - fbzColorPath |= SST_CCA_SUB_CLOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL: - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL_ALPHA: - fbzColorPath |= SST_CCA_SUB_CLOCAL | SST_CCA_ADD_ALOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL: - case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA: - fbzColorPath |= SST_CCA_ZERO_OTHER | SST_CCA_SUB_CLOCAL | SST_CCA_ADD_ALOCAL; - break; - } - - /* if either color or alpha combine requires texture then enable it */ - if (gc->state.cc_requires_texture || gc->state.ac_requires_texture) - fbzColorPath |= SST_ENTEXTUREMAP; - - gc->state.fbi_config.fbzColorPath = fbzColorPath; - -#if !GLIDE3 - { - const FxBool texTransP = (oldTextureEnabled != (fbzColorPath & SST_ENTEXTUREMAP)); - - GR_SET_EXPECTED_SIZE(sizeof(FxU32) + (texTransP ? sizeof(FxU32) : 0), - 1 + texTransP); - - /* transition into/out of texturing ... add nopCMD */ - if (texTransP) GR_SET(BROADCAST_ID, hw, nopCMD, 0); - - GR_SET(BROADCAST_ID, hw, fbzColorPath, fbzColorPath); - gc->state.fbi_config.fbzColorPath = fbzColorPath; - - GR_CHECK_SIZE(); - } - - /* setup paramIndex bits */ - _grUpdateParamIndex(); -#endif /* !GLIDE3 */ -#undef FN_NAME -} /* grAlphaCombine */ - -/*--------------------------------------------------------------------------- -** grAlphaControlsITRGBLighting -** -** Determines whether the LSB of alpha controls what lighting is used-- -** Specifically whether grConstantColorValu or the interated RGB values are used -** during TEXTURE_TIMES_itrgb & TEXTURE_TIMES_ITRGB_DELTA0 color combine modes. -** -*/ - -GR_STATE_ENTRY(grAlphaControlsITRGBLighting, void, (FxBool enable)) -{ -#define FN_NAME "grAlphaControlsITRGBLighting" - FxU32 fbzColorPath; - GR_BEGIN_NOFIFOCHECK("grAlphaControlsITRGBLighting", 85); - GDBG_INFO_MORE(gc->myLevel, "(%d)\n", enable); - - fbzColorPath = gc->state.fbi_config.fbzColorPath; - if (enable) { - fbzColorPath |= SST_LOCALSELECT_OVERRIDE_WITH_ATEX; - } else { - fbzColorPath &= ~SST_LOCALSELECT_OVERRIDE_WITH_ATEX; - } - - gc->state.fbi_config.fbzColorPath = fbzColorPath; -#if !GLIDE3 - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, fbzColorPath, fbzColorPath); - GR_CHECK_SIZE(); -#endif /* !GLIDE3 */ -#undef FN_NAME -} /* grAlphaControlsITRGBLighting() */ - -/*--------------------------------------------------------------------------- -** grAlphaTestFunction -*/ - -GR_STATE_ENTRY(grAlphaTestFunction, void, (GrCmpFnc_t fnc)) -{ -#define FN_NAME "grAlphaTestFunction" - FxU32 alphamode; - GR_BEGIN_NOFIFOCHECK("grAlphaTestFunction", 85); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",fnc); - - alphamode = gc->state.fbi_config.alphaMode; - alphamode &= ~(SST_ALPHAFUNC | SST_ENALPHAFUNC); - if (fnc != GR_CMP_ALWAYS) - alphamode |= ((fnc << SST_ALPHAFUNC_SHIFT) | SST_ENALPHAFUNC); - - gc->state.fbi_config.alphaMode = alphamode; - -#if !GLIDE3 - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, alphaMode, alphamode); - GR_CHECK_SIZE(); -#endif /* !GLIDE3 */ -#undef FN_NAME -} /* grAlphaTestFunction */ - -/*--------------------------------------------------------------------------- -** grAlphaTestReferenceValue -*/ - -GR_STATE_ENTRY(grAlphaTestReferenceValue, void, (GrAlpha_t value)) -{ -#define FN_NAME "grAlphaTestReferenceValue" - FxU32 alphamode; - GR_BEGIN_NOFIFOCHECK("grAlphaTestReferenceValue", 85); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",value); - - alphamode = gc->state.fbi_config.alphaMode; - alphamode &= ~SST_ALPHAREF; - alphamode |= (((FxU32) value) << SST_ALPHAREF_SHIFT); - - gc->state.fbi_config.alphaMode = alphamode; - -#if !GLIDE3 - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, alphaMode, alphamode); - GR_CHECK_SIZE(); -#endif /* !GLIDE3 */ -#undef FN_NAME -} /* grAlphaTestReferenceValue */ - - -/*--------------------------------------------------------------------------- -** grBufferClear -*/ - -GR_ENTRY(grBufferClear, void, (GrColor_t color, GrAlpha_t alpha, FxU16 depth)) -{ -#define FN_NAME "grBufferClear" - GR_BEGIN_NOFIFOCHECK("grBufferClear", 86); - GDBG_INFO_MORE(gc->myLevel, "(0x%x,0x%x,0x%x)\n", color, alpha, depth); - - { - const GrColor_t - oldc1 = gc->state.fbi_config.color1; - const FxU32 - oldzacolor = gc->state.fbi_config.zaColor, - fbzMode = gc->state.fbi_config.fbzMode; - FxU32 - zacolor = oldzacolor; - FxBool - doColorP, doAuxP = FXFALSE; - - /* validate the state */ - /* Setup source registers */ - doColorP = ((fbzMode & SST_RGBWRMASK) != 0); - if (doColorP) _grSwizzleColor(&color); - - if ((fbzMode & SST_ZAWRMASK) != 0) { - if ((fbzMode & SST_ENALPHABUFFER) != 0) { - doAuxP = FXTRUE; - - zacolor &= ~SST_ZACOLOR_ALPHA; - zacolor |= (((FxU32) alpha) << SST_ZACOLOR_ALPHA_SHIFT); - } else if ((fbzMode & SST_ENDEPTHBUFFER) != 0) { - doAuxP = FXTRUE; - - zacolor &= ~SST_ZACOLOR_DEPTH; - zacolor |= (((FxU32) depth) << SST_ZACOLOR_DEPTH_SHIFT); - } - } - - /* Why were we called? */ - if (!doColorP && !doAuxP) return; - -#ifdef GLIDE_INIT_HWC - if (!gc->bInfo->sdRAM) { - REG_GROUP_BEGIN(BROADCAST_ID, zaColor, 2, 0x41); - { - REG_GROUP_SET(hw, zaColor, zacolor); - REG_GROUP_SET(hw, c1, color); - } - REG_GROUP_END(); - - REG_GROUP_BEGIN(BROADCAST_ID, fastfillCMD, 3, 0x209); - { - /* Execute the FASTFILL command */ - REG_GROUP_SET(hw, fastfillCMD, 1); - - /* Restore C1 and ZACOLOR */ - REG_GROUP_SET(hw, zaColor, oldzacolor); - REG_GROUP_SET(hw, c1, oldc1); - } - REG_GROUP_END(); - } else { - const FxU32 colorBufMode = ((fbzMode & ~(SST_ZAWRMASK | SST_ENDEPTHBUFFER)) | - SST_RGBWRMASK | - SST_ENRECTCLIP); - - /* Turn off writes to the aux buffer */ - REG_GROUP_BEGIN(BROADCAST_ID, fbzMode, 1, 1); - REG_GROUP_SET(hw, fbzMode, colorBufMode); - REG_GROUP_END(); - - if (doColorP) { - /* Clear Color Buffer */ - REG_GROUP_BEGIN(BROADCAST_ID, c1, 1, 0x1); - REG_GROUP_SET(hw, c1, color); - REG_GROUP_END(); - - /* Execute the FASTFILL command */ - REG_GROUP_BEGIN(BROADCAST_ID, fastfillCMD, 1, 1); - REG_GROUP_SET(hw, fastfillCMD, 1); - REG_GROUP_END(); - } - - if (doAuxP) { - FxU32 - red, green, blue, convertedDepth; -#define GETRED(a) ((a >> 11) & 0x1f) -#define GETGREEN(a) ((a >> 5) & 0x3f) -#define GETBLUE(a) (a & 0x1f) - - /* Convert 16-bit depth to 24-bit, ready for truncation: - 20 10 0 - 321098765432109876543210 - RRRRR000GGGGGG00BBBBB000 - - So, we get the 565 out of 16-bit depth, then operate - like this: - - RED' = red << 3 - GREEN' = green << 2 - BLUE' = blue << 3 - - This way, when the fastFill hardware truncates, we - still have all the bits we were given. - - We then simply recombin RED', BLUE', and GREEN' to make - a 24-bit color value. - - capisce? - - */ - red = GETRED(depth) << 3; - green = GETGREEN(depth) << 2; - blue = GETBLUE(depth) << 3; - - convertedDepth = ((red << 16) | (green << 8) | blue); - - /* Clear Aux Buffer */ - REG_GROUP_BEGIN(BROADCAST_ID, c1, 1, 0x1); - REG_GROUP_SET(hw, c1, convertedDepth); - REG_GROUP_END(); - - REG_GROUP_BEGIN(BROADCAST_ID, colBufferAddr, 1, 1); - REG_GROUP_SET(hw, colBufferAddr,gc->buffers[gc->grColBuf]); - REG_GROUP_END(); - - REG_GROUP_BEGIN(BROADCAST_ID, fbzMode, 2, 0x21); - { - /* Write the depth buffer as if it were a color buffer, - * but w/ actual color buffer features - * (dithering/chroma/stipple) cleared so that the - * converted depth value does not get dorked along the - * way down the eerie pathways of banshee. - */ - REG_GROUP_SET(hw, fbzMode, colorBufMode & ~(SST_ENCHROMAKEY | - SST_ENSTIPPLE | - SST_ENDITHER)); - - /* Execute the FASTFILL command */ - REG_GROUP_SET(hw, fastfillCMD, 1); - } - REG_GROUP_END(); - } - - /* Restore trashed things */ - REG_GROUP_BEGIN(BROADCAST_ID, c1, 1, 0x1); - REG_GROUP_SET(hw, c1, oldc1); - REG_GROUP_END(); - - REG_GROUP_BEGIN(BROADCAST_ID, colBufferAddr, 1, 0x1); - REG_GROUP_SET(hw, colBufferAddr,gc->buffers[gc->curBuffer]); - REG_GROUP_END(); - - REG_GROUP_BEGIN(BROADCAST_ID, fbzMode, 1, 1); - REG_GROUP_SET(hw, fbzMode, fbzMode); - REG_GROUP_END(); - } -#else /* !GLIDE_INIT_HWC */ - REG_GROUP_BEGIN(BROADCAST_ID, zaColor, 2, 0x41); - { - REG_GROUP_SET(hw, zaColor, zacolor); - REG_GROUP_SET(hw, c1, color); - } - REG_GROUP_END(); - - REG_GROUP_BEGIN(BROADCAST_ID, fastfillCMD, 3, 0x209); - { - /* Execute the FASTFILL command */ - REG_GROUP_SET(hw, fastfillCMD, 1); - - /* Restore C1 and ZACOLOR */ - REG_GROUP_SET(hw, zaColor, oldzacolor); - REG_GROUP_SET(hw, c1, oldc1); - } - REG_GROUP_END(); -#endif /* !GLIDE_INIT_HWC */ - } -#undef FN_NAME -} /* grBufferClear */ - - -/*--------------------------------------------------------------------------- -** grBufferSwap -** -** NOTE: This routine should be COMPLETELY device-independant, -** but it isn't right now because we need to move all the -** code for the splash screen into the init library. -*/ - -GR_ENTRY(grBufferSwap, void, (int swapInterval)) -{ -#define FN_NAME "grBufferSwap" - GR_BEGIN_NOFIFOCHECK(FN_NAME,86); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",swapInterval); - - /* optionally display the 3Dfx powerfield logo overlay */ - if (_GlideRoot.environment.shamelessPlug) _grShamelessPlug(); - - /* check for environmental override */ - if (_GlideRoot.environment.swapInterval >= 0) { - swapInterval = _GlideRoot.environment.swapInterval; - } - - if (swapInterval) { - if (swapInterval > 1) - swapInterval = ((swapInterval - 1) << 1) | 1; /* Format for hw */ - } - - while(grBufferNumPending() > 3); - - /* Cycle the buffer indices */ - { - const FxU32 numBufs = gc->grColBuf; - FxU32* bufPtrs[3]; - FxU32 i; - - bufPtrs[0] = &gc->curBuffer; - bufPtrs[1] = &gc->frontBuffer; - bufPtrs[2] = &gc->backBuffer; - - for(i = 0; i < sizeof(bufPtrs) / sizeof(*bufPtrs); i++) { - FxU32 curBufIndex = *bufPtrs[i] + 1; - if (curBufIndex == numBufs) curBufIndex = 0; - *bufPtrs[i] = curBufIndex; - } - } - -#if USE_PACKET_FIFO - { - int i, j = -1; - - for ( i = 0; i < MAX_BUFF_PENDING && j == -1; i++) { - if (gc->bufferSwaps[i] == 0xffffffff) { - gc->bufferSwaps[i] = - (FxU32) gc->cmdTransportInfo.fifoPtr - - (FxU32) gc->cmdTransportInfo.fifoStart; - j = i; - } - } - GR_ASSERT(j != -1); - - gc->swapsPending++; - - } -#endif - - /* Overlay Hack: */ - if (!gc->desktopOverlay) - { - REG_GROUP_BEGIN(BROADCAST_ID, leftOverlayBuf, 1, 0x1); - REG_GROUP_SET(hw, leftOverlayBuf, gc->buffers[gc->frontBuffer]); - REG_GROUP_END(); - - /* Just 0x1 for mask is OK here since we're writing one register */ - REG_GROUP_BEGIN(BROADCAST_ID, swapbufferCMD, 1, 0x1); - REG_GROUP_SET(hw, swapbufferCMD, swapInterval); - REG_GROUP_END(); - } - else - { - /* buffer swap code, needs to idle since I can't - * switch the vidDesktopStartAddr to the backbuffer using the FIFO */ - /* Just 0x1 for mask is OK here since we're writing one register */ - REG_GROUP_BEGIN(BROADCAST_ID, swapbufferCMD, 1, 0x1); - REG_GROUP_SET(hw, swapbufferCMD, swapInterval); - REG_GROUP_END(); - - /* Wait for the swapBufferCMD to go through before switching the overlay */ - while (grBufferNumPending() >= 1); - GR_SET_IO (BROADCAST_ID, hw, vidDesktopStartAddr, - gc->buffers[gc->frontBuffer]); - } - - -#if defined( TACO_MEMORY_FIFO_HACK ) - _FifoFlush(); -#endif - - REG_GROUP_BEGIN(BROADCAST_ID, colBufferAddr, 1, 0x1); - REG_GROUP_SET(hw, colBufferAddr, gc->buffers[gc->curBuffer]); - REG_GROUP_END(); - -#ifdef GLIDE_DEBUG - { - if ((FxI32)_GlideRoot.environment.snapshot > 0) { - static char saveDBG[GDBG_MAX_LEVELS]; - int i; - - /* turn off tracing after frame 0 and the snapshot frame */ - if ((_GlideRoot.stats.bufferSwaps == 0) || - (_GlideRoot.stats.bufferSwaps == _GlideRoot.environment.snapshot + 3)) { - GDBG_PRINTF(FN_NAME": FX_SNAPSHOT (%ld)\n", _GlideRoot.stats.bufferSwaps); - - for (i = 1; i < GDBG_MAX_LEVELS; i++) { - if (_GlideRoot.stats.bufferSwaps == 0) saveDBG[i] = (char)GDBG_GET_DEBUGLEVEL(i); - GDBG_SET_DEBUGLEVEL(i, 0); - } - } - /* turn on tracing after the snapshot frame */ - if (_GlideRoot.stats.bufferSwaps == _GlideRoot.environment.snapshot) { - GDBG_PRINTF(FN_NAME": FX_SNAPSHOT (%ld)\n", _GlideRoot.stats.bufferSwaps); - - for (i = 1; i < GDBG_MAX_LEVELS; i++) { - GDBG_SET_DEBUGLEVEL(i, saveDBG[i]); - } - } - } - } -#endif /* GLIDE_DEBUG */ - - _GlideRoot.stats.bufferSwaps++; - - GR_END(); -#undef FN_NAME -} /* grBufferSwap */ - -/*--------------------------------------------------------------------------- -** grBufferNumPending -*/ - -GR_ENTRY(grBufferNumPending, int, (void)) -{ -#if USE_PACKET_FIFO - volatile FxU32 - dummy, - depth0, depth1, - readPtr0, readPtr1, readPtr; - volatile int - i; - int - pend; /* Num Swaps pending */ - GR_DCL_GC; - - /* If we're not using hole counting then we need to make sure that - * any queued commands are actually flushed before checking the fifo - * ptr's location. - */ - if (!gc->cmdTransportInfo.autoBump) - GR_BUMP_N_GRIND; - - /* HACK HACK HACK */ - do { - readPtr0 = GET(gc->cRegs->cmdFifo0.readPtrL) - gc->cmdTransportInfo.fifoOffset; - dummy = GET(gc->ioRegs->status); - readPtr1 = GET(gc->cRegs->cmdFifo0.readPtrL) - gc->cmdTransportInfo.fifoOffset; - } while (readPtr0 != readPtr1); - - readPtr = readPtr1; - - if (readPtr == gc->lastSwapCheck) { - do { - depth0 = GET(gc->cRegs->cmdFifo0.depth); - depth1 = GET(gc->cRegs->cmdFifo0.depth); - } while (readPtr0 != readPtr1); - - if (depth0 == 0) { - for (i = 0; i < MAX_BUFF_PENDING; i++) - gc->bufferSwaps[i] = 0xffffffff; - gc->swapsPending = 0; - goto NPDONE; - } - } - - /* - ** There are two cases here: One where the read pointer has wrapped around - ** behind us, and one where it's ahead of us. - */ - if (readPtr < gc->lastSwapCheck) { /* We've wrapped */ - for (i = 0; i < MAX_BUFF_PENDING; i++) { - /* If it's between the last check and the end of the FIFO or between the - beginning of the FIFO and the current Read pointer, then it's gone - */ - if ( (gc->bufferSwaps[i] != 0xffffffff) && ( - (gc->bufferSwaps[i] >= gc->lastSwapCheck) || - (gc->bufferSwaps[i] <= readPtr)) ) { - --gc->swapsPending; - gc->bufferSwaps[i] = 0xffffffff; /* Free swap slot */ - } - } - } else { /* It's behind us */ - for (i = 0; i < MAX_BUFF_PENDING; i++) { - if ((gc->bufferSwaps[i] != 0xffffffff) && ( - (gc->bufferSwaps[i] >= gc->lastSwapCheck) && (gc->bufferSwaps[i] <= - readPtr))) { - --gc->swapsPending; - gc->bufferSwaps[i] = 0xffffffff; /* Free swap slot */ - } - } - } - - gc->lastSwapCheck = readPtr; - -NPDONE: - pend = gc->swapsPending; - GDBG_INFO(86,"grBufferNumPending() = %d\n", pend); - - return pend; -#else - return 0; -#endif -} /* grBufferNumPending */ - -/*--------------------------------------------------------------------------- -** grChromakeyMode -*/ - -GR_STATE_ENTRY(grChromakeyMode, void, (GrChromakeyMode_t mode)) -{ -#define FN_NAME "grChromakeyMode" - FxU32 fbzMode; - GR_BEGIN_NOFIFOCHECK("grChromakeyMode", 85); - GDBG_INFO_MORE(gc->myLevel, "(%d)\n", mode); - - fbzMode = gc->state.fbi_config.fbzMode; - if (mode == GR_CHROMAKEY_ENABLE) - fbzMode |= SST_ENCHROMAKEY; - else - fbzMode &= ~SST_ENCHROMAKEY; - - gc->state.fbi_config.fbzMode = fbzMode; - -#if !GLIDE3 - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, fbzMode, fbzMode); - GR_CHECK_SIZE(); -#endif /* !GLIDE3 */ -#undef FN_NAME -} /* grChromaKeyMode */ - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -/*--------------------------------------------------------------------------- -** grChromaRange -*/ - -GR_STATE_ENTRY(grChromaRange, void, (GrColor_t min, GrColor_t max, GrChromaRangeMode_t mode)) -{ - GR_BEGIN_NOFIFOCHECK("grChromakeyValue", 85); - GDBG_INFO_MORE(gc->myLevel, "(0x%x)\n", min); - GDBG_INFO_MORE(gc->myLevel, "(0x%x)\n", max); - - _grSwizzleColor(&min); - _grSwizzleColor(&max); - max = max & 0x00ffffff; - max |= SST_ENCHROMARANGE; - gc->state.fbi_config.chromaKey = min; - gc->state.fbi_config.chromaRange = max | mode | FXBIT(28); - -} /* grChromaRange */ -#else -/*--------------------------------------------------------------------------- -** grChromakeyValue -*/ - -GR_STATE_ENTRY(grChromakeyValue, void, (GrColor_t color)) -{ -#define FN_NAME "grChromakeyValue" - GR_BEGIN_NOFIFOCHECK("grChromakeyValue", 85); - GDBG_INFO_MORE(gc->myLevel, "(0x%x)\n", color); - - _grSwizzleColor(&color); - - gc->state.fbi_config.chromaKey = color; - -#if !GLIDE3 - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, chromaKey, color); - GR_CHECK_SIZE(); -#endif /* !GLIDE3 */ -#undef FN_NAME -} /* grChromaKeyValue */ -#endif - -/*--------------------------------------------------------------------------- -** _grClipNormalizeAndGenerateRegValues -** -** This routine normalizes clip variables to screen_width and -** screen_height, then generates the values to be written to the -** registers clipLeftRight and clipBottomTop. The reason for its -** existence is that BOTH grClipWindow() and grSstControl() need to -** write these registers. -*/ -void -_grClipNormalizeAndGenerateRegValues(FxU32 minx, FxU32 miny, FxU32 maxx, - FxU32 maxy, FxU32 *clipLeftRight, - FxU32 *clipBottomTop) -{ -#define FN_NAME "_grClipNormalizeAndGenerateRegValues" - GR_DCL_GC; - - GDBG_INFO(85, "%s: minx = %d, maxx = %d, miny = %d, maxy = %d\n", - FN_NAME, minx, maxx, miny, maxy); - - GR_CHECK_COMPATABILITY(FN_NAME, - ((maxx > gc->state.screen_width) || (maxy > gc->state.screen_height)), - "Max clip coordinate > screen size"); - GR_CHECK_COMPATABILITY(FN_NAME, - ((minx > LONG_MAX) || (miny > LONG_MAX)), - "Negative min clip coordinate"); - - /* don't allow bogus clip coords!!! */ - if (maxx > gc->state.screen_width) maxx = gc->state.screen_width; - if (maxy > gc->state.screen_height) maxy = gc->state.screen_height; - if (minx > maxx) minx = maxx; - if (miny > maxy) miny = maxy; - - GDBG_INFO(85, "%s: normalized minx = %d, maxx = %d, miny = %d, maxy = %d\n", - FN_NAME, minx, maxx, miny, maxy); - - *clipLeftRight = (minx << SST_CLIPLEFT_SHIFT) | (maxx << SST_CLIPRIGHT_SHIFT); - *clipBottomTop = (miny << SST_CLIPBOTTOM_SHIFT) | (maxy << SST_CLIPTOP_SHIFT); - - GDBG_INFO(85, "%s: clipLeftRight = 0x%x, clipBottomTop = 0x%x\n", - FN_NAME, clipLeftRight, clipBottomTop); - -#undef FN_NAME -} /* _grClipNormalizeAndGenerateRegValues */ - -/*--------------------------------------------------------------------------- -** grClipWindow -*/ -GR_STATE_ENTRY(grClipWindow, void, (FxU32 minx, FxU32 miny, - FxU32 maxx, FxU32 maxy)) -{ -#define FN_NAME "grClipWindow" - FxU32 - clipLeftRight, /* SST Clipping Registers */ - clipBottomTop; - - GR_BEGIN_NOFIFOCHECK("grClipWindow",83); - GDBG_INFO_MORE(gc->myLevel,"(%d,%d %d,%d)\n",minx,miny,maxx,maxy); - - _grClipNormalizeAndGenerateRegValues(minx, miny, maxx, maxy, - &clipLeftRight, &clipBottomTop); - -#if !GLIDE3 - REG_GROUP_BEGIN(BROADCAST_ID, clipLeftRight, 2, 0x03); - { - REG_GROUP_SET(hw, clipLeftRight, clipLeftRight); - REG_GROUP_SET(hw, clipBottomTop, clipBottomTop); - } - REG_GROUP_END(); -#endif /* !GLIDE3 */ - - gc->state.fbi_config.clipLeftRight = clipLeftRight; - gc->state.fbi_config.clipBottomTop = clipBottomTop; - - gc->state.clipwindowf_xmin = (float) minx; - gc->state.clipwindowf_xmax = (float) maxx; - gc->state.clipwindowf_ymin = (float) miny; - gc->state.clipwindowf_ymax = (float) maxy; - - GR_END(); -#undef FN_NAME -} /* grClipWindow */ - -/*--------------------------------------------------------------------------- -** grColorCombine -*/ - -GR_STATE_ENTRY(grColorCombine, void, - (GrCombineFunction_t function, GrCombineFactor_t factor, - GrCombineLocal_t local, GrCombineOther_t other, FxBool invert)) -{ -#define FN_NAME "grColorCombine" - FxU32 fbzColorPath; - FxU32 oldTextureEnabled; - - GR_BEGIN_NOFIFOCHECK("grColorCombine",85); - GDBG_INFO_MORE(gc->myLevel,"(%d,%d,%d,%d,%d)\n",function,factor,local,other,invert); - - GR_CHECK_W(myName, - function < GR_COMBINE_FUNCTION_ZERO || - function > GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA , - "unsupported color combine function"); - - /* Starting w/ Voodoo^2 the ccu has texture RGB mode as well. */ - GR_CHECK_W(myName, - (factor & 0x7) < GR_COMBINE_FACTOR_ZERO || - (factor & 0x7) > GR_COMBINE_FACTOR_TEXTURE_RGB || - factor > GR_COMBINE_FACTOR_ONE_MINUS_TEXTURE_ALPHA, - "unsupported color combine scale factor"); - GR_CHECK_W(myName, - local < GR_COMBINE_LOCAL_ITERATED || local > GR_COMBINE_LOCAL_DEPTH, - "unsupported color combine local color"); - GR_CHECK_W(myName, - other < GR_COMBINE_OTHER_ITERATED || other > GR_COMBINE_OTHER_CONSTANT, - "unsupported color combine other color"); - - fbzColorPath = gc->state.fbi_config.fbzColorPath; - oldTextureEnabled = fbzColorPath & SST_ENTEXTUREMAP; - fbzColorPath &= ~(SST_ENTEXTUREMAP | - 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); - - /* this is bogus, it should be done once, somewhere. */ - fbzColorPath |= SST_PARMADJUST; - - /* setup reverse blending first, then strip off the the high bit */ - if ((factor & 0x8) == 0) - fbzColorPath |= SST_CC_REVERSE_BLEND; - factor &= 0x7; - - /* NOTE: we use boolean OR instead of logical to avoid branches */ - gc->state.cc_requires_texture = ((factor == GR_COMBINE_FACTOR_TEXTURE_ALPHA) | - (other == GR_COMBINE_OTHER_TEXTURE)); - gc->state.cc_requires_it_rgb = ((local == GR_COMBINE_LOCAL_ITERATED) | - (other == GR_COMBINE_OTHER_ITERATED)); - - /* setup scale factor bits */ - fbzColorPath |= factor << SST_CC_MSELECT_SHIFT; - - /* setup local color bits */ - fbzColorPath |= local << SST_LOCALSELECT_SHIFT; - - /* setup other color bits */ - fbzColorPath |= other << SST_RGBSELECT_SHIFT; - - /* setup invert output bits */ - if (invert) - fbzColorPath |= SST_CC_INVERT_OUTPUT; - - /* setup core color combine unit bits */ - switch (function) { - case GR_COMBINE_FUNCTION_ZERO: - fbzColorPath |= SST_CC_ZERO_OTHER; - break; - - case GR_COMBINE_FUNCTION_LOCAL: - fbzColorPath |= SST_CC_ZERO_OTHER | SST_CC_ADD_CLOCAL; - break; - - case GR_COMBINE_FUNCTION_LOCAL_ALPHA: - fbzColorPath |= SST_CC_ZERO_OTHER | SST_CC_ADD_ALOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER: - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL: - fbzColorPath |= SST_CC_ADD_CLOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA: - fbzColorPath |= SST_CC_ADD_ALOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL: - fbzColorPath |= SST_CC_SUB_CLOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL: - fbzColorPath |= SST_CC_SUB_CLOCAL | SST_CC_ADD_CLOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL_ALPHA: - fbzColorPath |= SST_CC_SUB_CLOCAL | SST_CC_ADD_ALOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL: - fbzColorPath |= SST_CC_ZERO_OTHER | SST_CC_SUB_CLOCAL | SST_CC_ADD_CLOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA: - fbzColorPath |= SST_CC_ZERO_OTHER | SST_CC_SUB_CLOCAL | SST_CC_ADD_ALOCAL; - break; - } - - /* if either color or alpha combine requires texture then enable it */ - if (gc->state.cc_requires_texture || gc->state.ac_requires_texture) - fbzColorPath |= SST_ENTEXTUREMAP; - - gc->state.fbi_config.fbzColorPath = fbzColorPath; - -#if !GLIDE3 - { - const FxBool texTransP = (oldTextureEnabled != (fbzColorPath & SST_ENTEXTUREMAP)); - - GR_SET_EXPECTED_SIZE(sizeof(FxU32) + (texTransP ? sizeof(FxU32) : 0), - 1 + texTransP); - - /* transition into/out of texturing ... add nopCMD */ - if (texTransP) GR_SET(BROADCAST_ID, hw, nopCMD, 0); - - GR_SET(BROADCAST_ID, hw, fbzColorPath, fbzColorPath); - GR_CHECK_SIZE(); - } - - /* setup paramIndex bits */ - _grUpdateParamIndex(); -#endif /* !GLIDE3 */ - - GR_END(); -#undef FN_NAME -} /* grColorCombine */ - -/*--------------------------------------------------------------------------- -** grColorMask -*/ - -GR_STATE_ENTRY(grColorMask, void, (FxBool rgb, FxBool alpha)) -{ -#define FN_NAME "grColorMask" - FxU32 fbzMode; - GR_BEGIN_NOFIFOCHECK("grColorMask", 85); - GDBG_INFO_MORE(gc->myLevel, "(0x%x,0x%x)\n", rgb, alpha); - - fbzMode = gc->state.fbi_config.fbzMode; - GR_CHECK_W(myName, - (fbzMode & SST_ENDEPTHBUFFER) && alpha, - "alpha writes enabled even though depth buffering"); - - /* This is fatal because they could stomp on the cmd fifo. */ - GR_CHECK_COMPATABILITY(FN_NAME, - (alpha && (gc->grAuxBuf == 0)), - "cannot enable alpha buffering w/o allocating one"); - - if (rgb) - fbzMode |= SST_RGBWRMASK; - else - fbzMode &= ~SST_RGBWRMASK; - - /* GMT: BUG leave SST_ENALPHABUFFER on if dest. alpha being used */ - /* Don't do anything if depth buffering on */ - if (!(fbzMode & SST_ENDEPTHBUFFER) && (gc->state.num_buffers != 3)) { - if (alpha) - fbzMode |= SST_ENALPHABUFFER | SST_ZAWRMASK; - else - fbzMode &= ~(SST_ENALPHABUFFER | SST_ZAWRMASK); - } - - gc->state.fbi_config.fbzMode = fbzMode; - -#if !GLIDE3 - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, fbzMode, fbzMode); - GR_CHECK_SIZE(); -#endif /* !GLIDE3 */ -#undef FN_NAME -} /* grColorMask */ - -/*--------------------------------------------------------------------------- -** grConstantColorValue -*/ - -GR_STATE_ENTRY(grConstantColorValue, void, (GrColor_t color)) -{ -#define FN_NAME "grConstantColorValue" - GR_BEGIN_NOFIFOCHECK("grConstantColorValue",85); - GDBG_INFO_MORE(gc->myLevel,"(0x%x)\n",color); - - _grSwizzleColor(&color); - -#if !GLIDE3 - REG_GROUP_BEGIN(BROADCAST_ID, c0, 2, 0x03); - { - REG_GROUP_SET(hw, c0, color); - REG_GROUP_SET(hw, c1, color); - } - REG_GROUP_END(); -#endif /* !GLIDE3 */ - - gc->state.fbi_config.color0 = color; - gc->state.fbi_config.color1 = color; - - GR_END(); -#undef FN_NAME -} /* grConstanColorValue */ - -/*--------------------------------------------------------------------------- -** grConstantColorValue4 -** GMT: obsolete routine -** GMT: send values to hardware immediately -*/ - -GR_ENTRY(grConstantColorValue4, void, (float a, float r, float g, float b)) -{ -#define FN_NAME "grConstantColorValue4" - GR_BEGIN_NOFIFOCHECK("grConstantColorValue4",85); - GDBG_INFO_MORE(gc->myLevel,"(%d,%d,%d,%d)\n",a,r,g,b); - gc->state.a = a; - gc->state.r = r; - gc->state.g = g; - gc->state.b = b; - - if (gc->state.cc_delta0mode) { - REG_GROUP_BEGIN(BROADCAST_ID, Fr, 3, 0x07); - { - REG_GROUP_SETF(hw, Fr, r); - REG_GROUP_SETF(hw, Fg, g); - REG_GROUP_SETF(hw, Fb, b); - } - REG_GROUP_END(); - } - - GR_END(); -#undef FN_NAME -} /* grConstantColorValue4 */ - -/*--------------------------------------------------------------------------- -** grCullMode -** -** GMT: warning - gaa.c has the guts of this in-line -*/ - -GR_ENTRY(grCullMode, void, (GrCullMode_t mode)) -{ -#define FN_NAME "grCullMode" - GR_BEGIN_NOFIFOCHECK("grCullMode",85); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",mode); - gc->state.cull_mode = mode; - -#if GLIDE_HW_TRI_SETUP - _grUpdateTriPacketHdr(gc->cmdTransportInfo.paramMask, mode); -#endif /* GLIDE_HW_TRI_SETUP */ - - GR_END(); -#undef FN_NAME -} /* grCullMode */ - -/*--------------------------------------------------------------------------- -** grDepthBiasLevel -** -** Sets the depth bias level. -*/ - -GR_STATE_ENTRY(grDepthBiasLevel, void, (FxI16 level)) -{ -#define FN_NAME "grDepthBiasLevel" - FxU32 zacolor; - GR_BEGIN_NOFIFOCHECK("grDepthBiasLevel", 85); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",level); - - zacolor = gc->state.fbi_config.zaColor; - zacolor = (zacolor & ~SST_ZACOLOR_DEPTH) | (level & SST_ZACOLOR_DEPTH); - - gc->state.fbi_config.zaColor = zacolor; - -#if !GLIDE3 - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, zaColor, zacolor); - GR_CHECK_SIZE(); -#endif /* !GLIDE3 */ -#undef FN_NAME -} /* grDepthBiasLevel */ - -/*--------------------------------------------------------------------------- -** grDepthBufferFunction -*/ - -GR_STATE_ENTRY(grDepthBufferFunction, void, (GrCmpFnc_t fnc)) -{ -#define FN_NAME "grDepthBufferFunction" - FxU32 fbzMode; - - GR_BEGIN_NOFIFOCHECK("grDepthBufferFunction",85); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",fnc); - - fbzMode = gc->state.fbi_config.fbzMode; - fbzMode &= ~SST_ZFUNC; - fbzMode |= (fnc << SST_ZFUNC_SHIFT); - - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, fbzMode, fbzMode); - GR_CHECK_SIZE(); - - gc->state.fbi_config.fbzMode = fbzMode; - GR_END(); -#undef FN_NAME -} /* grDepthBufferFunction */ - -/*--------------------------------------------------------------------------- -** grDepthBufferMode -*/ - -GR_STATE_ENTRY(grDepthBufferMode, void, (GrDepthBufferMode_t mode)) -{ -#define FN_NAME "grDepthBufferMode" - FxU32 fbzMode; - GR_BEGIN_NOFIFOCHECK("grDepthBufferMode", 85); - GDBG_INFO_MORE(gc->myLevel, "(%d)\n", mode); - - /* This is fatal because they could stomp on the cmd fifo. */ - GR_CHECK_COMPATABILITY(FN_NAME, - (mode != GR_DEPTHBUFFER_DISABLE) && (gc->grAuxBuf == 0), - "cannot enable depth buffer w/o allocating one"); - - /* turn off all the bits and then turn them back on selectively */ - fbzMode = gc->state.fbi_config.fbzMode; - fbzMode &= ~(SST_ENDEPTHBUFFER | - SST_WBUFFER | - SST_ENZBIAS | - SST_ZCOMPARE_TO_ZACOLOR); - - switch (mode) { - case GR_DEPTHBUFFER_DISABLE: - break; - - case GR_DEPTHBUFFER_ZBUFFER: - fbzMode |= SST_ENDEPTHBUFFER | SST_ENZBIAS; - break; - - case GR_DEPTHBUFFER_WBUFFER: - fbzMode |= SST_ENDEPTHBUFFER | SST_WBUFFER | SST_ENZBIAS; - break; - - case GR_DEPTHBUFFER_ZBUFFER_COMPARE_TO_BIAS: - fbzMode |= SST_ENDEPTHBUFFER | SST_ZCOMPARE_TO_ZACOLOR; - break; - - case GR_DEPTHBUFFER_WBUFFER_COMPARE_TO_BIAS: - fbzMode |= SST_ENDEPTHBUFFER | SST_WBUFFER | SST_ZCOMPARE_TO_ZACOLOR; - break; - } - - /* - ** Update hardware and Glide state - */ - gc->state.fbi_config.fbzMode = fbzMode; - -#if !GLIDE3 - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, fbzMode, fbzMode); - GR_CHECK_SIZE(); - - _grUpdateParamIndex(); -#endif /* !GLIDE3 */ -#undef FN_NAME -} /* grDepthBufferMode */ - -/*--------------------------------------------------------------------------- -** No Comment -*/ -#ifdef GLIDE_DEBUG -static FxBool -_grCanSupportDepthBuffer(void) -{ - GR_DCL_GC; - if (gc->state.screen_height == 640) { - if (gc->fbuf_size == 1) { - return FXFALSE; - } - } else if (gc->state.screen_width == 800) { - if ((gc->fbuf_size == 1) || - (gc->fbuf_size == 2)) { - return FXFALSE; - } - } - return FXTRUE; -} /* _grCanSupportDepthBuffer */ -#endif - -/*--------------------------------------------------------------------------- -** grDepthMask -*/ -GR_STATE_ENTRY(grDepthMask, void, (FxBool enable)) -{ -#define FN_NAME "grDepthMask" - FxU32 fbzMode; - GR_BEGIN_NOFIFOCHECK("grDepthMask", 85); - GDBG_INFO_MORE(gc->myLevel, "(%d)\n", enable); - - fbzMode = gc->state.fbi_config.fbzMode; - GR_CHECK_F(myName, - enable && !_grCanSupportDepthBuffer(), - "called in a non-depthbufferable configuration"); - - if (enable) - fbzMode |= SST_ZAWRMASK; - else - fbzMode &= ~SST_ZAWRMASK; - - gc->state.fbi_config.fbzMode = fbzMode; - -#if !GLIDE3 - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, fbzMode, fbzMode); - GR_CHECK_SIZE(); -#endif /* !GLIDE3 */ -#undef FN_NAME -} /* grDepthMask */ - -/*--------------------------------------------------------------------------- -** grDisableAllEffects -*/ - -GR_ENTRY(grDisableAllEffects, void, (void)) -{ - GDBG_INFO(87,"grDisableAllEffects()\n"); - grAlphaBlendFunction(GR_BLEND_ONE, GR_BLEND_ZERO, GR_BLEND_ONE, GR_BLEND_ZERO); - grAlphaTestFunction(GR_CMP_ALWAYS); - grChromakeyMode(GR_CHROMAKEY_DISABLE); - grDepthBiasLevel(0); - grDepthBufferMode(GR_DEPTHBUFFER_DISABLE); - grFogMode(GR_FOG_DISABLE); -} /* grDisableAllEffects */ - -/*--------------------------------------------------------------------------- -** grDitherMode -*/ - -GR_STATE_ENTRY(grDitherMode, void, (GrDitherMode_t mode)) -{ -#define FN_NAME "grDitherMode" - FxU32 fbzMode; - GR_BEGIN_NOFIFOCHECK("grDitherMode", 85); - GDBG_INFO_MORE(gc->myLevel, "(%d)\n", mode); - - fbzMode = gc->state.fbi_config.fbzMode; - if (_GlideRoot.environment.disableDitherSub == FXTRUE) - fbzMode &= ~(SST_ENDITHER | SST_DITHER2x2); - else - fbzMode &= ~(SST_ENDITHER | SST_DITHER2x2 | SST_ENDITHERSUBTRACT); - - switch (mode) { - case GR_DITHER_DISABLE: - break; - - case GR_DITHER_2x2: - fbzMode |= (SST_ENDITHER | SST_DITHER2x2); - break; - - case GR_DITHER_4x4: - fbzMode |= (SST_ENDITHER | SST_ENDITHERSUBTRACT); - break; - } - - gc->state.fbi_config.fbzMode = fbzMode; - -#if !GLIDE3 - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, fbzMode, fbzMode); - GR_CHECK_SIZE(); -#endif /* !GLIDE3 */ -#undef FN_NAME -} /* grDitherMode */ - -/*--------------------------------------------------------------------------- -** grFogMode -*/ - -GR_STATE_ENTRY(grFogMode, void, (GrFogMode_t mode)) -{ -#define FN_NAME "grFogMode" - FxU32 fogmode; - GR_BEGIN_NOFIFOCHECK("grFogMode", 85); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",mode); - - fogmode = gc->state.fbi_config.fogMode; - fogmode &= ~(SST_ENFOGGING | - SST_FOGADD | - SST_FOGMULT | - SST_FOG_ALPHA | - SST_FOG_Z | - SST_FOG_CONSTANT); - - switch (mode & 0xFF) { /* switch based on lower 8 bits */ - case GR_FOG_DISABLE: - break; - - case GR_FOG_WITH_ITERATED_ALPHA: - fogmode |= (SST_ENFOGGING | SST_FOG_ALPHA); - break; - - case GR_FOG_WITH_ITERATED_Z: /* Bug 735 */ - fogmode |= (SST_ENFOGGING | SST_FOG_Z); - break; - - case GR_FOG_WITH_TABLE: - fogmode |= (SST_ENFOGGING); - break; - } - if (mode & GR_FOG_MULT2) fogmode |= SST_FOGMULT; - if (mode & GR_FOG_ADD2) fogmode |= SST_FOGADD; - - /* GMT says that this should be enabled for CVG. It is always safe - * to enable these even when fogging is not enabled. - */ - fogmode |= (SST_FOG_DITHER | SST_FOG_ZONES); - - /* - ** Update the hardware and Glide state - */ - gc->state.fbi_config.fogMode = fogmode; - -#if !GLIDE3 - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, fogMode, fogmode); - GR_CHECK_SIZE(); - - _grUpdateParamIndex(); -#endif /* !GLIDE3 */ -#undef FN_NAME -} /* grFogMode */ - -/*--------------------------------------------------------------------------- -** grFogColorValue -*/ - -GR_STATE_ENTRY(grFogColorValue, void, (GrColor_t color)) -{ -#define FN_NAME "grFogColorValue" - GR_BEGIN_NOFIFOCHECK("grFogColorValue", 85); - GDBG_INFO_MORE(gc->myLevel, "(0x%x)\n", color); - - _grSwizzleColor(&color); - - gc->state.fbi_config.fogColor = color; - -#if !GLIDE3 - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, fogColor, color); - GR_CHECK_SIZE(); -#endif /* !GLIDE3 */ -#undef FN_NAME -} /* grFogColorValue */ - -/* -** grFogTable -*/ - -GR_ENTRY(grFogTable, void, (const GrFog_t fogtable[])) -{ -#define FN_NAME "grFogTable" - int i = 0; - const int iend = (kInternalFogTableEntryCount >> 1); - const GrFog_t *locTable = fogtable; - - GR_BEGIN_NOFIFOCHECK("grFogTable",85); - GDBG_INFO_MORE(gc->myLevel,"(0x%x)\n",fogtable); - GR_ASSERT(fogtable != NULL); - - while(i < iend) { - REG_GROUP_LONG_BEGIN(BROADCAST_ID, fogTable[i], 32); - { - int j; - - for (j = 0; j < 32; j++) { - GrFog_t e0, e1, d0, d1; - - e0 = locTable[0]; /* lower entry */ - e1 = locTable[1]; /* upper entry */ - d0 = ((e1 - e0) << 2); /* del0 in .2 format */ - d1 = (((i + j) == (iend - 1)) /* don't access beyond end of table */ - ? e1 - : locTable[2]); - d1 = (d1 - e1) << 2; /* del1 in .2 format */ - -#ifdef GLIDE_INIT_HWC - if ((gc->bInfo->pciInfo.deviceID == 0x3) && (gc->bInfo->devRev < 3)) - REG_GROUP_SET(hw, fogTable[i + j], - ~((e1 << 24) | (d1 << 16) | (e0 << 8) | d0)); - else -#endif - REG_GROUP_SET(hw, fogTable[i + j], - ((e1 << 24) | (d1 << 16) | (e0 << 8) | d0)); - - locTable += 2; - } - } - REG_GROUP_END(); - - i += 32; - } - GR_END(); -#undef FN_NAME -} /* grFogTable */ - -/*------------------------------------------------------------------- - Function: grGlideShutdown - Date: 3/16 - Implementor(s): dow, gmt, jdt - Library: Glide - Description: - Shutdown the Glide Library. Iterate through all hardware and - call grSstWinClose(). Call InitShutdown() which unmaps all - hardware from linear memory. - Arguments: - none - Return: - none - -------------------------------------------------------------------*/ - -GR_ENTRY(grGlideShutdown, void, (void)) -{ - _GlideRoot.windowsInit = FXFALSE; - - if (!_GlideRoot.initialized) return; /* never made it thru startup */ - { /* GMT: reset the counter so we can proceed without assertions */ - GR_DCL_GC; - gc->counter = gc->expected_counter = 0; - } - { - int i; - GR_DCL_GC; - - for(i = 0; i < _GlideRoot.hwConfig.num_sst; i++) { - grSstSelect(i); - grSstWinClose(); - } - -#if GLIDE_INIT_HAL - fxHalShutdownAll(); -#else /* !GLIDE_INIT_HAL */ - /* dpc - 5 sep 1997 - FixMe! - * Move this to the new initCode world some time. - * - * initClose(); - */ - for(i = 0; i < _GlideRoot.hwConfig.num_sst; i++) { - /* HACK HACK HACK */ - } -#endif /* !GLIDE_INIT_HAL */ - - _grDisplayStats(); - gc->grSstRez = GR_RESOLUTION_NONE; - gc->grSstRefresh = GR_REFRESH_NONE; - } -} /* grGlideShutdown */ - - -/*------------------------------------------------------------------- - Function: _grFlushCommonStateRegs - Date: 14-Oct-97 - Implementor(s): dpc - Description: - Flushes all State Monster regs. If we're not doing Glide 3, - then it's still used by grGlideSetState() - Arguments: - - Return: - -------------------------------------------------------------------*/ -void -_grFlushCommonStateRegs() -{ -#define FN_NAME "_grFlushCommonStateRegs" -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) - GR_BEGIN("_grFlushCommonStateRegs", 97, 14 * sizeof(FxU32), 2); -#else - GR_BEGIN("_grFlushCommonStateRegs", 97, 13 * sizeof(FxU32), 2); -#endif - - /* NB: This logical write must be split into two writes since the - * registers are non-contiguous (not good for packet 1) and are the - * register span is larget (greater than the 14 register mask size - * for packet 4). - */ -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) - REG_GROUP_NO_CHECK_BEGIN(BROADCAST_ID, fbzColorPath, 11, 0x3C7F); -#else - REG_GROUP_NO_CHECK_BEGIN(BROADCAST_ID, fbzColorPath, 10, 0x1C7F); -#endif - { - REG_GROUP_SET(hw, fbzColorPath, gc->state.fbi_config.fbzColorPath); - REG_GROUP_SET(hw, fogMode, gc->state.fbi_config.fogMode); - REG_GROUP_SET(hw, alphaMode, gc->state.fbi_config.alphaMode); - REG_GROUP_SET(hw, fbzMode, gc->state.fbi_config.fbzMode); - - REG_GROUP_SET(hw, lfbMode, gc->state.fbi_config.lfbMode); - REG_GROUP_SET(hw, clipLeftRight, gc->state.fbi_config.clipLeftRight); - REG_GROUP_SET(hw, clipBottomTop, gc->state.fbi_config.clipBottomTop); - - REG_GROUP_SET(hw, fogColor, gc->state.fbi_config.fogColor); - REG_GROUP_SET(hw, zaColor, gc->state.fbi_config.zaColor); - REG_GROUP_SET(hw, chromaKey, gc->state.fbi_config.chromaKey); -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) - if (_GlideRoot.hwConfig.SSTs[_GlideRoot.current_sst].type == GR_SSTTYPE_Voodoo2) - REG_GROUP_SET(hw, chromaRange, gc->state.fbi_config.chromaRange); -#endif - } - REG_GROUP_NO_CHECK_END(); - - REG_GROUP_NO_CHECK_BEGIN(BROADCAST_ID, stipple, 3, 0x07); - { - REG_GROUP_SET(hw, stipple, gc->state.fbi_config.stipple); - REG_GROUP_SET(hw, c0, gc->state.fbi_config.color0); - REG_GROUP_SET(hw, c1, gc->state.fbi_config.color1); - } - REG_GROUP_NO_CHECK_END(); - - -#if GLIDE3 - gc->state.invalid = 0; -#endif /* GLIDE3 */ - - GR_END(); - -#undef FN_NAME -} /* _grFlushCommonStateRegs */ - -/*--------------------------------------------------------------------------- -** grGlideSetState -*/ -GR_ENTRY(grGlideSetState, void, (const GrState *state)) -{ -#define FN_NAME "grGlideSetState" - GR_BEGIN_NOFIFOCHECK(FN_NAME, 87); - GDBG_INFO_MORE(gc->myLevel,"(0x%x)\n",state); - - GR_ASSERT(state != NULL); - - /* if texture mapping changed then we need to issue a NOP command*/ - { - const FxBool texChangeP = (((gc->state.fbi_config.fbzColorPath ^ state->fbi_config.fbzColorPath) & - SST_ENTEXTUREMAP) != 0); - if (texChangeP) { - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, nopCMD, 0); - GR_CHECK_SIZE(); - } - } - - /* copy all the state */ - gc->state = *state; - - /* Update the hardware state from the saved state. */ - _grFlushCommonStateRegs(); - - GR_SET_EXPECTED_SIZE((7 * sizeof(FxU32)) * gc->num_tmu, gc->num_tmu); - { - int tmu; - - for (tmu = 0; tmu < gc->num_tmu; tmu++) { - SstRegs* tmuregs = SST_TMU(hw, tmu); - const FifoChipField chipField = (FifoChipField)(0x02UL << tmu); - - REG_GROUP_NO_CHECK_BEGIN(chipField, textureMode, 7, 0x7F); - { - REG_GROUP_SET(tmuregs, textureMode, gc->state.tmu_config[tmu].textureMode); - REG_GROUP_SET(tmuregs, tLOD, gc->state.tmu_config[tmu].tLOD); - REG_GROUP_SET(tmuregs, tDetail, gc->state.tmu_config[tmu].tDetail); - REG_GROUP_SET(tmuregs, texBaseAddr, gc->state.tmu_config[tmu].texBaseAddr); - - REG_GROUP_SET(tmuregs, texBaseAddr1, gc->state.tmu_config[tmu].texBaseAddr_1); - REG_GROUP_SET(tmuregs, texBaseAddr2, gc->state.tmu_config[tmu].texBaseAddr_2); - REG_GROUP_SET(tmuregs, texBaseAddr38, gc->state.tmu_config[tmu].texBaseAddr_3_8); - } - REG_GROUP_NO_CHECK_END(); - } - } - GR_CHECK_SIZE(); - - /* NOTE: since glide state includes things like hints and all cached - * variables like paramIndex we needn't recompute these, BUT: we do - * need to rebuild stuff that depends on them!!! - */ - _grUpdateParamIndex(); - - GR_END(); -#undef FN_NAME -} /* grGlideSetState */ - -/*--------------------------------------------------------------------------- -** grRenderBuffer -** -** Although SST1 supports triple buffering, it's a hack in the hardware, -** and the only drawbuffer modes supported by the fbzMode register are 0 -** (back) and 1 (front) -*/ - -GR_STATE_ENTRY(grRenderBuffer, void, (GrBuffer_t buffer)) -{ -#define FN_NAME "grRenderBuffer" - GR_BEGIN_NOFIFOCHECK("grRenderBuffer",85); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",buffer); -#ifdef CHRIS_DENIS_ANTHONY_HACK - GR_CHECK_F(myName, (buffer >= GR_BUFFER_AUXBUFFER) - && (buffer!=GR_BUFFER_DENIS_HACK_ON) - && (buffer!=GR_BUFFER_DENIS_HACK_OFF), "invalid buffer"); -#else - GR_CHECK_F(myName, buffer >= GR_BUFFER_AUXBUFFER, "invalid buffer"); -#endif - -#ifdef CHRIS_DENIS_ANTHONY_HACK - if (buffer == GR_BUFFER_DENIS_HACK_ON) { - { - FxU32 fbzMode; - - fbzMode = gc->state.fbi_config.fbzMode; - fbzMode &= ~(SST_DRAWBUFFER); - fbzMode |= SST_DRAWBUFFER_BACK; - - GR_SET_EXPECTED_SIZE(4,1); - GR_SET(BROADCAST_ID, hw, fbzMode, fbzMode); - GR_CHECK_SIZE(); - - gc->state.fbi_config.fbzMode = fbzMode; - } - - { - REG_GROUP_BEGIN(BROADCAST_ID, colBufferAddr, 4, 0xf); - REG_GROUP_SET(hw, colBufferAddr, gc->tramOffset); - REG_GROUP_SET(hw, colBufferStride, 512 ); - REG_GROUP_SET(hw, auxBufferAddr, gc->buffers[2]); - REG_GROUP_SET(hw, auxBufferStride, 512); - REG_GROUP_END(); - } - } - else if (buffer == GR_BUFFER_DENIS_HACK_OFF) { - { - FxU32 fbzMode; - - fbzMode = gc->state.fbi_config.fbzMode; - fbzMode &= ~(SST_DRAWBUFFER); - fbzMode |= SST_DRAWBUFFER_BACK; - - GR_SET_EXPECTED_SIZE(4,1); - GR_SET(BROADCAST_ID, hw, fbzMode, fbzMode); - GR_CHECK_SIZE(); - - gc->state.fbi_config.fbzMode = fbzMode; - } - - { - REG_GROUP_BEGIN(BROADCAST_ID, colBufferAddr, 4, 0xf); - REG_GROUP_SET(hw, colBufferAddr, gc->buffers[gc->curBuffer]); - REG_GROUP_SET(hw, colBufferStride, gc->strideInTiles | SST_BUFFER_MEMORY_TILED ); - REG_GROUP_SET(hw, auxBufferAddr, gc->buffers[2]); - REG_GROUP_SET(hw, auxBufferStride, gc->strideInTiles | SST_BUFFER_MEMORY_TILED); - REG_GROUP_END(); - } - } - else { -#endif - { - FxU32 fbzMode; - - fbzMode = gc->state.fbi_config.fbzMode; - fbzMode &= ~(SST_DRAWBUFFER); - fbzMode |= buffer == GR_BUFFER_FRONTBUFFER ? SST_DRAWBUFFER_FRONT : SST_DRAWBUFFER_BACK; - - GR_SET_EXPECTED_SIZE(4,1); - GR_SET(BROADCAST_ID, hw, fbzMode, fbzMode); - GR_CHECK_SIZE(); - - gc->state.fbi_config.fbzMode = fbzMode; - } - - { - const FxU32 oldBuffer = gc->curBuffer; - - gc->curBuffer = ((buffer == GR_BUFFER_FRONTBUFFER) - ? gc->frontBuffer - : gc->backBuffer); - if (oldBuffer != gc->curBuffer) { - REG_GROUP_BEGIN(BROADCAST_ID, colBufferAddr, 1, 0x1); - REG_GROUP_SET(hw, colBufferAddr, gc->buffers[gc->curBuffer]); - REG_GROUP_END(); - } - } -#ifdef CHRIS_DENIS_ANTHONY_HACK - } -#endif - - - GR_END(); -#undef FN_NAME -} /* grRenderBuffer */ - -GR_ENTRY(grCheckForRoom, void, (FxI32 n)) -{ - GR_DCL_GC; - - /* dpc - 13 sep 1997 - FixMe! - * Setting one packet for now. - */ - GR_CHECK_FOR_ROOM(n, 1); -} - -/*--------------------------------------------------------------------------- -** _grUpdateParamIndex -** -** Updates the paramIndex bits based on Glide state and the hints. -** -*/ -GR_DDFUNC(_grUpdateParamIndex, void, (void)) -{ -#define FN_NAME "_grUpdateParamIndex" - GR_DCL_GC; - FxU32 paramIndex = 0; - const FxU32 hints = gc->state.paramHints; - const FxU32 fbzColorPath = gc->state.fbi_config.fbzColorPath; - const FxU32 fogMode = gc->state.fbi_config.fogMode; - const FxU32 fbzMode = gc->state.fbi_config.fbzMode; - - /* - ** First, turn on every bit that we think we need. We can prune them - ** back later. - */ - - /* Turn on the texture bits based on what grTexCombine set */ - if (fbzColorPath & SST_ENTEXTUREMAP) { - /* No matter what, we need oow from the main grvertex structure */ - static FxU32 paramI_array[8] = { - STATE_REQUIRES_OOW_FBI, - STATE_REQUIRES_OOW_FBI | STATE_REQUIRES_W_TMU0 | STATE_REQUIRES_ST_TMU0, - STATE_REQUIRES_OOW_FBI | STATE_REQUIRES_W_TMU1 | STATE_REQUIRES_ST_TMU1, - STATE_REQUIRES_OOW_FBI | STATE_REQUIRES_W_TMU0 | STATE_REQUIRES_ST_TMU0 | - STATE_REQUIRES_W_TMU1 | STATE_REQUIRES_ST_TMU1, - STATE_REQUIRES_OOW_FBI | STATE_REQUIRES_W_TMU2 | STATE_REQUIRES_ST_TMU2, - STATE_REQUIRES_OOW_FBI | STATE_REQUIRES_W_TMU2 | STATE_REQUIRES_ST_TMU2 | - STATE_REQUIRES_W_TMU0 | STATE_REQUIRES_ST_TMU0, - STATE_REQUIRES_OOW_FBI | STATE_REQUIRES_W_TMU2 | STATE_REQUIRES_ST_TMU2 | - STATE_REQUIRES_W_TMU1 | STATE_REQUIRES_ST_TMU1, - STATE_REQUIRES_OOW_FBI | STATE_REQUIRES_W_TMU2 | STATE_REQUIRES_ST_TMU2 | - STATE_REQUIRES_W_TMU0 | STATE_REQUIRES_ST_TMU0 | - STATE_REQUIRES_W_TMU1 | STATE_REQUIRES_ST_TMU1 - }; - GR_ASSERT(gc->state.tmuMask < sizeof(paramI_array)/sizeof(paramI_array[0])); - paramIndex |= paramI_array[gc->state.tmuMask]; - } - - /* See if we need iterated RGB */ - if (gc->state.cc_requires_it_rgb && !gc->state.cc_delta0mode) { - paramIndex |= STATE_REQUIRES_IT_DRGB; - } - - /* See if we need to iterate alpha based on the value of - ac_requires_it_alpha */ - if (gc->state.ac_requires_it_alpha) { - paramIndex |= STATE_REQUIRES_IT_ALPHA; - } - - /* See what fbzColorPath contributes - BUG 1084*/ - if (( fbzColorPath & SST_ALOCALSELECT ) == SST_ALOCAL_Z ) { - paramIndex |= STATE_REQUIRES_OOZ; - } - - /* See what fbzMode contributes */ - if (fbzMode & SST_ENDEPTHBUFFER) { - if (fbzMode & SST_WBUFFER) { - paramIndex |= STATE_REQUIRES_OOW_FBI; - } else { - paramIndex |= STATE_REQUIRES_OOZ; - } - } - - /* See what fogMode contributes */ - if (fogMode & SST_ENFOGGING) { - if (fogMode & SST_FOG_Z) { - paramIndex |= STATE_REQUIRES_OOZ; - } else { - if (fogMode & SST_FOG_ALPHA) { - paramIndex |= STATE_REQUIRES_IT_ALPHA; - } else { - paramIndex |= STATE_REQUIRES_OOW_FBI; - } - } - } - - /* - ** Now we know everything that needs to be iterated. Prune back - ** the stuff that isn't explicitly different - ** - ** NOTE: by GMT, STATE_REQUIRES_OOW_FBI is set whenever texture mapping - ** is enabled - */ -#if defined(GLIDE3) && (GLIDE3_ALPHA) - /* Turn off W for TMU0 if we don't have a hint */ - if (paramIndex & STATE_REQUIRES_W_TMU0) { - GR_ASSERT(paramIndex & STATE_REQUIRES_OOW_FBI); - if (gc->state.vData.q0Info.mode == GR_PARAM_DISABLE) - paramIndex &= ~STATE_REQUIRES_W_TMU0; - } - - /* Turn off ST for TMU1 if TMU0 is active and TMU1 is not different */ - if (((paramIndex & (STATE_REQUIRES_ST_TMU0 | STATE_REQUIRES_ST_TMU1)) == - (STATE_REQUIRES_ST_TMU0 | STATE_REQUIRES_ST_TMU1)) && - gc->state.vData.st1Info.mode == GR_PARAM_DISABLE) - paramIndex &= ~STATE_REQUIRES_ST_TMU1; - - /* Turn off W for TMU1 if we have a previous W, and don't have a hint */ - if ((paramIndex & STATE_REQUIRES_W_TMU1) && (gc->state.vData.q1Info.mode == GR_PARAM_DISABLE)) - paramIndex &= ~STATE_REQUIRES_W_TMU1; -#else - /* Turn off W for TMU0 if we don't have a hint */ - if (paramIndex & STATE_REQUIRES_W_TMU0) { - GR_ASSERT(paramIndex & STATE_REQUIRES_OOW_FBI); - if (!(hints & GR_STWHINT_W_DIFF_TMU0)) - paramIndex &= ~STATE_REQUIRES_W_TMU0; - } - - /* Turn off ST for TMU1 if TMU0 is active and TMU1 is not different */ - if (((paramIndex & (STATE_REQUIRES_ST_TMU0 | STATE_REQUIRES_ST_TMU1)) == - (STATE_REQUIRES_ST_TMU0 | STATE_REQUIRES_ST_TMU1)) && - !(hints & GR_STWHINT_ST_DIFF_TMU1)) - paramIndex &= ~STATE_REQUIRES_ST_TMU1; - - /* Turn off W for TMU1 if we have a previous W, and don't have a hint */ - if ((paramIndex & STATE_REQUIRES_W_TMU1) && !(hints & GR_STWHINT_W_DIFF_TMU1)) - paramIndex &= ~STATE_REQUIRES_W_TMU1; -#endif - -#if (GLIDE_NUM_TMU > 2) - /* Turn off ST for TMU1 if it's not different & any other is set up. */ - if ((paramIndex & (STATE_REQUIRES_ST_TMU0 | STATE_REQURES_ST_TMU1)) && - (paramIndex & STATE_REQUIRES_ST_TMU2) && - !(hints & GR_STWHINT_ST_DIFF_TMU2)) - paramIndex &= ~STATE_REQUIRES_ST_TMU2; - - /* Turn off W for TMU2 if we have a previous W, and don't have a hint */ - if ((paramIndex & STATE_REQUIRES_W_TMU2) && !(hints & GR_STWHINT_W_DIFF_TMU2)) - paramIndex &= ~STATE_REQUIRES_W_TMU2; -#endif - - gc->state.paramIndex = paramIndex; - - _grRebuildDataList(); -#undef FN_NAME -} /* _grUpdateParamIndex */ - -#if defined(GLIDE_USE_ALT_REGMAP) -#define RED Fr_ALT -#define DRDX Fdrdx_ALT -#define DRDY Fdrdy_ALT -#define GRN Fg_ALT -#define DGDX Fdgdx_ALT -#define DGDY Fdgdy_ALT -#define BLU Fb_ALT -#define DBDX Fdbdx_ALT -#define DBDY Fdbdy_ALT -#define ALF Fa_ALT -#define DADX Fdadx_ALT -#define DADY Fdady_ALT -#define Z Fz_ALT -#define DZDX Fdzdx_ALT -#define DZDY Fdzdy_ALT -#define S Fs_ALT -#define DSDX Fdsdx_ALT -#define DSDY Fdsdy_ALT -#define T Ft_ALT -#define DTDX Fdtdx_ALT -#define DTDY Fdtdy_ALT -#define W Fw_ALT -#define DWDX Fdwdx_ALT -#define DWDY Fdwdy_ALT -#else -#define RED Fr -#define DRDX Fdrdx -#define DRDY Fdrdy -#define GRN Fg -#define DGDX Fdgdx -#define DGDY Fdgdy -#define BLU Fb -#define DBDX Fdbdx -#define DBDY Fdbdy -#define ALF Fa -#define DADX Fdadx -#define DADY Fdady -#define Z Fz -#define DZDX Fdzdx -#define DZDY Fdzdy -#define S Fs -#define DSDX Fdsdx -#define DSDY Fdsdy -#define T Ft -#define DTDX Fdtdx -#define DTDY Fdtdy -#define W Fw -#define DWDX Fdwdx -#define DWDY Fdwdy -#endif - -#if GLIDE_HW_TRI_SETUP -static void -_grUpdateTriPacketHdr(FxU32 paramMask, - const GrCullMode_t cullMode) -{ - GR_DCL_GC; - FxU32 sMode = ((cullMode != GR_CULL_DISABLE) - ? kSetupCullEnable - : kSetupPingPongDisable); - if (sMode != kSetupPingPongDisable) sMode |= ((cullMode == GR_CULL_POSITIVE) - ? kSetupCullPositive - : kSetupCullNegative); - -#if GLIDE_DISPATCH_SETUP -#define COLOR_COMP_ARGB ((SST_SETUP_RGB | SST_SETUP_A) << SSTCP_PKT3_PMASK_SHIFT) -#define COLOR_COMP_RGB (SST_SETUP_RGB << SSTCP_PKT3_PMASK_SHIFT) -#define COLOR_COMP_MASK COLOR_COMP_ARGB - - /* Setup custom triangle/strip procs. - * - * NB: Currently this selection is based entirely on if - * we're sending color information. We should possibly - * select on cpu type as well to determine if we should - * do sw culling or not. - */ - { - GrTriSetupProcVector* curTriProcVector = TRISETUP_NORGB; - - if ((paramMask & SSTCP_PKT3_PACKEDCOLOR) == SSTCP_PKT3_PACKEDCOLOR) { - const FxU32 colorComp = paramMask & COLOR_COMP_MASK; - - switch(colorComp) { - case COLOR_COMP_ARGB: - curTriProcVector = TRISETUP_ARGB; - break; - - case COLOR_COMP_RGB: - curTriProcVector = TRISETUP_RGB; - break; - - /* If no rgb data then it is not worthwhile to pack - * just alpha so just mask off the packed color bit - * and just use the looping proc. - */ - default: - curTriProcVector = TRISETUP_NORGB; - paramMask &= ~SSTCP_PKT3_PACKEDCOLOR; - break; - } - } - - gc->archDispatchProcs.triSetupProc = PROC_SELECT_TRISETUP(*curTriProcVector, cullMode); - } -#endif /* GLIDE_DISPATCH_SETUP */ - - gc->cmdTransportInfo.paramMask = paramMask; - - /* Compute the common case packet 3 header which just needs - * the vertex count and strip/command type to be completed. - */ - gc->cmdTransportInfo.cullStripHdr = ((sMode << SSTCP_PKT3_SMODE_SHIFT) | - paramMask | - SSTCP_PKT3); - - /* Independent triangle hdr for grDrawTriangle */ - gc->cmdTransportInfo.triPacketHdr = (gc->cmdTransportInfo.cullStripHdr | - (0x3UL << SSTCP_PKT3_NUMVERTEX_SHIFT) | - SSTCP_PKT3_BDDBDD); - -#if GLIDE_TRI_CULLING - /* If we're doing sw culling for independent triangles then turn off - * the hw culling so we're consistent. HW culling, however, remains - * enabled for things using strips/fans. - */ - if (cullMode != GR_CULL_DISABLE) { - gc->cmdTransportInfo.triPacketHdr &= ~(kSetupCullEnable << SSTCP_PKT3_SMODE_SHIFT); - } -#endif /* GLIDE_TRI_CULLING */ -} -#endif /* GLIDE_HW_TRI_SETUP */ - -/*--------------------------------------------------------------------------- - * _grRebuildDataList - * - * NB: For CVG is *IMPERATIVE* that the writes to the parameter - * dataList remain in the order below otherwise the parameters - * will get written to the command packet in the wrong order. - */ -GR_DDFUNC(_grRebuildDataList, void, (void)) -{ -#define FN_NAME "_grRebuildDataList" - GR_DCL_GC; - GR_DCL_HW; - int curTriSize, params; - FxU32 i; - SstRegs *tmu0; - SstRegs *tmu1; - -#if GLIDE3 || GLIDE_PACKED_RGB - FxBool packedRGB = FXFALSE; -#endif /* GLIDE3 || GLIDE_PACKED_RGB */ - -#ifdef GLIDE_DEBUG - static char *p_str[] = {"x","y","z","r","g","b","ooz","a","oow", - "s0","t0","w0","s1","t1","w1","s2","t2","w2"}; -#endif /* GLIDE_DEBUG */ - - GDBG_INFO(85, FN_NAME "(): paramHints=0x%x paramIndex=0x%x\n", - gc->state.paramHints,gc->state.paramIndex); - - curTriSize = params = 0; - i = gc->state.paramIndex; -#ifdef GLIDE_USE_ALT_REGMAP - hw = SST_WRAP(hw,128); /* wrap 128-257 are ALTernate register mappings */ -#endif /* GLIDE_USE_ALT_REGMAP */ - - tmu0 = SST_CHIP(hw,0xE); /* tmu 0,1,2 */ - tmu1 = SST_CHIP(hw,0xC); /* tmu 1,2 */ - -#if GLIDE_HW_TRI_SETUP - gc->cmdTransportInfo.paramMask = 0x00; -#endif /* GLIDE_HW_TRI_SETUP */ - -#ifdef GLIDE3 - gc->state.vData.vSize = 8; /* XY * 3 */ - /* - ** make x, y default to 0 and 1 - */ - /* - gc->sDataList[sVtxSize++] = gc->state.vData.vertexInfo.offset + GR_VERTEX_OFFSET_X; - gc->sDataList[sVtxSize++] = gc->state.vData.vertexInfo.offset + GR_VERTEX_OFFSET_Y; - */ -#endif /* GLIDE3 */ - - if (i & STATE_REQUIRES_IT_DRGB) { -#if GLIDE_HW_TRI_SETUP && !defined(GLIDE3) - gc->cmdTransportInfo.paramMask |= SST_SETUP_RGB; - gc->tsuDataList[curTriSize + 0] = GR_VERTEX_R_OFFSET << 2; - - /* When using packed color we only add *ONE* item to the data list - * and this signals the entire color set since it is not possible - * to specify a single color component in any packet. - */ -#if !GLIDE_PACKED_RGB - gc->tsuDataList[curTriSize + 1] = GR_VERTEX_G_OFFSET << 2; - gc->tsuDataList[curTriSize + 2] = GR_VERTEX_B_OFFSET << 2; -#endif /* !GLIDE_PACKED_RGB */ -#elif defined(GLIDE3) - gc->cmdTransportInfo.paramMask |= SST_SETUP_RGB; - if (gc->state.vData.colorType == GR_FLOAT) { - gc->tsuDataList[curTriSize + 0] = gc->state.vData.rgbInfo.offset; - gc->tsuDataList[curTriSize + 1] = gc->state.vData.rgbInfo.offset + GR_COLOR_OFFSET_GREEN; - gc->tsuDataList[curTriSize + 2] = gc->state.vData.rgbInfo.offset + GR_COLOR_OFFSET_BLUE; - gc->state.vData.vSize += 12; /* RGB */ - } - else { - gc->tsuDataList[curTriSize + 0] = gc->state.vData.pargbInfo.offset; - packedRGB = FXTRUE; - gc->state.vData.vSize += 4; - } -#endif /* GLIDE_HW_TRI_SETUP */ - -#if !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP - gc->regDataList[curTriSize + 0].i = GR_VERTEX_R_OFFSET << 2; - gc->regDataList[curTriSize + 1].i = GR_VERTEX_G_OFFSET << 2; - gc->regDataList[curTriSize + 2].i = GR_VERTEX_B_OFFSET << 2; - - gc->regDataList[curTriSize + 0].addr = (float*)&hw->RED; - gc->regDataList[curTriSize + 1].addr = (float*)&hw->GRN; - gc->regDataList[curTriSize + 2].addr = (float*)&hw->BLU; -#endif /* !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP */ - -#if GLIDE_PACKED_RGB -#if GLIDE3 -#if !GLIDE3_VERTEX_LAYOUT - if (gc->state.vData.colorInfo.type == GR_FLOAT) { -#else /* GLIDE3_VERTEX_LAYOUT */ - if (gc->state.vData.colorType == GR_FLOAT) { -#endif /* GLIDE3_VERTEX_LAYOUT */ - curTriSize += 3; - params += 3; - } else { - curTriSize += 1; - params += 1; - - packedRGB = FXTRUE; - } -#else /* !GLIDE3 */ - curTriSize += 1; - params += 1; - - packedRGB = FXTRUE; -#endif /* GLIDE3 */ -#else /* !GLIDE_PACKED_RGB */ - curTriSize += 3; - params += 3; -#endif /* !GLIDE_PACKED_RGB */ - } - - if (i & STATE_REQUIRES_IT_ALPHA) { -#if GLIDE_HW_TRI_SETUP && !defined(GLIDE3) - gc->cmdTransportInfo.paramMask |= SST_SETUP_A; - gc->tsuDataList[curTriSize + 0] = GR_VERTEX_A_OFFSET << 2; -#elif defined(GLIDE3) - gc->cmdTransportInfo.paramMask |= SST_SETUP_A; - if (gc->state.vData.colorType == GR_FLOAT) { - gc->tsuDataList[curTriSize] = gc->state.vData.aInfo.offset; - gc->state.vData.vSize += 4; - } -#endif /* GLIDE_HW_TRI_SETUP */ - -#if !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP - gc->regDataList[curTriSize + 0].i = GR_VERTEX_A_OFFSET << 2; - gc->regDataList[curTriSize + 0].addr = (float*)&hw->ALF; -#endif /* !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP */ - - curTriSize += 1; - -#if GLIDE_PACKED_RGB -#if GLIDE3 -#if !GLIDE3_VERTEX_LAYOUT - if (gc->state.vData.colorInfo.type == GR_FLOAT) { -#else /* GLIDE3_VERTEX_LAYOUT */ - if (gc->state.vData.colorType == GR_FLOAT) { -#endif /* GLIDE3_VERTEX_LAYOUT */ - params += 1; - } - else -#endif /* GLIDE3 */ - { - /* Only increment the parameter packet size if we have not already - * added the rgb fields. - */ - if ((i & STATE_REQUIRES_IT_DRGB) == 0) params += 1; - packedRGB = FXTRUE; - } -#else /* !GLIDE_PACKED_RGB */ - params += 1; -#endif /* !GLIDE_PACKED_RGB */ - } - - if (i & STATE_REQUIRES_OOZ) { -#if GLIDE_HW_TRI_SETUP && !defined(GLIDE3) - gc->tsuDataList[curTriSize + 0] = GR_VERTEX_OOZ_OFFSET << 2; - gc->cmdTransportInfo.paramMask |= SST_SETUP_Z; -#elif defined(GLIDE3) - gc->tsuDataList[curTriSize] = gc->state.vData.zInfo.offset; - gc->cmdTransportInfo.paramMask |= SST_SETUP_Z; - - gc->state.vData.vSize += 4; -#endif /* GLIDE_HW_TRI_SETUP */ - -#if !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP - gc->regDataList[curTriSize + 0].i = GR_VERTEX_OOZ_OFFSET << 2; - gc->regDataList[curTriSize + 0].addr = (float*)&hw->Z; -#endif /* !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP */ - - curTriSize += 1; - params += 1; - } - - /* we squeeze FBI.OOW in here for sequential writes in the simple case */ - if (i & STATE_REQUIRES_OOW_FBI) { -#if GLIDE_HW_TRI_SETUP && !defined(GLIDE3) - gc->tsuDataList[curTriSize + 0] = GR_VERTEX_OOW_OFFSET << 2; - gc->cmdTransportInfo.paramMask |= SST_SETUP_Wfbi; -#elif defined(GLIDE3) - gc->tsuDataList[curTriSize] = gc->state.vData.wInfo.offset; - gc->cmdTransportInfo.paramMask |= SST_SETUP_Wfbi; - - gc->state.vData.vSize += 4; -#endif /* GLIDE_HW_TRI_SETUP */ - -#if !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP - gc->regDataList[curTriSize + 0].i = GR_VERTEX_OOW_OFFSET << 2; - gc->regDataList[curTriSize + 0].addr = (float*)&hw->W; -#endif /* !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP */ - - curTriSize += 1; - params += 1; - } - -#if GLIDE_FP_CLAMP_TEX -#if !GLIDE_FP_CLAMP || !GLIDE_HW_TRI_SETUP -#error "Does not make sense to have GLIDE_FP_CLAMP_TEX w/o GLIDE_FP_CLAMP or GLIDE_HW_TRI_SETUP" -#endif /* !GLIDE_FP_CLAMP || !GLIDE_HW_TRI_SETUP */ - - /* Simplify the test for clamping only the texture parameters by - * sticking an extra empty slot into the data list. - * - * NB: This means that the code that runs through the parameter list - * needs to increment the datalist pointer before moving onto the - * texture parameters. - */ - gc->tsuDataList[curTriSize++] = 0; -#endif /* GLIDE_FP_CLAMP_TEX */ - - /* NOTE: this is the first */ - if (i & STATE_REQUIRES_W_TMU0) { -#if GLIDE_HW_TRI_SETUP && !defined(GLIDE3) - gc->tsuDataList[curTriSize + 0] = GR_VERTEX_OOW_TMU0_OFFSET << 2; - gc->cmdTransportInfo.paramMask |= SST_SETUP_W0; -#elif defined(GLIDE3) - gc->tsuDataList[curTriSize] = gc->state.vData.q0Info.offset; - gc->cmdTransportInfo.paramMask |= SST_SETUP_W0; - gc->state.vData.vSize += 4; -#endif /* GLIDE_HW_TRI_SETUP */ - -#if !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP - gc->regDataList[curTriSize + 0].i = GR_VERTEX_OOW_TMU0_OFFSET << 2; - gc->regDataList[curTriSize + 0].addr = (float*)&tmu0->W; -#endif /* !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP */ - - curTriSize += 1; - params += 1; - } - - /* TMU0 --------------------------------- */ - /* always output to ALL chips, saves from having to change CHIP field */ - if (i & STATE_REQUIRES_ST_TMU0) { -#if GLIDE_HW_TRI_SETUP && !defined(GLIDE3) - gc->tsuDataList[curTriSize + 0] = GR_VERTEX_SOW_TMU0_OFFSET << 2; - gc->tsuDataList[curTriSize + 1] = GR_VERTEX_TOW_TMU0_OFFSET << 2; - gc->cmdTransportInfo.paramMask |= SST_SETUP_ST0; -#elif defined(GLIDE3) - gc->tsuDataList[curTriSize + 0] = gc->state.vData.st0Info.offset; - gc->tsuDataList[curTriSize + 1] = gc->state.vData.st0Info.offset - + GR_TEXTURE_OFFSET_T; - gc->cmdTransportInfo.paramMask |= SST_SETUP_ST0; - gc->state.vData.vSize += 8; -#endif /* GLIDE_HW_TRI_SETUP */ - -#if !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP - gc->regDataList[curTriSize + 0].i = GR_VERTEX_SOW_TMU0_OFFSET << 2; - gc->regDataList[curTriSize + 1].i = GR_VERTEX_TOW_TMU0_OFFSET << 2; - gc->regDataList[curTriSize + 0].addr = (float*)&tmu0->S; - gc->regDataList[curTriSize + 1].addr = (float*)&tmu0->T; -#endif /* !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP */ - - curTriSize += 2; - params += 2; - } - - /* TMU1 --------------------------------- */ - if (i & STATE_REQUIRES_W_TMU1) { -#if GLIDE_HW_TRI_SETUP && !defined(GLIDE3) - gc->tsuDataList[curTriSize + 0] = GR_VERTEX_OOW_TMU1_OFFSET << 2; - gc->cmdTransportInfo.paramMask |= SST_SETUP_W1; -#elif defined(GLIDE3) - gc->tsuDataList[curTriSize] = gc->state.vData.q1Info.offset; - gc->cmdTransportInfo.paramMask |= SST_SETUP_W1; - gc->state.vData.vSize += 4; -#endif /* GLIDE_HW_TRI_SETUP */ - -#if !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP - gc->regDataList[curTriSize + 0].i = GR_VERTEX_OOW_TMU1_OFFSET << 2; - gc->regDataList[curTriSize + 0].addr = (float*)&tmu1->W; -#endif /* !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP */ - - curTriSize += 1; - params += 1; - - } - - if (i & STATE_REQUIRES_ST_TMU1) { -#if GLIDE_HW_TRI_SETUP && !defined(GLIDE3) - gc->tsuDataList[curTriSize + 0] = GR_VERTEX_SOW_TMU1_OFFSET << 2; - gc->tsuDataList[curTriSize + 1] = GR_VERTEX_TOW_TMU1_OFFSET << 2; - gc->cmdTransportInfo.paramMask |= SST_SETUP_ST1; -#elif defined(GLIDE3) - gc->tsuDataList[curTriSize + 0] = gc->state.vData.st1Info.offset; - gc->tsuDataList[curTriSize + 1] = gc->state.vData.st1Info.offset + GR_TEXTURE_OFFSET_T; - gc->cmdTransportInfo.paramMask |= SST_SETUP_ST1; - gc->state.vData.vSize += 8; -#endif /* GLIDE_HW_TRI_SETUP */ - -#if !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP - gc->regDataList[curTriSize + 0].i = GR_VERTEX_SOW_TMU1_OFFSET << 2; - gc->regDataList[curTriSize + 0].addr = (float*)&tmu1->S; - gc->regDataList[curTriSize + 1].i = GR_VERTEX_TOW_TMU1_OFFSET << 2; - gc->regDataList[curTriSize + 1].addr = (float*)&tmu1->T; -#endif /* !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP */ - - curTriSize += 2; - params += 2; - - } - -#if (GLIDE_NUM_TMU > 2) -#error "GLIDE_NUM_TMU > 2: Write this code." -#endif - -#if !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP - gc->regDataList[curTriSize].i = 0; /* terminate the list with 0,* */ -#endif /* !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP */ - -#if GLIDE_HW_TRI_SETUP - gc->tsuDataList[curTriSize] = 0; -#endif /* GLIDE_HW_TRI_SETUP */ - - curTriSize++; - -#if GLIDE_HW_TRI_SETUP - /* Per vertex size: (xy [required] + parameters) * param size (32 bit word) */ - _GlideRoot.curVertexSize = ((2 + params) << 2); - - /* Packet size: 3 * vertex size */ - _GlideRoot.curTriSize = (_GlideRoot.curVertexSize << 1) + _GlideRoot.curVertexSize; - - /* Shift the parameter mask to just write into the packet header. */ - GDBG_INFO(191, "CVG ParamMask: 0x%X\n", gc->cmdTransportInfo.paramMask); - gc->cmdTransportInfo.paramMask <<= SSTCP_PKT3_PMASK_SHIFT; - -#if GLIDE_PACKED_RGB || GLIDE3 - if (packedRGB) gc->cmdTransportInfo.paramMask |= SSTCP_PKT3_PACKEDCOLOR; -#endif /* GLIDE_PACKED_RGB || GLIDE3 */ - - /* Update common packet 3 headers */ - _grUpdateTriPacketHdr(gc->cmdTransportInfo.paramMask, gc->state.cull_mode); -#endif /* GLIDE_HW_TRI_SETUP */ - -#if !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP - gc->regDataList[curTriSize].i = 1; - gc->regDataList[curTriSize].addr = (float*)&hw->FtriangleCMD; - - /* 6 X,Y values plus AREA = 7, plus parameters */ - _GlideRoot.paramCount = params; - _GlideRoot.curTriSize = (6 + curTriSize + (params << 1)) << 2; - - /* Need to know tri size without gradients for planar polygons */ - _GlideRoot.curTriSizeNoGradient = _GlideRoot.curTriSize - (params << 3); -#endif /* !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP */ - -#if GLIDE_FP_CLAMP_TEX - /* Stick one more 0 in the dataList so that the texture clamping - * loop does not go one more iteration. - */ - gc->tsuDataList[++curTriSize] = 0; -#endif /* GLIDE_FP_CLAMP_TEX */ - -#ifdef GDBG_INFO_ON -#if GLIDE_HW_TRI_SETUP - for (i = 0; gc->tsuDataList[i]; i++) { - GDBG_INFO(282," tsuDataList[%d] = %2d [%s]\n", - i, gc->tsuDataList[i] >> 2, p_str[gc->tsuDataList[i] >> 2]); - } -#endif /* GLIDE_HW_TRI_SETUP */ - -#if !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP - for (i = 0; gc->regDataList[i].i; i++) { - GDBG_INFO(282," dataList[%d] = %2d 0x%x [%s]\n", - i, gc->regDataList[i].i >> 2, gc->regDataList[i].addr, - p_str[gc->regDataList[i].i >> 2]); - } -#endif /* !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP */ -#endif /* GDBG_INFO_ON */ - -#if GLIDE3 -#if !GLIDE3_VERTEX_LAYOUT - GDBG_INFO(gc->myLevel, "%s: Vertex Offset = %d\n", FN_NAME, - gc->state.vData.vertexInfo.offset); - - GDBG_INFO(gc->myLevel, "%s: Color Offset = %d\n", FN_NAME, - gc->state.vData.colorInfo.offset); - - GDBG_INFO(gc->myLevel, "%s: Tex0 Offset = %d\n", FN_NAME, - gc->state.vData.tex0Info.offset); - - GDBG_INFO(gc->myLevel, "%s: Tex1 Offset = %d\n", FN_NAME, - gc->state.vData.tex1Info.offset); -#endif /* !GLIDE3_VERTEX_LAYOUT */ -#endif /* GLIDE3 */ -#undef FN_NAME -} /* _grRebuildDataList */ - -#if GLIDE_MULTIPLATFORM -/* - _grInitializeGCFuncs - initialize the gcFuncs Structure for this - device. -*/ -GR_DDFUNC(_grInitializeGCFuncs, void, (GrGC *gc)) -{ - - gc->gcFuncs._grColorCombineDelta0Mode = (void *) - GR_DDNAME(_grColorCombineDelta0Mode); - gc->gcFuncs._grRebuildDataList = (void *) GR_DDNAME(_grRebuildDataList); - gc->gcFuncs._grTexDetailControl = (void *) GR_DDNAME(_grTexDetailControl); - gc->gcFuncs._grTexDownloadNccTable = (void *) - GR_DDNAME(_grTexDownloadNccTable); - gc->gcFuncs._grTexDownloadPalette = (void *) - GR_DDNAME(_grTexDownloadPalette); - gc->gcFuncs._gumpTexCombineFunction = (void *) - GR_DDNAME(_gumpTexCombineFunction); - gc->gcFuncs._grUpdateParamIndex = (void *) - GR_DDNAME(_grUpdateParamIndex); - gc->gcFuncs._trisetup = (void *) GR_DDNAME(_trisetup); - gc->gcFuncs._trisetup_nogradients = (void *) - GR_DDNAME(_trisetup_nogradients); - gc->gcFuncs.grAADrawLine = (void *) GR_DDNAME(grAADrawLine); - gc->gcFuncs.grAADrawPoint = (void *) GR_DDNAME(grAADrawPoint); - gc->gcFuncs.grAADrawPolygon = (void *) GR_DDNAME(grAADrawPolygon); - gc->gcFuncs.grAADrawPolygonVertexList = (void *) - GR_DDNAME(grAADrawPolygonVertexList); - gc->gcFuncs.grAADrawTriangle = (void *) GR_DDNAME(grAADrawTriangle); - gc->gcFuncs.grAlphaBlendFunction = (void *) - GR_DDNAME(grAlphaBlendFunction); - gc->gcFuncs.grAlphaCombine = (void *) GR_DDNAME(grAlphaCombine); - gc->gcFuncs.grAlphaControlsITRGBLighting = (void *) - GR_DDNAME(grAlphaControlsITRGBLighting); - gc->gcFuncs.grAlphaTestFunction = (void *) - GR_DDNAME(grAlphaTestFunction); - gc->gcFuncs.grAlphaTestReferenceValue = (void *) - GR_DDNAME(grAlphaTestReferenceValue); - gc->gcFuncs.grBufferClear = (void *) GR_DDNAME(grBufferClear); - gc->gcFuncs.grBufferNumPending = (void *) - GR_DDNAME(grBufferNumPending); - gc->gcFuncs.grBufferSwap = (void *) GR_DDNAME(grBufferSwap); - gc->gcFuncs.grChromakeyMode = (void *) GR_DDNAME(grChromakeyMode); - gc->gcFuncs.grChromakeyValue = (void *) GR_DDNAME(grChromakeyValue); - gc->gcFuncs.grClipWindow = (void *) GR_DDNAME(grClipWindow); - gc->gcFuncs.grColorCombine = (void *) GR_DDNAME(grColorCombine); - gc->gcFuncs.grColorMask = (void *) GR_DDNAME(grColorMask); - gc->gcFuncs.grConstantColorValue = (void *) - GR_DDNAME(grConstantColorValue); - gc->gcFuncs.grConstantColorValue4 = (void *) - GR_DDNAME(grConstantColorValue4); - gc->gcFuncs.grCullMode = (void *) GR_DDNAME(grCullMode); - gc->gcFuncs.grDepthBiasLevel = (void *) GR_DDNAME(grDepthBiasLevel); - gc->gcFuncs.grDepthBufferFunction = (void *) - GR_DDNAME(grDepthBufferFunction); - gc->gcFuncs.grDepthBufferMode = (void *) GR_DDNAME(grDepthBufferMode); - - gc->gcFuncs.grDepthMask = (void *) GR_DDNAME(grDepthMask); - gc->gcFuncs.grDisableAllEffects = (void *) - GR_DDNAME(grDisableAllEffects); - gc->gcFuncs.grDitherMode = (void *) GR_DDNAME(grDitherMode); - gc->gcFuncs.grDrawLine = (void *) GR_DDNAME(grDrawLine); - gc->gcFuncs.grDrawPlanarPolygon = (void *) - GR_DDNAME(grDrawPlanarPolygon); - gc->gcFuncs.grDrawPlanarPolygonVertexList = (void *) - GR_DDNAME(grDrawPlanarPolygonVertexList); - gc->gcFuncs.grDrawPoint = (void *) GR_DDNAME(grDrawPoint); - gc->gcFuncs.grDrawPolygon = (void *) GR_DDNAME(grDrawPolygon); - gc->gcFuncs.grDrawPolygonVertexList = (void *) - GR_DDNAME(grDrawPolygonVertexList); - gc->gcFuncs.grDrawTriangle = (void *) GR_DDNAME(grDrawTriangle); - gc->gcFuncs.grFogColorValue = (void *) GR_DDNAME(grFogColorValue); - gc->gcFuncs.grFogMode = (void *) GR_DDNAME(grFogMode); - gc->gcFuncs.grFogTable = (void *) GR_DDNAME(grFogTable); - gc->gcFuncs.grGammaCorrectionValue = (void *) - GR_DDNAME(grGammaCorrectionValue); - gc->gcFuncs.grGlideSetState = (void *) GR_DDNAME(grGlideSetState); - gc->gcFuncs.grGlideShutdown = (void *) GR_DDNAME(grGlideShutdown); - gc->gcFuncs.grLfbConstantAlpha = (void *) - GR_DDNAME(grLfbConstantAlpha); - gc->gcFuncs.grLfbConstantDepth = (void *) - GR_DDNAME(grLfbConstantDepth); - gc->gcFuncs.grLfbLock = (void *)GR_DDNAME(grLfbLock); - gc->gcFuncs.grLfbUnlock = (void*)GR_DDNAME(grLfbUnlock); - gc->gcFuncs.grLfbWriteColorFormat = (void *) - GR_DDNAME(grLfbWriteColorFormat); - gc->gcFuncs.grLfbWriteColorSwizzle = (void *) - GR_DDNAME(grLfbWriteColorSwizzle); - gc->gcFuncs.grRenderBuffer = (void *) GR_DDNAME(grRenderBuffer); - gc->gcFuncs.grSstConfigPipeline = (void *) - GR_DDNAME(grSstConfigPipeline); - gc->gcFuncs.grSstIdle = (void *) GR_DDNAME(grSstIdle); - gc->gcFuncs.grSstIsBusy = (void *) GR_DDNAME(grSstIsBusy); - gc->gcFuncs.grSstOpen = (void *) GR_DDNAME(grSstOpen); - gc->gcFuncs.grSstOrigin = (void *) GR_DDNAME(grSstOrigin); - gc->gcFuncs.grSstPassthruMode = (void *) GR_DDNAME(grSstPassthruMode); - - gc->gcFuncs.grSstPerfStats = (void *) GR_DDNAME(grSstPerfStats); - gc->gcFuncs.grSstResetPerfStats = (void *) GR_DDNAME(grSstResetPerfStats); - gc->gcFuncs.grSstStatus = (void *) GR_DDNAME(grSstStatus); - gc->gcFuncs.grSstVRetraceOn = (void *) GR_DDNAME(grSstVRetraceOn); - gc->gcFuncs.grSstVideoLine = (void *) GR_DDNAME(grSstVideoLine); - gc->gcFuncs.grTexClampMode = (void *) GR_DDNAME(grTexClampMode); - gc->gcFuncs.grTexCombine = (void *) GR_DDNAME(grTexCombine); - gc->gcFuncs.grTexDownloadMipMapLevelPartial = (void *) - GR_DDNAME(grTexDownloadMipMapLevelPartial); - gc->gcFuncs.grTexFilterMode = (void *) GR_DDNAME(grTexFilterMode); - gc->gcFuncs.grTexLodBiasValue = (void *) GR_DDNAME(grTexLodBiasValue); - gc->gcFuncs.grTexMipMapMode = (void *) GR_DDNAME(grTexMipMapMode); - gc->gcFuncs.grTexMultibase = (void *) GR_DDNAME(grTexMultibase); - gc->gcFuncs.grTexMultibaseAddress = (void *) - GR_DDNAME(grTexMultibaseAddress); - gc->gcFuncs.grTexNCCTable = (void *) GR_DDNAME(grTexNCCTable); - gc->gcFuncs.grTexSource = (void *) GR_DDNAME(grTexSource); - gc->gcFuncs.guMPDrawTriangle = (void *) GR_DDNAME(guMPDrawTriangle); - gc->gcFuncs.guTexSource = (void *) GR_DDNAME(guTexSource); - gc->gcFuncs.ConvertAndDownloadRle=(void *) GR_DDNAME(ConvertAndDownloadRle); - gc->gcFuncs.grCheckForRoom=(void *) GR_DDNAME(grCheckForRoom); -} /* _grInitializeGCFuncs */ -#endif diff --git a/glide2x/h3/glide/src/glfb.c b/glide2x/h3/glide/src/glfb.c deleted file mode 100644 index 430664f..0000000 --- a/glide2x/h3/glide/src/glfb.c +++ /dev/null @@ -1,961 +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:27 joseph -** Initial checkin into SourceForge. -** -** -** 4 3/17/99 6:16p Dow -** Phantom Menace and other fixes. -** -** 78 3/12/99 5:52p Hanson -** Fixed Descent2 bugs. No idle on lfb lock needed to be disabled for -** banshee/avenger since it does not have SST1 style cmd fifo. Updated -** ConvertAndDownloadRLE for Banshee/Avenger. -** -** 77 3/10/99 6:39p Peter -** need to bump-n-grind in lfb lock too, fixed nested lock error condition -** -** 76 3/08/99 4:13p Mikec -** Made sure when we return raw lfb in a write lock, origin is not lower -** left. -** -** 75 2/17/99 5:05p Atai -** guard the lfb write ptr hack for window32 only -** -** 74 9/10/98 12:39p Mikec -** In grLfbLock special case where we return read ptr for writeMode of -** 565, I took out ZA16 because it screwed up zbuffer writes on croc. It's -** good to err on safe side. -** -** 73 9/01/98 9:55a Dow -** Fixed stride bugs for 32-bit formats -** -** 72 8/29/98 12:11p Mikec -** Changed grLfbLock to return the current buffer lfbptr (read ptr) if it -** is writeOnly and 565 and not pixelpipe. -** -** 71 8/27/98 8:40p Mikec -** Fixed lfb buffer write problem (stride wrongly shifted by 1). -** -** 70 7/06/98 7:04p Jdt -** Buffer flushing logic -** -** 69 6/10/98 9:49a Peter -** lfb buffer addressing -** -** 68 4/29/98 1:03p Peter -** read region/non 16bit write happiness -** -** 67 4/14/98 6:40p Peter -** Fixed grLfbLock/merge w/ cvg glide cleanup -** -** 66 4/08/98 12:25p Dow -** LFB read fix -** -** 65 4/07/98 10:40p Dow -** LFB Fixes: Round 1 -** -** 64 3/28/98 11:24a Dow -** itwoç -** -** 62 2/17/98 12:51p Dow -** LINEAR_WRITE_EDGE mods -** -** 61 2/08/98 3:08p Dow -** FIFO Works -** -** 60 2/01/98 7:52p Peter -** grLfbWriteRegion byte count problems - * - * 58 1/16/98 4:18p Atai - * fixed lfb and grLoadGammaTable - * - * 57 1/06/98 3:53p Atai - * remove grHint, modify grLfbWriteRegion and grGet - * - * 56 12/17/97 4:45p Peter - * groundwork for CrybabyGlide - * - * 55 12/15/97 6:04p Atai - * disable obsolete glide2 api for glide3 - * - * 54 12/15/97 5:54p Peter - * swizzle reads too - * - * 53 12/11/97 4:15p Peter - * mac lfb write region - * - * 52 12/01/97 5:18p Peter - * - * 51 11/25/97 12:09p Peter - * nested calls to grLfbLock vs init code locking on v2 - * - * 50 11/18/97 4:36p Peter - * chipfield stuff cleanup and w/ direct writes - * - * 49 11/17/97 4:55p Peter - * watcom warnings/chipfield stuff - * - * 48 11/06/97 3:38p Dow - * More banshee stuff - * - * 47 11/04/97 5:04p Peter - * cataclysm part deux - * - * 46 11/03/97 3:43p Peter - * h3/cvg cataclysm - * - * 45 10/27/97 11:10a Peter - * starting cleanup - * - * 44 10/09/97 8:02p Dow - * State Monster 1st Cut - * - * 43 10/08/97 5:18p Peter - * fixed grLfbLock wrt writemode_any - * - * 42 10/08/97 11:33a Peter - * hmmmm.... - * - * 41 9/30/97 1:03p Peter - * more debugging code - * - * 40 9/25/97 1:35p Peter - * - * 39 9/24/97 4:09p Peter - * lfb/idle fixes - * - * 38 9/24/97 1:31p Peter - * assert if grXX call inside lock/unlock - * - * 37 9/20/97 10:54a Peter - * naked lfb writes - * - * 36 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 - * - * 35 9/10/97 10:13p Peter - * fifo logic from GaryT, non-normalized fp first cut - * - * 34 9/05/97 5:29p Peter - * changes for direct hw - * - * 33 9/04/97 3:32p Peter - * starting grouping serial reg writes - * - * 32 8/18/97 3:52p Peter - * pre-hw arrival fixes/cleanup - * - * 31 7/30/97 2:42p Peter - * more cleanup - * - * 30 7/28/97 2:41p Peter - * turned sli code back on for cvg, but waiting for hal - * - * 29 7/26/97 3:04p Peter - * gratuitous plug is translucent - * - * 28 7/02/97 12:28p Peter - * removed spurious NOP, tex dl - * - * 27 6/26/97 10:14a Peter - * cmd fifo for lfb - * - * 26 6/06/97 10:47a Peter - * texture downloading, fixed 640x480 dimension, changed cvg dep to be the - * same as sst1 - * -** -*/ -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -/*--------------------------------------------------------------------------- -** grLfbConstantAlpha -*/ -GR_ENTRY(grLfbConstantAlpha, void, (GrAlpha_t alpha)) -{ - GR_BEGIN_NOFIFOCHECK("grLfbConstantAlpha",82); - GDBG_INFO_MORE(gc->myLevel,"(0x%x)\n",alpha); - - gc->state.lfb_constant_alpha = alpha; - GR_END(); -} /* grLfbConstantAlpha */ - -/*--------------------------------------------------------------------------- -** grLfbConstantDepth -*/ -GR_ENTRY(grLfbConstantDepth, void, (FxU16 depth)) -{ - GR_BEGIN_NOFIFOCHECK("grLfbConstantDepth",82); - GDBG_INFO_MORE(gc->myLevel,"(0x%x)\n",depth); - - gc->state.lfb_constant_depth = depth; - GR_END(); -} /* grLfbConstantDepth */ - -/*------------------------------------------------------------------- - Function: grLfbLock - Date: 2/19 - Implementor(s): jdt - Library: Glide - Description: - Secures a pointer to a requested frame buffer and guarantees ordered - access to that buffer. - - Arguments: - type - type of lock, one of: - GR_LOCK_WRITE_ONLY - GR_LOCK_READ_ONLY - buffer - which buffer to lock, one of: - GR_BUFFER_FRONTBUFFER - GR_BUFFER_BACKBUFFER - GR_BUFFER_AUXBUFFER - writeMode - desired destination color format - origin - desired lfb origin - pixelPipeline - flag whether to process through pixpipe - info - pointer to info structure - Return: - FXTRUE - lock is successful - FXFALSE - lock fails - -------------------------------------------------------------------*/ - -GR_ENTRY(grLfbLock, FxBool,(GrLock_t type, GrBuffer_t buffer, - GrLfbWriteMode_t writeMode, GrOriginLocation_t origin, - FxBool pixelPipeline, GrLfbInfo_t *info)) -{ -#define FN_NAME "grLfbLock" - FxBool - rv = FXTRUE; - FxU32 - lfbMode, - zaColor, - fbzMode; - - GR_BEGIN_NOFIFOCHECK("grLfbLock", 82); - GDBG_INFO_MORE(gc->myLevel,"(%d,%d,%d,%d,%d,0x%x)\n", type, buffer, - writeMode, origin, pixelPipeline, info); - - /* there is only one revision extant */ - GR_CHECK_F(myName, info->size != sizeof(GrLfbInfo_t), "uninitialized info structure passed."); - GR_CHECK_F(myName, info == NULL, "Null info structure passed."); - - /* Load now flushed state */ - lfbMode = gc->state.fbi_config.lfbMode; - fbzMode = gc->state.fbi_config.fbzMode; - zaColor = gc->state.fbi_config.zaColor; - - type = type & ~(GR_LFB_NOIDLE); - if (gc->lockPtrs[type] != (FxU32)-1) { - GDBG_INFO(83, "Read lock failure due to existing lock"); - rv = FXFALSE; - } - - if (rv) { - switch(type) { - case GR_LFB_READ_ONLY: - lfbMode &= ~(SST_LFB_READBUFSELECT | - SST_LFB_YORIGIN); - - switch(buffer) { - case GR_BUFFER_FRONTBUFFER: - case GR_BUFFER_BACKBUFFER: - lfbMode |= SST_LFB_READCOLORBUFFER; - break; - - case GR_BUFFER_AUXBUFFER: - lfbMode |= SST_LFB_READDEPTHABUFFER; - break; - - default: - GR_CHECK_F(myName, - 1, - "illegal buffer parameter passed"); - rv = FXFALSE; - break; - } - - lfbMode |= (origin ? SST_LFB_YORIGIN : 0); - break; - - case GR_LFB_WRITE_ONLY: - /* Set up the constant depth register because it may have - * been trashed by a call to grDepthBiasLevel - * (depthbiaslevel and constant depth use the same register) - */ - zaColor = (((FxU32) gc->state.lfb_constant_depth) << SST_ZACOLOR_DEPTH_SHIFT); - zaColor |= (gc->state.lfb_constant_alpha << SST_ZACOLOR_ALPHA_SHIFT); - - /* disable depth biasing */ - fbzMode &= ~(SST_ENZBIAS); - - lfbMode &= ~(SST_LFB_YORIGIN | - SST_LFB_FORMAT | - SST_LFB_ENPIXPIPE); - - switch(writeMode) { - case GR_LFBWRITEMODE_RESERVED1: - case GR_LFBWRITEMODE_RESERVED2: - case GR_LFBWRITEMODE_RESERVED3: - case GR_LFBWRITEMODE_RESERVED4: - case GR_LFBWRITEMODE_RESERVED5: - case GR_LFBWRITEMODE_RESERVED6: - case GR_LFBWRITEMODE_RESERVED7: - rv = FXFALSE; - } - - /* Default to hw */ - if (writeMode == GR_LFBWRITEMODE_ANY) { - writeMode = ((buffer == GR_BUFFER_AUXBUFFER) - ? GR_LFBWRITEMODE_ZA16 - : GR_LFBWRITEMODE_565); - } - - switch(buffer) { - case GR_BUFFER_FRONTBUFFER: - case GR_BUFFER_BACKBUFFER: - rv = (writeMode != GR_LFBWRITEMODE_ZA16); - break; - - case GR_BUFFER_AUXBUFFER: - rv = (writeMode == GR_LFBWRITEMODE_ZA16); - break; - - default: - GR_CHECK_F(myName, 1, "illegal buffer parameter passed"); - break; - } - - lfbMode |= (writeMode << SST_LFB_FORMAT_SHIFT); - lfbMode |= (origin ? SST_LFB_YORIGIN : 0); - - if (pixelPipeline) { - lfbMode |= SST_LFB_ENPIXPIPE; - - fbzMode &= ~SST_YORIGIN; - fbzMode |= (origin ? SST_YORIGIN : 0); - } - info->writeMode = writeMode; - break; - - default: - rv = FXFALSE; - GDBG_INFO(gc->myLevel, "Lock failed because of invalid lock type."); - break; - } - } - - if (rv) { - const FxU32 - lockCount = gc->cmdTransportInfo.lfbLockCount; - - gc->lockPtrs[type] = buffer; - gc->cmdTransportInfo.lfbLockCount = 0x00UL; - - /* Setup the hw w/ the settings computed above. */ - switch(type) { - case GR_LFB_READ_ONLY: - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, lfbMode, lfbMode); - GR_CHECK_SIZE(); - break; - - case GR_LFB_WRITE_ONLY: - REG_GROUP_BEGIN(BROADCAST_ID, fbzMode, 3, 0x103); - { - REG_GROUP_SET(hw, fbzMode, fbzMode); - REG_GROUP_SET(hw, lfbMode, lfbMode); - REG_GROUP_SET(hw, zaColor, zaColor); - } - REG_GROUP_END(); - break; - } - gc->state.fbi_config.lfbMode = lfbMode; - - /* Get the current lfb buffer */ - { - /* FixMe: Is this true if we're triple buffering? */ - FxU32 colBufferIndex = 0; - - switch(buffer) { - case GR_BUFFER_FRONTBUFFER: - colBufferIndex = gc->frontBuffer; - break; - - case GR_BUFFER_BACKBUFFER: - colBufferIndex = gc->backBuffer; - break; - - case GR_BUFFER_AUXBUFFER: - colBufferIndex = gc->grColBuf; - break; - - default: - GR_CHECK_F(myName, 1, "illegal buffer parameter passed"); - rv = FXFALSE; - break; - } - - if (rv) { - info->strideInBytes = 0x1000; - info->origin = origin; - - if (type == GR_LFB_READ_ONLY) { - info->lfbPtr = (void *)gc->lfbBuffers[colBufferIndex]; - } else -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) - /* Next, If it is writeOnly and 565 and not pixelpipe, - we just return the current buffer lfbPtr as the write ptr. - This fixes those games that use the lfb write pointer to do - lfb reads. --mikec */ - if ((type == GR_LFB_WRITE_ONLY) && - (writeMode == GR_LFBWRITEMODE_565) && - /* Do not put GR_LFBWRITEMODE_ZA16 here! - * Croc intro clears zbuffer differently --mikec */ - (!pixelPipeline) && - /* Origin must be upper left since we will return raw lfb */ - (origin != GR_ORIGIN_LOWER_LEFT) && - FXTRUE) { - info->lfbPtr = (void *)gc->lfbBuffers[colBufferIndex]; - } else -#endif /* (GLIDE_PLATFORM & GLIDE_OS_WIN32) */ - { - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, colBufferAddr, gc->buffers[colBufferIndex]); - GR_CHECK_SIZE(); - - info->lfbPtr = (void *)gc->lfb_ptr; - - switch (writeMode) { - case GR_LFBWRITEMODE_565_DEPTH: - case GR_LFBWRITEMODE_555_DEPTH: - case GR_LFBWRITEMODE_1555_DEPTH: - case GR_LFBWRITEMODE_888: - case GR_LFBWRITEMODE_8888: - info->strideInBytes <<= 1; - break; - } - } - - /* NoIdle flag is ignored on all hardware except SST1 */ - - /* This is required to flush the write buffers before the - * actual LFB accesses. - */ - P6FENCE; - - /* If we're not using hole counting then we need to make sure that - * any queued commands are actually flushed before checking the fifo - * ptr's location. - */ - if (!gc->cmdTransportInfo.autoBump) - GR_BUMP_N_GRIND; - - /* Must idle to get things in the right order. */ - grSstIdle(); - - /* Increment lock count */ - gc->cmdTransportInfo.lfbLockCount = lockCount + 1; - } - } - } - - - GR_RETURN(rv); -#undef FN_NAME -} /* grLfbLock */ - -/*------------------------------------------------------------------- - Function: grLfbUnlock - Date: 2/21 - Implementor(s): jdt - Library: Glide - Description: - Unlock a previously locked buffer - Arguments: - type - type of lock (read only/write only) - buffer - which buffer to unlock - Return: - FXTRUE - success - FXFALSE - failure - -------------------------------------------------------------------*/ - -GR_ENTRY(grLfbUnlock, FxBool, (GrLock_t type, GrBuffer_t buffer)) -{ -#define FN_NAME "grLfbUnlock" - FxBool rval = FXFALSE; - - GR_BEGIN_NOFIFOCHECK("grLfbUnLock", 83); - GDBG_INFO_MORE(gc->myLevel,"(%d, %d)\n", type, buffer); - - type = type & ~(GR_LFB_NOIDLE); - - GR_CHECK_F(myName, - type != GR_LFB_WRITE_ONLY && - type != GR_LFB_READ_ONLY, - "Bad type"); - - GR_CHECK_F(myName, - buffer != GR_BUFFER_FRONTBUFFER && - buffer != GR_BUFFER_BACKBUFFER && - buffer != GR_BUFFER_AUXBUFFER, - "Bad buffer"); - - rval = (gc->lockPtrs[type] == (FxU32)buffer); - if (rval) { - const FxU32 - lockCount = gc->cmdTransportInfo.lfbLockCount; - - /* Clear the current lfb lock state */ - gc->cmdTransportInfo.lfbLockCount = 0; - gc->lockPtrs[type] = (FxU32)-1; - - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, colBufferAddr, gc->buffers[gc->curBuffer]); - GR_CHECK_SIZE(); - - if (type == GR_LFB_WRITE_ONLY) { - GR_SET_EXPECTED_SIZE(sizeof(FxU32) << 1, 2); - { - /* Restore depth bias level */ - GR_SET(BROADCAST_ID, hw, zaColor, gc->state.fbi_config.zaColor); - - /* turn back on depth biasing */ - GR_SET(BROADCAST_ID, hw, fbzMode, gc->state.fbi_config.fbzMode); - } - GR_CHECK_SIZE(); - } - - gc->cmdTransportInfo.lfbLockCount = lockCount - 1; - } - - GR_RETURN(rval); -#undef FN_NAME -} /* grLfbUnlock */ - - -/*--------------------------------------------------------------------------- -** grLfbWriteColorFormat -** -*/ - -GR_STATE_ENTRY(grLfbWriteColorFormat, void, (GrColorFormat_t colorFormat)) -{ -#define FN_NAME "grLfbWriteColorFormat" - FxU32 lfbMode; - - GR_BEGIN_NOFIFOCHECK("grLfbWriteColorFormat",82); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",colorFormat); - - GR_CHECK_F(myName, - colorFormat < 0 || colorFormat > 0x3, - "invalid color format"); - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) - _grValidateState(); -#endif - - lfbMode = gc->state.fbi_config.lfbMode; - lfbMode &= ~SST_LFB_RGBALANES; - lfbMode |= (colorFormat << SST_LFB_RGBALANES_SHIFT); - - { - const FxBool sliP = gc->scanline_interleaved; - - GR_SET_EXPECTED_SIZE(sizeof(FxU32) + MaskSelect(sliP, sizeof(FxU32)), - 1 + sliP); - { - GR_SET(BROADCAST_ID, hw, lfbMode, lfbMode); - gc->state.fbi_config.lfbMode = lfbMode; - - if (sliP) GR_SET(BROADCAST_ID, hw, nopCMD, 0x0); - } - GR_CHECK_SIZE(); - } - - GR_END(); -#undef FN_NAME -} /* grLfbWriteColorFormat */ - - -/*--------------------------------------------------------------------------- -** grLfbWriteColorSwizzle - set up SST for byte swizzling and word swapping -** -** Registers/Bits Affected: -** lfbMode: bit(11), bit(12) -** -** WARNING: GMT: SST_LFB_WRITE_SWAP16 changes pixel addressing!!! -*/ -GR_STATE_ENTRY(grLfbWriteColorSwizzle, void, (FxBool swizzleBytes, FxBool swapWords)) -{ -#define FN_NAME "grLfbWriteColorSwizzle" - FxU32 lfbMode; - - GR_BEGIN_NOFIFOCHECK("grLfbWriteColorSwizzle",82); - GDBG_INFO_MORE(gc->myLevel,"(%d,%d)\n",swizzleBytes,swapWords); - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) - _grValidateState(); -#endif - - /* Clear out the bits we'll set back if appropriate */ - lfbMode = gc->state.fbi_config.lfbMode; - lfbMode &= ~(SST_LFB_WRITE_SWAP16 | SST_LFB_WRITE_BYTESWAP); - - if (swizzleBytes) - lfbMode |= SST_LFB_WRITE_BYTESWAP; - - if (swapWords) - lfbMode |= SST_LFB_WRITE_SWAP16; - - { - const FxBool sliP = gc->scanline_interleaved; - - GR_SET_EXPECTED_SIZE(sizeof(FxU32) + MaskSelect(sliP, sizeof(FxU32)), - 1 + sliP); - { - GR_SET(BROADCAST_ID, hw, lfbMode, lfbMode); - gc->state.fbi_config.lfbMode = lfbMode; - - if (sliP) GR_SET(BROADCAST_ID, hw, nopCMD, 0x0); - } - GR_CHECK_SIZE(); - } - - GR_END(); -#undef FN_NAME -} /* grLfbWriteColorSwizzle */ - -FxBool -_grLfbWriteRegion(FxBool pixPipelineP, - GrBuffer_t dst_buffer, FxU32 dst_x, FxU32 dst_y, - GrLfbSrcFmt_t src_format, - FxU32 src_width, FxU32 src_height, - FxI32 src_stride, const void *src_data) -{ -#define FN_NAME "_grLfbWriteRegion" - FxBool rv = FXTRUE; - GrLfbInfo_t info; - GrLfbWriteMode_t writeMode; - - GR_BEGIN_NOFIFOCHECK(FN_NAME, 82); - GDBG_INFO_MORE(gc->myLevel, - "(0x%x, %s, %d, %d, %d, %d, %d, %d, 0x%x)\n", - dst_buffer, - (pixPipelineP ? "Enable" : "Disable"), - dst_x, dst_y, - src_format, src_width, src_height, - src_stride, src_data); - - writeMode = ((src_format == GR_LFB_SRC_FMT_RLE16) - ? GR_LFBWRITEMODE_565 - : src_format); - - info.size = sizeof(info); - - if (grLfbLock(GR_LFB_WRITE_ONLY, - dst_buffer, - writeMode, - GR_ORIGIN_UPPER_LEFT, - pixPipelineP, - &info)) { - FxU32 *srcData; /* Tracking Source Pointer */ - FxU32 *dstData; /* Tracking Destination Pointer */ - FxU32 *end; /* Demarks End of each Scanline */ - FxI32 srcJump; /* bytes to next scanline */ - FxU32 dstJump; /* bytes to next scanline */ - FxU32 length; /* bytes to copy in scanline */ - FxU32 scanline; /* scanline number */ - int aligned; /* word aligned? */ - - - srcData = (FxU32 *) src_data; - dstData = (FxU32 *) (((char*)info.lfbPtr)+ (dst_y*info.strideInBytes)); - scanline = src_height; - - switch(src_format) { - /* 16-bit aligned */ - case GR_LFB_SRC_FMT_565: - case GR_LFB_SRC_FMT_555: - case GR_LFB_SRC_FMT_1555: - case GR_LFB_SRC_FMT_ZA16: - dstData = (FxU32*)(((FxU16*)dstData) + dst_x); - length = src_width * 2; - aligned = !((int)dstData&0x2); - srcJump = src_stride - length; - dstJump = info.strideInBytes - length; - if (aligned) { - while(scanline--) { - end = (FxU32*)((char*)srcData + length - 2); - while(srcData < end) { - SET(dstData[0], srcData[0]); - dstData++; - srcData++; - } - - if (((int)length) & 0x2) { - SET16((*(FxU16*)&(dstData[0])), - (*(FxU16*)&(srcData[0]))); - dstData = (FxU32*)(((FxU16*)dstData) + 1); - srcData = (FxU32*)(((FxU16*)srcData) + 1); - } - - dstData = (FxU32*)(((char*)dstData)+dstJump); - srcData = (FxU32*)(((char*)srcData)+srcJump); - } - } else { - while(scanline--) { - end = (FxU32*)((char*)srcData + length - 2); - - SET16((*(FxU16*)&(dstData[0])), - (*(FxU16*)&(srcData[0]))); - dstData = (FxU32*)(((FxU16*)dstData) + 1); - srcData = (FxU32*)(((FxU16*)srcData) + 1); - - while(srcData < end) { - SET(dstData[0], srcData[0]); - dstData++; - srcData++; - } - - if (!(length & 0x2)) { - SET16((*(FxU16*)&(dstData[0])), - (*(FxU16*)&(srcData[0]))); - dstData = (FxU32*)(((FxU16*)dstData) + 1); - srcData = (FxU32*)(((FxU16*)srcData) + 1); - } - - dstData = (FxU32*)(((char*)dstData)+dstJump); - srcData = (FxU32*)(((char*)srcData)+srcJump); - } - } - break; - - /* 32-bit aligned */ - case GR_LFB_SRC_FMT_888: - case GR_LFB_SRC_FMT_8888: - case GR_LFB_SRC_FMT_565_DEPTH: - case GR_LFB_SRC_FMT_555_DEPTH: - case GR_LFB_SRC_FMT_1555_DEPTH: - dstData = ((FxU32*)dstData) + dst_x; - length = src_width * 4; - srcJump = src_stride - length; - dstJump = info.strideInBytes - length; - while(scanline--) { - end = (FxU32*)((char*)srcData + length); - while(srcData < end) { - SET(dstData[0], srcData[0]); - dstData++; - srcData++; - } - dstData = (FxU32*)(((char*)dstData)+dstJump); - srcData = (FxU32*)(((char*)srcData)+srcJump); - } - break; - - case GR_LFB_SRC_FMT_RLE16: - /* needs to be implemented */ - rv = FXFALSE; - break; - } - grLfbUnlock(GR_LFB_WRITE_ONLY, dst_buffer); - } else { - rv = FXFALSE; - } - - GR_RETURN(rv); -#undef FN_NAME -} /* _grLfbWriteRegion */ - -/*------------------------------------------------------------------- - Function: grLfbWriteRegion - Date: 3/5 - Implementor(s): jdt - Library: Glide - Description: - Write a pixel rectangle to the frame buffer as efficiently as possible - Arguments: - dst_buffer - buffer to which to copy data - dst_x,dst_y - destination image start coordinates - src_format - data format of source image - src_width, src_height - - dimensions of source image - src_stride - stride of source image in bytes, not meaningful - for RLE images - src_data - pointer to source data memory - Return: - FXTRUE succeed - FXFALSE fail - -------------------------------------------------------------------*/ -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -GR_ENTRY(grLfbWriteRegion, FxBool, (GrBuffer_t dst_buffer, - FxU32 dst_x, FxU32 dst_y, - GrLfbSrcFmt_t src_format, - FxU32 src_width, FxU32 src_height, - FxBool pixelPipeline, - FxI32 src_stride, void *src_data)) -#else -GR_ENTRY(grLfbWriteRegion, FxBool, (GrBuffer_t dst_buffer, - FxU32 dst_x, FxU32 dst_y, - GrLfbSrcFmt_t src_format, - FxU32 src_width, FxU32 src_height, - FxI32 src_stride, void *src_data)) -#endif -{ - FxBool rv = FXTRUE; - - GR_BEGIN_NOFIFOCHECK("grLfbWriteRegion",82); - GDBG_INFO_MORE(gc->myLevel, - "(0x%x,%d,%d,%d,%d,%d,%d,0x%x)\n", - dst_buffer, dst_x, dst_y, - src_format, src_width, src_height, - src_stride, src_data); - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) - if ((_GlideRoot.hwConfig.SSTs[_GlideRoot.current_sst].type == GR_SSTTYPE_SST96) && (pixelPipeline == FXTRUE)) - rv = FXFALSE; - else - rv = _grLfbWriteRegion(pixelPipeline, dst_buffer, dst_x, dst_y, - src_format, src_width, src_height, - src_stride, src_data); -#else - rv = _grLfbWriteRegion(FXFALSE, dst_buffer, dst_x, dst_y, - src_format, src_width, src_height, - src_stride, src_data); -#endif - - GR_RETURN(rv); -} /* grLfbWriteRegion */ - -/*------------------------------------------------------------------- - Function: grLfbReadRegion - Date: 3/12 - Implementor(s): jdt - Library: Glide - Description: - Grab a rectangle from the frame buffer into user supplied memory - Arguments: - src_buffer - buffer to read from - src_x - x coordinate of upper left corner rectangle to read - src_y - y coordinate of upper left corner of rectangle to read - src_width - width of rectangle to read - src_height - height of rectangle to read - dst_stride - distance between scanlines in destination buffer - dst_data - pointer to user memory in which to place image - Return: - FXTRUE - success - FXFALSE - failure - -------------------------------------------------------------------*/ -GR_ENTRY(grLfbReadRegion, FxBool, (GrBuffer_t src_buffer, - FxU32 src_x, FxU32 src_y, - FxU32 src_width, FxU32 src_height, - FxU32 dst_stride, void *dst_data)) -{ -#define FN_NAME "grLfbReadRegion" - FxBool rv = FXTRUE; - GrLfbInfo_t info; - - GR_BEGIN_NOFIFOCHECK("grLfbReadRegion",82); - GDBG_INFO_MORE(gc->myLevel, - "(0x%x,%d,%d,%d,%d,%d,0x%x)\n", - src_buffer, src_x, src_y, - src_width, src_height, dst_stride, dst_data); - - info.size = sizeof(info); - if (grLfbLock(GR_LFB_READ_ONLY, - src_buffer, - GR_LFBWRITEMODE_ANY, - GR_ORIGIN_UPPER_LEFT, - FXFALSE, - &info)) { - FxU32 *srcData; /* Tracking Source Pointer */ - FxU32 *dstData; /* Tracking Destination Pointer */ - FxU32 *end; /* Demarks End of each Scanline */ - FxU32 srcJump; /* bytes to next scanline */ - FxU32 dstJump; /* bytes to next scanline */ - FxU32 length; /* bytes to copy in scanline */ - FxU32 scanline; /* scanline number */ - int aligned; /* word aligned? */ - FxU32 odd; /* is src_y odd? (for sli) */ - - dstData = (FxU32 *) dst_data; - srcData = (FxU32 *) (((char*)info.lfbPtr)+ - (src_y*info.strideInBytes) + - (src_x<<1)); - scanline = src_height; - length = src_width * 2; - dstJump = dst_stride - length; - srcJump = info.strideInBytes - length; - aligned = !((int)srcData&0x2); - odd = (src_y+src_height) & 0x1; - - if (aligned) { - while(scanline--) { - end = (FxU32*)((char*)srcData + length - 2); - - while(srcData < end) { - *dstData++ = GR_GET(*srcData++); - } - - if (((int)length) & 0x2) { - (*(FxU16*)dstData) = GR_GET16(*srcData); - dstData = (FxU32*)(((FxU16*)dstData) + 1); - srcData = (FxU32*)(((FxU16*)srcData) + 1); - } - - dstData = (FxU32*)(((char*)dstData)+dstJump); - srcData = (FxU32*)(((char*)srcData)+srcJump); - } - } else { - while(scanline--) { - end = (FxU32*)((char*)srcData + length - 2); - - (*(FxU16*)dstData) = (FxU16)GR_GET16(*srcData); - dstData = (FxU32*)(((FxU16*)dstData) + 1); - srcData = (FxU32*)(((FxU16*)srcData) + 1); - - while(srcData < end) { - *dstData++ = GR_GET(*srcData++); - } - - if (!(((int)length) & 0x2)) { - (*(FxU16*)dstData) = GR_GET16(*srcData); - dstData = (FxU32*)(((FxU16*)dstData) + 1); - srcData = (FxU32*)(((FxU16*)srcData) + 1); - } - - dstData = (FxU32*)(((char*)dstData)+dstJump); - srcData = (FxU32*)(((char*)srcData)+srcJump); - } - } - grLfbUnlock(GR_LFB_READ_ONLY, src_buffer); - } else { - rv = FXFALSE; - } - GR_RETURN(rv); -#undef FN_NAME -}/* grLfbReadRegion */ - diff --git a/glide2x/h3/glide/src/glide.h b/glide2x/h3/glide/src/glide.h deleted file mode 100644 index 92775ab..0000000 --- a/glide2x/h3/glide/src/glide.h +++ /dev/null @@ -1,1527 +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 -*/ - -/* -** GLIDE.H -** -** The following #defines are relevant when using Glide: -** -** One of the following "platform constants" must be defined during -** compilation: -** -** __DOS__ Defined for 32-bit DOS applications -** __WIN32__ Defined for 32-bit Windows applications -** __sparc__ Defined for Sun Solaris/SunOS -** __linux__ Defined for Linux applications -** __IRIX__ Defined for SGI Irix applications -** -*/ -#ifndef __GLIDE_H__ -#define __GLIDE_H__ - -#include <3dfx.h> -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* -** ----------------------------------------------------------------------- -** TYPE DEFINITIONS -** ----------------------------------------------------------------------- -*/ -typedef FxU32 GrColor_t; -typedef FxU8 GrAlpha_t; -typedef FxU32 GrMipMapId_t; -typedef FxU8 GrFog_t; -typedef void (FX_CALL *GrProc)(); - -/* -** ----------------------------------------------------------------------- -** CONSTANTS AND TYPES -** ----------------------------------------------------------------------- -*/ -#define MAX_NUM_SST 4 -#define MAX_MIPMAPS_PER_SST 1024 - -#ifndef GLIDE_LIB -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -#define GR_FOG_TABLE_SIZE 128 -#else /* !(defined(GLIDE3) && defined(GLIDE3_ALPHA)) */ -#define GR_FOG_TABLE_SIZE 64 -#endif /* !(defined(GLIDE3) && defined(GLIDE3_ALPHA)) */ -#endif /* GLIDE_LIB */ - -#define GR_NULL_MIPMAP_HANDLE ((GrMipMapId_t) -1) -#define GR_ZDEPTHVALUE_NEAREST 0xFFFF -#define GR_ZDEPTHVALUE_FARTHEST 0x0000 -#define GR_WDEPTHVALUE_NEAREST 0x0000 -#define GR_WDEPTHVALUE_FARTHEST 0xFFFF - -#define GR_MIPMAPLEVELMASK_EVEN FXBIT(0) -#define GR_MIPMAPLEVELMASK_ODD FXBIT(1) -#define GR_MIPMAPLEVELMASK_BOTH (GR_MIPMAPLEVELMASK_EVEN | GR_MIPMAPLEVELMASK_ODD ) - -#define GR_LODBIAS_BILINEAR 0.5 -#define GR_LODBIAS_TRILINEAR 0.0 - -typedef FxI32 GrChipID_t; -#define GR_TMU0 0x0 -#define GR_TMU1 0x1 -#define GR_TMU2 0x2 -#define GR_FBI 0x3 - -typedef FxI32 GrCombineFunction_t; -#define GR_COMBINE_FUNCTION_ZERO 0x0 -#define GR_COMBINE_FUNCTION_NONE GR_COMBINE_FUNCTION_ZERO -#define GR_COMBINE_FUNCTION_LOCAL 0x1 -#define GR_COMBINE_FUNCTION_LOCAL_ALPHA 0x2 -#define GR_COMBINE_FUNCTION_SCALE_OTHER 0x3 -#define GR_COMBINE_FUNCTION_BLEND_OTHER GR_COMBINE_FUNCTION_SCALE_OTHER -#define GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL 0x4 -#define GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA 0x5 -#define GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL 0x6 -#define GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL 0x7 -#define GR_COMBINE_FUNCTION_BLEND GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL -#define GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL_ALPHA 0x8 -#define GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL 0x9 -#define GR_COMBINE_FUNCTION_BLEND_LOCAL GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL -#define GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA 0x10 - -typedef FxI32 GrCombineFactor_t; -#define GR_COMBINE_FACTOR_ZERO 0x0 -#define GR_COMBINE_FACTOR_NONE GR_COMBINE_FACTOR_ZERO -#define GR_COMBINE_FACTOR_LOCAL 0x1 -#define GR_COMBINE_FACTOR_OTHER_ALPHA 0x2 -#define GR_COMBINE_FACTOR_LOCAL_ALPHA 0x3 -#define GR_COMBINE_FACTOR_TEXTURE_ALPHA 0x4 -#define GR_COMBINE_FACTOR_TEXTURE_RGB 0x5 -#define GR_COMBINE_FACTOR_DETAIL_FACTOR GR_COMBINE_FACTOR_TEXTURE_ALPHA -#define GR_COMBINE_FACTOR_LOD_FRACTION 0x5 -#define GR_COMBINE_FACTOR_ONE 0x8 -#define GR_COMBINE_FACTOR_ONE_MINUS_LOCAL 0x9 -#define GR_COMBINE_FACTOR_ONE_MINUS_OTHER_ALPHA 0xa -#define GR_COMBINE_FACTOR_ONE_MINUS_LOCAL_ALPHA 0xb -#define GR_COMBINE_FACTOR_ONE_MINUS_TEXTURE_ALPHA 0xc -#define GR_COMBINE_FACTOR_ONE_MINUS_DETAIL_FACTOR GR_COMBINE_FACTOR_ONE_MINUS_TEXTURE_ALPHA -#define GR_COMBINE_FACTOR_ONE_MINUS_LOD_FRACTION 0xd - - -typedef FxI32 GrCombineLocal_t; -#define GR_COMBINE_LOCAL_ITERATED 0x0 -#define GR_COMBINE_LOCAL_CONSTANT 0x1 -#define GR_COMBINE_LOCAL_NONE GR_COMBINE_LOCAL_CONSTANT -#define GR_COMBINE_LOCAL_DEPTH 0x2 - -typedef FxI32 GrCombineOther_t; -#define GR_COMBINE_OTHER_ITERATED 0x0 -#define GR_COMBINE_OTHER_TEXTURE 0x1 -#define GR_COMBINE_OTHER_CONSTANT 0x2 -#define GR_COMBINE_OTHER_NONE GR_COMBINE_OTHER_CONSTANT - - -typedef FxI32 GrAlphaSource_t; -#define GR_ALPHASOURCE_CC_ALPHA 0x0 -#define GR_ALPHASOURCE_ITERATED_ALPHA 0x1 -#define GR_ALPHASOURCE_TEXTURE_ALPHA 0x2 -#define GR_ALPHASOURCE_TEXTURE_ALPHA_TIMES_ITERATED_ALPHA 0x3 - - -typedef FxI32 GrColorCombineFnc_t; -#define GR_COLORCOMBINE_ZERO 0x0 -#define GR_COLORCOMBINE_CCRGB 0x1 -#define GR_COLORCOMBINE_ITRGB 0x2 -#define GR_COLORCOMBINE_ITRGB_DELTA0 0x3 -#define GR_COLORCOMBINE_DECAL_TEXTURE 0x4 -#define GR_COLORCOMBINE_TEXTURE_TIMES_CCRGB 0x5 -#define GR_COLORCOMBINE_TEXTURE_TIMES_ITRGB 0x6 -#define GR_COLORCOMBINE_TEXTURE_TIMES_ITRGB_DELTA0 0x7 -#define GR_COLORCOMBINE_TEXTURE_TIMES_ITRGB_ADD_ALPHA 0x8 -#define GR_COLORCOMBINE_TEXTURE_TIMES_ALPHA 0x9 -#define GR_COLORCOMBINE_TEXTURE_TIMES_ALPHA_ADD_ITRGB 0xa -#define GR_COLORCOMBINE_TEXTURE_ADD_ITRGB 0xb -#define GR_COLORCOMBINE_TEXTURE_SUB_ITRGB 0xc -#define GR_COLORCOMBINE_CCRGB_BLEND_ITRGB_ON_TEXALPHA 0xd -#define GR_COLORCOMBINE_DIFF_SPEC_A 0xe -#define GR_COLORCOMBINE_DIFF_SPEC_B 0xf -#define GR_COLORCOMBINE_ONE 0x10 - -typedef FxI32 GrAlphaBlendFnc_t; -#define GR_BLEND_ZERO 0x0 -#define GR_BLEND_SRC_ALPHA 0x1 -#define GR_BLEND_SRC_COLOR 0x2 -#define GR_BLEND_DST_COLOR GR_BLEND_SRC_COLOR -#define GR_BLEND_DST_ALPHA 0x3 -#define GR_BLEND_ONE 0x4 -#define GR_BLEND_ONE_MINUS_SRC_ALPHA 0x5 -#define GR_BLEND_ONE_MINUS_SRC_COLOR 0x6 -#define GR_BLEND_ONE_MINUS_DST_COLOR GR_BLEND_ONE_MINUS_SRC_COLOR -#define GR_BLEND_ONE_MINUS_DST_ALPHA 0x7 -#define GR_BLEND_RESERVED_8 0x8 -#define GR_BLEND_RESERVED_9 0x9 -#define GR_BLEND_RESERVED_A 0xa -#define GR_BLEND_RESERVED_B 0xb -#define GR_BLEND_RESERVED_C 0xc -#define GR_BLEND_RESERVED_D 0xd -#define GR_BLEND_RESERVED_E 0xe -#define GR_BLEND_ALPHA_SATURATE 0xf -#define GR_BLEND_PREFOG_COLOR GR_BLEND_ALPHA_SATURATE - -typedef FxI32 GrAspectRatio_t; -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -//#define GLIDE3_DEBUG -#ifdef GLIDE3_DEBUG -#define GR_ASPECT_8x1 0x0 /* 8W x 1H */ -#define GR_ASPECT_4x1 0x1 /* 4W x 1H */ -#define GR_ASPECT_2x1 0x2 /* 2W x 1H */ -#define GR_ASPECT_1x1 0x3 /* 1W x 1H */ -#define GR_ASPECT_1x2 0x4 /* 1W x 2H */ -#define GR_ASPECT_1x4 0x5 /* 1W x 4H */ -#define GR_ASPECT_1x8 0x6 /* 1W x 8H */ -#else -#define GR_ASPECT_8x1 3 /* 8W x 1H */ -#define GR_ASPECT_4x1 2 /* 4W x 1H */ -#define GR_ASPECT_2x1 1 /* 2W x 1H */ -#define GR_ASPECT_1x1 0 /* 1W x 1H */ -#define GR_ASPECT_1x2 -1 /* 1W x 2H */ -#define GR_ASPECT_1x4 -2 /* 1W x 4H */ -#define GR_ASPECT_1x8 -3 /* 1W x 8H */ -#endif /* GLIDE3_DEBUG */ -#else -#define GR_ASPECT_8x1 0x0 /* 8W x 1H */ -#define GR_ASPECT_4x1 0x1 /* 4W x 1H */ -#define GR_ASPECT_2x1 0x2 /* 2W x 1H */ -#define GR_ASPECT_1x1 0x3 /* 1W x 1H */ -#define GR_ASPECT_1x2 0x4 /* 1W x 2H */ -#define GR_ASPECT_1x4 0x5 /* 1W x 4H */ -#define GR_ASPECT_1x8 0x6 /* 1W x 8H */ -#endif - -typedef FxI32 GrBuffer_t; -#define GR_BUFFER_FRONTBUFFER 0x0 -#define GR_BUFFER_BACKBUFFER 0x1 -#define GR_BUFFER_AUXBUFFER 0x2 -#define GR_BUFFER_DEPTHBUFFER 0x3 -#define GR_BUFFER_ALPHABUFFER 0x4 -#define GR_BUFFER_TRIPLEBUFFER 0x5 - -#ifdef CHRIS_DENIS_ANTHONY_HACK -#define GR_BUFFER_DENIS_HACK_ON 0x6 -#define GR_BUFFER_DENIS_HACK_OFF 0x7 -#endif - -typedef FxI32 GrChromakeyMode_t; -#define GR_CHROMAKEY_DISABLE 0x0 -#define GR_CHROMAKEY_ENABLE 0x1 - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -typedef FxI32 GrChromaRangeMode_t; -#define GR_CHROMARANGE_RGB_ANY 0x0 -#define GR_CHROMARANGE_RGb_ANY 0x1 -#define GR_CHROMARANGE_RgB_ANY 0x2 -#define GR_CHROMARANGE_Rgb_ANY 0x3 -#define GR_CHROMARANGE_rGB_ANY 0x4 -#define GR_CHROMARANGE_rGb_ANY 0x5 -#define GR_CHROMARANGE_rgB_ANY 0x6 -#define GR_CHROMARANGE_rgb_ANY 0x7 -#define GR_CHROMARANGE_RGB_ALL 0x8 -#define GR_CHROMARANGE_RGb_ALL 0x9 -#define GR_CHROMARANGE_RgB_ALL 0xa -#define GR_CHROMARANGE_Rgb_ALL 0xb -#define GR_CHROMARANGE_rGB_ALL 0xc -#define GR_CHROMARANGE_rGb_ALL 0xd -#define GR_CHROMARANGE_rgB_ALL 0xe -#define GR_CHROMARANGE_rgb_ALL 0xf -#endif - -typedef FxI32 GrCmpFnc_t; -#define GR_CMP_NEVER 0x0 -#define GR_CMP_LESS 0x1 -#define GR_CMP_EQUAL 0x2 -#define GR_CMP_LEQUAL 0x3 -#define GR_CMP_GREATER 0x4 -#define GR_CMP_NOTEQUAL 0x5 -#define GR_CMP_GEQUAL 0x6 -#define GR_CMP_ALWAYS 0x7 - -typedef FxI32 GrColorFormat_t; -#define GR_COLORFORMAT_ARGB 0x0 -#define GR_COLORFORMAT_ABGR 0x1 - -#define GR_COLORFORMAT_RGBA 0x2 -#define GR_COLORFORMAT_BGRA 0x3 - -typedef FxI32 GrCullMode_t; -#define GR_CULL_DISABLE 0x0 -#define GR_CULL_NEGATIVE 0x1 -#define GR_CULL_POSITIVE 0x2 - -typedef FxI32 GrDepthBufferMode_t; -#define GR_DEPTHBUFFER_DISABLE 0x0 -#define GR_DEPTHBUFFER_ZBUFFER 0x1 -#define GR_DEPTHBUFFER_WBUFFER 0x2 -#define GR_DEPTHBUFFER_ZBUFFER_COMPARE_TO_BIAS 0x3 -#define GR_DEPTHBUFFER_WBUFFER_COMPARE_TO_BIAS 0x4 - -typedef FxI32 GrDitherMode_t; -#define GR_DITHER_DISABLE 0x0 -#define GR_DITHER_2x2 0x1 -#define GR_DITHER_4x4 0x2 - -typedef FxI32 GrFogMode_t; -#define GR_FOG_DISABLE 0x0 -#define GR_FOG_WITH_ITERATED_ALPHA 0x1 -#define GR_FOG_WITH_TABLE 0x2 -#define GR_FOG_WITH_ITERATED_Z 0x3 /* Bug 735 */ -#define GR_FOG_MULT2 0x100 -#define GR_FOG_ADD2 0x200 - -typedef FxU32 GrLock_t; -#define GR_LFB_READ_ONLY 0x00 -#define GR_LFB_WRITE_ONLY 0x01 -#define GR_LFB_IDLE 0x00 -#define GR_LFB_NOIDLE 0x10 - -typedef FxI32 GrLfbBypassMode_t; -#define GR_LFBBYPASS_DISABLE 0x0 -#define GR_LFBBYPASS_ENABLE 0x1 - -typedef FxI32 GrLfbWriteMode_t; -#define GR_LFBWRITEMODE_565 0x0 /* RGB:RGB */ -#define GR_LFBWRITEMODE_555 0x1 /* RGB:RGB */ -#define GR_LFBWRITEMODE_1555 0x2 /* ARGB:ARGB */ -#define GR_LFBWRITEMODE_RESERVED1 0x3 -#define GR_LFBWRITEMODE_888 0x4 /* RGB */ -#define GR_LFBWRITEMODE_8888 0x5 /* ARGB */ -#define GR_LFBWRITEMODE_RESERVED2 0x6 -#define GR_LFBWRITEMODE_RESERVED3 0x7 -#define GR_LFBWRITEMODE_RESERVED4 0x8 -#define GR_LFBWRITEMODE_RESERVED5 0x9 -#define GR_LFBWRITEMODE_RESERVED6 0xa -#define GR_LFBWRITEMODE_RESERVED7 0xb -#define GR_LFBWRITEMODE_565_DEPTH 0xc /* RGB:DEPTH */ -#define GR_LFBWRITEMODE_555_DEPTH 0xd /* RGB:DEPTH */ -#define GR_LFBWRITEMODE_1555_DEPTH 0xe /* ARGB:DEPTH */ -#define GR_LFBWRITEMODE_ZA16 0xf /* DEPTH:DEPTH */ -#define GR_LFBWRITEMODE_ANY 0xFF - - -typedef FxI32 GrOriginLocation_t; -#define GR_ORIGIN_UPPER_LEFT 0x0 -#define GR_ORIGIN_LOWER_LEFT 0x1 -#define GR_ORIGIN_ANY 0xFF - -typedef struct { - int size; - void *lfbPtr; - FxU32 strideInBytes; - GrLfbWriteMode_t writeMode; - GrOriginLocation_t origin; -} GrLfbInfo_t; - -typedef FxI32 GrLOD_t; -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -#ifdef GLIDE3_DEBUG -#define GR_LOD_256 0x0 -#define GR_LOD_128 0x1 -#define GR_LOD_64 0x2 -#define GR_LOD_32 0x3 -#define GR_LOD_16 0x4 -#define GR_LOD_8 0x5 -#define GR_LOD_4 0x6 -#define GR_LOD_2 0x7 -#define GR_LOD_1 0x8 -#else -#define GR_LOD_256 0x8 -#define GR_LOD_128 0x7 -#define GR_LOD_64 0x6 -#define GR_LOD_32 0x5 -#define GR_LOD_16 0x4 -#define GR_LOD_8 0x3 -#define GR_LOD_4 0x2 -#define GR_LOD_2 0x1 -#define GR_LOD_1 0x0 -#endif /* GLIDE3_DEBUG */ -#else -#define GR_LOD_256 0x0 -#define GR_LOD_128 0x1 -#define GR_LOD_64 0x2 -#define GR_LOD_32 0x3 -#define GR_LOD_16 0x4 -#define GR_LOD_8 0x5 -#define GR_LOD_4 0x6 -#define GR_LOD_2 0x7 -#define GR_LOD_1 0x8 -#endif - -typedef FxI32 GrMipMapMode_t; -#define GR_MIPMAP_DISABLE 0x0 /* no mip mapping */ -#define GR_MIPMAP_NEAREST 0x1 /* use nearest mipmap */ -#define GR_MIPMAP_NEAREST_DITHER 0x2 /* GR_MIPMAP_NEAREST + LOD dith */ - - -typedef FxI32 GrSmoothingMode_t; -#define GR_SMOOTHING_DISABLE 0x0 -#define GR_SMOOTHING_ENABLE 0x1 - -typedef FxI32 GrTextureClampMode_t; -#define GR_TEXTURECLAMP_WRAP 0x0 -#define GR_TEXTURECLAMP_CLAMP 0x1 - -typedef FxI32 GrTextureCombineFnc_t; -#define GR_TEXTURECOMBINE_ZERO 0x0 /* texout = 0 */ -#define GR_TEXTURECOMBINE_DECAL 0x1 /* texout = texthis */ -#define GR_TEXTURECOMBINE_OTHER 0x2 /* this TMU in passthru mode */ -#define GR_TEXTURECOMBINE_ADD 0x3 /* tout = tthis + t(this+1) */ -#define GR_TEXTURECOMBINE_MULTIPLY 0x4 /* texout = tthis * t(this+1) */ -#define GR_TEXTURECOMBINE_SUBTRACT 0x5 /* Sutract from upstream TMU */ -#define GR_TEXTURECOMBINE_DETAIL 0x6 /* detail--detail on tthis */ -#define GR_TEXTURECOMBINE_DETAIL_OTHER 0x7 /* detail--detail on tthis+1 */ -#define GR_TEXTURECOMBINE_TRILINEAR_ODD 0x8 /* trilinear--odd levels tthis*/ -#define GR_TEXTURECOMBINE_TRILINEAR_EVEN 0x9 /*trilinear--even levels tthis*/ -#define GR_TEXTURECOMBINE_ONE 0xa /* texout = 0xFFFFFFFF */ - -typedef FxI32 GrTextureFilterMode_t; -#define GR_TEXTUREFILTER_POINT_SAMPLED 0x0 -#define GR_TEXTUREFILTER_BILINEAR 0x1 - -typedef FxI32 GrTextureFormat_t; -#define GR_TEXFMT_8BIT 0x0 -#define GR_TEXFMT_RGB_332 GR_TEXFMT_8BIT -#define GR_TEXFMT_YIQ_422 0x1 -#define GR_TEXFMT_ALPHA_8 0x2 /* (0..0xFF) alpha */ -#define GR_TEXFMT_INTENSITY_8 0x3 /* (0..0xFF) intensity */ -#define GR_TEXFMT_ALPHA_INTENSITY_44 0x4 -#define GR_TEXFMT_P_8 0x5 /* 8-bit palette */ -#define GR_TEXFMT_RSVD0 0x6 -#define GR_TEXFMT_RSVD1 0x7 -#define GR_TEXFMT_16BIT 0x8 -#define GR_TEXFMT_ARGB_8332 GR_TEXFMT_16BIT -#define GR_TEXFMT_AYIQ_8422 0x9 -#define GR_TEXFMT_RGB_565 0xa -#define GR_TEXFMT_ARGB_1555 0xb -#define GR_TEXFMT_ARGB_4444 0xc -#define GR_TEXFMT_ALPHA_INTENSITY_88 0xd -#define GR_TEXFMT_AP_88 0xe /* 8-bit alpha 8-bit palette */ -#define GR_TEXFMT_RSVD2 0xf - -typedef FxU32 GrTexTable_t; -#define GR_TEXTABLE_NCC0 0x0 -#define GR_TEXTABLE_NCC1 0x1 -#define GR_TEXTABLE_PALETTE 0x2 - -typedef FxU32 GrNCCTable_t; -#define GR_NCCTABLE_NCC0 0x0 -#define GR_NCCTABLE_NCC1 0x1 - -typedef FxU32 GrTexBaseRange_t; -#define GR_TEXBASE_256 0x0 -#define GR_TEXBASE_128 0x1 -#define GR_TEXBASE_64 0x2 -#define GR_TEXBASE_32_TO_1 0x3 - -#ifdef GLIDE3 - -#define GLIDE3_VERTEX_LAYOUT 1 - -typedef FxU32 GrEnableMode_t; -#define GR_MODE_DISABLE 0x0 -#define GR_MODE_ENABLE 0x1 - -#define GR_AA_ORDERED 0x01 -#define GR_ALLOW_MIPMAP_DITHER 0x02 -#define GR_SHAMELESS_PLUG 0x03 -#define GR_VIDEO_SMOOTHING 0x04 - -typedef FxU32 GrCoordinateSpaceMode_t; -#define GR_WINDOW_COORDS 0x00 -#define GR_CLIP_COORDS 0x01 - -#endif - -#ifdef GLIDE3 -#ifdef GLIDE3_ALPHA -#define GLIDE3_EXTRA_STATE 392 -#else -#define GLIDE3_EXTRA_STATE 216 -#endif -#else -#define GLIDE3_EXTRA_STATE 0 -#endif - -#define GLIDE_STATE_PAD_SIZE 312 + GLIDE3_EXTRA_STATE - -#ifdef GLIDE_LIB -typedef struct _GrState_s GrState; -#else -typedef struct _GrState_s { - char pad[GLIDE_STATE_PAD_SIZE]; -} GrState; -#endif - -#ifdef GLIDE3 -/* Types of data in strips */ -#define GR_FLOAT 0 -#define GR_U8 1 - -/* Parameters for strips */ -#define GR_PARAM_XY 0x01 -#define GR_PARAM_Z 0x02 -#define GR_PARAM_W 0x03 -#define GR_PARAM_Q 0x04 - -#define GR_PARAM_A 0x10 -#define GR_PARAM_A0 GR_PARAM_A -#define GR_PARAM_A1 GR_PARAM_A+1 -#define GR_PARAM_A2 GR_PARAM_A+2 -#define GR_PARAM_A3 GR_PARAM_A+3 -#define GR_PARAM_A4 GR_PARAM_A+4 -#define GR_PARAM_A5 GR_PARAM_A+5 -#define GR_PARAM_A6 GR_PARAM_A+6 -#define GR_PARAM_A7 GR_PARAM_A+7 - -#define GR_PARAM_RGB 0x20 -#define GR_PARAM_RGB0 GR_PARAM_RGB -#define GR_PARAM_RGB1 GR_PARAM_RGB+1 -#define GR_PARAM_RGB2 GR_PARAM_RGB+2 -#define GR_PARAM_RGB3 GR_PARAM_RGB+3 -#define GR_PARAM_RGB4 GR_PARAM_RGB+4 -#define GR_PARAM_RGB5 GR_PARAM_RGB+5 -#define GR_PARAM_RGB6 GR_PARAM_RGB+6 -#define GR_PARAM_RGB7 GR_PARAM_RGB+7 - -#define GR_PARAM_PARGB 0x30 -#define GR_PARAM_PARGB0 GR_PARAM_PARGB -#define GR_PARAM_PARGB1 GR_PARAM_PARGB+1 -#define GR_PARAM_PARGB2 GR_PARAM_PARGB+2 -#define GR_PARAM_PARGB3 GR_PARAM_PARGB+3 -#define GR_PARAM_PARGB4 GR_PARAM_PARGB+4 -#define GR_PARAM_PARGB5 GR_PARAM_PARGB+5 -#define GR_PARAM_PARGB6 GR_PARAM_PARGB+6 -#define GR_PARAM_PARGB7 GR_PARAM_PARGB+7 - -#define GR_PARAM_ST0 0x40 -#define GR_PARAM_ST1 GR_PARAM_ST0+1 -#define GR_PARAM_ST2 GR_PARAM_ST0+2 -#define GR_PARAM_ST3 GR_PARAM_ST0+3 -#define GR_PARAM_ST4 GR_PARAM_ST0+4 -#define GR_PARAM_ST5 GR_PARAM_ST0+5 -#define GR_PARAM_ST6 GR_PARAM_ST0+6 -#define GR_PARAM_ST7 GR_PARAM_ST0+7 - -#define GR_PARAM_Q0 0x50 -#define GR_PARAM_Q1 GR_PARAM_Q0+1 -#define GR_PARAM_Q2 GR_PARAM_Q0+2 -#define GR_PARAM_Q3 GR_PARAM_Q0+3 -#define GR_PARAM_Q4 GR_PARAM_Q0+4 -#define GR_PARAM_Q5 GR_PARAM_Q0+5 -#define GR_PARAM_Q6 GR_PARAM_Q0+6 -#define GR_PARAM_Q7 GR_PARAM_Q0+7 - -#define GR_PARAM_DISABLE 0x00 -#define GR_PARAM_ENABLE 0x01 - -/* Componenets for strips */ -/* vertex */ -#define GR_VERTEX_XYZ 3 -#define GR_VERTEX_XYZW 4 -/* Color */ -#define GR_COLOR_RGB 3 -#define GR_COLOR_RGBA 4 -/* Texture */ -#define GR_TEX_NONE 0 -#define GR_TEX_ST 2 -#define GR_TEX_STW 3 - -/* grDrawVertexArray primitive type */ -#define GR_POINTS 0 -#define GR_LINE_STRIP 1 -#define GR_LINES 2 -#define GR_POLYGON 3 -#define GR_TRIANGLE_STRIP 4 -#define GR_TRIANGLE_FAN 5 -#define GR_TRIANGLES 6 - - -/* Stuff for grGet/grReset */ -#define GR_BITS_DEPTH 0x01 -#define GR_BITS_RGBA 0x02 -#define GR_FIFO_FULLNESS 0x03 -#define GR_FOG_TABLE_ENTRIES 0x04 -#define GR_GAMMA_TABLE_ENTRIES 0x05 -#define GR_IS_BUSY 0x06 -#define GR_LFB_PIXEL_PIPE 0x07 -#define GR_MAX_TEXTURE_SIZE 0x08 -#define GR_MAX_TEXTURE_ASPECT_RATIO 0x09 -#define GR_MEMORY_FB 0x0a -#define GR_MEMORY_TMU 0x0b -#define GR_MEMORY_UMA 0x0c -#define GR_NUM_BOARDS 0x0d -#define GR_NUM_POWER_OF_TWO_TEXTURES 0x0e -#define GR_NUM_FB 0x0f -#define GR_NUM_TMU 0x10 -#define GR_PENDING_BUFFERSWAPS 0x11 -#define GR_REVISION_FB 0x12 -#define GR_REVISION_TMU 0x13 -#define GR_STATS_LINES 0x14 /* grSet/grReset */ -#define GR_STATS_PIXELS_AFUNC_FAIL 0x15 -#define GR_STATS_PIXELS_CHROMA_FAIL 0x16 -#define GR_STATS_PIXELS_DEPTHFUNC_FAIL 0x17 -#define GR_STATS_PIXELS_IN 0x18 -#define GR_STATS_PIXELS_OUT 0x19 -#define GR_STATS_PIXELS 0x1a /* grReset */ -#define GR_STATS_POINTS 0x1b /* grSet/grReset */ -#define GR_STATS_TRIANGLES_IN 0x1c -#define GR_STATS_TRIANGLES_OUT 0x1d -#define GR_STATS_TRIANGLES 0x1e /* grReset */ -#define GR_SWAP_HISTORY 0x1f -#define GR_TEXTURE_ALIGN 0x20 -#define GR_VIDEO_POSITION 0x21 -#define GR_VIEWPORT 0x22 -#define GR_WDEPTH_MIN_MAX 0x23 -#define GR_ZDEPTH_MIN_MAX 0x24 - -/* stuff for grGetString */ -#define GR_EXTENSION 0xa0 -#define GR_HARDWARE 0xa1 -#define GR_RENDERER 0xa2 -#define GR_VENDOR 0xa3 -#define GR_VERSION 0xa4 - -#endif - -/* -** ----------------------------------------------------------------------- -** STRUCTURES -** ----------------------------------------------------------------------- -*/ - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -#ifdef GLIDE3_DEBUG -typedef struct { - GrLOD_t smallLod; - GrLOD_t largeLod; - GrAspectRatio_t aspectRatio; - GrTextureFormat_t format; - void *data; -} GrTexInfo; -#else -typedef struct { - GrLOD_t smallLodLog2; - GrLOD_t largeLodLog2; - GrAspectRatio_t aspectRatioLog2; - GrTextureFormat_t format; - void *data; -} GrTexInfo; -#endif /* GLIDE3_DEBUG */ -#else -typedef struct { - GrLOD_t smallLod; - GrLOD_t largeLod; - GrAspectRatio_t aspectRatio; - GrTextureFormat_t format; - void *data; -} GrTexInfo; -#endif - -#ifndef 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; - -typedef struct -{ - int sst; /* SST where this texture map was stored */ - FxBool valid; /* set when this table entry is allocated*/ - int width, height; - GrAspectRatio_t aspect_ratio; /* aspect ratio of the mip map. */ - void *data; /* actual texture data */ - - GrTextureFormat_t format; /* format of the texture table */ - GrMipMapMode_t mipmap_mode; /* mip map mode for this texture */ - GrTextureFilterMode_t magfilter_mode; /* filtering to be used when magnified */ - GrTextureFilterMode_t minfilter_mode; /* filtering to be used with minified */ - GrTextureClampMode_t s_clamp_mode; /* how this texture should be clamped in s */ - GrTextureClampMode_t t_clamp_mode; /* how this texture should be clamped in t */ - FxU32 tLOD; /* Register value for tLOD register */ - FxU32 tTextureMode; /* Register value for tTextureMode register - not including non-texture specific bits */ - FxU32 lod_bias; /* LOD bias of the mip map in preshifted 4.2*/ - GrLOD_t lod_min, lod_max; /* largest and smallest levels of detail */ - int tmu; /* tmu on which this texture resides */ - FxU32 odd_even_mask; /* mask specifying levels on this tmu */ - FxU32 tmu_base_address; /* base addr (in TMU mem) of this texture */ - FxBool trilinear; /* should we blend by lod? */ - - GuNccTable ncc_table; /* NCC compression table (optional) */ -} GrMipMapInfo; -#endif - -typedef int GrSstType; -#define GR_SSTTYPE_VOODOO 0 -#define GR_SSTTYPE_SST96 1 -#define GR_SSTTYPE_AT3D 2 -#define GR_SSTTYPE_Voodoo2 3 -#define GR_SSTTYPE_Banshee 4 - -typedef struct GrTMUConfig_St { - int tmuRev; /* Rev of Texelfx chip */ - int tmuRam; /* 1, 2, or 4 MB */ -} GrTMUConfig_t; - -typedef struct GrVoodooConfig_St { - int fbRam; /* 1, 2, or 4 MB */ - int fbiRev; /* Rev of Pixelfx chip */ - int nTexelfx; /* How many texelFX chips are there? */ - FxBool sliDetect; /* Is it a scan-line interleaved board? */ - GrTMUConfig_t tmuConfig[GLIDE_NUM_TMU]; /* Configuration of the Texelfx chips */ -} GrVoodooConfig_t; - -typedef struct GrSst96Config_St { - int fbRam; /* How much? */ - int nTexelfx; - GrTMUConfig_t tmuConfig; -} GrSst96Config_t; - -typedef GrVoodooConfig_t GrVoodoo2Config_t; - -typedef struct GrAT3DConfig_St { - int rev; -} GrAT3DConfig_t; - -typedef struct { - int num_sst; /* # of HW units in the system */ - struct { - GrSstType type; /* Which hardware is it? */ - union SstBoard_u { - GrVoodooConfig_t VoodooConfig; - GrSst96Config_t SST96Config; - GrAT3DConfig_t AT3DConfig; - GrVoodoo2Config_t Voodoo2Config; - } sstBoard; - } SSTs[MAX_NUM_SST]; /* configuration for each board */ -} GrHwConfiguration; - -typedef struct GrSstPerfStats_s { - FxU32 pixelsIn; /* # pixels processed (minus buffer clears) */ - FxU32 chromaFail; /* # pixels not drawn due to chroma key */ - FxU32 zFuncFail; /* # pixels not drawn due to Z comparison */ - FxU32 aFuncFail; /* # pixels not drawn due to alpha comparison */ - FxU32 pixelsOut; /* # pixels drawn (including buffer clears) */ -} GrSstPerfStats_t; - - -typedef struct { - float sow; /* s texture ordinate (s over w) */ - float tow; /* t texture ordinate (t over w) */ - float oow; /* 1/w (used mipmapping - really 0xfff/w) */ -} GrTmuVertex; - -/* -** GrVertex -** If these are changed the C & assembly language trisetup routines MUST -** be changed, for they will no longer work. -*/ -#if !GLIDE3_VERTEX_LAYOUT -typedef struct -{ - float x, y, z; /* X, Y, and Z of scrn space -- Z is ignored */ - float r, g, b; /* R, G, B, ([0..255.0]) */ - float ooz; /* 65535/Z (used for Z-buffering) */ - float a; /* Alpha [0..255.0] */ - float oow; /* 1/W (used for W-buffering, texturing) */ - GrTmuVertex tmuvtx[GLIDE_NUM_TMU]; -} GrVertex; - -#define GR_VERTEX_X_OFFSET 0 -#define GR_VERTEX_Y_OFFSET 1 -#define GR_VERTEX_Z_OFFSET 2 -#define GR_VERTEX_R_OFFSET 3 -#define GR_VERTEX_G_OFFSET 4 -#define GR_VERTEX_B_OFFSET 5 -#define GR_VERTEX_OOZ_OFFSET 6 -#define GR_VERTEX_A_OFFSET 7 -#define GR_VERTEX_OOW_OFFSET 8 - -#else /* GLIDE3_VERTEX_LAYOUT */ -typedef struct -{ - float x, y; /* X and Y in screen space */ - float ooz; /* 65535/Z (used for Z-buffering) */ - float oow; /* 1/W (used for W-buffering, texturing) */ - float r, g, b, a; /* R, G, B, A [0..255.0] */ - float z; /* Z is ignored */ - GrTmuVertex tmuvtx[GLIDE_NUM_TMU]; -} GrVertex; - -#define GR_VERTEX_X_OFFSET 0 -#define GR_VERTEX_Y_OFFSET 1 -#define GR_VERTEX_OOZ_OFFSET 2 -#define GR_VERTEX_OOW_OFFSET 3 -#define GR_VERTEX_R_OFFSET 4 -#define GR_VERTEX_G_OFFSET 5 -#define GR_VERTEX_B_OFFSET 6 -#define GR_VERTEX_A_OFFSET 7 -#define GR_VERTEX_Z_OFFSET 8 - -#endif /* GLIDE3_VERTEX_LAYOUT */ - -#define GR_VERTEX_SOW_TMU0_OFFSET 9 -#define GR_VERTEX_TOW_TMU0_OFFSET 10 -#define GR_VERTEX_OOW_TMU0_OFFSET 11 -#define GR_VERTEX_SOW_TMU1_OFFSET 12 -#define GR_VERTEX_TOW_TMU1_OFFSET 13 -#define GR_VERTEX_OOW_TMU1_OFFSET 14 - -#if (GLIDE_NUM_TMU > 2) -#define GR_VERTEX_SOW_TMU2_OFFSET 15 -#define GR_VERTEX_TOW_TMU2_OFFSET 16 -#define GR_VERTEX_OOW_TMU2_OFFSET 17 -#endif - -typedef FxU32 GrLfbSrcFmt_t; -#define GR_LFB_SRC_FMT_565 0x00 -#define GR_LFB_SRC_FMT_555 0x01 -#define GR_LFB_SRC_FMT_1555 0x02 -#define GR_LFB_SRC_FMT_888 0x04 -#define GR_LFB_SRC_FMT_8888 0x05 -#define GR_LFB_SRC_FMT_565_DEPTH 0x0c -#define GR_LFB_SRC_FMT_555_DEPTH 0x0d -#define GR_LFB_SRC_FMT_1555_DEPTH 0x0e -#define GR_LFB_SRC_FMT_ZA16 0x0f -#define GR_LFB_SRC_FMT_RLE16 0x80 - -typedef FxI32 GrPassthruMode_t; -#define GR_PASSTHRU_SHOW_VGA 0x0 -#define GR_PASSTHRU_SHOW_SST1 0x1 - -typedef FxU32 GrHint_t; -#define GR_HINTTYPE_MIN 0 -#define GR_HINT_STWHINT 0 -#define GR_HINT_FIFOCHECKHINT 1 -#define GR_HINT_FPUPRECISION 2 -#define GR_HINT_ALLOW_MIPMAP_DITHER 3 -#define GR_HINTTYPE_MAX 3 -#ifdef H3D -#define GR_HINT_H3DENABLE 4 -#undef GR_HINTTYPE_MAX -#define GR_HINTTYPE_MAX 4 -#endif - -typedef FxU32 GrSTWHint_t; -#define GR_STWHINT_W_DIFF_FBI FXBIT(0) -#define GR_STWHINT_W_DIFF_TMU0 FXBIT(1) -#define GR_STWHINT_ST_DIFF_TMU0 FXBIT(2) -#define GR_STWHINT_W_DIFF_TMU1 FXBIT(3) -#define GR_STWHINT_ST_DIFF_TMU1 FXBIT(4) -#define GR_STWHINT_W_DIFF_TMU2 FXBIT(5) -#define GR_STWHINT_ST_DIFF_TMU2 FXBIT(6) - -typedef FxU32 GrControl_t; -#define GR_CONTROL_ACTIVATE 0x1 -#define GR_CONTROL_DEACTIVATE 0x2 -#define GR_CONTROL_RESIZE 0x3 -#define GR_CONTROL_MOVE 0x4 - -#define GR_GENERATE_FIFOCHECK_HINT_MASK(swHWM, swLWM) \ - (((swHWM & 0xffff) << 16) | (swLWM & 0xffff)) - -/* -** ----------------------------------------------------------------------- -** FUNCTION PROTOTYPES -** ----------------------------------------------------------------------- -*/ -#ifndef FX_GLIDE_NO_FUNC_PROTO -/* -** rendering functions -*/ - -#ifndef GLIDE3_ALPHA - -FX_ENTRY void FX_CALL -grDrawPlanarPolygon( int nverts, const int ilist[], const GrVertex vlist[] ); - -FX_ENTRY void FX_CALL -grDrawPlanarPolygonVertexList( int nverts, const GrVertex vlist[] ); - -FX_ENTRY void FX_CALL -grDrawPolygon( int nverts, const int ilist[], const GrVertex vlist[] ); - -FX_ENTRY void FX_CALL -grDrawPolygonVertexList( int nverts, const GrVertex vlist[] ); - -#endif /* !GLIDE3_ALPHA */ - -#ifdef GLIDE3 -FX_ENTRY void FX_CALL -grDrawPoint( void *pt ); - -FX_ENTRY void FX_CALL -grDrawLine( void *v1, void *v2 ); - -FX_ENTRY void FX_CALL -grDrawTriangle( void *a, void *b, void *c ); - -#else -FX_ENTRY void FX_CALL -grDrawPoint( const GrVertex *pt ); - -FX_ENTRY void FX_CALL -grDrawLine( const GrVertex *v1, const GrVertex *v2 ); - -FX_ENTRY void FX_CALL -grDrawTriangle( const GrVertex *a, const GrVertex *b, const GrVertex *c ); -#endif - -/* -** buffer management -*/ -FX_ENTRY void FX_CALL -grBufferClear( GrColor_t color, GrAlpha_t alpha, FxU16 depth ); - -#ifndef GLIDE3_ALPHA -FX_ENTRY int FX_CALL -grBufferNumPending( void ); -#endif /* !GLIDE3_ALPHA */ - -FX_ENTRY void FX_CALL -grBufferSwap( int swap_interval ); - -FX_ENTRY void FX_CALL -grRenderBuffer( GrBuffer_t buffer ); - -/* -** error management -*/ -typedef void (*GrErrorCallbackFnc_t)( const char *string, FxBool fatal ); - -FX_ENTRY void FX_CALL -grErrorSetCallback( GrErrorCallbackFnc_t fnc ); - -/* -** SST routines -*/ -#ifdef GLIDE3 -FX_ENTRY void FX_CALL -grFinish(void); -#endif - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -FX_ENTRY void FX_CALL -grFlush(void); -#endif - -#ifndef GLIDE3_ALPHA -FX_ENTRY void FX_CALL -grSstIdle(void); - -FX_ENTRY FxU32 FX_CALL -grSstVideoLine( void ); - -FX_ENTRY FxBool FX_CALL -grSstVRetraceOn( void ); - -FX_ENTRY FxBool FX_CALL -grSstIsBusy( void ); -#endif /* !GLIDE3_ALPHA */ - -FX_ENTRY FxBool FX_CALL -grSstWinOpen( - FxU32 hWnd, - GrScreenResolution_t screen_resolution, - GrScreenRefresh_t refresh_rate, - GrColorFormat_t color_format, - GrOriginLocation_t origin_location, - int nColBuffers, - int nAuxBuffers); - -FX_ENTRY void FX_CALL -grSstWinClose( void ); - -FX_ENTRY FxBool FX_CALL -grSstControl( FxU32 code ); - -#ifndef GLIDE3_ALPHA -FX_ENTRY FxBool FX_CALL -grSstQueryHardware( GrHwConfiguration *hwconfig ); - -FX_ENTRY FxBool FX_CALL -grSstQueryBoards( GrHwConfiguration *hwconfig ); -#endif /* !GLIDE3_ALPHA */ - -FX_ENTRY void FX_CALL -grSstOrigin(GrOriginLocation_t origin); - -FX_ENTRY void FX_CALL -grSstSelect( int which_sst ); - -#ifndef GLIDE3_ALPHA -FX_ENTRY FxU32 FX_CALL -grSstScreenHeight( void ); - -FX_ENTRY FxU32 FX_CALL -grSstScreenWidth( void ); - -FX_ENTRY FxU32 FX_CALL -grSstStatus( void ); -#endif /* !GLIDE3_ALPHA */ - -/* -** Drawing Statistics -*/ -#ifndef GLIDE3_ALPHA -FX_ENTRY void FX_CALL -grSstPerfStats(GrSstPerfStats_t *pStats); - -FX_ENTRY void FX_CALL -grSstResetPerfStats(void); -#endif /* !GLIDE3_ALPHA */ - -FX_ENTRY void FX_CALL -grResetTriStats(); - -FX_ENTRY void FX_CALL -grTriStats(FxU32 *trisProcessed, FxU32 *trisDrawn); - -/* -** Glide configuration and special effect maintenance functions -*/ -FX_ENTRY void FX_CALL -grAlphaBlendFunction( - GrAlphaBlendFnc_t rgb_sf, GrAlphaBlendFnc_t rgb_df, - GrAlphaBlendFnc_t alpha_sf, GrAlphaBlendFnc_t alpha_df - ); - -FX_ENTRY void FX_CALL -grAlphaCombine( - GrCombineFunction_t function, GrCombineFactor_t factor, - GrCombineLocal_t local, GrCombineOther_t other, - FxBool invert - ); - -FX_ENTRY void FX_CALL -grAlphaControlsITRGBLighting( FxBool enable ); - -FX_ENTRY void FX_CALL -grAlphaTestFunction( GrCmpFnc_t function ); - -FX_ENTRY void FX_CALL -grAlphaTestReferenceValue( GrAlpha_t value ); - -FX_ENTRY void FX_CALL -grChromakeyMode( GrChromakeyMode_t mode ); - -FX_ENTRY void FX_CALL -grChromakeyValue( GrColor_t value ); - -FX_ENTRY void FX_CALL -grClipWindow( FxU32 minx, FxU32 miny, FxU32 maxx, FxU32 maxy ); - -FX_ENTRY void FX_CALL -grColorCombine( - GrCombineFunction_t function, GrCombineFactor_t factor, - GrCombineLocal_t local, GrCombineOther_t other, - FxBool invert ); - -FX_ENTRY void FX_CALL -grColorMask( FxBool rgb, FxBool a ); - -FX_ENTRY void FX_CALL -grCullMode( GrCullMode_t mode ); - -FX_ENTRY void FX_CALL -grConstantColorValue( GrColor_t value ); - -FX_ENTRY void FX_CALL -grConstantColorValue4( float a, float r, float g, float b ); - -FX_ENTRY void FX_CALL -grDepthBiasLevel( FxI16 level ); - -FX_ENTRY void FX_CALL -grDepthBufferFunction( GrCmpFnc_t function ); - -FX_ENTRY void FX_CALL -grDepthBufferMode( GrDepthBufferMode_t mode ); - -FX_ENTRY void FX_CALL -grDepthMask( FxBool mask ); - -FX_ENTRY void FX_CALL -grDisableAllEffects( void ); - -FX_ENTRY void FX_CALL -grDitherMode( GrDitherMode_t mode ); - -FX_ENTRY void FX_CALL -grFogColorValue( GrColor_t fogcolor ); - -FX_ENTRY void FX_CALL -grFogMode( GrFogMode_t mode ); - -FX_ENTRY void FX_CALL -grFogTable( const GrFog_t ft[] ); - -FX_ENTRY void FX_CALL -grGammaCorrectionValue( float value ); - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -FX_ENTRY void FX_CALL -grLoadGammaTable( FxU32 nentries, FxU32 *red, FxU32 *green, FxU32 *blue); -#endif - -#ifdef DIAG_BUILD -FX_ENTRY void FX_CALL -grSplashCb(float x, float y, float width, float height, FxU32 frame, - void (*fn)(int)); -#endif - -FX_ENTRY void FX_CALL -grSplash(float x, float y, float width, float height, FxU32 frame); - -#ifdef GLIDE3 -FX_ENTRY FxBool FX_CALL -grGet( FxU32 pname, FxU32 plength, FxI32 *params ); - -FX_ENTRY const char * FX_CALL -grGetString( FxU32 pname ); - -FX_ENTRY FxBool FX_CALL -grReset( FxU32 what ); - -FX_ENTRY GrProc FX_CALL -grGetProcAddress( char *procName ); - -FX_ENTRY void FX_CALL -grEnable( GrEnableMode_t mode ); - -FX_ENTRY void FX_CALL -grDisable( GrEnableMode_t mode ); - -FX_ENTRY void FX_CALL -grCoordinateSpace( GrCoordinateSpaceMode_t mode ); - -FX_ENTRY void FX_CALL -grDepthRange( FxFloat n, FxFloat f ); - -FX_ENTRY void FX_CALL -grViewport( FxI32 x, FxI32 y, FxI32 width, FxI32 height ); - -#endif -/* -** texture mapping control functions -*/ -FX_ENTRY FxU32 FX_CALL -grTexCalcMemRequired( - GrLOD_t lodmin, GrLOD_t lodmax, - GrAspectRatio_t aspect, GrTextureFormat_t fmt); - -FX_ENTRY FxU32 FX_CALL -grTexTextureMemRequired( FxU32 evenOdd, - GrTexInfo *info ); - -FX_ENTRY FxU32 FX_CALL -grTexMinAddress( GrChipID_t tmu ); - - -FX_ENTRY FxU32 FX_CALL -grTexMaxAddress( GrChipID_t tmu ); - - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -FX_ENTRY void FX_CALL -grTexNCCTable( GrNCCTable_t table ); -#else -FX_ENTRY void FX_CALL -grTexNCCTable( GrChipID_t tmu, GrNCCTable_t table ); -#endif - -FX_ENTRY void FX_CALL -grTexSource( GrChipID_t tmu, - FxU32 startAddress, - FxU32 evenOdd, - GrTexInfo *info ); - -FX_ENTRY void FX_CALL -grTexClampMode( - GrChipID_t tmu, - GrTextureClampMode_t s_clampmode, - GrTextureClampMode_t t_clampmode - ); - -FX_ENTRY void FX_CALL -grTexCombine( - GrChipID_t tmu, - GrCombineFunction_t rgb_function, - GrCombineFactor_t rgb_factor, - GrCombineFunction_t alpha_function, - GrCombineFactor_t alpha_factor, - FxBool rgb_invert, - FxBool alpha_invert - ); - -#ifndef GLIDE3_ALPHA -FX_ENTRY void FX_CALL -grTexCombineFunction( - GrChipID_t tmu, - GrTextureCombineFnc_t fnc - ); -#endif - -FX_ENTRY void FX_CALL -grTexDetailControl( - GrChipID_t tmu, - int lod_bias, - FxU8 detail_scale, - float detail_max - ); - -FX_ENTRY void FX_CALL -grTexFilterMode( - GrChipID_t tmu, - GrTextureFilterMode_t minfilter_mode, - GrTextureFilterMode_t magfilter_mode - ); - - -FX_ENTRY void FX_CALL -grTexLodBiasValue(GrChipID_t tmu, float bias ); - -FX_ENTRY void FX_CALL -grTexDownloadMipMap( GrChipID_t tmu, - FxU32 startAddress, - FxU32 evenOdd, - GrTexInfo *info ); - -FX_ENTRY void FX_CALL -grTexDownloadMipMapLevel( GrChipID_t tmu, - FxU32 startAddress, - GrLOD_t thisLod, - GrLOD_t largeLod, - GrAspectRatio_t aspectRatio, - GrTextureFormat_t format, - FxU32 evenOdd, - void *data ); - -FX_ENTRY void FX_CALL -grTexDownloadMipMapLevelPartial( GrChipID_t tmu, - FxU32 startAddress, - GrLOD_t thisLod, - GrLOD_t largeLod, - GrAspectRatio_t aspectRatio, - GrTextureFormat_t format, - FxU32 evenOdd, - void *data, - int start, - int end ); - - -FX_ENTRY void FX_CALL -ConvertAndDownloadRle( 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); - -FX_ENTRY void FX_CALL -grCheckForRoom(FxI32 n); - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -FX_ENTRY void FX_CALL -grTexDownloadTable( GrTexTable_t type, - void *data ); - -FX_ENTRY void FX_CALL -grTexDownloadTablePartial( GrTexTable_t type, - void *data, - int start, - int end ); -#else -FX_ENTRY void FX_CALL -grTexDownloadTable( GrChipID_t tmu, - GrTexTable_t type, - void *data ); - -FX_ENTRY void FX_CALL -grTexDownloadTablePartial( GrChipID_t tmu, - GrTexTable_t type, - void *data, - int start, - int end ); -#endif - -FX_ENTRY void FX_CALL -grTexMipMapMode( GrChipID_t tmu, - GrMipMapMode_t mode, - FxBool lodBlend ); - -FX_ENTRY void FX_CALL -grTexMultibase( GrChipID_t tmu, - FxBool enable ); - -FX_ENTRY void FX_CALL -grTexMultibaseAddress( GrChipID_t tmu, - GrTexBaseRange_t range, - FxU32 startAddress, - FxU32 evenOdd, - GrTexInfo *info ); - -/* -** utility texture functions -*/ - -#ifndef GLIDE3_ALPHA -FX_ENTRY GrMipMapId_t FX_CALL -guTexAllocateMemory( - GrChipID_t tmu, - FxU8 odd_even_mask, - 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 minfilter_mode, - GrTextureFilterMode_t magfilter_mode, - float lod_bias, - FxBool trilinear - ); - -FX_ENTRY FxBool FX_CALL -guTexChangeAttributes( - 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 - ); - -FX_ENTRY void FX_CALL -guTexCombineFunction( - GrChipID_t tmu, - GrTextureCombineFnc_t fnc - ); - -FX_ENTRY GrMipMapId_t FX_CALL -guTexGetCurrentMipMap( GrChipID_t tmu ); - -FX_ENTRY GrMipMapInfo * FX_CALL -guTexGetMipMapInfo( GrMipMapId_t mmid ); - -FX_ENTRY FxU32 FX_CALL -guTexMemQueryAvail( GrChipID_t tmu ); - -FX_ENTRY void FX_CALL -guTexMemReset( void ); - -FX_ENTRY void FX_CALL -guTexDownloadMipMap( - GrMipMapId_t mmid, - const void *src, - const GuNccTable *table - ); - -FX_ENTRY void FX_CALL -guTexDownloadMipMapLevel( - GrMipMapId_t mmid, - GrLOD_t lod, - const void **src - ); -FX_ENTRY void FX_CALL -guTexSource( GrMipMapId_t id ); -#endif /* !GLIDE3_ALPHA */ - -/* -** linear frame buffer functions -*/ - -FX_ENTRY FxBool FX_CALL -grLfbLock( GrLock_t type, GrBuffer_t buffer, GrLfbWriteMode_t writeMode, - GrOriginLocation_t origin, FxBool pixelPipeline, - GrLfbInfo_t *info ); - -FX_ENTRY FxBool FX_CALL -grLfbUnlock( GrLock_t type, GrBuffer_t buffer ); - -FX_ENTRY void FX_CALL -grLfbConstantAlpha( GrAlpha_t alpha ); - -FX_ENTRY void FX_CALL -grLfbConstantDepth( FxU16 depth ); - -FX_ENTRY void FX_CALL -grLfbWriteColorSwizzle(FxBool swizzleBytes, FxBool swapWords); - -FX_ENTRY void FX_CALL -grLfbWriteColorFormat(GrColorFormat_t colorFormat); - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -FX_ENTRY FxBool FX_CALL -grLfbWriteRegion( GrBuffer_t dst_buffer, - FxU32 dst_x, FxU32 dst_y, - GrLfbSrcFmt_t src_format, - FxU32 src_width, FxU32 src_height, - FxBool pixelPipeline, - FxI32 src_stride, void *src_data ); -#else -FX_ENTRY FxBool FX_CALL -grLfbWriteRegion( GrBuffer_t dst_buffer, - FxU32 dst_x, FxU32 dst_y, - GrLfbSrcFmt_t src_format, - FxU32 src_width, FxU32 src_height, - FxI32 src_stride, void *src_data ); -#endif - -FX_ENTRY FxBool FX_CALL -grLfbReadRegion( GrBuffer_t src_buffer, - FxU32 src_x, FxU32 src_y, - FxU32 src_width, FxU32 src_height, - FxU32 dst_stride, void *dst_data ); - - -/* -** Antialiasing Functions -*/ - -#ifndef GLIDE3_ALPHA - -FX_ENTRY void FX_CALL -grAADrawLine(const GrVertex *v1, const GrVertex *v2); - -FX_ENTRY void FX_CALL -grAADrawPoint(const GrVertex *pt ); - -FX_ENTRY void FX_CALL -grAADrawPolygon(const int nverts, const int ilist[], const GrVertex vlist[]); - -FX_ENTRY void FX_CALL -grAADrawPolygonVertexList(const int nverts, const GrVertex vlist[]); -#endif /* !GLIDE3_ALPHA */ - -FX_ENTRY void FX_CALL -grAADrawTriangle( - const GrVertex *a, const GrVertex *b, const GrVertex *c, - FxBool ab_antialias, FxBool bc_antialias, FxBool ca_antialias - ); - -/* -** glide management functions -*/ -FX_ENTRY void FX_CALL -grGlideInit( void ); - -FX_ENTRY void FX_CALL -grGlideShutdown( void ); - -#ifndef GLIDE3_ALPHA -FX_ENTRY void FX_CALL -grGlideGetVersion( char version[80] ); -#endif /* !GLIDE3_ALPHA */ - -FX_ENTRY void FX_CALL -grGlideGetState( GrState *state ); - -FX_ENTRY void FX_CALL -grGlideSetState( const GrState *state ); - -#ifndef GLIDE3_ALPHA -FX_ENTRY void FX_CALL -grGlideShamelessPlug(const FxBool on); - -FX_ENTRY void FX_CALL -grHints(GrHint_t hintType, FxU32 hintMask); -#endif /* !GLIDE3_ALPHA */ - -#ifdef GLIDE3 -FX_ENTRY void FX_CALL -grVertexLayout(FxU32 param, FxI32 offset, FxU32 mode); - -FX_ENTRY void FX_CALL -grDrawVertexArray(FxU32 mode, FxU32 Count, void *pointers); - -FX_ENTRY void FX_CALL -grDrawVertexArrayLinear(FxU32 mode, FxU32 Count, void *pointers, FxU32 stride); - -FX_ENTRY void FX_CALL -grDrawVertexArrayLinear(FxU32 mode, FxU32 Count, void *pointers, FxU32 stride); - -#endif - -#endif /* FX_GLIDE_NO_FUNC_PROTO */ - -#ifdef __cplusplus -} -#endif - -#include - -#endif /* __GLIDE_H__ */ diff --git a/glide2x/h3/glide/src/glide.rc b/glide2x/h3/glide/src/glide.rc deleted file mode 100644 index c80e8f2..0000000 --- a/glide2x/h3/glide/src/glide.rc +++ /dev/null @@ -1,72 +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 -#include "rcver.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 -// PRODUCTVERSION VERSIONSTR, 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. 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 diff --git a/glide2x/h3/glide/src/glide.rx b/glide2x/h3/glide/src/glide.rx deleted file mode 100644 index c6aadac..0000000 --- a/glide2x/h3/glide/src/glide.rx +++ /dev/null @@ -1,4 +0,0 @@ -/GR_DDFUNC\((.*),/ -/GR_ENTRY\((.*),/ -/GR_DIENTRY\((.*),/ -/GR_STATE_ENTRY\((.*),/ diff --git a/glide2x/h3/glide/src/glidesys.h b/glide2x/h3/glide/src/glidesys.h deleted file mode 100644 index bb561da..0000000 --- a/glide2x/h3/glide/src/glidesys.h +++ /dev/null @@ -1,137 +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 3/17/99 6:16p Dow -** Phantom Menace and other fixes. -** -** 12 11/05/98 5:04p Russp -** fixed GLIDE_NUM_TMU test from "&&" to "||" - * - * 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__ */ diff --git a/glide2x/h3/glide/src/glideutl.h b/glide2x/h3/glide/src/glideutl.h deleted file mode 100644 index cf98f0e..0000000 --- a/glide2x/h3/glide/src/glideutl.h +++ /dev/null @@ -1,189 +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 3/17/99 6:16p Dow -** Phantom Menace and other fixes. - * - * 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__ */ diff --git a/glide2x/h3/glide/src/glimport.asm b/glide2x/h3/glide/src/glimport.asm deleted file mode 100644 index 1574e63..0000000 --- a/glide2x/h3/glide/src/glimport.asm +++ /dev/null @@ -1,235 +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$ -;; $Log$ -;; -;; 3 3/17/99 6:16p Dow -;; Phantom Menace and other fixes. -;; -;; 10 1/17/98 2:23p Dow -;; Changed headers a bit -;** -;** IMPLIB.ASM: This is a template for an import library. -;** -;; $Header$ - -;** -;** - -.386p -.MODEL FLAT - -.CODE - -EXTRN __loadme:NEAR ; magic symbol names -PUBLIC __dllname, __dllfirst, __dlltab, __dllcount - -ENTRYNAMES SEGMENT DWORD USE32 PUBLIC 'CODE' -ENTRYNAMES ENDS - -ENTRYTHUNKS SEGMENT DWORD USE32 PUBLIC 'CODE' - ALIGN 4 -__dllfirst: -ENTRYTHUNKS ENDS - -ENTRYTABLE SEGMENT DWORD USE32 PUBLIC 'CODE' - ALIGN 4 -__dlltab LABEL DWORD -ENTRYTABLE ENDS - -CGROUP GROUP _TEXT, ENTRYNAMES, ENTRYTHUNKS, ENTRYTABLE - -;** This macro enforces consistency among the three tables which are -;** used to implement the __loadme mechanism. The ENTRYNAMES segment -;** contains the names of the exported functions. The ENTRYTHUNKS -;** segment contains a label and a five-byte call to __loadme, nothing -;** else. (Implementation note: to extend this code to support multiple -;** import libraries, the mechanism could be changed to pass the names -;** of the DLL and the symbol to __loadme; this module wouldn't have -;** to export any public symbols except the entry point stubs. However, -;** doing it this way is much smaller when there are many entry points, -;** since each one is only five bytes.) Finally, the ENTRYTABLE -;** segment contains an indexed array of pointers to the function -;** names; this table is kept in the same order as the ENTRYTHUNKS -;** segment. - -EntryPoint MACRO name -ENTRYNAMES SEGMENT -_$&name DB '&name',0 -ENTRYNAMES ENDS -ENTRYTHUNKS SEGMENT - PUBLIC &name -&name: call __loadme -ENTRYTHUNKS ENDS -ENTRYTABLE SEGMENT - DD _$&name -ENTRYTABLE ENDS - ENDM - -;** Declare the DLL name here, without an extension. (The DLL loader -;** looks for extensions of .EXE, .DLL, or .OVL.) Follow the name with -;** any function names that the DLL exports (if you will be looking the -;** functions up by name). The names should match those of the -;** entry-point labels defined below, including underscores and @ -;** __stdcall decorations, to prevent accidental calling convention -;** mismatches. -;** -;** Note that dllentry0 and dllentry1 are prototyped as __cdecl functions. - - -__dllname DB 'glide2x',0 - - EntryPoint _GRAADRAWLINE@8 - EntryPoint _GRAADRAWPOINT@4 - EntryPoint _GRAADRAWPOLYGON@12 - EntryPoint _GRAADRAWPOLYGONVERTEXLIST@8 - EntryPoint _GRAADRAWTRIANGLE@24 - EntryPoint _GRALPHABLENDFUNCTION@16 - EntryPoint _GRALPHACOMBINE@20 - EntryPoint _GRALPHACONTROLSITRGBLIGHTING@4 - EntryPoint _GRALPHATESTFUNCTION@4 - EntryPoint _GRALPHATESTREFERENCEVALUE@4 - EntryPoint _GRBUFFERCLEAR@12 - EntryPoint _GRBUFFERNUMPENDING@0 - EntryPoint _GRBUFFERSWAP@4 - EntryPoint _GRCHECKFORROOM@4 - EntryPoint _GRCHROMAKEYMODE@4 - EntryPoint _GRCHROMAKEYVALUE@4 - EntryPoint _GRCLIPWINDOW@16 - EntryPoint _GRCOLORCOMBINE@20 - EntryPoint _GRCOLORMASK@8 - EntryPoint _GRCONSTANTCOLORVALUE4@16 - EntryPoint _GRCONSTANTCOLORVALUE@4 - EntryPoint _GRCULLMODE@4 - EntryPoint _GRDEPTHBIASLEVEL@4 - EntryPoint _GRDEPTHBUFFERFUNCTION@4 - EntryPoint _GRDEPTHBUFFERMODE@4 - EntryPoint _GRDEPTHMASK@4 - EntryPoint _GRDISABLEALLEFFECTS@0 - EntryPoint _GRDITHERMODE@4 - EntryPoint _GRDRAWLINE@8 - EntryPoint _GRDRAWPLANARPOLYGON@12 - EntryPoint _GRDRAWPLANARPOLYGONVERTEXLIST@8 - EntryPoint _GRDRAWPOINT@4 - EntryPoint _GRDRAWPOLYGON@12 - EntryPoint _GRDRAWPOLYGONVERTEXLIST@8 - EntryPoint _GRDRAWTRIANGLE@12 - EntryPoint _GRERRORSETCALLBACK@4 - EntryPoint _GRFOGCOLORVALUE@4 - EntryPoint _GRFOGMODE@4 - EntryPoint _GRFOGTABLE@4 - EntryPoint _GRGAMMACORRECTIONVALUE@4 - EntryPoint _GRGLIDEGETSTATE@4 - EntryPoint _GRGLIDEGETVERSION@4 - EntryPoint _GRGLIDEINIT@0 - EntryPoint _GRGLIDESETSTATE@4 - EntryPoint _GRGLIDESHAMELESSPLUG@4 - EntryPoint _GRGLIDESHUTDOWN@0 - EntryPoint _GRHINTS@8 - EntryPoint _GRLFBCONSTANTALPHA@4 - EntryPoint _GRLFBCONSTANTDEPTH@4 - EntryPoint _GRLFBLOCK@24 - EntryPoint _GRLFBREADREGION@28 - EntryPoint _GRLFBWRITEREGION@32 - EntryPoint _GRLFBUNLOCK@8 - EntryPoint _GRLFBWRITECOLORFORMAT@4 - EntryPoint _GRLFBWRITECOLORSWIZZLE@8 - EntryPoint _GRRENDERBUFFER@4 - EntryPoint _GRRESETTRISTATS@0 - EntryPoint _GRSPLASH@20 - EntryPoint _GRSSTCONFIGPIPELINE@12 - EntryPoint _GRSSTCONTROL@4 - EntryPoint _GRSSTIDLE@0 - EntryPoint _GRSSTISBUSY@0 - EntryPoint _GRSSTORIGIN@4 - EntryPoint _GRSSTPERFSTATS@4 - EntryPoint _GRSSTQUERYBOARDS@4 - EntryPoint _GRSSTQUERYHARDWARE@4 - EntryPoint _GRSSTRESETPERFSTATS@0 - EntryPoint _GRSSTSCREENHEIGHT@0 - EntryPoint _GRSSTSCREENWIDTH@0 - EntryPoint _GRSSTSELECT@4 - EntryPoint _GRSSTSTATUS@0 - EntryPoint _GRSSTVIDEOLINE@0 - EntryPoint _GRSSTVIDMODE@8 - EntryPoint _GRSSTVRETRACEON@0 - EntryPoint _GRSSTWINCLOSE@0 - EntryPoint _GRSSTWINOPEN@28 - EntryPoint _GRTEXCALCMEMREQUIRED@16 - EntryPoint _GRTEXCLAMPMODE@12 - EntryPoint _GRTEXCOMBINE@28 - EntryPoint _GRTEXCOMBINEFUNCTION@8 - EntryPoint _GRTEXDETAILCONTROL@16 - EntryPoint _GRTEXDOWNLOADMIPMAP@16 - EntryPoint _GRTEXDOWNLOADMIPMAPLEVEL@32 - EntryPoint _GRTEXDOWNLOADMIPMAPLEVELPARTIAL@40 - EntryPoint _GRTEXDOWNLOADTABLE@12 - EntryPoint _GRTEXDOWNLOADTABLEPARTIAL@20 - EntryPoint _GRTEXFILTERMODE@12 - EntryPoint _GRTEXLODBIASVALUE@8 - EntryPoint _GRTEXMAXADDRESS@4 - EntryPoint _GRTEXMINADDRESS@4 - EntryPoint _GRTEXMIPMAPMODE@12 - EntryPoint _GRTEXMULTIBASE@8 - EntryPoint _GRTEXMULTIBASEADDRESS@20 - EntryPoint _GRTEXNCCTABLE@8 - EntryPoint _GRTEXSOURCE@16 - EntryPoint _GRTEXTEXTUREMEMREQUIRED@8 - EntryPoint _GRTRISTATS@8 - EntryPoint _GU3DFGETINFO@8 - EntryPoint _GU3DFLOAD@8 - EntryPoint _GUAADRAWTRIANGLEWITHCLIP@12 - EntryPoint _GUALPHASOURCE@4 - EntryPoint _GUCOLORCOMBINEFUNCTION@4 - EntryPoint _GUDRAWPOLYGONVERTEXLISTWITHCLIP@8 - EntryPoint _GUDRAWTRIANGLEWITHCLIP@12 - EntryPoint _GUENCODERLE16@16 - EntryPoint _GUENDIANSWAPBYTES@4 - EntryPoint _GUENDIANSWAPWORDS@4 - EntryPoint _GUFOGGENERATEEXP2@8 - EntryPoint _GUFOGGENERATEEXP@8 - EntryPoint _GUFOGGENERATELINEAR@12 - EntryPoint _GUFOGTABLEINDEXTOW@4 - EntryPoint _GUMOVIESETNAME@4 - EntryPoint _GUMOVIESTART@0 - EntryPoint _GUMOVIESTOP@0 - EntryPoint _GUMPDRAWTRIANGLE@12 - EntryPoint _GUMPINIT@0 - EntryPoint _GUMPTEXCOMBINEFUNCTION@4 - EntryPoint _GUMPTEXSOURCE@8 - EntryPoint _GUTEXALLOCATEMEMORY@60 - EntryPoint _GUTEXCHANGEATTRIBUTES@48 - EntryPoint _GUTEXCOMBINEFUNCTION@8 - EntryPoint _GUTEXCREATECOLORMIPMAP@0 - EntryPoint _GUTEXDOWNLOADMIPMAP@12 - EntryPoint _GUTEXDOWNLOADMIPMAPLEVEL@12 - EntryPoint _GUTEXGETCURRENTMIPMAP@4 - EntryPoint _GUTEXGETMIPMAPINFO@4 - EntryPoint _GUTEXMEMQUERYAVAIL@4 - EntryPoint _GUTEXMEMRESET@0 - EntryPoint _GUTEXSOURCE@4 - EntryPoint _CONVERTANDDOWNLOADRLE@64 - -ENTRYTABLE SEGMENT -__dlltabend LABEL DWORD -__dllcount EQU ((__dlltabend - __dlltab) / 4) -ENTRYTABLE ENDS - -END diff --git a/glide2x/h3/glide/src/gmovie.c b/glide2x/h3/glide/src/gmovie.c deleted file mode 100644 index b4c6c9f..0000000 --- a/glide2x/h3/glide/src/gmovie.c +++ /dev/null @@ -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$ -** -** 3 3/17/99 6:16p Dow -** Phantom Menace and other fixes. - * - * 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 - -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include -#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 ); -} diff --git a/glide2x/h3/glide/src/gpci.c b/glide2x/h3/glide/src/gpci.c deleted file mode 100644 index 2f48ca7..0000000 --- a/glide2x/h3/glide/src/gpci.c +++ /dev/null @@ -1,1057 +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:28 joseph -** Initial checkin into SourceForge. -** -** -** 3 3/17/99 6:16p Dow -** Phantom Menace and other fixes. -** -** 166 3/17/99 5:08p Peter -** removed whacky stuff now that the command fifo threshold stuff appears -** to make all happy (including the k7) -** -** 165 3/17/99 1:37p Atai -** use grHints to enable/disable uma hack -** -** 164 3/16/99 11:51a Atai -** Back door (set FX_GLIDE_ENABLE_UMA=1) to enable unified texture memory. -** TMUn memory size will the whole texture memory space. The offset for -** each TMU points to the start address of the memory pool. -** -** 163 3/15/99 10:51p Dow -** Vile Hack -** -** 162 3/13/99 9:48p Dow -** optimizations for B&G -** -** 161 3/12/99 2:31p Dow -** Removed 3DNow for K7 (temp workaround) -** -** 160 3/08/99 6:11p Atai -** report Voodoo3 fbi/tmu rev number as Banshee for EA games -** -** 159 3/06/99 10:59a Atai -** fixed my ·F check-in. -** -** 158 3/05/99 2:50p Atai -** fbi/tmu rev mods -** -** 157 3/04/99 3:15p Atai -** mods for direct write -** -** 156 12/09/98 2:07p Peter -** More Norbert's stuff for the other 3DNow!(tm) partners -** -** 155 12/03/98 11:27p Dow -** Code 'cleanup' heç -** -** 154 12/03/98 10:34p Dow -** Added GLIDE_FGETENV for floats and removed registry code -** -** 153 12/03/98 12:37p Dow -** Fixed DOS build -** -** 152 12/02/98 2:53p Dow -** NT/9X Registry reading fix -** -** 151 11/19/98 9:53p Jeske -** make sure we look for Voodoo3/avenger also... -** -** 150 11/18/98 7:59p Dow -** grxclk -** -** 149 11/18/98 7:44p Atai -** use env var FX_GLIDE_NUM_TMU -** -** 148 11/17/98 7:04p Atai -** added env var "FX_GLIDE_DISABLE_TMU1" -** -** 147 11/10/98 6:44p Atai -** number of tmu and texture memory allocation -** -** 146 11/09/98 3:32p Mikec -** -** 143 11/05/98 1:55p Atai -** initialize 2nd tmu configs -** -** 142 10/21/98 4:20p Atai -** gamma stuff -** -** 141 10/21/98 10:41a Atai -** -** 140 10/20/98 5:34p Atai -** added #ifdefs for hwc -** -** 139 10/19/98 2:11p Peter -** ctrisetup happiness -** -** 138 10/09/98 6:57p Peter -** dynamic 3DNow!(tm) mods -** -** 137 9/24/98 7:40p Dow -** GL Driver Stuff -** -** 136 9/24/98 12:01p Dow -** Turned on extra unmentionable games -** -** 135 9/21/98 4:00p Dow -** Added to the unmentionable -** -** 134 9/04/98 11:36a Peter -** re-open fix for nt (thanks to taco/rob/nt bob) -** -** 133 8/30/98 11:15a Atai -** added tigerwood 99 to the game list -** -** 132 8/27/98 6:35p Atai -** getenv FX_GLIDE_TMU_MEMSIZE -** -** 131 8/27/98 1:58p Peter -** fill in hwConfig union" -** -** 130 8/26/98 10:08p Atai -** return the correct reg path -** -** 129 8/20/98 10:08a Dow -** Fix for registry GETENV stuff -** -** 128 8/14/98 10:25a Dow -** Fixed hwConfig union effage -** -** 127 7/24/98 2:03p Dow -** AGP Stuff -** -** 126 7/23/98 1:17a Dow -** Bump & Grind -** -** 125 7/18/98 7:24p Mikec -** Made win32 calls invisible to DOS compilation. -** -** 123 7/18/98 5:13p Mikec -** EAhack done. -** -** 122 7/14/98 2:48p Mikec -** Added Glide environment variable FX_GLIDE_EMUL_RUSH allow Banshee glide -** to report itself as Rush to the application. Set it to 1 to enable Rush -** reporting. By default Glide still reports itself as Voodoo Graphics. -** -** 121 7/13/98 5:32p Dow -** GETENV from registry -** -** 120 7/09/98 11:49a Jdt -** Fix fencing for dos build -** -** 119 7/09/98 10:19a Dow -** Registry getenv -** -** 118 7/06/98 7:05p Jdt -** initenvironment simplified -** -** 117 7/06/98 11:06a Mikec -** Added fbiRev offset to distinguish Banshee from Voodoo. -** Banshee check: -** If (hwconfig.SSTs[0].sstBoard.VoodooConfig.fbiRev > 0x1000) -** -** 116 6/24/98 11:16a Dow -** Fixed DLLMAin messages -** -** 115 6/09/98 5:04p Dow -** %$#@! -** -** 114 6/09/98 2:39p Mikec -** -** 113 6/04/98 6:53p Dow -** Resolutions to 1600x1200 -** -** 112 6/03/98 5:23p Dow -** Fixed DOS effage -** -** 111 6/03/98 1:39p Dow -** dll main -** -** 110 5/31/98 9:03a Dow -** 800x600 resolution -** -** 109 5/22/98 2:37p Peter -** complete the lie that is glide2x on Banshee -** -** 108 5/21/98 4:47p Dow -** Direct Register Writes Work -** -** 107 5/18/98 3:20p Peter -** pts more resistant to changing rounding modes -** -** 106 5/15/98 2:21p Dow -** Changed from Voodoo Rush to Voodoo -** -** 105 5/12/98 2:42p Dow -** -** 104 4/14/98 6:41p Peter -** Merge w/ cvg glide cleanup -** -** 103 4/07/98 10:40p Dow -** LFB Fixes: Round 1 -** -** 102 4/05/98 2:18p Dow -** DOS Glide Stuff -** -** 101 4/03/98 2:11p Dow -** -** 100 3/28/98 11:24a Dow -** itwoç -** -** 99 3/11/98 8:28p Dow -** WinGlide -** -** 97 2/08/98 3:08p Dow -** FIFO Works -** -** 96 2/02/98 4:31p Dow -** IO w/o HAL now possible -** -** 95 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 - * - * 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 effage 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 stuff - * - * 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 effage - * 47 6/23/97 4:43p Peter - * cleaned up #defines etc for a nicer tree -** -*/ - -#include -#include - -#include <3dfx.h> -#include - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -/* Some macros to prevent RSI */ -#define GC _GlideRoot.GCs[ctx] -#define SST _GlideRoot.hwConfig.SSTs[ctx] - -#define kRevisionOffset 0x1000 - - -#if GLIDE_DISPATCH_SETUP -/* Collection of all of the known procs for a given system */ -static GrTriSetupProc _triSetupProcs[][NUM_TRI_PROC_LISTS][2] = -{ - /* Default Procs */ - { - { _trisetup_Default_Default, _trisetup_Default_cull }, -#if GLIDE_PACKED_RGB - { _trisetup_Default_rgb, _trisetup_Default_cull_rgb }, - { _trisetup_Default_argb, _trisetup_Default_cull_argb }, -#endif /* GLIDE_PACKED_RGB */ - }, -#if GL_AMD3D - /* 3DNow!(tm) Procs */ - { - { _trisetup_3DNow_Default, _trisetup_3DNow_cull }, -#if GLIDE_PACKED_RGB - { _trisetup_3DNow_rgb, _trisetup_3DNow_cull_rgb }, - { _trisetup_3DNow_argb, _trisetup_3DNow_cull_argb }, -#endif /* GLIDE_PACKED_RGB */ - }, -#endif /* GL_AMD3D */ -}; -#endif /* GLIDE_DISPATCH_SETUP */ - -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 (GLIDE_PLATFORM & GLIDE_OS_WIN32) -#define WIN32_LEAN_AND_MEAN -#include - - -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(); - break; - case DLL_PROCESS_ATTACH: - 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 */ - -#define REGSTR_PATH_3DFXSW "Software\\3Dfx Interactive\\Voodoo2" -#define REGSTR_PATH_GLIDE REGSTR_PATH_3DFXSW"\\Glide" - -#if !defined(GLIDE_INIT_HAL) -#ifdef GETENV -#undef GETENV -#endif -#define GETENV(a) hwcGetenv(a) -#endif /* !defined(GLIDE_INIT_HAL) */ - -#endif - -/* Windows */ -#define SEPARATOR '\\' -/* UNIX */ -#define SEPARATOR2 '/' - -/* - * parseFilename - * - * Return the file name portion of a filename/path. - */ - -char * -_parseFilename(char *name) -{ - int i; - - if (name == NULL) - return NULL; - for(i = strlen(name); i >= 0; i--) - if ((name[i] == SEPARATOR) || - (name[i] == SEPARATOR2)) - return (name + i + 1); - return name; -} /* End of parseFilename*/ - - -/*------------------------------------------------------------------- - 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; - - GDBG_INFO(280, "_grSstDetectResources()\n"); - - if (!calledP) { -#if GLIDE_INIT_HAL - FxU32 count = HAL_MAX_BOARDS; - - /* 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. - */ - FxU32 device; - const HalInfo* halInfo = fxHalInit(0); - if (halInfo == NULL) goto __errExit; - - for(ctx = device = 0; device < count; device++) { - /* See RSI-prevention macros for usage of [ctx] */ - const FxDeviceInfo* curDev = NULL; - FxBool regInitP = FXFALSE; - SstRegs* devRegs; - - devRegs = fxHalMapBoard(device); - curDev = halInfo->boardInfo + device; - - if (devRegs != NULL) { - FxU32 tmuMem = 0x00; - - SST.type = GR_SSTTYPE_VOODOO; - - if (!fxHalInitRegisters(curDev->virtAddr[0])) goto __errRegFailure; - -#ifdef DIRECT_IO - GC.sstRegs = - (SstRegs *) (curDev->physAddr[0] + 0x200000); - GC.ioRegs = (SstIORegs *) (curDev->physAddr[0]); - GC.cRegs = (SstCRegs *) (curDev->physAddr[0] + 0x80000); - GC.rawLfb = (FxU32 *) curDev->physAddr[1]; -#endif - - /* This device is ready to go. */ - regInitP = FXTRUE; - - GC.reg_ptr = (FxU32*)devRegs; - -#ifdef HAL_HW - /* Set up pointers to the various address spaces within the hw */ - GC.base_ptr = (FxU32*)SST_BASE_ADDRESS(curDev->physAddr[0]); - GC.lfb_ptr = (FxU32*)SST_LFB_ADDRESS(curDev->physAddr[0]); - GC.tex_ptr = (FxU32*)SST_TEX_ADDRESS(curDev->physAddr[0]); -#endif - - - /* Video parameters */ - GC.grSstRez = GR_RESOLUTION_NONE; - GC.grSstRefresh = curDev->fbiVideoRefresh; - - GC.scanline_interleaved = FXFALSE; - - /* Chip configuration */ - GC.num_tmu = curDev->numberTmus; - GC.fbuf_size = curDev->fbiMemSize; - - _GlideRoot.hwConfig.num_sst++; - - /* We claim that we are an sst1 for the sake of Avenger */ - { - const FxU32 curTmuMemSize = 0x2; - -#if 0 - SST.sstBoard.VoodooConfig.fbRam = 2; -#else - SST.sstBoard.VoodooConfig.fbRam = 16; -#endif - - /* Banshee's ID is 0x1000. Always check that it's at least 0x1000 - * for Banshee card. - */ -#if 0 - /* H4 Note: need to setup 2nd tmu configuration */ - SST.sstBoard.VoodooConfig.fbiRev = 2 + 0x1000; - SST.sstBoard.VoodooConfig.nTexelfx = 1; - - SST.sstBoard.VoodooConfig.tmuConfig[0].tmuRev = (2 + kRevisionOffset); - - SST.sstBoard.VoodooConfig.tmuConfig[0].tmuRam = curTmuMemSize; -#else - SST.sstBoard.VoodooConfig.fbiRev = curDev->fbiRevision; - SST.sstBoard.VoodooConfig.nTexelfx = GC.num_tmu; - SST.sstBoard.VoodooConfig.tmuConfig[0].tmuRev = curDev->tmuRevision; - SST.sstBoard.VoodooConfig.tmuConfig[0].tmuRam = curTmuMemSize; - SST.sstBoard.VoodooConfig.tmuConfig[1].tmuRev = curDev->tmuRevision; - - SST.sstBoard.VoodooConfig.tmuConfig[1].tmuRam = curTmuMemSize; -#endif - tmuMem += curTmuMemSize; - - /* Clear the tmu state */ - memset(&GC.tmu_state[0], 0, sizeof(GC.tmu_state[0])); - GC.tmu_state[0].total_mem = (curTmuMemSize << 20); - GC.tmu_state[0].ncc_mmids[0] = - GC.tmu_state[0].ncc_mmids[1] = GR_NULL_MIPMAP_HANDLE; - } - - rv = FXTRUE; - ctx++; - } - - __errRegFailure: - /* Either this is not the hw we're expecting, or we could not - * init/map the board for some reason. Either way try to cleanup. - */ - if (!regInitP && (devRegs != NULL)) { - fxHalShutdown(devRegs); - } - } - - /* Done setting up. Don't do the silly mapping thing again. */ -#else /* GLIDE_INIT_HWC */ - /* There's a left brace before the #if */ - hwcBoardInfo - *bInfo; - hwcInfo - *hInfo; /* Info about all the relavent boards */ - - if ((hInfo = hwcInit(0x121a, 0x5)) == NULL) { /* Voodoo3 */ - if ((hInfo = hwcInit(0x121a, 0x3)) == NULL) { /* Banshee */ - goto __errExit; - } - } - - - if (_GlideRoot.environment.emulRush){ - GDBG_INFO(80,"Emulating rush\n"); - } - - /* Iterate through boards found */ - for (ctx = 0; ctx < hInfo->nBoards; ctx++) { - bInfo = &hInfo->boardInfo[ctx]; - - GC.bInfo = bInfo; - - - GDBG_INFO(80, "Board %d, devRev: %d\n", ctx,bInfo->devRev); - - if (!hwcMapBoard(bInfo, HWC_BASE_ADDR_MASK)) { - GrErrorCallback(hwcGetErrorString(), FXTRUE); - } - - if (!hwcInitRegisters(bInfo)) { - GrErrorCallback(hwcGetErrorString(), FXTRUE); - } - - /* NB: We cannot fail to map this board after this point */ - GC.hwInitP = FXTRUE; - - GC.sstRegs = (SstRegs *) bInfo->regInfo.sstBase; - GC.ioRegs = (SstIORegs *) bInfo->regInfo.ioMemBase; - GC.cRegs = (SstCRegs *) bInfo->regInfo.cmdAGPBase; - GC.lfb_ptr = (FxU32 *) bInfo->regInfo.lfbBase; - GC.rawLfb = (FxU32 *) bInfo->regInfo.rawLfbBase; - GC.tex_ptr = (FxU32*)SST_TEX_ADDRESS(bInfo->regInfo.sstBase); - - /* Video Parameters */ - GC.grSstRez = GR_RESOLUTION_NONE; - GC.grSstRefresh = 0L; - - GC.scanline_interleaved = FXFALSE; - - switch (hInfo->boardInfo[ctx].pciInfo.deviceID) { - case 3: /* Banshee */ - GC.num_tmu = 1; - GC.fbuf_size = (bInfo->h3Mem - 2); - break; - case 4: /* Avenger low speed */ - /* - ** For 8M board, we may only use one tmu for higher resolution. - ** Need to re-visit the issue. 11/5/98 - */ - GC.num_tmu = 2; - GC.fbuf_size = (bInfo->h3Mem - 4); - break; - case 5: /* Avenger high speed */ - GC.num_tmu = 2; - GC.fbuf_size = (bInfo->h3Mem - 4); - break; - default: - GC.num_tmu = 1; - GC.fbuf_size = (bInfo->h3Mem - 2); - break; - } - if (bInfo->h3Mem == 4) { - GC.num_tmu = 1; - GC.fbuf_size = (bInfo->h3Mem - 2); - } - if (GETENV("FX_GLIDE_NUM_TMU")) { - int num_tmu = atoi(GETENV("FX_GLIDE_NUM_TMU")); - switch (num_tmu) { - case 1: - GC.num_tmu = 1; - GC.fbuf_size = (bInfo->h3Mem - 2); - break; - case 2: - GC.num_tmu = 2; - GC.fbuf_size = (bInfo->h3Mem - 4); - break; - } - } - - _GlideRoot.hwConfig.num_sst++; - - { - /* Default to the minimum texture memory taht we will - * advertise for any screen resolution. - */ - const FxU32 curTmuMemSize = 0x2; - int tmu; - - if (_GlideRoot.environment.emulRush) { - SST.type = GR_SSTTYPE_SST96; - SST.sstBoard.SST96Config.fbRam = GC.fbuf_size; - - SST.sstBoard.SST96Config.nTexelfx = GC.num_tmu; - SST.sstBoard.SST96Config.tmuConfig.tmuRev = (2 + kRevisionOffset); - SST.sstBoard.SST96Config.tmuConfig.tmuRam = curTmuMemSize; - } else { - /* Banshee's ID is 0x1000. Always check that it's at least - * 0x1000 for Banshee card. - */ - SST.type = GR_SSTTYPE_VOODOO; - SST.sstBoard.VoodooConfig.fbRam = GC.fbuf_size; - SST.sstBoard.VoodooConfig.fbiRev = 2 + 0x1000; - SST.sstBoard.VoodooConfig.sliDetect = FXFALSE; - - SST.sstBoard.VoodooConfig.nTexelfx = GC.num_tmu; - for (tmu = 0; tmu < GC.num_tmu; tmu++) { - SST.sstBoard.VoodooConfig.tmuConfig[tmu].tmuRev = (2 + kRevisionOffset); - SST.sstBoard.VoodooConfig.tmuConfig[tmu].tmuRam = curTmuMemSize; - } - } - - /* Clear the tmu state */ - for (tmu = 0; tmu < GC.num_tmu; tmu++) { - memset(&GC.tmu_state[tmu], 0, sizeof(GC.tmu_state[tmu])); - GC.tmu_state[tmu].total_mem = (curTmuMemSize << 20); - GC.tmu_state[tmu].ncc_mmids[0] = - GC.tmu_state[tmu].ncc_mmids[1] = GR_NULL_MIPMAP_HANDLE; - } - } - if (hInfo->boardInfo[ctx].pciInfo.deviceID > 3) { - if (_GlideRoot.environment.emulRush) { - SST.sstBoard.SST96Config.tmuConfig.tmuRev |= 0x10000; - } - else { - SST.sstBoard.VoodooConfig.fbiRev |= 0x10000; - SST.sstBoard.VoodooConfig.tmuConfig[0].tmuRev |= 0x10000; - SST.sstBoard.VoodooConfig.tmuConfig[1].tmuRev |= 0x10000; - } - } - - } /* iterate through boards found */ -#endif - } - - /* Did we previously find boards? */ - rv = (_GlideRoot.hwConfig.num_sst != 0); - - calledP = FXTRUE; - - goto __errExit; /* Keep warnings happy */ -__errExit: - ; - 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( __WATCOMC__ ) -FxU32 p6FenceVar; -#endif - -void -_GlideInitEnvironment(void) -{ -#define FN_NAME "_GlideInitEnvironment" - int i; - const char* envStr; -#if GLIDE_PLATFORM & GLIDE_OS_WIN32 - OSVERSIONINFO ovi; -#endif - - - if (_GlideRoot.initialized) /* only execute once */ - return; - GDBG_INIT(); /* init the GDEBUG libraray */ - GDBG_INFO(80,"%s()\n", FN_NAME); - GDBG_INFO(0,"GLIDE DEBUG LIBRARY\n"); /* unconditional display */ - - if (_GlideRoot.initialized) /* only execute once */ - return; - -#if GLIDE_PLATFORM & GLIDE_OS_WIN32 - ovi.dwOSVersionInfoSize = sizeof ( ovi ); - GetVersionEx ( &ovi ); - if (ovi.dwPlatformId == VER_PLATFORM_WIN32_NT) - _GlideRoot.OSWin95 = 0; - else - _GlideRoot.OSWin95 = 1; -#endif - - GDBG_INFO(80, "%s: OS = %s\n", FN_NAME, _GlideRoot.OSWin95 ? "W9X" : "WNT"); - -#if defined(FX_DLL_ENABLE) && (GLIDE_PLATFORM & GLIDE_OS_WIN32) - { /* GMT: display the DLL pathname for sanity checking */ - char buf[132] = "failed"; - GetModuleFileName(GetModuleHandle("glide3x.dll"), buf, sizeof(buf)); - GDBG_INFO(0,"DLL path: %s\n",buf); - } -#endif - - /* Check for user environment tweaks */ -#define GLIDE_GETENV(__envVar, __defVal) \ - (((envStr = GETENV(__envVar)) == NULL) ? (__defVal) : atol(envStr)); -#define GLIDE_FGETENV(__envVar, __defVal) \ - (((envStr = GETENV(__envVar)) == NULL) ? (__defVal) : (float) atof(envStr)); - - _GlideRoot.environment.triBoundsCheck = - (GETENV("FX_GLIDE_BOUNDS_CHECK") != NULL); - GDBG_INFO(80,"\ttriBoundsCheck: %d\n", - _GlideRoot.environment.triBoundsCheck); - - _GlideRoot.environment.noSplash = - (GETENV("FX_GLIDE_NO_SPLASH") != NULL); - GDBG_INFO(80,"\tnoSplash: %d\n",_GlideRoot.environment.noSplash); - - _GlideRoot.environment.shamelessPlug = - (GETENV("FX_GLIDE_SHAMELESS_PLUG") != NULL); - GDBG_INFO(80,"\tshamelessPlug: %d\n", - _GlideRoot.environment.shamelessPlug); - - _GlideRoot.environment.ignoreReopen = - (GETENV("FX_GLIDE_IGNORE_REOPEN") != NULL); - GDBG_INFO(80,"\tignoreReopen: %d\n", _GlideRoot.environment.ignoreReopen); - - _GlideRoot.environment.disableDitherSub = - (GETENV("FX_GLIDE_NO_DITHER_SUB") != NULL); - GDBG_INFO(80,"\tdisableDitherSub: %d\n", - _GlideRoot.environment.disableDitherSub); - - _GlideRoot.environment.texLodDither = - ((GETENV("FX_GLIDE_LOD_DITHER") == NULL) ? 0x00UL : SST_TLODDITHER); - GDBG_INFO(80,"\ttexLodDither: %d\n",_GlideRoot.environment.texLodDither); - - _GlideRoot.environment.nColorBuffer = - GLIDE_GETENV("FX_GLIDE_ALLOC_COLOR", -1L); - GDBG_INFO(80,"\tnColorBuffer: %d\n",_GlideRoot.environment.nColorBuffer); - - _GlideRoot.environment.tmuMemory = - GLIDE_GETENV("FX_GLIDE_TMU_MEMSIZE", -1L); - GDBG_INFO(80,"\ttmuMemory: %d\n",_GlideRoot.environment.tmuMemory); - - _GlideRoot.environment.nAuxBuffer = - GLIDE_GETENV("FX_GLIDE_ALLOC_AUX", -1L); - GDBG_INFO(80,"\tnAuxBuffer: %d\n",_GlideRoot.environment.nAuxBuffer); - - _GlideRoot.environment.swFifoLWM = - GLIDE_GETENV("FX_GLIDE_LWM", -1L); - GDBG_INFO(80,"\tswFifoLWM: %d\n",_GlideRoot.environment.swFifoLWM); - - _GlideRoot.environment.swapInterval = - GLIDE_GETENV("FX_GLIDE_SWAPINTERVAL", -1L); - GDBG_INFO(80,"\tswapInterval: %d\n",_GlideRoot.environment.swapInterval); - - _GlideRoot.environment.snapshot = GLIDE_GETENV("FX_SNAPSHOT", -1L); - GDBG_INFO(80,"\tsnapshot: %d\n",_GlideRoot.environment.snapshot); - - _GlideRoot.environment.gammaR = GLIDE_FGETENV("SSTH3_RGAMMA", -1.f); - _GlideRoot.environment.gammaG = GLIDE_FGETENV("SSTH3_GGAMMA", -1.f); - _GlideRoot.environment.gammaB = GLIDE_FGETENV("SSTH3_BGAMMA", -1.f); - - _GlideRoot.environment.enUma = 0; - - /* Setup the basic proc tables based on the cpu type. */ - { - _GlideRoot.CPUType = GLIDE_GETENV("FX_CPU", _cpu_detect_asm() ); - GDBG_INFO(80,"\tcpu: %d\n",_GlideRoot.CPUType); - - /* Default case */ -#if GLIDE_DISPATCH_SETUP - _GlideRoot.curTriProcs = _triSetupProcs + 0; -#endif /* GLIDE_DISPATCH_SETUP */ - - _GlideRoot.curTexProcs = _texDownloadProcs + 0; - - /* Check for vendor specific optimization cases */ - switch((_GlideRoot.CPUType & 0xFFFF0000UL) >> 16UL) { - case kCPUVendorIntel: - break; - - case kCPUVendorAMD: - case kCPUVendorCyrix: - case kCPUVendorIDT: - if ((_GlideRoot.CPUType & 0x02UL) == 0x02UL) { /* MMX & 3DNow!(tm) feature bits set */ -#if GLIDE_DISPATCH_SETUP - _GlideRoot.curTriProcs = _triSetupProcs + 1; -#endif /* GLIDE_DISPATCH_SETUP */ - - _GlideRoot.curTexProcs = _texDownloadProcs + 1; - } - break; - - case kCPUVendorUnknown: - default: - break; - } - } - - _GlideRoot.environment.emulRush = (GETENV("FX_GLIDE_EMUL_RUSH") != NULL); - GDBG_INFO(80,"\temulate Rush: %d\n", _GlideRoot.environment.emulRush); - - _GlideRoot.environment.autoBump = (GETENV("FX_GLIDE_BUMP") == NULL); - GDBG_INFO(80, "\tautoBump: %s\n", - _GlideRoot.environment.autoBump ? "FXTRUE" : "FXFALSE"); - - if (GETENV("FX_GLIDE_BUMPSIZE")) - sscanf(GETENV("FX_GLIDE_BUMPSIZE"), "%lx", - &_GlideRoot.environment.bumpSize); - else - _GlideRoot.environment.bumpSize = 0x10000; - GDBG_INFO(80, "\tbumpSize: 0x%x\n", _GlideRoot.environment.bumpSize); - - _GlideRoot.environment.bumpSize >>= 2; /* So we don't have to later */ - - _GlideRoot.environment.grxClk = GLIDE_GETENV("FX_GLIDE_GRXCLK", -1); - - GDBG_INFO(80, "\tGamma R: %1.1f\n", - _GlideRoot.environment.gammaR); - GDBG_INFO(80, "\tGamma G: %1.1f\n", - _GlideRoot.environment.gammaG); - GDBG_INFO(80, "\tGamma B: %1.1f\n", - _GlideRoot.environment.gammaB); - - - /* 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 */ - - grErrorSetCallback(_grErrorDefaultCallback); - - if ( !_grSstDetectResources() ) { -#ifdef GLIDE_INIT_HWC - GrErrorCallback( hwcGetErrorString(), FXTRUE ); -#endif - } - - for (i = 0; i < _GlideRoot.hwConfig.num_sst; i++) { - _GlideRoot.GCs[i].mm_table.free_mmid = 0; - displayBoardInfo(i, &_GlideRoot.hwConfig); - } - - _grMipMapInit(); - _GlideRoot.initialized = FXTRUE; /* save this for the end */ -} /* _GlideInitEnvironment */ diff --git a/glide2x/h3/glide/src/gsplash.c b/glide2x/h3/glide/src/gsplash.c deleted file mode 100644 index a6f09b9..0000000 --- a/glide2x/h3/glide/src/gsplash.c +++ /dev/null @@ -1,1012 +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 3/17/99 6:16p Dow -** Phantom Menace and other fixes. -** -** 30 2/19/99 5:54p Peter -** new splash screen -** -** 29 12/03/98 11:27p Dow -** Code 'cleanup' heç -** -** 28 12/03/98 4:45p Atai -** exit grSplash if aux buffer equals zero -** -** 27 8/01/98 3:34p Jeske -** made a special grSplashCb() for Banshee diags, only avail with -** -DDIAG_BUILD -** -** 26 1/30/98 2:07p Peter -** fixed effage -** -** 25 1/28/98 1:13p 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 - -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include - -#include "fxglide.h" -#include "fxinline.h" - -#if defined( DIAG_BUILD ) || defined( __linux__ ) - -/*----------------------------- - 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) { -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) - grTexDownloadTable(texture->tableType, - &texture->tableData); -#else - grTexDownloadTable(GR_TMU0, - texture->tableType, - &texture->tableData); -#endif - } - 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; - TEX_INFO(texture->info.,smallLod) = info->header.small_lod; - TEX_INFO(texture->info.,largeLod) = info->header.large_lod; - TEX_INFO(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); - -} - -#ifdef __linux__ -FX_ENTRY void FX_CALL -grSplashCb(float x, float y, float width, float height, FxU32 frame, - void (*fn)(int)); -#endif - - -/*------------------------------------------------------------------- - 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)) -{ - grSplashCb(x,y,w,h,_frame,NULL); -} - -GR_DIENTRY(grSplashCb,void,(float x,float y,float w,float h,FxU32 _frame, - void (*callback)(int frame))) -{ - GR_BEGIN_NOFIFOCHECK("grSplash", 85); - GDBG_INFO_MORE(gc->myLevel,"(%f,%f,%f,%f,%d)\n", - x, y, w, h, _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; - - /* 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); - if (callback) callback(frame); - } - } 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 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); - } - - GR_END(); -} -#else /* !DIAG_BUILD */ -GR_DIENTRY(grSplash,void,(float x, float y, - float w, float h, - FxU32 frameNumber)) -{ - GR_BEGIN_NOFIFOCHECK("grSplash", 85); - GDBG_INFO_MORE(gc->myLevel,"(%f,%f,%f,%f,%d)\n", - x, y, w, h, frameNumber); - -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) - if (gc->pluginInfo.splashProc != NULL) (*gc->pluginInfo.splashProc)(x, y, - w, h, - frameNumber); -#endif /* (GLIDE_PLATFORM & GLIDE_OS_WIN32) */ - - GR_END(); -} -#endif /* !DIAG_BUILD */ - - diff --git a/glide2x/h3/glide/src/gsst.c b/glide2x/h3/glide/src/gsst.c deleted file mode 100644 index dfd7e5e..0000000 --- a/glide2x/h3/glide/src/gsst.c +++ /dev/null @@ -1,1871 +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:28 joseph -** Initial checkin into SourceForge. -** -** -** 4 3/17/99 6:16p Dow -** Phantom Menace and other fixes. -** -** 205 3/17/99 5:08p Peter -** removed whacky stuff now that the command fifo threshold stuff appears -** to make all happy (including the k7) -** -** 204 3/17/99 1:22p Dow -** it really should be an assignment -** -** 203 3/17/99 10:54a Dow -** fixed euivalence test for autoBump -** -** 202 3/16/99 11:51a Atai -** Back door (set FX_GLIDE_ENABLE_UMA=1) to enable unified texture memory. -** TMUn memory size will the whole texture memory space. The offset for -** each TMU points to the start address of the memory pool. -** -** 201 3/15/99 10:51p Dow -** Vile Hack -** -** 200 3/13/99 9:48p Dow -** -** 199 3/10/99 6:38p Peter -** removed cruft -** -** 198 3/10/99 10:40a Peter -** bump-n-grind workaround for katmai until the bug is better -** characterized -** -** 197 3/06/99 10:42a Dow -** Added an idle to make sure. -** -** 196 3/05/99 9:01a Atai -** for direct write compilation -** -** 195 3/04/99 5:42p Atai -** cast pointer -** -** 194 3/04/99 3:15p Atai -** mods for direct write -** -** 193 3/03/99 4:44p Peter -** clear chroma range and texChroma for default state -** -** 192 2/27/99 12:24p Dow -** new resolutions -** -** 191 2/26/99 10:27a Peter -** Mmmm.... 8.3 -** -** 190 2/19/99 7:58p Peter -** doh! -** -** 189 2/19/99 7:56p Peter -** load splash plug-in even w/ env var set -** -** 188 2/19/99 5:54p Peter -** new splash screen -** -** 187 2/13/99 1:59p Dow -** Added code for new resolutions -** -** 186 12/21/98 1:47p Atai -** Update gc->swapsPending before we return the status, fixed for the -** games that rely on masking status to get -** buffernumpending. -** -** 185 12/18/98 1:55p Atai -** "SSTV2_GAMMA" is used to update the video/brightness setting. -** -** 184 12/09/98 6:02p Atai -** grTexCombine did the right thing for the un-used TMU. Initialize the -** 2nd TMU value to take care of "set FX_GLIDE_NUM_TMU=1" -** -** 183 12/09/98 5:00p Atai -** set MAXLOD = MINLOD = 8 in _grUpdateParamIndex if ST1 is not used -** -** 182 12/09/98 2:02p Atai -** Added _grTexForceLod back. Set tLOD min = max = 8 for the 2nd TMU by -** default for Avenger to increase single texturing tri fillrate. -** -** 181 12/03/98 11:27p Dow -** Code 'cleanup' heç -** -** 180 12/03/98 10:37p Dow -** Removed bogus gamma setting in assertDefaultState\nRemoved protoected & -** vestigial Glide3 funcions -** -** 179 11/18/98 8:00p Dow -** grxclk -** -** 178 11/18/98 4:27p Atai -** direct write mods. 2 tmu mode does not work yet -** -** 177 11/14/98 2:00a Lab -** fixed second tmu size -** -** 176 11/10/98 6:44p Atai -** number of tmu and texture memory allocation -** -** 175 11/10/98 4:53p Atai -** fixed gc->tramoffset -** -** 174 11/02/98 5:34p Atai -** merge direct i/o code -** -** 173 10/21/98 4:20p Atai -** gamma stuff -** -** 172 10/21/98 10:41a Atai -** -** 171 10/20/98 5:34p Atai -** added #ifdefs for hwc -** -** 170 10/20/98 4:39p Atai -** update tramOffset and tramSize -** -** 169 10/13/98 8:44p Dow -** Made it work for 4MB boards -** -** 168 10/09/98 6:57p Peter -** dynamic 3DNow!(tm) mods -** -** 167 10/08/98 10:15a Dow -** Triple Buffering fix -** -** 166 9/18/98 10:53a Dow -** VidMode Stuff -** -** 165 9/04/98 11:36a Peter -** re-open fix for nt (thanks to taco/rob/nt bob) -** -** 164 9/02/98 1:34p Peter -** watcom warnings -** -** 163 9/01/98 10:07a Dow -** Fixed Control panel effage -** -** 162 8/28/98 4:38p Atai -** 1. added MIN_FIFO_SIZE for memory checking -** 2. hack for resolution checking if we have 8M board and triple -** buffering on -** -** 161 8/27/98 9:54p Peter -** use gc->frontBuffer rather than 1 -** -** 160 8/27/98 6:36p Atai -** check if environment.tmuMemory is on -** -** 159 8/26/98 10:11p Atai -** set color buffer to 3 if control panel force triple buffering -** -** 158 8/03/98 4:07p Mikec -** Removed glide3 splash screen. -** -** 157 8/03/98 10:45a Atai -** rename 3dfxsplash3.dll to 3dfxspl3.dll -** -** 156 7/29/98 3:09p Dow -** SDRAM Fixes -** -** 155 7/24/98 2:03p Dow -** AGP Stuff -** -** 154 7/23/98 1:17a Dow -** Bump & Grind -** -** 153 7/15/98 2:03p Mikec -** Fixed Lfb depth buffer readback problem. It turns out grWinOpen didn't -** set up the lfb buffer pointer for the aux buffer correctly. -** -** 152 7/06/98 7:05p Jdt -** grSstWinOpen simplified, in-memory buffer logic added -** -** 151 6/26/98 11:09a Jdt -** -** 150 6/26/98 10:08a Jdt -** -** 149 6/25/98 6:49p Jdt -** Removed direct IO write from grSstWinOpen and moved to minihwc -** -** 148 6/24/98 11:16a Dow -** More SST1 Statuws stuff -** -** 147 6/23/98 2:52p Dow -** Added SST1 FIFO status. -** -** 146 6/19/98 2:33p Mikec -** Fixed lfb buffer offset fucakge -** -** 145 6/16/98 6:12p Dow -** Rearranged texture memory -** -** 144 6/12/98 4:20p Dow -** Return FXFALSE from WinOpen if GR_RESOLUTION_NONE is specified. -** -** 143 6/10/98 9:49a Peter -** lfb buffer addressing -** -** 142 6/09/98 7:48p Mikec -** Added buffer clears to grSstWinOpen to get rid of random pixels. -** -** 141 6/05/98 11:22a Jeske -** we never copied the hwc's memory calculation into gc->fbOffset... We -** might need to copy more data than this.. check this... -** -** 140 6/04/98 12:12p Peter -** splash dll rename -** -** 139 5/31/98 9:03a Dow -** 800x600 resolution -** -** 138 5/28/98 1:46p Dow -** Swap Pending Workaround -** -** 137 5/22/98 2:37p Peter -** -** 136 5/21/98 5:27p Peter -** hwcInitVideo failing is fatal for grSstWinOpen -** -** 135 5/13/98 9:12a Dow -** -** 134 5/12/98 2:42p Dow -** -** 133 4/30/98 4:10p Peter -** Fixed comment from before -** -** 132 4/19/98 11:31a Dow -** Fixed grSstStatus -** -** 131 4/14/98 6:41p Peter -** Merge w/ cvg glide cleanup -** -** 130 4/07/98 10:40p Dow -** LFB Fixes: Round 1 -** -** 129 3/28/98 11:24a Dow -** itwoç -** -** 128 3/20/98 1:12p Dow -** Windows happiness -** -** 127 3/16/98 8:47p Dow -** More Windows Happiness -** -** 125 3/03/98 11:31a Dow -** Resolutions now work -** -** 124 2/17/98 12:52p Dow -** fifo setup code -** -** 123 2/09/98 12:27p Dow -** Fixed some niggling hangnails -** -** 122 2/08/98 3:08p Dow -** FIFO Works -** -** 121 2/02/98 4:31p Dow -** IO w/o HAL now possible -** -** 120 1/30/98 1:34p Dow -** Formed call to fxHalInitVideoOverlaySurface -** -** 119 1/29/98 9:54p Dow -** This is Banshee -** -** 118 1/20/98 11:03a Peter -** env var to force triple buffering - * - * 116 1/16/98 4:18p Atai - * fixed lfb and grLoadGammaTable - * - * 115 1/16/98 10:47a Peter - * fixed idle effage - * - * 114 1/16/98 10:16a Atai - * fixed grSstIldle - * - * 113 1/10/98 4:01p Atai - * inititialize vertex layout, viewport, added defines - * - * 110 1/06/98 6:47p Atai - * undo grSplash and remove gu routines - * - * 109 1/06/98 3:53p Atai - * remove grHint, modify grLfbWriteRegion and grGet - * - * 107 12/18/97 2:12p Peter - * grSstControl on v2 - * - * 106 12/17/97 4:48p Peter - * groundwork for CrybabyGlide - * - * 105 12/17/97 4:06p Atai - * added grChromaRange(), grGammaCorrecionRGB(), grRest(), and grGet() - * functions - * - * 104 12/16/97 1:33p Atai - * added grGammaCorrectionRGB() - * - * 103 12/16/97 10:03a Atai - * fixed gutexmemreset for glide2 - * - * 101 12/09/97 12:20p Peter - * mac glide port - * - * 100 12/05/97 4:26p Peter - * watcom warnings - * - * 99 12/03/97 11:35a Peter - * is busy thing - * - * 98 11/25/97 12:09p Peter - * nested calls to grLfbLock vs init code locking on v2 - * - * 97 11/21/97 1:02p Peter - * v^2 supported resolutions - * - * 96 11/21/97 11:19a Dow - * Added RESOLUTION_NONE hack for Banshee - * - * 95 11/19/97 2:49p Peter - * env vars in registry for win32 - * - * 94 11/19/97 2:22p Dow - * gsst.c - * - * 93 11/18/97 4:50p Peter - * chipfield stuff cleanup and w/ direct writes - * - * 92 11/18/97 4:00p Atai - * fixed the GR_BEGIN and GR_END error in previous check-in - * - * 91 11/18/97 3:27p Atai - * update vData - * optimize state monster - * - * 90 11/17/97 4:55p Peter - * watcom warnings/chipfield stuff - * - * 89 11/16/97 2:20p Peter - * cleanup - * - * 88 11/15/97 7:43p Peter - * more comdex silliness - * - * 87 11/14/97 11:10p Peter - * open vs hw init confusion - * - * 86 11/14/97 5:02p Peter - * more comdex stuff - * - * 85 11/14/97 4:47p Dow - * New splash screen - * - * 84 11/14/97 12:09a Peter - * comdex thing and some other stuff - * - * 83 11/12/97 9:37p Dow - * Banshee crap - * - * 82 11/12/97 2:27p Peter - * - * 81 11/12/97 1:09p Dow - * H3 Stuf - * - * 80 11/12/97 9:22a Dow - * H3 Mods - * - * 79 11/06/97 3:46p Peter - * sli shutdown problem - * - * 78 11/06/97 3:38p Dow - * More banshee stuff - * - * 77 11/04/97 5:04p Peter - * cataclysm part deux - * - * 76 11/04/97 3:58p Dow - * Banshee stuff - * - * 75 11/03/97 3:43p Peter - * h3/cvg cataclysm - * - * 74 10/29/97 4:59p Peter - * - * 73 10/29/97 2:45p Peter - * C version of Taco's packing code - * - * 72 10/23/97 5:28p Peter - * sli fifo thing - * - * 71 10/17/97 3:15p Peter - * grSstVidMode thingee - * - * 70 10/14/97 2:44p Peter - * moved close flag set - * - * 69 10/09/97 8:02p Dow - * State Monster 1st Cut - * -** -*/ - -#include -#include -#include <3dfx.h> - -#include - -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) -#include -#endif - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) -#define WIN32_LEAN_AND_MEAN -#include -#endif - -#define kPageBoundarySlop 0x1000UL -#define kPageBoundaryMask (kPageBoundarySlop - 1) - - -/* Init hw */ - -typedef struct { - GrScreenResolution_t resolution; - FxU32 xres; - FxU32 yres; -} ResEntry; - -static ResEntry _resTable[] = { - {GR_RESOLUTION_320x200, 320, 200}, /* 0x0 */ - {GR_RESOLUTION_320x240, 320, 240}, /* 0x1 */ - {GR_RESOLUTION_400x256, 400, 256}, /* 0x2 */ - {GR_RESOLUTION_512x384, 512, 384}, /* 0x3 */ - {GR_RESOLUTION_640x200, 640, 200}, /* 0x4 */ - {GR_RESOLUTION_640x350, 640, 350}, /* 0x5 */ - {GR_RESOLUTION_640x400, 640, 400}, /* 0x6 */ - {GR_RESOLUTION_640x480, 640, 480}, /* 0x7 */ - {GR_RESOLUTION_800x600, 800, 600}, /* 0x8 */ - {GR_RESOLUTION_960x720, 960, 720}, /* 0x9 */ - {GR_RESOLUTION_856x480, 856, 480}, /* 0xa */ - {GR_RESOLUTION_512x256, 512, 256}, /* 0xb */ - {GR_RESOLUTION_1024x768, 1024, 768}, /* 0xC */ - {GR_RESOLUTION_1280x1024, 1280, 1024}, /* 0xD */ - {GR_RESOLUTION_1600x1200, 1600, 1200}, /* 0xE */ - {GR_RESOLUTION_400x300, 400, 300}, /* 0xF */ - {GR_RESOLUTION_1152x864, 1152, 864}, /* 0x10 */ - {GR_RESOLUTION_1280x960, 1280, 960}, /* 0x11 */ - {GR_RESOLUTION_1600x1024, 1600, 1024}, /* 0x12 */ - {GR_RESOLUTION_1792x1344, 1792, 1344}, /* 0x13 */ - {GR_RESOLUTION_1856x1392, 1856, 1392}, /* 0x14 */ - {GR_RESOLUTION_1920x1440, 1920, 1440}, /* 0x15 */ - {GR_RESOLUTION_2048x1536, 2048, 1536}, /* 0x16 */ - {GR_RESOLUTION_2048x2048, 2048, 2048 /* 0x17 */} -}; - - -/* --------------------------------------------- - This function both sets and documents the - expected default state for any rendering - context - - ..taco - separated out in preparation for - multiple contexts - ---------------------------------------------*/ -static void -assertDefaultState( void ) -{ -#define FN_NAME "assertDefaultState" - GR_DCL_GC; - - grHints(GR_HINT_ALLOW_MIPMAP_DITHER, 0); - grSstOrigin(gc->state.origin); - grAlphaBlendFunction(GR_BLEND_ONE , GR_BLEND_ZERO, - GR_BLEND_ONE, GR_BLEND_ZERO); - grAlphaTestFunction(GR_CMP_ALWAYS); - grAlphaTestReferenceValue(0); - grChromakeyMode(GR_CHROMAKEY_DISABLE); - grConstantColorValue((FxU32) ~0); - grClipWindow(0, 0, gc->state.screen_width, - gc->state.screen_height); - _grColorCombineDelta0Mode(FXFALSE); - grColorCombine(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_ITERATED, - FXFALSE); - grAlphaCombine(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_CONSTANT, - FXFALSE); - grColorMask(FXTRUE, FXFALSE); - grCullMode(GR_CULL_DISABLE); - grDepthBiasLevel(0); - grDepthMask(FXFALSE); - grDepthBufferMode(GR_DEPTHBUFFER_DISABLE); - grDepthBufferFunction(GR_CMP_LESS); - grDepthBiasLevel(0); - grDitherMode(GR_DITHER_4x4); - grFogMode(GR_FOG_DISABLE); - grFogColorValue(0x00000000); - - /* Get rid of crap in the buffers. */ - grSstIdle(); - if ( gc->state.num_buffers > 1 ) { - grBufferClear( 0, 0, GR_WDEPTHVALUE_FARTHEST ); - grBufferSwap( 1 ); - grBufferClear( 0, 0, GR_WDEPTHVALUE_FARTHEST ); - grBufferSwap( 1 ); - grBufferClear( 0, 0, GR_WDEPTHVALUE_FARTHEST ); - grBufferSwap( 1 ); - grRenderBuffer( GR_BUFFER_BACKBUFFER ); - } else { - grBufferClear( 0, 0, GR_WDEPTHVALUE_FARTHEST ); - grRenderBuffer( GR_BUFFER_FRONTBUFFER ); - } - - guTexMemReset(); - - switch (gc->num_tmu) { - case 2: - grTexClampMode(GR_TMU1, GR_TEXTURECLAMP_CLAMP, GR_TEXTURECLAMP_CLAMP); - grTexDetailControl(GR_TMU1, 0, 1, 1.0F); - grTexFilterMode(GR_TMU1, GR_TEXTUREFILTER_POINT_SAMPLED, - GR_TEXTUREFILTER_POINT_SAMPLED); - grTexLodBiasValue(GR_TMU1, 0.0F); - grTexMipMapMode(GR_TMU1, GR_MIPMAP_DISABLE, FXFALSE); - grTexCombine(GR_TMU1, GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE); - case 1: - grTexClampMode(GR_TMU0, GR_TEXTURECLAMP_CLAMP, GR_TEXTURECLAMP_CLAMP); - grTexDetailControl(GR_TMU0, 0, 1, 1.0F); - grTexFilterMode(GR_TMU0, GR_TEXTUREFILTER_POINT_SAMPLED, - GR_TEXTUREFILTER_POINT_SAMPLED); - grTexLodBiasValue(GR_TMU0, 0.0F); - grTexMipMapMode(GR_TMU0, GR_MIPMAP_DISABLE, FXFALSE); - grTexCombine(GR_TMU0, GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE); - } - grLfbConstantAlpha(0xFF); - grLfbConstantDepth(0); - - /* Glide2x does not expose texture chroma or chroma ranges, but - * glide3x does so we need to make sure that those bits are clear by - * default too so that the bits don't remain set by accident. - */ - { - FxI32 i; - - GR_SET_EXPECTED_SIZE(((gc->num_tmu * 2) + 1) * sizeof(FxU32), (gc->num_tmu * 2) + 1); - - GR_SET(BROADCAST_ID, (SstRegs *)gc->reg_ptr, chromaRange, 0x00UL); - - for(i = 0; i < gc->num_tmu; i++) { - GR_SET((0x02UL << i), (SstRegs *)gc->reg_ptr, chromaKey, 0x00UL); - GR_SET((0x02UL << i), (SstRegs *)gc->reg_ptr, chromaRange, 0x00UL); - } - GR_CHECK_SIZE(); - } -#undef FN_NAME -} /* assertDefaultState */ - -static void -doSplash(void) -{ - GR_DCL_GC; - -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) - { - FxBool - didLoad; - - gc->pluginInfo.moduleHandle = LoadLibrary("3dfxspl2.dll"); - didLoad = (gc->pluginInfo.moduleHandle != NULL); - if (didLoad) { - gc->pluginInfo.initProc = (GrSplashInitProc)GetProcAddress(gc->pluginInfo.moduleHandle, - "_fxSplashInit@24"); - gc->pluginInfo.shutdownProc = (GrSplashShutdownProc)GetProcAddress(gc->pluginInfo.moduleHandle, - "_fxSplashShutdown@0"); - gc->pluginInfo.splashProc = (GrSplashProc)GetProcAddress(gc->pluginInfo.moduleHandle, - "_fxSplash@20"); - gc->pluginInfo.plugProc = (GrSplashPlugProc)GetProcAddress(gc->pluginInfo.moduleHandle, - "_fxSplashPlug@16"); - - didLoad = ((gc->pluginInfo.initProc != NULL) && - (gc->pluginInfo.splashProc != NULL) && - (gc->pluginInfo.plugProc != NULL) && - (gc->pluginInfo.shutdownProc != NULL)); - if (didLoad) { - didLoad = (*gc->pluginInfo.initProc)(gc->grHwnd, - gc->state.screen_width, gc->state.screen_height, - gc->grColBuf, gc->grAuxBuf, - gc->state.color_format); - if (!didLoad) (*gc->pluginInfo.shutdownProc)(); - } - - if (!didLoad) FreeLibrary(gc->pluginInfo.moduleHandle); - } - - /* Clear all the info if we could not load for some reason */ - if (!didLoad) memset(&gc->pluginInfo, 0, sizeof(gc->pluginInfo)); - } -#endif /* (GLIDE_PLATFORM & GLIDE_OS_WIN32) */ - - if (_GlideRoot.environment.noSplash == 0) { - grSplash(0.0f, 0.0f, - (float)gc->state.screen_width, - (float)gc->state.screen_height, - 0); - } - _GlideRoot.environment.noSplash = 1; -} /* doSplash */ - - -/*---------------------------------------------------- - Return a GC to reset state - - ...taco - separated out as a first pass since this will - be common function per context - ----------------------------------------------------*/ -static void initGC ( GrGC *gc ) { - FxI32 t = 0; - - gc->curBuffer = 0; - gc->frontBuffer = 1; - gc->backBuffer = (gc->nColBuffers > 2) ? 2 : gc->curBuffer; - - for (t = 0; t < 7; t++) { - gc->bufferSwaps[t] = 0xffffffff; - } - - gc->bufferSwaps[0] = - (FxU32) gc->cmdTransportInfo.fifoPtr - - (FxU32) gc->cmdTransportInfo.fifoStart; - - gc->swapsPending = 1; - - gc->lockPtrs[GR_LFB_READ_ONLY] = (FxU32)-1; - gc->lockPtrs[GR_LFB_WRITE_ONLY] = (FxU32)-1; - /* Initialize the read/write registers to all 0 */ - gc->state.fbi_config.fbzColorPath = 0; - gc->state.fbi_config.fogMode = 0; - gc->state.fbi_config.alphaMode = 0; - gc->state.fbi_config.fbzMode = 0; - gc->state.fbi_config.lfbMode = 0; - gc->state.fbi_config.clipLeftRight = 0; - gc->state.fbi_config.clipBottomTop = 0; - gc->state.fbi_config.fogColor = 0; - gc->state.fbi_config.zaColor = 0; - gc->state.fbi_config.chromaKey = 0; - gc->state.fbi_config.stipple = 0; - gc->state.fbi_config.color0 = 0; - gc->state.fbi_config.color1 = 0; - for (t = 0; t < gc->num_tmu; t += 1) { - FxU32 textureMode = (FxU32)SST_SEQ_8_DOWNLD; - if ((_GlideRoot.hwConfig.SSTs[_GlideRoot.current_sst].type == GR_SSTTYPE_VOODOO) && - (_GlideRoot.hwConfig.SSTs[_GlideRoot.current_sst].sstBoard.VoodooConfig.tmuConfig[t].tmuRev == 0)) { - textureMode = 0; - } - gc->state.tmu_config[t].textureMode = textureMode; - gc->state.tmu_config[t].tLOD = 0x00000000; - gc->state.tmu_config[t].tDetail = 0x00000000; - gc->state.tmu_config[t].texBaseAddr = 0x00000000; - gc->state.tmu_config[t].texBaseAddr_1 = 0x00000000; - gc->state.tmu_config[t].texBaseAddr_2 = 0x00000000; - gc->state.tmu_config[t].texBaseAddr_3_8 = 0x00000000; - gc->state.tmu_config[t].mmMode = GR_MIPMAP_NEAREST; - gc->state.tmu_config[t].smallLod = G3_LOD_TRANSLATE(GR_LOD_1); - gc->state.tmu_config[t].largeLod = G3_LOD_TRANSLATE(GR_LOD_1); - gc->state.tmu_config[t].evenOdd = GR_MIPMAPLEVELMASK_BOTH; - gc->state.tmu_config[t].nccTable = GR_NCCTABLE_NCC0; - } -} /* initGC */ - - -/*------------------------------------------------------------------- - Function: grSstWinOpen - Date: 3/16 - Implementor(s): dow, gmt, murali, jdt - Mutator: dpc - Library: Glide - Description: - - Initialize the selected SST - - Arguments: - hwnd - pointer to a window handle or null. If NULL, then - the application window handle will be inferred though - the GetActiveWindow() api. - resolution - either one of the pre-defined glide resolutions, - or GR_RESOLUTION_NONE, in which case the window - size is inferred from the size application window - refresh - requested fullscreen refresh rate, ignored in a window - format - requested ccolor format for glide packed color values - origin - location of coordinate origin either upper left or - lower right - nColBuffers - number of color buffers to attempt to allocate - 0 - meaningless - 1 - allocate a front buffer only - 2 - allocate a front and back buffer - 3 - allocate a front, back, aux buffer for tripple buffering - nAuxBuffers - number of aux buffers to attempt to allocate - 0 - no alpha or z buffers - 1 - allocate one aux buffer for alpha/depth buffering - 2 - allocate on depth and one alpha buffer (unsup) - Return: - FXTRUE - glide successfully acquired the necessary resources and a - is ready for rendering - FXFALSE - glide was unsuccessful in getting the necessary resources, - or the requested configuration is unavailble on the host - hardware - any calls to glide rendering routines will result - in undefined behavior. - -------------------------------------------------------------------*/ -GR_ENTRY(grSstWinOpen, FxBool, ( FxU32 hWnd, - GrScreenResolution_t resolution, - GrScreenRefresh_t refresh, - GrColorFormat_t format, - GrOriginLocation_t origin, - int nColBuffers, - int nAuxBuffers)) -{ -#define FN_NAME "grSstWinOpen" -#define TILE_WIDTH_PXLS 64 -#define TILE_HEIGHT_PXLS 32 -#define BYTES_PER_PIXEL 2 -#define MIN_TEXTURE_STORE 0x200000 -#define MIN_FIFO_SIZE 0x10000 -#if defined( GLIDE_INIT_HWC ) - hwcBoardInfo *bInfo = 0; - hwcVidInfo *vInfo = 0; - hwcBufferInfo *bufInfo = 0; - hwcFifoInfo *fInfo = 0; -#elif defined( GLIDE_INIT_HAL ) - FxDeviceInfo devInfo; -#endif /* defined ( GLIDE_INIT_HAL ) */ -#if USE_PACKET_FIFO - int buffer; -#endif - struct cmdTransportInfo *gcFifo = 0; - - GR_BEGIN_NOFIFOCHECK("grSstWinOpen",80); - GDBG_INFO_MORE(gc->myLevel, - "(rez=%d,ref=%d,cformat=%d,origin=%s,#bufs=%d, #abufs=%d)\n", - resolution,refresh,format, - origin ? "LL" : "UL", - nColBuffers, nAuxBuffers); - GR_CHECK_F(FN_NAME, !gc, "no SST selected as current (gc==NULL)"); - -#if 1 - /* ??? the eff is this about */ - if ((nColBuffers == 2) && - (nAuxBuffers == 0)) nAuxBuffers = 1; -#endif - -#ifdef GLIDE_INIT_HWC - /* - ** check if the environment variable for triple buffering is on - */ - if (_GlideRoot.environment.nColorBuffer != -1) { - if (_GlideRoot.environment.nColorBuffer > 0 && - _GlideRoot.environment.nColorBuffer <= 3) { - nColBuffers = _GlideRoot.environment.nColorBuffer; - } - } -#endif - - resolution = - (((FxU32)resolution) > (sizeof(_resTable) / sizeof(ResEntry))) - ? GR_RESOLUTION_640x480 - : resolution; - -#ifdef GLIDE_INIT_HWC - /* - ** hack!!! - ** if we have 8M board and triple buffering, reject resolutions greater than 800x600 - */ - if ((nColBuffers == 3) && (gc->bInfo->h3Mem == 8)) { - switch (resolution) { - case GR_RESOLUTION_960x720: - case GR_RESOLUTION_1024x768: - case GR_RESOLUTION_1280x1024: - case GR_RESOLUTION_1600x1200: - GDBG_INFO( gc->myLevel, "Failed to open for insufficient memory\n" ); - GrErrorCallback( "grSstWinOpen: not enough memory for requested buffers", FXFALSE ); - GR_RETURN( FXFALSE ); - break; - default: - break; - } - } -#endif - - gc->state.screen_width = _resTable[resolution].xres; - gc->state.screen_height = _resTable[resolution].yres; - gc->nColBuffers = nColBuffers; - GR_CHECK_F( FN_NAME, resolution != _resTable[resolution].resolution, - "resolution table compilation incorrect" ); - if ( gc->vidTimings ) { - gc->state.screen_width = gc->vidTimings->xDimension; - gc->state.screen_height = gc->vidTimings->yDimension; - } - - gc->state.color_format = format; - gc->state.origin = origin; - gc->grSstRez = resolution; - gc->grSstRefresh = refresh; - gc->grColBuf = gc->state.num_buffers = nColBuffers; - gc->grAuxBuf = nAuxBuffers; - gc->fbStride = gc->state.screen_width * BYTES_PER_PIXEL; - gc->grHwnd = (int) hWnd; - - /* compute tile dimensions */ - gc->strideInTiles = ( gc->state.screen_width + ( TILE_WIDTH_PXLS - 1 ) ) / TILE_WIDTH_PXLS; - GDBG_INFO(80, "%s: strideInTiles = 0X%x\n", FN_NAME, gc->strideInTiles); - gc->heightInTiles = ( gc->state.screen_height + ( TILE_HEIGHT_PXLS - 1 ) ) / TILE_HEIGHT_PXLS; - GDBG_INFO(80, "%s: heightInTiles = 0x%x\n", FN_NAME, gc->heightInTiles); - gc->bufferStride = gc->strideInTiles * TILE_WIDTH_PXLS * BYTES_PER_PIXEL; - GDBG_INFO(80, "%s: bufferStride = 0x%x\n", FN_NAME, gc->bufferStride); - gc->bufSizeInTiles = gc->strideInTiles * gc->heightInTiles; - GDBG_INFO(80, "%s: bufSizeInTiles = 0x%x\n", FN_NAME, gc->bufSizeInTiles); - gc->bufSize = gc->bufSizeInTiles * TILE_WIDTH_PXLS * TILE_HEIGHT_PXLS * BYTES_PER_PIXEL; - GDBG_INFO(80, "%s: bufSize = 0x%x\n", FN_NAME, gc->bufSize); - - /* Check for enough memory */ -#ifdef GLIDE_INIT_HWC - if ( ( gc->bufSize * ( gc->grColBuf + gc->grAuxBuf ) + MIN_TEXTURE_STORE + MIN_FIFO_SIZE) > - ( gc->bInfo->h3Mem << 20 ) ) { - GDBG_INFO( gc->myLevel, "Failed to open for insufficient memory\n" ); - GrErrorCallback( "grSstWinOpen: not enough memory for requested buffers", FXFALSE ); - GR_RETURN( FXFALSE ); - } -#endif - - /* Allocate Color/Aux Buffers, Set Memory Layout */ - gcFifo = &gc->cmdTransportInfo; - -#if defined( USE_PACKET_FIFO ) -#if defined( GLIDE_INIT_HWC ) - bInfo = gc->bInfo; - vInfo = &bInfo->vidInfo; - bufInfo = &bInfo->buffInfo; - - /* If we closed down then the hw may have been un-mapped (on - * systems that actually support this) so we need to re-map the - * board and re-cache our hw pointers. - */ - if (!gc->hwInitP) { - if (!hwcMapBoard(bInfo, HWC_BASE_ADDR_MASK)) { - GDBG_INFO( gc->myLevel, "Failed to re-map the hw.\n" ); - GrErrorCallback( FN_NAME": Failed to re-map the hw.", FXFALSE ); - GR_RETURN( FXFALSE ); - } - - if (!hwcInitRegisters(bInfo)) { - GDBG_INFO( gc->myLevel, "Failed to re-initialize the hw.\n" ); - GrErrorCallback( FN_NAME": Failed to re-initialize the hw.", FXFALSE ); - GR_RETURN( FXFALSE ); - } - - gc->sstRegs = (SstRegs*)bInfo->regInfo.sstBase; - gc->ioRegs = (SstIORegs*)bInfo->regInfo.ioMemBase; - gc->cRegs = (SstCRegs*)bInfo->regInfo.cmdAGPBase; - gc->lfb_ptr = (FxU32*)bInfo->regInfo.lfbBase; - gc->rawLfb = (FxU32*)bInfo->regInfo.rawLfbBase; - gc->tex_ptr = (FxU32*)SST_TEX_ADDRESS(bInfo->regInfo.sstBase); - } - - vInfo->xRes = gc->state.screen_width; - vInfo->yRes = gc->state.screen_height; - vInfo->refresh = gc->grSstRefresh; - vInfo->tiled = FXTRUE; - vInfo->initialized = FXTRUE; - - if ( hwcAllocBuffers( bInfo, nColBuffers, nAuxBuffers ) == FXFALSE ) { - GDBG_INFO( gc->myLevel, "hwcAllocBuffers failed\n" ); - GrErrorCallback(hwcGetErrorString(), FXFALSE); - GR_RETURN( FXFALSE ); - } - - for (buffer = 0; buffer < nColBuffers; buffer++) { - gc->buffers[buffer] = bufInfo->colBuffStart[buffer]; - GDBG_INFO(80, "Buffer %d: Start: 0x%x\n", buffer, gc->buffers[buffer]); - gc->lfbBuffers[buffer] = (FxU32)gc->rawLfb + bufInfo->lfbBuffAddr[buffer]; - } - if (nAuxBuffers != 0) { - gc->buffers[buffer] = bufInfo->auxBuffStart; - gc->lfbBuffers[buffer] = (FxU32)gc->rawLfb + bufInfo->lfbBuffAddr[buffer]; - GDBG_INFO(80, "Aux Buffer: Start: 0x%x\n", gc->buffers[buffer]); - } - - gc->fbOffset = bInfo->fbOffset; - - switch (gc->num_tmu) { - case 2: - if (_GlideRoot.environment.enUma) { - /* - ** hack for Glide2x to enable uma - */ - gc->tramOffset[0] = gc->tramOffset[1] = bInfo->tramOffset; - gc->tramSize[0] = gc->tramSize[1] = bInfo->tramSize; - gc->tmu_state[0].total_mem = gc->tmu_state[1].total_mem = gc->tramSize[0]; - /* disable splash screen in case it uses 2nd tmu the old style */ - _GlideRoot.environment.noSplash = 1; - } - else { - gc->tramOffset[0] = bInfo->tramOffset; - /* - ** if the environment variable is on, use the its texture memory size * 2 - */ - if ((_GlideRoot.environment.tmuMemory != -1) && (gc->fbOffset >= 0x200000)) - bInfo->tramSize = _GlideRoot.environment.tmuMemory << 21; - /* - ** when tmu size is 2, split the texture memory for each tmu - */ - gc->tramSize[0] = bInfo->tramSize >> 1; - gc->tmu_state[0].total_mem = gc->tramSize[0]; - gc->tramOffset[1] = gc->tramOffset[0] + gc->tramSize[0]; - gc->tramSize[1] = bInfo->tramSize >> 1; - gc->tmu_state[1].total_mem = gc->tramSize[1]; - } - break; - case 1: - default: - gc->tramOffset[0] = bInfo->tramOffset; - /* - ** if the environment variable is on, use the its texture memory size - */ - if ((_GlideRoot.environment.tmuMemory != -1) && (gc->fbOffset >= 0x200000)) - bInfo->tramSize = _GlideRoot.environment.tmuMemory << 20; - gc->tramSize[0] = bInfo->tramSize; - gc->tmu_state[0].total_mem = bInfo->tramSize; - break; - } - - vInfo->hWnd = gc->grHwnd; - vInfo->sRes = gc->grSstRez; - vInfo->vRefresh = gc->grSstRefresh; - - /* Overlay hack */ - gc->desktopOverlay=0; - if (GETENV ("SSTH3_DESKTOP_OVERLAY")) - { - gc->desktopOverlay = 1; - } - - if ( hwcInitVideo( bInfo, FXTRUE, gc->vidTimings, FXTRUE ) == FXFALSE ) { - GrErrorCallback(hwcGetErrorString(), FXFALSE); - GDBG_INFO( gc->myLevel, "hwcInitVideo failed\n" ); - GR_RETURN( FXFALSE ); - } - - GDBG_INFO(80, FN_NAME ": GammaRGB = %1.2f, %1.2f, %1.2f\n", - _GlideRoot.environment.gammaR, - _GlideRoot.environment.gammaG, - _GlideRoot.environment.gammaB); - - { - /* - ** This is a hack for gamma setting. - */ - char *gammastr; - if ((gammastr = GETENV("SSTV2_GAMMA"))) { - _GlideRoot.environment.gammaR - = _GlideRoot.environment.gammaG - = _GlideRoot.environment.gammaB - = (float)atof(gammastr); - } - } - - if ( - _GlideRoot.environment.gammaR != -1.f && - _GlideRoot.environment.gammaG != -1.f && - _GlideRoot.environment.gammaB != -1.f - ) { - hwcGammaRGB(gc->bInfo, _GlideRoot.environment.gammaR, - _GlideRoot.environment.gammaG, - _GlideRoot.environment.gammaB); - } else { - hwcGammaRGB(gc->bInfo, 1.3f, 1.3f, 1.3f); - } - - if (_GlideRoot.environment.grxClk != -1L) - hwcSetGrxClock(gc->bInfo, _GlideRoot.environment.grxClk); - - if (gc->cmdTransportInfo.autoBump == _GlideRoot.environment.autoBump) { - if (!hwcInitFifo( bInfo, gc->cmdTransportInfo.autoBump)) { - hwcRestoreVideo(bInfo); - GrErrorCallback(hwcGetErrorString(), FXFALSE); - GDBG_INFO(gc->myLevel, "hwcInitFifo failed\n"); - GR_RETURN(FXFALSE); - } - } else { - if (!hwcInitAGPFifo(bInfo, FXTRUE)) { - hwcRestoreVideo(bInfo); - GrErrorCallback(hwcGetErrorString(), FXFALSE); - GDBG_INFO(gc->myLevel, "hwcInitFifo failed\n"); - GR_RETURN(FXFALSE); - } - - /* Check to see where the command fifo was placed since the agp - * allocation might have failed for some reason, and fallen back - * to using the normal video command fifo. - */ - gc->cmdTransportInfo.autoBump = ((GR_CAGP_GET(baseSize) & SST_CMDFIFO_DISABLE_HOLES) == 0); - } - - /* COMMAND FIFO SETUP */ - fInfo = &gc->bInfo->fifoInfo; - - /* Establish physical bounds of cmd fifo from HWC calculation */ - gcFifo->fifoOffset = fInfo->fifoStart; - gcFifo->fifoSize = fInfo->fifoLength; - -#elif defined( GLIDE_INIT_HAL ) -#if 0 - gc->fbOffset = 0x200000; - gc->tramOffset = 0x0; - gc->tramSize = gc->fbOffset; - gc->tmu_state[0].total_mem = gc->tramSize; -#else - /* gc->fbOffset = (FxU32)fxHalFbiGetMemory((SstRegs*)gc->reg_ptr); */ - gc->fbOffset = (FxU32)gc->rawLfb; - gc->tramOffset[0] = 0x200000; - gc->tramSize[0] = 0x200000; - gc->tramOffset[1] = gc->tramSize[0] + gc->tramOffset[0]; - gc->tramSize[1] = 0x200000; - gc->tmu_state[0].total_mem = gc->tramSize[0]; - gc->tmu_state[1].total_mem = gc->tramSize[1]; -#endif - - for ( buffer = 0; buffer < nColBuffers; buffer++ ) { - gc->buffers[buffer] = gc->fbOffset + buffer * gc->bufSize; - /* XXXjdt: this is never initialized in the old code */ - gc->lfbBuffers[buffer] = 0; - GDBG_INFO(80, "%s: Buffer %d: 0x%x\n", - FN_NAME, buffer, gc->buffers[buffer]); - } - if( !fxHalGetDeviceInfo((SstRegs*)gc->reg_ptr, &devInfo) ) { - GrErrorCallback(" XXXGetDeviceInfo failed.\n", FXFALSE); - GDBG_INFO( gc->myLevel, - " XXXGetDeviceInfo failed. (0x%x)\n", - gc->reg_ptr ); - GR_RETURN( FXFALSE ); - } - - /* COMMAND FIFO SETUP */ -#if 0 - gcFifo->fifoOffset = gc->fbOffset + - ( gc->bufSize * ( gc->grColBuf + gc->grAuxBuf ) ); - gcFifo->fifoSize = 0x400000 - gcFifo->fifoOffset + gc->fbOffset; -#else - gcFifo->fifoOffset = ( gc->bufSize * ( gc->grColBuf + gc->grAuxBuf ) ); - gcFifo->fifoSize = 0x20000; -#endif - - if ( !fxHalInitCmdFifo((SstRegs *) gc->reg_ptr, - 0, /* which fifo - 0 for 3d cmd fifo */ - /* v fifoStart - offset from hw base v */ - gcFifo->fifoOffset, - gcFifo->fifoSize, /* size - in bytes */ - FXTRUE, /* directExec */ - FXFALSE, /* disableHoles */ - FXFALSE) /* agpEnable */ ) { -#ifdef GLIDE_INIT_HWC - GrErrorCallBack( "fxHalInitCmdFifo failed.\n", FxFALSE ); -#endif - GDBG_INFO( 0, "Error: fxHalInitCmdFifo failed\n" ); - GR_RETURN( FXFALSE ); - } - if ( !fxHalInitVideo( (SstRegs*) gc->reg_ptr, - (resolution == GR_RESOLUTION_NONE) ? GR_RESOLUTION_640x480 - : (resolution), - refresh, - NULL ) ) { -#ifdef GLIDE_INIT_HWC - GrErrorCallBack( "fxHalInitVideo failed.\n", FxFALSE ); -#endif - GDBG_INFO( 0, "Error: fxHalInitVideo failed\n" ); - GR_RETURN( FXFALSE ); - } - fxHalInitVideoOverlaySurface( (SstRegs*) gc->reg_ptr, /* SstRegs */ - FXTRUE, /* 1=enable Overlay surface*/ - FXFALSE, /* 1=enable OS stereo, 0=disable*/ - FXFALSE, /* 1=enable horizontal*/ - 0, /* horizontal scale factor (ignored if*/ - FXFALSE, /* 1=enable vertical scaling,*/ - 0, /* vertical scale factor (ignored if not*/ - 0, /* duh*/ - 1, /* 0=OS linear, 1=tiled*/ - SST_OVERLAY_PIXEL_RGB565U, /* pixel format of OS*/ - FXFALSE, /* bypass clut for OS?*/ - FXFALSE, /* 0=lower 256 CLUT entries,*/ - gc->buffers[gc->curBuffer], /* board address of beginning of OS */ - gc->strideInTiles ); /* distance between scanlines of the OS, in*/ -#endif /* defined( GLIDE_INIT_HAL ) */ -#else /* !defined( USE_PACKET_FIFO ) */ - gc->fbOffset = 0x0; - gc->tramOffset[0] = 0x200000; - gc->tramSize[0] = 0x200000; - gc->tramOffset[1] = gc->tramSize[0] + gc->tramOffset[0]; - gc->tramSize[1] = 0x200000; -#if 0 - gc->tmu_state[0].total_mem = gc->tramSize; - gc->fbOffset = 0x200000; - gc->tramOffset = 0x0; - gc->tramSize = gc->fbOffset; - gc->tmu_state[0].total_mem = gc->tramSize; - - for ( buffer = 0; buffer < nColBuffers; buffer++ ) { - gc->buffers[buffer] = gc->fbOffset + buffer * gc->bufSize; - /* XXXjdt: this is never initialized in the old code */ - gc->lfbBuffers[buffer] = 0; - GDBG_INFO(80, "%s: Buffer %d: 0x%x\n", - FN_NAME, buffer, gc->buffers[buffer]); - } -#endif - if( !fxHalGetDeviceInfo((SstRegs*)gc->reg_ptr, &devInfo) ) { - GrErrorCallback(" XXXGetDeviceInfo failed.\n", FXFALSE); - GDBG_INFO( gc->myLevel, - " XXXGetDeviceInfo failed. (0x%x)\n", - gc->reg_ptr ); - GR_RETURN( 0 ); - } -#if 0 - /* COMMAND FIFO SETUP */ - gcFifo->fifoOffset = gc->fbOffset + - ( gc->bufSize * ( gc->grColBuf + gc->grAuxBuf ) ); - gcFifo->fifoSize = 0x400000 - gcFifo->fifoOffset + gc->fbOffset; - - if ( !fxHalInitCmdFifo((SstRegs *) gc->reg_ptr, - 0, /* which fifo - 0 for 3d cmd fifo */ - /* v fifoStart - offset from hw base v */ - gcFifo->fifoOffset, - gcFifo->fifoSize, /* size - in bytes */ - FXTRUE, /* directExec */ - FXFALSE, /* disableHoles */ - FXFALSE) /* agpEnable */ ) { -#ifdef FX_FAIL_HWC - GrErrorCallBack( "fxHalInitCmdFifo failed.\n", FxFALSE ); -#endif - GDBG_INFO( 0, "Error: fxHalInitCmdFifo failed\n" ); - GR_RETURN( 0 ); - } -#endif - if ( !fxHalInitVideo( (SstRegs*) gc->reg_ptr, - (resolution == GR_RESOLUTION_NONE) ? GR_RESOLUTION_640x480 - : (resolution), - refresh, - NULL ) ) { - GR_RETURN( 0 ); - } - fxHalInitVideoOverlaySurface( (SstRegs*) gc->reg_ptr, /* SstRegs */ - FXTRUE, /* 1=enable Overlay surface*/ - FXFALSE, /* 1=enable OS stereo, 0=disable*/ - FXFALSE, /* 1=enable horizontal*/ - 0, /* horizontal scale factor (ignored if*/ - FXFALSE, /* 1=enable vertical scaling,*/ - 0, /* vertical scale factor (ignored if not*/ - 0, /* duh*/ - 1, /* 0=OS linear, 1=tiled*/ - SST_OVERLAY_PIXEL_RGB565U, /* pixel format of OS*/ - FXFALSE, /* bypass clut for OS?*/ - FXFALSE, /* 0=lower 256 CLUT entries,*/ - gc->buffers[gc->curBuffer], /* board address of beginning of OS */ - gc->strideInTiles ); /* distance between scanlines of the OS, in*/ - _grReCacheFifo(0); -#endif /* !defined( USE_PACKET_FIFO ) */ - - /* Compute Virtual FIFO address extents */ -#ifdef GLIDE_INIT_HWC - if (bInfo->fifoInfo.agpFifo) { - gcFifo->fifoStart = (FxU32 *) bInfo->fifoInfo.agpVirtAddr; - gcFifo->fifoOffset = bInfo->fifoInfo.agpPhysAddr; - } else { -#else - { -#endif - gcFifo->fifoStart = gc->rawLfb + ( gcFifo->fifoOffset >> 2 ); - } - gcFifo->fifoEnd = gcFifo->fifoStart + ( gcFifo->fifoSize >> 2 ); - - /* Adjust room values. - ** RoomToEnd needs enough room for the jmp packet since we never - ** allow the hw to auto-wrap. RoomToRead needs to be adjusted so that - ** we never acutally write onto the read ptr. - ** - ** fifoRoom is generally the min of roomToEnd and roomToRead, but we - ** 'know' here that roomToRead < roomToEnd. - */ -#if USE_PACKET_FIFO - gcFifo->roomToEnd = gcFifo->fifoSize - FIFO_END_ADJUST; - gcFifo->fifoRoom = gcFifo->roomToReadPtr = gcFifo->roomToEnd - sizeof( FxU32 ); - - - /* Set initial fifo state. hw read and sw write pointers at - ** start of the fifo. - */ - gcFifo->fifoPtr = gcFifo->fifoStart; - gcFifo->fifoRead = HW_FIFO_PTR( FXTRUE ); -#endif /* !USE_PACKET_FIFO */ - - if ( (void*)gcFifo->fifoPtr != (void*)gcFifo->fifoRead ) { -#ifdef GLIDE_INIT_HWC - hwcRestoreVideo( bInfo ); -#endif - GDBG_INFO( gc->myLevel, "Initial fifo state is incorrect\n" ); - GR_RETURN( FXFALSE ); - } - - if (!gc->cmdTransportInfo.autoBump) { - gcFifo->bumpSize = _GlideRoot.environment.bumpSize; - - gcFifo->lastBump = gcFifo->fifoPtr; - gcFifo->bumpPos = gcFifo->fifoPtr + gcFifo->bumpSize; - - gcFifo->fifoJmpHdr[0] = - ( SSTCP_PKT0_JMP_AGP | - ( gcFifo->fifoOffset << ( SSTCP_PKT0_ADDR_SHIFT - 2 ))); - gcFifo->fifoJmpHdr[1] = (gcFifo->fifoOffset >> 25); - - - } else { - gcFifo->fifoJmpHdr[0] = - ( SSTCP_PKT0_JMP_LOCAL | - ( gcFifo->fifoOffset << ( SSTCP_PKT0_ADDR_SHIFT - 2 ))); - - - } - - - GDBG_INFO(80, - "Command Fifo:\n" - "\tfifoStart: 0x%x\n" - "\tfifoEnd: 0x%x\n" - "\tfifoOffset: 0x%x\n" - "\tfifoSize: 0x%x\n" - "\tfifoPtr: 0x%x\n", - gcFifo->fifoStart, - gcFifo->fifoEnd, - gcFifo->fifoOffset, - gcFifo->fifoSize, - gcFifo->fifoPtr ); - -#if defined( TACO_MEMORY_FIFO_HACK ) - /* XXXTACOHACK!!! - Insert in-memory fifo */ - gcFifo->vFifoStart = calloc( gcFifo->fifoRoom, 1 ); - gcFifo->vFifoEnd = gcFifo->vFifoStart + ( gcFifo->fifoRoom >> 2 ); - gcFifo->fifoPtr = gcFifo->vFifoStart; - if ( gcFifo->fifoPtr == NULL ) { - GDBG_INFO( gc->myLevel, "Couldn't allocate in-memory fifo\n" ); - GR_RETURN(FXFALSE); - } - GDBG_INFO( 0, "Running with whack in-memory fifo.\n" ); -#endif /* defined ( TACO_MEMORY_FIFO_HACK ) */ - - /* The hw is now in a usable state from the fifo macros */ - gc->open = FXTRUE; - - /* Setup the arch dependent texture procs */ - gc->archDispatchProcs.texDownloadProcs = _GlideRoot.curTexProcs; - - /*------------------------------------------------------ - GC Init - ------------------------------------------------------*/ - GDBG_INFO(gc->myLevel, " GC Init\n"); - initGC( gc ); - - - /*------------------------------------------------------ - 3D State Init - ------------------------------------------------------*/ - GDBG_INFO( gc->myLevel, " 3D State Init\n"); - - GDBG_INFO( gc->myLevel, " Setting default register states\n" ); - gc->state.fbi_config.fbzMode = ( SST_ENRECTCLIP | SST_ENZBIAS ); - - GDBG_INFO( gc->myLevel, " Setting up initial draw buffer state\n" ); - REG_GROUP_BEGIN(BROADCAST_ID, leftOverlayBuf, 1, 0x1); - /* Overlay Hack */ - if (!gc->desktopOverlay) - REG_GROUP_SET(hw, leftOverlayBuf, gc->buffers[gc->frontBuffer]); - else - REG_GROUP_SET(hw, leftOverlayBuf, 0); - REG_GROUP_END(); - - /* Overlay Hack: Set the chroma key to magenta */ - if (gc->desktopOverlay) - { - GR_SET_IO (BROADCAST_ID, hw, vidChromaMin, 0x0000F81F); - GR_SET_IO (BROADCAST_ID, hw, vidChromaMax, 0x0000F81F); - } - - REG_GROUP_BEGIN(BROADCAST_ID, swapbufferCMD, 1, 0x1); - REG_GROUP_SET(hw, swapbufferCMD, 0x0); - REG_GROUP_END(); - -#ifdef GLIDE_INIT_HWC - REG_GROUP_BEGIN(BROADCAST_ID, colBufferAddr, 4, 0xf); - REG_GROUP_SET(hw, colBufferAddr, gc->buffers[gc->curBuffer]); - REG_GROUP_SET(hw, colBufferStride, gc->strideInTiles | SST_BUFFER_MEMORY_TILED ); - REG_GROUP_SET(hw, auxBufferAddr, gc->buffers[nColBuffers]); - REG_GROUP_SET(hw, auxBufferStride, gc->strideInTiles | SST_BUFFER_MEMORY_TILED); - REG_GROUP_END(); -#endif - - GDBG_INFO( gc->myLevel, " Setting all Glide state\n" ); - assertDefaultState(); - -#if defined( TACO_MEMORY_FIFO_HACK ) - _FifoFlush(); -#endif /* defined( TACO_MEMORY_FIFO_HACK ) */ - - /* -------------------------------------------------------- - Splash Screen - --------------------------------------------------------*/ - doSplash(); - - _GlideRoot.windowsInit = FXTRUE; /* to avoid race with grSstControl() */ - - GR_RETURN(FXTRUE); -#undef FN_NAME -} /* grSstWinOpen */ - -/*------------------------------------------------------------------- - Function: grSstWinClose - Date: 3/16 - Implementor(s): jdt - Library: Glide - Description: - Shut down the selected SST - - Shutdown has 4 steps - - 3D Idle - the 3D engine must be idled to make sure that there are no - commands executing in the transport when the registers are - reset - - GC Reset - the GC is flagged as unitialized - (nosup) - - Command Transport Disable - the command transport to the 3D device is put in a state - of reset. No further commands may be issued throught the - command transport - - Video Restore - video is restored to its pre-open state. - - Arguments: - none - Return: - none - -------------------------------------------------------------------*/ -GR_ENTRY(grSstWinClose, void, (void)) -{ -#define FN_NAME "grSstWinClose" - GR_BEGIN_NOFIFOCHECK("grSstWinClose", 80); - GDBG_INFO_MORE(gc->myLevel,"()\n"); - - if ((gc != NULL) && (gc->open)) { -#if GLIDE_INIT_HAL - /* dpc - 22 may 1997 - FixMe! - * We need the equivilant stuff in the hal layer too. - */ -#else /* !GLIDE_INIT_HAL */ -#if defined(GLIDE3) && (GLIDE3_ALPHA) - FARPROC oemRestoreVideo; -#endif - /*-------------------------- - 3D Idle - --------------------------*/ - GDBG_INFO(gc->myLevel, " 3D Idle"); - grSstIdle(); - - /*-------------------------- - Command Transport Disable - --------------------------*/ - GDBG_INFO(gc->myLevel, " Command Transport Disable"); - - /* Video Restore - * - * NB: The hwcRestoreVideo in addition to restoring the video also - * turns off the command fifo and then releases the hw context - * which can unmap the board at the driver level. The next time - * we use grSstWinOpen we need to re-map the board etc just to be - * safe everywhere. - */ - GDBG_INFO(gc->myLevel, " Restore Video"); - hwcRestoreVideo(gc->bInfo); - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) - if (gc->oemInit) { - if (oemRestoreVideo = GetProcAddress(gc->oemInit, "_fxoemRestoreVideo@0")) - oemRestoreVideo(); - FreeLibrary(gc->oemInit); - } -#endif -#endif /* !GLIDE_INIT_HAL */ - - /* Unmap the board */ - hwcUnmapBoard(gc->bInfo); - - /*-------------------------- - GC Reset - --------------------------*/ - GDBG_INFO(gc->myLevel, " GC Reset"); - - /* These are really two different things. - * - * hwInitP indicates whether the init code mapping/init sequence - * is active for this hw. - * - * open includes setting up video, command transport, and the - * initial glide state. - */ - gc->hwInitP = FXFALSE; - } - gc->open = FXFALSE; - - GR_END(); -#undef FN_NAME -} /* grSstWinClose */ - -GR_ENTRY(grSstControl, FxBool, (GrControl_t code)) -{ -#if 0 - GR_DCL_GC; -#define FN_NAME "grSstControl" - GDBG_INFO(41, "%s: code = 0x%x, windowsInit = %d\n", FN_NAME, - code, _GlideRoot.windowsInit); - - if (_GlideRoot.windowsInit && gc->open) { -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) - /* For VG96, windows haven't been created, so there's no point - * trying to control it. - */ - - /* Believe it or not, the following code really should be bracketed - like this. The reason is that GR_BEGIN_NOFIFOCHECK seg faults - when grSstControl is called before the Glide window is truly - initialized. This is a real concern, as grSstControl is called - from event loops, which are asynchronous. - */ - FxU32 - status, - xRes, yRes, - clipLeftRight, clipBottomTop; - - GR_BEGIN_NOFIFOCHECK(FN_NAME,80); - - xRes = initControl(code); - - GDBG_INFO((80, "%s: initControl returned 0x%x\n", FN_NAME, xRes)); - - if (!xRes) return FXFALSE; - - yRes = xRes >> 16; - xRes = xRes & 0xffff; - - /* !! FIXME +++ this call should properly update the gc->fbStride, - this information is known only to the init layer and needs to be - exposed, it is only really necessary to lfblock right now, - and therefore is returned by initGetBufferPtr */ - - gc->state.screen_width = xRes; - gc->state.screen_height = yRes; - - /* Wait for Idle. */ - - nTries = 0; - do { - if (nTries++ >> 999) { - GDBG_INFO((80, "%s: returning FALSE after %d checks for idle\n", - FN_NAME, nTries)); - return FXTRUE; - } - - status = GET(hw->status); - - } while (status & 0x1); - - /* Set ClipRect Via direct writes */ - _grClipNormalizeAndGenerateRegValues(0, 0, xRes, yRes, - &clipLeftRight, - &clipBottomTop); - SET_DIRECT(clipLeftRight1, clipLeftRight); - SET_DIRECT(clipBottomTop1, clipBottomTop); - -#elif (GLIDE_PLATFORM&GLIDE_HW_SST1) - return initControl(code); -#elif (GLIDE_PLATFORM & GLIDE_HW_CVG) && !GLIDE_INIT_HAL - { - FxBool isValidP = FXTRUE; - FxBool passFlag; - - switch ( code ) { - case GR_CONTROL_DEACTIVATE: - passFlag = FXTRUE; - break; - - case GR_CONTROL_ACTIVATE: - passFlag = FXFALSE; - break; - - default: - isValidP = FXFALSE; - } - - if (isValidP) sst1InitVgaPassCtrl(gc->base_ptr, passFlag); - } -#endif - } - - GDBG_INFO(41, "%s: Returning TRUE\n", FN_NAME); - return FXTRUE; -#undef FN_NAME -#else - return FXTRUE; -#endif -} /* grSstControl */ - -/*--------------------------------------------------------------------------- -** grSstPerfStats -*/ -#ifndef GLIDE3_ALPHA -GR_ENTRY(grSstPerfStats, void, (GrSstPerfStats_t *pStats)) -{ -#define FN_NAME "grSstPerfStats" - GR_BEGIN_NOFIFOCHECK("grSstPerfStats",83); - GDBG_INFO_MORE(gc->myLevel,"(0x%x)\n",pStats); - GR_CHECK_F(FN_NAME, !pStats, "NULL pointer"); - - pStats->pixelsIn = GR_GET(hw->stats.fbiPixelsIn); - pStats->chromaFail = GR_GET(hw->stats.fbiChromaFail); - pStats->zFuncFail = GR_GET(hw->stats.fbiZfuncFail); - pStats->aFuncFail = GR_GET(hw->stats.fbiAfuncFail); - pStats->pixelsOut = GR_GET(hw->stats.fbiPixelsOut); - - GR_END(); -#undef FN_NAME -} /* grSstPerfStats */ -#endif - -/*--------------------------------------------------------------------------- -** grStatsResetPerfStats -*/ - -#if defined(GLIDE3) && (GLIDE3_ALPHA) -void FX_CSTYLE -_grSstResetPerfStats(void) -#else -GR_ENTRY(grSstResetPerfStats, void, (void)) -#endif -{ -#define FN_NAME "grSstResetPerfStats" - GR_BEGIN("grSstResetPerfStats",83,4, 1); - GDBG_INFO_MORE(gc->myLevel,"()\n"); - GR_SET(BROADCAST_ID, hw, nopCMD, 1); - GR_END(); -#undef FN_NAME -} /* grSstResetPerfStats */ - - -/*--------------------------------------------------------------------------- -** grSstStatus - return contents of status register -*/ - -#if defined(GLIDE3) && (GLIDE3_ALPHA) -FxU32 FX_CSTYLE -_grSstStatus(void) -#else -GR_ENTRY(grSstStatus, FxU32, (void)) -#endif -{ -#define FN_NAME "grSstStatus" - FxU32 status; - - GR_BEGIN_NOFIFOCHECK(FN_NAME, 83); - - if (!gc->cmdTransportInfo.autoBump) - GR_BUMP_N_GRIND; - - - status = GR_GET(hw->status); - - /* For effed-up stuff */ - status |= (0xffff << 0xc); - - status &= 0xfffffff; /* Clear high nibble */ - - /* OR in buffers pending */ - if (gc->swapsPending) - status |= ((grBufferNumPending() & 0x7) << 28); - - GR_RETURN(status); -#undef FN_NAME -}/* grSstStatus */ - -/*--------------------------------------------------------------------------- -** grSstVideoLine - return current video line number -*/ - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -FxU32 FX_CSTYLE -_grSstVideoLine(void) -#else -GR_ENTRY(grSstVideoLine, FxU32, (void)) -#endif -{ - FxU32 vline = 1; - - return vline; -}/* grSstVideoLine */ - -/*--------------------------------------------------------------------------- -** grSstVRetrace - return contents of SST_VRETRACE bit of status register; -*/ - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -FxBool FX_CSTYLE -_grSstVRetraceOn(void) -#else -GR_ENTRY(grSstVRetraceOn, FxBool, (void)) -#endif -{ - FxU32 status; - GR_BEGIN_NOFIFOCHECK("grSstVRetraceOn",83); - - status = grSstStatus(); - - return ((status & SST_VRETRACE) == 0); - -}/* grSstVRetrace */ - -/*--------------------------------------------------------------------------- -** grSstIdle/grFinish -*/ -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -GR_ENTRY(grFinish, void, (void)) -#define FN_NAME "grFinish" -#else -GR_ENTRY(grSstIdle, void, (void)) -#define FN_NAME "grSstIdle" -#endif -{ - FxU32 status; - GR_BEGIN_NOFIFOCHECK(FN_NAME, 83); - GDBG_INFO_MORE(gc->myLevel,"()\n"); - - gc->counter = gc->expected_counter = 0x0; - -#if GLIDE_DEBUG - { - const FxU32 savedLockCount = gc->cmdTransportInfo.lfbLockCount; - gc->cmdTransportInfo.lfbLockCount = 0; -#endif /* GLIDE_DEBUG */ - - REG_GROUP_BEGIN(BROADCAST_ID, nopCMD, 0x1, 0x1); - REG_GROUP_SET(hw, nopCMD, 0x0); - REG_GROUP_END(); - -#if GLIDE_DEBUG - gc->cmdTransportInfo.lfbLockCount = savedLockCount; - } -#endif /* GLIDE_DEBUG */ - - do { - status = grSstStatus(); - } while (status & SST_BUSY); - - GR_END(); -#undef FN_NAME -} /* grSstIdle */ - -/*------------------------------------------------------------------- - Function: grFlush - Date: 09-Jan-98 - Implementor(s): atai - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -GR_ENTRY(grFlush, void, (void)) -{ -#define FN_NAME "grFlush" - FxU32 status; - GR_BEGIN("grFlush", 83, 4, 1); - GDBG_INFO_MORE(gc->myLevel,"()\n"); - - GR_SET(BROADCAST_ID, hw, nopCMD, 0x0); - - do { - status = grSstStatus(); - } while (status & SST_BUSY); - - GR_END(); -#undef FN_NAME -} /* grSstIdle */ -#endif - -/*--------------------------------------------------------------------------- -** grSstIsBusy - find out if the SST is busy or not -*/ - -#if defined(GLIDE3) && defined(GLIDE_ALPHA) -FxBool FX_CSTYLE -grSstIsBusy(void) -#else -GR_ENTRY(grSstIsBusy, FxBool, (void)) -#endif -{ -#define FN_NAME "grSstIsBusy" - static FxBool nopP = FXTRUE; - FxBool busy; - GR_BEGIN_NOFIFOCHECK("grSstIsBusy", 80); - - /* dpc - 22 may 1997 - FixMe! - * Seems like the simplest way to do it, but is this really the way - * to do it? - */ - if (nopP) { - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, nopCMD, 0); - GR_CHECK_SIZE(); - } - -#if defined(GLIDE3) && (GLIDE3_ALPHA) - busy = ((_grSstStatus() & SST_BUSY) != 0); -#else - busy = ((grSstStatus() & SST_BUSY) != 0); -#endif - nopP = !busy; - - GDBG_INFO(84,"grSstIsBusy() => 0x%x\n", busy); - - return busy; -#undef FN_NAME -}/* grSstIsBusy */ - -/*--------------------------------------------------------------------------- -** grGammaCorrectionValue - set the gamma correction value -*/ - -GR_ENTRY(grGammaCorrectionValue, void, (float gamma)) -{ - GR_BEGIN_NOFIFOCHECK("grGammaCorrectionValue",80); - GDBG_INFO_MORE(gc->myLevel,"(%g)\n",gamma); - -#if GLIDE_INIT_HAL - fxHalInitGamma(hw, gamma); -#else /* !GLIDE_INIT_HAL */ - - hwcGammaRGB(gc->bInfo, gamma, gamma, gamma); - -#endif /* !GLIDE_INIT_HAL */ - - GR_END(); -} /* grGammaCorrectionValue */ - -/*--------------------------------------------------------------------------- -** grSstOrigin - Set the orgin orientation of the screen. -** -** Returns: -** -** Notes: -** -*/ - -GR_STATE_ENTRY(grSstOrigin, void, (GrOriginLocation_t origin)) -{ -#define FN_NAME "grSstOrigin" - FxU32 fbzMode; - GR_BEGIN_NOFIFOCHECK("grSstOrigin", 83); - GDBG_INFO_MORE(gc->myLevel, "(%d)\n", origin); - - /* Initialize FBZMODE register */ - fbzMode = gc->state.fbi_config.fbzMode; - if (origin == GR_ORIGIN_LOWER_LEFT) - fbzMode |= SST_YORIGIN; - else - fbzMode &= ~(SST_YORIGIN); - - /* dpc - 22 may 1997 - FixMe! - * Do we need to do anything here for the HAL? - */ -#if !GLIDE_INIT_HAL - /* dpc - 5 sep 1997 - FixMe! - * This is the old way. Is there anything else we - * need to do here? - * - * initOrigin(origin); - */ -#endif - - gc->state.fbi_config.fbzMode = fbzMode; - -#if !GLIDE3 - REG_GROUP_BEGIN(BROADCAST_ID, fbzMode, 0x1, 0x1); - REG_GROUP_SET(hw, fbzMode, fbzMode); - REG_GROUP_END(); -#endif - -#undef FN_NAME -} /* grSstOrigin */ - -/* GMT: do we really have users for this??? - * CHD: No. - * JDT: Huh? If you're talking about grSstOrigin, you're smoking crack. - * if you are talking about SstConfigPipeline, it is evil and must - * be destroyed. :) - * dpc: There is one user that I know of. This 'Nature' demo that Scott just - * gave me. - * chd: It's a stub now. - * (much time elapses) - * chd: But WTF is that forward decl down there? - * dpc: Its to get rid of the damn compiler warning for a function that - * we only sort of export. - */ - - -extern FX_ENTRY void FX_CALL -grSstConfigPipeline(GrChipID_t chip, FxU32 reg, FxU32 value); - -/*--------------------------------------------------------------------------- -** grSstConfigPipeline -*/ - -GR_ENTRY(grSstConfigPipeline, void, (GrChipID_t chip, FxU32 reg, FxU32 value)) -{ -} /* grSstConfigPipeline */ - diff --git a/glide2x/h3/glide/src/gsstdef.h b/glide2x/h3/glide/src/gsstdef.h deleted file mode 100644 index a75064c..0000000 --- a/glide2x/h3/glide/src/gsstdef.h +++ /dev/null @@ -1,244 +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 3/17/99 6:16p Dow -** Phantom Menace and other fixes. - * - * 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 -#else -#include -#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__ */ diff --git a/glide2x/h3/glide/src/gstrip.c b/glide2x/h3/glide/src/gstrip.c deleted file mode 100644 index bbfeb84..0000000 --- a/glide2x/h3/glide/src/gstrip.c +++ /dev/null @@ -1,308 +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 3/17/99 6:16p Dow -** Phantom Menace and other fixes. -** -** 21 12/03/98 11:27p Dow -** Code 'cleanup' heç - * - * 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 effage 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 - -#define FX_DLL_DEFINITION -#include -#include -#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 diff --git a/glide2x/h3/glide/src/gtex.c b/glide2x/h3/glide/src/gtex.c deleted file mode 100644 index 84175b0..0000000 --- a/glide2x/h3/glide/src/gtex.c +++ /dev/null @@ -1,1216 +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:28 joseph -** Initial checkin into SourceForge. -** -** -** 3 3/17/99 6:16p Dow -** Phantom Menace and other fixes. -** -** 49 3/08/99 12:20p Peter -** removed unnecessary nop's -** -** 48 3/02/99 2:22p Peter -** 2d nop flushes (although 3d nop should too) -** -** 47 2/19/99 10:15a Peter -** multi-base sourcing -** -** 46 2/16/99 4:14p Peter -** made texture table declarations consistent -** -** 45 2/10/99 2:24p Peter -** corrected alignment textures within an alignment allocation unit -** -** 44 12/09/98 4:44p Atai -** fixed debug build -** -** 42 10/20/98 4:39p Atai -** update tramOffset and tramSize -** -** 41 8/12/98 4:25p Peter -** fixed sense of trilinear fixup -** -** 40 6/24/98 10:55a Peter -** gary's trilinear hell bug -** -** 39 5/18/98 3:20p Peter -** crybaby warning for grTexCombine about different lod based factors -** -** 38 5/07/98 4:13p Peter -** lbe texture thing -** -** 37 4/16/98 3:58p Peter -** 1x1 lod fix, sorry John -** -** 36 4/14/98 6:41p Peter -** Merge w/ cvg glide cleanup -** -** 35 3/28/98 11:24a Dow -** itwoç - * - * 32 1/13/98 12:42p Atai - * fixed grtexinfo, grVertexLayout, and draw triangle - * - * 31 1/09/98 6:48p Atai - * grTexInfo, GR_LOD_* and GR_ASPECT_* - * - * 30 1/08/98 7:09p Peter - * real hw stuff modulo makefile change - * - * 29 1/08/98 4:58p Atai - * tex table broadcast, grVertexLayout enable/disable, stq, and some - * defines - * - * 28 1/07/98 10:22a Peter - * lod dithering env var - * - * 27 1/05/98 6:06p Atai - * glide extension stuff - * - * 26 12/18/97 10:52a Atai - * fixed grGet(GR_VIDEO_POS) - * - * 25 12/17/97 4:45p Peter - * groundwork for CrybabyGlide - * - * 24 12/11/97 4:15p Peter - * fixed assertions - * - * 23 12/05/97 4:26p Peter - * watcom warnings - * - * 22 11/20/97 6:57p Dow - * baseaddress for banshee - * - * 21 11/18/97 4:36p Peter - * chipfield stuff cleanup and w/ direct writes - * - * 20 11/17/97 4:55p Peter - * watcom warnings/chipfield stuff - * - * 19 11/03/97 3:43p Peter - * h3/cvg cataclysm - * - * 18 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 - * - * 17 9/05/97 12:31p Peter - * more reg write grouping - * - * 16 7/08/97 2:48p Peter - * - * 15 6/06/97 10:47a Peter - * texture downloading, fixed 640x480 dimension, changed cvg dep to be the - * same as sst1 - * - * 14 5/27/97 1:16p Peter - * Basic cvg, w/o cmd fifo stuff. - * - * 13 5/21/97 6:05a Peter - * - * 12 3/04/97 9:08p Dow - * - * 11 3/03/97 10:58a Jdt - * Fixe for 2-pass trilinear - * - * 10 12/23/96 1:37p Dow - * chagnes for multiplatform glide -** -*/ - -#include <3dfx.h> - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -/* Make sure that the trilinear blending bits are set in a - * consistent manner across the tmu's. This only really matters if - * we have multiple tmu's, but this state is really setup across - * multiple calls (grTexCombine, grTexMipMapMode, and - * grTexSource). - * - * NB: This must be called after the shadows are updated because - * _grTexCheckTriLinear() will use the shadow register values - * to determine the current state of trilinearness. - * - * FixMe: This should eventually get merged in w/ the texture - * statemonster. When/If that ever happens. - */ -static void -_grTexCheckTriLinear(GrChipID_t tmu) -{ -#define FN_NAME "_grTexCheckTriLinear" - GR_BEGIN_NOFIFOCHECK(FN_NAME, 90); - GDBG_INFO_MORE(gc->myLevel, "(0x%X)\n", tmu); - -#if (GLIDE_NUM_TMU > 2) -#error "(GLIDE_NUM_TMU > 2): Write this code" -#endif - -/* NB: The factor mask needs to include the factor bits as - * well as the reverse bit so that we can differentiate - * between the lodfrac and the (1 - lodfrac) case. - */ -#define SST_TC_FACTOR_MASK (SST_TC_MSELECT | SST_TC_REVERSE_BLEND) - -#define SST_MIPMAP_LEVEL_MASK (SST_LOD_ODD | SST_LOD_TSPLIT) - - /* Is this tmu on? */ - if (!gc->tmuLodDisable[tmu]) { - const struct tmu_config_t* tmu0 = gc->state.tmu_config; - const struct tmu_config_t* tmu1 = gc->state.tmu_config + 1; - const struct tmu_config_t* curTmu = gc->state.tmu_config + tmu; - const struct tmu_config_t* otherTmu = gc->state.tmu_config + !tmu; - - /* This is the 'tricky' state where we have to manage the states - * of teh tmu's together to get the correct effect. Within this - * state there are two sub-states: two-pass trilinear and single - * pass using both tmu's w/ split levels. - * - * Case 1 - TMU set for lod blending and has both even/odd levels - */ - if (((curTmu->textureMode & SST_TRILINEAR) == SST_TRILINEAR) && - (curTmu->evenOdd == GR_MIPMAPLEVELMASK_BOTH)) { - - /* Check the 'other' tmu to see if it is active, if not then we - * are doing two pass trilinear so check that we have the - * correct even/odd things set based on the factor where one - * pass will use GR_COMBINE_FACTOR_LOD_FRACTION and the other - * will use (1 - GR_COMBINE_FACTOR_LOD_FRACTION). - */ - if (gc->tmuLodDisable[!tmu]) { - /* NB: In this case the rgb/alpha factors need to match so - * checking for only one of them is fine. - */ - const FxU32 levelMask = (((curTmu->textureMode & SST_TC_FACTOR_MASK) == SST_TC_MLODFRAC) - ? SST_LOD_ODD - : 0); - - GDBG_INFO(gc->myLevel, FN_NAME": Two-pass trilinear fixup (0x%X) : tLOD : (0x%X : 0x%X)\n", - tmu, curTmu->tLOD, ((curTmu->tLOD & ~SST_MIPMAP_LEVEL_MASK) | levelMask)); - - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(eChipTMU0, SST_TMU(hw, 0), tLOD, - ((curTmu->tLOD & ~SST_MIPMAP_LEVEL_MASK) | levelMask)); - GR_CHECK_SIZE(); - } else { - /* One pass trilinear - * - * Make sure that the tmu's have the levels split across the - * two tmu's. There are basically three cases based on what - * the user might have already set on the other tmu. - */ - if (((tmu0->textureMode & SST_TC_BLEND) == SST_TC_BLEND) && - ((tmu1->textureMode & SST_TC_REPLACE) == SST_TC_REPLACE)) { - FxU32 evenOdd[GLIDE_NUM_TMU]; - FxU32* curEvenOdd = evenOdd + tmu; - - { - FxU32 i; - - for(i = 0; i < GLIDE_NUM_TMU; i++) { - evenOdd[i] = gc->state.tmu_config[i].tLOD & SST_LOD_ODD; - } - } - - /* 1 - The other tmu already has the even levels. */ - if ((otherTmu->evenOdd == GR_MIPMAPLEVELMASK_EVEN) && - (curTmu->evenOdd != GR_MIPMAPLEVELMASK_ODD)) { - *curEvenOdd = SST_LOD_ODD; - goto __tmuRegUpdate; - } - - /* 2 - The other tmu already has the odd levels. */ - if ((otherTmu->evenOdd == GR_MIPMAPLEVELMASK_ODD) && - (curTmu->evenOdd != GR_MIPMAPLEVELMASK_EVEN)) { - *curEvenOdd = 0; - goto __tmuRegUpdate; - } - - /* 3 - The other tmu already has both the levels. If the - * downstream tmu's factor is lodFrac then the upstream tmu - * needs to be (1 - lodFrac) and vice-versa. - */ - if (otherTmu->evenOdd == GR_MIPMAPLEVELMASK_BOTH) { - evenOdd[0] = (((tmu0->textureMode & SST_TC_FACTOR_MASK) == SST_TC_MLODFRAC) - ? SST_LOD_ODD - : 0); - evenOdd[1] = ~evenOdd[0] & SST_LOD_ODD; - - goto __tmuRegUpdate; - } - - /* Do the register updates */ - if (0) { - __tmuRegUpdate: - GDBG_INFO(gc->myLevel, FN_NAME": Tri-linear fixup (0x%X : 0x%X) : (0x%X : 0x%X)\n", - tmu0->tLOD, tmu1->tLOD, - ((tmu0->tLOD & ~SST_MIPMAP_LEVEL_MASK) | evenOdd[0]), - ((tmu1->tLOD & ~SST_MIPMAP_LEVEL_MASK) | evenOdd[1])); - - GR_SET_EXPECTED_SIZE((sizeof(FxU32) << 1), 2); - { - GR_SET(eChipTMU0, SST_TMU(hw, 0), tLOD, - ((tmu0->tLOD & ~SST_MIPMAP_LEVEL_MASK) | evenOdd[0])); - GR_SET(eChipTMU1, SST_TMU(hw, 1), tLOD, - ((tmu1->tLOD & ~SST_MIPMAP_LEVEL_MASK) | evenOdd[1])); - } - GR_CHECK_SIZE(); - } - } - } - } - } - - GR_END(); -#undef FN_NAME -} - -/*--------------------------------------------------------------------------- -** grTexClampMode -*/ -GR_ENTRY(grTexClampMode, void, - (GrChipID_t tmu, GrTextureClampMode_t s_clamp_mode, GrTextureClampMode_t t_clamp_mode)) -{ -#define FN_NAME "grTexClampMode" - FxU32 texturemode; - FxU32 clampMode =((s_clamp_mode == GR_TEXTURECLAMP_CLAMP ? SST_TCLAMPS : 0) | - (t_clamp_mode == GR_TEXTURECLAMP_CLAMP ? SST_TCLAMPT : 0)); - - GR_BEGIN("grTexClampMode",88,4, 1); - GDBG_INFO_MORE(gc->myLevel,"(%d, %d,%d)\n",tmu,s_clamp_mode,t_clamp_mode); - GR_CHECK_TMU(FN_NAME, tmu); - - texturemode = gc->state.tmu_config[tmu].textureMode; - texturemode &= ~(SST_TCLAMPS | SST_TCLAMPT); - texturemode |= clampMode; - - GR_SET((0x02UL << tmu), SST_TMU(hw, tmu), textureMode, texturemode); - gc->state.tmu_config[tmu].textureMode = texturemode; - GR_END(); -#undef FN_NAME -} /* grTexClampMode */ - -/*--------------------------------------------------------------------------- -** grTexCombine -*/ -GR_ENTRY(grTexCombine, void, - (GrChipID_t tmu, - GrCombineFunction_t rgb_function, GrCombineFactor_t rgb_factor, - GrCombineFunction_t alpha_function, GrCombineFactor_t alpha_factor, - FxBool rgb_invert, FxBool alpha_invert)) -{ -#define FN_NAME "grTexCombine" - FxU32 texturemode; - FxU32 tLod; - FxU32 tmuMask; - FxBool localColorP = FXFALSE; - FxBool localAlphaP = FXFALSE; - - GR_BEGIN_NOFIFOCHECK("grTexCombine", 88); - GDBG_INFO_MORE(gc->myLevel,"(%d, %d,%d, %d,%d, %d,%d)\n", - tmu, rgb_function, rgb_factor, - alpha_function, alpha_factor, - rgb_invert, alpha_invert); - GR_CHECK_TMU(FN_NAME, tmu); - GR_CHECK_W(FN_NAME, - rgb_function < GR_COMBINE_FUNCTION_ZERO || - rgb_function > GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA, - "unsupported texture color combine function"); - GR_CHECK_W(FN_NAME, - alpha_function < GR_COMBINE_FUNCTION_ZERO || - alpha_function > GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA, - "unsupported texture alpha combine function"); - GR_CHECK_W(FN_NAME, - (rgb_factor & 0x7) < GR_COMBINE_FACTOR_ZERO || - (rgb_factor & 0x7) > GR_COMBINE_FACTOR_LOD_FRACTION || - rgb_factor > GR_COMBINE_FACTOR_ONE_MINUS_LOD_FRACTION, - "unsupported texture color combine scale factor"); - GR_CHECK_W(FN_NAME, - (alpha_factor & 0x7) < GR_COMBINE_FACTOR_ZERO || - (alpha_factor & 0x7) > GR_COMBINE_FACTOR_LOD_FRACTION || - alpha_factor > GR_COMBINE_FACTOR_ONE_MINUS_LOD_FRACTION, - "unsupported texture alpha combine scale factor"); - - GR_CHECK_COMPATABILITY(FN_NAME, - (rgb_factor != alpha_factor) && - (((rgb_factor & 0x07UL) == GR_COMBINE_FACTOR_DETAIL_FACTOR) || - ((rgb_factor & 0x07UL) == GR_COMBINE_FACTOR_LOD_FRACTION)) && - (((alpha_factor & 0x07UL) == GR_COMBINE_FACTOR_DETAIL_FACTOR) || - ((alpha_factor & 0x07UL) == GR_COMBINE_FACTOR_LOD_FRACTION)), - "Incompatible texture combine factors (rgb vs alpha) based on lod"); - - texturemode = gc->state.tmu_config[tmu].textureMode; - texturemode &= ~(SST_TCOMBINE | SST_TACOMBINE); - tLod = gc->state.tmu_config[tmu].tLOD; - tLod &= ~(SST_LOD_ODD); - - /* tmuMask tells grColorCombineFunction what to turn off an on if - * the ccFunc requires texture mapping - */ - tmuMask = GR_TMUMASK_TMU0 << tmu; - gc->state.tmuMask &= ~tmuMask; - - /* setup scale factor bits */ - texturemode |= (rgb_factor & 0x7) << SST_TC_MSELECT_SHIFT; - if (!(rgb_factor & 0x8)) texturemode |= SST_TC_REVERSE_BLEND; - if (((rgb_factor & 0x7) == GR_COMBINE_FACTOR_LOCAL) || - ((rgb_factor & 0x7) == GR_COMBINE_FACTOR_LOCAL_ALPHA)) - gc->state.tmuMask |= tmuMask; - - texturemode |= (alpha_factor & 0x7) << SST_TCA_MSELECT_SHIFT; - if (!(alpha_factor & 0x8)) texturemode |= SST_TCA_REVERSE_BLEND; - if (((alpha_factor & 0x7) == GR_COMBINE_FACTOR_LOCAL) || - ((alpha_factor & 0x7) == GR_COMBINE_FACTOR_LOCAL_ALPHA)) - gc->state.tmuMask |= tmuMask; - - /* setup invert output bits */ - if (rgb_invert) texturemode |= SST_TC_INVERT_OUTPUT; - if (alpha_invert) texturemode |= SST_TCA_INVERT_OUTPUT; - - /* setup core color combine unit bits */ - switch (rgb_function) { - case GR_COMBINE_FUNCTION_ZERO: - texturemode |= SST_TC_ZERO_OTHER; - localColorP = FXTRUE; - break; - - case GR_COMBINE_FUNCTION_LOCAL: - texturemode |= SST_TC_ZERO_OTHER | SST_TC_ADD_CLOCAL; - gc->state.tmuMask |= tmuMask; - localColorP = FXTRUE; - break; - - case GR_COMBINE_FUNCTION_LOCAL_ALPHA: - texturemode |= SST_TC_ZERO_OTHER | SST_TC_ADD_ALOCAL; - gc->state.tmuMask |= tmuMask; - localColorP = FXTRUE; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER: - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL: - texturemode |= SST_TC_ADD_CLOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA: - texturemode |= SST_TC_ADD_ALOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL: - texturemode |= SST_TC_SUB_CLOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL: - texturemode |= SST_TC_SUB_CLOCAL | SST_TC_ADD_CLOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL_ALPHA: - texturemode |= SST_TC_SUB_CLOCAL | SST_TC_ADD_ALOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL: - texturemode |= SST_TC_ZERO_OTHER | SST_TC_SUB_CLOCAL | SST_TC_ADD_CLOCAL; - gc->state.tmuMask |= tmuMask; - localColorP = ((rgb_factor & 0x07UL) != GR_COMBINE_FACTOR_OTHER_ALPHA); - break; - - case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA: - texturemode |= SST_TC_ZERO_OTHER | SST_TC_SUB_CLOCAL | SST_TC_ADD_ALOCAL; - gc->state.tmuMask |= tmuMask; - localColorP = ((rgb_factor & 0x07UL) != GR_COMBINE_FACTOR_OTHER_ALPHA); - break; - } - - switch (alpha_function) { - case GR_COMBINE_FUNCTION_ZERO: - texturemode |= SST_TCA_ZERO_OTHER; - localAlphaP = FXTRUE; - break; - - case GR_COMBINE_FUNCTION_LOCAL: - texturemode |= SST_TCA_ZERO_OTHER | SST_TCA_ADD_CLOCAL; - gc->state.tmuMask |= tmuMask; - localAlphaP = FXTRUE; - break; - - case GR_COMBINE_FUNCTION_LOCAL_ALPHA: - texturemode |= SST_TCA_ZERO_OTHER | SST_TCA_ADD_ALOCAL; - gc->state.tmuMask |= tmuMask; - localAlphaP = FXTRUE; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER: - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL: - texturemode |= SST_TCA_ADD_CLOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA: - texturemode |= SST_TCA_ADD_ALOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL: - texturemode |= SST_TCA_SUB_CLOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL: - texturemode |= SST_TCA_SUB_CLOCAL | SST_TCA_ADD_CLOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL_ALPHA: - texturemode |= SST_TCA_SUB_CLOCAL | SST_TCA_ADD_ALOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL: - texturemode |= SST_TCA_ZERO_OTHER | SST_TCA_SUB_CLOCAL | SST_TCA_ADD_CLOCAL; - gc->state.tmuMask |= tmuMask; - localAlphaP = ((alpha_factor & 0x07UL) != GR_COMBINE_FACTOR_OTHER_ALPHA); - break; - - case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA: - texturemode |= SST_TCA_ZERO_OTHER | SST_TCA_SUB_CLOCAL | SST_TCA_ADD_ALOCAL; - gc->state.tmuMask |= tmuMask; - localAlphaP = ((alpha_factor & 0x07UL) != GR_COMBINE_FACTOR_OTHER_ALPHA); - break; - } - - /* Hack to enable TWO-PASS Trilinear */ - if (texturemode & SST_TRILINEAR) { - if ((texturemode & SST_TC_ZERO_OTHER) && - (texturemode & SST_TC_BLEND_LODFRAC) && - !(texturemode & SST_TC_REVERSE_BLEND)) { - tLod |= SST_LOD_ODD; - } - } - tLod |= _gr_evenOdd_xlate_table[gc->state.tmu_config[tmu].evenOdd]; - - /* Update shadows */ - gc->state.tmu_config[tmu].textureMode = texturemode; - gc->state.tmu_config[tmu].tLOD = tLod; - -#if 1 - /* If the state of a tmu changes from active then make sure that it - * is addressing some valid tiny texture so taht it does not spend - * time thrashing on a large texture access. - * - * NB: We don't update the shadow here so the other bits in the - * register shadow should be unchanged. - */ - { - const FxI32 upstreamTmu = tmu + 1; - - if (upstreamTmu < gc->num_tmu) { - if (localColorP && localAlphaP) { - SstRegs* tmuHw = SST_TMU(hw, upstreamTmu); - - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET((0x02UL << upstreamTmu), tmuHw, tLOD, SST_TLOD_MINMAX_INT(GR_LOD_1, GR_LOD_1)); - GR_CHECK_SIZE(); - - gc->tmuLodDisable[upstreamTmu] = FXTRUE; - - GDBG_INFO(gc->myLevel, FN_NAME": Disabling tmu(%ld) : (0x%X : 0x%X)\n", - upstreamTmu, rgb_function, alpha_function); - } else if (gc->tmuLodDisable[upstreamTmu]) { - SstRegs* tmuHw = SST_TMU(hw, upstreamTmu); - - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET((0x02UL << upstreamTmu), tmuHw, tLOD, gc->state.tmu_config[upstreamTmu].tLOD); - GR_CHECK_SIZE(); - - gc->tmuLodDisable[upstreamTmu] = FXFALSE; - } - } - /* If this tmu is inactive then also do the reset for the register - * write, but not in the shadow so that the remaining bits are - * retained. - */ - if ((gc->state.tmuMask & tmuMask) == 0) { - tLod = SST_TLOD_MINMAX_INT(GR_LOD_1, GR_LOD_1); - } - } -#endif - - /* update register */ - { - SstRegs* tmuHw = SST_TMU(hw, tmu); - - REG_GROUP_BEGIN((0x02 << tmu), textureMode, 2, 0x3); - { - REG_GROUP_SET(tmuHw, textureMode , texturemode); - REG_GROUP_SET(tmuHw, tLOD, tLod); - } - REG_GROUP_END(); - } - - /* Make sure that the trilinear blending bits are set in a - * consistent manner across the tmu's. This only really matters if - * we have multiple tmu's, but this state is really setup across - * multiple calls (grTexCombine, grTexMipMapMode, and - * grTexSource). - * - * NB: This must happen after the shadows are updated because - * _grTexCheckTriLinear() will use the shadow register values - * to determine the current state of trilinearness. - */ - if (gc->num_tmu > 1) _grTexCheckTriLinear(tmu); - - /* update paramIndex */ - _grUpdateParamIndex(); - - GR_END(); -#undef FN_NAME -} /* grTexCombine */ - -/* -** _grTexDetailControl, NOTE: its up to caller to account for bytes -*/ -GR_DDFUNC(_grTexDetailControl, void, (GrChipID_t tmu, FxU32 detail)) -{ -#define FN_NAME "_grTexDetailControl" - GR_BEGIN(FN_NAME,88,4, 1); - GDBG_INFO_MORE(gc->myLevel, "(%d, 0x%X)\n", tmu, detail); - GR_CHECK_TMU(FN_NAME, tmu); - - GR_SET((0x02UL << tmu), SST_TMU(hw, tmu), tDetail, detail); - gc->state.tmu_config[tmu].tDetail = detail; - - GR_END(); -#undef FN_NAME -} /* _grTexDetailControl */ - -/*--------------------------------------------------------------------------- -** grTexFilterMode -*/ - -GR_ENTRY(grTexFilterMode, void, - (GrChipID_t tmu, GrTextureFilterMode_t minfilter, GrTextureFilterMode_t magfilter)) -{ -#define FN_NAME "grTexFilterMode" - FxU32 texMode; - - GR_BEGIN("grTexFilterMode",99,4, 1); - GDBG_INFO_MORE(gc->myLevel,"(%d,%d,%d)\n",tmu,minfilter,magfilter); - GR_CHECK_TMU(FN_NAME, tmu); - - texMode = gc->state.tmu_config[tmu].textureMode; - texMode &= ~(SST_TMINFILTER | SST_TMAGFILTER); - texMode |= (minfilter == GR_TEXTUREFILTER_BILINEAR ? SST_TMINFILTER : 0) | - (magfilter == GR_TEXTUREFILTER_BILINEAR ? SST_TMAGFILTER : 0); - - GR_SET((0x02UL << tmu), SST_TMU(hw, tmu), textureMode, texMode); - gc->state.tmu_config[tmu].textureMode = texMode; - - GR_END(); -#undef FN_NAME -} /* grTexFilterMode */ - -/*--------------------------------------------------------------------------- -** grTexLodBiasValue -*/ - -GR_ENTRY(grTexLodBiasValue, void, - (GrChipID_t tmu, float fvalue)) -{ -#define FN_NAME "grTexLodBiasValue" - FxU32 tLod; - - GR_BEGIN("grTexLodBiasValue",88,4, 1); - GDBG_INFO_MORE(gc->myLevel,"(%d,%g)\n",tmu,fvalue); - GR_CHECK_TMU(FN_NAME, tmu); - - tLod = gc->state.tmu_config[tmu].tLOD; - tLod &= ~(SST_LODBIAS); - tLod |= _grTexFloatLODToFixedLOD(fvalue) << SST_LODBIAS_SHIFT; - - GR_SET((0x02 << tmu), SST_TMU(hw, tmu), tLOD, tLod); - gc->state.tmu_config[tmu].tLOD = tLod; - - GR_END(); -#undef FN_NAME -} /* grTexLodBiasValue */ - -/*------------------------------------------------------------------- - Function: grTexMipMapMode - Date: 6/2 - Implementor(s): GaryMcT, Jdt - Library: glide - Description: - Sets the mip map mode for the specified TMU - "Ex" because glide's grTexMipMapMode is inadequate for - low level texture memory management - Arguments: - tmu - tmu to update - mmMode - mipmap mode - One of: - GR_MIPMAP_DISABLE - GR_MIPMAP_NEAREST - GR_MIPMAP_NEAREST_DITHER - lodBlend - enable lodBlending - FXTRUE - enabled - FXFALSE - disabled - Return: - none - -------------------------------------------------------------------*/ - -GR_ENTRY(grTexMipMapMode, void, - (GrChipID_t tmu, GrMipMapMode_t mmMode, FxBool lodBlend)) -{ -#define FN_NAME "grTexMipMapMode" - FxU32 - tLod, - texMode; - - GR_BEGIN_NOFIFOCHECK("grTexMipMapMode",88); - GDBG_INFO_MORE(gc->myLevel,"(%d,%d,%d)\n",tmu,mmMode,lodBlend); - GR_CHECK_TMU(FN_NAME, tmu); - - /*-------------------------------------------------------------- - Get Current tLod and texMode register values - --------------------------------------------------------------*/ - tLod = gc->state.tmu_config[tmu].tLOD; - texMode = gc->state.tmu_config[tmu].textureMode; - - /*-------------------------------------------------------------- - Clear LODMIN, LODMAX and LODDITHER - --------------------------------------------------------------*/ - tLod &= ~(SST_LODMIN | SST_LODMAX | SST_LOD_ODD); - texMode &= ~(SST_TLODDITHER | SST_TRILINEAR); - - /*-------------------------------------------------------------- - Encode Mipmap Mode Bits - --------------------------------------------------------------*/ - switch (mmMode) { - case GR_MIPMAP_DISABLE: - /*---------------------------------------------------------- - To disable mipmapping set the min and max lods to the same - value - ----------------------------------------------------------*/ - tLod |= SST_TLOD_MINMAX_INT(gc->state.tmu_config[tmu].largeLod, - gc->state.tmu_config[tmu].largeLod); - break; - - case GR_MIPMAP_NEAREST_DITHER: - if (gc->state.allowLODdither) texMode |= SST_TLODDITHER; - /* intentional fall-through to set lodmin and lodmax values */ - - case GR_MIPMAP_NEAREST: - /*---------------------------------------------------------- - Set LODMIN and LODMAX in the tLod register to the - actual min and max LODs of the current texture. - ----------------------------------------------------------*/ - tLod |= SST_TLOD_MINMAX_INT(gc->state.tmu_config[tmu].largeLod, - gc->state.tmu_config[tmu].smallLod); - break; - - default: - GrErrorCallback("grTexMipMapMode: invalid mode passed", FXFALSE); - break; - } - gc->state.tmu_config[tmu].mmMode = mmMode; - - /* 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; - - /*-------------------------------------------------------------- - Fix trilinear and evenOdd bits - - - This is a bit of a hack to make two pass trilinear work with - full textures. The assumption here is that the only reason - you would ever set up Multiply by LODFRAC w/o REVERSE BLEND - is for the ODD pass of trilinear. - --------------------------------------------------------------*/ - if (lodBlend) { - /* If we're doing trilinear for real then nuke the lod dithering - * at the same time because it just looks bad. - */ - texMode = ((texMode & ~SST_TLODDITHER) | SST_TRILINEAR); - - if ((texMode & SST_TC_ZERO_OTHER) && - (texMode & SST_TC_BLEND_LODFRAC) && - !(texMode & SST_TC_REVERSE_BLEND)) { - tLod |= SST_LOD_ODD; - } - } - tLod |= _gr_evenOdd_xlate_table[gc->state.tmu_config[tmu].evenOdd]; - - /*-------------------------------------------------------------- - Write State To Hardware and Update Glide Shadow State - --------------------------------------------------------------*/ - hw = SST_TMU(hw, tmu); - REG_GROUP_BEGIN((0x02UL << tmu), textureMode, 2, 0x03); - { - REG_GROUP_SET(hw, textureMode , texMode); - REG_GROUP_SET(hw, tLOD , tLod); - } - REG_GROUP_END(); - - gc->state.tmu_config[tmu].tLOD = tLod; - gc->state.tmu_config[tmu].textureMode = texMode; - - /* Make sure that the trilinear blending bits are set in a - * consistent manner across the tmu's. This only really matters if - * we have multiple tmu's, but this state is really setup across - * multiple calls (grTexCombine, grTexMipMapMode, and - * grTexSource). - * - * NB: This must happen after the shadows are updated because - * _grTexCheckTriLinear() will use the shadow register values - * to determine the current state of trilinearness. - */ - if (gc->num_tmu > 1) _grTexCheckTriLinear(tmu); - - GR_END(); -#undef FN_NAME -} /* grTexMipMapMode */ - -/*------------------------------------------------------------------- - Function: grTexMinAddress - Date: 6/2 - Implementor(s): GaryMcT, Jdt - Library: glide - Description: - Returns address of start of texture ram for a TMU - Arguments: - tmu - Return: - integer texture base address, this pointer is not to be dereferenced - by the application, it is on to be used by grTexDownload(), - and grTExDownloadLevel() - -------------------------------------------------------------------*/ -/*------------------------------------------------------------------- - Function: grTexNCCTable - Date: 6/3 - Implementor(s): jdt - Library: glide - Description: - select one of the two NCC tables - Arguments: - tmu - which tmu - table - which table to select - One of: - GR_TEXTABLE_NCC0 - GR_TEXTABLE_NCC1 - GR_TEXTABLE_PALETTE - Return: - none - -------------------------------------------------------------------*/ - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -GR_ENTRY(grTexNCCTable, void, - (GrNCCTable_t table)) -{ -#define FN_NAME "grTexNCCTable" - FxU32 texMode, i; - - GR_BEGIN("grTexNCCTable",88,4, 1); - GDBG_INFO_MORE(gc->myLevel,"\n"); - GR_CHECK_F(myName, table > GR_TEXTABLE_PALETTE, "invalid ncc table specified"); - - /*------------------------------------------------------------------ - Update local state - ------------------------------------------------------------------*/ - for (i = 0; i < GLIDE_NUM_TMU; i++) - gc->state.tmu_config[i].nccTable = table; - - /*------------------------------------------------------------------ - Grab shadow texMode, update TexMode, update shadow/real register - ------------------------------------------------------------------*/ - for (i = 0; i < GLIDE_NUM_TMU; i++) - texMode = gc->state.tmu_config[i].textureMode; - texMode &= ~(SST_TNCCSELECT); - if (table == GR_TEXTABLE_NCC1) - texMode |= SST_TNCCSELECT; - else - texMode &= ~(SST_TNCCSELECT); - - for (i = 0; i < GLIDE_NUM_TMU; i++) { - GR_SET((0x02UL << i), SST_TMU(hw, i), textureMode, texMode); - gc->state.tmu_config[i].textureMode = texMode; - } - - GR_END(); -#undef FN_NAME -} /* grTexNCCTable */ -#else -GR_ENTRY(grTexNCCTable, void, - (GrChipID_t tmu, GrNCCTable_t table)) -{ -#define FN_NAME "grTexNCCTable" - FxU32 texMode; - - GR_BEGIN("grTexNCCTable",88,4, 1); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",tmu); - GR_CHECK_TMU(FN_NAME, tmu); - GR_CHECK_F(FN_NAME, table > GR_TEXTABLE_PALETTE, "invalid ncc table specified"); - - /*------------------------------------------------------------------ - Update local state - ------------------------------------------------------------------*/ - gc->state.tmu_config[tmu].nccTable = table; - - /*------------------------------------------------------------------ - Grab shadow texMode, update TexMode, update shadow/real register - ------------------------------------------------------------------*/ - texMode = gc->state.tmu_config[tmu].textureMode; - texMode &= ~(SST_TNCCSELECT); - if (table == GR_TEXTABLE_NCC1) - texMode |= SST_TNCCSELECT; - else - texMode &= ~(SST_TNCCSELECT); - - GR_SET((0x02UL << tmu), SST_TMU(hw, tmu), textureMode, texMode); - gc->state.tmu_config[tmu].textureMode = texMode; - - GR_END(); -#undef FN_NAME -} /* grTexNCCTable */ -#endif - -/*------------------------------------------------------------------- - Function: grTexSource - Date: 6/2 - Implementor(s): GaryMcT, Jdt - Library: glide - Description: - Sets up the current texture for texture mapping on the specified - TMU. - Arguments: - tmu - which tmu - startAddress - texture start address - 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 containing - texture dimensions - Return: - none - -------------------------------------------------------------------*/ - -GR_ENTRY(grTexSource, void, - (GrChipID_t tmu, FxU32 startAddress, FxU32 evenOdd, GrTexInfo *info)) -{ -#define FN_NAME "grTexSource" - FxU32 baseAddress, texMode, tLod; - - GR_BEGIN_NOFIFOCHECK("grTexSource",88); - GDBG_INFO_MORE(gc->myLevel,"(%d,0x%x,%d,0x%x)\n",tmu,startAddress,evenOdd,info); - - GR_CHECK_TMU(FN_NAME, tmu); - GR_CHECK_COMPATABILITY(FN_NAME, - startAddress >= gc->tmu_state[tmu].total_mem, - "invalid startAddress"); - GR_CHECK_COMPATABILITY(FN_NAME, - (startAddress + grTexTextureMemRequired(evenOdd, info) >= - gc->tmu_state[tmu].total_mem), - "insufficient texture ram at startAddress"); - GR_CHECK_F(FN_NAME, evenOdd > 0x3 || evenOdd == 0, "evenOdd mask invalid"); - GR_CHECK_F(FN_NAME, !info, "invalid info pointer"); - GR_ASSERT((startAddress & SST_TEXTURE_ALIGN_MASK) == 0x00UL); - - /*------------------------------------------------------------- - Update Texture Unit State - -------------------------------------------------------------*/ - gc->state.tmu_config[tmu].smallLod = info->smallLod; - gc->state.tmu_config[tmu].largeLod = info->largeLod; - gc->state.tmu_config[tmu].evenOdd = evenOdd; - - /*------------------------------------------------------------- - Calculate Base Address - -------------------------------------------------------------*/ - baseAddress = _grTexCalcBaseAddress(startAddress, - info->largeLod, - info->aspectRatio, - info->format, - evenOdd); - baseAddress += gc->tramOffset[tmu]; - baseAddress &= SST_TEXTURE_ADDRESS; - - /*------------------------------------------------------------- - Update Texture Mode - -------------------------------------------------------------*/ - texMode = gc->state.tmu_config[tmu].textureMode; - texMode &= ~SST_TFORMAT; - texMode |= (info->format << SST_TFORMAT_SHIFT) | SST_TPERSP_ST | SST_TCLAMPW; - - /*------------------------------------------------------------- - Compute TLOD (keep LODBIAS in tact) - -------------------------------------------------------------*/ - tLod = gc->state.tmu_config[tmu].tLOD; - tLod &= ~(SST_LODMIN | SST_LODMAX | SST_LOD_ASPECT | - SST_LOD_TSPLIT | SST_LOD_ODD | SST_LOD_S_IS_WIDER); - tLod |= SST_TLOD_MINMAX_INT(info->largeLod, - gc->state.tmu_config[tmu].mmMode==GR_MIPMAP_DISABLE - ? info->largeLod - : info->smallLod); - tLod |= _gr_evenOdd_xlate_table[evenOdd]; - tLod |= _gr_aspect_xlate_table[info->aspectRatio]; - - /* 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; - - /* Make sure that the trilinear blending bits are set in a - * consistent manner across the tmu's. This only really matters if - * we have multiple tmu's, but this state is really setup across - * multiple calls (grTexCombine, grTexMipMapMode, and - * grTexSource). - * - * NB: This must happen after the shadows are updated because - * _grTexCheckTriLinear() will use the shadow register values - * to determine the current state of trilinearness. - */ - if (gc->num_tmu > 1) _grTexCheckTriLinear(tmu); - - GR_END(); -#undef FN_NAME -} /* grTexSource */ - - -/*------------------------------------------------------------------- - Function: grTexMultibase - Date: 11/4/96 - Implementor(s): gmt - Library: Glide - Description: - Enable multiple base addresses for texturing. - Arguments: - tmu - which tmu - enable - flag which enables/disables multibase - Return: - none - -------------------------------------------------------------------*/ - -GR_ENTRY(grTexMultibase, void, - (GrChipID_t tmu, FxBool enable)) -{ -#define FN_NAME "grTexMultibase" - FxU32 tLod; - - GR_BEGIN("grTexMultibase",88,4,1); - GDBG_INFO_MORE(gc->myLevel,"(%d,%d)\n",tmu,enable); - GR_CHECK_TMU(FN_NAME,tmu); - - tLod = gc->state.tmu_config[tmu].tLOD; - if (enable) - tLod |= SST_TMULTIBASEADDR; - else - tLod &= ~SST_TMULTIBASEADDR; - /*-------------------------------------------------------------- - Write State To Hardware and Update Glide Shadow State - --------------------------------------------------------------*/ - GR_SET((0x02UL << tmu), SST_TMU(hw, tmu), tLOD, tLod); - gc->state.tmu_config[tmu].tLOD = tLod; - - GR_END(); -#undef FN_NAME -} /* grTexMultibase */ - -/*------------------------------------------------------------------- - Function: grTexMultibaseAddress - Date: 11/4/96 - Implementor(s): gmt - Library: Glide - Description: - Set the base address for a particular set of mipmaps - Arguments: - tmu - which tmu - range - range of lods that are based at this starting address - One of: - GR_TEXBASE_256 - GR_TEXBASE_128 - GR_TEXBASE_64 - GR_TEXBASE_32_TO_1 - startAddress - start address that data was downloaded to - hardware with using grTexDownload/Level - info - pointer to GrTexInfo structure containing - texture dimensions - Return: - none - -------------------------------------------------------------------*/ - -GR_ENTRY(grTexMultibaseAddress, void, - (GrChipID_t tmu, GrTexBaseRange_t range, FxU32 startAddress, FxU32 evenOdd, GrTexInfo *info)) -{ -#define FN_NAME "grTexMultibaseAddress" - - GR_BEGIN("grTexMultibaseAddress", 88, sizeof(FxU32), 1); - GDBG_INFO_MORE(gc->myLevel,"(%d, 0x%X, 0x%X)\n", tmu, range, startAddress); - - GR_CHECK_TMU(FN_NAME, tmu); - GR_CHECK_F(FN_NAME, range > GR_TEXBASE_32_TO_1, "invalid range"); - GR_CHECK_F(FN_NAME, startAddress >= gc->tmu_state[tmu].total_mem, "invalid startAddress"); - GR_CHECK_F(FN_NAME, evenOdd > 0x3, "evenOdd mask invalid"); - GR_CHECK_F(FN_NAME, info == NULL, "invalid info pointer"); - - /* Write relevant registers out to hardware and shadows */ - { - GrLOD_t - largeLevelLod = 0; - FxU32 - baseAddrRegIndex = 0, - *addrRegShadow = 0; - - switch (range) { - case GR_TEXBASE_256: - largeLevelLod = GR_LOD_256; - baseAddrRegIndex = (offsetof(SstRegs, texBaseAddr) >> 2UL); - addrRegShadow = &gc->state.tmu_config[tmu].texBaseAddr; - break; - - case GR_TEXBASE_128: - largeLevelLod = GR_LOD_128; - baseAddrRegIndex = (offsetof(SstRegs, texBaseAddr1) >> 2UL); - addrRegShadow = &gc->state.tmu_config[tmu].texBaseAddr_1; - break; - - case GR_TEXBASE_64: - largeLevelLod = GR_LOD_64; - baseAddrRegIndex = (offsetof(SstRegs, texBaseAddr2) >> 2UL); - addrRegShadow = &gc->state.tmu_config[tmu].texBaseAddr_2; - break; - - case GR_TEXBASE_32_TO_1: - largeLevelLod = GR_LOD_32; - baseAddrRegIndex = (offsetof(SstRegs, texBaseAddr38) >> 2UL); - addrRegShadow = &gc->state.tmu_config[tmu].texBaseAddr_3_8; - break; - } - - { - const FifoChipField - tmuChip = (FifoChipField)(0x02UL << tmu); - const FxU32 - baseAddress = (gc->tramOffset[tmu] + - _grTexCalcBaseAddress(startAddress, - largeLevelLod, - info->aspectRatio, - info->format, - evenOdd)) & SST_TEXTURE_ADDRESS; - - hw = SST_TMU(hw,tmu); - - GR_SET_INDEX(tmuChip, hw, baseAddrRegIndex, baseAddress); - *addrRegShadow = baseAddress; - } - } - - GR_END(); -#undef FN_NAME -} /* grTexMultibaseAddress */ - -#if defined(GLIDE3) -/*------------------------------------------------------------------- - Function: grTexChromaModeExt - Date: 17-Dec-97 - Implementor(s): atai - Description: - Draw triangles - Arguments: - Return: - -------------------------------------------------------------------*/ -void _grTexChromaModeExt(GrChipID_t tmu, GrChromakeyMode_t mode) -{ -#define FN_NAME "_grTexChromaModeExt" - -#undef FN_NAME -} /* grTexChromaModeExt */ - -/*------------------------------------------------------------------- - Function: grTexChromaRangeExt - Date: 17-Dec-97 - Implementor(s): atai - Description: - Draw triangles - Arguments: - Return: - -------------------------------------------------------------------*/ -void _grTexChromaRangeExt(GrChipID_t tmu, GrColor_t min, GrColor_t max) -{ -#define FN_NAME "_grTexChromaRangeExt" - -#undef FN_NAME -} /* grTexChromaRangeExt */ -#endif /* defined(GLIDE3) */ - -/* -** _grTexForceLod -** -** Forces tLOD to a specific LOD level. This is useful only for -** debugging purposes. GMT: obsolete, please remove -** AYT: added it back for Averger. -*/ -void -_grTexForceLod(GrChipID_t tmu, int value) -{ -#define FN_NAME "_grTexForceLod" - FxU32 tLod; - GR_BEGIN_NOFIFOCHECK( "_grTexForceLod", 88 ); - GDBG_INFO_MORE(gc->myLevel, "(0x%x)\n", tmu); - GDBG_INFO_MORE(gc->myLevel, "(0x%x)\n", value); - - tLod = gc->state.tmu_config[tmu].tLOD; - - tLod &= ~(SST_LODMIN | SST_LODMAX); - tLod |= SST_TLOD_MINMAX_INT(value,value); - - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET((0x02UL << tmu), SST_TMU(hw, tmu), tLOD, tLod); - GR_CHECK_SIZE(); - gc->state.tmu_config[tmu].tLOD = tLod; -#undef FN_NAME -} /* _grTexForceLod */ diff --git a/glide2x/h3/glide/src/gtexdl.c b/glide2x/h3/glide/src/gtexdl.c deleted file mode 100644 index 97a47aa..0000000 --- a/glide2x/h3/glide/src/gtexdl.c +++ /dev/null @@ -1,919 +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:29 joseph -** Initial checkin into SourceForge. -** -** -** 3 3/17/99 6:16p Dow -** Phantom Menace and other fixes. -** -** 92 3/12/99 5:52p Hanson -** No idle on lfb lock needed to be disabled for -** banshee/avenger since it does not have SST1 style cmd fifo. Updated -** ConvertAndDownloadRLE for Banshee/Avenger. -** -** 91 3/02/99 3:16p Atai -** added 2d nop before texture download to maintain cache coherency -** -** 90 3/02/99 2:22p Peter -** 2d nop flushes (although 3d nop should too) -** -** 89 2/26/99 11:31a Peter -** fixed alignment assertion -** -** 88 2/18/99 5:35p Peter -** -** 87 2/18/99 5:28p Peter -** download/source for everything -** -** 86 2/16/99 4:14p Peter -** sanitized source/download -** -** 85 2/10/99 2:24p Peter -** corrected alignment textures within an alignment allocation unit -** -** 84 2/02/99 5:41p Peter -** textures through lfb -** -** 83 12/03/98 11:27p Dow -** Code 'cleanup' heç -** -** 82 11/03/98 11:10a Atai -** texture cache flushing -** -** 81 11/02/98 5:34p Atai -** merge direct i/o code -** -** 80 10/21/98 10:41a Atai -** -** 79 10/20/98 7:12p Peter -** static build hapiiness -** -** 78 10/20/98 4:39p Atai -** update tramOffset and tramSize -** -** 77 10/09/98 6:57p Peter -** dynamic 3DNow!(tm) mods -** -** 76 9/21/98 5:35p Dow -** 3DNow! mods -** -** 75 9/11/98 2:09p Peter -** removed debugging code -** -** 74 9/11/98 1:44p Peter -** texture mask fixes -** -** 73 9/04/98 3:32p Peter -** reversed the sense of the active bytes in small downloads -** -** 72 8/27/98 10:07p Peter -** added flush to rle -** -** 71 8/27/98 9:54p Peter -** flush old texels when replacing small lod levels -** -** 70 8/27/98 1:55p Peter -** download problem w/ widths smaller than dword -** -** 69 7/19/98 4:34p Mikec -** Relaxed 2MB span constraint on downloadmipmappartial. -** -** 68 5/22/98 6:24p Atai -** texturing out of render buffer hack -** -** 67 5/21/98 4:47p Dow -** Direct Register Writes Work -** -** 66 5/18/98 3:19p Peter -** one more palette broadcast thing -** -** 65 5/13/98 9:12a Dow -** -** 64 5/12/98 2:42p Dow -** -** 63 5/05/98 3:01p Peter -** packet chipfield vs direct register chipfield -** -** 62 4/29/98 2:32p Peter -** fixed texture palette broadcast -** -** 61 4/29/98 1:02p Peter -** non dword aligned downloads -** -** 60 3/28/98 11:24a Dow -** itwoç -** -** 58 2/17/98 12:52p Dow -** Conditional LFB Download Hack -** -** 57 2/02/98 2:17p Atai -** fixed palette broadcasts in _grTexDownloadNccTable and -** _grTexDownloadPalette -** -** 56 1/29/98 9:54p Dow -** This is Banshee - * - * 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 effage - * - * 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 -#include -#include "fxglide.h" - - -/*--------------------------------------------------------------------------- -** _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, 0x06UL); -#endif - - if (which == 0) { -#ifdef GLIDE_POINTCAST_PALETTE - REG_GROUP_BEGIN((0x02UL << tmu), nccTable0, 12, 0x0FFF); -#else - REG_GROUP_BEGIN(0x06UL, 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(0x06UL, 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,0x6); -#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)0x06UL; -#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 - -------------------------------------------------------------------*/ -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -GR_ENTRY(grTexDownloadTable, - void, - (GrTexTable_t type, void *data)) -{ - GR_BEGIN_NOFIFOCHECK("grTexDownloadTable",89); - GDBG_INFO_MORE(gc->myLevel,"(%d,0x%x)\n",type,data); - GR_CHECK_F(myName, type > GR_TEXTABLE_PALETTE, "invalid table specified"); - GR_CHECK_F(myName, !data, "invalid data pointer"); - - if (type == GR_TEXTABLE_PALETTE) /* Need Palette Download Code */ - _grTexDownloadPalette(GR_TMU0, (GuTexPalette *)data, 0, 255); - else { /* Type is an ncc table */ - _grTexDownloadNccTable(GR_TMU0, type, (GuNccTable*)data, 0, 11); - /* _grTexDownloadNccTable(tmu, type, (GuNccTable*)data, 0, 11); */ - } - GR_END(); -} /* grTexDownloadTable */ -#else -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 */ -#endif - - -/*------------------------------------------------------------------- - 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)) -{ -#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); - - { - GR_CHECK_TMU(myName, tmu); - GR_CHECK_F(myName, - startAddress + _grTexTextureMemRequired(thisLod, thisLod, aspectRatio, format, evenOdd, FXTRUE) > - gc->tmu_state[tmu].total_mem, - "insufficient texture ram at startAddress"); - GR_CHECK_F(myName, startAddress & SST_TEXTURE_ALIGN_MASK, - "unaligned startAddress"); - GR_CHECK_F(myName, thisLod > G3_LOD_TRANSLATE(GR_LOD_1), - "thisLod invalid"); - GR_CHECK_F(myName, largeLod > G3_LOD_TRANSLATE(GR_LOD_1), - "largeLod invalid"); - GR_CHECK_F(myName, thisLod < largeLod, - "thisLod may not be larger than largeLod"); - GR_CHECK_F(myName, aspectRatio > G3_ASPECT_TRANSLATE(GR_ASPECT_1x8) || - aspectRatio < G3_ASPECT_TRANSLATE(GR_ASPECT_8x1), - "aspectRatio invalid"); - GR_CHECK_F(myName, evenOdd > 0x3 || evenOdd == 0, - "evenOdd mask invalid"); - GR_CHECK_F(myName, !data, - "invalid data pointer"); - GR_CHECK_F(myName, max_t >= _grMipMapHostWH[aspectRatio][thisLod][1], - "invalid end row"); - } - - /*------------------------------------------------------------ - Skip this level entirely if not in odd/even mask - ------------------------------------------------------------*/ - if (!(evenOdd & (thisLod & 0x1 ? GR_MIPMAPLEVELMASK_ODD:GR_MIPMAPLEVELMASK_EVEN))) - goto all_done; - - { - FxU32 - baseAddress; - - /* Compute physical start address for the download. */ - { - FxU32 - texOffset = 0x00UL; - - /* We need to do some magic to pack the small levels and have a - * properly aligned baseAddr. If the current level is not going - * to start on an alignment boundary when working backwards in - * the chain we need to offset it into the block so that it is - * addressable with an aligned baseAddr. - */ - { - const FxU32 - aspectIndex = ((aspectRatio < GR_ASPECT_1x1) - ? GR_ASPECT_1x1 - aspectRatio - : aspectRatio - GR_ASPECT_1x1), - lodIndex = ((thisLod == GR_LOD_256) ? GR_LOD_256 : thisLod - 1), - formatShift = (format >= GR_TEXFMT_16BIT); - FxU32 - levelSize = (_grMipMapHostSize[aspectIndex][lodIndex] << formatShift); - GrLOD_t - minLod = thisLod; - - if (levelSize < SST_TEXTURE_ALIGN) { - GrLOD_t - maxLod = lodIndex; - - /* Find the smallest level that naturally starts on an - * alignment boundary. If this is larger than the current - * mipmap chain's large lod then this we have to compute the - * offset within this alignment unit. - * - * NB: This could a table lookup, but I'm writing the obvious code - * right now so that there aren't any mystic #'s being pulled out - * of the recesses of my colon. - */ - while(maxLod > GR_LOD_256) { - levelSize = (_grMipMapHostSize[aspectIndex][maxLod] << formatShift); - - if (levelSize >= SST_TEXTURE_ALIGN) break; - maxLod--; - texOffset += levelSize; - } - - /* maxLod is the index of the smallest level of this aspect - * ratio that takes up atleast a full alignment unit. We - * reset the small lod to this so that we can compute the - * offset for the 'large' levels in the mipmap chain. - */ - GR_ASSERT(maxLod != GR_LOD_256); - minLod = maxLod + 1; - } - - if (minLod > largeLod) { - texOffset += _grTexTextureMemRequired(minLod - 1, largeLod, - aspectRatio, - format, - evenOdd, - FXFALSE); - } - } - - /* This is going directly to the 2d lfb space rather than - * through the texture port so we have to add in the actual hw - * offset that the texture 'surface' starts at. - */ - baseAddress = (gc->tramOffset[tmu] + - startAddress + - texOffset); - } - { - /* - ** To maintain cache coherency in h4, issue a 2D nop to - ** flush all pixel from 3D session before texture download - */ - REG_GROUP_BEGIN_WAX(command, 1, 0x01UL); - REG_GROUP_SET_WAX(gc->gRegs, command, SSTG_NOP | SSTG_GO); - REG_GROUP_END(); - } - /* Do the download */ - { - const FxU32 - width = _grMipMapHostWH[aspectRatio][thisLod][0], - formatSel = (format >= GR_TEXFMT_16BIT); - 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; - - (*((*gc->archDispatchProcs.texDownloadProcs)[formatSel][widthSel]))(gc, - baseAddress, - max_s, t, max_t, - data); - } - - /* If this is a small lod level in a texture replacing texels that - * are already loaded then it may be necessary to flush the old - * texels from memory before any other rendering operation using - * this texture is issued. Unconditionally flush these old texels - * just in case rather than being too clever. - * - * The reason that we need to flush here even though we're not - * going through the texture port is because it is perfectly - * legal to source once and download over and over again. (See - * chd for a funny SpecOps story). - * - * NB: The documented nop does not currently work on basnehe which - * is why we do the ~texBaseAddr crap. - */ - { - const FifoChipField - chipId = (FifoChipField)(0x02UL << tmu); - const FxU32 - baseAddress = gc->state.tmu_config[tmu].texBaseAddr; - - GR_SET_EXPECTED_SIZE(3 * sizeof(FxU32), 3); - { - GR_SET(BROADCAST_ID, hw, nopCMD, 0); - GR_SET(chipId, hw, texBaseAddr, ~baseAddress & SST_TEXTURE_ADDRESS); - GR_SET(chipId, hw, texBaseAddr, baseAddress); - } - GR_CHECK_SIZE(); - - /* Again force a pixel flush which should force all of the - * texture downloads to flush from internal fifos etc. - */ - REG_GROUP_BEGIN_WAX(command, 1, 0x01UL); - REG_GROUP_SET_WAX(gc->gRegs, command, SSTG_NOP | SSTG_GO); - 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 - - I'd like to second chris's opinion because I'm sick and tired of fixing - this for every hw mod where it breaks. -*/ - -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)) -{ -#define FN_NAME "ConvertAndDownloadRLE" - GR_BEGIN_NOFIFOCHECK(FN_NAME, 89); - 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,dest_height); - - { - GR_CHECK_TMU(FN_NAME, tmu); - GR_CHECK_F(FN_NAME, - startAddress + _grTexTextureMemRequired(thisLod, thisLod, aspectRatio, format, evenOdd, FXTRUE) > - 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 > G3_LOD_TRANSLATE(GR_LOD_1), "thisLod invalid"); - GR_CHECK_F(FN_NAME, largeLod > G3_LOD_TRANSLATE(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 > G3_ASPECT_TRANSLATE(GR_ASPECT_1x8) || - aspectRatio < G3_ASPECT_TRANSLATE(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"); - } - - /*------------------------------------------------------------ - Skip this level entirely if not in odd/even mask - ------------------------------------------------------------*/ - if (!(evenOdd & (thisLod & 0x1 ? GR_MIPMAPLEVELMASK_ODD:GR_MIPMAPLEVELMASK_EVEN))) - goto all_done; - - { - FxU32 - baseAddress; - - /* Compute physical start address for the download. */ - { - FxU32 - texOffset = 0x00UL; - - /* We need to do some magic to pack the small levels and have a - * properly aligned baseAddr. If the current level is not going - * to start on an alignment boundary when working backwards in - * the chain we need to offset it into the block so that it is - * addressable with an aligned baseAddr. - */ - { - const FxU32 - aspectIndex = ((aspectRatio < GR_ASPECT_1x1) - ? GR_ASPECT_1x1 - aspectRatio - : aspectRatio - GR_ASPECT_1x1), - lodIndex = ((thisLod == GR_LOD_256) ? GR_LOD_256 : thisLod - 1), - formatShift = (format >= GR_TEXFMT_16BIT); - FxU32 - levelSize = (_grMipMapHostSize[aspectIndex][lodIndex] << formatShift); - GrLOD_t - minLod = thisLod; - - if (levelSize < SST_TEXTURE_ALIGN) { - GrLOD_t - maxLod = lodIndex; - - /* Find the smallest level that naturally starts on an - * alignment boundary. If this is larger than the current - * mipmap chain's large lod then this we have to compute the - * offset within this alignment unit. - * - * NB: This could a table lookup, but I'm writing the obvious code - * right now so that there aren't any mystic #'s being pulled out - * of the recesses of my colon. - */ - while(maxLod > GR_LOD_256) { - levelSize = (_grMipMapHostSize[aspectIndex][maxLod] << formatShift); - - if (levelSize >= SST_TEXTURE_ALIGN) break; - maxLod--; - texOffset += levelSize; - } - - /* maxLod is the index of the smallest level of this aspect - * ratio that takes up atleast a full alignment unit. We - * reset the small lod to this so that we can compute the - * offset for the 'large' levels in the mipmap chain. - */ - GR_ASSERT(maxLod != GR_LOD_256); - minLod = maxLod + 1; - } - - if (minLod > largeLod) { - texOffset += _grTexTextureMemRequired(minLod - 1, largeLod, - aspectRatio, - format, - evenOdd, - FXFALSE); - } - } - - /* This is going directly to the 2d lfb space rather than - * through the texture port so we have to add in the actual hw - * offset that the texture 'surface' starts at. - */ - baseAddress = (gc->tramOffset[tmu] + - startAddress + - texOffset); - } - - { - /* - ** To maintain cache coherency in h4, issue a 2D nop to - ** flush all pixel from 3D session before texture download - */ - REG_GROUP_BEGIN_WAX(command, 1, 0x01UL); - REG_GROUP_SET_WAX(gc->gRegs, command, SSTG_NOP | SSTG_GO); - REG_GROUP_END(); - } - - /* Update stats for the unconverted format */ - _GlideRoot.stats.texBytes += dest_width * (dest_height) * 2; - - { - extern FxU16 - rle_line[256], /* diTex.c */ - *rle_line_end; /* ditex.c */ - FxU32 - max_s, - max_t; - FxU32 - i, - s, t, - offset; - const FxU16 - *src; - - - if (height>dest_height) - height=dest_height; - if (width>dest_width) - width=dest_width; - - max_s=dest_width >> 1; - max_t=height; - - /* 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]; - - rle_line_end = rle_line + width + u0; - for(t = 0; t < max_t; t++) { - src = rle_line + u0; - rle_decode_line_asm(tlut, &bm_data[offset], rle_line); - - LINEAR_WRITE_BEGIN(max_s, SSTCP_PKT5_LFB, - baseAddress, - 0x00UL, 0x00UL); - for(s = 0; s < max_s; s++) { - LINEAR_WRITE_SET(baseAddress + (s << 2), *(FxU32 *) src); - src += 2; - } - LINEAR_WRITE_END(); - - baseAddress += dest_width << 1; - offset += bm_data[4 + i++]; - } - - if (dest_height > height) { - src = rle_line + u0; - - LINEAR_WRITE_BEGIN(max_s, SSTCP_PKT5_LFB, - baseAddress, - 0x00UL, 0x00UL); - for(s = 0; s < max_s; s++) { - LINEAR_WRITE_SET(baseAddress + (s << 2), *(FxU32 *) src); - src += 2; - } - LINEAR_WRITE_END(); - } - } - - /* If this is a small lod level in a texture replacing texels that - * are already loaded then it may be necessary to flush the old - * texels from memory before any other rendering operation using - * this texture is issued. Unconditionally flush these old texels - * just in case rather than being too clever. - * - * The reason that we need to flush here even though we're not - * going through the texture port is because it is perfectly - * legal to source once and download over and over again. (See - * chd for a funny SpecOps story). - * - * NB: The documented nop does not currently work on basnehe which - * is why we do the ~texBaseAddr crap. - */ - { - const FifoChipField - chipId = (FifoChipField)(0x02UL << tmu); - const FxU32 - baseAddress = gc->state.tmu_config[tmu].texBaseAddr; - - GR_SET_EXPECTED_SIZE(3 * sizeof(FxU32), 3); - { - GR_SET(BROADCAST_ID, hw, nopCMD, 0); - GR_SET(chipId, hw, texBaseAddr, ~baseAddress & SST_TEXTURE_ADDRESS); - GR_SET(chipId, hw, texBaseAddr, baseAddress); - } - GR_CHECK_SIZE(); - - /* Again force a pixel flush which should force all of the - * texture downloads to flush from internal fifos etc. - */ - REG_GROUP_BEGIN_WAX(command, 1, 0x01UL); - REG_GROUP_SET_WAX(gc->gRegs, command, SSTG_NOP | SSTG_GO); - REG_GROUP_END(); - } - } - -all_done: - _GlideRoot.stats.texDownloads++; -#undef FN_NAME -} - diff --git a/glide2x/h3/glide/src/gu.c b/glide2x/h3/glide/src/gu.c deleted file mode 100644 index a9b3a3f..0000000 --- a/glide2x/h3/glide/src/gu.c +++ /dev/null @@ -1,453 +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 3/17/99 6:16p Dow -** Phantom Menace and other fixes. - * - * 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 -#include -#include "fxglide.h" - -#if ( (GLIDE_PLATFORM & GLIDE_SST_HW) && (GLIDE_PLATFORM & GLIDE_HW_SST1) ) -#include -#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; -} - diff --git a/glide2x/h3/glide/src/guclip.c b/glide2x/h3/glide/src/guclip.c deleted file mode 100644 index 8663cf7..0000000 --- a/glide2x/h3/glide/src/guclip.c +++ /dev/null @@ -1,444 +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 3/17/99 6:16p Dow -** Phantom Menace and other fixes. - * - * 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 -#include -#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 */ diff --git a/glide2x/h3/glide/src/gump.c b/glide2x/h3/glide/src/gump.c deleted file mode 100644 index bef8153..0000000 --- a/glide2x/h3/glide/src/gump.c +++ /dev/null @@ -1,108 +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 3/17/99 6:16p Dow -** Phantom Menace and other fixes. - * - * 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 -#include -#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)) -{ -} diff --git a/glide2x/h3/glide/src/gump.h b/glide2x/h3/glide/src/gump.h deleted file mode 100644 index e64d4df..0000000 --- a/glide2x/h3/glide/src/gump.h +++ /dev/null @@ -1,62 +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 3/17/99 6:16p Dow -** Phantom Menace and other fixes. -** -*/ - -/* 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__ */ diff --git a/glide2x/h3/glide/src/gutex.c b/glide2x/h3/glide/src/gutex.c deleted file mode 100644 index 851d24e..0000000 --- a/glide2x/h3/glide/src/gutex.c +++ /dev/null @@ -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$ -** -** 3 3/17/99 6:16p Dow -** Phantom Menace and other fixes. -** -** 25 2/16/99 4:14p Peter -** made texture table declarations consistent -** -** 24 10/20/98 4:39p Atai -** update tramOffset and tramSize -** -** 23 3/28/98 11:24a Dow -** itwoç - * - * 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 -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -#ifndef GLIDE3_ALPHA - -/*--------------------------------------------------------------------------- -** 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(myName, 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 */ - - baseAddress = mminfo->tmu_base_address + gc->tramOffset[tmu]; - 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 */ - -#endif /* !GLIDE3_ALPHA */ - diff --git a/glide2x/h3/glide/src/gxdraw.c b/glide2x/h3/glide/src/gxdraw.c deleted file mode 100644 index 76c31b6..0000000 --- a/glide2x/h3/glide/src/gxdraw.c +++ /dev/null @@ -1,610 +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 3/17/99 6:16p Dow -** Phantom Menace and other fixes. -** -** 65 3/02/99 2:22p Peter -** removed no_tsu cruft -** -** 64 12/03/98 11:27p Dow -** Code 'cleanup' heç -** -** 63 4/05/98 2:32p Dow -** Fixed non-debug compiler error -** -** 62 4/03/98 2:04p Dow -** Dos Glide Mods - * - * 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 effage 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 effage - * - * 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 - -#define FX_DLL_DEFINITION -#include -#include -#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; - -#if GLIDE_TRI_CULLING - const float *fa = &va->x; - const float *fb = &vb->x; - const float *fc = &vc->x; - float dxAB, dxBC, dyAB, dyBC; - -#ifdef GDBG_INFO_ON - FXUNUSED(indexNames); -#endif - { - int culltest = gc->state.cull_mode; - - /* 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; - - /* 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) && - ((j ^ (culltest << 31)) >= 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 */ - - _GlideRoot.stats.trisProcessed++; - - /* 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 - { - 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) << 0UL) | - (RGBA_COMP_CLAMP(curVertex->g) << 8UL) | - (RGBA_COMP_CLAMP(curVertex->r) << 16UL)); - if (hasAlpha) packedVal |= (RGBA_COMP_CLAMP(curVertex->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 || HOOPTI_TRI_SETUP_COMPARE - -#if !defined(GLIDE_TRI_CULLING) || !GLIDE_TRI_CULLING -#error "GLIDE_TRI_CULLING must be enabled to sort vertices" -#endif - -#if HOOPTI_TRI_SETUP_COMPARE -__tsuTriClampFailure: - _GlideRoot.stats.tsuExpClamp++; -#endif /* HOOPTI_TRI_SETUP_COMPARE */ - - { - 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 || HOOPTI_TRI_SETUP_COMPARE */ - -__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 */ diff --git a/glide2x/h3/glide/src/makefile b/glide2x/h3/glide/src/makefile deleted file mode 100644 index df68009..0000000 --- a/glide2x/h3/glide/src/makefile +++ /dev/null @@ -1,360 +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 - -!if "$(FX_CHRIS_DENIS_ANTHONY_HACK)" == "1" -LCDEFS = $(LCDEFS) -DCHRIS_DENIS_ANTHONY_HACK=1 -!endif - -!if "$(FX_TARGET)" == "WIN32" -LCINCS = -I$(DXDDK)\inc -I$(DXDDK)\inc32 -!endif - -FX_TACO_MEMORY_FIFO_HACK = -!if "$(FX_TACO_MEMORY_FIFO_HACK)" != "" -LCDEFS = $(LCDEFS) -DTACO_MEMORY_FIFO_HACK -!endif - -!if "$(DIAG_BUILD)" != "" -LCDEFS = $(LCDEFS) -DDIAG_BUILD -!endif - -# This is a bit of a red herring -!if "$(FX_GLIDE_DIRECT_WRITE)" == "1" -FX_GLIDE_DIRECT_WRITE = 1 -FX_GLIDE_CTRISETUP = 1 -LCDEFS = $(LCDEFS) -DDIRECT_IO=1 -!else -FX_GLIDE_PACKET_FIFO = 1 -!endif - -# 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 -FX_GLIDE_CTRISETUP = 1 -!endif - -!if "$(FX_GLIDE_PACKET_FIFO)" == "1" -CMDXPORTDEFS = -DGLIDE_PACKET3_TRI_SETUP=1 -DUSE_PACKET_FIFO=1 -DGLIDE_HW_TRI_SETUP=1 -!else -CMDXPORTDEFS = -DUSE_PACKET_FIFO=0 -DGLIDE_HW_TRI_SETUP=1 -DGLIDE_PACKET3_TRI_SETUP=0 -FX_GLIDE_DEBUG_FIFO=1 -!endif - -FX_GLIDE_REAL_HW= 1 -FX_GLIDE_NO_FIFO= 1 - -!if "$(FX_GLIDE_CTRISETUP)" != "1" -FX_GLIDE_CTRISETUP = 0 -!endif -HWSPEC = fifo.c -LCDEFS = $(LCDEFS) -DH3 $(CMDXPORTDEFS) -INITLIB = $(BUILD_ROOT)\$(FX_GLIDE_HW)\$(FX_GLIDE_HW)init.lib - -!if "$(FX_GLIDE_VTUNE)"!="" -OTSOPTS = /Zi -LLDOPTS = /DEBUG -!endif - -!if "$(DEBUG)" == "1" -DBGOPTS = -DGLIDE_DEBUG -DGDBG_INFO_ON -GLIDE_SANITY_ALL = 1 -!endif - -# So that we can get reasonable stuff from SoftIce etc even -# if we're building an optimized version. This should only -# add symbolics so it is really only a codesize issue. -!if "$(FX_GLIDE_SYMBOLICS)" == "1" -!if "$(DEBUG)" != "1" -OTSOPTS = /Zi -!endif -LLDOPTS = /MAP:glide2x.map /DEBUG -!endif - -!if "$(FX_COMPILER)" == "MICROSOFT" -DBGOPTS = $(DBGOPTS) /WX -!endif - -!if "$(FX_GLIDE_HW)" == "" -!error "FX_GLIDE_HW not defined" -!endif - -# Display Options -DSPOPTS = -SUBLIBRARIES = -DSPOPTS = $(DSPOPTS) -DGLIDE_INIT_HWC - -DSPOPTS = $(DSPOPTS) -DHAL_HW=1 -SUBLIBRARIES = $(SUBLIBRARIES) - -!if !defined(DSPOPTS) -!error "Unknown HAL_* configuration" -!endif - -SUBLIBRARIES = $(SUBLIBRARIES) $(BUILD_ROOT)\h3\lib\minihwc.lib - -# 3DNow stuff -GL_AMD3D = 1 -!if "$(GL_AMD3D)"!="" -LCDEFS = $(LCDEFS) -DGL_AMD3D -LOBJECTS = $(LOBJECTS) xtexdl_3dnow.obj -CFILES = $(CFILES) xtexdl_def.c -!endif # GL_AMD3D - -# Do culling test in sw for independent triangles -CULL_MODE = -!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 - -!if "$(FX_GLIDE_NO_FIFO)" != "1" -FIFODEFS = -DUSE_PACKET_FIFO=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 -!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 = $(CFILES) gxdraw.c -!else -DSPOPTS = $(DSPOPTS) -DGLIDE_DISPATCH_SETUP=1 -DGLIDE_PACKED_RGB=0 - -!if "$(GL_AMD3D)"=="" -ASMTRISETUP = xdraw2.asm -!else -LOBJECTS = $(LOBJECTS) \ - xdraw2_def.obj xdraw2_3dnow.obj -!endif # GL_AMD3D -!endif - -OPTOPTS = $(GRMOPTS) $(OTSOPTS) $(ATSOPTS) - -# local defines, begin with basics and then add on -LCDEFS = $(LCDEFS) -DGLIDE_LIB - -# 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 = $(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 fxsplash.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 - -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) - -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 - - -glide2x.nms: glide2x.dll - nmsym /trans:source,package,always /source:$(BUILD_ROOT)/h3/cinit;$(BUILD_ROOT)/h3/minihwc;$(BUILD_ROOT)\h3\glide\src glide2x.dll - -#-------------------------------------------------------------------------- -# 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 - -# 3DNow!(tm) dependencies -# XXX_def.obj targets are the default targets - -!if "$(GL_AMD3D)"!="" -xdraw2_def.obj: xdraw2.asm xdraw2.inc fxgasm.h - $(AS) $(AFLAGS) -Fo $@ xdraw2.asm - -xdraw2_3dnow.obj: xdraw2.asm xdraw2.inc fxgasm.h - $(AS) $(AFLAGS) -DGL_AMD3D -DUSE_PACKET_FIFO=1 -Fo $@ xdraw2.asm - -xtexdl_3dnow.obj: xtexdl.asm fxgasm.h - $(AS) $(AFLAGS) -DGL_AMD3D -DUSE_PACKET_FIFO=1 -Fo $@ xtexdl.asm - -!endif # GL_AMD3D diff --git a/glide2x/h3/glide/src/makefile.linux b/glide2x/h3/glide/src/makefile.linux deleted file mode 100644 index 6785e5f..0000000 --- a/glide2x/h3/glide/src/makefile.linux +++ /dev/null @@ -1,279 +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_CHRIS_DENIS_ANTHONY_HACK),1) -LCDEFS += -DCHRIS_DENIS_ANTHONY_HACK=1 -endif - -FX_TACO_MEMORY_FIFO_HACK = -ifneq ($(FX_TACO_MEMORY_FIFO_HACK),) -LCDEFS += -DTACO_MEMORY_FIFO_HACK -endif - -ifneq ($(DIAG_BUILD),) -LCDEFS += -DDIAG_BUILD -endif - -# This is a bit of a red herring -ifeq ($(FX_GLIDE_DIRECT_WRITE),1) -FX_GLIDE_DIRECT_WRITE = 1 -LCDEFS += -DDIRECT_IO=1 -else -FX_GLIDE_PACKET_FIFO = 1 -endif - -ifeq ($(FX_GLIDE_PACKET_FIFO),1) -CMDXPORTDEFS = -DGLIDE_PACKET3_TRI_SETUP=1 -DUSE_PACKET_FIFO=1 -DGLIDE_HW_TRI_SETUP=1 -else -CMDXPORTDEFS = -DUSE_PACKET_FIFO=0 -DGLIDE_HW_TRI_SETUP=1 -DGLIDE_PACKET3_TRI_SETUP=0 -FX_GLIDE_DEBUG_FIFO=1 -endif - -FX_GLIDE_REAL_HW= 1 -FX_GLIDE_NO_FIFO= 1 - -ifneq ($(FX_GLIDE_CTRISETUP),1) -FX_GLIDE_CTRISETUP = 0 -endif -HWSPEC = fifo.c -LCDEFS += -DH3 $(CMDXPORTDEFS) - -INITLIB = $(BUILD_ROOT)/$(FX_GLIDE_HW)/lib$(FX_GLIDE_HW)init.a - - -ifeq ($(DEBUG),1) -DBGOPTS = -DGLIDE_DEBUG -DGDBG_INFO_ON -GLIDE_SANITY_ALL = 1 -endif - -ifeq ($(FX_GLIDE_HW),) -error "FX_GLIDE_HW not defined" -endif - -# Display Options -DSPOPTS = -SUBLIBRARIES = -DSPOPTS += -DGLIDE_INIT_HWC - -ifeq ($(HAL_HW),1) -DSPOPTS += -DHAL_HW=1 -SUBLIBRARIES += $(BUILD_ROOT_SWLIBS)/lib/libfxmisc.a \ - $(BUILD_ROOT_SWLIBS)/lib/libfxpci.a \ - $(BUILD_ROOT)/$(FX_GLIDE_HW)/lib/libminihwc.a -LINKLIBRARIES += -L/usr/X11R6/lib -lX11 -lXext -lXxf86dga -lXxf86vm -endif - -ifeq ($(HAL_HW),) -SUBLIBRARIES += $(BUILD_ROOT)/h3/lib/libminihwc.a -endif - -# 3DNow stuff -GL_AMD3D = 1 -ifneq ($(GL_AMD3D),) -LCDEFS += -DGL_AMD3D -LIBOBJS += xtexdl_3dnow.o -CFILES += xtexdl_def.c -endif - -# Do culling test in sw for independent triangles -CULL_MODE = -ifneq ($(FX_GLIDE_HW_CULL),1) -CULL_MODE = -DGLIDE_TRI_CULLING=1 -endif -DSPOPTS += $(CULL_MODE) - -# Send a single DWORD ARGB rather than 4 fp values, at -# the cost of doing the conversion. -ifeq ($(FX_GLIDE_PACK_RGB),1) -LCDEFS += -DGLIDE_PACKED_RGB=1 -endif - -ifneq ($(FX_GLIDE_NO_FIFO),1) -FIFODEFS = -DUSE_PACKET_FIFO=1 - -ifeq ($(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 += -DGLIDE_USE_DEBUG_FIFO=1 -DFIFO_ASSERT_FULL=1 -DASSERT_FAULT=0 -DGLIDE_SANITY_SIZE=1 -endif -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) -ifeq ($(FX_GLIDE_CTRISETUP),1) -ASMTRISETUP = -ATSOPTS = -DGLIDE_USE_C_TRISETUP -CFILES = gxdraw.c -else -DSPOPTS += -DGLIDE_DISPATCH_SETUP=1 -DGLIDE_PACKED_RGB=0 - -ifeq ($(GL_AMD3D),) -ASMTRISETUP = xdraw2.S -else -LIBOBJS += xdraw2_def.o xdraw2_3dnow.o -endif #GL_AMD3D -endif - -OPTOPTS = $(GRMOPTS) $(OTSOPTS) $(ATSOPTS) - -# local defines, begin with basics and then add on -LCDEFS += -DGLIDE_LIB - -# Turn Off/On compilation of shameless plug -ifeq ($(FX_GLIDE_NO_PLUG),1) -else -LCDEFS += -DGLIDE_PLUG -endif - -# Turn Off/On splash screen -ifeq ($(FX_GLIDE_NO_SPLASH),1) -else -LCDEFS += -DGLIDE_SPLASH -endif - -#Glide 3 Stuff, for migration all -ifneq ($(FX_GLIDE3),) -LCDEFS += -DGLIDE3 -GLIDE3FILES = gstrip.c distrip.c distate.c diget.c -endif - -#Glide 3. remove migration stuff -ifneq ($(FX_GLIDE3_ALPHA),) -LCDEFS += -DGLIDE3_ALPHA -GLIDE3FILES = gstrip.c distrip.c distate.c diget.c -endif - -ifneq ($(GLIDE_SANITY_ALL)$(GLIDE_SANITY_SIZE),) -LCDEFS += -DGLIDE_SANITY_SIZE -endif -ifneq ($(GLIDE_SANITY_ALL)$(GLIDE_SANITY_ASSERT),) -LCDEFS += -DGLIDE_SANITY_ASSERT -endif - -# Local Defs, Includes, and Options (C) -LCINCS += -I$(BUILD_ROOT)/$(FX_GLIDE_HW)/include -LCOPTS = $(DBGOPTS) $(DSPOPTS) $(OPTOPTS) - -# Local Defs, Includes, and Options (ASM) -LADEFS += $(ASM_REGMAP_DEFS) -LAINCS = -I$(BUILD_ROOT)/$(FX_GLIDE_HW)/include -LAOPTS = $(DBGOPTS) $(DSPOPTS) $(OPTOPTS) - -AFILES = $(ASMTRISETUP) cpudtect.S - -# sources -HEADERS = glide.h gump.h glidesys.h glideutl.h -PRIVATE_HEADERS = fxglide.h gsstdef.h fxinline.h fxsplash.h - -INSTALL_DESTINATION = $(BUILD_ROOT)/$(FX_GLIDE_HW) - -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=.o) - -OTHER_CFILES = fxgasm.c fxbldno.c fxinline.h - -# targets -LDIRT = fxgasm.o fxgasm fxgasm.h fxinline.h fxbldno.o fxbldno fxbldno.h - -ifeq ($(FX_GLIDE3),1) -LIBRARIES = libglide3.a -SHARED_LIBRARY = libglide3.so.3.10 -else -LIBRARIES = libglide.a -SHARED_LIBRARY = libglide.so.2.60 -endif -RCFILE = glide.rc - -# 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 - - -LCDEFS += $(FIFODEFS) - -include $(BUILD_ROOT)/swlibs/include/make/3dfx.mak - -ctags: $(CFILES) - ctags $(CFILES) - -gbanner.obj : banner.inc -gsplash.obj : splshdat.c - -#-------------------------------------------------------------------------- -# special rules for making FXGASM.H -# -fxgasm: fxgasm.c $(HEADERS) gsstdef.h fxglide.h makefile.linux - $(CC) -o $@ fxgasm.c $(GCDEFS) $(LCDEFS) $(VCDEFS) $(LCOPTS) \ - -I$(BUILD_ROOT)/$(FX_GLIDE_HW)/include -I$(BUILD_ROOT)/swlibs/include \ - $(LDFLAGS) - -fxgasm.h: fxgasm - ./fxgasm -hex > fxgasm.h -fxinline.h: fxgasm - ./fxgasm -inline > fxinline.h - - -#-------------------------------------------------------------------------- -# special rules for making FXBLDNO.H -# - -fxbldno: fxbldno.c $(HEADERS) $(PRIVATE_HEADERS) - $(CC) -o $@ fxbldno.c $(GCDEFS) $(LCDEFS) $(VCDEFS) $(LCOPTS) $(LDFLAGS) - -fxbldno.h: fxbldno - ./fxbldno > fxbldno.h - -ifneq ($(FX_GLIDE_CTRISETUP),1) -gdraw.o: fxinline.h -endif - -xdraw2.o : xdraw2.S xdraw2.inc.S fxgasm.h fxinline.h - $(CC) -c -o xdraw2.o $(AFLAGS) xdraw2.S - -cpudtect.o : cpudtect.S - $(CC) -c -o cpudtect.o $(AFLAGS) cpudtect.S - -ifneq ($(GL_AMD3D),) -xdraw2_def.o: xdraw2.S xdraw2.inc.S fxgasm.h - $(CC) -c -o $@ $(AFLAGS) xdraw2.S - -xdraw2_3dnow.o: xdraw2.S xdraw2.inc.S fxgasm.h - $(CC) -c -o $@ $(AFLAGS) -DGL_AMD3D -DUSE_PACKET_FIFO xdraw2.S - -xtexdl_3dnow.o: xtexdl.S fxgasm.h - $(CC) -c -o $@ $(AFLAGS) -DGL_AMD3D -DUSE_PACKET_FIFO xtexdl.S -endif diff --git a/glide2x/h3/glide/src/qmodes.h b/glide2x/h3/glide/src/qmodes.h deleted file mode 100644 index 28dbcbe..0000000 --- a/glide2x/h3/glide/src/qmodes.h +++ /dev/null @@ -1,401 +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 -** -** File name: qmodes.h -** -** Description: Structures, macros, etc to support query mode. -** -** $Revision$ -** $Date$ -** -** $History: qmodes.h $ -** -** ***************** Version 3 ***************** -** User: Dow Date: 3/17/99 Time: 6:16p -** Updated in $/Releases/Voodoo3/MT2/3Dfx/devel/H3/glide/src -** Phantom Menace and other fixes. -** -** ***************** Version 20 ***************** -** User: Stuartb Date: 2/25/99 Time: 12:48p -** Updated in $/devel/h3/Win95/dx/dd16 -** Added FPFLAG_CAPABLE. -** -** ***************** Version 19 ***************** -** User: Stuartb Date: 2/18/99 Time: 2:54p -** Updated in $/devel/h3/Win95/dx/dd16 -** Added xlcd FPFLAGS for filter mode setting. -** -** ***************** Version 18 ***************** -** User: Andrew Date: 2/11/99 Time: 11:17a -** Updated in $/devel/h3/Win95/dx/dd16 -** Added AGP Cap Query -** -** ***************** Version 17 ***************** -** User: Stuartb Date: 1/21/99 Time: 11:18a -** Updated in $/devel/h3/Win95/dx/dd16 -** Added FPFLAG_SETRES and FPFLAG_SETREFR for app code. Removed -** broadcastMonitorChange calls. -** -** ***************** Version 16 ***************** -** User: Stuartb Date: 1/12/99 Time: 2:27p -** Updated in $/devel/h3/Win95/dx/dd16 -** Added QUERY_ANALOG_MONITOR & modified QUERY_LCDCTRL. -** -** ***************** Version 15 ***************** -** User: Stuartb Date: 1/08/99 Time: 3:34p -** Updated in $/devel/h3/Win95/dx/dd16 -** Added QUERY_LCDCTRL for control panel flat panel ops. -** -** ***************** Version 14 ***************** -** User: Bob Date: 1/05/99 Time: 5:57p -** Updated in $/devel/h3/WinNT/src/Video/Displays/H3 -** BIOS version reporting to Control Panel applet. -** -** Shared qmodes.h with Win9x and the rest of the universe. -** -** ***************** Version 13 ***************** -** User: Bob Date: 1/05/99 Time: 5:14p -** Updated in $/devel/h3/Win95/dx/dd16 -** Altered nesting of header files so that tv.h is not inside qmodes.h. -** -** This is a sharing issue with NT. -** -** ***************** Version 12 ***************** -** User: Larryw Date: 1/05/99 Time: 4:36p -** Updated in $/devel/swtools/3DfxV2ps -** Changed QUERY[GS]ETDESKTOPGAMMA back to QUERY[GS]ETGAMMA. -** -** ***************** Version 11 ***************** -** User: Larryw Date: 1/05/99 Time: 3:45p -** Updated in $/devel/swtools/3DfxV2ps -** Put MAX_BIOS_VERSION_STRING in; changed some Gamma query values -** -** ***************** Version 10 ***************** -** User: Andrew Date: 1/05/99 Time: 10:50a -** Updated in $/devel/h3/Win95/dx/dd16 -** Added new function to get the bios version string -** -** ***************** Version 9 ***************** -** User: Michael Date: 12/29/98 Time: 2:37p -** Updated in $/devel/h3/Win95/dx/dd16 -** Implement the 3Dfx/STB unified header. -** -** 8 10/10/98 5:21p Hsohel -** -** 7 10/10/98 4:52p Hsohel -** -** 6 10/10/98 3:36p Hsohel -** -** 5 10/09/98 3:54p Hsohel -** -** 4 7/13/98 5:26p Andrew -** Changed to support a gamma table -** -** 3 7/11/98 8:16a Andrew -** Added gamma correction -** -** 2 5/12/98 9:35a Andrew -** Added some minor changes for valid modes -** -** 1 4/22/98 2:47p Andrew -** Query Modes Protocol Information -** -** -*/ - -#ifndef _QMODES_H_ -#define _QMODES_H_ - -/* The QUERYMODES ESC Code */ -#define QUERYESCMODE (0x8001) - -#define TDFXACK (0x3DF0) -#define TDFXERR (0xFFFF) - -// General Queries -#define QUERYVERSION (0x0000) - -// Mode Queries -#define QUERYNUMMODES (0x0001) -#define QUERYMODES (0x0002) -#define QUERYDEVNODE (0x0003) - -// Virtual Desktop Queries -#define QUERYMAXFREEMEM (0x100) -#define QUERYSETVIRTUALSIZE (0x101) -#define QUERYGETSTARTADDR (0x102) -#define QUERYSETSTARTADDR (0x103) - -// Gamma Queries -#define QUERYGETGAMMA (0x200) -#define QUERYSETGAMMA (0x201) -#define QUERYGETGLIDEGAMMA (0x202) -#define QUERYSETGLIDEGAMMA (0x203) - -// BIOS Version -#define QUERYGETBIOSVERSION (0x280) - -// AGP Query -#define QUERYGETAGPCAPS (0x2A0) - -// TVOUT Queries -// see ..\inc\tv.h uses 0x300 -> 0x38f approx. - -// LCD CONTROL -#define QUERY_LCDCTRL (0x3a0) - -// ANALOG MONITOR ON/OFF override - -#define QUERY_ANALOG_MONITOR (0x3b0) - - -/* -** Protocol: -** -** Call will be of the form -** ExtEscape(hdc, QUERYESCMODE, sizeof(QIN), &Qin, sizeof(Output), &Output); -** Escape(hdc, QUERYESCMODE, sizeof(QIN), &Qin, &Output); -** -*/ - - -/* -** Standard Input Structure -** -*/ -typedef struct qin { - DWORD dwSubFunc; // Subfunction -} QIN, FAR * LPQIN, * PQIN; - -/* -** -** -** INPUT: qin.dwSubFunc = QUERYVERSION -** OUTPUT: Driver Major & Minor Version -*/ -typedef struct qversion { - DWORD dwMajor; - DWORD dwMinor; - } QVERSION, FAR * LPQVERSION, * PQVERSION; - -#define QUERYMODE_MAJOR 0x00000000 -#define QUERYMODE_MINOR 0x00009999 - -/* -** Call this function first to know how many modes to allow -** the following structure for -** -** INPUT: qin.dwSubFunc = QUERYNUMMODES -** OUTPUT: Number of modes -*/ -typedef struct qnummode { - DWORD dwNum; - } QNUMMODE, FAR * LPQNUMMODE, * PQNUMODE; - -/* -** This is the mode information. You will need to allocate -** # modes * QMODE structures that the Driver will fill in. -** -** INPUT: qin.dwSubFunc = QUERYMODES -** OUTPUT: #Modes * QMODE -*/ -typedef struct qmode { - DWORD dwX; - DWORD dwY; - DWORD dwBpp; - DWORD dwRef; - DWORD dwValid; // This will be a field of flags - } QMODE, FAR * LPQMODE, * PQMODE; - -#define QUERY_MODE_VALID (0x000000001L) -#define QUERY_TV_MODE (0x000000002L) - -/* -** This is Devnode that the driver is using -** -** INPUT: qin.dwSubFunc = QUERYDEVNODE -** OUTPUT: dwDevNode -*/ -typedef struct qdevnode { - DWORD dwDevNode; // Monitor Device Node - DWORD dwValidDefGamma; // 1 ==> bGamma is valid; 0 ==> Invalid - BYTE bGamma; // Monitor Default Gamma - } QDEVNODE, FAR * LPQDEVNODE, * PQDEVNODE; - -#define QUERY_MONITOR_GAMMA_VALID (0x00000001L) - -/* -** This is maximum free memory available for Virtual Desktop Usage in -** this mode -** -** INPUT: qin.dwSubFunc = QUERYMAXFREEMEM -** OUTPUT: Maximum Free Memory -*/ -typedef struct qmaxfree { - DWORD dwSubFunc; // Should be set to QUERYSETVIRTUALSIZE - DWORD dwMaxFree; // Free Memory Available for Virtual Desktop - DWORD dwMaxX; // Maximum Free X ==> min(dwMaxFree/Y, MaxHardwareX) - DWORD dwMaxY; // Maximum Free Y ==> min(dwMaxFree/(X*BPP), MaxHardwareY) - } QMAXFREE, FAR * LPQMAXFREE, * PQMAXFREE; - -/* -** This is used to set the Virtual Desktop Size -** -** INPUT: qsetvsize.dwSubFunc = QUERYSETVIRTUALSIZE -** OUTPUT: None -*/ -typedef struct qsetvsize { - DWORD dwSubFunc; // Should be set to QUERYSETVIRTUALSIZE - DWORD dwX; // X Size in Pixels (X * BPP * Y <= MaxMemSize) - DWORD dwY; // Y Size in Lines - } QSETVSIZE, FAR * LPQSETVSIZE, * PQSETVSIZE; - -/* -** This is used to get the Virtual Desktop Start Address -** -** INPUT: qin.dwSubFunc = QUERYGETSTARTADDR -** OUTPUT: QGetStartAddr -*/ -typedef struct qgetstartaddr { - DWORD dwX; // X Location in Pixels - DWORD dwY; // Y Location in Lines - } QGETSTARTADDR, FAR * LPQGETSTARTADDR, * PQGETSTARTADDR; - -/* -** This is used to move the Virtual Desktop Start Address -** -** INPUT: qsetstartaddr.dwSubFunc = QUERYSETSTARTADDR -** OUTPUT: None -*/ -typedef struct qsetstartaddr { - DWORD dwSubFunc; // Should be set to QUERYSETSTARTADDR - DWORD dwX; // X Location in Pixels (Note: Start Addr = X * BPP + Y * Display Pitch) - DWORD dwY; // Y Location in Lines - } QSETSTARTADDR, FAR * LPQSETSTARTADDR, * PQSETSTARTADDR; - -/* -** This is used to get the gamma values currently in use -** -** INPUT: qin.dwSubFunc = QUERYGETGAMMA -** OUTPUT: QGETGAMMA -*/ -typedef struct qgetgamma { - DWORD dwRed; // Red Gamma * 100 - DWORD dwGreen; // Green Gamma * 100 - DWORD dwBlue; // Blue Gamma * 100 - DWORD GammaTable[256]; // Gamma Table Defined as 0x00BBGGRR - } QGETGAMMA, FAR * LPQGETGAMMA, * PQGETGAMMA; - -/* -** This is used to set the Gamma Value -** -** INPUT: qSetGamma.dwSubFunc = QUERYSETSTARTADDR -** OUTPUT: None -*/ -typedef struct qsetgamma { - DWORD dwSubFunc; // Should be set to QUERYSETGAMMA - DWORD dwRed; // Red Gamma * 100 - DWORD dwGreen; // Green Gamma * 100 - DWORD dwBlue; // Blue Gamma * 100 - DWORD GammaTable[256]; // Gamma Table Defined as 0x00BBGGRR - } QSETGAMMA, FAR * LPQSETGAMMA, * PQSETGAMMA; - -#define MAX_BIOS_VERSION_STRING (32) - -/* -** This is used to get the BIOS version -** -** INPUT: qin.dwSubFunc = QUERYGETBIOSVERSION -** OUTPUT: QGETBIOSVERSION -*/ -typedef struct qgetbiosversion { - BYTE bBIOSVersion[MAX_BIOS_VERSION_STRING]; - } QGETBIOSVERSION, FAR * LPQGETBIOSVERSION, * PQGETBIOSVERSION; - - -/* -** This is used to get the AGP Caps -** -** INPUT: qin.dwSubFunc = QUERYGETAGPCAPS -** OUTPUT: QGETAGPCAPS -*/ -// These are also defined in h3g.h -#define IS_AGP_CARD (0x00000001L) //Card has AGP capabilities -#define IS_GART_AVAILABLE (0x00000002L) //VMM Gart Functions are present -#define IS_AGP_READY (IS_AGP_CARD|IS_GART_AVAILABLE) //We can do AGP Functions on this card - -typedef struct qgetagpcaps { - DWORD dwAGPCaps; - } QGETAGPCAPS, FAR * LPQGETAGPCAPS, * PQGETAGPCAPS; - -/* HWCEXT_LCDCTRL -* -* Enables or disables flat panel monitor and also returns current status as -* given in IN-OUT struct below: -* -*/ - -// CAUTION: this is mirrored in h3g.h!!! - -typedef struct { - DWORD dwSubFunc; // Should be set to QGETSET_LCDCTRL - DWORD maxWidth; // out - DWORD maxHeight; // out - DWORD refreshRate; // out - DWORD fpFlags; // in - out -} QGETSET_LCDCTRL; - -#define FPFLAG_ENABLED BIT(0) // is currently enabled (OUT) -#define FPFLAG_PRESENT BIT(1) // panel & controller connected (OUT) -#define FPFLAG_PRESENT_AT_BOOT BIT(2) // panel & controller connected - // at boot time (OUT) -#define FPFLAG_ENABLE BIT(3) // try to enable panel (IN) -#define FPFLAG_DISABLE BIT(4) // try to disable panel (IN) -#define FPFLAG_GET_DIMS BIT(5) // read the EDID to get panel's - // physical dimensions (IN) -#define FPFLAG_SETRES BIT(6) // current desktop resolution too hi - // (OUT) -#define FPFLAG_SETREFR BIT(7) // current refresh rate wrong (OUT) - -// filter bits -// 00 bilinear 01 gausian -// 10 crisp 11 extra crisp -#define FPFLAG_FILTER_SOFT BIT(8) // use these 2 bits together (IN) -#define FPFLAG_FILTER_HARD BIT(9) -#define FPFLAG_CAPABLE BIT(10) // board has controller & BIOS - - -typedef struct { - DWORD dwSubFunc; // Should be set to QUERY_ANALOG_MONITOR - DWORD monitorStatus; - DWORD monitorControl; -} QGETSET_MONITOR_CTL; - -#define ENABLE_MONITOR BIT(0) -#define DISABLE_MONITOR BIT(1) -#define MONITOR_IS_ENABLED BIT(2) - - -#ifdef WINNT -int QueryMode(PDEV *, LPQIN lpQIN, LPVOID lpOutput); -#else -int QueryMode(LPQIN lpQIN, LPVOID lpOutput); -#endif - -#endif diff --git a/glide2x/h3/glide/src/rcver.h b/glide2x/h3/glide/src/rcver.h deleted file mode 100644 index 54df333..0000000 --- a/glide2x/h3/glide/src/rcver.h +++ /dev/null @@ -1,60 +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 60 - -#ifdef __WIN32__ -#define BUILD_NUMBER 0415 -#endif - -#ifndef GLIDE3 -#define VERSIONSTR "2.60.00.0415" -#else -#define VERSIONSTR "3.0\0" -#endif - -#ifdef SST1 -# define HWSTR "Voodoo Graphics(tm)\0" -# ifdef NT_BUILD -# define PRODNAME "Glide(tm) for Voodoo Graphics\251 and Windows\256 NT\0" -# else -# define PRODNAME "Glide(tm) for Voodoo Graphics\251 and Windows\256 95/98\0" -# endif /* NT_BUILD */ -#elif defined(SST96) -# define HWSTR " Voodoo Rush(tm)\0" -# ifdef NT_BUILD -# define PRODNAME "Glide(tm) for Voodoo Rush\251 and Windows\256 NT\0" -# else -# define PRODNAME "Glide(tm) for Voodoo Rush\251 and Windows\256 95/98\0" -# endif /* NT_BUILD */ -#elif defined(CVG) || defined(VOODOO2) -# define HWSTR " Voodoo^2(tm)\0" -# 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 " Voodoo Banshee(tm) & Voodoo3(tm)\0" -# define PRODNAME "Glide for Voodoo Banshee\256 and Voodoo3\256; Windows 95 \256, Windows 98 \256, and Windows NT\256\0" -#else -# define HWSTR "Unknown Chip\0" -#endif diff --git a/glide2x/h3/glide/src/readme b/glide2x/h3/glide/src/readme deleted file mode 100644 index 835083d..0000000 --- a/glide2x/h3/glide/src/readme +++ /dev/null @@ -1,40 +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 diff --git a/glide2x/h3/glide/src/splshdat.c b/glide2x/h3/glide/src/splshdat.c deleted file mode 100644 index 18de6dc..0000000 --- a/glide2x/h3/glide/src/splshdat.c +++ /dev/null @@ -1,14809 +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:30 joseph -** Initial checkin into SourceForge. -** -** -** 3 3/17/99 6:16p Dow -** Phantom Menace and other fixes. - * - * 6 1/09/98 6:48p Atai - * grTexInfo, GR_LOD_* and GR_ASPECT_* - * - * 5 12/09/97 10:20a Peter - * removed extraneous cruft - * - * 4 6/02/97 4:09p Peter - * Compile w/ gcc for Dural - * - * 3 5/21/97 6:05a Peter -** -*/ - -static Vert vert_0[] = { -{ 273.149261f, -24.549585f, 271.420441f, 0.012590f, -0.999890f, 0.007876f, 189.411841f, 18.708570f }, -{ 262.776489f, -24.549574f, 143.489777f, 0.005015f, -0.999765f, 0.021108f, 187.071440f, 69.986058f }, -{ 484.061951f, -24.549578f, 188.438385f, 0.011169f, -0.999936f, -0.001735f, 236.999758f, 51.969644f }, -{ 383.791992f, -24.549570f, 84.710793f, 0.010803f, -0.999785f, 0.017720f, 214.376000f, 93.546010f }, -{ 563.586426f, -24.549566f, 46.677605f, 0.009678f, -0.999914f, -0.008881f, 254.942760f, 108.790640f }, -{ 432.198181f, -24.549561f, -5.186394f, 0.013545f, -0.999894f, 0.005335f, 225.297815f, 129.578823f }, -{ 542.840820f, -24.549555f, -77.795677f, 0.007103f, -0.999894f, -0.012739f, 250.261958f, 158.682259f }, -{ 407.995087f, -24.549522f, -95.083649f, 0.013879f, -0.999904f, -0.000529f, 219.836900f, 165.611674f }, -{ 494.434692f, -24.549543f, -205.726379f, 0.002522f, -0.999903f, -0.013725f, 239.340159f, 209.959770f }, -{ 300.809937f, -24.549547f, -171.150482f, 0.015764f, -0.999874f, -0.001621f, 195.652869f, 196.100972f }, -{ 331.928192f, -24.549507f, -274.878052f, 0.002234f, -0.999897f, -0.014178f, 202.674041f, 237.677320f }, -{ 155.591354f, -24.549513f, -202.268799f, 0.011551f, -0.999861f, -0.012043f, 162.887410f, 208.573894f }, -{ 138.303436f, -24.549505f, -288.708374f, -0.003900f, -0.999855f, -0.016564f, 158.986767f, 243.220826f }, -{ -10.372740f, -24.549486f, -178.065643f, 0.019735f, -0.999598f, -0.020336f, 125.441172f, 198.872725f }, -{ -76.066864f, -24.549473f, -316.369080f, -0.005668f, -0.999796f, -0.019403f, 110.618699f, 254.307860f }, -{ -148.676147f, -24.549513f, -212.641541f, 0.006169f, -0.999812f, -0.018392f, 94.235969f, 212.731524f }, -{ -235.115784f, -24.549473f, -316.369080f, -0.011969f, -0.999851f, -0.012476f, 74.732718f, 254.307860f }, -{ -276.606812f, -24.549515f, -191.895996f, 0.001960f, -0.999741f, -0.022663f, 65.371153f, 204.416240f }, -{ -394.164703f, -24.549477f, -267.962891f, -0.008901f, -0.999940f, -0.006464f, 38.846733f, 234.905569f }, -{ -352.673676f, -24.549488f, -136.574646f, -0.001484f, -0.999702f, -0.024356f, 48.208294f, 182.242196f }, -{ -490.977112f, -24.549486f, -167.692871f, -0.010745f, -0.999942f, -0.000498f, 17.003084f, 194.715083f }, -{ -404.537445f, -24.549494f, -81.253296f, -0.011367f, -0.999900f, -0.008360f, 36.506343f, 160.068151f }, -{ -563.586426f, -24.549498f, -29.389488f, -0.008846f, -0.999795f, 0.018188f, 0.620349f, 139.279968f }, -{ -421.825378f, -24.549501f, 8.643953f, -0.014278f, -0.999891f, -0.003750f, 32.605693f, 124.035300f }, -{ -522.095337f, -24.549541f, 105.456299f, -0.006669f, -0.999881f, 0.013889f, 9.981924f, 85.230734f }, -{ -363.046448f, -24.549541f, 112.371468f, -0.021114f, -0.999733f, -0.009357f, 45.867897f, 82.458980f }, -{ -446.028503f, -24.549519f, 205.726318f, 0.001853f, -0.999682f, 0.025132f, 27.144776f, 45.040260f }, -{ -304.267487f, -24.549698f, 160.777710f, -0.020407f, -0.999774f, 0.005967f, 59.130113f, 63.056674f }, -{ -325.013000f, -24.549555f, 267.962860f, 0.003703f, -0.999746f, 0.022221f, 54.449330f, 20.094447f }, -{ -203.997513f, -24.549549f, 198.811157f, -0.010313f, -0.999774f, 0.018587f, 81.753890f, 47.811998f }, -{ -138.303391f, -24.549589f, 316.369080f, 0.008523f, -0.999823f, 0.016755f, 96.576363f, 0.692140f }, -{ -44.948593f, -24.549578f, 178.065643f, -0.007338f, -0.999733f, 0.021901f, 117.639871f, 56.127275f }, -{ 79.524475f, -24.549589f, 302.538696f, 0.018197f, -0.999766f, 0.011712f, 145.724552f, 6.235663f }, -{ 107.185158f, -24.549576f, 164.235291f, 0.002913f, -0.999764f, 0.021512f, 151.965595f, 61.670797f }, -{ 257.177246f, -24.933891f, 247.388947f, -0.002196f, -0.999908f, 0.013383f, 189.411841f, 18.708570f }, -{ 248.097778f, -24.933882f, 127.560898f, 0.006178f, -0.999976f, 0.003207f, 187.071440f, 69.986058f }, -{ 449.640747f, -24.933884f, 170.658722f, 0.002530f, -0.999944f, 0.010309f, 236.999758f, 51.969644f }, -{ 357.436859f, -24.933876f, 80.888054f, 0.006209f, -0.999981f, -0.000250f, 214.376000f, 93.546010f }, -{ 521.126526f, -24.933874f, 43.160934f, 0.006734f, -0.999927f, 0.010037f, 254.942760f, 108.790640f }, -{ 404.311340f, -24.933870f, -2.458469f, 0.006431f, -0.999963f, -0.005670f, 225.297815f, 129.578823f }, -{ 501.943878f, -24.933863f, -69.597458f, 0.008351f, -0.999957f, 0.004028f, 250.261958f, 158.682259f }, -{ 380.763092f, -24.933832f, -86.167274f, 0.003817f, -0.999973f, -0.006297f, 219.836900f, 165.611674f }, -{ 459.521820f, -24.933853f, -187.305740f, 0.007558f, -0.999970f, -0.001392f, 239.340159f, 209.959770f }, -{ 277.039581f, -24.933857f, -148.476547f, 0.001550f, -0.999981f, -0.006005f, 195.652869f, 196.100972f }, -{ 310.612000f, -24.933817f, -250.478271f, 0.010282f, -0.999945f, -0.002099f, 202.674041f, 237.677320f }, -{ 143.869293f, -24.933823f, -182.877960f, 0.000385f, -0.999975f, -0.007022f, 162.887410f, 208.573894f }, -{ 126.038422f, -24.933817f, -261.421204f, 0.007580f, -0.999942f, -0.007664f, 158.986767f, 243.220826f }, -{ -12.511669f, -24.933794f, -160.756546f, 0.000504f, -0.999969f, -0.007865f, 125.441172f, 198.872725f }, -{ -76.663612f, -24.933783f, -297.401611f, 0.011523f, -0.999829f, -0.014451f, 110.618699f, 254.307860f }, -{ -148.031876f, -24.933823f, -192.176437f, -0.004257f, -0.999964f, -0.007337f, 94.235969f, 212.731524f }, -{ -229.626144f, -24.933783f, -288.089294f, 0.004915f, -0.999922f, -0.011510f, 74.732718f, 254.307860f }, -{ -271.880676f, -24.933825f, -170.771347f, -0.005194f, -0.999973f, -0.005174f, 65.371153f, 204.416240f }, -{ -371.136383f, -24.933788f, -242.218704f, 0.003027f, -0.999922f, -0.012100f, 38.846733f, 234.905569f }, -{ -331.104309f, -24.933798f, -120.729073f, -0.004534f, -0.999987f, -0.002245f, 48.208294f, 182.242196f }, -{ -457.056519f, -24.933796f, -151.361816f, -0.000889f, -0.999896f, -0.014400f, 17.003084f, 194.715083f }, -{ -375.726990f, -24.933802f, -71.798042f, -0.008099f, -0.999961f, 0.003607f, 36.506343f, 160.068151f }, -{ -521.126587f, -24.933805f, -27.175323f, -0.006509f, -0.999977f, 0.001914f, 0.620349f, 139.279968f }, -{ -393.095642f, -24.933809f, 1.511459f, -0.005247f, -0.999950f, 0.008552f, 32.605693f, 124.035300f }, -{ -489.623932f, -24.933847f, 94.842606f, -0.009209f, -0.999957f, -0.000960f, 9.981924f, 85.230734f }, -{ -339.383545f, -24.933847f, 99.110413f, -0.004875f, -0.999978f, 0.004578f, 45.867897f, 82.458980f }, -{ -420.171265f, -24.933825f, 190.964874f, -0.009048f, -0.999950f, 0.004143f, 27.144776f, 45.040260f }, -{ -291.672363f, -24.934004f, 144.238663f, -0.000427f, -0.999928f, 0.011948f, 59.130113f, 63.056674f }, -{ -309.379486f, -24.933861f, 249.619171f, -0.011270f, -0.999908f, 0.007562f, 54.449330f, 20.094447f }, -{ -195.040344f, -24.933855f, 180.815704f, 0.002731f, -0.999942f, 0.010459f, 81.753890f, 47.811998f }, -{ -136.935654f, -24.933895f, 293.288574f, -0.005146f, -0.999926f, 0.011049f, 96.576363f, 0.692140f }, -{ -48.893070f, -24.933884f, 161.229355f, 0.003108f, -0.999963f, 0.008062f, 117.639871f, 56.127275f }, -{ 72.555756f, -24.933893f, 275.836060f, -0.004433f, -0.999894f, 0.013872f, 145.724552f, 6.235663f }, -{ 102.042297f, -24.933882f, 146.974792f, 0.007025f, -0.999961f, 0.005404f, 151.965595f, 61.670797f } -}; - -static Face face_0[] = { -{ { 61, 60, 59 }, 3, 0 }, -{ { 55, 54, 53 }, 3, 0 }, -{ { 57, 56, 55 }, 3, 0 }, -{ { 39, 38, 37 }, 3, 0 }, -{ { 37, 36, 35 }, 3, 0 }, -{ { 53, 52, 51 }, 3, 0 }, -{ { 41, 40, 39 }, 3, 0 }, -{ { 43, 42, 41 }, 3, 0 }, -{ { 59, 58, 57 }, 3, 0 }, -{ { 63, 62, 61 }, 3, 0 }, -{ { 45, 44, 43 }, 3, 0 }, -{ { 35, 34, 67 }, 3, 0 }, -{ { 67, 66, 65 }, 3, 0 }, -{ { 51, 50, 49 }, 3, 0 }, -{ { 49, 48, 47 }, 3, 0 }, -{ { 65, 64, 63 }, 3, 0 }, -{ { 47, 46, 45 }, 3, 0 }, -{ { 41, 39, 37 }, 3, 0 }, -{ { 43, 41, 37 }, 3, 0 }, -{ { 43, 37, 35 }, 3, 0 }, -{ { 45, 43, 35 }, 3, 0 }, -{ { 45, 35, 67 }, 3, 0 }, -{ { 47, 45, 67 }, 3, 0 }, -{ { 47, 67, 65 }, 3, 0 }, -{ { 49, 47, 65 }, 3, 0 }, -{ { 49, 65, 63 }, 3, 0 }, -{ { 51, 49, 63 }, 3, 0 }, -{ { 51, 63, 61 }, 3, 0 }, -{ { 53, 51, 61 }, 3, 0 }, -{ { 53, 61, 59 }, 3, 0 }, -{ { 53, 59, 57 }, 3, 0 }, -{ { 53, 57, 55 }, 3, 0 }, -{ { 61, 27, 26 }, 4, 2 }, -{ { 26, 60, 61 }, 4, 0 }, -{ { 60, 26, 25 }, 4, 2 }, -{ { 25, 59, 60 }, 4, 0 }, -{ { 55, 21, 20 }, 4, 2 }, -{ { 20, 54, 55 }, 4, 0 }, -{ { 54, 20, 19 }, 4, 2 }, -{ { 19, 53, 54 }, 4, 0 }, -{ { 57, 23, 22 }, 4, 2 }, -{ { 22, 56, 57 }, 4, 0 }, -{ { 56, 22, 21 }, 4, 2 }, -{ { 21, 55, 56 }, 4, 0 }, -{ { 39, 5, 4 }, 4, 2 }, -{ { 4, 38, 39 }, 4, 0 }, -{ { 38, 4, 3 }, 4, 2 }, -{ { 3, 37, 38 }, 4, 0 }, -{ { 37, 3, 2 }, 4, 2 }, -{ { 2, 36, 37 }, 4, 0 }, -{ { 36, 2, 1 }, 4, 2 }, -{ { 1, 35, 36 }, 4, 0 }, -{ { 53, 19, 18 }, 4, 2 }, -{ { 18, 52, 53 }, 4, 0 }, -{ { 52, 18, 17 }, 4, 2 }, -{ { 17, 51, 52 }, 4, 0 }, -{ { 41, 7, 6 }, 4, 2 }, -{ { 6, 40, 41 }, 4, 0 }, -{ { 40, 6, 5 }, 4, 2 }, -{ { 5, 39, 40 }, 4, 0 }, -{ { 43, 9, 8 }, 4, 2 }, -{ { 8, 42, 43 }, 4, 0 }, -{ { 42, 8, 7 }, 4, 2 }, -{ { 7, 41, 42 }, 4, 0 }, -{ { 59, 25, 24 }, 4, 2 }, -{ { 24, 58, 59 }, 4, 0 }, -{ { 58, 24, 23 }, 4, 2 }, -{ { 23, 57, 58 }, 4, 0 }, -{ { 63, 29, 28 }, 4, 2 }, -{ { 28, 62, 63 }, 4, 0 }, -{ { 62, 28, 27 }, 4, 2 }, -{ { 27, 61, 62 }, 4, 0 }, -{ { 45, 11, 10 }, 4, 2 }, -{ { 10, 44, 45 }, 4, 0 }, -{ { 44, 10, 9 }, 4, 2 }, -{ { 9, 43, 44 }, 4, 0 }, -{ { 35, 1, 0 }, 4, 2 }, -{ { 0, 34, 35 }, 4, 0 }, -{ { 34, 0, 33 }, 4, 2 }, -{ { 33, 67, 34 }, 4, 0 }, -{ { 67, 33, 32 }, 4, 2 }, -{ { 32, 66, 67 }, 4, 0 }, -{ { 66, 32, 31 }, 4, 2 }, -{ { 31, 65, 66 }, 4, 0 }, -{ { 51, 17, 16 }, 4, 2 }, -{ { 16, 50, 51 }, 4, 0 }, -{ { 50, 16, 15 }, 4, 2 }, -{ { 15, 49, 50 }, 4, 0 }, -{ { 49, 15, 14 }, 4, 2 }, -{ { 14, 48, 49 }, 4, 0 }, -{ { 48, 14, 13 }, 4, 2 }, -{ { 13, 47, 48 }, 4, 0 }, -{ { 65, 31, 30 }, 4, 2 }, -{ { 30, 64, 65 }, 4, 0 }, -{ { 64, 30, 29 }, 4, 2 }, -{ { 29, 63, 64 }, 4, 0 }, -{ { 47, 13, 12 }, 4, 2 }, -{ { 12, 46, 47 }, 4, 0 }, -{ { 46, 12, 11 }, 4, 2 }, -{ { 11, 45, 46 }, 4, 0 } -}; - -static Vert vert_1[] = { -{ -227.530014f, -20.966743f, 18.889576f, -0.132901f, 0.000004f, -0.991129f, 11.312357f, 104.759467f }, -{ -227.530014f, -20.966749f, 49.094059f, -0.113407f, 0.000000f, 0.993549f, 24.483732f, 68.571409f }, -{ -220.271423f, -20.966749f, 49.922577f, -0.278891f, 0.000000f, 0.960323f, 33.541598f, 70.744057f }, -{ -214.348251f, -20.966755f, 52.198391f, -0.521000f, 0.000000f, 0.853557f, 41.630631f, 70.600333f }, -{ -209.753510f, -20.966747f, 55.606861f, -0.731747f, 0.000000f, 0.681577f, 48.621978f, 68.520264f }, -{ -206.480209f, -20.966747f, 59.833366f, -0.886449f, 0.000000f, 0.462826f, 54.386820f, 64.883859f }, -{ -204.521362f, -20.966749f, 64.563301f, -0.976238f, 0.000000f, 0.216703f, 58.796339f, 60.071098f }, -{ -203.869965f, -20.966747f, 69.481987f, -0.998414f, 0.000000f, -0.056296f, 61.721703f, 54.462037f }, -{ -204.699646f, -20.966759f, 74.975159f, -0.937504f, 0.000000f, -0.347976f, 63.123094f, 47.518821f }, -{ -207.067520f, -20.966751f, 79.783142f, -0.793604f, 0.000000f, -0.608435f, 62.382769f, 40.725774f }, -{ -210.791794f, -20.966751f, 83.766113f, -0.597880f, 0.000001f, -0.801586f, 59.657563f, 34.329668f }, -{ -215.690674f, -20.966751f, 86.784210f, -0.383174f, 0.000001f, -0.923676f, 55.104290f, 28.577385f }, -{ -221.582382f, -20.966751f, 88.697617f, -0.170028f, 0.000001f, -0.985439f, 48.879779f, 23.715683f }, -{ -228.285126f, -20.966751f, 89.366486f, -0.004631f, 0.000001f, -0.999989f, 41.140841f, 19.991411f }, -{ -233.272552f, -20.966751f, 89.153244f, 0.101449f, 0.000001f, -0.994841f, 35.072373f, 18.071997f }, -{ -238.232040f, -20.966751f, 88.499512f, 0.188036f, 0.000001f, -0.982162f, 28.845299f, 16.692535f }, -{ -243.261429f, -20.966751f, 87.384338f, 0.268237f, 0.000001f, -0.963353f, 22.333248f, 15.835422f }, -{ -248.458618f, -20.966747f, 85.786713f, 0.337432f, 0.000001f, -0.941350f, 15.409765f, 15.483181f }, -{ -253.921509f, -20.966747f, 83.685699f, 0.393673f, 0.000001f, -0.919251f, 7.948429f, 15.618211f }, -{ -259.747955f, -20.966747f, 81.060303f, 0.410820f, 0.000001f, -0.911717f, -0.177157f, 16.222941f }, -{ -259.747955f, -20.966751f, 111.264603f, -0.366219f, -0.000001f, 0.930529f, 12.994208f, -19.965071f }, -{ -253.885376f, -20.966755f, 113.571884f, -0.315937f, -0.000001f, 0.948780f, 21.024357f, -20.172935f }, -{ -247.666229f, -20.966757f, 115.459656f, -0.243578f, -0.000001f, 0.969881f, 29.298774f, -19.722674f }, -{ -241.153412f, -20.966763f, 116.927917f, -0.175846f, -0.000001f, 0.984418f, 37.742109f, -18.641708f }, -{ -234.409882f, -20.966763f, 117.976685f, -0.111723f, -0.000001f, 0.993739f, 46.278933f, -16.957548f }, -{ -227.498550f, -20.966763f, 118.605942f, -0.050166f, -0.000001f, 0.998741f, 54.833858f, -14.697611f }, -{ -220.482346f, -20.966763f, 118.815689f, 0.049994f, -0.000001f, 0.998749f, 63.331494f, -11.889319f }, -{ -205.143631f, -20.966763f, 117.432495f, 0.221684f, -0.000001f, 0.975119f, 81.105759f, -3.543264f }, -{ -191.825546f, -20.966755f, 113.455368f, 0.430806f, -0.000001f, 0.902444f, 95.327940f, 7.029456f }, -{ -180.870651f, -20.966755f, 107.142990f, 0.647042f, -0.000001f, 0.762454f, 105.700410f, 19.369521f }, -{ -172.621567f, -20.966755f, 98.754059f, 0.840384f, 0.000000f, 0.541992f, 111.925502f, 33.017599f }, -{ -167.420868f, -20.966753f, 88.547287f, 0.966795f, 0.000000f, 0.255554f, 113.705577f, 47.514307f }, -{ -165.611176f, -20.966751f, 76.781357f, 0.999957f, 0.000000f, -0.009295f, 110.742945f, 62.400328f }, -{ -166.340637f, -20.966751f, 68.696579f, 0.976852f, 0.000000f, -0.213918f, 106.343396f, 71.768664f }, -{ -168.510422f, -20.966749f, 61.101204f, 0.918400f, 0.000000f, -0.395654f, 100.431605f, 79.922555f }, -{ -172.092514f, -20.966755f, 54.065182f, 0.827210f, 0.000000f, -0.561892f, 93.071636f, 86.790413f }, -{ -177.058975f, -20.966747f, 47.658421f, 0.712639f, 0.000000f, -0.701531f, 84.327446f, 92.300650f }, -{ -183.381851f, -20.966743f, 41.950832f, 0.586577f, 0.000000f, -0.809893f, 74.263017f, 96.381707f }, -{ -191.033142f, -20.966743f, 37.012333f, 0.830953f, 0.000000f, 0.556343f, 62.942380f, 98.962027f }, -{ -181.454453f, -20.966751f, 32.298737f, 0.560396f, -0.000001f, 0.828225f, 72.363203f, 108.786445f }, -{ -173.805496f, -20.966743f, 26.319462f, 0.724928f, -0.000003f, 0.688825f, 78.920131f, 119.285616f }, -{ -168.002350f, -20.966745f, 19.235668f, 0.857930f, -0.000002f, 0.513767f, 82.783855f, 130.303376f }, -{ -163.961121f, -20.966740f, 11.208173f, 0.946024f, 0.000000f, 0.324095f, 84.125031f, 141.683643f }, -{ -161.597916f, -20.966740f, 2.397420f, 0.990004f, 0.000000f, 0.141040f, 83.114247f, 153.270415f }, -{ -160.828827f, -20.966740f, -7.035602f, 0.998047f, 0.000000f, -0.062465f, 79.922191f, 164.907572f }, -{ -162.772522f, -20.966736f, -21.426922f, 0.945614f, 0.000000f, -0.325292f, 71.317727f, 181.302331f }, -{ -168.407867f, -20.966743f, -33.734730f, 0.805843f, 0.000000f, -0.592129f, 59.198844f, 193.590982f }, -{ -177.441193f, -20.966736f, -43.721256f, 0.600640f, 0.000000f, -0.799519f, 44.021060f, 201.616710f }, -{ -189.578857f, -20.966732f, -51.148808f, 0.373832f, 0.000000f, -0.927496f, 26.239853f, 205.222777f }, -{ -204.527191f, -20.966740f, -55.779682f, 0.160102f, 0.000000f, -0.987101f, 6.310721f, 204.252461f }, -{ -221.992554f, -20.966740f, -57.376118f, 0.002576f, 0.000000f, -0.999997f, -15.310837f, 198.548949f }, -{ -229.371170f, -20.966740f, -57.068485f, -0.093624f, 0.000000f, -0.995608f, -24.017065f, 194.962735f }, -{ -236.805725f, -20.966740f, -56.173542f, -0.168365f, 0.000000f, -0.985725f, -32.534211f, 190.648469f }, -{ -244.142380f, -20.966740f, -54.733250f, -0.240737f, 0.000000f, -0.970590f, -40.696227f, 185.723508f }, -{ -251.227341f, -20.966732f, -52.789539f, -0.314259f, 0.000000f, -0.949337f, -48.337180f, 180.305151f }, -{ -257.906799f, -20.966732f, -50.384388f, -0.392630f, 0.000000f, -0.919696f, -55.291061f, 174.510773f }, -{ -264.026886f, -20.966732f, -47.559727f, -0.419059f, 0.000000f, -0.907959f, -61.391828f, 168.457698f }, -{ -264.026886f, -20.966738f, -14.334979f, 0.543306f, 0.000000f, 0.839534f, -46.903330f, 128.650867f }, -{ -257.339294f, -20.966736f, -18.662861f, 0.501817f, 0.000000f, 0.864974f, -40.778150f, 136.752428f }, -{ -251.050217f, -20.966736f, -22.109791f, 0.426524f, 0.000000f, 0.904476f, -34.746278f, 143.624739f }, -{ -245.054810f, -20.966736f, -24.717709f, 0.331870f, 0.000000f, 0.943325f, -28.700379f, 149.363753f }, -{ -239.248169f, -20.966736f, -26.528568f, 0.220540f, 0.000000f, 0.975378f, -22.533070f, 154.065492f }, -{ -233.525421f, -20.966736f, -27.584324f, 0.100336f, 0.000000f, 0.994954f, -16.136991f, 157.825952f }, -{ -227.781708f, -20.966736f, -27.926914f, -0.045215f, 0.000000f, 0.998977f, -9.404798f, 160.741110f }, -{ -220.280746f, -20.966736f, -27.192783f, -0.239464f, 0.000000f, 0.970905f, -0.097693f, 163.132527f }, -{ -213.751633f, -20.966736f, -25.074284f, -0.460291f, 0.000000f, 0.887768f, 8.648720f, 163.441519f }, -{ -208.369156f, -20.966736f, -21.697269f, -0.678343f, 0.000000f, 0.734745f, 16.570136f, 161.742661f }, -{ -204.308121f, -20.966736f, -17.187603f, -0.860689f, 0.000000f, 0.509130f, 23.402251f, 158.110511f }, -{ -201.743317f, -20.966747f, -11.671123f, -0.971980f, 0.000000f, 0.235065f, 28.880766f, 152.619616f }, -{ -200.849533f, -20.966740f, -5.273685f, -0.999103f, 0.000000f, -0.042355f, 32.741388f, 145.344557f }, -{ -201.724655f, -20.966740f, 1.288052f, -0.949258f, 0.000000f, -0.314499f, 34.554308f, 137.101264f }, -{ -204.242859f, -20.966745f, 7.031773f, -0.823833f, 0.000000f, -0.566833f, 34.041921f, 129.121540f }, -{ -208.243301f, -20.966740f, 11.810628f, -0.639055f, 0.000000f, -0.769161f, 31.332898f, 121.651460f }, -{ -213.565170f, -20.966740f, 15.477796f, -0.424211f, 0.000001f, -0.905563f, 26.555888f, 114.937053f }, -{ -220.047684f, -20.966743f, 17.886265f, -0.205822f, 0.000004f, -0.978589f, 19.839473f, 109.224409f }, -{ -148.686584f, -20.966757f, 116.550354f, 0.000000f, -0.000001f, 1.000000f, 148.362720f, 22.133174f }, -{ -72.924095f, -20.966761f, 116.550354f, 0.071640f, -0.000001f, 0.997431f, 239.134392f, 55.171337f }, -{ -44.133286f, -20.966759f, 113.442535f, 0.268782f, -0.000001f, 0.963201f, 272.273660f, 71.449816f }, -{ -20.467419f, -20.966759f, 104.692368f, 0.513694f, -0.000001f, 0.857974f, 296.812166f, 92.253563f }, -{ -1.975434f, -20.966759f, 91.159866f, 0.734379f, 0.000000f, 0.678739f, 313.066387f, 116.530870f }, -{ 11.293716f, -20.966763f, 73.704994f, 0.894190f, 0.000000f, 0.447688f, 321.352617f, 143.230046f }, -{ 19.291100f, -20.966763f, 53.187717f, 0.979694f, 0.000000f, 0.200499f, 321.987274f, 171.299429f }, -{ 21.967770f, -20.966759f, 30.467985f, 0.999373f, 0.000000f, -0.035418f, 315.286714f, 199.687265f }, -{ 19.338877f, -20.966749f, 6.999157f, 0.959992f, 0.000000f, -0.280027f, 301.902798f, 226.659149f }, -{ 11.340330f, -20.966751f, -13.645114f, 0.842717f, 0.000000f, -0.538357f, 283.317205f, 247.905254f }, -{ -2.195676f, -20.966743f, -30.821491f, 0.643022f, 0.000000f, -0.765848f, 259.609426f, 262.581684f }, -{ -21.436935f, -20.966740f, -43.886723f, 0.400098f, 0.000000f, -0.916472f, 230.858877f, 269.844599f }, -{ -46.551262f, -20.966736f, -52.197575f, 0.167743f, 0.000000f, -0.985831f, 197.145034f, 268.850158f }, -{ -77.706444f, -20.966743f, -55.110798f, 0.031064f, 0.000000f, -0.999517f, 158.547374f, 258.754495f }, -{ -148.686584f, -20.966743f, -55.110798f, 0.000000f, 0.000000f, -1.000000f, 73.505490f, 227.801797f }, -{ -105.897141f, -20.966753f, 85.087540f, 0.894427f, 0.000000f, -0.447214f, 185.908946f, 78.488452f }, -{ -105.897141f, -20.966742f, -23.647968f, 0.447214f, 0.000000f, 0.894427f, 138.492050f, 208.765350f }, -{ -77.958153f, -20.966742f, -23.647968f, -0.079186f, 0.000000f, 0.996860f, 171.965974f, 220.948864f }, -{ -58.874207f, -20.966740f, -21.368664f, -0.304705f, 0.000000f, 0.952447f, 195.824559f, 226.540055f }, -{ -44.341877f, -20.966745f, -15.146022f, -0.579111f, 0.000000f, 0.815249f, 215.949404f, 225.421851f }, -{ -33.878738f, -20.966743f, -5.902942f, -0.798828f, 0.000000f, 0.601559f, 232.516059f, 218.910357f }, -{ -27.002363f, -20.966749f, 5.437657f, -0.929901f, 0.000000f, 0.367810f, 245.700060f, 208.321713f }, -{ -23.230320f, -20.966747f, 17.952679f, -0.987642f, -0.000001f, 0.156725f, 255.676941f, 194.972086f }, -{ -22.080179f, -20.966755f, 30.719687f, -0.999434f, 0.000000f, -0.033649f, 262.622269f, 180.177463f }, -{ -23.442402f, -20.966751f, 44.972424f, -0.970480f, 0.000000f, -0.241182f, 267.205431f, 162.507202f }, -{ -27.692215f, -20.966751f, 57.903645f, -0.878100f, 0.000000f, -0.478477f, 267.752663f, 145.160958f }, -{ -35.074326f, -20.966751f, 68.947113f, -0.700409f, 0.000000f, -0.713742f, 263.723906f, 128.710531f }, -{ -45.833443f, -20.966755f, 77.536469f, -0.453361f, 0.000001f, -0.891327f, 254.578922f, 113.727776f }, -{ -60.214287f, -20.966755f, 83.105392f, -0.193834f, 0.000001f, -0.981034f, 239.777576f, 100.784454f }, -{ -78.461555f, -20.966755f, 85.087540f, -0.036044f, 0.000001f, -0.999350f, 218.779751f, 90.452444f }, -{ 53.459190f, 2.970489f, -63.834198f, 0.000000f, 0.000000f, -1.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 2.970482f, 19.696451f, 0.000000f, 0.000010f, -1.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 2.970485f, 19.696451f, 0.000000f, 0.000010f, -1.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 2.970482f, 37.767296f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 2.970482f, 37.767296f, -0.894427f, 0.000000f, 0.447214f, 0.000000f, 255.000000f }, -{ 53.459190f, 2.970471f, 52.887688f, -0.994427f, 0.000000f, 0.105425f, 0.000000f, 255.000000f }, -{ 54.761124f, 2.970478f, 61.040325f, -0.930341f, 0.000000f, 0.366696f, 0.000000f, 255.000000f }, -{ 58.744659f, 2.970474f, 68.629539f, -0.769108f, -0.000001f, 0.639119f, 0.000000f, 255.000000f }, -{ 65.526382f, 2.970473f, 75.245560f, -0.554146f, -0.000001f, 0.832420f, 0.000000f, 255.000000f }, -{ 75.222885f, 2.970474f, 80.478622f, -0.334245f, -0.000001f, 0.942486f, 0.000000f, 255.000000f }, -{ 87.950760f, 2.970474f, 83.918953f, -0.139337f, -0.000002f, 0.990245f, 0.000000f, 255.000000f }, -{ 103.826599f, 2.970474f, 85.156792f, -0.014576f, -0.000002f, 0.999894f, 0.000000f, 255.000000f }, -{ 107.486267f, 2.970474f, 85.094475f, 0.038307f, -0.000002f, 0.999266f, 0.000000f, 255.000000f }, -{ 111.371353f, 2.970474f, 84.904106f, 0.070572f, -0.000002f, 0.997507f, 0.000000f, 255.000000f }, -{ 115.334160f, 2.970474f, 84.580559f, 0.105682f, -0.000002f, 0.994400f, 0.000000f, 255.000000f }, -{ 119.227013f, 2.970474f, 84.118721f, 0.147635f, -0.000002f, 0.989042f, 0.000000f, 255.000000f }, -{ 122.902229f, 2.970474f, 83.513466f, 0.202285f, -0.000002f, 0.979327f, 0.000000f, 255.000000f }, -{ 126.212128f, 2.970474f, 82.759666f, 0.996088f, 0.000000f, -0.088370f, 0.000000f, 255.000000f }, -{ 114.179916f, 2.970478f, 65.426537f, 0.125438f, 0.000002f, -0.992102f, 0.000000f, 255.000000f }, -{ 112.235428f, 2.970474f, 65.933624f, -0.222749f, 0.000002f, -0.974876f, 0.000000f, 255.000000f }, -{ 110.283180f, 2.970474f, 66.348511f, -0.174788f, 0.000002f, -0.984606f, 0.000000f, 255.000000f }, -{ 108.268738f, 2.970474f, 66.671196f, -0.124447f, 0.000002f, -0.992226f, 0.000000f, 255.000000f }, -{ 106.137703f, 2.970474f, 66.901688f, -0.075842f, 0.000002f, -0.997120f, 0.000000f, 255.000000f }, -{ 103.835670f, 2.970474f, 67.039986f, -0.032153f, 0.000002f, -0.999483f, 0.000000f, 255.000000f }, -{ 101.308228f, 2.970474f, 67.086082f, 0.055747f, 0.000002f, -0.998445f, 0.000000f, 255.000000f }, -{ 95.838806f, 2.970474f, 66.577293f, 0.226773f, 0.000002f, -0.973948f, 0.000000f, 255.000000f }, -{ 91.224388f, 2.970478f, 65.167015f, 0.433606f, 0.000001f, -0.901103f, 0.000000f, 255.000000f }, -{ 87.527145f, 2.970478f, 63.029404f, 0.640544f, 0.000000f, -0.767921f, 0.000000f, 255.000000f }, -{ 84.809280f, 2.970478f, 60.338612f, 0.827378f, 0.000000f, -0.561646f, 0.000000f, 255.000000f }, -{ 83.132957f, 2.970478f, 57.268784f, 0.960620f, 0.000000f, -0.277867f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970479f, 53.994072f, 0.998339f, 0.000000f, -0.057605f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970478f, 37.767296f, 0.447214f, 0.000000f, 0.894427f, 0.000000f, 255.000000f }, -{ 111.661545f, 2.970478f, 37.767296f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 2.970482f, 19.696451f, 0.000000f, 0.000010f, -1.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970482f, 19.696451f, 0.000000f, 0.000010f, -1.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970489f, -63.834198f, 0.000000f, 0.000000f, -1.000000f, 0.000000f, 255.000000f }, -{ 109.261765f, 2.970490f, -33.040283f, -0.936759f, 0.000000f, 0.349975f, 0.000000f, 255.000000f }, -{ 158.509918f, 2.970482f, 10.661288f, -0.945897f, 0.000000f, -0.324468f, 0.000000f, 255.000000f }, -{ 110.660858f, 2.970478f, 56.206810f, -0.475466f, 0.000000f, 0.879734f, 0.000000f, 255.000000f }, -{ 147.037323f, 2.970478f, 56.206810f, 0.529090f, -0.000002f, 0.848566f, 0.000000f, 255.000000f }, -{ 175.299042f, 2.970477f, 25.597071f, -0.347260f, -0.000006f, 0.937769f, 0.000000f, 255.000000f }, -{ 203.001129f, 2.970478f, 56.206810f, -0.267475f, 0.000000f, 0.963565f, 0.000000f, 255.000000f }, -{ 237.139038f, 2.970478f, 56.206810f, 0.947348f, 0.000000f, -0.320206f, 0.000000f, 255.000000f }, -{ 189.569809f, 2.970482f, 11.767657f, 0.937358f, 0.000000f, 0.348368f, 0.000000f, 255.000000f }, -{ 239.097778f, 2.970486f, -33.040283f, 0.470435f, 0.000000f, -0.882435f, 0.000000f, 255.000000f }, -{ 202.161682f, 2.970486f, -33.040283f, -0.518991f, 0.000000f, -0.854780f, 0.000000f, 255.000000f }, -{ 173.620132f, 2.970482f, -3.168332f, 0.311085f, 0.000000f, -0.950382f, 0.000000f, 255.000000f }, -{ 143.679504f, 2.970490f, -33.040283f, 0.252382f, 0.000000f, -0.967628f, 0.000000f, 255.000000f }, -{ 246.695496f, 2.970477f, 44.635109f, -0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 246.695496f, 2.970479f, 54.095207f, -0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 243.335144f, 2.970479f, 54.095207f, -0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 243.335144f, 2.970478f, 56.104118f, -0.447214f, 0.000000f, 0.894427f, 0.000000f, 255.000000f }, -{ 252.174316f, 2.970478f, 56.104118f, 0.894427f, 0.000000f, 0.447214f, 0.000000f, 255.000000f }, -{ 252.174316f, 2.970475f, 54.095207f, 0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 248.813965f, 2.970479f, 54.095207f, 0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 248.813965f, 2.970477f, 44.635109f, 0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 253.836212f, 2.970477f, 44.635109f, -0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 253.836212f, 2.970478f, 56.341530f, 0.287199f, 0.000000f, 0.957871f, 0.000000f, 255.000000f }, -{ 258.931549f, 2.970471f, 51.191429f, -0.319282f, 0.000000f, 0.947660f, 0.000000f, 255.000000f }, -{ 264.026886f, 2.970478f, 56.341530f, 0.877850f, 0.000000f, 0.478935f, 0.000000f, 255.000000f }, -{ 264.026886f, 2.970477f, 44.635109f, 0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 261.908356f, 2.970477f, 44.635109f, -0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 261.908356f, 2.970467f, 51.721062f, 0.301814f, 0.000000f, -0.953367f, 0.000000f, 255.000000f }, -{ 258.931549f, 2.970471f, 48.634651f, -0.326641f, 0.000000f, -0.945149f, 0.000000f, 255.000000f }, -{ 255.954681f, 2.970471f, 51.721062f, 0.879074f, 0.000000f, -0.476685f, 0.000000f, 255.000000f }, -{ 255.954681f, 2.970477f, 44.635109f, 0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 53.398365f, 9.484123f, -118.046249f, -0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 53.398365f, 9.484118f, -89.641510f, -0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 58.399651f, 9.484118f, -89.641510f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 58.399651f, 9.484123f, -118.046249f, 0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 64.683319f, 9.484123f, -118.046249f, -0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 64.683319f, 9.484118f, -89.641510f, -0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 69.684608f, 9.484118f, -89.641510f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 69.684608f, 9.484118f, -92.719223f, -0.390384f, -0.000002f, 0.920652f, 0.000000f, 255.000000f }, -{ 71.361206f, 9.484118f, -90.693527f, -0.520918f, -0.000002f, 0.853607f, 0.000000f, 255.000000f }, -{ 75.070610f, 9.484118f, -89.192673f, 0.065749f, -0.000003f, 0.997836f, 0.000000f, 255.000000f }, -{ 78.221947f, 9.484118f, -90.116470f, 0.641452f, -0.000002f, 0.767163f, 0.000000f, 255.000000f }, -{ 80.447113f, 9.484106f, -92.906830f, 0.914903f, -0.000001f, 0.403674f, 0.000000f, 255.000000f }, -{ 81.069901f, 9.484118f, -95.010895f, 0.988384f, 0.000000f, 0.151978f, 0.000000f, 255.000000f }, -{ 81.290161f, 9.484118f, -97.592270f, 0.999598f, 0.000000f, 0.028362f, 0.000000f, 255.000000f }, -{ 81.290161f, 9.484123f, -118.046249f, 0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 76.288872f, 9.484123f, -118.046249f, -0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 76.288872f, 9.484118f, -97.720505f, -0.997195f, 0.000000f, -0.074851f, 0.000000f, 255.000000f }, -{ 76.046646f, 9.484118f, -95.573715f, -0.873911f, 0.000001f, -0.486087f, 0.000000f, 255.000000f }, -{ 74.507790f, 9.484118f, -93.751663f, -0.206069f, 0.000002f, -0.978537f, 0.000000f, 255.000000f }, -{ 72.154381f, 9.484118f, -93.999222f, 0.497835f, 0.000001f, -0.867272f, 0.000000f, 255.000000f }, -{ 70.869621f, 9.484118f, -95.136749f, 0.791861f, 0.000001f, -0.610702f, 0.000000f, 255.000000f }, -{ 69.684608f, 9.484118f, -97.015213f, 0.982874f, 0.000000f, -0.184277f, 0.000000f, 255.000000f }, -{ 69.684608f, 9.484123f, -118.046249f, 0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 116.042702f, 9.484123f, -111.377884f, 0.874270f, -0.000001f, 0.485440f, 0.000000f, 255.000000f }, -{ 116.042702f, 9.484123f, -116.315048f, 0.760144f, 0.000001f, -0.649755f, 0.000000f, 255.000000f }, -{ 112.247803f, 9.484123f, -118.552078f, 0.152177f, 0.000001f, -0.988353f, 0.000000f, 255.000000f }, -{ 107.574234f, 9.484123f, -118.394455f, -0.459333f, 0.000001f, -0.888264f, 0.000000f, 255.000000f }, -{ 103.539482f, 9.484123f, -115.040680f, -0.838627f, 0.000001f, -0.544706f, 0.000000f, 255.000000f }, -{ 102.209610f, 9.484123f, -112.118805f, -0.959193f, 0.000000f, -0.282751f, 0.000000f, 255.000000f }, -{ 101.385559f, 9.484118f, -108.374069f, -0.993577f, 0.000000f, -0.113155f, 0.000000f, 255.000000f }, -{ 101.102959f, 9.484118f, -103.811813f, -0.999878f, 0.000000f, 0.015607f, 0.000000f, 255.000000f }, -{ 101.339844f, 9.484118f, -99.454697f, -0.989803f, 0.000000f, 0.142441f, 0.000000f, 255.000000f }, -{ 102.036247f, 9.484118f, -95.777939f, -0.953092f, -0.000001f, 0.302681f, 0.000000f, 255.000000f }, -{ 103.170799f, 9.484106f, -92.831436f, -0.859240f, -0.000001f, 0.511573f, 0.000000f, 255.000000f }, -{ 104.722122f, 9.484118f, -90.665039f, -0.601898f, -0.000001f, 0.798573f, 0.000000f, 255.000000f }, -{ 107.933678f, 9.484118f, -88.927658f, -0.064729f, -0.000002f, 0.997903f, 0.000000f, 255.000000f }, -{ 111.632736f, 9.484118f, -89.470520f, 0.480740f, -0.000002f, 0.876863f, 0.000000f, 255.000000f }, -{ 113.549179f, 9.484118f, -91.009384f, 0.770417f, -0.000001f, 0.637540f, 0.000000f, 255.000000f }, -{ 114.952675f, 9.484106f, -93.103928f, 0.938897f, 0.000000f, 0.344197f, 0.000000f, 255.000000f }, -{ 116.387047f, 9.484118f, -99.154877f, 0.994578f, 0.000000f, 0.103992f, 0.000000f, 255.000000f }, -{ 116.619774f, 9.484118f, -104.965958f, 0.454185f, 0.000001f, -0.890908f, 0.000000f, 255.000000f }, -{ 106.104248f, 9.484118f, -104.965958f, 0.931736f, 0.000000f, -0.363137f, 0.000000f, 255.000000f }, -{ 106.676575f, 9.484123f, -110.009995f, 0.932112f, 0.000000f, 0.362171f, 0.000000f, 255.000000f }, -{ 108.374535f, 9.484123f, -113.130463f, 0.561654f, -0.000001f, 0.827372f, 0.000000f, 255.000000f }, -{ 111.169655f, 9.484123f, -114.199112f, -0.059665f, -0.000002f, 0.998218f, 0.000000f, 255.000000f }, -{ 113.774490f, 9.484123f, -113.485794f, -0.556104f, -0.000002f, 0.831112f, 0.000000f, 255.000000f }, -{ 106.040123f, 9.484118f, -101.247055f, 0.458115f, -0.000001f, 0.888893f, 0.000000f, 255.000000f }, -{ 111.618484f, 9.484118f, -101.247055f, -0.917639f, -0.000001f, 0.397415f, 0.000000f, 255.000000f }, -{ 111.312141f, 9.484118f, -96.746857f, -0.968412f, 0.000000f, -0.249357f, 0.000000f, 255.000000f }, -{ 110.364601f, 9.484118f, -94.098984f, -0.666434f, 0.000002f, -0.745564f, 0.000000f, 255.000000f }, -{ 108.733131f, 9.484106f, -93.232178f, 0.199195f, 0.000001f, -0.979960f, 0.000000f, 255.000000f }, -{ 107.208519f, 9.484118f, -94.113220f, 0.848531f, 0.000001f, -0.529146f, 0.000000f, 255.000000f }, -{ 106.325096f, 9.484118f, -96.775345f, 0.988917f, 0.000000f, -0.148471f, 0.000000f, 255.000000f }, -{ 122.262253f, 9.484123f, -118.046249f, -0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 122.262253f, 9.484118f, -89.641510f, -0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 127.263535f, 9.484118f, -89.641510f, 0.888400f, -0.000001f, 0.459070f, 0.000000f, 255.000000f }, -{ 127.391785f, 9.484118f, -97.335800f, -0.832354f, -0.000001f, 0.554244f, 0.000000f, 255.000000f }, -{ 128.306671f, 9.484118f, -94.372665f, -0.943875f, -0.000001f, 0.330303f, 0.000000f, 255.000000f }, -{ 129.111130f, 9.484118f, -92.203903f, -0.906859f, -0.000001f, 0.421435f, 0.000000f, 255.000000f }, -{ 129.876404f, 9.484118f, -90.715500f, -0.732608f, -0.000001f, 0.680651f, 0.000000f, 255.000000f }, -{ 131.574371f, 9.484118f, -89.323883f, -0.237380f, -0.000001f, 0.971417f, 0.000000f, 255.000000f }, -{ 133.556717f, 9.484118f, -89.280533f, 0.272164f, -0.000002f, 0.962251f, 0.000000f, 255.000000f }, -{ 135.214310f, 9.484118f, -90.026230f, 0.953239f, -0.000001f, 0.302219f, 0.000000f, 255.000000f }, -{ 134.829590f, 9.484118f, -95.155746f, 0.189441f, 0.000002f, -0.981892f, 0.000000f, 255.000000f }, -{ 132.649551f, 9.484118f, -94.450439f, 0.149986f, 0.000002f, -0.988688f, 0.000000f, 255.000000f }, -{ 130.914764f, 9.484118f, -95.135269f, 0.671985f, 0.000002f, -0.740564f, 0.000000f, 255.000000f }, -{ 129.543335f, 9.484118f, -96.915451f, 0.885876f, 0.000001f, -0.463921f, 0.000000f, 255.000000f }, -{ 128.513855f, 9.484118f, -99.379593f, 0.955085f, 0.000001f, -0.296334f, 0.000000f, 255.000000f }, -{ 127.804985f, 9.484118f, -102.116226f, 0.982240f, 0.000000f, -0.187627f, 0.000000f, 255.000000f }, -{ 127.395340f, 9.484118f, -104.713943f, 0.998278f, 0.000000f, -0.058653f, 0.000000f, 255.000000f }, -{ 127.263535f, 9.484123f, -118.046249f, 0.445434f, 0.000001f, -0.895315f, 0.000000f, 255.000000f }, -{ 155.668289f, 9.484123f, -112.788498f, 0.872224f, -0.000001f, 0.489107f, 0.000000f, 255.000000f }, -{ 155.668289f, 9.484123f, -116.571518f, 0.821354f, 0.000001f, -0.570419f, 0.000000f, 255.000000f }, -{ 154.127060f, 9.484123f, -117.804031f, 0.488794f, 0.000002f, -0.872399f, 0.000000f, 255.000000f }, -{ 152.305023f, 9.484123f, -118.637589f, 0.117071f, 0.000003f, -0.993124f, 0.000000f, 255.000000f }, -{ 150.903000f, 9.484123f, -118.586227f, -0.347726f, 0.000002f, -0.937596f, 0.000000f, 255.000000f }, -{ 149.472794f, 9.484123f, -117.781754f, -0.743957f, 0.000001f, -0.668227f, 0.000000f, 255.000000f }, -{ 148.448669f, 9.484123f, -116.186508f, -0.922915f, 0.000001f, -0.385003f, 0.000000f, 255.000000f }, -{ 148.102249f, 9.484123f, -115.096786f, 0.319982f, 0.000002f, -0.947424f, 0.000000f, 255.000000f }, -{ 146.276031f, 9.484123f, -117.172348f, 0.536214f, 0.000002f, -0.844082f, 0.000000f, 255.000000f }, -{ 142.652115f, 9.484123f, -118.815689f, -0.095167f, 0.000003f, -0.995461f, 0.000000f, 255.000000f }, -{ 139.866501f, 9.484123f, -117.808792f, -0.663668f, 0.000002f, -0.748027f, 0.000000f, 255.000000f }, -{ 137.850311f, 9.484123f, -115.206024f, -0.935434f, 0.000001f, -0.353502f, 0.000000f, 255.000000f }, -{ 137.073761f, 9.484123f, -111.634354f, -0.994825f, 0.000000f, 0.101602f, 0.000000f, 255.000000f }, -{ 138.144791f, 9.484118f, -107.571106f, -0.821232f, -0.000001f, 0.570594f, 0.000000f, 255.000000f }, -{ 141.623840f, 9.484118f, -104.049301f, -0.614743f, -0.000001f, 0.788728f, 0.000000f, 255.000000f }, -{ 144.391052f, 9.484118f, -102.166397f, -0.533800f, -0.000001f, 0.845611f, 0.000000f, 255.000000f }, -{ 147.909882f, 9.484118f, -100.028793f, -0.946986f, 0.000000f, 0.321275f, 0.000000f, 255.000000f }, -{ 147.909882f, 9.484118f, -97.335800f, -0.985542f, 0.000000f, -0.169429f, 0.000000f, 255.000000f }, -{ 147.180527f, 9.484118f, -94.538605f, -0.721135f, 0.000001f, -0.692794f, 0.000000f, 255.000000f }, -{ 145.869064f, 9.484118f, -93.718704f, -0.178468f, 0.000002f, -0.983946f, 0.000000f, 255.000000f }, -{ 143.898575f, 9.484118f, -93.732071f, 0.275751f, 0.000003f, -0.961229f, 0.000000f, 255.000000f }, -{ 141.682312f, 9.484118f, -94.706924f, 0.547231f, 0.000002f, -0.836982f, 0.000000f, 255.000000f }, -{ 137.779068f, 9.484118f, -98.297592f, -0.401856f, 0.000002f, -0.915703f, 0.000000f, 255.000000f }, -{ 137.779068f, 9.484118f, -92.526871f, -0.805424f, -0.000001f, 0.592699f, 0.000000f, 255.000000f }, -{ 141.658264f, 9.484118f, -89.665543f, -0.393509f, -0.000002f, 0.919321f, 0.000000f, 255.000000f }, -{ 144.054428f, 9.484118f, -88.951340f, -0.070072f, -0.000003f, 0.997542f, 0.000000f, 255.000000f }, -{ 147.152328f, 9.484118f, -89.072159f, 0.314714f, -0.000002f, 0.949187f, 0.000000f, 255.000000f }, -{ 150.474655f, 9.484118f, -90.715500f, 0.737681f, -0.000002f, 0.675150f, 0.000000f, 255.000000f }, -{ 152.600082f, 9.484118f, -94.111435f, 0.963322f, 0.000000f, 0.268347f, 0.000000f, 255.000000f }, -{ 152.911179f, 9.484118f, -96.502243f, 0.999034f, 0.000000f, 0.043950f, 0.000000f, 255.000000f }, -{ 152.932556f, 9.484123f, -113.100784f, 0.988647f, 0.000000f, 0.150259f, 0.000000f, 255.000000f }, -{ 153.103531f, 9.484123f, -113.846451f, 0.722615f, -0.000001f, 0.691251f, 0.000000f, 255.000000f }, -{ 153.680603f, 9.484123f, -114.199112f, -0.065774f, -0.000002f, 0.997835f, 0.000000f, 255.000000f }, -{ 154.124680f, 9.484123f, -114.032883f, -0.508023f, -0.000002f, 0.861344f, 0.000000f, 255.000000f }, -{ 154.796753f, 9.484123f, -113.553177f, -0.634043f, -0.000002f, 0.773298f, 0.000000f, 255.000000f }, -{ 147.909882f, 9.484123f, -110.800797f, -0.988652f, 0.000000f, 0.150224f, 0.000000f, 255.000000f }, -{ 147.909882f, 9.484118f, -103.491226f, 0.063729f, 0.000001f, -0.997967f, 0.000000f, 255.000000f }, -{ 146.048050f, 9.484118f, -104.727600f, 0.606494f, 0.000001f, -0.795088f, 0.000000f, 255.000000f }, -{ 144.556686f, 9.484118f, -105.944382f, 0.698230f, 0.000002f, -0.715873f, 0.000000f, 255.000000f }, -{ 143.421539f, 9.484118f, -107.154037f, 0.856732f, 0.006809f, -0.515717f, 0.000000f, 255.000000f }, -{ 142.162918f, 9.484122f, -109.601837f, 0.996222f, 0.008519f, -0.086430f, 0.000000f, 255.000000f }, -{ 142.329147f, 9.484123f, -112.551010f, 0.896470f, -0.000001f, 0.443104f, 0.000000f, 255.000000f }, -{ 143.188812f, 9.484123f, -113.667160f, 0.487260f, -0.000002f, 0.873257f, 0.000000f, 255.000000f }, -{ 144.447449f, 9.484123f, -114.070877f, -0.092078f, -0.000002f, 0.995752f, 0.000000f, 255.000000f }, -{ 145.715591f, 9.484123f, -113.693283f, -0.563378f, -0.000001f, 0.826199f, 0.000000f, 255.000000f }, -{ 146.898224f, 9.484123f, -112.589005f, -0.789808f, -0.000001f, 0.613355f, 0.000000f, 255.000000f }, -{ 147.430771f, 9.484123f, -111.777725f, -0.878742f, -0.000001f, 0.477296f, 0.000000f, 255.000000f }, -{ 173.749878f, 9.484123f, -112.467911f, 0.866044f, -0.000001f, 0.499968f, 0.000000f, 255.000000f }, -{ 173.749878f, 9.484123f, -117.276840f, 0.738938f, 0.000002f, -0.673773f, 0.000000f, 255.000000f }, -{ 172.085159f, 9.484123f, -118.160263f, 0.289883f, 0.000003f, -0.957062f, 0.000000f, 255.000000f }, -{ 168.812698f, 9.484123f, -118.815689f, -0.052447f, 0.000003f, -0.998624f, 0.000000f, 255.000000f }, -{ 166.009262f, 9.484123f, -118.315506f, -0.398492f, 0.000002f, -0.917172f, 0.000000f, 255.000000f }, -{ 163.547806f, 9.484123f, -116.887375f, -0.667370f, 0.000002f, -0.744726f, 0.000000f, 255.000000f }, -{ 161.503128f, 9.484123f, -114.639938f, -0.842882f, 0.000001f, -0.538099f, 0.000000f, 255.000000f }, -{ 159.950012f, 9.484123f, -111.681854f, -0.942324f, 0.000000f, -0.334701f, 0.000000f, 255.000000f }, -{ 158.963303f, 9.484118f, -108.121765f, -0.989253f, 0.000000f, -0.146212f, 0.000000f, 255.000000f }, -{ 158.617767f, 9.484118f, -104.068314f, -0.998414f, 0.000000f, 0.056296f, 0.000000f, 255.000000f }, -{ 159.531387f, 9.484118f, -96.903595f, -0.905095f, -0.000001f, 0.425210f, 0.000000f, 255.000000f }, -{ 163.822617f, 9.484118f, -90.542221f, -0.501771f, -0.000002f, 0.865000f, 0.000000f, 255.000000f }, -{ 169.115997f, 9.484118f, -88.872086f, 0.060412f, -0.000003f, 0.998173f, 0.000000f, 255.000000f }, -{ 173.301041f, 9.484118f, -89.897995f, 0.917345f, -0.000001f, 0.398092f, 0.000000f, 255.000000f }, -{ 173.301041f, 9.484118f, -95.027512f, 0.153606f, 0.000003f, -0.988132f, 0.000000f, 255.000000f }, -{ 169.582138f, 9.484118f, -93.616898f, 0.141905f, 0.000002f, -0.989880f, 0.000000f, 255.000000f }, -{ 166.473557f, 9.484118f, -94.882645f, 0.742680f, 0.000001f, -0.669646f, 0.000000f, 255.000000f }, -{ 164.462112f, 9.484118f, -98.442444f, 0.967176f, 0.000000f, -0.254107f, 0.000000f, 255.000000f }, -{ 163.747299f, 9.484118f, -103.940063f, 0.998594f, 0.000000f, 0.053008f, 0.000000f, 255.000000f }, -{ 164.523849f, 9.484122f, -109.302322f, 0.912953f, -0.000001f, 0.408064f, 0.000000f, 255.000000f }, -{ 166.711029f, 9.484123f, -112.812241f, 0.468894f, -0.000002f, 0.883254f, 0.000000f, 255.000000f }, -{ 171.313354f, 9.484123f, -113.911758f, -0.280562f, -0.000002f, 0.959836f, 0.000000f, 255.000000f }, -{ 188.369019f, 9.484123f, -113.301437f, 0.869996f, -0.000001f, 0.493059f, 0.000000f, 255.000000f }, -{ 188.369019f, 9.484123f, -117.725662f, 0.673699f, 0.000002f, -0.739006f, 0.000000f, 255.000000f }, -{ 186.637802f, 9.484123f, -118.378738f, 0.251252f, 0.000003f, -0.967922f, 0.000000f, 255.000000f }, -{ 184.602036f, 9.484123f, -118.792831f, 0.027993f, 0.000002f, -0.999608f, 0.000000f, 255.000000f }, -{ 182.419891f, 9.484123f, -118.666077f, -0.249737f, 0.000002f, -0.968314f, 0.000000f, 255.000000f }, -{ 181.128311f, 9.484123f, -118.195877f, -0.534105f, 0.000002f, -0.845418f, 0.000000f, 255.000000f }, -{ 180.089645f, 9.484123f, -117.373001f, -0.779634f, 0.000001f, -0.626236f, 0.000000f, 255.000000f }, -{ 179.323486f, 9.484123f, -116.165436f, -0.929593f, 0.000001f, -0.368587f, 0.000000f, 255.000000f }, -{ 178.849426f, 9.484123f, -114.541092f, -0.989265f, 0.000000f, -0.146131f, 0.000000f, 255.000000f }, -{ 178.687042f, 9.484123f, -112.467911f, -0.999661f, 0.000000f, -0.026047f, 0.000000f, 255.000000f }, -{ 178.687042f, 9.484118f, -94.001602f, -0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 175.416977f, 9.484118f, -94.001602f, -0.996832f, -0.000001f, 0.079535f, 0.000000f, 255.000000f }, -{ 178.200211f, 9.484118f, -89.945480f, -0.823749f, -0.000001f, 0.566955f, 0.000000f, 255.000000f }, -{ 180.755478f, 9.484117f, -86.238449f, -0.837145f, -0.000001f, 0.546981f, 0.000000f, 255.000000f }, -{ 183.239502f, 9.484117f, -82.331924f, -0.315664f, -0.000001f, 0.948871f, 0.000000f, 255.000000f }, -{ 183.688324f, 9.484117f, -82.331924f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 183.688324f, 9.484118f, -89.641510f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 188.369019f, 9.484118f, -89.641510f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 188.369019f, 9.484118f, -94.001602f, 0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 183.688324f, 9.484118f, -94.001602f, 0.896316f, -0.004678f, -0.443391f, 0.000000f, 255.000000f }, -{ 183.724243f, 9.484123f, -111.466034f, 0.997969f, -0.005230f, 0.063485f, 0.000000f, 255.000000f }, -{ 183.847443f, 9.484123f, -112.446518f, 0.909068f, 0.001063f, 0.416646f, 0.000000f, 255.000000f }, -{ 184.448257f, 9.484123f, -113.686172f, 0.726480f, -0.015559f, 0.687011f, 0.000000f, 255.000000f }, -{ 184.972198f, 9.484123f, -113.977371f, 0.170193f, -0.000003f, 0.985411f, 0.000000f, 255.000000f }, -{ 186.488205f, 9.484123f, -113.985397f, -0.229252f, -0.000002f, 0.973367f, 0.000000f, 255.000000f }, -{ 192.280289f, 9.484123f, -118.046249f, -0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 192.280289f, 9.484118f, -89.641510f, -0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 197.281570f, 9.484118f, -89.641510f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 197.281570f, 9.484123f, -118.046249f, 0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 209.400085f, 9.484123f, -118.687454f, -0.775277f, 0.000002f, -0.631621f, 0.000000f, 255.000000f }, -{ 200.872238f, 9.484118f, -89.641510f, -0.487542f, -0.000001f, 0.873100f, 0.000000f, 255.000000f }, -{ 205.873535f, 9.484118f, -89.641510f, 0.791121f, -0.000001f, 0.611659f, 0.000000f, 255.000000f }, -{ 210.041275f, 9.484118f, -105.863632f, 0.395561f, -0.000001f, 0.918440f, 0.000000f, 255.000000f }, -{ 210.169510f, 9.484118f, -105.863632f, -0.791121f, -0.000001f, 0.611659f, 0.000000f, 255.000000f }, -{ 214.337250f, 9.484118f, -89.641510f, -0.395561f, -0.000001f, 0.918440f, 0.000000f, 255.000000f }, -{ 219.338531f, 9.484118f, -89.641510f, 0.975084f, 0.000000f, 0.221838f, 0.000000f, 255.000000f }, -{ 210.810699f, 9.484123f, -118.687454f, 0.387639f, 0.000002f, -0.921811f, 0.000000f, 255.000000f }, -{ -227.530014f, 20.966755f, 18.889763f, -0.132902f, 0.000004f, -0.991129f, 11.312366f, 104.759421f }, -{ -227.530014f, 20.966747f, 49.094074f, -0.113407f, 0.000000f, 0.993549f, 24.483732f, 68.571394f }, -{ -220.271423f, 20.966747f, 49.922592f, -0.196555f, 0.000000f, 0.980493f, 33.541610f, 70.744042f }, -{ -214.348251f, 20.966747f, 52.198406f, -0.441307f, 0.000000f, 0.897356f, 41.630631f, 70.600318f }, -{ -209.753510f, 20.966751f, 55.606876f, -0.666260f, 0.000000f, 0.745720f, 48.621982f, 68.520264f }, -{ -206.480209f, 20.966751f, 59.833382f, -0.841668f, 0.000000f, 0.539995f, 54.386827f, 64.883844f }, -{ -204.521362f, 20.966751f, 64.563332f, -0.953587f, 0.000000f, 0.301119f, 58.796350f, 60.071068f }, -{ -203.869965f, 20.966747f, 69.482018f, -0.999275f, 0.000000f, 0.038078f, 61.721714f, 54.462006f }, -{ -204.699646f, 20.966745f, 74.975189f, -0.968387f, 0.000000f, -0.249452f, 63.123110f, 47.518791f }, -{ -207.067520f, 20.966745f, 79.783180f, -0.849701f, 0.000000f, -0.527265f, 62.382784f, 40.725728f }, -{ -210.791794f, 20.966745f, 83.766144f, -0.667060f, 0.000001f, -0.745004f, 59.657578f, 34.329638f }, -{ -215.690674f, 20.966745f, 86.784241f, -0.455510f, 0.000001f, -0.890230f, 55.104305f, 28.577339f }, -{ -221.582382f, 20.966745f, 88.697647f, -0.240248f, 0.000001f, -0.970712f, 48.879791f, 23.715652f }, -{ -228.285126f, 20.966745f, 89.366524f, -0.052076f, 0.000001f, -0.998643f, 41.140860f, 19.991366f }, -{ -233.272552f, 20.966745f, 89.153275f, 0.072102f, 0.000001f, -0.997397f, 35.072392f, 18.071967f }, -{ -238.232040f, 20.966745f, 88.499550f, 0.159415f, 0.000001f, -0.987212f, 28.845318f, 16.692474f }, -{ -243.261429f, 20.966745f, 87.384369f, 0.242432f, 0.000001f, -0.970168f, 22.333258f, 15.835392f }, -{ -248.458618f, 20.966745f, 85.786751f, 0.315709f, 0.000001f, -0.948856f, 15.409784f, 15.483151f }, -{ -253.921509f, 20.966745f, 83.685738f, 0.376381f, 0.000001f, -0.926465f, 7.948449f, 15.618150f }, -{ -259.747955f, 20.966745f, 81.060341f, 0.410820f, 0.000001f, -0.911717f, -0.177137f, 16.222895f }, -{ -259.747955f, 20.966743f, 111.264641f, -0.366218f, -0.000001f, 0.930529f, 12.994218f, -19.965132f }, -{ -253.885376f, 20.966743f, 113.571915f, -0.341209f, -0.000001f, 0.939987f, 21.024369f, -20.172966f }, -{ -247.666229f, 20.966742f, 115.459694f, -0.267103f, -0.000001f, 0.963668f, 29.298793f, -19.722705f }, -{ -241.153412f, 20.966742f, 116.927956f, -0.197940f, -0.000001f, 0.980214f, 37.742128f, -18.641769f }, -{ -234.409882f, 20.966742f, 117.976715f, -0.132733f, -0.000001f, 0.991152f, 46.278944f, -16.957608f }, -{ -227.498550f, 20.966742f, 118.605980f, -0.070438f, -0.000001f, 0.997516f, 54.833877f, -14.697672f }, -{ -220.482346f, 20.966742f, 118.815727f, 0.010033f, -0.000001f, 0.999950f, 63.331513f, -11.889380f }, -{ -205.143631f, 20.966742f, 117.432526f, 0.155949f, -0.000001f, 0.987765f, 81.105774f, -3.543295f }, -{ -191.825546f, 20.966743f, 113.455399f, 0.359337f, -0.000001f, 0.933208f, 95.327947f, 7.029410f }, -{ -180.870651f, 20.966740f, 107.143021f, 0.575202f, -0.000001f, 0.818011f, 105.700425f, 19.369491f }, -{ -172.621567f, 20.966740f, 98.754097f, 0.780436f, -0.000001f, 0.625235f, 111.925517f, 33.017553f }, -{ -167.420868f, 20.966738f, 88.547325f, 0.933968f, 0.000000f, 0.357358f, 113.705593f, 47.514262f }, -{ -165.611176f, 20.966738f, 76.781395f, 0.997415f, 0.000000f, 0.071862f, 110.742960f, 62.400282f }, -{ -166.340637f, 20.966747f, 68.696609f, 0.988370f, 0.000000f, -0.152067f, 106.343412f, 71.768634f }, -{ -168.510422f, 20.966751f, 61.101219f, 0.941956f, 0.000000f, -0.335737f, 100.431613f, 79.922540f }, -{ -172.092514f, 20.966747f, 54.065197f, 0.860949f, 0.000000f, -0.508692f, 93.071636f, 86.790398f }, -{ -177.058975f, 20.966749f, 47.658436f, 0.752871f, 0.000000f, -0.658168f, 84.327446f, 92.300634f }, -{ -183.381851f, 20.966749f, 41.950848f, 0.629290f, 0.000000f, -0.777170f, 74.263017f, 96.381691f }, -{ -191.033142f, 20.966749f, 37.012348f, 0.889699f, 0.000000f, -0.456548f, 62.942388f, 98.962011f }, -{ -181.454453f, 20.966749f, 32.298752f, 0.502007f, 0.000000f, 0.864864f, 72.363211f, 108.786445f }, -{ -173.805496f, 20.966751f, 26.319649f, 0.672072f, -0.000002f, 0.740485f, 78.920146f, 119.285570f }, -{ -168.002350f, 20.966755f, 19.235847f, 0.817837f, -0.000002f, 0.575450f, 82.783870f, 130.303345f }, -{ -163.961121f, 20.966755f, 11.208177f, 0.921693f, -0.000001f, 0.387921f, 84.125031f, 141.683643f }, -{ -161.597916f, 20.966753f, 2.397416f, 0.979689f, 0.000000f, 0.200522f, 83.114247f, 153.270422f }, -{ -160.828827f, 20.966753f, -7.035606f, 0.999954f, 0.000000f, 0.009609f, 79.922183f, 164.907587f }, -{ -162.772522f, 20.966755f, -21.426933f, 0.973138f, 0.000000f, -0.230221f, 71.317727f, 181.302347f }, -{ -168.407867f, 20.966755f, -33.734711f, 0.862300f, 0.000000f, -0.506399f, 59.198847f, 193.590963f }, -{ -177.441193f, 20.966757f, -43.721252f, 0.674528f, 0.000000f, -0.738249f, 44.021060f, 201.616710f }, -{ -189.578857f, 20.966757f, -51.148804f, 0.449703f, 0.000000f, -0.893178f, 26.239853f, 205.222777f }, -{ -204.527191f, 20.966757f, -55.779663f, 0.228732f, 0.000000f, -0.973489f, 6.310730f, 204.252446f }, -{ -221.992554f, 20.966764f, -57.376114f, 0.046891f, 0.000000f, -0.998900f, -15.310837f, 198.548949f }, -{ -229.371170f, 20.966764f, -57.068481f, -0.067655f, 0.000000f, -0.997709f, -24.017065f, 194.962735f }, -{ -236.805725f, 20.966764f, -56.173538f, -0.143976f, 0.000000f, -0.989581f, -32.534211f, 190.648469f }, -{ -244.142380f, 20.966764f, -54.733246f, -0.216746f, 0.000000f, -0.976228f, -40.696227f, 185.723508f }, -{ -251.227341f, 20.966764f, -52.789536f, -0.289503f, 0.000000f, -0.957177f, -48.337180f, 180.305151f }, -{ -257.906799f, 20.966764f, -50.384384f, -0.365851f, 0.000000f, -0.930674f, -55.291061f, 174.510773f }, -{ -264.026886f, 20.966764f, -47.559723f, -0.419059f, 0.000000f, -0.907959f, -61.391828f, 168.457698f }, -{ -264.026886f, 20.966753f, -14.334975f, 0.543307f, 0.000000f, 0.839534f, -46.903330f, 128.650867f }, -{ -257.339294f, 20.966755f, -18.662872f, 0.522722f, 0.000000f, 0.852503f, -40.778150f, 136.752450f }, -{ -251.050217f, 20.966759f, -22.109795f, 0.453797f, 0.000000f, 0.891105f, -34.746278f, 143.624746f }, -{ -245.054810f, 20.966759f, -24.717712f, 0.365635f, 0.000000f, 0.930758f, -28.700388f, 149.363761f }, -{ -239.248169f, 20.966759f, -26.528572f, 0.259367f, 0.000000f, 0.965779f, -22.533070f, 154.065507f }, -{ -233.525421f, 20.966759f, -27.584328f, 0.141032f, 0.000000f, 0.990005f, -16.136991f, 157.825968f }, -{ -227.781708f, 20.966759f, -27.926926f, 0.007245f, 0.000000f, 0.999974f, -9.404798f, 160.741125f }, -{ -220.280746f, 20.966759f, -27.192787f, -0.168689f, 0.000000f, 0.985669f, -0.097693f, 163.132535f }, -{ -213.751633f, 20.966759f, -25.074295f, -0.385508f, 0.000000f, 0.922705f, 8.648710f, 163.441542f }, -{ -208.369156f, 20.966755f, -21.697281f, -0.607191f, 0.000000f, 0.794556f, 16.570136f, 161.742676f }, -{ -204.308121f, 20.966755f, -17.187607f, -0.805587f, 0.000000f, 0.592477f, 23.402251f, 158.110519f }, -{ -201.743317f, 20.966753f, -11.671119f, -0.943840f, 0.000000f, 0.330403f, 28.880766f, 152.619616f }, -{ -200.849533f, 20.966753f, -5.273689f, -0.998820f, 0.000000f, 0.048575f, 32.741376f, 145.344564f }, -{ -201.724655f, 20.966753f, 1.288060f, -0.974605f, 0.000000f, -0.223930f, 34.554308f, 137.101256f }, -{ -204.242859f, 20.966751f, 7.031769f, -0.873964f, 0.000000f, -0.485991f, 34.041921f, 129.121548f }, -{ -208.243301f, 20.966755f, 11.810632f, -0.706060f, 0.000000f, -0.708152f, 31.332898f, 121.651460f }, -{ -213.565170f, 20.966755f, 15.477799f, -0.497756f, 0.000000f, -0.867317f, 26.555888f, 114.937053f }, -{ -220.047684f, 20.966755f, 17.886444f, -0.278017f, 0.000003f, -0.960576f, 19.839494f, 109.224379f }, -{ -148.686584f, 20.966726f, 116.550392f, 0.000000f, -0.000001f, 1.000000f, 148.362750f, 22.133128f }, -{ -72.924095f, 20.966726f, 116.550392f, 0.035820f, -0.000001f, 0.999358f, 239.134392f, 55.171292f }, -{ -44.133286f, 20.966728f, 113.442566f, 0.188416f, -0.000001f, 0.982089f, 272.273660f, 71.449770f }, -{ -20.467419f, 20.966740f, 104.692406f, 0.431738f, -0.000001f, 0.901999f, 296.812196f, 92.253517f }, -{ -1.975434f, 20.966738f, 91.159897f, 0.665230f, -0.000001f, 0.746638f, 313.066387f, 116.530840f }, -{ 11.293716f, 20.966730f, 73.705025f, 0.848586f, 0.000000f, 0.529057f, 321.352617f, 143.230008f }, -{ 19.291100f, 20.966740f, 53.187733f, 0.959076f, 0.000000f, 0.283149f, 321.987274f, 171.299414f }, -{ 21.967770f, 20.966734f, 30.467978f, 0.999154f, 0.000000f, 0.041134f, 315.286714f, 199.687280f }, -{ 19.338877f, 20.966743f, 6.999154f, 0.980586f, 0.000000f, -0.196088f, 301.902798f, 226.659158f }, -{ 11.340330f, 20.966745f, -13.645118f, 0.892215f, 0.000000f, -0.451610f, 283.317205f, 247.905264f }, -{ -2.195676f, 20.966759f, -30.821503f, 0.718364f, 0.000000f, -0.695667f, 259.609396f, 262.581703f }, -{ -21.436935f, 20.966757f, -43.886719f, 0.483336f, 0.000000f, -0.875435f, 230.858877f, 269.844599f }, -{ -46.551262f, 20.966757f, -52.197571f, 0.241852f, 0.000000f, -0.970313f, 197.145034f, 268.850158f }, -{ -77.706444f, 20.966757f, -55.110794f, 0.062127f, 0.000000f, -0.998068f, 158.547374f, 258.754495f }, -{ -148.686584f, 20.966757f, -55.110794f, 0.000000f, 0.000000f, -1.000000f, 73.505490f, 227.801797f }, -{ -105.897141f, 20.966738f, 85.087578f, 0.447214f, 0.000001f, -0.894427f, 185.908961f, 78.488406f }, -{ -105.897141f, 20.966759f, -23.647980f, 0.894427f, 0.000000f, 0.447214f, 138.492035f, 208.765369f }, -{ -77.958153f, 20.966759f, -23.647980f, -0.039593f, 0.000000f, 0.999216f, 171.965959f, 220.948887f }, -{ -58.874207f, 20.966755f, -21.368675f, -0.212191f, 0.000000f, 0.977228f, 195.824544f, 226.540074f }, -{ -44.341877f, 20.966753f, -15.146018f, -0.488613f, 0.000000f, 0.872501f, 215.949404f, 225.421851f }, -{ -33.878738f, 20.966745f, -5.902946f, -0.733828f, 0.000000f, 0.679335f, 232.516059f, 218.910365f }, -{ -27.002363f, 20.966743f, 5.437653f, -0.895536f, 0.000000f, 0.444989f, 245.700045f, 208.321724f }, -{ -23.230320f, 20.966747f, 17.952866f, -0.974747f, -0.000001f, 0.223313f, 255.676941f, 194.972041f }, -{ -22.080179f, 20.966734f, 30.719679f, -0.999602f, 0.000000f, 0.028209f, 262.622269f, 180.177478f }, -{ -23.442402f, 20.966742f, 44.972439f, -0.985715f, 0.000000f, -0.168424f, 267.205431f, 162.507187f }, -{ -27.692215f, 20.966743f, 57.903660f, -0.917976f, 0.000000f, -0.396636f, 267.752663f, 145.160943f }, -{ -35.074326f, 20.966740f, 68.947144f, -0.770297f, 0.000000f, -0.637685f, 263.723906f, 128.710501f }, -{ -45.833443f, 20.966738f, 77.536499f, -0.541864f, 0.000001f, -0.840466f, 254.578922f, 113.727730f }, -{ -60.214287f, 20.966738f, 83.105423f, -0.278852f, 0.000001f, -0.960334f, 239.777591f, 100.784424f }, -{ -78.461555f, 20.966738f, 85.087578f, -0.072088f, 0.000001f, -0.997398f, 218.779751f, 90.452398f }, -{ 53.459190f, 21.106728f, -63.834198f, 0.000000f, 0.000000f, -1.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 21.106720f, 19.696632f, 0.000000f, 0.000010f, -1.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 21.106720f, 19.696632f, 0.000000f, 0.000010f, -1.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 21.106718f, 37.767292f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 21.106718f, 37.767292f, -0.447214f, 0.000000f, 0.894427f, 0.000000f, 255.000000f }, -{ 53.459190f, 21.106716f, 52.887684f, -0.998610f, 0.000000f, 0.052712f, 0.000000f, 255.000000f }, -{ 54.761124f, 21.106716f, 61.040321f, -0.964760f, 0.000000f, 0.263130f, 0.000000f, 255.000000f }, -{ 58.744659f, 21.106709f, 68.629570f, -0.832175f, -0.000001f, 0.554513f, 0.000000f, 255.000000f }, -{ 65.526382f, 21.106707f, 75.245590f, -0.629247f, -0.000001f, 0.777205f, 0.000000f, 255.000000f }, -{ 75.222885f, 21.106714f, 80.478653f, -0.406003f, -0.000001f, 0.913872f, 0.000000f, 255.000000f }, -{ 87.950760f, 21.106714f, 83.918983f, -0.200640f, -0.000002f, 0.979665f, 0.000000f, 255.000000f }, -{ 103.826599f, 21.106714f, 85.156822f, -0.046194f, -0.000002f, 0.998932f, 0.000000f, 255.000000f }, -{ 107.486267f, 21.106707f, 85.094505f, 0.027667f, -0.000002f, 0.999617f, 0.000000f, 255.000000f }, -{ 111.371353f, 21.106707f, 84.904137f, 0.059760f, -0.000002f, 0.998213f, 0.000000f, 255.000000f }, -{ 115.334160f, 21.106707f, 84.580589f, 0.093534f, -0.000002f, 0.995616f, 0.000000f, 255.000000f }, -{ 119.227013f, 21.106707f, 84.118752f, 0.132736f, -0.000002f, 0.991151f, 0.000000f, 255.000000f }, -{ 122.902229f, 21.106707f, 83.513496f, 0.182424f, -0.000002f, 0.983220f, 0.000000f, 255.000000f }, -{ 126.212128f, 21.106707f, 82.759697f, 0.675942f, -0.000001f, 0.736955f, 0.000000f, 255.000000f }, -{ 114.179916f, 21.106716f, 65.426567f, 0.550632f, 0.000001f, -0.834748f, 0.000000f, 255.000000f }, -{ 112.235428f, 21.106709f, 65.933655f, -0.237575f, 0.000002f, -0.971369f, 0.000000f, 255.000000f }, -{ 110.283180f, 21.106709f, 66.348541f, -0.191361f, 0.000002f, -0.981520f, 0.000000f, 255.000000f }, -{ 108.268738f, 21.106709f, 66.671227f, -0.141331f, 0.000002f, -0.989962f, 0.000000f, 255.000000f }, -{ 106.137703f, 21.106709f, 66.901718f, -0.091701f, 0.000002f, -0.995787f, 0.000000f, 255.000000f }, -{ 103.835670f, 21.106709f, 67.040016f, -0.046066f, 0.000002f, -0.998938f, 0.000000f, 255.000000f }, -{ 101.308228f, 21.106709f, 67.086113f, 0.018743f, 0.000002f, -0.999824f, 0.000000f, 255.000000f }, -{ 95.838806f, 21.106709f, 66.577324f, 0.159913f, 0.000002f, -0.987131f, 0.000000f, 255.000000f }, -{ 91.224388f, 21.106716f, 65.167046f, 0.363788f, 0.000001f, -0.931482f, 0.000000f, 255.000000f }, -{ 87.527145f, 21.106716f, 63.029400f, 0.572373f, 0.000000f, -0.819993f, 0.000000f, 255.000000f }, -{ 84.809280f, 21.106716f, 60.338608f, 0.768792f, 0.000000f, -0.639499f, 0.000000f, 255.000000f }, -{ 83.132957f, 21.106716f, 57.268780f, 0.924396f, 0.000000f, -0.381433f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106716f, 53.994068f, 0.993341f, 0.000000f, -0.115210f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106718f, 37.767292f, 0.894427f, 0.000000f, 0.447214f, 0.000000f, 255.000000f }, -{ 111.661545f, 21.106718f, 37.767292f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 21.106720f, 19.696632f, 0.000000f, 0.000010f, -1.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106720f, 19.696632f, 0.000000f, 0.000010f, -1.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106728f, -63.834198f, 0.000000f, 0.000000f, -1.000000f, 0.000000f, 255.000000f }, -{ 109.261765f, 21.106724f, -33.040283f, -0.468379f, 0.000000f, -0.883527f, 0.000000f, 255.000000f }, -{ 158.509918f, 21.106720f, 10.661286f, -0.933984f, 0.000000f, 0.357316f, 0.000000f, 255.000000f }, -{ 110.660858f, 21.106716f, 56.206806f, -0.950931f, 0.000000f, -0.309402f, 0.000000f, 255.000000f }, -{ 147.037323f, 21.106716f, 56.206806f, 0.264544f, 0.000000f, 0.964374f, 0.000000f, 255.000000f }, -{ 175.299042f, 21.106712f, 25.597252f, 0.337904f, -0.000006f, 0.941181f, 0.000000f, 255.000000f }, -{ 203.001129f, 21.106716f, 56.206806f, -0.534949f, -0.000002f, 0.844884f, 0.000000f, 255.000000f }, -{ 237.139038f, 21.106712f, 56.206806f, 0.473674f, 0.000000f, 0.880700f, 0.000000f, 255.000000f }, -{ 189.569809f, 21.106720f, 11.767655f, 0.942807f, 0.000000f, -0.333339f, 0.000000f, 255.000000f }, -{ 239.097778f, 21.106724f, -33.040283f, 0.940870f, 0.000000f, 0.338768f, 0.000000f, 255.000000f }, -{ 202.161682f, 21.106724f, -33.040283f, -0.259495f, 0.000000f, -0.965744f, 0.000000f, 255.000000f }, -{ 173.620132f, 21.106722f, -3.168342f, -0.333727f, 0.000000f, -0.942670f, 0.000000f, 255.000000f }, -{ 143.679504f, 21.106724f, -33.040283f, 0.504764f, 0.000000f, -0.863257f, 0.000000f, 255.000000f }, -{ 246.695496f, 21.106710f, 44.635105f, -0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 246.695496f, 21.106709f, 54.095203f, -0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 243.335144f, 21.106709f, 54.095203f, -0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 243.335144f, 21.106712f, 56.104115f, -0.894427f, 0.000000f, 0.447214f, 0.000000f, 255.000000f }, -{ 252.174316f, 21.106712f, 56.104115f, 0.447214f, 0.000000f, 0.894427f, 0.000000f, 255.000000f }, -{ 252.174316f, 21.106709f, 54.095203f, 0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 248.813965f, 21.106709f, 54.095203f, 0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 248.813965f, 21.106710f, 44.635105f, 0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 253.836212f, 21.106710f, 44.635105f, -0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 253.836212f, 21.106712f, 56.341526f, -0.877850f, 0.000000f, 0.478935f, 0.000000f, 255.000000f }, -{ 258.931549f, 21.106709f, 51.191425f, 0.319282f, 0.000000f, 0.947660f, 0.000000f, 255.000000f }, -{ 264.026886f, 21.106712f, 56.341526f, -0.287199f, 0.000000f, 0.957871f, 0.000000f, 255.000000f }, -{ 264.026886f, 21.106710f, 44.635105f, 0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 261.908356f, 21.106710f, 44.635105f, -0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 261.908356f, 21.106709f, 51.721058f, -0.879075f, 0.000000f, -0.476683f, 0.000000f, 255.000000f }, -{ 258.931549f, 21.106709f, 48.634647f, 0.326650f, 0.000000f, -0.945145f, 0.000000f, 255.000000f }, -{ 255.954681f, 21.106709f, 51.721058f, -0.301802f, 0.000000f, -0.953371f, 0.000000f, 255.000000f }, -{ 255.954681f, 21.106710f, 44.635105f, 0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 53.398365f, 21.091320f, -118.046234f, -0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 53.398365f, 21.091311f, -89.641495f, -0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 58.399651f, 21.091311f, -89.641495f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 58.399651f, 21.091320f, -118.046234f, 0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 64.683319f, 21.091320f, -118.046234f, -0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 64.683319f, 21.091311f, -89.641495f, -0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 69.684608f, 21.091311f, -89.641495f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 69.684608f, 21.091311f, -92.719193f, 0.887750f, -0.000001f, 0.460327f, 0.000000f, 255.000000f }, -{ 71.361206f, 21.091311f, -90.693512f, -0.656342f, -0.000001f, 0.754463f, 0.000000f, 255.000000f }, -{ 75.070610f, 21.091311f, -89.192642f, -0.164366f, -0.000002f, 0.986400f, 0.000000f, 255.000000f }, -{ 78.221947f, 21.091311f, -90.116440f, 0.467430f, -0.000002f, 0.884030f, 0.000000f, 255.000000f }, -{ 80.447113f, 21.091311f, -92.906815f, 0.854905f, -0.000001f, 0.518785f, 0.000000f, 255.000000f }, -{ 81.069901f, 21.091311f, -95.010880f, 0.975826f, 0.000000f, 0.218549f, 0.000000f, 255.000000f }, -{ 81.290161f, 21.091311f, -97.592255f, 0.998390f, 0.000000f, 0.056724f, 0.000000f, 255.000000f }, -{ 81.290161f, 21.091320f, -118.046234f, 0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 76.288872f, 21.091320f, -118.046234f, -0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 76.288872f, 21.091311f, -97.720490f, -0.999299f, 0.000000f, -0.037426f, 0.000000f, 255.000000f }, -{ 76.046646f, 21.091311f, -95.573685f, -0.953521f, 0.000001f, -0.301328f, 0.000000f, 255.000000f }, -{ 74.507790f, 21.091311f, -93.751633f, -0.528723f, 0.000002f, -0.848795f, 0.000000f, 255.000000f }, -{ 72.154381f, 21.091311f, -93.999207f, 0.303533f, 0.000002f, -0.952821f, 0.000000f, 255.000000f }, -{ 70.869621f, 21.091311f, -95.136734f, 0.730358f, 0.000001f, -0.683065f, 0.000000f, 255.000000f }, -{ 69.684608f, 21.091311f, -97.015182f, 0.929606f, 0.000001f, -0.368555f, 0.000000f, 255.000000f }, -{ 69.684608f, 21.091320f, -118.046234f, 0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 116.042702f, 21.091320f, -111.377853f, -0.239564f, -0.000003f, 0.970881f, 0.000000f, 255.000000f }, -{ 116.042702f, 21.091320f, -116.315018f, 0.945756f, 0.000001f, -0.324877f, 0.000000f, 255.000000f }, -{ 112.247803f, 21.091320f, -118.552063f, 0.339296f, 0.000002f, -0.940680f, 0.000000f, 255.000000f }, -{ 107.574234f, 21.091320f, -118.394440f, -0.247366f, 0.000001f, -0.968922f, 0.000000f, 255.000000f }, -{ 103.539482f, 21.091320f, -115.040665f, -0.746247f, 0.000001f, -0.665669f, 0.000000f, 255.000000f }, -{ 102.209610f, 21.091320f, -112.118790f, -0.936927f, 0.000000f, -0.349526f, 0.000000f, 255.000000f }, -{ 101.385559f, 21.091312f, -108.374054f, -0.986407f, 0.000000f, -0.164321f, 0.000000f, 255.000000f }, -{ 101.102959f, 21.091311f, -103.811798f, -0.999732f, 0.000000f, -0.023155f, 0.000000f, 255.000000f }, -{ 101.339844f, 21.091307f, -99.454666f, -0.995145f, 0.000000f, 0.098417f, 0.000000f, 255.000000f }, -{ 102.036247f, 21.091311f, -95.777908f, -0.969592f, -0.000001f, 0.244727f, 0.000000f, 255.000000f }, -{ 103.170799f, 21.091311f, -92.831406f, -0.899584f, -0.000001f, 0.436747f, 0.000000f, 255.000000f }, -{ 104.722122f, 21.091311f, -90.665024f, -0.716919f, -0.000001f, 0.697157f, 0.000000f, 255.000000f }, -{ 107.933678f, 21.091311f, -88.927628f, -0.281539f, -0.000002f, 0.959550f, 0.000000f, 255.000000f }, -{ 111.632736f, 21.091311f, -89.470505f, 0.315299f, -0.000002f, 0.948992f, 0.000000f, 255.000000f }, -{ 113.549179f, 21.091311f, -91.009354f, 0.701500f, -0.000002f, 0.712669f, 0.000000f, 255.000000f }, -{ 114.952675f, 21.091311f, -93.103912f, 0.890786f, -0.000001f, 0.454424f, 0.000000f, 255.000000f }, -{ 116.387047f, 21.091307f, -99.154861f, 0.985821f, 0.000000f, 0.167802f, 0.000000f, 255.000000f }, -{ 116.619774f, 21.091309f, -104.965942f, 0.908369f, 0.000001f, -0.418169f, 0.000000f, 255.000000f }, -{ 106.104248f, 21.091312f, -104.965942f, 0.465868f, 0.000001f, -0.884854f, 0.000000f, 255.000000f }, -{ 106.676575f, 21.091320f, -110.009979f, 0.971167f, 0.000000f, 0.238399f, 0.000000f, 255.000000f }, -{ 108.374535f, 21.091320f, -113.130447f, 0.745484f, -0.000001f, 0.666523f, 0.000000f, 255.000000f }, -{ 111.169655f, 21.091320f, -114.199097f, 0.156933f, -0.000001f, 0.987609f, 0.000000f, 255.000000f }, -{ 113.774490f, 21.091320f, -113.485764f, -0.413582f, -0.000002f, 0.910467f, 0.000000f, 255.000000f }, -{ 106.040123f, 21.091307f, -101.247040f, 0.916229f, -0.000001f, 0.400654f, 0.000000f, 255.000000f }, -{ 111.618484f, 21.091307f, -101.247040f, -0.458820f, -0.000001f, 0.888529f, 0.000000f, 255.000000f }, -{ 111.312141f, 21.091311f, -96.746841f, -0.987291f, 0.000000f, -0.158925f, 0.000000f, 255.000000f }, -{ 110.364601f, 21.091311f, -94.098953f, -0.833881f, 0.000001f, -0.551945f, 0.000000f, 255.000000f }, -{ 108.733131f, 21.091311f, -93.232162f, -0.164167f, 0.000002f, -0.986433f, 0.000000f, 255.000000f }, -{ 107.208519f, 21.091311f, -94.113205f, 0.689773f, 0.000001f, -0.724025f, 0.000000f, 255.000000f }, -{ 106.325096f, 21.091311f, -96.775330f, 0.972507f, 0.000000f, -0.232875f, 0.000000f, 255.000000f }, -{ 122.262253f, 21.091320f, -118.046234f, -0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 122.262253f, 21.091311f, -89.641495f, -0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 127.263535f, 21.091311f, -89.641495f, 0.444200f, -0.000001f, 0.895928f, 0.000000f, 255.000000f }, -{ 127.391785f, 21.091311f, -97.335770f, 0.953952f, -0.000001f, 0.299959f, 0.000000f, 255.000000f }, -{ 128.306671f, 21.091311f, -94.372635f, -0.949849f, -0.000001f, 0.312709f, 0.000000f, 255.000000f }, -{ 129.111130f, 21.091311f, -92.203873f, -0.922966f, -0.000001f, 0.384882f, 0.000000f, 255.000000f }, -{ 129.876404f, 21.091311f, -90.715469f, -0.819365f, -0.000002f, 0.573272f, 0.000000f, 255.000000f }, -{ 131.574371f, 21.091311f, -89.323868f, -0.451781f, -0.000002f, 0.892129f, 0.000000f, 255.000000f }, -{ 133.556717f, 21.091311f, -89.280518f, 0.124905f, -0.000001f, 0.992169f, 0.000000f, 255.000000f }, -{ 135.214310f, 21.091311f, -90.026199f, 0.720568f, -0.000001f, 0.693384f, 0.000000f, 255.000000f }, -{ 134.829590f, 21.091311f, -95.155716f, 0.837365f, 0.000001f, -0.546645f, 0.000000f, 255.000000f }, -{ 132.649551f, 21.091311f, -94.450424f, -0.087364f, 0.000002f, -0.996176f, 0.000000f, 255.000000f }, -{ 130.914764f, 21.091311f, -95.135239f, 0.525644f, 0.000002f, -0.850705f, 0.000000f, 255.000000f }, -{ 129.543335f, 21.091311f, -96.915436f, 0.842037f, 0.000001f, -0.539420f, 0.000000f, 255.000000f }, -{ 128.513855f, 21.091307f, -99.379562f, 0.939937f, 0.000001f, -0.341349f, 0.000000f, 255.000000f }, -{ 127.804985f, 21.091307f, -102.116196f, 0.975653f, 0.000001f, -0.219322f, 0.000000f, 255.000000f }, -{ 127.395340f, 21.091309f, -104.713913f, 0.994216f, 0.000000f, -0.107397f, 0.000000f, 255.000000f }, -{ 127.263535f, 21.091320f, -118.046234f, 0.890868f, 0.000001f, -0.454263f, 0.000000f, 255.000000f }, -{ 155.668289f, 21.091312f, -112.788467f, -0.207596f, -0.000003f, 0.978215f, 0.000000f, 255.000000f }, -{ 155.668289f, 21.091312f, -116.571503f, 0.958465f, 0.000000f, -0.285210f, 0.000000f, 255.000000f }, -{ 154.127060f, 21.091320f, -117.804016f, 0.558773f, 0.000001f, -0.829321f, 0.000000f, 255.000000f }, -{ 152.305023f, 21.091320f, -118.637558f, 0.271646f, 0.000002f, -0.962397f, 0.000000f, 255.000000f }, -{ 150.903000f, 21.091320f, -118.586197f, -0.192636f, 0.000003f, -0.981270f, 0.000000f, 255.000000f }, -{ 149.472794f, 21.091320f, -117.781738f, -0.623712f, 0.000001f, -0.781654f, 0.000000f, 255.000000f }, -{ 148.448669f, 21.091320f, -116.186478f, -0.885465f, 0.000001f, -0.464706f, 0.000000f, 255.000000f }, -{ 148.102249f, 21.091320f, -115.096756f, -0.673915f, 0.000002f, -0.738809f, 0.000000f, 255.000000f }, -{ 146.276031f, 21.091320f, -117.172318f, 0.651081f, 0.000002f, -0.759008f, 0.000000f, 255.000000f }, -{ 142.652115f, 21.091320f, -118.815659f, 0.173318f, 0.000003f, -0.984866f, 0.000000f, 255.000000f }, -{ 139.866501f, 21.091320f, -117.808762f, -0.507992f, 0.000002f, -0.861362f, 0.000000f, 255.000000f }, -{ 137.850311f, 21.091320f, -115.206009f, -0.871837f, 0.000001f, -0.489796f, 0.000000f, 255.000000f }, -{ 137.073761f, 21.091320f, -111.634323f, -0.998311f, 0.000000f, -0.058104f, 0.000000f, 255.000000f }, -{ 138.144791f, 21.091309f, -107.571091f, -0.909053f, -0.000001f, 0.416680f, 0.000000f, 255.000000f }, -{ 141.623840f, 21.091307f, -104.049286f, -0.664570f, -0.000001f, 0.747226f, 0.000000f, 255.000000f }, -{ 144.391052f, 21.091307f, -102.166382f, -0.548261f, -0.000001f, 0.836307f, 0.000000f, 255.000000f }, -{ 147.909882f, 21.091307f, -100.028778f, -0.766243f, -0.000001f, 0.642551f, 0.000000f, 255.000000f }, -{ 147.909882f, 21.091311f, -97.335770f, -0.996405f, 0.000000f, -0.084715f, 0.000000f, 255.000000f }, -{ 147.180527f, 21.091311f, -94.538589f, -0.876729f, 0.000001f, -0.480984f, 0.000000f, 255.000000f }, -{ 145.869064f, 21.091311f, -93.718689f, -0.363965f, 0.000001f, -0.931413f, 0.000000f, 255.000000f }, -{ 143.898575f, 21.091311f, -93.732040f, 0.141328f, 0.000002f, -0.989963f, 0.000000f, 255.000000f }, -{ 141.682312f, 21.091311f, -94.706894f, 0.547231f, 0.000002f, -0.836982f, 0.000000f, 255.000000f }, -{ 137.779068f, 21.091307f, -98.297562f, -0.401856f, 0.000002f, -0.915703f, 0.000000f, 255.000000f }, -{ 137.779068f, 21.091311f, -92.526840f, -0.955079f, -0.000001f, 0.296350f, 0.000000f, 255.000000f }, -{ 141.658264f, 21.091311f, -89.665527f, -0.497538f, -0.000001f, 0.867442f, 0.000000f, 255.000000f }, -{ 144.054428f, 21.091311f, -88.951309f, -0.179589f, -0.000002f, 0.983742f, 0.000000f, 255.000000f }, -{ 147.152328f, 21.091311f, -89.072128f, 0.177231f, -0.000003f, 0.984169f, 0.000000f, 255.000000f }, -{ 150.474655f, 21.091311f, -90.715469f, 0.598228f, -0.000002f, 0.801326f, 0.000000f, 255.000000f }, -{ 152.600082f, 21.091311f, -94.111420f, 0.914330f, -0.000001f, 0.404969f, 0.000000f, 255.000000f }, -{ 152.911179f, 21.091311f, -96.502228f, 0.996242f, 0.000000f, 0.086610f, 0.000000f, 255.000000f }, -{ 152.932556f, 21.091312f, -113.100754f, 0.997125f, 0.000000f, 0.075777f, 0.000000f, 255.000000f }, -{ 153.103531f, 21.091312f, -113.846436f, 0.884948f, -0.000001f, 0.465690f, 0.000000f, 255.000000f }, -{ 153.680603f, 21.091312f, -114.199097f, 0.253386f, -0.000001f, 0.967365f, 0.000000f, 255.000000f }, -{ 154.124680f, 21.091312f, -114.032852f, -0.430647f, -0.000002f, 0.902520f, 0.000000f, 255.000000f }, -{ 154.796753f, 21.091312f, -113.553146f, -0.607827f, -0.000002f, 0.794070f, 0.000000f, 255.000000f }, -{ 147.909882f, 21.091312f, -110.800781f, -0.953798f, 0.000000f, 0.300449f, 0.000000f, 255.000000f }, -{ 147.909882f, 21.091307f, -103.491211f, -0.866611f, 0.000001f, -0.498984f, 0.000000f, 255.000000f }, -{ 146.048050f, 21.091309f, -104.727585f, 0.580141f, 0.000001f, -0.814516f, 0.000000f, 255.000000f }, -{ 144.556686f, 21.091309f, -105.944351f, 0.665820f, 0.000002f, -0.746113f, 0.000000f, 255.000000f }, -{ 143.421539f, 21.091309f, -107.154007f, 0.767879f, 0.000002f, -0.640594f, 0.000000f, 255.000000f }, -{ 142.628372f, 21.091309f, -108.369003f, 0.891623f, 0.013556f, -0.452576f, 0.000000f, 255.000000f }, -{ 142.162918f, 21.091312f, -109.601822f, 0.949579f, 0.009083f, -0.313397f, 0.000000f, 255.000000f }, -{ 142.010925f, 21.091312f, -110.864899f, 0.999304f, 0.016713f, 0.033337f, 0.000000f, 255.000000f }, -{ 142.329147f, 21.091312f, -112.550995f, 0.955846f, 0.011386f, 0.293649f, 0.000000f, 255.000000f }, -{ 143.188812f, 21.091320f, -113.667130f, 0.656317f, -0.000002f, 0.754485f, 0.000000f, 255.000000f }, -{ 144.447449f, 21.091320f, -114.070847f, 0.112970f, -0.000003f, 0.993598f, 0.000000f, 255.000000f }, -{ 145.715591f, 21.091312f, -113.693268f, -0.427813f, -0.000002f, 0.903867f, 0.000000f, 255.000000f }, -{ 146.898224f, 21.091312f, -112.588989f, -0.738315f, -0.000001f, 0.674456f, 0.000000f, 255.000000f }, -{ 147.430771f, 21.091312f, -111.777710f, -0.858087f, -0.000001f, 0.513505f, 0.000000f, 255.000000f }, -{ 173.749878f, 21.091312f, -112.467880f, -0.011390f, -0.000002f, 0.999935f, 0.000000f, 255.000000f }, -{ 173.749878f, 21.091312f, -117.276810f, 0.941545f, 0.000001f, -0.336887f, 0.000000f, 255.000000f }, -{ 172.085159f, 21.091312f, -118.160233f, 0.381529f, 0.000002f, -0.924357f, 0.000000f, 255.000000f }, -{ 168.812698f, 21.091312f, -118.815659f, 0.073515f, 0.000003f, -0.997294f, 0.000000f, 255.000000f }, -{ 166.009262f, 21.091312f, -118.315475f, -0.288270f, 0.000003f, -0.957549f, 0.000000f, 255.000000f }, -{ 163.547806f, 21.091312f, -116.887344f, -0.587254f, 0.000002f, -0.809402f, 0.000000f, 255.000000f }, -{ 161.503128f, 21.091312f, -114.639908f, -0.793964f, 0.000002f, -0.607965f, 0.000000f, 255.000000f }, -{ 159.950012f, 21.091312f, -111.681839f, -0.916096f, 0.000001f, -0.400960f, 0.000000f, 255.000000f }, -{ 158.963303f, 21.091309f, -108.121750f, -0.978307f, 0.000000f, -0.207162f, 0.000000f, 255.000000f }, -{ 158.617767f, 21.091307f, -104.068283f, -0.999894f, 0.000000f, -0.014533f, 0.000000f, 255.000000f }, -{ 159.531387f, 21.091311f, -96.903564f, -0.960752f, -0.000001f, 0.277410f, 0.000000f, 255.000000f }, -{ 163.822617f, 21.091311f, -90.542206f, -0.686978f, -0.000001f, 0.726678f, 0.000000f, 255.000000f }, -{ 169.115997f, 21.091311f, -88.872055f, -0.125351f, -0.000002f, 0.992112f, 0.000000f, 255.000000f }, -{ 173.301041f, 21.091311f, -89.897964f, 0.605053f, -0.000002f, 0.796185f, 0.000000f, 255.000000f }, -{ 173.301041f, 21.091311f, -95.027481f, 0.869424f, 0.000001f, -0.494066f, 0.000000f, 255.000000f }, -{ 169.582138f, 21.091311f, -93.616867f, -0.117972f, 0.000003f, -0.993017f, 0.000000f, 255.000000f }, -{ 166.473557f, 21.091311f, -94.882629f, 0.569661f, 0.000002f, -0.821880f, 0.000000f, 255.000000f }, -{ 164.462112f, 21.091307f, -98.442429f, 0.926161f, 0.000000f, -0.377127f, 0.000000f, 255.000000f }, -{ 163.747299f, 21.091307f, -103.940048f, 0.999259f, 0.000000f, -0.038502f, 0.000000f, 255.000000f }, -{ 164.523849f, 21.091312f, -109.302292f, 0.960848f, -0.000001f, 0.277074f, 0.000000f, 255.000000f }, -{ 166.711029f, 21.091312f, -112.812210f, 0.688926f, -0.000002f, 0.724832f, 0.000000f, 255.000000f }, -{ 171.313354f, 21.091312f, -113.911743f, -0.016062f, -0.000002f, 0.999871f, 0.000000f, 255.000000f }, -{ 188.369019f, 21.091312f, -113.301422f, 0.166049f, -0.000002f, 0.986117f, 0.000000f, 255.000000f }, -{ 188.369019f, 21.091312f, -117.725632f, 0.929230f, 0.000001f, -0.369503f, 0.000000f, 255.000000f }, -{ 186.637802f, 21.091312f, -118.378708f, 0.302607f, 0.000003f, -0.953115f, 0.000000f, 255.000000f }, -{ 184.602036f, 21.091312f, -118.792801f, 0.114406f, 0.000003f, -0.993434f, 0.000000f, 255.000000f }, -{ 182.419891f, 21.091312f, -118.666061f, -0.154137f, 0.000002f, -0.988049f, 0.000000f, 255.000000f }, -{ 181.128311f, 21.091312f, -118.195847f, -0.440071f, 0.000002f, -0.897963f, 0.000000f, 255.000000f }, -{ 180.089645f, 21.091312f, -117.372986f, -0.704223f, 0.000001f, -0.709979f, 0.000000f, 255.000000f }, -{ 179.323486f, 21.091312f, -116.165421f, -0.890730f, 0.000001f, -0.454533f, 0.000000f, 255.000000f }, -{ 178.849426f, 21.091312f, -114.541061f, -0.976876f, 0.000000f, -0.213806f, 0.000000f, 255.000000f }, -{ 178.687042f, 21.091312f, -112.467880f, -0.998642f, 0.000000f, -0.052093f, 0.000000f, 255.000000f }, -{ 178.687042f, 21.091311f, -94.001587f, -0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 175.416977f, 21.091311f, -94.001587f, -0.498416f, 0.000001f, -0.866938f, 0.000000f, 255.000000f }, -{ 178.200211f, 21.091311f, -89.945450f, -0.824150f, -0.000001f, 0.566372f, 0.000000f, 255.000000f }, -{ 180.755478f, 21.091311f, -86.238419f, -0.830310f, -0.000001f, 0.557302f, 0.000000f, 255.000000f }, -{ 183.239502f, 21.091309f, -82.331909f, -0.631328f, -0.000001f, 0.775516f, 0.000000f, 255.000000f }, -{ 183.688324f, 21.091309f, -82.331909f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 183.688324f, 21.091311f, -89.641495f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 188.369019f, 21.091311f, -89.641495f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 188.369019f, 21.091311f, -94.001587f, 0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 183.688324f, 21.091311f, -94.001587f, 0.448748f, 0.000001f, -0.893658f, 0.000000f, 255.000000f }, -{ 183.847443f, 21.091312f, -112.446503f, 0.993879f, -0.002630f, 0.110439f, 0.000000f, 255.000000f }, -{ 184.081055f, 21.091312f, -113.181198f, 0.839241f, 0.017509f, 0.543478f, 0.000000f, 255.000000f }, -{ 184.972198f, 21.091312f, -113.977341f, 0.558370f, 0.001114f, 0.829591f, 0.000000f, 255.000000f }, -{ 186.488205f, 21.091312f, -113.985367f, -0.111941f, -0.000003f, 0.993715f, 0.000000f, 255.000000f }, -{ 192.280289f, 21.091312f, -118.046234f, -0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 192.280289f, 21.091311f, -89.641495f, -0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 197.281570f, 21.091311f, -89.641495f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 197.281570f, 21.091312f, -118.046234f, 0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 209.400085f, 21.091312f, -118.687424f, -0.387639f, 0.000002f, -0.921811f, 0.000000f, 255.000000f }, -{ 200.872238f, 21.091311f, -89.641495f, -0.975084f, 0.000000f, 0.221837f, 0.000000f, 255.000000f }, -{ 205.873535f, 21.091311f, -89.641495f, 0.395561f, -0.000001f, 0.918440f, 0.000000f, 255.000000f }, -{ 210.041275f, 21.091309f, -105.863617f, 0.791121f, -0.000001f, 0.611659f, 0.000000f, 255.000000f }, -{ 210.169510f, 21.091309f, -105.863617f, -0.395561f, -0.000001f, 0.918440f, 0.000000f, 255.000000f }, -{ 214.337250f, 21.091311f, -89.641495f, -0.791121f, -0.000001f, 0.611659f, 0.000000f, 255.000000f }, -{ 219.338531f, 21.091311f, -89.641495f, 0.487542f, -0.000001f, 0.873100f, 0.000000f, 255.000000f }, -{ 210.810699f, 21.091312f, -118.687424f, 0.775278f, 0.000002f, -0.631621f, 0.000000f, 255.000000f }, -{ 196.095139f, 9.401914f, -83.842834f, 0.586264f, 0.000000f, -0.810120f, 0.000000f, 255.000000f }, -{ 197.530334f, 9.401917f, -82.099869f, 0.987392f, 0.000000f, -0.158291f, 0.000000f, 255.000000f }, -{ 197.312714f, 9.401917f, -79.852554f, 0.810120f, 0.000000f, 0.586264f, 0.000000f, 255.000000f }, -{ 195.569748f, 9.401917f, -78.417358f, 0.158291f, 0.000000f, 0.987392f, 0.000000f, 255.000000f }, -{ 193.322433f, 9.401917f, -78.634979f, -0.586264f, 0.000000f, 0.810120f, 0.000000f, 255.000000f }, -{ 191.887238f, 9.401917f, -80.377945f, -0.987392f, 0.000000f, 0.158291f, 0.000000f, 255.000000f }, -{ 192.104858f, 9.401917f, -82.625259f, -0.810120f, 0.000000f, -0.586264f, 0.000000f, 255.000000f }, -{ 193.847824f, 9.401914f, -84.060455f, -0.158291f, 0.000000f, -0.987392f, 0.000000f, 255.000000f }, -{ 196.095139f, 21.005835f, -83.842834f, 0.344805f, 0.000000f, -0.938674f, 0.000000f, 255.000000f }, -{ 197.530334f, 21.005833f, -82.099869f, 0.907558f, 0.000000f, -0.419928f, 0.000000f, 255.000000f }, -{ 197.312714f, 21.005833f, -79.852554f, 0.938674f, 0.000000f, 0.344805f, 0.000000f, 255.000000f }, -{ 195.569748f, 21.005836f, -78.417358f, 0.419928f, 0.000000f, 0.907558f, 0.000000f, 255.000000f }, -{ 193.322433f, 21.005836f, -78.634979f, -0.344805f, 0.000000f, 0.938674f, 0.000000f, 255.000000f }, -{ 191.887238f, 21.005833f, -80.377945f, -0.907558f, 0.000000f, 0.419928f, 0.000000f, 255.000000f }, -{ 192.104858f, 21.005835f, -82.625259f, -0.938674f, 0.000000f, -0.344805f, 0.000000f, 255.000000f }, -{ 193.847824f, 21.005835f, -84.060455f, -0.419928f, 0.000000f, -0.907558f, 0.000000f, 255.000000f }, -{ 57.212021f, 9.401914f, -83.842834f, 0.586264f, 0.000000f, -0.810120f, 0.000000f, 255.000000f }, -{ 58.647217f, 9.401917f, -82.099869f, 0.987392f, 0.000000f, -0.158291f, 0.000000f, 255.000000f }, -{ 58.429596f, 9.401917f, -79.852554f, 0.810120f, 0.000000f, 0.586264f, 0.000000f, 255.000000f }, -{ 56.686630f, 9.401917f, -78.417358f, 0.158291f, 0.000000f, 0.987392f, 0.000000f, 255.000000f }, -{ 54.439316f, 9.401917f, -78.634979f, -0.586264f, 0.000000f, 0.810120f, 0.000000f, 255.000000f }, -{ 53.004120f, 9.401917f, -80.377945f, -0.987392f, 0.000000f, 0.158291f, 0.000000f, 255.000000f }, -{ 53.221741f, 9.401917f, -82.625259f, -0.810120f, 0.000000f, -0.586264f, 0.000000f, 255.000000f }, -{ 54.964706f, 9.401914f, -84.060455f, -0.158291f, 0.000000f, -0.987392f, 0.000000f, 255.000000f }, -{ 57.212021f, 21.005835f, -83.842834f, 0.344805f, 0.000000f, -0.938674f, 0.000000f, 255.000000f }, -{ 58.647217f, 21.005833f, -82.099869f, 0.907558f, 0.000000f, -0.419928f, 0.000000f, 255.000000f }, -{ 58.429596f, 21.005833f, -79.852554f, 0.938674f, 0.000000f, 0.344805f, 0.000000f, 255.000000f }, -{ 56.686630f, 21.005836f, -78.417358f, 0.419928f, 0.000000f, 0.907558f, 0.000000f, 255.000000f }, -{ 54.439316f, 21.005836f, -78.634979f, -0.344805f, 0.000000f, 0.938674f, 0.000000f, 255.000000f }, -{ 53.004120f, 21.005833f, -80.377945f, -0.907558f, 0.000000f, 0.419928f, 0.000000f, 255.000000f }, -{ 53.221741f, 21.005835f, -82.625259f, -0.938674f, 0.000000f, -0.344805f, 0.000000f, 255.000000f }, -{ 54.964706f, 21.005835f, -84.060455f, -0.419928f, 0.000000f, -0.907558f, 0.000000f, 255.000000f }, -{ 98.582520f, 9.484123f, -113.301437f, 0.869996f, -0.000001f, 0.493059f, 0.000000f, 255.000000f }, -{ 98.582520f, 9.484123f, -117.725662f, 0.688899f, 0.000002f, -0.724858f, 0.000000f, 255.000000f }, -{ 95.979660f, 9.484123f, -118.792831f, 0.103299f, 0.000002f, -0.994650f, 0.000000f, 255.000000f }, -{ 92.633392f, 9.484123f, -118.666077f, -0.344449f, 0.000001f, -0.938805f, 0.000000f, 255.000000f }, -{ 90.303146f, 9.484123f, -117.373001f, -0.810154f, 0.000001f, -0.586217f, 0.000000f, 255.000000f }, -{ 89.062927f, 9.484123f, -114.541092f, -0.982148f, 0.000000f, -0.188111f, 0.000000f, 255.000000f }, -{ 88.900543f, 9.484123f, -112.467911f, -0.999661f, 0.000000f, -0.026047f, 0.000000f, 255.000000f }, -{ 88.900543f, 9.484118f, -94.001602f, -0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 85.630478f, 9.484118f, -94.001602f, -0.996832f, -0.000001f, 0.079535f, 0.000000f, 255.000000f }, -{ 88.413712f, 9.484118f, -89.945480f, -0.823749f, -0.000001f, 0.566955f, 0.000000f, 255.000000f }, -{ 90.968979f, 9.484117f, -86.238449f, -0.837145f, -0.000001f, 0.546981f, 0.000000f, 255.000000f }, -{ 93.453003f, 9.484117f, -82.331924f, -0.315664f, -0.000001f, 0.948871f, 0.000000f, 255.000000f }, -{ 93.901825f, 9.484117f, -82.331924f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 93.901825f, 9.484118f, -89.641510f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 98.582520f, 9.484118f, -89.641510f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 98.582520f, 9.484118f, -94.001602f, 0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 93.901825f, 9.484118f, -94.001602f, 0.897364f, 0.000532f, -0.441290f, 0.000000f, 255.000000f }, -{ 94.060944f, 9.484123f, -112.446518f, 0.908382f, 0.000909f, 0.418140f, 0.000000f, 255.000000f }, -{ 95.185699f, 9.484123f, -113.977371f, 0.300433f, -0.000003f, 0.953803f, 0.000000f, 255.000000f }, -{ 96.701706f, 9.484123f, -113.985397f, -0.229252f, -0.000002f, 0.973367f, 0.000000f, 255.000000f }, -{ 98.582520f, 21.091312f, -113.301422f, 0.166049f, -0.000002f, 0.986117f, 0.000000f, 255.000000f }, -{ 98.582520f, 21.091312f, -117.725632f, 0.932011f, 0.000001f, -0.362429f, 0.000000f, 255.000000f }, -{ 95.979660f, 21.091312f, -118.792801f, 0.245227f, 0.000003f, -0.969466f, 0.000000f, 255.000000f }, -{ 92.633392f, 21.091312f, -118.666061f, -0.191620f, 0.000002f, -0.981469f, 0.000000f, 255.000000f }, -{ 90.303146f, 21.091312f, -117.372986f, -0.659538f, 0.000001f, -0.751671f, 0.000000f, 255.000000f }, -{ 89.062927f, 21.091312f, -114.541061f, -0.954830f, 0.000001f, -0.297154f, 0.000000f, 255.000000f }, -{ 88.900543f, 21.091312f, -112.467880f, -0.998642f, 0.000000f, -0.052093f, 0.000000f, 255.000000f }, -{ 88.900543f, 21.091311f, -94.001587f, -0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 85.630478f, 21.091311f, -94.001587f, -0.498416f, 0.000001f, -0.866938f, 0.000000f, 255.000000f }, -{ 88.413712f, 21.091311f, -89.945450f, -0.824150f, -0.000001f, 0.566372f, 0.000000f, 255.000000f }, -{ 90.968979f, 21.091311f, -86.238419f, -0.830310f, -0.000001f, 0.557302f, 0.000000f, 255.000000f }, -{ 93.453003f, 21.091309f, -82.331909f, -0.631328f, -0.000001f, 0.775516f, 0.000000f, 255.000000f }, -{ 93.901825f, 21.091309f, -82.331909f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 93.901825f, 21.091311f, -89.641495f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 98.582520f, 21.091311f, -89.641495f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 98.582520f, 21.091311f, -94.001587f, 0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 93.901825f, 21.091311f, -94.001587f, 0.448616f, 0.000001f, -0.893725f, 0.000000f, 255.000000f }, -{ 94.047279f, 21.091312f, -112.455856f, 0.976683f, 0.000910f, 0.214684f, 0.000000f, 255.000000f }, -{ 95.185699f, 21.091312f, -113.977341f, 0.592555f, 0.000522f, 0.805530f, 0.000000f, 255.000000f }, -{ 96.701706f, 21.091312f, -113.985367f, -0.111941f, -0.000003f, 0.993715f, 0.000000f, 255.000000f }, -{ 236.900940f, 9.484123f, -111.377884f, 0.874270f, -0.000001f, 0.485440f, 0.000000f, 255.000000f }, -{ 236.900940f, 9.484123f, -116.315048f, 0.760144f, 0.000001f, -0.649754f, 0.000000f, 255.000000f }, -{ 233.106049f, 9.484123f, -118.552078f, 0.152177f, 0.000001f, -0.988353f, 0.000000f, 255.000000f }, -{ 228.432480f, 9.484123f, -118.394455f, -0.459334f, 0.000001f, -0.888264f, 0.000000f, 255.000000f }, -{ 224.397736f, 9.484123f, -115.040680f, -0.838627f, 0.000001f, -0.544707f, 0.000000f, 255.000000f }, -{ 223.067856f, 9.484123f, -112.118805f, -0.959193f, 0.000000f, -0.282752f, 0.000000f, 255.000000f }, -{ 222.243805f, 9.484118f, -108.374069f, -0.993577f, 0.000000f, -0.113154f, 0.000000f, 255.000000f }, -{ 221.961212f, 9.484118f, -103.811813f, -0.999878f, 0.000000f, 0.015606f, 0.000000f, 255.000000f }, -{ 222.198090f, 9.484118f, -99.454697f, -0.989803f, 0.000000f, 0.142441f, 0.000000f, 255.000000f }, -{ 222.894501f, 9.484118f, -95.777939f, -0.953092f, -0.000001f, 0.302682f, 0.000000f, 255.000000f }, -{ 224.029053f, 9.484106f, -92.831436f, -0.859240f, -0.000001f, 0.511572f, 0.000000f, 255.000000f }, -{ 225.580368f, 9.484118f, -90.665039f, -0.601898f, -0.000001f, 0.798573f, 0.000000f, 255.000000f }, -{ 228.791931f, 9.484118f, -88.927658f, -0.064729f, -0.000002f, 0.997903f, 0.000000f, 255.000000f }, -{ 232.490982f, 9.484118f, -89.470520f, 0.480740f, -0.000002f, 0.876863f, 0.000000f, 255.000000f }, -{ 234.407425f, 9.484118f, -91.009384f, 0.770418f, -0.000001f, 0.637539f, 0.000000f, 255.000000f }, -{ 235.810913f, 9.484106f, -93.103928f, 0.938897f, 0.000000f, 0.344198f, 0.000000f, 255.000000f }, -{ 237.245300f, 9.484118f, -99.154877f, 0.994578f, 0.000000f, 0.103993f, 0.000000f, 255.000000f }, -{ 237.478027f, 9.484118f, -104.965958f, 0.454185f, 0.000001f, -0.890908f, 0.000000f, 255.000000f }, -{ 226.962494f, 9.484118f, -104.965958f, 0.931736f, 0.000000f, -0.363137f, 0.000000f, 255.000000f }, -{ 227.534821f, 9.484123f, -110.009995f, 0.932111f, 0.000000f, 0.362173f, 0.000000f, 255.000000f }, -{ 229.232788f, 9.484123f, -113.130463f, 0.561655f, -0.000001f, 0.827372f, 0.000000f, 255.000000f }, -{ 232.027893f, 9.484123f, -114.199112f, -0.059664f, -0.000002f, 0.998219f, 0.000000f, 255.000000f }, -{ 234.632736f, 9.484123f, -113.485794f, -0.556105f, -0.000002f, 0.831112f, 0.000000f, 255.000000f }, -{ 226.898376f, 9.484118f, -101.247055f, 0.458115f, -0.000001f, 0.888893f, 0.000000f, 255.000000f }, -{ 232.476730f, 9.484118f, -101.247055f, -0.917640f, -0.000001f, 0.397413f, 0.000000f, 255.000000f }, -{ 232.170380f, 9.484118f, -96.746857f, -0.968412f, 0.000000f, -0.249358f, 0.000000f, 255.000000f }, -{ 231.222839f, 9.484118f, -94.098984f, -0.666434f, 0.000002f, -0.745564f, 0.000000f, 255.000000f }, -{ 229.591370f, 9.484106f, -93.232178f, 0.199198f, 0.000001f, -0.979959f, 0.000000f, 255.000000f }, -{ 228.066772f, 9.484118f, -94.113220f, 0.848531f, 0.000001f, -0.529145f, 0.000000f, 255.000000f }, -{ 227.183350f, 9.484118f, -96.775345f, 0.988917f, 0.000000f, -0.148471f, 0.000000f, 255.000000f }, -{ 236.900940f, 21.091320f, -111.377853f, -0.239566f, -0.000003f, 0.970880f, 0.000000f, 255.000000f }, -{ 236.900940f, 21.091320f, -116.315018f, 0.945756f, 0.000001f, -0.324877f, 0.000000f, 255.000000f }, -{ 233.106049f, 21.091320f, -118.552063f, 0.339296f, 0.000002f, -0.940680f, 0.000000f, 255.000000f }, -{ 228.432480f, 21.091320f, -118.394440f, -0.247366f, 0.000001f, -0.968922f, 0.000000f, 255.000000f }, -{ 224.397736f, 21.091320f, -115.040665f, -0.746247f, 0.000001f, -0.665669f, 0.000000f, 255.000000f }, -{ 223.067856f, 21.091320f, -112.118790f, -0.936926f, 0.000000f, -0.349528f, 0.000000f, 255.000000f }, -{ 222.243805f, 21.091312f, -108.374054f, -0.986407f, 0.000000f, -0.164320f, 0.000000f, 255.000000f }, -{ 221.961212f, 21.091311f, -103.811798f, -0.999732f, 0.000000f, -0.023155f, 0.000000f, 255.000000f }, -{ 222.198090f, 21.091307f, -99.454666f, -0.995145f, 0.000000f, 0.098417f, 0.000000f, 255.000000f }, -{ 222.894501f, 21.091311f, -95.777908f, -0.969592f, -0.000001f, 0.244728f, 0.000000f, 255.000000f }, -{ 224.029053f, 21.091311f, -92.831406f, -0.899585f, -0.000001f, 0.436746f, 0.000000f, 255.000000f }, -{ 225.580368f, 21.091311f, -90.665024f, -0.716920f, -0.000001f, 0.697156f, 0.000000f, 255.000000f }, -{ 228.791931f, 21.091311f, -88.927628f, -0.281538f, -0.000002f, 0.959550f, 0.000000f, 255.000000f }, -{ 232.490982f, 21.091311f, -89.470505f, 0.315299f, -0.000002f, 0.948992f, 0.000000f, 255.000000f }, -{ 234.407425f, 21.091311f, -91.009354f, 0.701501f, -0.000002f, 0.712669f, 0.000000f, 255.000000f }, -{ 235.810913f, 21.091311f, -93.103912f, 0.890786f, -0.000001f, 0.454423f, 0.000000f, 255.000000f }, -{ 237.245300f, 21.091307f, -99.154861f, 0.985820f, 0.000000f, 0.167804f, 0.000000f, 255.000000f }, -{ 237.478027f, 21.091309f, -104.965942f, 0.908369f, 0.000001f, -0.418169f, 0.000000f, 255.000000f }, -{ 226.962494f, 21.091312f, -104.965942f, 0.465868f, 0.000001f, -0.884854f, 0.000000f, 255.000000f }, -{ 227.534821f, 21.091320f, -110.009979f, 0.971167f, 0.000000f, 0.238399f, 0.000000f, 255.000000f }, -{ 229.232788f, 21.091320f, -113.130447f, 0.745484f, -0.000001f, 0.666524f, 0.000000f, 255.000000f }, -{ 232.027893f, 21.091320f, -114.199097f, 0.156935f, -0.000001f, 0.987609f, 0.000000f, 255.000000f }, -{ 234.632736f, 21.091320f, -113.485764f, -0.413582f, -0.000002f, 0.910467f, 0.000000f, 255.000000f }, -{ 226.898376f, 21.091307f, -101.247040f, 0.916229f, -0.000001f, 0.400654f, 0.000000f, 255.000000f }, -{ 232.476730f, 21.091307f, -101.247040f, -0.458820f, -0.000001f, 0.888529f, 0.000000f, 255.000000f }, -{ 232.170380f, 21.091311f, -96.746841f, -0.987291f, 0.000000f, -0.158926f, 0.000000f, 255.000000f }, -{ 231.222839f, 21.091311f, -94.098953f, -0.833881f, 0.000001f, -0.551945f, 0.000000f, 255.000000f }, -{ 229.591370f, 21.091311f, -93.232162f, -0.164166f, 0.000002f, -0.986433f, 0.000000f, 255.000000f }, -{ 228.066772f, 21.091311f, -94.113205f, 0.689776f, 0.000001f, -0.724023f, 0.000000f, 255.000000f }, -{ 227.183350f, 21.091311f, -96.775330f, 0.972507f, 0.000000f, -0.232875f, 0.000000f, 255.000000f }, -{ -227.530014f, -20.966743f, 18.889576f, -1.000000f, 0.000000f, 0.000000f, 11.312357f, 104.759467f }, -{ -227.530014f, -20.966749f, 49.094059f, -1.000000f, 0.000000f, 0.000000f, 24.483732f, 68.571409f }, -{ -259.747955f, -20.966747f, 81.060303f, -1.000000f, 0.000000f, 0.000000f, -0.177157f, 16.222941f }, -{ -259.747955f, -20.966751f, 111.264603f, -1.000000f, 0.000000f, 0.000000f, 12.994208f, -19.965071f }, -{ -264.026886f, -20.966732f, -47.559727f, -1.000000f, 0.000000f, 0.000000f, -61.391828f, 168.457698f }, -{ -264.026886f, -20.966738f, -14.334979f, -1.000000f, 0.000000f, 0.000000f, -46.903330f, 128.650867f }, -{ -148.686584f, -20.966757f, 116.550354f, -1.000000f, 0.000000f, 0.000000f, 148.362720f, 22.133174f }, -{ -148.686584f, -20.966743f, -55.110798f, -1.000000f, 0.000000f, 0.000000f, 73.505490f, 227.801797f }, -{ 53.459190f, 2.970489f, -63.834198f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 2.970482f, 19.696451f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 2.970485f, 19.696451f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 2.970482f, 37.767296f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 2.970478f, 37.767296f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 2.970482f, 19.696451f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970482f, 19.696451f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970489f, -63.834198f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ -227.530014f, 20.966755f, 18.889763f, -1.000000f, 0.000000f, 0.000000f, 11.312366f, 104.759421f }, -{ -227.530014f, 20.966747f, 49.094074f, -1.000000f, 0.000000f, 0.000000f, 24.483732f, 68.571394f }, -{ -259.747955f, 20.966745f, 81.060341f, -1.000000f, 0.000000f, 0.000000f, -0.177137f, 16.222895f }, -{ -259.747955f, 20.966743f, 111.264641f, -1.000000f, 0.000000f, 0.000000f, 12.994218f, -19.965132f }, -{ -264.026886f, 20.966764f, -47.559723f, -1.000000f, 0.000000f, 0.000000f, -61.391828f, 168.457698f }, -{ -264.026886f, 20.966753f, -14.334975f, -1.000000f, 0.000000f, 0.000000f, -46.903330f, 128.650867f }, -{ -148.686584f, 20.966726f, 116.550392f, -1.000000f, 0.000000f, 0.000000f, 148.362750f, 22.133128f }, -{ -148.686584f, 20.966757f, -55.110794f, -1.000000f, 0.000000f, 0.000000f, 73.505490f, 227.801797f }, -{ 53.459190f, 21.106728f, -63.834198f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 21.106720f, 19.696632f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 21.106720f, 19.696632f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 21.106718f, 37.767292f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 21.106718f, 37.767292f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 21.106720f, 19.696632f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106720f, 19.696632f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106728f, -63.834198f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ -227.530014f, -20.966743f, 18.889576f, 0.000000f, -1.000000f, 0.000000f, 11.312357f, 104.759467f }, -{ -227.530014f, -20.966749f, 49.094059f, 0.000000f, -1.000000f, 0.000000f, 24.483732f, 68.571409f }, -{ -220.271423f, -20.966749f, 49.922577f, 0.000000f, -1.000000f, 0.000000f, 33.541598f, 70.744057f }, -{ -214.348251f, -20.966755f, 52.198391f, 0.000000f, -1.000000f, 0.000000f, 41.630631f, 70.600333f }, -{ -209.753510f, -20.966747f, 55.606861f, 0.000001f, -1.000000f, 0.000000f, 48.621978f, 68.520264f }, -{ -206.480209f, -20.966747f, 59.833366f, 0.000000f, -1.000000f, 0.000000f, 54.386820f, 64.883859f }, -{ -204.521362f, -20.966749f, 64.563301f, 0.000000f, -1.000000f, 0.000000f, 58.796339f, 60.071098f }, -{ -203.869965f, -20.966747f, 69.481987f, 0.000000f, -1.000000f, 0.000000f, 61.721703f, 54.462037f }, -{ -204.699646f, -20.966759f, 74.975159f, 0.000000f, -1.000000f, 0.000000f, 63.123094f, 47.518821f }, -{ -207.067520f, -20.966751f, 79.783142f, 0.000000f, -1.000000f, 0.000000f, 62.382769f, 40.725774f }, -{ -210.791794f, -20.966751f, 83.766113f, 0.000000f, -1.000000f, 0.000000f, 59.657563f, 34.329668f }, -{ -215.690674f, -20.966751f, 86.784210f, 0.000000f, -1.000000f, 0.000000f, 55.104290f, 28.577385f }, -{ -221.582382f, -20.966751f, 88.697617f, 0.000000f, -1.000000f, 0.000000f, 48.879779f, 23.715683f }, -{ -228.285126f, -20.966751f, 89.366486f, 0.000000f, -1.000000f, 0.000000f, 41.140841f, 19.991411f }, -{ -233.272552f, -20.966751f, 89.153244f, 0.000000f, -1.000000f, 0.000000f, 35.072373f, 18.071997f }, -{ -238.232040f, -20.966751f, 88.499512f, 0.000000f, -1.000000f, 0.000000f, 28.845299f, 16.692535f }, -{ -243.261429f, -20.966751f, 87.384338f, 0.000000f, -1.000000f, 0.000000f, 22.333248f, 15.835422f }, -{ -248.458618f, -20.966747f, 85.786713f, 0.000000f, -1.000000f, 0.000000f, 15.409765f, 15.483181f }, -{ -253.921509f, -20.966747f, 83.685699f, 0.000000f, -1.000000f, 0.000000f, 7.948429f, 15.618211f }, -{ -259.747955f, -20.966747f, 81.060303f, 0.000000f, -1.000000f, 0.000000f, -0.177157f, 16.222941f }, -{ -259.747955f, -20.966751f, 111.264603f, 0.000000f, -1.000000f, 0.000000f, 12.994208f, -19.965071f }, -{ -253.885376f, -20.966755f, 113.571884f, 0.000000f, -1.000000f, 0.000000f, 21.024357f, -20.172935f }, -{ -247.666229f, -20.966757f, 115.459656f, 0.000000f, -1.000000f, 0.000000f, 29.298774f, -19.722674f }, -{ -241.153412f, -20.966763f, 116.927917f, 0.000000f, -1.000000f, 0.000000f, 37.742109f, -18.641708f }, -{ -234.409882f, -20.966763f, 117.976685f, 0.000000f, -1.000000f, 0.000000f, 46.278933f, -16.957548f }, -{ -227.498550f, -20.966763f, 118.605942f, 0.000000f, -1.000000f, 0.000000f, 54.833858f, -14.697611f }, -{ -220.482346f, -20.966763f, 118.815689f, 0.000000f, -1.000000f, 0.000000f, 63.331494f, -11.889319f }, -{ -205.143631f, -20.966763f, 117.432495f, 0.000000f, -1.000000f, 0.000000f, 81.105759f, -3.543264f }, -{ -191.825546f, -20.966755f, 113.455368f, 0.000000f, -1.000000f, 0.000000f, 95.327940f, 7.029456f }, -{ -180.870651f, -20.966755f, 107.142990f, 0.000000f, -1.000000f, 0.000000f, 105.700410f, 19.369521f }, -{ -172.621567f, -20.966755f, 98.754059f, 0.000000f, -1.000000f, 0.000000f, 111.925502f, 33.017599f }, -{ -167.420868f, -20.966753f, 88.547287f, 0.000000f, -1.000000f, 0.000000f, 113.705577f, 47.514307f }, -{ -165.611176f, -20.966751f, 76.781357f, 0.000000f, -1.000000f, 0.000000f, 110.742945f, 62.400328f }, -{ -166.340637f, -20.966751f, 68.696579f, 0.000000f, -1.000000f, -0.000001f, 106.343396f, 71.768664f }, -{ -168.510422f, -20.966749f, 61.101204f, 0.000000f, -1.000000f, 0.000000f, 100.431605f, 79.922555f }, -{ -172.092514f, -20.966755f, 54.065182f, 0.000000f, -1.000000f, 0.000000f, 93.071636f, 86.790413f }, -{ -177.058975f, -20.966747f, 47.658421f, 0.000000f, -1.000000f, -0.000001f, 84.327446f, 92.300650f }, -{ -183.381851f, -20.966743f, 41.950832f, 0.000000f, -1.000000f, 0.000000f, 74.263017f, 96.381707f }, -{ -191.033142f, -20.966743f, 37.012333f, 0.000000f, -1.000000f, 0.000000f, 62.942380f, 98.962027f }, -{ -181.454453f, -20.966751f, 32.298737f, 0.000000f, -1.000000f, 0.000000f, 72.363203f, 108.786445f }, -{ -173.805496f, -20.966743f, 26.319462f, 0.000000f, -1.000000f, 0.000000f, 78.920131f, 119.285616f }, -{ -168.002350f, -20.966745f, 19.235668f, 0.000000f, -1.000000f, 0.000000f, 82.783855f, 130.303376f }, -{ -163.961121f, -20.966740f, 11.208173f, 0.000000f, -1.000000f, 0.000000f, 84.125031f, 141.683643f }, -{ -161.597916f, -20.966740f, 2.397420f, 0.000000f, -1.000000f, 0.000000f, 83.114247f, 153.270415f }, -{ -160.828827f, -20.966740f, -7.035602f, 0.000000f, -1.000000f, 0.000000f, 79.922191f, 164.907572f }, -{ -162.772522f, -20.966736f, -21.426922f, 0.000000f, -1.000000f, 0.000000f, 71.317727f, 181.302331f }, -{ -168.407867f, -20.966743f, -33.734730f, 0.000000f, -1.000000f, 0.000000f, 59.198844f, 193.590982f }, -{ -177.441193f, -20.966736f, -43.721256f, 0.000000f, -1.000000f, 0.000000f, 44.021060f, 201.616710f }, -{ -189.578857f, -20.966732f, -51.148808f, 0.000000f, -1.000000f, 0.000000f, 26.239853f, 205.222777f }, -{ -204.527191f, -20.966740f, -55.779682f, 0.000000f, -1.000000f, 0.000000f, 6.310721f, 204.252461f }, -{ -221.992554f, -20.966740f, -57.376118f, 0.000000f, -1.000000f, 0.000000f, -15.310837f, 198.548949f }, -{ -229.371170f, -20.966740f, -57.068485f, 0.000000f, -1.000000f, 0.000000f, -24.017065f, 194.962735f }, -{ -236.805725f, -20.966740f, -56.173542f, 0.000000f, -1.000000f, 0.000000f, -32.534211f, 190.648469f }, -{ -244.142380f, -20.966740f, -54.733250f, 0.000000f, -1.000000f, 0.000000f, -40.696227f, 185.723508f }, -{ -251.227341f, -20.966732f, -52.789539f, 0.000000f, -1.000000f, 0.000000f, -48.337180f, 180.305151f }, -{ -257.906799f, -20.966732f, -50.384388f, 0.000000f, -1.000000f, 0.000000f, -55.291061f, 174.510773f }, -{ -264.026886f, -20.966732f, -47.559727f, 0.000000f, -1.000000f, 0.000000f, -61.391828f, 168.457698f }, -{ -264.026886f, -20.966738f, -14.334979f, 0.000000f, -1.000000f, 0.000000f, -46.903330f, 128.650867f }, -{ -257.339294f, -20.966736f, -18.662861f, 0.000000f, -1.000000f, 0.000000f, -40.778150f, 136.752428f }, -{ -251.050217f, -20.966736f, -22.109791f, 0.000000f, -1.000000f, 0.000000f, -34.746278f, 143.624739f }, -{ -245.054810f, -20.966736f, -24.717709f, 0.000000f, -1.000000f, 0.000000f, -28.700379f, 149.363753f }, -{ -239.248169f, -20.966736f, -26.528568f, 0.000000f, -1.000000f, 0.000000f, -22.533070f, 154.065492f }, -{ -233.525421f, -20.966736f, -27.584324f, 0.000000f, -1.000000f, 0.000000f, -16.136991f, 157.825952f }, -{ -227.781708f, -20.966736f, -27.926914f, 0.000000f, -1.000000f, 0.000000f, -9.404798f, 160.741110f }, -{ -220.280746f, -20.966736f, -27.192783f, 0.000000f, -1.000000f, 0.000000f, -0.097693f, 163.132527f }, -{ -213.751633f, -20.966736f, -25.074284f, 0.000000f, -1.000000f, 0.000000f, 8.648720f, 163.441519f }, -{ -208.369156f, -20.966736f, -21.697269f, 0.000000f, -1.000000f, 0.000000f, 16.570136f, 161.742661f }, -{ -204.308121f, -20.966736f, -17.187603f, 0.000000f, -1.000000f, -0.000001f, 23.402251f, 158.110511f }, -{ -201.743317f, -20.966747f, -11.671123f, 0.000000f, -1.000000f, 0.000000f, 28.880766f, 152.619616f }, -{ -200.849533f, -20.966740f, -5.273685f, 0.000000f, -1.000000f, 0.000000f, 32.741388f, 145.344557f }, -{ -201.724655f, -20.966740f, 1.288052f, 0.000000f, -1.000000f, 0.000000f, 34.554308f, 137.101264f }, -{ -204.242859f, -20.966745f, 7.031773f, 0.000000f, -1.000000f, 0.000000f, 34.041921f, 129.121540f }, -{ -208.243301f, -20.966740f, 11.810628f, 0.000000f, -1.000000f, 0.000000f, 31.332898f, 121.651460f }, -{ -213.565170f, -20.966740f, 15.477796f, 0.000001f, -1.000000f, 0.000000f, 26.555888f, 114.937053f }, -{ -220.047684f, -20.966743f, 17.886265f, 0.000000f, -1.000000f, 0.000000f, 19.839473f, 109.224409f }, -{ -148.686584f, -20.966757f, 116.550354f, 0.000000f, -1.000000f, 0.000000f, 148.362720f, 22.133174f }, -{ -72.924095f, -20.966761f, 116.550354f, 0.000000f, -1.000000f, 0.000000f, 239.134392f, 55.171337f }, -{ -44.133286f, -20.966759f, 113.442535f, 0.000000f, -1.000000f, 0.000000f, 272.273660f, 71.449816f }, -{ -20.467419f, -20.966759f, 104.692368f, 0.000000f, -1.000000f, 0.000000f, 296.812166f, 92.253563f }, -{ -1.975434f, -20.966759f, 91.159866f, 0.000000f, -1.000000f, 0.000000f, 313.066387f, 116.530870f }, -{ 11.293716f, -20.966763f, 73.704994f, 0.000000f, -1.000000f, 0.000000f, 321.352617f, 143.230046f }, -{ 19.291100f, -20.966763f, 53.187717f, 0.000000f, -1.000000f, 0.000000f, 321.987274f, 171.299429f }, -{ 21.967770f, -20.966759f, 30.467985f, 0.000000f, -1.000000f, 0.000000f, 315.286714f, 199.687265f }, -{ 19.338877f, -20.966749f, 6.999157f, 0.000000f, -1.000000f, 0.000000f, 301.902798f, 226.659149f }, -{ 11.340330f, -20.966751f, -13.645114f, 0.000000f, -1.000000f, 0.000000f, 283.317205f, 247.905254f }, -{ -2.195676f, -20.966743f, -30.821491f, 0.000000f, -1.000000f, 0.000000f, 259.609426f, 262.581684f }, -{ -21.436935f, -20.966740f, -43.886723f, 0.000000f, -1.000000f, 0.000000f, 230.858877f, 269.844599f }, -{ -46.551262f, -20.966736f, -52.197575f, 0.000000f, -1.000000f, 0.000000f, 197.145034f, 268.850158f }, -{ -77.706444f, -20.966743f, -55.110798f, 0.000000f, -1.000000f, 0.000000f, 158.547374f, 258.754495f }, -{ -148.686584f, -20.966743f, -55.110798f, 0.000000f, -1.000000f, 0.000000f, 73.505490f, 227.801797f }, -{ -105.897141f, -20.966753f, 85.087540f, 0.000000f, -1.000000f, 0.000000f, 185.908946f, 78.488452f }, -{ -105.897141f, -20.966742f, -23.647968f, 0.000000f, -1.000000f, 0.000000f, 138.492050f, 208.765350f }, -{ -77.958153f, -20.966742f, -23.647968f, 0.000000f, -1.000000f, 0.000000f, 171.965974f, 220.948864f }, -{ -58.874207f, -20.966740f, -21.368664f, 0.000000f, -1.000000f, 0.000000f, 195.824559f, 226.540055f }, -{ -44.341877f, -20.966745f, -15.146022f, 0.000000f, -1.000000f, 0.000000f, 215.949404f, 225.421851f }, -{ -33.878738f, -20.966743f, -5.902942f, 0.000000f, -1.000000f, 0.000000f, 232.516059f, 218.910357f }, -{ -27.002363f, -20.966749f, 5.437657f, 0.000000f, -1.000000f, 0.000000f, 245.700060f, 208.321713f }, -{ -23.230320f, -20.966747f, 17.952679f, 0.000000f, -1.000000f, 0.000000f, 255.676941f, 194.972086f }, -{ -22.080179f, -20.966755f, 30.719687f, 0.000000f, -1.000000f, 0.000000f, 262.622269f, 180.177463f }, -{ -23.442402f, -20.966751f, 44.972424f, 0.000000f, -1.000000f, 0.000000f, 267.205431f, 162.507202f }, -{ -27.692215f, -20.966751f, 57.903645f, 0.000000f, -1.000000f, 0.000000f, 267.752663f, 145.160958f }, -{ -35.074326f, -20.966751f, 68.947113f, 0.000000f, -1.000000f, 0.000000f, 263.723906f, 128.710531f }, -{ -45.833443f, -20.966755f, 77.536469f, 0.000000f, -1.000000f, 0.000000f, 254.578922f, 113.727776f }, -{ -60.214287f, -20.966755f, 83.105392f, 0.000000f, -1.000000f, 0.000000f, 239.777576f, 100.784454f }, -{ -78.461555f, -20.966755f, 85.087540f, 0.000000f, -1.000000f, 0.000000f, 218.779751f, 90.452444f }, -{ 53.459190f, 2.970489f, -63.834198f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 2.970482f, 19.696451f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 2.970485f, 19.696451f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 2.970482f, 37.767296f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 2.970482f, 37.767296f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 2.970471f, 52.887688f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 54.761124f, 2.970478f, 61.040325f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 58.744659f, 2.970474f, 68.629539f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 65.526382f, 2.970473f, 75.245560f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 75.222885f, 2.970474f, 80.478622f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 87.950760f, 2.970474f, 83.918953f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 103.826599f, 2.970474f, 85.156792f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 107.486267f, 2.970474f, 85.094475f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.371353f, 2.970474f, 84.904106f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 115.334160f, 2.970474f, 84.580559f, 0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 119.227013f, 2.970474f, 84.118721f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 122.902229f, 2.970474f, 83.513466f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 126.212128f, 2.970474f, 82.759666f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 114.179916f, 2.970478f, 65.426537f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 112.235428f, 2.970474f, 65.933624f, 0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 110.283180f, 2.970474f, 66.348511f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 108.268738f, 2.970474f, 66.671196f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 106.137703f, 2.970474f, 66.901688f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 103.835670f, 2.970474f, 67.039986f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 101.308228f, 2.970474f, 67.086082f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 95.838806f, 2.970474f, 66.577293f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 91.224388f, 2.970478f, 65.167015f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 87.527145f, 2.970478f, 63.029404f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 84.809280f, 2.970478f, 60.338612f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 83.132957f, 2.970478f, 57.268784f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970479f, 53.994072f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970478f, 37.767296f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 2.970478f, 37.767296f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 2.970482f, 19.696451f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970482f, 19.696451f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970489f, -63.834198f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 109.261765f, 2.970490f, -33.040283f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 158.509918f, 2.970482f, 10.661288f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 110.660858f, 2.970478f, 56.206810f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.037323f, 2.970478f, 56.206810f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 175.299042f, 2.970477f, 25.597071f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 203.001129f, 2.970478f, 56.206810f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 237.139038f, 2.970478f, 56.206810f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 189.569809f, 2.970482f, 11.767657f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 239.097778f, 2.970486f, -33.040283f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 202.161682f, 2.970486f, -33.040283f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.620132f, 2.970482f, -3.168332f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 143.679504f, 2.970490f, -33.040283f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 246.695496f, 2.970477f, 44.635109f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 246.695496f, 2.970479f, 54.095207f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 243.335144f, 2.970479f, 54.095207f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 243.335144f, 2.970478f, 56.104118f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 252.174316f, 2.970478f, 56.104118f, -0.000001f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 252.174316f, 2.970475f, 54.095207f, -0.000001f, -1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 248.813965f, 2.970479f, 54.095207f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 248.813965f, 2.970477f, 44.635109f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 253.836212f, 2.970477f, 44.635109f, -0.000002f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 253.836212f, 2.970478f, 56.341530f, -0.000001f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 258.931549f, 2.970471f, 51.191429f, -0.000001f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 264.026886f, 2.970478f, 56.341530f, 0.000002f, -1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 264.026886f, 2.970477f, 44.635109f, 0.000003f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 261.908356f, 2.970477f, 44.635109f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 261.908356f, 2.970467f, 51.721062f, 0.000000f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 258.931549f, 2.970471f, 48.634651f, -0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 255.954681f, 2.970471f, 51.721062f, -0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 255.954681f, 2.970477f, 44.635109f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 53.398365f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.398365f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 58.399651f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 58.399651f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 64.683319f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 64.683319f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 69.684608f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 69.684608f, 9.484118f, -92.719223f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 71.361206f, 9.484118f, -90.693527f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 75.070610f, 9.484118f, -89.192673f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 78.221947f, 9.484118f, -90.116470f, -0.000001f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 80.447113f, 9.484106f, -92.906830f, -0.000001f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 81.069901f, 9.484118f, -95.010895f, 0.000000f, -1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 81.290161f, 9.484118f, -97.592270f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 81.290161f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 76.288872f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 76.288872f, 9.484118f, -97.720505f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 76.046646f, 9.484118f, -95.573715f, 0.000000f, -1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 74.507790f, 9.484118f, -93.751663f, -0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 72.154381f, 9.484118f, -93.999222f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 70.869621f, 9.484118f, -95.136749f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 69.684608f, 9.484118f, -97.015213f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 69.684608f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 116.042702f, 9.484123f, -111.377884f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 116.042702f, 9.484123f, -116.315048f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 112.247803f, 9.484123f, -118.552078f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 107.574234f, 9.484123f, -118.394455f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 103.539482f, 9.484123f, -115.040680f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 102.209610f, 9.484123f, -112.118805f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 101.385559f, 9.484118f, -108.374069f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 101.102959f, 9.484118f, -103.811813f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 101.339844f, 9.484118f, -99.454697f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 102.036247f, 9.484118f, -95.777939f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 103.170799f, 9.484106f, -92.831436f, 0.000002f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 104.722122f, 9.484118f, -90.665039f, -0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 107.933678f, 9.484118f, -88.927658f, 0.000000f, -1.000000f, 0.000003f, 0.000000f, 255.000000f }, -{ 111.632736f, 9.484118f, -89.470520f, 0.000001f, -1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 113.549179f, 9.484118f, -91.009384f, 0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 114.952675f, 9.484106f, -93.103928f, -0.000002f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 116.387047f, 9.484118f, -99.154877f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 116.619774f, 9.484118f, -104.965958f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 106.104248f, 9.484118f, -104.965958f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 106.676575f, 9.484123f, -110.009995f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 108.374535f, 9.484123f, -113.130463f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.169655f, 9.484123f, -114.199112f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 113.774490f, 9.484123f, -113.485794f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 106.040123f, 9.484118f, -101.247055f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.618484f, 9.484118f, -101.247055f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.312141f, 9.484118f, -96.746857f, -0.000001f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 110.364601f, 9.484118f, -94.098984f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 108.733131f, 9.484106f, -93.232178f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 107.208519f, 9.484118f, -94.113220f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 106.325096f, 9.484118f, -96.775345f, 0.000001f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 122.262253f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 122.262253f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 127.263535f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 127.391785f, 9.484118f, -97.335800f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 128.306671f, 9.484118f, -94.372665f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 129.111130f, 9.484118f, -92.203903f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 129.876404f, 9.484118f, -90.715500f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 131.574371f, 9.484118f, -89.323883f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 133.556717f, 9.484118f, -89.280533f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 135.214310f, 9.484118f, -90.026230f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 134.829590f, 9.484118f, -95.155746f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 132.649551f, 9.484118f, -94.450439f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 130.914764f, 9.484118f, -95.135269f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 129.543335f, 9.484118f, -96.915451f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 128.513855f, 9.484118f, -99.379593f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 127.804985f, 9.484118f, -102.116226f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 127.395340f, 9.484118f, -104.713943f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 127.263535f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 155.668289f, 9.484123f, -112.788498f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 155.668289f, 9.484123f, -116.571518f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 154.127060f, 9.484123f, -117.804031f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 152.305023f, 9.484123f, -118.637589f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 150.903000f, 9.484123f, -118.586227f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 149.472794f, 9.484123f, -117.781754f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 148.448669f, 9.484123f, -116.186508f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 148.102249f, 9.484123f, -115.096786f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 146.276031f, 9.484123f, -117.172348f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 142.652115f, 9.484123f, -118.815689f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 139.866501f, 9.484123f, -117.808792f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 137.850311f, 9.484123f, -115.206024f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 137.073761f, 9.484123f, -111.634354f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 138.144791f, 9.484118f, -107.571106f, 0.000001f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 141.623840f, 9.484118f, -104.049301f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 144.391052f, 9.484118f, -102.166397f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.909882f, 9.484118f, -100.028793f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.909882f, 9.484118f, -97.335800f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.180527f, 9.484118f, -94.538605f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 145.869064f, 9.484118f, -93.718704f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 143.898575f, 9.484118f, -93.732071f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 141.682312f, 9.484118f, -94.706924f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 137.779068f, 9.484118f, -98.297592f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 137.779068f, 9.484118f, -92.526871f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 141.658264f, 9.484118f, -89.665543f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 144.054428f, 9.484118f, -88.951340f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.152328f, 9.484118f, -89.072159f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 150.474655f, 9.484118f, -90.715500f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 152.600082f, 9.484118f, -94.111435f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 152.911179f, 9.484118f, -96.502243f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 152.932556f, 9.484123f, -113.100784f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 153.103531f, 9.484123f, -113.846451f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 153.680603f, 9.484123f, -114.199112f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 154.124680f, 9.484123f, -114.032883f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 154.796753f, 9.484123f, -113.553177f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.909882f, 9.484123f, -110.800797f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.909882f, 9.484118f, -103.491226f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 146.048050f, 9.484118f, -104.727600f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 144.556686f, 9.484118f, -105.944382f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 143.421539f, 9.484118f, -107.154037f, -0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 142.162918f, 9.484122f, -109.601837f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 142.329147f, 9.484123f, -112.551010f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 143.188812f, 9.484123f, -113.667160f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 144.447449f, 9.484123f, -114.070877f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 145.715591f, 9.484123f, -113.693283f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 146.898224f, 9.484123f, -112.589005f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.430771f, 9.484123f, -111.777725f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.749878f, 9.484123f, -112.467911f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.749878f, 9.484123f, -117.276840f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 172.085159f, 9.484123f, -118.160263f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 168.812698f, 9.484123f, -118.815689f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 166.009262f, 9.484123f, -118.315506f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 163.547806f, 9.484123f, -116.887375f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 161.503128f, 9.484123f, -114.639938f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 159.950012f, 9.484123f, -111.681854f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 158.963303f, 9.484118f, -108.121765f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 158.617767f, 9.484118f, -104.068314f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 159.531387f, 9.484118f, -96.903595f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 163.822617f, 9.484118f, -90.542221f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 169.115997f, 9.484118f, -88.872086f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.301041f, 9.484118f, -89.897995f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.301041f, 9.484118f, -95.027512f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 169.582138f, 9.484118f, -93.616898f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 166.473557f, 9.484118f, -94.882645f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 164.462112f, 9.484118f, -98.442444f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 163.747299f, 9.484118f, -103.940063f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 164.523849f, 9.484122f, -109.302322f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 166.711029f, 9.484123f, -112.812241f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 171.313354f, 9.484123f, -113.911758f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 188.369019f, 9.484123f, -113.301437f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 188.369019f, 9.484123f, -117.725662f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 186.637802f, 9.484123f, -118.378738f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 184.602036f, 9.484123f, -118.792831f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 182.419891f, 9.484123f, -118.666077f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 181.128311f, 9.484123f, -118.195877f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 180.089645f, 9.484123f, -117.373001f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 179.323486f, 9.484123f, -116.165436f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 178.849426f, 9.484123f, -114.541092f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 178.687042f, 9.484123f, -112.467911f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 178.687042f, 9.484118f, -94.001602f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 175.416977f, 9.484118f, -94.001602f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 178.200211f, 9.484118f, -89.945480f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 180.755478f, 9.484117f, -86.238449f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.239502f, 9.484117f, -82.331924f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.688324f, 9.484117f, -82.331924f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.688324f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 188.369019f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 188.369019f, 9.484118f, -94.001602f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.688324f, 9.484118f, -94.001602f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.724243f, 9.484123f, -111.466034f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.847443f, 9.484123f, -112.446518f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 184.448257f, 9.484123f, -113.686172f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 184.972198f, 9.484123f, -113.977371f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 186.488205f, 9.484123f, -113.985397f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 192.280289f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 192.280289f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 197.281570f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 197.281570f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 209.400085f, 9.484123f, -118.687454f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 200.872238f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 205.873535f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 210.041275f, 9.484118f, -105.863632f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 210.169510f, 9.484118f, -105.863632f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 214.337250f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 219.338531f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 210.810699f, 9.484123f, -118.687454f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ -227.530014f, 20.966755f, 18.889763f, 0.000000f, 1.000000f, 0.000000f, 11.312366f, 104.759421f }, -{ -227.530014f, 20.966747f, 49.094074f, 0.000000f, 1.000000f, 0.000000f, 24.483732f, 68.571394f }, -{ -220.271423f, 20.966747f, 49.922592f, 0.000000f, 1.000000f, 0.000000f, 33.541610f, 70.744042f }, -{ -214.348251f, 20.966747f, 52.198406f, 0.000000f, 1.000000f, 0.000000f, 41.630631f, 70.600318f }, -{ -209.753510f, 20.966751f, 55.606876f, 0.000000f, 1.000000f, 0.000000f, 48.621982f, 68.520264f }, -{ -206.480209f, 20.966751f, 59.833382f, 0.000000f, 1.000000f, 0.000000f, 54.386827f, 64.883844f }, -{ -204.521362f, 20.966751f, 64.563332f, 0.000000f, 1.000000f, 0.000000f, 58.796350f, 60.071068f }, -{ -203.869965f, 20.966747f, 69.482018f, 0.000000f, 1.000000f, 0.000000f, 61.721714f, 54.462006f }, -{ -204.699646f, 20.966745f, 74.975189f, 0.000000f, 1.000000f, 0.000000f, 63.123110f, 47.518791f }, -{ -207.067520f, 20.966745f, 79.783180f, 0.000000f, 1.000000f, 0.000000f, 62.382784f, 40.725728f }, -{ -210.791794f, 20.966745f, 83.766144f, 0.000000f, 1.000000f, 0.000000f, 59.657578f, 34.329638f }, -{ -215.690674f, 20.966745f, 86.784241f, 0.000000f, 1.000000f, 0.000000f, 55.104305f, 28.577339f }, -{ -221.582382f, 20.966745f, 88.697647f, 0.000000f, 1.000000f, 0.000000f, 48.879791f, 23.715652f }, -{ -228.285126f, 20.966745f, 89.366524f, 0.000000f, 1.000000f, 0.000000f, 41.140860f, 19.991366f }, -{ -233.272552f, 20.966745f, 89.153275f, 0.000000f, 1.000000f, 0.000000f, 35.072392f, 18.071967f }, -{ -238.232040f, 20.966745f, 88.499550f, 0.000000f, 1.000000f, 0.000000f, 28.845318f, 16.692474f }, -{ -243.261429f, 20.966745f, 87.384369f, 0.000000f, 1.000000f, 0.000000f, 22.333258f, 15.835392f }, -{ -248.458618f, 20.966745f, 85.786751f, 0.000000f, 1.000000f, 0.000000f, 15.409784f, 15.483151f }, -{ -253.921509f, 20.966745f, 83.685738f, 0.000000f, 1.000000f, 0.000000f, 7.948449f, 15.618150f }, -{ -259.747955f, 20.966745f, 81.060341f, 0.000000f, 1.000000f, 0.000000f, -0.177137f, 16.222895f }, -{ -259.747955f, 20.966743f, 111.264641f, 0.000000f, 1.000000f, 0.000000f, 12.994218f, -19.965132f }, -{ -253.885376f, 20.966743f, 113.571915f, 0.000000f, 1.000000f, 0.000000f, 21.024369f, -20.172966f }, -{ -247.666229f, 20.966742f, 115.459694f, 0.000000f, 1.000000f, 0.000000f, 29.298793f, -19.722705f }, -{ -241.153412f, 20.966742f, 116.927956f, 0.000000f, 1.000000f, 0.000000f, 37.742128f, -18.641769f }, -{ -234.409882f, 20.966742f, 117.976715f, 0.000000f, 1.000000f, 0.000000f, 46.278944f, -16.957608f }, -{ -227.498550f, 20.966742f, 118.605980f, 0.000000f, 1.000000f, 0.000000f, 54.833877f, -14.697672f }, -{ -220.482346f, 20.966742f, 118.815727f, 0.000000f, 1.000000f, 0.000000f, 63.331513f, -11.889380f }, -{ -205.143631f, 20.966742f, 117.432526f, 0.000000f, 1.000000f, 0.000000f, 81.105774f, -3.543295f }, -{ -191.825546f, 20.966743f, 113.455399f, 0.000000f, 1.000000f, 0.000000f, 95.327947f, 7.029410f }, -{ -180.870651f, 20.966740f, 107.143021f, 0.000000f, 1.000000f, 0.000000f, 105.700425f, 19.369491f }, -{ -172.621567f, 20.966740f, 98.754097f, 0.000000f, 1.000000f, 0.000000f, 111.925517f, 33.017553f }, -{ -167.420868f, 20.966738f, 88.547325f, 0.000000f, 1.000000f, 0.000000f, 113.705593f, 47.514262f }, -{ -165.611176f, 20.966738f, 76.781395f, 0.000000f, 1.000000f, 0.000000f, 110.742960f, 62.400282f }, -{ -166.340637f, 20.966747f, 68.696609f, 0.000000f, 1.000000f, 0.000000f, 106.343412f, 71.768634f }, -{ -168.510422f, 20.966751f, 61.101219f, 0.000000f, 1.000000f, 0.000000f, 100.431613f, 79.922540f }, -{ -172.092514f, 20.966747f, 54.065197f, 0.000000f, 1.000000f, 0.000000f, 93.071636f, 86.790398f }, -{ -177.058975f, 20.966749f, 47.658436f, 0.000000f, 1.000000f, 0.000000f, 84.327446f, 92.300634f }, -{ -183.381851f, 20.966749f, 41.950848f, 0.000000f, 1.000000f, 0.000000f, 74.263017f, 96.381691f }, -{ -191.033142f, 20.966749f, 37.012348f, 0.000000f, 1.000000f, 0.000000f, 62.942388f, 98.962011f }, -{ -181.454453f, 20.966749f, 32.298752f, 0.000000f, 1.000000f, 0.000000f, 72.363211f, 108.786445f }, -{ -173.805496f, 20.966751f, 26.319649f, 0.000000f, 1.000000f, 0.000000f, 78.920146f, 119.285570f }, -{ -168.002350f, 20.966755f, 19.235847f, 0.000000f, 1.000000f, 0.000000f, 82.783870f, 130.303345f }, -{ -163.961121f, 20.966755f, 11.208177f, 0.000000f, 1.000000f, 0.000000f, 84.125031f, 141.683643f }, -{ -161.597916f, 20.966753f, 2.397416f, 0.000000f, 1.000000f, 0.000000f, 83.114247f, 153.270422f }, -{ -160.828827f, 20.966753f, -7.035606f, 0.000000f, 1.000000f, 0.000000f, 79.922183f, 164.907587f }, -{ -162.772522f, 20.966755f, -21.426933f, 0.000000f, 1.000000f, 0.000000f, 71.317727f, 181.302347f }, -{ -168.407867f, 20.966755f, -33.734711f, 0.000000f, 1.000000f, 0.000000f, 59.198847f, 193.590963f }, -{ -177.441193f, 20.966757f, -43.721252f, 0.000000f, 1.000000f, 0.000000f, 44.021060f, 201.616710f }, -{ -189.578857f, 20.966757f, -51.148804f, 0.000000f, 1.000000f, 0.000000f, 26.239853f, 205.222777f }, -{ -204.527191f, 20.966757f, -55.779663f, 0.000000f, 1.000000f, 0.000000f, 6.310730f, 204.252446f }, -{ -221.992554f, 20.966764f, -57.376114f, 0.000000f, 1.000000f, 0.000000f, -15.310837f, 198.548949f }, -{ -229.371170f, 20.966764f, -57.068481f, 0.000000f, 1.000000f, 0.000000f, -24.017065f, 194.962735f }, -{ -236.805725f, 20.966764f, -56.173538f, 0.000000f, 1.000000f, 0.000000f, -32.534211f, 190.648469f }, -{ -244.142380f, 20.966764f, -54.733246f, 0.000000f, 1.000000f, 0.000000f, -40.696227f, 185.723508f }, -{ -251.227341f, 20.966764f, -52.789536f, 0.000000f, 1.000000f, 0.000000f, -48.337180f, 180.305151f }, -{ -257.906799f, 20.966764f, -50.384384f, 0.000000f, 1.000000f, 0.000000f, -55.291061f, 174.510773f }, -{ -264.026886f, 20.966764f, -47.559723f, 0.000000f, 1.000000f, 0.000000f, -61.391828f, 168.457698f }, -{ -264.026886f, 20.966753f, -14.334975f, 0.000000f, 1.000000f, 0.000000f, -46.903330f, 128.650867f }, -{ -257.339294f, 20.966755f, -18.662872f, 0.000000f, 1.000000f, 0.000000f, -40.778150f, 136.752450f }, -{ -251.050217f, 20.966759f, -22.109795f, 0.000000f, 1.000000f, 0.000000f, -34.746278f, 143.624746f }, -{ -245.054810f, 20.966759f, -24.717712f, 0.000000f, 1.000000f, 0.000000f, -28.700388f, 149.363761f }, -{ -239.248169f, 20.966759f, -26.528572f, 0.000000f, 1.000000f, 0.000000f, -22.533070f, 154.065507f }, -{ -233.525421f, 20.966759f, -27.584328f, 0.000000f, 1.000000f, 0.000000f, -16.136991f, 157.825968f }, -{ -227.781708f, 20.966759f, -27.926926f, 0.000000f, 1.000000f, 0.000000f, -9.404798f, 160.741125f }, -{ -220.280746f, 20.966759f, -27.192787f, 0.000000f, 1.000000f, 0.000000f, -0.097693f, 163.132535f }, -{ -213.751633f, 20.966759f, -25.074295f, 0.000000f, 1.000000f, 0.000000f, 8.648710f, 163.441542f }, -{ -208.369156f, 20.966755f, -21.697281f, 0.000000f, 1.000000f, 0.000000f, 16.570136f, 161.742676f }, -{ -204.308121f, 20.966755f, -17.187607f, 0.000000f, 1.000000f, 0.000000f, 23.402251f, 158.110519f }, -{ -201.743317f, 20.966753f, -11.671119f, 0.000000f, 1.000000f, 0.000000f, 28.880766f, 152.619616f }, -{ -200.849533f, 20.966753f, -5.273689f, 0.000000f, 1.000000f, 0.000000f, 32.741376f, 145.344564f }, -{ -201.724655f, 20.966753f, 1.288060f, 0.000000f, 1.000000f, 0.000000f, 34.554308f, 137.101256f }, -{ -204.242859f, 20.966751f, 7.031769f, 0.000000f, 1.000000f, 0.000000f, 34.041921f, 129.121548f }, -{ -208.243301f, 20.966755f, 11.810632f, 0.000000f, 1.000000f, 0.000000f, 31.332898f, 121.651460f }, -{ -213.565170f, 20.966755f, 15.477799f, 0.000000f, 1.000000f, 0.000000f, 26.555888f, 114.937053f }, -{ -220.047684f, 20.966755f, 17.886444f, 0.000000f, 1.000000f, 0.000000f, 19.839494f, 109.224379f }, -{ -148.686584f, 20.966726f, 116.550392f, 0.000000f, 1.000000f, 0.000000f, 148.362750f, 22.133128f }, -{ -72.924095f, 20.966726f, 116.550392f, 0.000000f, 1.000000f, 0.000000f, 239.134392f, 55.171292f }, -{ -44.133286f, 20.966728f, 113.442566f, 0.000000f, 1.000000f, 0.000000f, 272.273660f, 71.449770f }, -{ -20.467419f, 20.966740f, 104.692406f, 0.000000f, 1.000000f, 0.000000f, 296.812196f, 92.253517f }, -{ -1.975434f, 20.966738f, 91.159897f, 0.000000f, 1.000000f, 0.000000f, 313.066387f, 116.530840f }, -{ 11.293716f, 20.966730f, 73.705025f, 0.000000f, 1.000000f, 0.000000f, 321.352617f, 143.230008f }, -{ 19.291100f, 20.966740f, 53.187733f, 0.000000f, 1.000000f, 0.000000f, 321.987274f, 171.299414f }, -{ 21.967770f, 20.966734f, 30.467978f, 0.000000f, 1.000000f, 0.000000f, 315.286714f, 199.687280f }, -{ 19.338877f, 20.966743f, 6.999154f, 0.000000f, 1.000000f, 0.000000f, 301.902798f, 226.659158f }, -{ 11.340330f, 20.966745f, -13.645118f, 0.000000f, 1.000000f, 0.000000f, 283.317205f, 247.905264f }, -{ -2.195676f, 20.966759f, -30.821503f, 0.000000f, 1.000000f, 0.000000f, 259.609396f, 262.581703f }, -{ -21.436935f, 20.966757f, -43.886719f, 0.000000f, 1.000000f, 0.000000f, 230.858877f, 269.844599f }, -{ -46.551262f, 20.966757f, -52.197571f, 0.000000f, 1.000000f, 0.000000f, 197.145034f, 268.850158f }, -{ -77.706444f, 20.966757f, -55.110794f, 0.000000f, 1.000000f, 0.000000f, 158.547374f, 258.754495f }, -{ -148.686584f, 20.966757f, -55.110794f, 0.000000f, 1.000000f, 0.000000f, 73.505490f, 227.801797f }, -{ -105.897141f, 20.966738f, 85.087578f, 0.000000f, 1.000000f, 0.000000f, 185.908961f, 78.488406f }, -{ -105.897141f, 20.966759f, -23.647980f, 0.000000f, 1.000000f, 0.000000f, 138.492035f, 208.765369f }, -{ -77.958153f, 20.966759f, -23.647980f, 0.000000f, 1.000000f, 0.000000f, 171.965959f, 220.948887f }, -{ -58.874207f, 20.966755f, -21.368675f, 0.000000f, 1.000000f, 0.000000f, 195.824544f, 226.540074f }, -{ -44.341877f, 20.966753f, -15.146018f, 0.000000f, 1.000000f, 0.000000f, 215.949404f, 225.421851f }, -{ -33.878738f, 20.966745f, -5.902946f, 0.000000f, 1.000000f, 0.000000f, 232.516059f, 218.910365f }, -{ -27.002363f, 20.966743f, 5.437653f, 0.000000f, 1.000000f, 0.000000f, 245.700045f, 208.321724f }, -{ -23.230320f, 20.966747f, 17.952866f, 0.000000f, 1.000000f, 0.000000f, 255.676941f, 194.972041f }, -{ -22.080179f, 20.966734f, 30.719679f, 0.000000f, 1.000000f, 0.000000f, 262.622269f, 180.177478f }, -{ -23.442402f, 20.966742f, 44.972439f, 0.000000f, 1.000000f, 0.000000f, 267.205431f, 162.507187f }, -{ -27.692215f, 20.966743f, 57.903660f, 0.000000f, 1.000000f, 0.000000f, 267.752663f, 145.160943f }, -{ -35.074326f, 20.966740f, 68.947144f, 0.000000f, 1.000000f, 0.000000f, 263.723906f, 128.710501f }, -{ -45.833443f, 20.966738f, 77.536499f, 0.000000f, 1.000000f, 0.000000f, 254.578922f, 113.727730f }, -{ -60.214287f, 20.966738f, 83.105423f, 0.000000f, 1.000000f, 0.000000f, 239.777591f, 100.784424f }, -{ -78.461555f, 20.966738f, 85.087578f, 0.000000f, 1.000000f, 0.000000f, 218.779751f, 90.452398f }, -{ 53.459190f, 21.106728f, -63.834198f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 21.106720f, 19.696632f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 21.106720f, 19.696632f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 21.106718f, 37.767292f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 21.106718f, 37.767292f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 21.106716f, 52.887684f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 54.761124f, 21.106716f, 61.040321f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 58.744659f, 21.106709f, 68.629570f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 65.526382f, 21.106707f, 75.245590f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 75.222885f, 21.106714f, 80.478653f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 87.950760f, 21.106714f, 83.918983f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 103.826599f, 21.106714f, 85.156822f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 107.486267f, 21.106707f, 85.094505f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.371353f, 21.106707f, 84.904137f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 115.334160f, 21.106707f, 84.580589f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 119.227013f, 21.106707f, 84.118752f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 122.902229f, 21.106707f, 83.513496f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 126.212128f, 21.106707f, 82.759697f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 114.179916f, 21.106716f, 65.426567f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 112.235428f, 21.106709f, 65.933655f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 110.283180f, 21.106709f, 66.348541f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 108.268738f, 21.106709f, 66.671227f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 106.137703f, 21.106709f, 66.901718f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 103.835670f, 21.106709f, 67.040016f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 101.308228f, 21.106709f, 67.086113f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 95.838806f, 21.106709f, 66.577324f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 91.224388f, 21.106716f, 65.167046f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 87.527145f, 21.106716f, 63.029400f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 84.809280f, 21.106716f, 60.338608f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 83.132957f, 21.106716f, 57.268780f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106716f, 53.994068f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106718f, 37.767292f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 21.106718f, 37.767292f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 21.106720f, 19.696632f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106720f, 19.696632f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106728f, -63.834198f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 109.261765f, 21.106724f, -33.040283f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 158.509918f, 21.106720f, 10.661286f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 110.660858f, 21.106716f, 56.206806f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.037323f, 21.106716f, 56.206806f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 175.299042f, 21.106712f, 25.597252f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 203.001129f, 21.106716f, 56.206806f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 237.139038f, 21.106712f, 56.206806f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 189.569809f, 21.106720f, 11.767655f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 239.097778f, 21.106724f, -33.040283f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 202.161682f, 21.106724f, -33.040283f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.620132f, 21.106722f, -3.168342f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 143.679504f, 21.106724f, -33.040283f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 246.695496f, 21.106710f, 44.635105f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 246.695496f, 21.106709f, 54.095203f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 243.335144f, 21.106709f, 54.095203f, 0.000000f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 243.335144f, 21.106712f, 56.104115f, 0.000000f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 252.174316f, 21.106712f, 56.104115f, 0.000000f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 252.174316f, 21.106709f, 54.095203f, 0.000000f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 248.813965f, 21.106709f, 54.095203f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 248.813965f, 21.106710f, 44.635105f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 253.836212f, 21.106710f, 44.635105f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 253.836212f, 21.106712f, 56.341526f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 258.931549f, 21.106709f, 51.191425f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 264.026886f, 21.106712f, 56.341526f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 264.026886f, 21.106710f, 44.635105f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 261.908356f, 21.106710f, 44.635105f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 261.908356f, 21.106709f, 51.721058f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 258.931549f, 21.106709f, 48.634647f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 255.954681f, 21.106709f, 51.721058f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 255.954681f, 21.106710f, 44.635105f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.398365f, 21.091320f, -118.046234f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.398365f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 58.399651f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 58.399651f, 21.091320f, -118.046234f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 64.683319f, 21.091320f, -118.046234f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 64.683319f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 69.684608f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 69.684608f, 21.091311f, -92.719193f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 71.361206f, 21.091311f, -90.693512f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 75.070610f, 21.091311f, -89.192642f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 78.221947f, 21.091311f, -90.116440f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 80.447113f, 21.091311f, -92.906815f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 81.069901f, 21.091311f, -95.010880f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 81.290161f, 21.091311f, -97.592255f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 81.290161f, 21.091320f, -118.046234f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 76.288872f, 21.091320f, -118.046234f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 76.288872f, 21.091311f, -97.720490f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 76.046646f, 21.091311f, -95.573685f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 74.507790f, 21.091311f, -93.751633f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 72.154381f, 21.091311f, -93.999207f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 70.869621f, 21.091311f, -95.136734f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 69.684608f, 21.091311f, -97.015182f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 69.684608f, 21.091320f, -118.046234f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 116.042702f, 21.091320f, -111.377853f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 116.042702f, 21.091320f, -116.315018f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 112.247803f, 21.091320f, -118.552063f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 107.574234f, 21.091320f, -118.394440f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 103.539482f, 21.091320f, -115.040665f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 102.209610f, 21.091320f, -112.118790f, -0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 101.385559f, 21.091312f, -108.374054f, -0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 101.102959f, 21.091311f, -103.811798f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 101.339844f, 21.091307f, -99.454666f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 102.036247f, 21.091311f, -95.777908f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 103.170799f, 21.091311f, -92.831406f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 104.722122f, 21.091311f, -90.665024f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 107.933678f, 21.091311f, -88.927628f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.632736f, 21.091311f, -89.470505f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 113.549179f, 21.091311f, -91.009354f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 114.952675f, 21.091311f, -93.103912f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 116.387047f, 21.091307f, -99.154861f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 116.619774f, 21.091309f, -104.965942f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 106.104248f, 21.091312f, -104.965942f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 106.676575f, 21.091320f, -110.009979f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 108.374535f, 21.091320f, -113.130447f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.169655f, 21.091320f, -114.199097f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 113.774490f, 21.091320f, -113.485764f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 106.040123f, 21.091307f, -101.247040f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.618484f, 21.091307f, -101.247040f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.312141f, 21.091311f, -96.746841f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 110.364601f, 21.091311f, -94.098953f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 108.733131f, 21.091311f, -93.232162f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 107.208519f, 21.091311f, -94.113205f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 106.325096f, 21.091311f, -96.775330f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 122.262253f, 21.091320f, -118.046234f, 0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 122.262253f, 21.091311f, -89.641495f, -0.000003f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 127.263535f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 127.391785f, 21.091311f, -97.335770f, -0.000004f, 1.000000f, -0.000003f, 0.000000f, 255.000000f }, -{ 128.306671f, 21.091311f, -94.372635f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 129.111130f, 21.091311f, -92.203873f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 129.876404f, 21.091311f, -90.715469f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 131.574371f, 21.091311f, -89.323868f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 133.556717f, 21.091311f, -89.280518f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 135.214310f, 21.091311f, -90.026199f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 134.829590f, 21.091311f, -95.155716f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 132.649551f, 21.091311f, -94.450424f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 130.914764f, 21.091311f, -95.135239f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 129.543335f, 21.091311f, -96.915436f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 128.513855f, 21.091307f, -99.379562f, -0.000005f, 1.000000f, -0.000004f, 0.000000f, 255.000000f }, -{ 127.804985f, 21.091307f, -102.116196f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 127.395340f, 21.091309f, -104.713913f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 127.263535f, 21.091320f, -118.046234f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 155.668289f, 21.091312f, -112.788467f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 155.668289f, 21.091312f, -116.571503f, 0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 154.127060f, 21.091320f, -117.804016f, 0.000001f, 1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 152.305023f, 21.091320f, -118.637558f, 0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 150.903000f, 21.091320f, -118.586197f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 149.472794f, 21.091320f, -117.781738f, 0.000003f, 1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 148.448669f, 21.091320f, -116.186478f, 0.000012f, 1.000000f, 0.000005f, 0.000000f, 255.000000f }, -{ 148.102249f, 21.091320f, -115.096756f, 0.000003f, 1.000000f, 0.000003f, 0.000000f, 255.000000f }, -{ 146.276031f, 21.091320f, -117.172318f, 0.000001f, 1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 142.652115f, 21.091320f, -118.815659f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 139.866501f, 21.091320f, -117.808762f, -0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 137.850311f, 21.091320f, -115.206009f, 0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 137.073761f, 21.091320f, -111.634323f, 0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 138.144791f, 21.091309f, -107.571091f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 141.623840f, 21.091307f, -104.049286f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 144.391052f, 21.091307f, -102.166382f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.909882f, 21.091307f, -100.028778f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.909882f, 21.091311f, -97.335770f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.180527f, 21.091311f, -94.538589f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 145.869064f, 21.091311f, -93.718689f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 143.898575f, 21.091311f, -93.732040f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 141.682312f, 21.091311f, -94.706894f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 137.779068f, 21.091307f, -98.297562f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 137.779068f, 21.091311f, -92.526840f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 141.658264f, 21.091311f, -89.665527f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 144.054428f, 21.091311f, -88.951309f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.152328f, 21.091311f, -89.072128f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 150.474655f, 21.091311f, -90.715469f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 152.600082f, 21.091311f, -94.111420f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 152.911179f, 21.091311f, -96.502228f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 152.932556f, 21.091312f, -113.100754f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 153.103531f, 21.091312f, -113.846436f, 0.000002f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 153.680603f, 21.091312f, -114.199097f, 0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 154.124680f, 21.091312f, -114.032852f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 154.796753f, 21.091312f, -113.553146f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.909882f, 21.091312f, -110.800781f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 147.909882f, 21.091307f, -103.491211f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 146.048050f, 21.091309f, -104.727585f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 144.556686f, 21.091309f, -105.944351f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 143.421539f, 21.091309f, -107.154007f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 142.628372f, 21.091309f, -108.369003f, 0.000003f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 142.162918f, 21.091312f, -109.601822f, 0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 142.010925f, 21.091312f, -110.864899f, 0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 142.329147f, 21.091312f, -112.550995f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 143.188812f, 21.091320f, -113.667130f, -0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 144.447449f, 21.091320f, -114.070847f, 0.000002f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 145.715591f, 21.091312f, -113.693268f, 0.000000f, 1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 146.898224f, 21.091312f, -112.588989f, -0.000002f, 1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 147.430771f, 21.091312f, -111.777710f, 0.000004f, 1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 173.749878f, 21.091312f, -112.467880f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.749878f, 21.091312f, -117.276810f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 172.085159f, 21.091312f, -118.160233f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 168.812698f, 21.091312f, -118.815659f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 166.009262f, 21.091312f, -118.315475f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 163.547806f, 21.091312f, -116.887344f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 161.503128f, 21.091312f, -114.639908f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 159.950012f, 21.091312f, -111.681839f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 158.963303f, 21.091309f, -108.121750f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 158.617767f, 21.091307f, -104.068283f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 159.531387f, 21.091311f, -96.903564f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 163.822617f, 21.091311f, -90.542206f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 169.115997f, 21.091311f, -88.872055f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.301041f, 21.091311f, -89.897964f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.301041f, 21.091311f, -95.027481f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 169.582138f, 21.091311f, -93.616867f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 166.473557f, 21.091311f, -94.882629f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 164.462112f, 21.091307f, -98.442429f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 163.747299f, 21.091307f, -103.940048f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 164.523849f, 21.091312f, -109.302292f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 166.711029f, 21.091312f, -112.812210f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 171.313354f, 21.091312f, -113.911743f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 188.369019f, 21.091312f, -113.301422f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 188.369019f, 21.091312f, -117.725632f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 186.637802f, 21.091312f, -118.378708f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 184.602036f, 21.091312f, -118.792801f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 182.419891f, 21.091312f, -118.666061f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 181.128311f, 21.091312f, -118.195847f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 180.089645f, 21.091312f, -117.372986f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 179.323486f, 21.091312f, -116.165421f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 178.849426f, 21.091312f, -114.541061f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 178.687042f, 21.091312f, -112.467880f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 178.687042f, 21.091311f, -94.001587f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 175.416977f, 21.091311f, -94.001587f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 178.200211f, 21.091311f, -89.945450f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 180.755478f, 21.091311f, -86.238419f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.239502f, 21.091309f, -82.331909f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.688324f, 21.091309f, -82.331909f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.688324f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 188.369019f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 188.369019f, 21.091311f, -94.001587f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.688324f, 21.091311f, -94.001587f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.847443f, 21.091312f, -112.446503f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 184.081055f, 21.091312f, -113.181198f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 184.972198f, 21.091312f, -113.977341f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 186.488205f, 21.091312f, -113.985367f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 192.280289f, 21.091312f, -118.046234f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 192.280289f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 197.281570f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 197.281570f, 21.091312f, -118.046234f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 209.400085f, 21.091312f, -118.687424f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 200.872238f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 205.873535f, 21.091311f, -89.641495f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 210.041275f, 21.091309f, -105.863617f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 210.169510f, 21.091309f, -105.863617f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 214.337250f, 21.091311f, -89.641495f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 219.338531f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 210.810699f, 21.091312f, -118.687424f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 196.095139f, 9.401914f, -83.842834f, 0.000000f, -1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 197.530334f, 9.401917f, -82.099869f, 0.000000f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 197.312714f, 9.401917f, -79.852554f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 195.569748f, 9.401917f, -78.417358f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 193.322433f, 9.401917f, -78.634979f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 191.887238f, 9.401917f, -80.377945f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 192.104858f, 9.401917f, -82.625259f, 0.000000f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 193.847824f, 9.401914f, -84.060455f, 0.000000f, -1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 196.095139f, 21.005835f, -83.842834f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 197.530334f, 21.005833f, -82.099869f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 197.312714f, 21.005833f, -79.852554f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 195.569748f, 21.005836f, -78.417358f, 0.000000f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 193.322433f, 21.005836f, -78.634979f, 0.000000f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 191.887238f, 21.005833f, -80.377945f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 192.104858f, 21.005835f, -82.625259f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 193.847824f, 21.005835f, -84.060455f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 194.708786f, 21.005833f, -81.238907f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 194.708786f, 9.401917f, -81.238907f, 0.000000f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 57.212021f, 9.401914f, -83.842834f, 0.000000f, -1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 58.647217f, 9.401917f, -82.099869f, 0.000000f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 58.429596f, 9.401917f, -79.852554f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 56.686630f, 9.401917f, -78.417358f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 54.439316f, 9.401917f, -78.634979f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.004120f, 9.401917f, -80.377945f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.221741f, 9.401917f, -82.625259f, 0.000000f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 54.964706f, 9.401914f, -84.060455f, 0.000000f, -1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 57.212021f, 21.005835f, -83.842834f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 58.647217f, 21.005833f, -82.099869f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 58.429596f, 21.005833f, -79.852554f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 56.686630f, 21.005836f, -78.417358f, 0.000000f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 54.439316f, 21.005836f, -78.634979f, 0.000000f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 53.004120f, 21.005833f, -80.377945f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 53.221741f, 21.005835f, -82.625259f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 54.964706f, 21.005835f, -84.060455f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 55.825668f, 21.005833f, -81.238907f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 55.825668f, 9.401917f, -81.238907f, 0.000000f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 98.582520f, 9.484123f, -113.301437f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 98.582520f, 9.484123f, -117.725662f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 95.979660f, 9.484123f, -118.792831f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 92.633392f, 9.484123f, -118.666077f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 90.303146f, 9.484123f, -117.373001f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 89.062927f, 9.484123f, -114.541092f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 88.900543f, 9.484123f, -112.467911f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 88.900543f, 9.484118f, -94.001602f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 85.630478f, 9.484118f, -94.001602f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 88.413712f, 9.484118f, -89.945480f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 90.968979f, 9.484117f, -86.238449f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 93.453003f, 9.484117f, -82.331924f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 93.901825f, 9.484117f, -82.331924f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 93.901825f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 98.582520f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 98.582520f, 9.484118f, -94.001602f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 93.901825f, 9.484118f, -94.001602f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 94.060944f, 9.484123f, -112.446518f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 95.185699f, 9.484123f, -113.977371f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 96.701706f, 9.484123f, -113.985397f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 98.582520f, 21.091312f, -113.301422f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 98.582520f, 21.091312f, -117.725632f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 95.979660f, 21.091312f, -118.792801f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 92.633392f, 21.091312f, -118.666061f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 90.303146f, 21.091312f, -117.372986f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 89.062927f, 21.091312f, -114.541061f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 88.900543f, 21.091312f, -112.467880f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 88.900543f, 21.091311f, -94.001587f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 85.630478f, 21.091311f, -94.001587f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 88.413712f, 21.091311f, -89.945450f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 90.968979f, 21.091311f, -86.238419f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 93.453003f, 21.091309f, -82.331909f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 93.901825f, 21.091309f, -82.331909f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 93.901825f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 98.582520f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 98.582520f, 21.091311f, -94.001587f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 93.901825f, 21.091311f, -94.001587f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 94.047279f, 21.091312f, -112.455856f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 95.185699f, 21.091312f, -113.977341f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 96.701706f, 21.091312f, -113.985367f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 236.900940f, 9.484123f, -111.377884f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 236.900940f, 9.484123f, -116.315048f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 233.106049f, 9.484123f, -118.552078f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 228.432480f, 9.484123f, -118.394455f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 224.397736f, 9.484123f, -115.040680f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 223.067856f, 9.484123f, -112.118805f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 222.243805f, 9.484118f, -108.374069f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 221.961212f, 9.484118f, -103.811813f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 222.198090f, 9.484118f, -99.454697f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 222.894501f, 9.484118f, -95.777939f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 224.029053f, 9.484106f, -92.831436f, 0.000002f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 225.580368f, 9.484118f, -90.665039f, -0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 228.791931f, 9.484118f, -88.927658f, 0.000000f, -1.000000f, 0.000003f, 0.000000f, 255.000000f }, -{ 232.490982f, 9.484118f, -89.470520f, 0.000001f, -1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 234.407425f, 9.484118f, -91.009384f, 0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 235.810913f, 9.484106f, -93.103928f, -0.000002f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 237.245300f, 9.484118f, -99.154877f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 237.478027f, 9.484118f, -104.965958f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 226.962494f, 9.484118f, -104.965958f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 227.534821f, 9.484123f, -110.009995f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 229.232788f, 9.484123f, -113.130463f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 232.027893f, 9.484123f, -114.199112f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 234.632736f, 9.484123f, -113.485794f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 226.898376f, 9.484118f, -101.247055f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 232.476730f, 9.484118f, -101.247055f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 232.170380f, 9.484118f, -96.746857f, -0.000001f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 231.222839f, 9.484118f, -94.098984f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 229.591370f, 9.484106f, -93.232178f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 228.066772f, 9.484118f, -94.113220f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 227.183350f, 9.484118f, -96.775345f, 0.000001f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 236.900940f, 21.091320f, -111.377853f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 236.900940f, 21.091320f, -116.315018f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 233.106049f, 21.091320f, -118.552063f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 228.432480f, 21.091320f, -118.394440f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 224.397736f, 21.091320f, -115.040665f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 223.067856f, 21.091320f, -112.118790f, -0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 222.243805f, 21.091312f, -108.374054f, -0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 221.961212f, 21.091311f, -103.811798f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 222.198090f, 21.091307f, -99.454666f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 222.894501f, 21.091311f, -95.777908f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 224.029053f, 21.091311f, -92.831406f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 225.580368f, 21.091311f, -90.665024f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 228.791931f, 21.091311f, -88.927628f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 232.490982f, 21.091311f, -89.470505f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 234.407425f, 21.091311f, -91.009354f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 235.810913f, 21.091311f, -93.103912f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 237.245300f, 21.091307f, -99.154861f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 237.478027f, 21.091309f, -104.965942f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 226.962494f, 21.091312f, -104.965942f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 227.534821f, 21.091320f, -110.009979f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 229.232788f, 21.091320f, -113.130447f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 232.027893f, 21.091320f, -114.199097f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 234.632736f, 21.091320f, -113.485764f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 226.898376f, 21.091307f, -101.247040f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 232.476730f, 21.091307f, -101.247040f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 232.170380f, 21.091311f, -96.746841f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 231.222839f, 21.091311f, -94.098953f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 229.591370f, 21.091311f, -93.232162f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 228.066772f, 21.091311f, -94.113205f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 227.183350f, 21.091311f, -96.775330f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f } -}; - -static Face face_1[] = { -{ { 1, 2, 350 }, 0, 4 }, -{ { 1, 350, 349 }, 0, 3 }, -{ { 2, 3, 351 }, 0, 4 }, -{ { 2, 351, 350 }, 0, 2 }, -{ { 3, 4, 352 }, 0, 4 }, -{ { 3, 352, 351 }, 0, 2 }, -{ { 4, 5, 353 }, 0, 4 }, -{ { 4, 353, 352 }, 0, 2 }, -{ { 5, 6, 354 }, 0, 4 }, -{ { 5, 354, 353 }, 0, 2 }, -{ { 6, 7, 355 }, 0, 4 }, -{ { 6, 355, 354 }, 0, 2 }, -{ { 7, 8, 356 }, 0, 4 }, -{ { 7, 356, 355 }, 0, 2 }, -{ { 8, 9, 357 }, 0, 4 }, -{ { 8, 357, 356 }, 0, 2 }, -{ { 9, 10, 358 }, 0, 4 }, -{ { 9, 358, 357 }, 0, 2 }, -{ { 10, 11, 359 }, 0, 4 }, -{ { 10, 359, 358 }, 0, 2 }, -{ { 11, 12, 360 }, 0, 4 }, -{ { 11, 360, 359 }, 0, 2 }, -{ { 12, 13, 361 }, 0, 4 }, -{ { 12, 361, 360 }, 0, 2 }, -{ { 13, 14, 362 }, 0, 4 }, -{ { 13, 362, 361 }, 0, 2 }, -{ { 14, 15, 363 }, 0, 4 }, -{ { 14, 363, 362 }, 0, 2 }, -{ { 15, 16, 364 }, 0, 4 }, -{ { 15, 364, 363 }, 0, 2 }, -{ { 16, 17, 365 }, 0, 4 }, -{ { 16, 365, 364 }, 0, 2 }, -{ { 17, 18, 366 }, 0, 4 }, -{ { 17, 366, 365 }, 0, 2 }, -{ { 18, 19, 367 }, 0, 6 }, -{ { 18, 367, 366 }, 0, 2 }, -{ { 20, 21, 369 }, 0, 4 }, -{ { 20, 369, 368 }, 0, 3 }, -{ { 21, 22, 370 }, 0, 4 }, -{ { 21, 370, 369 }, 0, 2 }, -{ { 22, 23, 371 }, 0, 4 }, -{ { 22, 371, 370 }, 0, 2 }, -{ { 23, 24, 372 }, 0, 4 }, -{ { 23, 372, 371 }, 0, 2 }, -{ { 24, 25, 373 }, 0, 4 }, -{ { 24, 373, 372 }, 0, 2 }, -{ { 25, 26, 374 }, 0, 4 }, -{ { 25, 374, 373 }, 0, 2 }, -{ { 26, 27, 375 }, 0, 4 }, -{ { 26, 375, 374 }, 0, 2 }, -{ { 27, 28, 376 }, 0, 4 }, -{ { 27, 376, 375 }, 0, 2 }, -{ { 28, 29, 377 }, 0, 4 }, -{ { 28, 377, 376 }, 0, 2 }, -{ { 29, 30, 378 }, 0, 4 }, -{ { 29, 378, 377 }, 0, 2 }, -{ { 30, 31, 379 }, 0, 4 }, -{ { 30, 379, 378 }, 0, 2 }, -{ { 31, 32, 380 }, 0, 4 }, -{ { 31, 380, 379 }, 0, 2 }, -{ { 32, 33, 381 }, 0, 4 }, -{ { 32, 381, 380 }, 0, 2 }, -{ { 33, 34, 382 }, 0, 4 }, -{ { 33, 382, 381 }, 0, 2 }, -{ { 34, 35, 383 }, 0, 4 }, -{ { 34, 383, 382 }, 0, 2 }, -{ { 35, 36, 384 }, 0, 4 }, -{ { 35, 384, 383 }, 0, 2 }, -{ { 36, 37, 385 }, 0, 4 }, -{ { 36, 385, 384 }, 0, 2 }, -{ { 37, 38, 386 }, 0, 4 }, -{ { 37, 386, 385 }, 0, 2 }, -{ { 38, 39, 387 }, 0, 4 }, -{ { 38, 387, 386 }, 0, 2 }, -{ { 39, 40, 388 }, 0, 4 }, -{ { 39, 388, 387 }, 0, 2 }, -{ { 40, 41, 389 }, 0, 4 }, -{ { 40, 389, 388 }, 0, 2 }, -{ { 41, 42, 390 }, 0, 4 }, -{ { 41, 390, 389 }, 0, 2 }, -{ { 42, 43, 391 }, 0, 4 }, -{ { 42, 391, 390 }, 0, 2 }, -{ { 43, 44, 392 }, 0, 4 }, -{ { 43, 392, 391 }, 0, 2 }, -{ { 44, 45, 393 }, 0, 4 }, -{ { 44, 393, 392 }, 0, 2 }, -{ { 45, 46, 394 }, 0, 4 }, -{ { 45, 394, 393 }, 0, 2 }, -{ { 46, 47, 395 }, 0, 4 }, -{ { 46, 395, 394 }, 0, 2 }, -{ { 47, 48, 396 }, 0, 4 }, -{ { 47, 396, 395 }, 0, 2 }, -{ { 48, 49, 397 }, 0, 4 }, -{ { 48, 397, 396 }, 0, 2 }, -{ { 49, 50, 398 }, 0, 4 }, -{ { 49, 398, 397 }, 0, 2 }, -{ { 50, 51, 399 }, 0, 4 }, -{ { 50, 399, 398 }, 0, 2 }, -{ { 51, 52, 400 }, 0, 4 }, -{ { 51, 400, 399 }, 0, 2 }, -{ { 52, 53, 401 }, 0, 4 }, -{ { 52, 401, 400 }, 0, 2 }, -{ { 53, 54, 402 }, 0, 4 }, -{ { 53, 402, 401 }, 0, 2 }, -{ { 54, 55, 403 }, 0, 4 }, -{ { 54, 403, 402 }, 0, 2 }, -{ { 55, 56, 404 }, 0, 6 }, -{ { 55, 404, 403 }, 0, 2 }, -{ { 57, 58, 406 }, 0, 4 }, -{ { 57, 406, 405 }, 0, 3 }, -{ { 58, 59, 407 }, 0, 4 }, -{ { 58, 407, 406 }, 0, 2 }, -{ { 59, 60, 408 }, 0, 4 }, -{ { 59, 408, 407 }, 0, 2 }, -{ { 60, 61, 409 }, 0, 4 }, -{ { 60, 409, 408 }, 0, 2 }, -{ { 61, 62, 410 }, 0, 4 }, -{ { 61, 410, 409 }, 0, 2 }, -{ { 62, 63, 411 }, 0, 4 }, -{ { 62, 411, 410 }, 0, 2 }, -{ { 63, 64, 412 }, 0, 4 }, -{ { 63, 412, 411 }, 0, 2 }, -{ { 64, 65, 413 }, 0, 4 }, -{ { 64, 413, 412 }, 0, 2 }, -{ { 65, 66, 414 }, 0, 4 }, -{ { 65, 414, 413 }, 0, 2 }, -{ { 66, 67, 415 }, 0, 4 }, -{ { 66, 415, 414 }, 0, 2 }, -{ { 67, 68, 416 }, 0, 4 }, -{ { 67, 416, 415 }, 0, 2 }, -{ { 68, 69, 417 }, 0, 4 }, -{ { 68, 417, 416 }, 0, 2 }, -{ { 69, 70, 418 }, 0, 4 }, -{ { 69, 418, 417 }, 0, 2 }, -{ { 70, 71, 419 }, 0, 4 }, -{ { 70, 419, 418 }, 0, 2 }, -{ { 71, 72, 420 }, 0, 4 }, -{ { 71, 420, 419 }, 0, 2 }, -{ { 72, 73, 421 }, 0, 4 }, -{ { 72, 421, 420 }, 0, 2 }, -{ { 73, 74, 422 }, 0, 4 }, -{ { 73, 422, 421 }, 0, 2 }, -{ { 74, 0, 348 }, 0, 6 }, -{ { 74, 348, 422 }, 0, 2 }, -{ { 75, 76, 424 }, 0, 4 }, -{ { 75, 424, 423 }, 0, 3 }, -{ { 76, 77, 425 }, 0, 4 }, -{ { 76, 425, 424 }, 0, 2 }, -{ { 77, 78, 426 }, 0, 4 }, -{ { 77, 426, 425 }, 0, 2 }, -{ { 78, 79, 427 }, 0, 4 }, -{ { 78, 427, 426 }, 0, 2 }, -{ { 79, 80, 428 }, 0, 4 }, -{ { 79, 428, 427 }, 0, 2 }, -{ { 80, 81, 429 }, 0, 4 }, -{ { 80, 429, 428 }, 0, 2 }, -{ { 81, 82, 430 }, 0, 4 }, -{ { 81, 430, 429 }, 0, 2 }, -{ { 82, 83, 431 }, 0, 4 }, -{ { 82, 431, 430 }, 0, 2 }, -{ { 83, 84, 432 }, 0, 4 }, -{ { 83, 432, 431 }, 0, 2 }, -{ { 84, 85, 433 }, 0, 4 }, -{ { 84, 433, 432 }, 0, 2 }, -{ { 85, 86, 434 }, 0, 4 }, -{ { 85, 434, 433 }, 0, 2 }, -{ { 86, 87, 435 }, 0, 4 }, -{ { 86, 435, 434 }, 0, 2 }, -{ { 87, 88, 436 }, 0, 4 }, -{ { 87, 436, 435 }, 0, 2 }, -{ { 88, 89, 437 }, 0, 6 }, -{ { 88, 437, 436 }, 0, 2 }, -{ { 90, 91, 439 }, 0, 4 }, -{ { 90, 439, 438 }, 0, 2 }, -{ { 91, 92, 440 }, 0, 4 }, -{ { 91, 440, 439 }, 0, 2 }, -{ { 92, 93, 441 }, 0, 4 }, -{ { 92, 441, 440 }, 0, 2 }, -{ { 93, 94, 442 }, 0, 4 }, -{ { 93, 442, 441 }, 0, 2 }, -{ { 94, 95, 443 }, 0, 4 }, -{ { 94, 443, 442 }, 0, 2 }, -{ { 95, 96, 444 }, 0, 4 }, -{ { 95, 444, 443 }, 0, 2 }, -{ { 96, 97, 445 }, 0, 4 }, -{ { 96, 445, 444 }, 0, 2 }, -{ { 97, 98, 446 }, 0, 4 }, -{ { 97, 446, 445 }, 0, 2 }, -{ { 98, 99, 447 }, 0, 4 }, -{ { 98, 447, 446 }, 0, 2 }, -{ { 99, 100, 448 }, 0, 4 }, -{ { 99, 448, 447 }, 0, 2 }, -{ { 100, 101, 449 }, 0, 4 }, -{ { 100, 449, 448 }, 0, 2 }, -{ { 101, 102, 450 }, 0, 4 }, -{ { 101, 450, 449 }, 0, 2 }, -{ { 102, 103, 451 }, 0, 4 }, -{ { 102, 451, 450 }, 0, 2 }, -{ { 103, 104, 452 }, 0, 4 }, -{ { 103, 452, 451 }, 0, 2 }, -{ { 104, 90, 438 }, 0, 4 }, -{ { 104, 438, 452 }, 0, 2 }, -{ { 106, 107, 455 }, 1, 6 }, -{ { 106, 455, 454 }, 1, 3 }, -{ { 108, 109, 457 }, 1, 4 }, -{ { 108, 457, 456 }, 1, 3 }, -{ { 109, 110, 458 }, 1, 4 }, -{ { 109, 458, 457 }, 1, 2 }, -{ { 110, 111, 459 }, 1, 4 }, -{ { 110, 459, 458 }, 1, 2 }, -{ { 111, 112, 460 }, 1, 4 }, -{ { 111, 460, 459 }, 1, 2 }, -{ { 112, 113, 461 }, 1, 4 }, -{ { 112, 461, 460 }, 1, 2 }, -{ { 113, 114, 462 }, 1, 4 }, -{ { 113, 462, 461 }, 1, 2 }, -{ { 114, 115, 463 }, 1, 4 }, -{ { 114, 463, 462 }, 1, 2 }, -{ { 115, 116, 464 }, 1, 4 }, -{ { 115, 464, 463 }, 1, 2 }, -{ { 116, 117, 465 }, 1, 4 }, -{ { 116, 465, 464 }, 1, 2 }, -{ { 117, 118, 466 }, 1, 4 }, -{ { 117, 466, 465 }, 1, 2 }, -{ { 118, 119, 467 }, 1, 4 }, -{ { 118, 467, 466 }, 1, 2 }, -{ { 119, 120, 468 }, 1, 4 }, -{ { 119, 468, 467 }, 1, 2 }, -{ { 120, 121, 469 }, 1, 4 }, -{ { 120, 469, 468 }, 1, 2 }, -{ { 121, 122, 470 }, 1, 4 }, -{ { 121, 470, 469 }, 1, 2 }, -{ { 122, 123, 471 }, 1, 4 }, -{ { 122, 471, 470 }, 1, 2 }, -{ { 123, 124, 472 }, 1, 4 }, -{ { 123, 472, 471 }, 1, 2 }, -{ { 124, 125, 473 }, 1, 4 }, -{ { 124, 473, 472 }, 1, 2 }, -{ { 125, 126, 474 }, 1, 4 }, -{ { 125, 474, 473 }, 1, 2 }, -{ { 126, 127, 475 }, 1, 4 }, -{ { 126, 475, 474 }, 1, 2 }, -{ { 127, 128, 476 }, 1, 4 }, -{ { 127, 476, 475 }, 1, 2 }, -{ { 128, 129, 477 }, 1, 4 }, -{ { 128, 477, 476 }, 1, 2 }, -{ { 129, 130, 478 }, 1, 4 }, -{ { 129, 478, 477 }, 1, 2 }, -{ { 130, 131, 479 }, 1, 4 }, -{ { 130, 479, 478 }, 1, 2 }, -{ { 131, 132, 480 }, 1, 4 }, -{ { 131, 480, 479 }, 1, 2 }, -{ { 132, 133, 481 }, 1, 4 }, -{ { 132, 481, 480 }, 1, 2 }, -{ { 133, 134, 482 }, 1, 4 }, -{ { 133, 482, 481 }, 1, 2 }, -{ { 134, 135, 483 }, 1, 4 }, -{ { 134, 483, 482 }, 1, 2 }, -{ { 135, 136, 484 }, 1, 4 }, -{ { 135, 484, 483 }, 1, 2 }, -{ { 136, 137, 485 }, 1, 6 }, -{ { 136, 485, 484 }, 1, 2 }, -{ { 138, 139, 487 }, 1, 6 }, -{ { 138, 487, 486 }, 1, 3 }, -{ { 140, 105, 453 }, 1, 6 }, -{ { 140, 453, 488 }, 1, 3 }, -{ { 141, 142, 490 }, 1, 4 }, -{ { 141, 490, 489 }, 1, 2 }, -{ { 142, 143, 491 }, 1, 4 }, -{ { 142, 491, 490 }, 1, 2 }, -{ { 143, 144, 492 }, 1, 4 }, -{ { 143, 492, 491 }, 1, 2 }, -{ { 144, 145, 493 }, 1, 4 }, -{ { 144, 493, 492 }, 1, 2 }, -{ { 145, 146, 494 }, 1, 4 }, -{ { 145, 494, 493 }, 1, 2 }, -{ { 146, 147, 495 }, 1, 4 }, -{ { 146, 495, 494 }, 1, 2 }, -{ { 147, 148, 496 }, 1, 4 }, -{ { 147, 496, 495 }, 1, 2 }, -{ { 148, 149, 497 }, 1, 4 }, -{ { 148, 497, 496 }, 1, 2 }, -{ { 149, 150, 498 }, 1, 4 }, -{ { 149, 498, 497 }, 1, 2 }, -{ { 150, 151, 499 }, 1, 4 }, -{ { 150, 499, 498 }, 1, 2 }, -{ { 151, 152, 500 }, 1, 4 }, -{ { 151, 500, 499 }, 1, 2 }, -{ { 152, 141, 489 }, 1, 4 }, -{ { 152, 489, 500 }, 1, 2 }, -{ { 153, 154, 502 }, 1, 4 }, -{ { 153, 502, 501 }, 1, 2 }, -{ { 154, 155, 503 }, 1, 4 }, -{ { 154, 503, 502 }, 1, 2 }, -{ { 155, 156, 504 }, 1, 4 }, -{ { 155, 504, 503 }, 1, 2 }, -{ { 156, 157, 505 }, 1, 4 }, -{ { 156, 505, 504 }, 1, 2 }, -{ { 157, 158, 506 }, 1, 4 }, -{ { 157, 506, 505 }, 1, 2 }, -{ { 158, 159, 507 }, 1, 4 }, -{ { 158, 507, 506 }, 1, 2 }, -{ { 159, 160, 508 }, 1, 4 }, -{ { 159, 508, 507 }, 1, 2 }, -{ { 160, 153, 501 }, 1, 4 }, -{ { 160, 501, 508 }, 1, 2 }, -{ { 161, 162, 510 }, 1, 4 }, -{ { 161, 510, 509 }, 1, 2 }, -{ { 162, 163, 511 }, 1, 4 }, -{ { 162, 511, 510 }, 1, 2 }, -{ { 163, 164, 512 }, 1, 4 }, -{ { 163, 512, 511 }, 1, 2 }, -{ { 164, 165, 513 }, 1, 4 }, -{ { 164, 513, 512 }, 1, 2 }, -{ { 165, 166, 514 }, 1, 4 }, -{ { 165, 514, 513 }, 1, 2 }, -{ { 166, 167, 515 }, 1, 4 }, -{ { 166, 515, 514 }, 1, 2 }, -{ { 167, 168, 516 }, 1, 4 }, -{ { 167, 516, 515 }, 1, 2 }, -{ { 168, 169, 517 }, 1, 4 }, -{ { 168, 517, 516 }, 1, 2 }, -{ { 169, 170, 518 }, 1, 4 }, -{ { 169, 518, 517 }, 1, 2 }, -{ { 170, 161, 509 }, 1, 4 }, -{ { 170, 509, 518 }, 1, 2 }, -{ { 171, 172, 520 }, 1, 4 }, -{ { 171, 520, 519 }, 1, 2 }, -{ { 172, 173, 521 }, 1, 4 }, -{ { 172, 521, 520 }, 1, 2 }, -{ { 173, 174, 522 }, 1, 4 }, -{ { 173, 522, 521 }, 1, 2 }, -{ { 174, 171, 519 }, 1, 4 }, -{ { 174, 519, 522 }, 1, 2 }, -{ { 175, 176, 524 }, 1, 4 }, -{ { 175, 524, 523 }, 1, 2 }, -{ { 176, 177, 525 }, 1, 4 }, -{ { 176, 525, 524 }, 1, 2 }, -{ { 177, 178, 526 }, 1, 4 }, -{ { 177, 526, 525 }, 1, 2 }, -{ { 178, 179, 527 }, 1, 4 }, -{ { 178, 527, 526 }, 1, 2 }, -{ { 179, 180, 528 }, 1, 4 }, -{ { 179, 528, 527 }, 1, 2 }, -{ { 180, 181, 529 }, 1, 4 }, -{ { 180, 529, 528 }, 1, 2 }, -{ { 181, 182, 530 }, 1, 4 }, -{ { 181, 530, 529 }, 1, 2 }, -{ { 182, 183, 531 }, 1, 4 }, -{ { 182, 531, 530 }, 1, 2 }, -{ { 183, 184, 532 }, 1, 4 }, -{ { 183, 532, 531 }, 1, 2 }, -{ { 184, 185, 533 }, 1, 4 }, -{ { 184, 533, 532 }, 1, 2 }, -{ { 185, 186, 534 }, 1, 4 }, -{ { 185, 534, 533 }, 1, 2 }, -{ { 186, 187, 535 }, 1, 4 }, -{ { 186, 535, 534 }, 1, 2 }, -{ { 187, 188, 536 }, 1, 4 }, -{ { 187, 536, 535 }, 1, 2 }, -{ { 188, 189, 537 }, 1, 4 }, -{ { 188, 537, 536 }, 1, 2 }, -{ { 189, 190, 538 }, 1, 4 }, -{ { 189, 538, 537 }, 1, 2 }, -{ { 190, 191, 539 }, 1, 4 }, -{ { 190, 539, 538 }, 1, 2 }, -{ { 191, 192, 540 }, 1, 4 }, -{ { 191, 540, 539 }, 1, 2 }, -{ { 192, 193, 541 }, 1, 4 }, -{ { 192, 541, 540 }, 1, 2 }, -{ { 193, 175, 523 }, 1, 4 }, -{ { 193, 523, 541 }, 1, 2 }, -{ { 194, 195, 543 }, 1, 4 }, -{ { 194, 543, 542 }, 1, 2 }, -{ { 195, 196, 544 }, 1, 4 }, -{ { 195, 544, 543 }, 1, 2 }, -{ { 196, 197, 545 }, 1, 4 }, -{ { 196, 545, 544 }, 1, 2 }, -{ { 197, 198, 546 }, 1, 4 }, -{ { 197, 546, 545 }, 1, 2 }, -{ { 198, 199, 547 }, 1, 4 }, -{ { 198, 547, 546 }, 1, 2 }, -{ { 199, 200, 548 }, 1, 4 }, -{ { 199, 548, 547 }, 1, 2 }, -{ { 200, 201, 549 }, 1, 4 }, -{ { 200, 549, 548 }, 1, 2 }, -{ { 201, 202, 550 }, 1, 4 }, -{ { 201, 550, 549 }, 1, 2 }, -{ { 202, 203, 551 }, 1, 4 }, -{ { 202, 551, 550 }, 1, 2 }, -{ { 203, 204, 552 }, 1, 4 }, -{ { 203, 552, 551 }, 1, 2 }, -{ { 204, 205, 553 }, 1, 4 }, -{ { 204, 553, 552 }, 1, 2 }, -{ { 205, 206, 554 }, 1, 4 }, -{ { 205, 554, 553 }, 1, 2 }, -{ { 206, 207, 555 }, 1, 4 }, -{ { 206, 555, 554 }, 1, 2 }, -{ { 207, 208, 556 }, 1, 4 }, -{ { 207, 556, 555 }, 1, 2 }, -{ { 208, 209, 557 }, 1, 4 }, -{ { 208, 557, 556 }, 1, 2 }, -{ { 209, 210, 558 }, 1, 4 }, -{ { 209, 558, 557 }, 1, 2 }, -{ { 210, 211, 559 }, 1, 4 }, -{ { 210, 559, 558 }, 1, 2 }, -{ { 211, 212, 560 }, 1, 4 }, -{ { 211, 560, 559 }, 1, 2 }, -{ { 212, 213, 561 }, 1, 4 }, -{ { 212, 561, 560 }, 1, 2 }, -{ { 213, 214, 562 }, 1, 4 }, -{ { 213, 562, 561 }, 1, 2 }, -{ { 214, 215, 563 }, 1, 4 }, -{ { 214, 563, 562 }, 1, 2 }, -{ { 215, 216, 564 }, 1, 4 }, -{ { 215, 564, 563 }, 1, 2 }, -{ { 216, 194, 542 }, 1, 4 }, -{ { 216, 542, 564 }, 1, 2 }, -{ { 217, 218, 566 }, 1, 4 }, -{ { 217, 566, 565 }, 1, 2 }, -{ { 218, 219, 567 }, 1, 4 }, -{ { 218, 567, 566 }, 1, 2 }, -{ { 219, 220, 568 }, 1, 4 }, -{ { 219, 568, 567 }, 1, 2 }, -{ { 220, 221, 569 }, 1, 4 }, -{ { 220, 569, 568 }, 1, 2 }, -{ { 221, 222, 570 }, 1, 4 }, -{ { 221, 570, 569 }, 1, 2 }, -{ { 222, 223, 571 }, 1, 4 }, -{ { 222, 571, 570 }, 1, 2 }, -{ { 223, 217, 565 }, 1, 4 }, -{ { 223, 565, 571 }, 1, 2 }, -{ { 224, 225, 573 }, 1, 4 }, -{ { 224, 573, 572 }, 1, 2 }, -{ { 225, 226, 574 }, 1, 4 }, -{ { 225, 574, 573 }, 1, 2 }, -{ { 226, 227, 575 }, 1, 4 }, -{ { 226, 575, 574 }, 1, 2 }, -{ { 227, 228, 576 }, 1, 4 }, -{ { 227, 576, 575 }, 1, 2 }, -{ { 228, 229, 577 }, 1, 4 }, -{ { 228, 577, 576 }, 1, 2 }, -{ { 229, 230, 578 }, 1, 4 }, -{ { 229, 578, 577 }, 1, 2 }, -{ { 230, 231, 579 }, 1, 4 }, -{ { 230, 579, 578 }, 1, 2 }, -{ { 231, 232, 580 }, 1, 4 }, -{ { 231, 580, 579 }, 1, 2 }, -{ { 232, 233, 581 }, 1, 4 }, -{ { 232, 581, 580 }, 1, 2 }, -{ { 233, 234, 582 }, 1, 4 }, -{ { 233, 582, 581 }, 1, 2 }, -{ { 234, 235, 583 }, 1, 4 }, -{ { 234, 583, 582 }, 1, 2 }, -{ { 235, 236, 584 }, 1, 4 }, -{ { 235, 584, 583 }, 1, 2 }, -{ { 236, 237, 585 }, 1, 4 }, -{ { 236, 585, 584 }, 1, 2 }, -{ { 237, 238, 586 }, 1, 4 }, -{ { 237, 586, 585 }, 1, 2 }, -{ { 238, 239, 587 }, 1, 4 }, -{ { 238, 587, 586 }, 1, 2 }, -{ { 239, 240, 588 }, 1, 4 }, -{ { 239, 588, 587 }, 1, 2 }, -{ { 240, 241, 589 }, 1, 4 }, -{ { 240, 589, 588 }, 1, 2 }, -{ { 241, 224, 572 }, 1, 4 }, -{ { 241, 572, 589 }, 1, 2 }, -{ { 242, 243, 591 }, 1, 4 }, -{ { 242, 591, 590 }, 1, 2 }, -{ { 243, 244, 592 }, 1, 4 }, -{ { 243, 592, 591 }, 1, 2 }, -{ { 244, 245, 593 }, 1, 4 }, -{ { 244, 593, 592 }, 1, 2 }, -{ { 245, 246, 594 }, 1, 4 }, -{ { 245, 594, 593 }, 1, 2 }, -{ { 246, 247, 595 }, 1, 4 }, -{ { 246, 595, 594 }, 1, 2 }, -{ { 247, 248, 596 }, 1, 4 }, -{ { 247, 596, 595 }, 1, 2 }, -{ { 248, 249, 597 }, 1, 4 }, -{ { 248, 597, 596 }, 1, 2 }, -{ { 249, 250, 598 }, 1, 4 }, -{ { 249, 598, 597 }, 1, 2 }, -{ { 250, 251, 599 }, 1, 4 }, -{ { 250, 599, 598 }, 1, 2 }, -{ { 251, 252, 600 }, 1, 4 }, -{ { 251, 600, 599 }, 1, 2 }, -{ { 252, 253, 601 }, 1, 4 }, -{ { 252, 601, 600 }, 1, 2 }, -{ { 253, 254, 602 }, 1, 4 }, -{ { 253, 602, 601 }, 1, 2 }, -{ { 254, 255, 603 }, 1, 4 }, -{ { 254, 603, 602 }, 1, 2 }, -{ { 255, 256, 604 }, 1, 4 }, -{ { 255, 604, 603 }, 1, 2 }, -{ { 256, 257, 605 }, 1, 4 }, -{ { 256, 605, 604 }, 1, 2 }, -{ { 257, 258, 606 }, 1, 4 }, -{ { 257, 606, 605 }, 1, 2 }, -{ { 258, 259, 607 }, 1, 4 }, -{ { 258, 607, 606 }, 1, 2 }, -{ { 259, 260, 608 }, 1, 4 }, -{ { 259, 608, 607 }, 1, 2 }, -{ { 260, 261, 609 }, 1, 4 }, -{ { 260, 609, 608 }, 1, 2 }, -{ { 261, 262, 610 }, 1, 4 }, -{ { 261, 610, 609 }, 1, 2 }, -{ { 262, 263, 611 }, 1, 4 }, -{ { 262, 611, 610 }, 1, 2 }, -{ { 263, 264, 611 }, 1, 4 }, -{ { 264, 612, 611 }, 1, 2 }, -{ { 264, 265, 613 }, 1, 4 }, -{ { 264, 613, 612 }, 1, 2 }, -{ { 265, 266, 614 }, 1, 4 }, -{ { 265, 614, 613 }, 1, 2 }, -{ { 266, 267, 615 }, 1, 4 }, -{ { 266, 615, 614 }, 1, 2 }, -{ { 267, 268, 616 }, 1, 4 }, -{ { 267, 616, 615 }, 1, 2 }, -{ { 268, 269, 617 }, 1, 4 }, -{ { 268, 617, 616 }, 1, 2 }, -{ { 269, 270, 618 }, 1, 4 }, -{ { 269, 618, 617 }, 1, 2 }, -{ { 270, 271, 619 }, 1, 4 }, -{ { 270, 619, 618 }, 1, 2 }, -{ { 271, 272, 620 }, 1, 4 }, -{ { 271, 620, 619 }, 1, 2 }, -{ { 272, 273, 621 }, 1, 4 }, -{ { 272, 621, 620 }, 1, 2 }, -{ { 273, 274, 622 }, 1, 4 }, -{ { 273, 622, 621 }, 1, 2 }, -{ { 274, 275, 623 }, 1, 4 }, -{ { 274, 623, 622 }, 1, 2 }, -{ { 275, 276, 624 }, 1, 4 }, -{ { 275, 624, 623 }, 1, 2 }, -{ { 276, 242, 590 }, 1, 4 }, -{ { 276, 590, 624 }, 1, 2 }, -{ { 277, 278, 626 }, 1, 4 }, -{ { 277, 626, 625 }, 1, 2 }, -{ { 278, 279, 627 }, 1, 4 }, -{ { 278, 627, 626 }, 1, 2 }, -{ { 279, 280, 628 }, 1, 4 }, -{ { 279, 628, 627 }, 1, 2 }, -{ { 280, 281, 629 }, 1, 4 }, -{ { 280, 629, 628 }, 1, 2 }, -{ { 281, 630, 629 }, 1, 2 }, -{ { 281, 282, 631 }, 1, 4 }, -{ { 281, 631, 630 }, 1, 2 }, -{ { 282, 632, 631 }, 1, 2 }, -{ { 282, 283, 633 }, 1, 4 }, -{ { 282, 633, 632 }, 1, 2 }, -{ { 283, 284, 634 }, 1, 4 }, -{ { 283, 634, 633 }, 1, 2 }, -{ { 284, 285, 635 }, 1, 4 }, -{ { 284, 635, 634 }, 1, 2 }, -{ { 285, 286, 636 }, 1, 4 }, -{ { 285, 636, 635 }, 1, 2 }, -{ { 286, 287, 637 }, 1, 4 }, -{ { 286, 637, 636 }, 1, 2 }, -{ { 287, 288, 638 }, 1, 4 }, -{ { 287, 638, 637 }, 1, 2 }, -{ { 288, 277, 625 }, 1, 4 }, -{ { 288, 625, 638 }, 1, 2 }, -{ { 289, 290, 640 }, 1, 4 }, -{ { 289, 640, 639 }, 1, 2 }, -{ { 290, 291, 641 }, 1, 4 }, -{ { 290, 641, 640 }, 1, 2 }, -{ { 291, 292, 642 }, 1, 4 }, -{ { 291, 642, 641 }, 1, 2 }, -{ { 292, 293, 643 }, 1, 4 }, -{ { 292, 643, 642 }, 1, 2 }, -{ { 293, 294, 644 }, 1, 4 }, -{ { 293, 644, 643 }, 1, 2 }, -{ { 294, 295, 645 }, 1, 4 }, -{ { 294, 645, 644 }, 1, 2 }, -{ { 295, 296, 646 }, 1, 4 }, -{ { 295, 646, 645 }, 1, 2 }, -{ { 296, 297, 647 }, 1, 4 }, -{ { 296, 647, 646 }, 1, 2 }, -{ { 297, 298, 648 }, 1, 4 }, -{ { 297, 648, 647 }, 1, 2 }, -{ { 298, 299, 649 }, 1, 4 }, -{ { 298, 649, 648 }, 1, 2 }, -{ { 299, 300, 650 }, 1, 4 }, -{ { 299, 650, 649 }, 1, 2 }, -{ { 300, 301, 651 }, 1, 4 }, -{ { 300, 651, 650 }, 1, 2 }, -{ { 301, 302, 652 }, 1, 4 }, -{ { 301, 652, 651 }, 1, 2 }, -{ { 302, 303, 653 }, 1, 4 }, -{ { 302, 653, 652 }, 1, 2 }, -{ { 303, 304, 654 }, 1, 4 }, -{ { 303, 654, 653 }, 1, 2 }, -{ { 304, 305, 655 }, 1, 4 }, -{ { 304, 655, 654 }, 1, 2 }, -{ { 305, 306, 656 }, 1, 4 }, -{ { 305, 656, 655 }, 1, 2 }, -{ { 306, 307, 657 }, 1, 4 }, -{ { 306, 657, 656 }, 1, 2 }, -{ { 307, 308, 658 }, 1, 4 }, -{ { 307, 658, 657 }, 1, 2 }, -{ { 308, 309, 659 }, 1, 4 }, -{ { 308, 659, 658 }, 1, 2 }, -{ { 309, 310, 660 }, 1, 4 }, -{ { 309, 660, 659 }, 1, 2 }, -{ { 310, 289, 639 }, 1, 4 }, -{ { 310, 639, 660 }, 1, 2 }, -{ { 311, 312, 662 }, 1, 4 }, -{ { 311, 662, 661 }, 1, 2 }, -{ { 312, 313, 663 }, 1, 4 }, -{ { 312, 663, 662 }, 1, 2 }, -{ { 313, 314, 664 }, 1, 4 }, -{ { 313, 664, 663 }, 1, 2 }, -{ { 314, 315, 665 }, 1, 4 }, -{ { 314, 665, 664 }, 1, 2 }, -{ { 315, 316, 666 }, 1, 4 }, -{ { 315, 666, 665 }, 1, 2 }, -{ { 316, 317, 667 }, 1, 4 }, -{ { 316, 667, 666 }, 1, 2 }, -{ { 317, 318, 668 }, 1, 4 }, -{ { 317, 668, 667 }, 1, 2 }, -{ { 318, 319, 669 }, 1, 4 }, -{ { 318, 669, 668 }, 1, 2 }, -{ { 319, 320, 670 }, 1, 4 }, -{ { 319, 670, 669 }, 1, 2 }, -{ { 320, 321, 671 }, 1, 4 }, -{ { 320, 671, 670 }, 1, 2 }, -{ { 321, 322, 672 }, 1, 4 }, -{ { 321, 672, 671 }, 1, 2 }, -{ { 322, 323, 673 }, 1, 4 }, -{ { 322, 673, 672 }, 1, 2 }, -{ { 323, 324, 674 }, 1, 4 }, -{ { 323, 674, 673 }, 1, 2 }, -{ { 324, 325, 675 }, 1, 4 }, -{ { 324, 675, 674 }, 1, 2 }, -{ { 325, 326, 676 }, 1, 4 }, -{ { 325, 676, 675 }, 1, 2 }, -{ { 326, 327, 677 }, 1, 4 }, -{ { 326, 677, 676 }, 1, 2 }, -{ { 327, 328, 678 }, 1, 4 }, -{ { 327, 678, 677 }, 1, 2 }, -{ { 328, 329, 679 }, 1, 4 }, -{ { 328, 679, 678 }, 1, 2 }, -{ { 329, 330, 680 }, 1, 4 }, -{ { 329, 680, 679 }, 1, 2 }, -{ { 330, 331, 681 }, 1, 4 }, -{ { 330, 681, 680 }, 1, 2 }, -{ { 331, 332, 681 }, 1, 4 }, -{ { 332, 682, 681 }, 1, 2 }, -{ { 332, 333, 683 }, 1, 4 }, -{ { 332, 683, 682 }, 1, 2 }, -{ { 333, 334, 683 }, 1, 4 }, -{ { 334, 335, 684 }, 1, 4 }, -{ { 334, 684, 683 }, 1, 2 }, -{ { 335, 311, 661 }, 1, 4 }, -{ { 335, 661, 684 }, 1, 2 }, -{ { 336, 337, 686 }, 1, 4 }, -{ { 336, 686, 685 }, 1, 2 }, -{ { 337, 338, 687 }, 1, 4 }, -{ { 337, 687, 686 }, 1, 2 }, -{ { 338, 339, 688 }, 1, 4 }, -{ { 338, 688, 687 }, 1, 2 }, -{ { 339, 336, 685 }, 1, 4 }, -{ { 339, 685, 688 }, 1, 2 }, -{ { 340, 341, 690 }, 1, 4 }, -{ { 340, 690, 689 }, 1, 2 }, -{ { 341, 342, 691 }, 1, 4 }, -{ { 341, 691, 690 }, 1, 2 }, -{ { 342, 343, 692 }, 1, 4 }, -{ { 342, 692, 691 }, 1, 2 }, -{ { 343, 344, 693 }, 1, 4 }, -{ { 343, 693, 692 }, 1, 2 }, -{ { 344, 345, 694 }, 1, 4 }, -{ { 344, 694, 693 }, 1, 2 }, -{ { 345, 346, 695 }, 1, 4 }, -{ { 345, 695, 694 }, 1, 2 }, -{ { 346, 347, 696 }, 1, 4 }, -{ { 346, 696, 695 }, 1, 2 }, -{ { 347, 340, 689 }, 1, 4 }, -{ { 347, 689, 696 }, 1, 2 }, -{ { 706, 698, 697 }, 1, 2 }, -{ { 705, 706, 697 }, 1, 4 }, -{ { 707, 699, 698 }, 1, 2 }, -{ { 706, 707, 698 }, 1, 4 }, -{ { 708, 700, 699 }, 1, 2 }, -{ { 707, 708, 699 }, 1, 4 }, -{ { 709, 701, 700 }, 1, 2 }, -{ { 708, 709, 700 }, 1, 4 }, -{ { 710, 702, 701 }, 1, 2 }, -{ { 709, 710, 701 }, 1, 4 }, -{ { 711, 703, 702 }, 1, 2 }, -{ { 710, 711, 702 }, 1, 4 }, -{ { 712, 704, 703 }, 1, 2 }, -{ { 711, 712, 703 }, 1, 4 }, -{ { 705, 697, 704 }, 1, 2 }, -{ { 712, 705, 704 }, 1, 4 }, -{ { 722, 714, 713 }, 1, 2 }, -{ { 721, 722, 713 }, 1, 4 }, -{ { 723, 715, 714 }, 1, 2 }, -{ { 722, 723, 714 }, 1, 4 }, -{ { 724, 716, 715 }, 1, 2 }, -{ { 723, 724, 715 }, 1, 4 }, -{ { 725, 717, 716 }, 1, 2 }, -{ { 724, 725, 716 }, 1, 4 }, -{ { 726, 718, 717 }, 1, 2 }, -{ { 725, 726, 717 }, 1, 4 }, -{ { 727, 719, 718 }, 1, 2 }, -{ { 726, 727, 718 }, 1, 4 }, -{ { 728, 720, 719 }, 1, 2 }, -{ { 727, 728, 719 }, 1, 4 }, -{ { 721, 713, 720 }, 1, 2 }, -{ { 728, 721, 720 }, 1, 4 }, -{ { 729, 730, 750 }, 1, 4 }, -{ { 729, 750, 749 }, 1, 2 }, -{ { 730, 731, 751 }, 1, 4 }, -{ { 730, 751, 750 }, 1, 2 }, -{ { 731, 732, 752 }, 1, 4 }, -{ { 731, 752, 751 }, 1, 2 }, -{ { 732, 733, 753 }, 1, 4 }, -{ { 732, 753, 752 }, 1, 2 }, -{ { 733, 734, 754 }, 1, 4 }, -{ { 733, 754, 753 }, 1, 2 }, -{ { 734, 735, 755 }, 1, 4 }, -{ { 734, 755, 754 }, 1, 2 }, -{ { 735, 736, 756 }, 1, 4 }, -{ { 735, 756, 755 }, 1, 2 }, -{ { 736, 737, 757 }, 1, 4 }, -{ { 736, 757, 756 }, 1, 2 }, -{ { 737, 738, 758 }, 1, 4 }, -{ { 737, 758, 757 }, 1, 2 }, -{ { 738, 739, 759 }, 1, 4 }, -{ { 738, 759, 758 }, 1, 2 }, -{ { 739, 740, 760 }, 1, 4 }, -{ { 739, 760, 759 }, 1, 2 }, -{ { 740, 741, 761 }, 1, 4 }, -{ { 740, 761, 760 }, 1, 2 }, -{ { 741, 742, 762 }, 1, 4 }, -{ { 741, 762, 761 }, 1, 2 }, -{ { 742, 743, 763 }, 1, 4 }, -{ { 742, 763, 762 }, 1, 2 }, -{ { 743, 744, 764 }, 1, 4 }, -{ { 743, 764, 763 }, 1, 2 }, -{ { 744, 745, 765 }, 1, 4 }, -{ { 744, 765, 764 }, 1, 2 }, -{ { 745, 746, 766 }, 1, 4 }, -{ { 745, 766, 765 }, 1, 2 }, -{ { 746, 747, 767 }, 1, 4 }, -{ { 746, 767, 766 }, 1, 2 }, -{ { 747, 748, 768 }, 1, 4 }, -{ { 747, 768, 767 }, 1, 2 }, -{ { 748, 729, 749 }, 1, 4 }, -{ { 748, 749, 768 }, 1, 2 }, -{ { 769, 770, 800 }, 1, 4 }, -{ { 769, 800, 799 }, 1, 2 }, -{ { 770, 771, 801 }, 1, 4 }, -{ { 770, 801, 800 }, 1, 2 }, -{ { 771, 772, 802 }, 1, 4 }, -{ { 771, 802, 801 }, 1, 2 }, -{ { 772, 773, 803 }, 1, 4 }, -{ { 772, 803, 802 }, 1, 2 }, -{ { 773, 774, 804 }, 1, 4 }, -{ { 773, 804, 803 }, 1, 2 }, -{ { 774, 775, 805 }, 1, 4 }, -{ { 774, 805, 804 }, 1, 2 }, -{ { 775, 776, 806 }, 1, 4 }, -{ { 775, 806, 805 }, 1, 2 }, -{ { 776, 777, 807 }, 1, 4 }, -{ { 776, 807, 806 }, 1, 2 }, -{ { 777, 778, 808 }, 1, 4 }, -{ { 777, 808, 807 }, 1, 2 }, -{ { 778, 779, 809 }, 1, 4 }, -{ { 778, 809, 808 }, 1, 2 }, -{ { 779, 780, 810 }, 1, 4 }, -{ { 779, 810, 809 }, 1, 2 }, -{ { 780, 781, 811 }, 1, 4 }, -{ { 780, 811, 810 }, 1, 2 }, -{ { 781, 782, 812 }, 1, 4 }, -{ { 781, 812, 811 }, 1, 2 }, -{ { 782, 783, 813 }, 1, 4 }, -{ { 782, 813, 812 }, 1, 2 }, -{ { 783, 784, 814 }, 1, 4 }, -{ { 783, 814, 813 }, 1, 2 }, -{ { 784, 785, 815 }, 1, 4 }, -{ { 784, 815, 814 }, 1, 2 }, -{ { 785, 786, 816 }, 1, 4 }, -{ { 785, 816, 815 }, 1, 2 }, -{ { 786, 787, 817 }, 1, 4 }, -{ { 786, 817, 816 }, 1, 2 }, -{ { 787, 788, 818 }, 1, 4 }, -{ { 787, 818, 817 }, 1, 2 }, -{ { 788, 789, 819 }, 1, 4 }, -{ { 788, 819, 818 }, 1, 2 }, -{ { 789, 790, 820 }, 1, 4 }, -{ { 789, 820, 819 }, 1, 2 }, -{ { 790, 791, 821 }, 1, 4 }, -{ { 790, 821, 820 }, 1, 2 }, -{ { 791, 769, 799 }, 1, 4 }, -{ { 791, 799, 821 }, 1, 2 }, -{ { 792, 793, 823 }, 1, 4 }, -{ { 792, 823, 822 }, 1, 2 }, -{ { 793, 794, 824 }, 1, 4 }, -{ { 793, 824, 823 }, 1, 2 }, -{ { 794, 795, 825 }, 1, 4 }, -{ { 794, 825, 824 }, 1, 2 }, -{ { 795, 796, 826 }, 1, 4 }, -{ { 795, 826, 825 }, 1, 2 }, -{ { 796, 797, 827 }, 1, 4 }, -{ { 796, 827, 826 }, 1, 2 }, -{ { 797, 798, 828 }, 1, 4 }, -{ { 797, 828, 827 }, 1, 2 }, -{ { 798, 792, 822 }, 1, 4 }, -{ { 798, 822, 828 }, 1, 2 }, -{ { 829, 830, 846 }, 0, 6 }, -{ { 829, 846, 845 }, 0, 3 }, -{ { 831, 832, 848 }, 0, 6 }, -{ { 831, 848, 847 }, 0, 3 }, -{ { 833, 834, 850 }, 0, 6 }, -{ { 833, 850, 849 }, 0, 3 }, -{ { 836, 835, 851 }, 0, 6 }, -{ { 836, 851, 852 }, 0, 3 }, -{ { 837, 838, 854 }, 1, 6 }, -{ { 837, 854, 853 }, 1, 3 }, -{ { 839, 840, 856 }, 1, 6 }, -{ { 839, 856, 855 }, 1, 3 }, -{ { 841, 842, 858 }, 1, 6 }, -{ { 841, 858, 857 }, 1, 3 }, -{ { 843, 844, 860 }, 1, 6 }, -{ { 843, 860, 859 }, 1, 3 }, -{ { 919, 918, 917 }, 0, 6 }, -{ { 881, 880, 879 }, 0, 6 }, -{ { 920, 919, 917 }, 0, 4 }, -{ { 881, 879, 878 }, 0, 2 }, -{ { 882, 881, 878 }, 0, 4 }, -{ { 882, 878, 877 }, 0, 2 }, -{ { 883, 882, 877 }, 0, 4 }, -{ { 883, 877, 876 }, 0, 2 }, -{ { 884, 883, 876 }, 0, 4 }, -{ { 920, 917, 916 }, 0, 2 }, -{ { 921, 920, 916 }, 0, 4 }, -{ { 921, 916, 915 }, 0, 2 }, -{ { 922, 921, 915 }, 0, 4 }, -{ { 922, 915, 914 }, 0, 2 }, -{ { 884, 876, 875 }, 0, 2 }, -{ { 885, 884, 875 }, 0, 4 }, -{ { 923, 922, 914 }, 0, 4 }, -{ { 923, 914, 913 }, 0, 2 }, -{ { 885, 875, 874 }, 0, 2 }, -{ { 886, 885, 874 }, 0, 4 }, -{ { 923, 913, 912 }, 0, 2 }, -{ { 924, 923, 912 }, 0, 4 }, -{ { 924, 912, 911 }, 0, 2 }, -{ { 925, 924, 911 }, 0, 4 }, -{ { 925, 911, 910 }, 0, 2 }, -{ { 926, 925, 910 }, 0, 4 }, -{ { 926, 910, 909 }, 0, 2 }, -{ { 927, 926, 909 }, 0, 4 }, -{ { 927, 909, 908 }, 0, 2 }, -{ { 928, 927, 908 }, 0, 4 }, -{ { 928, 908, 907 }, 0, 2 }, -{ { 929, 928, 907 }, 0, 4 }, -{ { 929, 907, 906 }, 0, 2 }, -{ { 929, 906, 905 }, 0, 2 }, -{ { 930, 929, 905 }, 0, 4 }, -{ { 930, 905, 904 }, 0, 2 }, -{ { 930, 904, 903 }, 0, 2 }, -{ { 931, 930, 903 }, 0, 4 }, -{ { 931, 903, 902 }, 0, 2 }, -{ { 931, 902, 901 }, 0, 2 }, -{ { 932, 931, 901 }, 0, 4 }, -{ { 932, 901, 900 }, 0, 2 }, -{ { 932, 900, 899 }, 0, 2 }, -{ { 933, 932, 899 }, 0, 4 }, -{ { 934, 933, 899 }, 0, 4 }, -{ { 887, 886, 874 }, 0, 4 }, -{ { 887, 874, 873 }, 0, 2 }, -{ { 888, 887, 873 }, 0, 4 }, -{ { 888, 873, 872 }, 0, 2 }, -{ { 889, 888, 872 }, 0, 4 }, -{ { 889, 872, 871 }, 0, 2 }, -{ { 890, 889, 871 }, 0, 4 }, -{ { 890, 871, 870 }, 0, 2 }, -{ { 891, 890, 870 }, 0, 4 }, -{ { 892, 891, 870 }, 0, 4 }, -{ { 892, 870, 869 }, 0, 2 }, -{ { 893, 892, 869 }, 0, 4 }, -{ { 894, 893, 869 }, 0, 4 }, -{ { 894, 869, 868 }, 0, 2 }, -{ { 895, 894, 868 }, 0, 4 }, -{ { 896, 895, 868 }, 0, 4 }, -{ { 896, 868, 867 }, 0, 2 }, -{ { 897, 896, 867 }, 0, 4 }, -{ { 898, 897, 867 }, 0, 4 }, -{ { 898, 867, 866 }, 0, 2 }, -{ { 899, 898, 866 }, 0, 4 }, -{ { 899, 866, 865 }, 0, 2 }, -{ { 934, 899, 865 }, 0, 0 }, -{ { 934, 865, 864 }, 0, 2 }, -{ { 935, 934, 864 }, 0, 4 }, -{ { 935, 864, 863 }, 0, 2 }, -{ { 861, 935, 863 }, 0, 4 }, -{ { 862, 861, 863 }, 0, 5 }, -{ { 959, 943, 942 }, 0, 2 }, -{ { 960, 959, 942 }, 0, 4 }, -{ { 960, 942, 941 }, 0, 2 }, -{ { 961, 960, 941 }, 0, 4 }, -{ { 961, 941, 940 }, 0, 2 }, -{ { 962, 961, 940 }, 0, 4 }, -{ { 962, 940, 939 }, 0, 2 }, -{ { 963, 962, 939 }, 0, 4 }, -{ { 963, 939, 938 }, 0, 2 }, -{ { 964, 963, 938 }, 0, 4 }, -{ { 964, 938, 937 }, 0, 2 }, -{ { 965, 964, 937 }, 0, 4 }, -{ { 937, 936, 951 }, 0, 4 }, -{ { 951, 965, 937 }, 0, 4 }, -{ { 951, 936, 950 }, 0, 2 }, -{ { 952, 951, 950 }, 0, 4 }, -{ { 952, 950, 949 }, 0, 2 }, -{ { 953, 952, 949 }, 0, 4 }, -{ { 944, 943, 959 }, 0, 4 }, -{ { 944, 959, 958 }, 0, 2 }, -{ { 945, 944, 958 }, 0, 4 }, -{ { 945, 958, 957 }, 0, 2 }, -{ { 946, 945, 957 }, 0, 4 }, -{ { 946, 957, 956 }, 0, 2 }, -{ { 947, 946, 956 }, 0, 4 }, -{ { 947, 956, 955 }, 0, 2 }, -{ { 948, 947, 955 }, 0, 4 }, -{ { 948, 955, 954 }, 0, 2 }, -{ { 949, 948, 954 }, 0, 4 }, -{ { 953, 949, 954 }, 0, 1 }, -{ { 984, 983, 982 }, 1, 6 }, -{ { 984, 982, 981 }, 1, 2 }, -{ { 984, 981, 980 }, 1, 2 }, -{ { 985, 984, 980 }, 1, 4 }, -{ { 985, 980, 979 }, 1, 2 }, -{ { 986, 985, 979 }, 1, 4 }, -{ { 987, 986, 979 }, 1, 4 }, -{ { 987, 979, 978 }, 1, 2 }, -{ { 988, 987, 978 }, 1, 4 }, -{ { 988, 978, 977 }, 1, 2 }, -{ { 989, 988, 977 }, 1, 4 }, -{ { 989, 977, 976 }, 1, 2 }, -{ { 990, 989, 976 }, 1, 4 }, -{ { 991, 990, 976 }, 1, 4 }, -{ { 992, 991, 976 }, 1, 4 }, -{ { 992, 976, 975 }, 1, 2 }, -{ { 993, 992, 975 }, 1, 4 }, -{ { 966, 1001, 1000 }, 1, 6 }, -{ { 967, 966, 1000 }, 1, 4 }, -{ { 1000, 999, 998 }, 1, 6 }, -{ { 1000, 998, 997 }, 1, 2 }, -{ { 967, 1000, 997 }, 1, 0 }, -{ { 970, 969, 968 }, 1, 6 }, -{ { 970, 968, 967 }, 1, 2 }, -{ { 970, 967, 997 }, 1, 0 }, -{ { 970, 997, 996 }, 1, 2 }, -{ { 971, 970, 996 }, 1, 4 }, -{ { 972, 971, 996 }, 1, 4 }, -{ { 973, 972, 996 }, 1, 4 }, -{ { 973, 996, 995 }, 1, 2 }, -{ { 974, 973, 995 }, 1, 4 }, -{ { 974, 995, 994 }, 1, 2 }, -{ { 975, 974, 994 }, 1, 4 }, -{ { 993, 975, 994 }, 1, 1 }, -{ { 1003, 1002, 1013 }, 1, 6 }, -{ { 1003, 1013, 1012 }, 1, 2 }, -{ { 1011, 1010, 1009 }, 1, 6 }, -{ { 1012, 1011, 1009 }, 1, 4 }, -{ { 1009, 1008, 1007 }, 1, 6 }, -{ { 1009, 1007, 1006 }, 1, 2 }, -{ { 1005, 1004, 1003 }, 1, 6 }, -{ { 1006, 1005, 1003 }, 1, 4 }, -{ { 1006, 1003, 1012 }, 1, 0 }, -{ { 1006, 1012, 1009 }, 1, 0 }, -{ { 1014, 1021, 1020 }, 1, 6 }, -{ { 1015, 1014, 1020 }, 1, 4 }, -{ { 1020, 1019, 1018 }, 1, 6 }, -{ { 1020, 1018, 1017 }, 1, 2 }, -{ { 1015, 1020, 1017 }, 1, 0 }, -{ { 1016, 1015, 1017 }, 1, 5 }, -{ { 1022, 1031, 1030 }, 1, 6 }, -{ { 1023, 1022, 1030 }, 1, 4 }, -{ { 1024, 1023, 1030 }, 1, 4 }, -{ { 1024, 1030, 1029 }, 1, 2 }, -{ { 1024, 1029, 1028 }, 1, 2 }, -{ { 1025, 1024, 1028 }, 1, 4 }, -{ { 1026, 1025, 1028 }, 1, 4 }, -{ { 1026, 1028, 1027 }, 1, 3 }, -{ { 1032, 1035, 1034 }, 1, 6 }, -{ { 1033, 1032, 1034 }, 1, 5 }, -{ { 1036, 1054, 1053 }, 1, 6 }, -{ { 1037, 1036, 1053 }, 1, 4 }, -{ { 1053, 1052, 1039 }, 1, 4 }, -{ { 1048, 1047, 1046 }, 1, 6 }, -{ { 1048, 1046, 1045 }, 1, 2 }, -{ { 1048, 1045, 1044 }, 1, 2 }, -{ { 1049, 1048, 1044 }, 1, 4 }, -{ { 1049, 1044, 1043 }, 1, 2 }, -{ { 1050, 1049, 1043 }, 1, 4 }, -{ { 1050, 1043, 1042 }, 1, 2 }, -{ { 1050, 1042, 1041 }, 1, 2 }, -{ { 1050, 1041, 1040 }, 1, 2 }, -{ { 1051, 1050, 1040 }, 1, 4 }, -{ { 1051, 1040, 1039 }, 1, 2 }, -{ { 1039, 1038, 1037 }, 1, 6 }, -{ { 1039, 1037, 1053 }, 1, 0 }, -{ { 1051, 1039, 1052 }, 1, 1 }, -{ { 1063, 1062, 1078 }, 1, 4 }, -{ { 1064, 1063, 1078 }, 1, 4 }, -{ { 1064, 1078, 1084 }, 1, 2 }, -{ { 1056, 1055, 1077 }, 1, 6 }, -{ { 1065, 1064, 1084 }, 1, 4 }, -{ { 1065, 1084, 1083 }, 1, 2 }, -{ { 1066, 1065, 1083 }, 1, 4 }, -{ { 1066, 1083, 1082 }, 1, 2 }, -{ { 1067, 1066, 1082 }, 1, 4 }, -{ { 1068, 1067, 1082 }, 1, 4 }, -{ { 1069, 1068, 1082 }, 1, 4 }, -{ { 1069, 1082, 1081 }, 1, 2 }, -{ { 1070, 1069, 1081 }, 1, 4 }, -{ { 1070, 1081, 1080 }, 1, 2 }, -{ { 1071, 1070, 1080 }, 1, 4 }, -{ { 1071, 1080, 1079 }, 1, 2 }, -{ { 1072, 1071, 1079 }, 1, 4 }, -{ { 1073, 1072, 1079 }, 1, 4 }, -{ { 1073, 1079, 1078 }, 1, 2 }, -{ { 1073, 1078, 1062 }, 1, 0 }, -{ { 1073, 1062, 1061 }, 1, 2 }, -{ { 1073, 1061, 1060 }, 1, 2 }, -{ { 1074, 1073, 1060 }, 1, 4 }, -{ { 1074, 1060, 1059 }, 1, 2 }, -{ { 1075, 1074, 1059 }, 1, 4 }, -{ { 1075, 1059, 1058 }, 1, 2 }, -{ { 1076, 1075, 1058 }, 1, 4 }, -{ { 1076, 1058, 1057 }, 1, 2 }, -{ { 1076, 1057, 1056 }, 1, 2 }, -{ { 1077, 1076, 1056 }, 1, 4 }, -{ { 1085, 1102, 1101 }, 1, 6 }, -{ { 1086, 1085, 1101 }, 1, 4 }, -{ { 1086, 1101, 1100 }, 1, 2 }, -{ { 1100, 1099, 1088 }, 1, 4 }, -{ { 1088, 1087, 1086 }, 1, 6 }, -{ { 1088, 1086, 1100 }, 1, 0 }, -{ { 1088, 1099, 1098 }, 1, 2 }, -{ { 1089, 1088, 1098 }, 1, 4 }, -{ { 1089, 1098, 1097 }, 1, 2 }, -{ { 1090, 1089, 1097 }, 1, 4 }, -{ { 1096, 1095, 1094 }, 1, 6 }, -{ { 1090, 1097, 1096 }, 1, 2 }, -{ { 1091, 1090, 1096 }, 1, 4 }, -{ { 1096, 1094, 1093 }, 1, 2 }, -{ { 1092, 1091, 1096 }, 1, 4 }, -{ { 1093, 1092, 1096 }, 1, 4 }, -{ { 1133, 1149, 1148 }, 1, 2 }, -{ { 1107, 1106, 1133 }, 1, 4 }, -{ { 1108, 1107, 1133 }, 1, 4 }, -{ { 1109, 1108, 1133 }, 1, 4 }, -{ { 1110, 1109, 1133 }, 1, 4 }, -{ { 1148, 1110, 1133 }, 1, 0 }, -{ { 1104, 1103, 1137 }, 1, 6 }, -{ { 1104, 1137, 1136 }, 1, 2 }, -{ { 1126, 1125, 1124 }, 1, 6 }, -{ { 1127, 1126, 1124 }, 1, 4 }, -{ { 1127, 1124, 1123 }, 1, 2 }, -{ { 1128, 1127, 1123 }, 1, 4 }, -{ { 1128, 1123, 1122 }, 1, 2 }, -{ { 1129, 1128, 1122 }, 1, 4 }, -{ { 1130, 1129, 1122 }, 1, 4 }, -{ { 1130, 1122, 1121 }, 1, 2 }, -{ { 1131, 1130, 1121 }, 1, 4 }, -{ { 1132, 1131, 1121 }, 1, 4 }, -{ { 1132, 1121, 1120 }, 1, 2 }, -{ { 1132, 1120, 1119 }, 1, 2 }, -{ { 1132, 1119, 1139 }, 1, 0 }, -{ { 1104, 1136, 1135 }, 1, 2 }, -{ { 1110, 1148, 1147 }, 1, 2 }, -{ { 1111, 1110, 1147 }, 1, 4 }, -{ { 1111, 1147, 1146 }, 1, 2 }, -{ { 1105, 1104, 1135 }, 1, 4 }, -{ { 1112, 1111, 1146 }, 1, 4 }, -{ { 1112, 1146, 1145 }, 1, 2 }, -{ { 1113, 1112, 1145 }, 1, 4 }, -{ { 1113, 1145, 1144 }, 1, 2 }, -{ { 1114, 1113, 1144 }, 1, 4 }, -{ { 1115, 1114, 1144 }, 1, 4 }, -{ { 1115, 1144, 1143 }, 1, 2 }, -{ { 1116, 1115, 1143 }, 1, 4 }, -{ { 1117, 1116, 1143 }, 1, 4 }, -{ { 1117, 1143, 1142 }, 1, 2 }, -{ { 1117, 1142, 1141 }, 1, 2 }, -{ { 1118, 1117, 1141 }, 1, 4 }, -{ { 1118, 1141, 1140 }, 1, 2 }, -{ { 1119, 1118, 1140 }, 1, 4 }, -{ { 1119, 1140, 1139 }, 1, 2 }, -{ { 1132, 1139, 1138 }, 1, 2 }, -{ { 1138, 1133, 1132 }, 1, 2 }, -{ { 1133, 1138, 1149 }, 1, 2 }, -{ { 1134, 1133, 1106 }, 1, 4 }, -{ { 1135, 1134, 1106 }, 1, 4 }, -{ { 1135, 1106, 1105 }, 1, 2 }, -{ { 1163, 1165, 1164 }, 1, 3 }, -{ { 1165, 1163, 1162 }, 1, 2 }, -{ { 1151, 1150, 1171 }, 1, 6 }, -{ { 1165, 1162, 1161 }, 1, 2 }, -{ { 1166, 1165, 1161 }, 1, 4 }, -{ { 1166, 1161, 1160 }, 1, 2 }, -{ { 1167, 1166, 1160 }, 1, 4 }, -{ { 1167, 1160, 1159 }, 1, 2 }, -{ { 1168, 1167, 1159 }, 1, 4 }, -{ { 1168, 1159, 1158 }, 1, 2 }, -{ { 1169, 1168, 1158 }, 1, 4 }, -{ { 1169, 1158, 1157 }, 1, 2 }, -{ { 1170, 1169, 1157 }, 1, 4 }, -{ { 1170, 1157, 1156 }, 1, 2 }, -{ { 1170, 1156, 1155 }, 1, 2 }, -{ { 1170, 1155, 1154 }, 1, 2 }, -{ { 1170, 1154, 1153 }, 1, 2 }, -{ { 1171, 1170, 1153 }, 1, 4 }, -{ { 1171, 1153, 1152 }, 1, 2 }, -{ { 1171, 1152, 1151 }, 1, 2 }, -{ { 1191, 1190, 1189 }, 1, 6 }, -{ { 1191, 1189, 1188 }, 1, 2 }, -{ { 1188, 1187, 1186 }, 1, 6 }, -{ { 1188, 1186, 1185 }, 1, 2 }, -{ { 1184, 1183, 1182 }, 1, 6 }, -{ { 1173, 1172, 1196 }, 1, 6 }, -{ { 1174, 1173, 1196 }, 1, 4 }, -{ { 1175, 1174, 1196 }, 1, 4 }, -{ { 1175, 1196, 1195 }, 1, 2 }, -{ { 1176, 1175, 1195 }, 1, 4 }, -{ { 1176, 1195, 1194 }, 1, 2 }, -{ { 1177, 1176, 1194 }, 1, 4 }, -{ { 1178, 1177, 1194 }, 1, 4 }, -{ { 1179, 1178, 1194 }, 1, 4 }, -{ { 1179, 1194, 1193 }, 1, 2 }, -{ { 1180, 1179, 1193 }, 1, 4 }, -{ { 1181, 1180, 1193 }, 1, 4 }, -{ { 1181, 1193, 1192 }, 1, 2 }, -{ { 1182, 1181, 1192 }, 1, 4 }, -{ { 1182, 1192, 1191 }, 1, 2 }, -{ { 1182, 1191, 1188 }, 1, 0 }, -{ { 1182, 1188, 1185 }, 1, 0 }, -{ { 1182, 1185, 1184 }, 1, 2 }, -{ { 1197, 1200, 1199 }, 1, 6 }, -{ { 1198, 1197, 1199 }, 1, 5 }, -{ { 1203, 1202, 1201 }, 1, 6 }, -{ { 1204, 1203, 1201 }, 1, 4 }, -{ { 1208, 1207, 1206 }, 1, 6 }, -{ { 1208, 1206, 1205 }, 1, 2 }, -{ { 1201, 1208, 1205 }, 1, 4 }, -{ { 1204, 1201, 1205 }, 1, 1 }, -{ { 1265, 1266, 1267 }, 0, 6 }, -{ { 1227, 1228, 1229 }, 0, 6 }, -{ { 1265, 1267, 1268 }, 0, 2 }, -{ { 1226, 1227, 1229 }, 0, 4 }, -{ { 1226, 1229, 1230 }, 0, 2 }, -{ { 1225, 1226, 1230 }, 0, 4 }, -{ { 1225, 1230, 1231 }, 0, 2 }, -{ { 1224, 1225, 1231 }, 0, 4 }, -{ { 1224, 1231, 1232 }, 0, 2 }, -{ { 1264, 1265, 1268 }, 0, 4 }, -{ { 1264, 1268, 1269 }, 0, 2 }, -{ { 1263, 1264, 1269 }, 0, 4 }, -{ { 1263, 1269, 1270 }, 0, 2 }, -{ { 1262, 1263, 1270 }, 0, 4 }, -{ { 1223, 1224, 1232 }, 0, 4 }, -{ { 1223, 1232, 1233 }, 0, 2 }, -{ { 1262, 1270, 1271 }, 0, 2 }, -{ { 1261, 1262, 1271 }, 0, 4 }, -{ { 1222, 1223, 1233 }, 0, 4 }, -{ { 1222, 1233, 1234 }, 0, 2 }, -{ { 1260, 1261, 1271 }, 0, 4 }, -{ { 1260, 1271, 1272 }, 0, 2 }, -{ { 1259, 1260, 1272 }, 0, 4 }, -{ { 1259, 1272, 1273 }, 0, 2 }, -{ { 1258, 1259, 1273 }, 0, 4 }, -{ { 1258, 1273, 1274 }, 0, 2 }, -{ { 1257, 1258, 1274 }, 0, 4 }, -{ { 1257, 1274, 1275 }, 0, 2 }, -{ { 1256, 1257, 1275 }, 0, 4 }, -{ { 1256, 1275, 1276 }, 0, 2 }, -{ { 1255, 1256, 1276 }, 0, 4 }, -{ { 1255, 1276, 1277 }, 0, 2 }, -{ { 1254, 1255, 1277 }, 0, 4 }, -{ { 1253, 1254, 1277 }, 0, 4 }, -{ { 1253, 1277, 1278 }, 0, 2 }, -{ { 1252, 1253, 1278 }, 0, 4 }, -{ { 1251, 1252, 1278 }, 0, 4 }, -{ { 1251, 1278, 1279 }, 0, 2 }, -{ { 1250, 1251, 1279 }, 0, 4 }, -{ { 1249, 1250, 1279 }, 0, 4 }, -{ { 1249, 1279, 1280 }, 0, 2 }, -{ { 1248, 1249, 1280 }, 0, 4 }, -{ { 1247, 1248, 1280 }, 0, 4 }, -{ { 1247, 1280, 1281 }, 0, 2 }, -{ { 1247, 1281, 1282 }, 0, 2 }, -{ { 1222, 1234, 1235 }, 0, 2 }, -{ { 1221, 1222, 1235 }, 0, 4 }, -{ { 1221, 1235, 1236 }, 0, 2 }, -{ { 1220, 1221, 1236 }, 0, 4 }, -{ { 1220, 1236, 1237 }, 0, 2 }, -{ { 1219, 1220, 1237 }, 0, 4 }, -{ { 1219, 1237, 1238 }, 0, 2 }, -{ { 1218, 1219, 1238 }, 0, 4 }, -{ { 1218, 1238, 1239 }, 0, 2 }, -{ { 1218, 1239, 1240 }, 0, 2 }, -{ { 1217, 1218, 1240 }, 0, 4 }, -{ { 1217, 1240, 1241 }, 0, 2 }, -{ { 1217, 1241, 1242 }, 0, 2 }, -{ { 1216, 1217, 1242 }, 0, 4 }, -{ { 1216, 1242, 1243 }, 0, 2 }, -{ { 1216, 1243, 1244 }, 0, 2 }, -{ { 1215, 1216, 1244 }, 0, 4 }, -{ { 1215, 1244, 1245 }, 0, 2 }, -{ { 1215, 1245, 1246 }, 0, 2 }, -{ { 1214, 1215, 1246 }, 0, 4 }, -{ { 1214, 1246, 1247 }, 0, 2 }, -{ { 1213, 1214, 1247 }, 0, 4 }, -{ { 1213, 1247, 1282 }, 0, 0 }, -{ { 1212, 1213, 1282 }, 0, 4 }, -{ { 1212, 1282, 1283 }, 0, 2 }, -{ { 1211, 1212, 1283 }, 0, 4 }, -{ { 1211, 1283, 1209 }, 0, 2 }, -{ { 1211, 1209, 1210 }, 0, 3 }, -{ { 1290, 1291, 1307 }, 0, 4 }, -{ { 1290, 1307, 1308 }, 0, 2 }, -{ { 1289, 1290, 1308 }, 0, 4 }, -{ { 1289, 1308, 1309 }, 0, 2 }, -{ { 1288, 1289, 1309 }, 0, 4 }, -{ { 1288, 1309, 1310 }, 0, 2 }, -{ { 1287, 1288, 1310 }, 0, 4 }, -{ { 1287, 1310, 1311 }, 0, 2 }, -{ { 1286, 1287, 1311 }, 0, 4 }, -{ { 1286, 1311, 1312 }, 0, 2 }, -{ { 1285, 1286, 1312 }, 0, 4 }, -{ { 1285, 1312, 1313 }, 0, 2 }, -{ { 1284, 1285, 1313 }, 0, 4 }, -{ { 1284, 1313, 1299 }, 0, 2 }, -{ { 1298, 1284, 1299 }, 0, 4 }, -{ { 1298, 1299, 1300 }, 0, 2 }, -{ { 1297, 1298, 1300 }, 0, 4 }, -{ { 1297, 1300, 1301 }, 0, 2 }, -{ { 1307, 1291, 1292 }, 0, 2 }, -{ { 1306, 1307, 1292 }, 0, 4 }, -{ { 1306, 1292, 1293 }, 0, 2 }, -{ { 1305, 1306, 1293 }, 0, 4 }, -{ { 1305, 1293, 1294 }, 0, 2 }, -{ { 1304, 1305, 1294 }, 0, 4 }, -{ { 1304, 1294, 1295 }, 0, 2 }, -{ { 1303, 1304, 1295 }, 0, 4 }, -{ { 1303, 1295, 1296 }, 0, 2 }, -{ { 1302, 1303, 1296 }, 0, 4 }, -{ { 1302, 1296, 1297 }, 0, 2 }, -{ { 1302, 1297, 1301 }, 0, 1 }, -{ { 1330, 1331, 1332 }, 1, 6 }, -{ { 1329, 1330, 1332 }, 1, 4 }, -{ { 1328, 1329, 1332 }, 1, 4 }, -{ { 1328, 1332, 1333 }, 1, 2 }, -{ { 1327, 1328, 1333 }, 1, 4 }, -{ { 1327, 1333, 1334 }, 1, 2 }, -{ { 1327, 1334, 1335 }, 1, 2 }, -{ { 1326, 1327, 1335 }, 1, 4 }, -{ { 1326, 1335, 1336 }, 1, 2 }, -{ { 1325, 1326, 1336 }, 1, 4 }, -{ { 1325, 1336, 1337 }, 1, 2 }, -{ { 1324, 1325, 1337 }, 1, 4 }, -{ { 1324, 1337, 1338 }, 1, 2 }, -{ { 1324, 1338, 1339 }, 1, 2 }, -{ { 1324, 1339, 1340 }, 1, 2 }, -{ { 1323, 1324, 1340 }, 1, 4 }, -{ { 1323, 1340, 1341 }, 1, 2 }, -{ { 1348, 1349, 1314 }, 1, 6 }, -{ { 1348, 1314, 1315 }, 1, 2 }, -{ { 1346, 1347, 1348 }, 1, 6 }, -{ { 1345, 1346, 1348 }, 1, 4 }, -{ { 1345, 1348, 1315 }, 1, 0 }, -{ { 1316, 1317, 1318 }, 1, 6 }, -{ { 1315, 1316, 1318 }, 1, 4 }, -{ { 1345, 1315, 1318 }, 1, 0 }, -{ { 1344, 1345, 1318 }, 1, 4 }, -{ { 1344, 1318, 1319 }, 1, 2 }, -{ { 1344, 1319, 1320 }, 1, 2 }, -{ { 1344, 1320, 1321 }, 1, 2 }, -{ { 1343, 1344, 1321 }, 1, 4 }, -{ { 1343, 1321, 1322 }, 1, 2 }, -{ { 1342, 1343, 1322 }, 1, 4 }, -{ { 1342, 1322, 1323 }, 1, 2 }, -{ { 1342, 1323, 1341 }, 1, 1 }, -{ { 1361, 1350, 1351 }, 1, 6 }, -{ { 1360, 1361, 1351 }, 1, 4 }, -{ { 1357, 1358, 1359 }, 1, 6 }, -{ { 1357, 1359, 1360 }, 1, 2 }, -{ { 1355, 1356, 1357 }, 1, 6 }, -{ { 1354, 1355, 1357 }, 1, 4 }, -{ { 1351, 1352, 1353 }, 1, 6 }, -{ { 1351, 1353, 1354 }, 1, 2 }, -{ { 1360, 1351, 1354 }, 1, 0 }, -{ { 1357, 1360, 1354 }, 1, 0 }, -{ { 1368, 1369, 1362 }, 1, 6 }, -{ { 1368, 1362, 1363 }, 1, 2 }, -{ { 1366, 1367, 1368 }, 1, 6 }, -{ { 1365, 1366, 1368 }, 1, 4 }, -{ { 1365, 1368, 1363 }, 1, 0 }, -{ { 1365, 1363, 1364 }, 1, 3 }, -{ { 1378, 1379, 1370 }, 1, 6 }, -{ { 1378, 1370, 1371 }, 1, 2 }, -{ { 1378, 1371, 1372 }, 1, 2 }, -{ { 1377, 1378, 1372 }, 1, 4 }, -{ { 1376, 1377, 1372 }, 1, 4 }, -{ { 1376, 1372, 1373 }, 1, 2 }, -{ { 1376, 1373, 1374 }, 1, 2 }, -{ { 1375, 1376, 1374 }, 1, 5 }, -{ { 1382, 1383, 1380 }, 1, 6 }, -{ { 1382, 1380, 1381 }, 1, 3 }, -{ { 1401, 1402, 1384 }, 1, 6 }, -{ { 1401, 1384, 1385 }, 1, 2 }, -{ { 1400, 1401, 1385 }, 1, 4 }, -{ { 1394, 1395, 1396 }, 1, 6 }, -{ { 1393, 1394, 1396 }, 1, 4 }, -{ { 1392, 1393, 1396 }, 1, 4 }, -{ { 1392, 1396, 1397 }, 1, 2 }, -{ { 1391, 1392, 1397 }, 1, 4 }, -{ { 1391, 1397, 1398 }, 1, 2 }, -{ { 1390, 1391, 1398 }, 1, 4 }, -{ { 1389, 1390, 1398 }, 1, 4 }, -{ { 1388, 1389, 1398 }, 1, 4 }, -{ { 1388, 1398, 1399 }, 1, 2 }, -{ { 1387, 1388, 1399 }, 1, 4 }, -{ { 1385, 1386, 1387 }, 1, 6 }, -{ { 1400, 1385, 1387 }, 1, 0 }, -{ { 1400, 1387, 1399 }, 1, 1 }, -{ { 1426, 1410, 1411 }, 1, 2 }, -{ { 1426, 1411, 1412 }, 1, 2 }, -{ { 1432, 1426, 1412 }, 1, 4 }, -{ { 1425, 1403, 1404 }, 1, 6 }, -{ { 1432, 1412, 1413 }, 1, 2 }, -{ { 1431, 1432, 1413 }, 1, 4 }, -{ { 1431, 1413, 1414 }, 1, 2 }, -{ { 1430, 1431, 1414 }, 1, 4 }, -{ { 1430, 1414, 1415 }, 1, 2 }, -{ { 1430, 1415, 1416 }, 1, 2 }, -{ { 1430, 1416, 1417 }, 1, 2 }, -{ { 1429, 1430, 1417 }, 1, 4 }, -{ { 1429, 1417, 1418 }, 1, 2 }, -{ { 1428, 1429, 1418 }, 1, 4 }, -{ { 1428, 1418, 1419 }, 1, 2 }, -{ { 1427, 1428, 1419 }, 1, 4 }, -{ { 1427, 1419, 1420 }, 1, 2 }, -{ { 1427, 1420, 1421 }, 1, 2 }, -{ { 1426, 1427, 1421 }, 1, 4 }, -{ { 1410, 1426, 1421 }, 1, 0 }, -{ { 1409, 1410, 1421 }, 1, 4 }, -{ { 1408, 1409, 1421 }, 1, 4 }, -{ { 1408, 1421, 1422 }, 1, 2 }, -{ { 1407, 1408, 1422 }, 1, 4 }, -{ { 1407, 1422, 1423 }, 1, 2 }, -{ { 1406, 1407, 1423 }, 1, 4 }, -{ { 1406, 1423, 1424 }, 1, 2 }, -{ { 1405, 1406, 1424 }, 1, 4 }, -{ { 1404, 1405, 1424 }, 1, 4 }, -{ { 1404, 1424, 1425 }, 1, 2 }, -{ { 1449, 1450, 1433 }, 1, 6 }, -{ { 1449, 1433, 1434 }, 1, 2 }, -{ { 1448, 1449, 1434 }, 1, 4 }, -{ { 1447, 1448, 1434 }, 1, 4 }, -{ { 1434, 1435, 1436 }, 1, 6 }, -{ { 1447, 1434, 1436 }, 1, 0 }, -{ { 1446, 1447, 1436 }, 1, 4 }, -{ { 1446, 1436, 1437 }, 1, 2 }, -{ { 1445, 1446, 1437 }, 1, 4 }, -{ { 1445, 1437, 1438 }, 1, 2 }, -{ { 1442, 1443, 1444 }, 1, 6 }, -{ { 1444, 1445, 1438 }, 1, 4 }, -{ { 1444, 1438, 1439 }, 1, 2 }, -{ { 1441, 1442, 1444 }, 1, 4 }, -{ { 1444, 1439, 1440 }, 1, 2 }, -{ { 1444, 1440, 1441 }, 1, 2 }, -{ { 1499, 1486, 1454 }, 1, 4 }, -{ { 1499, 1454, 1455 }, 1, 2 }, -{ { 1499, 1455, 1456 }, 1, 2 }, -{ { 1499, 1456, 1457 }, 1, 2 }, -{ { 1499, 1457, 1458 }, 1, 2 }, -{ { 1498, 1499, 1458 }, 1, 4 }, -{ { 1485, 1451, 1452 }, 1, 6 }, -{ { 1472, 1473, 1474 }, 1, 6 }, -{ { 1484, 1485, 1452 }, 1, 4 }, -{ { 1472, 1474, 1475 }, 1, 2 }, -{ { 1471, 1472, 1475 }, 1, 4 }, -{ { 1471, 1475, 1476 }, 1, 2 }, -{ { 1470, 1471, 1476 }, 1, 4 }, -{ { 1470, 1476, 1477 }, 1, 2 }, -{ { 1470, 1477, 1478 }, 1, 2 }, -{ { 1469, 1470, 1478 }, 1, 4 }, -{ { 1469, 1478, 1479 }, 1, 2 }, -{ { 1469, 1479, 1480 }, 1, 2 }, -{ { 1468, 1469, 1480 }, 1, 4 }, -{ { 1468, 1480, 1481 }, 1, 2 }, -{ { 1467, 1468, 1481 }, 1, 4 }, -{ { 1483, 1484, 1452 }, 1, 4 }, -{ { 1497, 1498, 1458 }, 1, 4 }, -{ { 1497, 1458, 1459 }, 1, 2 }, -{ { 1496, 1497, 1459 }, 1, 4 }, -{ { 1483, 1452, 1453 }, 1, 2 }, -{ { 1496, 1459, 1460 }, 1, 2 }, -{ { 1495, 1496, 1460 }, 1, 4 }, -{ { 1495, 1460, 1461 }, 1, 2 }, -{ { 1494, 1495, 1461 }, 1, 4 }, -{ { 1494, 1461, 1462 }, 1, 2 }, -{ { 1494, 1462, 1463 }, 1, 2 }, -{ { 1493, 1494, 1463 }, 1, 4 }, -{ { 1493, 1463, 1464 }, 1, 2 }, -{ { 1492, 1493, 1464 }, 1, 4 }, -{ { 1492, 1464, 1465 }, 1, 2 }, -{ { 1491, 1492, 1465 }, 1, 4 }, -{ { 1490, 1491, 1465 }, 1, 4 }, -{ { 1489, 1490, 1465 }, 1, 4 }, -{ { 1489, 1465, 1466 }, 1, 2 }, -{ { 1488, 1489, 1466 }, 1, 4 }, -{ { 1488, 1466, 1467 }, 1, 2 }, -{ { 1487, 1488, 1467 }, 1, 4 }, -{ { 1487, 1467, 1481 }, 1, 0 }, -{ { 1486, 1487, 1481 }, 1, 4 }, -{ { 1454, 1486, 1481 }, 1, 0 }, -{ { 1454, 1481, 1482 }, 1, 2 }, -{ { 1454, 1482, 1483 }, 1, 2 }, -{ { 1453, 1454, 1483 }, 1, 4 }, -{ { 1513, 1514, 1515 }, 1, 6 }, -{ { 1512, 1513, 1515 }, 1, 4 }, -{ { 1521, 1500, 1501 }, 1, 6 }, -{ { 1511, 1512, 1515 }, 1, 4 }, -{ { 1511, 1515, 1516 }, 1, 2 }, -{ { 1510, 1511, 1516 }, 1, 4 }, -{ { 1510, 1516, 1517 }, 1, 2 }, -{ { 1509, 1510, 1517 }, 1, 4 }, -{ { 1509, 1517, 1518 }, 1, 2 }, -{ { 1508, 1509, 1518 }, 1, 4 }, -{ { 1508, 1518, 1519 }, 1, 2 }, -{ { 1507, 1508, 1519 }, 1, 4 }, -{ { 1507, 1519, 1520 }, 1, 2 }, -{ { 1506, 1507, 1520 }, 1, 4 }, -{ { 1505, 1506, 1520 }, 1, 4 }, -{ { 1504, 1505, 1520 }, 1, 4 }, -{ { 1503, 1504, 1520 }, 1, 4 }, -{ { 1503, 1520, 1521 }, 1, 2 }, -{ { 1502, 1503, 1521 }, 1, 4 }, -{ { 1501, 1502, 1521 }, 1, 4 }, -{ { 1539, 1540, 1541 }, 1, 6 }, -{ { 1538, 1539, 1541 }, 1, 4 }, -{ { 1536, 1537, 1538 }, 1, 6 }, -{ { 1535, 1536, 1538 }, 1, 4 }, -{ { 1532, 1533, 1534 }, 1, 6 }, -{ { 1545, 1522, 1523 }, 1, 6 }, -{ { 1545, 1523, 1524 }, 1, 2 }, -{ { 1545, 1524, 1525 }, 1, 2 }, -{ { 1544, 1545, 1525 }, 1, 4 }, -{ { 1544, 1525, 1526 }, 1, 2 }, -{ { 1544, 1526, 1527 }, 1, 2 }, -{ { 1544, 1527, 1528 }, 1, 2 }, -{ { 1544, 1528, 1529 }, 1, 2 }, -{ { 1543, 1544, 1529 }, 1, 4 }, -{ { 1543, 1529, 1530 }, 1, 2 }, -{ { 1543, 1530, 1531 }, 1, 2 }, -{ { 1542, 1543, 1531 }, 1, 4 }, -{ { 1542, 1531, 1532 }, 1, 2 }, -{ { 1541, 1542, 1532 }, 1, 4 }, -{ { 1538, 1541, 1532 }, 1, 0 }, -{ { 1535, 1538, 1532 }, 1, 0 }, -{ { 1534, 1535, 1532 }, 1, 4 }, -{ { 1548, 1549, 1546 }, 1, 6 }, -{ { 1548, 1546, 1547 }, 1, 3 }, -{ { 1550, 1551, 1552 }, 1, 6 }, -{ { 1550, 1552, 1553 }, 1, 2 }, -{ { 1555, 1556, 1557 }, 1, 6 }, -{ { 1554, 1555, 1557 }, 1, 4 }, -{ { 1554, 1557, 1550 }, 1, 2 }, -{ { 1554, 1550, 1553 }, 1, 1 }, -{ { 1575, 1558, 1559 }, 0, 2 }, -{ { 1575, 1559, 1560 }, 0, 2 }, -{ { 1575, 1560, 1561 }, 0, 2 }, -{ { 1575, 1561, 1562 }, 0, 2 }, -{ { 1575, 1562, 1563 }, 0, 2 }, -{ { 1575, 1563, 1564 }, 0, 2 }, -{ { 1575, 1564, 1565 }, 0, 2 }, -{ { 1575, 1565, 1558 }, 0, 2 }, -{ { 1574, 1567, 1566 }, 0, 2 }, -{ { 1574, 1568, 1567 }, 0, 2 }, -{ { 1574, 1569, 1568 }, 0, 2 }, -{ { 1574, 1570, 1569 }, 0, 2 }, -{ { 1574, 1571, 1570 }, 0, 2 }, -{ { 1574, 1572, 1571 }, 0, 2 }, -{ { 1574, 1573, 1572 }, 0, 2 }, -{ { 1574, 1566, 1573 }, 0, 2 }, -{ { 1593, 1576, 1577 }, 0, 2 }, -{ { 1593, 1577, 1578 }, 0, 2 }, -{ { 1593, 1578, 1579 }, 0, 2 }, -{ { 1593, 1579, 1580 }, 0, 2 }, -{ { 1593, 1580, 1581 }, 0, 2 }, -{ { 1593, 1581, 1582 }, 0, 2 }, -{ { 1593, 1582, 1583 }, 0, 2 }, -{ { 1593, 1583, 1576 }, 0, 2 }, -{ { 1592, 1585, 1584 }, 0, 2 }, -{ { 1592, 1586, 1585 }, 0, 2 }, -{ { 1592, 1587, 1586 }, 0, 2 }, -{ { 1592, 1588, 1587 }, 0, 2 }, -{ { 1592, 1589, 1588 }, 0, 2 }, -{ { 1592, 1590, 1589 }, 0, 2 }, -{ { 1592, 1591, 1590 }, 0, 2 }, -{ { 1592, 1584, 1591 }, 0, 2 }, -{ { 1610, 1609, 1608 }, 1, 6 }, -{ { 1610, 1608, 1607 }, 1, 2 }, -{ { 1607, 1606, 1605 }, 1, 6 }, -{ { 1607, 1605, 1604 }, 1, 2 }, -{ { 1603, 1602, 1601 }, 1, 6 }, -{ { 1595, 1594, 1613 }, 1, 6 }, -{ { 1596, 1595, 1613 }, 1, 4 }, -{ { 1596, 1613, 1612 }, 1, 2 }, -{ { 1597, 1596, 1612 }, 1, 4 }, -{ { 1598, 1597, 1612 }, 1, 4 }, -{ { 1599, 1598, 1612 }, 1, 4 }, -{ { 1599, 1612, 1611 }, 1, 2 }, -{ { 1600, 1599, 1611 }, 1, 4 }, -{ { 1601, 1600, 1611 }, 1, 4 }, -{ { 1601, 1611, 1610 }, 1, 2 }, -{ { 1601, 1610, 1607 }, 1, 0 }, -{ { 1601, 1607, 1604 }, 1, 0 }, -{ { 1601, 1604, 1603 }, 1, 2 }, -{ { 1628, 1629, 1630 }, 1, 6 }, -{ { 1627, 1628, 1630 }, 1, 4 }, -{ { 1625, 1626, 1627 }, 1, 6 }, -{ { 1624, 1625, 1627 }, 1, 4 }, -{ { 1621, 1622, 1623 }, 1, 6 }, -{ { 1633, 1614, 1615 }, 1, 6 }, -{ { 1633, 1615, 1616 }, 1, 2 }, -{ { 1632, 1633, 1616 }, 1, 4 }, -{ { 1632, 1616, 1617 }, 1, 2 }, -{ { 1632, 1617, 1618 }, 1, 2 }, -{ { 1632, 1618, 1619 }, 1, 2 }, -{ { 1631, 1632, 1619 }, 1, 4 }, -{ { 1631, 1619, 1620 }, 1, 2 }, -{ { 1631, 1620, 1621 }, 1, 2 }, -{ { 1630, 1631, 1621 }, 1, 4 }, -{ { 1627, 1630, 1621 }, 1, 0 }, -{ { 1624, 1627, 1621 }, 1, 0 }, -{ { 1623, 1624, 1621 }, 1, 4 }, -{ { 1642, 1641, 1657 }, 1, 4 }, -{ { 1643, 1642, 1657 }, 1, 4 }, -{ { 1643, 1657, 1663 }, 1, 2 }, -{ { 1635, 1634, 1656 }, 1, 6 }, -{ { 1644, 1643, 1663 }, 1, 4 }, -{ { 1644, 1663, 1662 }, 1, 2 }, -{ { 1645, 1644, 1662 }, 1, 4 }, -{ { 1645, 1662, 1661 }, 1, 2 }, -{ { 1646, 1645, 1661 }, 1, 4 }, -{ { 1647, 1646, 1661 }, 1, 4 }, -{ { 1648, 1647, 1661 }, 1, 4 }, -{ { 1648, 1661, 1660 }, 1, 2 }, -{ { 1649, 1648, 1660 }, 1, 4 }, -{ { 1649, 1660, 1659 }, 1, 2 }, -{ { 1650, 1649, 1659 }, 1, 4 }, -{ { 1650, 1659, 1658 }, 1, 2 }, -{ { 1651, 1650, 1658 }, 1, 4 }, -{ { 1652, 1651, 1658 }, 1, 4 }, -{ { 1652, 1658, 1657 }, 1, 2 }, -{ { 1652, 1657, 1641 }, 1, 0 }, -{ { 1652, 1641, 1640 }, 1, 2 }, -{ { 1652, 1640, 1639 }, 1, 2 }, -{ { 1653, 1652, 1639 }, 1, 4 }, -{ { 1653, 1639, 1638 }, 1, 2 }, -{ { 1654, 1653, 1638 }, 1, 4 }, -{ { 1654, 1638, 1637 }, 1, 2 }, -{ { 1655, 1654, 1637 }, 1, 4 }, -{ { 1655, 1637, 1636 }, 1, 2 }, -{ { 1655, 1636, 1635 }, 1, 2 }, -{ { 1656, 1655, 1635 }, 1, 4 }, -{ { 1687, 1671, 1672 }, 1, 2 }, -{ { 1687, 1672, 1673 }, 1, 2 }, -{ { 1693, 1687, 1673 }, 1, 4 }, -{ { 1686, 1664, 1665 }, 1, 6 }, -{ { 1693, 1673, 1674 }, 1, 2 }, -{ { 1692, 1693, 1674 }, 1, 4 }, -{ { 1692, 1674, 1675 }, 1, 2 }, -{ { 1691, 1692, 1675 }, 1, 4 }, -{ { 1691, 1675, 1676 }, 1, 2 }, -{ { 1691, 1676, 1677 }, 1, 2 }, -{ { 1691, 1677, 1678 }, 1, 2 }, -{ { 1690, 1691, 1678 }, 1, 4 }, -{ { 1690, 1678, 1679 }, 1, 2 }, -{ { 1689, 1690, 1679 }, 1, 4 }, -{ { 1689, 1679, 1680 }, 1, 2 }, -{ { 1688, 1689, 1680 }, 1, 4 }, -{ { 1688, 1680, 1681 }, 1, 2 }, -{ { 1688, 1681, 1682 }, 1, 2 }, -{ { 1687, 1688, 1682 }, 1, 4 }, -{ { 1671, 1687, 1682 }, 1, 0 }, -{ { 1670, 1671, 1682 }, 1, 4 }, -{ { 1669, 1670, 1682 }, 1, 4 }, -{ { 1669, 1682, 1683 }, 1, 2 }, -{ { 1668, 1669, 1683 }, 1, 4 }, -{ { 1668, 1683, 1684 }, 1, 2 }, -{ { 1667, 1668, 1684 }, 1, 4 }, -{ { 1667, 1684, 1685 }, 1, 2 }, -{ { 1666, 1667, 1685 }, 1, 4 }, -{ { 1665, 1666, 1685 }, 1, 4 }, -{ { 1665, 1685, 1686 }, 1, 2 } -}; - -static Vert vert_2[] = { -{ 171.834137f, -24.549576f, 161.761139f, 0.000000f, -1.000000f, 0.000000f, 167.258984f, 73.910260f }, -{ 385.145508f, -24.549585f, 281.452515f, 0.000000f, -1.000000f, 0.000000f, 214.952915f, 32.905991f }, -{ 336.557922f, -24.549572f, 123.839111f, 0.000000f, -1.000000f, 0.000000f, 204.089298f, 86.901717f }, -{ 526.168030f, -24.549603f, 127.394318f, 0.000000f, -1.000000f, 0.000000f, 246.483912f, 85.683761f }, -{ 387.515625f, -24.549564f, 39.699638f, 0.000000f, -1.000000f, 0.000000f, 215.482850f, 115.726499f }, -{ 540.388733f, -24.549561f, -4.147684f, 0.000000f, -1.000000f, 0.000000f, 249.663506f, 130.747868f }, -{ 398.181213f, -24.549526f, -46.809975f, 0.000000f, -1.000000f, 0.000000f, 217.867557f, 145.363252f }, -{ 559.349792f, -24.549519f, -146.355286f, 0.000000f, -1.000000f, 0.000000f, 253.902968f, 179.465822f }, -{ 342.483246f, -24.549520f, -126.209206f, 0.000000f, -1.000000f, 0.000000f, 205.414135f, 172.564107f }, -{ 451.509033f, -24.549507f, -264.861603f, 0.000000f, -1.000000f, 0.000000f, 229.791028f, 220.064120f }, -{ 233.457428f, -24.549515f, -184.277298f, 0.000000f, -1.000000f, 0.000000f, 181.037242f, 192.457275f }, -{ 252.418427f, -24.549503f, -317.004364f, 0.000000f, -1.000000f, 0.000000f, 185.276690f, 237.927362f }, -{ 87.694656f, -24.549515f, -183.092224f, 0.000000f, -1.000000f, 0.000000f, 148.446376f, 192.051290f }, -{ 27.256439f, -24.549471f, -341.890686f, 0.000000f, -1.000000f, 0.000000f, 134.933100f, 246.453003f }, -{ -72.288864f, -24.549515f, -178.351990f, 0.000000f, -1.000000f, 0.000000f, 112.675931f, 190.427367f }, -{ -154.058212f, -24.549473f, -325.299805f, 0.000000f, -1.000000f, 0.000000f, 94.393258f, 240.769243f }, -{ -220.421753f, -24.549486f, -172.426666f, 0.000000f, -1.000000f, 0.000000f, 79.555146f, 188.397447f }, -{ -346.038452f, -24.549469f, -367.962097f, 0.000000f, -1.000000f, 0.000000f, 51.468713f, 255.384635f }, -{ -318.781982f, -24.549488f, -146.355286f, 0.000000f, -1.000000f, 0.000000f, 57.562944f, 179.465822f }, -{ -466.914886f, -24.549479f, -242.345398f, 0.000000f, -1.000000f, 0.000000f, 24.442152f, 212.350443f }, -{ -383.960480f, -24.549492f, -96.582626f, 0.000000f, -1.000000f, 0.000000f, 42.989791f, 162.414540f }, -{ -552.239441f, -24.549492f, -101.322876f, 0.000000f, -1.000000f, 0.000000f, 5.364584f, 164.038467f }, -{ -421.882477f, -24.549498f, -27.848965f, 0.000000f, -1.000000f, 0.000000f, 34.510873f, 138.867531f }, -{ -559.349792f, -24.549505f, 49.180138f, 0.000000f, -1.000000f, 0.000000f, 3.774793f, 112.478631f }, -{ -412.401978f, -24.549538f, 71.696342f, 0.000000f, -1.000000f, 0.000000f, 36.630604f, 104.764969f }, -{ -510.762207f, -24.549515f, 174.796814f, 0.000000f, -1.000000f, 0.000000f, 14.638404f, 69.444450f }, -{ -348.408569f, -24.549543f, 140.429993f, 0.000000f, -1.000000f, 0.000000f, 50.938782f, 81.217951f }, -{ -411.216919f, -24.549555f, 264.861633f, 0.000000f, -1.000000f, 0.000000f, 36.895568f, 38.589741f }, -{ -258.343781f, -24.549547f, 187.832520f, 0.000000f, -1.000000f, 0.000000f, 71.076220f, 64.978641f }, -{ -254.788574f, -24.549561f, 338.335541f, 0.000000f, -1.000000f, 0.000000f, 71.871129f, 13.418798f }, -{ -133.912140f, -24.549547f, 193.757843f, 0.000000f, -1.000000f, 0.000000f, 98.897688f, 62.948714f }, -{ -43.847347f, -24.549593f, 367.962097f, 0.000000f, -1.000000f, 0.000000f, 119.035126f, 3.269238f }, -{ 37.922009f, -24.549547f, 183.092255f, 0.000000f, -1.000000f, 0.000000f, 137.317792f, 66.602568f }, -{ 168.278946f, -24.549589f, 315.819336f, 0.000000f, -1.000000f, 0.000000f, 166.464082f, 21.132490f } -}; - -static Face face_2[] = { -{ { 18, 17, 16 }, 2, 6 }, -{ { 8, 7, 6 }, 2, 6 }, -{ { 20, 19, 18 }, 2, 6 }, -{ { 22, 21, 20 }, 2, 6 }, -{ { 4, 3, 2 }, 2, 6 }, -{ { 10, 9, 8 }, 2, 6 }, -{ { 6, 5, 4 }, 2, 6 }, -{ { 26, 25, 24 }, 2, 6 }, -{ { 28, 27, 26 }, 2, 6 }, -{ { 24, 23, 22 }, 2, 6 }, -{ { 30, 29, 28 }, 2, 6 }, -{ { 12, 11, 10 }, 2, 6 }, -{ { 2, 1, 0 }, 2, 6 }, -{ { 0, 33, 32 }, 2, 6 }, -{ { 32, 31, 30 }, 2, 6 }, -{ { 14, 13, 12 }, 2, 6 }, -{ { 16, 15, 14 }, 2, 6 }, -{ { 4, 2, 0 }, 2, 0 }, -{ { 6, 4, 0 }, 2, 0 }, -{ { 8, 6, 0 }, 2, 0 }, -{ { 10, 8, 0 }, 2, 0 }, -{ { 12, 10, 0 }, 2, 0 }, -{ { 12, 0, 32 }, 2, 0 }, -{ { 14, 12, 32 }, 2, 0 }, -{ { 14, 32, 30 }, 2, 0 }, -{ { 16, 14, 30 }, 2, 0 }, -{ { 16, 30, 28 }, 2, 0 }, -{ { 16, 28, 26 }, 2, 0 }, -{ { 18, 16, 26 }, 2, 0 }, -{ { 20, 18, 26 }, 2, 0 }, -{ { 20, 26, 24 }, 2, 0 }, -{ { 20, 24, 22 }, 2, 0 } -}; - - -static Vert *vert[] = { -vert_0, -vert_1, -vert_2 -}; - -static int num_verts[] = { -68, -1694, -34 -}; - -static Face *face[] = { -face_0, -face_1, -face_2 -}; - -static int num_faces[] = { -100, -1606, -32 -}; - -static int total_num_frames = 75; - -Matrix mat[][3] = -{ - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 22198.351563f, 1.000000f - }, - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.0000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -32.104950f, -4.568500f, 21760.089844f, 1.000000f - }, - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 22230.794922f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 21601.316406f, 1.000000f, - }, - { - 0.881000f, 0.187100f, 0.434500f, 0.000000f, - -0.178600f, -0.718900f, 0.671800f, 0.000000f, - -0.438000f, 0.669500f, 0.600000f, 0.000000f, - -40.679047f, 57.105099f, 21262.400391f, 1.000000f, - }, - { - 1.008900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.008900f, 0.000000f, - 0.000000f, 1.008900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 21633.759766f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 20863.496094f, 1.000000f, - }, - { - 0.759600f, 0.187100f, 0.622900f, 0.000000f, - -0.326300f, -0.718900f, 0.613800f, 0.000000f, - -0.562600f, 0.669500f, 0.485100f, 0.000000f, - -35.966850f, 57.105099f, 20524.212891f, 1.000000f, - }, - { - 1.017400f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.017400f, 0.000000f, - 0.000000f, 1.017400f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 20895.939453f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 20000.533203f, 1.000000f, - }, - { - 0.598200f, 0.187100f, 0.779200f, 0.000000f, - -0.457200f, -0.718900f, 0.523600f, 0.000000f, - -0.658100f, 0.669500f, 0.344500f, 0.000000f, - -31.281849f, 57.105099f, 19661.962891f, 1.000000f, - }, - { - 1.025100f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.025100f, 0.000000f, - 0.000000f, 1.025100f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 20032.976563f, 1.000000f, - }, - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 19028.070313f, 1.000000f, - }, - { - 0.406500f, 0.187100f, 0.894300f, 0.000000f, - -0.563800f, -0.718900f, 0.406600f, 0.000000f, - -0.719000f, 0.669500f, 0.186800f, 0.000000f, - -26.903849f, 57.105099f, 18691.248047f, 1.000000f, - }, - { - 1.031600f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.031600f, 0.000000f, - 0.000000f, 1.031600f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 19060.513672f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 17961.750000f, 1.000000f, - }, - { - 0.196700f, 0.187100f, 0.962400f, 0.000000f, - -0.640300f, -0.718900f, 0.270600f, 0.000000f, - -0.742500f, 0.669500f, 0.021700f, 0.000000f, - -23.081848f, 57.105099f, 17627.578125f, 1.000000f, - }, - { - 1.036500f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.036500f, 0.000000f, - 0.000000f, 1.036500f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 17994.193359f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 16817.216797f, 1.000000f, - }, - { - -0.018200f, 0.187100f, 0.982200f, 0.000000f, - -0.683900f, -0.718900f, 0.124300f, 0.000000f, - -0.729300f, 0.669500f, -0.141000f, 0.000000f, - -20.007050f, 57.105099f, 16486.400391f, 1.000000f, - }, - { - 1.039500f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.039500f, 0.000000f, - 0.000000f, 1.039500f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 16849.660156f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 15610.111328f, 1.000000f, - }, - { - -0.225800f, 0.187100f, 0.956000f, 0.000000f, - -0.694700f, -0.718900f, -0.023400f, 0.000000f, - -0.682900f, 0.669500f, -0.292300f, 0.000000f, - -17.795149f, 57.105099f, 15283.111328f, 1.000000f, - }, - { - 1.040000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.040000f, 0.000000f, - 0.000000f, 1.040000f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 15642.555664f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 14356.078125f, 1.000000f, - }, - { - -0.414200f, 0.187100f, 0.890800f, 0.000000f, - -0.675700f, -0.718900f, -0.163200f, 0.000000f, - -0.609900f, 0.669500f, -0.424100f, 0.000000f, - -16.485548f, 57.105099f, 14033.073242f, 1.000000f, - }, - { - 1.037200f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.037200f, 0.000000f, - 0.000000f, 1.037200f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 14388.522461f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 13070.758789f, 1.000000f, - }, - { - -0.577800f, 0.187100f, 0.794500f, 0.000000f, - -0.631700f, -0.718900f, -0.290100f, 0.000000f, - -0.516900f, 0.669500f, -0.533500f, 0.000000f, - -16.012848f, 57.105099f, 12751.730469f, 1.000000f, - }, - { - 1.031000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.031000f, 0.000000f, - 0.000000f, 1.031000f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 13103.203125f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 11769.795898f, 1.000000f, - }, - { - -0.715900f, 0.187100f, 0.672600f, 0.000000f, - -0.566400f, -0.718900f, -0.402900f, 0.000000f, - -0.408200f, 0.669500f, -0.620600f, 0.000000f, - -16.293648f, 57.105099f, 11454.640625f, 1.000000f, - }, - { - 1.022700f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.022700f, 0.000000f, - 0.000000f, 1.022700f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 11802.240234f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 10468.833984f, 1.000000f, - }, - { - -0.827900f, 0.187100f, 0.528800f, 0.000000f, - -0.482200f, -0.718900f, -0.500600f, 0.000000f, - -0.286500f, 0.669500f, -0.685400f, 0.000000f, - -17.278248f, 57.105099f, 10157.392578f, 1.000000f, - }, - { - 1.013400f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.013400f, 0.000000f, - 0.000000f, 1.013400f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 10501.278320f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 9183.513672f, 1.000000f, - }, - { - -0.912000f, 0.187100f, 0.365100f, 0.000000f, - -0.380400f, -0.718900f, -0.581800f, 0.000000f, - -0.153600f, 0.669500f, -0.726800f, 0.000000f, - -18.951847f, 57.105099f, 8875.574219f, 1.000000f, - }, - { - 1.004100f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004100f, 0.000000f, - 0.000000f, 1.004100f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 9215.958008f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 7929.480957f, 1.000000f, - }, - { - -0.965100f, 0.187100f, 0.183100f, 0.000000f, - -0.261500f, -0.718900f, -0.644000f, 0.000000f, - -0.011100f, 0.669500f, -0.742800f, 0.000000f, - -21.328348f, 57.105099f, 7624.758301f, 1.000000f, - }, - { - 0.996000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.996000f, 0.000000f, - 0.000000f, 0.996000f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 7961.925293f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 6722.375488f, 1.000000f, - }, - { - -0.982200f, 0.187100f, -0.015200f, 0.000000f, - -0.126300f, -0.718900f, -0.683500f, 0.000000f, - 0.138800f, 0.669500f, -0.729800f, 0.000000f, - -24.438049f, 57.105099f, 6420.471191f, 1.000000f, - }, - { - 0.990300f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.990300f, 0.000000f, - 0.000000f, 0.990300f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 6754.819824f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 5577.841309f, 1.000000f, - }, - { - -0.956000f, 0.187100f, -0.225800f, 0.000000f, - 0.023400f, -0.718900f, -0.694700f, 0.000000f, - 0.292300f, 0.669500f, -0.682900f, 0.000000f, - -28.305548f, 57.105099f, 5278.185547f, 1.000000f, - }, - { - 0.988000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.988000f, 0.000000f, - 0.000000f, 0.988000f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 5610.285645f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 4511.521484f, 1.000000f, - }, - { - -0.878200f, 0.187100f, -0.440200f, 0.000000f, - 0.183000f, -0.718900f, -0.670600f, 0.000000f, - 0.441900f, 0.669500f, -0.597100f, 0.000000f, - -32.898449f, 57.105099f, 4213.296387f, 1.000000f, - }, - { - 0.991400f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.991400f, 0.000000f, - 0.000000f, 0.991400f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 4543.965332f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 3539.058594f, 1.000000f, - }, - { - -0.743400f, 0.187100f, -0.642200f, 0.000000f, - 0.341900f, -0.718900f, -0.605200f, 0.000000f, - 0.574900f, 0.669500f, -0.470500f, 0.000000f, - -38.008450f, 57.105099f, 3241.149658f, 1.000000f, - }, - { - 1.000100f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000100f, 0.000000f, - 0.000000f, 1.000100f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 3571.502441f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 2676.096436f, 1.000000f, - }, - { - -0.553100f, 0.187100f, -0.811800f, 0.000000f, - 0.486100f, -0.718900f, -0.496800f, 0.000000f, - 0.676600f, 0.669500f, -0.306700f, 0.000000f, - -43.285347f, 57.105099f, 2377.160400f, 1.000000f, - }, - { - 1.011600f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.011600f, 0.000000f, - 0.000000f, 1.011600f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 2708.540283f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1938.275757f, 1.000000f, - }, - { - -0.316400f, 0.187100f, -0.930000f, 0.000000f, - 0.601100f, -0.718900f, -0.349100f, 0.000000f, - 0.733900f, 0.669500f, -0.115000f, 0.000000f, - -48.290947f, 57.105099f, 1636.875488f, 1.000000f, - }, - { - 1.023400f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.023400f, 0.000000f, - 0.000000f, 1.023400f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1970.719727f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.049500f, 0.187100f, -0.981100f, 0.000000f, - 0.673700f, -0.718900f, -0.171100f, 0.000000f, - 0.737300f, 0.669500f, 0.090500f, 0.000000f, - -52.555748f, 57.105099f, 1036.013794f, 1.000000f, - }, - { - 1.032800f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.032800f, 0.000000f, - 0.000000f, 1.032800f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.225800f, 0.187100f, -0.956000f, 0.000000f, - 0.694700f, -0.718900f, 0.023400f, 0.000000f, - 0.682900f, 0.669500f, 0.292300f, 0.000000f, - -55.649448f, 57.105099f, 1031.074585f, 1.000000f, - }, - { - 1.037400f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.037400f, 0.000000f, - 0.000000f, 1.037400f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.491100f, 0.187100f, -0.850800f, 0.000000f, - 0.658600f, -0.718900f, 0.222200f, 0.000000f, - 0.570100f, 0.669500f, 0.476300f, 0.000000f, - -57.270248f, 57.105099f, 1025.276733f, 1.000000f, - }, - { - 1.037900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.037900f, 0.000000f, - 0.000000f, 1.037900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.723400f, 0.187100f, -0.664600f, 0.000000f, - 0.561800f, -0.718900f, 0.409300f, 0.000000f, - 0.401200f, 0.669500f, 0.625200f, 0.000000f, - -57.111149f, 57.105099f, 1019.001221f, 1.000000f, - }, - { - 1.036800f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.036800f, 0.000000f, - 0.000000f, 1.036800f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.892600f, 0.187100f, -0.410300f, 0.000000f, - 0.409000f, -0.718900f, 0.562000f, 0.000000f, - 0.189800f, 0.669500f, 0.718200f, 0.000000f, - -55.002949f, 57.105099f, 1012.916504f, 1.000000f, - }, - { - 1.034500f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.034500f, 0.000000f, - 0.000000f, 1.034500f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.975800f, 0.187100f, -0.113200f, 0.000000f, - 0.214500f, -0.718900f, 0.661200f, 0.000000f, - -0.042300f, 0.669500f, 0.741600f, 0.000000f, - -51.079346f, 57.105099f, 1007.726318f, 1.000000f, - }, - { - 1.031200f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.031200f, 0.000000f, - 0.000000f, 1.031200f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.963000f, 0.187100f, 0.193800f, 0.000000f, - -0.000200f, -0.718900f, 0.695100f, 0.000000f, - -0.269300f, 0.669500f, 0.692300f, 0.000000f, - -45.765148f, 57.105099f, 1004.021790f, 1.000000f, - }, - { - 1.027000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.027000f, 0.000000f, - 0.000000f, 1.027000f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.859000f, 0.187100f, 0.476600f, 0.000000f, - -0.210900f, -0.718900f, 0.662300f, 0.000000f, - -0.466500f, 0.669500f, 0.578100f, 0.000000f, - -39.690350f, 57.105099f, 1002.157410f, 1.000000f, - }, - { - 1.022400f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.022400f, 0.000000f, - 0.000000f, 1.022400f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.681700f, 0.187100f, 0.707300f, 0.000000f, - -0.395700f, -0.718900f, 0.571500f, 0.000000f, - -0.615400f, 0.669500f, 0.416100f, 0.000000f, - -33.554749f, 57.105099f, 1002.187256f, 1.000000f, - }, - { - 1.017400f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.017400f, 0.000000f, - 0.000000f, 1.017400f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.458000f, 0.187100f, 0.869100f, 0.000000f, - -0.539100f, -0.718900f, 0.438800f, 0.000000f, - -0.706900f, 0.669500f, 0.228400f, 0.000000f, - -27.984049f, 57.105099f, 1003.876953f, 1.000000f, - }, - { - 1.012300f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.012300f, 0.000000f, - 0.000000f, 1.012300f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.217300f, 0.187100f, 0.958000f, 0.000000f, - -0.634300f, -0.718900f, 0.284200f, 0.000000f, - -0.741900f, 0.669500f, 0.037500f, 0.000000f, - -23.418049f, 57.105099f, 1006.781006f, 1.000000f, - }, - { - 1.007400f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.007400f, 0.000000f, - 0.000000f, 1.007400f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.011500f, 0.187100f, 0.982300f, 0.000000f, - -0.683000f, -0.718900f, 0.128900f, 0.000000f, - -0.730300f, 0.669500f, -0.136000f, 0.000000f, - -20.090649f, 57.105099f, 1010.310059f, 1.000000f, - }, - { - 1.001600f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.001600f, 0.000000f, - 0.000000f, 1.001600f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.214400f, 0.187100f, 0.958700f, 0.000000f, - -0.694900f, -0.718900f, -0.015100f, 0.000000f, - -0.686400f, 0.669500f, -0.284100f, 0.000000f, - -17.896347f, 57.105099f, 1014.017090f, 1.000000f, - }, - { - 0.994300f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.994300f, 0.000000f, - 0.000000f, 0.994300f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.391300f, 0.187100f, 0.901000f, 0.000000f, - -0.679600f, -0.718900f, -0.145900f, 0.000000f, - -0.620500f, 0.669500f, -0.408500f, 0.000000f, - -16.604847f, 57.105099f, 1017.721558f, 1.000000f, - }, - { - 0.986100f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.986100f, 0.000000f, - 0.000000f, 0.986100f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.545300f, 0.187100f, 0.817100f, 0.000000f, - -0.642900f, -0.718900f, -0.264400f, 0.000000f, - -0.538000f, 0.669500f, -0.512300f, 0.000000f, - -16.047749f, 57.105099f, 1021.376709f, 1.000000f, - }, - { - 0.977700f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.977700f, 0.000000f, - 0.000000f, 0.977700f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.679500f, 0.187100f, 0.709400f, 0.000000f, - -0.586800f, -0.718900f, -0.372600f, 0.000000f, - -0.440300f, 0.669500f, -0.598300f, 0.000000f, - -16.141548f, 57.105099f, 1025.005493f, 1.000000f, - }, - { - 0.969900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.969900f, 0.000000f, - 0.000000f, 0.969900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.795500f, 0.187100f, 0.576300f, 0.000000f, - -0.510700f, -0.718900f, -0.471600f, 0.000000f, - -0.326100f, 0.669500f, -0.667400f, 0.000000f, - -16.893848f, 57.105099f, 1028.650513f, 1.000000f, - }, - { - 0.963300f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.963300f, 0.000000f, - 0.000000f, 0.963300f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.890900f, 0.187100f, 0.413900f, 0.000000f, - -0.411300f, -0.718900f, -0.560400f, 0.000000f, - -0.192700f, 0.669500f, -0.717400f, 0.000000f, - -18.402348f, 57.105099f, 1032.325195f, 1.000000f, - }, - { - 0.958800f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.958800f, 0.000000f, - 0.000000f, 0.958800f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.958000f, 0.187100f, 0.217300f, 0.000000f, - -0.284200f, -0.718900f, -0.634300f, 0.000000f, - -0.037500f, 0.669500f, -0.741900f, 0.000000f, - -20.845448f, 57.105099f, 1035.962158f, 1.000000f, - }, - { - 0.957000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.957000f, 0.000000f, - 0.000000f, 0.957000f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.982300f, 0.187100f, -0.013000f, 0.000000f, - -0.127900f, -0.718900f, -0.683200f, 0.000000f, - 0.137100f, 0.669500f, -0.730100f, 0.000000f, - -24.399748f, 57.105099f, 1039.308228f, 1.000000f, - }, - { - 0.958800f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.958800f, 0.000000f, - 0.000000f, 0.958800f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.947100f, 0.187100f, -0.260700f, 0.000000f, - 0.048800f, -0.718900f, -0.693400f, 0.000000f, - 0.317100f, 0.669500f, -0.671800f, 0.000000f, - -29.005148f, 57.105099f, 1041.880859f, 1.000000f, - }, - { - 0.963900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.963900f, 0.000000f, - 0.000000f, 0.963900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.844400f, 0.187100f, -0.502000f, 0.000000f, - 0.230600f, -0.718900f, -0.655700f, 0.000000f, - 0.483600f, 0.669500f, -0.563900f, 0.000000f, - -34.367550f, 57.105099f, 1043.237793f, 1.000000f, - }, - { - 0.971800f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.971800f, 0.000000f, - 0.000000f, 0.971800f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.677300f, 0.187100f, -0.711500f, 0.000000f, - 0.399200f, -0.718900f, -0.569000f, 0.000000f, - 0.618000f, 0.669500f, -0.412200f, 0.000000f, - -40.015949f, 57.105099f, 1043.108643f, 1.000000f, - }, - { - 0.981700f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.981700f, 0.000000f, - 0.000000f, 0.981700f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.460700f, 0.187100f, -0.867600f, 0.000000f, - 0.537700f, -0.718900f, -0.440500f, 0.000000f, - 0.706200f, 0.669500f, -0.230600f, 0.000000f, - -45.402149f, 57.105099f, 1041.465820f, 1.000000f, - }, - { - 0.993000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.993000f, 0.000000f, - 0.000000f, 0.993000f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.217300f, 0.187100f, -0.958000f, 0.000000f, - 0.634300f, -0.718900f, -0.284200f, 0.000000f, - 0.741900f, 0.669500f, -0.037500f, 0.000000f, - -50.026550f, 57.105099f, 1038.534790f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.034900f, 0.187100f, -0.981700f, 0.000000f, - 0.685900f, -0.718900f, -0.112600f, 0.000000f, - 0.726800f, 0.669500f, 0.153400f, 0.000000f, - -53.643948f, 57.105099f, 1034.605103f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.284000f, 0.187100f, -0.940400f, 0.000000f, - 0.692000f, -0.718900f, 0.066000f, 0.000000f, - 0.663700f, 0.669500f, 0.333600f, 0.000000f, - -56.130249f, 57.105099f, 1029.897339f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.513800f, 0.187100f, -0.837300f, 0.000000f, - 0.652400f, -0.718900f, 0.239800f, 0.000000f, - 0.557100f, 0.669500f, 0.491400f, 0.000000f, - -57.333046f, 57.105099f, 1024.724487f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.709500f, 0.187100f, -0.679400f, 0.000000f, - 0.570200f, -0.718900f, 0.397500f, 0.000000f, - 0.414100f, 0.669500f, 0.616700f, 0.000000f, - -57.182648f, 57.105099f, 1019.425110f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.858600f, 0.187100f, -0.477300f, 0.000000f, - 0.450800f, -0.718900f, 0.529100f, 0.000000f, - 0.244200f, 0.669500f, 0.701600f, 0.000000f, - -55.694046f, 57.105099f, 1014.342407f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.951600f, 0.187100f, -0.244000f, 0.000000f, - 0.301900f, -0.718900f, 0.626100f, 0.000000f, - 0.058300f, 0.669500f, 0.740600f, 0.000000f, - -52.966049f, 57.105099f, 1009.804321f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.982300f, 0.187100f, 0.005300f, 0.000000f, - 0.133200f, -0.718900f, 0.682200f, 0.000000f, - -0.131400f, 0.669500f, 0.731100f, 0.000000f, - -49.174549f, 57.105099f, 1006.104492f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - } -}; - -static Gu3dfInfo text_3dfinfo = { - { /* header */ - 0x00000040, /* width */ - 0x00000040, /* height */ -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) - GR_LOD_1, /* small_lod */ - GR_LOD_64, /* large_lod */ - GR_ASPECT_1x1, /* aspect_ratio */ -#else - 0x00000008, /* small_lod */ - 0x00000002, /* large_lod */ - GR_ASPECT_1x1, /* aspect_ratio */ -#endif - GR_TEXFMT_YIQ_422 /* format */ - }, - { /* table */ - { /* nccTable */ - { /* yRGB */ - 0x22, 0x22, 0x2b, 0x3c, - 0x44, 0x44, 0x66, 0x77, - 0x88, 0x99, 0xaa, 0xbb, - 0xcc, 0xdd, 0xee, 0xff - }, - { /* iRGB */ - { 0x01cf, 0x0027, 0x0023 }, - { 0x0001, 0x0000, 0x01ef }, - { 0x01e2, 0x000e, 0x0012 }, - { 0x01f4, 0x01ff, 0x01fc } - }, - { /* qRGB */ - { 0x01ee, 0x0019, 0x0010 }, - { 0x01e5, 0x0011, 0x0006 }, - { 0x01e8, 0x0009, 0x0008 }, - { 0x01eb, 0x0001, 0x0004 } - }, - { /* packed_data */ - 0x3c2b2222, 0x77664444, 0xbbaa9988, 0xffeeddcc, - 0x073c4e23, 0x000401ef, 0x07881c12, 0x07d3fffc, - 0x07b83210, 0x07942206, 0x07a01208, 0x07ac0204 - } - } - }, - NULL, /* data */ - 0x00001558 /* mem_required */ -}; - -unsigned char text_3dfinfo_image[] = { -0xc, -0xe, -0xe, -0xe, -0xc, -0x8, -0x3, -0x29, -0x9, -0x9, -0xa, -0xc, -0xb, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0x9, -0x8, -0x3, -0x9, -0x2e, -0xf, -0xe, -0xc, -0xa, -0x9, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x39, -0x0, -0x33, -0x32, -0x31, -0x30, -0x30, -0x40, -0x40, -0x40, -0x30, -0x30, -0x42, -0x32, -0x32, -0x21, -0x0, -0x22, -0x39, -0x22, -0x39, -0x39, -0x2, -0x2, -0x9, -0x9, -0xc, -0x2e, -0xe, -0xe, -0x2e, -0x9, -0x3, -0x29, -0x9, -0xa, -0x2e, -0x2e, -0xe, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0x9, -0x29, -0x3, -0x9, -0xd, -0xf, -0xe, -0x2e, -0xa, -0x9, -0x8, -0x3, -0x2, -0x2, -0x1, -0x22, -0x39, -0x22, -0x22, -0x22, -0x0, -0x21, -0x33, -0x32, -0x32, -0x31, -0x42, -0x42, -0x41, -0x42, -0x42, -0x31, -0x32, -0x31, -0x20, -0x20, -0x33, -0x21, -0x33, -0x21, -0x33, -0x0, -0x22, -0x1, -0x8, -0x29, -0x9, -0xc, -0xe, -0xe, -0xf, -0x2e, -0x8, -0x3, -0x8, -0x2d, -0x2e, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xc, -0x9, -0x8, -0x3, -0x9, -0xe, -0xf, -0xd, -0xb, -0xa, -0x9, -0x29, -0x2, -0x39, -0x22, -0x0, -0x21, -0x33, -0x21, -0x33, -0x21, -0x33, -0x33, -0x20, -0x20, -0x32, -0x20, -0x20, -0x20, -0x20, -0x32, -0x20, -0x32, -0x20, -0x32, -0x32, -0x20, -0x32, -0x32, -0x32, -0x31, -0x20, -0x33, -0x0, -0x2, -0x8, -0x9, -0x2e, -0xe, -0xe, -0xe, -0x9, -0x8, -0x3, -0x29, -0x9, -0xc, -0x2e, -0xd, -0xe, -0xe, -0xd, -0x2e, -0xc, -0x2b, -0x8, -0x29, -0x2a, -0x2e, -0xe, -0xe, -0x2e, -0xc, -0x9, -0x8, -0x2, -0x2, -0x39, -0x22, -0x0, -0x33, -0x21, -0x33, -0x0, -0x33, -0x0, -0x0, -0x33, -0x0, -0x0, -0x0, -0x0, -0x0, -0x22, -0x0, -0x0, -0x33, -0x20, -0x20, -0x32, -0x31, -0x32, -0x31, -0x42, -0x31, -0x32, -0x20, -0x0, -0x23, -0x9, -0x2e, -0xe, -0xe, -0x9, -0x29, -0x3, -0x29, -0x29, -0x9, -0x2a, -0x9, -0x9, -0x2a, -0x8, -0x9, -0x8, -0x29, -0x29, -0x8, -0x9, -0x2e, -0xe, -0xe, -0x2e, -0xa, -0x9, -0x8, -0x3, -0x23, -0x1, -0x22, -0x0, -0x0, -0x0, -0x33, -0x21, -0x21, -0x33, -0x0, -0x22, -0x39, -0x1, -0x2, -0x2, -0x3, -0x2, -0x29, -0x3, -0x2, -0x2, -0x39, -0x0, -0x33, -0x20, -0x31, -0x42, -0x41, -0x42, -0x42, -0x31, -0x20, -0x0, -0x2, -0xc, -0xe, -0xe, -0xa, -0x2, -0x29, -0x8, -0x9, -0x9, -0x9, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x29, -0x9, -0xc, -0xe, -0xf, -0xe, -0x2e, -0xc, -0x9, -0x29, -0x2, -0x2, -0x39, -0x22, -0x0, -0x0, -0x33, -0x0, -0x0, -0x0, -0x33, -0x0, -0x22, -0x39, -0x2, -0x2, -0x29, -0x8, -0x9, -0x9, -0x9, -0x9, -0x2a, -0x29, -0x2, -0x1, -0x0, -0x20, -0x32, -0x41, -0x42, -0x30, -0x42, -0x31, -0x20, -0x22, -0x2, -0x2e, -0xe, -0xe, -0xa, -0x8, -0x29, -0x29, -0x9, -0x9, -0x9, -0x9, -0x8, -0x29, -0x3, -0x29, -0x2, -0x2, -0x29, -0x3, -0x8, -0x9, -0x2e, -0xe, -0xe, -0xe, -0x2e, -0xc, -0x9, -0x8, -0x3, -0x2, -0x39, -0x22, -0x0, -0x0, -0x33, -0x21, -0x33, -0x0, -0x0, -0x22, -0x23, -0x2, -0x29, -0x29, -0x9, -0x9, -0x9, -0x9, -0x2a, -0x29, -0x2, -0x2, -0x39, -0x0, -0x33, -0x20, -0x20, -0x20, -0x33, -0x21, -0x22, -0x2, -0x29, -0x2e, -0xe, -0xe, -0xa, -0x29, -0x3, -0x29, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x29, -0x8, -0x2a, -0x8, -0x8, -0x29, -0x8, -0x3, -0x29, -0x29, -0x2d, -0x2e, -0xe, -0xe, -0x2e, -0xa, -0x9, -0x2, -0x1, -0x0, -0x33, -0x20, -0x32, -0x20, -0x20, -0x33, -0x0, -0x22, -0x23, -0x2, -0x29, -0x29, -0x8, -0x9, -0x2a, -0x29, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x39, -0x23, -0x1, -0x2, -0x2, -0x3, -0x8, -0xc, -0x2e, -0xe, -0xf, -0xc, -0x9, -0x2, -0x29, -0x8, -0x9, -0x9, -0x9, -0x9, -0xa, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x8, -0x3, -0x2, -0x8, -0xc, -0xe, -0xe, -0xe, -0xa, -0x9, -0x3, -0x1, -0x0, -0x33, -0x20, -0x32, -0x32, -0x20, -0x33, -0x0, -0x22, -0x39, -0x2, -0x2, -0x29, -0x29, -0x8, -0x8, -0x29, -0x29, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x29, -0x8, -0xc, -0xc, -0x2e, -0xe, -0xe, -0xe, -0x9, -0x29, -0x3, -0x29, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0xd, -0x2e, -0xe, -0x2e, -0xa, -0x9, -0x8, -0x29, -0x29, -0xa, -0xd, -0xe, -0xe, -0x2e, -0xa, -0x9, -0x3, -0x23, -0x0, -0x0, -0x32, -0x32, -0x31, -0x32, -0x32, -0x32, -0x20, -0x21, -0x0, -0x22, -0x22, -0x1, -0x23, -0x1, -0x23, -0x1, -0x23, -0x1, -0x1, -0x23, -0x1, -0x22, -0x1, -0x22, -0x1, -0x22, -0x2, -0x2, -0x3, -0x9, -0x9, -0xa, -0x2e, -0xe, -0xe, -0xe, -0xc, -0x8, -0x3, -0x9, -0xa, -0xd, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0x9, -0x2a, -0x8, -0x9, -0xe, -0xe, -0x2e, -0xc, -0x2b, -0x8, -0x29, -0x1, -0x22, -0x21, -0x20, -0x32, -0x31, -0x32, -0x31, -0x31, -0x32, -0x32, -0x20, -0x20, -0x33, -0x21, -0x33, -0x21, -0x21, -0x33, -0x21, -0x0, -0x33, -0x0, -0x0, -0x0, -0x0, -0x0, -0x22, -0x0, -0x22, -0x22, -0x39, -0x2, -0x29, -0x8, -0x9, -0xc, -0x2e, -0xe, -0xf, -0xd, -0x9, -0x3, -0x29, -0x9, -0xc, -0x2e, -0xe, -0xe, -0xe, -0xe, -0xe, -0xc, -0x9, -0x3, -0x8, -0x2e, -0xf, -0xe, -0x2e, -0xa, -0x9, -0x29, -0x2, -0x1, -0x0, -0x33, -0x20, -0x32, -0x31, -0x42, -0x31, -0x42, -0x31, -0x20, -0x20, -0x33, -0x21, -0x0, -0x0, -0x22, -0x22, -0x0, -0x22, -0x0, -0x0, -0x0, -0x33, -0x0, -0x33, -0x21, -0x20, -0x33, -0x20, -0x33, -0x0, -0x22, -0x2, -0x2, -0x29, -0x9, -0x2e, -0x2e, -0xe, -0xf, -0x2e, -0x9, -0x29, -0x3, -0x29, -0x9, -0x9, -0xa, -0xc, -0xa, -0x9, -0x29, -0x8, -0x29, -0xc, -0xe, -0xe, -0x2e, -0xc, -0x9, -0x8, -0x3, -0x1, -0x22, -0x21, -0x32, -0x31, -0x42, -0x42, -0x30, -0x30, -0x42, -0x31, -0x32, -0x33, -0x0, -0x39, -0x2, -0x2, -0x29, -0x3, -0x8, -0x2, -0x2, -0x39, -0x0, -0x33, -0x20, -0x31, -0x42, -0x42, -0x30, -0x42, -0x42, -0x31, -0x20, -0x22, -0x1, -0x3, -0x8, -0xc, -0xb, -0xe, -0xe, -0xf, -0x2e, -0x9, -0x8, -0x2, -0x29, -0x29, -0x29, -0x8, -0x8, -0x29, -0x2, -0x8, -0xc, -0xe, -0xf, -0xe, -0x2e, -0xa, -0x9, -0x29, -0x2, -0x1, -0x22, -0x33, -0x20, -0x31, -0x42, -0x30, -0x30, -0x30, -0x42, -0x31, -0x20, -0x0, -0x22, -0x2, -0x8, -0x29, -0x9, -0x9, -0x9, -0x8, -0x3, -0x1, -0x22, -0x33, -0x31, -0x42, -0x30, -0x30, -0x30, -0x30, -0x30, -0x42, -0x32, -0x21, -0x1, -0x2, -0x8, -0x9, -0xa, -0x2e, -0xe, -0xe, -0xe, -0x2e, -0x9, -0x3, -0x2, -0x29, -0x29, -0x29, -0x8, -0x3, -0x2, -0x9, -0xc, -0xe, -0xf, -0xd, -0x2e, -0xa, -0x9, -0x29, -0x2, -0x2, -0x39, -0x22, -0x21, -0x33, -0x33, -0x20, -0x20, -0x20, -0x33, -0x0, -0x22, -0x1, -0x2, -0x29, -0x2a, -0x9, -0x9, -0xa, -0x9, -0x9, -0x29, -0x2, -0x2, -0x22, -0x21, -0x32, -0x32, -0x31, -0x32, -0x31, -0x20, -0x20, -0x33, -0x0, -0x2, -0x2, -0x2, -0x29, -0x9, -0x9, -0xb, -0xd, -0xe, -0xe, -0x2e, -0x9, -0x3, -0x2, -0x29, -0x8, -0x3, -0x2, -0x29, -0x9, -0x2e, -0xf, -0xe, -0xe, -0xc, -0x2b, -0x9, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x8, -0x8, -0x29, -0x8, -0x9, -0x9, -0x9, -0xa, -0x2d, -0xa, -0xc, -0x9, -0x9, -0x8, -0x29, -0x2, -0x2, -0x1, -0x22, -0x22, -0x22, -0x39, -0x39, -0x39, -0x39, -0x39, -0x2, -0x2, -0x2, -0x29, -0x9, -0x9, -0x2e, -0xd, -0xe, -0xe, -0x2e, -0x9, -0x3, -0x2, -0x29, -0x29, -0x8, -0x2, -0x29, -0x9, -0x2e, -0xf, -0xe, -0xd, -0x2e, -0xa, -0x9, -0x8, -0x29, -0x3, -0x3, -0x2, -0x8, -0x8, -0x29, -0x29, -0x29, -0x29, -0x8, -0x29, -0x9, -0x2a, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x29, -0x3, -0x2, -0x2, -0x23, -0x1, -0x39, -0x1, -0x22, -0x23, -0x39, -0x23, -0x3, -0x29, -0x9, -0xa, -0x2e, -0xd, -0xe, -0xe, -0x2e, -0x9, -0x8, -0x3, -0x29, -0x8, -0x9, -0x8, -0x2a, -0x29, -0x3, -0x8, -0x9, -0x2e, -0xf, -0xe, -0x2e, -0xc, -0x2b, -0x9, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x23, -0x23, -0x1, -0x2, -0x1, -0x23, -0x1, -0x39, -0x1, -0x22, -0x22, -0x39, -0x22, -0x22, -0x22, -0x0, -0x22, -0x0, -0x0, -0x0, -0x33, -0x21, -0x33, -0x0, -0x0, -0x39, -0x23, -0x29, -0x9, -0x2e, -0xe, -0xe, -0xf, -0x2e, -0x9, -0x8, -0x2, -0x29, -0x29, -0x9, -0x9, -0x9, -0xa, -0x9, -0x9, -0x8, -0x2, -0x8, -0xa, -0xe, -0xf, -0xe, -0x2e, -0xc, -0x2b, -0x9, -0x29, -0x2, -0x2, -0x1, -0x22, -0x22, -0x0, -0x0, -0x0, -0x0, -0x33, -0x21, -0x20, -0x20, -0x32, -0x32, -0x31, -0x31, -0x42, -0x42, -0x31, -0x42, -0x31, -0x31, -0x43, -0x31, -0x32, -0x31, -0x32, -0x32, -0x32, -0x20, -0x33, -0x39, -0x2, -0x9, -0xc, -0x2e, -0xe, -0xf, -0x2e, -0x9, -0x8, -0x2, -0x3, -0x29, -0x8, -0x9, -0x9, -0x9, -0x9, -0x9, -0x2a, -0x29, -0x3, -0x2, -0x9, -0x2e, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0xa, -0x9, -0x29, -0x2, -0x2, -0x39, -0x39, -0x22, -0x0, -0x0, -0x33, -0x0, -0x21, -0x33, -0x20, -0x20, -0x32, -0x32, -0x32, -0x31, -0x31, -0x43, -0x31, -0x32, -0x32, -0x20, -0x20, -0x20, -0x33, -0x20, -0x33, -0x0, -0x0, -0x22, -0x2, -0x2, -0x2e, -0xe, -0xe, -0xe, -0x2e, -0x9, -0x8, -0x2, -0x2, -0x29, -0x3, -0x3, -0x3, -0x2, -0x29, -0x2, -0x29, -0x2, -0x8, -0x2, -0x2, -0x2, -0x29, -0x8, -0x9, -0x2e, -0xe, -0xe, -0xe, -0xb, -0x2d, -0x2a, -0x29, -0x2, -0x1, -0x22, -0x22, -0x22, -0x22, -0x22, -0x22, -0x22, -0x22, -0x22, -0x22, -0x22, -0x0, -0x22, -0x0, -0x22, -0x22, -0x39, -0x39, -0x1, -0x23, -0x2, -0x2, -0x2, -0x8, -0x2, -0x29, -0x29, -0x9, -0x9, -0xe, -0xe, -0xf, -0x2e, -0x9, -0x29, -0x2, -0x3, -0x2, -0x8, -0x2, -0x2, -0x2, -0x3, -0x29, -0x29, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x3, -0x2, -0x3, -0x8, -0xc, -0xe, -0xe, -0xe, -0x2e, -0xa, -0x8, -0x8, -0x2, -0x1, -0x22, -0x39, -0x39, -0x1, -0x23, -0x1, -0x23, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x29, -0x29, -0x29, -0x8, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0xc, -0x2e, -0xe, -0xe, -0xf, -0x2e, -0xa, -0x29, -0x2, -0x2, -0x2, -0x2, -0x29, -0x29, -0x29, -0x9, -0x9, -0xa, -0x9, -0x9, -0xa, -0x9, -0xc, -0x2b, -0xc, -0x2e, -0x2e, -0xe, -0xe, -0xe, -0x2e, -0xc, -0xa, -0x9, -0x8, -0x29, -0x29, -0x2, -0x2, -0x3, -0x2, -0x29, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x29, -0x29, -0x8, -0x9, -0x9, -0x9, -0xa, -0xa, -0x2d, -0xa, -0xc, -0x2e, -0x2e, -0xe, -0xe, -0xf, -0xe, -0x2e, -0x9, -0x8, -0x29, -0x29, -0x8, -0x9, -0xa, -0x2e, -0xd, -0xe, -0xe, -0xe, -0xe, -0xe, -0xf, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0xa, -0x9, -0x9, -0x29, -0x29, -0x29, -0x8, -0x8, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x29, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x29, -0x29, -0x2a, -0x9, -0xa, -0xc, -0xc, -0x2e, -0x2e, -0xb, -0x2e, -0x2e, -0x2e, -0xd, -0xd, -0xe, -0xe, -0xe, -0xe, -0x2e, -0xa, -0x9, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0xe, -0xe, -0xe, -0xe, -0xf, -0xf, -0xe, -0xe, -0xd, -0xb, -0xc, -0xa, -0x9, -0x29, -0x29, -0x3, -0x3, -0x29, -0x29, -0x8, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x2a, -0x29, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x3, -0x29, -0x8, -0x9, -0x9, -0xa, -0x2d, -0xa, -0xc, -0xa, -0xa, -0x2d, -0xa, -0xd, -0x8, -0x9, -0x9, -0x2e, -0x2e, -0xe, -0xe, -0xe, -0xe, -0x2e, -0xc, -0x2b, -0x9, -0x29, -0x29, -0x2a, -0x29, -0x9, -0x9, -0xa, -0xd, -0xe, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0x2d, -0x9, -0x9, -0x2a, -0x29, -0x29, -0x3, -0x3, -0x2, -0x2, -0x3, -0x2, -0x2, -0x3, -0x2, -0x2, -0x2, -0x2, -0x23, -0x23, -0x1, -0x22, -0x1, -0x22, -0x1, -0x22, -0x1, -0x39, -0x1, -0x23, -0x1, -0x23, -0x1, -0x39, -0x1, -0x23, -0x29, -0x22, -0x1, -0x2, -0x3, -0x8, -0x9, -0xc, -0x2e, -0xe, -0xf, -0xc, -0x9, -0x2, -0x29, -0x29, -0x2a, -0x29, -0x8, -0x29, -0x2, -0x3, -0x8, -0x9, -0x2e, -0xe, -0xf, -0xe, -0xe, -0x2e, -0xc, -0x9, -0x8, -0x3, -0x2, -0x39, -0x22, -0x0, -0x22, -0x0, -0x22, -0x22, -0x22, -0x22, -0x39, -0x39, -0x39, -0x39, -0x22, -0x0, -0x0, -0x0, -0x33, -0x20, -0x32, -0x32, -0x31, -0x31, -0x42, -0x31, -0x42, -0x31, -0x31, -0x32, -0x0, -0x22, -0x1, -0x2, -0x8, -0x8, -0x9, -0xa, -0x2e, -0xe, -0xe, -0xe, -0x2e, -0x9, -0x8, -0x8, -0x8, -0x8, -0x29, -0x29, -0x8, -0x2a, -0x9, -0xc, -0xb, -0xd, -0xf, -0xf, -0xe, -0xe, -0x2e, -0xc, -0x9, -0x9, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x23, -0x1, -0x39, -0x22, -0x0, -0x33, -0x20, -0x32, -0x31, -0x42, -0x42, -0x42, -0x42, -0x31, -0x32, -0x32, -0x20, -0x2, -0x2, -0x29, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0xd, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0x2e, -0xe, -0x2e, -0xe, -0xf, -0xf, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0x2e, -0xc, -0xc, -0xa, -0xc, -0xa, -0xc, -0xa, -0xc, -0xa, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x29, -0x2, -0x39, -0x0, -0x33, -0x20, -0x32, -0x31, -0x42, -0x31, -0x32, -0x20, -0x33, -0x0, -0x2, -0x29, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0x2e, -0x2e, -0xd, -0xe, -0xe, -0xf, -0xe, -0xf, -0xe, -0xe, -0xf, -0xf, -0xe, -0xf, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0x2e, -0xd, -0xb, -0x2e, -0x2e, -0xc, -0xc, -0xa, -0x9, -0x29, -0x2, -0x39, -0x0, -0x33, -0x20, -0x32, -0x31, -0x32, -0x32, -0x33, -0x21, -0x22, -0x2, -0x29, -0x9, -0xa, -0xc, -0xc, -0xb, -0x2e, -0xd, -0x2e, -0xe, -0x2e, -0xd, -0x2e, -0xe, -0x2e, -0xd, -0x2e, -0xe, -0xe, -0xd, -0xe, -0xe, -0xe, -0xd, -0xe, -0x2e, -0x2e, -0xd, -0x2e, -0xd, -0x2e, -0xe, -0xe, -0xe, -0xd, -0xe, -0xe, -0xe, -0x2e, -0xd, -0xb, -0x2e, -0xc, -0xa, -0x9, -0x9, -0x9, -0x9, -0x8, -0x3, -0x2, -0x1, -0x22, -0x0, -0x33, -0x32, -0x20, -0x32, -0x32, -0x20, -0x33, -0x0, -0x1, -0x3, -0x29, -0x9, -0xa, -0xc, -0xc, -0x2e, -0x2e, -0xe, -0xe, -0xe, -0xf, -0xf, -0xe, -0xe, -0xe, -0xf, -0xe, -0xf, -0xe, -0xd, -0xb, -0xc, -0x9, -0x9, -0x2a, -0x9, -0x2a, -0x9, -0x9, -0x9, -0xa, -0xc, -0xc, -0xb, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0x2b, -0x9, -0x8, -0x3, -0x2, -0x2, -0x1, -0x23, -0x39, -0x22, -0x0, -0x0, -0x33, -0x0, -0x20, -0x32, -0x32, -0x20, -0x20, -0x33, -0x21, -0x22, -0x1, -0x2, -0x29, -0x8, -0x9, -0x9, -0xa, -0xc, -0xc, -0xb, -0xd, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xd, -0x2e, -0xa, -0x9, -0x9, -0x29, -0x29, -0x8, -0x29, -0x8, -0x29, -0x9, -0x9, -0xa, -0xc, -0xc, -0xa, -0x2e, -0xc, -0xc, -0xa, -0x9, -0x9, -0x8, -0x8, -0x2, -0x2, -0x1, -0x22, -0x39, -0x22, -0x22, -0x0, -0x0, -0x0, -0x33, -0x21, -0x33, -0x21, -0x33, -0x0, -0x0, -0x0, -0x22, -0x2, -0x1, -0x23, -0x1, -0x1, -0x23, -0x2, -0x2, -0x2, -0x29, -0x29, -0x8, -0x8, -0x9, -0x8, -0x9, -0x9, -0x2a, -0x9, -0x9, -0x9, -0x9, -0x9, -0xa, -0x9, -0x2d, -0xa, -0xc, -0xa, -0x2d, -0xa, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x9, -0x8, -0x9, -0x2a, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x8, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x23, -0x0, -0x0, -0x20, -0x20, -0x32, -0x20, -0x20, -0x20, -0x20, -0x33, -0x20, -0x33, -0x21, -0x33, -0x0, -0x33, -0x0, -0x0, -0x39, -0x2, -0x29, -0x9, -0x9, -0x2e, -0x2e, -0xd, -0xe, -0x2e, -0x2e, -0xb, -0xc, -0x9, -0x9, -0x29, -0x2, -0x2, -0x2, -0x2, -0x2, -0x3, -0x29, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0x2e, -0xd, -0xb, -0x2e, -0xc, -0xa, -0x2d, -0x9, -0x9, -0x9, -0x9, -0x2a, -0x9, -0x2a, -0x29, -0x29, -0x2, -0x1, -0x22, -0x33, -0x20, -0x32, -0x32, -0x31, -0x32, -0x32, -0x32, -0x20, -0x32, -0x32, -0x20, -0x32, -0x32, -0x20, -0x32, -0x33, -0x0, -0x22, -0x23, -0x2, -0x8, -0x9, -0x9, -0xc, -0x2e, -0xc, -0xa, -0xc, -0xa, -0x9, -0x9, -0x2a, -0x29, -0x29, -0x29, -0x29, -0x29, -0x9, -0x9, -0x9, -0xc, -0x2e, -0xb, -0xd, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0xc, -0xa, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x29, -0x3, -0x1, -0x1, -0x22, -0x0, -0x0, -0x33, -0x20, -0x33, -0x20, -0x33, -0x20, -0x20, -0x20, -0x20, -0x32, -0x32, -0x20, -0x32, -0x20, -0x33, -0x21, -0x33, -0x0, -0x22, -0x22, -0x39, -0x23, -0x2, -0x2, -0x29, -0x8, -0x9, -0x9, -0xc, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xd, -0x2e, -0x2e, -0x2e, -0xc, -0xc, -0xa, -0x2d, -0x2b, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x29, -0x8, -0x2, -0x2, -0x39, -0x39, -0x0, -0x0, -0x0, -0x33, -0x21, -0x21, -0x33, -0x33, -0x20, -0x20, -0x32, -0x32, -0x20, -0x32, -0x32, -0x20, -0x32, -0x32, -0x20, -0x32, -0x32, -0x20, -0x20, -0x21, -0x0, -0x1, -0x2, -0x8, -0xc, -0x2e, -0xd, -0xe, -0xf, -0xf, -0xf, -0xf, -0xf, -0xe, -0xe, -0x2e, -0x2e, -0xc, -0x2b, -0x9, -0x2a, -0x29, -0x8, -0x8, -0x8, -0x8, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x2a, -0x8, -0x29, -0x3, -0x2, -0x2, -0x1, -0x1, -0x22, -0x22, -0x22, -0x0, -0x33, -0x21, -0x32, -0x32, -0x20, -0x32, -0x31, -0x32, -0x32, -0x32, -0x20, -0x20, -0x20, -0x33, -0x0, -0x0, -0x22, -0x39, -0x2, -0x2, -0x29, -0x9, -0x9, -0xa, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0xc, -0x9, -0x9, -0x9, -0x29, -0x29, -0x29, -0x8, -0x2a, -0x9, -0x9, -0x9, -0x9, -0xa, -0x9, -0xa, -0x9, -0x9, -0x9, -0x29, -0x9, -0x29, -0x8, -0x29, -0x8, -0x2, -0x2, -0x2, -0x39, -0x22, -0x21, -0x33, -0x32, -0x32, -0x31, -0x31, -0x32, -0x31, -0x20, -0x33, -0x0, -0x22, -0x1, -0x2, -0x3, -0x8, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x29, -0x29, -0x29, -0x29, -0x29, -0x8, -0x2a, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x2a, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0xa, -0xa, -0x9, -0xa, -0xa, -0x9, -0xa, -0x9, -0x8, -0x8, -0x29, -0x3, -0x3, -0x2, -0x2, -0x1, -0x22, -0x0, -0x33, -0x32, -0x31, -0x32, -0x42, -0x42, -0x31, -0x31, -0x32, -0x33, -0x0, -0x39, -0x2, -0x3, -0x8, -0x9, -0xa, -0xc, -0xa, -0xc, -0x2b, -0x9, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x8, -0x29, -0x29, -0x9, -0x9, -0x9, -0xa, -0xa, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x2a, -0x8, -0x8, -0x9, -0x0, -0x0, -0x33, -0x33, -0x20, -0x20, -0x32, -0x32, -0x31, -0x42, -0x30, -0x30, -0x30, -0x30, -0x40, -0x30, -0x30, -0x30, -0x42, -0x32, -0x33, -0x39, -0x2, -0x29, -0x9, -0x9, -0xc, -0xc, -0x2e, -0xc, -0xa, -0xc, -0x9, -0x9, -0x2a, -0x8, -0x8, -0x29, -0x8, -0x9, -0x9, -0x9, -0xc, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0x9, -0x8, -0x29, -0x2, -0x1, -0x22, -0x22, -0x22, -0x22, -0x21, -0x33, -0x0, -0x33, -0x1, -0x30, -0x30, -0x30, -0x30, -0x40, -0x30, -0x40, -0x40, -0x40, -0x40, -0x63, -0x40, -0x40, -0x40, -0x63, -0x40, -0x40, -0x40, -0x30, -0x42, -0x20, -0x0, -0x2, -0x29, -0x9, -0xa, -0xc, -0xb, -0x2e, -0x2e, -0xb, -0xc, -0xc, -0xa, -0xa, -0x9, -0x9, -0x9, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0xd, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0xc, -0x9, -0x29, -0x2, -0x22, -0x33, -0x20, -0x31, -0x42, -0x31, -0x42, -0x42, -0x42, -0x41, -0x31, -0x32, -0x31, -0x42, -0x42, -0x41, -0x30, -0x30, -0x30, -0x30, -0x40, -0x40, -0x40, -0x40, -0x40, -0x40, -0x40, -0x30, -0x30, -0x30, -0x32, -0x20, -0x0, -0x23, -0x29, -0x8, -0x9, -0xc, -0xc, -0x2e, -0x2e, -0xc, -0xc, -0xa, -0x2d, -0xa, -0x9, -0x9, -0xa, -0x9, -0xc, -0xc, -0x2e, -0x2e, -0xd, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0xc, -0xa, -0x8, -0x29, -0x23, -0x22, -0x21, -0x33, -0x33, -0x20, -0x33, -0x0, -0x33, -0x21, -0x32, -0x2, -0x2, -0x1, -0x22, -0x22, -0x22, -0x0, -0x0, -0x33, -0x20, -0x20, -0x32, -0x32, -0x31, -0x31, -0x42, -0x31, -0x32, -0x32, -0x20, -0x21, -0x0, -0x22, -0x2, -0x2, -0x29, -0x29, -0x9, -0x9, -0x9, -0x9, -0x9, -0xa, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0xa, -0xc, -0xc, -0x2e, -0xb, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0x9, -0x9, -0x9, -0x2a, -0x8, -0x9, -0x8, -0x29, -0x2a, -0x9, -0x8, -0x8, -0x29, -0x9, -0x2a, -0x8, -0x29, -0x29, -0x3, -0x2, -0x2, -0x2, -0x39, -0x22, -0x0, -0x0, -0x33, -0x0, -0x33, -0x0, -0x33, -0x21, -0x0, -0x0, -0x22, -0x39, -0x39, -0x2, -0x2, -0x3, -0x29, -0x8, -0x2a, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0xa, -0xc, -0xc, -0xc, -0xc, -0x2e, -0xc, -0xc, -0xa, -0x2d, -0xa, -0xa, -0x2d, -0xa, -0xc, -0xc, -0xa, -0xc, -0xc, -0xc, -0xa, -0xc, -0xa, -0x9, -0x3, -0x3, -0x2, -0x2, -0x2, -0x2, -0x23, -0x1, -0x39, -0x22, -0x0, -0x0, -0x0, -0x33, -0x21, -0x33, -0x21, -0x33, -0x0, -0x22, -0x39, -0x1, -0x2, -0x2, -0x29, -0x8, -0x9, -0x9, -0x9, -0xa, -0x2d, -0xa, -0xa, -0x2d, -0xa, -0x9, -0xa, -0x9, -0xa, -0xa, -0x9, -0xa, -0xc, -0x9, -0x9, -0x9, -0x9, -0x9, -0x29, -0x8, -0x29, -0x8, -0x8, -0x29, -0x8, -0x8, -0x8, -0x29, -0x29, -0x3, -0x29, -0x8, -0x29, -0x8, -0x22, -0x0, -0x22, -0x22, -0x0, -0x0, -0x0, -0x0, -0x33, -0x0, -0x33, -0x0, -0x33, -0x33, -0x21, -0x20, -0x33, -0x0, -0x0, -0x22, -0x2, -0x2, -0x29, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xc, -0xc, -0xc, -0xa, -0xa, -0x9, -0x9, -0x29, -0x3, -0x2, -0x2, -0x23, -0x1, -0x22, -0x22, -0x22, -0x22, -0x22, -0x0, -0x0, -0x0, -0x33, -0x21, -0x33, -0x0, -0x0, -0x0, -0x22, -0x33, -0x21, -0x33, -0x0, -0x33, -0x0, -0x33, -0x0, -0x21, -0x33, -0x21, -0x33, -0x0, -0x0, -0x33, -0x21, -0x0, -0x0, -0x22, -0x2, -0x3, -0x29, -0x9, -0xc, -0x2e, -0x2e, -0xd, -0xe, -0xe, -0x2e, -0xd, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xc, -0xc, -0xa, -0xa, -0x9, -0x9, -0x29, -0x3, -0x2, -0x2, -0x39, -0x39, -0x22, -0x0, -0x0, -0x33, -0x0, -0x33, -0x20, -0x20, -0x20, -0x32, -0x32, -0x32, -0x32, -0x20, -0x20, -0x33, -0x31, -0x32, -0x31, -0x32, -0x32, -0x32, -0x20, -0x20, -0x33, -0x0, -0x0, -0x0, -0x22, -0x22, -0x39, -0x39, -0x1, -0x23, -0x2, -0x29, -0x8, -0x9, -0xc, -0xb, -0xd, -0xe, -0xe, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0xc, -0xa, -0x2d, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x8, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x1, -0x22, -0x0, -0x0, -0x20, -0x32, -0x32, -0x31, -0x42, -0x31, -0x42, -0x42, -0x31, -0x42, -0x32, -0x30, -0x42, -0x41, -0x42, -0x31, -0x42, -0x31, -0x32, -0x20, -0x21, -0x0, -0x22, -0x23, -0x2, -0x2, -0x2, -0x8, -0x8, -0x29, -0x9, -0xa, -0xc, -0x2e, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0xa, -0x9, -0x9, -0x29, -0x8, -0x8, -0x8, -0x8, -0x8, -0x8, -0x8, -0x8, -0x8, -0x8, -0x8, -0x8, -0x29, -0x2, -0x2, -0x22, -0x21, -0x32, -0x32, -0x42, -0x30, -0x30, -0x30, -0x30, -0x30, -0x30, -0x30, -0x30, -0x30, -0x42, -0x42, -0x31, -0x42, -0x31, -0x32, -0x20, -0x21, -0x22, -0x1, -0x2, -0x3, -0x29, -0x8, -0x9, -0x2a, -0x9, -0x9, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0x9, -0x9, -0x9, -0x2a, -0x29, -0x9, -0x8, -0x8, -0x8, -0x8, -0x8, -0x29, -0x8, -0x8, -0x8, -0x29, -0x3, -0x2, -0x23, -0x22, -0x21, -0x20, -0x32, -0x42, -0x41, -0x30, -0x30, -0x30, -0x30, -0x30, -0x30, -0x42, -0x42, -0x31, -0x42, -0x31, -0x32, -0x31, -0x33, -0x21, -0x22, -0x2, -0x2, -0x8, -0x9, -0xa, -0xc, -0xa, -0xc, -0xa, -0xa, -0x9, -0x9, -0x9, -0x8, -0x8, -0x29, -0x8, -0x8, -0x29, -0x29, -0x29, -0x29, -0x9, -0x9, -0x9, -0xa, -0xc, -0xa, -0xc, -0xa, -0x2d, -0x9, -0x9, -0x9, -0x8, -0x29, -0x29, -0x3, -0x2, -0x2, -0x2, -0x39, -0x22, -0x0, -0x33, -0x32, -0x32, -0x31, -0x42, -0x42, -0x31, -0x42, -0x31, -0x42, -0x42, -0x32, -0x31, -0x32, -0x31, -0x20, -0x20, -0x0, -0x22, -0x2, -0x2, -0x8, -0xc, -0xa, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0x9, -0x29, -0x2, -0x2, -0x39, -0x22, -0x0, -0x22, -0x39, -0x23, -0x2, -0x29, -0x2a, -0x9, -0xc, -0xc, -0xb, -0x2e, -0xc, -0xc, -0xa, -0x9, -0x9, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x23, -0x1, -0x22, -0x0, -0x33, -0x20, -0x20, -0x32, -0x31, -0x32, -0x31, -0x32, -0x31, -0x32, -0x31, -0x33, -0x21, -0x33, -0x0, -0x22, -0x39, -0x2, -0x2, -0x29, -0x9, -0x9, -0xc, -0xc, -0xb, -0xd, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0x9, -0x9, -0x29, -0x3, -0x2, -0x1, -0x22, -0x39, -0x39, -0x39, -0x2, -0x2, -0x3, -0x29, -0x8, -0x9, -0x2a, -0x9, -0x8, -0x9, -0x9, -0x2a, -0x8, -0x8, -0x2a, -0x8, -0x8, -0x8, -0x29, -0x3, -0x2, -0x2, -0x1, -0x22, -0x0, -0x0, -0x33, -0x33, -0x20, -0x33, -0x21, -0x33, -0x33, -0x20, -0x23, -0x2, -0x2, -0x3, -0x29, -0x29, -0x9, -0x9, -0xa, -0x2d, -0xa, -0xc, -0xc, -0xc, -0x2e, -0xc, -0xc, -0xc, -0xc, -0xa, -0xa, -0x9, -0x9, -0x8, -0x8, -0x3, -0x2, -0x2, -0x23, -0x1, -0x22, -0x39, -0x39, -0x39, -0x1, -0x22, -0x39, -0x39, -0x1, -0x2, -0x2, -0x29, -0x8, -0x9, -0x9, -0xa, -0x2d, -0xa, -0x2d, -0x9, -0x9, -0x8, -0x29, -0x3, -0x2, -0x23, -0x1, -0x22, -0x22, -0x39, -0x1, -0x22, -0x1, -0x22, -0x3b, -0x3, -0x8, -0x29, -0x9, -0x9, -0xc, -0xc, -0xb, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0xa, -0x9, -0x9, -0x29, -0x3, -0x2, -0x2, -0x1, -0x22, -0x22, -0x22, -0x0, -0x0, -0x0, -0x0, -0x22, -0x39, -0x2, -0x2, -0x29, -0x9, -0x9, -0xa, -0xc, -0xc, -0xa, -0xa, -0x9, -0x9, -0x8, -0x3, -0x2, -0x2, -0x1, -0x22, -0x22, -0x22, -0x22, -0x39, -0x39, -0x2, -0x1, -0x2, -0x2, -0x29, -0x9, -0x9, -0xc, -0xb, -0xd, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xf, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xd, -0x2e, -0x2e, -0x2d, -0x9, -0x9, -0x29, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x3, -0x3, -0x3, -0x8, -0x8, -0x2a, -0x2a, -0x9, -0x2a, -0x9, -0x8, -0x8, -0x29, -0x2, -0x2, -0x22, -0x0, -0x0, -0x0, -0x33, -0x20, -0x20, -0x20, -0x20, -0x33, -0x39, -0x22, -0x1, -0x2, -0x29, -0x9, -0x9, -0xc, -0x2e, -0xe, -0xe, -0xf, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xd, -0xe, -0xe, -0xf, -0xe, -0xe, -0x2e, -0x2e, -0xc, -0xa, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x29, -0x29, -0x29, -0x3, -0x3, -0x2, -0x2, -0x3, -0x2, -0x23, -0x39, -0x0, -0x33, -0x32, -0x31, -0x42, -0x42, -0x42, -0x41, -0x42, -0x31, -0x32, -0x33, -0x1, -0x2, -0x8, -0x9, -0xc, -0xb, -0xd, -0xe, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0xc, -0xc, -0xa, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0xe, -0xe, -0xf, -0xe, -0xe, -0x2e, -0xc, -0xa, -0x9, -0x9, -0x9, -0x29, -0x2a, -0x29, -0x8, -0x8, -0x9, -0x29, -0x29, -0x8, -0x3, -0x2, -0x2, -0x2, -0x2, -0x1, -0x1, -0x23, -0x39, -0x22, -0x0, -0x33, -0x20, -0x32, -0x31, -0x42, -0x42, -0x30, -0x42, -0x31, -0x32, -0x20, -0x33, -0x8, -0x9, -0x2e, -0xe, -0xe, -0xe, -0x2e, -0xc, -0x9, -0x9, -0x9, -0xc, -0x25, -0x4, -0x4, -0x2b, -0x9, -0xc, -0x2e, -0xe, -0xf, -0xe, -0xe, -0x2e, -0xc, -0x9, -0x29, -0x3, -0x2, -0x2, -0x23, -0x1, -0x1, -0x23, -0x1, -0x1, -0x23, -0x1, -0x23, -0x1, -0x22, -0x22, -0x22, -0x0, -0x0, -0x0, -0x33, -0x0, -0x0, -0x33, -0x21, -0x20, -0x20, -0x32, -0x32, -0x32, -0x31, -0x32, -0x31, -0x32, -0x32, -0x21, -0x0, -0x39, -0x9, -0x2e, -0xe, -0xf, -0xc, -0x9, -0x8, -0x2, -0x2, -0x2, -0x3, -0x2, -0x29, -0x8, -0x9, -0x9, -0x9, -0xc, -0x2e, -0xe, -0xf, -0xe, -0xb, -0xc, -0x9, -0x3, -0x2, -0x39, -0x22, -0x0, -0x0, -0x33, -0x0, -0x0, -0x0, -0x22, -0x0, -0x22, -0x0, -0x0, -0x0, -0x33, -0x21, -0x32, -0x20, -0x32, -0x32, -0x32, -0x32, -0x20, -0x32, -0x32, -0x20, -0x32, -0x32, -0x20, -0x32, -0x32, -0x20, -0x20, -0x33, -0x0, -0x1, -0x3, -0xc, -0x2e, -0xe, -0xe, -0xa, -0x8, -0x2, -0x29, -0x29, -0x29, -0x29, -0x29, -0x29, -0x29, -0x29, -0x29, -0x3, -0x29, -0x8, -0xa, -0xd, -0xe, -0xe, -0x2e, -0xa, -0x9, -0x2, -0x2, -0x1, -0x22, -0x22, -0x22, -0x22, -0x22, -0x22, -0x39, -0x22, -0x39, -0x39, -0x22, -0x0, -0x33, -0x20, -0x32, -0x31, -0x42, -0x42, -0x42, -0x42, -0x42, -0x31, -0x32, -0x31, -0x20, -0x20, -0x20, -0x33, -0x0, -0x33, -0x0, -0x0, -0x39, -0x2, -0x8, -0xc, -0xe, -0xe, -0xe, -0xa, -0x29, -0x2, -0x8, -0x9, -0x9, -0x9, -0xa, -0xc, -0xa, -0xc, -0xa, -0xc, -0x9, -0x8, -0x8, -0x29, -0xc, -0xe, -0xe, -0x2e, -0xa, -0x9, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x39, -0x0, -0x33, -0x32, -0x31, -0x30, -0x30, -0x40, -0x40, -0x30, -0x30, -0x30, -0x42, -0x32, -0x32, -0x0, -0x0, -0x22, -0x22, -0x39, -0x39, -0x23, -0x2, -0x29, -0x9, -0xc, -0xe, -0xc, -0x8, -0x9, -0xc, -0x2e, -0xe, -0x2e, -0x9, -0x29, -0x2e, -0xe, -0x9, -0x8, -0x2, -0x2, -0x2, -0x1, -0x22, -0x21, -0x32, -0x30, -0x30, -0x30, -0x42, -0x32, -0x33, -0x0, -0x0, -0x22, -0x8, -0x9, -0x2e, -0xe, -0x9, -0x29, -0xa, -0xe, -0xe, -0xe, -0xc, -0x8, -0x9, -0xe, -0x2e, -0x9, -0x2, -0x39, -0x0, -0x33, -0x0, -0x33, -0x21, -0x33, -0x33, -0x20, -0x33, -0x20, -0x32, -0x31, -0x32, -0x20, -0x22, -0x2e, -0x2e, -0x8, -0x29, -0x9, -0x29, -0x8, -0x29, -0x29, -0x9, -0x2e, -0xe, -0xc, -0x8, -0x2, -0x22, -0x0, -0x0, -0x33, -0x0, -0x39, -0x2, -0x29, -0x8, -0x29, -0x2, -0x0, -0x32, -0x41, -0x42, -0x32, -0x1, -0xd, -0x2e, -0x3, -0x8, -0x9, -0x9, -0x29, -0x29, -0x29, -0x29, -0x9, -0xa, -0xd, -0xb, -0x9, -0x2, -0x22, -0x20, -0x20, -0x0, -0x22, -0x2, -0x29, -0x9, -0x2a, -0x29, -0x2, -0x22, -0x0, -0x0, -0x1, -0x8, -0x2e, -0xe, -0x9, -0x29, -0x9, -0xa, -0xc, -0xc, -0xa, -0x9, -0x8, -0x8, -0x2e, -0xe, -0xc, -0x3, -0x0, -0x20, -0x32, -0x32, -0x21, -0x22, -0x2, -0x2, -0x3, -0x2, -0x2, -0x2, -0x2, -0x23, -0x2, -0x9, -0x9, -0x2e, -0xe, -0xa, -0x29, -0xc, -0xe, -0xe, -0xe, -0xc, -0x8, -0xd, -0x2e, -0xa, -0x29, -0x22, -0x20, -0x32, -0x31, -0x31, -0x32, -0x33, -0x0, -0x0, -0x0, -0x0, -0x33, -0x0, -0x0, -0x33, -0x0, -0x2, -0x2, -0xa, -0xd, -0xe, -0x9, -0x29, -0x2a, -0x9, -0x2a, -0x29, -0xc, -0xe, -0x2e, -0x9, -0x23, -0x0, -0x32, -0x30, -0x30, -0x42, -0x33, -0x1, -0x3, -0x29, -0x29, -0x2, -0x21, -0x43, -0x30, -0x30, -0x42, -0x21, -0x2, -0x8, -0xa, -0xe, -0xe, -0x9, -0x3, -0x29, -0x3, -0x29, -0xe, -0xe, -0xa, -0x9, -0x2, -0x23, -0x39, -0x22, -0x22, -0x1, -0x2, -0x8, -0x9, -0xa, -0x9, -0x29, -0x2, -0x22, -0x20, -0x33, -0x0, -0x22, -0x2, -0x9, -0xc, -0xe, -0x2e, -0x9, -0x3, -0x29, -0x29, -0x8, -0x2e, -0xe, -0xc, -0x9, -0x3, -0x3, -0x2, -0x2, -0x8, -0x2, -0x29, -0x3, -0x8, -0x8, -0x2, -0x2, -0x23, -0x1, -0x22, -0x22, -0x22, -0x1, -0x9, -0xd, -0xe, -0x9, -0x3, -0x29, -0x9, -0x9, -0x9, -0x29, -0x2a, -0xe, -0xe, -0xc, -0x2a, -0x8, -0x1, -0x22, -0x0, -0x0, -0x33, -0x20, -0x32, -0x31, -0x31, -0x31, -0x32, -0x32, -0x20, -0x20, -0x0, -0x23, -0xe, -0xe, -0x9, -0x2, -0x8, -0x2, -0x3, -0x29, -0x2, -0x2, -0x2, -0x29, -0x9, -0xe, -0xd, -0xa, -0x8, -0x1, -0x22, -0x22, -0x39, -0x39, -0x1, -0x1, -0x23, -0x1, -0x2, -0x3, -0x29, -0x8, -0x9, -0x9, -0xe, -0xe, -0x9, -0x3, -0x3, -0x2a, -0x2d, -0xb, -0xd, -0xb, -0xd, -0xb, -0x2e, -0xc, -0xa, -0x9, -0x29, -0x8, -0x29, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x29, -0x9, -0x9, -0xc, -0xa, -0x2e, -0x2e, -0xc, -0x2e, -0xd, -0xb, -0x2e, -0xc, -0xa, -0xc, -0x2e, -0x2e, -0xe, -0x2e, -0xc, -0x9, -0x8, -0x8, -0x29, -0x8, -0x8, -0x29, -0x8, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x29, -0x8, -0x29, -0x29, -0x9, -0x22, -0x2, -0x9, -0x2e, -0xe, -0x2e, -0x29, -0x8, -0x8, -0x29, -0x29, -0xc, -0xe, -0xe, -0x2e, -0x9, -0x8, -0x1, -0x22, -0x1, -0x22, -0x23, -0x1, -0x22, -0x22, -0x0, -0x20, -0x32, -0x42, -0x31, -0x42, -0x20, -0x2, -0x9, -0xc, -0xb, -0xd, -0xe, -0x2e, -0x2e, -0xe, -0xe, -0xe, -0xe, -0xe, -0xf, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0x9, -0x29, -0x39, -0x33, -0x32, -0x31, -0x20, -0x0, -0x29, -0x9, -0x2e, -0x2e, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xd, -0xb, -0xc, -0xa, -0xc, -0x2e, -0x2e, -0x2e, -0xd, -0x2e, -0xc, -0x2b, -0x8, -0x29, -0x2, -0x1, -0x22, -0x33, -0x20, -0x32, -0x33, -0x1, -0x2, -0x3, -0x29, -0x2a, -0x9, -0xc, -0xa, -0xc, -0x2e, -0xc, -0xa, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x3, -0x3, -0x2, -0x2, -0x39, -0x22, -0x22, -0x39, -0x39, -0x1, -0x0, -0x32, -0x32, -0x20, -0x20, -0x20, -0x20, -0x20, -0x33, -0x39, -0x29, -0x9, -0x2e, -0x2e, -0x2e, -0xa, -0x8, -0x29, -0x2, -0x29, -0x9, -0xc, -0xb, -0xd, -0x2e, -0xa, -0xa, -0x9, -0x9, -0x9, -0x8, -0x2, -0x1, -0x0, -0x33, -0x21, -0x33, -0x20, -0x20, -0x32, -0x20, -0x20, -0x20, -0x33, -0x0, -0x39, -0x2, -0x9, -0x2e, -0xe, -0xe, -0xe, -0xd, -0xb, -0xc, -0x9, -0x9, -0x29, -0x9, -0x9, -0x9, -0x9, -0x9, -0x3, -0x29, -0x2, -0x2, -0x1, -0x0, -0x33, -0x32, -0x31, -0x32, -0x20, -0x33, -0x39, -0x2, -0x8, -0x29, -0x9, -0x9, -0xa, -0x9, -0x9, -0xa, -0x2d, -0x2b, -0x9, -0x2a, -0x2a, -0x9, -0x9, -0xa, -0x9, -0xa, -0x9, -0x2, -0x39, -0x22, -0x0, -0x20, -0x31, -0x42, -0x30, -0x30, -0x32, -0x0, -0x2, -0x9, -0xc, -0xa, -0x2d, -0x2a, -0x29, -0x3, -0x29, -0x2a, -0x2d, -0xa, -0xc, -0xa, -0x9, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x42, -0x30, -0x30, -0x40, -0x40, -0x40, -0x40, -0x40, -0x40, -0x42, -0x21, -0x2, -0x9, -0x2e, -0x2e, -0x2e, -0xa, -0xa, -0x9, -0xa, -0xc, -0x2e, -0xe, -0xd, -0xb, -0x9, -0x2, -0x33, -0x20, -0x32, -0x32, -0x32, -0x3, -0x2, -0x2, -0x39, -0x0, -0x33, -0x20, -0x32, -0x20, -0x33, -0x0, -0x39, -0x2, -0x8, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0xc, -0x2e, -0x2e, -0x2e, -0xa, -0x2d, -0x9, -0x9, -0x9, -0x9, -0x9, -0x2a, -0x23, -0x1, -0x22, -0x22, -0x0, -0x0, -0x33, -0x20, -0x0, -0x0, -0x2, -0x29, -0x9, -0xa, -0xc, -0xc, -0xa, -0xc, -0xa, -0xc, -0xa, -0x9, -0x8, -0x29, -0x2, -0x2, -0x2, -0x2, -0x23, -0x1, -0x23, -0x2, -0x20, -0x20, -0x20, -0x20, -0x33, -0x21, -0x0, -0x22, -0x22, -0x2, -0x8, -0xc, -0x2e, -0xe, -0xd, -0x2e, -0x2e, -0xc, -0xa, -0x9, -0x9, -0x29, -0x2, -0x23, -0x22, -0x0, -0x33, -0x20, -0x32, -0x31, -0x32, -0x32, -0x30, -0x42, -0x31, -0x32, -0x0, -0x22, -0x2, -0x29, -0x8, -0x9, -0xc, -0x2e, -0xe, -0xe, -0x2e, -0x2e, -0x9, -0x9, -0x29, -0x29, -0x8, -0x8, -0x8, -0x8, -0x2, -0x1, -0x33, -0x31, -0x30, -0x30, -0x30, -0x30, -0x31, -0x32, -0x32, -0x21, -0x23, -0x29, -0xc, -0x2e, -0xc, -0xa, -0x9, -0x3, -0x2, -0x23, -0x2, -0x29, -0x9, -0xc, -0xa, -0xc, -0x9, -0x2a, -0x29, -0x2, -0x2, -0x39, -0x33, -0x20, -0x31, -0x43, -0x31, -0x42, -0x22, -0x39, -0x2, -0x29, -0x9, -0xa, -0x2e, -0x2e, -0x2e, -0xc, -0x9, -0x8, -0x2, -0x23, -0x1, -0x23, -0x2, -0x2, -0x3, -0x8, -0x29, -0x8, -0x9, -0x9, -0x9, -0x3, -0x2, -0x22, -0x0, -0x0, -0x0, -0x0, -0x2, -0x29, -0x9, -0xc, -0x2e, -0xe, -0xd, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0xa, -0x9, -0x29, -0x2, -0x23, -0x1, -0x22, -0x2, -0x3, -0x8, -0x9, -0x9, -0x9, -0x8, -0x2, -0x1, -0x0, -0x0, -0x0, -0x22, -0x1, -0x29, -0xa, -0xd, -0xe, -0xe, -0x2e, -0x2e, -0xc, -0xb, -0xd, -0xe, -0xe, -0x2e, -0xa, -0x9, -0x9, -0x9, -0x8, -0x9, -0x29, -0x3, -0x2, -0x2, -0x2, -0x22, -0x33, -0x32, -0x41, -0x42, -0x31, -0x20, -0x9, -0xe, -0x2e, -0x9, -0x8, -0x8, -0x2c, -0x9, -0x2d, -0xe, -0xe, -0x2e, -0x9, -0x2, -0x1, -0x22, -0x22, -0x22, -0x22, -0x22, -0x0, -0x0, -0x33, -0x20, -0x20, -0x20, -0x32, -0x20, -0x32, -0x32, -0x33, -0x1, -0x2e, -0xe, -0x9, -0x3, -0x29, -0x9, -0x9, -0x2a, -0x9, -0x8, -0x2e, -0xe, -0xa, -0x29, -0x2, -0x39, -0x1, -0x1, -0x23, -0x22, -0x21, -0x32, -0x30, -0x30, -0x30, -0x42, -0x32, -0x21, -0x0, -0x0, -0x1, -0x3, -0x2e, -0xa, -0x9, -0xe, -0xc, -0x9, -0x2e, -0x29, -0x39, -0x0, -0x33, -0x31, -0x32, -0x20, -0x33, -0x39, -0x2e, -0x8, -0x9, -0x8, -0x8, -0x2e, -0xc, -0x2, -0x0, -0x33, -0x23, -0x8, -0x29, -0x0, -0x20, -0x22, -0x2e, -0xa, -0x9, -0xd, -0xc, -0x2a, -0x2e, -0x29, -0x20, -0x32, -0x21, -0x22, -0x39, -0x22, -0x22, -0x2, -0x29, -0x2e, -0x9, -0x8, -0x8, -0xd, -0x2b, -0x1, -0x33, -0x20, -0x1, -0x2a, -0x29, -0x0, -0x32, -0x20, -0x9, -0x2e, -0x9, -0x8, -0x8, -0x2e, -0xc, -0x3, -0x2, -0x39, -0x39, -0x0, -0x0, -0x0, -0x33, -0x39, -0xe, -0x8, -0x29, -0x9, -0x9, -0x9, -0xc, -0xa, -0x29, -0x2, -0x2, -0x2, -0x2, -0x8, -0x9, -0xa, -0x2a, -0xc, -0x2e, -0x9, -0x9, -0x2e, -0x2e, -0x9, -0x29, -0x2, -0x2, -0x23, -0x1, -0x22, -0x0, -0x39, -0x8, -0x2e, -0xe, -0xd, -0xe, -0xe, -0x2e, -0x2e, -0xd, -0xb, -0xc, -0x9, -0x29, -0x0, -0x32, -0x21, -0x22, -0x39, -0x2, -0x2, -0x29, -0x9, -0xa, -0x9, -0x9, -0x8, -0x9, -0x9, -0x2a, -0x29, -0x2, -0x2, -0x2, -0x22, -0x33, -0x32, -0x20, -0x0, -0x1, -0x2a, -0xc, -0x2e, -0xc, -0xa, -0x8, -0x9, -0x9, -0x2a, -0x33, -0x31, -0x42, -0x30, -0x42, -0x39, -0xa, -0xc, -0x9, -0x9, -0xa, -0x2e, -0x9, -0x2, -0x0, -0x0, -0x2, -0x39, -0x0, -0x20, -0x33, -0x1, -0x2a, -0xc, -0x2b, -0x2d, -0xa, -0x9, -0x8, -0x8, -0x29, -0x8, -0x31, -0x32, -0x0, -0x23, -0x29, -0xc, -0xe, -0x2e, -0xa, -0x9, -0x8, -0x8, -0x39, -0x20, -0x42, -0x42, -0x33, -0x1, -0x8, -0x2e, -0xc, -0x8, -0x2, -0x2, -0x29, -0x9, -0x9, -0x8, -0x2, -0x22, -0x20, -0x20, -0x2, -0xc, -0xe, -0x2e, -0x2e, -0xd, -0xa, -0x9, -0x2, -0x29, -0x8, -0x29, -0x2, -0x0, -0x20, -0x33, -0x2e, -0x9, -0x2a, -0x9, -0x9, -0xe, -0x29, -0x1, -0x22, -0x39, -0x33, -0x31, -0x32, -0x20, -0x33, -0x39, -0xa, -0x9, -0xc, -0x9, -0x0, -0x22, -0x0, -0x21, -0xa, -0x9, -0x2d, -0x2a, -0x20, -0x1, -0x1, -0x0, -0xc, -0x2a, -0x9, -0x9, -0x2, -0x39, -0x23, -0x2, -0x9, -0x2e, -0x2e, -0x2e, -0x9, -0x8, -0x39, -0x0, -0x39, -0x22, -0x1, -0x2a, -0x9, -0x9, -0x9, -0x29, -0x0, -0x32, -0x21, -0x2b, -0x9, -0xc, -0x8, -0x23, -0x20, -0x3, -0x9, -0x9, -0x9, -0x8, -0x22, -0x32, -0x9, -0xc, -0xb, -0x8, -0x2, -0x39, -0x0, -0x33, -0xa, -0x9, -0x0, -0x0, -0xa, -0xc, -0x3, -0x1, -0x0, -0x2, -0xa, -0x29, -0x29, -0x9, -0x3, -0x33, -0x9, -0x1, -0x2, -0x3, -0x3, -0x0, -0x0, -0x0, -}; - -static Gu3dfInfo hilite_3dfinfo = { - { /* header */ - 0x00000020, /* width */ - 0x00000020, /* height */ -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) - GR_LOD_1, /* small_lod */ - GR_LOD_32, /* large_lod */ - GR_ASPECT_1x1, /* aspect_ratio */ -#else - 0x00000008, /* small_lod */ - 0x00000003, /* large_lod */ - GR_ASPECT_1x1, /* aspect_ratio */ -#endif - GR_TEXFMT_INTENSITY_8 /* format */ - }, - { {{0x0000000}} }, /* table */ - NULL, /* data */ - 0x00000ab0 /* mem_required */ -}; - -unsigned char hilite_3dfinfo_image[] = { -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x3, -0x2, -0x2, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x2, -0x5, -0x7, -0xc, -0xb, -0xb, -0x7, -0x5, -0x2, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x2, -0x7, -0xb, -0xe, -0x11, -0x16, -0x16, -0x15, -0x11, -0xe, -0xa, -0x6, -0x2, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x3, -0x8, -0x10, -0x14, -0x17, -0x1a, -0x20, -0x21, -0x1e, -0x1a, -0x17, -0x14, -0xe, -0x8, -0x3, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x2, -0x8, -0x10, -0x16, -0x20, -0x22, -0x26, -0x2d, -0x2f, -0x2b, -0x26, -0x21, -0x1b, -0x16, -0x10, -0x8, -0x2, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x7, -0xf, -0x16, -0x1f, -0x28, -0x30, -0x35, -0x3d, -0x40, -0x3d, -0x36, -0x2d, -0x26, -0x1f, -0x16, -0xf, -0x7, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x4, -0xc, -0x15, -0x1c, -0x28, -0x31, -0x41, -0x46, -0x4f, -0x54, -0x50, -0x47, -0x3f, -0x31, -0x28, -0x1c, -0x15, -0xc, -0x4, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x7, -0x11, -0x1a, -0x25, -0x31, -0x3e, -0x4d, -0x60, -0x66, -0x79, -0x64, -0x5e, -0x4d, -0x3e, -0x31, -0x25, -0x1a, -0x11, -0x7, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x2, -0xb, -0x14, -0x1f, -0x2a, -0x39, -0x4a, -0x63, -0x76, -0x94, -0xa4, -0x8c, -0x76, -0x5a, -0x4a, -0x39, -0x2a, -0x1f, -0x14, -0xb, -0x2, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x4, -0xe, -0x16, -0x21, -0x2f, -0x40, -0x54, -0x6a, -0x91, -0xcf, -0xd9, -0xc5, -0x95, -0x76, -0x54, -0x40, -0x2f, -0x21, -0x16, -0xe, -0x4, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x6, -0x10, -0x1b, -0x27, -0x35, -0x47, -0x60, -0x81, -0xc1, -0xeb, -0xff, -0xe8, -0xb8, -0x73, -0x5d, -0x44, -0x31, -0x23, -0x17, -0xe, -0x4, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x4, -0xe, -0x17, -0x27, -0x38, -0x4e, -0x69, -0x95, -0xc7, -0xec, -0xff, -0xe6, -0xbe, -0x81, -0x5c, -0x45, -0x31, -0x23, -0x17, -0xe, -0x4, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x3, -0xb, -0x16, -0x1c, -0x2a, -0x3a, -0x4e, -0x5b, -0x73, -0x9a, -0xd1, -0xf9, -0xc0, -0x9d, -0x70, -0x5d, -0x4b, -0x32, -0x22, -0x16, -0xe, -0x4, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x6, -0x13, -0x1c, -0x21, -0x2a, -0x43, -0x53, -0x64, -0x7c, -0xa7, -0x97, -0x94, -0x7a, -0x64, -0x52, -0x3c, -0x2e, -0x1f, -0x14, -0xb, -0x2, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x7, -0x11, -0x1e, -0x2c, -0x33, -0x46, -0x55, -0x69, -0x72, -0x6d, -0x6c, -0x62, -0x54, -0x46, -0x33, -0x25, -0x1a, -0x11, -0x7, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x4, -0x11, -0x15, -0x1c, -0x28, -0x34, -0x47, -0x56, -0x55, -0x55, -0x54, -0x4b, -0x47, -0x34, -0x28, -0x1c, -0x15, -0xc, -0x4, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x2, -0x7, -0xf, -0x16, -0x1f, -0x2a, -0x34, -0x42, -0x3f, -0x3f, -0x3f, -0x3d, -0x30, -0x29, -0x1f, -0x16, -0xf, -0x7, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x2, -0x8, -0x10, -0x16, -0x1e, -0x25, -0x2e, -0x2c, -0x2c, -0x2c, -0x28, -0x21, -0x1b, -0x16, -0x10, -0x8, -0x2, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x3, -0x8, -0xe, -0x14, -0x19, -0x1c, -0x1c, -0x1c, -0x1c, -0x1a, -0x17, -0x14, -0xe, -0x8, -0x3, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x2, -0x6, -0xa, -0x11, -0x11, -0x13, -0x13, -0x13, -0x11, -0xe, -0xa, -0x6, -0x2, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x2, -0xa, -0x7, -0x8, -0x8, -0x8, -0x7, -0x5, -0x2, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x1, -0x1, -0x1, -0x1, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x59, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x2, -0x5, -0x6, -0x4, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x9, -0x11, -0x19, -0x1b, -0x14, -0xc, -0x3, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x8, -0x17, -0x27, -0x31, -0x35, -0x2b, -0x1e, -0xf, -0x3, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x3, -0x13, -0x26, -0x3f, -0x57, -0x60, -0x4c, -0x32, -0x1c, -0xa, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x8, -0x1a, -0x35, -0x5b, -0x9b, -0xb4, -0x77, -0x46, -0x26, -0x11, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0xa, -0x20, -0x41, -0x78, -0xd8, -0xf3, -0x9a, -0x51, -0x2a, -0x13, -0x2, -0x0, -0x0, -0x0, -0x0, -0x1, -0xe, -0x20, -0x3d, -0x62, -0xa4, -0xb9, -0x7b, -0x4e, -0x28, -0x11, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x3, -0x15, -0x29, -0x46, -0x62, -0x60, -0x52, -0x35, -0x1c, -0xa, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x8, -0x17, -0x28, -0x37, -0x35, -0x2e, -0x1e, -0xf, -0x3, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x8, -0x12, -0x17, -0x18, -0x14, -0xc, -0x3, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x3, -0x4, -0x5, -0x4, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x16, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x3, -0xd, -0xf, -0x4, -0x0, -0x0, -0x0, -0x1, -0x16, -0x3c, -0x44, -0x1f, -0x3, -0x0, -0x0, -0x4, -0x2c, -0x92, -0xae, -0x3a, -0xa, -0x0, -0x0, -0x4, -0x27, -0x6c, -0x7a, -0x32, -0x7, -0x0, -0x0, -0x0, -0xa, -0x22, -0x24, -0xf, -0x1, -0x0, -0x0, -0x0, -0x0, -0x2, -0x2, -0x0, -0x0, -0x0, -0x5, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x4, -0x5, -0x0, -0x1, -0x44, -0x53, -0x3, -0x1, -0x30, -0x38, -0x2, -0x1, -0x0, -0x0, -0x0, -0x12, -0x17, -0xd, -0xf, -0x11, -0x0, -0x0, -0x0, -}; - -static Gu3dfInfo shadow_3dfinfo = { - { /* header */ - 0x00000040, /* width */ - 0x00000020, /* height */ -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) - GR_LOD_1, /* small_lod */ - GR_LOD_64, /* large_lod */ - GR_ASPECT_2x1, /* aspect_ratio */ -#else - 0x00000008, /* small_lod */ - 0x00000002, /* large_lod */ - GR_ASPECT_2x1, /* aspect_ratio */ -#endif - GR_TEXFMT_INTENSITY_8 /* format */ - }, - { {{0x00000000}} }, /* table */ - NULL, /* data */ - 0x00000ab0 /* mem_required */ -}; - -unsigned char shadow_3dfinfo_image[] = { -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xfb, -0xfa, -0xfa, -0xfb, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xfd, -0xfd, -0xfd, -0xfd, -0xfd, -0xfd, -0xfd, -0xfd, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xf4, -0xe4, -0xd7, -0xd0, -0xcf, -0xd6, -0xe2, -0xf2, -0xfc, -0xff, -0xff, -0xfb, -0xe8, -0xdf, -0xdf, -0xdf, -0xdf, -0xde, -0xdf, -0xe0, -0xe2, -0xe7, -0xee, -0xf5, -0xfa, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf1, -0xc0, -0x94, -0x80, -0x79, -0x78, -0x7f, -0x91, -0xb1, -0xda, -0xf8, -0xfd, -0xe7, -0xab, -0x8c, -0x89, -0x89, -0x89, -0x89, -0x89, -0x8b, -0x8e, -0x96, -0xa1, -0xb4, -0xcf, -0xe8, -0xf9, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xe3, -0x93, -0x60, -0x58, -0x58, -0x57, -0x55, -0x59, -0x6b, -0x96, -0xd4, -0xf7, -0xdc, -0x88, -0x5d, -0x59, -0x59, -0x5a, -0x5a, -0x5b, -0x5b, -0x5b, -0x5d, -0x60, -0x6a, -0x7e, -0xa0, -0xcc, -0xf0, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xe2, -0x96, -0x72, -0x7a, -0x7e, -0x74, -0x60, -0x53, -0x53, -0x66, -0xa3, -0xe8, -0xdb, -0x84, -0x57, -0x52, -0x54, -0x5d, -0x67, -0x69, -0x68, -0x65, -0x5f, -0x59, -0x56, -0x58, -0x64, -0x86, -0xbc, -0xed, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xfa, -0xf7, -0xf4, -0xf3, -0xf6, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xef, -0xc8, -0xc1, -0xd1, -0xd6, -0xc4, -0x95, -0x62, -0x52, -0x57, -0x84, -0xd7, -0xd9, -0x84, -0x57, -0x52, -0x5b, -0x82, -0xac, -0xb6, -0xb4, -0xac, -0x9c, -0x83, -0x68, -0x58, -0x55, -0x5d, -0x7f, -0xc0, -0xf3, -0xff, -0xff, -0xff, -0xff, -0xf9, -0xe5, -0xcc, -0xba, -0xb0, -0xaf, -0xc4, -0xeb, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xf7, -0xf8, -0xfb, -0xfc, -0xf5, -0xc9, -0x79, -0x55, -0x54, -0x7c, -0xd0, -0xd8, -0x85, -0x58, -0x52, -0x61, -0xa1, -0xe7, -0xf6, -0xf6, -0xf3, -0xe9, -0xd1, -0xa5, -0x72, -0x58, -0x54, -0x5f, -0x8d, -0xd6, -0xfb, -0xff, -0xff, -0xf8, -0xd2, -0x9f, -0x7e, -0x77, -0x7b, -0x81, -0xa8, -0xe5, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf9, -0xd0, -0x7d, -0x55, -0x57, -0x88, -0xda, -0xd9, -0x85, -0x58, -0x53, -0x61, -0xa7, -0xf2, -0xff, -0xff, -0xff, -0xfe, -0xf9, -0xe2, -0xa7, -0x6a, -0x55, -0x56, -0x6c, -0xb2, -0xf2, -0xff, -0xfd, -0xe2, -0x9a, -0x69, -0x6c, -0x95, -0xb3, -0xbd, -0xd0, -0xed, -0xf5, -0xf8, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xfa, -0xf7, -0xf6, -0xf9, -0xfe, -0xfe, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf6, -0xda, -0xa6, -0x69, -0x55, -0x69, -0xaa, -0xeb, -0xdc, -0x85, -0x58, -0x52, -0x61, -0xa7, -0xf1, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfa, -0xd4, -0x87, -0x5b, -0x55, -0x5d, -0x93, -0xe3, -0xfd, -0xfa, -0xcc, -0x7a, -0x5e, -0x85, -0xd1, -0xf3, -0xf0, -0xd8, -0xbf, -0xb7, -0xc4, -0xe5, -0xfc, -0xff, -0xff, -0xf4, -0xd2, -0xbb, -0xbc, -0xd6, -0xf1, -0xf2, -0xf0, -0xf8, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfa, -0xd1, -0x94, -0x6b, -0x57, -0x64, -0x97, -0xd9, -0xf8, -0xdc, -0x84, -0x57, -0x52, -0x61, -0xa7, -0xf1, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xec, -0xa1, -0x62, -0x54, -0x58, -0x80, -0xd4, -0xf8, -0xef, -0xbb, -0x70, -0x5f, -0x8e, -0xda, -0xf4, -0xf2, -0xd5, -0x9d, -0x77, -0x7a, -0xaa, -0xe4, -0xfc, -0xf4, -0xc8, -0x8c, -0x76, -0x93, -0xcc, -0xf2, -0xf2, -0xed, -0xf6, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf6, -0xb8, -0x6b, -0x53, -0x56, -0x75, -0xb9, -0xf1, -0xfc, -0xdb, -0x84, -0x57, -0x52, -0x61, -0xa7, -0xf1, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf5, -0xb0, -0x67, -0x55, -0x57, -0x77, -0xc7, -0xde, -0xba, -0x90, -0x65, -0x5b, -0x77, -0xa3, -0xb5, -0xcb, -0xe5, -0xc8, -0x8e, -0x68, -0x75, -0xaf, -0xdd, -0xcc, -0x8e, -0x6c, -0x85, -0xbe, -0xed, -0xfe, -0xfd, -0xfc, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf7, -0xba, -0x6e, -0x54, -0x53, -0x64, -0x93, -0xd0, -0xf5, -0xdc, -0x84, -0x57, -0x52, -0x61, -0xa7, -0xf1, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf6, -0xb4, -0x69, -0x56, -0x56, -0x74, -0xc0, -0xc7, -0x8f, -0x6e, -0x5b, -0x58, -0x64, -0x76, -0x80, -0xa6, -0xe7, -0xf2, -0xcc, -0x90, -0x6a, -0x77, -0x98, -0x8a, -0x70, -0x88, -0xc2, -0xef, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfb, -0xd8, -0xa0, -0x76, -0x59, -0x53, -0x63, -0x96, -0xdc, -0xd9, -0x84, -0x57, -0x52, -0x61, -0xa7, -0xf1, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf2, -0xab, -0x65, -0x55, -0x57, -0x79, -0xca, -0xdf, -0xbd, -0x91, -0x65, -0x5b, -0x78, -0xa6, -0xb8, -0xce, -0xf3, -0xff, -0xf5, -0xcd, -0x8d, -0x65, -0x64, -0x66, -0x83, -0xc4, -0xf2, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfa, -0xe5, -0xb9, -0x77, -0x55, -0x53, -0x70, -0xbb, -0xd2, -0x85, -0x57, -0x52, -0x61, -0xa7, -0xf1, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xe3, -0x95, -0x5e, -0x54, -0x59, -0x85, -0xd8, -0xf9, -0xf0, -0xba, -0x6f, -0x5f, -0x90, -0xdd, -0xf4, -0xf9, -0xff, -0xff, -0xfe, -0xe7, -0xa4, -0x6a, -0x5c, -0x63, -0x91, -0xd9, -0xfb, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xe5, -0x96, -0x5c, -0x51, -0x62, -0xa5, -0xca, -0x84, -0x57, -0x52, -0x61, -0xa7, -0xf1, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf3, -0xc0, -0x77, -0x58, -0x54, -0x61, -0x9c, -0xe8, -0xfe, -0xf8, -0xc2, -0x71, -0x60, -0x95, -0xe7, -0xfe, -0xff, -0xff, -0xfe, -0xed, -0xbf, -0x84, -0x6a, -0x70, -0x68, -0x74, -0xab, -0xe1, -0xfa, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfb, -0xf8, -0xfd, -0xff, -0xff, -0xfe, -0xe8, -0x99, -0x5d, -0x52, -0x60, -0xa1, -0xc9, -0x84, -0x57, -0x52, -0x61, -0xa6, -0xef, -0xfd, -0xfd, -0xfc, -0xf9, -0xee, -0xc9, -0x8b, -0x5f, -0x54, -0x57, -0x74, -0xbd, -0xf5, -0xff, -0xf8, -0xc2, -0x71, -0x60, -0x95, -0xe7, -0xfe, -0xff, -0xfc, -0xe8, -0xb8, -0x81, -0x6f, -0x91, -0xb2, -0x96, -0x6e, -0x73, -0xa4, -0xdb, -0xf9, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfb, -0xe0, -0xca, -0xdd, -0xef, -0xf5, -0xeb, -0xc3, -0x7d, -0x56, -0x52, -0x66, -0xad, -0xcd, -0x85, -0x57, -0x52, -0x5f, -0x97, -0xd3, -0xe1, -0xdf, -0xd9, -0xca, -0xad, -0x83, -0x61, -0x55, -0x55, -0x66, -0x9d, -0xe1, -0xfd, -0xff, -0xf8, -0xc2, -0x71, -0x60, -0x95, -0xe7, -0xfe, -0xfd, -0xe6, -0xb3, -0x7d, -0x6d, -0x93, -0xd0, -0xef, -0xd6, -0x98, -0x6c, -0x71, -0xa0, -0xd9, -0xf9, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf8, -0xc2, -0x85, -0x8c, -0xa4, -0xad, -0xa0, -0x7e, -0x5c, -0x51, -0x56, -0x7d, -0xc9, -0xd5, -0x84, -0x57, -0x52, -0x58, -0x6e, -0x87, -0x8c, -0x8a, -0x83, -0x77, -0x68, -0x5a, -0x54, -0x58, -0x68, -0x94, -0xd3, -0xf9, -0xff, -0xff, -0xf8, -0xc2, -0x71, -0x60, -0x95, -0xe7, -0xfd, -0xf5, -0xcd, -0x9b, -0x86, -0x9d, -0xd1, -0xf6, -0xff, -0xf8, -0xd4, -0x9e, -0x84, -0x91, -0xbd, -0xed, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf7, -0xbe, -0x6f, -0x5a, -0x5f, -0x63, -0x5f, -0x56, -0x53, -0x58, -0x71, -0xac, -0xe9, -0xdb, -0x84, -0x57, -0x53, -0x54, -0x57, -0x5b, -0x5b, -0x5b, -0x5a, -0x58, -0x57, -0x5a, -0x63, -0x79, -0xa3, -0xd5, -0xf7, -0xff, -0xff, -0xff, -0xf8, -0xc2, -0x71, -0x60, -0x95, -0xe7, -0xfd, -0xfa, -0xe6, -0xd6, -0xd5, -0xe4, -0xf8, -0xff, -0xff, -0xff, -0xf9, -0xe4, -0xd5, -0xd4, -0xe0, -0xf6, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfa, -0xd2, -0x8f, -0x6d, -0x61, -0x5e, -0x5d, -0x61, -0x6c, -0x85, -0xb2, -0xe3, -0xf9, -0xdf, -0x92, -0x6a, -0x66, -0x67, -0x67, -0x67, -0x67, -0x69, -0x6c, -0x70, -0x78, -0x89, -0xa4, -0xc5, -0xe6, -0xfa, -0xff, -0xff, -0xff, -0xff, -0xf8, -0xc1, -0x71, -0x60, -0x95, -0xe7, -0xfe, -0xff, -0xfc, -0xfb, -0xfb, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xfb, -0xfb, -0xfc, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf4, -0xd8, -0xbe, -0xaa, -0xa0, -0xa0, -0xa9, -0xbb, -0xd5, -0xef, -0xfd, -0xfe, -0xf0, -0xc8, -0xb4, -0xb2, -0xb2, -0xb3, -0xb3, -0xb3, -0xb6, -0xbb, -0xc3, -0xcd, -0xdc, -0xec, -0xf8, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf9, -0xc9, -0x83, -0x73, -0xa2, -0xea, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfc, -0xf7, -0xf2, -0xee, -0xee, -0xf1, -0xf7, -0xfb, -0xff, -0xff, -0xff, -0xfe, -0xf8, -0xf5, -0xf5, -0xf5, -0xf5, -0xf5, -0xf5, -0xf6, -0xf7, -0xf8, -0xfa, -0xfc, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xe7, -0xc5, -0xbd, -0xd4, -0xf6, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfa, -0xf6, -0xf6, -0xf9, -0xfd, -0xfe, -0xff, -0xff, -0xff, -0xfe, -0xfe, -0xff, -0xff, -0xfe, -0xfd, -0xfc, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xf4, -0xf1, -0xf2, -0xf3, -0xee, -0xf0, -0xf4, -0xf6, -0xf5, -0xf4, -0xf3, -0xf7, -0xf6, -0xf1, -0xea, -0xea, -0xf0, -0xf6, -0xf7, -0xf5, -0xfa, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfc, -0xe7, -0xd4, -0xce, -0xd0, -0xcb, -0xcd, -0xcd, -0xd3, -0xd4, -0xd9, -0xd3, -0xd7, -0xd8, -0xd6, -0xcc, -0xd0, -0xd4, -0xd5, -0xd3, -0xd0, -0xe7, -0xfc, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfb, -0xde, -0xc5, -0xc0, -0xc4, -0xc2, -0xc1, -0xbc, -0xc5, -0xcb, -0xd5, -0xc3, -0xbf, -0xcb, -0xd7, -0xcb, -0xca, -0xc7, -0xbf, -0xbf, -0xbe, -0xe0, -0xfb, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfb, -0xe3, -0xcf, -0xce, -0xd0, -0xcc, -0xc9, -0xc9, -0xd5, -0xda, -0xd9, -0xc2, -0xc2, -0xcd, -0xd8, -0xd0, -0xd2, -0xd7, -0xd2, -0xd3, -0xcf, -0xe9, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf6, -0xee, -0xee, -0xef, -0xeb, -0xe8, -0xe8, -0xef, -0xf2, -0xef, -0xe3, -0xe6, -0xe9, -0xeb, -0xe8, -0xec, -0xf4, -0xf4, -0xf3, -0xeb, -0xf6, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xfe, -0xfe, -0xfd, -0xfd, -0xfd, -0xfe, -0xfe, -0xfe, -0xfc, -0xfd, -0xfd, -0xfd, -0xfd, -0xfd, -0xff, -0xff, -0xff, -0xfd, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xfd, -0xff, -0xff, -0xff, -0xfe, -0xfe, -0xfe, -0xfe, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfb, -0xcb, -0xa8, -0xa7, -0xc6, -0xf3, -0xf8, -0xc0, -0xb4, -0xb4, -0xb5, -0xbb, -0xce, -0xec, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf0, -0x7f, -0x6a, -0x60, -0x5b, -0x9d, -0xe6, -0x70, -0x56, -0x5e, -0x62, -0x5f, -0x5e, -0x77, -0xc0, -0xfa, -0xff, -0xff, -0xff, -0xfc, -0xf9, -0xfc, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfb, -0xde, -0xe8, -0xc6, -0x61, -0x6b, -0xd6, -0x6e, -0x58, -0xae, -0xd6, -0xc9, -0x98, -0x5e, -0x64, -0xc6, -0xfe, -0xfd, -0xd4, -0x9f, -0x97, -0xcf, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xd2, -0x64, -0x7d, -0xdf, -0x6f, -0x5a, -0xcc, -0xff, -0xff, -0xf5, -0x9b, -0x57, -0x84, -0xf4, -0xe9, -0x77, -0x96, -0xd5, -0xd5, -0xda, -0xf7, -0xff, -0xf0, -0xd9, -0xf0, -0xf7, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xde, -0x6f, -0x62, -0xc7, -0xeb, -0x6e, -0x5a, -0xcc, -0xff, -0xff, -0xff, -0xcd, -0x5d, -0x6a, -0xdc, -0xbd, -0x64, -0xa1, -0xda, -0xc8, -0x7a, -0xad, -0xe6, -0x94, -0x93, -0xea, -0xf6, -0xfc, -0xff, -0xff, -0xff, -0xff, -0xe1, -0x76, -0x59, -0x97, -0xe2, -0x6e, -0x5a, -0xcc, -0xff, -0xff, -0xff, -0xd2, -0x5e, -0x67, -0xcc, -0x93, -0x5d, -0x7e, -0xab, -0xf3, -0xc8, -0x75, -0x7b, -0x90, -0xe9, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xe0, -0x70, -0x5e, -0xbf, -0x6e, -0x5a, -0xcc, -0xff, -0xff, -0xfc, -0xac, -0x58, -0x77, -0xee, -0xd9, -0x68, -0xba, -0xfb, -0xff, -0xe4, -0x7f, -0x66, -0xa2, -0xf5, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf5, -0xe7, -0xf9, -0xe5, -0x72, -0x5b, -0xb9, -0x6e, -0x59, -0xc0, -0xef, -0xe6, -0xba, -0x68, -0x5a, -0xac, -0xfc, -0xdd, -0x69, -0xbe, -0xfe, -0xdf, -0x89, -0x99, -0xc3, -0x79, -0xa4, -0xf3, -0xff, -0xff, -0xff, -0xff, -0xdc, -0x77, -0x85, -0x75, -0x56, -0x7c, -0xd9, -0x6e, -0x54, -0x6a, -0x73, -0x6b, -0x5d, -0x62, -0x9d, -0xf1, -0xff, -0xdd, -0x69, -0xbe, -0xfa, -0xc9, -0xb7, -0xf0, -0xfd, -0xd4, -0xb0, -0xe0, -0xff, -0xff, -0xff, -0xff, -0xf0, -0xa5, -0x82, -0x82, -0xa0, -0xe0, -0xf2, -0x9e, -0x8c, -0x8d, -0x8e, -0x97, -0xab, -0xd3, -0xf7, -0xff, -0xff, -0xdf, -0x72, -0xc2, -0xff, -0xfd, -0xfe, -0xff, -0xff, -0xff, -0xfd, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfc, -0xf8, -0xf7, -0xfc, -0xff, -0xff, -0xfb, -0xfa, -0xfa, -0xfa, -0xfb, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xf7, -0xdc, -0xf0, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf5, -0xe1, -0xdf, -0xe0, -0xe5, -0xe5, -0xe7, -0xdf, -0xe0, -0xe5, -0xea, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xee, -0xc9, -0xc9, -0xc4, -0xd0, -0xcd, -0xc6, -0xd3, -0xcf, -0xc9, -0xd6, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xf6, -0xf5, -0xf3, -0xf7, -0xf3, -0xf2, -0xf3, -0xf7, -0xf9, -0xf7, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xdc, -0xda, -0xfa, -0xdc, -0xd9, -0xe2, -0xfa, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfa, -0xac, -0x79, -0xb1, -0x63, -0x91, -0x88, -0x7e, -0xef, -0xf4, -0xcb, -0xf2, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf6, -0x82, -0xc4, -0x64, -0xe6, -0xfd, -0x87, -0xb0, -0xa0, -0xba, -0xbc, -0xe2, -0xbc, -0xf2, -0xfe, -0xff, -0xf7, -0x88, -0xa6, -0x64, -0xe6, -0xfe, -0x8d, -0xa6, -0x8c, -0xb8, -0xe8, -0x75, -0xc4, -0xff, -0xff, -0xf4, -0xb7, -0x89, -0x9a, -0x62, -0xa3, -0x9a, -0x70, -0xe6, -0xa3, -0xdd, -0xba, -0xd2, -0xa8, -0xf4, -0xff, -0xfb, -0xc7, -0xc5, -0xf4, -0xc8, -0xc4, -0xcf, -0xf2, -0xff, -0xc9, -0xec, -0xfe, -0xff, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xe3, -0xd3, -0xda, -0xd8, -0xd7, -0xef, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfc, -0xfa, -0xfa, -0xf9, -0xfc, -0xfd, -0xff, -0xe0, -0xc0, -0xaa, -0xb9, -0xf8, -0xef, -0xff, -0xff, -0xfb, -0x9d, -0xa5, -0xc4, -0xa1, -0xc6, -0xb6, -0xfc, -0xdb, -0xb7, -0xa4, -0xb3, -0xd4, -0xe0, -0xde, -0xfc, -0xff, -0xff, -0xff, -0xff, -0xf7, -0xe8, -0xe9, -0xfb, -0xce, -0xb3, -0xd4, -0xec, -0xe4, -0xd5, -0xe5, -0xf0, -0xcf, -0xe5, -0xda, -0x0, -0x0, -0x0, -0x0, -0x0, -}; - -#undef RAW_NAME -#undef IMAGE_NAME diff --git a/glide2x/h3/glide/src/tv.h b/glide2x/h3/glide/src/tv.h deleted file mode 100644 index a57907c..0000000 --- a/glide2x/h3/glide/src/tv.h +++ /dev/null @@ -1,573 +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$ -** $Log$ -** -** 3 3/17/99 6:16p Dow -** Phantom Menace and other fixes. -** -** 10 3/02/99 4:20p Stuartb -** Removed obsolete TV_STANDARD_XXX defines. -** -** 9 2/16/99 3:47p Stuartb -** Added some BIOS_XXXX tvout & LCD defines. -** -** 8 2/13/99 6:45p Stuartb -** First cut at PAL_M, PAL_N, PAL_NC support in tvout. -** -** 7 99/01/26 11:51 Larryw -** Bringing the other tv.h's into sync with the changes made to -** $/devel/h3/Win95/dx/inc/tv.h (including QUERYENABLETV). -** -** 2 1/14/99 3:50p Stuartb -** Added #define QUERYENABLETV. -** -** 1 9/10/98 2:55p Stuartb -** Interface file for TVOUT. -** -** 2 7/11/98 8:18a Andrew -** changed some comments -** -** 1 5/12/98 9:34a Andrew -** First attempt at TV out interface -** -*/ - -#ifndef _TV_H_ -#define _TV_H_ - -#ifdef VDDONLY -#define FAR -#endif - -// TVOut Queries -#define QUERYTVAVAIL (0x300) // Returns Status Determined at Boot -#define QUERYTVSENSE (0x301) // Performs a Sense on the available connectors - -// Individual Queries on Capabilities -#define QUERYGETPICCAP (0x321) // Get Individual Picture Control Capability -#define QUERYGETFILTERCAP (0x322) // Get Individual Filter Control Capability -#define QUERYGETPOSCAP (0x323) // Get Individual Position Control Capability -#define QUERYGETSIZECAP (0x324) // Get Individual Size Control Capability -#define QUERYGETSPECIALCAP (0x325) // Get Individual Special Control Capability - -// Get Current Settings -#define QUERYGETSTANDARD (0x340) // Get Current Standard Setting -#define QUERYGETPICCONTROL (0x341) // Get Individual Picture Control Setting -#define QUERYGETFILTERCONTROL (0x342) // Get Individual Filter Control Setting -#define QUERYGETPOSCONTROL (0x343) // Get Position Control Setting -#define QUERYGETSIZECONTROL (0x344) // Get Size Control Setting -#define QUERYGETSPECIAL (0x345) // Get Individual Special Control Setting -#define QUERYGETCONSTATUS (0x346) // Get Connector Status - -// Set Settings -#define QUERYSETSTANDARD (0x360) // Set Current Standard Setting -#define QUERYSETPICCONTROL (0x361) // Set Individual Picture Control Setting -#define QUERYSETFILTERCONTROL (0x362) // Set Individual Filter Control Setting -#define QUERYSETPOSCONTROL (0x363) // Set Individual Position Control Setting -#define QUERYSETSIZECONTROL (0x364) // Set Individual Size Control Setting -#define QUERYSSETSPECIAL (0x365) // Set Individual Special Control Setting -#define QUERYSETCONSTATUS (0x366) // Set Connector Status - -// Registery Updates -#define QUERYCOMMITREG (0x380) // This should be called after the user hits ok -#define QUERYREFRESH (0x381) // This should be called if the user hits cancel - -// Enable/Disable TV-Out -#define QUERYDISABLETV (0x500) // Disable TV-Out and switch CRT On -#define QUERYENABLETV (0x501) // This just enables mode selection - -/* -** Call this function first to know how if a TV Encoder is -** available and what general functionality it provides -** -** INPUT: qin.dwSubFunc = QUERYTVAVAIL -** OUTPUT: TVSTATUS -*/ - -typedef struct tvcon { - DWORD dwType; // Type of the Connector - DWORD dwStatus; // Connector Status -} TVCON, FAR * LPTVCON, * PTVCON; - -// To be used in the Type Field of TVCON -#define TV_TYPE_SVIDEO (0x00000001L) -#define TV_TYPE_COMPOSITE (0x00000002L) -#define TV_TYPE_SCART (0x00000004L) -#define TV_TYPE_UNKNOWN (0x08L) // for broken bt868 rev d - -// To be used in the Status Field of TVCON -#define TV_PRESENT (0x00000001L) // Did sense determine TV on connector ? -#define TV_CONNECTOR_ENABLED (0x00000002L) // Is Connector Currently Enabled ? - -#define MAX_CONNECTORS (0x000000004L) - -// This structure defines what we are capable of -typedef struct qtvstatus { - DWORD dwEncoder; // Did I2C Query find a TV Encoder - DWORD dwStandard; // Bit Map of Standard's Supported - DWORD dwPicControl; // Bit Map of Picture Controls - DWORD dwFilterControl; // Bit Map of Filter Controls - DWORD dwPosControl; // Bit Map of Position Controls - DWORD dwSizeControl; // Bit Map of Size Controls - DWORD dwSpecial; // Bit Map of Special Controls - DWORD dwNumSimultaneous; // How many outputs can you support at the same time? - DWORD dwNumConnectors; // How many connectors does the Encoder support - TVCON TVCon[MAX_CONNECTORS]; // TV Connector Status - BYTE szName[10]; // Name of the Encoder - } QTVSTATUS, FAR * LPQTVSTATUS, * PTVSTATUS; - -// To be used in TVStatus.dwEncoder -#define TV_ENCODER_PRESENT (0x00000001L) - -// To be used in TVStatus.dwPicControl -#define TV_BRIGHTNESS (0x00000001) -#define TV_CONTRAST (0x00000002) -#define TV_GAMMA (0x00000004) -#define TV_HUE (0x00000008) -#define TV_SATURATION (0x00000010) -#define TV_SHARPNESS (0x00000020) - -// To be used in TVStatus.dwFilter -#define TV_FLICKER (0x10000001) -#define TV_CHROMA (0x10000002) -#define TV_LUMA (0x10000004) - -// To be used in TVStatus.dwPosControl -#define TV_HORIZONTAL (0x00000001) -#define TV_VERTICAL (0x00000002) - -// To be used in TVStatus.dwSizeControl -#define TV_UNDERSCAN (0x00000001) -#define TV_OVERSCAN (0x00000002) -#define TV_ADJUST_UNDERSCAN (0x00000004) -#define TV_ADJUST_OVERSCAN (0x00000008) - -// To be used in TVStatus.dwSpecial -#define TV_CLOSED_CAPTION (0x00000001) -#define TV_MACROVISION (0x00000002) -#define TV_LCDPANEL (0x00000004) /* Flat panel out */ - -// To be used in TVSetSpec.dwCap for miscellaneous features -#define TV_SETSPECIAL_CCAPTION (0x00000001) -#define TV_SETSPECIAL_MACROVISION (0x00000002) -#define TV_SETSPECIAL_LCDPANEL (0x00000004) /* Flat panel out */ -#define TV_SETSPECIAL_WR_LCDREG (0x00000005) /* For debug */ -#define TV_SETSPECIAL_RD_LCDREG (0x00000006) /* For debug */ - -#define MAX_SPECIAL_DATA 512 -/* -** Call this function to request the Driver to perform -** a sense on every connector -** -** INPUT: qin.dwSubFunc = QUERYTVSENSE -** OUTPUT: TVCONSTATUS -*/ - -typedef struct tvconstatus { - DWORD dwNumConnectors; // How many connectors does the Encoder support - TVCON TVCon[MAX_CONNECTORS]; // TV Connector Status - } TVCONSTATUS, FAR * LPTVCONSTATUS, * PTVCONSTATUS; - -/**************************************************************************** -** -** Get Capabilities -** -****************************************************************************/ - -typedef struct qind { - DWORD dwSubFunc; // Sub Function - DWORD dwCap; // Capability of Interest -} QIND, FAR * LPQIND, * PQIND; - -/* -** Call this function to request the Driver to -** report individual Picture Capability -** -** INPUT: qind.dwSubFunc = QUERYGETPICCAP -** qind.dwCap = TV_BRIGHTNESS | -** TV_CONTRAST | -** TV_GAMMA | -** TV_HUE | -** TV_SATURATION | -** TV_SHARPNESS -** OUTPUT: TVCAPDATA -*/ - -typedef struct tvcapdata { - DWORD dwCap; // Capability of Interest - DWORD dwNumSteps; // Number of Steps Supported by Hardware - } TVCAPDATA, FAR * LPTVCAPDATA, * PTVCAPDATA; - -/* -** Call this function to request the Driver to -** report all Position Capability -** -** INPUT: qin.dwSubFunc = QUERYGETPOSITIONCAP -** OUTPUT: TVPOSCAP -** Note this is a good match for Chrontel but unknown now to do this on Brooktree -*/ -typedef struct tvposcap { - DWORD dwMaxLeft; // Maximum Left Position in Hardware Units - DWORD dwMaxRight; // Maximum Right Position in Hardware Units - DWORD dwHorGranularity; // Size of Movement in Pixels - DWORD dwMaxTop; // Maximum Top Position in Hardware Units - DWORD dwMaxBottom; // Maximum Bottom Position in Hardware Units - DWORD dwVGAGranularity; // Granularity in VGA Lines - } TVPOSCAP, FAR * LPTVPOSCAP, * PTVPOSCAP; - -/* -** Call this function to request the Driver to -** report all Size Capability -** -** INPUT: qin.dwSubFunc = QUERYGETSIZECAP -** OUTPUT: TVSIZECAP -** Note this is a good match for BrookTree but unknown now to do this on Chrontel -*/ -typedef struct tvsizecap { - DWORD dwMaxHorInput; // Maximum Input Horizontal Size in Active Pixels - DWORD dwMaxVerInput; // Maximum Input Vertical Size in Active Lines - DWORD dwMaxHorOutput; // Maximum Output Horizontal Size in Active Pixels - DWORD dwMaxVerOutput; // Maximum Output Vertical Size in Active Pixels - DWORD dwMinHorInput; // Minimum Input Horizontal Size in Active Pixels - DWORD dwMinVerInput; // Minimum Input Vertical Size in Active Lines - DWORD dwMinHorOutput; // Minimum Output Horizontal Size in Active Pixels - DWORD dwMinVerOutput; // Minimum Output Vertical Size in Active Pixels - DWORD dwHorStepSize; // In Percentage * 1000 - DWORD dwVerStepSize; // In Percentage * 1000 - } TVSIZECAP, FAR * LPTVSIZECAP, * PTVSIZECAP; - -/* -** Call this function to request the Driver to -** report on a Special Capability -** -** INPUT: qind.dwSubFunc = QUERYGETSPECIALCAP -** qind.dwCap = TV_CLOSED_CAPTION | -** TV_MACROVISION | -** TV_LCDPANEL -** OUTPUT: TVSPECCAP -*/ - -/**************************************************************************** -** -** Get Current Settings -** -****************************************************************************/ - -/* -** Call this function to request the Driver to -** report current Standard Setting -** -** INPUT: qin.dwSubFunc = QUERYGETSTANDARD -** OUTPUT: TVGETSTANDARD -*/ -typedef struct tvgetstandard { - DWORD dwStandard; // Standard Currently in Use -} TVGETSTANDARD, FAR * LPTVGETSTANDARD, * PTVGETSTANDARD; - -/* -** Call this function to request the Driver to -** report current individual Picture Capability -** -** INPUT: qind.dwSubFunc = QUERYGETPICCONTROL -** qind.dwCap = TV_BRIGHTNESS | -** TV_CONTRAST | -** TV_GAMMA | -** TV_HUE | -** TV_SATURATION | -** TV_SHARPNESS -** OUTPUT: TVCURCAP -*/ - -typedef struct tvcurcap { - DWORD dwCap; // Capability Requested - DWORD dwStep; // Current Hardware Step we are on - } TVCURCAP, FAR * LPTVCURCAP, * PTVCURCAP; - -/* -** Call this function to request the Driver to -** report current individual Filter Capability -** -** INPUT: qind.dwSubFunc = QUERYGETFILTERCONTROL -** qind.dwCap = TV_FLICKER | -** TV_CHROMA | -** TV_LUMA -** OUTPUT: TVCURCAP -*/ - -/* -** Call this function to request the Driver to -** report all current Position Capability -** -** INPUT: qin.dwSubFunc = QUERYGETPOSITIONCONTROL -** OUTPUT: TVCURPOS -** Note this is a good match for Chrontel but unknown now to do this on Brooktree -*/ -typedef struct tvcurpos { - DWORD dwCurLeft; // Current Left Position in Hardware Units - DWORD dwCurRight; // Current Right Position in Hardware Units - DWORD dwCurTop; // Current Top Position in Hardware Units - DWORD dwCurBottom; // Current Bottom Position in Hardware Units - } TVCURPOS, FAR * LPTVCURPOS, * PTVCURPOS; - -/* -** Call this function to request the Driver to -** report current Size Capability -** -** INPUT: qin.dwSubFunc = QUERYGETSIZECONTROL -** OUTPUT: TVCURSIZE -** Note this is a good match for BrookTree but unknown now to do this on Chrontel -*/ -typedef struct tvcursize { - DWORD dwCurHorInput; // Current Input Horizontal Size in Active Pixels - DWORD dwCurVerInput; // Current Input Vertical Size in Active Lines - DWORD dwCurHorOutput; // Current Output Horizontal Size in Active Pixels - DWORD dwCurVerOutput; // Current Output Vertical Size in Active Pixels - } TVCURSIZE, FAR * LPTVCURSIZE, * PTVCURSIZE; - -/* -** Call this function to request the Driver to -** report on current a Special Capability -** -** INPUT: qind.dwSubFunc = QUERYGETSPECIAL -** qind.dwCap = TV_CLOSED_CAPTION | -** TV_MACROVISION -** OUTPUT: TVCURSPEC -*/ - -/* -** Call this function to request the Driver to return -** in memory data on every connector -** -** INPUT: qin.dwSubFunc = QUERYGETCONSTATUS -** OUTPUT: TVCONSTATUS -*/ - - -/**************************************************************************** -** -** Set Functions -** -****************************************************************************/ - -/* -** Call this function to request the Driver to -** change the current Standard Setting -** -** INPUT: TvSetStandard.dwSubFunc = QUERYSETSTANDARD -** TvSetStandard.dwStandard = TV_STANDARD_NTSCRS170A | -** TV_STANDARD_NTSCM | -** TV_STANDARD_NTSCN | -** TV_STANDARD_NTSC443 | -** TV_STANDARD_NTSCJAPAN | -** TV_STANDARD_PALBDGHI | -** TV_STANDARD_PALM | -** TV_STANDARD_PALN | -** TV_STANDARD_PALN_ARGENTINA | -** -** OUTPUT: None -*/ -typedef struct tvsetstandard { - DWORD dwSubFunc; // Sub Function - DWORD dwStandard; // Standard Currently in Use -} TVSETSTANDARD, FAR * LPTVSETSTANDARD, * PTVSETSTANDARD; - -/* -** Call this function to request the Driver to -** set individual Picture Capability -** -** INPUT: TVSetCap.dwSubFunc = QUERYSETPICCONTROL -** TVSetCap.dwCap = TV_BRIGHTNESS | -** TV_CONTRAST | -** TV_GAMMA | -** TV_HUE | -** TV_SATURATION | -** TV_SHARPNESS -** TVSetCap.dwStep = -** OUTPUT: None -*/ - -typedef struct tvsetcap { - DWORD dwSubFunc; // SubFunction - DWORD dwCap; // Capability Requested - LONG dwStep; // Hardware Step to set - } TVSETCAP, FAR * LPTVSETCAP, * PTVSETCAP; - -/* -** Call this function to request the Driver to -** set individual Filter Capability -** -** INPUT: TVSetCap.dwSubFunc = QUERYSETFILTERCONTROL -** TVSetCap.dwCap = TV_FLICKER | -** TV_CHROMA | -** TV_LUMA -** TVSetCap.dwStep = -** OUTPUT: None -*/ - -/* -** Call this function to request the Driver to -** move the Output Image -** -** INPUT: TVSetPos.dwSubFunc = QUERYSETPOSCONTROL -** TVSetPos.dwLeft = -** TVSetPos.dwRight = -** TVSetPos.dwTop = -** TVSetPos.dwBottom = -** OUTPUT: None -** Note this is a good match for Chrontel but unknown now to do this on Brooktree -*/ -typedef struct tvsetpos { - DWORD dwSubFunc; // SubFunction - DWORD dwLeft; // Left Position in Hardware Units - DWORD dwRight; // Right Position in Hardware Units - DWORD dwTop; // Top Position in Hardware Units - DWORD dwBottom; // Bottom Position in Hardware Units - } TVSETPOS, FAR * LPTVSETPOS, * PTVSETPOS; - -/* -** Call this function to request the Driver to -** set the resize the input/output -** -** INPUT: TVSetSize.dwSubFunc = QUERYSETSIZECONTROL -** TvSetSize.dwHorOutput = -** TvSetSize.dwVerOutput = -** OUTPUT: None -** Note this is a good match for BrookTree but unknown now to do this on Chrontel -*/ -typedef struct tvsetsize { - DWORD dwSubFunc; // SubFunction - DWORD dwOverScan; // Overscan enable/disable - DWORD dwHorOutput; // Output Horizontal Size in Active Pixels - DWORD dwVerOutput; // Output Vertical Size in Active Lines - } TVSETSIZE, FAR * LPTVSETSIZE, * PTVSETSIZE; - -/* -** Call this function to request the Driver to -** set the a Special Capability -** -** INPUT: TVSetSpec.dwSubFunc = QUERYSETSPECIAL -** TVSetSpec.dwCap = TV_SETSPECIAL_CCAPTION | -** TV_SETSPECIAL_MACROVISION | -** TV_SETSPECIAL_LCDPANEL -** OUTPUT: None -*/ -typedef struct tvsetspecial { - DWORD dwSubFunc; // Sub Function - DWORD dwCap; // Feature to set - DWORD dwIndex; // Index to data array: 0 - none - WORD wData[MAX_SPECIAL_DATA]; // Data array: format specific to caps - DWORD dwIPclock; // Flat panel clock - } TVSETSPECIAL, FAR * LPTVSETSPECIAL, * PTVSETSPECIAL; - -/* -** Call this function to request the Driver to enable/disable -** connectors -** -** INPUT: TVSetConnector.dwSubFunc = QUERYSETCONSTATUS -** Note i can range from 0 to < dwNumSimultaneous -** TVSetConnector.TVCon[i].dwType = TV_TYPE_SVIDEO | TV_TYPE_COMPOSITE | TV_TYPE_SCART -** TVSetConnector.TVCon[i].dwStatus = TV_CONNECTOR_ENABLED | 0x00 -** -** OUTPUT: None -*/ - -typedef struct tvsetconnector { - DWORD dwSubFunc; // SubFunction - TVCON TVCon[MAX_CONNECTORS]; // TV Connector Status - } TVSETCONNECTOR, FAR * LPTVSETCONNECTOR, * PTVSETCONNECTOR; - -/**************************************************************************** -** -** Registry Functions -** -****************************************************************************/ -/* -** Call this function to request the Driver to save -** in memory data to registry -** -** INPUT: qin.dwSubFunc = QUERYCOMMITREG -** OUTPUT: None -*/ - -/* -** Call this function to request the Driver to refresh -** in memory data with registry data -** -** INPUT: qin.dwSubFunc = QUERYREFRESH -** OUTPUT: None -*/ - - - -/**************************************************************************** -** -** Error codes -** -****************************************************************************/ -#define TV_STANDARD_UNSUPPORTED (0x00000001L) -#define TV_CONTROL_UNSUPPORTED (0x00000002L) -#define TV_INVALID_DEVICE (0x000000ffL) - - -/**************************************************************************** -** -** TV standards that we support taken from win98 ddk tvout.h -** -****************************************************************************/ - -#define VP_TV_STANDARD_NTSC_M 0x0001 // 75 IRE Setup -#define VP_TV_STANDARD_NTSC_M_J 0x0002 // Japan, 0 IRE Setup -#define VP_TV_STANDARD_PAL_B 0x0004 -#define VP_TV_STANDARD_PAL_D 0x0008 -#define VP_TV_STANDARD_PAL_H 0x0010 -#define VP_TV_STANDARD_PAL_I 0x0020 -#define VP_TV_STANDARD_PAL_M 0x0040 -#define VP_TV_STANDARD_PAL_N 0x0080 -#define VP_TV_STANDARD_SECAM_B 0x0100 -#define VP_TV_STANDARD_SECAM_D 0x0200 -#define VP_TV_STANDARD_SECAM_G 0x0400 -#define VP_TV_STANDARD_SECAM_H 0x0800 -#define VP_TV_STANDARD_SECAM_K 0x1000 -#define VP_TV_STANDARD_SECAM_K1 0x2000 -#define VP_TV_STANDARD_SECAM_L 0x4000 -#define VP_TV_STANDARD_WIN_VGA 0x8000 -// and the rest -#define VP_TV_STANDARD_NTSC_433 0x00010000 -#define VP_TV_STANDARD_PAL_G 0x00020000 -#define VP_TV_STANDARD_PAL_60 0x00040000 -#define VP_TV_STANDARD_SECAM_L1 0x00080000 - -#define VP_TV_STANDARD_PAL_NC VP_TV_STANDARD_SECAM_L1 - - -#define BIOS_NTSC 0x01 // 00001 -#define BIOS_PAL 0x02 // (BGDHI) 00010 -#define BIOS_PAL_N 0x0a // 01010 -#define BIOS_PAL_M 0x12 // 10010 -#define BIOS_PAL_Nc 0x1a // 11010 - -#define BIOS_TVSTD_MASK (BIOS_NTSC | BIOS_PAL | BIOS_PAL_N | BIOS_PAL_M | BIOS_PAL_Nc) -#define BIOS_LCD_ACTIVE 0x04 -#define BIOS_TVOUT_ACTIVE 0x20 - - -#endif diff --git a/glide2x/h3/glide/src/xdraw2.S b/glide2x/h3/glide/src/xdraw2.S deleted file mode 100644 index a5619a5..0000000 --- a/glide2x/h3/glide/src/xdraw2.S +++ /dev/null @@ -1,245 +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$ */ -/* */ -/* 11 10/05/98 7:43p Peter */ -/* 3DNow!(tm) happiness everywhere */ -/* */ -/* 10 10/03/98 3:35p Peter */ -/* First pass at dynamic detection of 3DNow!(tm) */ -/* */ -/* 9 9/21/98 5:42p Dow */ -/* 3DNow! (tm) mods */ -/* */ -/* 8 7/24/98 1:40p Hohn */ -/* */ -/* 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.asm" - - - -.data - .type One,@object - .size One,4 -One: .int 0x03f800000 - .type Area,@object - .size Area,4 -Area: .int 0 - -#if GLIDE_PACKED_RGB - .type bias0,@object - .size bias0,4 -bias0: .int 0 - .type bias1,@object - .size bias1,4 -bias1: .int 0 -#endif - -/* Ugly, but seems to workaround the problem with locally defined */ -/* data segment globals not getting relocated properly when using */ -/* djgpp. */ - -#define zArea One+0x04 - -/* Definitions of cvg regs and glide root structures. */ -#include "fxgasm.h" - -/* Arguments (STKOFF = 16 from 4 pushes) */ -#define STKOFF 16 -#define _va 4 + STKOFF -#define _vb 8 + STKOFF -#define _vc 12 + STKOFF - -#ifdef GL_AMD3D -#define PROC_TYPE(arg) _trisetup_3DNow_##arg -#define END_PROC_TYPE(arg) .L_END_trisetup_3Dnow_##arg -#else -#define PROC_TYPE(arg) _trisetup_Default_##arg -#define END_PROC_TYPE(arg) .L_END_Default_3Dnow_##arg -#endif - -/* -------------------------------------------------------------------------- */ -.text - - -.align 32 - -.globl PROC_TYPE(cull) -.type PROC_TYPE(cull),@function -PROC_TYPE(cull): - -#define LOCAL(arg) .L_cull_##arg - -#define GLIDE_CULLING 1 -#define GLIDE_PACK_RGB 0 -#define GLIDE_PACK_ALPHA 0 -#define GLIDE_GENERIC_SETUP 0 -#include "xdraw2.inc.S" -#undef cull -#define GLIDE_GENERIC_SETUP 0 -#define GLIDE_PACK_ALPHA 0 -#define GLIDE_PACK_RGB 0 -#define GLIDE_CULLING 0 - -END_PROC_TYPE(cull): -.size PROC_TYPE(cull),END_PROC_TYPE(cull)-PROC_TYPE(cull) - -.align 32 - -#if GLIDE_PACKED_RGB -.globl PROC_TYPE(cull_rgb) -.type PROC_TYPE(cull_rgb),@function -PROC_TYPE(cull_rgb): - -#define LOCAL(arg) .L_cull_rgb_##arg - -#define GLIDE_CULLING 1 -#define GLIDE_PACK_RGB 1 -#define GLIDE_PACK_ALPHA 0 -#define GLIDE_GENERIC_SETUP 0 -#include "xdraw2.inc.S" -#define GLIDE_GENERIC_SETUP 0 -#define GLIDE_PACK_ALPHA 0 -#define GLIDE_PACK_RGB 0 -#define GLIDE_CULLING 0 - -END_PROC_TYPE(cull_rgb): -.size PROC_TYPE(cull_rgb),END_PROC_TYPE(cull_rgb)-PROC_TYPE(cull_rgb) - -.align 32 - -.globl PROC_TYPE(cull_argb) -.type PROC_TYPE(cull_argb),@function -PROC_TYPE(cull_argb): - -#define LOCAL(arg) .L_cull_argb_##arg - -#define GLIDE_CULLING 1 -#define GLIDE_PACK_RGB 1 -#define GLIDE_PACK_ALPHA 1 -#define GLIDE_GENERIC_SETUP 0 -#include "xdraw2.inc.S" -#define GLIDE_GENERIC_SETUP 0 -#define GLIDE_PACK_ALPHA 0 -#define GLIDE_PACK_RGB 0 -#define GLIDE_CULLING 0 - -END_PROC_TYPE(cull_argb): -.size PROC_TYPE(cull_argb),END_PROC_TYPE(cull_argb)-PROC_TYPE(cull_argb) -#endif /* GLIDE_PACKED_RGB */ - -.align 32 - -.globl PROC_TYPE(Default) -.type PROC_TYPE(Default),@function -PROC_TYPE(Default): - -#define LOCAL(arg) .L_Default_##arg - -#define GLIDE_CULLING 0 -#define GLIDE_PACK_RGB 0 -#define GLIDE_PACK_ALPHA 0 -#define GLIDE_GENERIC_SETUP 0 -#include "xdraw2.inc.S" -#define GLIDE_GENERIC_SETUP 0 -#define GLIDE_PACK_ALPHA 0 -#define GLIDE_PACK_RGB 0 -#define GLIDE_CULLING 0 - -END_PROC_TYPE(Default): -.size PROC_TYPE(Default),END_PROC_TYPE(Default)-PROC_TYPE(Default) - -.align 32 - -#if GLIDE_PACKED_RGB -.globl PROC_TYPE(rgb) -.type PROC_TYPE(rgb),@function -PROC_TYPE(rgb): - -#define LOCAL(arg) .L_rgb_##arg - -#define GLIDE_CULLING 0 -#define GLIDE_PACK_RGB 1 -#define GLIDE_PACK_ALPHA 0 -#define GLIDE_GENERIC_SETUP 0 -#include "xdraw2.inc.S" -#define GLIDE_GENERIC_SETUP 0 -#define GLIDE_PACK_ALPHA 0 -#define GLIDE_PACK_RGB 0 -#define GLIDE_CULLING 0 - -END_PROC_TYPE(rgb): -.size PROC_TYPE(rgb),END_PROC_TYPE(rgb)-PROC_TYPE(rgb) - -.align 32 - -.globl PROC_TYPE(argb) -.type PROC_TYPE(argb),@function -PROC_TYPE(argb): - -#define LOCAL(arg) .L_argb_##arg - -#define GLIDE_CULLING 0 -#define GLIDE_PACK_RGB 1 -#define GLIDE_PACK_ALPHA 1 -#define GLIDE_GENERIC_SETUP 0 -#include "xdraw2.inc.S" -#define GLIDE_GENERIC_SETUP 0 -#define GLIDE_PACK_ALPHA 0 -#define GLIDE_PACK_RGB 0 -#define GLIDE_CULLING 0 - -END_PROC_TYPE(argb): -.size PROC_TYPE(argb),END_PROC_TYPE(argb)-PROC_TYPE(argb) -#endif /* GLIDE_PACKED_RGB */ - - - -.END - diff --git a/glide2x/h3/glide/src/xdraw2.asm b/glide2x/h3/glide/src/xdraw2.asm deleted file mode 100644 index 5de4372..0000000 --- a/glide2x/h3/glide/src/xdraw2.asm +++ /dev/null @@ -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$ -;; $Revision$ -;; $Log$ -;; -;; 3 3/17/99 6:17p Dow -;; Phantom Menace and other fixes. -;; -;; 10 10/09/98 6:57p Peter -;; dynamic 3DNow!(tm) mods -;; -;; 9 9/21/98 5:35p Dow -;; 3DNow! mods -;; -;; 8 5/18/98 3:21p Peter -;; dynamic culling changes -; -; 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. -;; - -TITLE xdraw2.asm -OPTION OLDSTRUCTS - -.586P -.MMX -.K3D - -EXTRN __GlideRoot: DWORD -EXTRN __FifoMakeRoom: NEAR - -_DATA SEGMENT - One DD 03f800000r - Area DD 0 - -IF GLIDE_PACKED_RGB - bias0 DD 0 - bias1 DD 0 -ENDIF -_DATA ENDS - -; Ugly, but seems to workaround the problem with locally defined -; data segment globals not getting relocated properly when using -; djgpp. - -zArea TEXTEQU - -;;; Definitions of cvg regs and glide root structures. -INCLUDE fxgasm.h - -; Arguments (STKOFF = 16 from 4 pushes) -STKOFF = 16 -_va$ = 4 + STKOFF -_vb$ = 8 + STKOFF -_vc$ = 12 + STKOFF - -PROC_TYPE MACRO procType:= - IFDEF GL_AMD3D - EXITM <__trisetup_3DNow_&procType&@12> - ELSE - EXITM <__trisetup_Default_&procType&@12> - ENDIF - ENDM - -;-------------------------------------------------------------------------- -_TEXT SEGMENT PAGE PUBLIC USE32 'CODE' - ASSUME DS: FLAT, SS: FLAT - - ALIGN 32 - - PUBLIC PROC_TYPE(cull) -PROC_TYPE(cull) PROC NEAR - -GLIDE_CULLING textequ <1> -GLIDE_PACK_RGB textequ <0> -GLIDE_PACK_ALPHA textequ <0> -GLIDE_GENERIC_SETUP textequ <0> -INCLUDE xdraw2.inc -GLIDE_GENERIC_SETUP textequ <0> -GLIDE_PACK_ALPHA textequ <0> -GLIDE_PACK_RGB textequ <0> -GLIDE_CULLING textequ <0> - -PROC_TYPE(cull) ENDP - - ALIGN 32 - -IF GLIDE_PACKED_RGB - PUBLIC PROC_TYPE(cull_rgb) -PROC_TYPE(cull_rgb) PROC NEAR - -GLIDE_CULLING textequ <1> -GLIDE_PACK_RGB textequ <1> -GLIDE_PACK_ALPHA textequ <0> -GLIDE_GENERIC_SETUP textequ <0> -INCLUDE xdraw2.inc -GLIDE_GENERIC_SETUP textequ <0> -GLIDE_PACK_ALPHA textequ <0> -GLIDE_PACK_RGB textequ <0> -GLIDE_CULLING textequ <0> - -PROC_TPYE(cull_rgb) ENDP - - ALIGN 32 - - PUBLIC PROC_TPYE(cull_argb) -PROC_TPYE(cull_argb) PROC NEAR - -GLIDE_CULLING textequ <1> -GLIDE_PACK_RGB textequ <1> -GLIDE_PACK_ALPHA textequ <1> -GLIDE_GENERIC_SETUP textequ <0> -INCLUDE xdraw2.inc -GLIDE_GENERIC_SETUP textequ <0> -GLIDE_PACK_ALPHA textequ <0> -GLIDE_PACK_RGB textequ <0> -GLIDE_CULLING textequ <0> - -PROC_TPYE(cull_argb) ENDP -ENDIF ; GLIDE_PACKED_RGB - - ALIGN 32 - - PUBLIC PROC_TYPE() -PROC_TYPE() PROC NEAR - -GLIDE_CULLING textequ <0> -GLIDE_PACK_RGB textequ <0> -GLIDE_PACK_ALPHA textequ <0> -GLIDE_GENERIC_SETUP textequ <0> -INCLUDE xdraw2.inc -GLIDE_GENERIC_SETUP textequ <0> -GLIDE_PACK_ALPHA textequ <0> -GLIDE_PACK_RGB textequ <0> -GLIDE_CULLING textequ <0> - -PROC_TYPE() ENDP - - ALIGN 32 - -IF GLIDE_PACKED_RGB - PUBLIC PROC_TYPE(rgb) -PROC_TPYE(rgb) PROC NEAR - -GLIDE_CULLING textequ <0> -GLIDE_PACK_RGB textequ <1> -GLIDE_PACK_ALPHA textequ <0> -GLIDE_GENERIC_SETUP textequ <0> -INCLUDE xdraw2.inc -GLIDE_GENERIC_SETUP textequ <0> -GLIDE_PACK_ALPHA textequ <0> -GLIDE_PACK_RGB textequ <0> -GLIDE_CULLING textequ <0> - -PROC_TPYE(rgb) ENDP - - ALIGN 32 - - PUBLIC PROC_TPYE(argb) -PROC_TPYE(argb) PROC NEAR - -GLIDE_CULLING textequ <0> -GLIDE_PACK_RGB textequ <1> -GLIDE_PACK_ALPHA textequ <1> -GLIDE_GENERIC_SETUP textequ <0> -INCLUDE xdraw2.inc -GLIDE_GENERIC_SETUP textequ <0> -GLIDE_PACK_ALPHA textequ <0> -GLIDE_PACK_RGB textequ <0> -GLIDE_CULLING textequ <0> - -PROC_TPYE(argb) ENDP -ENDIF ; GLIDE_PACKED_RGB - - -_TEXT ENDS - -END - diff --git a/glide2x/h3/glide/src/xdraw2.inc b/glide2x/h3/glide/src/xdraw2.inc deleted file mode 100644 index bfcf36c..0000000 --- a/glide2x/h3/glide/src/xdraw2.inc +++ /dev/null @@ -1,1266 +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$ -; -; 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. -;; - -TITLE xdraw2.inc - -ifdef GL_AMD3D - -GR_FIFO_WRITE MACRO __addr, __offset, __data - mov [__addr + __offset], __data -ENDM ; GR_FIFO_WRITE - - -WRITE_MM1_FIFO_ALIGNED MACRO - movq [fifo], mm1 ; store current param | previous param -ENDM ; WRITE_MM1_FIFO_ALIGNED - -WRITE_MM1LOW_FIFO MACRO - movd [fifo], mm1 ; store current param | previous param -ENDM ; WRITE_MM1LOW_FIFO - -gc TEXTEQU ; points to graphics context -fifo TEXTEQU ; points to fifo entries -tempVal TEXTEQU - -IF GLIDE_CULLING -fa TEXTEQU ; vtx a from caller -fb TEXTEQU ; vtx b from caller -fc TEXTEQU ; vtx c from caller -cull TEXTEQU ; cull mode -intArea TEXTEQU ; area temp storage - - ;; Prologue stuff - - ;; This code is only executed when culling is enabled, so we - ;; don't need to check for GR_CULL_DISABLE - - push edi ; save caller's register variable - mov gc,[__GlideRoot+curGC]; GR_DCL_GC - - push esi ; save caller's register variable - mov fc, [esp + _vc$ - 8] ; get base address of vertex C - - push ebx ; save caller's register variable - mov fb, [esp + _vb$ - 4] ; get base address of vertex B - - push ebp ; save frame pointer - mov cull, [gc + cull_mode]; get cull mode - - mov fa, [esp + _va$] ; get base address of vertex A - mov tempVal, [__GlideRoot + curTriSize] - - femms ; will use AMD3D, clear FPU/MMX registers - - ;; Cullcheck - - movq mm2, [fc + x] ; yc | xc - shl cull, 31 ; culltest << 31 - - movq mm1, [fb + x] ; yb | xb - add tempVal, 4 ; space required in fifo - - movq mm0, [fa + x] ; ya | xa - mov ebx, [gc + fifoRoom] ; space available in fifo - - ;; Area_Computation - - pfsubr mm2, mm1 ; dyBC | dxBC - pfsub mm0, mm1 ; dyAB | dxAB - - movq mm5, mm2 ; dyBC | dxBC - punpckhdq mm2, mm2 ; dyBC | dyBC - - movq mm4, mm0 ; dyAB | dxAB - punpckhdq mm0, mm0 ; dyAB | dyAB - - pfmul mm5, mm0 ; dyAB*dxBC - pfmul mm4, mm2 ; dxAB*dyBC - - pfsub mm4, mm5 ; dxAB*dyBC - dxBC*dyAB - - movd intArea, mm4 ; vectored ! - - ; Zero Area Triangle Check - - test intArea, 7fffffffh ; if ((j & 0x7FFFFFFF) == 0) - jz __cullFail ; area zero, triangle culled - - xor intArea, cull ; if (j ^ (culltest << 31)) - jge __cullFail ; triangle facing away from viewer, culled - - cmp ebx, tempVal ; fifo space required >= space available ? - jge __triBegin ; yup, push out triangle data to Voodoo - - push @Line ; line number inside this function - push 0h ; pointer to function name = NULL - - push tempVal ; fifo space required - call __FifoMakeRoom ; note: updates fifoPtr - - add esp, 12 ; remove 3 DWORD arguments from stack - -ELSE ; !GLIDE_CULLING - - ;; Prologue stuff - push edi ; save caller's register variable - mov gc,[__GlideRoot+curGC]; GR_DCL_GC - - push esi ; save caller's register variable - mov eax, [__GlideRoot + curTriSize] - - push ebx ; save caller's register variable - mov ebx, [gc + fifoRoom] ; fifo space available - - push ebp ; save frame pointer - add eax, 4 ; fifo space required - - ;; Check to make sure that we have enough room for - ;; the complete triangle packet. - - cmp ebx, eax ; space available >= space required ? - jge __triBegin ; yup, start drawing triangle - - push @Line ; line number inside this function - push 0h ; pointer to function name = NULL - - push eax ; space required in fifo - call __FifoMakeRoom ; note: updates fifoPtr - - add esp, 12 ; remove 3 DWORD arguments from stack - mov eax, eax ; filler -ENDIF - - -dlp TEXTEQU ; points to dataList structure -dlpstrt TEXTEQU ; points to begin of dataList structure -vertex TEXTEQU ; the current vertex -packCol TEXTEQU - -__triBegin: - mov eax, [gc+triPacketHdr]; Packet 3 header - lea dlp,[gc + tsuDataList]; Reset the dataList - - mov fifo, [gc + fifoPtr] ; Fetch Fifo Ptr - mov vertex, [esp + _va$] ; Current vertex = A - - mov dlpstrt, dlp ; save pointer to start of dataList - test fifo, 4 ; is fifo pointer qword aligned ? - - jz __fifo_aligned ; yes, it is qword aligned - movq mm1, [vertex+x] ; y | x - - GR_FIFO_WRITE fifo, 0, eax ; write header to fifo; now qword aligned - add fifo, 4 ; advance fifo for hdr; now qword aligned - - WRITE_MM1_FIFO_ALIGNED ; PCI write y | x - add fifo, 8 ; fifoPtr += 2*sizeof(FxU32) - -IF GLIDE_PACK_RGB -IF GLIDE_PACK_ALPHA - ;; assumes color and alpha values < 256.0 - movq mm1, [vertex+r] ; g | r - movd mm2, [vertex+b] ; 0 | b - - movd mm3, [vertex+a] ; 0 | a - pf2id mm1, mm1 ; convert to integer: 000000gg | 000000rr - - pf2id mm2, mm2 ; convert to integer: 00000000 | 000000bb - pf2id mm3, mm3 ; convert to integer: 00000000 | 000000aa - - punpcklwd mm2, mm1 ; 00000000 | 00rr00bb - psrlq mm1, 24 ; 00000000 | 0000gg00 - - add dlp, 8 ; skip data list entry for "a" - psllq mm3, 24 ; 00000000 | aa000000 - - por mm1, mm2 ; 00000000 | 00rrggbb - por mm1, mm3 ; 00000000 | aarrggbb -ELSE ; !GLIDE_PACK_ALPHA - ;; assumes color values < 256.0 - - movq mm1, [vertex+r] ; g | r - add dlp, 4 ; next data list entry - - movd mm2, [vertex+b] ; 0 | b - pf2id mm1, mm1 ; convert to integer: 000000gg | 000000rr - - pf2id mm2, mm2 ; convert to integer: 00000000 | 000000bb - punpcklwd mm2, mm1 ; 00000000 | 00rr00bb - - psrlq mm1, 24 ; 00000000 | 0000gg00 - por mm1, mm2 ; 00000000 | 00rrggbb -ENDIF ; !GLIDE_PACK_ALPHA - - ;; here: one DWORD in "write buffer", RGB(A) - - mov eax, DWORD PTR [dlp] ; get first offset from the data list - add dlp, 4 ; dlp++ - -IF GLIDE_PACK_ALPHA - cmp eax, 0 ; end of list ? -ELSE - test eax, eax ; end of list ? -ENDIF - jz __paramLoopDoneWBone1 ; yes, one DWORD in "write buffer" - -__paramLoop1a: - movd mm2, [eax+vertex] ; get next parameter - mov eax, DWORD PTR [dlp] ; offset = *(dlp + 1) - - add dlp, 4 ; dlp++ - punpckldq mm1, mm2 ; current param | previous param - - WRITE_MM1_FIFO_ALIGNED ; PCI write current param | previous param - add fifo, 8 ; fifoPtr += 2*sizeof(FxU32) - - cmp eax, 0 ; at end of offset list (offset == 0) ? - jz __paramLoopDoneWBzero1; exit, "write buffer" empty - - movd mm1, [eax+vertex] ; get next parameter - mov eax, DWORD PTR [dlp] ; offset = *(dlp + 1) - - add dlp, 4 ; dlp++ - - cmp eax, 0 ; at end of offset list (offset == 0) ? - jnz __paramLoop1a ; nope, copy next parameter - - jmp __paramLoopDoneWBone1 ; merge back into common stream - lea esp, [esp] ; filler -ELSE ; ! GLIDE_PACK_RGB - - ;; here: "write buffer" empty - - mov eax, DWORD PTR [dlp] ; Get first offset from the data list - test eax, eax ; at end of list ? - - lea dlp, [dlp+4] ; dlp++ - jz __paramLoopDoneWBzero1; yes, "write buffer" empty - -__paramLoop1a: - movd mm1, [eax+vertex] ; get next parameter - mov eax, DWORD PTR [dlp] ; offset = *(dlp + 1) - - add dlp, 4 ; dlp++ - test eax, eax ; at end of offset list (offset == 0) ? - - jz __paramLoopDoneWBone1 ; exit, write buffer contains one DWORD - movd mm2, [eax+vertex] ; get next parameter - - mov eax, DWORD PTR [dlp] ; offset = *(dlp + 1) - add dlp, 4 ; dlp++ - - punpckldq mm1, mm2 ; current param | previous param - - WRITE_MM1_FIFO_ALIGNED ; PCI write current param | previous param - add fifo, 8 ; fifoPtr += 2*sizeof(FxU32) - - test eax, eax ; at end of offset list (offset == 0) ? - jnz __paramLoop1a ; nope, copy next parameter - - mov esp, esp ; filler - jmp __paramLoopDoneWBzero1; write buffer empty - -ENDIF ; GLIDE_PACK_RGB - -__fifo_aligned: - movd mm2, [vertex+x] ; y | x of vertex A - movd mm1, [gc+triPacketHdr]; Packet 3 header - - punpckldq mm1, mm2 ; x | header - WRITE_MM1_FIFO_ALIGNED ; PCI write x | header - - add fifo, 8 ; fifoPtr += 2*sizeof(FxU32) - movd mm1, [vertex+y] ; 0 | y of vertex A - -IF GLIDE_PACK_RGB -IF GLIDE_PACK_ALPHA - ;; assumes color and alpha values < 256.0 - movq mm4, [vertex+r] ; g | r - movd mm2, [vertex+b] ; 0 | b - - movd mm3, [vertex+a] ; 0 | a - pf2id mm4, mm4 ; convert to integer: 000000gg | 000000rr - - pf2id mm2, mm2 ; convert to integer: 00000000 | 000000bb - pf2id mm3, mm3 ; convert to integer: 00000000 | 000000aa - - punpcklwd mm2, mm4 ; 00000000 | 00rr00bb - psrlq mm4, 24 ; 00000000 | 0000gg00 - - psllq mm3, 24 ; 00000000 | aa000000 - por mm4, mm2 ; 00000000 | 00rrggbb - - add dlp, 8 ; skip data list entry "a" - por mm4, mm3 ; 00000000 | aarrggbb - -ELSE ; !GLIDE_PACK_ALPHA - ;; assumes color values < 256.0 - - movq mm4, [vertex+r] ; g | r - movd mm2, [vertex+b] ; 0 | b - - pf2id mm4, mm4 ; convert to integer: 000000gg | 000000rr - pf2id mm2, mm2 ; convert to integer: 00000000 | 000000bb - - punpcklwd mm2, mm4 ; 00000000 | 00rr00bb - add dlp, 4 ; next data list entry - - psrlq mm4, 24 ; 00000000 | 0000gg00 - por mm4, mm2 ; 00000000 | 00rrggbb -ENDIF ; !GLIDE_PACK_ALPHA - - punpckldq mm1, mm4 ; RGB(A) | y - mov eax, DWORD PTR [dlp] ; get first offset from the data list - - WRITE_MM1_FIFO_ALIGNED ; PCI write y | RGB(A) - add fifo, 8 ; fifoPtr += 2*sizeof(FxU32) - - add dlp, 4 ; dlp++ - test eax, eax ; end of list ? - - jz __paramLoopDoneWBzero1; yes, "write buffer" is empty - nop ; filler - -__paramLoop1b: - movd mm1, [eax+vertex] ; get next parameter - mov eax, DWORD PTR [dlp] ; offset = *(dlp + 1) - - add dlp, 4 ; dlp++ - test eax, eax ; at end of offset list (offset == 0) ? - - jz __paramLoopDoneWBone1 ; exit, write buffer contains one DWORD - movd mm2, [eax+vertex] ; get next parameter - - mov eax, DWORD PTR [dlp] ; offset = *(dlp + 1) - add dlp, 4 ; dlp++ - - punpckldq mm1, mm2 ; current param | previous param - WRITE_MM1_FIFO_ALIGNED ; PCI write current param | previous param - -IF GLIDE_PACK_ALPHA - add fifo, 8 ; fifoPtr += 2*sizeof(FxU32) -ELSE - add fifo, 8 ; fifoPtr += 2*sizeof(FxU32) - nop -ENDIF - - test eax, eax ; at end of offset list (offset == 0) ? - jnz __paramLoop1b ; nope, copy next parameter - - jmp __paramLoopDoneWBzero1; write buffer empty - -ELSE ; !GLIDE_PACK_RGB - mov eax, DWORD PTR [dlp] ; get first offset from the data list - add dlp, 4 ; dlp++ - - test eax, eax ; end of list ? - jz __paramLoopDoneWBone1 ; yes, "write buffer" has y data - -__paramLoop1b: - movd mm2, [eax+vertex] ; get next parameter - mov eax, DWORD PTR [dlp] ; offset = *(dlp + 1) - - punpckldq mm1, mm2 ; current param | previous param - add dlp, 4 ; dlp++ - - WRITE_MM1_FIFO_ALIGNED ; PCI write current param | previous param - add fifo, 8 ; fifoPtr += 2*sizeof(FxU32) - -IF GLIDE_CULLING - test eax, eax ; at end of offset list (offset == 0) ? -ELSE - cmp eax, 0 ; at end of offset list (offset == 0) ? -ENDIF - - jz __paramLoopDoneWBzero1; exit, "write buffer" empty - - movd mm1, [eax+vertex] ; get next parameter - mov eax, DWORD PTR [dlp] ; offset = *(dlp + 1) - - add dlp, 4 ; dlp++ - - test eax, eax ; at end of offset list (offset == 0) ? - jnz __paramLoop1b ; nope, copy next parameter -ENDIF - -__paramLoopDoneWBone1: - - ;; here: "write buffer" has one DWORD left over from vertex A - - mov vertex, [esp + _vb$] ; Current vertex = B - mov dlp, dlpstrt ; reset the dataList - - movd mm2, [vertex+x] ; 0 | x if vertex B - punpckldq mm1, mm2 ; x | old param - - WRITE_MM1_FIFO_ALIGNED ; PCI write: x | old param - add fifo, 8 ; fifoPtr += 2*sizeof(FxU32) - - movd mm1, [vertex+y] ; 0 | y of vertex B -IF GLIDE_PACK_RGB -ELSE - mov esp, esp ; filler -ENDIF - -IF GLIDE_PACK_RGB -IF GLIDE_PACK_ALPHA - ;; assumes color and alpha values < 256.0 - movq mm4, [vertex+r] ; g | r - movd mm2, [vertex+b] ; 0 | b - - movd mm3, [vertex+a] ; 0 | a - pf2id mm4, mm4 ; convert to integer: 000000gg | 000000rr - - pf2id mm2, mm2 ; convert to integer: 00000000 | 000000bb - pf2id mm3, mm3 ; convert to integer: 00000000 | 000000aa - - punpcklwd mm2, mm4 ; 00000000 | 00rr00bb - psrlq mm4, 24 ; 00000000 | 0000gg00 - - add dlp, 8 ; skip data list entry "a" - mov eax, eax ; filler - - psllq mm3, 24 ; 00000000 | aa000000 - - por mm4, mm2 ; 00000000 | 00rrggbb - por mm4, mm3 ; 00000000 | aarrggbb - -ELSE ; !GLIDE_PACK_ALPHA - ;; assumes color values < 256.0 - - movq mm4, [vertex+r] ; g | r - movd mm2, [vertex+b] ; 0 | b - - pf2id mm4, mm4 ; convert to integer: 000000gg | 000000rr - pf2id mm2, mm2 ; convert to integer: 00000000 | 000000bb - - punpcklwd mm2, mm4 ; 00000000 | 00rr00bb - psrlq mm4, 24 ; 00000000 | 0000gg00 - - add dlp, 4 ; next data list entry - por mm4, mm2 ; 00000000 | 00rrggbb -ENDIF ; !GLIDE_PACK_ALPHA - - punpckldq mm1, mm4 ; RGB(A) | y - mov eax, DWORD PTR [dlp] ; get first offset from the data list - - WRITE_MM1_FIFO_ALIGNED ; PCI write y | RGB(A) - add fifo, 8 ; fifoPtr += 2*sizeof(FxU32) - - add dlp, 4 ; dlp++ - test eax, eax ; end of list ? - - jz __paramLoopDoneWBzero2; yes, "write buffer" is empty - mov esp, esp ; filler - -__paramLoop2b: - movd mm1, [eax+vertex] ; get next parameter - mov eax, DWORD PTR [dlp] ; offset = *(dlp + 1) - - test eax, eax ; at end of offset list (offset == 0) ? - lea dlp, [dlp+4] ; dlp++ - - jz __paramLoopDoneWBone2 ; exit, write buffer contains one DWORD - movd mm2, [eax+vertex] ; get next parameter - - mov eax, DWORD PTR [dlp] ; offset = *(dlp + 1) - add dlp, 4 ; dlp++ - - punpckldq mm1, mm2 ; current param | previous param - WRITE_MM1_FIFO_ALIGNED ; PCI write current param | previous param - - add fifo, 8 ; fifoPtr += 2*sizeof(FxU32) - - test eax, eax ; at end of offset list (offset == 0) ? - jnz __paramLoop2b ; nope, copy next parameter - - jmp __paramLoopDoneWBzero2; write buffer empty -ELSE ; !GLIDE_PACK_RGB - mov eax, DWORD PTR [dlp] ; get first offset from the data list - add dlp, 4 ; dlp++ - - test eax, eax ; end of list ? - jz __paramLoopDoneWBone2 ; yes, "write buffer" has y data - -__paramLoop2b: - movd mm2, [eax+vertex] ; get next parameter - mov eax, DWORD PTR [dlp] ; offset = *(dlp + 1) - - add dlp, 4 ; dlp++ - punpckldq mm1, mm2 ; current param | previous param - - WRITE_MM1_FIFO_ALIGNED ; PCI write current param | previous param - add fifo, 8 ; fifoPtr += 2*sizeof(FxU32) - -IF GLIDE_CULLING - test eax, eax ; at end of offset list (offset == 0) ? -ELSE - cmp eax, 0 ; at end of offset list (offset == 0) ? -ENDIF - jz __paramLoopDoneWBzero2; exit, "write buffer" empty - - movd mm1, [eax+vertex] ; get next parameter - mov eax, DWORD PTR [dlp] ; offset = *(dlp + 1) - - add dlp, 4 ; dlp++ - - test eax, eax ; at end of offset list (offset == 0) ? - jnz __paramLoop2b ; nope, copy next parameter - - jmp __paramLoopDoneWBone2 ; write buffer contains one DWORD -ENDIF - - -__paramLoopDoneWBzero1: - - mov vertex, [esp + _vb$] ; Current vertex = B - mov dlp, dlpstrt ; Reset the dataList - - movq mm1, [vertex+x] ; y | x of vertex B - WRITE_MM1_FIFO_ALIGNED ; PCI write y | x of vertex B - - add fifo, 8 ; fifoPtr += 2*sizeof(FxU32) - -IF GLIDE_PACK_RGB -IF GLIDE_PACK_ALPHA - ;; assumes color and alpha values < 256.0 - movq mm1, [vertex+r] ; g | r - movd mm2, [vertex+b] ; 0 | b - - movd mm3, [vertex+a] ; 0 | a - pf2id mm1, mm1 ; convert to integer: 000000gg | 000000rr - - pf2id mm2, mm2 ; convert to integer: 00000000 | 000000bb - pf2id mm3, mm3 ; convert to integer: 00000000 | 000000aa - - punpcklwd mm2, mm1 ; 00000000 | 00rr00bb - psrlq mm1, 24 ; 00000000 | 0000gg00 - - psllq mm3, 24 ; 00000000 | aa000000 - por mm1, mm2 ; 00000000 | 00rrggbb - - por mm1, mm3 ; 00000000 | aarrggbb - add dlp, 8 ; skip data list entry "a" -ELSE ; !GLIDE_PACK_ALPHA - ;; assumes color values < 256.0 - - movq mm1, [vertex+r] ; g | r - movd mm2, [vertex+b] ; 0 | b - - pf2id mm1, mm1 ; convert to integer: 000000gg | 000000rr - pf2id mm2, mm2 ; convert to integer: 00000000 | 000000bb - - punpcklwd mm2, mm1 ; 00000000 | 00rr00bb - psrlq mm1, 24 ; 00000000 | 0000gg00 - - por mm1, mm2 ; 00000000 | 00rrggbb - add dlp, 4 ; next data list entry -ENDIF ; !GLIDE_PACK_ALPHA - - ;; here: one DWORD in "write buffer", RGB(A) - - mov eax, DWORD PTR [dlp] ; get first offset from the data list - add dlp, 4 ; dlp++ - - cmp eax, 0 ; end of list ? - jz __paramLoopDoneWBone2 ; yes, one DWORD in "write buffer" - -__paramLoop2a: - movd mm2, [eax+vertex] ; get next parameter - - mov eax, DWORD PTR [dlp] ; offset = *(dlp + 1) - punpckldq mm1, mm2 ; current param | previous param - - add dlp, 4 ; dlp++ - WRITE_MM1_FIFO_ALIGNED ; PCI write current param | previous param - - add fifo, 8 ; fifoPtr += 2*sizeof(FxU32) - test eax, eax ; at end of offset list (offset == 0) ? - - jz __paramLoopDoneWBzero2; exit, "write buffer" empty - movd mm1, [eax+vertex] ; get next parameter - - mov eax, DWORD PTR [dlp] ; offset = *(dlp + 1) - add dlp, 4 ; dlp++ - - test eax, eax ; at end of offset list (offset == 0) ? - jnz __paramLoop2a ; nope, copy next parameter - - jmp __paramLoopDoneWBone2 ; merge back into common stream -ELSE ; ! GLIDE_PACK_RGB - - ;; here: "write buffer" empty - - mov eax, DWORD PTR [dlp] ; Get first offset from the data list - add dlp, 4 ; dlp++ - - cmp eax, 0 ; at end of list ? - jz __paramLoopDoneWBzero2; yes, "write buffer" empty - -__paramLoop2a: - movd mm1, [eax+vertex] ; get next parameter - mov eax, DWORD PTR [dlp] ; offset = *(dlp + 1) - - add dlp, 4 ; dlp++ -IF GLIDE_CULLING - test eax, eax ; at end of offset list (offset == 0) ? -ELSE - cmp eax, 0 ; at end of offset list (offset == 0) ? -ENDIF - - jz __paramLoopDoneWBone2 ; exit, write buffer contains one DWORD - movd mm2, [eax+vertex] ; get next parameter - - mov eax, DWORD PTR [dlp] ; offset = *(dlp + 1) - add dlp, 4 ; dlp++ - - punpckldq mm1, mm2 ; current param | previous param - - WRITE_MM1_FIFO_ALIGNED ; PCI write current param | previous param - add fifo, 8 ; fifoPtr += 2*sizeof(FxU32) - -IF GLIDE_CULLING - cmp eax, 0 ; at end of offset list (offset == 0) ? -ELSE - test eax, eax ; at end of offset list (offset == 0) ? -ENDIF - jnz __paramLoop2a ; nope, copy next parameter -ENDIF ; GLIDE_PACK_RGB - - -__paramLoopDoneWBzero2: - - mov vertex, [esp + _vc$] ; Current vertex = C - mov dlp, dlpstrt ; Reset the dataList - - movq mm1, [vertex+x] ; y | x of vertex C - WRITE_MM1_FIFO_ALIGNED ; PCI write y | x of vertex C - - add fifo, 8 ; fifoPtr += 2*sizeof(FxU32) - -IF GLIDE_PACK_RGB -IF GLIDE_PACK_ALPHA - ;; assumes color and alpha values < 256.0 - movq mm1, [vertex+r] ; g | r - movd mm2, [vertex+b] ; 0 | b - - movd mm3, [vertex+a] ; 0 | a - pf2id mm1, mm1 ; convert to integer: 000000gg | 000000rr - - pf2id mm2, mm2 ; convert to integer: 00000000 | 000000bb - pf2id mm3, mm3 ; convert to integer: 00000000 | 000000aa - - punpcklwd mm2, mm1 ; 00000000 | 00rr00bb - psrlq mm1, 24 ; 00000000 | 0000gg00 - - psllq mm3, 24 ; 00000000 | aa000000 - por mm1, mm2 ; 00000000 | 00rrggbb - - por mm1, mm3 ; 00000000 | aarrggbb - add dlp, 8 ; skip data list entry "a" -ELSE ; !GLIDE_PACK_ALPHA - ;; assumes color values < 256.0 - - movq mm1, [vertex+r] ; g | r - movd mm2, [vertex+b] ; 0 | b - - pf2id mm1, mm1 ; convert to integer: 000000gg | 000000rr - pf2id mm2, mm2 ; convert to integer: 00000000 | 000000bb - - punpcklwd mm2, mm1 ; 00000000 | 00rr00bb - psrlq mm1, 24 ; 00000000 | 0000gg00 - - por mm1, mm2 ; 00000000 | 00rrggbb - add dlp, 4 ; next data list entry -ENDIF ; !GLIDE_PACK_ALPHA - - ;; here: one DWORD in "write buffer", RGB(A) - - mov eax, DWORD PTR [dlp] ; get first offset from the data list - add dlp, 4 ; dlp++ - -IF GLIDE_PACK_ALPHA - cmp eax, 0 ; end of list ? -ELSE - test eax, eax ; end of list ? -ENDIF - jz __paramLoopDoneWBone3 ; yes, one DWORD in "write buffer" - -__paramLoop3a: - movd mm2, [eax+vertex] ; get next parameter - mov eax, DWORD PTR [dlp] ; offset = *(dlp + 1) - - punpckldq mm1, mm2 ; current param | previous param - add dlp, 4 ; dlp++ - - WRITE_MM1_FIFO_ALIGNED ; PCI write current param | previous param - add fifo, 8 ; fifoPtr += 2*sizeof(FxU32) - - test eax, eax ; at end of offset list (offset == 0) ? - jz __paramLoopDoneWBzero3; exit, "write buffer" empty - - movd mm1, [eax+vertex] ; get next parameter - mov eax, DWORD PTR [dlp] ; offset = *(dlp + 1) - - add dlp, 4 ; dlp++ - - test eax, eax ; at end of offset list (offset == 0) ? - jnz __paramLoop3a ; nope, copy next parameter - - jmp __paramLoopDoneWBone3 ; merge back into common stream - -ELSE ; ! GLIDE_PACK_RGB - - ;; here: "write buffer" empty - - mov eax, DWORD PTR [dlp] ; Get first offset from the data list - add dlp, 4 ; dlp++ - -IF GLIDE_CULLING - test eax, eax ; at end of list ? -ELSE - cmp eax, 0 ; at end of list ? -ENDIF - jz __paramLoopDoneWBzero3; yes, "write buffer" empty - -IF GLIDE_CULLING -ELSE - mov esp, esp ; filler -ENDIF - -__paramLoop3a: - movd mm1, [eax+vertex] ; get next parameter - mov eax, DWORD PTR [dlp] ; offset = *(dlp + 1) - - add dlp, 4 ; dlp++ -IF GLIDE_CULLING - cmp eax, 0 ; at end of offset list (offset == 0) ? -ELSE - test eax, eax ; at end of offset list (offset == 0) ? -ENDIF - - jz __paramLoopDoneWBone3 ; exit, write buffer contains one DWORD - movd mm2, [eax+vertex] ; get next parameter - - mov eax, DWORD PTR [dlp] ; offset = *(dlp + 1) - add dlp, 4 ; dlp++ - - punpckldq mm1, mm2 ; current param | previous param - - WRITE_MM1_FIFO_ALIGNED ; PCI write current param | previous param - add fifo, 8 ; fifoPtr += 2*sizeof(FxU32) - - test eax, eax ; at end of offset list (offset == 0) ? - jnz __paramLoop3a ; nope, copy next parameter - - jmp __paramLoopDoneWBzero3; write buffer empty -ENDIF ; GLIDE_PACK_RGB - - -__paramLoopDoneWBone2: - - ;; here: "write buffer" has one DWORD left over from vertex B - - mov vertex, [esp + _vc$] ; Current vertex = C - mov dlp, dlpstrt ; reset the dataList - - movd mm2, [vertex+x] ; 0 | x if vertex C - punpckldq mm1, mm2 ; x | old param - - WRITE_MM1_FIFO_ALIGNED ; PCI write: x | old param - add fifo, 8 ; fifoPtr += 2*sizeof(FxU32) - - movd mm1, [vertex+y] ; 0 | y of vertex C - -IF GLIDE_PACK_RGB -IF GLIDE_PACK_ALPHA - ;; assumes color and alpha values < 256.0 - movq mm4, [vertex+r] ; g | r - movd mm2, [vertex+b] ; 0 | b - - movd mm3, [vertex+a] ; 0 | a - pf2id mm4, mm4 ; convert to integer: 000000gg | 000000rr - - pf2id mm2, mm2 ; convert to integer: 00000000 | 000000bb - pf2id mm3, mm3 ; convert to integer: 00000000 | 000000aa - - punpcklwd mm2, mm4 ; 00000000 | 00rr00bb - psrlq mm4, 24 ; 00000000 | 0000gg00 - - add dlp, 8 ; skip data list entry "a" - psllq mm3, 24 ; 00000000 | aa000000 - - por mm4, mm2 ; 00000000 | 00rrggbb - por mm4, mm3 ; 00000000 | aarrggbb -ELSE ; !GLIDE_PACK_ALPHA - ;; assumes color values < 256.0 - - movq mm4, [vertex+r] ; g | r - movd mm2, [vertex+b] ; 0 | b - - pf2id mm4, mm4 ; convert to integer: 000000gg | 000000rr - pf2id mm2, mm2 ; convert to integer: 00000000 | 000000bb - - punpcklwd mm2, mm4 ; 00000000 | 00rr00bb - psrlq mm4, 24 ; 00000000 | 0000gg00 - - add dlp, 4 ; next data list entry - por mm4, mm2 ; 00000000 | 00rrggbb -ENDIF ; !GLIDE_PACK_ALPHA - - punpckldq mm1, mm4 ; RGB(A) | y - mov eax, DWORD PTR [dlp] ; get first offset from the data list - - WRITE_MM1_FIFO_ALIGNED ; PCI write y | RGB(A) - add fifo, 8 ; fifoPtr += 2*sizeof(FxU32) - - add dlp, 4 ; dlp++ - test eax, eax ; end of list ? - - jz __paramLoopDoneWBzero3; yes, "write buffer" is empty - -__paramLoop3b: - movd mm1, [eax+vertex] ; get next parameter - mov eax, DWORD PTR [dlp] ; offset = *(dlp + 1) - - add dlp, 4 ; dlp++ - test eax, eax ; at end of offset list (offset == 0) ? - - jz __paramLoopDoneWBone3 ; exit, write buffer contains one DWORD - movd mm2, [eax+vertex] ; get next parameter - - mov eax, DWORD PTR [dlp] ; offset = *(dlp + 1) - add dlp, 4 ; dlp++ - - punpckldq mm1, mm2 ; current param | previous param - WRITE_MM1_FIFO_ALIGNED ; PCI write current param | previous param - - add fifo, 8 ; fifoPtr += 2*sizeof(FxU32) - - test eax, eax ; at end of offset list (offset == 0) ? - jnz __paramLoop3b ; nope, copy next parameter - -IF GLIDE_PACK_ALPHA - nop ; filler - jmp __paramLoopDoneWBzero3; write buffer empty -ELSE - jmp __paramLoopDoneWBzero3; write buffer empty - nop ; filler -ENDIF -ELSE ; !GLIDE_PACK_RGB - mov eax, DWORD PTR [dlp] ; get first offset from the data list - add dlp, 4 ; dlp++ - - test eax, eax ; end of list ? - jz __paramLoopDoneWBone3 ; yes, "write buffer" has y data - -__paramLoop3b: - movd mm2, [eax+vertex] ; get next parameter - mov eax, DWORD PTR [dlp] ; offset = *(dlp + 1) - - punpckldq mm1, mm2 ; current param | previous param - add dlp, 4 ; dlp++ - - WRITE_MM1_FIFO_ALIGNED ; PCI write current param | previous param - add fifo, 8 ; fifoPtr += 2*sizeof(FxU32) - - test eax, eax ; at end of offset list (offset == 0) ? - jz __paramLoopDoneWBzero3; exit, "write buffer" empty - - movd mm1, [eax+vertex] ; get next parameter - mov eax, DWORD PTR [dlp] ; offset = *(dlp + 1) - - add dlp, 4 ; dlp++ - - test eax, eax ; at end of offset list (offset == 0) ? - jnz __paramLoop3b ; nope, copy next parameter -ENDIF - -__paramLoopDoneWBone3: - -; "write buffer" contains one DWORD that needs to be flushed - - WRITE_MM1LOW_FIFO ; - add fifo, 4 ; - -__paramLoopDoneWBzero3: - - ;; Update gc->fifoPtr and gc->fifoRoom - - mov ecx, [__GlideRoot + trisDrawn] ; _GlideRoot.stats.trisDrawn - mov eax, fifo ; new fifo pointer - - mov ebx, [gc + fifoPtr] ; old fifo pointer - mov [gc + fifoPtr], fifo ; save new fifo pointer - - mov edx, [gc + fifoRoom] ; old fifo space available -IF GLIDE_PACK_RGB - add ecx, 1 ; _GlideRoot.stats.trisDrawn++ -ELSE - inc ecx ; _GlideRoot.stats.trisDrawn++ -ENDIF - - mov esi, [__GlideRoot + trisProcessed]; _GlideRoot.stats.trisProcessed - sub eax, ebx ; new fifo ptr - old fifo ptr = additional fifo space used - - mov [__GlideRoot + trisDrawn], ecx ; - sub edx, eax ; new fifo space available - - mov eax, 1h ; return value = triangle drawn - mov [gc + fifoRoom], edx ; new fifo space available - - ;; Restore trashed registers - - inc esi ; _GlideRoot.stats.trisProcessed++ - pop ebp ; restore frame pointer - -IF GLIDE_CULLING - pop ebx ; restore caller's register variable - mov [__GlideRoot + trisProcessed], esi ; -ELSE - mov [__GlideRoot + trisProcessed], esi ; - pop ebx ; restore caller's register variable -ENDIF - pop esi ; restore caller's register variable - pop edi ; restore caller's register variable - - femms ; no more AMD3D code, clear FPU/MMX regs - - ret 12 ; return to caller - - -IF GLIDE_CULLING -__cullFail: - mov esi, [__GlideRoot + trisProcessed]; triangles processed so far - xor eax, eax ; return value = triangle not drawn - - femms ; no more AMD3D code, clear FPU/MMX regs - - ;; Restore trashed registers - inc esi ; _GlideRoot.stats.trisProcessed++; - pop ebp ; restore frame pointer - - mov [__GlideRoot + trisProcessed], esi - pop ebx - - pop esi - pop edi - - ret 12 -ENDIF ; GLIDE_CULLING - -;--------------------------------------------------------------------------- -; -; end AMD3D section -; -;--------------------------------------------------------------------------- -endif ; GL_AMD3D - -;--------------------------------------------------------------------------- -; -; start original code -; -;--------------------------------------------------------------------------- - -ifndef GL_AMD3D - -; some useful floating load and store macros -flds TEXTEQU -fsubs TEXTEQU -fmuls TEXTEQU - -X = 0 -Y = 4 - ; edx is used as index, loading from *src -gc TEXTEQU ; points to graphics context - - ;; Prologue stuff - push esi - push edi - - push ebx - push ebp - - mov gc, [__GlideRoot + curGC] ;; GR_DCL_GC - - align 4 -IF GLIDE_CULLING -fa TEXTEQU ; vtx a from caller -fb TEXTEQU ; vtx b from caller -fc TEXTEQU ; vtx c from caller - -cull TEXTEQU -intArea TEXTEQU ; temp Y storage - - ;; Pre-load the current culling mode before all of the - ;; floating point area stuff. - mov cull, [gc + cull_mode] - mov fa, [esp + _va$] - - mov fb, [esp + _vb$] - mov fc, [esp + _vc$] - - shl cull, 31 ; culltest << 31 - -Area_Computation: -; 47-3 -; jmp ret_pop0f - flds [fa + X] ; xa - fsubs [fb + X] ; dxAB - flds [fb + X] ; | xb - fsubs [fc + X] ; | dxBC - flds [fb + Y] ; | | yb - fsubs [fc + Y] ; | | dyBC - flds [fa + Y] ; | | | ya - fsubs [fb + Y] ; | | | dyAB - fld st(3) ; | | | | dxAB - fmul st, st(2) ; | | | | t0 t0=dxAB*dyBC - fld st(3) ; | | | | | dxBC - fmul st, st(2) ; | | | | | t1 t1=dxBC*dyAB - fsubp st(1),st ; | | | | area - fst zArea ; | | | | area - - ;; Pop temp things from the sw culling off the fp stack - fstp st(0) ; 4 - fstp st(0) ; 3 - fstp st(0) ; 2 - fstp st(0) ; 1 - fstp st(0) ; 0 - - mov intArea, zArea ; j = *(long *)&area - xor eax, eax ; Clear the return value (0 == culled) - - ; Zero Area Triangle Check - and intArea, 7fffffffh ; if ((j & 0x7FFFFFFF) == 0) - jz __triDone - - ;; Triangle area check vs culling mode - mov intArea, zArea ; reload area just in case we're culling - xor intArea, cull ; if (j ^ (culltest << 31)) - - jge __triDone -ENDIF ; GLIDE_CULLING - - align 4 - ;; Check to make sure that we have enough room for - ;; the complete triangle packet. - mov eax, [__GlideRoot + curTriSize] - mov ebx, [gc + fifoRoom] - - add eax, 4 - cmp ebx, eax - - jge __triBegin - - push @Line - push 0h - - push eax - call __FifoMakeRoom - - add esp, 12 - - ;; Send triangle parameters - -dlp TEXTEQU ; points to dataList structure -fifo TEXTEQU ; points to next entry in fifo -vertex TEXTEQU ; the current vertex -vOffset TEXTEQU ; Current vertex offset - -packCol TEXTEQU -tempVal TEXTEQU - -GR_FIFO_WRITE MACRO __addr, __offset, __data - mov [__addr + __offset], __data -ENDM ; GR_FIFO_WRITE - - align 4 -__triBegin: - mov fifo, [gc + fifoPtr] ; Fetch Fifo Ptr - mov vOffset, 4 ; Starting vertex - - mov eax, [gc + triPacketHdr] ; Packet 3 header - nop - - GR_FIFO_WRITE fifo, 0, eax ; Write packet header to fifo - add fifo, 4 ; Advance fifo for hdr & x/y coordinate - - align 4 -__vertexStart: - mov vertex, [esp + STKOFF + vOffset] ; Current vertex - add fifo, 8 - - nop ; Avoid p5 agi w/ load of vertex ptr - nop - - mov eax, DWORD PTR [vertex + x] ; X - lea dlp, [gc + tsuDataList] ; Reset the dataList - - GR_FIFO_WRITE fifo, -8, eax ; PCI write X - mov eax, DWORD PTR [vertex + y] ; Y - - xor packCol, packCol ; Clear packed color - GR_FIFO_WRITE fifo, -4, eax ; PCI write Y - -IF GLIDE_PACK_RGB - fld DWORD PTR [vertex + b] ; B - fadd DWORD PTR __GlideRoot + fBiasLo ; BC GC - - fld DWORD PTR [vertex + g] ; G B - fadd DWORD PTR __GlideRoot + fBiasHi ; GC B - - fld DWORD PTR [vertex + r] ; R GC BC - fadd DWORD PTR __GlideRoot + fBiasHi ; RC GC BC - - fxch st(2) ; BC GC RC - fstp DWORD PTR bias0 ; GC RC - - fstp DWORD PTR bias1 ; RC - mov packCol, DWORD PTR bias0 ; B + bias - - fstp DWORD PTR bias0 - mov eax, DWORD PTR bias1 ; G + bias - -IF GLIDE_PACK_ALPHA - fld DWORD PTR [vertex + a] - fadd DWORD PTR __GlideRoot + fBiasHi - - and packCol, 00FFh ; B color component - and eax, 0000FF00h ; G component << 8 - - add dlp, 8 ; Packed RGB + A dataList entry - nop - - or packCol, eax ; 0000GGBB - nop - - fstp DWORD PTR bias1 - mov eax, DWORD PTR bias0 ; R + bias - - mov esi, DWORD PTR bias1 ; A + bias - and eax, 0000FF00h ; R component << 8 - - and esi, 0FFFFFF00h ; A component << 8 - shl eax, 8 ; R << 16 - - or packCol, eax ; 00RRGGBB - shl esi, 16 ; A << 16 - - or packCol, esi ; AARRGGBB - nop -ELSE ; !GLIDE_PACK_ALPHA - and packCol, 00FFh ; B color component - and eax, 0000FF00h ; G component << 8 - - add dlp, 4 ; Next dataList item - or packCol, eax - - mov eax, DWORD PTR bias0 ; R + bias - and eax, 0000FF00h ; R component << 8 - - shl eax, 8 ; R << 16 - or packCol, eax ; 00RRGGBB -ENDIF ; !GLIDE_PACK_ALPHA - - GR_FIFO_WRITE fifo, 0, packCol ; PCI write packed color value - add fifo, 4 -ENDIF ; GLIDE_PACK_RGB - -__doParams: - mov eax, DWORD PTR [dlp] ; Get first offset from the data list - add dlp, 4 ; dlp++ - - cmp eax, 0 ; Are we done? - je __nextVertex - - ;; Not using align directive here because it sometimes - ;; introduces an agi for the eax use below. - nop - nop - -__paramLoop: - mov tempVal, DWORD PTR [eax + vertex] ; Get the parameter from teh vertex - add fifo, 4 ; fifoPtr += sizeof(FxU32) - - mov eax, DWORD PTR [dlp] ; offset = *(dlp + 1) - add dlp, 4 ; dlp++ - - cmp eax, 0 ; Are we done? - GR_FIFO_WRITE fifo, -4, tempVal ; *fifoPtr = data - - jne SHORT __paramLoop - - align 4 -__nextVertex: - ;; On to the next vertex - add vOffset, 4 - mov gc, [__GlideRoot + curGC] ; Reload gc incase we trashed it as a temp - - cmp vOffset, 16 ; Offset of one past last vertex? - jne __vertexStart - - ;; Update gc->fifoPtr and gc->fifoRoom - mov eax, fifo - mov ebx, [gc + fifoPtr] - - mov [gc + fifoPtr], fifo - sub eax, ebx - - mov ebx, [__GlideRoot + trisDrawn] ; _GlideRoot.stats.trisDrawn++; - sub [gc + fifoRoom], eax - - add ebx, 1 - mov [__GlideRoot + trisDrawn], ebx - - ;; return 1 (triangle drawn) - mov eax, 1h - -__triDone: - ;; Restore trashed registers - mov esi, [__GlideRoot + trisProcessed] - pop ebp - - add esi, 1 ; _GlideRoot.stats.trisProcessed++; - pop ebx - - pop edi - mov [__GlideRoot + trisProcessed], esi - - pop esi - ret 12 - -endif ; !GL_AMD3D - diff --git a/glide2x/h3/glide/src/xdraw2.inc.S b/glide2x/h3/glide/src/xdraw2.inc.S deleted file mode 100644 index 4dede20..0000000 --- a/glide2x/h3/glide/src/xdraw2.inc.S +++ /dev/null @@ -1,1268 +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$ */ -/* */ -/* 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" - -#ifdef GL_AMD3D - -.MACRO GR_FIFO_WRITE __addr __offset __data - mov \__data , \__offset(\__addr) -.ENDM /* GR_FIFO_WRITE */ - - -.MACRO WRITE_MM1_FIFO_ALIGNED - movq %mm1 , (%ebp) /* store current param | previous param */ -.ENDM /* WRITE_MM1_FIFO_ALIGNED */ - -.MACRO WRITE_MM1LOW_FIFO - movd %mm1 , (%ebp) /* store current param | previous param */ -.ENDM /* WRITE_MM1LOW_FIFO */ - -#define gc %edi /* points to graphics context */ -#define fifo %ebp /* points to fifo entries */ -#define tempVal %esi - -#if GLIDE_CULLING -#define fa %eax /* vtx a from caller */ -#define fb %ebx /* vtx b from caller */ -#define fc %ecx /* vtx c from caller */ -#define cull %edx /* cull mode */ -#define intArea %ecx /* area temp storage */ - -/* Prologue stuff */ - -/* This code is only executed when culling is enabled, so we */ -/* don't need to check for GR_CULL_DISABLE */ - - push %edi /* save caller's register variable */ - mov (_GlideRoot+curGC) , gc /* GR_DCL_GC */ - - push %esi /* save caller's register variable */ - mov _vc-8(%esp) , fc /* get base address of vertex C */ - - push %ebx /* save caller's register variable */ - mov _vb-4(%esp) , fb /* get base address of vertex B */ - - push %ebp /* save frame pointer */ - mov cull_mode(gc) , cull /* get cull mode */ - - mov _va(%esp) , fa /* get base address of vertex A */ - mov (_GlideRoot+curTriSize) , tempVal - - femms /* will use AMD3D, clear FPU/MMX registers */ - -/* Cullcheck */ - - movq x(fc) , %mm2 /* yc | xc */ - shl $31 , cull /* culltest << 31 */ - - movq x(fb) , %mm1 /* yb | xb */ - add $4 , tempVal /* space required in fifo */ - - movq x(fa) , %mm0 /* ya | xa */ - mov fifoRoom(gc) , %ebx /* space available in fifo */ - -/* Area_Computation */ - - pfsubr %mm1 , %mm2 /* dyBC | dxBC */ - pfsub %mm1 , %mm0 /* dyAB | dxAB */ - - movq %mm2 , %mm5 /* dyBC | dxBC */ - punpckhdq %mm2 , %mm2 /* dyBC | dyBC */ - - movq %mm0 , %mm4 /* dyAB | dxAB */ - punpckhdq %mm0 , %mm0 /* dyAB | dyAB */ - - pfmul %mm0 , %mm5 /* dyAB*dxBC */ - pfmul %mm2 , %mm4 /* dxAB*dyBC */ - - pfsub %mm5 , %mm4 /* dxAB*dyBC - dxBC*dyAB */ - - movd %mm4 , intArea /* vectored ! */ - -/* Zero Area Triangle Check */ - - test $0x7fffffff , intArea /* if ((j & 0x7FFFFFFF) == 0) */ - jz LOCAL(__cullFail) /* area zero, triangle culled */ - - xor cull , intArea /* if (j ^ (culltest << 31)) */ - jge LOCAL(__cullFail) /* triangle facing away from viewer, culled */ - - cmp tempVal , %ebx /* fifo space required >= space available ? */ - jge LOCAL(__triBegin) /* yup, push out triangle data to Voodoo */ - - push $__LINE__ /* line number inside this function */ - push $0x0 /* pointer to function name = NULL */ - - push tempVal /* fifo space required */ - call _FifoMakeRoom /* note: updates fifoPtr */ - - add $12 , %esp /* remove 3 DWORD arguments from stack */ - -#else /* !GLIDE_CULLING */ - -/* Prologue stuff */ - push %edi /* save caller's register variable */ - mov (_GlideRoot+curGC) , gc /* GR_DCL_GC */ - - push %esi /* save caller's register variable */ - mov (_GlideRoot+curTriSize) , %eax - - push %ebx /* save caller's register variable */ - mov fifoRoom(gc) , %ebx /* fifo space available */ - - push %ebp /* save frame pointer */ - add $4 , %eax /* fifo space required */ - -/* Check to make sure that we have enough room for */ -/* the complete triangle packet. */ - - cmp %eax , %ebx /* space available >= space required ? */ - jge LOCAL(__triBegin) /* yup, start drawing triangle */ - - push $__LINE__ /* line number inside this function */ - push $0x0 /* pointer to function name = NULL */ - - push %eax /* space required in fifo */ - call _FifoMakeRoom /* note: updates fifoPtr */ - - add $12 , %esp /* remove 3 DWORD arguments from stack */ - mov %eax , %eax /* filler */ -#endif - - -#define dlp %ebx /* points to dataList structure */ -#define dlpstrt %ecx /* points to begin of dataList structure */ -#define vertex %edx /* the current vertex */ -#define packCol %esi - -LOCAL(__triBegin): - mov triPacketHdr(gc) , %eax /* Packet 3 header */ - lea tsuDataList(gc) , dlp /* Reset the dataList */ - - mov fifoPtr(gc) , fifo /* Fetch Fifo Ptr */ - mov _va(%esp) , vertex /* Current vertex = A */ - - mov dlp , dlpstrt /* save pointer to start of dataList */ - test $4 , fifo /* is fifo pointer qword aligned ? */ - - jz LOCAL(__fifo_aligned) /* yes, it is qword aligned */ - movq x(vertex) , %mm1 /* y | x */ - - GR_FIFO_WRITE fifo , 0 , %eax /* write header to fifo now qword aligned */ - add $4 , fifo /* advance fifo for hdr now qword aligned */ - - WRITE_MM1_FIFO_ALIGNED /* PCI write y | x */ - add $8 , fifo /* fifoPtr += 2*sizeof(FxU32) */ - -#if GLIDE_PACK_RGB -#if GLIDE_PACK_ALPHA -/* assumes color and alpha values < 256.0 */ - movq r(vertex) , %mm1 /* g | r */ - movd b(vertex) , %mm2 /* 0 | b */ - - movd a(vertex) , %mm3 /* 0 | a */ - pf2id %mm1 , %mm1 /* convert to integer: 000000gg | 000000rr */ - - pf2id %mm2 , %mm2 /* convert to integer: 00000000 | 000000bb */ - pf2id %mm3 , %mm3 /* convert to integer: 00000000 | 000000aa */ - - punpcklwd %mm1 , %mm2 /* 00000000 | 00rr00bb */ - psrlq $24 , %mm1 /* 00000000 | 0000gg00 */ - - add $8 , dlp /* skip data list entry for "a" */ - psllq $24 , %mm3 /* 00000000 | aa000000 */ - - por %mm2 , %mm1 /* 00000000 | 00rrggbb */ - por %mm3 , %mm1 /* 00000000 | aarrggbb */ -#else /* !GLIDE_PACK_ALPHA */ -/* assumes color values < 256.0 */ - - movq r(vertex) , %mm1 /* g | r */ - add $4 , dlp /* next data list entry */ - - movd b(vertex) , %mm2 /* 0 | b */ - pf2id %mm1 , %mm1 /* convert to integer: 000000gg | 000000rr */ - - pf2id %mm2 , %mm2 /* convert to integer: 00000000 | 000000bb */ - punpcklwd %mm1 , %mm2 /* 00000000 | 00rr00bb */ - - psrlq $24 , %mm1 /* 00000000 | 0000gg00 */ - por %mm2 , %mm1 /* 00000000 | 00rrggbb */ -#endif /* !GLIDE_PACK_ALPHA */ - -/* here: one DWORD in "write buffer", RGB(A) */ - - movl (dlp) , %eax /* get first offset from the data list */ - add $4 , dlp /* dlp++ */ - -#if GLIDE_PACK_ALPHA - cmp $0 , %eax /* end of list ? */ -#else - test %eax , %eax /* end of list ? */ -#endif - jz LOCAL(__paramLoopDoneWBone1) /* yes, one DWORD in "write buffer" */ - -LOCAL(__paramLoop1a): - movd (%eax,vertex) , %mm2 /* get next parameter */ - movl (dlp) , %eax /* offset = *(dlp + 1) */ - - add $4 , dlp /* dlp++ */ - punpckldq %mm2 , %mm1 /* current param | previous param */ - - WRITE_MM1_FIFO_ALIGNED /* PCI write current param | previous param */ - add $8 , fifo /* fifoPtr += 2*sizeof(FxU32) */ - - cmp $0 , %eax /* at end of offset list (offset == 0) ? */ - jz LOCAL(__paramLoopDoneWBzero1) /* exit, "write buffer" empty */ - - movd (%eax,vertex) , %mm1 /* get next parameter */ - movl (dlp) , %eax /* offset = *(dlp + 1) */ - - add $4 , dlp /* dlp++ */ - - cmp $0 , %eax /* at end of offset list (offset == 0) ? */ - jnz LOCAL(__paramLoop1a) /* nope, copy next parameter */ - - jmp LOCAL(__paramLoopDoneWBone1) /* merge back into common stream */ - lea (%esp) , %esp /* filler */ -#else /* ! GLIDE_PACK_RGB */ - -/* here: "write buffer" empty */ - - movl (dlp) , %eax /* Get first offset from the data list */ - test %eax , %eax /* at end of list ? */ - - lea 4(dlp) , dlp /* dlp++ */ - jz LOCAL(__paramLoopDoneWBzero1) /* yes, "write buffer" empty */ - -LOCAL(__paramLoop1a): - movd (%eax,vertex) , %mm1 /* get next parameter */ - movl (dlp) , %eax /* offset = *(dlp + 1) */ - - add $4 , dlp /* dlp++ */ - test %eax , %eax /* at end of offset list (offset == 0) ? */ - - jz LOCAL(__paramLoopDoneWBone1) /* exit, write buffer contains one DWORD */ - movd (%eax,vertex) , %mm2 /* get next parameter */ - - movl (dlp) , %eax /* offset = *(dlp + 1) */ - add $4 , dlp /* dlp++ */ - - punpckldq %mm2 , %mm1 /* current param | previous param */ - - WRITE_MM1_FIFO_ALIGNED /* PCI write current param | previous param */ - add $8 , fifo /* fifoPtr += 2*sizeof(FxU32) */ - - test %eax , %eax /* at end of offset list (offset == 0) ? */ - jnz LOCAL(__paramLoop1a) /* nope, copy next parameter */ - - mov %esp , %esp /* filler */ - jmp LOCAL(__paramLoopDoneWBzero1) /* write buffer empty */ - -#endif /* GLIDE_PACK_RGB */ - -LOCAL(__fifo_aligned): - movd x(vertex) , %mm2 /* y | x of vertex A */ - movd triPacketHdr(gc) , %mm1 /* Packet 3 header */ - - punpckldq %mm2 , %mm1 /* x | header */ - WRITE_MM1_FIFO_ALIGNED /* PCI write x | header */ - - add $8 , fifo /* fifoPtr += 2*sizeof(FxU32) */ - movd y(vertex) , %mm1 /* 0 | y of vertex A */ - -#if GLIDE_PACK_RGB -#if GLIDE_PACK_ALPHA -/* assumes color and alpha values < 256.0 */ - movq r(vertex) , %mm4 /* g | r */ - movd b(vertex) , %mm2 /* 0 | b */ - - movd a(vertex) , %mm3 /* 0 | a */ - pf2id %mm4 , %mm4 /* convert to integer: 000000gg | 000000rr */ - - pf2id %mm2 , %mm2 /* convert to integer: 00000000 | 000000bb */ - pf2id %mm3 , %mm3 /* convert to integer: 00000000 | 000000aa */ - - punpcklwd %mm4 , %mm2 /* 00000000 | 00rr00bb */ - psrlq $24 , %mm4 /* 00000000 | 0000gg00 */ - - psllq $24 , %mm3 /* 00000000 | aa000000 */ - por %mm2 , %mm4 /* 00000000 | 00rrggbb */ - - add $8 , dlp /* skip data list entry "a" */ - por %mm3 , %mm4 /* 00000000 | aarrggbb */ - -#else /* !GLIDE_PACK_ALPHA */ -/* assumes color values < 256.0 */ - - movq r(vertex) , %mm4 /* g | r */ - movd b(vertex) , %mm2 /* 0 | b */ - - pf2id %mm4 , %mm4 /* convert to integer: 000000gg | 000000rr */ - pf2id %mm2 , %mm2 /* convert to integer: 00000000 | 000000bb */ - - punpcklwd %mm4 , %mm2 /* 00000000 | 00rr00bb */ - add $4 , dlp /* next data list entry */ - - psrlq $24 , %mm4 /* 00000000 | 0000gg00 */ - por %mm2 , %mm4 /* 00000000 | 00rrggbb */ -#endif /* !GLIDE_PACK_ALPHA */ - - punpckldq %mm4 , %mm1 /* RGB(A) | y */ - movl (dlp) , %eax /* get first offset from the data list */ - - WRITE_MM1_FIFO_ALIGNED /* PCI write y | RGB(A) */ - add $8 , fifo /* fifoPtr += 2*sizeof(FxU32) */ - - add $4 , dlp /* dlp++ */ - test %eax , %eax /* end of list ? */ - - jz LOCAL(__paramLoopDoneWBzero1) /* yes, "write buffer" is empty */ - nop /* filler */ - -LOCAL(__paramLoop1b): - movd (%eax,vertex) , %mm1 /* get next parameter */ - movl (dlp) , %eax /* offset = *(dlp + 1) */ - - add $4 , dlp /* dlp++ */ - test %eax , %eax /* at end of offset list (offset == 0) ? */ - - jz LOCAL(__paramLoopDoneWBone1) /* exit, write buffer contains one DWORD */ - movd (%eax,vertex) , %mm2 /* get next parameter */ - - movl (dlp) , %eax /* offset = *(dlp + 1) */ - add $4 , dlp /* dlp++ */ - - punpckldq %mm2 , %mm1 /* current param | previous param */ - WRITE_MM1_FIFO_ALIGNED /* PCI write current param | previous param */ - -#if GLIDE_PACK_ALPHA - add $8 , fifo /* fifoPtr += 2*sizeof(FxU32) */ -#else - add $8 , fifo /* fifoPtr += 2*sizeof(FxU32) */ - nop -#endif - - test %eax , %eax /* at end of offset list (offset == 0) ? */ - jnz LOCAL(__paramLoop1b) /* nope, copy next parameter */ - - jmp LOCAL(__paramLoopDoneWBzero1) /* write buffer empty */ - -#else /* !GLIDE_PACK_RGB */ - movl (dlp) , %eax /* get first offset from the data list */ - add $4 , dlp /* dlp++ */ - - test %eax , %eax /* end of list ? */ - jz LOCAL(__paramLoopDoneWBone1) /* yes, "write buffer" has y data */ - -LOCAL(__paramLoop1b): - movd (%eax,vertex) , %mm2 /* get next parameter */ - movl (dlp) , %eax /* offset = *(dlp + 1) */ - - punpckldq %mm2 , %mm1 /* current param | previous param */ - add $4 , dlp /* dlp++ */ - - WRITE_MM1_FIFO_ALIGNED /* PCI write current param | previous param */ - add $8 , fifo /* fifoPtr += 2*sizeof(FxU32) */ - -#if GLIDE_CULLING - test %eax , %eax /* at end of offset list (offset == 0) ? */ -#else - cmp $0 , %eax /* at end of offset list (offset == 0) ? */ -#endif - - jz LOCAL(__paramLoopDoneWBzero1) /* exit, "write buffer" empty */ - - movd (%eax,vertex) , %mm1 /* get next parameter */ - movl (dlp) , %eax /* offset = *(dlp + 1) */ - - add $4 , dlp /* dlp++ */ - - test %eax , %eax /* at end of offset list (offset == 0) ? */ - jnz LOCAL(__paramLoop1b) /* nope, copy next parameter */ -#endif - -LOCAL(__paramLoopDoneWBone1): - -/* here: "write buffer" has one DWORD left over from vertex A */ - - mov _vb(%esp) , vertex /* Current vertex = B */ - mov dlpstrt , dlp /* reset the dataList */ - - movd x(vertex) , %mm2 /* 0 | x if vertex B */ - punpckldq %mm2 , %mm1 /* x | old param */ - - WRITE_MM1_FIFO_ALIGNED /* PCI write: x | old param */ - add $8 , fifo /* fifoPtr += 2*sizeof(FxU32) */ - - movd y(vertex) , %mm1 /* 0 | y of vertex B */ -#if GLIDE_PACK_RGB -#else - mov %esp , %esp /* filler */ -#endif - -#if GLIDE_PACK_RGB -#if GLIDE_PACK_ALPHA -/* assumes color and alpha values < 256.0 */ - movq r(vertex) , %mm4 /* g | r */ - movd b(vertex) , %mm2 /* 0 | b */ - - movd a(vertex) , %mm3 /* 0 | a */ - pf2id %mm4 , %mm4 /* convert to integer: 000000gg | 000000rr */ - - pf2id %mm2 , %mm2 /* convert to integer: 00000000 | 000000bb */ - pf2id %mm3 , %mm3 /* convert to integer: 00000000 | 000000aa */ - - punpcklwd %mm4 , %mm2 /* 00000000 | 00rr00bb */ - psrlq $24 , %mm4 /* 00000000 | 0000gg00 */ - - add $8 , dlp /* skip data list entry "a" */ - mov %eax , %eax /* filler */ - - psllq $24 , %mm3 /* 00000000 | aa000000 */ - - por %mm2 , %mm4 /* 00000000 | 00rrggbb */ - por %mm3 , %mm4 /* 00000000 | aarrggbb */ - -#else /* !GLIDE_PACK_ALPHA */ -/* assumes color values < 256.0 */ - - movq r(vertex) , %mm4 /* g | r */ - movd b(vertex) , %mm2 /* 0 | b */ - - pf2id %mm4 , %mm4 /* convert to integer: 000000gg | 000000rr */ - pf2id %mm2 , %mm2 /* convert to integer: 00000000 | 000000bb */ - - punpcklwd %mm4 , %mm2 /* 00000000 | 00rr00bb */ - psrlq $24 , %mm4 /* 00000000 | 0000gg00 */ - - add $4 , dlp /* next data list entry */ - por %mm2 , %mm4 /* 00000000 | 00rrggbb */ -#endif /* !GLIDE_PACK_ALPHA */ - - punpckldq %mm4 , %mm1 /* RGB(A) | y */ - movl (dlp) , %eax /* get first offset from the data list */ - - WRITE_MM1_FIFO_ALIGNED /* PCI write y | RGB(A) */ - add $8 , fifo /* fifoPtr += 2*sizeof(FxU32) */ - - add $4 , dlp /* dlp++ */ - test %eax , %eax /* end of list ? */ - - jz LOCAL(__paramLoopDoneWBzero2) /* yes, "write buffer" is empty */ - mov %esp , %esp /* filler */ - -LOCAL(__paramLoop2b): - movd (%eax,vertex) , %mm1 /* get next parameter */ - movl (dlp) , %eax /* offset = *(dlp + 1) */ - - test %eax , %eax /* at end of offset list (offset == 0) ? */ - lea 4(dlp) , dlp /* dlp++ */ - - jz LOCAL(__paramLoopDoneWBone2) /* exit, write buffer contains one DWORD */ - movd (%eax,vertex) , %mm2 /* get next parameter */ - - movl (dlp) , %eax /* offset = *(dlp + 1) */ - add $4 , dlp /* dlp++ */ - - punpckldq %mm2 , %mm1 /* current param | previous param */ - WRITE_MM1_FIFO_ALIGNED /* PCI write current param | previous param */ - - add $8 , fifo /* fifoPtr += 2*sizeof(FxU32) */ - - test %eax , %eax /* at end of offset list (offset == 0) ? */ - jnz LOCAL(__paramLoop2b) /* nope, copy next parameter */ - - jmp LOCAL(__paramLoopDoneWBzero2) /* write buffer empty */ -#else /* !GLIDE_PACK_RGB */ - movl (dlp) , %eax /* get first offset from the data list */ - add $4 , dlp /* dlp++ */ - - test %eax , %eax /* end of list ? */ - jz LOCAL(__paramLoopDoneWBone2) /* yes, "write buffer" has y data */ - -LOCAL(__paramLoop2b): - movd (%eax,vertex) , %mm2 /* get next parameter */ - movl (dlp) , %eax /* offset = *(dlp + 1) */ - - add $4 , dlp /* dlp++ */ - punpckldq %mm2 , %mm1 /* current param | previous param */ - - WRITE_MM1_FIFO_ALIGNED /* PCI write current param | previous param */ - add $8 , fifo /* fifoPtr += 2*sizeof(FxU32) */ - -#if GLIDE_CULLING - test %eax , %eax /* at end of offset list (offset == 0) ? */ -#else - cmp $0 , %eax /* at end of offset list (offset == 0) ? */ -#endif - jz LOCAL(__paramLoopDoneWBzero2) /* exit, "write buffer" empty */ - - movd (%eax,vertex) , %mm1 /* get next parameter */ - movl (dlp) , %eax /* offset = *(dlp + 1) */ - - add $4 , dlp /* dlp++ */ - - test %eax , %eax /* at end of offset list (offset == 0) ? */ - jnz LOCAL(__paramLoop2b) /* nope, copy next parameter */ - - jmp LOCAL(__paramLoopDoneWBone2) /* write buffer contains one DWORD */ -#endif - - -LOCAL(__paramLoopDoneWBzero1): - - mov _vb(%esp) , vertex /* Current vertex = B */ - mov dlpstrt , dlp /* Reset the dataList */ - - movq x(vertex) , %mm1 /* y | x of vertex B */ - WRITE_MM1_FIFO_ALIGNED /* PCI write y | x of vertex B */ - - add $8 , fifo /* fifoPtr += 2*sizeof(FxU32) */ - -#if GLIDE_PACK_RGB -#if GLIDE_PACK_ALPHA -/* assumes color and alpha values < 256.0 */ - movq r(vertex) , %mm1 /* g | r */ - movd b(vertex) , %mm2 /* 0 | b */ - - movd a(vertex) , %mm3 /* 0 | a */ - pf2id %mm1 , %mm1 /* convert to integer: 000000gg | 000000rr */ - - pf2id %mm2 , %mm2 /* convert to integer: 00000000 | 000000bb */ - pf2id %mm3 , %mm3 /* convert to integer: 00000000 | 000000aa */ - - punpcklwd %mm1 , %mm2 /* 00000000 | 00rr00bb */ - psrlq $24 , %mm1 /* 00000000 | 0000gg00 */ - - psllq $24 , %mm3 /* 00000000 | aa000000 */ - por %mm2 , %mm1 /* 00000000 | 00rrggbb */ - - por %mm3 , %mm1 /* 00000000 | aarrggbb */ - add $8 , dlp /* skip data list entry "a" */ -#else /* !GLIDE_PACK_ALPHA */ -/* assumes color values < 256.0 */ - - movq r(vertex) , %mm1 /* g | r */ - movd b(vertex) , %mm2 /* 0 | b */ - - pf2id %mm1 , %mm1 /* convert to integer: 000000gg | 000000rr */ - pf2id %mm2 , %mm2 /* convert to integer: 00000000 | 000000bb */ - - punpcklwd %mm1 , %mm2 /* 00000000 | 00rr00bb */ - psrlq $24 , %mm1 /* 00000000 | 0000gg00 */ - - por %mm2 , %mm1 /* 00000000 | 00rrggbb */ - add $4 , dlp /* next data list entry */ -#endif /* !GLIDE_PACK_ALPHA */ - -/* here: one DWORD in "write buffer", RGB(A) */ - - movl (dlp) , %eax /* get first offset from the data list */ - add $4 , dlp /* dlp++ */ - - cmp $0 , %eax /* end of list ? */ - jz LOCAL(__paramLoopDoneWBone2) /* yes, one DWORD in "write buffer" */ - -LOCAL(__paramLoop2a): - movd (%eax,vertex) , %mm2 /* get next parameter */ - - movl (dlp) , %eax /* offset = *(dlp + 1) */ - punpckldq %mm2 , %mm1 /* current param | previous param */ - - add $4 , dlp /* dlp++ */ - WRITE_MM1_FIFO_ALIGNED /* PCI write current param | previous param */ - - add $8 , fifo /* fifoPtr += 2*sizeof(FxU32) */ - test %eax , %eax /* at end of offset list (offset == 0) ? */ - - jz LOCAL(__paramLoopDoneWBzero2) /* exit, "write buffer" empty */ - movd (%eax,vertex) , %mm1 /* get next parameter */ - - movl (dlp) , %eax /* offset = *(dlp + 1) */ - add $4 , dlp /* dlp++ */ - - test %eax , %eax /* at end of offset list (offset == 0) ? */ - jnz LOCAL(__paramLoop2a) /* nope, copy next parameter */ - - jmp LOCAL(__paramLoopDoneWBone2) /* merge back into common stream */ -#else /* ! GLIDE_PACK_RGB */ - -/* here: "write buffer" empty */ - - movl (dlp) , %eax /* Get first offset from the data list */ - add $4 , dlp /* dlp++ */ - - cmp $0 , %eax /* at end of list ? */ - jz LOCAL(__paramLoopDoneWBzero2) /* yes, "write buffer" empty */ - -LOCAL(__paramLoop2a): - movd (%eax,vertex) , %mm1 /* get next parameter */ - movl (dlp) , %eax /* offset = *(dlp + 1) */ - - add $4 , dlp /* dlp++ */ -#if GLIDE_CULLING - test %eax , %eax /* at end of offset list (offset == 0) ? */ -#else - cmp $0 , %eax /* at end of offset list (offset == 0) ? */ -#endif - - jz LOCAL(__paramLoopDoneWBone2) /* exit, write buffer contains one DWORD */ - movd (%eax,vertex) , %mm2 /* get next parameter */ - - movl (dlp) , %eax /* offset = *(dlp + 1) */ - add $4 , dlp /* dlp++ */ - - punpckldq %mm2 , %mm1 /* current param | previous param */ - - WRITE_MM1_FIFO_ALIGNED /* PCI write current param | previous param */ - add $8 , fifo /* fifoPtr += 2*sizeof(FxU32) */ - -#if GLIDE_CULLING - cmp $0 , %eax /* at end of offset list (offset == 0) ? */ -#else - test %eax , %eax /* at end of offset list (offset == 0) ? */ -#endif - jnz LOCAL(__paramLoop2a) /* nope, copy next parameter */ -#endif /* GLIDE_PACK_RGB */ - - -LOCAL(__paramLoopDoneWBzero2): - - mov _vc(%esp) , vertex /* Current vertex = C */ - mov dlpstrt , dlp /* Reset the dataList */ - - movq x(vertex) , %mm1 /* y | x of vertex C */ - WRITE_MM1_FIFO_ALIGNED /* PCI write y | x of vertex C */ - - add $8 , fifo /* fifoPtr += 2*sizeof(FxU32) */ - -#if GLIDE_PACK_RGB -#if GLIDE_PACK_ALPHA -/* assumes color and alpha values < 256.0 */ - movq r(vertex) , %mm1 /* g | r */ - movd b(vertex) , %mm2 /* 0 | b */ - - movd a(vertex) , %mm3 /* 0 | a */ - pf2id %mm1 , %mm1 /* convert to integer: 000000gg | 000000rr */ - - pf2id %mm2 , %mm2 /* convert to integer: 00000000 | 000000bb */ - pf2id %mm3 , %mm3 /* convert to integer: 00000000 | 000000aa */ - - punpcklwd %mm1 , %mm2 /* 00000000 | 00rr00bb */ - psrlq $24 , %mm1 /* 00000000 | 0000gg00 */ - - psllq $24 , %mm3 /* 00000000 | aa000000 */ - por %mm2 , %mm1 /* 00000000 | 00rrggbb */ - - por %mm3 , %mm1 /* 00000000 | aarrggbb */ - add $8 , dlp /* skip data list entry "a" */ -#else /* !GLIDE_PACK_ALPHA */ -/* assumes color values < 256.0 */ - - movq r(vertex) , %mm1 /* g | r */ - movd b(vertex) , %mm2 /* 0 | b */ - - pf2id %mm1 , %mm1 /* convert to integer: 000000gg | 000000rr */ - pf2id %mm2 , %mm2 /* convert to integer: 00000000 | 000000bb */ - - punpcklwd %mm1 , %mm2 /* 00000000 | 00rr00bb */ - psrlq $24 , %mm1 /* 00000000 | 0000gg00 */ - - por %mm2 , %mm1 /* 00000000 | 00rrggbb */ - add $4 , dlp /* next data list entry */ -#endif /* !GLIDE_PACK_ALPHA */ - -/* here: one DWORD in "write buffer", RGB(A) */ - - movl (dlp) , %eax /* get first offset from the data list */ - add $4 , dlp /* dlp++ */ - -#if GLIDE_PACK_ALPHA - cmp $0 , %eax /* end of list ? */ -#else - test %eax , %eax /* end of list ? */ -#endif - jz LOCAL(__paramLoopDoneWBone3) /* yes, one DWORD in "write buffer" */ - -LOCAL(__paramLoop3a): - movd (%eax,vertex) , %mm2 /* get next parameter */ - movl (dlp) , %eax /* offset = *(dlp + 1) */ - - punpckldq %mm2 , %mm1 /* current param | previous param */ - add $4 , dlp /* dlp++ */ - - WRITE_MM1_FIFO_ALIGNED /* PCI write current param | previous param */ - add $8 , fifo /* fifoPtr += 2*sizeof(FxU32) */ - - test %eax , %eax /* at end of offset list (offset == 0) ? */ - jz LOCAL(__paramLoopDoneWBzero3) /* exit, "write buffer" empty */ - - movd (%eax,vertex) , %mm1 /* get next parameter */ - movl (dlp) , %eax /* offset = *(dlp + 1) */ - - add $4 , dlp /* dlp++ */ - - test %eax , %eax /* at end of offset list (offset == 0) ? */ - jnz LOCAL(__paramLoop3a) /* nope, copy next parameter */ - - jmp LOCAL(__paramLoopDoneWBone3) /* merge back into common stream */ - -#else /* ! GLIDE_PACK_RGB */ - -/* here: "write buffer" empty */ - - movl (dlp) , %eax /* Get first offset from the data list */ - add $4 , dlp /* dlp++ */ - -#if GLIDE_CULLING - test %eax , %eax /* at end of list ? */ -#else - cmp $0 , %eax /* at end of list ? */ -#endif - jz LOCAL(__paramLoopDoneWBzero3) /* yes, "write buffer" empty */ - -#if GLIDE_CULLING -#else - mov %esp , %esp /* filler */ -#endif - -LOCAL(__paramLoop3a): - movd (%eax,vertex) , %mm1 /* get next parameter */ - movl (dlp) , %eax /* offset = *(dlp + 1) */ - - add $4 , dlp /* dlp++ */ -#if GLIDE_CULLING - cmp $0 , %eax /* at end of offset list (offset == 0) ? */ -#else - test %eax , %eax /* at end of offset list (offset == 0) ? */ -#endif - - jz LOCAL(__paramLoopDoneWBone3) /* exit, write buffer contains one DWORD */ - movd (%eax,vertex) , %mm2 /* get next parameter */ - - movl (dlp) , %eax /* offset = *(dlp + 1) */ - add $4 , dlp /* dlp++ */ - - punpckldq %mm2 , %mm1 /* current param | previous param */ - - WRITE_MM1_FIFO_ALIGNED /* PCI write current param | previous param */ - add $8 , fifo /* fifoPtr += 2*sizeof(FxU32) */ - - test %eax , %eax /* at end of offset list (offset == 0) ? */ - jnz LOCAL(__paramLoop3a) /* nope, copy next parameter */ - - jmp LOCAL(__paramLoopDoneWBzero3) /* write buffer empty */ -#endif /* GLIDE_PACK_RGB */ - - -LOCAL(__paramLoopDoneWBone2): - -/* here: "write buffer" has one DWORD left over from vertex B */ - - mov _vc(%esp) , vertex /* Current vertex = C */ - mov dlpstrt , dlp /* reset the dataList */ - - movd x(vertex) , %mm2 /* 0 | x if vertex C */ - punpckldq %mm2 , %mm1 /* x | old param */ - - WRITE_MM1_FIFO_ALIGNED /* PCI write: x | old param */ - add $8 , fifo /* fifoPtr += 2*sizeof(FxU32) */ - - movd y(vertex) , %mm1 /* 0 | y of vertex C */ - -#if GLIDE_PACK_RGB -#if GLIDE_PACK_ALPHA -/* assumes color and alpha values < 256.0 */ - movq r(vertex) , %mm4 /* g | r */ - movd b(vertex) , %mm2 /* 0 | b */ - - movd a(vertex) , %mm3 /* 0 | a */ - pf2id %mm4 , %mm4 /* convert to integer: 000000gg | 000000rr */ - - pf2id %mm2 , %mm2 /* convert to integer: 00000000 | 000000bb */ - pf2id %mm3 , %mm3 /* convert to integer: 00000000 | 000000aa */ - - punpcklwd %mm4 , %mm2 /* 00000000 | 00rr00bb */ - psrlq $24 , %mm4 /* 00000000 | 0000gg00 */ - - add $8 , dlp /* skip data list entry "a" */ - psllq $24 , %mm3 /* 00000000 | aa000000 */ - - por %mm2 , %mm4 /* 00000000 | 00rrggbb */ - por %mm3 , %mm4 /* 00000000 | aarrggbb */ -#else /* !GLIDE_PACK_ALPHA */ -/* assumes color values < 256.0 */ - - movq r(vertex) , %mm4 /* g | r */ - movd b(vertex) , %mm2 /* 0 | b */ - - pf2id %mm4 , %mm4 /* convert to integer: 000000gg | 000000rr */ - pf2id %mm2 , %mm2 /* convert to integer: 00000000 | 000000bb */ - - punpcklwd %mm4 , %mm2 /* 00000000 | 00rr00bb */ - psrlq $24 , %mm4 /* 00000000 | 0000gg00 */ - - add $4 , dlp /* next data list entry */ - por %mm2 , %mm4 /* 00000000 | 00rrggbb */ -#endif /* !GLIDE_PACK_ALPHA */ - - punpckldq %mm4 , %mm1 /* RGB(A) | y */ - movl (dlp) , %eax /* get first offset from the data list */ - - WRITE_MM1_FIFO_ALIGNED /* PCI write y | RGB(A) */ - add $8 , fifo /* fifoPtr += 2*sizeof(FxU32) */ - - add $4 , dlp /* dlp++ */ - test %eax , %eax /* end of list ? */ - - jz LOCAL(__paramLoopDoneWBzero3) /* yes, "write buffer" is empty */ - -LOCAL(__paramLoop3b): - movd (%eax,vertex) , %mm1 /* get next parameter */ - movl (dlp) , %eax /* offset = *(dlp + 1) */ - - add $4 , dlp /* dlp++ */ - test %eax , %eax /* at end of offset list (offset == 0) ? */ - - jz LOCAL(__paramLoopDoneWBone3) /* exit, write buffer contains one DWORD */ - movd (%eax,vertex) , %mm2 /* get next parameter */ - - movl (dlp) , %eax /* offset = *(dlp + 1) */ - add $4 , dlp /* dlp++ */ - - punpckldq %mm2 , %mm1 /* current param | previous param */ - WRITE_MM1_FIFO_ALIGNED /* PCI write current param | previous param */ - - add $8 , fifo /* fifoPtr += 2*sizeof(FxU32) */ - - test %eax , %eax /* at end of offset list (offset == 0) ? */ - jnz LOCAL(__paramLoop3b) /* nope, copy next parameter */ - -#if GLIDE_PACK_ALPHA - nop /* filler */ - jmp LOCAL(__paramLoopDoneWBzero3) /* write buffer empty */ -#else - jmp LOCAL(__paramLoopDoneWBzero3) /* write buffer empty */ - nop /* filler */ -#endif -#else /* !GLIDE_PACK_RGB */ - movl (dlp) , %eax /* get first offset from the data list */ - add $4 , dlp /* dlp++ */ - - test %eax , %eax /* end of list ? */ - jz LOCAL(__paramLoopDoneWBone3) /* yes, "write buffer" has y data */ - -LOCAL(__paramLoop3b): - movd (%eax,vertex) , %mm2 /* get next parameter */ - movl (dlp) , %eax /* offset = *(dlp + 1) */ - - punpckldq %mm2 , %mm1 /* current param | previous param */ - add $4 , dlp /* dlp++ */ - - WRITE_MM1_FIFO_ALIGNED /* PCI write current param | previous param */ - add $8 , fifo /* fifoPtr += 2*sizeof(FxU32) */ - - test %eax , %eax /* at end of offset list (offset == 0) ? */ - jz LOCAL(__paramLoopDoneWBzero3) /* exit, "write buffer" empty */ - - movd (%eax,vertex) , %mm1 /* get next parameter */ - movl (dlp) , %eax /* offset = *(dlp + 1) */ - - add $4 , dlp /* dlp++ */ - - test %eax , %eax /* at end of offset list (offset == 0) ? */ - jnz LOCAL(__paramLoop3b) /* nope, copy next parameter */ -#endif - -LOCAL(__paramLoopDoneWBone3): - -/* "write buffer" contains one DWORD that needs to be flushed */ - - WRITE_MM1LOW_FIFO /* */ - add $4 , fifo - -LOCAL(__paramLoopDoneWBzero3): - -/* Update gc->fifoPtr and gc->fifoRoom */ - - mov (_GlideRoot+trisDrawn) , %ecx /* _GlideRoot.stats.trisDrawn */ - mov fifo , %eax /* new fifo pointer */ - - mov fifoPtr(gc) , %ebx /* old fifo pointer */ - mov fifo , fifoPtr(gc) /* save new fifo pointer */ - - mov fifoRoom(gc) , %edx /* old fifo space available */ -#if GLIDE_PACK_RGB - add $1 , %ecx /* _GlideRoot.stats.trisDrawn++ */ -#else - inc %ecx /* _GlideRoot.stats.trisDrawn++ */ -#endif - - mov (_GlideRoot+trisProcessed) , %esi /* _GlideRoot.stats.trisProcessed */ - sub %ebx , %eax /* new fifo ptr - old fifo ptr = additional fifo space used */ - - mov %ecx , (_GlideRoot+trisDrawn) - sub %eax , %edx /* new fifo space available */ - - mov $0x1 , %eax /* return value = triangle drawn */ - mov %edx , fifoRoom(gc) /* new fifo space available */ - -/* Restore trashed registers */ - - inc %esi /* _GlideRoot.stats.trisProcessed++ */ - pop %ebp /* restore frame pointer */ - -#if GLIDE_CULLING - pop %ebx /* restore caller's register variable */ - mov %esi , (_GlideRoot+trisProcessed) -#else - mov %esi , (_GlideRoot+trisProcessed) - pop %ebx /* restore caller's register variable */ -#endif - pop %esi /* restore caller's register variable */ - pop %edi /* restore caller's register variable */ - - femms /* no more AMD3D code, clear FPU/MMX regs */ - - ret /* return to caller */ - - -#if GLIDE_CULLING -LOCAL(__cullFail): - mov (_GlideRoot+trisProcessed) , %esi /* triangles processed so far */ - xor %eax , %eax /* return value = triangle not drawn */ - - femms /* no more AMD3D code, clear FPU/MMX regs */ - -/* Restore trashed registers */ - inc %esi /* _GlideRoot.stats.trisProcessed++ */ - pop %ebp /* restore frame pointer */ - - mov %esi , (_GlideRoot+trisProcessed) - pop %ebx - - pop %esi - pop %edi - - ret -#endif /* GLIDE_CULLING */ - -/* --------------------------------------------------------------------------- */ - -/* end AMD3D section */ - -/* --------------------------------------------------------------------------- */ -#endif /* GL_AMD3D */ - -/* --------------------------------------------------------------------------- */ - -/* start original code */ - -/* --------------------------------------------------------------------------- */ - -#ifndef GL_AMD3D - -#define X 0 -#define Y 4 -/* edx is used as index, loading from *src */ -#define gc %esi /* points to graphics context */ - -/* Prologue stuff */ - push %esi - push %edi - - push %ebx - push %ebp - - mov (_GlideRoot+curGC) , gc /* GR_DCL_GC */ - -.align 4 -#if GLIDE_CULLING -#define fa %eax /* vtx a from caller */ -#define fb %ebx /* vtx b from caller */ -#define fc %ecx /* vtx c from caller */ - -#define cull %edx -#define intArea %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 /* culltest << 31 */ - -LOCAL(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(0) /* 4 */ - fstp %st(0) /* 3 */ - fstp %st(0) /* 2 */ - fstp %st(0) /* 1 */ - fstp %st(0) /* 0 */ - - mov zArea , intArea /* j = *(long *)&area */ - xor %eax , %eax /* Clear the return value (0 == culled) */ - -/* Zero Area Triangle Check */ - and $0x7fffffff , intArea /* if ((j & 0x7FFFFFFF) == 0) */ - jz LOCAL(__triDone) - -/* Triangle area check vs culling mode */ - mov zArea , intArea /* reload area just in case we're culling */ - xor cull , intArea /* if (j ^ (culltest << 31)) */ - - jge LOCAL(__triDone) -#endif /* GLIDE_CULLING */ - -.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 - - jge LOCAL(__triBegin) - - push $__LINE__ - push $0x0 - - push %eax - call _FifoMakeRoom - - add $12 , %esp - -/* Send triangle parameters */ - -#define dlp %ebx /* points to dataList structure */ -#define fifo %ebp /* points to next entry in fifo */ -#define vertex %edx /* the current vertex */ -#define vOffset %ecx /* Current vertex offset */ - -#define packCol %edi -#define tempVal %edi - -.MACRO GR_FIFO_WRITE __addr __offset __data - mov \__data , \__offset(\__addr) -.ENDM /* GR_FIFO_WRITE */ - -.align 4 -LOCAL(__triBegin): - mov fifoPtr(gc) , fifo /* Fetch Fifo Ptr */ - mov $4 , vOffset /* Starting vertex */ - - mov triPacketHdr(gc) , %eax /* Packet 3 header */ - nop - - GR_FIFO_WRITE fifo , 0 , %eax - /* Write packet header to fifo */ - add $4 , fifo /* Advance fifo for hdr & x/y coordinate */ - -.align 4 -LOCAL(__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 */ - - GR_FIFO_WRITE fifo , -8 , %eax - /* PCI write X */ - movl y(vertex) , %eax /* Y */ - - xor packCol , packCol /* Clear packed color */ - GR_FIFO_WRITE fifo , -4 , %eax - /* PCI write Y */ - -#if GLIDE_PACK_RGB - flds b(vertex) /* B */ - fadds _GlideRoot+fBiasLo /* BC GC */ - - flds g(vertex) /* G B */ - fadds _GlideRoot+fBiasHi /* GC B */ - - flds r(vertex) /* R GC BC */ - fadds _GlideRoot+fBiasHi /* RC GC BC */ - - fxch %st(2) /* BC GC RC */ - fstps bias0 /* GC RC */ - - fstps bias1 /* RC */ - movl bias0 , packCol /* B + bias */ - - fstps bias0 - movl bias1 , %eax /* G + bias */ - -#if GLIDE_PACK_ALPHA - flds a(vertex) - fadds _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 - - fstps 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 -#else /* !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 */ -#endif /* !GLIDE_PACK_ALPHA */ - - GR_FIFO_WRITE fifo , 0 , packCol - /* PCI write packed color value */ - add $4 , fifo -#endif /* GLIDE_PACK_RGB */ - -LOCAL(__doParams): - movl (dlp) , %eax /* Get first offset from the data list */ - add $4 , dlp /* dlp++ */ - - cmp $0 , %eax /* Are we done? */ - je LOCAL(__nextVertex) - -/* Not using align directive here because it sometimes */ -/* introduces an agi for the eax use below. */ - nop - nop - -LOCAL(__paramLoop): - movl (%eax,vertex) , tempVal /* Get the parameter from teh vertex */ - add $4 , fifo /* fifoPtr += sizeof(FxU32) */ - - movl (dlp) , %eax /* offset = *(dlp + 1) */ - add $4 , dlp /* dlp++ */ - - cmp $0 , %eax /* Are we done? */ - GR_FIFO_WRITE fifo , -4 , tempVal - /* *fifoPtr = data */ - - jne LOCAL(__paramLoop) - -.align 4 -LOCAL(__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? */ - jne LOCAL(__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 /* _GlideRoot.stats.trisDrawn++ */ - sub %eax , fifoRoom(gc) - - add $1 , %ebx - mov %ebx , (_GlideRoot+trisDrawn) - -/* return 1 (triangle drawn) */ - mov $0x1 , %eax - -LOCAL(__triDone): -/* Restore trashed registers */ - mov (_GlideRoot+trisProcessed) , %esi - pop %ebp - - add $1 , %esi /* _GlideRoot.stats.trisProcessed++ */ - pop %ebx - - pop %edi - mov %esi , (_GlideRoot+trisProcessed) - - pop %esi - ret - -#endif /* !GL_AMD3D */ - diff --git a/glide2x/h3/glide/src/xtexdl.S b/glide2x/h3/glide/src/xtexdl.S deleted file mode 100644 index ead5207..0000000 --- a/glide2x/h3/glide/src/xtexdl.S +++ /dev/null @@ -1,284 +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$ */ -/* */ -/* 3 3/17/99 6:17p Dow */ -/* Phantom Menace and other fixes. */ -/* */ -/* 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 f*cked 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 */ -/* */ - -.file "xtexdl.asm" - - -#ifdef USE_PACKET_FIFO -#endif - -/* Definitions of cvg regs and glide root structures. */ -#include "fxgasm.h" - -/* Arguments (STKOFF = 16 from 4 dword pushes) */ -#define STACKOFFSET 16 -#define _gc 4+STACKOFFSET -#define _baseAddr 8+STACKOFFSET -#define _maxS 12+STACKOFFSET -#define _minT 16+STACKOFFSET -#define _maxT 20+STACKOFFSET -#define _texData 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) */ - -.macro GR_FIFO_WRITE __addr __offset __data - mov \__data , \__offset(\__addr) -.endm /* GR_FIFO_WRITE */ - -/* -------------------------------------------------------------------------- */ - -.text - - -.align 32 - -.globl _grTexDownload_3DNow_MMX - -.type _grTexDownload_3DNow_MMX,@function -_grTexDownload_3DNow_MMX: - - push %ebx /* save caller's register variable */ - mov _maxT-12(%esp) , curT /* curT = maxT */ - - push %esi /* save caller's register variable */ - mov _minT-8(%esp) , %eax /* minT */ - - push %edi /* save caller's register variable */ - mov _gc-4(%esp) , gc /* gc */ - - push %ebp /* save caller's register variable */ - mov _texData(%esp) , dataPtr /* dataPtr */ - - sub %eax , curT /* curT = maxT - minT */ - mov fifoPtr(gc) , fifo /* fifoPtr */ - - mov _maxS(%esp) , curS /* curS = maxS */ - add $1 , curT /* curT = maxT - minT + 1 */ - - femms /* we'll use MMX/3DNow!, make sure FPU register cleared */ - - mov curS , %edx /* curS = maxS = scanline width in DWORDs */ - movd _baseAddr(%esp) , %mm3 /* 0 | address of texture to download */ - - shl $2 , curS /* scan line width (in bytes) */ - mov _minT(%esp) , %eax /* 0 | minT */ - - mov curS , _maxS(%esp) /* save scan line width (in bytes) */ - shl $3 , %edx /* packetHdr<21:3> = maxS = scanline width in DWORDs */ - - imul curS , %eax /* TEX_ROW_ADDR_INCR(minT) = minT * TEX_ROW_ADDR_INCR(1) */ - - movd curS , %mm2 /* 0 | TEX_ROW_ADDR_INCR(1) */ - or $0x00000005 , %edx /* packetHdr<31:30> = lfb port */ -/* packetHdr<21:3> = maxS */ -/* packetHdr<2:0> = packetType 5 */ - - movd %edx , %mm1 /* 0 | packetHdr */ - movd %eax , %mm4 /* 0 | TEX_ROW_ADDR_INCR(minT) */ - - psllq $32 , %mm2 /* TEX_ROW_ADDR_INCR(1) | 0 */ - paddd %mm4 , %mm3 /* 0 | texAddr = texBaseAddr + TEX_ROW_ADDR_INCR(minT) */ - - mov fifoRoom(gc) , fRoom /* get available fifoRoom (in bytes) */ - punpckldq %mm3 , %mm1 /* hdr2 = texAddr | hdr1 = packetHdr */ - -/* ebx = curT, edi = dataPtr, esi = gc, ebp = fifo, ecx = curS = maxS */ -/* edx = fifoRoom, mm1 = texAddr|packetHdr, mm2 = TEX_ROW_ADDR_INCR(1)|0 */ - - test $4 , fifo /* is fifo QWORD aligned ? */ - jz .L_grTexDownload_3DNow_MMX__startDownload /* yup, start texture download */ - - cmp $4 , fRoom /* enough room for NULL packet in fifo? */ - jge .L_grTexDownload_3DNow_MMX__mmxAlignFifo /* yes, write NULL packet to align fifo */ - -#ifdef USE_PACKET_FIFO - push $ __LINE__ /* Line # inside this function */ - push $0 /* NULL file name */ - - push $4 /* fifo space required (bytes) */ - call _FifoMakeRoom /* make fifo room */ - - add $12 , %esp /* pop 3 DWORD parameters to FifoMakeRoom */ -#endif - mov fifoPtr(gc) , fifo /* fifoPtr modified by FifoMakeRoom, reload */ - - mov fifoRoom(gc) , fRoom /* fifoRoom modified by FifoMakeRoom, reload */ - mov _maxS(%esp) , curS /* reload maxS (destroyed by call to FifoMakeRoom) */ - - test $4 , fifo /* new fifoPtr QWORD aligned ? */ - jz .L_grTexDownload_3DNow_MMX__startDownload /* yup, start texture download */ - -.L_grTexDownload_3DNow_MMX__mmxAlignFifo: - - movl $0 , (fifo) /* write NULL packet */ - sub $4 , fRoom /* fifoRoom -= 4 */ - - mov fRoom , fifoRoom(gc) /* store new fifoRoom */ - add $4 , fifo /* fifoPtr += 4 */ - - mov fifo , fifoPtr(gc) /* store new fifoPtr */ - jmp .L_grTexDownload_3DNow_MMX__startDownload /* fifo aligned, download texture now */ - -.align 32 - -/* ebx = curT, edi = dataPtr, esi = gc, ebp = fifo, ecx = maxS = curS */ -/* edx=fifoRoom, mm1 = texAddr|packetHdr, mm2 = TEX_ROW_ADDR_INCR(1)|0 */ - -.L_grTexDownload_3DNow_MMX__loopT: - -#ifdef GLIDE_DEBUG - -/* Make sure that we have a QWORD aligned fifoPtr force GP if not aligned */ - - test $4 , fifo /* is fifoPtr QWORD aligned ? */ - jz .L_grTexDownload_3DNow_MMX__alignmentOK /* yup, continue */ - - xor %eax , %eax /* create 0 */ - mov %eax , (%eax) /* move to DS:[0] forces GP */ -.L_grTexDownload_3DNow_MMX__alignmentOK: -#endif /* GLIDE_DEBUG */ - -/* Compute packet header words */ -/* hdr1: downloadSpace[31:30] numWords[21:3] packetType[2:0] */ -/* hdr2: download address[29:0] */ - - movq %mm1 , (fifo) /* store hdr2 | hdr1 */ - add $8 , fifo /* increment fifo ptr (hdr1 + hdr2) */ - -/* S coordinate inner loop unrolled for 8 texels a write */ - -.L_grTexDownload_3DNow_MMX__loopS: - - movq (dataPtr) , %mm0 /* load 64 bit data (8 texels) */ - add $8 , fifo /* pre-increment fifoPtr += 2 * sizeof(FxU32) */ - - add $8 , dataPtr /* dataPtr += 2 * sizeof(FxU32) */ - sub $8 , curS /* curS -= 2 * sizeof(FxU32) */ - - movq %mm0 , -8(fifo) /* *fifoPtr = texelData[64 bits] */ - jnz .L_grTexDownload_3DNow_MMX__loopS /* loop while curS > 0 */ - - mov fifoPtr(gc) , %ecx /* old fifo ptr */ - nop /* filler */ - - mov fifo , %eax /* new fifo ptr */ - mov fifo , fifoPtr(gc) /* save new fifo ptr */ - - sub %ecx , %eax /* new fifo ptr - old fifo ptr = fifo space used up */ - mov _maxS(%esp) , curS /* curS = maxS = width of scanline (bytes) */ - - sub %eax , fRoom /* new fifo space available = old fifo space available - fifo space used up = new fifo space available */ - sub $1 , curT /* curT-- */ - - mov fRoom , fifoRoom(gc) /* save new fifo space available */ - jz .L_grTexDownload_3DNow_MMX__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 %mm2 , %mm1 /* texAddr+=TEX_ROW_ADDR_INCR(1) | packetHdr */ - mov %esp , %esp /* filler */ -.L_grTexDownload_3DNow_MMX__startDownload: - lea 8(curS) , %eax /* fifo space needed = scan line width + header size */ - - cmp %eax , fRoom /* fifo space available >= fifo space required ? */ - jge .L_grTexDownload_3DNow_MMX__loopT /* yup, write next scan line */ - -#ifdef USE_PACKET_FIFO - push $ __LINE__ /* Line # inside this function */ - push $0x0 /* NULL file name */ - - push %eax /* fifo space required */ - call _FifoMakeRoom /* make fifo room (if fifoPtr QWORD aligned before */ - - add $12 , %esp /* pop 3 DWORD parameters to FifoMakeRoom */ -#endif - mov fifoPtr(gc) , fifo /* fifoPtr was modified by FifoMakeRoom, reload */ - - mov fifoRoom(gc) , fRoom /* fifoRoom was modified by FifoMakeRoom, reload */ - mov _maxS(%esp) , curS /* curS = maxS = width of scanline (bytes) */ - jmp .L_grTexDownload_3DNow_MMX__loopT /* we now have enough fifo room, write next scanline */ - -.L_grTexDownload_3DNow_MMX__dlDone: - - femms /* exit 3DNow!(tm) state */ - - 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 */ - -.L_END__grTexDownload_3DNow_MMX: -.size _grTexDownload_3DNow_MMX,.L_END__grTexDownload_3DNow_MMX-_grTexDownload_3DNow_MMX - - -.end diff --git a/glide2x/h3/glide/src/xtexdl.asm b/glide2x/h3/glide/src/xtexdl.asm deleted file mode 100644 index 1c1c476..0000000 --- a/glide2x/h3/glide/src/xtexdl.asm +++ /dev/null @@ -1,287 +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$ -;; -;; 3 3/17/99 6:17p Dow -;; Phantom Menace and other fixes. -;; -;; 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 f*cked 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 -;; - -TITLE xtexdl.asm -OPTION OLDSTRUCTS - -.586P -.MMX -.K3D - -ifdef USE_PACKET_FIFO -EXTRN __FifoMakeRoom: NEAR -endif - - -;;; Definitions of cvg regs and glide root structures. -INCLUDE fxgasm.h - -; Arguments (STKOFF = 16 from 4 dword pushes) -STACKOFFSET = 16 -_gc$ = 4 + STACKOFFSET -_baseAddr$ = 8 + STACKOFFSET -_maxS$ = 12 + STACKOFFSET -_minT$ = 16 + STACKOFFSET -_maxT$ = 20 + STACKOFFSET -_texData$ = 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. - -fifo TEXTEQU ; fifo ptr in inner loop -gc TEXTEQU ; graphics context -dataPtr TEXTEQU ; pointer to exture data to be downloaded -curT TEXTEQU ; counter for texture scan lines (t-coordinate) -curS TEXTEQU ; texture s-coordinate -fRoom TEXTEQU ; room available in fifo (in bytes) - -GR_FIFO_WRITE MACRO __addr, __offset, __data - mov [__addr + __offset], __data -ENDM ; GR_FIFO_WRITE - -;-------------------------------------------------------------------------- - -_TEXT SEGMENT PAGE PUBLIC USE32 'CODE' - ASSUME DS: FLAT, SS: FLAT - - ALIGN 32 - - PUBLIC __grTexDownload_3DNow_MMX@24 - -__grTexDownload_3DNow_MMX@24 PROC NEAR - - 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 - - sub curT, eax ; curT = maxT - minT - mov fifo, [gc + fifoPtr] ; fifoPtr - - mov curS, [esp + _maxS$] ; curS = maxS - add curT, 1 ; curT = maxT - minT + 1 - - femms ; we'll use MMX/3DNow!, make sure FPU register cleared - - mov edx, curS ; curS = maxS = scanline width in DWORDs - movd mm3, [esp + _baseAddr$] ; 0 | address of texture to download - - shl curS, 2 ; scan line width (in bytes) - mov eax, [esp + _minT$] ; 0 | minT - - mov [esp + _maxS$], curS ; save scan line width (in bytes) - shl edx, 3 ; packetHdr<21:3> = maxS = scanline width in DWORDs - - imul eax, curS ; TEX_ROW_ADDR_INCR(minT) = minT * TEX_ROW_ADDR_INCR(1) - - movd mm2, curS ; 0 | TEX_ROW_ADDR_INCR(1) - or edx, 00000005h ; packetHdr<31:30> = lfb port - ; packetHdr<21:3> = maxS - ; packetHdr<2:0> = packetType 5 - - movd mm1, edx ; 0 | packetHdr - movd mm4, eax ; 0 | TEX_ROW_ADDR_INCR(minT) - - psllq mm2, 32 ; TEX_ROW_ADDR_INCR(1) | 0 - paddd mm3, mm4 ; 0 | texAddr = texBaseAddr + TEX_ROW_ADDR_INCR(minT) - - mov fRoom, [gc + fifoRoom] ; get available fifoRoom (in bytes) - punpckldq mm1, mm3 ; hdr2 = texAddr | hdr1 = packetHdr - - ;; ebx = curT, edi = dataPtr, esi = gc, ebp = fifo, ecx = curS = maxS - ;; edx = fifoRoom, mm1 = texAddr|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 - push @Line ; Line # inside this function - push 0 ; NULL file name - - push 4 ; fifo space required (bytes) - call __FifoMakeRoom ; make fifo room - - add esp, 12 ; pop 3 DWORD parameters to FifoMakeRoom -endif - mov fifo, [gc + fifoPtr] ; fifoPtr modified by FifoMakeRoom, reload - - mov fRoom, [gc + fifoRoom] ; fifoRoom modified by FifoMakeRoom, reload - mov curS, [esp + _maxS$] ; reload maxS (destroyed by call to FifoMakeRoom) - - test fifo, 4 ; new fifoPtr QWORD aligned ? - jz __startDownload ; yup, start texture download - -__mmxAlignFifo: - - mov DWORD PTR [fifo], 0 ; write NULL packet - sub fRoom, 4 ; fifoRoom -= 4 - - mov [gc + fifoRoom], fRoom ; store new fifoRoom - add fifo, 4 ; fifoPtr += 4 - - 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|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 - - 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 - push @Line ; Line # inside this function - push 0h ; NULL file name - - push eax ; fifo space required - call __FifoMakeRoom ; make fifo room (if fifoPtr QWORD aligned before - - add esp, 12 ; pop 3 DWORD parameters to FifoMakeRoom -endif - mov fifo, [gc + fifoPtr] ; fifoPtr was modified by FifoMakeRoom, reload - - mov fRoom, [gc + fifoRoom] ; fifoRoom was modified by FifoMakeRoom, reload - mov curS, [esp + _maxS$] ; curS = maxS = width of scanline (bytes) - jmp __loopT ; we now have enough fifo room, write next scanline - -__dlDone: - - femms ; exit 3DNow!(tm) state - - 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 24 ; pop 6 DWORD parameters and return - -__grTexDownload_3DNow_MMX@24 ENDP - -_TEXT ENDS - -END diff --git a/glide2x/h3/glide/src/xtexdl_def.c b/glide2x/h3/glide/src/xtexdl_def.c deleted file mode 100644 index 4c345e1..0000000 --- a/glide2x/h3/glide/src/xtexdl_def.c +++ /dev/null @@ -1,369 +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:31 joseph -** Initial checkin into SourceForge. -** -** -** 3 3/17/99 6:17p Dow -** Phantom Menace and other fixes. -** -** 5 2/18/99 5:28p Peter -** download/source for everything -** -** 4 2/10/99 2:01p Peter -** cleanup small mip downloads w/ fewer tetsts -** -** 3 2/02/99 4:36p Peter -** download through lfb rather than texture port -** -** 2 12/03/98 2:56p Atai -** fixed 16_1 texture download -** -** 1 10/09/98 6:48p Peter -** base texture download procs -** -** 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 -#include -#include "fxglide.h" - -/* Because this is uma the memory controller can eitehr direct the - * download indirectly via the texture port which is offset from the - * hw address in texBaseAddr or we can try to address the bits - * directly via 2d lfb accesses. - */ -#define PACKET5_MODE SSTCP_PKT5_LFB - -void FX_CSTYLE -_grTexDownload_Default_8_1(struct GrGC_s* gc, const FxU32 tmuBaseAddr, - const FxI32 maxS, const FxI32 minT, const FxI32 maxT, - void* texData) -{ -#define FN_NAME "_grTexDownload_Default_8_1" -#define kTexelAlignShift 0x02UL - const FxU8 - *src8 = (const FxU8*)texData; - const FxI32 - endTAligned = ((maxT + 1) & ~((0x01UL << kTexelAlignShift) - 1UL)); - FxI32 - t = minT; - FxU32 - tex_address = tmuBaseAddr + (t * 1UL); - - for(; t < endTAligned; t += (0x01UL << kTexelAlignShift)) { - LINEAR_WRITE_BEGIN(1, PACKET5_MODE, (FxU32)tex_address, 0x00UL, 0x00UL); - LINEAR_WRITE_SET(tex_address, *(const FxU32*)src8); - LINEAR_WRITE_END(); - - src8 += 4; - tex_address += sizeof(FxU32); - } - - /* Copy any remaining stuff if any. There can be at most 3 scanlines - * each 1 texel wide, but we don't want to whack any other texture - * data so we have to make sure that we're setting the w0 write mask - * along w/ the shifting for the data. - */ - if (endTAligned < maxT + 1) { - FxU32 - texData = 0x00UL, - texMask = 0x0FUL, - texShift = 0UL; - FxI32 - shiftTexel = 0; - FxU32 - shiftData = 0, - shiftMask = 0; - - for(; t <= maxT; t++) { - texData |= (*src8++ << (texShift << 3UL)); - texMask ^= (0x01UL << texShift); - - texShift++; - } - GR_ASSERT(texShift <= 4); - - /* W/ really small lod levels the download address can be - * unaligned for packet5. This is bad since the address gets - * truncated. Do even more magic bit twiddling here to convert the - * whole word into aligned writes w/ the right byte masks again. - */ - { - const FxU32 - texAddrSlop = (tex_address & 0x03UL); - - if (texAddrSlop != 0x00UL) { - tex_address &= ~0x03UL; - - shiftTexel = (texShift - texAddrSlop); - if (shiftTexel > 0) { - shiftMask = (((texMask >> texAddrSlop) | (0x0FUL << shiftTexel)) & 0x0FUL); - shiftData = (texData >> (texAddrSlop << 0x03UL)); - } - - texMask = (((texMask << texAddrSlop) | (0x0FUL >> (0x04UL - texAddrSlop))) & 0x0FUL); - texData = (texData << (texAddrSlop << 0x03UL)); - } - } - - LINEAR_WRITE_BEGIN(1, PACKET5_MODE, (FxU32)tex_address, texMask, 0x00UL); - LINEAR_WRITE_SET(tex_address, texData); - LINEAR_WRITE_END(); - - if (shiftTexel > 0) { - LINEAR_WRITE_BEGIN(1, PACKET5_MODE, (FxU32)tex_address + 0x04UL, shiftMask, 0x00UL); - LINEAR_WRITE_SET(tex_address + 0x04UL, shiftData); - LINEAR_WRITE_END(); - } - } -#undef kTexelAlignShift -#undef FN_NAME -} - -void FX_CSTYLE -_grTexDownload_Default_8_2(struct GrGC_s* gc, const FxU32 tmuBaseAddr, - const FxI32 maxS, const FxI32 minT, const FxI32 maxT, - void* texData) -{ -#define FN_NAME "_grTexDownload_Default_8_2" -#define kTexelAlignShift 0x01UL - const FxU8 - *src8 = (const FxU8*)texData; - const FxI32 - endTAligned = ((maxT + 1) & ~((0x01UL << kTexelAlignShift) - 1UL)); - FxI32 - t = minT; - FxU32 - tex_address = tmuBaseAddr + (t << 1UL); - - for(; t < endTAligned; t += (0x01UL << kTexelAlignShift)) { - LINEAR_WRITE_BEGIN(1, PACKET5_MODE, (FxU32)tex_address, 0x00UL, 0x00UL); - LINEAR_WRITE_SET(tex_address, *(const FxU32*)src8); - LINEAR_WRITE_END(); - - src8 += 4; - tex_address += sizeof(FxU32); - } - - /* Copy any remaining stuff if any. There should only be one - * texture scanline left so we have to set the w0 write mask up so - * that we don't trash any other data. - */ - if (endTAligned < maxT + 1) { - const FxU32 - texData = ((*(src8 + 1) << 8) | - (*(src8 + 0) << 0)); - - GR_ASSERT(t == maxT); - - LINEAR_WRITE_BEGIN(1, PACKET5_MODE, (FxU32)tex_address, 0x0CUL, 0x00UL); - LINEAR_WRITE_SET(tex_address, texData); - LINEAR_WRITE_END(); - } -#undef kTexelAlignShift -#undef FN_NAME -} - -void FX_CSTYLE -_grTexDownload_Default_8_4(struct GrGC_s* gc, const FxU32 tmuBaseAddr, - const FxI32 maxS, const FxI32 minT, const FxI32 maxT, - void* texData) -{ -#define FN_NAME "_grTexDownload_Default_8_4" - const FxU8 - *src8 = (const FxU8*)texData; - FxI32 - t = minT; - - for (; t <= maxT; t++) { - FxU32 - tex_address = tmuBaseAddr + (t << 2UL); - FxI32 - s; - - LINEAR_WRITE_BEGIN(maxS, PACKET5_MODE, - (FxU32)tex_address, 0x00UL, 0x00UL); - - for (s = 0; s < maxS; s++ ) { - const FxU32 t0 = *(const FxU32*)src8; - - GDBG_INFO(195, "s = %d, t= %d, address = 0x%x\n", s, t, - (FxU32) tex_address - (FxU32) gc->tex_ptr + 0x200000); - - LINEAR_WRITE_SET_8(tex_address, t0); - - tex_address += 4; - src8 += 4; - } - - LINEAR_WRITE_END(); - } -#undef FN_NAME -} - -void FX_CSTYLE -_grTexDownload_Default_8_WideS(struct GrGC_s* gc, const FxU32 tmuBaseAddr, - const FxI32 maxS, const FxI32 minT, const FxI32 maxT, - void* texData) -{ -#define FN_NAME "_grTexDownload_Default_8_WideS" - const FxU8 - *src8 = (const FxU8*)texData; - FxI32 - t = minT; - - for (; t <= maxT; t++) { - FxU32 - tex_address = tmuBaseAddr + (t * (maxS << 2)); - FxI32 - s; - - LINEAR_WRITE_BEGIN(maxS, PACKET5_MODE, - (FxU32)tex_address, 0x00UL, 0x00UL); - for (s = 0; s < maxS; s += 2) { - const FxU32 - t0 = *(const FxU32*)(src8 + 0), - t1 = *(const FxU32*)(src8 + 4); - - GDBG_INFO(195, "s = %d, t= %d, address = 0x%x\n", s, t, - (FxU32) tex_address - (FxU32) gc->tex_ptr + 0x200000); - - LINEAR_WRITE_SET_8(tex_address + 0, t0); - LINEAR_WRITE_SET_8(tex_address + 4, t1); - - tex_address += 8; - src8 += 8; - } - - LINEAR_WRITE_END(); - } -#undef FN_NAME -} - -extern void FX_CSTYLE -_grTexDownload_Default_16_1(struct GrGC_s* gc, const FxU32 tmuBaseAddr, - const FxI32 maxS, const FxI32 minT, const FxI32 maxT, - void* texData) -{ -#define FN_NAME "_grTexDownload_Default_16_1" - const FxU16 - *src16 = (const FxU16*)texData; - const FxI32 - endTAligned = ((maxT + 1) & ~0x01UL); - FxI32 - t = minT; - FxU32 - tex_address = tmuBaseAddr + (t << 1UL); - - /* Do dword aligned writes */ - for (; t < endTAligned; t += 2) { - LINEAR_WRITE_BEGIN(1, PACKET5_MODE, (FxU32)tex_address, 0x00UL, 0x00UL); - LINEAR_WRITE_SET_16(tex_address, *(const FxU32*)src16); - LINEAR_WRITE_END(); - - src16 += 2; - tex_address += sizeof(FxU32); - } - - /* There can only be one line of slop so we deal w/ this by the bits - * of the w0 write mask so that other data does not get whacked in - * the process. - */ - if (endTAligned < maxT + 1) { - LINEAR_WRITE_BEGIN(1, PACKET5_MODE, (FxU32)tex_address, 0x0CUL, 0x00UL); - LINEAR_WRITE_SET(tex_address, (FxU32)(*src16)); - LINEAR_WRITE_END(); - } -#undef FN_NAME -} - -extern void FX_CSTYLE -_grTexDownload_Default_16_2(struct GrGC_s* gc, const FxU32 tmuBaseAddr, - const FxI32 maxS, const FxI32 minT, const FxI32 maxT, - void* texData) -{ -#define FN_NAME "_grTexDownload_Default_16_2" - const FxU16 - *src16 = (const FxU16*)texData; - FxI32 - t = minT; - FxU32 - tex_address = tmuBaseAddr + (t << 1UL); - - /* Copy things that are going to be dword aligned */ - for (; t <= maxT; t++) { - LINEAR_WRITE_BEGIN(1, PACKET5_MODE, (FxU32)tex_address, 0x00UL, 0x00UL); - LINEAR_WRITE_SET(tex_address, *(const FxU32*)src16); - LINEAR_WRITE_END(); - - src16 += 2; - tex_address += sizeof(FxU32); - } -#undef FN_NAME -} - -extern void FX_CSTYLE -_grTexDownload_Default_16_WideS(struct GrGC_s* gc, const FxU32 tmuBaseAddr, - const FxI32 maxS, const FxI32 minT, const FxI32 maxT, - void* texData) -{ -#define FN_NAME "_grTexDownload_Default_16_WideS" - const FxU16 - *src16 = (const FxU16*)texData; - FxI32 - t = minT; - - for (; t <= maxT; t++) { - FxU32 - tex_address = tmuBaseAddr + (t * (maxS << 2)); - FxI32 - s; - - LINEAR_WRITE_BEGIN(maxS, PACKET5_MODE, - (FxU32)tex_address, 0x00UL, 0x00UL); - for (s = 0; s < maxS; s += 2) { - const FxU32 t0 = *(const FxU32*)(src16 + 0); - 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 + 0, t0); - LINEAR_WRITE_SET_16(tex_address + 4, t1); - - tex_address += 8; - src16 += 4; - } - - LINEAR_WRITE_END(); - } -#undef FN_NAME -} diff --git a/glide2x/h3/glide/tests/alpha.3df b/glide2x/h3/glide/tests/alpha.3df deleted file mode 100644 index e67fc8a..0000000 Binary files a/glide2x/h3/glide/tests/alpha.3df and /dev/null differ diff --git a/glide2x/h3/glide/tests/ap88.3df b/glide2x/h3/glide/tests/ap88.3df deleted file mode 100644 index f465e2d..0000000 Binary files a/glide2x/h3/glide/tests/ap88.3df and /dev/null differ diff --git a/glide2x/h3/glide/tests/argb1555.3df b/glide2x/h3/glide/tests/argb1555.3df deleted file mode 100644 index 98d7374..0000000 --- a/glide2x/h3/glide/tests/argb1555.3df +++ /dev/null @@ -1,806 +0,0 @@ -3df v1.1 -argb1555 -lod range: 1 256 -aspect ratio: 1 1 -)K)K559m5m5n5m11111L1L)K)K) -) -)K)K1L1L5m5mA°=¯AÐ=¯5595AïAïJFIðEðAðAðIðEðAðAðAðAðIðEðAðAðAðAðAðAðIðEðAðAð1Œ1Œ-*1*1L1L)K)K1L1L-l-l1L1L1L1L)K)K5m5m)K)K1L1L)K)K)K)K)K)K) -) -) -) -)K)K1L1L115n5m115595111L1L11111L1L)K)K) -) -)K)K) -) -)K)K11551*-*) -) -)K)K1L1L11-l-l1L1L) -) -)K)K)K)K1L1L55IðIð5559AðAðAïAïJFAðAðAðAðAðAðAðAðAïAïIðEðAðAðAðAðIðEðAðAð551L1L)K)K-*1*-l-l-*1*-l-l-l-l1L1L)K)K5m5m1L1L)K)K)K)K)K)K) -) -) -) -)K)K)K)K5m5m-l-l11559555111L1L551111AïAï-*1*)K)K)K)K) -) -)K)K559m5m5n5m11111L1L)K)K) -) -)K)K1L1L5m5mA°=¯AÐ=¯5595AïAïJFIðEðAðAðIðEðAðAðAðAðIðEðAðAðAðAðAðAðIðEðAðAð1Œ1Œ-*1*1L1L)K)K1L1L-l-l1L1L1L1L)K)K5m5m)K)K1L1L)K)K)K)K)K)K) -) -) -) -)K)K1L1L115n5m115595111L1L11111L1L)K)K) -) -)K)K) -) -)K)K11551*-*) -) -)K)K1L1L11-l-l1L1L) -) -)K)K)K)K1L1L55IðIð5559AðAðAïAïJFAðAðAðAðAðAðAðAðAïAïIðEðAðAðAðAðIðEðAðAð551L1L)K)K-*1*-l-l-*1*-l-l-l-l1L1L)K)K5m5m1L1L)K)K)K)K)K)K) -) -) -) -)K)K)K)K5m5m-l-l11559555111L1L551111AïAï-*1*)K)K)K)K) -) -1111--115k5k=Ž=Ž,ç,ç § §(¥(¥ § § ç ç § § ¥ ¥ Æ Æ Æ Æ(¥(¥ ç ç$Æ$Æ(ç(ç(ç(ç$Ç$Ç(ç(ç(ç(ç$Æ$Æ § § ¥ ¥ ¥ ¥(ç(ç § § ¥ ¥ § § Æ Æ$Æ$Æ,ç,ç5J5J55955k5k95=Œ=Œ5m5m=Œ=Œ=Ž=Ž=Ž=Ž55955k5k9m5m5Ž5955k5k9I5I11--5J5J5k5k9I5I5k5k9k5k5k5k9k5k5k5k9k5k5k5k95,Æ,Æ,¥,¥,Æ,Æ4ç4ç951)1),Æ,Æ † †(ç(ç § § ç ç Æ Æ$¥$¥ § § Æ Æ(¥(¥ ç ç(ç(ç(ç(ç(ç(ç(ç(ç$Æ$Æ(ç(ç$Æ$Æ § § „ „ ç ç(ç(ç$¥$¥$¥$¥ § § ç ç,Æ,Æ11=¯A°1Œ1Œ5m5m=Œ=Œ5k5k955Ž5=Œ=Œ=Ž=Ž5595=Œ=Œ5m5m=Ž=ŽNSN3=Ž=Ž5I5I9)5)111)1)5J5J5k5k9k5k5I5I9k5k5J5J5k5k9k5k1L1L1111--115k5k=Ž=Ž,ç,ç § §(¥(¥ § § ç ç § § ¥ ¥ Æ Æ Æ Æ(¥(¥ ç ç$Æ$Æ(ç(ç(ç(ç$Ç$Ç(ç(ç(ç(ç$Æ$Æ § § ¥ ¥ ¥ ¥(ç(ç § § ¥ ¥ § § Æ Æ$Æ$Æ,ç,ç5J5J55955k5k95=Œ=Œ5m5m=Œ=Œ=Ž=Ž=Ž=Ž55955k5k9m5m5Ž5955k5k9I5I11--5J5J5k5k9I5I5k5k9k5k5k5k9k5k5k5k9k5k5k5k95,Æ,Æ,¥,¥,Æ,Æ4ç4ç951)1),Æ,Æ † †(ç(ç § § ç ç Æ Æ$¥$¥ § § Æ Æ(¥(¥ ç ç(ç(ç(ç(ç(ç(ç(ç(ç$Æ$Æ(ç(ç$Æ$Æ § § „ „ ç ç(ç(ç$¥$¥$¥$¥ § § ç ç,Æ,Æ11=¯A°1Œ1Œ5m5m=Œ=Œ5k5k955Ž5=Œ=Œ=Ž=Ž5595=Œ=Œ5m5m=Ž=ŽNSN3=Ž=Ž5I5I9)5)111)1)5J5J5k5k9k5k5I5I9k5k5J5J5k5k9k5k1L1L(¥(¥ e …$„$„$„$„,é,é55(¥(¥$d$„ d „dddddcdcdd$„$d ¥ ¥$d$„dd „ ddd„cdddddddd„cdd „ „$¥$¥ d „dddd … e$„$„1)1)=Ž=Ž0ç0ç(¥(¥(¥(¥(¥(¥(¥(¥ § §,¥,¥0ç0ç,Æ,Æ$Ç$Ç0ç0ç0ç0ç1L1L1Œ1Œ(¥(¥(¥(¥ e …(¥(¥$„$„$„$d,¥,¥,¥,¥,¤,¤,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,Æ,Æ,Æ,Æ,Æ,Æ5m5m11dd „ d „ ddcdcdddd „ d$„$d ¥ ¥cd d „dd „ ddddddddd„cdddd$¥$¥dddddcdd(¥(¥,¥,¥5595,¥,¥ † †(¥(¥(¥(¥(¥(¥,¥,¥$Ç$Ç0Æ0Æ0ç0ç$Ç$Ç,Æ,Æ5)5)AòAñ--(¥(¥ d „(¥(¥(¥(¥$„$„,¥,¥,¤,¤,¥,¥,¤,¤,¥,¥,¥,¥,¥,¥,¥,¥(¥(¥ e …$„$„$„$„,é,é55(¥(¥$d$„ d „dddddcdcdd$„$d ¥ ¥$d$„dd „ ddd„cdddddddd„cdd „ „$¥$¥ d „dddd … e$„$„1)1)=Ž=Ž0ç0ç(¥(¥(¥(¥(¥(¥(¥(¥ § §,¥,¥0ç0ç,Æ,Æ$Ç$Ç0ç0ç0ç0ç1L1L1Œ1Œ(¥(¥(¥(¥ e …(¥(¥$„$„$„$d,¥,¥,¥,¥,¤,¤,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,Æ,Æ,Æ,Æ,Æ,Æ5m5m11dd „ d „ ddcdcdddd „ d$„$d ¥ ¥cd d „dd „ ddddddddd„cdddd$¥$¥dddddcdd(¥(¥,¥,¥5595,¥,¥ † †(¥(¥(¥(¥(¥(¥,¥,¥$Ç$Ç0Æ0Æ0ç0ç$Ç$Ç,Æ,Æ5)5)AòAñ--(¥(¥ d „(¥(¥(¥(¥$„$„,¥,¥,¤,¤,¥,¥,¤,¤,¥,¥,¥,¥,¥,¥,¥,¥,Æ,Æ,¥,¥ † † … e0ç0ç5m5m(¥(¥ d „dddc„d„ddddddd ¥ ¥ d „dddcdddd„ddd„d„„dddd¥¥dddddd„cdd(¥(¥5595$Ç$Ç(¥(¥ † †,¥,¥$Ç$Ç,Æ,Æ$Ç$Ç,Æ,Æ$Ç$Ç0ç0ç$Ç$Ç0Æ0Æ=Ž=Ž1L1L,Æ,Æ(¥(¥ † †(¥(¥ † †(¥(¥(¥(¥(¥(¥$d$„,¥,¥0Æ0Æ,Æ,Æ,Æ,Æ$Ç$Ç,Æ,Æ$Ç$Ç,¥,¥,Æ,Æ,Æ,Æ1L1L) -) -$d$„ d „dc„d„d„ddd „ ddd … ecddddc„ddddddd„ddd „ „dd¥¥ d „dd „ „dd … e,Æ,Æ5511 § §(¥(¥ § §,¥,¥$Ç$Ç0ç0ç$Ç$Ç0ç0ç$Ç$Ç,Æ,Æ,é,é5)5)A¯=°$Ç$Ç,¥,¥ § §(¥(¥ † †(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥,Æ,Æ(¥(¥,Æ,Æ,Æ,Æ,¥,¥ † † … e0ç0ç5m5m(¥(¥ d „dddc„d„ddddddd ¥ ¥ d „dddcdddd„ddd„d„„dddd¥¥dddddd„cdd(¥(¥5595$Ç$Ç(¥(¥ † †,¥,¥$Ç$Ç,Æ,Æ$Ç$Ç,Æ,Æ$Ç$Ç0ç0ç$Ç$Ç0Æ0Æ=Ž=Ž1L1L,Æ,Æ(¥(¥ † †(¥(¥ † †(¥(¥(¥(¥(¥(¥$d$„,¥,¥0Æ0Æ,Æ,Æ,Æ,Æ$Ç$Ç,Æ,Æ$Ç$Ç,¥,¥,Æ,Æ,Æ,Æ1L1L) -) -$d$„ d „dc„d„d„ddd „ ddd … ecddddc„ddddddd„ddd „ „dd¥¥ d „dd „ „dd … e,Æ,Æ5511 § §(¥(¥ § §,¥,¥$Ç$Ç0ç0ç$Ç$Ç0ç0ç$Ç$Ç,Æ,Æ,é,é5)5)A¯=°$Ç$Ç,¥,¥ § §(¥(¥ † †(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥,Æ,Æ(¥(¥,Æ,Æ,Æ,Æ † † … e „ „,é,é1Œ1Œ,¥,¥dddd„ddddc„ddd „ „ … edddd „ „„ddd„ddddd„„dd„„ … e$¥$¥dddd„„dd$¥$¥--550ç0ç$Ç$Ç,¥,¥$Ç$Ç § §,Æ,Æ$Ç$Ç0ç0ç$Ç$Ç,Æ,Æ$Ç$Ç0ç0ç=Ž=Ž55(¥(¥(¥(¥ † †(¥(¥ † †$Æ$Æ † †$Ç$Ç(¥(¥ § §,¥,¥ § §0ç0ç,é,é0ç0ç,é,é0ç0ç,é,é$Ç$Ç5n5m95 d „dd„ddddddcdddd „ „ „ „dd „ „„ddddd„ddd„„dddd¥¥ e … ¥ ¥dddcdd$¥$¥(¥(¥551*-*,Æ,Æ,Æ,Æ,¥,¥$Ç$Ç § §$Ç$Ç,Æ,Æ$Ç$Ç0ç0ç$Ç$Ç,Æ,Æ5J5J=¯A°,è,é(¥(¥ † † … e(¥(¥ † † § § † †$Ç$Ç(¥(¥,é,é(¥(¥ § §,Æ,Æ,Æ,Æ † † … e „ „,é,é1Œ1Œ,¥,¥dddd„ddddc„ddd „ „ … edddd „ „„ddd„ddddd„„dd„„ … e$¥$¥dddd„„dd$¥$¥--550ç0ç$Ç$Ç,¥,¥$Ç$Ç § §,Æ,Æ$Ç$Ç0ç0ç$Ç$Ç,Æ,Æ$Ç$Ç0ç0ç=Ž=Ž55(¥(¥(¥(¥ † †(¥(¥ † †$Æ$Æ † †$Ç$Ç(¥(¥ § §,¥,¥ § §0ç0ç,é,é0ç0ç,é,é0ç0ç,é,é$Ç$Ç5n5m95 d „dd„ddddddcdddd „ „ „ „dd „ „„ddddd„ddd„„dddd¥¥ e … ¥ ¥dddcdd$¥$¥(¥(¥551*-*,Æ,Æ,Æ,Æ,¥,¥$Ç$Ç § §$Ç$Ç,Æ,Æ$Ç$Ç0ç0ç$Ç$Ç,Æ,Æ5J5J=¯A°,è,é(¥(¥ † † … e(¥(¥ † † § § † †$Ç$Ç(¥(¥,é,é(¥(¥ § §,Æ,Æ(ç(ç$Ç$Ç † † … e1111,¥,¥dddd„d„ddddc„ddd „ „dd „ „dd„ddd„d…e„„„ddddd¥¥ e … ¥ ¥dddcdd(¥(¥,é,é5k5k,é,é0ç0ç$Ç$Ç,¥,¥$Ç$Ç § §,Æ,Æ$Ç$Ç,é,é$Ç$Ç0ç0ç,é,é5k5k1L1L$¥$¥f†d„d„e…e…¥¥ † † † †,¥,¥$Ç$Ç0ç0ç$Ç$Ç,é,é,ç,ç,é,é(ç(ç,é,é,ç,ç5m5m1*-*$d$„dddddc„d„ddddddd „ „dddddd„ddd„d„„„ddd „ „dd¥¥ e …c„dddd¥¥(¥(¥5m5m11,é,é0ç0ç § §$Æ$Æ$Ç$Ç,¥,¥$Ç$Ç,é,é,¥,¥$Ç$Ç,é,é5)5)A¯=° ¦ §¥¥e…d„d„e…¥¥e… † † § §,ç,ç$Ç$Ç,¥,¥,é,é(ç(ç$Ç$Ç † † … e1111,¥,¥dddd„d„ddddc„ddd „ „dd „ „dd„ddd„d…e„„„ddddd¥¥ e … ¥ ¥dddcdd(¥(¥,é,é5k5k,é,é0ç0ç$Ç$Ç,¥,¥$Ç$Ç § §,Æ,Æ$Ç$Ç,é,é$Ç$Ç0ç0ç,é,é5k5k1L1L$¥$¥f†d„d„e…e…¥¥ † † † †,¥,¥$Ç$Ç0ç0ç$Ç$Ç,é,é,ç,ç,é,é(ç(ç,é,é,ç,ç5m5m1*-*$d$„dddddc„d„ddddddd „ „dddddd„ddd„d„„„ddd „ „dd¥¥ e …c„dddd¥¥(¥(¥5m5m11,é,é0ç0ç § §$Æ$Æ$Ç$Ç,¥,¥$Ç$Ç,é,é,¥,¥$Ç$Ç,é,é5)5)A¯=° ¦ §¥¥e…d„d„e…¥¥e… † † § §,ç,ç$Ç$Ç,¥,¥,é,é,ç,ç § § e …$„$„--55,¥,¥dddddd„d„ddcdddddd „ „dddcdddd„cdddd „ „dddcdd$¥$¥$d$„dd„c … e$„$d,ç,ç1Œ1Œ55,é,é0ç0ç § §$Ç$Ç$Ç$Ç,é,é0ç0ç$Ç$Ç0ç0ç$Ç$Ç0Æ0Æ-*1*-*1*d„e…ÆÆ dde…e…f†d„d„dd † † § §(ç(ç$Æ$Æ$Ç$Ç$¥$¥ § § § §,Æ,Æ11--$c$„ d „dddc„d„d „ ddcdd „ „dd„„dcdd„cdddd „ „dddddc$¥$¥ e …c„dd„c$„$„(¥(¥1L1L1)1)55$Ç$Ç0ç0ç$Ç$Ç$Ç$Ç$Ç$Ç,é,é0ç0ç$Ç$Ç,é,é,Æ,Æ5595¥¥e…f†e…e…e…e…e…d„dd ç çdd…e(ç(ç,ç,ç § § e …$„$„--55,¥,¥dddddd„d„ddcdddddd „ „dddcdddd„cdddd „ „dddcdd$¥$¥$d$„dd„c … e$„$d,ç,ç1Œ1Œ55,é,é0ç0ç § §$Ç$Ç$Ç$Ç,é,é0ç0ç$Ç$Ç0ç0ç$Ç$Ç0Æ0Æ-*1*-*1*d„e…ÆÆ dde…e…f†d„d„dd † † § §(ç(ç$Æ$Æ$Ç$Ç$¥$¥ § § § §,Æ,Æ11--$c$„ d „dddc„d„d „ ddcdd „ „dd„„dcdd„cdddd „ „dddddc$¥$¥ e …c„dd„c$„$„(¥(¥1L1L1)1)55$Ç$Ç0ç0ç$Ç$Ç$Ç$Ç$Ç$Ç,é,é0ç0ç$Ç$Ç,é,é,Æ,Æ5595¥¥e…f†e…e…e…e…e…d„dd ç çdd…e(ç(ç,Æ,Æ § §$Æ$Æ † †,é,é55,é,é § §¥¥e…dd„d…e„ddddc„ddcdddd„„dddd„„¥¥e…dd†f † †¥¥e… § § § §$Æ$Æ-*1*1L1L$Ç$Ç § §$Æ$Æ$Ç$Ç0ç0ç § §,Æ,Æ § §$Ç$Ç,¥,¥ † † § §=Œ=Œ55cd¥¥$Ç$Ç † † … e „ „¥¥ † † … e ¥ ¥,Æ,Æ$Ç$Ç † †$Æ$Æ † †$¥$¥ † †¥¥$Ç$Ç111L1L § §$¥$¥e…e…d„dd„d„ddddc„cdc„ddd„ddd„„†f¥¥d„e… † † … e†f § § § § § §,é,é-l-l,é,é § § § §(ç(ç$Ç$Ç,Æ,Æ$Ç$Ç,¥,¥$Ç$Ç § § § §(¥(¥11AòAñÆÆe…(ç(ç § § „ „¥¥ e …¥¥ e … ¥ ¥(¥(¥ † †¥¥ † †,Æ,Æ § §$Æ$Æ † †,é,é55,é,é § §¥¥e…dd„d…e„ddddc„ddcdddd„„dddd„„¥¥e…dd†f † †¥¥e… § § § §$Æ$Æ-*1*1L1L$Ç$Ç § §$Æ$Æ$Ç$Ç0ç0ç § §,Æ,Æ § §$Ç$Ç,¥,¥ † † § §=Œ=Œ55cd¥¥$Ç$Ç † † … e „ „¥¥ † † … e ¥ ¥,Æ,Æ$Ç$Ç † †$Æ$Æ † †$¥$¥ † †¥¥$Ç$Ç111L1L § §$¥$¥e…e…d„dd„d„ddddc„cdc„ddd„ddd„„†f¥¥d„e… † † … e†f § § § § § §,é,é-l-l,é,é § § § §(ç(ç$Ç$Ç,Æ,Æ$Ç$Ç,¥,¥$Ç$Ç § § § §(¥(¥11AòAñÆÆe…(ç(ç § § „ „¥¥ e …¥¥ e … ¥ ¥(¥(¥ † †¥¥ † †=Ž=Ž5k5k955k5k95=Ž=Ž551*-*1L1L1L1L-*1*) -) -1*-*)K)K-*1*1Œ1Œ-*1*)K)K-*1*)K)K-*1*-*1*)J)J1L1L-*1*1Œ1Œ1L1L5Œ5Œ95=Ž=Ž=Ž=Ž559Ž5551Œ1Œ551L1L1L1L%%,é,é-*1*) -) -)K)K,é,é)K)K1L1L)K)K1L1L=¯A°AðAð551L1L559k5k=Œ=Œ=Ž=Ž=Ž=Ž=¯A°=ÏA°9Œ=ŒAðAðIðEðAðAðAðAð=¯A°=Œ=Œ555955=Ž=Ž=Œ=Œ1L1L1L1L1L1L-*1*-)-))K)K-*1*-*1*1L1L-l-l-*1*-*1*-*1*)K)K-*1*)K)K5J5J-*1*1L1L-l-l5k5k95AðAð5Œ5Œ955Ž5951L1L=Ž=Ž551L1L-)-)%%) -) -1*-*1*-*) -) -) -) --l-l-*1*1L1L11AðAð=Ž=Ž1Œ1Œ1L1L=Ž=Ž5k5k=Ž=Ž=Ž=Ž=¯A°=ÏA°9Œ=Œ=¯A°EðIð=¯A°=Ï=°=Ž=Ž5k5k955k5k95=Ž=Ž551*-*1L1L1L1L-*1*) -) -1*-*)K)K-*1*1Œ1Œ-*1*)K)K-*1*)K)K-*1*-*1*)J)J1L1L-*1*1Œ1Œ1L1L5Œ5Œ95=Ž=Ž=Ž=Ž559Ž5551Œ1Œ551L1L1L1L%%,é,é-*1*) -) -)K)K,é,é)K)K1L1L)K)K1L1L=¯A°AðAð551L1L559k5k=Œ=Œ=Ž=Ž=Ž=Ž=¯A°=ÏA°9Œ=ŒAðAðIðEðAðAðAðAð=¯A°=Œ=Œ555955=Ž=Ž=Œ=Œ1L1L1L1L1L1L-*1*-)-))K)K-*1*-*1*1L1L-l-l-*1*-*1*-*1*)K)K-*1*)K)K5J5J-*1*1L1L-l-l5k5k95AðAð5Œ5Œ955Ž5951L1L=Ž=Ž551L1L-)-)%%) -) -1*-*1*-*) -) -) -) --l-l-*1*1L1L11AðAð=Ž=Ž1Œ1Œ1L1L=Ž=Ž5k5k=Ž=Ž=Ž=Ž=¯A°=ÏA°9Œ=Œ=¯A°EðIð=¯A°=Ï=°$¥$¥$¥$¥(¥(¥(¥(¥(¥(¥(¥(¥$„$„dd$¥$¥ ¥ ¥ ¥ ¥ e …$¥$¥(¥(¥11-*1* ç ç0Æ0Æ(¥(¥(¥(¥,¥,¥,Æ,Æ,¥,¥(¥(¥$¥$¥(¥(¥(¥(¥(ç(ç$ç$ç1L1L--(ç(ç(¥(¥,Æ,Æ § §(¥(¥(¥(¥ † †$Æ$Æ § § Æ Æ$Æ$Æ$Ç$Ç(ç(ç,ç,ç,é,é11(ç(ç,ç,ç,é,é))----,é,é,ç,ç-----*1*5J5J1111,ç,ç----,ç,ç,Æ,Æ,Æ,Æ,Æ,Æ(¥(¥(¥(¥(¥(¥dd ¥ ¥$„$„ † †$¥$¥ e …(¥(¥,Æ,Æ1L1L$ç$ç(ç(ç,¥,¥(¥(¥(¥(¥,Æ,Æ,¥,¥,Æ,Æ ¥ ¥$¥$¥(¥(¥(¥(¥(ç(ç)K)K1)1),ç,ç,Æ,Æ$Æ$Æ,Æ,Æ § §$¥$¥(¥(¥ § §(¥(¥ § § § §(ç(ç$Æ$Æ,é,é,ç,ç,é,é,ç,ç)),ç,ç,é,é-)-)-)-),ç,ç))----111L1L1111 § § „ „ Æ Æ$¥$¥$¥$¥(¥(¥(¥(¥(¥(¥(¥(¥$„$„dd$¥$¥ ¥ ¥ ¥ ¥ e …$¥$¥(¥(¥11-*1* ç ç0Æ0Æ(¥(¥(¥(¥,¥,¥,Æ,Æ,¥,¥(¥(¥$¥$¥(¥(¥(¥(¥(ç(ç$ç$ç1L1L--(ç(ç(¥(¥,Æ,Æ § §(¥(¥(¥(¥ † †$Æ$Æ § § Æ Æ$Æ$Æ$Ç$Ç(ç(ç,ç,ç,é,é11(ç(ç,ç,ç,é,é))----,é,é,ç,ç-----*1*5J5J1111,ç,ç----,ç,ç,Æ,Æ,Æ,Æ,Æ,Æ(¥(¥(¥(¥(¥(¥dd ¥ ¥$„$„ † †$¥$¥ e …(¥(¥,Æ,Æ1L1L$ç$ç(ç(ç,¥,¥(¥(¥(¥(¥,Æ,Æ,¥,¥,Æ,Æ ¥ ¥$¥$¥(¥(¥(¥(¥(ç(ç)K)K1)1),ç,ç,Æ,Æ$Æ$Æ,Æ,Æ § §$¥$¥(¥(¥ § §(¥(¥ § § § §(ç(ç$Æ$Æ,é,é,ç,ç,é,é,ç,ç)),ç,ç,é,é-)-)-)-),ç,ç))----111L1L1111 § § „ „ Æ Ædd…e … e † † … e … edd¥¥dd … e … e „ „$¥$¥ † †5511,Æ,Æ,¥,¥0Æ0Æ,¥,¥,Æ,Æ,Æ,Æ0ç0ç,Æ,Æ § §(ç(ç Æ Æ$¥$¥$Ç$Ç1Ž1-- § §(¥(¥ † †$¥$¥ e …¥¥ † † … e ¥ ¥dd † †$¥$¥ † †(¥(¥ † †(¥(¥ † † § § ¥ ¥ e … „ „dd † † § § § §,¥,¥,é,é--,¥,¥ † †,¥,¥ † †(¥(¥ † †(¥(¥ e … e …(¥(¥ e …dd¥¥dd … edd¥¥ † †(¥(¥,Æ,Æ55--,¥,¥,Æ,Æ,¥,¥0ç0ç,¥,¥$Ç$Ç,Æ,Æ(ç(ç,Æ,Æ$Æ$Æ § § § §1L1L-*1*$Æ$Æ † † § § e …(¥(¥ e …¥¥ † †dd¥¥ † † † † … e$¥$¥$¥$¥$¥$¥ † †$Æ$Æ † †$¥$¥e…dd … e † † § §(¥(¥,Æ,Æ11$Ç$Ç(¥(¥ d „dd…edd…e … e † † … e … edd¥¥dd … e … e „ „$¥$¥ † †5511,Æ,Æ,¥,¥0Æ0Æ,¥,¥,Æ,Æ,Æ,Æ0ç0ç,Æ,Æ § §(ç(ç Æ Æ$¥$¥$Ç$Ç1Ž1-- § §(¥(¥ † †$¥$¥ e …¥¥ † † … e ¥ ¥dd † †$¥$¥ † †(¥(¥ † †(¥(¥ † † § § ¥ ¥ e … „ „dd † † § § § §,¥,¥,é,é--,¥,¥ † †,¥,¥ † †(¥(¥ † †(¥(¥ e … e …(¥(¥ e …dd¥¥dd … edd¥¥ † †(¥(¥,Æ,Æ55--,¥,¥,Æ,Æ,¥,¥0ç0ç,¥,¥$Ç$Ç,Æ,Æ(ç(ç,Æ,Æ$Æ$Æ § § § §1L1L-*1*$Æ$Æ † † § § e …(¥(¥ e …¥¥ † †dd¥¥ † † † † … e$¥$¥$¥$¥$¥$¥ † †$Æ$Æ † †$¥$¥e…dd … e † † § §(¥(¥,Æ,Æ11$Ç$Ç(¥(¥ d „dd…edd „ „ … e „ „¥¥ e …„„…e¥¥dd¥¥ † † … e,Æ,Æ111L1L e …,¥,¥,Æ,Æ0ç0ç,Æ,Æ,Æ,Æ,Æ,Æ0ç0ç$Ç$Ç(ç(ç § §$Ç$Ç ç ç1L1L0ç0ç$Æ$Æ † †$¥$¥ † † … e … e$¥$¥ e …¥¥ e …¥¥ † †(¥(¥ † †(¥(¥ † † § §(¥(¥ † †$¥$¥f†¥¥ † †$¥$¥ † †(¥(¥0Æ0Æ,é,é § §,¥,¥$Ç$Ç † †,¥,¥ † †(¥(¥ e … e …„„ … edd…e¥¥dd¥¥ † † … e$¥$¥$Ç$Ç5n5m$Æ$Æ,¥,¥,Æ,Æ,Æ,Æ,Æ,Æ0Æ0Æ0Æ0Æ0ç0ç,Æ,Æ$Ç$Ç$Ç$Ç$Ç$ÇÆÆ-)-)5J5J$Ç$Ç † †(¥(¥ e …¥¥ † † … e ¥ ¥dd$¥$¥ e …¥¥(¥(¥ † †(¥(¥ † † § §(¥(¥ e … † † † †„„ † † † †$¥$¥ † †,Æ,Æ,é,é,¥,¥$Ç$Ç,¥,¥ † †dddd „ „ … e „ „¥¥ e …„„…e¥¥dd¥¥ † † … e,Æ,Æ111L1L e …,¥,¥,Æ,Æ0ç0ç,Æ,Æ,Æ,Æ,Æ,Æ0ç0ç$Ç$Ç(ç(ç § §$Ç$Ç ç ç1L1L0ç0ç$Æ$Æ † †$¥$¥ † † … e … e$¥$¥ e …¥¥ e …¥¥ † †(¥(¥ † †(¥(¥ † † § §(¥(¥ † †$¥$¥f†¥¥ † †$¥$¥ † †(¥(¥0Æ0Æ,é,é § §,¥,¥$Ç$Ç † †,¥,¥ † †(¥(¥ e … e …„„ … edd…e¥¥dd¥¥ † † … e$¥$¥$Ç$Ç5n5m$Æ$Æ,¥,¥,Æ,Æ,Æ,Æ,Æ,Æ0Æ0Æ0Æ0Æ0ç0ç,Æ,Æ$Ç$Ç$Ç$Ç$Ç$ÇÆÆ-)-)5J5J$Ç$Ç † †(¥(¥ e …¥¥ † † … e ¥ ¥dd$¥$¥ e …¥¥(¥(¥ † †(¥(¥ † † § §(¥(¥ e … † † † †„„ † † † †$¥$¥ † †,Æ,Æ,é,é,¥,¥$Ç$Ç,¥,¥ † †dddd†fdd¥¥dd…edd¥¥ e …e… „ „¥¥ e …$¥$¥) -) -1L1Lc„,Æ,Æ0Æ0Æ,Æ,Æ0Æ0Æ0Æ0Æ0ç0ç0Æ0Æ$Ç$Ç(ç(ç$Ç$Ç § §-)-)-*1*,é,é$¥$¥ † † † †$¥$¥ e …¥¥ e …¥¥ e …¥¥ † † † † § §$„$„ † †$¥$¥ † † § § e …¥¥dd¥¥ † † † †(¥(¥ § §0Æ0Æ11$Ç$Ç(¥(¥ § §(¥(¥ † † § §$„$„ … e…edd¥¥dd†f „ „…e … e „ „¥¥ † †,¥,¥5m5m † †(¥(¥,Æ,Æ,Æ,Æ0Æ0Æ0Æ0Æ0ç0ç0ç0ç0ç0ç § §,ç,ç Æ Æ † †)K)K11$Ç$Ç † † † † ¥ ¥ † †dd$¥$¥ e …¥¥ e …¥¥ † † § §(¥(¥ † † † †$¥$¥ † † † †¥¥ e …e… Æ Æ † †(¥(¥ † †,¥,¥-*1*$Ç$Ç,¥,¥ † †dd … edd†fdd¥¥dd…edd¥¥ e …e… „ „¥¥ e …$¥$¥) -) -1L1Lc„,Æ,Æ0Æ0Æ,Æ,Æ0Æ0Æ0Æ0Æ0ç0ç0Æ0Æ$Ç$Ç(ç(ç$Ç$Ç § §-)-)-*1*,é,é$¥$¥ † † † †$¥$¥ e …¥¥ e …¥¥ e …¥¥ † † † † § §$„$„ † †$¥$¥ † † § § e …¥¥dd¥¥ † † † †(¥(¥ § §0Æ0Æ11$Ç$Ç(¥(¥ § §(¥(¥ † † § §$„$„ … e…edd¥¥dd†f „ „…e … e „ „¥¥ † †,¥,¥5m5m † †(¥(¥,Æ,Æ,Æ,Æ0Æ0Æ0Æ0Æ0ç0ç0ç0ç0ç0ç § §,ç,ç Æ Æ † †)K)K11$Ç$Ç † † † † ¥ ¥ † †dd$¥$¥ e …¥¥ e …¥¥ † † § §(¥(¥ † † † †$¥$¥ † † † †¥¥ e …e… Æ Æ † †(¥(¥ † †,¥,¥-*1*$Ç$Ç,¥,¥ † †dd … edd„„dd†fdd „ „„d…e … e„„ … e¥¥e… † †,é,é-l-l,Æ,Æ0ç0ç0Æ0Æ4ç4ç======5595 § §$Æ$Æ Æ Æ,é,é1L1L(ç(ç$¥$¥ † †$¥$¥ † †…e … e¥¥e…$¥$¥ † †¥¥ † †(¥(¥ † †$¥$¥ † † † †$¥$¥ e …¥¥dd„d † †$¥$¥ † †,¥,¥,é,é) -) -,¥,¥ § §(¥(¥ † †(¥(¥ § §(¥(¥e…dd¥¥dddd„„…e¥¥ e …dd … e¥¥$Ç$Ç1L1L,é,é,Å,Å4ç4ç954ç4ç====0ç0ç4ç4ç(ç(ç § § § §$Ç$Ç1L1L,é,é$¥$¥ † †$¥$¥ e …¥¥e… e … e …¥¥ † † … e † †$¥$¥ † † † †$¥$¥ † † § § † †dd¥¥dd¥¥ † †(¥(¥(¥(¥,Æ,Æ-*1*,é,é(¥(¥ e …dd „ „dd„„dd†fdd „ „„d…e … e„„ … e¥¥e… † †,é,é-l-l,Æ,Æ0ç0ç0Æ0Æ4ç4ç======5595 § §$Æ$Æ Æ Æ,é,é1L1L(ç(ç$¥$¥ † †$¥$¥ † †…e … e¥¥e…$¥$¥ † †¥¥ † †(¥(¥ † †$¥$¥ † † † †$¥$¥ e …¥¥dd„d † †$¥$¥ † †,¥,¥,é,é) -) -,¥,¥ § §(¥(¥ † †(¥(¥ § §(¥(¥e…dd¥¥dddd„„…e¥¥ e …dd … e¥¥$Ç$Ç1L1L,é,é,Å,Å4ç4ç954ç4ç====0ç0ç4ç4ç(ç(ç § § § §$Ç$Ç1L1L,é,é$¥$¥ † †$¥$¥ e …¥¥e… e … e …¥¥ † † … e † †$¥$¥ † † † †$¥$¥ † † § § † †dd¥¥dd¥¥ † †(¥(¥(¥(¥,Æ,Æ-*1*,é,é(¥(¥ e …dd „ „dd „ „dddd „ „dddd„„„d … e„„ … e$¥$¥$¥$¥,é,é1L1L(ç(ç(ç(ç § §,é,é11==,é,é0Æ0Æ0ç0ç e …¥¥ † †)K)K-)-)$¥$¥ † †(¥(¥ † † … e „ „…e$¥$¥e… e …¥¥ † † … e(¥(¥ † †(¥(¥ † †$¥$¥ † † … e…e$¥$¥ e … † †$¥$¥ § §(¥(¥0Æ0Æ1L1L,¥,¥(¥(¥ § § † †(¥(¥ † † † †$„$d„cdd$¥$¥d„dddd…e „ „¥¥ † † † †,¥,¥-l-l,é,é(ç(ç$Ç$Ç,Æ,Æ,é,é559555,é,é § §ddÆÆ¥¥)K)K$Æ$Æ § §(¥(¥ e …¥¥ † †dd¥¥ † †dd¥¥$¥$¥ e …$¥$¥ † †(¥(¥ † †$¥$¥ † † … e „ „¥¥ † † … e$¥$¥ † †(¥(¥,¥,¥-*1*,é,é(¥(¥(¥(¥dddddd „ „dddd „ „dddd„„„d … e„„ … e$¥$¥$¥$¥,é,é1L1L(ç(ç(ç(ç § §,é,é11==,é,é0Æ0Æ0ç0ç e …¥¥ † †)K)K-)-)$¥$¥ † †(¥(¥ † † … e „ „…e$¥$¥e… e …¥¥ † † … e(¥(¥ † †(¥(¥ † †$¥$¥ † † … e…e$¥$¥ e … † †$¥$¥ § §(¥(¥0Æ0Æ1L1L,¥,¥(¥(¥ § § † †(¥(¥ † † † †$„$d„cdd$¥$¥d„dddd…e „ „¥¥ † † † †,¥,¥-l-l,é,é(ç(ç$Ç$Ç,Æ,Æ,é,é559555,é,é § §ddÆÆ¥¥)K)K$Æ$Æ § §(¥(¥ e …¥¥ † †dd¥¥ † †dd¥¥$¥$¥ e …$¥$¥ † †(¥(¥ † †$¥$¥ † † … e „ „¥¥ † † … e$¥$¥ † †(¥(¥,¥,¥-*1*,é,é(¥(¥(¥(¥dddd † † † †ÆÆ † †¥¥¥¥¥¥¥¥ Æ Æf† † † Æ Æ † † § §) -) -)K)Kd„d„dcd cdde…f†d„e…%%) -) - ç ç1L1L)K)K † ††f † ††fÆÆe…e…dd„d…e … e†f § §¥¥ † † † † † † † † … e ¥ ¥dddd¥¥ † † § §,Æ,Æ$Ç$Ç,é,é5m5m) -) -,é,é$Ç$Ç,é,é$Ç$Ç$Ç$Ç$Ç$Ç † † § § ç 祥 e …ÆÆd„dd¥¥ † † † † § §$Ç$Ç-l-l ç çddd„ C C„d„d†fddd„ § §!!!!%%5m5m § § † ††f Æ Æf†e… e …dddd†fdd†f § § † † † †¥¥ † † † †$„$„ … e…edddd Æ Æ § §$Ç$Ç § §$Ç$Ç1L1L1L1L$Ç$Ç,é,é$Ç$Ç$Ç$Ç † † † †ÆÆ † †¥¥¥¥¥¥¥¥ Æ Æf† † † Æ Æ † † § §) -) -)K)Kd„d„dcd cdde…f†d„e…%%) -) - ç ç1L1L)K)K † ††f † ††fÆÆe…e…dd„d…e … e†f § §¥¥ † † † † † † † † … e ¥ ¥dddd¥¥ † † § §,Æ,Æ$Ç$Ç,é,é5m5m) -) -,é,é$Ç$Ç,é,é$Ç$Ç$Ç$Ç$Ç$Ç † † § § ç 祥 e …ÆÆd„dd¥¥ † † † † § §$Ç$Ç-l-l ç çddd„ C C„d„d†fddd„ § §!!!!%%5m5m § § † ††f Æ Æf†e… e …dddd†fdd†f § § † † † †¥¥ † † † †$„$„ … e…edddd Æ Æ § §$Ç$Ç § §$Ç$Ç1L1L1L1L$Ç$Ç,é,é$Ç$Ç$Ç$Ç551Œ1Œ559k5k1L1LAðAð1Œ1Œ-*1*1Œ1Œ5J5J-*1*) -) -1L1L1L1L1Œ1Œ551*-*) -) -)K)K%%-*1*1L1L1Œ1Œ5m5mA°=¯AðAð5595=Ž=Ž=Ž=Ž5Œ5Œ=Ž=Ž559Œ5Œ55A¯=°591Œ1Œ5m5m1Œ1Œ1L1LIðEð5595559Ž5551L1L5k5k95AðAð5511=Ž=ŽAðAð55=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=¯A°=ÏA°9Ž=Ž=Œ=Œ1L1L5J5J5J5J1L1L5J5J$Ç$Ç) -) -)K)K-*1*-*1*1L1L-l-l551L1L) -) -)K)K%%) -) --l-l1L1L1155AðAð=¯A°=Ž=Ž=Ž=Ž=Ž=Ž5Œ5Œ=Ž=Ž5Œ5Œ9555=Ž=ŽAðAð-l-l1Œ1Œ111L1L=ï=ïAðAð1Œ1Œ559m5m5Ž59m5m1L1L55AðAðAðAð-l-l55A¯=°=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=¯A°=Ž=Ž=Ž=Ž=Ž=Ž=¯A°591Œ1Œ559k5k1L1LAðAð1Œ1Œ-*1*1Œ1Œ5J5J-*1*) -) -1L1L1L1L1Œ1Œ551*-*) -) -)K)K%%-*1*1L1L1Œ1Œ5m5mA°=¯AðAð5595=Ž=Ž=Ž=Ž5Œ5Œ=Ž=Ž559Œ5Œ55A¯=°591Œ1Œ5m5m1Œ1Œ1L1LIðEð5595559Ž5551L1L5k5k95AðAð5511=Ž=ŽAðAð55=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=¯A°=ÏA°9Ž=Ž=Œ=Œ1L1L5J5J5J5J1L1L5J5J$Ç$Ç) -) -)K)K-*1*-*1*1L1L-l-l551L1L) -) -)K)K%%) -) --l-l1L1L1155AðAð=¯A°=Ž=Ž=Ž=Ž=Ž=Ž5Œ5Œ=Ž=Ž5Œ5Œ9555=Ž=ŽAðAð-l-l1Œ1Œ111L1L=ï=ïAðAð1Œ1Œ559m5m5Ž59m5m1L1L55AðAðAðAð-l-l55A¯=°=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=¯A°=Ž=Ž=Ž=Ž=Ž=Ž=¯A°,Æ,Æ,Æ,Æ,Æ,Æ,Æ,Æ(ç(ç=¯A°1L1L e …$¥$¥$„$„ … e¥¥$¥$¥ § §(¥(¥ † †(ç(ç$Æ$Æ$Ç$Ç,Æ,Æ § §$Ç$Ç(ç(ç(ç(ç(ç(ç(ç(ç(¥(¥$¥$¥$¥$¥ Æ Æ$Æ$Æ(¥(¥(ç(ç0ç0ç(¥(¥5k5kIðIð11$Ç$Ç$Ç$Ç(ç(ç ç ç(¥(¥ ç ç(¥(¥ § §(ç(ç(¥(¥,ç,ç--AòAñ5k5k11--,ç,ç----,ç,ç,ç,ç(ç(ç$Æ$Æ$Ç$Ç,Æ,Æ,Æ,Æ$Ç$Ç,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥5k5k § §(¥(¥ † † … e ¥ ¥ e …(¥(¥$Æ$Æ(¥(¥ § §(ç(ç,Æ,Æ § §$Ç$Ç$Æ$Æ(ç(ç(ç(ç,ç,ç(ç(ç § §(¥(¥$¥$¥(¥(¥ § §(¥(¥(ç(ç,Æ,Æ,Æ,Æ--IðEð1Œ1Œ$Ç$Ç(ç(ç$Æ$Æ$Æ$Æ$Æ$Æ$Æ$Æ$Æ$Æ$Æ$Æ$Æ$Æ,Æ,Æ$Æ$Æ,ç,ç=Œ=Œ=¯A°1111,é,é1111,ç,ç55$Æ$Æ$Ç$Ç,Æ,Æ$Æ$Æ0ç0ç,Æ,Æ,Æ,Æ,Æ,Æ,Æ,Æ(ç(ç=¯A°1L1L e …$¥$¥$„$„ … e¥¥$¥$¥ § §(¥(¥ † †(ç(ç$Æ$Æ$Ç$Ç,Æ,Æ § §$Ç$Ç(ç(ç(ç(ç(ç(ç(ç(ç(¥(¥$¥$¥$¥$¥ Æ Æ$Æ$Æ(¥(¥(ç(ç0ç0ç(¥(¥5k5kIðIð11$Ç$Ç$Ç$Ç(ç(ç ç ç(¥(¥ ç ç(¥(¥ § §(ç(ç(¥(¥,ç,ç--AòAñ5k5k11--,ç,ç----,ç,ç,ç,ç(ç(ç$Æ$Æ$Ç$Ç,Æ,Æ,Æ,Æ$Ç$Ç,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥5k5k § §(¥(¥ † † … e ¥ ¥ e …(¥(¥$Æ$Æ(¥(¥ § §(ç(ç,Æ,Æ § §$Ç$Ç$Æ$Æ(ç(ç(ç(ç,ç,ç(ç(ç § §(¥(¥$¥$¥(¥(¥ § §(¥(¥(ç(ç,Æ,Æ,Æ,Æ--IðEð1Œ1Œ$Ç$Ç(ç(ç$Æ$Æ$Æ$Æ$Æ$Æ$Æ$Æ$Æ$Æ$Æ$Æ$Æ$Æ,Æ,Æ$Æ$Æ,ç,ç=Œ=Œ=¯A°1111,é,é1111,ç,ç55$Æ$Æ$Ç$Ç,Æ,Æ$Æ$Æ0ç0ç(¥(¥(¥(¥,Æ,Æ § §,¥,¥5511$¥$¥ † †$„$„(¥(¥ † †$„$„(¥(¥$¥$¥$¥$¥ † †(¥(¥$¥$¥ † †$Æ$Æ,¥,¥ § §(¥(¥,Æ,Æ § §(¥(¥ † †$¥$¥$„$„$¥$¥(¥(¥(¥(¥,Æ,Æ,¥,¥5k5kIðIð) -) -$¥$¥(¥(¥ e …(¥(¥(¥(¥ § §(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥,é,é=Ž=Ž(ç(ç(¥(¥(¥(¥,¥,¥ § §(¥(¥(¥(¥ § §(¥(¥ † † § §(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥0ç0ç,¥,¥,é,é § §$„$„ … e(¥(¥$„$„$¥$¥(¥(¥ † †(¥(¥ e …(¥(¥$¥$¥ † †(¥(¥$Æ$Æ,¥,¥ § §(¥(¥ § §$¥$¥(¥(¥ † † ¥ ¥$¥$¥$¥$¥(¥(¥,Å,Å,Æ,Æ11AðAð5m5m(¥(¥(¥(¥(¥(¥(¥(¥ † †(¥(¥ † †(¥(¥(¥(¥ † †,Æ,Æ,¥,¥5m5m1*-*(¥(¥ § §(¥(¥,¥,¥ † †,¥,¥ † †(¥(¥ † †$Æ$Æ(¥(¥ § §(¥(¥(¥(¥,Æ,Æ § §,¥,¥5511$¥$¥ † †$„$„(¥(¥ † †$„$„(¥(¥$¥$¥$¥$¥ † †(¥(¥$¥$¥ † †$Æ$Æ,¥,¥ § §(¥(¥,Æ,Æ § §(¥(¥ † †$¥$¥$„$„$¥$¥(¥(¥(¥(¥,Æ,Æ,¥,¥5k5kIðIð) -) -$¥$¥(¥(¥ e …(¥(¥(¥(¥ § §(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥,é,é=Ž=Ž(ç(ç(¥(¥(¥(¥,¥,¥ § §(¥(¥(¥(¥ § §(¥(¥ † † § §(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥0ç0ç,¥,¥,é,é § §$„$„ … e(¥(¥$„$„$¥$¥(¥(¥ † †(¥(¥ e …(¥(¥$¥$¥ † †(¥(¥$Æ$Æ,¥,¥ § §(¥(¥ § §$¥$¥(¥(¥ † † ¥ ¥$¥$¥$¥$¥(¥(¥,Å,Å,Æ,Æ11AðAð5m5m(¥(¥(¥(¥(¥(¥(¥(¥ † †(¥(¥ † †(¥(¥(¥(¥ † †,Æ,Æ,¥,¥5m5m1*-*(¥(¥ § §(¥(¥,¥,¥ † †,¥,¥ † †(¥(¥ † †$Æ$Æ(¥(¥ § §(¥(¥,Æ,Æ † †(¥(¥,¥,¥1L1L$Ç$Ç$¥$¥$„$„ † †$„$„$„$„ § §$„$„ † †(¥(¥$„$„(¥(¥ † †$¥$¥(¥(¥ † †(¥(¥(¥(¥,¥,¥ § §$¥$¥$„$„$¥$¥(¥(¥(¥(¥,Æ,Æ,Æ,Æ,Å,Å(¥(¥5J5J=ð=ð,é,é$¥$¥(¥(¥$¥$¥$¥$¥ † †(¥(¥$¥$¥ † † † †(¥(¥,¥,¥,ç,ç=¯A°$Ç$Ç,¥,¥,¥,¥$Ç$Ç(¥(¥,¥,¥ § §,¥,¥,Æ,Æ(¥(¥ † †$Æ$Æ § §(¥(¥ † †,Æ,Æ$Ç$Ç,é,é,Æ,Æ-*1* § §$d$„(¥(¥$„$„(¥(¥ † †$„$„(¥(¥ † †$¥$¥$¥$¥(¥(¥ † †$„$„ † †(¥(¥(¥(¥(¥(¥(¥(¥ † †$„$„$¥$¥(¥(¥(¥(¥(¥(¥,Æ,Æ,Æ,Æ(¥(¥0ç0çAðAð-*1*(¥(¥ § §(¥(¥ † †(¥(¥ † †(¥(¥(¥(¥ † †(¥(¥,¥,¥,¥,¥=Ž=Ž1L1L(¥(¥,¥,¥(¥(¥,¥,¥ § §,¥,¥,Æ,Æ § §(¥(¥ § §(¥(¥(¥(¥(¥(¥,Æ,Æ † †(¥(¥,¥,¥1L1L$Ç$Ç$¥$¥$„$„ † †$„$„$„$„ § §$„$„ † †(¥(¥$„$„(¥(¥ † †$¥$¥(¥(¥ † †(¥(¥(¥(¥,¥,¥ § §$¥$¥$„$„$¥$¥(¥(¥(¥(¥,Æ,Æ,Æ,Æ,Å,Å(¥(¥5J5J=ð=ð,é,é$¥$¥(¥(¥$¥$¥$¥$¥ † †(¥(¥$¥$¥ † † † †(¥(¥,¥,¥,ç,ç=¯A°$Ç$Ç,¥,¥,¥,¥$Ç$Ç(¥(¥,¥,¥ § §,¥,¥,Æ,Æ(¥(¥ † †$Æ$Æ § §(¥(¥ † †,Æ,Æ$Ç$Ç,é,é,Æ,Æ-*1* § §$d$„(¥(¥$„$„(¥(¥ † †$„$„(¥(¥ † †$¥$¥$¥$¥(¥(¥ † †$„$„ † †(¥(¥(¥(¥(¥(¥(¥(¥ † †$„$„$¥$¥(¥(¥(¥(¥(¥(¥,Æ,Æ,Æ,Æ(¥(¥0ç0çAðAð-*1*(¥(¥ § §(¥(¥ † †(¥(¥ † †(¥(¥(¥(¥ † †(¥(¥,¥,¥,¥,¥=Ž=Ž1L1L(¥(¥,¥,¥(¥(¥,¥,¥ § §,¥,¥,Æ,Æ § §(¥(¥ § §(¥(¥(¥(¥(¥(¥ † †(¥(¥ § §(¥(¥11) -) - e …$„$„$„$„(¥(¥(¥(¥$„$„(¥(¥(¥(¥(¥(¥(¥(¥ d „ † †$„$„(¥(¥(¥(¥$¥$¥(¥(¥,¥,¥(¥(¥(¥(¥(¥(¥,Æ,Æ,¥,¥,Æ,Æ,Æ,Æ,Æ,Æ(ç(ç,Å,Å5k5kAòAñ$Æ$Æ(¥(¥ † † † †(¥(¥ † †(¥(¥ † †$„$„ † †(¥(¥ § §4ç4çA¯=°--,¥,¥,¥,¥(¥(¥(¥(¥,¥,¥,¥,¥(¥(¥,¥,¥ † †$Æ$Æ § §(¥(¥(¥(¥ § § § §,Æ,Æ,é,é,é,é1)1)(¥(¥$„$„$„$„$„$„(¥(¥$„$„(¥(¥(¥(¥(¥(¥$„$„ … e$„$„(¥(¥ † †(¥(¥$¥$¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥,Æ,Æ,Æ,Æ,¥,¥0ç0ç,Å,Å--=ð=ð1L1L e …$¥$¥ † †$„$„ † †(¥(¥ † † † †$„$„ † †,Æ,Æ § §5k5k9m5m,¥,¥,¥,¥,¥,¥,¥,¥,Æ,Æ § §(¥(¥,¥,¥(¥(¥ § §(¥(¥(¥(¥(¥(¥ † †(¥(¥ § §(¥(¥11) -) - e …$„$„$„$„(¥(¥(¥(¥$„$„(¥(¥(¥(¥(¥(¥(¥(¥ d „ † †$„$„(¥(¥(¥(¥$¥$¥(¥(¥,¥,¥(¥(¥(¥(¥(¥(¥,Æ,Æ,¥,¥,Æ,Æ,Æ,Æ,Æ,Æ(ç(ç,Å,Å5k5kAòAñ$Æ$Æ(¥(¥ † † † †(¥(¥ † †(¥(¥ † †$„$„ † †(¥(¥ § §4ç4çA¯=°--,¥,¥,¥,¥(¥(¥(¥(¥,¥,¥,¥,¥(¥(¥,¥,¥ † †$Æ$Æ § §(¥(¥(¥(¥ § § § §,Æ,Æ,é,é,é,é1)1)(¥(¥$„$„$„$„$„$„(¥(¥$„$„(¥(¥(¥(¥(¥(¥$„$„ … e$„$„(¥(¥ † †(¥(¥$¥$¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥,Æ,Æ,Æ,Æ,¥,¥0ç0ç,Å,Å--=ð=ð1L1L e …$¥$¥ † †$„$„ † †(¥(¥ † † † †$„$„ † †,Æ,Æ § §5k5k9m5m,¥,¥,¥,¥,¥,¥,¥,¥,Æ,Æ § §(¥(¥,¥,¥(¥(¥ § §(¥(¥(¥(¥$¥$¥(¥(¥ † †(¥(¥ § §-*1*11 e …(¥(¥$c$„$„$„(¥(¥(¥(¥(¥(¥$d$„$d$„(¥(¥(¥(¥$„$„(¥(¥(¥(¥(¥(¥$d$„,Å,Å0ç0ç,¥,¥,Æ,Æ(¥(¥,Æ,Æ,¥,¥(¥(¥,Æ,Æ,Å,Å0ç0ç0Æ0Æ5J5J=¯A°)) † †(¥(¥ † †(¥(¥ e …¥¥(¥(¥ † †$¥$¥(¥(¥ § §,Æ,Æ558ç4ç,Æ,Æ,¥,¥,¥,¥,¥,¥,¥,¥ § §,¥,¥,Æ,Æ(¥(¥ † †$Æ$Æ § §(¥(¥ † †,Æ,Æ † †(ç(ç,ç,ç1L1L(¥(¥(¥(¥ d „$„$„(¥(¥(¥(¥(¥(¥(¥(¥$d$„$„$„(¥(¥(¥(¥(¥(¥$„$„(¥(¥(¥(¥,¥,¥,¥,¥,¥,¥,¥,¥$Æ$Æ,¥,¥,Æ,Æ(¥(¥,Æ,Æ,Æ,Æ,Æ,Æ,Å,Å11AðAð-*1*(¥(¥ † †(¥(¥$¥$¥ † † † † ¥ ¥$¥$¥ † †$¥$¥(¥(¥,¥,¥5k5k1L1L,¥,¥,Å,Å,¥,¥,¥,¥(¥(¥,¥,¥,¥,¥,Æ,Æ(¥(¥ § §(¥(¥ † †$¥$¥(¥(¥ † †(¥(¥ § §-*1*11 e …(¥(¥$c$„$„$„(¥(¥(¥(¥(¥(¥$d$„$d$„(¥(¥(¥(¥$„$„(¥(¥(¥(¥(¥(¥$d$„,Å,Å0ç0ç,¥,¥,Æ,Æ(¥(¥,Æ,Æ,¥,¥(¥(¥,Æ,Æ,Å,Å0ç0ç0Æ0Æ5J5J=¯A°)) † †(¥(¥ † †(¥(¥ e …¥¥(¥(¥ † †$¥$¥(¥(¥ § §,Æ,Æ558ç4ç,Æ,Æ,¥,¥,¥,¥,¥,¥,¥,¥ § §,¥,¥,Æ,Æ(¥(¥ † †$Æ$Æ § §(¥(¥ † †,Æ,Æ † †(ç(ç,ç,ç1L1L(¥(¥(¥(¥ d „$„$„(¥(¥(¥(¥(¥(¥(¥(¥$d$„$„$„(¥(¥(¥(¥(¥(¥$„$„(¥(¥(¥(¥,¥,¥,¥,¥,¥,¥,¥,¥$Æ$Æ,¥,¥,Æ,Æ(¥(¥,Æ,Æ,Æ,Æ,Æ,Æ,Å,Å11AðAð-*1*(¥(¥ † †(¥(¥$¥$¥ † † † † ¥ ¥$¥$¥ † †$¥$¥(¥(¥,¥,¥5k5k1L1L,¥,¥,Å,Å,¥,¥,¥,¥(¥(¥,¥,¥,¥,¥,Æ,Æ(¥(¥ § §(¥(¥ † † e …(¥(¥(¥(¥,¥,¥,Æ,Æ,é,é,é,é e …$d$„$„$„ † †$„$d(¥(¥(¥(¥(¥(¥(¥(¥ d „$„$„ † †(¥(¥(¥(¥(¥(¥,Æ,Æ,Å,Å0Æ0Æ(¥(¥(¥(¥,Æ,Æ,Æ,Æ,Æ,Æ,Å,Å,Æ,Æ0ç0ç(Å(Å(Å(Å--AðAð,é,é(¥(¥ † †$¥$¥ † † † †$„$„ † †$¥$¥ † † § §$„$„ § §55(ç(ç,Å,Å,Æ,Æ,¥,¥,Æ,Æ,¥,¥,¥,¥0ç0ç,¥,¥,¥,¥(¥(¥ § §(¥(¥(¥(¥$¥$¥ § §(¥(¥(¥(¥ † †-*1* § §$c$„ e …$„$„(¥(¥(¥(¥$d$„(¥(¥(¥(¥ † †$„$d$¥$¥$„$„,¥,¥,¥,¥,¥,¥,Æ,Æ,¥,¥,Æ,Æ(¥(¥,Æ,Æ,Æ,Æ,Æ,Æ(¥(¥,Å,Å0ç0ç,Å,Å,¥,¥,Æ,Æ5511 e …(¥(¥(¥(¥ e … § § ¥ ¥$„$„ † †(¥(¥ § §(¥(¥ e …-*1*1L1L,¥,¥,Å,Å0Æ0Æ,¥,¥,Æ,Æ(¥(¥0Æ0Æ,¥,¥,Æ,Æ(¥(¥ e …$¥$¥ … e(¥(¥(¥(¥,¥,¥,Æ,Æ,é,é,é,é e …$d$„$„$„ † †$„$d(¥(¥(¥(¥(¥(¥(¥(¥ d „$„$„ † †(¥(¥(¥(¥(¥(¥,Æ,Æ,Å,Å0Æ0Æ(¥(¥(¥(¥,Æ,Æ,Æ,Æ,Æ,Æ,Å,Å,Æ,Æ0ç0ç(Å(Å(Å(Å--AðAð,é,é(¥(¥ † †$¥$¥ † † † †$„$„ † †$¥$¥ † † § §$„$„ § §55(ç(ç,Å,Å,Æ,Æ,¥,¥,Æ,Æ,¥,¥,¥,¥0ç0ç,¥,¥,¥,¥(¥(¥ § §(¥(¥(¥(¥$¥$¥ § §(¥(¥(¥(¥ † †-*1* § §$c$„ e …$„$„(¥(¥(¥(¥$d$„(¥(¥(¥(¥ † †$„$d$¥$¥$„$„,¥,¥,¥,¥,¥,¥,Æ,Æ,¥,¥,Æ,Æ(¥(¥,Æ,Æ,Æ,Æ,Æ,Æ(¥(¥,Å,Å0ç0ç,Å,Å,¥,¥,Æ,Æ5511 e …(¥(¥(¥(¥ e … § § ¥ ¥$„$„ † †(¥(¥ § §(¥(¥ e …-*1*1L1L,¥,¥,Å,Å0Æ0Æ,¥,¥,Æ,Æ(¥(¥0Æ0Æ,¥,¥,Æ,Æ(¥(¥ e …$¥$¥ † † § §$Ç$Ç § §,é,é5m5m)K)K † †¥¥e…$¥$¥ † † † † § §$Ç$Ç § § § §$Ç$Ç$Ç$Ç § §$Ç$Ç$Ç$Ç,é,é § § § §$Æ$Æ § § § § § § § §,ç,ç)),é,é111L1L1L1L551*-*e… † † § § † † ç ç § § § § § § § §$Ç$Ç-*1*-l-l=Ž=Ž) -) -$Ç$Ç † † § § § §,é,é § §$Ç$Ç,é,é,é,é,é,é,é,é)) § § § §$Ç$Ç § §$Ç$Ç) -) --l-l$Ç$Çf†¥¥ e …f† † † § § § § § § § §$Ç$Ç$Ç$Ç § §!!$Ç$Ç$Ç$Ç$Ç$Ç § § § § § § § § § § § §(ç(ç,é,é,ç,ç) -) -5J5J5k5k1L1L5Œ5Œ † † § § § § Æ Æ § § § § § § ç ç § § § §!!1L1L551L1L$Æ$Æ$Ç$Ç § §$Ç$Ç$Æ$Æ$Ç$Ç$Ç$Ç$Ç$Ç,é,é$Ç$Ç$Ç$Ç$Ç$Ç † † § §$Ç$Ç § §,é,é5m5m)K)K † †¥¥e…$¥$¥ † † † † § §$Ç$Ç § § § §$Ç$Ç$Ç$Ç § §$Ç$Ç$Ç$Ç,é,é § § § §$Æ$Æ § § § § § § § §,ç,ç)),é,é111L1L1L1L551*-*e… † † § § † † ç ç § § § § § § § §$Ç$Ç-*1*-l-l=Ž=Ž) -) -$Ç$Ç † † § § § §,é,é § §$Ç$Ç,é,é,é,é,é,é,é,é)) § § § §$Ç$Ç § §$Ç$Ç) -) --l-l$Ç$Çf†¥¥ e …f† † † § § § § § § § §$Ç$Ç$Ç$Ç § §!!$Ç$Ç$Ç$Ç$Ç$Ç § § § § § § § § § § § §(ç(ç,é,é,ç,ç) -) -5J5J5k5k1L1L5Œ5Œ † † § § § § Æ Æ § § § § § § ç ç § § § §!!1L1L551L1L$Æ$Æ$Ç$Ç § §$Ç$Ç$Æ$Æ$Ç$Ç$Ç$Ç$Ç$Ç,é,é$Ç$Ç$Ç$Ç$Ç$Ç55AðAð=¯A°AðAðAðAð=¯A°=Ž=Ž=ï=ï55=Ž=Ž=¯A°555955595Ž5591L1L5Œ5Œ951Œ1Œ1L1L55=Ž=Ž559Œ5ŒAðAðAðAð55=ï=ï=¯A°AðAðIðEðAðAðJFNSN3=ï=ï=¯A°=Ž=ŽAðAðAðAðAðAð=¯A°AñAòAðAðAðAð=ð=ð=¯A°BBNSN3IïEïAðAð=¯A°=Ž=ŽAðAðAðAðAðAðAðAð=¯A°AðAðBBJSF3JSF3JSF3NSN3IðEðAðAð=ð=ð=ð=ðAòAñ=ï=ï=¯A°55=Ž=Ž=¯A°555955595Œ5Œ595k5k1Œ1Œ559m5m1L1L5595559Œ5Œ=¯A°AðAð=ï=ï=Ž=Ž=¯A°=ï=ïAðAðAïAïIðEðNSN3AïAï=ð=ð=Ž=ŽAðAð=¯A°AðAð=¯A°AðAðAðAðAòAñ=ð=ð55IðIðNSN3IðEðAïAïAòAñ=Ž=Ž=Ž=ŽAðAðAòAñAðAðAðAðAðAðAðAðJSF3JSF3JSF359AðAð=¯A°AðAðAðAð=¯A°=Ž=Ž=ï=ï55=Ž=Ž=¯A°555955595Ž5591L1L5Œ5Œ951Œ1Œ1L1L55=Ž=Ž559Œ5ŒAðAðAðAð55=ï=ï=¯A°AðAðIðEðAðAðJFNSN3=ï=ï=¯A°=Ž=ŽAðAðAðAðAðAð=¯A°AñAòAðAðAðAð=ð=ð=¯A°BBNSN3IïEïAðAð=¯A°=Ž=ŽAðAðAðAðAðAðAðAð=¯A°AðAðBBJSF3JSF3JSF3NSN3IðEðAðAð=ð=ð=ð=ðAòAñ=ï=ï=¯A°55=Ž=Ž=¯A°555955595Œ5Œ595k5k1Œ1Œ559m5m1L1L5595559Œ5Œ=¯A°AðAð=ï=ï=Ž=Ž=¯A°=ï=ïAðAðAïAïIðEðNSN3AïAï=ð=ð=Ž=ŽAðAð=¯A°AðAð=¯A°AðAðAðAðAòAñ=ð=ð55IðIðNSN3IðEðAïAïAòAñ=Ž=Ž=Ž=ŽAðAðAòAñAðAðAðAðAðAðAðAðJSF3JSF3JSF3(ç(ç Æ Æ(¥(¥ § §(ç(ç Æ Æ(¥(¥ ç ç(¥(¥ ç ç---*1*(ç(ç ¥ ¥(¥(¥$¥$¥$¥$¥(¥(¥$¥$¥$¥$¥$¥$¥$„$„$¥$¥,ç,ç,ç,ç%%$Ç$Ç$ç$ç-)-)(ç(ç § § Æ Æ$Ç$Ç ç ç(ç(ç,ç,ç,ç,ç-)-)$ç$ç--(ç(ç--(ç(ç--(ç(ç(ç(ç$Ç$Ç(ç(ç(ç(ç Æ Æ$Æ$Æ § §,ç,ç11-*1*-)-) ç ç$¥$¥ Æ Æ Æ Æ § § ç ç § §(ç(ç ç ç Æ Æ$Æ$Æ$Æ$Æ § §(ç(ç$¥$¥ § §$Æ$Æ(ç(ç(ç(ç-*1*%%$¥$¥(¥(¥(Å(Å$¥$¥$¥$¥$¥$¥$¥$¥(¥(¥ ¥ ¥$¥$¥(¥(¥--,é,é%%(ç(ç$ç$ç,é,é ç ç § §(ç(ç ç ç(ç(ç$Ç$Ç---)-),ç,ç$ç$ç,é,é,ç,ç$ç$ç-)-),ç,ç$ç$ç(ç(ç § §,ç,ç(ç(ç § §(ç(ç(ç(ç(ç(ç11-*1*-)-)¥¥ † † Æ Æ Æ Æ § § ç ç § §(ç(ç Æ Æ(¥(¥ § §(ç(ç Æ Æ(¥(¥ ç ç(¥(¥ ç ç---*1*(ç(ç ¥ ¥(¥(¥$¥$¥$¥$¥(¥(¥$¥$¥$¥$¥$¥$¥$„$„$¥$¥,ç,ç,ç,ç%%$Ç$Ç$ç$ç-)-)(ç(ç § § Æ Æ$Ç$Ç ç ç(ç(ç,ç,ç,ç,ç-)-)$ç$ç--(ç(ç--(ç(ç--(ç(ç(ç(ç$Ç$Ç(ç(ç(ç(ç Æ Æ$Æ$Æ § §,ç,ç11-*1*-)-) ç ç$¥$¥ Æ Æ Æ Æ § § ç ç § §(ç(ç ç ç Æ Æ$Æ$Æ$Æ$Æ § §(ç(ç$¥$¥ § §$Æ$Æ(ç(ç(ç(ç-*1*%%$¥$¥(¥(¥(Å(Å$¥$¥$¥$¥$¥$¥$¥$¥(¥(¥ ¥ ¥$¥$¥(¥(¥--,é,é%%(ç(ç$ç$ç,é,é ç ç § §(ç(ç ç ç(ç(ç$Ç$Ç---)-),ç,ç$ç$ç,é,é,ç,ç$ç$ç-)-),ç,ç$ç$ç(ç(ç § §,ç,ç(ç(ç § §(ç(ç(ç(ç(ç(ç11-*1*-)-)¥¥ † † Æ Æ Æ Æ § § ç ç § § d „dƒ e …$d$„dƒdddd$„$d„c … e,Æ,Æ)K)K$d$„$d$„$d$„ d ƒ d ƒ$d$„dƒ$d$„dƒdd … e$„$„(¥(¥1L1L † † ¥ ¥ d „ d „dcdd ¥ ¥ e …$d$„ ¥ ¥ e … e …(Å(Å(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥ † †$„$„ † †$„$„ † † … e$¥$¥ e …$¥$¥(¥(¥5m5m$Ç$Çdd … edd¥¥dd „ „dd „ „dd$¥$¥dd … e$„$d„cdd„c$„$d„c ¥ ¥-*1*$Æ$Æ$c$„$„$„ „ d$„$d „ c$„$d „ ddc$„$d„c … e$„$„55) -) -c„ ¥ ¥ d „dd„c … e … e ¥ ¥$d$„ e …$d$„$¥$¥(¥(¥$¥$¥(¥(¥(¥(¥$„$„(¥(¥ † †$„$„(¥(¥ † † … e ¥ ¥dd$¥$¥ e …5I5I1L1Ldddd¥¥dd$¥$¥dddd „ „ „ d„c … e$„$d„cdddd$„$d„c … e,Æ,Æ)K)K$d$„$d$„$d$„ d ƒ d ƒ$d$„dƒ$d$„dƒdd … e$„$„(¥(¥1L1L † † ¥ ¥ d „ d „dcdd ¥ ¥ e …$d$„ ¥ ¥ e … e …(Å(Å(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥ † †$„$„ † †$„$„ † † … e$¥$¥ e …$¥$¥(¥(¥5m5m$Ç$Çdd … edd¥¥dd „ „dd „ „dd$¥$¥dd … e$„$d„cdd„c$„$d„c ¥ ¥-*1*$Æ$Æ$c$„$„$„ „ d$„$d „ c$„$d „ ddc$„$d„c … e$„$„55) -) -c„ ¥ ¥ d „dd„c … e … e ¥ ¥$d$„ e …$d$„$¥$¥(¥(¥$¥$¥(¥(¥(¥(¥$„$„(¥(¥ † †$„$„(¥(¥ † † … e ¥ ¥dd$¥$¥ e …5I5I1L1Ldddd¥¥dd$¥$¥dddd „ „$d$„$d$„dƒ$d$„$„$„ƒdƒd$„$d„c$„$d$Æ$Æ-*1*$d$„ d ƒ$d$„ „ ƒ$„$c$„$„$„$d„c „ „„c$„$„dd$„$„-*1* Æ Æ$d$„dddd „ „dd ¥ ¥ e … ¥ ¥ e …$„$„$¥$¥(¥(¥ † †$„$d(¥(¥(¥(¥(¥(¥(¥(¥ † †(¥(¥ e … ¥ ¥ ¥ ¥dd$¥$¥ e …(¥(¥55)) e … „ „¥¥dd¥¥ e …¥¥ e …dd¥¥dd$„$d „ c$„$„cd$„$d„c$„$d$„$d1)1) § §$d$„$d$„$d$„ d ƒ$d$ƒ$„$„ƒd$„$d„c$„$d „ „ „ c--$ç$ç e … e …c„ „ „dd ¥ ¥c„ ¥ ¥ e …$¥$¥$¥$¥$¥$¥(¥(¥ † †(¥(¥(¥(¥(¥(¥(¥(¥ † †(¥(¥ † †$„$d ¥ ¥dd$¥$¥ e … Æ Æ5)5)1L1L † † … edd „ „ … e … eƒd … e$„$d$„$d„c$„$d$„$„ƒdƒd$„$d„c$„$d$Æ$Æ-*1*$d$„ d ƒ$d$„ „ ƒ$„$c$„$„$„$d„c „ „„c$„$„dd$„$„-*1* Æ Æ$d$„dddd „ „dd ¥ ¥ e … ¥ ¥ e …$„$„$¥$¥(¥(¥ † †$„$d(¥(¥(¥(¥(¥(¥(¥(¥ † †(¥(¥ e … ¥ ¥ ¥ ¥dd$¥$¥ e …(¥(¥55)) e … „ „¥¥dd¥¥ e …¥¥ e …dd¥¥dd$„$d „ c$„$„cd$„$d„c$„$d$„$d1)1) § §$d$„$d$„$d$„ d ƒ$d$ƒ$„$„ƒd$„$d„c$„$d „ „ „ c--$ç$ç e … e …c„ „ „dd ¥ ¥c„ ¥ ¥ e …$¥$¥$¥$¥$¥$¥(¥(¥ † †(¥(¥(¥(¥(¥(¥(¥(¥ † †(¥(¥ † †$„$d ¥ ¥dd$¥$¥ e … Æ Æ5)5)1L1L † † … edd „ „ … e … eƒd … e$d$„$d$„ „ ƒ„c$„$d„c$„$d„c$„$c$„$d,Å,Å)K)K$d$„$d$„ „ ƒ$„$d$„$„$„$„$„$d„c$„$d$„$„cd ¥ ¥$„$„5J5J e …dd „ „dd¥¥dddd ¥ ¥$d$„ ¥ ¥$¥$¥$„$„ † †$„$„(¥(¥(¥(¥(¥(¥ † †$„$„…e … e ¥ ¥$„$„ … edd¥¥(¥(¥ § §5k5k,é,édd „ „dd¥¥ e …dddd „ „dd…eƒd … e$„$d „ c$„$d„c „ c$„$d$„$„-*1* Æ Æ$d$„$d$„ „ ƒ$„$d$„$„ ƒ d$„$d „ „„c$„$d „ „$„$d--))dd „ „dd „ „dd„„ … e „ „ ¥ ¥$„$„(¥(¥ † † … e$¥$¥$d$„(¥(¥(¥(¥ † † … e$„$d „ „ „ „$¥$¥dd¥¥ † †$„$d1)1)1L1Lc„ ¥ ¥dd¥¥dd$„$„ƒddd$„$d$„$d „ ƒ„c$„$d„c$„$d„c$„$c$„$d,Å,Å)K)K$d$„$d$„ „ ƒ$„$d$„$„$„$„$„$d„c$„$d$„$„cd ¥ ¥$„$„5J5J e …dd „ „dd¥¥dddd ¥ ¥$d$„ ¥ ¥$¥$¥$„$„ † †$„$„(¥(¥(¥(¥(¥(¥ † †$„$„…e … e ¥ ¥$„$„ … edd¥¥(¥(¥ § §5k5k,é,édd „ „dd¥¥ e …dddd „ „dd…eƒd … e$„$d „ c$„$d„c „ c$„$d$„$„-*1* Æ Æ$d$„$d$„ „ ƒ$„$d$„$„ ƒ d$„$d „ „„c$„$d „ „$„$d--))dd „ „dd „ „dd„„ … e „ „ ¥ ¥$„$„(¥(¥ † † … e$¥$¥$d$„(¥(¥(¥(¥ † † … e$„$d „ „ „ „$¥$¥dd¥¥ † †$„$d1)1)1L1Lc„ ¥ ¥dd¥¥dd$„$„ƒddd$d$„dƒ d ƒ$d$„dƒ d ƒ$d$„ d ƒ d ƒ$„$„$Æ$Æ1L1L$d$„$„$„$„$d$„$„$„$„$„$„$„$„$„$„ƒd$„$„$„$d$„$„ … e,é,é„„dd „ „dddd„„dc … e$„$„ … e$¥$¥$„$„ † †$„$„ … e$„$„(¥(¥ e …(¥(¥dd$„$„ … e … e ¥ ¥$d$„ ¥ ¥$„$„,¥,¥5m5m ç çdddd„c … edddd¥¥dd¥¥dddd$„$„ ƒ d ƒ d ƒ „ ƒ d$ƒ$d$„$„$„$d)J)J$Ç$Ç$d$„$„$„$„$„$„$„$„$„$„$„$„$„ƒd$„$„ƒd$¥$¥ c „(ç(ç § §c„dd „ „„ddddc ¥ ¥dd$„$„ † †$„$„(¥(¥ † †$„$d(¥(¥$„$„(¥(¥ e … e …$„$„dd ¥ ¥ e … e …$„$„(¥(¥(¥(¥--1L1Ldddddc † †dddddd$„$d$„$d„c „ c$„$d„c „ c$„$d „ c „ c$„$„$Æ$Æ1L1L$d$„$„$„$„$d$„$„$„$„$„$„$„$„$„$„ƒd$„$„$„$d$„$„ … e,é,é„„dd „ „dddd„„dc … e$„$„ … e$¥$¥$„$„ † †$„$„ … e$„$„(¥(¥ e …(¥(¥dd$„$„ … e … e ¥ ¥$d$„ ¥ ¥$„$„,¥,¥5m5m ç çdddd„c … edddd¥¥dd¥¥dddd$„$„ ƒ d ƒ d ƒ „ ƒ d$ƒ$d$„$„$„$d)J)J$Ç$Ç$d$„$„$„$„$„$„$„$„$„$„$„$„$„ƒd$„$„ƒd$¥$¥ c „(ç(ç § §c„dd „ „„ddddc ¥ ¥dd$„$„ † †$„$„(¥(¥ † †$„$d(¥(¥$„$„(¥(¥ e … e …$„$„dd ¥ ¥ e … e …$„$„(¥(¥(¥(¥--1L1Ldddddc † †dddddd$„$d$d$„ d ƒ d ƒ d ƒ$d$ƒ d ƒ d ƒ d ƒ$d$ƒ$d$„(Å(Å5J5Jdd$„$d$„$„ ƒ d$„$„$„$„$„$d$„$„$„$d „ „$„$„ƒd$¥$¥(¥(¥¥¥c„dd „ „„c … e$„$„ ¥ ¥$„$„(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$„$„$„$„(¥(¥ † †$„$„ § §$d$„5J5J$Ç$Çdddddd„„dd„„„ddddddd „ „„c$„$d „ c „ c „ c$„$c$„$d$„$d5)5)%% c „$d$„ d ƒ$„$„$„$d$„$„$„$„$„$d$„$„$„$d$„$d$„$„ Æ Æ$¥$¥dddd$„$ddc ¥ ¥$d$„$d$„$¥$¥$„$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$d$„(¥(¥(¥(¥$„$„(¥(¥ e …$¥$¥(¥(¥(¥(¥,é,é-*1*dƒ e …cddd„„dd „ „„c$„$d „ c „ c „ c$„$c „ c „ c „ c$„$c$„$d(Å(Å5J5Jdd$„$d$„$„ ƒ d$„$„$„$„$„$d$„$„$„$d „ „$„$„ƒd$¥$¥(¥(¥¥¥c„dd „ „„c … e$„$„ ¥ ¥$„$„(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$„$„$„$„(¥(¥ † †$„$„ § §$d$„5J5J$Ç$Çdddddd„„dd„„„ddddddd „ „„c$„$d „ c „ c „ c$„$c$„$d$„$d5)5)%% c „$d$„ d ƒ$„$„$„$d$„$„$„$„$„$d$„$„$„$d$„$d$„$„ Æ Æ$¥$¥dddd$„$ddc ¥ ¥$d$„$d$„$¥$¥$„$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$d$„(¥(¥(¥(¥$„$„(¥(¥ e …$¥$¥(¥(¥(¥(¥,é,é-*1*dƒ e …cddd„„dd „ „„c † † † †$„$„ † †(¥(¥ † †dddd „ d„c § §1L1L%%(¥(¥ † †$„$„(¥(¥$Æ$Æ,Æ,Æ † † ¥ ¥$¥$¥$¥$¥$¥$¥ § §11$Ç$Ç$Ç$Ç § §dd„c … e ¥ ¥$„$„ † †$„$„$„$d … e † †(¥(¥ e … e …$d$„(¥(¥ e …$d$„(¥(¥ † † † † … e(¥(¥ † †(¥(¥$Ç$Ç551*-* † ††f„„ÆÆd„dde…e… § § ç ç § § § § § §(¥(¥e…dd „ ddd ¥ ¥-*1*) -) - § §$¥$¥$„$„$¥$¥$Æ$Æ,¥,¥ † †$¥$¥ ¥ ¥$¥$¥$¥$¥(¥(¥,é,é%% § §$Æ$Æ † †ƒd … e ¥ ¥$„$„ † †$„$„(¥(¥dd$„$d † †$„$d … e$„$d(¥(¥ † †$„$d$¥$¥$d$„ § § d „(¥(¥ † † † † † †-*1*)K)Kf†f†„„ Æ Æe…d„dd † † † † † †$„$„ † †(¥(¥ † †dddd „ d„c § §1L1L%%(¥(¥ † †$„$„(¥(¥$Æ$Æ,Æ,Æ † † ¥ ¥$¥$¥$¥$¥$¥$¥ § §11$Ç$Ç$Ç$Ç § §dd„c … e ¥ ¥$„$„ † †$„$„$„$d … e † †(¥(¥ e … e …$d$„(¥(¥ e …$d$„(¥(¥ † † † † … e(¥(¥ † †(¥(¥$Ç$Ç551*-* † ††f„„ÆÆd„dde…e… § § ç ç § § § § § §(¥(¥e…dd „ ddd ¥ ¥-*1*) -) - § §$¥$¥$„$„$¥$¥$Æ$Æ,¥,¥ † †$¥$¥ ¥ ¥$¥$¥$¥$¥(¥(¥,é,é%% § §$Æ$Æ † †ƒd … e ¥ ¥$„$„ † †$„$„(¥(¥dd$„$d † †$„$d … e$„$d(¥(¥ † †$„$d$¥$¥$d$„ § § d „(¥(¥ † † † † † †-*1*)K)Kf†f†„„ Æ Æe…d„dd † †1L1L11551L1L55951L1L-l-l-*1*)K)K1L1L11=ð=ð=Ž=Ž5595=°A¯EïIïEðIðAðAðAðAð=Ž=ŽAïAïIðEðAðAðAðAðAðAðAðAð5Œ5Œ95)J)J1L1L1L1L1L1L1L1L1Œ1Œ-l-l5m5m-l-l1L1L1L1L1L1L1L1L)K)K)K)K) -) -)K)K1L1L559555A¯=°59=ð=ðNSN3NSN3=¯A°=ï=ïAðAðAðAð551Œ1Œ55A¯=°=ð=ðAòAñIðEðAïAïAòAñ1Œ1Œ1L1L1L1L)K)K-*1*1L1L5m5m95AðAð5595=Ž=ŽIïEïIðEðAðAðAðAðAðAð=ï=ïAðAðAðAð=Ž=ŽAðAðIðEðAðAð551L1L-*1*1L1L1L1L1L1L-l-l1L1L5m5m9n5m5m5m-l-l1L1L1L1L)K)K)K)K) -) -1L1L1L1L115m5m95=¯A°55595559551155AðAð-*1*1L1L)K)K)K)K1L1L11551L1L55951L1L-l-l-*1*)K)K1L1L11=ð=ð=Ž=Ž5595=°A¯EïIïEðIðAðAðAðAð=Ž=ŽAïAïIðEðAðAðAðAðAðAðAðAð5Œ5Œ95)J)J1L1L1L1L1L1L1L1L1Œ1Œ-l-l5m5m-l-l1L1L1L1L1L1L1L1L)K)K)K)K) -) -)K)K1L1L559555A¯=°59=ð=ðNSN3NSN3=¯A°=ï=ïAðAðAðAð551Œ1Œ55A¯=°=ð=ðAòAñIðEðAïAïAòAñ1Œ1Œ1L1L1L1L)K)K-*1*1L1L5m5m95AðAð5595=Ž=ŽIïEïIðEðAðAðAðAðAðAð=ï=ïAðAðAðAð=Ž=ŽAðAðIðEðAðAð551L1L-*1*1L1L1L1L1L1L-l-l1L1L5m5m9n5m5m5m-l-l1L1L1L1L)K)K)K)K) -) -1L1L1L1L115m5m95=¯A°55595559551155AðAð-*1*1L1L)K)K)K)K11,Æ,Æ11115J5J=¯A°,Æ,Æ$¥$¥ † †(¥(¥ ç ç$¥$¥ e … Æ Æ ¥ ¥(¥(¥ Æ Æ § §$Æ$Æ(ç(ç(¥(¥ ç ç$Æ$Æ$Æ$Æ$¥$¥ e … „ „ ç ç$Æ$Æ(¥(¥$¥$¥ † † ç ç,¥,¥5J5J=¯A°5k5k5k9k5m5m5k9k555k9k55=Œ=Œ5m5m=Œ=Œ5m5m=Œ=Œ559Ž55J5J1)1)-*1*11111)1)5)5)5J5J5I5I5J5J5J5J5k5k9I5I5)5)9k5k5k5k9)5)11=Œ=Œ1L1L(¥(¥(¥(¥$¥$¥ † † § § Æ ÆÆÆ ¥ ¥ e …$¥$¥(¥(¥ Æ Æ ç ç$Æ$Æ(ç(ç$Æ$Æ$Æ$Æ,Æ,Æ$¥$¥ † † „ „ § §$Æ$Æ ¥ ¥ ¥ ¥ Æ Æ(¥(¥$Æ$Æ11=Ž=Ž555J5J1Œ1Œ5k5k955k5k=Ž=Ž5m5m=Ž=Ž=Œ=Œ5m5m9k5k=Ž=ŽJF=Ž=Ž5)5)1)1)--115I5I9I5I5J5J5k5k9I5I5J5J5k5k9)5)1L1L11,Æ,Æ11115J5J=¯A°,Æ,Æ$¥$¥ † †(¥(¥ ç ç$¥$¥ e … Æ Æ ¥ ¥(¥(¥ Æ Æ § §$Æ$Æ(ç(ç(¥(¥ ç ç$Æ$Æ$Æ$Æ$¥$¥ e … „ „ ç ç$Æ$Æ(¥(¥$¥$¥ † † ç ç,¥,¥5J5J=¯A°5k5k5k9k5m5m5k9k555k9k55=Œ=Œ5m5m=Œ=Œ5m5m=Œ=Œ559Ž55J5J1)1)-*1*11111)1)5)5)5J5J5I5I5J5J5J5J5k5k9I5I5)5)9k5k5k5k9)5)11=Œ=Œ1L1L(¥(¥(¥(¥$¥$¥ † † § § Æ ÆÆÆ ¥ ¥ e …$¥$¥(¥(¥ Æ Æ ç ç$Æ$Æ(ç(ç$Æ$Æ$Æ$Æ,Æ,Æ$¥$¥ † † „ „ § §$Æ$Æ ¥ ¥ ¥ ¥ Æ Æ(¥(¥$Æ$Æ11=Ž=Ž555J5J1Œ1Œ5k5k955k5k=Ž=Ž5m5m=Ž=Ž=Œ=Œ5m5m9k5k=Ž=ŽJF=Ž=Ž5)5)1)1)--115I5I9I5I5J5J5k5k9I5I5J5J5k5k9)5)1L1L(¥(¥ † †$„$d$„$d0ç0ç55(¥(¥ d „dddd„ddddddd$„$d ¥ ¥ d „dcdƒdddddddddddd„„dd „ „$¥$¥dddddc … e(¥(¥55950ç0ç(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥$Ç$Ç,¥,¥0ç0ç0ç0ç$Ç$Ç0Æ0Æ5m5m1L1L(¥(¥(¥(¥$„$„(¥(¥$d$„$d$„,¥,¥$d$„,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,Æ,Æ(¥(¥,¥,¥,¥,¥,¥,¥1L1L5J5J d „dd$„$ddcdddddddd „ c ¥ ¥ e …c„$d$„dd „ ddddddddddddc „ „$¥$¥dddddcdd(¥(¥,¥,¥551)1)(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥$Ç$Ç,Æ,Æ0ç0ç,¥,¥$Ç$Ç5)5)IðIð) -) -(¥(¥ e …$¥$¥$d$„(¥(¥,¤,¤,¥,¥$d$„,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥(¥(¥ † †$„$d$„$d0ç0ç55(¥(¥ d „dddd„ddddddd$„$d ¥ ¥ d „dcdƒdddddddddddd„„dd „ „$¥$¥dddddc … e(¥(¥55950ç0ç(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥$Ç$Ç,¥,¥0ç0ç0ç0ç$Ç$Ç0Æ0Æ5m5m1L1L(¥(¥(¥(¥$„$„(¥(¥$d$„$d$„,¥,¥$d$„,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,Æ,Æ(¥(¥,¥,¥,¥,¥,¥,¥1L1L5J5J d „dd$„$ddcdddddddd „ c ¥ ¥ e …c„$d$„dd „ ddddddddddddc „ „$¥$¥dddddcdd(¥(¥,¥,¥551)1)(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥$Ç$Ç,Æ,Æ0ç0ç,¥,¥$Ç$Ç5)5)IðIð) -) -(¥(¥ e …$¥$¥$d$„(¥(¥,¤,¤,¥,¥$d$„,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,Æ,Æ,¥,¥$¥$¥ e …--5m5m(¥(¥ d „dddc„d„ddddcdd ¥ ¥ d „dddcdd„ddd„ddd„„dddd¥¥ e …dddd„„dd$„$„1155$Ç$Ç(¥(¥ † †,¥,¥$Ç$Ç$Ç$Ç$Ç$Ç0ç0ç$Ç$Ç,Æ,Æ$Ç$Ç0ç0ç=Ž=Ž1L1L,Æ,Æ § §(¥(¥ † †(¥(¥(¥(¥ § §,¥,¥(¥(¥(¥(¥,¥,¥0Æ0Æ,Æ,Æ,¥,¥ § §0Æ0Æ,é,é,¥,¥1L1L1L1L$c$„dddd„ddc„ddcdcdd$¥$¥ d „dddcdddc„ddd„ddd„„dddd¥¥ d „dddd „ „ … e,Æ,Æ5511,¥,¥ § §(¥(¥$Ç$Ç$Ç$Ç0ç0ç$Ç$Ç0ç0ç$Ç$Ç,é,é,Æ,Æ5J5J=¯A°(æ(ç(¥(¥(¥(¥(¥(¥ † †(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥$Ç$Ç,¥,¥,¥,¥,Æ,Æ,¥,¥$¥$¥ e …--5m5m(¥(¥ d „dddc„d„ddddcdd ¥ ¥ d „dddcdd„ddd„ddd„„dddd¥¥ e …dddd„„dd$„$„1155$Ç$Ç(¥(¥ † †,¥,¥$Ç$Ç$Ç$Ç$Ç$Ç0ç0ç$Ç$Ç,Æ,Æ$Ç$Ç0ç0ç=Ž=Ž1L1L,Æ,Æ § §(¥(¥ † †(¥(¥(¥(¥ § §,¥,¥(¥(¥(¥(¥,¥,¥0Æ0Æ,Æ,Æ,¥,¥ § §0Æ0Æ,é,é,¥,¥1L1L1L1L$c$„dddd„ddc„ddcdcdd$¥$¥ d „dddcdddc„ddd„ddd„„dddd¥¥ d „dddd „ „ … e,Æ,Æ5511,¥,¥ § §(¥(¥$Ç$Ç$Ç$Ç0ç0ç$Ç$Ç0ç0ç$Ç$Ç,é,é,Æ,Æ5J5J=¯A°(æ(ç(¥(¥(¥(¥(¥(¥ † †(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥$Ç$Ç,¥,¥,¥,¥,Æ,Æ † † … edd--55(¥(¥ d „d„d„dddcdcdd … e „ „dddd „ „„ddd„ddd„„dddd„„ … e „ „dd„„dddd$¥$¥1155,ç,ç0ç0ç,¥,¥ § § § §,Æ,Æ$Ç$Ç0ç0ç$Ç$Ç,é,é,¥,¥,é,é=Œ=Œ55(¥(¥(¥(¥ † † ¥ ¥ † † § §(¥(¥$Æ$Æ,¥,¥ § §(¥(¥ § §0Æ0Æ,Æ,Æ,é,é,¥,¥,é,é4ç4ç1*-*1L1L$d$„dd„c„ddd„ddcdddd¥¥ d „dd … ecddd„ddd…edd„„dd¥¥ † †$„$ddd„ddd „ „,¥,¥551*-*,Æ,Æ$Ç$Ç,¥,¥$Ç$Ç § §,¥,¥$Ç$Ç0ç0ç$Ç$Ç$Ç$Ç,Æ,Æ5J5J=¯A°,è,é(¥(¥ † † … e Æ Æ(¥(¥ † †$Ç$Ç(¥(¥$Ç$Ç,Æ,Æ$Ç$Ç,¥,¥$Ç$Ç,Æ,Æ † † … edd--55(¥(¥ d „d„d„dddcdcdd … e „ „dddd „ „„ddd„ddd„„dddd„„ … e „ „dd„„dddd$¥$¥1155,ç,ç0ç0ç,¥,¥ § § § §,Æ,Æ$Ç$Ç0ç0ç$Ç$Ç,é,é,¥,¥,é,é=Œ=Œ55(¥(¥(¥(¥ † † ¥ ¥ † † § §(¥(¥$Æ$Æ,¥,¥ § §(¥(¥ § §0Æ0Æ,Æ,Æ,é,é,¥,¥,é,é4ç4ç1*-*1L1L$d$„dd„c„ddd„ddcdddd¥¥ d „dd … ecddd„ddd…edd„„dd¥¥ † †$„$ddd„ddd „ „,¥,¥551*-*,Æ,Æ$Ç$Ç,¥,¥$Ç$Ç § §,¥,¥$Ç$Ç0ç0ç$Ç$Ç$Ç$Ç,Æ,Æ5J5J=¯A°,è,é(¥(¥ † † … e Æ Æ(¥(¥ † †$Ç$Ç(¥(¥$Ç$Ç,Æ,Æ$Ç$Ç,¥,¥$Ç$Ç(ç(ç$Ç$Ç † † … e1111,¥,¥dddd„d„d„ddddcdddd„„dddd„ddd„d…edd„„…edd „ „¥¥ e …cddd¥¥(¥(¥,é,é1L1L11$Ç$Ç$Ç$Ç$Ç$Ç,¥,¥$Ç$Ç$Ç$Ç,¥,¥$Ç$Ç0ç0ç$Ç$Ç,é,é=Œ=Œ1L1L$¥$¥f†d„d„d„f†„„†f † †,Æ,Æ § §0Æ0Æ,é,é,é,é0ç0ç,é,é(ç(ç(ç(ç1L1L5k5k d „ d „dddd„d„ddc„ddddddd „ „dd„ddd„ddd„„„ddd „ „dd¥¥ e …c„dddd$¥$¥ § §5k5k95,é,é$Ç$Ç,¥,¥$Ç$Ç § §$Ç$Ç0ç0ç$Ç$Ç,Æ,Æ$Ç$Ç0ç0ç5)5)A¯=° ¦ §¥¥f†„„„d…e…e…e † † § §,é,é § § § §,ç,ç(ç(ç$Ç$Ç † † … e1111,¥,¥dddd„d„d„ddddcdddd„„dddd„ddd„d…edd„„…edd „ „¥¥ e …cddd¥¥(¥(¥,é,é1L1L11$Ç$Ç$Ç$Ç$Ç$Ç,¥,¥$Ç$Ç$Ç$Ç,¥,¥$Ç$Ç0ç0ç$Ç$Ç,é,é=Œ=Œ1L1L$¥$¥f†d„d„d„f†„„†f † †,Æ,Æ § §0Æ0Æ,é,é,é,é0ç0ç,é,é(ç(ç(ç(ç1L1L5k5k d „ d „dddd„d„ddc„ddddddd „ „dd„ddd„ddd„„„ddd „ „dd¥¥ e …c„dddd$¥$¥ § §5k5k95,é,é$Ç$Ç,¥,¥$Ç$Ç § §$Ç$Ç0ç0ç$Ç$Ç,Æ,Æ$Ç$Ç0ç0ç5)5)A¯=° ¦ §¥¥f†„„„d…e…e…e † † § §,é,é § § § §,ç,ç,ç,ç § § e …$„$„--55,¥,¥ d „ d „dc„ddddddd„c … ecd „ „dcdddd „ „„cdddd$„$ddd„c$¥$¥dd„c„c „ d „ d,é,é5k5k11550ç0ç$Ç$Ç$Ç$Ç$Ç$Ç0ç0ç,é,é$Ç$Ç,é,é$Ç$Ç0Æ0Æ=Œ=Œ1L1Ld„e…ÆÆ dde…e…e…d„d„dd § § ç ç,Æ,Æ$Ç$Ç,Æ,Æ § §(¥(¥$¥$¥1L1L1L1L d „dcdc„ddc„d„ddddc „ „dddc „ „dddd„cdddd ¥ ¥ d „dddcdd$¥$¥ d „dc„c$„$„(¥(¥1L1L-*1*4ç4ç,é,é$Ç$Ç,Æ,Æ$Ç$Ç0ç0ç$Ç$Ç,é,é0ç0ç$Ç$Ç,é,é11=¯A°…e…e†f…e…e…e†f„d„ddc(ç(çcddd(ç(ç,ç,ç § § e …$„$„--55,¥,¥ d „ d „dc„ddddddd„c … ecd „ „dcdddd „ „„cdddd$„$ddd„c$¥$¥dd„c„c „ d „ d,é,é5k5k11550ç0ç$Ç$Ç$Ç$Ç$Ç$Ç0ç0ç,é,é$Ç$Ç,é,é$Ç$Ç0Æ0Æ=Œ=Œ1L1Ld„e…ÆÆ dde…e…e…d„d„dd § § ç ç,Æ,Æ$Ç$Ç,Æ,Æ § §(¥(¥$¥$¥1L1L1L1L d „dcdc„ddc„d„ddddc „ „dddc „ „dddd„cdddd ¥ ¥ d „dddcdd$¥$¥ d „dc„c$„$„(¥(¥1L1L-*1*4ç4ç,é,é$Ç$Ç,Æ,Æ$Ç$Ç0ç0ç$Ç$Ç,é,é0ç0ç$Ç$Ç,é,é11=¯A°…e…e†f…e…e…e†f„d„ddc(ç(çcddd(ç(ç(ç(ç$Ç$Ç$Æ$Æ † †-*1*1111 § §f†e…e…e…dd…e„ddc„ddc„ddd„„„dddÆÆ † †ÆÆd„ † † † ††f § § § §$Ç$Ç § §-*1*1L1L$Ç$Ç § §$Æ$Æ$Ç$Ç$Ç$Ç,¥,¥ § § § §(ç(ç § §(¥(¥(¥(¥=Ž=Ž55cd † † § § § § ¥ ¥ † †$¥$¥$¥$¥ † † ¥ ¥(ç(ç--11-*1*11-*1*-*1*%%5595$Ç$ÇÆÆ § §f†e…f†dd„ddd„ddc„d„d„ddd„ddd¥¥f†e…e…¥¥ † ††f Æ Æ † †$Ç$Ç § §%%5m5m,é,é ç ç$Æ$Æ$Ç$Ç$Ç$Ç,Æ,Æ § § § §$Ç$Ç § §,¥,¥ † †11AòAñ § §¥¥ § §(ç(çdd Æ Æ † †$¥$¥¥¥ † †(¥(¥ § § Æ Æ † †(ç(ç$Ç$Ç$Æ$Æ † †-*1*1111 § §f†e…e…e…dd…e„ddc„ddc„ddd„„„dddÆÆ † †ÆÆd„ † † † ††f § § § §$Ç$Ç § §-*1*1L1L$Ç$Ç § §$Æ$Æ$Ç$Ç$Ç$Ç,¥,¥ § § § §(ç(ç § §(¥(¥(¥(¥=Ž=Ž55cd † † § § § § ¥ ¥ † †$¥$¥$¥$¥ † † ¥ ¥(ç(ç--11-*1*11-*1*-*1*%%5595$Ç$ÇÆÆ § §f†e…f†dd„ddd„ddc„d„d„ddd„ddd¥¥f†e…e…¥¥ † ††f Æ Æ † †$Ç$Ç § §%%5m5m,é,é ç ç$Æ$Æ$Ç$Ç$Ç$Ç,Æ,Æ § § § §$Ç$Ç § §,¥,¥ † †11AòAñ § §¥¥ § §(ç(çdd Æ Æ † †$¥$¥¥¥ † †(¥(¥ § § Æ Æ † †=Œ=Œ5m5m9k5k5m5m9k5k=Ž=Ž1L1L1L1L1L1L1L1L)J)J11)K)K-*1*1L1L1Œ1Œ1L1L)K)K-*1*)K)K5J5J-*1*-*1*1L1L) -) -1L1L1Œ1Œ5595=ï=ï=Œ=Œ1Œ1Œ559k5k1Œ1Œ551Œ1Œ-*1*) -) -) -) -) -) -)K)K-*1*-*1*-*1*1L1L)K)K1L1L=ï=ïAðAð551Œ1Œ55=Œ=Œ5k5k=Ž=Ž=¯A°=ÏA°=¯=¯=Œ=ŒIðEðIðEðJFIðEðAðAðAðAð=ï=ï=¯A°5k5k=Ž=Ž=Ž=Ž-*1*1L1L)J)J1L1L-)-)-)-)1L1L)K)K1Œ1Œ-l-l-*1*-*1*-*1*-*1*-*1*)K)K1L1L-*1*1Œ1Œ1L1L1Œ1Œ=Ž=Ž=ï=ï=Ž=Ž559Ž5559n5m5k5k95-l-l-*1*))) -) -) -) -)K)K-*1*-*1*-*1*-l-l-*1*55AïAï55951Œ1Œ=Œ=Œ5k5k=Ž=Ž=Œ=Œ=¯A°=ÏA°=¯=¯=Ž=ŽIïEïAðAð=Ž=Ž=Œ=Œ5m5m9k5k5m5m9k5k=Ž=Ž1L1L1L1L1L1L1L1L)J)J11)K)K-*1*1L1L1Œ1Œ1L1L)K)K-*1*)K)K5J5J-*1*-*1*1L1L) -) -1L1L1Œ1Œ5595=ï=ï=Œ=Œ1Œ1Œ559k5k1Œ1Œ551Œ1Œ-*1*) -) -) -) -) -) -)K)K-*1*-*1*-*1*1L1L)K)K1L1L=ï=ïAðAð551Œ1Œ55=Œ=Œ5k5k=Ž=Ž=¯A°=ÏA°=¯=¯=Œ=ŒIðEðIðEðJFIðEðAðAðAðAð=ï=ï=¯A°5k5k=Ž=Ž=Ž=Ž-*1*1L1L)J)J1L1L-)-)-)-)1L1L)K)K1Œ1Œ-l-l-*1*-*1*-*1*-*1*-*1*)K)K1L1L-*1*1Œ1Œ1L1L1Œ1Œ=Ž=Ž=ï=ï=Ž=Ž559Ž5559n5m5k5k95-l-l-*1*))) -) -) -) -)K)K-*1*-*1*-*1*-l-l-*1*55AïAï55951Œ1Œ=Œ=Œ5k5k=Ž=Ž=Œ=Œ=¯A°=ÏA°=¯=¯=Ž=ŽIïEïAðAð=Ž=Ž$¥$¥ e …(¥(¥$¥$¥(¥(¥(¥(¥(¥(¥ d „dd$¥$¥$¥$¥ e …$¥$¥(¥(¥11-*1* § §,Å,Å,¥,¥(¥(¥,¥,¥,Æ,Æ(¥(¥(¥(¥ ¥ ¥(Å(Å$¥$¥$¥$¥(ç(ç1L1L--,¥,¥ § §,Æ,Æ § §(¥(¥$¥$¥$¥$¥ † † Æ Æ$¥$¥ § §,Æ,Æ § §(ç(ç,ç,ç,é,é(ç(ç(ç(ç$Ç$Ç,ç,ç11$Ç$Ç,é,é,ç,ç--,ç,ç111L1L11(ç(ç--1)1),ç,ç,Æ,Æ,¥,¥(¥(¥$d$„,¥,¥(¥(¥(¥(¥dd … e$¥$¥ ¥ ¥ e …$¥$¥$„$„$Ç$Ç5k5k$Ç$Ç,Æ,Æ,Æ,Æ(¥(¥(¥(¥,Æ,Æ(¥(¥(¥(¥$¥$¥$¥$¥(Å(Å(¥(¥ § §-*1*1)1)(ç(ç § §,Æ,Æ § §(¥(¥$¥$¥ † †(¥(¥ † † § § § §$Æ$Æ,Æ,Æ § §--,ç,ç,é,é(ç(ç(ç(ç,é,é,ç,ç%%,é,é(ç(ç,é,é0ç0ç--1L1L11,Æ,Æ § § „ „¥¥$¥$¥ e …(¥(¥$¥$¥(¥(¥(¥(¥(¥(¥ d „dd$¥$¥$¥$¥ e …$¥$¥(¥(¥11-*1* § §,Å,Å,¥,¥(¥(¥,¥,¥,Æ,Æ(¥(¥(¥(¥ ¥ ¥(Å(Å$¥$¥$¥$¥(ç(ç1L1L--,¥,¥ § §,Æ,Æ § §(¥(¥$¥$¥$¥$¥ † † Æ Æ$¥$¥ § §,Æ,Æ § §(ç(ç,ç,ç,é,é(ç(ç(ç(ç$Ç$Ç,ç,ç11$Ç$Ç,é,é,ç,ç--,ç,ç111L1L11(ç(ç--1)1),ç,ç,Æ,Æ,¥,¥(¥(¥$d$„,¥,¥(¥(¥(¥(¥dd … e$¥$¥ ¥ ¥ e …$¥$¥$„$„$Ç$Ç5k5k$Ç$Ç,Æ,Æ,Æ,Æ(¥(¥(¥(¥,Æ,Æ(¥(¥(¥(¥$¥$¥$¥$¥(Å(Å(¥(¥ § §-*1*1)1)(ç(ç § §,Æ,Æ § §(¥(¥$¥$¥ † †(¥(¥ † † § § § §$Æ$Æ,Æ,Æ § §--,ç,ç,é,é(ç(ç(ç(ç,é,é,ç,ç%%,é,é(ç(ç,é,é0ç0ç--1L1L11,Æ,Æ § § „ „¥¥dd¥¥ e … e … † † … edd „ „…edd¥¥ e …(¥(¥(¥(¥1111,¥,¥,Æ,Æ,¥,¥,Æ,Æ,Æ,Æ,¥,¥0ç0ç,Æ,Æ$Æ$Æ § §(ç(ç$¥$¥$Ç$Ç1Œ1Œ,é,é § § § § † †$¥$¥ † † … e$¥$¥ e … e …¥¥ † † † †$¥$¥(¥(¥ † †(¥(¥ † † § §$„$„ † †…edd Æ Æ † † § §,¥,¥,é,é--(¥(¥(¥(¥ † †(¥(¥ e …(¥(¥ † †$„$„ † † … e … edd „ „dddd¥¥ d „ † †(¥(¥,¥,¥5m5m11,¥,¥,¥,¥,¥,¥,Æ,Æ,¥,¥0ç0ç,Æ,Æ,Æ,Æ$Æ$Æ$Æ$Æ$Æ$Æ § §1L1L-*1*,Æ,Æ † †$¥$¥ † † … e$¥$¥ e …¥¥ † †dd$¥$¥ † † † †(¥(¥ † †(¥(¥ † † § §(¥(¥ e …¥¥e… e … † †(¥(¥ § §0Æ0Æ11$Ç$Ç(¥(¥ † †dddddd¥¥ e … e … † † … edd „ „…edd¥¥ e …(¥(¥(¥(¥1111,¥,¥,Æ,Æ,¥,¥,Æ,Æ,Æ,Æ,¥,¥0ç0ç,Æ,Æ$Æ$Æ § §(ç(ç$¥$¥$Ç$Ç1Œ1Œ,é,é § § § § † †$¥$¥ † † … e$¥$¥ e … e …¥¥ † † † †$¥$¥(¥(¥ † †(¥(¥ † † § §$„$„ † †…edd Æ Æ † † § §,¥,¥,é,é--(¥(¥(¥(¥ † †(¥(¥ e …(¥(¥ † †$„$„ † † … e … edd „ „dddd¥¥ d „ † †(¥(¥,¥,¥5m5m11,¥,¥,¥,¥,¥,¥,Æ,Æ,¥,¥0ç0ç,Æ,Æ,Æ,Æ$Æ$Æ$Æ$Æ$Æ$Æ § §1L1L-*1*,Æ,Æ † †$¥$¥ † † … e$¥$¥ e …¥¥ † †dd$¥$¥ † † † †(¥(¥ † †(¥(¥ † † § §(¥(¥ e …¥¥e… e … † †(¥(¥ § §0Æ0Æ11$Ç$Ç(¥(¥ † †dddddddd¥¥ e …dd „ „…e„„¥¥ e … e … „ „¥¥ § §551L1L e …,¥,¥0ç0ç,¥,¥0ç0ç,Æ,Æ,Æ,Æ0ç0ç$Ç$Ç(ç(ç § §$Ç$Ç ç ç1L1L--,¥,¥ † †$¥$¥ e …¥¥ e … † †dd¥¥ † † † † … e$¥$¥ † †(¥(¥ † † § §(¥(¥ † † † †¥¥e… § §$¥$¥ † †(¥(¥0Æ0Æ,é,é § §,¥,¥$Ç$Ç(¥(¥ e … † †(¥(¥e… e … „ „¥¥dd¥¥e…¥¥dd$¥$¥ e … † †,é,é5m5m § §(¥(¥0Æ0Æ0ç0ç$Ç$Ç,¥,¥0Æ0Æ0ç0ç$Ç$Ç(ç(ç$Ç$Ç § § Æ Æ) -) -9)5) § §$Æ$Æ † †$¥$¥ e …¥¥ † † … e „ „¥¥ † † … e(¥(¥ † †(¥(¥¥¥ § §(¥(¥ e … Æ Æ e …e… § §$¥$¥ † †(¥(¥,¥,¥,é,é$Æ$Æ,Æ,Æ,¥,¥ † † … edddd¥¥ e …dd „ „…e„„¥¥ e … e … „ „¥¥ § §551L1L e …,¥,¥0ç0ç,¥,¥0ç0ç,Æ,Æ,Æ,Æ0ç0ç$Ç$Ç(ç(ç § §$Ç$Ç ç ç1L1L--,¥,¥ † †$¥$¥ e …¥¥ e … † †dd¥¥ † † † † … e$¥$¥ † †(¥(¥ † † § §(¥(¥ † † † †¥¥e… § §$¥$¥ † †(¥(¥0Æ0Æ,é,é § §,¥,¥$Ç$Ç(¥(¥ e … † †(¥(¥e… e … „ „¥¥dd¥¥e…¥¥dd$¥$¥ e … † †,é,é5m5m § §(¥(¥0Æ0Æ0ç0ç$Ç$Ç,¥,¥0Æ0Æ0ç0ç$Ç$Ç(ç(ç$Ç$Ç § § Æ Æ) -) -9)5) § §$Æ$Æ † †$¥$¥ e …¥¥ † † … e „ „¥¥ † † … e(¥(¥ † †(¥(¥¥¥ § §(¥(¥ e … Æ Æ e …e… § §$¥$¥ † †(¥(¥,¥,¥,é,é$Æ$Æ,Æ,Æ,¥,¥ † † … edd¥¥dd…e „ „…edd¥¥ e …e…„„ † † … e$¥$¥,é,é-l-ldd,¥,¥0ç0ç,Æ,Æ0Æ0Æ0ç0ç0ç0ç0ç0ç$Ç$Ç,Æ,Æ$Ç$Ç Æ Æ%%1L1L(ç(ç § §(¥(¥ † † … e$¥$¥e…$¥$¥ e …¥¥ e …¥¥ † †$Æ$Æ † †$¥$¥$¥$¥ † † † †$¥$¥e…dd¥¥ † † § §$„$„,¥,¥,é,é,é,é(¥(¥$Ç$Ç(¥(¥ † †(¥(¥e… † † … edddd¥¥dd…e … e¥¥ e …e…$¥$¥ e …$Æ$Æ55 § §(¥(¥,¥,¥0ç0ç,¥,¥4ç4ç,é,é0Æ0Æ0Æ0Æ$Ç$Ç(ç(ç § § Æ Æ) -) -11 § §$Æ$Æ † † … e¥¥ † †dd$¥$¥ e … e …¥¥ † † † †(¥(¥ † †$¥$¥ † † § § † † … e¥¥dd Æ Æ † †$¥$¥ † †,¥,¥-*1*$Ç$Ç,¥,¥ † † … edddd¥¥dd…e „ „…edd¥¥ e …e…„„ † † … e$¥$¥,é,é-l-ldd,¥,¥0ç0ç,Æ,Æ0Æ0Æ0ç0ç0ç0ç0ç0ç$Ç$Ç,Æ,Æ$Ç$Ç Æ Æ%%1L1L(ç(ç § §(¥(¥ † † … e$¥$¥e…$¥$¥ e …¥¥ e …¥¥ † †$Æ$Æ † †$¥$¥$¥$¥ † † † †$¥$¥e…dd¥¥ † † § §$„$„,¥,¥,é,é,é,é(¥(¥$Ç$Ç(¥(¥ † †(¥(¥e… † † … edddd¥¥dd…e … e¥¥ e …e…$¥$¥ e …$Æ$Æ55 § §(¥(¥,¥,¥0ç0ç,¥,¥4ç4ç,é,é0Æ0Æ0Æ0Æ$Ç$Ç(ç(ç § § Æ Æ) -) -11 § §$Æ$Æ † † … e¥¥ † †dd$¥$¥ e … e …¥¥ † † † †(¥(¥ † †$¥$¥ † † § § † † … e¥¥dd Æ Æ † †$¥$¥ † †,¥,¥-*1*$Ç$Ç,¥,¥ † † … edddd„d … edd¥¥dd„d…e…e „ „ … e¥¥dd¥¥11-l-l,ç,ç0Æ0Æ4ç4ç95======4ç4ç95 § §(ç(ç † †) -) -1*-*(ç(ç † † § § e …$¥$¥e… e …¥¥ e …¥¥ † †$¥$¥ e … † †(¥(¥ † † † † § §$¥$¥ e …¥¥dddd † †$¥$¥ † †,¥,¥,é,é11$Ç$Ç(¥(¥ † † † †(¥(¥ † †$„$„dd ¥ ¥dd … e„d „ „…e … e„„ … edd¥¥ § §1L1L11,Æ,Æ0ç0ç4ç4ç====4ç4ç==4ç4ç(ç(ç § §$Æ$Æ § §1L1L,é,é Æ Æ(¥(¥¥¥ † † † †dd¥¥e… e … † †¥¥$¥$¥ † †$¥$¥ † † † † § §(¥(¥ e …¥¥e…dd¥¥ † † † †,¥,¥,Æ,Æ-*1*0ç0ç † † † † „ ddddd„d … edd¥¥dd„d…e…e „ „ … e¥¥dd¥¥11-l-l,ç,ç0Æ0Æ4ç4ç95======4ç4ç95 § §(ç(ç † †) -) -1*-*(ç(ç † † § § e …$¥$¥e… e …¥¥ e …¥¥ † †$¥$¥ e … † †(¥(¥ † † † † § §$¥$¥ e …¥¥dddd † †$¥$¥ † †,¥,¥,é,é11$Ç$Ç(¥(¥ † † † †(¥(¥ † †$„$„dd ¥ ¥dd … e„d „ „…e … e„„ … edd¥¥ § §1L1L11,Æ,Æ0ç0ç4ç4ç====4ç4ç==4ç4ç(ç(ç § §$Æ$Æ § §1L1L,é,é Æ Æ(¥(¥¥¥ † † † †dd¥¥e… e … † †¥¥$¥$¥ † †$¥$¥ † † † † § §(¥(¥ e …¥¥e…dd¥¥ † † † †,¥,¥,Æ,Æ-*1*0ç0ç † † † † „ ddddddd„„dddd „ „dddddd¥¥dd¥¥ † †(¥(¥,é,é-l-l$Ç$Ç(ç(ç § §0ç0ç,é,é55,é,é0Æ0Æ$Ç$Ç † †dd ç ç$Ç$Ç) -) -(¥(¥$¥$¥ † † ¥ ¥ e …dd¥¥ e …dd¥¥ † †dd$¥$¥$¥$¥ † †(¥(¥ † †$¥$¥ e … e …¥¥ e …ÆÆ e …$¥$¥ † †,¥,¥,é,é-*1*,¥,¥ † †,¥,¥ § §$d$„(¥(¥ e … e …$d$„dc$¥$¥d„dddd¥¥dd¥¥$¥$¥ † †,Æ,Æ1L1L))$Ç$Ç$Æ$Æ$Ç$Ç,é,é1155,é,é,ç,ç § §dd Æ Æ † †)K)K(ç(ç † †(¥(¥ e …¥¥ e …dd … e¥¥dd¥¥ † † † † … e(¥(¥$¥$¥$¥$¥ † † † †dd¥¥ † † … e¥¥(¥(¥ † †(¥(¥,¥,¥-*1*,é,é(¥(¥(¥(¥dddddddd„„dddd „ „dddddd¥¥dd¥¥ † †(¥(¥,é,é-l-l$Ç$Ç(ç(ç § §0ç0ç,é,é55,é,é0Æ0Æ$Ç$Ç † †dd ç ç$Ç$Ç) -) -(¥(¥$¥$¥ † † ¥ ¥ e …dd¥¥ e …dd¥¥ † †dd$¥$¥$¥$¥ † †(¥(¥ † †$¥$¥ e … e …¥¥ e …ÆÆ e …$¥$¥ † †,¥,¥,é,é-*1*,¥,¥ † †,¥,¥ § §$d$„(¥(¥ e … e …$d$„dc$¥$¥d„dddd¥¥dd¥¥$¥$¥ † †,Æ,Æ1L1L))$Ç$Ç$Æ$Æ$Ç$Ç,é,é1155,é,é,ç,ç § §dd Æ Æ † †)K)K(ç(ç † †(¥(¥ e …¥¥ e …dd … e¥¥dd¥¥ † † † † … e(¥(¥$¥$¥$¥$¥ † † † †dd¥¥ † † … e¥¥(¥(¥ † †(¥(¥,¥,¥-*1*,é,é(¥(¥(¥(¥dddd § § Æ Æ § § Æ Æ¥¥¥¥¥¥ÆÆ § §ÆÆ † † † † § § § §-*1*)K)Kd„d„ dd CCdde…f† ddf†) -) -!!!!11-*1* § §f† Æ Æ † † § §e…e… e …f†dd¥¥ § § § § † † † † † † † † † † † †¥¥e…e… e … Æ Æ § §$Ç$Ç$Ç$Ç,é,é5m5m1*-*,é,é,é,é$Ç$Ç$Ç$Ç § § † †$¥$¥dd¥¥dd„d„d„d…e†f § § † † § §))11 ç çddd dd cdc ddf†d„e…$Ç$Ç!! ç ç) -) -11 § § † † § §f† § §f†¥¥e… e …ÆÆdd † † § § † † † † † † † † † † † †$¥$¥e…dd¥¥ † † § §$Ç$Ç$Ç$Ç,é,é5J5J1L1L,é,é,é,é,é,é$Ç$Ç § § Æ Æ § § Æ Æ¥¥¥¥¥¥ÆÆ § §ÆÆ † † † † § § § §-*1*)K)Kd„d„ dd CCdde…f† ddf†) -) -!!!!11-*1* § §f† Æ Æ † † § §e…e… e …f†dd¥¥ § § § § † † † † † † † † † † † †¥¥e…e… e … Æ Æ § §$Ç$Ç$Ç$Ç,é,é5m5m1*-*,é,é,é,é$Ç$Ç$Ç$Ç § § † †$¥$¥dd¥¥dd„d„d„d…e†f § § † † § §))11 ç çddd dd cdc ddf†d„e…$Ç$Ç!! ç ç) -) -11 § § † † § §f† § §f†¥¥e… e …ÆÆdd † † § § † † † † † † † † † † † †$¥$¥e…dd¥¥ † † § §$Ç$Ç$Ç$Ç,é,é5J5J1L1L,é,é,é,é,é,é$Ç$Ç559k5k559k5k1L1LAðAð551*-*1Œ1Œ11)K)K-*1*-*1*-l-l5k5k95-*1*-*1*-*1*%%-*1*1L1L1155=ï=ïAðAð=Ž=Ž=Ž=Ž=Ž=Ž=Œ=Œ5Œ5Œ955Œ5Œ951Œ1ŒAòAñ=Ž=Ž1Œ1Œ1Œ1Œ111L1LAðAð559Œ5Œ551Œ1Œ=Ž=Ž1Œ1Œ5m5m95AðAð=¯A°1Œ1Œ=¯A°=ÏA°=¯=¯=Ž=Ž=Ž=Ž=¯A°=Œ=Œ=Ž=Ž=Ž=Ž=Ž=Ž555k9k555k9k5m5m1L1L-*1*) -) -) -) -%%) -) --)-)1L1L)K)K)J)J5m5m9k5k-*1*)K)K-*1*) -) -1*-*1L1L1Œ1Œ55=Ž=ŽAðAð=¯A°5559Ž=Œ=Œ555Œ9Œ555Œ9Œ55=Ž=ŽAðAð551L1L55-l-l=¯A°=ÏA°1Ž1559Ž5559Ž51L1L55AðAðAòAñ1L1L=¯A°=ÏA°9Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=¯A°=Ž=Ž=Ž=Ž55=Ž=Ž595k5k595k5k1L1LAðAð551*-*1Œ1Œ11)K)K-*1*-*1*-l-l5k5k95-*1*-*1*-*1*%%-*1*1L1L1155=ï=ïAðAð=Ž=Ž=Ž=Ž=Ž=Ž=Œ=Œ5Œ5Œ955Œ5Œ951Œ1ŒAòAñ=Ž=Ž1Œ1Œ1Œ1Œ111L1LAðAð559Œ5Œ551Œ1Œ=Ž=Ž1Œ1Œ5m5m95AðAð=¯A°1Œ1Œ=¯A°=ÏA°=¯=¯=Ž=Ž=Ž=Ž=¯A°=Œ=Œ=Ž=Ž=Ž=Ž=Ž=Ž555k9k555k9k5m5m1L1L-*1*) -) -) -) -%%) -) --)-)1L1L)K)K)J)J5m5m9k5k-*1*)K)K-*1*) -) -1*-*1L1L1Œ1Œ55=Ž=ŽAðAð=¯A°5559Ž=Œ=Œ555Œ9Œ555Œ9Œ55=Ž=ŽAðAð551L1L55-l-l=¯A°=ÏA°1Ž1559Ž5559Ž51L1L55AðAðAòAñ1L1L=¯A°=ÏA°9Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=¯A°=Ž=Ž=Ž=Ž55=Ž=Ž,Æ,Æ,Æ,Æ,Æ,Æ § §,Æ,ÆAðAð5J5Jdd(¥(¥ † † … e ¥ ¥ ¥ ¥(¥(¥ † †(¥(¥ § §(ç(ç § §$Æ$Æ § §(ç(ç$Æ$Æ,Æ,Æ(ç(ç$Æ$Æ(¥(¥$¥$¥$¥$¥$¥$¥ † †(¥(¥(ç(ç,Å,Å,Æ,Æ5J5JIðEð) -) -(ç(ç(¥(¥$Æ$Æ$Æ$Æ § §$Æ$Æ § §(¥(¥$Æ$Æ,¥,¥,Æ,Æ,é,éAðAð5J5J11--(ç(ç,ç,ç,é,é,Æ,Æ,Æ,Æ$Ç$Ç$Æ$Æ § §(ç(ç,Æ,Æ,é,é,Æ,Æ,ç,ç=Œ=Œ1L1L$¥$¥ e …$„$„ ¥ ¥$„$„ † †ƒd(¥(¥(¥(¥ † † § §$Æ$Æ$Ç$Ç,Æ,Æ § § § §(ç(ç$Æ$Æ,Æ,Æ$Ç$Ç(ç(ç$¥$¥(¥(¥ † †$¥$¥$Æ$Æ(¥(¥(¥(¥,Æ,Æ,Æ,Æ--AïAï55,Æ,Æ$Æ$Æ$Æ$Æ$Æ$Æ † †$Æ$Æ$Æ$Æ(¥(¥ † †,Æ,Æ,Æ,Æ,Æ,Æ55=Ž=Ž11--(ç(ç,ç,ç,é,é,ç,ç0ç0ç$Æ$Æ § §,Æ,Æ$Æ$Æ,Æ,Æ,Æ,Æ,Æ,Æ,Æ,Æ § §,Æ,ÆAðAð5J5Jdd(¥(¥ † † … e ¥ ¥ ¥ ¥(¥(¥ † †(¥(¥ § §(ç(ç § §$Æ$Æ § §(ç(ç$Æ$Æ,Æ,Æ(ç(ç$Æ$Æ(¥(¥$¥$¥$¥$¥$¥$¥ † †(¥(¥(ç(ç,Å,Å,Æ,Æ5J5JIðEð) -) -(ç(ç(¥(¥$Æ$Æ$Æ$Æ § §$Æ$Æ § §(¥(¥$Æ$Æ,¥,¥,Æ,Æ,é,éAðAð5J5J11--(ç(ç,ç,ç,é,é,Æ,Æ,Æ,Æ$Ç$Ç$Æ$Æ § §(ç(ç,Æ,Æ,é,é,Æ,Æ,ç,ç=Œ=Œ1L1L$¥$¥ e …$„$„ ¥ ¥$„$„ † †ƒd(¥(¥(¥(¥ † † § §$Æ$Æ$Ç$Ç,Æ,Æ § § § §(ç(ç$Æ$Æ,Æ,Æ$Ç$Ç(ç(ç$¥$¥(¥(¥ † †$¥$¥$Æ$Æ(¥(¥(¥(¥,Æ,Æ,Æ,Æ--AïAï55,Æ,Æ$Æ$Æ$Æ$Æ$Æ$Æ † †$Æ$Æ$Æ$Æ(¥(¥ † †,Æ,Æ,Æ,Æ,Æ,Æ55=Ž=Ž11--(ç(ç,ç,ç,é,é,ç,ç0ç0ç$Æ$Æ § §,Æ,Æ$Æ$Æ,Æ,Æ(¥(¥(¥(¥,Æ,Æ § §,¥,¥55) -) -$¥$¥$„$„$„$„(¥(¥ e …(¥(¥(¥(¥ † †(¥(¥ † †(¥(¥$¥$¥ † †(¥(¥ § §(¥(¥ § §(¥(¥,¥,¥ † †$¥$¥ † †$¥$¥$¥$¥(¥(¥,¥,¥,Æ,Æ,¥,¥5k5k=ð=ð1)1)(¥(¥ † †(¥(¥(¥(¥ † †(¥(¥(¥(¥(¥(¥ † †,¥,¥ § §4ç4ç95$Æ$Æ,¥,¥ § §,¥,¥,¥,¥(¥(¥ § §(¥(¥ § §(¥(¥ † †$Æ$Æ § §$Æ$Æ,¥,¥,¥,¥-*1*1L1L$d$„$d$„$d$„dƒ e …(¥(¥$¥$¥ e …(¥(¥(¥(¥ † †$„$„(¥(¥ † †(¥(¥$¥$¥ § §(¥(¥ § §(¥(¥,Æ,Æ$¥$¥$¥$¥ † †$¥$¥$„$„$¥$¥(¥(¥,Æ,Æ,Æ,Æ11AðAð55$„$„ § §(¥(¥(¥(¥(¥(¥ † †(¥(¥ § §(¥(¥(¥(¥ § §,¥,¥=Œ=Œ-*1*(¥(¥(¥(¥,¥,¥$Ç$Ç(¥(¥(¥(¥ † †(¥(¥ § §(¥(¥(¥(¥ § §(¥(¥(¥(¥,Æ,Æ § §,¥,¥55) -) -$¥$¥$„$„$„$„(¥(¥ e …(¥(¥(¥(¥ † †(¥(¥ † †(¥(¥$¥$¥ † †(¥(¥ § §(¥(¥ § §(¥(¥,¥,¥ † †$¥$¥ † †$¥$¥$¥$¥(¥(¥,¥,¥,Æ,Æ,¥,¥5k5k=ð=ð1)1)(¥(¥ † †(¥(¥(¥(¥ † †(¥(¥(¥(¥(¥(¥ † †,¥,¥ § §4ç4ç95$Æ$Æ,¥,¥ § §,¥,¥,¥,¥(¥(¥ § §(¥(¥ § §(¥(¥ † †$Æ$Æ § §$Æ$Æ,¥,¥,¥,¥-*1*1L1L$d$„$d$„$d$„dƒ e …(¥(¥$¥$¥ e …(¥(¥(¥(¥ † †$„$„(¥(¥ † †(¥(¥$¥$¥ § §(¥(¥ § §(¥(¥,Æ,Æ$¥$¥$¥$¥ † †$¥$¥$„$„$¥$¥(¥(¥,Æ,Æ,Æ,Æ11AðAð55$„$„ § §(¥(¥(¥(¥(¥(¥ † †(¥(¥ § §(¥(¥(¥(¥ § §,¥,¥=Œ=Œ-*1*(¥(¥(¥(¥,¥,¥$Ç$Ç(¥(¥(¥(¥ † †(¥(¥ § §(¥(¥(¥(¥ § §(¥(¥,Æ,Æ † †(¥(¥,¥,¥-*1*)) e …(¥(¥ e …$„$„(¥(¥(¥(¥ † †$„$„(¥(¥ e …$¥$¥$„$„$¥$¥ † †$¥$¥(¥(¥(¥(¥,Æ,Æ(¥(¥(¥(¥ † †$¥$¥(¥(¥(¥(¥,¥,¥,Æ,Æ(ç(ç,¥,¥5J5JAòAñ$Ç$Ç(¥(¥ § §(¥(¥ † †(¥(¥ † †(¥(¥ † †(¥(¥ § §,¥,¥,ç,çAðAð$Ç$Ç,¥,¥,¥,¥,¥,¥ § §,¥,¥,¥,¥ § §,¥,¥$Æ$Æ § §(¥(¥ † †$Æ$Æ$Ç$Ç,¥,¥5k5k1*-*$„$„ … e$„$ddc „ „$¥$¥$„$„(¥(¥ e …$¥$¥$¥$¥$„$„(¥(¥$¥$¥ † †$¥$¥$„$„ § §(¥(¥(¥(¥(¥(¥(¥(¥ † †$¥$¥(¥(¥(¥(¥(¥(¥,Æ,Æ,Æ,Æ(¥(¥0ç0çAðAð-*1* § §(¥(¥(¥(¥ † † † †(¥(¥(¥(¥ † †(¥(¥$¥$¥,¥,¥,¥,¥5m5m1L1L,¥,¥,¥,¥,¥,¥ § §(¥(¥,¥,¥,¥,¥$Æ$Æ,¥,¥ † †$Æ$Æ(¥(¥(¥(¥,Æ,Æ † †(¥(¥,¥,¥-*1*)) e …(¥(¥ e …$„$„(¥(¥(¥(¥ † †$„$„(¥(¥ e …$¥$¥$„$„$¥$¥ † †$¥$¥(¥(¥(¥(¥,Æ,Æ(¥(¥(¥(¥ † †$¥$¥(¥(¥(¥(¥,¥,¥,Æ,Æ(ç(ç,¥,¥5J5JAòAñ$Ç$Ç(¥(¥ § §(¥(¥ † †(¥(¥ † †(¥(¥ † †(¥(¥ § §,¥,¥,ç,çAðAð$Ç$Ç,¥,¥,¥,¥,¥,¥ § §,¥,¥,¥,¥ § §,¥,¥$Æ$Æ § §(¥(¥ † †$Æ$Æ$Ç$Ç,¥,¥5k5k1*-*$„$„ … e$„$ddc „ „$¥$¥$„$„(¥(¥ e …$¥$¥$¥$¥$„$„(¥(¥$¥$¥ † †$¥$¥$„$„ § §(¥(¥(¥(¥(¥(¥(¥(¥ † †$¥$¥(¥(¥(¥(¥(¥(¥,Æ,Æ,Æ,Æ(¥(¥0ç0çAðAð-*1* § §(¥(¥(¥(¥ † † † †(¥(¥(¥(¥ † †(¥(¥$¥$¥,¥,¥,¥,¥5m5m1L1L,¥,¥,¥,¥,¥,¥ § §(¥(¥,¥,¥,¥,¥$Æ$Æ,¥,¥ † †$Æ$Æ(¥(¥(¥(¥ † †(¥(¥ † †,¥,¥) -) -,é,é e …$„$„$„$„(¥(¥$„$„(¥(¥$„$„ † †$„$d(¥(¥$„$„ † †$„$„(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥,Æ,Æ(¥(¥(¥(¥(¥(¥,¥,¥,Æ,Æ,Æ,Æ,Æ,Æ,Å,Å,Å,Å5k5kAðAð$Ç$Ç † †$„$„ † †$„$„ † †(¥(¥ † † ¥ ¥ † †$¥$¥(¥(¥0Æ0Æ=¯A°11,¥,¥,¥,¥,Æ,Æ(¥(¥,¥,¥ § §,¥,¥,¥,¥(¥(¥ § §$¥$¥ † † § §(ç(ç551*-*1L1L$„$„ „ d … eƒd$„$„$„$„(¥(¥ † †(¥(¥$d$„(¥(¥(¥(¥ e …$„$„ † †$„$„(¥(¥(¥(¥(¥(¥,¥,¥,Æ,Æ(¥(¥(¥(¥(¥(¥,¥,¥,Æ,Æ,Æ,Æ,Æ,Æ,Æ,Æ,Å,Å1)1)AðAð-*1* ¥ ¥(¥(¥e…(¥(¥ † †(¥(¥ e …$¥$¥ † † † †(¥(¥,¥,¥=Œ=Œ1L1L,¥,¥,Æ,Æ,¥,¥(¥(¥,¥,¥ § §(¥(¥,¥,¥ § §(¥(¥ † †(¥(¥(¥(¥ † †(¥(¥ † †,¥,¥) -) -,é,é e …$„$„$„$„(¥(¥$„$„(¥(¥$„$„ † †$„$d(¥(¥$„$„ † †$„$„(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥,Æ,Æ(¥(¥(¥(¥(¥(¥,¥,¥,Æ,Æ,Æ,Æ,Æ,Æ,Å,Å,Å,Å5k5kAðAð$Ç$Ç † †$„$„ † †$„$„ † †(¥(¥ † † ¥ ¥ † †$¥$¥(¥(¥0Æ0Æ=¯A°11,¥,¥,¥,¥,Æ,Æ(¥(¥,¥,¥ § §,¥,¥,¥,¥(¥(¥ § §$¥$¥ † † § §(ç(ç551*-*1L1L$„$„ „ d … eƒd$„$„$„$„(¥(¥ † †(¥(¥$d$„(¥(¥(¥(¥ e …$„$„ † †$„$„(¥(¥(¥(¥(¥(¥,¥,¥,Æ,Æ(¥(¥(¥(¥(¥(¥,¥,¥,Æ,Æ,Æ,Æ,Æ,Æ,Æ,Æ,Å,Å1)1)AðAð-*1* ¥ ¥(¥(¥e…(¥(¥ † †(¥(¥ e …$¥$¥ † † † †(¥(¥,¥,¥=Œ=Œ1L1L,¥,¥,Æ,Æ,¥,¥(¥(¥,¥,¥ § §(¥(¥,¥,¥ § §(¥(¥ † †(¥(¥$¥$¥(¥(¥ † †(¥(¥$Ç$Ç551*-*$d$„$¥$¥$c$„$d$„(¥(¥(¥(¥(¥(¥(¥(¥$d$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥,Æ,Æ,Æ,Æ(¥(¥,Æ,Æ(¥(¥,Æ,Æ,¥,¥0ç0ç,Å,Å0ç0ç,Æ,Æ1L1L=ï=ï,é,é$¥$¥$¥$¥ † †(¥(¥ † † … e(¥(¥$¥$¥ † †(¥(¥(¥(¥0ç0ç5m5m--0Æ0Æ,¥,¥,¥,¥,¥,¥,¥,¥(¥(¥,¥,¥,Æ,Æ(¥(¥ † †(¥(¥ § §$¥$¥,Æ,Æ$Ç$Ç5n5m1L1L$„$„ „ d … eƒd … e$¥$¥$„$„(¥(¥(¥(¥(¥(¥$d$„(¥(¥$¥$¥$d$„(¥(¥(¥(¥(¥(¥$d$„,¥,¥0Æ0Æ,Å,Å,Æ,Æ(¥(¥,¥,¥,Æ,Æ(¥(¥,Æ,Æ0ç0ç,Å,Å0Æ0Æ11551Œ1Œ$„$„ † † § §$„$„ † † † † ¥ ¥(¥(¥ † †$¥$¥(¥(¥,¥,¥1L1L1L1L,Å,Å,¥,¥,¥,¥,¥,¥,¥,¥(¥(¥,¥,¥,Æ,Æ,¥,¥ § §(¥(¥ † †$¥$¥(¥(¥ † †(¥(¥$Ç$Ç551*-*$d$„$¥$¥$c$„$d$„(¥(¥(¥(¥(¥(¥(¥(¥$d$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥,Æ,Æ,Æ,Æ(¥(¥,Æ,Æ(¥(¥,Æ,Æ,¥,¥0ç0ç,Å,Å0ç0ç,Æ,Æ1L1L=ï=ï,é,é$¥$¥$¥$¥ † †(¥(¥ † † … e(¥(¥$¥$¥ † †(¥(¥(¥(¥0ç0ç5m5m--0Æ0Æ,¥,¥,¥,¥,¥,¥,¥,¥(¥(¥,¥,¥,Æ,Æ(¥(¥ † †(¥(¥ § §$¥$¥,Æ,Æ$Ç$Ç5n5m1L1L$„$„ „ d … eƒd … e$¥$¥$„$„(¥(¥(¥(¥(¥(¥$d$„(¥(¥$¥$¥$d$„(¥(¥(¥(¥(¥(¥$d$„,¥,¥0Æ0Æ,Å,Å,Æ,Æ(¥(¥,¥,¥,Æ,Æ(¥(¥,Æ,Æ0ç0ç,Å,Å0Æ0Æ11551Œ1Œ$„$„ † † § §$„$„ † † † † ¥ ¥(¥(¥ † †$¥$¥(¥(¥,¥,¥1L1L1L1L,Å,Å,¥,¥,¥,¥,¥,¥,¥,¥(¥(¥,¥,¥,Æ,Æ,¥,¥ § §(¥(¥ † † e …(¥(¥(¥(¥,¥,¥$Ç$Ç11%%$„$„ „ d$„$„ † †(¥(¥$„$„(¥(¥$„$„(¥(¥$„$„ … e$¥$¥$„$„(¥(¥,¥,¥,¥,¥,¥,¥0ç0ç(¥(¥(¥(¥,¥,¥,Æ,Æ,Æ,Æ,Å,Å,Å,Å(ç(ç,¥,¥(Å(Å11AðAð)) † †(¥(¥ † † † †(¥(¥ e …$¥$¥$¥$¥ † † § §$„$„ † †110ç0ç,¥,¥,Æ,Æ,¥,¥,Æ,Æ,¥,¥,¥,¥,Æ,Æ,¥,¥(¥(¥(¥(¥(¥(¥$¥$¥$¥$¥$¥$¥ e …1L1L1L1L c „$d$„dc d „dcdƒ$„$„(¥(¥(¥(¥$„$„(¥(¥$„$„$„$„(¥(¥$„$„(¥(¥(¥(¥,Æ,Æ,Å,Å,Å,Å,Æ,Æ$¥$¥,¥,¥,Æ,Æ,Æ,Æ,Å,Å,Å,Å,Æ,Æ,Å,Å(¥(¥,Æ,Æ5595$d$„,¥,¥ † †$¥$¥ † †$„$„ † †$¥$¥ † †(¥(¥ † † † †1)1)1L1L,¥,¥,Å,Å,¥,¥,Æ,Æ,Æ,Æ,¥,¥,Æ,Æ,Å,Å,¥,¥(¥(¥ † †$„$d … e(¥(¥(¥(¥,¥,¥$Ç$Ç11%%$„$„ „ d$„$„ † †(¥(¥$„$„(¥(¥$„$„(¥(¥$„$„ … e$¥$¥$„$„(¥(¥,¥,¥,¥,¥,¥,¥0ç0ç(¥(¥(¥(¥,¥,¥,Æ,Æ,Æ,Æ,Å,Å,Å,Å(ç(ç,¥,¥(Å(Å11AðAð)) † †(¥(¥ † † † †(¥(¥ e …$¥$¥$¥$¥ † † § §$„$„ † †110ç0ç,¥,¥,Æ,Æ,¥,¥,Æ,Æ,¥,¥,¥,¥,Æ,Æ,¥,¥(¥(¥(¥(¥(¥(¥$¥$¥$¥$¥$¥$¥ e …1L1L1L1L c „$d$„dc d „dcdƒ$„$„(¥(¥(¥(¥$„$„(¥(¥$„$„$„$„(¥(¥$„$„(¥(¥(¥(¥,Æ,Æ,Å,Å,Å,Å,Æ,Æ$¥$¥,¥,¥,Æ,Æ,Æ,Æ,Å,Å,Å,Å,Æ,Æ,Å,Å(¥(¥,Æ,Æ5595$d$„,¥,¥ † †$¥$¥ † †$„$„ † †$¥$¥ † †(¥(¥ † † † †1)1)1L1L,¥,¥,Å,Å,¥,¥,Æ,Æ,Æ,Æ,¥,¥,Æ,Æ,Å,Å,¥,¥(¥(¥ † †$„$d † † § §$Ç$Ç § §-*1*1L1L1L1L § §f† † † † † † † § § § §%%$Ç$Ç § §)) § §$Ç$Ç$Ç$Ç$Ç$Ç,é,é ç ç$Ç$Ç § § § § ç ç$Ç$Ç § §,é,é))11-*1*5k5k9m5m1Œ1Œ-*1* † † § § § § † †$Ç$Ç!! § §!! § §$Ç$Ç)K)K5m5m=Ž=Ž) -) - § §$Ç$Ç § §$Ç$Ç$Ç$Ç%%$Ç$Ç,é,é,é,é%%) -) -$Ç$Ç%%$Ç$Ç) -) -AðAðAðAð11%% § § § §¥¥ † † § § † † § §$Ç$Ç § §$Ç$Ç!!$Ç$Ç$Ç$Ç$Ç$Ç%%$Ç$Ç,é,é § §$Ç$Ç § § ç ç § § § §,é,é)),é,é-*1*5J5J551Œ1Œ5m5m † † § § § § § § § §%% § §$Ç$Ç § §!!) -) -1L1L551L1L$Ç$Ç$Ç$Ç § §$Ç$Ç$Ç$Ç$Ç$Ç$Ç$Ç,é,é%%,é,é!!$Ç$Ç † † § §$Ç$Ç § §-*1*1L1L1L1L § §f† † † † † † † § § § §%%$Ç$Ç § §)) § §$Ç$Ç$Ç$Ç$Ç$Ç,é,é ç ç$Ç$Ç § § § § ç ç$Ç$Ç § §,é,é))11-*1*5k5k9m5m1Œ1Œ-*1* † † § § § § † †$Ç$Ç!! § §!! § §$Ç$Ç)K)K5m5m=Ž=Ž) -) - § §$Ç$Ç § §$Ç$Ç$Ç$Ç%%$Ç$Ç,é,é,é,é%%) -) -$Ç$Ç%%$Ç$Ç) -) -AðAðAðAð11%% § § § §¥¥ † † § § † † § §$Ç$Ç § §$Ç$Ç!!$Ç$Ç$Ç$Ç$Ç$Ç%%$Ç$Ç,é,é § §$Ç$Ç § § ç ç § § § §,é,é)),é,é-*1*5J5J551Œ1Œ5m5m † † § § § § § § § §%% § §$Ç$Ç § §!!) -) -1L1L551L1L$Ç$Ç$Ç$Ç § §$Ç$Ç$Ç$Ç$Ç$Ç$Ç$Ç,é,é%%,é,é!!$Ç$Ç55AðAðAðAðAðAðAðAð=¯A°=Ž=Ž=¯A°11AðAð55=ï=ï1155=Ž=Ž1L1L551L1L5Œ5Œ95111L1L55=Ž=Ž1155=Ž=ŽAðAð=¯A°55=ï=ïAðAðAïAïAðAðIðEðJFAðAð=Ž=Ž=Ž=ŽAðAðAðAðAðAð=¯A°AðAðAðAð=ð=ð=ð=ð=¯A°EðIðFJEðIðEðIð=¯A°9ï=ï55IðIðAòAñ=ð=ð=ð=ðIðEðAòAñJSF3JSF3NSN3NSN3NSN3JSF3NSN3JSF3AðAðAðAð5595=Ž=ŽAðAð55955Œ5Œ9555951L1L1Œ1Œ551L1L551L1L55955Œ5Œ95AòAñAðAð=Ž=Ž=ï=ï=¯A°AðAðAïAïIðEðJFIðEðAðAð55=ï=ïAðAðAðAðAðAð=ð=ðAòAñAðAð=ð=ð55AðAðJFIïEïIðEðAðAð55AðAðAðAð=ð=ðIðEð=ð=ðAðAðAòAñJSF3NSN3AòAñ59AðAðAðAðAðAðAðAð=¯A°=Ž=Ž=¯A°11AðAð55=ï=ï1155=Ž=Ž1L1L551L1L5Œ5Œ95111L1L55=Ž=Ž1155=Ž=ŽAðAð=¯A°55=ï=ïAðAðAïAïAðAðIðEðJFAðAð=Ž=Ž=Ž=ŽAðAðAðAðAðAð=¯A°AðAðAðAð=ð=ð=ð=ð=¯A°EðIðFJEðIðEðIð=¯A°9ï=ï55IðIðAòAñ=ð=ð=ð=ðIðEðAòAñJSF3JSF3NSN3NSN3NSN3JSF3NSN3JSF3AðAðAðAð5595=Ž=ŽAðAð55955Œ5Œ9555951L1L1Œ1Œ551L1L551L1L55955Œ5Œ95AòAñAðAð=Ž=Ž=ï=ï=¯A°AðAðAïAïIðEðJFIðEðAðAð55=ï=ïAðAðAðAðAðAð=ð=ðAòAñAðAð=ð=ð55AðAðJFIïEïIðEðAðAð55AðAðAðAð=ð=ðIðEð=ð=ðAðAðAòAñJSF3NSN3AòAñ Æ Æ(¥(¥ † † § § Æ Æ$¥$¥ § § Æ Æ$¥$¥ § §,ç,ç)J)J(¥(¥$¥$¥$¥$¥(¥(¥$„$„$¥$¥$¥$¥$¥$¥$„$„ ¥ ¥ ¥ ¥,Æ,Æ,Æ,Æ) -) -$ç$ç(ç(ç ç ç(ç(ç Æ Æ$¥$¥ § §(ç(ç § §,ç,ç,ç,ç)),ç,ç$ç$ç,ç,ç,ç,ç$ç$ç,é,é(ç(ç$Æ$Æ$Æ$Æ$Æ$Æ$Ç$Ç$Æ$Æ$Æ$Æ$Æ$Æ$Ç$Ç,Æ,Æ1L1L-)-) ç ç „ „¥¥ † † Æ Æ Æ Æ † † ç ç$¥$¥ § § ¥ ¥ Æ Æ Æ Æ(¥(¥¥¥$Æ$Æ § §(¥(¥ ç ç5J5J$Ç$Ç$¥$¥$¥$¥(¥(¥$¥$¥$d$„$¥$¥$¥$¥$¥$¥ e …$„$„$Æ$Æ0ç0ç)))) ç ç(ç(ç(ç(ç † † § § ç ç(¥(¥ ç ç(ç(ç(ç(ç,ç,ç))(ç(ç(ç(ç,ç,ç(ç(ç(ç(ç(ç(ç § §(ç(ç(¥(¥$Ç$Ç(ç(ç Æ Æ$Æ$Æ(ç(ç,Æ,Æ---*1*))¥¥¥¥$¥$¥ † † ç ç † † Æ Æ Æ Æ(¥(¥ † † § § Æ Æ$¥$¥ § § Æ Æ$¥$¥ § §,ç,ç)J)J(¥(¥$¥$¥$¥$¥(¥(¥$„$„$¥$¥$¥$¥$¥$¥$„$„ ¥ ¥ ¥ ¥,Æ,Æ,Æ,Æ) -) -$ç$ç(ç(ç ç ç(ç(ç Æ Æ$¥$¥ § §(ç(ç § §,ç,ç,ç,ç)),ç,ç$ç$ç,ç,ç,ç,ç$ç$ç,é,é(ç(ç$Æ$Æ$Æ$Æ$Æ$Æ$Ç$Ç$Æ$Æ$Æ$Æ$Æ$Æ$Ç$Ç,Æ,Æ1L1L-)-) ç ç „ „¥¥ † † Æ Æ Æ Æ † † ç ç$¥$¥ § § ¥ ¥ Æ Æ Æ Æ(¥(¥¥¥$Æ$Æ § §(¥(¥ ç ç5J5J$Ç$Ç$¥$¥$¥$¥(¥(¥$¥$¥$d$„$¥$¥$¥$¥$¥$¥ e …$„$„$Æ$Æ0ç0ç)))) ç ç(ç(ç(ç(ç † † § § ç ç(¥(¥ ç ç(ç(ç(ç(ç,ç,ç))(ç(ç(ç(ç,ç,ç(ç(ç(ç(ç(ç(ç § §(ç(ç(¥(¥$Ç$Ç(ç(ç Æ Æ$Æ$Æ(ç(ç,Æ,Æ---*1*))¥¥¥¥$¥$¥ † † ç ç † † Æ Æ e …$d$„dƒ e …$d$„dƒdƒ$d$„dƒ e …,Å,Å-*1* e …$d$„$d$„ d ƒ$d$„ d ƒ$d$„dc„c$„$d„c$„$„(¥(¥5J5J † † ¥ ¥ e … d „dd … e „ „dd ¥ ¥ e …$d$„ ¥ ¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$„$„ † †$¥$¥(¥(¥(¥(¥ e …$¥$¥ e …¥¥ † †(¥(¥=Œ=Œ § § e … „ „ … e¥¥ e …dd¥¥ d „dd$„$ddd$„$d„c … eƒd … eƒd$„$d ¥ ¥1)1) § §$d$„$d$„ d ƒ d ƒ$d$„ d ƒ$d$„dƒ$d$„dƒ$„$„ … e11) -) -c„ e …dd „ „dc ¥ ¥ e … e … ¥ ¥$„$„ † †$„$„ § §$d$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥ † †$¥$¥$„$„ … e¥¥ e … † †$¥$¥1)1)-*1*dd$¥$¥e…dd¥¥dddd ¥ ¥ … e$„$d„c … e$„$d„c„c$„$d„c … e,Å,Å-*1* e …$d$„$d$„ d ƒ$d$„ d ƒ$d$„dc„c$„$d„c$„$„(¥(¥5J5J † † ¥ ¥ e … d „dd … e „ „dd ¥ ¥ e …$d$„ ¥ ¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$„$„ † †$¥$¥(¥(¥(¥(¥ e …$¥$¥ e …¥¥ † †(¥(¥=Œ=Œ § § e … „ „ … e¥¥ e …dd¥¥ d „dd$„$ddd$„$d„c … eƒd … eƒd$„$d ¥ ¥1)1) § §$d$„$d$„ d ƒ d ƒ$d$„ d ƒ$d$„dƒ$d$„dƒ$„$„ … e11) -) -c„ e …dd „ „dc ¥ ¥ e … e … ¥ ¥$„$„ † †$„$„ § §$d$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥ † †$¥$¥$„$„ … e¥¥ e … † †$¥$¥1)1)-*1*dd$¥$¥e…dd¥¥dddd ¥ ¥$d$„dƒ$„$„ƒd … e$„$d„c„c „ c$„$d(ç(ç) -) -$„$„ƒd$„$„$„$„ƒd$„$„$„$„ƒddd$„$„dd$„$„ ¥ ¥-*1*$¥$¥dddd „ „dd „ „dd$¥$¥dd(¥(¥ ¥ ¥$„$„ † †(¥(¥ † †$„$d,¥,¥ § §$¥$¥$„$„ † † … e$¥$¥ e …dd¥¥ † †,¥,¥55,é,é „ „dd¥¥dd¥¥ e …dddd ¥ ¥ c „$d$„$d$„$d$„dƒ$d$„dƒ d ƒdƒ$„$„-*1* † †$„$d$„$„$„$d „ ƒ$„$c$„$„ƒdƒd ¥ ¥ d „dƒ$d$„11$ç$ç e … ¥ ¥c„ e …dd ¥ ¥dd ¥ ¥$„$„ † †$„$„(¥(¥ † †(¥(¥(¥(¥,¥,¥ † †(¥(¥ † †$„$„ † †$„$„ † †dd$¥$¥ e …$¥$¥1)1)5m5mdd$¥$¥e…dd$¥$¥ d „$d$„ d „$„$d„c$„$„ƒd … e$„$d„c„c „ c$„$d(ç(ç) -) -$„$„ƒd$„$„$„$„ƒd$„$„$„$„ƒddd$„$„dd$„$„ ¥ ¥-*1*$¥$¥dddd „ „dd „ „dd$¥$¥dd(¥(¥ ¥ ¥$„$„ † †(¥(¥ † †$„$d,¥,¥ § §$¥$¥$„$„ † † … e$¥$¥ e …dd¥¥ † †,¥,¥55,é,é „ „dd¥¥dd¥¥ e …dddd ¥ ¥ c „$d$„$d$„$d$„dƒ$d$„dƒ d ƒdƒ$„$„-*1* † †$„$d$„$„$„$d „ ƒ$„$c$„$„ƒdƒd ¥ ¥ d „dƒ$d$„11$ç$ç e … ¥ ¥c„ e …dd ¥ ¥dd ¥ ¥$„$„ † †$„$„(¥(¥ † †(¥(¥(¥(¥,¥,¥ † †(¥(¥ † †$„$„ † †$„$„ † †dd$¥$¥ e …$¥$¥1)1)5m5mdd$¥$¥e…dd$¥$¥ d „$d$„ d „$d$„$d$„dƒ$d$„ d ƒdƒ d ƒ$d$ƒ$d$„ d ƒ,Å,Å)K)Kc„$„$„ … e$„$d$„$„$„$„ƒd … e ƒ „$„$d „ „„c(¥(¥-*1*dd ¥ ¥dddd „ „dd „ „ „ „¥¥ e …$¥$¥(¥(¥ e …$„$„(¥(¥(¥(¥(¥(¥ † †$„$„ … e … e ¥ ¥ e … ¥ ¥c„$¥$¥(¥(¥(¥(¥5m5m$Ç$Çdd „ „dd¥¥ e …dd¥¥dd$„$ddd„c$„$d$„$d„c „ c$„$d „ c$„$d$„$„-*1* § §$„$„$„$„$„$d „ ƒ$„$„$„$d$„$d „ „ „ c$„$d „ „ „ c11))dddddd „ „dddd „ „dd$¥$¥ e …(¥(¥ † †$„$„(¥(¥ d „(¥(¥(¥(¥$d$„ † † … e … e ¥ ¥ e … „ „dd$¥$¥(¥(¥11-l-ldd † †ƒd … edddd„c … e$„$d$„$d„c$„$d „ c„c „ c$„$c$„$d „ c,Å,Å)K)Kc„$„$„ … e$„$d$„$„$„$„ƒd … e ƒ „$„$d „ „„c(¥(¥-*1*dd ¥ ¥dddd „ „dd „ „ „ „¥¥ e …$¥$¥(¥(¥ e …$„$„(¥(¥(¥(¥(¥(¥ † †$„$„ … e … e ¥ ¥ e … ¥ ¥c„$¥$¥(¥(¥(¥(¥5m5m$Ç$Çdd „ „dd¥¥ e …dd¥¥dd$„$ddd„c$„$d$„$d„c „ c$„$d „ c$„$d$„$„-*1* § §$„$„$„$„$„$d „ ƒ$„$„$„$d$„$d „ „ „ c$„$d „ „ „ c11))dddddd „ „dddd „ „dd$¥$¥ e …(¥(¥ † †$„$„(¥(¥ d „(¥(¥(¥(¥$d$„ † † … e … e ¥ ¥ e … „ „dd$¥$¥(¥(¥11-l-ldd † †ƒd … edddd„c … e$d$„dƒ d ƒ d ƒ$„$„ ƒ d$„$d„c „ c$„$„(¥(¥1L1L e …$„$„ ƒ „$„$d$„$„$„$„$„$„$„$„$„$d „ ƒ$„$d$„$„ … e))dddd$„$„dddc„„dddd$¥$¥ e …$¥$¥$„$„(¥(¥ † †$„$d$„$„(¥(¥ † †$„$„ … e$„$d$„$d ¥ ¥$d$„dd(¥(¥ † †(¥(¥5k5k$Ç$Çdddd „ „dddd„„dddd$„$d„c$„$d„c$„$„ƒd ƒ d ƒ d ƒ d$„$d$„$„5J5J ç ç$c$„ e …$„$„$„$„$„$d$„$„$„$„$„$d „ ƒ„c$„$„$„$d$ç$ç § §c„ „ „dddd„„dc ¥ ¥ e …$¥$¥$„$„ † †$„$d(¥(¥ e …(¥(¥$d$„(¥(¥ † †$„$d$„$d$„$„dd$¥$¥ e … ¥ ¥$„$„(¥(¥111L1Lcddddd„„…e „ „„c$„$d$„$d„c „ c „ c$„$„ ƒ d$„$d„c „ c$„$„(¥(¥1L1L e …$„$„ ƒ „$„$d$„$„$„$„$„$„$„$„$„$d „ ƒ$„$d$„$„ … e))dddd$„$„dddc„„dddd$¥$¥ e …$¥$¥$„$„(¥(¥ † †$„$d$„$„(¥(¥ † †$„$„ … e$„$d$„$d ¥ ¥$d$„dd(¥(¥ † †(¥(¥5k5k$Ç$Çdddd „ „dddd„„dddd$„$d„c$„$d„c$„$„ƒd ƒ d ƒ d ƒ d$„$d$„$„5J5J ç ç$c$„ e …$„$„$„$„$„$d$„$„$„$„$„$d „ ƒ„c$„$„$„$d$ç$ç § §c„ „ „dddd„„dc ¥ ¥ e …$¥$¥$„$„ † †$„$d(¥(¥ e …(¥(¥$d$„(¥(¥ † †$„$d$„$d$„$„dd$¥$¥ e … ¥ ¥$„$„(¥(¥111L1Lcddddd„„…e „ „„c$„$d$d$„ d ƒ d ƒ$d$ƒ d ƒ d ƒ d ƒ d ƒ$d$ƒ$d$„$¥$¥1L1L$d$„ d ƒ$„$„$„$„$ƒ$d$„$„$„$„$„$d$„$„$„$d$„$„ƒd$„$„$Ç$Ç „ „„cdd „ „„c … e ¥ ¥$„$„(¥(¥$„$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$„$„$„$„(¥(¥ † †$¥$¥(¥(¥$d$„1L1L$Ç$Çdƒ „ „„ddd„„dd„„ … e$„$d „ c$„$d$„$d „ c$„$c$„$d„c$„$c$„$c$„$d-+1*$Ç$Ç$d$„ d ƒ$„$„$ƒ$d$„$„$„$„$„$„ƒd$„$d$„$„$„$d$„$„(¥(¥ÆÆ d „dƒdd „ „„c ¥ ¥$d$„$¥$¥$d$„,¥,¥(¥(¥(¥(¥,¥,¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$d$„(¥(¥$¥$¥$d$„$¥$¥(¥(¥(¥(¥(¥(¥,é,é-*1*dddddd„ddddddd$„$d$„$d „ c „ c$„$c „ c „ c „ c „ c$„$c$„$d$¥$¥1L1L$d$„ d ƒ$„$„$„$„$ƒ$d$„$„$„$„$„$d$„$„$„$d$„$„ƒd$„$„$Ç$Ç „ „„cdd „ „„c … e ¥ ¥$„$„(¥(¥$„$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$„$„$„$„(¥(¥ † †$¥$¥(¥(¥$d$„1L1L$Ç$Çdƒ „ „„ddd„„dd„„ … e$„$d „ c$„$d$„$d „ c$„$c$„$d„c$„$c$„$c$„$d-+1*$Ç$Ç$d$„ d ƒ$„$„$ƒ$d$„$„$„$„$„$„ƒd$„$d$„$„$„$d$„$„(¥(¥ÆÆ d „dƒdd „ „„c ¥ ¥$d$„$¥$¥$d$„,¥,¥(¥(¥(¥(¥,¥,¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$d$„(¥(¥$¥$¥$d$„$¥$¥(¥(¥(¥(¥(¥(¥,é,é-*1*dddddd„ddddddd$„$d † †$¥$¥ † † † †(¥(¥ † † … edd „ ddd ç ç1L1L,é,é § §$¥$¥$¥$¥(¥(¥(ç(ç,Æ,Æ$¥$¥$¥$¥$¥$¥ † †(ç(ç(¥(¥-*1*))$Ç$Ç § §$¥$¥dd „ „ † †$„$„ † †$„$„$„$d … e † † † †$„$d … e … e(¥(¥ e …$d$„(¥(¥ † † † † † †(¥(¥ † † † †$Ç$Ç-*1*%%dddcdddc„ddddd „ c„c „ c „ c$„$c$„$d$„$d„c „ c$„$d$„$d$„$„)J)J1L1L † †(¥(¥$¥$¥ § §,Å,Å(ç(ç(¥(¥ † †(¥(¥ § §(¥(¥ § §-)-),é,é$Ç$Ç$Ç$Ç$¥$¥dddd(¥(¥ † †$„$d$¥$¥$„$„ … e … e$¥$¥ e … e … e …$„$„ † †$„$„(¥(¥ † †(¥(¥ e … † † § § † † † †) -) -)K)Kf†f†¥¥ § §e…d„d„f† † †$¥$¥ † † † †(¥(¥ † † … edd „ ddd ç ç1L1L,é,é § §$¥$¥$¥$¥(¥(¥(ç(ç,Æ,Æ$¥$¥$¥$¥$¥$¥ † †(ç(ç(¥(¥-*1*))$Ç$Ç § §$¥$¥dd „ „ † †$„$„ † †$„$„$„$d … e † † † †$„$d … e … e(¥(¥ e …$d$„(¥(¥ † † † † † †(¥(¥ † † † †$Ç$Ç-*1*%%dddcdddc„ddddd „ c„c „ c „ c$„$c$„$d$„$d„c „ c$„$d$„$d$„$„)J)J1L1L † †(¥(¥$¥$¥ § §,Å,Å(ç(ç(¥(¥ † †(¥(¥ § §(¥(¥ § §-)-),é,é$Ç$Ç$Ç$Ç$¥$¥dddd(¥(¥ † †$„$d$¥$¥$„$„ … e … e$¥$¥ e … e … e …$„$„ † †$„$„(¥(¥ † †(¥(¥ e … † † § § † † † †) -) -)K)Kf†f†¥¥ § §e…d„d„f†-l-l55955m5m=Ž=Ž559m5m)K)K) -) -1L1L-l-l11AðAð=Ž=Ž5Œ5Œ=Ž=ŽAðAðAðAðAðAðAðAðAðAð=ï=ïAðAðAðAðAðAð=Ž=Ž=ï=ïIðEð=Ž=Ž1Œ1Œ1L1L1L1L1L1L1L1L1Œ1Œ5m5m9n5m115n5m115m5m1L1L1L1L1L1L1L1L)K)K1L1L5m5m11=Ž=Ž=¯A°=ÏA°5Ž5595559551L1L-l-l) -) -11551L1L1L1L1L1L5J5J-*1*1L1L=Œ=Œ=Ž=Ž5k5k5J5J-*1*)K)K5J5J11=Ž=ŽAðAð5Œ5Œ95=Ž=ŽAïAïIðEðAðAðAïAïAðAð=ï=ïAïAïAïAïAðAð55AïAïAðAð5Œ5Œ-l-l1L1L1L1L1L1L-l-l551L1L111Œ1Œ115m5m-l-l1L1L1L1L1L1L)K)K)K)K1L1L1155A¯=°AÏ=°=¯A¯555955=ð=ð5595IðEð-l-l)K)K-l-l-l-l-l-l55955m5m=Ž=Ž559m5m)K)K) -) -1L1L-l-l11AðAð=Ž=Ž5Œ5Œ=Ž=ŽAðAðAðAðAðAðAðAðAðAð=ï=ïAðAðAðAðAðAð=Ž=Ž=ï=ïIðEð=Ž=Ž1Œ1Œ1L1L1L1L1L1L1L1L1Œ1Œ5m5m9n5m115n5m115m5m1L1L1L1L1L1L1L1L)K)K1L1L5m5m11=Ž=Ž=¯A°=ÏA°5Ž5595559551L1L-l-l) -) -11551L1L1L1L1L1L5J5J-*1*1L1L=Œ=Œ=Ž=Ž5k5k5J5J-*1*)K)K5J5J11=Ž=ŽAðAð5Œ5Œ95=Ž=ŽAïAïIðEðAðAðAïAïAðAð=ï=ïAïAïAïAïAðAð55AïAïAðAð5Œ5Œ-l-l1L1L1L1L1L1L-l-l551L1L111Œ1Œ115m5m-l-l1L1L1L1L1L1L)K)K)K)K1L1L1155A¯=°AÏ=°=¯A¯555955=ð=ð5595IðEð-l-l)K)K-l-l-l-l11(¥(¥0ç0ç,ç,ç5)5)A¯=°$Æ$Æ(¥(¥$¥$¥¥¥ § § ¥ ¥$d$„ „ „¥¥(¥(¥¥¥$¥$¥ § §(¥(¥ § §(¥(¥ Æ Æ(¥(¥ e … „ „¥¥$Æ$Æ § § ¥ ¥ e … ¥ ¥ ¥ ¥(¥(¥5J5J559k5k1L1L5J5J5k5k9k5k5m5m9k5k559k5k5m5m9k5k5k5k1Œ1Œ559)5)11-)-)(ç(ç115I5I9)5)5I5I9)5)5k5k9k5k5k5k5J5J=Œ=Œ5k5k9)5)5)5)5J5J=Œ=Œ-*1*$¥$¥ e …$¥$¥ Æ Æ$¥$¥$¥$¥ „ „ … e „ „ Æ Æ$¥$¥$¥$¥ § § Æ Æ$Æ$Æ § §$¥$¥$Æ$Æ † † ¥ ¥$d$„ÆÆ(¥(¥$¥$¥dd Æ Æ ¥ ¥(¥(¥11=Ž=Ž559I5I5k5k9k5k5k5k9m5m5k5k=Ž=Ž5k5k9m5m5k5k9k5k=Ž=ŽJF=Œ=Œ1)1)----115)5)1)1)5)5)9I5I5)5)5J5J5J5J5J5J5)5)11(¥(¥0ç0ç,ç,ç5)5)A¯=°$Æ$Æ(¥(¥$¥$¥¥¥ § § ¥ ¥$d$„ „ „¥¥(¥(¥¥¥$¥$¥ § §(¥(¥ § §(¥(¥ Æ Æ(¥(¥ e … „ „¥¥$Æ$Æ § § ¥ ¥ e … ¥ ¥ ¥ ¥(¥(¥5J5J559k5k1L1L5J5J5k5k9k5k5m5m9k5k559k5k5m5m9k5k5k5k1Œ1Œ559)5)11-)-)(ç(ç115I5I9)5)5I5I9)5)5k5k9k5k5k5k5J5J=Œ=Œ5k5k9)5)5)5)5J5J=Œ=Œ-*1*$¥$¥ e …$¥$¥ Æ Æ$¥$¥$¥$¥ „ „ … e „ „ Æ Æ$¥$¥$¥$¥ § § Æ Æ$Æ$Æ § §$¥$¥$Æ$Æ † † ¥ ¥$d$„ÆÆ(¥(¥$¥$¥dd Æ Æ ¥ ¥(¥(¥11=Ž=Ž559I5I5k5k9k5k5k5k9m5m5k5k=Ž=Ž5k5k9m5m5k5k9k5k=Ž=ŽJF=Œ=Œ1)1)----115)5)1)1)5)5)9I5I5)5)5J5J5J5J5J5J5)5),Æ,Æ e …$¥$¥$d$„1155(¥(¥ e …dddddddddddc … e$¥$¥ d „dd$„$ddcdddd„ddddddd„c … e ¥ ¥$d$„dddc ¥ ¥$d$„5)5)95,ç,ç(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$Ç$Ç,Æ,Æ0ç0ç,Æ,Æ$Ç$Ç0Æ0Æ5m5m1L1L,Æ,Æ † †$„$„(¥(¥$d$„(¥(¥,¥,¥,¥,¥(¥(¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥55 § §dddddddddcdd„ddd„c … e ¥ ¥c„ d „ d „dd „ ddcdddddd„cdd$¥$¥ e …dddddd(¥(¥,¥,¥5511,¥,¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥$Ç$Ç,Æ,Æ0ç0ç$Ç$Ç0Æ0Æ5)5)AòAñ,é,é$d$„$„$„(¥(¥(¥(¥$d$„$d$„,¥,¥$d$„,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,Æ,Æ e …$¥$¥$d$„1155(¥(¥ e …dddddddddddc … e$¥$¥ d „dd$„$ddcdddd„ddddddd„c … e ¥ ¥$d$„dddc ¥ ¥$d$„5)5)95,ç,ç(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$Ç$Ç,Æ,Æ0ç0ç,Æ,Æ$Ç$Ç0Æ0Æ5m5m1L1L,Æ,Æ † †$„$„(¥(¥$d$„(¥(¥,¥,¥,¥,¥(¥(¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥55 § §dddddddddcdd„ddd„c … e ¥ ¥c„ d „ d „dd „ ddcdddddd„cdd$¥$¥ e …dddddd(¥(¥,¥,¥5511,¥,¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥$Ç$Ç,Æ,Æ0ç0ç$Ç$Ç0Æ0Æ5)5)AòAñ,é,é$d$„$„$„(¥(¥(¥(¥$d$„$d$„,¥,¥$d$„,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,Æ,Æ § §$„$„ † †4ç4ç9m5m § §$d$„dddcdc„ddd „ d„c … eƒdƒddd„ddd„ddddd„„dd„„ … e „ „dddddddd(¥(¥5595$Ç$Ç(¥(¥(¥(¥ § §,¥,¥$Ç$Ç0ç0ç$Ç$Ç0ç0ç$Ç$Ç0ç0ç,é,é=Œ=Œ1L1L,Æ,Æ § §(¥(¥ † †(¥(¥(¥(¥ e …(¥(¥(¥(¥,¥,¥,¥,¥,Æ,Æ0Æ0Æ,Æ,Æ,Æ,Æ,é,é0Æ0Æ,é,é11$Ç$Ç e …$„$„dddd„„dc„ddddd$¥$¥dddd„c„ddddddd„ddddd„„¥¥dd … ecd„„dd … e,Æ,Æ5511 § § § §(¥(¥$Ç$Ç,¥,¥$Ç$Ç0ç0ç$Ç$Ç0ç0ç$Ç$Ç0ç0ç5J5J=Ž=Ž,é,é(¥(¥ § §(¥(¥ † †(¥(¥(¥(¥,¥,¥ § §,¥,¥,¥,¥$Ç$Ç,¥,¥,Æ,Æ,Æ,Æ § §$„$„ † †4ç4ç9m5m § §$d$„dddcdc„ddd „ d„c … eƒdƒddd„ddd„ddddd„„dd„„ … e „ „dddddddd(¥(¥5595$Ç$Ç(¥(¥(¥(¥ § §,¥,¥$Ç$Ç0ç0ç$Ç$Ç0ç0ç$Ç$Ç0ç0ç,é,é=Œ=Œ1L1L,Æ,Æ § §(¥(¥ † †(¥(¥(¥(¥ e …(¥(¥(¥(¥,¥,¥,¥,¥,Æ,Æ0Æ0Æ,Æ,Æ,Æ,Æ,é,é0Æ0Æ,é,é11$Ç$Ç e …$„$„dddd„„dc„ddddd$¥$¥dddd„c„ddddddd„ddddd„„¥¥dd … ecd„„dd … e,Æ,Æ5511 § § § §(¥(¥$Ç$Ç,¥,¥$Ç$Ç0ç0ç$Ç$Ç0ç0ç$Ç$Ç0ç0ç5J5J=Ž=Ž,é,é(¥(¥ § §(¥(¥ † †(¥(¥(¥(¥,¥,¥ § §,¥,¥,¥,¥$Ç$Ç,¥,¥,Æ,Æ,Æ,Æ † † … edd--1L1L,Æ,Ædddddc„ddc„ddddd$¥$¥dd „ „dd„ddddd„d„„dd„„dd¥¥ † †ƒddddd„„ … e--=Ž=Ž,ç,ç0ç0ç$Ç$Ç,¥,¥$Ç$Ç$Ç$Ç,¥,¥$Ç$Ç0ç0ç$Ç$Ç$Ç$Ç0Æ0Æ=Ž=Ž55(¥(¥(¥(¥ † † ¥ ¥ † † § §(¥(¥$Ç$Ç † †$Ç$Ç(¥(¥ § §0ç0ç,é,é0ç0ç,é,é,é,é,é,é55$Ç$Ç e …dd„„dddc„ddddddd¥¥ e …c„ e …cddd„ddd…e„„dddd … e¥¥ e …c„dd„„ … e(¥(¥551*-*0Æ0Æ,Æ,Æ$Ç$Ç † †$Ç$Ç$Ç$Ç0ç0ç$Ç$Ç0ç0ç$Ç$Ç,Æ,Æ5J5J=¯A°$Ç$Ç(¥(¥(¥(¥ e …¥¥ § § § § § §(¥(¥,Æ,Æ$Ç$Ç,¥,¥$Ç$Ç0ç0ç,Æ,Æ † † … edd--1L1L,Æ,Ædddddc„ddc„ddddd$¥$¥dd „ „dd„ddddd„d„„dd„„dd¥¥ † †ƒddddd„„ … e--=Ž=Ž,ç,ç0ç0ç$Ç$Ç,¥,¥$Ç$Ç$Ç$Ç,¥,¥$Ç$Ç0ç0ç$Ç$Ç$Ç$Ç0Æ0Æ=Ž=Ž55(¥(¥(¥(¥ † † ¥ ¥ † † § §(¥(¥$Ç$Ç † †$Ç$Ç(¥(¥ § §0ç0ç,é,é0ç0ç,é,é,é,é,é,é55$Ç$Ç e …dd„„dddc„ddddddd¥¥ e …c„ e …cddd„ddd…e„„dddd … e¥¥ e …c„dd„„ … e(¥(¥551*-*0Æ0Æ,Æ,Æ$Ç$Ç † †$Ç$Ç$Ç$Ç0ç0ç$Ç$Ç0ç0ç$Ç$Ç,Æ,Æ5J5J=¯A°$Ç$Ç(¥(¥(¥(¥ e …¥¥ § § § § § §(¥(¥,Æ,Æ$Ç$Ç,¥,¥$Ç$Ç0ç0ç(ç(ç$Ç$Ç † † … e1155,Æ,Æ d „dddc„d„ddd„ddddddd„„dd„ddd„d…edd„ddd „ „dd$¥$¥dddd„d … e$¥$¥,ç,ç55,ç,ç,é,é,¥,¥$Ç$Ç † †$Ç$Ç$Ç$Ç0ç0ç$Ç$Ç$Ç$Ç0ç0ç,é,é5k5k1L1L „ „†f„d„d„d†f„d¥¥ † †,¥,¥ § §0Æ0Æ,é,é,é,é,é,é--,é,é(ç(ç-*1*,é,é$d$„dc„ddddd„ddc„ddddd … eƒddddd„ddd„ddd„d „ „dd„„¥¥ e …dddd„d$¥$¥(¥(¥5m5m11,é,é,Æ,Æ$Ç$Ç,¥,¥$Ç$Ç,¥,¥$Ç$Ç$Ç$Ç$Ç$Ç,Æ,Æ,é,é5)5)A¯=° ¦ §¥¥f†„„„d…edd¥¥ † † § §,ç,ç § § † †--(ç(ç$Ç$Ç † † … e1155,Æ,Æ d „dddc„d„ddd„ddddddd„„dd„ddd„d…edd„ddd „ „dd$¥$¥dddd„d … e$¥$¥,ç,ç55,ç,ç,é,é,¥,¥$Ç$Ç † †$Ç$Ç$Ç$Ç0ç0ç$Ç$Ç$Ç$Ç0ç0ç,é,é5k5k1L1L „ „†f„d„d„d†f„d¥¥ † †,¥,¥ § §0Æ0Æ,é,é,é,é,é,é--,é,é(ç(ç-*1*,é,é$d$„dc„ddddd„ddc„ddddd … eƒddddd„ddd„ddd„d „ „dd„„¥¥ e …dddd„d$¥$¥(¥(¥5m5m11,é,é,Æ,Æ$Ç$Ç,¥,¥$Ç$Ç,¥,¥$Ç$Ç$Ç$Ç$Ç$Ç,Æ,Æ,é,é5)5)A¯=° ¦ §¥¥f†„„„d…edd¥¥ † † § §,ç,ç § § † †--,ç,ç § §$„$„ … e--55(¥(¥$d$„dddddc„ddddd„c … eƒdcddddd„cdd „ „dddd „ „dcdd „ „dddd„c$„$d$„$d,ç,ç1Œ1Œ55,é,é,ç,ç$Ç$Ç0ç0ç$Ç$Ç$Ç$Ç,é,é0ç0ç$Ç$Ç0ç0ç0ç0ç-*1*-*1*d„¥¥f†e…e…„„…e„d„ddd † † § §11,ç,ç,é,é,ç,ç,é,é,ç,ç-*1*)) d „dƒdddc„ddc„d „ ddd„c$„$ddd „ „dc„cdd„cdd „ „dddcdc … e$„$„cdƒd … e$„$d$¥$¥1L1L1)1)4ç4ç,é,é$Ç$Ç$Ç$Ç$Ç$Ç$Ç$Ç,é,é0ç0ç,é,é$Ç$Ç0ç0ç1155¥¥e…f†e…e…e…e…e…„„dd Æ Ædddd ç ç,ç,ç § §$„$„ … e--55(¥(¥$d$„dddddc„ddddd„c … eƒdcddddd„cdd „ „dddd „ „dcdd „ „dddd„c$„$d$„$d,ç,ç1Œ1Œ55,é,é,ç,ç$Ç$Ç0ç0ç$Ç$Ç$Ç$Ç,é,é0ç0ç$Ç$Ç0ç0ç0ç0ç-*1*-*1*d„¥¥f†e…e…„„…e„d„ddd † † § §11,ç,ç,é,é,ç,ç,é,é,ç,ç-*1*)) d „dƒdddc„ddc„d „ ddd„c$„$ddd „ „dc„cdd„cdd „ „dddcdc … e$„$„cdƒd … e$„$d$¥$¥1L1L1)1)4ç4ç,é,é$Ç$Ç$Ç$Ç$Ç$Ç$Ç$Ç,é,é0ç0ç,é,é$Ç$Ç0ç0ç1155¥¥e…f†e…e…e…e…e…„„dd Æ Ædddd ç ç(ç(ç$Ç$Ç § §$Æ$Æ-*1*55) -) - § § § §¥¥f†f†„„…e„ddc„d„dddÆÆd„dd†f¥¥ Æ Æf†f† § § § § Æ Æ § § ç ç$Ç$Ç$Ç$Ç)K)K1L1L$Ç$Ç § § § §(ç(ç § §$Ç$Ç,Æ,Æ$Ç$Ç § § § § † †(¥(¥=Ž=Ž55d„$¥$¥ ç ç † † † † § §(¥(¥ † †$Æ$Æ$¥$¥,é,é,ç,ç%%-*1*11-*1*1)1)) -) -=Ž=Ž1L1L ç ç$Ç$Ç § §f† † †ÆÆd„e…dd„ddd„„dc†f„„†f„d¥¥ † † † ††fÆÆ § § § § § § § §$Ç$Ç$Ç$Ç) -) --l-l) -) -$Ç$Ç § §(ç(ç,Æ,Æ § §$Ç$Ç,Æ,Æ § § § §(¥(¥ † †11AòAñ § §¥¥ § §$Ç$Ç$¥$¥ † † § § Æ Æ(¥(¥$¥$¥ § §$Ç$Ç ç ç$Æ$Æ(ç(ç$Ç$Ç § §$Æ$Æ-*1*55) -) - § § § §¥¥f†f†„„…e„ddc„d„dddÆÆd„dd†f¥¥ Æ Æf†f† § § § § Æ Æ § § ç ç$Ç$Ç$Ç$Ç)K)K1L1L$Ç$Ç § § § §(ç(ç § §$Ç$Ç,Æ,Æ$Ç$Ç § § § § † †(¥(¥=Ž=Ž55d„$¥$¥ ç ç † † † † § §(¥(¥ † †$Æ$Æ$¥$¥,é,é,ç,ç%%-*1*11-*1*1)1)) -) -=Ž=Ž1L1L ç ç$Ç$Ç § §f† † †ÆÆd„e…dd„ddd„„dc†f„„†f„d¥¥ † † † ††fÆÆ § § § § § § § §$Ç$Ç$Ç$Ç) -) --l-l) -) -$Ç$Ç § §(ç(ç,Æ,Æ § §$Ç$Ç,Æ,Æ § § § §(¥(¥ † †11AòAñ § §¥¥ § §$Ç$Ç$¥$¥ † † § § Æ Æ(¥(¥$¥$¥ § §$Ç$Ç ç ç$Æ$Æ=Œ=Œ=Œ=Œ5m5m9k5k5k5k=Ž=Ž5k5k1*-*1L1L5J5J-*1*) -) -1*-*-)-)-l-l551*-*1L1L-)-)-*1*-*1*1L1L-)-)1L1L)K)K1L1L5k5k1Œ1Œ55=Ž=Ž5Œ5Œ955m5m1Œ1Œ5k5k955n5m)J)J11) -) -)K)K-*1*-*1*) -) -1L1L1L1L-*1*-l-lAðAð=Ž=Ž=ï=ï11=Œ=Œ=Ž=Ž5k5kA¯=°=Ž=ŽAðAð=¯A°=ÏA°=¯=¯AðAð=¯A°AðAð=¯A°=Ž=Ž=Ž=Ž=Œ=Œ=Œ=Œ=Œ=Œ551*-*1Œ1Œ5J5J-*1*) -) -11)K)K-*1*111L1L-*1*)K)K11-*1*1L1L-*1*)J)J1L1L)J)J551L1L5Œ5ŒAðAð551Œ1Œ551Œ1Œ5k5k955k5k1L1L-)-)) -) -) -) -)K)K-*1*) -) -)K)K1L1L-*1*1L1L55AðAð=¯A°551Œ1Œ=Œ=Œ5m5m=Œ=Œ=¯A°=ÏA°=¯=¯AÐ=¯A°=¯IïEï=Ž=Ž=¯A°=Œ=Œ=Œ=Œ5m5m9k5k5k5k=Ž=Ž5k5k1*-*1L1L5J5J-*1*) -) -1*-*-)-)-l-l551*-*1L1L-)-)-*1*-*1*1L1L-)-)1L1L)K)K1L1L5k5k1Œ1Œ55=Ž=Ž5Œ5Œ955m5m1Œ1Œ5k5k955n5m)J)J11) -) -)K)K-*1*-*1*) -) -1L1L1L1L-*1*-l-lAðAð=Ž=Ž=ï=ï11=Œ=Œ=Ž=Ž5k5kA¯=°=Ž=ŽAðAð=¯A°=ÏA°=¯=¯AðAð=¯A°AðAð=¯A°=Ž=Ž=Ž=Ž=Œ=Œ=Œ=Œ=Œ=Œ551*-*1Œ1Œ5J5J-*1*) -) -11)K)K-*1*111L1L-*1*)K)K11-*1*1L1L-*1*)J)J1L1L)J)J551L1L5Œ5ŒAðAð551Œ1Œ551Œ1Œ5k5k955k5k1L1L-)-)) -) -) -) -)K)K-*1*) -) -)K)K1L1L-*1*1L1L55AðAð=¯A°551Œ1Œ=Œ=Œ5m5m=Œ=Œ=¯A°=ÏA°=¯=¯AÐ=¯A°=¯IïEï=Ž=Ž=¯A° e …¥¥$„$„(¥(¥(¥(¥(¥(¥ d „ e …$d$„ „ „¥¥ e …$¥$¥(¥(¥11-*1* Æ Æ,¥,¥,¥,¥(¥(¥(¥(¥,¥,¥(¥(¥(¥(¥$¥$¥(¥(¥$¥$¥(¥(¥ ç ç1L1L--,Æ,Æ § §(¥(¥ § §$„$„ † †(¥(¥ † †$¥$¥¥¥ § § § §(¥(¥(ç(ç(ç(ç,ç,ç$Ç$Ç(ç(ç$Ç$Ç(ç(ç(ç(ç$Ç$Ç(ç(ç,é,é(ç(ç,ç,ç11-*1*,Æ,Æ,Æ,Æ,ç,ç,¥,¥ § §$¥$¥$„$„(¥(¥ e …¥¥$„$„ † †$„$d„c † † ¥ ¥ e … ¥ ¥(¥(¥,Æ,Æ1L1L$Ç$Ç(Å(Å,¥,¥(¥(¥(¥(¥,¥,¥(¥(¥,¥,¥$¥$¥$¥$¥(Å(Å$¥$¥(¥(¥)K)K11(ç(ç § §,¥,¥ † †(¥(¥$¥$¥$¥$¥$¥$¥¥¥$¥$¥ † †$Æ$Æ § §,Æ,Æ(ç(ç(ç(ç,é,é(ç(ç$Æ$Æ(ç(ç(ç(ç,é,é$Ç$Ç,ç,ç(ç(ç,ç,ç,é,é5J5J11(¥(¥ § §cd¥¥ … e¥¥$„$„(¥(¥(¥(¥(¥(¥ d „ e …$d$„ „ „¥¥ e …$¥$¥(¥(¥11-*1* Æ Æ,¥,¥,¥,¥(¥(¥(¥(¥,¥,¥(¥(¥(¥(¥$¥$¥(¥(¥$¥$¥(¥(¥ ç ç1L1L--,Æ,Æ § §(¥(¥ § §$„$„ † †(¥(¥ † †$¥$¥¥¥ § § § §(¥(¥(ç(ç(ç(ç,ç,ç$Ç$Ç(ç(ç$Ç$Ç(ç(ç(ç(ç$Ç$Ç(ç(ç,é,é(ç(ç,ç,ç11-*1*,Æ,Æ,Æ,Æ,ç,ç,¥,¥ § §$¥$¥$„$„(¥(¥ e …¥¥$„$„ † †$„$d„c † † ¥ ¥ e … ¥ ¥(¥(¥,Æ,Æ1L1L$Ç$Ç(Å(Å,¥,¥(¥(¥(¥(¥,¥,¥(¥(¥,¥,¥$¥$¥$¥$¥(Å(Å$¥$¥(¥(¥)K)K11(ç(ç § §,¥,¥ † †(¥(¥$¥$¥$¥$¥$¥$¥¥¥$¥$¥ † †$Æ$Æ § §,Æ,Æ(ç(ç(ç(ç,é,é(ç(ç$Æ$Æ(ç(ç(ç(ç,é,é$Ç$Ç,ç,ç(ç(ç,ç,ç,é,é5J5J11(¥(¥ § §cd¥¥dd … e¥¥ e … † † „ d … edd„„…e † †dd(¥(¥(¥(¥1111,Æ,Æ,¥,¥0Æ0Æ,¥,¥0ç0ç,¥,¥,ç,ç,Æ,Æ,Æ,Æ$Æ$Æ § § § §$ç$ç55,é,é(¥(¥ † † † †(¥(¥ † † † † … e ¥ ¥ e …¥¥ † †$„$„ † †(¥(¥ † †(¥(¥ † † § § ¥ ¥ † †dd…e † †(¥(¥ § §,¥,¥,é,é--,¥,¥$Ç$Ç(¥(¥ † †(¥(¥(¥(¥ † † … e ¥ ¥ e … e … „ „dd¥¥dd … e „ „ … e(¥(¥$Ç$Ç=Œ=Œ--,Æ,Æ,¥,¥,Æ,Æ,¥,¥0ç0ç,Æ,Æ,ç,ç,Æ,Æ$Æ$Æ § §(ç(ç † †1L1L-*1*$Ç$Ç(¥(¥ † † † †$¥$¥ e … † † … e¥¥ e …¥¥ † †(¥(¥ † †(¥(¥ † †(¥(¥ † †(¥(¥ † †…e…e¥¥ † † § §,¥,¥,¥,¥11$Ç$Ç,¥,¥ e …e…dddd … e¥¥ e … † † „ d … edd„„…e † †dd(¥(¥(¥(¥1111,Æ,Æ,¥,¥0Æ0Æ,¥,¥0ç0ç,¥,¥,ç,ç,Æ,Æ,Æ,Æ$Æ$Æ § § § §$ç$ç55,é,é(¥(¥ † † † †(¥(¥ † † † † … e ¥ ¥ e …¥¥ † †$„$„ † †(¥(¥ † †(¥(¥ † † § § ¥ ¥ † †dd…e † †(¥(¥ § §,¥,¥,é,é--,¥,¥$Ç$Ç(¥(¥ † †(¥(¥(¥(¥ † † … e ¥ ¥ e … e … „ „dd¥¥dd … e „ „ … e(¥(¥$Ç$Ç=Œ=Œ--,Æ,Æ,¥,¥,Æ,Æ,¥,¥0ç0ç,Æ,Æ,ç,ç,Æ,Æ$Æ$Æ § §(ç(ç † †1L1L-*1*$Ç$Ç(¥(¥ † † † †$¥$¥ e … † † … e¥¥ e …¥¥ † †(¥(¥ † †(¥(¥ † †(¥(¥ † †(¥(¥ † †…e…e¥¥ † † § §,¥,¥,¥,¥11$Ç$Ç,¥,¥ e …e…dddd¥¥dd … e … e¥¥d„ e …¥¥dd¥¥ † † … e$Æ$Æ-*1*1L1L$d$„,¥,¥,ç,ç,Æ,Æ,Æ,Æ,Æ,Æ,Æ,Æ0ç0ç$Ç$Ç(ç(ç$Ç$Ç ç ç § §1L1L11$¥$¥ † †$¥$¥ † †dd$¥$¥¥¥ e … e …¥¥ † †$¥$¥ † † § §(¥(¥ † † § §(¥(¥ † † † † … e¥¥ † † † †(¥(¥ § §0Æ0Æ,é,é § §,¥,¥ § §(¥(¥ e … † †(¥(¥ e … e … „ „¥¥dd¥¥e… e …„„¥¥ e … † †,ç,ç5m5m † †,¥,¥,Æ,Æ0ç0ç,Æ,Æ,¥,¥0Æ0Æ0ç0ç$Ç$Ç,Æ,Æ$Ç$Ç$Ç$ÇÆÆ-*1*11 § § § §$¥$¥ † † † †dd$¥$¥ e …¥¥ † † † † † † … e(¥(¥ † †(¥(¥ † †$Æ$Æ † † † †¥¥ e … † † † †(¥(¥ § §,¥,¥11$Ç$Ç,¥,¥$Ç$Ç e … „ „dd¥¥dd … e … e¥¥d„ e …¥¥dd¥¥ † † … e$Æ$Æ-*1*1L1L$d$„,¥,¥,ç,ç,Æ,Æ,Æ,Æ,Æ,Æ,Æ,Æ0ç0ç$Ç$Ç(ç(ç$Ç$Ç ç ç § §1L1L11$¥$¥ † †$¥$¥ † †dd$¥$¥¥¥ e … e …¥¥ † †$¥$¥ † † § §(¥(¥ † † § §(¥(¥ † † † † … e¥¥ † † † †(¥(¥ § §0Æ0Æ,é,é § §,¥,¥ § §(¥(¥ e … † †(¥(¥ e … e … „ „¥¥dd¥¥e… e …„„¥¥ e … † †,ç,ç5m5m † †,¥,¥,Æ,Æ0ç0ç,Æ,Æ,¥,¥0Æ0Æ0ç0ç$Ç$Ç,Æ,Æ$Ç$Ç$Ç$ÇÆÆ-*1*11 § § § §$¥$¥ † † † †dd$¥$¥ e …¥¥ † † † † † † … e(¥(¥ † †(¥(¥ † †$Æ$Æ † † † †¥¥ e … † † † †(¥(¥ § §,¥,¥11$Ç$Ç,¥,¥$Ç$Ç e … „ „dd„d … e¥¥dddd„d¥¥e… e …¥¥ e …¥¥ † †11-*1*$¥$¥(¥(¥0Æ0Æ,Æ,Æ0Æ0Æ0ç0ç0ç0ç0Æ0Æ0ç0ç § §$Ç$Ç Æ Æ ç ç-*1*,é,é$¥$¥ † †$¥$¥ e … † †¥¥e… † †dd$¥$¥ † † † †$¥$¥ † †$¥$¥ † †(¥(¥ † † † †¥¥dd¥¥ † †$¥$¥ † †,¥,¥0ç0ç,é,é,¥,¥$Ç$Ç † †,¥,¥ § §(¥(¥e… † †dddd…edd„d$¥$¥e… e …¥¥ e …¥¥$Ç$Ç5n5m § §(Å(Å,¥,¥0ç0ç,Æ,Æ0ç0ç0ç0ç0Æ0Æ0ç0ç$Ç$Ç$Ç$Ç § §„„)K)K11 § §(¥(¥$¥$¥ e …¥¥ e …¥¥ e …¥¥ e …¥¥ † †(¥(¥ † †$¥$¥ † † † †$Æ$Æ † † … e … e„„ † † § § ¥ ¥(¥(¥$Ç$Ç55$Ç$Ç$Ç$Ç$„$„…edddd„d … e¥¥dddd„d¥¥e… e …¥¥ e …¥¥ † †11-*1*$¥$¥(¥(¥0Æ0Æ,Æ,Æ0Æ0Æ0ç0ç0ç0ç0Æ0Æ0ç0ç § §$Ç$Ç Æ Æ ç ç-*1*,é,é$¥$¥ † †$¥$¥ e … † †¥¥e… † †dd$¥$¥ † † † †$¥$¥ † †$¥$¥ † †(¥(¥ † † † †¥¥dd¥¥ † †$¥$¥ † †,¥,¥0ç0ç,é,é,¥,¥$Ç$Ç † †,¥,¥ § §(¥(¥e… † †dddd…edd„d$¥$¥e… e …¥¥ e …¥¥$Ç$Ç5n5m § §(Å(Å,¥,¥0ç0ç,Æ,Æ0ç0ç0ç0ç0Æ0Æ0ç0ç$Ç$Ç$Ç$Ç § §„„)K)K11 § §(¥(¥$¥$¥ e …¥¥ e …¥¥ e …¥¥ e …¥¥ † †(¥(¥ † †$¥$¥ † † † †$Æ$Æ † † … e … e„„ † † § § ¥ ¥(¥(¥$Ç$Ç55$Ç$Ç$Ç$Ç$„$„…edddd„„…edd…e¥¥dd…e … edd¥¥ e …dd$¥$¥,é,é-l-l,Æ,Æ,ç,ç4ç4ç95========,é,é,Æ,Æ § §ÆÆ ç ç-*1*$Ç$Ç(¥(¥ † † † †¥¥ e … e …¥¥ e …¥¥ e … Æ Æ e … † †$¥$¥ † † † † § §$¥$¥ e …e…dd„„ † † † †(¥(¥ † †0Æ0Æ-*1*$Ç$Ç(¥(¥ † † † † § §(¥(¥ † † … e „ „dd¥¥dd…e…e „ „…e † †dd$¥$¥ § §1L1L11,Æ,Æ4ç4ç0Æ0Æ========4ç4ç$Ç$Ç(ç(ç § §$Ç$Ç1L1L$ç$ç § § § § † †$¥$¥ e …¥¥ e … e …¥¥ † † † † † † † †(¥(¥ e … § §$¥$¥ † † … e¥¥e…dd¥¥ † †(¥(¥ † †,¥,¥-*1*,é,é(¥(¥e… d „dddd„„…edd…e¥¥dd…e … edd¥¥ e …dd$¥$¥,é,é-l-l,Æ,Æ,ç,ç4ç4ç95========,é,é,Æ,Æ § §ÆÆ ç ç-*1*$Ç$Ç(¥(¥ † † † †¥¥ e … e …¥¥ e …¥¥ e … Æ Æ e … † †$¥$¥ † † † † § §$¥$¥ e …e…dd„„ † † † †(¥(¥ † †0Æ0Æ-*1*$Ç$Ç(¥(¥ † † † † § §(¥(¥ † † … e „ „dd¥¥dd…e…e „ „…e † †dd$¥$¥ § §1L1L11,Æ,Æ4ç4ç0Æ0Æ========4ç4ç$Ç$Ç(ç(ç § §$Ç$Ç1L1L$ç$ç § § § § † †$¥$¥ e …¥¥ e … e …¥¥ † † † † † † † †(¥(¥ e … § §$¥$¥ † † … e¥¥e…dd¥¥ † †(¥(¥ † †,¥,¥-*1*,é,é(¥(¥e… d „dddddddd„„dddddcdddd¥¥dd¥¥ † †(¥(¥,é,é1L1L ç ç$Ç$Ç § §,Æ,Æ,é,é55,é,é,Æ,Æ,Æ,Æe…¥¥ e …) -) -) -) -(¥(¥ † †$¥$¥ e …¥¥ e …dd¥¥dd¥¥ † †dd$¥$¥$¥$¥ † †(¥(¥ † †$¥$¥dd¥¥ e … „ „¥¥ † † † †(¥(¥,¥,¥,é,é1L1L(¥(¥(¥(¥ † †,¥,¥ † † † †(¥(¥ d „dddd ¥ ¥dddddd¥¥dd „ „¥¥(¥(¥$Ç$Ç-*1*) -) -(ç(ç § §(ç(ç$Ç$Ç55,é,é0ç0ç$Ç$Ç(¥(¥e…¥¥$Ç$Ç)K)K,Æ,Æ$¥$¥ † † … e „ „ … e…e¥¥dd … e¥¥ e … ¥ ¥ e …$¥$¥(¥(¥$¥$¥ e … † †¥¥ e … ¥ ¥dd † †$¥$¥(¥(¥ † †0Æ0Æ-*1*,é,é(¥(¥(¥(¥dd … edddddd„„dddddcdddd¥¥dd¥¥ † †(¥(¥,é,é1L1L ç ç$Ç$Ç § §,Æ,Æ,é,é55,é,é,Æ,Æ,Æ,Æe…¥¥ e …) -) -) -) -(¥(¥ † †$¥$¥ e …¥¥ e …dd¥¥dd¥¥ † †dd$¥$¥$¥$¥ † †(¥(¥ † †$¥$¥dd¥¥ e … „ „¥¥ † † † †(¥(¥,¥,¥,é,é1L1L(¥(¥(¥(¥ † †,¥,¥ † † † †(¥(¥ d „dddd ¥ ¥dddddd¥¥dd „ „¥¥(¥(¥$Ç$Ç-*1*) -) -(ç(ç § §(ç(ç$Ç$Ç55,é,é0ç0ç$Ç$Ç(¥(¥e…¥¥$Ç$Ç)K)K,Æ,Æ$¥$¥ † † … e „ „ … e…e¥¥dd … e¥¥ e … ¥ ¥ e …$¥$¥(¥(¥$¥$¥ e … † †¥¥ e … ¥ ¥dd † †$¥$¥(¥(¥ † †0Æ0Æ-*1*,é,é(¥(¥(¥(¥dd … e § § § § ç ç ç 祥 † † ç ç Æ Æ ç ç § §f† § § § § § §)K)K-*1*e…dd„d C C ddf†f†„„ § §!!)K)K) -) -11)K)K § § § §ÆÆ § § § §f†f†¥¥ e …f†f† ç ç § § § § § § † † † † § § § § e …$¥$¥e…f† § §$Ç$Ç,é,é$Ç$Ç,é,é5m5m1*-*,é,é11) -) -$Ç$Ç$Ç$Ç † ††f¥¥f†d„d„d„d„ † ††f § § Æ Æ § §$Ç$Ç1Ž1 ç çddd„d„dde…f†e…f†%%)K)K!!!!1L1L § § § § § § § §ÆÆ § §e… e …¥¥f†e… § § § § § § § § † † § § † † § §$¥$¥e…¥¥ e … Æ Æ § §$Ç$Ç,é,é,Æ,Æ1L1L1L1L,é,é,é,é,é,é%% § § § § ç ç ç 祥 † † ç ç Æ Æ ç ç § §f† § § § § § §)K)K-*1*e…dd„d C C ddf†f†„„ § §!!)K)K) -) -11)K)K § § § §ÆÆ § § § §f†f†¥¥ e …f†f† ç ç § § § § § § † † † † § § § § e …$¥$¥e…f† § §$Ç$Ç,é,é$Ç$Ç,é,é5m5m1*-*,é,é11) -) -$Ç$Ç$Ç$Ç † ††f¥¥f†d„d„d„d„ † ††f § § Æ Æ § §$Ç$Ç1Ž1 ç çddd„d„dde…f†e…f†%%)K)K!!!!1L1L § § § § § § § §ÆÆ § §e… e …¥¥f†e… § § § § § § § § † † § § † † § §$¥$¥e…¥¥ e … Æ Æ § §$Ç$Ç,é,é,Æ,Æ1L1L1L1L,é,é,é,é,é,é%%559k5k559k5k1L1LAðAð551)1)1L1L-)-))K)K-*1*-*1*1Œ1Œ1L1L5k5k1*-*)K)K-*1*-*1*)K)K1L1L551Œ1Œ=¯A°=ÏA°5559Ž=Œ=Œ=Œ=Œ555Ž955595k5kIðEðA¯=°1Œ1Œ111Œ1Œ55AðAð55955n5m95559k5k1Œ1Œ=Ž=ŽAòAñ=ð=ð55=Ž=Ž=¯A°=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž55=Ž=Ž551L1L5m5m11-*1*) -) -1*-*)K)K) -) -1L1L1Œ1Œ-*1*-*1*-l-l1L1L5k5k1L1L-*1*)K)K1L1L1)1)-l-l559n5m5Œ5ŒAðAð=Ž=Ž=Œ=Œ=Ž=Ž=Ž=Ž559Ž5559Ž55595AòAñ5Œ5Œ11551L1L=ï=ïAðAð1Œ1Œ55955Ž5951L1L55AðAðAòAñ55=Ž=ŽAðAð=¯A°=Ž=Ž=Ž=Ž=Ž=Ž=¯A°9Œ=Œ=Ž=Ž55=Ž=Ž595k5k595k5k1L1LAðAð551)1)1L1L-)-))K)K-*1*-*1*1Œ1Œ1L1L5k5k1*-*)K)K-*1*-*1*)K)K1L1L551Œ1Œ=¯A°=ÏA°5559Ž=Œ=Œ=Œ=Œ555Ž955595k5kIðEðA¯=°1Œ1Œ111Œ1Œ55AðAð55955n5m95559k5k1Œ1Œ=Ž=ŽAòAñ=ð=ð55=Ž=Ž=¯A°=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž55=Ž=Ž551L1L5m5m11-*1*) -) -1*-*)K)K) -) -1L1L1Œ1Œ-*1*-*1*-l-l1L1L5k5k1L1L-*1*)K)K1L1L1)1)-l-l559n5m5Œ5ŒAðAð=Ž=Ž=Œ=Œ=Ž=Ž=Ž=Ž559Ž5559Ž55595AòAñ5Œ5Œ11551L1L=ï=ïAðAð1Œ1Œ55955Ž5951L1L55AðAðAòAñ55=Ž=ŽAðAð=¯A°=Ž=Ž=Ž=Ž=Ž=Ž=¯A°9Œ=Œ=Ž=Ž55=Ž=Ž(ç(ç(¥(¥,Æ,Æ,¥,¥,Æ,ÆAðAð)J)J e …$¥$¥$„$„ † † … e ¥ ¥$¥$¥$¥$¥(¥(¥$Æ$Æ § §$Æ$Æ § §(¥(¥$Æ$Æ$Æ$Æ$Ç$Ç,Æ,Æ$Æ$Æ(¥(¥ † †$¥$¥(¥(¥$¥$¥$¥$¥(¥(¥,Æ,Æ(¥(¥5k5kIðIð) -) -(¥(¥ § §(¥(¥ § § ¥ ¥(¥(¥$¥$¥$¥$¥$Æ$Æ(¥(¥,¥,¥,é,éAðAð5)5)11,ç,ç(ç(ç,ç,ç,ç,ç,Æ,Æ(ç(ç(¥(¥ § §(ç(ç(¥(¥$Ç$Ç(ç(ç(¥(¥55=Ž=Ž(¥(¥ † †$¥$¥(¥(¥(¥(¥ † †$¥$¥ e … ¥ ¥(¥(¥(¥(¥ † †(¥(¥ § §,Æ,Æ § §(¥(¥ § §(¥(¥(ç(ç(ç(ç$Æ$Æ(¥(¥ † †(¥(¥ † †$¥$¥$¥$¥(¥(¥,¥,¥(ç(ç0ç0çAïAï1L1L,Æ,Æ § §(¥(¥ § § ¥ ¥(¥(¥$¥$¥$¥$¥ † †(¥(¥,Æ,Æ,Æ,Æ5m5m=Ž=Ž11(ç(ç$Ç$Ç,Æ,Æ11,Æ,Æ$Ç$Ç(¥(¥$Æ$Æ$Æ$Æ(¥(¥,Æ,Æ(ç(ç(¥(¥,Æ,Æ,¥,¥,Æ,ÆAðAð)J)J e …$¥$¥$„$„ † † … e ¥ ¥$¥$¥$¥$¥(¥(¥$Æ$Æ § §$Æ$Æ § §(¥(¥$Æ$Æ$Æ$Æ$Ç$Ç,Æ,Æ$Æ$Æ(¥(¥ † †$¥$¥(¥(¥$¥$¥$¥$¥(¥(¥,Æ,Æ(¥(¥5k5kIðIð) -) -(¥(¥ § §(¥(¥ § § ¥ ¥(¥(¥$¥$¥$¥$¥$Æ$Æ(¥(¥,¥,¥,é,éAðAð5)5)11,ç,ç(ç(ç,ç,ç,ç,ç,Æ,Æ(ç(ç(¥(¥ § §(ç(ç(¥(¥$Ç$Ç(ç(ç(¥(¥55=Ž=Ž(¥(¥ † †$¥$¥(¥(¥(¥(¥ † †$¥$¥ e … ¥ ¥(¥(¥(¥(¥ † †(¥(¥ § §,Æ,Æ § §(¥(¥ § §(¥(¥(ç(ç(ç(ç$Æ$Æ(¥(¥ † †(¥(¥ † †$¥$¥$¥$¥(¥(¥,¥,¥(ç(ç0ç0çAïAï1L1L,Æ,Æ § §(¥(¥ § § ¥ ¥(¥(¥$¥$¥$¥$¥ † †(¥(¥,Æ,Æ,Æ,Æ5m5m=Ž=Ž11(ç(ç$Ç$Ç,Æ,Æ11,Æ,Æ$Ç$Ç(¥(¥$Æ$Æ$Æ$Æ(¥(¥,Æ,Æ(¥(¥(¥(¥,¥,¥ § §,Æ,Æ5m5m11$¥$¥ † †$„$„$„$„$¥$¥(¥(¥(¥(¥ † †$„$„ † †(¥(¥(¥(¥ † †$Æ$Æ,¥,¥$Ç$Ç(¥(¥ § §(¥(¥ † †(¥(¥ e … ¥ ¥$„$„ § §,¥,¥,Æ,Æ,Æ,Æ5J5JAðAð11 § §$¥$¥(¥(¥(¥(¥$¥$¥ § §(¥(¥(¥(¥ † †,¥,¥$Ç$Ç4ç4ç95$Ç$Ç(¥(¥(¥(¥,Æ,Æ † †(¥(¥,Æ,Æ † †$Æ$Æ(¥(¥ † † § § Æ Æ(¥(¥(¥(¥559m5m † †$„$d$„$„ † †$„$„(¥(¥$„$„ † †$„$„(¥(¥ † †(¥(¥ † †$¥$¥(¥(¥$¥$¥ † †$Æ$Æ,¥,¥ † †,Æ,Æ § §(¥(¥$¥$¥ † †$¥$¥$„$„$¥$¥(¥(¥,Æ,Æ,Æ,Æ0ç0çAðAð55(¥(¥ § §$„$„ § §(¥(¥(¥(¥ § §$„$„ § §(¥(¥,¥,¥,¥,¥551*-*$¥$¥,¥,¥(¥(¥,¥,¥ † †,Æ,Æ(¥(¥ † †$Æ$Æ § §(¥(¥,¥,¥(¥(¥(¥(¥,¥,¥ § §,Æ,Æ5m5m11$¥$¥ † †$„$„$„$„$¥$¥(¥(¥(¥(¥ † †$„$„ † †(¥(¥(¥(¥ † †$Æ$Æ,¥,¥$Ç$Ç(¥(¥ § §(¥(¥ † †(¥(¥ e … ¥ ¥$„$„ § §,¥,¥,Æ,Æ,Æ,Æ5J5JAðAð11 § §$¥$¥(¥(¥(¥(¥$¥$¥ § §(¥(¥(¥(¥ † †,¥,¥$Ç$Ç4ç4ç95$Ç$Ç(¥(¥(¥(¥,Æ,Æ † †(¥(¥,Æ,Æ † †$Æ$Æ(¥(¥ † † § § Æ Æ(¥(¥(¥(¥559m5m † †$„$d$„$„ † †$„$„(¥(¥$„$„ † †$„$„(¥(¥ † †(¥(¥ † †$¥$¥(¥(¥$¥$¥ † †$Æ$Æ,¥,¥ † †,Æ,Æ § §(¥(¥$¥$¥ † †$¥$¥$„$„$¥$¥(¥(¥,Æ,Æ,Æ,Æ0ç0çAðAð55(¥(¥ § §$„$„ § §(¥(¥(¥(¥ § §$„$„ § §(¥(¥,¥,¥,¥,¥551*-*$¥$¥,¥,¥(¥(¥,¥,¥ † †,Æ,Æ(¥(¥ † †$Æ$Æ § §(¥(¥,¥,¥(¥(¥,Æ,Æ † †(¥(¥,¥,¥-*1*%%$„$„(¥(¥ d „(¥(¥$d$„(¥(¥ † †$„$„(¥(¥(¥(¥ † †$„$„(¥(¥ † †(¥(¥(¥(¥(¥(¥(¥(¥,Æ,Æ(¥(¥ † †$¥$¥(¥(¥(¥(¥,¥,¥0ç0ç,Å,Å(¥(¥5k5kA¯=°$Ç$Ç(¥(¥ § §$„$„ † †(¥(¥ † †(¥(¥ † †(¥(¥ § §$d$„0ç0çAòAñ(ç(ç,¥,¥(¥(¥,¥,¥ § §(¥(¥,¥,¥,Æ,Æ § §(¥(¥ † †$Æ$Æ(¥(¥ † †,¥,¥-*1*-l-l(¥(¥$d$„ e …$„$„ † †$ƒ$d(¥(¥(¥(¥$„$„ † †$„$„(¥(¥$„$„$¥$¥ † †$„$„$¥$¥ † †(¥(¥,¥,¥$Æ$Æ,¥,¥(¥(¥$¥$¥ † †(¥(¥(¥(¥(¥(¥,Æ,Æ,Å,Å(¥(¥11AðAð-*1*(¥(¥ § §(¥(¥ † †$¥$¥(¥(¥ † †(¥(¥ † †(¥(¥ § §,¥,¥=Œ=Œ1L1L,¥,¥,¥,¥,Æ,Æ § §(¥(¥,¥,¥$Æ$Æ(¥(¥,¥,¥ § §(¥(¥ § §(¥(¥,Æ,Æ † †(¥(¥,¥,¥-*1*%%$„$„(¥(¥ d „(¥(¥$d$„(¥(¥ † †$„$„(¥(¥(¥(¥ † †$„$„(¥(¥ † †(¥(¥(¥(¥(¥(¥(¥(¥,Æ,Æ(¥(¥ † †$¥$¥(¥(¥(¥(¥,¥,¥0ç0ç,Å,Å(¥(¥5k5kA¯=°$Ç$Ç(¥(¥ § §$„$„ † †(¥(¥ † †(¥(¥ † †(¥(¥ § §$d$„0ç0çAòAñ(ç(ç,¥,¥(¥(¥,¥,¥ § §(¥(¥,¥,¥,Æ,Æ § §(¥(¥ † †$Æ$Æ(¥(¥ † †,¥,¥-*1*-l-l(¥(¥$d$„ e …$„$„ † †$ƒ$d(¥(¥(¥(¥$„$„ † †$„$„(¥(¥$„$„$¥$¥ † †$„$„$¥$¥ † †(¥(¥,¥,¥$Æ$Æ,¥,¥(¥(¥$¥$¥ † †(¥(¥(¥(¥(¥(¥,Æ,Æ,Å,Å(¥(¥11AðAð-*1*(¥(¥ § §(¥(¥ † †$¥$¥(¥(¥ † †(¥(¥ † †(¥(¥ § §,¥,¥=Œ=Œ1L1L,¥,¥,¥,¥,Æ,Æ § §(¥(¥,¥,¥$Æ$Æ(¥(¥,¥,¥ § §(¥(¥ § §(¥(¥$¥$¥ § §(¥(¥ † †-*1*,é,é † †$„$„$„$„$„$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥ e …$¥$¥$„$„ † †$„$„(¥(¥(¥(¥(¥(¥,Æ,Æ(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥,Å,Å0ç0ç,Å,Å,Æ,Æ,Å,Å55A°=¯$Ç$Ç(¥(¥ † †$¥$¥ † †(¥(¥ † † ¥ ¥$„$„ † †(¥(¥(¥(¥,ç,ç=¯A°,è,é,¥,¥,¥,¥(¥(¥,¥,¥,Æ,Æ,¥,¥(¥(¥,¥,¥ § §(¥(¥ † †$Æ$Æ § § § §--5m5m(¥(¥ d „ d „$d$„$¥$¥$„$„$„$d(¥(¥(¥(¥(¥(¥(¥(¥ † †$„$„(¥(¥ e …(¥(¥ † †(¥(¥(¥(¥(¥(¥,¥,¥,Æ,Æ(¥(¥(¥(¥(¥(¥(¥(¥,Å,Å0ç0ç,¥,¥0ç0ç,Å,Å11=ð=ð-*1*$¥$¥$¥$¥ † †$„$„ † †(¥(¥ † †$¥$¥ † †$¥$¥(¥(¥(¥(¥=Œ=Œ1L1L,¥,¥,¥,¥(¥(¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥ § §(¥(¥ † †(¥(¥(¥(¥$¥$¥ § §(¥(¥ † †-*1*,é,é † †$„$„$„$„$„$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥ e …$¥$¥$„$„ † †$„$„(¥(¥(¥(¥(¥(¥,Æ,Æ(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥,Å,Å0ç0ç,Å,Å,Æ,Æ,Å,Å55A°=¯$Ç$Ç(¥(¥ † †$¥$¥ † †(¥(¥ † † ¥ ¥$„$„ † †(¥(¥(¥(¥,ç,ç=¯A°,è,é,¥,¥,¥,¥(¥(¥,¥,¥,Æ,Æ,¥,¥(¥(¥,¥,¥ § §(¥(¥ † †$Æ$Æ § § § §--5m5m(¥(¥ d „ d „$d$„$¥$¥$„$„$„$d(¥(¥(¥(¥(¥(¥(¥(¥ † †$„$„(¥(¥ e …(¥(¥ † †(¥(¥(¥(¥(¥(¥,¥,¥,Æ,Æ(¥(¥(¥(¥(¥(¥(¥(¥,Å,Å0ç0ç,¥,¥0ç0ç,Å,Å11=ð=ð-*1*$¥$¥$¥$¥ † †$„$„ † †(¥(¥ † †$¥$¥ † †$¥$¥(¥(¥(¥(¥=Œ=Œ1L1L,¥,¥,¥,¥(¥(¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥ § §(¥(¥ † †(¥(¥$¥$¥(¥(¥ † †(¥(¥,¥,¥) -) -11$„$„$„$d$„$„(¥(¥(¥(¥$d$„(¥(¥(¥(¥$d$„$„$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥,Æ,Æ,Æ,Æ(¥(¥,Æ,Æ,¥,¥,Æ,Æ,¥,¥,Æ,Æ,Æ,Æ0ç0ç,Å,Å5J5J=ð=ð,é,é$¥$¥$¥$¥ † †(¥(¥ e …$¥$¥ † †$¥$¥ † †(¥(¥ § §0Æ0Æ550ç0ç,Å,Å0Æ0Æ,¥,¥(¥(¥(¥(¥,¥,¥,Æ,Æ(¥(¥(¥(¥ † †$Æ$Æ,¥,¥ § §(¥(¥-*1*55$„$„ „ d „ d$„$d$„$„$„$d$„$d(¥(¥(¥(¥(¥(¥$d$„(¥(¥$„$„(¥(¥$„$„(¥(¥(¥(¥(¥(¥$d$„,¥,¥0Æ0Æ,Å,Å,Æ,Æ(¥(¥,Æ,Æ,¥,¥,Æ,Æ,¥,¥0ç0ç,Å,Å,Æ,Æ11551Œ1Œ(¥(¥ † †(¥(¥ † †$¥$¥ e …$¥$¥ † †$¥$¥ † †(¥(¥(¥(¥5k5k1L1L,¥,¥,Å,Å,¥,¥,¥,¥,Æ,Æ(¥(¥,¥,¥,Æ,Æ(¥(¥ § §(¥(¥ † †$¥$¥(¥(¥ † †(¥(¥,¥,¥) -) -11$„$„$„$d$„$„(¥(¥(¥(¥$d$„(¥(¥(¥(¥$d$„$„$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥,Æ,Æ,Æ,Æ(¥(¥,Æ,Æ,¥,¥,Æ,Æ,¥,¥,Æ,Æ,Æ,Æ0ç0ç,Å,Å5J5J=ð=ð,é,é$¥$¥$¥$¥ † †(¥(¥ e …$¥$¥ † †$¥$¥ † †(¥(¥ § §0Æ0Æ550ç0ç,Å,Å0Æ0Æ,¥,¥(¥(¥(¥(¥,¥,¥,Æ,Æ(¥(¥(¥(¥ † †$Æ$Æ,¥,¥ § §(¥(¥-*1*55$„$„ „ d „ d$„$d$„$„$„$d$„$d(¥(¥(¥(¥(¥(¥$d$„(¥(¥$„$„(¥(¥$„$„(¥(¥(¥(¥(¥(¥$d$„,¥,¥0Æ0Æ,Å,Å,Æ,Æ(¥(¥,Æ,Æ,¥,¥,Æ,Æ,¥,¥0ç0ç,Å,Å,Æ,Æ11551Œ1Œ(¥(¥ † †(¥(¥ † †$¥$¥ e …$¥$¥ † †$¥$¥ † †(¥(¥(¥(¥5k5k1L1L,¥,¥,Å,Å,¥,¥,¥,¥,Æ,Æ(¥(¥,¥,¥,Æ,Æ(¥(¥ § §(¥(¥ † † † †$„$„(¥(¥(¥(¥,é,é55%% e … e … e …$d$„$¥$¥(¥(¥$„$„(¥(¥(¥(¥ e … e …$¥$¥$d$„(¥(¥(¥(¥,¥,¥,¥,¥0Æ0Æ(¥(¥(¥(¥,Æ,Æ(¥(¥,Æ,Æ(¥(¥0ç0ç(Å(Å(¥(¥,¥,¥-)-)AðAð)) † †(¥(¥ † † … e$¥$¥ † † … e(¥(¥$¥$¥ † †(¥(¥$¥$¥1L1L,é,é,¥,¥,¥,¥,¥,¥,Æ,Æ,¥,¥,¥,¥,Æ,Æ0Æ0Æ(¥(¥(¥(¥(¥(¥ † †(¥(¥ e …--55(¥(¥ c d d „ d „$d$„$„$„ ¥ ¥$„$„(¥(¥(¥(¥$„$„(¥(¥ d „$„$„ † †$„$„(¥(¥(¥(¥,¥,¥,¥,¥,Å,Å,Å,Å(¥(¥(¥(¥,Æ,Æ(¥(¥,Æ,Æ,Å,Å,Æ,Æ,Å,Å(¥(¥(ç(ç559n5m$d$„ § §$„$„ † †$¥$¥ † † † † ¥ ¥$„$„ § §(¥(¥ e …-*1*-*1*,¥,¥,¥,¥,Æ,Æ,¥,¥,¥,¥,¥,¥,Æ,Æ,¥,¥,Æ,Æ$¥$¥ e …$d$„ † †$„$„(¥(¥(¥(¥,é,é55%% e … e … e …$d$„$¥$¥(¥(¥$„$„(¥(¥(¥(¥ e … e …$¥$¥$d$„(¥(¥(¥(¥,¥,¥,¥,¥0Æ0Æ(¥(¥(¥(¥,Æ,Æ(¥(¥,Æ,Æ(¥(¥0ç0ç(Å(Å(¥(¥,¥,¥-)-)AðAð)) † †(¥(¥ † † … e$¥$¥ † † … e(¥(¥$¥$¥ † †(¥(¥$¥$¥1L1L,é,é,¥,¥,¥,¥,¥,¥,Æ,Æ,¥,¥,¥,¥,Æ,Æ0Æ0Æ(¥(¥(¥(¥(¥(¥ † †(¥(¥ e …--55(¥(¥ c d d „ d „$d$„$„$„ ¥ ¥$„$„(¥(¥(¥(¥$„$„(¥(¥ d „$„$„ † †$„$„(¥(¥(¥(¥,¥,¥,¥,¥,Å,Å,Å,Å(¥(¥(¥(¥,Æ,Æ(¥(¥,Æ,Æ,Å,Å,Æ,Æ,Å,Å(¥(¥(ç(ç559n5m$d$„ § §$„$„ † †$¥$¥ † † † † ¥ ¥$„$„ § §(¥(¥ e …-*1*-*1*,¥,¥,¥,¥,Æ,Æ,¥,¥,¥,¥,¥,¥,Æ,Æ,¥,¥,Æ,Æ$¥$¥ e …$d$„ † †$Ç$Ç$Ç$Ç$Ç$Ç-*1*1L1L1L1L § § § § † † § § † † § § § §%%$Ç$Ç$Ç$Ç))$Ç$Ç%%,é,é$Ç$Ç,é,é)) § §)) § §$Ç$Ç$Ç$Ç$Ç$Ç,é,é-)-)-*1*5J5J5m5m9n5m1Œ1Œ-*1* † † § § § §$Ç$Ç!!!!$Ç$Ç!!$Ç$Ç!!1L1L5m5m95-*1*$Ç$Ç$Ç$Ç$Ç$Ç$Ç$Ç%%$Ç$Ç,é,é%%) -) -) -) -1*-*) -) -1*-*1*-*9Ž5AòAñ11,é,é,é,é%% § § § § † † § § § § § §$Ç$Ç!!$Ç$Ç$Ç$Ç%%$Ç$Ç,é,é%%,é,é,é,é ç ç$Ç$Ç § §$Ç$Ç$Ç$Ç$Ç$Ç)),é,é) -) -1*-*9k5k=Ž=Ž1Œ1Œ5m5m § § § §$Ç$Ç § § ç ç!! § §$Ç$Ç!!$Ç$Ç) -) -9m5m5595$Ç$Ç$Ç$Ç$Ç$Ç$Ç$Ç$Ç$Ç) -) -$Ç$Ç) -) -,é,é) -) -) -) -%% † †$Ç$Ç$Ç$Ç$Ç$Ç-*1*1L1L1L1L § § § § † † § § † † § § § §%%$Ç$Ç$Ç$Ç))$Ç$Ç%%,é,é$Ç$Ç,é,é)) § §)) § §$Ç$Ç$Ç$Ç$Ç$Ç,é,é-)-)-*1*5J5J5m5m9n5m1Œ1Œ-*1* † † § § § §$Ç$Ç!!!!$Ç$Ç!!$Ç$Ç!!1L1L5m5m95-*1*$Ç$Ç$Ç$Ç$Ç$Ç$Ç$Ç%%$Ç$Ç,é,é%%) -) -) -) -1*-*) -) -1*-*1*-*9Ž5AòAñ11,é,é,é,é%% § § § § † † § § § § § §$Ç$Ç!!$Ç$Ç$Ç$Ç%%$Ç$Ç,é,é%%,é,é,é,é ç ç$Ç$Ç § §$Ç$Ç$Ç$Ç$Ç$Ç)),é,é) -) -1*-*9k5k=Ž=Ž1Œ1Œ5m5m § § § §$Ç$Ç § § ç ç!! § §$Ç$Ç!!$Ç$Ç) -) -9m5m5595$Ç$Ç$Ç$Ç$Ç$Ç$Ç$Ç$Ç$Ç) -) -$Ç$Ç) -) -,é,é) -) -) -) -%%55AðAð=ð=ð=¯A°=ÏA°AðAð=Ž=Ž5595=ï=ï55=ï=ï5595559n5m1L1L551L1L551Œ1Œ1L1L5595551Œ1Œ=¯A°=ð=ðAðAð55=ï=ï=ï=ïAðAð=¯A°FJEïIïAðAð=Ž=ŽAðAðAðAðAðAðAðAð=¯A°AñAòAñAòAðAð=¯A°=Ž=ŽEðIðNSN3AðAð=¯A°=ï=ï=Ž=ŽAðAðAðAðAòAñAðAð=ï=ïAòAñAðAðJSF3NSN3JSF3IðEðNSN3NSN3NSN3AïAïAðAð55=ï=ï5595=ï=ï55955Œ5Œ955m5m1Œ1Œ5m5m1L1L551Œ1Œ1L1L1L1L5Œ5Œ9555=ï=ïAðAð=¯A°=ÏA°9î=ï55AïAïAïAïIðEðJFIðEðAðAð55=ï=ïAðAðAðAð=¯A°AñAòIðEðAòAñAòAñ55AïAïJFIðEðAïAïAðAð55AðAðAðAðAðAð=ð=ðAðAðAðAð=ï=ïJSF3NSN3AðAð59AðAð=ð=ð=¯A°=ÏA°AðAð=Ž=Ž5595=ï=ï55=ï=ï5595559n5m1L1L551L1L551Œ1Œ1L1L5595551Œ1Œ=¯A°=ð=ðAðAð55=ï=ï=ï=ïAðAð=¯A°FJEïIïAðAð=Ž=ŽAðAðAðAðAðAðAðAð=¯A°AñAòAñAòAðAð=¯A°=Ž=ŽEðIðNSN3AðAð=¯A°=ï=ï=Ž=ŽAðAðAðAðAòAñAðAð=ï=ïAòAñAðAðJSF3NSN3JSF3IðEðNSN3NSN3NSN3AïAïAðAð55=ï=ï5595=ï=ï55955Œ5Œ955m5m1Œ1Œ5m5m1L1L551Œ1Œ1L1L1L1L5Œ5Œ9555=ï=ïAðAð=¯A°=ÏA°9î=ï55AïAïAïAïIðEðJFIðEðAðAð55=ï=ïAðAðAðAð=¯A°AñAòIðEðAòAñAòAñ55AïAïJFIðEðAïAïAðAð55AðAðAðAðAðAð=ð=ðAðAðAðAð=ï=ïJSF3NSN3AðAð$¥$¥ ¥ ¥$¥$¥$¥$¥ † †$¥$¥¥¥(¥(¥¥¥$Æ$Æ(ç(ç1L1L ¥ ¥$d$„$„$„$¥$¥$„$„ ¥ ¥$d$„$¥$¥ e …$„$„ ¥ ¥,Å,Å(ç(ç,é,é ç ç$Æ$Æ$Ç$Ç § § Æ Æ$¥$¥ § § Æ Æ(¥(¥$Ç$Ç,ç,ç$ç$ç(ç(ç$Æ$Æ(ç(ç,Æ,Æ$Ç$Ç(ç(ç(¥(¥$Æ$Æ § §(¥(¥$Æ$Æ † † Æ Æ$Æ$Æ,Æ,Æ,Æ,Æ-*1*) -) - Æ Æ„„¥¥¥¥ † † Æ Ædd Æ Æ ¥ ¥ ¥ ¥ ¥ ¥(¥(¥ § §$¥$¥¥¥(¥(¥$¥$¥$¥$¥ § §1)1))) e …$„$„$¥$¥$¥$¥$d$„$¥$¥$d$„$¥$¥$d$„ ¥ ¥(¥(¥11$Ç$Ç)) § § ç ç § § Æ Æ Æ Æ § § Æ Æ(¥(¥$Ç$Ç(ç(ç(ç(ç(ç(ç(ç(ç$Æ$Æ(ç(ç,Æ,Æ$Ç$Ç(ç(ç(¥(¥ § §(¥(¥(ç(ç † † Æ Æ(¥(¥ § §(ç(ç11-*1* ç ç e …¥¥¥¥¥¥ † †¥¥$¥$¥$¥$¥ ¥ ¥$¥$¥$¥$¥ † †$¥$¥¥¥(¥(¥¥¥$Æ$Æ(ç(ç1L1L ¥ ¥$d$„$„$„$¥$¥$„$„ ¥ ¥$d$„$¥$¥ e …$„$„ ¥ ¥,Å,Å(ç(ç,é,é ç ç$Æ$Æ$Ç$Ç § § Æ Æ$¥$¥ § § Æ Æ(¥(¥$Ç$Ç,ç,ç$ç$ç(ç(ç$Æ$Æ(ç(ç,Æ,Æ$Ç$Ç(ç(ç(¥(¥$Æ$Æ § §(¥(¥$Æ$Æ † † Æ Æ$Æ$Æ,Æ,Æ,Æ,Æ-*1*) -) - Æ Æ„„¥¥¥¥ † † Æ Ædd Æ Æ ¥ ¥ ¥ ¥ ¥ ¥(¥(¥ § §$¥$¥¥¥(¥(¥$¥$¥$¥$¥ § §1)1))) e …$„$„$¥$¥$¥$¥$d$„$¥$¥$d$„$¥$¥$d$„ ¥ ¥(¥(¥11$Ç$Ç)) § § ç ç § § Æ Æ Æ Æ § § Æ Æ(¥(¥$Ç$Ç(ç(ç(ç(ç(ç(ç(ç(ç$Æ$Æ(ç(ç,Æ,Æ$Ç$Ç(ç(ç(¥(¥ § §(¥(¥(ç(ç † † Æ Æ(¥(¥ § §(ç(ç11-*1* ç ç e …¥¥¥¥¥¥ † †¥¥$¥$¥ e …$d$„dƒ e …c„ e …c„ e …$d$„dƒ,Æ,Æ-*1*$d$„$d$„$„$„ƒd$„$d „ c$„$d„c„c$„$d„c ¥ ¥,¤,¤5J5J † † † †ƒddddddd ¥ ¥ e … ¥ ¥ e …$d$„ ¥ ¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$d$„(¥(¥$¥$¥(¥(¥ † †$„$„ … e¥¥ † † † †(¥(¥55$Ç$Çdd$¥$¥e…dd$¥$¥e… ¥ ¥$c$„$d$„ d „ d „ d „ d „dƒdd„cdd … e$¥$¥11 § §$„$„$„$d$„$d„c$„$d „ c$„$ddc$„$d„c$„$d$„$„--) -) -c„ ¥ ¥ d „dd„c … e ¥ ¥ e …$„$„dd(¥(¥ † †(¥(¥(¥(¥(¥(¥(¥(¥$d$„(¥(¥ † †$¥$¥$¥$¥ e … ¥ ¥ e … ¥ ¥$¥$¥ e …5I5I1*-* e … „ „ … edd¥¥ d „ e …dd … e$„$d„c … eƒd … eƒd … e$„$d„c,Æ,Æ-*1*$d$„$d$„$„$„ƒd$„$d „ c$„$d„c„c$„$d„c ¥ ¥,¤,¤5J5J † † † †ƒddddddd ¥ ¥ e … ¥ ¥ e …$d$„ ¥ ¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$d$„(¥(¥$¥$¥(¥(¥ † †$„$„ … e¥¥ † † † †(¥(¥55$Ç$Çdd$¥$¥e…dd$¥$¥e… ¥ ¥$c$„$d$„ d „ d „ d „ d „dƒdd„cdd … e$¥$¥11 § §$„$„$„$d$„$d„c$„$d „ c$„$ddc$„$d„c$„$d$„$„--) -) -c„ ¥ ¥ d „dd„c … e ¥ ¥ e …$„$„dd(¥(¥ † †(¥(¥(¥(¥(¥(¥(¥(¥$d$„(¥(¥ † †$¥$¥$¥$¥ e … ¥ ¥ e … ¥ ¥$¥$¥ e …5I5I1*-* e … „ „ … edd¥¥ d „ e …dd$d$„dƒ e …$d$„$d$„dƒ$d$„dƒ d ƒ$d$„$Æ$Æ11dd$„$„$„$d$„$„$„$d „ ƒ$„$d„c$„$„ƒd … e ƒ d$„$„-*1*$¥$¥dd ¥ ¥dd ¥ ¥dd ¥ ¥ e …$d$„ ¥ ¥$¥$¥$„$„ † †$„$„ † †,¥,¥(¥(¥(¥(¥$¥$¥ † † † † … e(¥(¥¥¥dd$¥$¥ e …(¥(¥55,é,édd ¥ ¥dd¥¥dd † †$„$d „ d „ d„c „ d$„$d$„$d„c$„$d„c$„$d„c$„$„-*1* § § c „$„$„$„$d „ c$„$„$„$„ƒd „ „„c$„$„cd$„$„--))dd … eƒd$¥$¥dddd ¥ ¥ e … ¥ ¥$¥$¥$„$„ † †$„$„ † †(¥(¥,¥,¥,¥,¥$¥$¥ † †$„$„$¥$¥ † † ¥ ¥dd$¥$¥e…(¥(¥1)1)1L1L$¥$¥ e …dd¥¥ † †$„$d „ d„c$„$d„c … e$„$d$„$d„c$„$d„c „ c$„$d$Æ$Æ11dd$„$„$„$d$„$„$„$d „ ƒ$„$d„c$„$„ƒd … e ƒ d$„$„-*1*$¥$¥dd ¥ ¥dd ¥ ¥dd ¥ ¥ e …$d$„ ¥ ¥$¥$¥$„$„ † †$„$„ † †,¥,¥(¥(¥(¥(¥$¥$¥ † † † † … e(¥(¥¥¥dd$¥$¥ e …(¥(¥55,é,édd ¥ ¥dd¥¥dd † †$„$d „ d „ d„c „ d$„$d$„$d„c$„$d„c$„$d„c$„$„-*1* § § c „$„$„$„$d „ c$„$„$„$„ƒd „ „„c$„$„cd$„$„--))dd … eƒd$¥$¥dddd ¥ ¥ e … ¥ ¥$¥$¥$„$„ † †$„$„ † †(¥(¥,¥,¥,¥,¥$¥$¥ † †$„$„$¥$¥ † † ¥ ¥dd$¥$¥e…(¥(¥1)1)1L1L$¥$¥ e …dd¥¥ † †$„$d „ d„c$d$„$d$„dƒ d ƒ d ƒ d ƒdƒ$d$ƒ d ƒ$d$„(ç(ç-*1*dd$„$„$„$„ƒd$„$„$„$„$„$d „ „„c$„$d „ „$„$d$„$„-*1*¥¥dd „ „dddddd „ „dd ¥ ¥$d$„ ¥ ¥(¥(¥ † †$„$„(¥(¥$d$„(¥(¥ † †(¥(¥dd … e$„$„ „ „ … edd$¥$¥$¥$¥(¥(¥5m5m$ç$çdddd „ „ … e … edddd„c„c$„$d „ d„c$„$d„c „ c$„$d „ c$„$d$„$„-*1* § §$„$„$„$d$„$„$„$„$„$d „ ƒ$„$d„c$„$d„c ¥ ¥$d$„11$Ç$Çdd „ „dddd„„dd „ „dd ¥ ¥$„$„ § §$„$„ † †$„$d(¥(¥$„$„ † †(¥(¥ e …dd$¥$¥ d „ e … „ „dd(¥(¥(¥(¥11-l-ldddd „ „ … edd„c„c … e$„$d$„$d„c „ c „ c „ c„c$„$c „ c$„$d(ç(ç-*1*dd$„$„$„$„ƒd$„$„$„$„$„$d „ „„c$„$d „ „$„$d$„$„-*1*¥¥dd „ „dddddd „ „dd ¥ ¥$d$„ ¥ ¥(¥(¥ † †$„$„(¥(¥$d$„(¥(¥ † †(¥(¥dd … e$„$„ „ „ … edd$¥$¥$¥$¥(¥(¥5m5m$ç$çdddd „ „ … e … edddd„c„c$„$d „ d„c$„$d„c „ c$„$d „ c$„$d$„$„-*1* § §$„$„$„$d$„$„$„$„$„$d „ ƒ$„$d„c$„$d„c ¥ ¥$d$„11$Ç$Çdd „ „dddd„„dd „ „dd ¥ ¥$„$„ § §$„$„ † †$„$d(¥(¥$„$„ † †(¥(¥ e …dd$¥$¥ d „ e … „ „dd(¥(¥(¥(¥11-l-ldddd „ „ … edd„c„c … e$d$„dƒ d ƒ$d$ƒ$„$„ƒd$ƒ$d$„$d „ c$„$„(¥(¥1L1L$„$„ ¥ ¥$d$„$d$„$„$„$„$„$„$„$„$„ƒd ¥ ¥ c „$d$„$„$„)) e …dd „ „dc„„dd„„dd ¥ ¥$„$„(¥(¥ † †$„$„(¥(¥ e …$„$„(¥(¥ e …$„$„ … e$„$„ „ „ † † ¥ ¥$d$„ ¥ ¥(¥(¥(¥(¥5k5k$Ç$Çdd„ddd¥¥dd „ „dd ¥ ¥$d$„dƒ$d$„$d$„ d ƒ d ƒ d ƒ d ƒ d ƒ$d$„$„$„5J5J ç ç$d$„$„$„ƒd$„$„$„$„$„$„$„$„ ¥ ¥$d$„$„$„$„$d$„$d(ç(ç Æ Ædddd „ „dddc „ „dd ¥ ¥$„$„(¥(¥ † †$„$d(¥(¥(¥(¥ d „(¥(¥(¥(¥ d „(¥(¥ e …$d$„ ¥ ¥$„$„dd$¥$¥$¥$¥(¥(¥,é,é1L1Ldddddd„„„„…e$„$d„c$„$d„c „ c$„$c$„$„ƒd$ƒ$d$„$d „ c$„$„(¥(¥1L1L$„$„ ¥ ¥$d$„$d$„$„$„$„$„$„$„$„$„ƒd ¥ ¥ c „$d$„$„$„)) e …dd „ „dc„„dd„„dd ¥ ¥$„$„(¥(¥ † †$„$„(¥(¥ e …$„$„(¥(¥ e …$„$„ … e$„$„ „ „ † † ¥ ¥$d$„ ¥ ¥(¥(¥(¥(¥5k5k$Ç$Çdd„ddd¥¥dd „ „dd ¥ ¥$d$„dƒ$d$„$d$„ d ƒ d ƒ d ƒ d ƒ d ƒ$d$„$„$„5J5J ç ç$d$„$„$„ƒd$„$„$„$„$„$„$„$„ ¥ ¥$d$„$„$„$„$d$„$d(ç(ç Æ Ædddd „ „dddc „ „dd ¥ ¥$„$„(¥(¥ † †$„$d(¥(¥(¥(¥ d „(¥(¥(¥(¥ d „(¥(¥ e …$d$„ ¥ ¥$„$„dd$¥$¥$¥$¥(¥(¥,é,é1L1Ldddddd„„„„…e$„$d„c$d$„ d ƒ d ƒ d ƒ d ƒ$d$ƒdƒ d ƒ$d$ƒ d ƒ$¥$¥5J5Jdd$„$d$„$„$„$„ ƒ d$„$„$„$„$„$„$„$d$„$„$„$d$„$„$„$„ ç çdd „ „„cdd„c ¥ ¥$d$„$¥$¥$„$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥(¥(¥(¥(¥(¥(¥$d$„$¥$¥$„$„(¥(¥(¥(¥ † †$„$d1L1L ç ç d „dd„cdddd„„„c$„$d„c$„$c „ c$„$c „ c$„$c „ c „ c „ c$„$c „ c5J5J$Ç$Ç d „$d$„$„$„ ƒ d$„$„$„$„$„$„$„$d$„$d$„$„ „ „ „ ƒ(¥(¥ † †dd „ „„cdd$„$„dd$¥$¥$„$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$d$„(¥(¥$d$„$¥$¥$„$„(¥(¥(¥(¥ † †,ç,ç-*1* d „dcdd„ddddc„c$„$d$„$d „ c „ c „ c „ c$„$c„c „ c$„$c „ c$¥$¥5J5Jdd$„$d$„$„$„$„ ƒ d$„$„$„$„$„$„$„$d$„$„$„$d$„$„$„$„ ç çdd „ „„cdd„c ¥ ¥$d$„$¥$¥$„$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥(¥(¥(¥(¥(¥(¥$d$„$¥$¥$„$„(¥(¥(¥(¥ † †$„$d1L1L ç ç d „dd„cdddd„„„c$„$d„c$„$c „ c$„$c „ c$„$c „ c „ c „ c$„$c „ c5J5J$Ç$Ç d „$d$„$„$„ ƒ d$„$„$„$„$„$„$„$d$„$d$„$„ „ „ „ ƒ(¥(¥ † †dd „ „„cdd$„$„dd$¥$¥$„$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$d$„(¥(¥$d$„$¥$¥$„$„(¥(¥(¥(¥ † †,ç,ç-*1* d „dcdd„ddddc„c$„$d § § § §,Æ,Æ$Ç$Ç$Ç$Ç § § § § † † † † † †,é,é11) -) -(¥(¥$¥$¥ † †$¥$¥(¥(¥ † † § § e … ¥ ¥dd$¥$¥ † †-*1*)) § § § §$Æ$Æ e … e …$¥$¥ e …$¥$¥$„$„ † †$„$d † † † † … e † †$„$d † †(¥(¥ † †(¥(¥$Ç$Ç$Ç$Ç † †$Ç$Ç$Ç$Ç § §,é,é-l-l) -) - § § § § § § § §ÆÆ § § § §$Ç$Ç § § § §,¥,¥ § §$Ç$Ç,é,é † † † † † † † †$Æ$Æ1L1L1L1L$Æ$Æ † †$¥$¥(¥(¥ † †(¥(¥ † †$¥$¥dd¥¥ † †$„$„,é,é)K)K Æ Æ § §$Æ$Æ † †dd(¥(¥$¥$¥ † †$„$„ … e(¥(¥f† † † … e … e † †$„$d § §(¥(¥ † †,¥,¥$Ç$Ç § §$Ç$Ç$Ç$Ç § §$Ç$Ç1L1L1L1L § §ÆÆ § § § §ÆÆf† § § § § § § § §,Æ,Æ$Ç$Ç$Ç$Ç § § § § † † † † † †,é,é11) -) -(¥(¥$¥$¥ † †$¥$¥(¥(¥ † † § § e … ¥ ¥dd$¥$¥ † †-*1*)) § § § §$Æ$Æ e … e …$¥$¥ e …$¥$¥$„$„ † †$„$d † † † † … e † †$„$d † †(¥(¥ † †(¥(¥$Ç$Ç$Ç$Ç † †$Ç$Ç$Ç$Ç § §,é,é-l-l) -) - § § § § § § § §ÆÆ § § § §$Ç$Ç § § § §,¥,¥ § §$Ç$Ç,é,é † † † † † † † †$Æ$Æ1L1L1L1L$Æ$Æ † †$¥$¥(¥(¥ † †(¥(¥ † †$¥$¥dd¥¥ † †$„$„,é,é)K)K Æ Æ § §$Æ$Æ † †dd(¥(¥$¥$¥ † †$„$„ … e(¥(¥f† † † … e … e † †$„$d § §(¥(¥ † †,¥,¥$Ç$Ç § §$Ç$Ç$Ç$Ç § §$Ç$Ç1L1L1L1L § §ÆÆ § § § §ÆÆf† § § § §1Œ1Œ=¯A°55=Ž=Ž=¯A°=ÏA°1Ž11L1L-*1*-l-l55=Ž=Ž=ï=ï55955k5k=Ž=ŽAðAð=ï=ï=¯A°=ÏA°9­=­=ÐA¯=¯A°9ï=ï=Ž=Ž=Ž=ŽAïAï=Ž=Ž551*-*1Œ1Œ1L1L1L1L559n5m55955m5m955m5m9n5m111L1L1L1L1L1L1L1L11=¯A°=ÏA°=¯=¯AÐ=¯A°=¯=ÏA°=¯A°=Ï=¯=ð=ð55AðAðAòAñAòAñAòAñAòAñ=ð=ð=¯A°1155955m5m1L1L111L1L-*1*-l-l5m5m95=¯A°=Ž=Ž55595Ž5A¯=°=ï=ï=¯A°=Ž=ŽAðAð=Ž=Ž=¯A°=ï=ï=Ž=Ž=Ž=Ž=¯A°=Ï=°=Ž=Ž5J5J-l-l1L1L1L1L1L1L55951155955m5m9n5m5m5m111L1L1L1L1L1L1155A¯=°AÏ=°=¯A¯AòAò5Ž5A¯=°59AñAò=ð=ð55AòAñ551111111Œ1Œ=¯A°55=Ž=Ž=¯A°=ÏA°1Ž11L1L-*1*-l-l55=Ž=Ž=ï=ï55955k5k=Ž=ŽAðAð=ï=ï=¯A°=ÏA°9­=­=ÐA¯=¯A°9ï=ï=Ž=Ž=Ž=ŽAïAï=Ž=Ž551*-*1Œ1Œ1L1L1L1L559n5m55955m5m955m5m9n5m111L1L1L1L1L1L1L1L11=¯A°=ÏA°=¯=¯AÐ=¯A°=¯=ÏA°=¯A°=Ï=¯=ð=ð55AðAðAòAñAòAñAòAñAòAñ=ð=ð=¯A°1155955m5m1L1L111L1L-*1*-l-l5m5m95=¯A°=Ž=Ž55595Ž5A¯=°=ï=ï=¯A°=Ž=ŽAðAð=Ž=Ž=¯A°=ï=ï=Ž=Ž=Ž=Ž=¯A°=Ï=°=Ž=Ž5J5J-l-l1L1L1L1L1L1L55951155955m5m9n5m5m5m111L1L1L1L1L1L1155A¯=°AÏ=°=¯A¯AòAò5Ž5A¯=°59AñAò=ð=ð55AòAñ55111111,ç,ç,¥,¥0ç0ç0ç0ç-*1*=Ž=Ž(¥(¥$„$„$¥$¥dd$¥$¥dd „ „dd ¥ ¥(¥(¥dd Æ Æ$¥$¥$¥$¥(¥(¥$¥$¥$¥$¥$¥$¥dd ¥ ¥c„$Æ$Æ(¥(¥dd¥¥ † † ¥ ¥(¥(¥5J5J=Ž=Ž1L1L5I5I5J5J1L1L5J5J5k5k9m5m5k5k9m5m5k5k1L1L5k5k9m5m1L1L5J5J--,é,é1111--1)1)5)5)1)1)5)5)1)1)5)5)1)1)1)1)551*-*951L1L-- e …$¥$¥$d$„(¥(¥(¥(¥ e … „ „ „ „dd ¥ ¥ ¥ ¥$„$„ „ „$¥$¥(¥(¥ Æ Æ(¥(¥$¥$¥$¥$¥ † † … eƒd Æ Æ$¥$¥ ¥ ¥$d$„ „ „¥¥(¥(¥,ç,ç=¯A°1L1L5I5I5J5J5J5J5k5k1L1L5k5k9k5k5m5m9k5k5k5k9k5k5m5mJJ9Ž=Ž11,ç,ç,ç,ç,é,é11115I5I9)5)115I5I1)1)5)5)9)5),ç,ç,¥,¥0ç0ç0ç0ç-*1*=Ž=Ž(¥(¥$„$„$¥$¥dd$¥$¥dd „ „dd ¥ ¥(¥(¥dd Æ Æ$¥$¥$¥$¥(¥(¥$¥$¥$¥$¥$¥$¥dd ¥ ¥c„$Æ$Æ(¥(¥dd¥¥ † † ¥ ¥(¥(¥5J5J=Ž=Ž1L1L5I5I5J5J1L1L5J5J5k5k9m5m5k5k9m5m5k5k1L1L5k5k9m5m1L1L5J5J--,é,é1111--1)1)5)5)1)1)5)5)1)1)5)5)1)1)1)1)551*-*951L1L-- e …$¥$¥$d$„(¥(¥(¥(¥ e … „ „ „ „dd ¥ ¥ ¥ ¥$„$„ „ „$¥$¥(¥(¥ Æ Æ(¥(¥$¥$¥$¥$¥ † † … eƒd Æ Æ$¥$¥ ¥ ¥$d$„ „ „¥¥(¥(¥,ç,ç=¯A°1L1L5I5I5J5J5J5J5k5k1L1L5k5k9k5k5m5m9k5k5k5k9k5k5m5mJJ9Ž=Ž11,ç,ç,ç,ç,é,é11115I5I9)5)115I5I1)1)5)5)9)5),Æ,Æ † † „ d$„$„,é,é5m5m(¥(¥ d „ d „dd„ddd„d„c … e$¥$¥$d$„dd$„$ddddcdddddd „ „dddd¥¥ † †ƒddddd … e(¥(¥11=Ž=Ž,Æ,Æ(¥(¥ † †(¥(¥(¥(¥,¥,¥$Ç$Ç,Æ,Æ0ç0ç$Ç$Ç,Æ,Æ0Æ0Æ=Ž=Ž1Œ1Œ † †(¥(¥$d$„(¥(¥$d$„(¥(¥,¤,¤(¥(¥$d$„,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥$Ç$Ç,¥,¥,¥,¥$Ç$Ç,é,é$„$„(¥(¥ † †$„$ddddc„ddddd„c … e ¥ ¥ d „dddddddd„ddd„cdd„cdd(¥(¥dddddddd(¥(¥,¥,¥551)1)(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$Ç$Ç,¥,¥0ç0ç$Ç$Ç,Æ,Æ,Æ,Æ5J5J=¯A°11(¥(¥ e …(¥(¥$„$„$„$„(¥(¥,¥,¥$d$„,¥,¥,¥,¥,¥,¥,¥,¥(¥(¥,Æ,Æ † † „ d$„$„,é,é5m5m(¥(¥ d „ d „dd„ddd„d„c … e$¥$¥$d$„dd$„$ddddcdddddd „ „dddd¥¥ † †ƒddddd … e(¥(¥11=Ž=Ž,Æ,Æ(¥(¥ † †(¥(¥(¥(¥,¥,¥$Ç$Ç,Æ,Æ0ç0ç$Ç$Ç,Æ,Æ0Æ0Æ=Ž=Ž1Œ1Œ † †(¥(¥$d$„(¥(¥$d$„(¥(¥,¤,¤(¥(¥$d$„,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥$Ç$Ç,¥,¥,¥,¥$Ç$Ç,é,é$„$„(¥(¥ † †$„$ddddc„ddddd„c … e ¥ ¥ d „dddddddd„ddd„cdd„cdd(¥(¥dddddddd(¥(¥,¥,¥551)1)(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$Ç$Ç,¥,¥0ç0ç$Ç$Ç,Æ,Æ,Æ,Æ5J5J=¯A°11(¥(¥ e …(¥(¥$„$„$„$„(¥(¥,¥,¥$d$„,¥,¥,¥,¥,¥,¥,¥,¥(¥(¥,Æ,Æ § §$„$„ … e111L1L,Æ,Ædddddc„d„ddddddd ¥ ¥dd„cdd„ddddd„d…edddc „ „…e ¥ ¥$d$„dc„„dd$„$„5595(ç(ç,¥,¥ § §(¥(¥$Ç$Ç0ç0ç § §,Æ,Æ,é,é,Æ,Æ,é,é0ç0ç=Œ=Œ5m5m § §(¥(¥(¥(¥ † †(¥(¥(¥(¥ e …(¥(¥,¥,¥(¥(¥(¥(¥,¥,¥$Ç$Ç,¥,¥0Æ0Æ,Æ,Æ(¥(¥ § §--$d$„(¥(¥$„$„$„$„„ddddc„d„ddd$¥$¥dddcdddd„ddd„ddddd„„dd„„¥¥ d „dd„„dd … e,Æ,Æ5511,¥,¥ § § † †,¥,¥$Ç$Ç0ç0ç$Ç$Ç0ç0ç$Ç$Ç,Æ,Æ,é,é5)5)A¯=°$Ç$Ç,¥,¥ † †(¥(¥ † † § §(¥(¥(¥(¥(¥(¥,¥,¥$Ç$Ç,¥,¥,¥,¥$Ç$Ç,Æ,Æ § §$„$„ … e111L1L,Æ,Ædddddc„d„ddddddd ¥ ¥dd„cdd„ddddd„d…edddc „ „…e ¥ ¥$d$„dc„„dd$„$„5595(ç(ç,¥,¥ § §(¥(¥$Ç$Ç0ç0ç § §,Æ,Æ,é,é,Æ,Æ,é,é0ç0ç=Œ=Œ5m5m § §(¥(¥(¥(¥ † †(¥(¥(¥(¥ e …(¥(¥,¥,¥(¥(¥(¥(¥,¥,¥$Ç$Ç,¥,¥0Æ0Æ,Æ,Æ(¥(¥ § §--$d$„(¥(¥$„$„$„$„„ddddc„d„ddd$¥$¥dddcdddd„ddd„ddddd„„dd„„¥¥ d „dd„„dd … e,Æ,Æ5511,¥,¥ § § † †,¥,¥$Ç$Ç0ç0ç$Ç$Ç0ç0ç$Ç$Ç,Æ,Æ,é,é5)5)A¯=°$Ç$Ç,¥,¥ † †(¥(¥ † † § §(¥(¥(¥(¥(¥(¥,¥,¥$Ç$Ç,¥,¥,¥,¥$Ç$Ç,Æ,Æ † † … edd--55,¥,¥dddd„d„ddc„ddddd$¥$¥dddddddd„ddd„d„„dd„„dd¥¥ e …$d$„d„dddd$¥$¥1111,é,é,Æ,Æ$Ç$Ç,¥,¥$Ç$Ç § §,Æ,Æ0ç0ç$Ç$Ç0ç0ç$Ç$Ç0ç0ç=Ž=Ž5m5m(¥(¥(¥(¥ e …¥¥ † † § § § § § §(¥(¥(¥(¥ § §(¥(¥$Ç$Ç,é,é,Æ,Æ,é,é,¥,¥,é,é11 d „(¥(¥$d$„dd„ddd„ddcdddd † †ƒd … e „ „dddd„dddÆÆcddd„„…e$¥$¥dddd„ddd$¥$¥(¥(¥551*-*,Æ,Æ$Ç$Ç,¥,¥ § §$Ç$Ç,¥,¥$Ç$Ç0ç0ç$Ç$Ç,é,é,¥,¥5J5JAòAñ$Ç$Ç,¥,¥ † †$¥$¥¥¥ § §(¥(¥ † †$Ç$Ç,¥,¥$Ç$Ç$Ç$Ç,¥,¥$Ç$Ç,Æ,Æ † † … edd--55,¥,¥dddd„d„ddc„ddddd$¥$¥dddddddd„ddd„d„„dd„„dd¥¥ e …$d$„d„dddd$¥$¥1111,é,é,Æ,Æ$Ç$Ç,¥,¥$Ç$Ç § §,Æ,Æ0ç0ç$Ç$Ç0ç0ç$Ç$Ç0ç0ç=Ž=Ž5m5m(¥(¥(¥(¥ e …¥¥ † † § § § § § §(¥(¥(¥(¥ § §(¥(¥$Ç$Ç,é,é,Æ,Æ,é,é,¥,¥,é,é11 d „(¥(¥$d$„dd„ddd„ddcdddd † †ƒd … e „ „dddd„dddÆÆcddd„„…e$¥$¥dddd„ddd$¥$¥(¥(¥551*-*,Æ,Æ$Ç$Ç,¥,¥ § §$Ç$Ç,¥,¥$Ç$Ç0ç0ç$Ç$Ç,é,é,¥,¥5J5JAòAñ$Ç$Ç,¥,¥ † †$¥$¥¥¥ § §(¥(¥ † †$Ç$Ç,¥,¥$Ç$Ç$Ç$Ç,¥,¥$Ç$Ç(ç(ç,Æ,Æ e …¥¥5511,¥,¥dddd„d„d„ddddcdddd„„dd„„„ddd„ddd„„dd…edd „ „$¥$¥dddddd „ „ † †,ç,ç5m5m8ç4ç$Ç$Ç0ç0ç$Ç$Ç § §,¥,¥$Ç$Ç$Ç$Ç0ç0ç$Ç$Ç$Ç$Ç0Æ0Æ5m5m1L1L „ „†f„„„d…e†f„„…e † † § §,¥,¥ § §,¥,¥$Ç$Ç,é,é$Ç$Ç § §---*1*$d$„$„$„ … e „ ddc„d„d„ddd„d … eƒddddddd„ddcdd„ddddddddd$¥$¥dd „ „dddd¥¥(¥(¥5m5m1155$Ç$Ç$Ç$Ç,¥,¥$Ç$Ç § §0ç0ç$Ç$Ç$Ç$Ç,Æ,Æ,é,é55A¯=° ¦ §¥¥e…e…d„e…f†¥¥e… § §11 † † § §--(ç(ç,Æ,Æ e …¥¥5511,¥,¥dddd„d„d„ddddcdddd„„dd„„„ddd„ddd„„dd…edd „ „$¥$¥dddddd „ „ † †,ç,ç5m5m8ç4ç$Ç$Ç0ç0ç$Ç$Ç § §,¥,¥$Ç$Ç$Ç$Ç0ç0ç$Ç$Ç$Ç$Ç0Æ0Æ5m5m1L1L „ „†f„„„d…e†f„„…e † † § §,¥,¥ § §,¥,¥$Ç$Ç,é,é$Ç$Ç § §---*1*$d$„$„$„ … e „ ddc„d„d„ddd„d … eƒddddddd„ddcdd„ddddddddd$¥$¥dd „ „dddd¥¥(¥(¥5m5m1155$Ç$Ç$Ç$Ç,¥,¥$Ç$Ç § §0ç0ç$Ç$Ç$Ç$Ç,Æ,Æ,é,é55A¯=° ¦ §¥¥e…e…d„e…f†¥¥e… § §11 † † § §--(ç(ç$Ç$Ç † †$ƒ$d1111,¥,¥ d „ d „dc„ddcdddd„c … ecdƒddd„cdd„cdddd „ „„cdd„c … e$„$ddc„c„c$„$„,é,é1L1L0ç0ç11$Ç$Ç$Ç$Ç0ç0ç$Ç$Ç$Ç$Ç,é,é0ç0ç$Ç$Ç,é,é,Æ,Æ5J5J) -) -d„¥¥f†e…e…„„…e„„„ddd † † Æ Æ § §,Æ,Æ$Æ$Æ$Ç$Ç,ç,ç11) -) -dd$„$ddcdƒdcdcdddc d „dd„c$„$d„„„cdcdd„cdd„c … e „ „dcdc … e$„$„cdcdƒd$„$„(¥(¥1L1L1)1),é,é4ç4ç$Ç$Ç$Ç$Ç$Ç$Ç,é,é$Ç$Ç0ç0ç$Ç$Ç,é,é0ç0ç11=¯A°†f…e†f…e…e…e„„…e„ddd Æ Ædddd § §(ç(ç$Ç$Ç † †$ƒ$d1111,¥,¥ d „ d „dc„ddcdddd„c … ecdƒddd„cdd„cdddd „ „„cdd„c … e$„$ddc„c„c$„$„,é,é1L1L0ç0ç11$Ç$Ç$Ç$Ç0ç0ç$Ç$Ç$Ç$Ç,é,é0ç0ç$Ç$Ç,é,é,Æ,Æ5J5J) -) -d„¥¥f†e…e…„„…e„„„ddd † † Æ Æ § §,Æ,Æ$Æ$Æ$Ç$Ç,ç,ç11) -) -dd$„$ddcdƒdcdcdddc d „dd„c$„$d„„„cdcdd„cdd„c … e „ „dcdc … e$„$„cdcdƒd$„$„(¥(¥1L1L1)1),é,é4ç4ç$Ç$Ç$Ç$Ç$Ç$Ç,é,é$Ç$Ç0ç0ç$Ç$Ç,é,é0ç0ç11=¯A°†f…e†f…e…e…e„„…e„ddd Æ Ædddd § §(ç(ç$Ç$Ç § §$Ç$Ç-*1*11-*1*$Ç$Ç § § § §f†¥¥f†¥¥d„dd„d„dÆÆe…¥¥f†„„ÆÆ § §f†f†$Ç$Ç § § ç ç § §$Ç$Ç%%$Ç$Ç1L1L1L1L%%$Ç$Ç$Æ$Æ$Ç$Ç § §(ç(ç § § § § § §$Æ$Æ † † § §=¯A°=Ž=Žf†ÆÆ § §$Æ$Æ § § § § § § § §(¥(¥$Æ$Æ--11$Ç$Ç) -) -1*-*11-*1*55A¯=°) -) -%%!!$Ç$Çf† § §f†f†¥¥e…dd„d„d„d¥¥e…e…¥¥f† § § Æ Æf†ÆÆ § § § § ç ç § §) -) -$Ç$Ç) -) --l-l) -) - § § § §(ç(ç$Ç$Ç$Ç$Ç,¥,¥$Ç$Ç$Ç$Ç$Ç$Ç † † † †11AòAñ ç 祥 ç ç$Ç$Ç § §(¥(¥ † † § §,Æ,Æ § §$Æ$Æ$Ç$Ç ç ç$Ç$Ç(ç(ç$Ç$Ç § §$Ç$Ç-*1*11-*1*$Ç$Ç § § § §f†¥¥f†¥¥d„dd„d„dÆÆe…¥¥f†„„ÆÆ § §f†f†$Ç$Ç § § ç ç § §$Ç$Ç%%$Ç$Ç1L1L1L1L%%$Ç$Ç$Æ$Æ$Ç$Ç § §(ç(ç § § § § § §$Æ$Æ † † § §=¯A°=Ž=Žf†ÆÆ § §$Æ$Æ § § § § § § § §(¥(¥$Æ$Æ--11$Ç$Ç) -) -1*-*11-*1*55A¯=°) -) -%%!!$Ç$Çf† § §f†f†¥¥e…dd„d„d„d¥¥e…e…¥¥f† § § Æ Æf†ÆÆ § § § § ç ç § §) -) -$Ç$Ç) -) --l-l) -) - § § § §(ç(ç$Ç$Ç$Ç$Ç,¥,¥$Ç$Ç$Ç$Ç$Ç$Ç † † † †11AòAñ ç 祥 ç ç$Ç$Ç § §(¥(¥ † † § §,Æ,Æ § §$Æ$Æ$Ç$Ç ç ç$Ç$Ç=Œ=Œ=Œ=Œ5m5m5J5J5m5m=Œ=Œ1L1L11-l-l-*1*-*1*) -) --)-)-*1*-*1*55-l-l-*1*-*1*11-*1*)J)J1L1L5J5J-*1*1L1L1Œ1Œ5k5k95=¯A°551Œ1Œ5m5m1L1L1Œ1Œ5k5k1Œ1Œ-*1*-*1*))-*1*-*1*-*1*)K)K1L1L1L1L1L1L5k5k=Ž=Ž=ï=ï=Ž=Ž=Ž=Ž=Ž=Ž=Œ=Œ=Œ=Œ=Œ=Œ=¯A°EïIï=¯A°=Ï=¯A°=¯IðEðAðAð55A°=¯=Œ=Œ5m5m=Œ=Œ=Œ=Œ=Ž=Ž5m5m) -) -1*-*1L1L)J)J1)1)-)-))K)K-*1*5Ž5-l-l1L1L-*1*111L1L-*1*-*1*)J)J5J5J-*1*-l-l559Ž555A¯=°1Œ1Œ1L1L551L1L5k5k955J5J)K)K,é,é) -) -)K)K-*1*-*1*-*1*-*1*-l-l1L1L55A¯=°=ï=ï=Ž=Ž55=Œ=Œ5k5k=Ž=Ž=¯A°=ÏA°=¯=¯AÐ=¯A°=¯IïEï=¯A°=Ž=Ž=Œ=Œ=Œ=Œ5m5m5J5J5m5m=Œ=Œ1L1L11-l-l-*1*-*1*) -) --)-)-*1*-*1*55-l-l-*1*-*1*11-*1*)J)J1L1L5J5J-*1*1L1L1Œ1Œ5k5k95=¯A°551Œ1Œ5m5m1L1L1Œ1Œ5k5k1Œ1Œ-*1*-*1*))-*1*-*1*-*1*)K)K1L1L1L1L1L1L5k5k=Ž=Ž=ï=ï=Ž=Ž=Ž=Ž=Ž=Ž=Œ=Œ=Œ=Œ=Œ=Œ=¯A°EïIï=¯A°=Ï=¯A°=¯IðEðAðAð55A°=¯=Œ=Œ5m5m=Œ=Œ=Œ=Œ=Ž=Ž5m5m) -) -1*-*1L1L)J)J1)1)-)-))K)K-*1*5Ž5-l-l1L1L-*1*111L1L-*1*-*1*)J)J5J5J-*1*-l-l559Ž555A¯=°1Œ1Œ1L1L551L1L5k5k955J5J)K)K,é,é) -) -)K)K-*1*-*1*-*1*-*1*-l-l1L1L55A¯=°=ï=ï=Ž=Ž55=Œ=Œ5k5k=Ž=Ž=¯A°=ÏA°=¯=¯AÐ=¯A°=¯IïEï=¯A°=Ž=Ždd † †$„$d(¥(¥$d$„(¥(¥ e …dd ¥ ¥ e … ¥ ¥$d$„ ¥ ¥(¥(¥11)K)K(¥(¥,Æ,Æ(¥(¥,¥,¥,¥,¥(¥(¥(¥(¥(¥(¥ ¥ ¥$¥$¥(¥(¥ ¥ ¥$Ç$Ç1L1L11 § §(¥(¥$Æ$Æ § §$„$„ † †$„$„ † †$¥$¥ e … Æ Æ § §(¥(¥,Æ,Æ$Ç$Ç(ç(ç,Æ,Æ$Ç$Ç(ç(ç$Æ$Æ,ç,ç$Ç$Ç$Ç$Ç(ç(ç,ç,ç0ç0ç,é,é-*1*(ç(ç,¥,¥(ç(ç(¥(¥ § §(¥(¥$d$„,¥,¥$„$„(¥(¥(¥(¥ † †$„$ddd ¥ ¥ e … ¥ ¥ e …(¥(¥,Æ,Æ1L1L(ç(ç$¥$¥,¥,¥(¥(¥(¥(¥,¥,¥(¥(¥,¥,¥$¥$¥$¥$¥$¥$¥$¥$¥(¥(¥)K)K1)1)$Ç$Ç,¥,¥$Æ$Æ § §$„$„ † †(¥(¥ † † ¥ ¥ ¥ ¥$¥$¥ † †$Æ$Æ § §(ç(ç,Æ,Æ(ç(ç$Ç$Ç$Æ$Æ,Æ,Æ$Ç$Ç$Ç$Ç$Ç$Ç(ç(ç,ç,ç0ç0ç$Ç$Ç1L1L0ç0ç(¥(¥$¥$¥dd„„dd † †$„$d(¥(¥$d$„(¥(¥ e …dd ¥ ¥ e … ¥ ¥$d$„ ¥ ¥(¥(¥11)K)K(¥(¥,Æ,Æ(¥(¥,¥,¥,¥,¥(¥(¥(¥(¥(¥(¥ ¥ ¥$¥$¥(¥(¥ ¥ ¥$Ç$Ç1L1L11 § §(¥(¥$Æ$Æ § §$„$„ † †$„$„ † †$¥$¥ e … Æ Æ § §(¥(¥,Æ,Æ$Ç$Ç(ç(ç,Æ,Æ$Ç$Ç(ç(ç$Æ$Æ,ç,ç$Ç$Ç$Ç$Ç(ç(ç,ç,ç0ç0ç,é,é-*1*(ç(ç,¥,¥(ç(ç(¥(¥ § §(¥(¥$d$„,¥,¥$„$„(¥(¥(¥(¥ † †$„$ddd ¥ ¥ e … ¥ ¥ e …(¥(¥,Æ,Æ1L1L(ç(ç$¥$¥,¥,¥(¥(¥(¥(¥,¥,¥(¥(¥,¥,¥$¥$¥$¥$¥$¥$¥$¥$¥(¥(¥)K)K1)1)$Ç$Ç,¥,¥$Æ$Æ § §$„$„ † †(¥(¥ † † ¥ ¥ ¥ ¥$¥$¥ † †$Æ$Æ § §(ç(ç,Æ,Æ(ç(ç$Ç$Ç$Æ$Æ,Æ,Æ$Ç$Ç$Ç$Ç$Ç$Ç(ç(ç,ç,ç0ç0ç$Ç$Ç1L1L0ç0ç(¥(¥$¥$¥dd„„dd¥¥ † † … e ¥ ¥ e …dd ¥ ¥dddd¥¥dd(¥(¥ † †559m5m$Ç$Ç,¥,¥,¥,¥,Æ,Æ$Ç$Ç,¥,¥0Æ0Æ,ç,ç$Æ$Æ$Ç$Ç,Æ,Æ § § ç ç55,ç,ç § § § § e …(¥(¥ e …$¥$¥ † † … e¥¥ e … † †$¥$¥$¥$¥ † †(¥(¥ † † § §(¥(¥ e … † †¥¥$¥$¥ † † † † § §,¥,¥0ç0ç,é,é(¥(¥,Æ,Æ † † § §(¥(¥(¥(¥(¥(¥ e … e … † † „ ddd … e„„…edd$¥$¥dd$Æ$Æ,Æ,Æ5m5m--,¥,¥0Æ0Æ,¥,¥,Æ,Æ,Æ,Æ,Æ,Æ,ç,ç,Æ,Æ § §(ç(ç$Æ$Æ † †-l-l5)5)$Ç$Ç § § e …$¥$¥ † † † † … e ¥ ¥ e …dd$¥$¥ † † † †(¥(¥ † †(¥(¥ † † § §(¥(¥ † †…edd¥¥ † † † †,¥,¥,Æ,Æ11$Ç$Ç,¥,¥ e …e…dddd¥¥ † † … e ¥ ¥ e …dd ¥ ¥dddd¥¥dd(¥(¥ † †559m5m$Ç$Ç,¥,¥,¥,¥,Æ,Æ$Ç$Ç,¥,¥0Æ0Æ,ç,ç$Æ$Æ$Ç$Ç,Æ,Æ § § ç ç55,ç,ç § § § § e …(¥(¥ e …$¥$¥ † † … e¥¥ e … † †$¥$¥$¥$¥ † †(¥(¥ † † § §(¥(¥ e … † †¥¥$¥$¥ † † † † § §,¥,¥0ç0ç,é,é(¥(¥,Æ,Æ † † § §(¥(¥(¥(¥(¥(¥ e … e … † † „ ddd … e„„…edd$¥$¥dd$Æ$Æ,Æ,Æ5m5m--,¥,¥0Æ0Æ,¥,¥,Æ,Æ,Æ,Æ,Æ,Æ,ç,ç,Æ,Æ § §(ç(ç$Æ$Æ † †-l-l5)5)$Ç$Ç § § e …$¥$¥ † † † † … e ¥ ¥ e …dd$¥$¥ † † † †(¥(¥ † †(¥(¥ † † § §(¥(¥ † †…edd¥¥ † † † †,¥,¥,Æ,Æ11$Ç$Ç,¥,¥ e …e…dddddd „ „ … e„„ … e„d¥¥ e …dd¥¥ † † † †(¥(¥-*1*-*1* ¥ ¥,¥,¥0Æ0Æ,Æ,Æ0Æ0Æ0Æ0Æ0ç0ç0ç0ç$Ç$Ç,Æ,Æ ç ç § § ç ç1L1L--(¥(¥ † †$¥$¥ e …¥¥ e …¥¥ e …¥¥ † †¥¥ † †(¥(¥ † †$¥$¥ † † § §(¥(¥ e … Æ Æ † † † † † †$¥$¥ † †,¥,¥,é,é$Ç$Ç,Æ,Æ,¥,¥$Ç$Ç(¥(¥ § §(¥(¥ † † † †dddd$¥$¥d„e…$¥$¥dd¥¥ e …$¥$¥ † †0ç0ç1L1L § §(¥(¥0Æ0Æ,Æ,Æ,Æ,Æ0Æ0Æ0Æ0Æ0ç0ç$Ç$Ç(ç(ç$Æ$Æ$Ç$Ç Æ Æ-*1*-*1* § §(¥(¥ † †$¥$¥ e … „ „¥¥ † †dd † †¥¥ † †(¥(¥ † †(¥(¥ † †(¥(¥ † †$¥$¥ † † † †„„ † † † †(¥(¥ § §,¥,¥11$Ç$Ç,¥,¥ § §$¥$¥ e …dddd „ „ … e„„ … e„d¥¥ e …dd¥¥ † † † †(¥(¥-*1*-*1* ¥ ¥,¥,¥0Æ0Æ,Æ,Æ0Æ0Æ0Æ0Æ0ç0ç0ç0ç$Ç$Ç,Æ,Æ ç ç § § ç ç1L1L--(¥(¥ † †$¥$¥ e …¥¥ e …¥¥ e …¥¥ † †¥¥ † †(¥(¥ † †$¥$¥ † † § §(¥(¥ e … Æ Æ † † † † † †$¥$¥ † †,¥,¥,é,é$Ç$Ç,Æ,Æ,¥,¥$Ç$Ç(¥(¥ § §(¥(¥ † † † †dddd$¥$¥d„e…$¥$¥dd¥¥ e …$¥$¥ † †0ç0ç1L1L § §(¥(¥0Æ0Æ,Æ,Æ,Æ,Æ0Æ0Æ0Æ0Æ0ç0ç$Ç$Ç(ç(ç$Æ$Æ$Ç$Ç Æ Æ-*1*-*1* § §(¥(¥ † †$¥$¥ e … „ „¥¥ † †dd † †¥¥ † †(¥(¥ † †(¥(¥ † †(¥(¥ † †$¥$¥ † † † †„„ † † † †(¥(¥ § §,¥,¥11$Ç$Ç,¥,¥ § §$¥$¥ e …dd„„†fdd¥¥dddd¥¥e…¥¥e… e …dd$¥$¥11-l-l e …,Å,Å0Æ0Æ,Æ,Æ0Æ0Æ0ç0ç0Æ0Æ0ç0ç0ç0ç § §$Ç$ÇÆÆ,é,é1L1L(ç(ç § §(¥(¥ e … † †¥¥ e … e …¥¥ † †dd$¥$¥ † † † †$¥$¥ † †$¥$¥ † † § § † †dd § § ¥ ¥ † † † †(¥(¥ † †0Æ0Æ-*1* § §(¥(¥ † †(¥(¥ § § † †(¥(¥e… † †dd…edddd¥¥ e …e…¥¥ e … e … § §55 § §(Å(Å0Æ0Æ,¥,¥0ç0ç0Æ0Æ0ç0ç0ç0ç0Æ0Æ$Ç$Ç(ç(ç † † ç ç1L1L11 § § † † † † † † ¥ ¥ e … e …¥¥ e …¥¥ † † † †(¥(¥ † †$¥$¥ † † † †$Æ$Æ † † … e¥¥d„ † † § § † †(¥(¥,¥,¥) -) -$Ç$Ç,¥,¥ † †dddddd„„†fdd¥¥dddd¥¥e…¥¥e… e …dd$¥$¥11-l-l e …,Å,Å0Æ0Æ,Æ,Æ0Æ0Æ0ç0ç0Æ0Æ0ç0ç0ç0ç § §$Ç$ÇÆÆ,é,é1L1L(ç(ç § §(¥(¥ e … † †¥¥ e … e …¥¥ † †dd$¥$¥ † † † †$¥$¥ † †$¥$¥ † † § § † †dd § § ¥ ¥ † † † †(¥(¥ † †0Æ0Æ-*1* § §(¥(¥ † †(¥(¥ § § † †(¥(¥e… † †dd…edddd¥¥ e …e…¥¥ e … e … § §55 § §(Å(Å0Æ0Æ,¥,¥0ç0ç0Æ0Æ0ç0ç0ç0ç0Æ0Æ$Ç$Ç(ç(ç † † ç ç1L1L11 § § † † † † † † ¥ ¥ e … e …¥¥ e …¥¥ † † † †(¥(¥ † †$¥$¥ † † † †$Æ$Æ † † … e¥¥d„ † † § § † †(¥(¥,¥,¥) -) -$Ç$Ç,¥,¥ † †dddddd„d „ „…edd¥¥dddd…e … e¥¥dd$¥$¥ † †%%1L1L,ç,ç0Æ0Æ5595========55 § §(ç(ç † †%%-*1* § §(¥(¥ † †¥¥$¥$¥e… e …¥¥e… † †$¥$¥ e …¥¥ † †(¥(¥ † † † † § § e … ¥ ¥$¥$¥ e …¥¥ e …$¥$¥ † †,¥,¥0ç0ç) -) -,¥,¥$Ç$Ç † †(¥(¥ § §(¥(¥ e … d „dddd¥¥dd¥¥e…dd¥¥e…dd$¥$¥ § §1L1L--0ç0ç4ç4ç95========55$Ç$Ç § §$Æ$Æ § §1L1L$Ç$Ç$Æ$Æ § §$¥$¥ e … e …¥¥e… † †dd$¥$¥¥¥ † † † †$¥$¥ † †$¥$¥ † † † †$¥$¥e… e …dd¥¥ † †(¥(¥ † †0Æ0Æ-*1*,é,é(¥(¥ e …dd „ „dd„d „ „…edd¥¥dddd…e … e¥¥dd$¥$¥ † †%%1L1L,ç,ç0Æ0Æ5595========55 § §(ç(ç † †%%-*1* § §(¥(¥ † †¥¥$¥$¥e… e …¥¥e… † †$¥$¥ e …¥¥ † †(¥(¥ † † † † § § e … ¥ ¥$¥$¥ e …¥¥ e …$¥$¥ † †,¥,¥0ç0ç) -) -,¥,¥$Ç$Ç † †(¥(¥ § §(¥(¥ e … d „dddd¥¥dd¥¥e…dd¥¥e…dd$¥$¥ § §1L1L--0ç0ç4ç4ç95========55$Ç$Ç § §$Æ$Æ § §1L1L$Ç$Ç$Æ$Æ § §$¥$¥ e … e …¥¥e… † †dd$¥$¥¥¥ † † † †$¥$¥ † †$¥$¥ † † † †$¥$¥e… e …dd¥¥ † †(¥(¥ † †0Æ0Æ-*1*,é,é(¥(¥ e …dd „ „dd „ „dddd „ „dddd„„dddd „ „¥¥ † †(¥(¥,é,é1L1L ç ç,Æ,Æ † † § §,é,é55$Ç$Ç,Æ,Æ$Ç$Çdd†f¥¥%%) -) -(¥(¥ † †$¥$¥ e … e …¥¥e… e …dd „ „…e$¥$¥ † †$„$„ † †(¥(¥ † †$¥$¥ † †dd$¥$¥ e …e…$¥$¥ † †(¥(¥(¥(¥,é,é5k5k § §(¥(¥(¥(¥ † †(¥(¥ † †(¥(¥ † † … eƒd ¥ ¥dddddc¥¥dd † † ¥ ¥(¥(¥ § §1L1L,é,é ç ç(¥(¥ † †,é,é,é,é,é,é,Æ,Æ$Ç$Ç(¥(¥d„¥¥ § §)K)K$Æ$Æ † †(¥(¥dd$¥$¥e…dd … e „ „¥¥ e … e …¥¥$„$„ † †(¥(¥ † †(¥(¥ † †dd … e „ „¥¥ † †$¥$¥ † †(¥(¥,¥,¥-*1*,é,é(¥(¥(¥(¥dddddd „ „dddd „ „dddd„„dddd „ „¥¥ † †(¥(¥,é,é1L1L ç ç,Æ,Æ † † § §,é,é55$Ç$Ç,Æ,Æ$Ç$Çdd†f¥¥%%) -) -(¥(¥ † †$¥$¥ e … e …¥¥e… e …dd „ „…e$¥$¥ † †$„$„ † †(¥(¥ † †$¥$¥ † †dd$¥$¥ e …e…$¥$¥ † †(¥(¥(¥(¥,é,é5k5k § §(¥(¥(¥(¥ † †(¥(¥ † †(¥(¥ † † … eƒd ¥ ¥dddddc¥¥dd † † ¥ ¥(¥(¥ § §1L1L,é,é ç ç(¥(¥ † †,é,é,é,é,é,é,Æ,Æ$Ç$Ç(¥(¥d„¥¥ § §)K)K$Æ$Æ † †(¥(¥dd$¥$¥e…dd … e „ „¥¥ e … e …¥¥$„$„ † †(¥(¥ † †(¥(¥ † †dd … e „ „¥¥ † †$¥$¥ † †(¥(¥,¥,¥-*1*,é,é(¥(¥(¥(¥dddd ç ç § §$Ç$Ç!!f† ç ç § § ç ç ç ç ç ç § § § § § §$Ç$Ç)K)K-*1*e…e…„„ddd df† § §e… § §)K)K) -) -) -) -)K)K1L1L ç ç § § § § ç ç § § § §f†¥¥f†f† § § ç ç § § § § § § § § § § † †$Æ$Æ † † § § † † † † § §$Ç$Ç,é,é$Ç$Ç5595-*1*,é,é) -) -,é,é,é,é,é,é,é,é$Ç$Ç † † † ††fÆÆ¥¥ † ††f § § Æ Æ § § § §-*1*55%%d„d dd„d dd„f†f†ÆÆ!!1L1L) -) -) -) -95!!$Ç$Ç § § § § § § § §ÆÆf†f†f† Æ Æ § § § § § § § § § § § § † † § § † † † † Æ Æf† Æ Æ$Ç$Ç,é,é$Ç$Ç,é,é5k5k9m5m) -) -,é,é) -) -,é,é ç ç § §$Ç$Ç!!f† ç ç § § ç ç ç ç ç ç § § § § § §$Ç$Ç)K)K-*1*e…e…„„ddd df† § §e… § §)K)K) -) -) -) -)K)K1L1L ç ç § § § § ç ç § § § §f†¥¥f†f† § § ç ç § § § § § § § § § § † †$Æ$Æ † † § § † † † † § §$Ç$Ç,é,é$Ç$Ç5595-*1*,é,é) -) -,é,é,é,é,é,é,é,é$Ç$Ç † † † ††fÆÆ¥¥ † ††f § § Æ Æ § § § §-*1*55%%d„d dd„d dd„f†f†ÆÆ!!1L1L) -) -) -) -95!!$Ç$Ç § § § § § § § §ÆÆf†f†f† Æ Æ § § § § § § § § § § § § † † § § † † † † Æ Æf† Æ Æ$Ç$Ç,é,é$Ç$Ç,é,é5k5k9m5m) -) -,é,é) -) -,é,é559k5k559k5k1L1LAïAï551)1)1L1L-)-)) -) -)K)K-*1*)J)J5m5m9k5k-*1*-*1*-*1*) -) -1*-*1Œ1Œ1L1L11=Ž=Ž=ï=ï559k5k=Ž=Ž5k5k95559Ž5551Œ1Œ=¯A°=ð=ð551Œ1Œ551Œ1Œ=¯A°55595559Ž551Œ1Œ5m5m=Ž=ŽIðEð=ð=ð55A¯=°AÏ=°=Ž=Ž=¯A°=Ž=Ž=Ž=Ž=Œ=Œ=Ž=Ž=Ž=Ž=Ž=Ž=Œ=Œ5m5m=Ž=Ž5m5m=Œ=Œ=ð=ð5J5J,é,é-*1*-)-))K)K11)K)K-*1*-*1*1Œ1Œ5J5J1L1L111L1L) -) -)K)K1L1L5k5k9555A°=¯=Œ=Œ5m5m9Ž55k5k=Œ=Œ55955Ž59555AòAñ5Œ5Œ95=Œ=Œ-l-l55=ð=ð55955Ž5955Ž51L1L5Œ5ŒIðIðAòAñ5595AðAð=Ž=Ž=¯A°=Ž=Ž=Ž=Ž=Œ=Œ=Ž=Ž=Œ=Œ55=Œ=Œ595k5k595k5k1L1LAïAï551)1)1L1L-)-)) -) -)K)K-*1*)J)J5m5m9k5k-*1*-*1*-*1*) -) -1*-*1Œ1Œ1L1L11=Ž=Ž=ï=ï559k5k=Ž=Ž5k5k95559Ž5551Œ1Œ=¯A°=ð=ð551Œ1Œ551Œ1Œ=¯A°55595559Ž551Œ1Œ5m5m=Ž=ŽIðEð=ð=ð55A¯=°AÏ=°=Ž=Ž=¯A°=Ž=Ž=Ž=Ž=Œ=Œ=Ž=Ž=Ž=Ž=Ž=Ž=Œ=Œ5m5m=Ž=Ž5m5m=Œ=Œ=ð=ð5J5J,é,é-*1*-)-))K)K11)K)K-*1*-*1*1Œ1Œ5J5J1L1L111L1L) -) -)K)K1L1L5k5k9555A°=¯=Œ=Œ5m5m9Ž55k5k=Œ=Œ55955Ž59555AòAñ5Œ5Œ95=Œ=Œ-l-l55=ð=ð55955Ž5955Ž51L1L5Œ5ŒIðIðAòAñ5595AðAð=Ž=Ž=¯A°=Ž=Ž=Ž=Ž=Œ=Œ=Ž=Ž=Œ=Œ55=Œ=Œ(¥(¥,Æ,Æ(¥(¥,¥,¥,Æ,ÆAðAð)J)J e …$¥$¥$„$„ … e … e ¥ ¥(¥(¥(¥(¥$¥$¥ † † § §$Æ$Æ$Æ$Æ § §$Æ$Æ § §(¥(¥(ç(ç(¥(¥ † †$„$„$¥$¥$¥$¥$¥$¥ ¥ ¥(¥(¥,¥,¥(¥(¥5k5kAòAñ,é,é(¥(¥ Æ Æ(¥(¥$¥$¥$¥$¥$¥$¥$¥$¥ † †(¥(¥(¥(¥(¥(¥,ç,ç=¯A°5J5J(ç(ç(ç(ç,Æ,Æ(ç(ç$Ç$Ç,Æ,Æ,Æ,Æ † †$Æ$Æ § §,¥,¥,ç,ç,Æ,Æ,¥,¥,Æ,Æ0Æ0Æ55--$„$„ † †$„$„(¥(¥ e … e … ¥ ¥(¥(¥ † †(¥(¥$¥$¥ § §$Æ$Æ § §(¥(¥ † †(ç(ç(¥(¥(ç(ç § §$¥$¥$„$„ † †$¥$¥(¥(¥ † †(¥(¥,¥,¥(¥(¥11AðAð1L1L(¥(¥ § §(¥(¥ Æ Æ(¥(¥$¥$¥ † † ¥ ¥(¥(¥$¥$¥(¥(¥,Æ,Æ5m5m9Œ5Œ--,ç,ç$Ç$Ç,Æ,Æ$Ç$Ç,Æ,Æ,Æ,Æ § §(¥(¥ § §(¥(¥,Æ,Æ(¥(¥,Æ,Æ(¥(¥,¥,¥,Æ,ÆAðAð)J)J e …$¥$¥$„$„ … e … e ¥ ¥(¥(¥(¥(¥$¥$¥ † † § §$Æ$Æ$Æ$Æ § §$Æ$Æ § §(¥(¥(ç(ç(¥(¥ † †$„$„$¥$¥$¥$¥$¥$¥ ¥ ¥(¥(¥,¥,¥(¥(¥5k5kAòAñ,é,é(¥(¥ Æ Æ(¥(¥$¥$¥$¥$¥$¥$¥$¥$¥ † †(¥(¥(¥(¥(¥(¥,ç,ç=¯A°5J5J(ç(ç(ç(ç,Æ,Æ(ç(ç$Ç$Ç,Æ,Æ,Æ,Æ † †$Æ$Æ § §,¥,¥,ç,ç,Æ,Æ,¥,¥,Æ,Æ0Æ0Æ55--$„$„ † †$„$„(¥(¥ e … e … ¥ ¥(¥(¥ † †(¥(¥$¥$¥ § §$Æ$Æ § §(¥(¥ † †(ç(ç(¥(¥(ç(ç § §$¥$¥$„$„ † †$¥$¥(¥(¥ † †(¥(¥,¥,¥(¥(¥11AðAð1L1L(¥(¥ § §(¥(¥ Æ Æ(¥(¥$¥$¥ † † ¥ ¥(¥(¥$¥$¥(¥(¥,Æ,Æ5m5m9Œ5Œ--,ç,ç$Ç$Ç,Æ,Æ$Ç$Ç,Æ,Æ,Æ,Æ § §(¥(¥ § §(¥(¥,Æ,Æ(¥(¥,Æ,Æ § §$Æ$Æ,¥,¥5m5m,é,é$¥$¥$„$„ † †$¥$¥$d$„$¥$¥(¥(¥ † †$„$„ † †(¥(¥(¥(¥ † †(¥(¥ § §(¥(¥(¥(¥,Æ,Æ § §(¥(¥$¥$¥ † †(¥(¥ e …(¥(¥,Å,Å,Æ,Æ,Æ,Æ5J5JIðEð--(¥(¥ § §$„$„ § §(¥(¥ † †(¥(¥(¥(¥ † †(¥(¥,¥,¥5595 § §,Æ,Æ(¥(¥,¥,¥ § §(¥(¥,¥,¥ † †$Æ$Æ § §(¥(¥ † †,¥,¥,¥,¥,Æ,Æ,Æ,Æ,Æ,Æ1L1L11 † †$„$d(¥(¥ † †$„$„(¥(¥ e …(¥(¥ † †$¥$¥(¥(¥$¥$¥$¥$¥(¥(¥ † †,Æ,Æ § §(¥(¥ § §,¥,¥(¥(¥ † †$¥$¥$¥$¥ e …$¥$¥,¥,¥,Æ,Æ,Å,Å11AðAð5k5k(¥(¥$Æ$Æ(¥(¥(¥(¥ † †(¥(¥ § §$d$„(¥(¥ § §,¥,¥,¥,¥=Ž=Ž-*1*(¥(¥(¥(¥,¥,¥ § §(¥(¥,¥,¥ § §(¥(¥ † †$Æ$Æ(¥(¥,¥,¥(¥(¥,Æ,Æ § §$Æ$Æ,¥,¥5m5m,é,é$¥$¥$„$„ † †$¥$¥$d$„$¥$¥(¥(¥ † †$„$„ † †(¥(¥(¥(¥ † †(¥(¥ § §(¥(¥(¥(¥,Æ,Æ § §(¥(¥$¥$¥ † †(¥(¥ e …(¥(¥,Å,Å,Æ,Æ,Æ,Æ5J5JIðEð--(¥(¥ § §$„$„ § §(¥(¥ † †(¥(¥(¥(¥ † †(¥(¥,¥,¥5595 § §,Æ,Æ(¥(¥,¥,¥ § §(¥(¥,¥,¥ † †$Æ$Æ § §(¥(¥ † †,¥,¥,¥,¥,Æ,Æ,Æ,Æ,Æ,Æ1L1L11 † †$„$d(¥(¥ † †$„$„(¥(¥ e …(¥(¥ † †$¥$¥(¥(¥$¥$¥$¥$¥(¥(¥ † †,Æ,Æ § §(¥(¥ § §,¥,¥(¥(¥ † †$¥$¥$¥$¥ e …$¥$¥,¥,¥,Æ,Æ,Å,Å11AðAð5k5k(¥(¥$Æ$Æ(¥(¥(¥(¥ † †(¥(¥ § §$d$„(¥(¥ § §,¥,¥,¥,¥=Ž=Ž-*1*(¥(¥(¥(¥,¥,¥ § §(¥(¥,¥,¥ § §(¥(¥ † †$Æ$Æ(¥(¥,¥,¥(¥(¥$Æ$Æ(¥(¥ † †,¥,¥-*1*,é,é e …$¥$¥$d$„$„$„(¥(¥$¥$¥$„$„ † †$„$d(¥(¥(¥(¥ † †$¥$¥$„$„(¥(¥ § §(¥(¥(¥(¥(¥(¥(¥(¥$¥$¥$¥$¥(¥(¥(¥(¥,Æ,Æ,Æ,Æ,Å,Å,¥,¥5k5kA¯=°$Ç$Ç$Æ$Æ(¥(¥ † †(¥(¥ † †(¥(¥ † † † †(¥(¥ § §(¥(¥,é,é=¯A°,æ,ç,¥,¥,¥,¥,¥,¥ § §(¥(¥,¥,¥,Æ,Æ,¥,¥ § §(¥(¥ † †$Æ$Æ$Ç$Ç,¥,¥,é,é0ç0ç1L1L-*1*$d$„(¥(¥$„$„$„$„ † †$„$„(¥(¥$„$„ † †$„$„(¥(¥ † †$„$„ † †$„$„$¥$¥(¥(¥(¥(¥(¥(¥,Æ,Æ$¥$¥$¥$¥ ¥ ¥(¥(¥(¥(¥,¥,¥,Æ,Æ,Å,Å,Å,Å11=¯A°-*1*(¥(¥ § §(¥(¥ † †(¥(¥ † †(¥(¥(¥(¥ † †(¥(¥(¥(¥,¥,¥5m5m1L1L,¥,¥,¥,¥,¥,¥,¥,¥ § §,Æ,Æ(¥(¥(¥(¥,Æ,Æ † † § §(¥(¥(¥(¥$Æ$Æ(¥(¥ † †,¥,¥-*1*,é,é e …$¥$¥$d$„$„$„(¥(¥$¥$¥$„$„ † †$„$d(¥(¥(¥(¥ † †$¥$¥$„$„(¥(¥ § §(¥(¥(¥(¥(¥(¥(¥(¥$¥$¥$¥$¥(¥(¥(¥(¥,Æ,Æ,Æ,Æ,Å,Å,¥,¥5k5kA¯=°$Ç$Ç$Æ$Æ(¥(¥ † †(¥(¥ † †(¥(¥ † † † †(¥(¥ § §(¥(¥,é,é=¯A°,æ,ç,¥,¥,¥,¥,¥,¥ § §(¥(¥,¥,¥,Æ,Æ,¥,¥ § §(¥(¥ † †$Æ$Æ$Ç$Ç,¥,¥,é,é0ç0ç1L1L-*1*$d$„(¥(¥$„$„$„$„ † †$„$„(¥(¥$„$„ † †$„$„(¥(¥ † †$„$„ † †$„$„$¥$¥(¥(¥(¥(¥(¥(¥,Æ,Æ$¥$¥$¥$¥ ¥ ¥(¥(¥(¥(¥,¥,¥,Æ,Æ,Å,Å,Å,Å11=¯A°-*1*(¥(¥ § §(¥(¥ † †(¥(¥ † †(¥(¥(¥(¥ † †(¥(¥(¥(¥,¥,¥5m5m1L1L,¥,¥,¥,¥,¥,¥,¥,¥ § §,Æ,Æ(¥(¥(¥(¥,Æ,Æ † † § §(¥(¥(¥(¥ † †(¥(¥(¥(¥ § §55) -) -$„$„$„$„$„$„(¥(¥$„$„(¥(¥(¥(¥(¥(¥(¥(¥$„$„ † †$„$d$¥$¥$¥$¥(¥(¥(¥(¥,¥,¥,¥,¥(¥(¥(¥(¥(¥(¥(¥(¥,Æ,Æ,¥,¥,Æ,Æ,Æ,Æ,Æ,Æ,Å,Å55A°=¯$Ç$Ç(¥(¥ † † † †$„$„ † †(¥(¥$¥$¥ † †(¥(¥$¥$¥(¥(¥0ç0ç=Ž=Ž11,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥ § §(¥(¥,Æ,Æ(¥(¥ † † § § § §(¥(¥$Ç$Ç$Ç$Ç,é,é5k5k) -) -$d$„$„$„(¥(¥$d$„$d$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$d$„(¥(¥ e …(¥(¥ † †(¥(¥$d$„,¥,¥,¥,¥(ç(ç(¥(¥(¥(¥(¥(¥,¥,¥,¥,¥0ç0ç,Å,Å,Æ,Æ,Å,Å1)1)AðAð)K)K(¥(¥ † † † †$„$„ † †(¥(¥ † †$¥$¥ † †(¥(¥ § §(¥(¥=Œ=Œ5k5k,¥,¥,¥,¥,¥,¥,Æ,Æ(¥(¥(¥(¥,¥,¥,Æ,Æ(¥(¥ † †(¥(¥(¥(¥(¥(¥ † †(¥(¥(¥(¥ § §55) -) -$„$„$„$„$„$„(¥(¥$„$„(¥(¥(¥(¥(¥(¥(¥(¥$„$„ † †$„$d$¥$¥$¥$¥(¥(¥(¥(¥,¥,¥,¥,¥(¥(¥(¥(¥(¥(¥(¥(¥,Æ,Æ,¥,¥,Æ,Æ,Æ,Æ,Æ,Æ,Å,Å55A°=¯$Ç$Ç(¥(¥ † † † †$„$„ † †(¥(¥$¥$¥ † †(¥(¥$¥$¥(¥(¥0ç0ç=Ž=Ž11,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥ § §(¥(¥,Æ,Æ(¥(¥ † † § § § §(¥(¥$Ç$Ç$Ç$Ç,é,é5k5k) -) -$d$„$„$„(¥(¥$d$„$d$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$d$„(¥(¥ e …(¥(¥ † †(¥(¥$d$„,¥,¥,¥,¥(ç(ç(¥(¥(¥(¥(¥(¥,¥,¥,¥,¥0ç0ç,Å,Å,Æ,Æ,Å,Å1)1)AðAð)K)K(¥(¥ † † † †$„$„ † †(¥(¥ † †$¥$¥ † †(¥(¥ § §(¥(¥=Œ=Œ5k5k,¥,¥,¥,¥,¥,¥,Æ,Æ(¥(¥(¥(¥,¥,¥,Æ,Æ(¥(¥ † †(¥(¥(¥(¥$¥$¥(¥(¥ † †(¥(¥$Ç$Ç55) -) - e …$„$„$„$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$„$„ † †(¥(¥$¥$¥$d$„,¥,¥(¥(¥(¥(¥,Å,Å0ç0ç,¥,¥,Æ,Æ,Æ,Æ(¥(¥,Æ,Æ(¥(¥0ç0ç,Å,Å0ç0ç,Æ,Æ5J5JAðAð)) † †(¥(¥ † †(¥(¥ † † † † … e$¥$¥$¥$¥ † †(¥(¥0ç0ç5m5m--,¥,¥0ç0ç(¥(¥,¥,¥,¥,¥,¥,¥,Æ,Æ(¥(¥(¥(¥ † †$Æ$Æ § §(¥(¥ § §,Æ,Æ$Ç$Ç=Ž=Ž1)1)$d$„(¥(¥$d$„$„$„$„$d(¥(¥(¥(¥(¥(¥(¥(¥$„$„(¥(¥ e …(¥(¥(¥(¥$„$„(¥(¥(¥(¥,¥,¥0ç0ç,¥,¥(¥(¥,Æ,Æ,¥,¥,Æ,Æ,Å,Å,Æ,Æ,Æ,Æ0ç0ç,Å,Å--=¯A°-*1* § §(¥(¥ † †(¥(¥ † † … e ¥ ¥$¥$¥ † †$¥$¥(¥(¥(¥(¥5k5k1L1L,¥,¥0Æ0Æ,¥,¥,¥,¥,¥,¥ § §,¥,¥,¥,¥,Æ,Æ † †$Æ$Æ † †$¥$¥(¥(¥ † †(¥(¥$Ç$Ç55) -) - e …$„$„$„$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$„$„ † †(¥(¥$¥$¥$d$„,¥,¥(¥(¥(¥(¥,Å,Å0ç0ç,¥,¥,Æ,Æ,Æ,Æ(¥(¥,Æ,Æ(¥(¥0ç0ç,Å,Å0ç0ç,Æ,Æ5J5JAðAð)) † †(¥(¥ † †(¥(¥ † † † † … e$¥$¥$¥$¥ † †(¥(¥0ç0ç5m5m--,¥,¥0ç0ç(¥(¥,¥,¥,¥,¥,¥,¥,Æ,Æ(¥(¥(¥(¥ † †$Æ$Æ § §(¥(¥ § §,Æ,Æ$Ç$Ç=Ž=Ž1)1)$d$„(¥(¥$d$„$„$„$„$d(¥(¥(¥(¥(¥(¥(¥(¥$„$„(¥(¥ e …(¥(¥(¥(¥$„$„(¥(¥(¥(¥,¥,¥0ç0ç,¥,¥(¥(¥,Æ,Æ,¥,¥,Æ,Æ,Å,Å,Æ,Æ,Æ,Æ0ç0ç,Å,Å--=¯A°-*1* § §(¥(¥ † †(¥(¥ † † … e ¥ ¥$¥$¥ † †$¥$¥(¥(¥(¥(¥5k5k1L1L,¥,¥0Æ0Æ,¥,¥,¥,¥,¥,¥ § §,¥,¥,¥,¥,Æ,Æ † †$Æ$Æ † †$„$„ † †(¥(¥(¥(¥,Æ,Æ,é,é,é,éc„ e …$d$„$d$„ ¥ ¥$„$„$„$d(¥(¥ e …$„$„$„$„(¥(¥$¥$¥(¥(¥,¥,¥,¥,¥,¥,¥,¥,¥(¥(¥$¥$¥(¥(¥,¥,¥,Æ,Æ(¥(¥,Å,Å,Æ,Æ(¥(¥,¥,¥-)-)=Ž=Ž) -) - ¥ ¥(¥(¥ † † … e$¥$¥ † † ¥ ¥(¥(¥ † †(¥(¥ † †(¥(¥5m5m,é,é,¥,¥,¥,¥,¥,¥,Æ,Æ,¥,¥,¥,¥(¥(¥,Æ,Æ,¥,¥(¥(¥ † †(¥(¥ † †,Æ,Æ † †(ç(ç1L1L11 e …$d$„$„$„ … e$„$„ … e$¥$¥$„$„$„$d(¥(¥ d „$„$„ † †$„$„(¥(¥,¥,¥(¥(¥,¥,¥,¥,¥,¥,¥$¥$¥(¥(¥,Æ,Æ,¥,¥,Æ,Æ(¥(¥,Å,Å,Å,Å(¥(¥,ç,ç559Ž5$d$„(¥(¥ † † … e Æ Æ$„$„ … e$¥$¥$¥$¥ † † § § d „-*1*-*1*,¥,¥,¥,¥,Æ,Æ,¥,¥,Æ,Æ(¥(¥,¥,¥,Å,Å,¥,¥(¥(¥ e …$d$„$„$„ † †(¥(¥(¥(¥,Æ,Æ,é,é,é,éc„ e …$d$„$d$„ ¥ ¥$„$„$„$d(¥(¥ e …$„$„$„$„(¥(¥$¥$¥(¥(¥,¥,¥,¥,¥,¥,¥,¥,¥(¥(¥$¥$¥(¥(¥,¥,¥,Æ,Æ(¥(¥,Å,Å,Æ,Æ(¥(¥,¥,¥-)-)=Ž=Ž) -) - ¥ ¥(¥(¥ † † … e$¥$¥ † † ¥ ¥(¥(¥ † †(¥(¥ † †(¥(¥5m5m,é,é,¥,¥,¥,¥,¥,¥,Æ,Æ,¥,¥,¥,¥(¥(¥,Æ,Æ,¥,¥(¥(¥ † †(¥(¥ † †,Æ,Æ † †(ç(ç1L1L11 e …$d$„$„$„ … e$„$„ … e$¥$¥$„$„$„$d(¥(¥ d „$„$„ † †$„$„(¥(¥,¥,¥(¥(¥,¥,¥,¥,¥,¥,¥$¥$¥(¥(¥,Æ,Æ,¥,¥,Æ,Æ(¥(¥,Å,Å,Å,Å(¥(¥,ç,ç559Ž5$d$„(¥(¥ † † … e Æ Æ$„$„ … e$¥$¥$¥$¥ † † § § d „-*1*-*1*,¥,¥,¥,¥,Æ,Æ,¥,¥,Æ,Æ(¥(¥,¥,¥,Å,Å,¥,¥(¥(¥ e …$d$„ § §$Ç$Ç$Ç$Ç,é,é1L1L5m5m-l-l$Ç$Ç § § ç ç § § § § § §%%) -) -$Ç$Ç%%$Ç$Ç) -) -$Ç$Ç1*-*$Ç$Ç,é,é%%$Ç$Ç%%$Ç$Ç%%$Ç$Ç)),é,é)K)K-*1*5k5k=Œ=Œ5595-*1* † †$Ç$Ç$Ç$Ç ç ç%%!!$Ç$Ç) -) -!!!!1L1L55A¯=°1L1L551)1),é,é4ç4ç1111) -) -951L1L-*1*-*1*,é,é$Ç$Ç-*1*)K)K,é,é1Œ1Œ1L1L,ç,ç--,é,é † † ç ç § § § §$Ç$Ç) -) -!!,é,é%%,é,é%%) -) -,é,é%%11!!$Ç$Ç$Ç$Ç%%$Ç$Ç$Ç$Ç) -) -) -) -1*-*1L1L=Œ=Œ559n5m1Œ1Œ § § § §)) § §!!) -) -!!) -) -$Ç$Ç!!-*1*5n5mA¯=°11,è,é$Ç$Ç$Ç$Ç!!,é,é%%) -) -11) -) -) -) -) -) -) -) - § §$Ç$Ç$Ç$Ç,é,é1L1L5m5m-l-l$Ç$Ç § § ç ç § § § § § §%%) -) -$Ç$Ç%%$Ç$Ç) -) -$Ç$Ç1*-*$Ç$Ç,é,é%%$Ç$Ç%%$Ç$Ç%%$Ç$Ç)),é,é)K)K-*1*5k5k=Œ=Œ5595-*1* † †$Ç$Ç$Ç$Ç ç ç%%!!$Ç$Ç) -) -!!!!1L1L55A¯=°1L1L551)1),é,é4ç4ç1111) -) -951L1L-*1*-*1*,é,é$Ç$Ç-*1*)K)K,é,é1Œ1Œ1L1L,ç,ç--,é,é † † ç ç § § § §$Ç$Ç) -) -!!,é,é%%,é,é%%) -) -,é,é%%11!!$Ç$Ç$Ç$Ç%%$Ç$Ç$Ç$Ç) -) -) -) -1*-*1L1L=Œ=Œ559n5m1Œ1Œ § § § §)) § §!!) -) -!!) -) -$Ç$Ç!!-*1*5n5mA¯=°11,è,é$Ç$Ç$Ç$Ç!!,é,é%%) -) -11) -) -) -) -) -) -) -) -55AðAð=¯A°55AðAð=Ž=Ž=Ž=Ž=ï=ï1Œ1Œ=¯A°55A¯=°55115k5k951L1L1Œ1Œ1L1L551L1L1L1L1Œ1Œ559Œ5Œ11=Ž=ŽAòAñAðAð55=Ž=Ž=ï=ïAðAð=¯A°EïIïEðIðAðAð=ï=ï=Ž=ŽAðAð=ð=ðAòAñ=¯A°EðIð=ð=ðAòAñ=Ž=Ž=Ž=ŽIðEðIðEðAðAð=¯A°=ï=ï=Œ=ŒAðAð=ð=ðAòAñ=Ž=ŽAðAðAðAðAðAðJFNSN3=ð=ðIðEðAòAñJFAðAð1Œ1Œ=Ž=Ž=Ž=Ž=Ž=Ž5Œ5ŒA¯=°=Ž=ŽAðAð5511559k5k1L1L1L1L1L1L551L1L1L1L1Œ1Œ5m5m955595AðAðAðAð55=ï=ï=Ž=ŽAïAï=ï=ï=¯A°FJEðIð=Ž=ŽAðAð55IðIðAðAðAðAðAðAð=¯A°=ð=ð=¯A°9Ž=ŽAðAðIðEðAïAïAðAð=Ž=Ž=ï=ï=¯A°=ÏA°9ð=ð=¯A°=ÏA°9ð=ð=ð=ðJFNSN3AðAð59AðAð=¯A°55AðAð=Ž=Ž=Ž=Ž=ï=ï1Œ1Œ=¯A°55A¯=°55115k5k951L1L1Œ1Œ1L1L551L1L1L1L1Œ1Œ559Œ5Œ11=Ž=ŽAòAñAðAð55=Ž=Ž=ï=ïAðAð=¯A°EïIïEðIðAðAð=ï=ï=Ž=ŽAðAð=ð=ðAòAñ=¯A°EðIð=ð=ðAòAñ=Ž=Ž=Ž=ŽIðEðIðEðAðAð=¯A°=ï=ï=Œ=ŒAðAð=ð=ðAòAñ=Ž=ŽAðAðAðAðAðAðJFNSN3=ð=ðIðEðAòAñJFAðAð1Œ1Œ=Ž=Ž=Ž=Ž=Ž=Ž5Œ5ŒA¯=°=Ž=ŽAðAð5511559k5k1L1L1L1L1L1L551L1L1L1L1Œ1Œ5m5m955595AðAðAðAð55=ï=ï=Ž=ŽAïAï=ï=ï=¯A°FJEðIð=Ž=ŽAðAð55IðIðAðAðAðAðAðAð=¯A°=ð=ð=¯A°9Ž=ŽAðAðIðEðAïAïAðAð=Ž=Ž=ï=ï=¯A°=ÏA°9ð=ð=¯A°=ÏA°9ð=ð=ð=ðJFNSN3AðAð ¥ ¥ e … ¥ ¥ ¥ ¥$¥$¥dd Æ Æ$„$„ … e § §(ç(ç)K)K$¥$¥$c$„$„$„$„$„ ¥ ¥$d$„$„$„ ¥ ¥$d$„$„$„ „ „,Å,Å(ç(ç,é,é ç ç(¥(¥ ç ç(¥(¥¥¥$¥$¥$¥$¥¥¥ § §,Å,Å(ç(ç$Æ$Æ$Ç$Ç(ç(ç(¥(¥(ç(ç$Æ$Æ,Æ,Æ$Æ$Æ § §$¥$¥(¥(¥$Æ$Æ$¥$¥$¥$¥ † †(ç(ç(¥(¥1L1L))$¥$¥dd¥¥dd¥¥ † † „ „ … eÆÆ$¥$¥ e …¥¥$¥$¥ † † ¥ ¥ ¥ ¥ e … Æ Æ(¥(¥-*1* ç ç$d$„$„$„$¥$¥$d$„$¥$¥$„$„$„$d$„$„ „ „dd(¥(¥,ç,ç,ç,ç%%$¥$¥ § § ç ç ¥ ¥ ¥ ¥$¥$¥ † †(¥(¥ § §,Å,Å$Ç$Ç(ç(ç(ç(ç Æ Æ,Æ,Æ$Æ$Æ,Æ,Æ$Æ$Æ § §(¥(¥ † †$Æ$Æ(¥(¥¥¥ § §(¥(¥$Æ$Æ55) -) - ç ç † †dd „ „¥¥ † †¥¥ e … ¥ ¥ e … ¥ ¥ ¥ ¥$¥$¥dd Æ Æ$„$„ … e § §(ç(ç)K)K$¥$¥$c$„$„$„$„$„ ¥ ¥$d$„$„$„ ¥ ¥$d$„$„$„ „ „,Å,Å(ç(ç,é,é ç ç(¥(¥ ç ç(¥(¥¥¥$¥$¥$¥$¥¥¥ § §,Å,Å(ç(ç$Æ$Æ$Ç$Ç(ç(ç(¥(¥(ç(ç$Æ$Æ,Æ,Æ$Æ$Æ § §$¥$¥(¥(¥$Æ$Æ$¥$¥$¥$¥ † †(ç(ç(¥(¥1L1L))$¥$¥dd¥¥dd¥¥ † † „ „ … eÆÆ$¥$¥ e …¥¥$¥$¥ † † ¥ ¥ ¥ ¥ e … Æ Æ(¥(¥-*1* ç ç$d$„$„$„$¥$¥$d$„$¥$¥$„$„$„$d$„$„ „ „dd(¥(¥,ç,ç,ç,ç%%$¥$¥ § § ç ç ¥ ¥ ¥ ¥$¥$¥ † †(¥(¥ § §,Å,Å$Ç$Ç(ç(ç(ç(ç Æ Æ,Æ,Æ$Æ$Æ,Æ,Æ$Æ$Æ § §(¥(¥ † †$Æ$Æ(¥(¥¥¥ § §(¥(¥$Æ$Æ55) -) - ç ç † †dd „ „¥¥ † †¥¥ e … e …$d$„dƒ$„$„dd … eƒdƒd … e$„$d$Æ$Æ5J5J d „ e …$d$„$d$„ d ƒ$d$„$d$„dƒdƒdƒ e …$„$„$¥$¥5J5J † †$¥$¥dd … edddd¥¥(¥(¥dd † †$„$d$¥$¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥ † †$„$„(¥(¥ † † … e$¥$¥ e …¥¥ † †(¥(¥=Œ=Œ$Ç$Ç e …¥¥dd$¥$¥ e …¥¥dd¥¥ d „ e …$d$„$d$„dƒ e …c„c„$d$„dƒ$¥$¥-*1* § §$d$„$d$„$d$„dƒ$d$ƒ$d$„„„dc$„$d „ „„c$„$„11,é,é „ „ … edddddd ¥ ¥dd$¥$¥ e … ¥ ¥ e …$¥$¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥ † †$¥$¥$¥$¥$„$„ † † … e „ „¥¥(¥(¥-*1*1L1L$d$„dd¥¥ e … e …dd … e „ „ … e$„$d„c$„$„dd … eƒdƒd … e$„$d$Æ$Æ5J5J d „ e …$d$„$d$„ d ƒ$d$„$d$„dƒdƒdƒ e …$„$„$¥$¥5J5J † †$¥$¥dd … edddd¥¥(¥(¥dd † †$„$d$¥$¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥ † †$„$„(¥(¥ † † … e$¥$¥ e …¥¥ † †(¥(¥=Œ=Œ$Ç$Ç e …¥¥dd$¥$¥ e …¥¥dd¥¥ d „ e …$d$„$d$„dƒ e …c„c„$d$„dƒ$¥$¥-*1* § §$d$„$d$„$d$„dƒ$d$ƒ$d$„„„dc$„$d „ „„c$„$„11,é,é „ „ … edddddd ¥ ¥dd$¥$¥ e … ¥ ¥ e …$¥$¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥ † †$¥$¥$¥$¥$„$„ † † … e „ „¥¥(¥(¥-*1*1L1L$d$„dd¥¥ e … e …dd … e „ „$d$„$„$„ƒd … e$„$d„c$„$d„c „ c$„$d$Æ$Æ11dd$„$„$„$d „ ƒ$„$c$„$„ƒd$„$d„c ¥ ¥$d$„dƒ$„$„-*1*$¥$¥ e …dd „ „¥¥dd … edd ¥ ¥$„$„$¥$¥ † †$„$„ † †(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥ † † † †$„$„ † † … e „ „ … e¥¥,¥,¥5m5m,é,édd ¥ ¥dd … e„„ … e¥¥ † †dd$„$ddc$¥$¥$d$„ d ƒdƒ$d$„dƒ$d$„$d$„1)1) § § c „$„$„ ƒ d$ƒ$d$„$„$„$„ƒd$„$d„c„c … e$„$„11%%dd „ „dd¥¥dd … e ¥ ¥ e … ¥ ¥$d$„$¥$¥$¥$¥$„$„ † †(¥(¥(¥(¥(¥(¥(¥(¥ † †$„$„ † † … e$¥$¥dd¥¥ † †(¥(¥55-l-l † † … edd „ „¥¥$d$„dƒ$d$„$„$d$„$„ƒd … e$„$d„c$„$d„c „ c$„$d$Æ$Æ11dd$„$„$„$d „ ƒ$„$c$„$„ƒd$„$d„c ¥ ¥$d$„dƒ$„$„-*1*$¥$¥ e …dd „ „¥¥dd … edd ¥ ¥$„$„$¥$¥ † †$„$„ † †(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥ † † † †$„$„ † † … e „ „ … e¥¥,¥,¥5m5m,é,édd ¥ ¥dd … e„„ … e¥¥ † †dd$„$ddc$¥$¥$d$„ d ƒdƒ$d$„dƒ$d$„$d$„1)1) § § c „$„$„ ƒ d$ƒ$d$„$„$„$„ƒd$„$d„c„c … e$„$„11%%dd „ „dd¥¥dd … e ¥ ¥ e … ¥ ¥$d$„$¥$¥$¥$¥$„$„ † †(¥(¥(¥(¥(¥(¥(¥(¥ † †$„$„ † † … e$¥$¥dd¥¥ † †(¥(¥55-l-l † † … edd „ „¥¥$d$„dƒ$d$„$d$„dƒ$d$„dƒ$d$ƒdƒ d ƒ$d$„ d ƒ$„$„(ç(ç-*1* e …$„$„$„$„$„$d$„$„$„$„$„$d „ „„c$„$d „ „$„$d$„$„-*1*¥¥dd „ „dddd„„dd „ „¥¥ † †$„$„(¥(¥ † †$„$„ † †$„$d(¥(¥(¥(¥e… e … e … ¥ ¥$d$„ „ „dd$¥$¥$¥$¥(¥(¥5m5m$ç$çdddd „ „¥¥dd¥¥ d „dd … e$„$d„c$„$d$„$d„c „ c „ c$„$c$„$d$„$„-*1* § §$„$„$„$d$„$„$„$„$„$„$„$d „ „„c$„$„dd$„$„$„$d-)-) ç çdd „ „dddd „ „dd „ „dd ¥ ¥$¥$¥$„$„(¥(¥ † †$„$„(¥(¥$d$„ † †(¥(¥dd † †$„$d „ „$¥$¥dd † †$„$„(¥(¥) -) -1L1L d „dƒ „ „…e … eƒdƒd … e$„$d„c$„$d„c$„$c„c „ c$„$d „ c$„$„(ç(ç-*1* e …$„$„$„$„$„$d$„$„$„$„$„$d „ „„c$„$d „ „$„$d$„$„-*1*¥¥dd „ „dddd„„dd „ „¥¥ † †$„$„(¥(¥ † †$„$„ † †$„$d(¥(¥(¥(¥e… e … e … ¥ ¥$d$„ „ „dd$¥$¥$¥$¥(¥(¥5m5m$ç$çdddd „ „¥¥dd¥¥ d „dd … e$„$d„c$„$d$„$d„c „ c „ c$„$c$„$d$„$„-*1* § §$„$„$„$d$„$„$„$„$„$„$„$d „ „„c$„$„dd$„$„$„$d-)-) ç çdd „ „dddd „ „dd „ „dd ¥ ¥$¥$¥$„$„(¥(¥ † †$„$„(¥(¥$d$„ † †(¥(¥dd † †$„$d „ „$¥$¥dd † †$„$„(¥(¥) -) -1L1L d „dƒ „ „…e … eƒdƒd … e$d$„ d ƒdƒ$d$„ d ƒ$d$ƒ d ƒ d ƒ d ƒ$„$„(¥(¥1L1L$d$„$„$„ƒd$„$„$„$„$¥$¥$c$„$„$„$„$d „ ƒ$„$d$„$„$„$„%%dddd „ „dd„„dc „ „dd$¥$¥$„$„ † †$„$„ † †(¥(¥$d$„(¥(¥$d$„ † †$„$„ … e$„$d$„$„ … e ¥ ¥dd$¥$¥(¥(¥(¥(¥5k5k$Ç$Çd„dddddd … edddd ¥ ¥$d$„dƒ$d$„dƒ$d$„ d ƒ d ƒ d ƒ d ƒ$d$„$„$„-*1*$Ç$Ç d ƒ$„$„$„$„ƒd$¥$¥$„$„$„$d$„$„$„$d$„$„ „ „$„$d(ç(ç † †dddd „ „dddc „ „dd ¥ ¥$„$„(¥(¥ † †$„$„(¥(¥ e …(¥(¥(¥(¥$d$„(¥(¥ d „ e …$„$„ … e ¥ ¥ e … ¥ ¥$„$„(¥(¥111L1Lcddddd„„dd¥¥ d „$d$„$„$d „ c„c$„$d „ c$„$c „ c „ c „ c$„$„(¥(¥1L1L$d$„$„$„ƒd$„$„$„$„$¥$¥$c$„$„$„$„$d „ ƒ$„$d$„$„$„$„%%dddd „ „dd„„dc „ „dd$¥$¥$„$„ † †$„$„ † †(¥(¥$d$„(¥(¥$d$„ † †$„$„ … e$„$d$„$„ … e ¥ ¥dd$¥$¥(¥(¥(¥(¥5k5k$Ç$Çd„dddddd … edddd ¥ ¥$d$„dƒ$d$„dƒ$d$„ d ƒ d ƒ d ƒ d ƒ$d$„$„$„-*1*$Ç$Ç d ƒ$„$„$„$„ƒd$¥$¥$„$„$„$d$„$„$„$d$„$„ „ „$„$d(ç(ç † †dddd „ „dddc „ „dd ¥ ¥$„$„(¥(¥ † †$„$„(¥(¥ e …(¥(¥(¥(¥$d$„(¥(¥ d „ e …$„$„ … e ¥ ¥ e … ¥ ¥$„$„(¥(¥111L1Lcddddd„„dd¥¥ d „$d$„$d$„ d ƒ$d$ƒ d ƒ$d$ƒ d ƒ$d$„ d ƒ$d$ƒ$d$„$¥$¥1Œ1Œ$d$„dƒ$„$„$„$d$„$c$„$„$„$„$„$d „ c$„$„$„$„ƒd$¥$¥ § § „ „ „ „„c„cdd ¥ ¥$„$„(¥(¥$„$„(¥(¥(¥(¥(¥(¥,¥,¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥(¥(¥(¥(¥(¥(¥$d$„(¥(¥$„$„(¥(¥(¥(¥ † †(¥(¥1L1L § § e … „ „dc„„„d¥¥dd … e ƒ d ƒ d$„$d$„$c$„$c „ c „ c „ c$„$c$„$c$„$d5J5J ç ç$d$„$d$„$„$„ ƒ d$„$„$„$„$ƒ$d$„$d „ c$„$„$„$d „ ƒ(¥(¥ Æ Æc„ e …c„ „ „„c ¥ ¥$„$„(¥(¥$d$„(¥(¥,¥,¥(¥(¥ § §,¥,¥$d$„,¥,¥ † †,¥,¥(¥(¥,¥,¥(¥(¥$d$„$¥$¥$d$„(¥(¥,¥,¥ † †,é,é-*1*dƒdd„„„ddddddc$„$d$„$d „ c$„$c „ c$„$c „ c$„$d „ c$„$c$„$d$¥$¥1Œ1Œ$d$„dƒ$„$„$„$d$„$c$„$„$„$„$„$d „ c$„$„$„$„ƒd$¥$¥ § § „ „ „ „„c„cdd ¥ ¥$„$„(¥(¥$„$„(¥(¥(¥(¥(¥(¥,¥,¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥(¥(¥(¥(¥(¥(¥$d$„(¥(¥$„$„(¥(¥(¥(¥ † †(¥(¥1L1L § § e … „ „dc„„„d¥¥dd … e ƒ d ƒ d$„$d$„$c$„$c „ c „ c „ c$„$c$„$c$„$d5J5J ç ç$d$„$d$„$„$„ ƒ d$„$„$„$„$ƒ$d$„$d „ c$„$„$„$d „ ƒ(¥(¥ Æ Æc„ e …c„ „ „„c ¥ ¥$„$„(¥(¥$d$„(¥(¥,¥,¥(¥(¥ § §,¥,¥$d$„,¥,¥ † †,¥,¥(¥(¥,¥,¥(¥(¥$d$„$¥$¥$d$„(¥(¥,¥,¥ † †,é,é-*1*dƒdd„„„ddddddc$„$d † † † † † †$¥$¥ § § † †…edddddd § §1L1L%% § §(¥(¥ † †,Æ,Æ(ç(ç$Ç$Ç$Æ$Æ § § Æ Æ § §$Æ$Æ,Æ,Æ) -) -) -) -(ç(ç § § † †dd$„$ddd † † „ d$„$„ … edd … e † †…e „ d … e † †$„$„ „ d(¥(¥$¥$¥ † † … e § § † † † † § §)K)K § §cd„ddddcdcdcdd$„$d ¥ ¥ † †(¥(¥ † † † †$Ç$Çe…e… d „dc † †-*1*)K)K$Ç$Ç † † … e(¥(¥,ç,ç(ç(ç § §$Æ$Æ § § Æ Æ$Æ$Æ § §11) -) -,é,é ç ç † †dddd … e … e … e$¥$¥ d „dd … e … e † † „ d † †$„$„ † †$„$ddd(¥(¥ † † … e † † § § † † † †-*1*) -) -f†f†ÆÆ$Ç$Çe…d„e…f† † † † † † †$¥$¥ § § † †…edddddd § §1L1L%% § §(¥(¥ † †,Æ,Æ(ç(ç$Ç$Ç$Æ$Æ § § Æ Æ § §$Æ$Æ,Æ,Æ) -) -) -) -(ç(ç § § † †dd$„$ddd † † „ d$„$„ … edd … e † †…e „ d … e † †$„$„ „ d(¥(¥$¥$¥ † † … e § § † † † † § §)K)K § §cd„ddddcdcdcdd$„$d ¥ ¥ † †(¥(¥ † † † †$Ç$Çe…e… d „dc † †-*1*)K)K$Ç$Ç † † … e(¥(¥,ç,ç(ç(ç § §$Æ$Æ § § Æ Æ$Æ$Æ § §11) -) -,é,é ç ç † †dddd … e … e … e$¥$¥ d „dd … e … e † † „ d † †$„$„ † †$„$ddd(¥(¥ † † … e † † § § † † † †-*1*) -) -f†f†ÆÆ$Ç$Çe…d„e…f†)K55m9m111L)K) -)K1L5mA°=¯55AïJEðAðIðAðAðIðAðAðAðIðAð1Œ-*1L)K1L-l1L1L)K5m)K1L)K)K)K) -) -)K1L15m15511L111L)K) -)K) -)K151*) -)K1L1-l1L) -)K)K1L5Ið55AðAïJAðAðAðAðAïIðAðAðIðAð51L)K-*-l-*-l-l1L)K5m1L)K)K)K) -) -)K)K5m-l155911L511Aï-*)K)K) -11-15k=Ž,ç §(¥ § ç § ¥ Æ Æ(¥ ç$Æ(ç(ç$Ç(ç(ç$Æ § ¥ ¥(ç § ¥ § Æ$Æ,ç5J559k5=Œ5m=Œ=Ž=Ž559k5m559k5I1-5J5k5I9k5k5k5k9k5k5k5,Æ,¥,Æ4ç51),Æ †(ç § ç Æ$¥ § Æ(¥ ç(ç(ç(ç(ç$Æ(ç$Æ § „ ç(ç$¥$¥ § ç,Æ1=¯1Œ5m=Œ5k59=Œ=Ž55=Œ5m=ŽNS=Ž5I5)11)5J5k5k9I5k5J5k5k1L(¥ e$„$„,é5(¥$d „dddcd$„ ¥$dd „dddddd„d „$¥ ddd …$„1)=Ž0ç(¥(¥(¥(¥ §,¥0ç,Æ$Ç0ç0ç1L1Œ(¥(¥ e(¥$„$„,¥,¥,¤,¥,¥,¥,¥,¥,¥,¥,Æ,Æ,Æ5m1d d „dcdd „$d ¥d dd „dddd„dd$¥dddd(¥,¥55,¥ †(¥(¥(¥,¥$Ç0Æ0ç$Ç,Æ5)Aò-(¥ d(¥(¥$„,¥,¤,¥,¤,¥,¥,¥,¥,Æ,¥ † e0ç5m(¥ ddd„dddd ¥ „dddd„dd„dd¥ddd„d(¥55$Ç(¥ †,¥$Ç,Æ$Ç,Æ$Ç0ç$Ç0Æ=Ž1L,Æ(¥ †(¥ †(¥(¥(¥$d,¥0Æ,Æ,Æ$Ç,Æ$Ç,¥,Æ,Æ1L) -$d „dd„dd „d ecdd„ddd„d „d¥ dd „d …,Æ51 §(¥ §,¥$Ç0ç$Ç0ç$Ç,Æ,é5)A¯$Ç,¥ §(¥ †(¥(¥(¥(¥(¥(¥,Æ(¥,Æ,Æ † e „,é1Œ,¥dd„dd„d „ …dd „„dddd„d„ …$¥dd„d$¥-50ç$Ç,¥$Ç §,Æ$Ç0ç$Ç,Æ$Ç0ç=Ž5(¥(¥ †(¥ †$Æ †$Ç(¥ §,¥ §0ç,é0ç,é0ç,é$Ç5m5 dd„ddddd „ „d „„dd„d„dd¥ e ¥dcd$¥(¥51*,Æ,Æ,¥$Ç §$Ç,Æ$Ç0ç$Ç,Æ5J=¯,é(¥ † e(¥ † § †$Ç(¥,é(¥ §,Æ(ç$Ç † e11,¥dd„ddd„d „d „d„dd…„ddd¥ … ¥dcd(¥,é5k,é0ç$Ç,¥$Ç §,Æ$Ç,é$Ç0ç,é5k1L$¥f„d…e¥ † †,¥$Ç0ç$Ç,é,ç,é(ç,é,ç5m1* dddd„dddd „ddd„dd„„d „d¥ eƒdd¥(¥5m1,é0ç §$Æ$Ç,¥$Ç,é,¥$Ç,é5)A¯ §¥e„d…¥e † §,ç$Ç,¥,é,ç § e$„-5,¥ddd„ddddd „dddd„dd „ddd$¥$dd„ e$„,ç1Œ5,é0ç §$Ç$Ç,é0ç$Ç0ç$Ç0Æ-*1*d…Æ de…f„dd † §(ç$Æ$Ç$¥ § §,Æ1-$c „dd„d „dd „d„ddƒdd „ddd$¥ eƒdd$„(¥1L1)5$Ç0ç$Ç$Ç$Ç,é0ç$Ç,é,Æ55¥e†e…e…e„d çde(ç,Æ §$Æ †,é5,é §¥ed„e„dd„cdd„dd„¥ed† †¥e § §$Æ-*1L$Ç §$Æ$Ç0ç §,Æ §$Ç,¥ † §=Œ5c¥$Ç † e „¥ † … ¥,Æ$Ç †$Æ †$¥ †¥$Ç11L §$¥e…dd„dddƒddd„d„†¥d… † e† § § §,é-l,é § §(ç$Ç,Æ$Ç,¥$Ç § §(¥1AòÅe(ç § „¥ e¥ … ¥(¥ †¥ †=Ž5k59k5=Ž51*1L1L-*) -1*)K-*1Œ1*)K-*)K-*1*)J1L-*1Œ1L5Œ5=Ž=Ž559Ž1Œ51L1L%,é-*) -)K,é)K1L)K1L=¯Að51L55k=Œ=Ž=Ž=¯A°=ŒAðIðAðAð=¯=Œ559=Ž=Œ1L1L1L-*-))K-*1*1L-l-*1*-*)K-*)K5J-*1L-l5k5Að5Œ595Ž1L=Ž51L-)%) -1*-*) -) --l-*1L1Að=Ž1Œ1L=Ž5k=Ž=Ž=¯A°=Œ=¯Ið=¯A°$¥$¥(¥(¥(¥(¥$„d$¥ ¥ ¥ e$¥(¥1-* ç0Æ(¥(¥,¥,Æ,¥(¥$¥(¥(¥(ç$ç1L-(ç(¥,Æ §(¥(¥ †$Æ § Æ$Æ$Ç(ç,ç,é1(ç,ç,é)--,é,ç---*5J11,ç--,ç,Æ,Æ,Æ(¥(¥(¥d ¥$„ †$¥ e(¥,Æ1L$ç(ç,¥(¥(¥,Æ,¥,Æ ¥$¥(¥(¥(ç)K1),ç,Æ$Æ,Æ §$¥(¥ §(¥ § §(ç$Æ,é,ç,é,ç),ç,é-)-),ç)--11L11 § „ Æde … † e …d¥d e … „$¥ †51,Æ,¥0Æ,¥,Æ,Æ0ç,Æ §(ç Æ$¥$Ç1- §(¥ †$¥ e¥ † … ¥d †$¥ †(¥ †(¥ † § ¥ e „d † § §,¥,é-,¥ †,¥ †(¥ †(¥ e …(¥ ed¥d …d¥ †(¥,Æ5-,¥,Æ,¥0ç,¥$Ç,Æ(ç,Æ$Æ § §1L-*$Æ † § e(¥ …¥ †d¥ † † …$¥$¥$¥ †$Æ †$¥ed … † §(¥,Æ1$Ç(¥ dd…d „ … „¥ e„…¥d¥ † e,Æ11L e,¥,Æ0ç,Æ,Æ,Æ0ç$Ç(ç §$Ç ç1L0ç$Æ †$¥ † e …$¥ e¥ …¥ †(¥ †(¥ † §(¥ †$¥f¥ †$¥ †(¥0Æ,é §,¥$Ç †,¥ †(¥ e …„ ed…¥d¥ † e$¥$Ç5m$Æ,¥,Æ,Æ,Æ0Æ0Æ0ç,Æ$Ç$Ç$ÇÆ-)5J$Ç †(¥ e¥ † … ¥d$¥ e¥(¥ †(¥ † §(¥ e † †„ † †$¥ †,Æ,é,¥$Ç,¥ †dd†d¥ded¥ …e „¥ …$¥) -1Lc,Æ0Æ,Æ0Æ0Æ0ç0Æ$Ç(ç$Ç §-)-*,é$¥ † †$¥ e¥ …¥ e¥ † † §$„ †$¥ † § e¥d¥ † †(¥ §0Æ1$Ç(¥ §(¥ † §$„ e…d¥df „… e „¥ †,¥5m †(¥,Æ,Æ0Æ0Æ0ç0ç0ç §,ç Æ †)K1$Ç † † ¥ †d$¥ e¥ …¥ † §(¥ † †$¥ † †¥ e… Æ †(¥ †,¥-*$Ç,¥ †d …d„d†d „„e …„ e¥… †,é-l,Æ0ç0Æ4ç===55 §$Æ Æ,é1L(ç$¥ †$¥ †e …¥e$¥ †¥ †(¥ †$¥ † †$¥ e¥d„ †$¥ †,¥,é) -,¥ §(¥ †(¥ §(¥ed¥dd„…¥ ed …¥$Ç1L,é,Å4ç58ç==0ç4ç(ç § §$Ç1L,é$¥ †$¥ e¥… e …¥ † e †$¥ † †$¥ † § †d¥d¥ †(¥(¥,Æ-*,é(¥ ed „d „dd „dd„„ e„ …$¥$¥,é1L(ç(ç §,é1=,é0Æ0ç e¥ †)K-)$¥ †(¥ † e „…$¥e …¥ † e(¥ †(¥ †$¥ † …e$¥ … †$¥ §(¥0Æ1L,¥(¥ § †(¥ † †$„cd$¥„dd… „¥ † †,¥-l,é(ç$Ç,Æ,é559,é §dÆ¥)K$Æ §(¥ e¥ †d¥ †d¥$¥ e$¥ †(¥ †$¥ † … „¥ † e$¥ †(¥,¥-*,é(¥(¥dd † †Æ †¥¥¥¥ Æf † Æ † §) -)Kd„dcde†d…%) - ç1L)K †f ††Æe…dd… e† §¥ † † † † … ¥dd¥ † §,Æ$Ç,é5m) -,é$Ç,é$Ç$Ç$Ç † § ç¥ eÆdd¥ † † §$Ç-l çdd C„d†dd §!!%5m § †f Æf… edd†df § † †¥ † †$„ …edd Æ §$Ç §$Ç1L1L$Ç,é$Ç$Ç51Œ55k1LAð1Œ-*1Œ5J-*) -1L1L1Œ51*) -)K%-*1L1Œ5mA°Að55=Ž=Ž5Œ=Ž55Œ9=¯51Œ5m1Œ1LIð55595Ž1L5k5Að51=ŽAð5=Ž=Ž=Ž=Ž=Ž=Ž=Ž=¯A°=Ž=Œ1L5J5J1L5J$Ç) -)K-*1*1L-l51L) -)K%) --l1L15Að=¯=Ž=Ž=Ž5Œ=Ž5Œ59=ŽAð-l1Œ11L=ïAð1Œ55m95n1L5AðAð-l5A¯9Ž=Ž=Ž=Ž=¯=Ž=Ž=Ž=¯,Æ,Æ,Æ,Æ(ç=¯1L e$¥$„ …¥$¥ §(¥ †(ç$Æ$Ç,Æ §$Ç(ç(ç(ç(ç(¥$¥$¥ Æ$Æ(¥(ç0ç(¥5kIð1$Ç$Ç(ç ç(¥ ç(¥ §(ç(¥,ç-Aò5k1-,ç--,ç,ç(ç$Æ$Ç,Æ,Æ$Ç,¥,¥,¥,¥,¥5k §(¥ † e ¥ …(¥$Æ(¥ §(ç,Æ §$Ç$Æ(ç(ç,ç(ç §(¥$¥(¥ §(¥(ç,Æ,Æ-Ið1Œ$Ç(ç$Æ$Æ$Æ$Æ$Æ$Æ$Æ,Æ$Æ,ç=Œ=¯11,é11,ç5$Æ$Ç,Æ$Æ0ç(¥(¥,Æ §,¥51$¥ †$„(¥ †$„(¥$¥$¥ †(¥$¥ †$Æ,¥ §(¥,Æ §(¥ †$¥$„$¥(¥(¥,Æ,¥5kIð) -$¥(¥ e(¥(¥ §(¥(¥(¥(¥,¥,é=Ž(ç(¥(¥,¥ §(¥(¥ §(¥ † §(¥(¥(¥(¥(¥,¥0ç,¥,é §$„ e(¥$„$¥(¥ †(¥ e(¥$¥ †(¥$Æ,¥ §(¥ §$¥(¥ † ¥$¥$¥(¥,Å,Æ1Að5m(¥(¥(¥(¥ †(¥ †(¥(¥ †,Æ,¥5m1*(¥ §(¥,¥ †,¥ †(¥ †$Æ(¥ §(¥,Æ †(¥,¥1L$Ç$¥$„ †$„$„ §$„ †(¥$„(¥ †$¥(¥ †(¥(¥,¥ §$¥$„$¥(¥(¥,Æ,Æ,Å(¥5J=ð,é$¥(¥$¥$¥ †(¥$¥ † †(¥,¥,ç=¯$Ç,¥,¥$Ç(¥,¥ §,¥,Æ(¥ †$Æ §(¥ †,Æ$Ç,é,Æ-* §$d(¥$„(¥ †$„(¥ †$¥$¥(¥ †$„ †(¥(¥(¥(¥ †$„$¥(¥(¥(¥,Æ,Æ(¥0çAð-*(¥ §(¥ †(¥ †(¥(¥ †(¥,¥,¥=Ž1L(¥,¥(¥,¥ §,¥,Æ §(¥ §(¥(¥(¥ †(¥ §(¥1) - e$„$„(¥(¥$„(¥(¥(¥(¥ d †$„(¥(¥$¥(¥,¥(¥(¥(¥,Æ,¥,Æ,Æ,Æ(ç,Å5kAò$Å(¥ † †(¥ †(¥ †$„ †(¥ §4çA¯-,¥,¥(¥(¥,¥,¥(¥,¥ †$Æ §(¥(¥ § §,Æ,é,é1)(¥$„$„$„(¥$„(¥(¥(¥$„ e$„(¥ †(¥$¥(¥(¥(¥(¥(¥(¥,¥,Æ,Æ,¥0ç,Å-=ð1L e$¥ †$„ †(¥ † †$„ †,Æ §5k5m,¥,¥,¥,¥,Æ §(¥,¥(¥ §(¥(¥$¥(¥ †(¥ §-*1 e(¥$ƒ$„(¥(¥(¥$d$„(¥(¥$„(¥(¥(¥$d,Å0ç,¥,Æ(¥,Æ,¥(¥,Æ,Å0ç0Æ5J=¯) †(¥ †(¥ e¥(¥ †$¥(¥ §,Æ54ç,Æ,¥,¥,¥,¥ §,¥,Æ(¥ †$Æ §(¥ †,Æ †(ç,ç1L(¥(¥ d$„(¥(¥(¥(¥$d$„(¥(¥(¥$„(¥(¥,¥,¥,¥,¥$Æ,¥,Æ(¥,Æ,Æ,Æ,Å1Að-*(¥ †(¥$¥ † † ¥$¥ †$¥(¥,¥5k1L,¥,Å,¥,¥(¥,¥,¥,Æ(¥ §(¥ † e(¥(¥,¥,Æ,é,é e$„$„ †$„(¥(¥(¥(¥ d$„ †(¥(¥(¥,Æ,Å0Æ(¥(¥,Æ,Æ,Æ,Å,Æ0ç(Å(Å-Að,é(¥ †$¥ † †$„ †$¥ † §$„ §5(ç,Å,Æ,¥,Æ,¥,¥0ç,¥,¥(¥ §(¥(¥$¥ §(¥(¥ †-* §$c …$„(¥(¥$d(¥(¥ †$„$¥$„,¥,¥,¥,Æ,¥,Æ(¥,Æ,Æ,Æ(¥,Å0ç,Å,¥,Æ51 e(¥(¥ e § ¥$„ †(¥ §(¥ e-*1L,¥,Å0Æ,¥,Æ(¥0Æ,¥,Æ(¥ e$¥ † §$Ç §,é5m)K †¥e$¥ † † §$Ç § §$Ç$Ç §$Ç$Ç,é § §$Æ § § § §,ç),é11L1L51*e † § † ç § § § §$Ç-*-l=Ž) -$Ç † § §,é §$Ç,é,é,é,é) § §$Ç §$Ç) --l$Çf¥ …f † § § § §$Ç$Ç §!$Ç$Ç$Ç § § § § § §(ç,é,ç) -5J5k1L5Œ † § § Æ § § § ç § §!1L51L$Æ$Ç §$Ç$Æ$Ç$Ç$Ç,é$Ç$Ç$Ç5Að=¯AðAð=¯=Ž=ï5=Ž=¯9Ž555951L5Œ51Œ1L5=Ž55ŒAðAð5=ï=¯AðIðAðJNS=Ï=Ï=ŽAðAðAð=¯AòAðAð=ð=¯BNSIÏAð=¯=ŽAðAðAðAð=¯AðBJSF3JSN3IðAð=ð=ðAò=î=°9=Ž=¯5Ž9555Œ95k1Œ55m1L5955ŒA¯Að=ï=Ž=¯=ïAðAïIðNSAÏ=ð=ŽAð=¯Að=¯AðAðAò=ð5IðNSIÐAïAò=Ž=ŽAðAòAðAðAðAðJSF3JS(ç Æ(¥ §(ç Æ(¥ ç(¥ ç--*(ç ¥(¥$¥$¥(¥$¥$¥$¥$„$¥,ç,ç%$Ç$ç-)(ç § Æ$Ç ç(ç,ç,ç-)$ç-(ç-(ç-(ç(ç$Ç(ç(ç Æ$Æ §,ç1-*-) ç$¥ Æ Æ § ç §(ç ç Æ$Æ$Æ §(ç$¥ §$Æ(ç(ç-*%$¥(¥(Å$¥$¥$¥$¥(¥ ¥$¥(¥-,é%(ç$ç,é ç §(ç ç(ç$Ç--),ç$ç,é,ç$ç-),ç$ç(ç §,ç(ç §(ç(ç(ç1-*-)¥ † Æ Æ § ç § dƒ e$„ddd$„d …,Æ)K$d$„$d „ c$„d$„cd …$„(¥1L † ¥ d „dd ¥ e$„ ¥ e …(Å(¥(¥(¥(¥(¥ †$„ †$„ † …$¥ e$¥(¥5m$Çd ed¥d „d „d$¥d …$d„dc$„d ¥-*$Æ$c$„ „$d „$d „d$dƒ e$„5) -c ¥ „dd … e ¥$„ e$„$¥(¥$¥(¥(¥$„(¥ †$„(¥ † … ¥d$¥ e5I1Ldd¥d$¥dd „$„$d„$d$„ƒd$„c$„$Æ-*$d „$d ƒ$„$„$dƒ „d$„d$„-* Æ$ddd „d ¥ … ¥ e$„$¥(¥ †$„(¥(¥(¥(¥ †(¥ e ¥ ¥d$¥ e(¥5) e „¥d¥ e¥ …d¥d$d „$„c$„d$„$d1) §$d$„$d „$c$„ƒ$d„$d „ „-$ç e …c „d ¥„ ¥ e$¥$¥$¥(¥ †(¥(¥(¥(¥ †(¥ †$d ¥d$¥ e Æ5)1L † ed „ … eƒ e$d$„ „c$„d$„c$„$d,Å)K$d$„ „$d$„$„$„c$„$„c ¥$„5J ed „d¥dd ¥$d ¥$¥$„ †$„(¥(¥(¥ †$„… e ¥$„ …d¥(¥ §5k,éd „d¥ edd „d…c …$d „$dƒ d$„$„-* Æ$d$„ „$d$„ ƒ$d „„$d „$„-)d „d „d„ … „ ¥$„(¥ † e$¥$„(¥(¥ † e$„ „ „$¥d¥ †$„1)1Lc ¥d¥d$„ƒd$„d ƒ$d„ c$„ d ƒ$„$Æ1L$d$„$„$„$„$„$„$„ƒ$„$d$„ …,é„d „dd„d …$„ e$¥$„ †$„ …$„(¥ e(¥d$„ … e ¥$„ ¥$„,¥5m çdd„ edd¥d¥dd$„ ƒ d ƒ „$c$„$„)J$Ç$d$„$„$„$„$„$„ƒ$„c$¥ „(ç §cd „„dd ¥d$„ †$„(¥ †$„(¥$„(¥ e …$„d ¥ e …$„(¥(¥-1Lddd †ddd$„$d „ c „$c „ c „$c$„(Å5Jd$d$„ ƒ$„$„$„$„$d „$„ƒ$¥(¥¥cd „„ e$„ ¥$„(¥(¥(¥(¥,¥(¥(¥(¥(¥(¥(¥(¥$„$„(¥ †$„ §$d5J$Çddd„d„„ddd „„$d ƒ d ƒ$d$„$d5)% c$„ d$„$„$„$„$„$„$d$„$„ Æ$¥dd$„d ¥$d$„$¥$„(¥(¥(¥(¥(¥(¥(¥(¥(¥$d(¥(¥$„(¥ e$¥(¥(¥,é-*c …dd„d „„ † †$„ †(¥ †dd „d §1L%(¥ †$„(¥$Æ,Æ † ¥$¥$¥$¥ §1$Ç$Ç §dc … ¥$„ †$„$„ e †(¥ … e$„(¥ e$„(¥ † † …(¥ †(¥$Ç51*†f„Ædd…e § ç § § §(¥ed „d ¥-*) - §$¥$„$¥$Æ,¥ †$¥ ¥$¥$¥(¥,é% §$Æ †c … ¥$„ †$„(¥d$„ †$d …$d(¥ †$„$¥$d § „(¥ † † †-*)Kf†„ Æe„d †1L151L551L-l-*)K1L1=ð=Ž55A°EîIðAðAð=ŽAïIðAðAðAðAð5Œ5)J1L1L1L1L1Œ-l5m-l1L1L1L1L)K)K) -)K1L559=¯5=ðNSN3=¯=ïAðAð51Œ5A¯9ðAòIðAïAò1Œ1L1L)K-*1L5m9Að55=ŽIïEðAðAðAð=ïAðAð=ŽAðIðAð51L-*1L1L1L-l1L5m5m9n-l1L1L)K)K) -1L1L15m5A¯5559515Að-*1L)K)K1,Æ115J=¯,Æ$¥ †(¥ ç$¥ e Æ ¥(¥ Æ §$Æ(ç(¥ ç$Æ$Æ$¥ e „ ç$Æ(¥$¥ † ç,¥5J=¯9k5k5m5k95k5=Œ5m=Œ5m=Œ555J1)-*111)5)5J5I5J5J5k5I9)5k5k5)1=Œ1L(¥(¥$¥ † § ÆÆ ¥ e$¥(¥ Æ ç$Æ(ç$Æ$Æ,Æ$¥ † „ §$Æ ¥ ¥ Æ(¥$Æ1=Ž55J1Œ5k59k=Ž5m=Ž=Œ5m5k=ŽJ9Ž9)1)-15I5I5J5k5I5J5k5)1L(¥ †$d$„0ç5(¥ ddd„ddd$„ ¥ ddƒdddddd„d „$¥ddd …(¥550ç(¥(¥(¥(¥,¥$Ç,¥0ç0ç$Ç0Æ5m1L(¥(¥$„(¥$d$„,¥$d,¥,¥,¥,¥,¥,Æ(¥,¥,¥,¥1L5J dd$„ddddd „ ¥ eƒ$dd „dddddd „$¥dddd(¥,¥51)(¥(¥(¥(¥(¥,¥$Ç,Æ0ç,¥$Ç5)Ið) -(¥ e$¥$„(¥,¤,¥$d,¥,¥,¥,¥,¥,Æ,¥$¥ e-5m(¥ ddd„dddd ¥ „ddd„ddd„dd¥ …dd„d$„15$Ç(¥ †,¥$Ç$Ç$Ç0ç$Ç,Æ$Ç0ç=Ž1L,Æ §(¥ †(¥(¥ §,¥(¥(¥,¥0Æ,Æ,¥ §0Æ,é,¥1L1L$cdd„ddcdd$¥ „dddc„ddd„dd¥ „dd „ …,Æ51,¥ §(¥$Ç$Ç0ç$Ç0ç$Ç,é,Æ5J=¯(ç(¥(¥(¥ †(¥(¥(¥(¥(¥,¥$Ç,¥,¥,Æ † ed-5(¥ d„dddcd … „dd „„ddd„dd„ … „d„dd$¥15,ç0ç,¥ § §,Æ$Ç0ç$Ç,é,¥,é=Œ5(¥(¥ † ¥ † §(¥$Æ,¥ §(¥ §0Æ,Æ,é,¥,é4ç1*1L$dd„dd„ddd¥ dd …cd„ded„d¥ †$„ddd „,¥51*,Æ$Ç,¥$Ç §,¥$Ç0ç$Ç$Ç,Æ5J=¯,é(¥ † e Æ(¥ †$Ç(¥$Ç,Æ$Ç,¥$Ç(ç$Ç † e11,¥dd„d„dddd„dd„dd…d„…d „¥ ecd¥(¥,é1L1$Ç$Ç$Ç,¥$Ç$Ç,¥$Ç0ç$Ç,é=Œ1L$¥f„d„f„† †,Æ §0Æ,é,é0ç,é(ç(ç1L5k d „dd„dd„ddd „d„ddd„„d „d¥ eƒdd$¥ §5k5,é$Ç,¥$Ç §$Ç0ç$Ç,Æ$Ç0ç5)A¯ §¥f„„e…e † §,é § §,ç,ç § e$„-5,¥ d „ddddd„ ec „ddd „„dd$„dd$¥dƒd „ d,é5k150ç$Ç$Ç$Ç0ç,é$Ç,é$Ç0Æ=Œ1Ld…Æ de…e„dd § ç,Æ$Ç,Æ §(¥$¥1L1L dcd„cd„dd „dd „dd„dd ¥ dddd$¥ dc„$„(¥1L-*8ç,é$Ç,Æ$Ç0ç$Ç,é0ç$Ç,é1=¯e…f…e…f„dd(çcd(ç(ç$Ç$Æ †-*11 §f…e…de„cdd„d„„dÆ †Æd † †† § §$Ç §-*1L$Ç §$Æ$Ç$Ç,¥ § §(ç §(¥(¥=Ž5c † § § ¥ †$¥$¥ † ¥(ç-1-*11*-*%55$ÇÆ §f…fd„ddd„d„ddd¥†e…¥ †f Æ †$Ç §%5m,é ç$Æ$Ç$Ç,Æ § §$Ç §,¥ †1Aò ¦¥ §(çd Æ †$¥¥ †(¥ § Æ †=Œ5m5k9m5k=Ž1L1L1L1L)J1)K-*1L1Œ1L)K-*)K5J-*1*1L) -1L1Œ55=ï=Œ1Œ55k1Œ51Œ1*) -) -) -)K-*1*-*1L)K1L=ïAð51Œ5=Œ5k=Ž=¯A°=Ï=ŒIðEðJEðAðAð=ï=¯9k=Ž=Ž-*1L)J1L-)-)1L)K1Œ-l-*1*-*1*-*)K1L-*1Œ1L1Œ=Ž=ï=Ž559Ž5m5k5-l-*)) -) -)K-*1*-*-l-*9Aï551Œ=Œ5k=Ž=Œ=¯A°=Ï=ŽIïAð=Ž$¥ e(¥$¥(¥(¥(¥ dd$¥$¥ e$¥(¥1-* §,Å,¥(¥,¥,Æ(¥(¥ ¥(Å$¥$¥(ç1L-,¥ §,Æ §(¥$¥$¥ † Æ$¥ §,Æ §(ç,ç,é(ç(ç$Ç,ç1$Ç,é,ç-,ç11L1(ç-1),ç,Æ,¥(¥$d,¥(¥(¥d e$¥ ¥ e$¥$„$Ç5k$Ç,Æ,Æ(¥(¥,Æ(¥(¥$¥$¥(Å(¥ §-*1)(ç §,Æ §(¥$¥ †(¥ † § §$Æ,Æ §-,ç,é(ç(ç,é,ç%,é(ç,é0ç-1L1,Æ § „¥d¥ e … † ed „…d¥ e(¥(¥11,¥,Æ,¥,Æ,Æ,¥0ç,Æ$Æ §(ç$¥$Ç1Œ,é § § †$¥ † e$¥ … e¥ † †$¥(¥ †(¥ † §$„ †…d Æ † §,¥,é-(¥(¥ †(¥ e(¥ †$„ † … ed „dd¥ „ †(¥,¥5m1,¥,¥,¥,Æ,¥0ç,Æ,Æ$Æ$Æ$Æ §1L-*,Æ †$¥ † e$¥ …¥ †d$¥ † †(¥ †(¥ † §(¥ e¥… e †(¥ §0Æ1$Ç(¥ †dddd¥ ed „…„¥ e … „¥ §51L e,¥0ç,¥0ç,Æ,Æ0ç$Ç(ç §$Ç ç1L-,¥ †$¥ e¥ … †d¥ † † …$¥ †(¥ † §(¥ † †¥e §$¥ †(¥0Æ,é §,¥$Ç(¥ e †(¥… e „¥d¥e¥d$¥ e †,é5m §(¥0Æ0ç$Ç,¥0Æ0ç$Ç(ç$Ç § Æ) -5) §$Æ †$¥ e¥ † … „¥ † e(¥ †(¥¥ §(¥ e Æ e… §$¥ †(¥,¥,é$Æ,Æ,¥ † ed¥d… „ed¥ …e„ † …$¥,é-ld,¥0ç,Æ0Æ0ç0ç0ç$Ç,Æ$Ç Æ%1L(ç §(¥ † e$¥…$¥ e¥ …¥ †$Æ †$¥$¥ † †$¥ed¥ † §$„,¥,é,é(¥$Ç(¥ †(¥e † …dd¥d… e¥ …e$¥ …$Æ5 §(¥,¥0ç,¥4ç,é0Æ0Æ$Ç(ç § Æ) -1 §$Æ † e¥ †d$¥ e …¥ † †(¥ †$¥ † § † …¥d Æ †$¥ †,¥-*$Ç,¥ † edd„ ed¥d„e… „ e¥d¥1-l,ç0Æ4ç5===4ç5 §(ç †) -1*(ç † § e$¥… e¥ …¥ †$¥ e †(¥ † † §$¥ e¥dd †$¥ †,¥,é1$Ç(¥ † †(¥ †$„d ¥d …d „… e„ …d¥ §1L1,Æ0ç4ç==4ç=4ç(ç §$Æ §1L,é Æ(¥¥ † †d¥e … †¥$¥ †$¥ † † §(¥ e¥…d¥ † †,¥,Æ-*0ç † † „ddd„dd „ddd¥d¥ †(¥,é-l$Ç(ç §0ç,é5,é0Æ$Ç †d ç$Ç) -(¥$¥ † ¥ ed¥ …d¥ †d$¥$¥ †(¥ †$¥ e …¥ eÆ e$¥ †,¥,é-*,¥ †,¥ §$d(¥ … e$„c$¥ddd¥d¥$¥ †,Æ1L)$Ç$Æ$Ç,é15,é,ç §d Æ †)K(ç †(¥ e¥ …d e¥d¥ † † …(¥$¥$¥ † †d¥ † …¥(¥ †(¥,¥-*,é(¥(¥dd § Æ § Æ¥¥¥Æ §Æ † † § §-*)Kd„ dCde† df) -!!1-* §f Æ † §e… e†d¥ § § † † † † † †¥e… e Æ §$Ç$Ç,é5m1*,é,é$Ç$Ç § †$¥d¥dd„d…f § † §)1 çd ddc df„e$Ç! ç) -1 § † §f §†¥e …Æd † § † † † † † †$¥ed¥ † §$Ç$Ç,é5J1L,é,é,é$Ç55k95k1LAð51*1Œ1)K-*1*-l5k51*-*1*%-*1L15=ïAð=Ž=Ž=Ž=Œ5Œ59Œ51ŒAò=Ž1Œ1Œ11LAð55Œ91Œ=Ž1Œ5m5Að=¯1ŒA°=¯=Ï=Ž=Ž=¯=Œ=Ž=Ž=Ž55k95k5m1L-*) -) -%) --)1L)K)J5m5k1*)K-*) -1*1L1Œ5=ŽAð=¯9Ž5=Œ55Œ95Œ5=ŽAð51L5-l=¯A°15595Ž1L5AðAò1L=¯A°=Ž=Ž=Ž=Ž=¯=Ž=Ž5=Ž,Æ,Æ,Æ §,ÆAð5Jd(¥ † e ¥ ¥(¥ †(¥ §(ç §$Æ §(ç$Æ,Æ(ç$Æ(¥$¥$¥$¥ †(¥(ç,Å,Æ5JIð) -(ç(¥$Æ$Æ §$Æ §(¥$Æ,¥,Æ,éAð5J1-(ç,ç,é,Æ,Æ$Ç$Æ §(ç,Æ,é,Æ,ç=Œ1L$¥ e$„ ¥$„ †ƒ(¥(¥ † §$Æ$Ç,Æ § §(ç$Æ,Æ$Ç(ç$¥(¥ †$¥$Æ(¥(¥,Æ,Æ-Aï5,Æ$Æ$Æ$Æ †$Æ$Æ(¥ †,Æ,Æ,Æ5=Ž1-(ç,ç,é,ç0ç$Æ §,Æ$Æ,Æ(¥(¥,Æ §,¥5) -$¥$„$„(¥ e(¥(¥ †(¥ †(¥$¥ †(¥ §(¥ §(¥,¥ †$¥ †$¥$¥(¥,¥,Æ,¥5k=ð1)(¥ †(¥(¥ †(¥(¥(¥ †,¥ §4ç5$Æ,¥ §,¥,¥(¥ §(¥ §(¥ †$Æ §$Æ,¥,¥-*1L$d$„$d„ e(¥$¥ e(¥(¥ †$„(¥ †(¥$¥ §(¥ §(¥,Æ$¥$¥ †$¥$„$¥(¥,Æ,Æ1Að5$„ §(¥(¥(¥ †(¥ §(¥(¥ §,¥=Œ-*(¥(¥,¥$Ç(¥(¥ †(¥ §(¥(¥ §(¥,Æ †(¥,¥-*) e(¥ …$„(¥(¥ †$„(¥ e$¥$„$¥ †$¥(¥(¥,Æ(¥(¥ †$¥(¥(¥,¥,Æ(ç,¥5JAò$Ç(¥ §(¥ †(¥ †(¥ †(¥ §,¥,çAð$Ç,¥,¥,¥ §,¥,¥ §,¥$Æ §(¥ †$Æ$Ç,¥5k1*$„ e$„c „$¥$„(¥ e$¥$¥$„(¥$¥ †$¥$„ §(¥(¥(¥(¥ †$¥(¥(¥(¥,Æ,Æ(¥0çAð-* §(¥(¥ † †(¥(¥ †(¥$¥,¥,¥5m1L,¥,¥,¥ §(¥,¥,¥$Æ,¥ †$Æ(¥(¥ †(¥ †,¥) -,é e$„$„(¥$„(¥$„ †$„(¥$„ †$„(¥(¥(¥(¥,¥,Æ(¥(¥(¥,¥,Æ,Æ,Æ,Å,Å5kAð$Ç †$„ †$„ †(¥ † ¥ †$¥(¥0Æ=¯1,¥,¥,Æ(¥,¥ §,¥,¥(¥ §$¥ † §(ç51*1L$„ d …c$„$„(¥ †(¥$d(¥(¥ e$„ †$„(¥(¥(¥,¥,Æ(¥(¥(¥,¥,Æ,Æ,Æ,Æ,Å1)Að-* ¥(¥e(¥ †(¥ e$¥ † †(¥,¥=Œ1L,¥,Æ,¥(¥,¥ §(¥,¥ §(¥ †(¥$¥(¥ †(¥$Ç51* d$¥$ƒ$d(¥(¥(¥(¥$d(¥(¥(¥(¥(¥(¥(¥,¥,Æ,Æ(¥,Æ(¥,Æ,¥0ç,Å0ç,Æ1L=ï,é$¥$¥ †(¥ † e(¥$¥ †(¥(¥0ç5m-0Æ,¥,¥,¥,¥(¥,¥,Æ(¥ †(¥ §$¥,Æ$Ç5m1L$„ d …c …$¥$„(¥(¥(¥$d(¥$¥$d(¥(¥(¥$d,¥0Æ,Å,Æ(¥,¥,Æ(¥,Æ0ç,Å0Æ151Œ$„ † §$„ † † ¥(¥ †$¥(¥,¥1L1L,Å,¥,¥,¥,¥(¥,¥,Æ,¥ §(¥ † e(¥(¥,¥$Ç1%$„ d$„ †(¥$„(¥$„(¥$„ …$¥$„(¥,¥,¥,¥0ç(¥(¥,¥,Æ,Æ,Å,Å(ç,¥(Å1Að) †(¥ † †(¥ e$¥$¥ † §$„ †10ç,¥,Æ,¥,Æ,¥,¥,Æ,¥(¥(¥(¥$¥$¥$¥ e1L1L c$„d dc„$„(¥(¥$„(¥$„$„(¥$„(¥(¥,Æ,Å,Å,Æ$¥,¥,Æ,Æ,Å,Å,Æ,Å(¥,Æ55$d,¥ †$¥ †$„ †$¥ †(¥ † †1)1L,¥,Å,¥,Æ,Æ,¥,Æ,Å,¥(¥ †$d † §$Ç §-*1L1L §f † † † § §%$Ç §) §$Ç$Ç$Ç,é ç$Ç § § ç$Ç §,é)1-*9k5m1Œ-* † § § †$Ç! §! §$Ç)K5m=Ž) - §$Ç §$Ç$Ç%$Ç,é,é%) -$Ç%$Ç) -AðAð1% § §¥ † § † §$Ç §$Ç!$Ç$Ç$Ç%$Ç,é §$Ç § ç § §,é),é-*5J51Œ5m † § § § §% §$Ç §!) -1L51L$Ç$Ç §$Ç$Ç$Ç$Ç,é%,é!$Ç5AðAðAðAð=¯=Ž=°1Að5=ï15=Ž1L51L5Œ511L5=Ž15=ŽAð=¯9=ïAðAïAðIðFAð=Ž=ŽAðAðAð=¯AðAð=ð=ð=¯IðJEðIð=¯=ï5IðAò=ð=ðIðAòJSF3NSN3NSJ3NSJ3AðAð55=ŽAð559Œ5551L1Œ51L51L559Œ5AòAð=Ž=ï=¯AðAïIðFIðAð5=ïAðAðAð=ðAòAð=ð5AðJEîIðAð5AðAð=ðIð9ðAðAòJSN3Aò Æ(¥ † § Æ$¥ § Æ$¥ §,ç)J(¥$¥$¥(¥$„$¥$¥$¥$„ ¥ ¥,Æ,Æ) -$ç(ç ç(ç Æ$¥ §(ç §,ç,ç),ç$ç,ç,ç$ç,é(ç$Æ$Æ$Æ$Ç$Æ$Æ$Æ$Ç,Æ1L-) ç „¥ † Æ Æ † ç$¥ § ¥ Æ Æ(¥¥$Æ §(¥ ç5J$Ç$¥$¥(¥$¥$d$¥$¥$¥ e$„$Æ0ç)) ç(ç(ç † § ç(¥ ç(ç(ç,ç)(ç(ç,ç(ç(ç(ç §(ç(¥$Ç(ç Æ$Æ(ç,Æ--*)¥¥$¥ † ç † Æ e$„c …$d„c$„d …,Å-* e$„$d „$d ƒ$ddƒ$d„$„(¥5J † ¥ e „d e „d ¥ …$d ¥(¥(¥(¥(¥(¥$„ †$¥(¥(¥ e$¥ …¥ †(¥=Œ § e „ …¥ ed¥ „d$dd$„d …c …d$„ ¥1) §$d$„ d ƒ$d „$dƒ$d„$„ e1) -c …d „d ¥ e … ¥$„ †$„ §$d(¥(¥(¥(¥(¥ †$¥$„ e¥ … †$¥1)-*d$¥ed¥dd ¥$„c$„ƒ e$„dƒ d$„(ç) -$„c$„$„ƒ$„$„ƒd$„d$„ ¥-*$¥dd „d „d$¥d(¥ ¥$„ †(¥ †$„,¥ §$¥$„ † …$¥ ed¥ †,¥5,é „d¥d¥ edd ¥ ƒ$d$„$d„$dƒ dƒ$„-* †$d$„$„ ƒ$d$„ƒd ¥ „c$„1$ç e ¥ƒ ed ¥d ¥$„ †$„(¥ †(¥(¥,¥ †(¥ †$„ †$„ †d$¥ e$¥1)5md$¥ed$¥ „$d „$d$„d$„ c„ c$„$d ƒ,Å)Kc$„ …$d$„$„ƒ e „$„ „d(¥-*d ¥dd „d „ „¥ e$¥(¥ e$„(¥(¥(¥ †$„ … e ¥ … ¥c$¥(¥(¥5m$Çd „d¥ ed¥d$„dd$„$d„ c$„ d$„$„-* §$„$„$„ ƒ$„$„$d „ „$d „ „1)ddd „dd „d$¥ e(¥ †$„(¥ d(¥(¥$d † … e ¥ … „d$¥(¥1-ld †ƒ edd„ e$„d ƒ d$„ ƒ$d„ c$„(¥1L e$„ ƒ$„$„$„$„$„$„ ƒ$d$„ …)dd$„dc„dd$¥ e$¥$„(¥ †$„$„(¥ †$„ …$d$„ ¥$dd(¥ †(¥5k$Çdd „dd„dd$„d$„c$„ƒ d ƒ d$„$„5J ç$c …$„$„$„$„$„$„ ƒd$„$„$ç §c „dd„d ¥ …$¥$„ †$„(¥ e(¥$„(¥ †$d$„$„d$¥ e ¥$„(¥11Lcdd„… „d$„$d „ c$„ c „ c „$c$„$¥1L$d „$„$„$ƒ$„$„$„$„$d$„ƒ$„$Ç „dd „„ e ¥$„(¥$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$„$„(¥ †$¥(¥$d1L$Çc „„d„d„ …$d „$d$„ d$ƒ$d„$c$„$d-*$Ç$d „$„$c$„$„$„ƒ$d$„$„$„(¥Æ dƒd „„ ¥$d$¥$„,¥(¥(¥,¥(¥(¥(¥(¥(¥(¥$d(¥$¥$d$¥(¥(¥(¥,é-*ddd„ddd$„ †$¥ † †(¥ † …d dd ç1L,é §$¥$¥(¥(ç,Æ$¥$¥$¥ †(ç(¥-*)$Ç §$¥d „ †$„ †$„$„ e † †$„ e …(¥ e$„(¥ † † †(¥ † †$Ç-*%dcdd„dd „c „ c$„$d$„d ƒ$d$„$„)J1L †(¥$¥ §,Å(ç(¥ †(¥ §(¥ §-),é$Ç$Ç$¥dd(¥ †$„$¥$„ e …$¥ e … e$„ †$„(¥ †(¥ e † § † †) -)Kf†¥ §e„d†-l559m=Ž55m)K) -1L-l1Að=Ž5Œ=ŽAðAðAðAðAð=ïAðAðAð=Ž=ïIð9Ž1Œ1L1L1L1L1Œ5m5m1Ž5m15m1L1L1L1L)K1L5m1=Ž=¯A°555951L-l) -151L1L1L5J-*1L=Œ=Ž5k5J-*)K5J1=ŽAð5Œ5=ŽAïIðAðAïAð=ïAïAïAð5AïAð5Œ-l1L1L1L-l51L11Œ15m-l1L1L1L)K)K1L15A¯=°=Ï955=ð55Ið-l)K-l-l1(¥0ç,ç5)A¯ Æ(¥$¥¥ § ¥$d „¥(¥¥$¥ §(¥ §(¥ Æ(¥ e „¥$Æ § ¥ e ¥ ¥(¥5J55k1L5J5k5k9m5k55k9m5k5k1Œ55)1-)(ç15I5)9I5)5k5k9k5J=Œ5k5)5)5J=Œ-*$¥ e$¥ Æ$¥$¥ „ e „ Æ$¥$¥ § Æ$Æ §$¥$Æ † ¥$dÆ(¥$¥d Æ ¥(¥1=Ž55I9k5k5k5m9k=Ž5k5m5k9k=ŽF=Œ1)--15)1)5)5I9)5J5J5J5),Æ e$¥$„15(¥ edddddd …$¥ dd$„ddd„ddd„ e ¥$„dd ¥$d5)5,ç(¥(¥(¥(¥(¥$Ç,Æ0ç,Æ$Ç0Æ5m1L,Æ †$„(¥$d(¥,¥,¥(¥,¥,¥,¥,¥,¥,¥,¥,¥,¥5 §dddddd„dd … ¥c „ dd „dddd„d$¥ eddd(¥,¥51,¥(¥(¥(¥(¥,¥$Ç,Æ0ç$Ç0Æ5)Aò,è$d$„(¥(¥$d$„,¥$d,¥,¥,¥,¥,¥,Æ §$„ †4ç5m §$dddc„d d„ eƒdd„dddd„d„ … „dddd(¥55$Ç(¥(¥ §,¥$Ç0ç$Ç0ç$Ç0ç,é=Œ1L,Æ §(¥ †(¥(¥ e(¥(¥,¥,¥,Æ0Æ,Æ,Æ,é0Æ,é1$Ç e$„dd„d„dd$¥dd„dddd„dd„¥d …c„d …,Æ51 § §(¥$Ç,¥$Ç0ç$Ç0ç$Ç0ç5J=Ž,é(¥ §(¥ †(¥(¥,¥ §,¥,¥$Ç,¥,Æ,Æ † ed-1L,Æddd„cddd$¥d „d„dd„„d„d¥ †ƒdd„ …-=Ž,ç0ç$Ç,¥$Ç$Ç,¥$Ç0ç$Ç$Ç0Æ=Ž5(¥(¥ † ¥ † §(¥$Ç †$Ç(¥ §0ç,é0ç,é,é,é5$Ç ed„dd„ddd¥ eƒ edd„de„dd …¥ eƒd„ …(¥51*0Æ,Æ$Ç †$Ç$Ç0ç$Ç0ç$Ç,Æ5J=¯$Ç(¥(¥ e¥ § § §(¥,Æ$Ç,¥$Ç0ç(ç$Ç † e15,Æ ddd„dd„ddd„d„dd…ddd „d$¥dd„ e$¥,ç5,ç,é,¥$Ç †$Ç$Ç0ç$Ç$Ç0ç,é5k1L „f„d„f„¥ †,¥ §0Æ,é,é,é-,é(ç-*,é$dc„dd„dddd …cdd„ddd„ „d„¥ edd„$¥(¥5m1,é,Æ$Ç,¥$Ç,¥$Ç$Ç$Ç,Æ,é5)A¯ §¥f„„ed¥ † §,ç § †-,ç §$„ e-5(¥$dddd„dd„ eƒddd„d „dd „dd „dd„$d$„,ç1Œ5,é,ç$Ç0ç$Ç$Ç,é0ç$Ç0ç0ç-*1*d¥†e…„e„dd † §1,ç,é,ç,é,ç-*) dƒdd„cd „dd$„d „dƒddd „ddc …$„c„ e$„$¥1L1)4ç,é$Ç$Ç$Ç$Ç,é0ç,é$Ç0ç15¥e†e…e…e„d Ædd ç(ç$Ç §$Æ-*9) - § §¥f†„e„cd„dÆdd†¥ Æf† § § Æ § ç$Ç$Ç)K1L$Ç § §(ç §$Ç,Æ$Ç § § †(¥=Ž5d$¥ ç † † §(¥ †$Æ$¥,é,ç%-*11*1)) -=Ž1L ç$Ç §f †Æd…ddd„d†„f„¥ † ††Æ § § § §$Ç$Ç) --l) -$Ç §(ç,Æ §$Ç,Æ § §(¥ †1Aò ¦¥ §$Ç$¥ † § Æ(¥$¥ §$Ç ç$Æ=Œ=Œ5m5k9k=Ž5k-*1L5J-*) -1*-)-l51*1L-)-*1*1L-)1L)K1L5k1Œ5=Ž5Œ59m1Œ5k59m)J1) -)K-*1*) -1L1L-*-lAð=Ž=ï1=Œ=Ž5kA¯9ŽAð=¯A°=ÏAð=¯Að=¯=Ž=Ž=Œ=Œ=Œ51*1Œ5J-*) -1)K-*11L-*)K1-*1L1*)J1L)J51L5ŒAð51Œ51Œ5k59k1L-)) -) -)K-*) -)K1L-*1L5Að=¯91Œ=Œ5m=Œ=¯A°=ÏA°=¯Iï9ŽA¯ e¥$„(¥(¥(¥ d …$d „¥ …$¥(¥1-* Æ,¥,¥(¥(¥,¥(¥(¥$¥(¥$¥(¥ ç1L-,Æ §(¥ §$„ †(¥ †$¥¥ § §(¥(ç(ç,ç$Ç(ç$Ç(ç(ç$Ç(ç,é(ç,ç1-*,Æ,Æ,ç,¥ §$¥$„(¥ e¥$„ †$„c † ¥ … ¥(¥,Æ1L$Ç(Å,¥(¥(¥,¥(¥,¥$¥$¥(Å$¥(¥)K1(ç §,¥ †(¥$¥$¥$¥¥$¥ †$Æ §,Æ(ç(ç,é(ç$Æ(ç(ç,é$Ç,ç(ç,ç,é5J1(¥ §c¥d …¥ e † „ ed„… †d(¥(¥11,Æ,¥0Æ,¥0ç,¥,ç,Æ,Æ$Æ § §$ç5,é(¥ † †(¥ † † … ¥ e¥ †$„ †(¥ †(¥ † § ¥ †d… †(¥ §,¥,é-,¥$Ç(¥ †(¥(¥ † e ¥ … e „d¥d … „ e(¥$Ç=Œ-,Æ,¥,Æ,¥0ç,Æ,ç,Æ$Æ §(ç †1L-*$Ç(¥ † †$¥ e † …¥ e¥ †(¥ †(¥ †(¥ †(¥ †…e¥ † §,¥,¥1$Ç,¥ e…dd¥d … e¥„ e¥d¥ † …$Æ-*1L$d,¥,ç,Æ,Æ,Æ,Æ0ç$Ç(ç$Ç ç §1L1$¥ †$¥ †d$¥¥ e …¥ †$¥ † §(¥ † §(¥ † † …¥ † †(¥ §0Æ,é §,¥ §(¥ e †(¥ … e „¥d¥e …„¥ e †,ç5m †,¥,Æ0ç,Æ,¥0Æ0ç$Ç,Æ$Ç$ÇÆ-*1 § §$¥ † †d$¥ e¥ † † † …(¥ †(¥ †$Æ † †¥ e † †(¥ §,¥1$Ç,¥$Ç e „d„ e¥dd„¥e …¥ e¥ †1-*$¥(¥0Æ,Æ0Æ0ç0ç0Æ0ç §$Ç Æ ç-*,é$¥ †$¥ e †¥… †d$¥ † †$¥ †$¥ †(¥ † †¥d¥ †$¥ †,¥0ç,é,¥$Ç †,¥ §(¥e †dd…dd$¥… e¥ …¥$Ç5m §(Å,¥0ç,Æ0ç0ç0Æ0ç$Ç$Ç §„)K1 §(¥$¥ e¥ …¥ e¥ …¥ †(¥ †$¥ † †$Æ † e …„ † § ¥(¥$Ç5$Ç$Ç$„edd„…de¥d… ed¥ …d$¥,é-l,Æ,ç4ç5====,é,Æ §Æ ç-*$Ç(¥ † †¥ e …¥ e¥ … Æ e †$¥ † † §$¥ e…d„ † †(¥ †0Æ-*$Ç(¥ † † §(¥ † e „d¥d…e „… †d$¥ §1L1,Æ4ç0Æ====4ç$Ç(ç §$Ç1L$ç § § †$¥ e¥ … e¥ † † † †(¥ e §$¥ † …¥ed¥ †(¥ †,¥-*,é(¥e „dddd„ddddd¥d¥ †(¥,é1L ç$Ç §,Æ,é5,é,Æ,Æe¥ …) -) -(¥ †$¥ e¥ …d¥d¥ †d$¥$¥ †(¥ †$¥d¥ e „¥ † †(¥,¥,é1L(¥(¥ †,¥ † †(¥ ddd ¥ddd¥d „¥(¥$Ç-*) -(ç §(ç$Ç5,é0ç$Ç(¥e¥$Ç)K,Æ$¥ † e „ …e¥d …¥ e ¥ …$¥(¥$¥ e †¥ … ¥d †$¥(¥ †0Æ-*,é(¥(¥d e § § ç ç¥ † ç Æ ç §f § § §)K-*ed„ C df†„ §!)K) -1)K § §Æ § §f†¥ e†f ç § § § † † § § e$¥…f §$Ç,é$Ç,é5m1*,é1) -$Ç$Ç †f¥†d„d„ †f § Æ §$Ç1 çdd„de†e†%)K!!1L § § § §Æ §e …¥f… § § § § † § † §$¥e¥ … Æ §$Ç,é,Æ1L1L,é,é,é%55k95k1LAð51)1L-))K-*1*1Œ1L5k1*)K-*1*)K1L51Œ=¯A°55=Œ=Œ559Ž55kIð=¯1Œ11Œ5Að559m5Ž55k1Œ=ŽAò=ð5=Ž=¯=Ž=Ž=Ž=Ž=Ž=Ž=Ž5=Ž51L5m1-*) -1*)K) -1L1Œ-*1*-l1L5k1L-*)K1L1)-l55m9ŒAð=Ž=Œ=Ž=Ž559Ž555Aò5Œ151L=ïAð1Œ5595Ž1L5AðAò5Ž=ŽAð=¯=Ž=Ž=Ž=¯=Œ=Ž5=Ž(ç(¥,Æ,¥,ÆAð)J e$¥$„ † … ¥$¥$¥(¥$Æ §$Æ §(¥$Æ$Æ$Ç,Æ$Æ(¥ †$¥(¥$¥$¥(¥,Æ(¥5kIð) -(¥ §(¥ § ¥(¥$¥$¥$Æ(¥,¥,éAð5)1,ç(ç,ç,ç,Æ(ç(¥ §(ç(¥$Ç(ç(¥5=Ž(¥ †$¥(¥(¥ †$¥ e ¥(¥(¥ †(¥ §,Æ §(¥ §(¥(ç(ç$Æ(¥ †(¥ †$¥$¥(¥,¥(ç0çAï1L,Æ §(¥ § ¥(¥$¥$¥ †(¥,Æ,Æ5m=Ž1(ç$Ç,Æ1,Æ$Ç(¥$Æ$Æ(¥,Æ(¥(¥,¥ §,Æ5m1$¥ †$„$„$¥(¥(¥ †$„ †(¥(¥ †$Æ,¥$Ç(¥ §(¥ †(¥ e ¥$„ §,¥,Æ,Æ5JAð1 §$¥(¥(¥$¥ §(¥(¥ †,¥$Ç4ç5$Ç(¥(¥,Æ †(¥,Æ †$Æ(¥ † § Æ(¥(¥55m †$d$„ †$„(¥$„ †$„(¥ †(¥ †$¥(¥$¥ †$Æ,¥ †,Æ §(¥$¥ †$¥$„$¥(¥,Æ,Æ0çAð5(¥ §$„ §(¥(¥ §$„ §(¥,¥,¥51* ¥,¥(¥,¥ †,Æ(¥ †$Æ §(¥,¥(¥,Æ †(¥,¥-*%$„(¥ d(¥$„(¥ †$„(¥(¥ †$„(¥ †(¥(¥(¥(¥,Æ(¥ †$¥(¥(¥,¥0ç,Å(¥5kA¯$Ç(¥ §$„ †(¥ †(¥ †(¥ §$d0çAò(æ,¥(¥,¥ §(¥,¥,Æ §(¥ †$Æ(¥ †,¥-*-l(¥$d …$„ †$ƒ(¥(¥$„ †$„(¥$„$¥ †$„$¥ †(¥,¥$Æ,¥(¥$¥ †(¥(¥(¥,Æ,Å(¥1Að-*(¥ §(¥ †$¥(¥ †(¥ †(¥ §,¥=Œ1L,¥,¥,Æ §(¥,¥$Æ(¥,¥ §(¥ §(¥$¥ §(¥ †-*,é †$„$„$„(¥(¥(¥(¥(¥ e$¥$„ †$„(¥(¥(¥,Æ(¥(¥(¥(¥,¥,Å0ç,Å,Æ,Å5A°$Ç(¥ †$¥ †(¥ † ¥$„ †(¥(¥,ç=¯,é,¥,¥(¥,¥,Æ,¥(¥,¥ §(¥ †$Æ § §-5m(¥ d „$d$¥$„$„(¥(¥(¥(¥ †$„(¥ e(¥ †(¥(¥(¥,¥,Æ(¥(¥(¥(¥,Å0ç,¥0ç,Å1=ð-*$¥$¥ †$„ †(¥ †$¥ †$¥(¥(¥=Œ1L,¥,¥(¥,¥,¥,¥,¥,¥ §(¥ †(¥$¥(¥ †(¥,¥) -1$„$d$„(¥(¥$d(¥(¥$d$„(¥(¥(¥(¥(¥(¥,¥,Æ,Æ(¥,Æ,¥,Æ,¥,Æ,Æ0ç,Å5J=ð,é$¥$¥ †(¥ e$¥ †$¥ †(¥ §0Æ50ç,Å0Æ,¥(¥(¥,¥,Æ(¥(¥ †$Æ,¥ §(¥-*9$„ d „$d$„$„$d(¥(¥(¥$d(¥$„(¥$„(¥(¥(¥$d,¥0Æ,Å,Æ(¥,Æ,¥,Æ,¥0ç,Å,Æ151Œ(¥ †(¥ †$¥ e$¥ †$¥ †(¥(¥5k1L,¥,Å,¥,¥,Æ(¥,¥,Æ(¥ §(¥ † †$„(¥(¥,é5% e … e$„$¥(¥$„(¥(¥ e …$¥$d(¥(¥,¥,¥0Æ(¥(¥,Æ(¥,Æ(¥0ç(Å(¥,¥-)Að) †(¥ † e$¥ † …(¥$¥ †(¥$¥1L,é,¥,¥,¥,Æ,¥,¥,Æ0Æ(¥(¥(¥ †(¥ e-5(¥ c d „$d$„ ¥$„(¥(¥$„(¥ d$„ †$„(¥(¥,¥,¥,Å,Å(¥(¥,Æ(¥,Æ,Å,Æ,Å(¥(ç55m$d §$„ †$¥ † † ¥$„ §(¥ e-*1*,¥,¥,Æ,¥,¥,¥,Æ,¥,Æ$¥ e$„ †$Ç$Ç$Ç-*1L1L § § † § † § §%$Ç$Ç)$Ç%,é$Ç,é) §) §$Ç$Ç$Ç,é-)-*5J5m5m1Œ1*† § §$Ç!!$Ç!$Ç!1L5m51*$Ç$Ç$Ç$Ç%$Ç,é%) -) -1*) -1*-*9ŽAñ1,é,é% § § † § § §$Ç!$Ç$Ç%$Ç,é%,é,é ç$Ç §$Ç$Ç$Ç),é) -1*5k=Ž1Œ5m § §$Ç § ç! §$Ç!$Ç) -5m95$Ç$Ç$Ç$Ç$Ç) -$Ç) -,é) -) -%5Að=ð=¯A°Að=Ž55=ï5=ï5595m1L51L51Œ1L5591Œ=¯=ðAð5=ï=ïAð=¯JIïAð=ŽAðAðAðAð=¯AòAòAð=¯=ŽIðNSAÐ=Ï=ï=ŽAðAðAòAð=ïAòAðJSN3JSEÐNSNSN3AïAð5=ï55=ï559Œ55m1Œ5m1L51Œ1L1L5Œ59=ïAð=¯A°=ï5AïAïIðFIðAð5=ïAðAð=¯AòIðAòAñ5AïJEðAïAð5AðAðAð=ðAðAð=ïJSN3Að$¥ ¥$¥$¥ †$¥¥(¥¥$Æ(ç1L ¥$d$„$¥$„ ¥$d$¥ …$„ ¥,Å(ç,é ç$Æ$Ç § Æ$¥ § Æ(¥$Ç,ç$ç(ç$Æ(ç,Æ$Ç(ç(¥$Æ §(¥$Æ † Æ$Æ,Æ,Æ-*) - Æ„¥¥ † Æd Æ ¥ ¥ ¥(¥ §$¥¥(¥$¥$¥ §1)) e$„$¥$¥$d$¥$„$¥$d ¥(¥1$Ç) § ç § Æ Æ § Æ(¥$Ç(ç(ç(ç(ç$Æ(ç,Æ$Ç(ç(¥ §(¥(ç † Æ(¥ §(ç1-* ç e¥¥¥ †¥$¥ e$„c …d …c …$d„,Æ-*$d$„$„c$„ d$„c„$dƒ ¥,¤5J † †ƒddd ¥ e ¥ …$d ¥(¥(¥(¥(¥(¥$d(¥$¥(¥ †$„ …¥ † †(¥5$Çd$¥ed$¥… ¥$c$„ d „ d „ddƒd e$¥1 §$„$d$„d$„ c$„d$dƒ$d$„-) -c ¥ „dd … ¥ e$„d(¥ †(¥(¥(¥(¥$d(¥ †$¥$¥ e ¥ … ¥$¥ e5I1*e „ …d¥ d …d$„c …$d$„d$„c „$d$Æ1d$„$„$„$d ƒ$„d$„ƒ e „$„-*$¥d ¥d ¥d ¥ e$„ ¥$¥$„ †$„ †,¥(¥(¥$¥ † † …(¥¥d$¥ e(¥5,éd ¥d¥d †$„ d „d „$d$„d$„c$„d$„-* § c$„$„ d$„$„ƒ „d$„c$„-)d eƒ$¥dd ¥ e ¥$¥$„ †$„ †(¥,¥,¥$¥ †$„$¥ † ¥d$¥e(¥1)1L$¥ ed¥ †$„ d„$d$„d ƒ d ƒd$ƒ d$„(ç-*d$„$„ƒ$„$„$„ „d$„ „$d$„-*¥d „ddd „d ¥$d ¥(¥ †$„(¥$d(¥ †(¥d …$„ „ …d$¥$¥(¥5m$çdd „ … edd„c$„ d„$dƒ d$„ c$„$„-* §$„$d$„$„$„ ƒ$d„$dƒ ¥$d1$Çd „dd„d „d ¥$„ §$„ †$„(¥$„ †(¥ ed$¥ „ e „d(¥(¥1-ldd „ …ddƒ e$„d ƒ$d$„ƒ$d$„ c$„(¥1L$„ ¥$d$„$„$„$„$„ƒ ¥ d$„$„) ed „d„d„d ¥$„(¥ †$„(¥ e$„(¥ …$„ e$„ „ † ¥$„ ¥(¥(¥5k$Çddd¥d „d ¥$d„$d$„ d ƒ d ƒ d$„$„5J ç$d$„ƒ$„$„$„$„ ¥$d$„$„$d(ç Ædd „dd „d ¥$„(¥ †$„(¥(¥ d(¥(¥ d(¥ …$d ¥$„d$¥$¥(¥,é1Lddd„„…$d„$d „ c „ c$„c „$c „$¥5Jd$d$„$„ ƒ$„$„$„$„$„$d$„$„ çd „„dc ¥$„$¥$„(¥(¥(¥(¥(¥(¥(¥(¥,¥(¥(¥(¥$d$¥$„(¥(¥ †$d1L ç dd„dd„„$dƒ$d ƒ$d ƒ$d ƒ d ƒ$d ƒ5J$Ç d$„$„ c$„$„$„$„$d$„ „ ƒ(¥ †d „„d$„d$¥$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$d(¥$„$¥$„(¥(¥ †,ç-* ddd„ddƒ$d § §,Æ$Ç$Ç § § † † †,é1) -(¥$¥ †$¥(¥ † § e ¥d$¥ †-*) § §$Æ e …$¥ e$¥$„ †$„ † † … †$d †(¥ †(¥$Ç$Ç †$Ç$Ç §,é-l) - § § § §Æ § §$Ç § §,¥ §$Ç,é † † † †$Æ1L1L$Æ †$¥(¥ †(¥ †$¥d¥ †$„,é)K Æ §$Æ †d(¥$¥ †$„ …(¥f † … e †$„ §(¥ †,¥$Ç §$Ç$Ç §$Ç1L1L §Æ § §Æf § §1Œ=¯9=Ž=¯A°11L-*-l5=Ž=ï559k=ŽAð=ï=¯A°=Í=¯A°9ï=Ž=ŽAï=Ž51*1Œ1L1L55m955m59m5m11L1L1L1L1=¯A°=ÏA°=¯=¯AÐ=¯=ð5AðAòAñAòAñ=ð=¯1595m1L11L-*-l5m5A¯=Ž555A°=ï=¯=ŽAð=Ž=¯=ï=Ž=Ž=¯A°=Ž5J-l1L1L1L551595m5m5n11L1L1L15A¯=°=ÏAò5A¯5Aò=ð5Aò5Ž111,ç,¥0ç0ç-*=Ž(¥$„$¥d$¥d „d ¥(¥d Æ$¥$¥(¥$¥$¥$¥d ¥c$Æ(¥d¥ † ¥(¥5J=Ž1L5I5J1L5J5k5m9k5m5k1L5k5m1L5J-,é11-1)5)1)5)1)5)1)1)51*51L- e$¥$„(¥(¥ e „ „d ¥ ¥$„ „$¥(¥ Æ(¥$¥$¥ † eƒ Æ$¥ ¥$d „¥(¥,ç=¯1L5I5J5J5k1L5k5k9m5k5k5k9mF=Ž1,ç,ç,é115I5)15I1)5)9),Æ † d$„,é5m(¥ d „ddd„d …$¥$dd$„ddddd „dd¥ †ƒdd …(¥1=Ž,Æ(¥ †(¥(¥,¥$Ç,Æ0ç$Ç,Æ0Æ=Ž1Œ †(¥$d(¥$„(¥,¤(¥$d,¥,¥,¥,¥,¥$Ç,¥,¥$Ç,é$„(¥ †$ddd„dd„ e ¥ „dddd„dddƒd(¥dddd(¥,¥51)(¥(¥(¥(¥(¥$Ç,¥0ç$Ç,Æ,Æ5J=¯1(¥ e(¥$„$„(¥,¥$d,¥,¥,¥,¥(¥,Æ §$„ e11L,Æddd„dddd ¥d„dddd„edd „… ¥$dc„d$„55(ç,¥ §(¥$Ç0ç §,Æ,é,Æ,é0ç=Œ5m §(¥(¥ †(¥(¥ e(¥,¥(¥(¥,¥$Ç,¥0Æ,Æ(¥ §-$d(¥$„$„„dd„dd$¥dddd„dddd„d„¥ „d„d …,Æ51,¥ § †,¥$Ç0ç$Ç0ç$Ç,Æ,é5)A¯$Ç,¥ †(¥ † §(¥(¥(¥,¥$Ç,¥,¥$Ç,Æ † ed-5,¥dd„dd„dd$¥dddd„dd„d„d¥ …$d„dd$¥11,é,Æ$Ç,¥$Ç §,Æ0ç$Ç0ç$Ç0ç=Ž5m(¥(¥ e¥ † § § §(¥(¥ §(¥$Ç,é,Æ,é,¥,é1 d(¥$„ddd„ddd †ƒ e „dd„dÆcd„…$¥dd„d$¥(¥51*,Æ$Ç,¥ §$Ç,¥$Ç0ç$Ç,é,¥5JAò$Ç,¥ †$¥¥ §(¥ †$Ç,¥$Ç$Ç,¥$Ç(ç,Æ e¥51,¥dd„d„dddd„d„„ddd„d…d „$¥ddd „ †,ç5m4ç$Ç0ç$Ç §,¥$Ç$Ç0ç$Ç$Ç0Æ5m1L „f„„e†„e † §,¥ §,¥$Ç,é$Ç §--*$d$„ … dc„d„dd …dddd„dd„dddd$¥d „dd¥(¥5m15$Ç$Ç,¥$Ç §0ç$Ç$Ç,Æ,é5A¯ §¥e…d…f¥… §1 † §-(ç$Ç †$c11,¥ d „ddcdd„ ec„dcd„dd „„dc …$ddƒd$„,é1L0ç1$Ç$Ç0ç$Ç$Ç,é0ç$Ç,é,Æ5J) -d¥†e…„e„„d † Æ §,Æ$Æ$Ç,ç1) -d$ddƒdcdd dd„$d„„cd„dc … „dc …$„cdƒ$„(¥1L1),é4ç$Ç$Ç$Ç,é$Ç0ç$Ç,é0ç1=¯f…f…e…„e„d Ædd §(ç$Ç §$Ç-*11*$Ç § §f¥†¥dd„dÆe¥†„Æ §f†$Ç § ç §$Ç%$Ç1L1L%$Ç$Æ$Ç §(ç § § §$Æ † §=¯=ŽfÆ §$Æ § § § §(¥$Æ-1$Ç) -1*1-*9=¯) -%!$Çf §†f¥…dd„d¥…e¥† § ÆfÆ § § ç §) -$Ç) --l) - § §(ç$Ç$Ç,¥$Ç$Ç$Ç † †1Aò æ¥ ç$Ç §(¥ † §,Æ §$Æ$Ç ç$Ç=Œ=Œ5m5J5m=Œ1L1-l-*1*) --)-*1*5-l-*1*1-*)J1L5J-*1L1Œ5k5A¯5Ž1Œ5m1L1Œ5k1Œ-*1*)-*1*-*)K1L1L1L5k=Ž=ï=Ž=Ž=Ž=Œ=Œ=Œ=¯Iï=¯A°=ÏIðAð5A°9Œ9m=Œ=Œ=Ž5m) -1*1L)J1)-))K-*9-l1L-*11L-*1*)J5J-*-l559=¯1Œ1L51L5k55J)K,é) -)K-*1*-*1*-l1L5A¯9ï=Ž5=Œ5k=Ž=¯A°=ÏA°=¯Iï=¯=Žd †$„(¥$d(¥ …d ¥ e ¥$„ ¥(¥1)K(¥,Æ(¥,¥,¥(¥(¥(¥ ¥$¥(¥ ¥$Ç1L1 §(¥$Æ §$„ †$„ †$¥ e Æ §(¥,Æ$Ç(ç,Æ$Ç(ç$Æ,ç$Ç$Ç(ç,ç0ç,é-*(ç,¥(ç(¥ §(¥$d,¥$„(¥(¥ †$dd ¥ … ¥ e(¥,Æ1L(ç$¥,¥(¥(¥,¥(¥,¥$¥$¥$¥$¥(¥)K1)$Ç,¥$Æ §$„ †(¥ † ¥ ¥$¥ †$Æ §(ç,Æ(ç$Ç$Æ,Æ$Ç$Ç$Ç(ç,ç0ç$Ç1L0ç(¥$¥d„d¥ † … ¥ ed ¥dd¥d(¥ †55m$Ç,¥,¥,Æ$Ç,¥0Æ,ç$Æ$Ç,Æ § ç5,ç § § e(¥ …$¥ † e¥ … †$¥$¥ †(¥ † §(¥ e †¥$¥ † † §,¥0ç,é(¥,Æ † §(¥(¥(¥ e … † dd …„ed$¥d$Æ,Æ5m-,¥0Æ,¥,Æ,Æ,Æ,ç,Æ §(ç$Æ †-l5)$Ç § e$¥ † † … ¥ ed$¥ † †(¥ †(¥ † §(¥ †ed¥ † †,¥,Æ1$Ç,¥ e…ddd „ …„ e„¥ ed¥ † †(¥-*1* ¥,¥0Æ,Æ0Æ0Æ0ç0ç$Ç,Æ ç § ç1L-(¥ †$¥ e¥ …¥ e¥ †¥ †(¥ †$¥ † §(¥ e Æ † † †$¥ †,¥,é$Ç,Æ,¥$Ç(¥ §(¥ † †dd$¥d…$¥d¥ e$¥ †0ç1L §(¥0Æ,Æ,Æ0Æ0Æ0ç$Ç(ç$Æ$Ç Æ-*1* §(¥ †$¥ e „¥ †d †¥ †(¥ †(¥ †(¥ †$¥ † †„ † †(¥ §,¥1$Ç,¥ §$¥ ed„†d¥dd¥e¥… ed$¥1-l e,Å0Æ,Æ0Æ0ç0Æ0ç0ç §$ÇÆ,é1L(ç §(¥ e †¥ … e¥ †d$¥ † †$¥ †$¥ † § †d § ¥ † †(¥ †0Æ-* §(¥ †(¥ § †(¥e †d…dd¥ e…¥ e … §5 §(Å0Æ,¥0ç0Æ0ç0ç0Æ$Ç(ç † ç1L1 § † † † ¥ e …¥ e¥ † †(¥ †$¥ † †$Æ † e¥„ † § †(¥,¥) -$Ç,¥ †ddd„ „ed¥dd… e¥d$¥ †%1L,ç0Æ55====5 §(ç †%-* §(¥ †¥$¥e …¥e †$¥ …¥ †(¥ † † § e ¥$¥ e¥ …$¥ †,¥0ç) -,¥$Ç †(¥ §(¥ e „dd¥d¥ed¥…d$¥ §1L-0ç4ç5====5$Ç §$Æ §1L$Ç$Æ §$¥ e …¥e †d$¥¥ † †$¥ †$¥ † †$¥e …d¥ †(¥ †0Æ-*,é(¥ ed „d „dd „dd„dd „¥ †(¥,é1L ç,Æ † §,é5$Ç,Æ$Çdf¥%) -(¥ †$¥ e …¥e …d „…$¥ †$„ †(¥ †$¥ †d$¥ e…$¥ †(¥(¥,é5k §(¥(¥ †(¥ †(¥ † eƒ ¥ddd¥d † ¥(¥ §1L,é ç(¥ †,é,é,é,Æ$Ç(¥d¥ §)K$Æ †(¥d$¥ed … „¥ e …¥$„ †(¥ †(¥ †d … „¥ †$¥ †(¥,¥-*,é(¥(¥dd ç §$Ç!f ç § ç ç ç § § §$Ç)K-*e…„ddf §… §)K) -) -)K1L ç § § ç § §f¥†f § ç § § § § § †$Æ † § † † §$Ç,é$Ç551*,é) -,é,é,é,é$Ç † ††Æ¥ †f § Æ § §-*9!dd„ dd†fÆ!1L) -) -9$Ç § § § §Æf†f Æ § § § § § § † § † † Æf Æ$Ç,é$Ç,é5k5m) -,é) -,é55k95k1LAï51)1L-)) -)K-*)J5m5k1*-*1*) -1*1Œ1L1=Ž=ï55k=Ž5k5955Ž1Œ=¯=ð51Œ51Œ=¯95559Ž1Œ5m=ŽIð9ð9=¯A°9ŽA¯=Ž=Ž=Œ=Ž=Ž=Ž=Œ5m=Ž5m=Œ=ð5J,é-*-))K1)K-*1*1Œ5J1L11L) -)K1L5k59=°=Œ5m59k=Œ5559Ž5Añ5Œ5=Œ-l5=ð5595Ž51L5ŒIðAò55Að=Ž=¯=Ž=Ž=Œ=Ž=Œ5=Œ(¥,Æ(¥,¥,ÆAð)J e$¥$„ … e ¥(¥(¥$¥ † §$Æ$Æ §$Æ §(¥(ç(¥ †$„$¥$¥$¥ ¥(¥,¥(¥5kAò,è(¥ Æ(¥$¥$¥$¥$¥ †(¥(¥(¥,ç=¯5J(ç(ç,Æ(ç$Ç,Æ,Æ †$Æ §,¥,ç,Æ,¥,Æ0Æ5-$„ †$„(¥ e … ¥(¥ †(¥$¥ §$Æ §(¥ †(ç(¥(ç §$¥$„ †$¥(¥ †(¥,¥(¥1Að1L(¥ §(¥ Æ(¥$¥ † ¥(¥$¥(¥,Æ5m5Œ-,ç$Ç,Æ$Ç,Æ,Æ §(¥ §(¥,Æ(¥,Æ §$Æ,¥5m,é$¥$„ †$¥$d$¥(¥ †$„ †(¥(¥ †(¥ §(¥(¥,Æ §(¥$¥ †(¥ e(¥,Å,Æ,Æ5JIð-(¥ §$„ §(¥ †(¥(¥ †(¥,¥55 §,Æ(¥,¥ §(¥,¥ †$Æ §(¥ †,¥,¥,Æ,Æ,Æ1L1 †$d(¥ †$„(¥ e(¥ †$¥(¥$¥$¥(¥ †,Æ §(¥ §,¥(¥ †$¥$¥ e$¥,¥,Æ,Å1Að5k(¥$Æ(¥(¥ †(¥ §$d(¥ §,¥,¥=Ž-*(¥(¥,¥ §(¥,¥ §(¥ †$Æ(¥,¥(¥$Æ(¥ †,¥-*,é e$¥$„$„(¥$¥$„ †$„(¥(¥ †$¥$„(¥ §(¥(¥(¥(¥$¥$¥(¥(¥,Æ,Æ,Å,¥5kA¯$Ç$Æ(¥ †(¥ †(¥ † †(¥ §(¥,é=¯,ç,¥,¥,¥ §(¥,¥,Æ,¥ §(¥ †$Æ$Ç,¥,é0ç1L-*$d(¥$„$„ †$„(¥$„ †$„(¥ †$„ †$„$¥(¥(¥(¥,Æ$¥$¥ ¥(¥(¥,¥,Æ,Å,Å1=¯1*(¥ §(¥ †(¥ †(¥(¥ †(¥(¥,¥5m1L,¥,¥,¥,¥ §,Æ(¥(¥,Æ † §(¥(¥ †(¥(¥ §5) -$„$„$„(¥$„(¥(¥(¥(¥$„ †$„$¥$¥(¥(¥,¥,¥(¥(¥(¥(¥,Æ,¥,Æ,Æ,Æ,Å5A°$Ç(¥ † †$„ †(¥$¥ †(¥$¥(¥0ç=Ž1,¥,¥,¥,¥,¥ §(¥,Æ(¥ † § §(¥$Ç$Ç,é5k) -$d$„(¥$„$d(¥(¥(¥(¥(¥$d(¥ …(¥ †(¥$d,¥,¥(ç(¥(¥(¥,¥,¥0ç,Å,Æ,Å1)Að)K(¥ † †$„ †(¥ †$¥ †(¥ §(¥=Œ5k,¥,¥,¥,Æ(¥(¥,¥,Æ(¥ †(¥(¥$¥(¥ †(¥$Ç5) - e$„$„(¥(¥(¥(¥(¥$„ †(¥$¥$d,¥(¥(¥,Å0ç,¥,Æ,Æ(¥,Æ(¥0ç,Å0ç,Æ5JAð) †(¥ †(¥ † † …$¥$¥ †(¥0ç5m-,¥0ç(¥,¥,¥,¥,Æ(¥(¥ †$Æ §(¥ §,Æ$Ç=Ž1)$d(¥$„$„$d(¥(¥(¥(¥$„(¥ e(¥(¥$„(¥(¥,¥0ç,¥(¥,Æ,¥,Æ,Å,Æ,Æ0ç,Å-=¯1* §(¥ †(¥ † e ¥$¥ †$¥(¥(¥5k1L,¥0Æ,¥,¥,¥ §,¥,¥,Æ †$Æ †$„ †(¥(¥,Æ,é,éc …$d$„ ¥$„$d(¥ …$„$„(¥$¥(¥,¥,¥,¥,¥(¥$¥(¥,¥,Æ(¥,Å,Æ(¥,¥-)=Ž) - ¥(¥ † e$¥ † ¥(¥ †(¥ †(¥5m,é,¥,¥,¥,Æ,¥,¥(¥,Æ,¥(¥ †(¥ †,Æ †(ç1L1 e$„$„ e$„ …$¥$„$d(¥ „$„ †$„(¥,¥(¥,¥,¥,¥$¥(¥,Æ,¥,Æ(¥,Å,Å(¥,ç55$d(¥ † … Æ$„ e$¥$¥ † § d-*1*,¥,¥,Æ,¥,Æ(¥,¥,Å,¥(¥ e$„ §$Ç$Ç,é1L5m-l$Ç § ç § § §%) -$Ç%$Ç) -$Ç1*$Ç,é%$Ç%$Ç%$Ç),é)K-*9k=Œ551*†$Ç$Ç ç%!$Ç) -!!1L5A¯1L51),é4ç11) -51L1*-*,é$Ç-*)K,é1Œ1L,ç-,é † ç § §$Ç) -!,é%,é%) -,é%1!$Ç$Ç%$Ç$Ç) -) -1*1L=Œ55m1Œ § §) §!) -!) -$Ç!-*9m=°1,è$Ç$Ç!,é%) -1) -) -) -) -5Að=¯9Að=Ž=Ž=ï1Œ=¯9=¯5Ž15k91L1Œ1L51L1L1Œ55Œ1=ŽAòAð5=Ž=ïAð=¯IïIðAð=ï=ŽAð=ðAò=¯Ið=ðAò=Ž=ŽIðEðAð=¯=ï=ŒAð=ðAò=ŽAðAðAðJNS=ÐIðAòJAð1Œ=Ž=Ž=Ž5ŒA¯9ŽAð5155k1L1L1L51L1L1Œ5m595AðAð5=ï=ŽAï=ï=¯JIð9ŽAð5IðAðAðAð=¯=ð=¯=ŽAðIðAïAð=Ž=ï=¯A°=ð=¯A°9ð=ðJNSAÐ ¥ e ¥ ¥$¥d Æ$„ e §(ç)K$¥$c$„$„ ¥$„$„ ¥$d$„ „,Å(ç,é ç(¥ ç(¥¥$¥$¥¥ §,Å(ç$Æ$Ç(ç(¥(ç$Æ,Æ$Æ §$¥(¥$Æ$¥$¥ †(ç(¥1L)$¥d¥d¥ † „ …Æ$¥ e¥$¥ † ¥ ¥ e Æ(¥-* ç$d$„$¥$„$¥$„$d$„ „d(¥,ç,ç%$¥ § ç ¥ ¥$¥ †(¥ §,Å$Ç(ç(ç Æ,Æ$Æ,Æ$Æ §(¥ †$Æ(¥¥ §(¥$Æ5) - ç †d „¥ †¥ e e$„c$„d …c„ e$„$Æ5J d …$d$„ d$„$d„c„ e$„$¥5J †$¥d edd¥(¥d †$„$¥(¥(¥(¥(¥(¥(¥ †$„(¥ † …$¥ e¥ †(¥=Œ$Ç e¥d$¥ e¥d¥ d …$d$„d …c„$dƒ$¥-* §$d$„$d„$c$„„d$„ „d$„1,é „ eddd ¥d$¥ e ¥ …$¥(¥(¥(¥(¥(¥(¥ †$¥$¥$„ † … „¥(¥-*1L$dd¥ … ed … „$„$„c …$d„$dƒ d$„$Æ1d$„$„ ƒ$d$„ƒ$d„ ¥$dƒ$„-*$¥ ed „¥d …d ¥$„$¥ †$„ †(¥(¥(¥(¥(¥ † †$„ † … „ e¥,¥5m,éd ¥d e„ …¥ †d$„d$¥$d ƒd$„c$„$d1) § c$„ ƒ$d$„$„ƒ$d„c …$„1%d „d¥d … ¥ e ¥$„$¥$¥$„ †(¥(¥(¥(¥ †$„ † …$¥d¥ †(¥5-l † ed „¥$„d$„$d„$dƒ$dƒ d$„ c$„(ç-* e$„$„$„$„$„$„ „d$„ „$d$„-*¥d „dd„d „¥ †$„(¥ †$„ †$„(¥(¥e … e ¥$„ „d$¥$¥(¥5m$çdd „¥d¥ dd …$d„$d$„d ƒ d$ƒ$d$„-* §$„$d$„$„$„$„ „d$„d$„$„-) çd „dd „d „d ¥$¥$„(¥ †$„(¥$d †(¥d †$„ „$¥d †$„(¥) -1L dƒ „e …c„ e$„ dƒ$d „$c „ c „$„(¥1L$d$„ƒ$„$„$¥$c$„$„ „$d$„$„%dd „d„d „d$¥$„ †$„ †(¥$d(¥$„ †$„ …$d$„ … ¥d$¥(¥(¥5k$Çdddd …dd ¥$d„$dƒ$d „ c „ c$„$„-*$Ç d$„$„ƒ$¥$„$d$„$„$„ „$„(ç †dd „dd „d ¥$„(¥ †$„(¥ e(¥(¥$d(¥ „ e$„ … ¥ e ¥$„(¥11Lcdd„d¥ d$„$d „$c „$c „$d ƒ$d$„$¥1Œ$dƒ$„$d$„$„$„$„ c$„$„ƒ$¥ § „ „„cd ¥$„(¥$„(¥(¥(¥,¥(¥(¥(¥(¥,¥(¥(¥(¥$d(¥$„(¥(¥ †(¥1L § e „c„„¥d e ƒ d$„$c$„ c „ c$„$c$„5J ç$d$„$„ c$„$„$ƒ$d „$„$d ƒ(¥ Æc …d „ƒ ¥$„(¥$d(¥,¥(¥ §,¥$d,¥ †,¥(¥,¥(¥$d$¥$„(¥,¥ †,é-*cd„„ddd$„ † † †$¥ § †eddd §1L% §(¥ †,Æ(ç$Ç$Æ § Æ §$Æ,Æ) -) -(ç § †d$„d † „$„ ed … †e „ e †$„ „(¥$¥ † e § † † §)K §cdddcdd$„ ¥ †(¥ † †$Çe… dc †-*)K$Ç † e(¥,ç(ç §$Æ § Æ$Æ §1) -,é ç †dd … e …$¥ dd … e † „ †$„ †$„d(¥ † e † § † †-*) -f†Æ$Çe„e†1*1+5Ž) (è) -1*-*1k9k5L5k1K5K-*(é) 1l1l5l1l1m1L1L5Ž5l1K5l5l1J1K1l1 -(è5L-*(è% 1*-*1K5l5k5K1K1K1K(é) 5K1m5l1l1l1L1l9¯9m5K1L59Œ1J-+(¥ …5*$…ddd „dd„d„…„d$…5K(Æ(¥$¦,Æ(Ç0Æ5m(¥$¥$…(¥,„,Æ,¦(Æ,¥1 -$Æddd „dd„dd„…d „1*,Ç$¥(¦(Æ0Ç(Ç=(Æ$…$¥(¥,¥,¥,¥$Æ …1K$„dd„ …d„d…d… …d „1K,Ç(Æ$§(Ç(Ç,ç5m$¥…… ¦$¦(¦,è,è,è1 -(Æddd„„dd„d……d„1 -,è,Æ$§(Æ,Ç(Ç9m$¦………$¦(Ç(Ç(§ ¥1K$¦…ddd„dd„…d ¥… …1*(È(Æ(Ç(Ç,Ç$¦5L„¦………$¦$Æ ¦ ¦-+(Ç…ddd„d„d…d …… …- -,è(Ç(Ç(Ç(Ç(¦9l…¦……„ ¦¥- 11*(è(è$È(è1*)(è,è,è)- 1L1J1*- (é$Ç(è(è-*- 5l1*1*5J5L9k9l5l5J1*1 - (è(ç(è1 -) ,è(è-(è-1l1J1*- -- $Ç(è(è- - -1K1K1*1J5K9l5K1*d ……„……$¥1+(¥0Æ,Æ,Æ$Ç$Æ)*(Ç ¥ … ………$¥$† ¦ ¥ …… ¦,¦(Ç(¦$¥$† … …„…… ¥1*(Æ,¥,Æ,Æ(Ç$Ç$è- † ……… … ¥$¥ † ¥ †… †(¥,ç$¦e……d……… …-+(¥0Æ4ç4ç(Ç Æ1 -$Æ †…… …¥ † ¥ … †„… ¦,¦,è$¦$…$¦e„……d¥1 -(¦0æ4Ç4ç,Ç$Æ(é(Ç ¦… ……… ¦ … ¦ †……$¥(¦,é$¥d……„…… ¥ ¦- -¦…$Æ ¦ ¦ Ç-K… †……e… ¦ … ¦ ………$¦,Ç1 -$Ç(§ ¦ …¥…d¥ †) Ç… ¦$Æ §Æ) ¦ †……e… ¥ † ¥ ………$¦$¦1+(¦ ¦1*1)5m- --$Ç(é-)(è(è(é-*5k- -1*-)1*5k9- -1J-*- --)1*=¯1K5K5K1*1*5*5+10è1*$Ç$è(è- (é$è) -*1K1*1 --)1*1*9®-*-*-J-*1*-)AÏ1J5L5K5K1*5+(¥$¦1 (Æ …$„$¥$¥$… ¥$¦$¥(¦$¥$¥(¥,Å15m$¥$…$¥$¥$¥,Ç1+(¥(¦(¥(¦ ¦$¥$¥(¦,Æ(È$…$¤$…$¥$… ¦$¥(¥$¦$… ¥$¥,¥,æ9Ž$¥$¥$†$¥$¥,¥5M(¥(¥(¦$¦ ¦(¥$¥$¦(Ç(Ç$„(¥(¥$„$¥$…(¥$¥,¥(¥,Æ,¥,æ11L$¥$† ¥ …$¥(§5K,¥(¥(¥,¥ ¦$¦$¥$¦,è,è$„$¤(¥$…$„(¥$¥(¥(¥(¥,¥,Æ,Æ,æ9Ž …$¥ … ¦ …(¥5l,¥,¥(¥,¥$¦$¥ †(¦- $Ç … …$¦$¦$¥$¦$¦(Ç(¦$¦(Æ,Æ,ç- 5l … ¦ ¦ ¦ ¦(é1K(¦$¦(Æ,Ç,Ç(Ç$¦$¦$Ç(é… …$…$¦ ¦$¦(Æ(¦$¦$¦(Æ(Ç,ç15m ¥ ¦ ¦ ¦$¦$È1L(Æ(¦(Æ(¦(Ç$¦1K1+1K1J-*5L-*-)- - )1*1J1L1k1K5K9Œ5k5K5l5l5k1L5l5K5K91K1K1l55l1K1L1J1+1K-+1)- -)- - 1K1k1K1K1k9l5Œ5K5L5l5l-K=l5K5K5l5l1K1l5 d „d „d)$d „ „ d„ „,è …„d … … …$¥(¥(¥ …$… ¥ …$…-* …„…„… d „d „(Ç ¥$„ d „d „(Æ ¦ „d… … …$¥$¥(¥$…$¥ …„ …5Ke„ …d „ „d „ „-$„ „$„$„ „ „(Çd„…„ …$„ …$¥$… „ … …„(¥-*d„e„… d „ „ „(Ç ¥$„$„$„„ „$¦ ¥„d… „$¥ …$…(¥ … „ …„$…1*„…dd … „ „d „,è ¥$„$¥$… ¤ …(Æ ¦…d$¤$…$…$¥$…$¥$…$¥$… …$¦1*e¥d…… ¥ …d „(Ç$Ç „$¥$„$¥$„$¦ ¦ …„ „$…$¥$…$…$¥$…$…$¥ …$¥- -……d…1*1*9Ž- (è) --*-*1K5K1J5K1J1K-)(è- 5l5l1l5l1l1L1l9Ž5l5lA®9Œ=5l9l9®=l9- $è- -+- 1J5K5k1K1*1K1*(è- 1K5l5m1l5m1L5l9¯95K5L5l91K-+(¥ …5+$„ddd …dddd„…„d$…5K(¦(¥(¦(Ç,Æ,Ç5m(¥$¥$…(¥(¥,¥,¥(¦,Æ1Kdddd „dd„dd„…d „1*,Ç$¥(Æ(Ç,Æ,Ç=Œ(Ç$…$¥(¥(…(¥,¥$Æ e1K$…d„dd„d„e„…„d ¥1+,ç$¦(Æ(Ç,Ç(È9 ……†¥(¦$¦,Ç,Ç,ç1Ldd„d„d„d…d„ …d …- 0è(Æ$§(Æ,Ç(Ç9l$¦……†$¦(Ç(¦(Ç …1L(¦„ed„dd„„……… … †1*,ç(Ç(§(Ç$Ç(¦9d¦………$Ç,è,è(Ç5m¥…ed„d„d„…e…… ¥- -,è$Ç(Ç$§(Ç(Ç9l…¦………$¥ ¦- -1 (è(é$Ç(è1J(é,è,è,è(è-)1l1)1 --*)$È$è,è- - -1k1J1*1*9K9l9l=l5K1*1 ,è$è(è(ç-J- ,è,è(è)-1L5K-*- ) (Ç$È),é-)1K1+1J1*5K9m5*-*d… …„……$¥1+(¥,¦,Æ0Æ$Ç$¦)*(Ç † ¥ ……… ¥$† ¦$…†¥ †,Æ(Ç$¦$…$¥ ……„… „ †1 -(Æ0¥(Æ0Æ(Ç$Æ$é,è ¥ … …… … …$¦ ¥$†¥… †(¥(è(¥e„e„…………1*(¥0ç8ç4ç(Ç$Æ- -$Æ † ……… ¥ † ¥ † ¥……$…,Ç(Ç$¦$¥ ……„e………- (Æ0Ç4ç4ç,Ç$Æ$é(Ç ¥†… …… ¦ … ¦ ……… ¥(¦,é ¥e…¥……¥… ¦-+¥… § ¦ § Ç-* † ¥…………$¦ … ¦……¥$¦(È1 -(Ç$¦ † „…d…… †-* Æ… ¦$§ ¦Æ) - ¦ †………… † ¥ † ………$¦(Ç1*(Ç$¦1)- -9l-*(è$è(è- (è$è,é-*1k1 1)- 1*5k9-*-*-*- -1)1+=®5K5K5+5*-*1*1*5K- -$Ç$Æ$è(è- (è(è) -)5K1*- -)1)1+=Î- -*-*-*- -1)=¯5K5K5+5J1*1*(¥$¦1$Ç$„$…$¥$¥ …$¥ ¥(¦(¥$¥$¥(¥,Æ15l$¦$¥$…$¥$¦,Æ1K(¥(¦(¥$¦$¦ ¦(¦1(È „d$¥$…$¥$„$¦$¥$¦(¥$¥$¥$¥,¥,ç9®$¥$¥$†$¥$¥(¦5L(¥(¦(¥$¥$¦$¥$¥$†,ç(§$„$¥(¥$…(¥$…(¥(¥,Å(¥(¥,Æ,Æ15L ¥$… … ¥$†,Å5K,¥,¥(¦,¥$¦ ¥(¦1*,è d„$…$¥$…$¥$…(¥(…,Å(¥,¥,Æ,Æ0ç5 …$¥ … ¥ †(¥5L,Å,¥(¥,¥$¦$… †(¦- (è … …$¦$Æ$¦$¦(¦(Æ(§$Æ(¦,ç,ç1)1l † ¦ ¦ Æ §(è1L(¦(Æ(Æ(Ç(Æ$Ç$Æ-+1* ¥… …$¥$¦$¦$¦$Æ,Ç(¦$Æ$¦,ç,ç1 5$… ¦ ¦$¦ ¦$é5L(¦(Æ(¦(Ç(Æ ¦1*1K1K-*-*1l- - - - ) 1)1+1K1K1J1K9l5K5K5k5L1k1K5k5K5K5m1K-K1l5m9l5Œ5l-*1*1l-*- -- - ) - 1J1L5K-+5K5k9l1K5k5l1L1J5l5K1K9l1k-K1l5l d„ d„ d,è „$„ „d „ „(ç ……d… … „$¥$…(¥ ¥$… ……$¥1*………„ „ d„ d„(ç …$„ „ „„ „(¦ Æ…d… ¥$…$¥$…(¥$¥ …$…… ¥1* …d … „ „ d ƒ d „,è „ „$„ „ „ „(Ç„d„„ …$¥ …(„$¦ „ … … „$¥- -d„e„d „ „ d „,ç ¥$„$„$„ „ „$¥ ¦d„„ … …$…$…$¥ … „ …„(¥1*d„e„ … … „d d) $¦$„$¥(¥$„ ¥(Ç ¦ …„ …$¤$…$¥$…$¥$…$¥ …$¥$†) dd„d „ d$„d$„(Ç$Ç$„$¥(¥ „$…$Æ$§ …„ …$„$¥$…$…$¥$…$¥$… ¥$†- -e…d…-*5*9) (è) -1*- 1J1K1K5K-*1J- -(è) 5l5m5l5l5l1L5l5Ž9l1K5L5K1J5m5k5K1*9l,è%- -*- 1*1K1K1J1J-*1)$é-5l5l5l5l5m1L1k9¯=5K5L5l=l-K1K$¦$…5* …ddd …d„dd„… „d …9K(Æ$¥(¦(Ç,Æ,Ç5m$¦$¥(…(¥(¥,¥,¥,Æ,¦,çed„d„„dddd„ …d „1*,Ç$¥(¦(Æ,Ç,Ç9Œ(§$¥$…(¥(…(¦,¥$Æ e1K$…d„d„„dd…d„ …d …1J,ç(¦$Ç(Æ(Ç,Ç5m ¥…† ¥$¦$¦,è,è,è,èd„dd…dd„e„d…d…1 ,è(Ç$¦,Ç(Ç(Ç9l$¦……¦$¦(¦(Ç(Ç …1L$¦…e„dd„d………… ¥$¦-J(È(Ç(Ç(Ç$§,Æ5L…¦………(Ç-,è-1+¥……d„d„e„…… ……$¦) -,è(Ç$Ç(Ç(Ç(¦5l…¦…†„ ¦ Æ--1 (ç(è$Ç(ç1L(è,ç,è,è(è-1L1J- - (è(Ç$è(è- - 1K1K1*1*9K5L5K5K1*1 -(è)$Ç(ç1+(é,ç,è(ç(è- 1k1J- - -$Ç$è(è- - 1K1K1*1*5L9l5*-*………d……$¥1+(¥,Æ,Æ,Æ(Ç Ç- -(Æ ¦ … … …… ¥$¦ † ¥ …†$¥(§(Ç(¦$¥$… ……„…„ …1*(Æ,Æ,¥0ç(Æ$Ç$è(è$¥ † ……… †$¥$† ¥†… ¦(¥,è(¥ed…„…e… …-*(¥4ç4ç8ç(Ç ¦) (¦ ¦……… … † ¥ † ………$¥,¦,è ¦$¦ … …„e………- -(Æ0Æ4ç4ç,Ç$Ç$é$Ç$¥ ……… … ¦ … ¦ ……… ¥$¦,è$¥e…¦…¥¦… ¦-+¦…$¦ ¦ §$è-+ ¦ ¦………† ¦ ¦ †… …¦(§(Ç1*(Ç$Ç$¦……d…… ¦- Ç¥ ¦ §$¦ç) -$¦ ¦………… ¦ ¥ † ¥……$¦(Ç1+(Ç$¦1)1 9m-)(è$È)-$è(è) -*5K- 1)- 1*5K9) -1*-*- - 1*=¯5K5K5*1*1*1*- 5m(Ç(è(è(è),è(é) (è1*1J1 1*- 1)1*9®-*-*1)- --)1 =°1J5K5+1*1*1*(¥$¦0é$Æ$…$¤$¥$…$¥$…$¥(¦(¥$¦ …(¥,Å15L$¦$¥ ¥$¥$¦,Æ1L(¥$¦,¥$¦$¥ ¦(¥1+$… „$…$¥$„$¥ …$¥ ¥(¥(¦$¥ ¥(¥,¥,æ9®$¦$…$¥$¥$¦(¥5m(¥(¥(¦$¥$¦(¦$¥$¥(È(Æ$„(¥$…(¥$…$¥(¥(¥,¥(¥,¥,Æ,Æ15L ¥$… ¥ …$¦(¦5K,¥(¥,¥(¥$¦$¥ §1K$„ d$„$…(¥$¥$„$¥$¥(…,Å(¥(¥,Æ0Æ,æ5Ž$¥ …$¥ † ¥(¥5l,¥,¥,¥,¥$¦$¥ †(Æ1 -$È … ¦$¥$Æ$¦$¦(Ç,Æ(Ç$¦(Æ,ç,è1*1k † ¦ Ç ¦ Æ- 1,(¦(Æ(Æ,Ç(è(È(è5(¦$¦ ¥ †$¦$Æ$¥$¦(Ç,Ç(Æ$¦(Æ,Ç,è1)5m ¦$¦ Æ ¦ Æ(é5L(Æ(¦(Ç(Ç(Ç$Ç1*1J1+-*-*1l- -- -,é)-*1*1K1K-J1K5K5K5k5K5L1K1*5l1K5J5m1K-J1l5l5K9l1K-*- -1K-*- - ,é)- 1+1k1K-J1K5K9k1K5K5K5L1+5K5J1K9m-K1J-K5k d „d „ d,ç „ „ „ d „„,ç …„e … … ¤$…(¥$¥$¥ … …¥$…1+„…… „ d „d„ d(ç …$„ „ „d „(Æ ¦ …„… …$„ ¥$¥(… ¥$¥ … … …1* …„ …d „ c „ d „,è „ „$„$„„ „(Æ…„d„ …$¥$…$„$¥ … „ … „$¥- -d…„„ d „ d „ d,ç ¥$„$„$„ „ „(¦¥„d„ …$¥$…$„$¥$… „ …„(¥-*d…d „ …$¥ … … …- $¦$„$¥ … „ „$Ç ¦… „ …$¤$…$¦$…$¥$¥(¥$¦$¦$¦)*† …… ¦ …$…$¦ … …(è$Ç$… „$¥ „ …$¥ Ç …„$…$¥$…$¥$…$…$¥$¥$¦$¦$¦1*…†… …1*5J9Ž- $è- - ---*1*1*1*-*-)- (è) 9m5l5m5l5m5L1l9Ž9l5L9l5l=995L5l- -(é-) - -- -)1*1J1*-*-*1*(ç(é5l5m5l5l5m5L5l=¯95K5L9Œ9l5l5L$¦$„1+$…d„d …d„dd„… „d …9K(¥$¦(Æ(¦,ç,Ç9$¥$…$¥(…(¥,¥(¥,Æ$¦(Æ$…„dd„„ddd„d …d …1*,Æ$¦(¥(Ç,Ç,Æ9m(Æ$… ¥(¥(…(¥(¦(Æ…5K$…ddd„d„d„e„ …d …1K,Ç(Æ$§,Ç,Ç,Ç5m …„†¦$¥$¦(Ç,È(Ç(Æ$…ddd…dd„…dd …„…1 0è(Ç$¦(Ç(Ç,Ç9m$¦…… ¦ ¦(Ç(Ç$Ç$¦1L(Ç………dd„…„…… ¦…$¦1+(ç$Ç(Ç$§$Ç(§5l…¦†¦ …(Ç(Ç(è1*) - ¦……„d„„e„ †… …¥$¦- -(è(Ç$Ç(Ç(Ç(§9l¥¦†…… ¦ ¦-,è1 $Ç(è$Ç(ç1+-,Ç(ç-(è-1L1*- -(è$ç(è(è- - 1K1*1*1)9l5L5K1*1 1 1)(È$è$ç(ç1+) ,Ç,è,ç(è- 1K1K- ,è- $Ç$è(è(è- 1+1J1*1*5K9m5*- d ……„e…$¥1+(¥,Æ,¦0æ$Ç$¦)*(Æ † … ¥……$¥ † ¦$…¦ … ¦,Æ(Ç(¦$¦$¥e …d…… ¥1 -(Æ,¥,Æ0Æ$Ç$Æ$é,è ¥ …… …… ¥$†$¥ ¦…… †(¥,è$……„e„……… …-*(¥4ç4ç8ç(Ç Æ- -$¦ ¥… …… …†$¥ † ¥ ……$¦,¦(è$¦$¦$……„e…… …) -(Æ4Ç4ç8ç,Ç Æ) -(Ç † ………¥ † ¥ † ¥……$†(¥(é$¥d ¥¦…¦¥ ¦$¦-+¥… § ¦$Ç È)* ¦ ¦ ¦…e¦$¦ ¦ † ¥ †¥(§,Ç1+(Ç(Ç(Ç †………¦$¦-+ Ç… ¦ § Æ$È)* Ç † ¦…… † ¥ ¦ † † ¥†$Ç(¦1K(Ç$§1 1 9l-)(è$È(ç- (è(è) ) -1J-- -)1 5k9Ž-)-*- --)- 1*=®1K5*5+1)1*5*1 5)5l(Ç(ç$Ç(è-(è(é(è1)1+-- - 1)1*9¯1 -))1*) --)1 =¯1K5K5+1*1 1*(¥ ¦1$§$…$¤$¥ …$¥$…$¥$¦(¥$¥$¥$¥,Æ15L$¥$¥$†$¥$¦,Æ1+,¥$¦,¥$¥$¦$¦(¦,Ç1*$…$¤$…$¥ …$¥$…$¥$¥(¦$¥$¥$…,Å,æ9Ž$¥$¥$†$¥$¦,¥5L(¥(¥(¦$¥$¦(¥$¥$¥,Ç$Ç$„(¥(¥(¥ …$„(¥(¥,Å(¦,Å,¦,Æ1(5L$¥ … ¦ …$¥,Æ5K,¥,¥(¥(¦$¥ §$¦(Ç5K$„$„$…(¥(¥$…$¥$…(¥,Æ(¥,¥,Æ,Æ,æ5Ž$¥ … † ¥$…$¦9k,¥,¥(¦,¥$¦$¥ ¦(¦1*$è ¦ †$¥$Ç$¦$Ç,Ç(Æ(Æ$Æ(Ç(ç0è1J5L ¦ ¦ Ç$Ç Æ- -5L0Ç,Æ0Ç,ç,è(Ç(Ç$è1K(¦$¦ ¥$¦$Ç$¦$Æ(Ç,Æ(Æ$Æ(§(ç,è1)5$† ¦$Ç Ç Æ(é5m(¦(Ç(Ç,ç(Ç$Ç-*-*1*-*-*1L- -(è- (è- 1J1K1K-*1*9K1k1K5K5K1K1 -5K1+1J5-*1*1K1K1K1J- -*-*5K)*-,è,é(è- 1+1K-K-*1J5K5K1K5K5K1K1*5K1K1*9l-K-*1K1K$„„ d„ d- d „$„ d„ „(ç ……d … … ¥$…(¥(¥ …$¥ ……$¥1*…„…… d „ d„ d(ç …$„ „ „d„,Æ ¦„e… … …$¥$¥(¥$… ¥ …„$¥1+ …„… „ d „ c „ „,è$„ „$„$„ „ „(Æ…„„„ …$¥ …$…$¥ … „ … „$¥- -d„…„ d „ d ƒ d,ç …$„ „$„ „ „(¦¥„d„ …$¥$…$¥$… „ … ……(¤1+d„… d … „ …dd- ¥$…(¥$¥ … ¥$Ç$Æ…„ …$„ …$…$…$¥$„$¥$…$¥ †) d„d„ …$„ …d „(Ç$è …$¥$¥ …$¥$¦$Ç…„ …$…$„ †$…$¥$…$¥ …$… ¦- -e¥ed,è- §$Ç(è(è(è$Ç- - - 1 1K,è-1,ç- - ¦$Ç(è$è(ç$Ç- - - - 5l,è1 -$¦(èd„d„……(è(Ç(Ç(Ç(é… ¥(Ç(Ç,éd„d„……$Ç,Ç(Ç(Ç- ……$¦$Ç$Ç ¦- (Ç,ç(ç-*(Ç$Ç$Ç(Ç(è(è1 1 (è$Ç$¦(é,ç,ç(ç-*(Ç$Ç$Ç(Ç(è(è1 (è…„…(è$¦,Æ$Ç(è…… † ¥… †,è$¦ †……$Ç$Æ,Ç$Æ$è …… … ¦… …(è$…,ç- -$Æ(Ç$Ç(ç,è(ç1 1*(è(ç1+1,è,è,ç,è$¦(Ç$Ç(ç,è(ç11K(ç(è5*-,è,è$¦(È$„$¥$¦(¥(¦(Æ0ç) ¥$¦- (¦,¦$Æ$¦(è$„$¥$¥(¦(¥(Æ,ç- ¦ ¦- ,¥(Æ$¦(Ç(è)(Ç$Æ(Ç- $è-,è-,è)1*$è)(è(ç(è(ç$Ç$Ç-$è,è--,è-1*(è(è „ d$Æ$„$… „$¦„ …$…$¥ … …,è„e… „$¥$¥$„ „$¦„ …$…$¥ … …(è„e,è- Ç$Ç(ç$È(ç$Ç- - 1 - 5K1 1 1 5)- §$Ç(ç$è(Ç$Ç- 1 - 1 5l,è1 -$¦,èd„d„……(è(Ç(Ç(Ç) … …(ç,Ç(é„d„d……$Ç,ç(Ç(Ç- …†$¦$Ç$Ç ¦- (Ç,ç(ç-*(Ç$Ç$Ç(Ç(è(è1 1 (è$Ç ¦,è,ç,Ç(è-*(Ç$Ç$§(ç(è(è1 (è………(è$¦,Ç$Ç(è …… ¥ †… ¥,è$¦ …„…$È$Æ,Ç$Æ$è †…… ¦ … ¥,è$†,ç- -(Æ(Ç$Æ(È,è(ç1 1*(è(ç5+-,è(è1(Ç ¦(Ç$Ç(ç,è(ç0è1K(è(ç5+,è,è,è$¦(è$…$¥$¥(¦(Æ(Æ0è) ¦$¦1 (¦(Æ$¦,è(Ç „$¦$¥(¦(Æ(Æ0ç- ¦ ¦- ,¦(Æ$¦(Ç(ç) (Ç$Æ(Ç)(è(è,è-(è,è1*$è(è-(è(è(Ç$Æ$Ç-$è(è--,è(è1*$è(è „ „$¦$…$¤ „$¦„ …$…$¥$… …(çd„ d „$¥$¥$… „$¦„ …$…$…$… ¥(çe„(è1 §$Ç$ç$È$ç$Ç- - 1 1 1K,è,è1 1,è ¦$Ç$ç$ç$Ç$Ç- - 1 - 9l,è1 -$¦,è…d„e……(è(Ç(Ç(Ç(é… ¥(È,è$Ç…d„d……(Ç,è(Ç(Ç- … ¦$¦$Æ$§ Æ- ,Æ,ç(è- -$Ç$Æ$Ç(Ç(è(è1 ,è(Ç$Ç Æ(è,ç,Ç(ç-*(Ç$Æ$§(Ç(è(è1 (ç………(è$¦,Ç$Ç(è…… ¦ †… ¦,è$¦ ………$Ç$Æ,Ç$Ç$è …… † ¥† ¥,è ¦,ç- $Æ(Ç$Ç(ç,è(ç11*(è(Ç5K,è,è(è1 $Æ$Ç(Æ$Ç(Ç,è(ç,è1K(ç(È5K,è,è,è$¦(è$…$¥$¦(¦(Æ,Æ1(é ¦$¦1 (¦(Æ(Æ- -$¥$…$¥$¥(¦(Æ(Æ0ç- - ¦ ¦1 (¦,Æ$¦(Ç$Ç- (Ç$Æ$Æ- $ç(è,è-(è(è1*$è(è,è$ç(è(Ç$Æ$Æ- $ç(è,è-,è(è1*$è(è „ …$Ç$…$„ „ ¦„ …$¥$…$¥ ¥(è…… „ …$¦$¥$„ „$¦„ …$…$¥$… ¥,è…„,è- §$Ç$Ç$Ç$ç$Æ- 1 - 1 -5K,è1 1 1 (Ç Æ$Ç$Ç$Ç$Ç$Ç- - 1 1*9L,è1 - $¦,é„e„„……(è(Ç(Ç(Ç) … ¦(Ç,è$Çd…d„……(Ç(è(Ç(Ç- … ¦$¦$Æ$§ ¦- ,Æ,ç(ç-*$Ç$Æ$Ç(Ç(è(è1 ,è(Ç$Ç ¦(è,ç,Ç(ç-*(Ç$Æ$§(Ç(è(è1 (Ç………(è$¦,Ç$Ç(è ¥… † ¦ … ¦,è$¦$¦……(È$Æ,Ç$Ç$è †… ¥ †¥ ¦,è$¦(ç1 $¦$Ç$Ç(Ç(ç(ç1 1*(ç(È5J,è,è,è0è- $¦(Æ$Ç(Ç,ç(Ç11K(ç(È5*,è,è,ç$¦(è$…$¥$¦(Æ(Æ(Æ1,é ¦$¦1*,Æ,Æ$Ç(Ç,è$¥$¥$¦(¦(Æ(Æ0ç- - ¦$¦-*,¦(Æ(¦(Ç$Ç-$Æ$Æ$Ç-$Ç(è,è-(è(è1)$È(è(ç$Ç,è(Ç$Æ$¦-$È(è,è-(è(è1 $è(è „ d$Æ$…$¤ …$¦„ …$…$…$„ ¥(È„d … „$¥$¦$„ …$Æ„ …$…$…$… …(ç…d(è… ¦ ¦,è,è(è(ç,è… ¦ ¦(è,è)(Ç ¦$Ç(Æ(è ¦$¦$Ç,è ¦$Ç(Ç(è ¦$¦$Ç(Ç(ç$¦(Æ(Ç1 $Æ- ,Ç(ç$¦(¦(Ç1 $Æ- ,Ç$¦$Æ$¦$Ç(Æ(Ç(è ¦$Æ$Ç$¥$Ç$Æ(Ç(è ¦(è… ¦ ¦,è,è) ,ç- … ¦ ¦,è,è) (Ç ¦$Ç(Æ(è ¦$¦$Ç,è ¦$Ç(Ç(è ¦$¦$Ç(Ç(ç$¦(Æ(Ç1 $Ç-(Ç,è$¥(Æ(Ç1 $Ç,è,Ç$¦$Æ$¦$Æ$Ç(Æ(è ¦$¦$Æ$¦$Æ$Ç(Æ(è ¦(è… ¦ ¦-,è(é(ç,è¥ ¦ ¦,è,è) (Ç ¦$Ç(Æ(è ¦$¦$Ç,è ¦$Ç(Ç(è ¦$¦$Ç(Ç(ç$¦(Æ(Ç1 $Ç0è(ç(è$¦(Æ(Ç1 $Æ0é(ç$¦$Ç$¥$Ç$Æ(Ç(è ¦$Æ(Ç$¥$Ç$Æ(Ç(è ¦(è ¥ ¦ ¦,è,è(é(ç,è… ¦ ¦,è,è) (Ç ¦$Ç(Æ(è ¦$§$Ç,è ¦$Ç(Ç(è ¦$¦$Ç(Ç(ç$¦(Æ(Ç1 $Ç1(Ç,è$¦(Æ(Ç1 $Ç1(Ç$¦$Æ$¦$Æ$Ç(Æ(è ¦$¦$Æ$¥$Ç$Æ(Ç(Ç ¦$¦$Ç$Ç(è$Ç$Ç$Ç(ç$Ç(Æ(Ç(è$Æ(Æ(Ç(è$Æ$Ç(Ç(è$Ç$Æ$Ç(è$Ç(Æ(Ç(ç$Ç(Æ(Ç(ç$¦$Ç(Ç(è$Æ$Ç(Ç(è$Ç(Æ(Ç(ç$Ç(Æ(Ç(ç$Æ$Ç(Ç(è$¦$Ç(Ç(è$Æ(Ç(Ç(ç(Ç$Æ(Ç(ç$Æ(È$Æ(È$Ç(Ç$Ç(Ç$Æ(Ç$Ç(Ç$Æ(È$Æ(Ç(Ç(Ç(Ç$Ç(Ç \ No newline at end of file diff --git a/glide2x/h3/glide/tests/argb4444.3df b/glide2x/h3/glide/tests/argb4444.3df deleted file mode 100644 index 1f3da27..0000000 --- a/glide2x/h3/glide/tests/argb4444.3df +++ /dev/null @@ -1,5 +0,0 @@ -3df v1.1 -argb4444 -lod range: 1 256 -aspect ratio: 1 1 -UEggWVWVggggVFUU5EUEVVVWwhwhfgggww‰ ˆx xxxx xxxxxx xxxxxxxx xxxffEEVVEUVFfVVFVVEUWVUUFVUEUUEUE5DEEUVFfgVWggggggggVFggggVFUU5EUEEEEUggggEEEDFUVFggVVVV5DVEUUFVggx xggfgxxww‰ ˆxxxxxxxxwwx xxxxxx xxxggVFUUEEVVEEVVVVVVEUWVVVEUUEUU5ED5UUEUWVVVggggggggggVFggggggwwEEUUEUE5UEggWVWVggggVFUU5EUEVVVWwhwhfgggww‰ ˆx xxxx xxxxxx xxxxxxxx xxxffEEVVEUVFfVVFVVEUWVUUFVUEUUEUE5DEEUVFfgVWggggggggVFggggVFUU5EUEEEEUggggEEEDFUVFggVVVV5DVEUUFVggx xggfgxxww‰ ˆxxxxxxxxwwx xxxxxx xxxggVFUUEEVVEEVVVVVVEUWVVVEUUEUU5ED5UUEUWVVVggggggggggVFggggggwwEEUUEUE54DC4DC4DUUgg33#3"#3#33#3"#3333""3333333343333333##2#"233#3#"3#333333UUggfgUUgfffVWffggggggfgUUWVgfggUUTT4DC4UTVUTTUUUUUUUUUUUUUUDD"3""3333ggDD33##33#33333""3#33""3333333333333333##""3333"3""3#3333D3xgffVWffUUgfgfffggggfgffVWgg ™ ‰ggTDDDDDDDUUUUUUTTUUUUUUUUVVDC4DC4DCVUgg33#3"#3#33#3"#3333""3333333343333333##2#"233#3#"3#333333UUggfgUUgfffVWffggggggfgUUWVgfggUUTT4DC4UTVUTTUUUUUUUUUUUUUUDD"3""3333ggDD33##33#33333""3#33""3333333333333333##""3333"3""3#3333D3xgffVWffUUgfgfffggggfgffVWgg ™ ‰ggTDDDDDDDUUUUUUTTUUUUUUUUVV""#""""44gf"""""""!!"""""""""""""""""""""""""DDgg33"3""3""3##2#3333343333VVff""3""2""""2"#2""2"#2"#2"#2"#2"333333VWCD"""""""""""""""""""""""2""!""#2"ggD42"##""3""3""4333333433DDyxDD"""2#"2""""2""3""2"#2"#2""2"""""44gf"""""""!!"""""""""""""""""""""""""DDgg33"3""3""3##2#3333343333VVff""3""2""""2"#2""2"#2"#2"#2"#2"333333VWCD"""""""""""""""""""""""2""!""#2"ggD42"##""3""3""4333333433DDyxDD"""2#"2""""2""3""2"#2"#2"33""##"33gV"#""!""""""2""!"""""""""""""""""3C4gg34""##"24333343334333433ggVF23""##"2##""3""3"""333333343334""3333VFED""!"""""""""""""""""""""""""""33ggD33##2##2#34333433343344DDxg34""3##2##""3""3""3""333""3333""##"33gV"#""!""""""2""!"""""""""""""""""3C4gg34""##"24333343334333433ggVF23""##"2##""3""3"""333333343334""3333VFED""!"""""""""""""""""""""""""""33ggD33##2##2#34333433343344DDxg34""3##2##""3""3""3""333""3333##"""44ff"""""""""""""""""""""""""""#""""""""DDgg3334""43##33343334333433gggg""3"##""##33##34""3##2##33443344334443WVDD""""""""""""""""""""""""""#2#"!""2#"ggEE3333""43##433334333433UDxg44"3##"#"###3##34""442##33333##"""44ff"""""""""""""""""""""""""""#""""""""DDgg3334""43##33343334333433gggg""3"##""##33##34""3##2##33443344334443WVDD""""""""""""""""""""""""""#2#"!""2#"ggEE3333""43##433334333433UDxg44"3##"#"###3##34""442##3333334##"D4gg""""""""""""""""""""""""""2""#"!""244UU443343"#34##333444343344UUVV""#""""""#####""433343443344334433WVEE"""!""""""""""""""""""""""#"!""""3"WVDD4433#33334""4344"33444DDxg##2#"""""#""###33343"#443343##"D4gg""""""""""""""""""""""""""2""#"!""244UU443343"#34##333444343344UUVV""#""""""#####""433343443344334433WVEE"""!""""""""""""""""""""""#"!""""3"WVDD4433#33334""4344"33444DDxg##2#"""""#""###33343"#4433#3#""D3gg"#"""""!"""""""""!"""""!""#""!"""33ffD344333#4343443343334333EEEE""33"#"#"""####333334""3##333ggD3""""""""!""""""!"!""""""!#""!"""""""VVDDDD#3334343434433434433D3gg"#"##""""#"""33""3333#3#""D3gg"#"""""!"""""""""!"""""!""#""!"""33ffD344333#4343443343334333EEEE""33"#"#"""####333334""3##333ggD3""""""""!""""""!"!""""""!#""!"""""""VVDDDD#3334343434433434433D3gg"#"##""""#"""33""3333##33##44gg44#3"#"""""""!"!""""""""""#"###"2"##3#33EEVV#4##333433#333##34""###3ffgg"""43##""""###"3"3334##33##""##"243ggVF3#"3""""""""""""""""#2"""##"#3##3##44fV44#3##33433334""43##3#"3D3yx33"33#3"""#"3""2"#2##""##33##33##44gg44#3"#"""""""!"!""""""""""#"###"2"##3#33EEVV#4##333433#333##34""###3ffgg"""43##""""###"3"3334##33##""##"243ggVF3#"3""""""""""""""""#2"""##"#3##3##44fV44#3##33433334""43##3#"3D3yx33"33#3"""#"3""2"#2##""##ggUUgfUUgfggfgEEVVFVEEEDEEUUEEffEEUUEEUUEEEEUTFVEEffVFffggggggfgfgfgfffgVFVV3D44EEEDFU44UUFVUEVVgxxxggVFfgUUffgggggxgxffxxx xxxxxgxffggggfgggffFVVFVVEEDDUUEEEEVVVVEEEEEEUUEEUUEUEEVVVVUUggxxfffgfgfgVFggfgVFDDDD4EEEEEED5EVVEEVVggxxggffVFggUUgggggxgxffgxx xgxgxggUUgfUUgfggfgEEVVFVEEEDEEUUEEffEEUUEEUUEEEEUTFVEEffVFffggggggfgfgfgfffgVFVV3D44EEEDFU44UUFVUEVVgxxxggVFfgUUffgggggxgxffxxx xxxxxgxffggggfgggffFVVFVVEEDDUUEEEEVVVVEEEEEEUUEEUUEUEEVVVVUUggxxfffgfgfgVFggfgVFDDDD4EEEEEED5EVVEEVVggxxggffVFggUUgggggxgxffgxx xgxgx""3""3""3""3"""""3""3"#"2#DCEE3333""3""333""3""3""3"3333VV4C33#233##2#"2##33##333334333344DD333344DD3DD34433DD3DEEUT4DC433DD3D33333333""3""3"""""##""#2#33VF33332#"2#"33""33""3""3""33VUDD33333333##2#"2##3"#3##333344334433DD3344DDDD33DD3DD3DDFVC4DC##""33"2#"2#"2#"2#"""""3""3"#"2#DCEE3333""3""333""3""3""3"3333VV4C33#233##2#"2##33##333334333344DD333344DD3DD34433DD3DEEUT4DC433DD3D33333333""3""3"""""##""#2#33VF33332#"2#"33""33""3""3""33VUDD33333333##2#"2##3"#3##333344334433DD3344DDDD33DD3DD3DDFVC4DC##""33"""##"#""2"#""""###CDgg#3""33""33333333##3333""43gfD43#"3##""#2###"3""##""##"2##""###3"#""""####3#"344DD""##"2##""##"2"#""#""2"#"""##"233gg4C#"33""333"4333333333##3#VVEE33####"2"#2###"""####"3""3""##33##""#""###3"#33C434"""""""###"#""2"#""""###CDgg#3""33""33333333##3333""43gfD43#"3##""#2###"3""##""##"2##""###3"#""""####3#"344DD""##"2##""##"2"#""#""2"#"""##"233gg4C#"33""333"4333333333##3#VVEE33####"2"#2###"""####"3""3""##33##""#""###3"#33C434""""""""""""#""""2"""3##"33D3VV"#"3333333333333433#34333VV3333##""##"#2#"3""2"##""##"2####2###""#2"##""##"23344#3"#34##""##"2"#"""""2"""3##"#"34VW23""3333333333333334343433DDUU#3##""#2###"3"""2""#2"##""###3"#"####""####""##3344"334""##""""""""#""""2"""3##"33D3VV"#"3333333333333433#34333VV3333##""##"#2#"3""2"##""##"2####2###""#2"##""##"23344#3"#34##""##"2"#"""""2"""3##"#"34VW23""3333333333333334343433DDUU#3##""#2###"3"""2""#2"##""###3"#"####""####""##3344"334""##""#"""""""2"#""""#2#EDFV"33333333333333343334##DDEE44"3####""#2#"3""2"######""##""###3#""""3####""3#33D343"#3#"3####"""#""2"#"""#"""2##""gV##""33333333333333#33333##UEDD#3####""##"""#2#"3"####2#####""####""#"#33##""##"2EE34""##"""#""2"#"""#"#""""#2#EDFV"33333333333333343334##DDEE44"3####""#2#"3""2"######""##""###3#""""3####""3#33D343"#3#"3####"""#""2"#"""#"""2##""gV##""33333333333333#33333##UEDD#3####""##"""#2#"3"####2#####""####""#"#33##""##"2EE34""##""""""#"""""#"""3""##44VV33333333DD3DD3DD3D##333344VV33"3##""##"#2#"3"##""##"2##""####""#2#""##"2##""44EE""3##2##""3##2#""""""""3""""3"43VF442333DD33DD3D333333#3##43VF442###""#2#"#"#""##"##"2####""###3##"""""3##""3"33EE44"3""""""""#"""""#"""3""##44VV33333333DD3DD3DD3D##333344VV33"3##""##"#2#"3"##""##"2##""####""#2#""##"2##""44EE""3##2##""3##2#""""""""3""""3"43VF442333DD33DD3D333333#3##43VF442###""#2#"#"#""##"##"2####""###3##"""""3##""3"33EE44"3""""""""""""""""""""2"#244VV3333#344DD3D443333"2"##UUDD"###"2##"""#""#"#""##"3"##""##"2##"""#"##"2##3"33VF2"#2####"2####""""""""""""3####""fV4433433344DD3DD3443#"33""VU33##2#"3"##"""##"""3""2"##""##"2##""""###"3"##""3"EE44"3""""""""""""""""""""2"#244VV3333#344DD3D443333"2"##UUDD"###"2##"""#""#"#""##"3"##""##"2##"""#"##"2##3"33VF2"#2####"2####""""""""""""3####""fV4433433344DD3DD3443#"33""VU33##2#"3"##"""##"""3""2"##""##"2##""""###"3"##""3"EE44"3""""####33##""3""3""33###33####EEUE"""!"##""DD5D33VVEU######33"""""##3#"3########"#""""2####333444WVEE443444343434####332#"33""""######34VV33""""##"3#DD3DD3gV#####33#"#""#"#3#####""####"""#""33##34##34VFVV#4443434####33##""3""3""33###33####EEUE"""!"##""DD5D33VVEU######33"""""##3#"3########"#""""2####333444WVEE443444343434####332#"33""""######34VV33""""##"3#DD3DD3gV#####33#"#""#"#3#####""####"""#""33##34##34VFVV#4443434ggffggUUVVxxffEEffUDEEEEFVVFfffgEEEDFUD3EEVVffVWwhxxggggggggffggggffgggxggffVWffVFx xggggfgfgfgVFeUggxxggggggxxgggggggggggggggggxgxggffFVTEUTFVUD43E5UUEEEEVVVVfgVFDEEUD4DEVVVVggggxxgxggggggffggffggfgggxxVVffggVFwwxxffggVWfgVWVVfgxxxxVVgggxgggggggggxgggggggxggffggUUVVxxffEEffUDEEEEFVVFfffgEEEDFUD3EEVVffVWwhxxggggggggffggggffgggxggffVWffVFx xggggfgfgfgVFeUggxxggggggxxgggggggggggggggggxgxggffFVTEUTFVUD43E5UUEEEEVVVVfgVFDEEUD4DEVVVVggggxxgxggggggffggffggfgggxxVVffggVFwwxxffggVWfgVWVVfgxxxxVVgggxgggggggggxgggggggx3333333333xgVV"#""""3""3##2###33333433##3433333333"3""3"3333""33333"UU xxCD#4343333"333"3##332#33DDxyUUDD3D33DD3D3333333334333334""3""3""3"UU#3"###"3""2"33""3#3333##343333333333#3"#2"#2##2#333333D3 xxff333333333333333333333333ffgx3DD344DD3D33DD"3343333333333333333xgVV"#""""3""3##2###33333433##3433333333"3""3"3333""33333"UU xxCD#4343333"333"3##332#33DDxyUUDD3D33DD3D3333333334333334""3""3""3"UU#3"###"3""2"33""3#3333##343333333333#3"#2"#2##2#333333D3 xxff333333333333333333333333ffgx3DD344DD3D33DD"334333333""3"33##2#fgC42"##""""##""""3""3##""3"##33""3##233##2###"""""2#"2#33""fU xxD52"#2#""3"#3"#2"#2"#2"44gg33"3""3"#3"#2"#3#"###3"#2"#2"#2"#233"344#3"""#""""2#"##"2""#2"##""33""3##2##2#"2##""3""3""3233D3xxVW"2"#2"#2##""##"2#"##33""gVEE"2##3""3##""##"2##33""3#"3""33##2#fgC42"##""""##""""3""3##""3"##33""3##233##2###"""""2#"2#33""fU xxD52"#2#""3"#3"#2"#2"#2"44gg33"3""3"#3"#2"#3#"###3"#2"#2"#2"#233"344#3"""#""""2#"##"2""#2"##""33""3##2##2#"2##""3""3""3233D3xxVW"2"#2"#2##""##"2#"##33""gVEE"2##3""3##""##"2##33""3#"333##""3"VV#4""""##""""##""##"""""2##""3"##""3""3##2#""""3""3333322#"UUxx44"2#"2#"2##""3"####""3"33xg34""3"43"#2"#3#"33""##33##2###33344433EE#3""""""2##""""##"2#"2###""##""3""3""##""""3""3""3333""33ˆxEE""3##2##""##"2#"##"2#"2#ggVF2"#2"#2"#3#"33##2##3"#2""333##""3"VV#4""""##""""##""##"""""2##""3"##""3""3##2#""""3""3333322#"UUxx44"2#"2#"2##""3"####""3"33xg34""3"43"#2"#3#"33""##33##2###33344433EE#3""""""2##""""##"2#"2###""##""3""3""##""""3""3""3333""33ˆxEE""3##2##""##"2#"##"2#"2#ggVF2"#2"#2"#3#"33##2##3"#2""3##""3##2D4DE"""""""3"""""3""3"""##""""3""3""3""3""3"33""3333333323UUyx33""####""##"2##""##""3#33xgDD""3""3""3""3""3"##33##2#"2##3#334444DD"3"""""""""""2#"2#""""""2##""3""3""3""3""3""33333""3332D4xxVV"#"##""##""####""##33##eUWV"3""3""333##2#"2#"3#"3"""3##""3##2D4DE"""""""3"""""3""3"""##""""3""3""3""3""3"33""3333333323UUyx33""####""##"2##""##""3#33xgDD""3""3""3""3""3"##33##2#"2##3#334444DD"3"""""""""""2#"2#""""""2##""3""3""3""3""3""33333""3332D4xxVV"#"##""##""####""##33##eUWV"3""3""333##2#"2#"3#"3"""3""##"2##EEDC""#!"""2#"2#""2"#2""""3""3"2233#233""33""3"33223333UDxgDD"#""##"2""#2"##""3"#333gg3333""3""3""3##233""##33##2###33##3333VV""3"""""2#"2#"2"""""3""3""""3""3""3""333""33""33333322D4xxEE"2##""3"####""3"##""3""3UUVV""32"#2"#2"#2"33""3##2##"3""##"2##EEDC""#!"""2#"2#""2"#2""""3""3"2233#233""33""3"33223333UDxgDD"#""##"2""#2"##""3"#333gg3333""3""3""3##233""##33##2###33##3333VV""3"""""2#"2#"2"""""3""3""""3""3""3""333""33""33333322D4xxEE"2##""3"####""3"##""3""3UUVV""32"#2"#2"#2"33""3##2##"2"#2"#334444""""##"2"#2"#2""""##""3""3332233""3"3333332233332322D4xx44"2##""####""##""###3""##gf332333""33""3"33"3""3"#3"#2"#2##2#"2##EE#3!"""""3""2"#2##""""""2#"2#33""33""333333""323323""33ggfg"#"2#"3##2""##""3##2#EEVV""3233""33""33""33""#2##""3""3334444""""##"2"#2"#2""""##""3""3332233""3"3333332233332322D4xx44"2##""####""##""###3""##gf332333""33""3"33"3""3"#3"#2"#2##2#"2##EE#3!"""""3""2"#2##""""""2#"2#33""33""333333""323323""33ggfg"#"2#"3##2""##""3##2#EEVV""3233""33""33""33""#2#####34##44gVUU##""#2#######34##3#4343##434344#3##33##3##3##33DD44DDFVVFfgEE"###3##33#3##3##343EEVVggD534####3#44#34344444444DD##3#43##43E5fV33#""#######3##3##4343##DD334343##3##3##3##3334433EEDUUUVVff####3#33##3##333#3##DDFVggVF3334##343334343444343434####34##44gVUU##""#2#######34##3#4343##434344#3##33##3##3##33DD44DDFVVFfgEE"###3##33#3##3##343EEVVggD534####3#44#34344444444DD##3#43##43E5fV33#""#######3##3##4343##DD334343##3##3##3##3334433EEDUUUVVff####3#33##3##333#3##DDFVggVF3334##343334343444343434ggxxgxxxxxgxggwwgggggxfgggggfgfgfgFVffggffVFfgggggffxxxxggwwgxxxx xxxˆ ˆ ‰ ™wwhwggxxxxxxgxxyxxxxxxgxˆˆ ‰ ™ wwxxgxggxxxxxxxxgxxxˆˆ‰ ™‰ ™‰ ™ ‰ ™ xxxxxxxxxywwgxgggggxfgggggggffggUUffggVWVVggfgggffgxxxwwgggxwwxxwwx x ™ ‰wwxxggxxgxxxgxxxxxxyxxggx x ™ ‰ xxwwyxggggxxxyxxxxxxxx™ ‰™ ‰™ ‰ggxxgxxxxxgxggwwgggggxfgggggfgfgfgFVffggffVFfgggggffxxxxggwwgxxxx xxxˆ ˆ ‰ ™wwhwggxxxxxxgxxyxxxxxxgxˆˆ ‰ ™ wwxxgxggxxxxxxxxgxxxˆˆ‰ ™‰ ™‰ ™ ‰ ™ xxxxxxxxxywwgxgggggxfgggggggffggUUffggVWVVggfgggffgxxxwwgggxwwxxwwx x ™ ‰wwxxggxxgxxxgxxxxxxyxxggx x ™ ‰ xxwwyxggggxxxyxxxxxxxx™ ‰™ ‰™ ‰3333""3#3333""333"33DDEE33"3""3""3""3""3"""""23333DD#433DD33#3333433333333DD33DD33DD33DD33334333333333##33DDEEDD33"33333##333#3333333333##332##3333333EEDC#"2#22#"2#"2#"2#"2#"2#CD44DD33334433#333333343D4DD3333443333DD333333#33333#3333333DDEEDD"3##3333##333#3333""3#3333""333"33DDEE33"3""3""3""3""3"""""23333DD#433DD33#3333433333333DD33DD33DD33DD33334333333333##33DDEEDD33"33333##333#3333333333##332##3333333EEDC#"2#22#"2#"2#"2#"2#"2#CD44DD33334433#333333343D4DD3333443333DD333333#33333#3333333DDEEDD"3##3333##333#""#""!"""!#33UE""""!!""""!"#""""VV##"""""!""#""""#"#"23""3""3""3"##""##""##"3""2"#2WV34""""#""""""""""""!"""""3"EE33"""""!"""""!#""DC5E""""""#"#""""#"""3""3""3"""""##""""##"3"""2"TTFV""""""3"""""""""!"""!#33UE""""!!""""!"#""""VV##"""""!""#""""#"#"23""3""3""3"##""##""##"3""2"#2WV34""""#""""""""""""!"""""3"EE33"""""!"""""!#""DC5E""""""#"#""""#"""3""3""3"""""##""""##"3"""2"TTFV""""""3""""""!"""""!""!"33EE"!""!"!"""!""!"""""EE33""""""""#2#""""2#"##"2"#2"#2"##""#2#"2""#"3"gfD4""""3"""#2#"""3""""""""""TD##""""!"""!"!""""!DD33"""!""""""3""2"#2"#2"##""3""3""##"2##"""""3"33DDVV##"""""""#""!"""!!""!"33EE"!""!"!"""!""!"""""EE33""""""""#2#""""2#"##"2"#2"#2"##""#2#"2""#"3"gfD4""""3"""#2#"""3""""""""""TD##""""!"""!"!""""!DD33"""!""""""3""2"#2"#2"##""3""3""##"2##"""""3"33DDVV##"""""""#""!""""!"!""23UE"""!""""""!"""""""""UT""""""""""2""#2"""##""""3""3##"""""#"""""3""3#VU44""""""#""""""!#""!"!""""EE33""!""""!"""!""""DD3D"""""""""""""#"""2##"#""2"#2##""""""""""3##"DDVV"""""3"""""""!""""!"!""23UE"""!""""""!"""""""""UT""""""""""2""#2"""##""""3""3##"""""#"""""3""3#VU44""""""#""""""!#""!"!""""EE33""!""""!"""!""""DD3D"""""""""""""#"""2##"#""2"#2##""""""""""3##"DDVV"""""3""""""!"!"!"""!!""33VF""""""""""""""!""""""44"""""""""!""""#"""##""""""2""#""""#2#"2"""""gV33"""#"""2""#""""!!"!"""""UT43""""""""""""""""!2""433#"""""""#2"""##""""##"2"""""#"#"""""#"#""""3"DDFV"""##"""""""""!!"""""33VF""""""""""""""!""""""44"""""""""!""""#"""##""""""2""#""""#2#"2"""""gV33"""#"""2""#""""!!"!"""""UT43""""""""""""""""!2""433#"""""""#2"""##""""##"2"""""#"#"""""#"#""""3"DDFV"""##"""""!"!!"!!"!!"23UD""""!""""""""""""!2"#2"#!"""!""""2""""3""3""3""3""3""3""3""3""""""##""##"UU33""""""""""""""!""""""""DDDD"""""""""""""""""33""""""#2"""""""2#"2#"2#"2#"2#"2#"2"#2""""#2#"2#"44EE!""""""""!""""""""""""23UD""""!""""""""""""!2"#2"#!"""!""""2""""3""3""3""3""3""3""3""3""""""##""##"UU33""""""""""""""!""""""""DDDD"""""""""""""""""33""""""#2"""""""2#"2#"2#"2#"2#"2#"2"#2""""#2#"2#"44EE!""""""""!####""##""##""""##VV4C#"##""""3333##""3""3""3#DD#434##""#2#""##""""##"2"#"2"#"2"####"3"##""43ggEE###""33""#"##333##3##2#"""""2EEEE##2#""""33""##"2#"2#"2#"44DD##33##""#"""##""""""##"""""###"2""3#"2"######EEUU##""33""######""##""##""""##VV4C#"##""""3333##""3""3""3#DD#434##""#2#""##""""##"2"#"2"#"2"####"3"##""43ggEE###""33""#"##333##3##2#"""""2EEEE##2#""""33""##"2#"2#"2#"44DD##33##""#"""##""""""##"""""###"2""3#"2"######EEUU##""33""##VVggggFVggggVFfVEEUUFVggxxggggfggxw wx xxxxxggwwx xxxxxxxxxffggUDVVFVVFVVffVVVWVVVVFVVFVVEUUEEEEUVFgggggggxggxx ™ ‰ ™ ‰hwwwxxxxggffgggxxxxyx xwwyxffVFVVEUEEVVVWggxxggfggg ww xxxxxxxxwwxxxxggxxx xxxfgVFEEVVFVVFfVVFfWVWVWVVVVFVUEUU5EVFVVggVWgggxggggggggggggggxxEEVVEUUEVFggggVFggggVFfVEEUUFVggxxggggfggxw wx xxxxxggwwx xxxxxxxxxffggUDVVFVVFVVffVVVWVVVVFVVFVVEUUEEEEUVFgggggggxggxx ™ ‰ ™ ‰hwwwxxxxggffgggxxxxyx xwwyxffVFVVEUEEVVVWggxxggfggg ww xxxxxxxxwwxxxxggxxx xxxfgVFEEVVFVVFfVVFfWVWVWVVVVFVUEUU5EVFVVggVWgggxggggggggggggggxxEEVVEUUE4C33D3DDDUgx"3""##"233#2#33""3"33##3333"3333333""#""3333""3"##33"3UDxgUUUUWVUUgfUUggffVWffVWfffgfgTEDDEEDC4DDDDDUUDTUETUUUTTDDUUUUDDDDffFV""3""3####3333""#2#"233333333333333""##""##33""3"33""33D3ggfgTEffUUgfUUggVWggffVWUUgg ˆˆggDDDDDD3DTDTTEUUUTTEUUUDDVVCD#3DC4DTEwh23""##"233#2#33""3"33##3333"3333333""#""3333""3"##33"3UDxgUUUUWVUUgfUUggffVWffVWfffgfgTEDDEEDC4DDDDDUUDTUETUUUTTDDUUUUDDDDffFV""3""3####3333""#2#"233333333333333""##""##33""3"33""33D3ggfgTEffUUgfUUggVWggffVWUUgg ˆˆggDDDDDD3DTDTTEUUUTTEUUUDDVV"###""C3gg""""""""""2""""""""""""""""""""#2#DCgg33"3""3""3""43"#33334333VWVV""3"""""""""""2#"2#"2#"233""3""3""VVUD"""""""""3""!"""""""""""""""""""3""ggDD"3""3""3""3"343333"334DDx xDE""#2#"2""2"#"2"#2"#2"#2"3##""33gg""""""""""2""""""""""""""""""""#2#DCgg33"3""3""3""43"#33334333VWVV""3"""""""""""2#"2#"2#"233""3""3""VVUD"""""""""3""!"""""""""""""""""""3""ggDD"3""3""3""3"343333"334DDx xDE""#2#"2""2"#"2"#2"#2"#233""3""DCWV"3""""""""""""""""""""""""#"""""""D3gg34""##"24343433343333433ggVF33##2###""3"#3"#2"#2"#3333""3#3344"3VFVV""""""!!""#""!"!""""""""""""""""33ggD33"#3"#3434333433344433UDxg33"3""3"##""3""3""3""334""3"33""3""DCWV"3""""""""""""""""""""""""#"""""""D3gg34""##"24343433343333433ggVF33##2###""3"#3"#2"#2"#3333""3#3344"3VFVV""""""!!""#""!"!""""""""""""""""33ggD33"#3"#3434333433344433UDxg33"3""3"##""3""3""3""334""3"33##""D4gg"""""""!!"#""""""""""""""""""""""""""DDgg3333"3##3#3334333444"344ffgg""3"##""###3"#33""3##2##333344"34433EEVV"""""""""""""""""""""""""##""""""""hgEE3334""43##2#3433343433UDxg44"3##"33""##34""433334""4333##""D4gg"""""""!!"#""""""""""""""""""""""""""DDgg3333"3##3#3334333444"344ffgg""3"##""###3"#33""3##2##333344"34433EEVV"""""""""""""""""""""""""##""""""""hgEE3334""43##2#3433343433UDxg44"3##"33""##34""433334""433334##"D4gg"""""""""!"""""""""""""""""""#"""3""44VV4C434343"#3434""43334344ffVF2"#""""#""###33##33444433443333VVUU"""""""""""""""""""""""""""#"!""""3#VUDC4443"#34##343334333433DDxg##2##""""#"#####443##3333343##"D4gg"""""""""!"""""""""""""""""""#"""3""44VV4C434343"#3434""43334344ffVF2"#""""#""###33##33444433443333VVUU"""""""""""""""""""""""""""#"!""""3#VUDC4443"#34##343334333433DDxg##2##""""#"#####443##33333#3#""D3gg"#"""""""!""""!""""!""""!#"""""""44UUDD3D33343434334434443433ffVF""33"#"#"""#333333433##2#"2VFVV"!"""""""""!""""!""""""!""#"!!"""2VFEE3344343334333444334344DDgx"##"#"##""!33""3333#3#""D3gg"#"""""""!""""!""""!""""!#"""""""44UUDD3D33343434334434443433ffVF""33"#"#"""#333333433##2#"2VFVV"!"""""""""!""""!""""""!""#"!!"""2VFEE3344343334333444334344DDgx"##"#"##""!33""33334333##EEggD33##"#"#"""!"!""""""33##33"#######3#43##EEVV#4##333434""3##333#3#"2#gggg"####3#"3##""3"##""33DD3DEEDCEEEEDCgggg#433###""#""""""""""""2#"#2####33##34##DDVW443333343433##3#43##2###DCyx##2##333"33##""3"##""3#33##334333##EEggD33##"#"#"""!"!""""""33##33"#######3#43##EEVV#4##333434""3##333#3#"2#gggg"####3#"3##""3"##""33DD3DEEDCEEEEDCgggg#433###""#""""""""""""2#"#2####33##34##DDVW443333343433##3#43##2###DCyx##2##333"33##""3"##""3#33##ffVWUUWVUUggVFVVFVVFUT4DUEEEVVffFVUEEEUUEUEEEEVV5DVFfffgggwwffffggUUffggffEEED5ED5UUEEEEEEVVEUVFwwxxggfffgffUUgggxgxgxff xx xx ˆ‰ xxxxxxwwgxUUggggEEVVETVFDDDDVVEUffVVEEEEEEEEEEUUFVEEffVFffggwwggfgfgfgVWUUgfVVEEDC5ED5UUEEEEEEVVEEggwwggggffffUUggffgxgxgxgg wwxxggffVWUUWVUUggVFVVFVVFUT4DUEEEVVffFVUEEEUUEUEEEEVV5DVFfffgggwwffffggUUffggffEEED5ED5UUEEEEEEVVEUVFwwxxggfffgffUUgggxgxgxff xx xx ˆ‰ xxxxxxwwgxUUggggEEVVETVFDDDDVVEUffVVEEEEEEEEEEUUFVEEffVFffggwwggfgfgfgVWUUgfVVEEDC5ED5UUEEEEEEVVEEggwwggggffffUUggffgxgxgxgg wwxxgg""#2#"2#"2#"2""""3""2"#2D4EE#323""3""333""3""322#"2#33VV4C#"3#33##2#"2#"##33""3#33##33334433334333DD#34433DD33DDFVC433DDDD3333""3""2"#2"#""3""3"#"""34UU343333""3"33""3""3""32"#3#EEDD33#333##2#"2##""###3##3333##DD334433334433DD44334433DDFVC433##"""2"3"#"2#"2#"2#"""2#""2"#2D4EE#323""3""333""3""322#"2#33VV4C#"3#33##2#"2#"##33""3#33##33334433334333DD#34433DD33DDFVC433DDDD3333""3""2"#2"#""3""3"#"""34UU343333""3"33""3""3""32"#3#EEDD33#333##2#"2##""###3##3333##DD334433334433DD44334433DDFVC433##"""2"""#"###"""""""#"3""3C4gg""33""3333""333333##332#34ff44#3####"2##"#""""#"####""3"##""###3""##""33####2#44DD""3"##""#2###""##"#""""""""##"2#"gVD42"#2"#33""333333333333##VVEE33##""##"3""2"##"""####""##"2####2#"3"""##"2##33D343"###""""2"###"""""""3"#"2#CDgg""33""3333""333333##332#34ff44#3####"2##"#""""#"####""3"##""###3""##""33####2#44DD""3"##""#2###""##"#""""""""##"2#"gVD42"#2"#33""333333333333##VVEE33##""##"3""2"##"""####""##"2####2#"3"""##"2##33D343"###""""""#"""""""3""""""3#DDFV"#"332#333333333433#34333VV4C#"##"2""#"##"""####"3"##""###3"#####""#3#"3##""3344#3"#34""###"2"#""""""3"#"""2"##44WV#3"#333334""3333343334##33E4DD#333##""#2###""""3##"#"##"2#"3#"3"33""##2###""3"443333""##"""""#"""""""3""""""3#DDFV"#"332#333333333433#34333VV4C#"##"2""#"##"""####"3"##""###3"#####""#3#"3##""3344#3"#34""###"2"#""""""3"#"""2"##44WV#3"#333334""3333343334##33E4DD#333##""#2###""""3##"#"##"2#"3#"3"33""##2###""3"443333""##"""""""""""3""""##"3"44VV""233333333333343333433C4VV33#3"###"3""2"#2#"3"##33##""3"####""#""2####"""24444"334""##"2"##""""""""3"""3""33fg##2"#233"3334433333433#3335DD43#33##"#"##"""#"#""####""##"2######"3""33##""##"2EE34""##""""2"#"""""#"#"""##"#"44fV"""33333333333343333433C4VV33#3"###"3""2"#2#"3"##33##""3"####""#""2####"""24444"334""##"2"##""""""""3"""3""33fg##2"#233"3334433333433#3335DD43#33##"#"##"""#"#""####""##"2######"3""33##""##"2EE34""##"""""""#"""#""""#"""2D4fV333333DD3DD3DD33DD##33##EDEE33####"2"#"2"#2###""###"2######2#"3"""##""##"244DD#3#"####""##"""""""""""#"""""3##VV4C333333DD3D33DD3333#333##VV4433""3"####"""#"###""3"##""######2#"3""""2####""33EE33####"""""""#"""#""""#"""2D4fV333333DD3DD3DD33DD##33##EDEE33####"2"#"2"#2###""###"2######2#"3"""##""##"244DD#3#"####""##"""""""""""#"""""3##VV4C333333DD3D33DD3333#333##VV4433""3"####"""#"###""3"##""######2#"3""""2####""33EE33####"""""""""""""""""3##""44fV3433#33344DD443334##"3334E43""3##""#""2""""##"""3"##""##"2"#""#33"#"##"244EE"2##""3#"2#"#""!#"""""2""#2"##33VFDC$3333444DD3D4433#3"33##UE33##"2""#"""2"""3####"#"2#"2####"""##"3""3##""3"EE44"3"""""""""""""""""""3##""44fV3433#33344DD443334##"3334E43""3##""#""2""""##"""3"##""##"2"#""#33"#"##"244EE"2##""3#"2#"#""!#"""""2""#2"##33VFDC$3333444DD3D4433#3"33##UE33##"2""#"""2"""3####"#"2#"2####"""##"3""3##""3"EE44"3""""##33##33""3""333##33######3#EEUU"""###EDD4CDggEE###33####""""#"""3##3############""#"#"33##343444WVEE44443434####"2""#""""""######34Dfg33"!"#"""43D433EEgg#####3####2"#"33"################""#""2####343444UUFV44444434#333##33""3""333##33######3#EEUU"""###EDD4CDggEE###33####""""#"""3##3############""#"#"33##343444WVEE44443434####"2""#""""""######34Dfg33"!"#"""43D433EEgg#####3####2"#"33"################""#""2####343444UUFV44444434ggUUggUUVVxxggEEffD3VUEEEEVVUUgfEEEEEEDCEEVVggfgwwxxggggggffffggffggffyxggffffggVFxxggffggffggffVWggxxgxffgxgxgxgggggxffggggggggUUgfUUWVVVEEED5EC4EDDDVVEUUEfWUUEEUUEEEDEEVVfffgggxxgxfgfgfffgffggffggggxxfgVFfgVVwhwhggfgfgfgfgVFfgxxxyVFwhwhgggggggggxggggfgggggUUggUUVVxxggEEffD3VUEEEEVVUUgfEEEEEEDCEEVVggfgwwxxggggggffffggffggffyxggffffggVFxxggffggffggffVWggxxgxffgxgxgxgggggxffggggggggUUgfUUWVVVEEED5EC4EDDDVVEUUEfWUUEEUUEEEDEEVVfffgggxxgxfgfgfffgffggffggggxxfgVFfgVVwhwhggfgfgfgfgVFfgxxxyVFwhwhgggggggggxggggfggg333333##33xxTE""2##"#"2#"2##""3#33#333##3333333333""3""3""##"2333233UD xxDE33"33333##33##2#33""3344xxTU4CD433334433333433##3333443333ffVF2"#"""2""##"""3"####333433##3#3333333433"3""##"233""3"3333D3wwgf33333333##3333""##333333fgggC4DC333344333333##333333333333##33xxTE""2##"#"2#"2##""3#33#333##3333333333""3""3""##"2333233UD xxDE33"33333##33##2#33""3344xxTU4CD433334433333433##3333443333ffVF2"#"""2""##"""3"####333433##3#3333333433"3""##"233""3"3333D3wwgf33333333##3333""##333333fgggC4DC333344333333##333333""3"33##2#fgD52"""""""#2#"2##""##"2#"##"2##3"#3"#2"##""##"2#"2#"233""fUxxDD"2##""3"##""3""3##""3#33hg33""3##2"#2"#3#"3#"3##33##33""3"EEVV"""!"3""3"#"2###""""##"2#"3#"3##2#33""3"##"""""2#"3333D3xxfg!"##2#"2#"##"2##3""3##2#ffEE"2#"2#34""3"##""3##2"#3#"3""33##2#fgD52"""""""#2#"2##""##"2#"##"2##3"#3"#2"##""##"2#"2#"233""fUxxDD"2##""3"##""3""3##""3#33hg33""3##2"#2"#3#"3#"3##33##33""3"EEVV"""!"3""3"#"2###""""##"2#"3#"3##2#33""3"##"""""2#"3333D3xxfg!"##2#"2#"##"2##3""3##2#ffEE"2#"2#34""3"##""3##2"#3#"333##""3"EEDC""#""""2#"##""""#2#""""##"2#"2#33""3"##""3""3""3333"3UDyx34""3##2##""##"2##""3##233xx33#"2#"2##3""3##2#33##2###3334""fUEE""""""""#"""2""#2"""""3"##""""#3"#2"#2"###"2#"2#"23333""33xxEE#3"#2"####""3"##""3""3""gVVV""3""3##2#"2#"33""##33"""333##""3"EEDC""#""""2#"##""""#2#""""##"2#"2#33""3"##""3""3""3333"3UDyx34""3##2##""##"2##""3##233xx33#"2#"2##3""3##2#33##2###3334""fUEE""""""""#"""2""#2"""""3"##""""#3"#2"#2"###"2#"2#"23333""33xxEE#3"#2"####""3"##""3""3""gVVV""3""3##2#"2#"33""##33"""3##""##"25E44""""""""""2""##"""""##""""3""3""3"33""3""3""3333332232UUxx33##""##""##""##"2##""3"33gx3D""3"33""3"#3"#2"#2##2#####33DDEEVV"""""""""""##"2""#2"#""##""""3""3""33""3""3""3333333322DDxxEE"2#""2"##""#2#####""3"ffVF2"33""3""3##2#"2##3"##"""3##""##"25E44""""""""""2""##"""""##""""3""3""3"33""3""3""3333332232UUxx33##""##""##""##"2##""3"33gx3D""3"33""3"#3"#2"#2##2#####33DDEEVV"""""""""""##"2""#2"#""##""""3""3""33""3""3""3333333322DDxxEE"2#""2"##""#2#####""3"ffVF2"33""3""3##2#"2##3"##"""3""##"2434DEE"2"""2#"2#"2#"2"#2"#2"#2"#2"#23333""33""33""33323333VFww44"3""##"2##"#"2###""3"33WVDD"3""3""3""3""333""##"2##3"3334VWVV!""""#2#""""3""3"""3""2"#2"#"2"332233""3"33""33332333C4ggff""####""####""3"##""3""3VFVV"2#"2#"2#"2#"233""3##2##"3""##"2434DEE"2"""2#"2#"2#"2"#2"#2"#2"#2"#23333""33""33""33323333VFww44"3""##"2##"#"2###""3"33WVDD"3""3""3""3""333""##"2##3"3334VWVV!""""#2#""""3""3"""3""2"#2"#"2"332233""3"33""33332333C4ggff""####""####""3"##""3""3VFVV"2#"2#"2#"2#"233""3##2##"2"#2"#34C4DC"""""##"""""2"""""""3"""""3""3""333""3""3333223233"3224DxxC4##"2####""#2#"2####""##gg33"333""33""3"33""3""3""3""3""#VVVF!"!""""""2#""""2"""""""""2#"33223233""3"333322323322#"33ggfg"""##"2##""##""##"2####DDVV""32"#3333""3322#"2###"#""3""334C4DC"""""##"""""2"""""""3"""""3""3""333""3""3333223233"3224DxxC4##"2####""#2#"2####""##gg33"333""33""3"33""3""3""3""3""#VVVF!"!""""""2#""""2"""""""""2#"33223233""3"333322323322#"33ggfg"""##"2##""##""##"2####DDVV""32"#3333""3322#"2###"####34##EEVVFV###########3#DD#3##DD##343434443343##3#3343##44DD3DEEUUWVffEE####3###34C43#DD##34UEgVggE43#43##4343D4334444DD4E34C434E4xxxxCD4C##3##2#######334##34D3434343D43344#343##333##344DD44EEUTgfffVW"###3##3##DD##34##DD4EVVggFV3434##3434343444DD44DD#3####34##EEVVFV###########3#DD#3##DD##343434443343##3#3343##44DD3DEEUUWVffEE####3###34C43#DD##34UEgVggE43#43##4343D4334444DD4E34C434E4xxxxCD4C##3##2#######334##34D3434343D43344#343##333##344DD44EEUTgfffVW"###3##3##DD##34##DD4EVVggFV3434##3434343444DD44DD#3ggxxxxxxxxgxgggxfgxxggwwggfgggVFggVFffggggVFfgggggfgggxxgxggwwxxwwxxx xˆ ‰xxggggxxxxxxgxxxxxxxxxgxx xˆ ˆx xx xgxwwggx xxyxxxx xxxy™ ‰™ ‰ ™ ‰ ™ ‰ ™ ‰ ™‰ ™ ‰ ™‰xxxxggggggxxggggffggggfgVFffggVFfgVFggggffggyxxxggwwgxxxwwx xˆ ˆx xxxggwwxxxxxxxxxyxxxxggxxˆ ‰w wx xxxggxxxxxx xxxxxxxy™ ‰ ™ ‰yxggxxxxxxxxgxgggxfgxxggwwggfgggVFggVFffggggVFfgggggfgggxxgxggwwxxwwxxx xˆ ‰xxggggxxxxxxgxxxxxxxxxgxx xˆ ˆx xx xgxwwggx xxyxxxx xxxy™ ‰™ ‰ ™ ‰ ™ ‰ ™ ‰ ™‰ ™ ‰ ™‰xxxxggggggxxggggffggggfgVFffggVFfgVFggggffggyxxxggwwgxxxwwx xˆ ˆx xxxggwwxxxxxxxxxyxxxxggxxˆ ‰w wx xxxggxxxxxx xxxxxxxy™ ‰ ™ ‰yx33""###333""3#33""3#33UU""3""3"""""2#"2#""""3"3333E43333333333""3#33#33333DD33333333334433333333343333333433VFDD33""""##3333##33"3##2#3333""3"33##2#33UU#3#"2#"2#""2"#2"#"""3333DD3D333333####332#33333333DD333333333333#333"3343333333333D3EEDC#"2#"2##33##3333""###333""3#33""3#33UU""3""3"""""2#"2#""""3"3333E43333333333""3#33#33333DD33333333334433333333343333333433VFDD33""""##3333##33"3##2#3333""3"33##2#33UU#3#"2#"2#""2"#2"#"""3333DD3D333333####332#33333333DD333333333333#333"3343333333333D3EEDC#"2#"2##33##33"""#""!!""#"23EE""""!"""""""!""""UU##""#"""""""""#""""3""3""3""3""##""3""3"#""2"##""ff##""""3""""2"""""!#"#"!""#DD#3""""""!""""!"""D4ED!""""!#""""#"""##""##"2"#2"#2"#2##"""""3""##"2DDEE"""#""2""""""!"""""""!"23EE""""!"""""""!""""UU##""#"""""""""#""""3""3""3""3""##""3""3"#""2"##""ff##""""3""""2"""""!#"#"!""#DD#3""""""!""""!"""D4ED!""""!#""""#"""##""##"2"#2"#2"#2##"""""3""##"2DDEE"""#""2"""""!""!"""!!""C3E5!""""""!""""!""""""""EE"2""""""""""""3""""##""##"2"#3#"""##"3""""2##""gf44"""""""3"""""""""""""!!"""EE##""""!"!""!!2"""""D433"2""#""2""#""##""""##"2#"2###""##""##""##"""#2#DDWV""2""""""""""""!"""!!""C3E5!""""""!""""!""""""""EE"2""""""""""""3""""##""##"2"#3#"""##"3""""2##""gf44"""""""3"""""""""""""!!"""EE##""""!"!""!!2"""""D433"2""#""2""#""##""""##"2#"2###""##""##""##"""#2#DDWV""2""""""""""!""!!"!"!"22VE!""""""""!""!""""3"EE""2"""""""""""#2#"2"""""3""3##"""""#"3""3""3""gV43""""""#""2"""!""""!"!"""EE#3"""""!"""""""!"""!DD3D""""""""""""#2###"""""2#"2"##"#2#""""""3"DDVV"##""""!"""!""!""!"""22VE!""""""""!""!""""3"EE""2"""""""""""#2#"2"""""3""3##"""""#"3""3""3""gV43""""""#""2"""!""""!"!"""EE#3"""""!"""""""!"""!DD3D""""""""""""#2###"""""2#"2"##"#2#""""""3"DDVV"##""""!"""""""!"!"!""""VV"""!"""""""""""!"""""DD""""""""""""#2#""""##""""2##"""""2""""2##""fU34"""""""""""""!""!!"!!"""UT33"#""""""""""!"!"""333#"""""""!#""2"""##"2"#2#"2"##"""""""#2#""""DDVF!""""""""""!"!!""""!"!""""VV"""!"""""""""""!"""""DD""""""""""""#2#""""##""""2##"""""2""""2##""fU34"""""""""""""!""!!"!!"""UT33"#""""""""""!"!"""333#"""""""!#""2"""##"2"#2#"2"##"""""""#2#""""DDVF!""""""""""""""""""""""#VV""""""!""""""""""!""34""""""""#""""2""""3""3""3""3""3""3""3"""""""##"2#""VV34""""""""""""""""!!"""!""EE34""""!""""""!"""""""233"""""""""2#"2"#2"#2"#2"#2"#2"#2""2#"2""#2"#2"#44EE"""""""""!"!!"!!"!!""#VV""""""!""""""""""!""34""""""""#""""2""""3""3""3""3""3""3""3"""""""##"2#""VV34""""""""""""""""!!"""!""EE34""""!""""""!"""""""233"""""""""2#"2"#2"#2"#2"#2"#2"#2""2#"2""#2"#2"#44EE""""""""##""####""##""""33VV44#3"#2"#23333""3""3##33"3EEDC$3##2#"""##""##""""####""#""#""""#######""####34EEDC!"!"""!!"!!""""""""""UTFV##""3"#32333"3##""3##2##DD444343"#"""2##""""""#2#"#"#""##""""##"2"########EDFU##""3##"""###""####""##""""33VV44#3"#2"#23333""3""3##33"3EEDC$3##2#"""##""##""""####""#""#""""#######""####34EEDC!"!"""!!"!!""""""""""UTFV##""3"#32333"3##""3##2##DD444343"#"""2##""""""#2#"#"#""##""""##"2"########EDFU##""3##"""#VVggggVWggggVWUU5EVFfVggxxggffggxxxxxxxxxxwwxxxxxxggww xxggffVFVVFVVFffVWVWfgVWggVWVVFVVFVVEUVFfWgggggxgxggggggggggFVVVEDgggfFVVFVVETEEVVffggUUUUEEUUEUggggxxffggggwwx xxxwwxxwwwwwwxxggwwxxffVVVVFVVFfVfgVFggffggVWVVVVFVVFUUEUVFgggggxgxgxggggggxxggggx xVVUUVVVVVVggggVWggggVWUU5EVFfVggxxggffggxxxxxxxxxxwwxxxxxxggww xxggffVFVVFVVFffVWVWfgVWggVWVVFVVFVVEUVFfWgggggxgxggggggggggFVVVEDgggfFVVFVVETEEVVffggUUUUEEUUEUggggxxffggggwwx xxxwwxxwwwwwwxxggwwxxffVVVVFVVFfVfgVFggffggVWVVVVFVVFUUEUVFgggggxgxgxggggggxxggggx xVVUUVVVVDC#"3333DDxg33""3""3##2#""""2#"2#"2##3"#3"#33""#"""233##2#"3""3""UUggUUVVETVUUUWVUUgfUUWVUUUUffggDDDDDD33DDDTDDTTDDUUUUUUUUffUUDDDDUUffEE""#2#33""3""""""33""3"#33333##2#33##"""33""3""33""3"DDggfgDTUUUUUUWVUUggUUWVUUUUgg ˆ‰ffDDDD3DD3DDDDDDTTDDUUDUUDDDC42"3333DDxg33""3""3##2#""""2#"2#"2##3"#3"#33""#"""233##2#"3""3""UUggUUVVETVUUUWVUUgfUUWVUUUUffggDDDDDD33DDDTDDTTDDUUUUUUUUffUUDDDDUUffEE""#2#33""3""""""33""3"#33333##2#33##"""33""3""33""3"DDggfgDTUUUUUUWVUUggUUWVUUUUgg ˆ‰ffDDDD3DD3DDDDDDTTDDUUDUUDDD33"#""DDfg""""""""!"3""""""""""""#2#""!"2"DDgg33"3""3""3""433333333433VWVV"3##"""""2#"2#"2#"2#"2#"2#"2#"2#"2#CD##"""""""""#2#!"""""""""!""#"""""2#"ggD42"#2"#2"#2"#3433333433DDyx44""""2#"""2""2#"2#"2#"233"#""DDfg""""""""!"3""""""""""""#2#""!"2"DDgg33"3""3""3""433333333433VWVV"3##"""""2#"2#"2#"2#"2#"2#"2#"2#"2#CD##"""""""""#2#!"""""""""!""#"""""2#"ggD42"#2"#2"#2"#3433333433DDyx44""""2#"""2""2#"2#"2#"233##""##33WV#3""!!"""!#""!""""""""""""""""""""DDgg34""3"#3"#34333433343344ffVF33##2###""3""2"#2"#2"33333333443344DD#3#""""""""""""""""""""""""""""!""""33ggD33##3#"34""433343334333UUgg44"2##3"##""3""3##2#"243"#3333##""##33WV#3""!!"""!#""!""""""""""""""""""""DDgg34""3"#3"#34333433343344ffVF33##2###""3""2"#2"#2"33333333443344DD#3#""""""""""""""""""""""""""""!""""33ggD33##3#"34""433343334333UUgg44"2##3"##""3""3##2#"243"#3333##""D4VV"3""!"!"""""""""""""""""""""##!"""""DDgg333343"#3434""4333434333gggg""3"##""###3"#34##34""3#334433444444DD#3#""""!""""""#"!"!"""""""""#""!"""""#"ggEE333334##34343334333433UDxg34""3""2"#3##3##23334""433333##""D4VV"3""!"!"""""""""""""""""""""##!"""""DDgg333343"#3434""4333434333gggg""3"##""###3"#34##34""3#334433444444DD#3#""""!""""""#"!"!"""""""""#""!"""""#"ggEE333334##34343334333433UDxg34""3""2"#3##3##23334""43333334##"D4gg33"""""""""""""""""""""""""""""3"33gf3344"334##34343334343344UUVV""#"""##"""##"2##33444444DD4433EE44""""""""""""""""""""""""""#"""2"#2WVDD443334""43"#3434343344DDxg##2##""""""3####333###DC3343##"D4gg33"""""""""""""""""""""""""""""3"33gf3344"334##34343334343344UUVV""#"""##"""##"2##33444444DD4433EE44""""""""""""""""""""""""""#"""2"#2WVDD443334""43"#3434343344DDxg##2##""""""3####333###DC33#3"""D4gg""""""""""#"!!""!"""""""!"""""!""33ffD34433433343434433433333EEEE"2"#"#"""""""####DD3344334433EEDC"!"!"!"""!""""!!"!""""!!"""""""2#VVDD3344434343434433444333DDgg""##"""#"#"""33""3333#3"""D4gg""""""""""#"!!""!"""""""!"""""!""33ffD34433433343434433433333EEEE"2"#"#"""""""####DD3344334433EEDC"!"!"!"""!""""!!"!""""!!"""""""2#VVDD3344434343434433444333DDgg""##"""#"#"""33""333343##33EEggE43##3#"##""""""""33""#""33####3#33##334343UEVV#4##3#33#3433334##3###""gggg"""33######2###33""4433DDEEDCEEDDEEggFV3334#####33"""""""!#""#"2"#####33##3##3##4343E5fVD534##3333##3433##3#"3##D3yx#3"#3#34""###333""3"#34333333343##33EEggE43##3#"##""""""""33""#""33####3#33##334343UEVV#4##3#33#3433334##3###""gggg"""33######2###33""4433DDEEDCEEDDEEggFV3334#####33"""""""!#""#"2"#####33##3##3##4343E5fVD534##3333##3433##3#"3##D3yx#3"#3#34""###333""3"#3433333ffffVWUUUUggUUEEVVETEEEEEEDDVVggEEVVDDEEEEVVDDVVEUVFeUffggggffggVWffUUgfWVUU3DE4VUEEEEEDFVVFEEVVxxggwwggffggUUxgggxxgxgxgxxxgxxxgxggggfffffffgEEffUDEEEE3DUEEEggVFEEUU4DEEVVEEUTFVUDgfVFffxxfgfffgffUUgfUUVVDDEE4EUEEEEDFUVFEEVVggxxgxggffffVWffgxgxgxgxgxw wgggxffffVWUUUUggUUEEVVETEEEEEEDDVVggEEVVDDEEEEVVDDVVEUVFeUffggggffggVWffUUgfWVUU3DE4VUEEEEEDFVVFEEVVxxggwwggffggUUxgggxxgxgxgxxxgxxxgxggggfffffffgEEffUDEEEE3DUEEEggVFEEUU4DEEVVEEUTFVUDgfVFffxxfgfffgffUUgfUUVVDDEE4EUEEEEDFUVFEEVVggxxgxggffffVWffgxgxgxgxgxw wgggx"#""""2#"2#""""""""#2#"2D4EE33""3""3""3""3""3""3""3"33VV4C33##2##3""##""##"2#"3##3"#33333343334333334333443333DDEE333333"3##2#""""#2#""##"!##"2""#2"33VF3422#"2#"2#"2#"2#"2#22#"2#UU4D33#3"###"2#"2#"2#"2###33##3333334433333333444333333344UU3D""3#"#2"2"""""3""3""""""2""#2"DDEE33""3""3""3""3""3""3""3"33VV4C33##2##3""##""##"2#"3##3"#33333343334333334333443333DDEE333333"3##2#""""#2#""##"!##"2""#2"33VF3422#"2#"2#"2#"2#"2#22#"2#UU4D33#3"###"2#"2#"2#"2###33##3333334433333333444333333344UU3D""3#"#2""#""##""""""##"""3"DDgg#3""33""333"33333333##3#33gf44"3####""####"3""2"##""##""##"2####2###""##""3##244DD""43"###"2#"##"3"""""""""""""3"43ffD333""33""3333333333##33##VVEE34""####""###"3""2"##""##"2##""##"2##"""####3"#2"DD#3#"""""""#""##""""""##"""3"DDgg#3""33""333"33333333##3#33gf44"3####""####"3""2"##""##""##"2####2###""##""3##244DD""43"###"2#"##"3"""""""""""""3"43ffD333""33""3333333333##33##VVEE34""####""###"3""2"##""##"2##""##"2##"""####3"#2"DD#3#"""""""""""3"""3"""2##"33EEVV"""33333333333334333433#3VFDC#"##"2##"""3"""3"##""###3"####3"#####"3"####""3#3344#3"#3#"3"##""#"#""""""3""""""###33WV##""333333""33333433343433EEDC##3##2####"""#2#######"3"##""##33####""#####""3##2D433#"43#""""2"#"#""""#"""2##"33EEVV"""33333333333334333433#3VFDC#"##"2##"""3"""3"##""###3"####3"#####"3"####""3#3344#3"#3#"3"##""#"#""""""3""""""###33WV##""333333""33333433343433EEDC##3##2####"""#2#######"3"##""##33####""#####""3##2D433#"43#"""""#""""2"#"2"#2###DCEE""3"33333333333333#3433333EE44"3##""###"2"##"""####""##"2##""####""""3##""##"23344"334##""3##2###"""""""#"#""#2#34VW#322#"3333333333333434##""UU4D##2#"2""#"3""2"#2###""##"2####33##""""####2#"243D43343"""""""#""""2"#"2"#2###DCEE""3"33333333333333#3433333EE44"3##""###"2"##"""####""##"2##""####""""3##""##"23344"334##""3##2###"""""""#"#""#2#34VW#322#"3333333333333434##""UU4D##2#"2""#"3""2"#2###""##"2####33##""""####2#"243D43343"""""""""#"""""""3"""#44fV333333DD3DD3DD3D4433##3333EE34""####""#"#""#2#"33"##""######2#"#"""####""##33EE34""######2###""""""""""""##"""3#VV4C333333D3DD3DD3334333#343VF333##3##""#2#"#2#########""#3#"3##"#""""2##""##"2EE44"3"""""""""2""""""3"""#44fV333333DD3DD3DD3D4433##3333EE34""####""#"#""#2#"33"##""######2#"#"""####""##33EE34""######2###""""""""""""##"""3#VV4C333333D3DD3DD3334333#343VF333##3##""#2#"#2#########""#3#"3##"#""""2##""##"2EE44"3"""""""""""""""""3##""44VV3334##3344DD443333"#""EDE52"##""#2#"""3"""##"""3"##""##"2""#""""3####""3"44VV""3"##""####""""""2""""""""""3"43EEED33#33343D4443343"#"3"43UE33""##"""""3"""3""2"#2#"2#""##"2""#"##""3"##33EE44"3""""""""""""""""""3##""44VV3334##3344DD443333"#""EDE52"##""#2#"""3"""##"""3"##""##"2""#""""3####""3"44VV""3"##""####""""""2""""""""""3"43EEED33#33343D4443343"#"3"43UE33""##"""""3"""3""2"#2#"2#""##"2""#"##""3"##33EE44"3""""#3##33332###333333#3###3##3UEEE""""##""##DDUEEEggEU##3#33##3###2"####33#3##3#######3#"2"##3#34443444WVEE44DD4E3434###""#"""""###3#33##34fg33""""##"#DCFUD3DDFV##3##3##33##"""#"#""##3##3#####3####2#"3""33##344433VFVV444444DD#3##33332###333333#3###3##3UEEE""""##""##DDUEEEggEU##3#33##3###2"####33#3##3#######3#"2"##3#34443444WVEE44DD4E3434###""#"""""###3#33##34fg33""""##"#DCFUD3DDFV##3##3##33##"""#"#""##3##3#####3####2#"3""33##344433VFVV444444DDggUUggUUVVxxggDDVVDDUUEEEEffVFeUEEUUEEEEUUFVfgffgxgxfgfgfffffgfgfgggUUx xwhffggfffgxxggfgVWfgggUUffggxyxxgggggxggggggggggggggfgggfgFVVWggEEEDEEUU5EVFffEEEEVVVVUUVVEEUUFVDDVVfgVWffxxggffggggfgfgfgfgfgggyxffggfgVFwwxxffggfgfgfgVFfgxxxyggggxxgxgggggggxffggggggggUUggUUVVxxggDDVVDDUUEEEEffVFeUEEUUEEEEUUFVfgffgxgxfgfgfffffgfgfgggUUx xwhffggfffgxxggfgVWfgggUUffggxyxxgggggxggggggggggggggfgggfgFVVWggEEEDEEUU5EVFffEEEEVVVVUUVVEEUUFVDDVVfgVWffxxggffggggfgfgfgfgfgggyxffggfgVFwwxxffggfgfgfgVFfgxxxyggggxxgxgggggggxffgggggg33"333""33xxTE"3"""##"3""3""3"33##33##2#3333343333""##"2#"2#"2#"33""fUx xD52"#3#"3#"3""3""333""3"44xxDDDD333333333333"3##332#3433"33Dgg""##"2#"2###""#2#"2#"##"2##33##2##3"#333333""##"2##""3""3""3333ˆwVF33##2##3"#2"#2"###"23333VWggC4333433D33334""3333""3333"333""33xxTE"3"""##"3""3""3"33##33##2#3333343333""##"2#"2#"2#"33""fUx xD52"#3#"3#"3""3""333""3"44xxDDDD333333333333"3##332#3433"33Dgg""##"2#"2###""#2#"2#"##"2##33##2##3"#333333""##"2##""3""3""3333ˆwVF33##2##3"#2"#2"###"23333VWggC4333433D33334""3333""33""3""3##33VWCD""##""""""3""3##""##""3"##33""43"#3#"3##""#2#""##2#3333UDxxCD##2#"2#"2##3"#2"##""4333gg34""3"33##""33##33""###333""3"DDVW"#"""##""""""##""""##"2##""3""3##33""##33##2#"2##"""""2#"333333xxfg""3#""##2#"2##""#3"#2"#2ggEE""3""3""##33""##33##2#"2"3""3"#333VWCD""##""""""3""3##""##""3"##33""43"#3#"3##""#2#""##2#3333UDxxCD##2#"2#"2##3"#2"##""4333gg34""3"33##""33##33""###333""3"DDVW"#"""##""""""##""""##"2##""3""3##33""##33##2#"2##"""""2#"333333xxfg""3#""##2#"2##""#3"#2"#2ggEE""3""3""##33""##33##2#"2"333##""3"EEDC"""""2#"2"##""""3"##""""##"2#"2#"233""##"2#"2#"23332"#eUhw#4""3#""##""##"2##""3#"33‰x33"3""3"#3"#2"33##2###33""##"2EEVV"2"#""##!2"#2""##"""""""2##""""##"2#"33""3""3##""3""33322#"DDxxEE"2##3"##""3"##""##"2##3"ffVF2"#233##2#"233""3"#3"#3#"333##""3"EEDC"""""2#"2"##""""3"##""""##"2#"2#"233""##"2#"2#"23332"#eUhw#4""3#""##""##"2##""3#"33‰x33"3""3"#3"#2"33##2###33""##"2EEVV"2"#""##!2"#2""##"""""""2##""""##"2#"33""3""3##""3""33322#"DDxxEE"2##3"##""3"##""##"2##3"ffVF2"#233##2#"233""3"#3"#3#"3""3##2##EE44##""""""""3""3""3""2"""##""""3""333""3""3""3"2333233322gfhw#4""##"2##""##"2""##""3"33xg44"3""3""333""3""3##2###33##3#DDVW"2"""2""""2"#2"#2"##""""#2###""3""3""33""3""3""3233"33323C4xxEE"2#"##""##""##"2##""3""3ffVF2"#2"#2"#2"#2"#2##2###"""3""3##2##EE44##""""""""3""3""3""2"""##""""3""333""3""3""3"2333233322gfhw#4""##"2##""##"2""##""3"33xg44"3""3""333""3""3##2###33##3#DDVW"2"""2""""2"#2"#2"##""""#2###""3""3""33""3""3""3233"33323C4xxEE"2#"##""##""##"2##""3""3ffVF2"#2"#2"#2"#2"#2##2###"""3""##"2#"EE3D"""""""3""2"#2"""""3""3""3""3""3333""33""33""33333323UDxx44"2#"##"2""###"2##""3#33gg332333""3""3""33""3"##33""3##2EEgg"""""""""2"#2"#"2""""""""2#"2#"2"332233""33""33""333233D3ggff""##"2##""#2###""##"2#"eUVF2"32"#2"33""3"33""3##2##"3""##"2#"EE3D"""""""3""2"#2"""""3""3""3""3""3333""33""33""33333323UDxx44"2#"##"2""###"2##""3#33gg332333""3""3""33""3"##33""3##2EEgg"""""""""2"#2"#"2""""""""2#"2#"2"332233""33""33""333233D3ggff""##"2##""#2###""##"2#"eUVF2"32"#2"33""3"33""3##2####""""3"44DD3D""""2"#2""""3"""3""2"#2"#2"33""3"33""33""3332"#2"DDxxCD##""##"3"##"3""3##""3"VV44"3""3"33""3"3333""3""3##""#DDgg""""""""""""""2#""""2"""##""""3""3""3223""3"33""33223322#"33gfWV"3#""##""####""""#3"#"EEEE"2#"33""3""333""33""#""##""""3"44DD3D""""2"#2""""3"""3""2"#2"#2"33""3"33""33""3332"#2"DDxxCD##""##"3"##"3""3##""3"VV44"3""3"33""3"3333""3""3##""#DDgg""""""""""""""2#""""2"""##""""3""3""3223""3"33""33223322#"33gfWV"3#""##""####""""#3"#"EEEE"2#"33""3""333""33""#""##343434EEVVFV##3########3##DD#343D433D4443444DD##DD##34343444DDEEUTWVWVffEE####3#43D4CD#4CD#4CDFVVWggEE34343434C43444DD4EE4EEEEEEEEfgxyC44444DD##3#####3##343D43343D43344DD44443343##434343D444EEEEUUggffVW#3##43##33DD##34D343E5fWgggg3434343434E443E544EE4ED3##343434EEVVFV##3########3##DD#343D433D4443444DD##DD##34343444DDEEUTWVWVffEE####3#43D4CD#4CD#4CDFVVWggEE34343434C43444DD4EE4EEEEEEEEfgxyC44444DD##3#####3##343D43343D43344DD44443343##434343D444EEEEUUggffVW#3##43##33DD##34D343E5fWgggg3434343434E443E544EE4ED3ggxxxxgxgxxxggggggwwggwwggggfgVWVVfgFVfgffVFfgggggffgxxxxxggwwwwxxgxˆ ˆw wxxggxxxxxxxxgxxyxyxxgxgg xx ™ ‰xxgxwwggxxxxxyxxwwyxxx™ ‰ ™ ‰ ™‰ xx ™ ‰ ™ ‰ ™ ‰wwxxggwwggggwwggggffggVWffVWVVggffFVVFffggggwwxxgxgxwwggwwwwx xˆ ˆx xxxggwwxxxxgxxyx xxyxyggwwˆ ˆx xwwxxggxxxxxxxxxxxxww ™‰ ™ ‰xxggxxxxgxgxxxggggggwwggwwggggfgVWVVfgFVfgffVFfgggggffgxxxxxggwwwwxxgxˆ ˆw wxxggxxxxxxxxgxxyxyxxgxgg xx ™ ‰xxgxwwggxxxxxyxxwwyxxx™ ‰ ™ ‰ ™‰ xx ™ ‰ ™ ‰ ™ ‰wwxxggwwggggwwggggffggVWffVWVVggffFVVFffggggwwxxgxgxwwggwwwwx xˆ ˆx xxxggwwxxxxgxxyx xxyxyggwwˆ ˆx xwwxxggxxxxxxxxxxxxww ™‰ ™ ‰xx""3""3""##"2#"2#"23333VV""""""2"""""2#""""2323344333334##33""3#33""433333333333333433"333##2#33##33333333EEED#3""""3"##33"33""3""3""3##2"#2"#2"#3#DDDD"""""3""2""2#"2"#2D433D43#33#33333##33""43333333333333333433"3##2#33##33""3#33DDEE33"2"#2"###"2#""3""3""3##""3""3""3333VV""""""2"""""2#""""2323344333334##33""3#33""433333333333333433"333##2#33##33333333EEED#3""""3"##33"33""3""3""3##2"#2"#2"#3#DDDD"""""3""2""2#"2"#2D433D43#33#33333##33""43333333333333333433"3##2#33##33""3#33DDEE33"2"#2"###"2#"""!""!#"#""!33EE""""!"!""!"""!#"2"UU"###""""""#2#""2#"2#"2#"2#""2"#2"###"""3"####""gf43"""#""2""#!""""""!""!"#""DD##""""!"""""""""""D3EE""""""#2#""""""##"2#"2#"2""###"2#""2"#2#"2"TTEE""""""2"#"#"!""!"!#""!33EE""""!"!""!"""!#"2"UU"###""""""#2#""2#"2#"2#"2#""2"#2"###"""3"####""gf43"""#""2""#!""""""!""!"#""DD##""""!"""""""""""D3EE""""""#2#""""""##"2#"2#"2""###"2#""2"#2#"2"TTEE""""""2"#"""#""""""!!"33D3"""""""!""!""!""!""EE"2""#""2""#""""#2"""##""##""3""3""####"3""3"""#2#fg44"""""3"##"""!""""!""!"!""EE#3!"""!""""!""!"""""D3DD""!#""""2""#2"""##""##""3""3""##""""##"2""#"3"DDVV""#""2##""!"!#"""!"""""33D3"""""""!""!""!""!""EE"2""#""2""#""""#2"""##""##""3""3""####"3""3"""#2#fg44"""""3"##"""!""""!""!"!""EE#3!"""!""""!""!"""""D3DD""!#""""2""#2"""##""##""3""3""##""""##"2""#"3"DDVV""#""2##""!""!"!!"!!"!"33EE"""""!"""""""!""""""EE"2""""""""""""2#"2##"""""2###"""""""""""3""3"WV33"""""#"""""""!"""!"!"""EE#3""""""""!""!""!#""DD33"""""""""""""""#3""##"""""##""#""2"#"""""3"DDVV""""""!!#""!""!""!"""33EE"""""""""""""!""""""EE"2""""""""""""2#"2##"""""2###"""""""""""3""3"WV33"""""#"""""""!"""!"!"""EE#3""""""""!""!""!#""DD33"""""""""""""""#3""##"""""##""#""2"#"""""3"DDVV""""""!!#"!"!!"""!""!""""VV"""""""""""""""""""""""D3#"""!"""""""""""2##""""#"""2""""""""##"""2#"2#"eU43"""""""""""""!"""""""""""UT33"""!"""""""""""""""C333""""""""""""""2##"""3""2"#2"""#"""""""""3""344VV""""""""""""""""!!""!""""VV"""""""""""""""""""""""D3#"""!"""""""""""2##""""#"""2""""""""##"""2#"2#"eU43"""""""""""""!"""""""""""UT33"""!"""""""""""""""C333""""""""""""""2##"""3""2"#2"""#"""""""""3""344VV"""""""""""!"!!"!!"!!"""UU"""""""""""""""""""""33""""""3""2"""""3""3""3""3""3""3""3""3""""""2#"##"VV33""""""""""!!"!!"!!"!!"!UE34""""!""""""""""""!"""##"""""""""""""2#"2#"2#"2#"2#"2#"2#""2""2#""""3"##33EE"!"""!""""""""""""""""UU"""""""""""""""""""""33""""""3""2"""""3""3""3""3""3""3""3""3""""""2#"##"VV33""""""""""!!"!!"!!"!!"!UE34""""!""""""""""""!"""##"""""""""""""2#"2#"2#"2#"2#"2#"2#""2""2#""""3"##33EE"!"""!""#3##333434##3#######44ggE52"#2##""3"####"2"""3##EEDC##3#33"""#"3"""##"####"##"##"2##""4343##3434##44fVE43##3##3#33##3#43##3#"3##3444########33VFVV#3##""3"##""##"2""###""44UU#3##33##"""3"##"""3"###"###"3#"3##""43##4343##43VFVV##33##3#33###3##3##333434##3#######44ggE52"#2##""3"####"2"""3##EEDC##3#33"""#"3"""##"####"##"##"2##""4343##3434##44fVE43##3##3#33##3#43##3#"3##3444########33VFVV#3##""3"##""##"2""###""44UU#3##33##"""3"##"""3"###"###"3#"3##""43##4343##43VFVV##33##3#33###3#ffgxgggggxgxggFVEEVVggggwwggfgUUggxxwwgxgxfwgxgxwwggggwwggfgEEffVFVVfgVWggggVWggVWVWggVFVVFVVFgggxgxgxgxgxgxgxgxxxggxxxyxyxyxyxxgxggggggVWVVggFVEEVVVWgggxggggfgfggxwwgxggxxgggxwwgggggxgxggDUVVVVFVVFggggggggggVWVWVWggVFVVFVgggggxgxgxxygggxggyxxxggyxggggggggffgxgggggxgxggFVEEVVggggwwggfgUUggxxwwgxgxfwgxgxwwggggwwggfgEEffVFVVfgVWggggVWggVWVWggVFVVFVVFgggxgxgxgxgxgxgxgxxxggxxxyxyxyxyxxgxggggggVWVVggFVEEVVVWgggxggggfgfggxwwgxggxxgggxwwgggggxgxggDUVVVVFVVFggggggggggVWVWVWggVFVVFVgggggxgxgxxygggxggyxxxggyxgggggggg33"33333EEgg"""""2""#""""""3""33""3""3""3""3""""33""""3##""3"UUggFVTDUUFVTEeUWVUUWVUUVVUUWVVVETD444DD3DD3DDDDDDDDDDDDDDDDDDEEDCFVD3#2#"2"#2#"""""""3"""""""3"33""3""3##"!33""3"""""2#"33xgVVDTUETUUUVVUUUUWVUUUUUUWV‰ ˆgg3D333344DD3DTDDDDDDTDDDDDD33"33333EEgg"""""2""#""""""3""33""3""3""3""3""""33""""3##""3"UUggFVTDUUFVTEeUWVUUWVUUVVUUWVVVETD444DD3DD3DDDDDDDDDDDDDDDDDDEEDCFVD3#2#"2"#2#"""""""3"""""""3"33""3""3##"!33""3"""""2#"33xgVVDTUETUUUVVUUUUWVUUUUUUWV‰ ˆgg3D333344DD3DTDDDDDDTDDDDDD33##"""44WV"2""""""!#2#""""!"""""""""##!"""3"DDgg"3""##"2#"2#343333343333ggff"#"""2#"2""2"#"2"#2"#2"#243"#2"4344""""##""!"""!"3"""""""""""""3""""""3"ggDD"3""3""3""43"#33343333UDxgDD""#2#""""""3""2"#2"#2"#233##"""44WV"2""""""!#2#""""!"""""""""##!"""3"DDgg"3""##"2#"2#343333343333ggff"#"""2#"2""2"#"2"#2"#2"#243"#2"4344""""##""!"""!"3"""""""""""""3""""""3"ggDD"3""3""3""43"#33343333UDxgDD""#2#""""""3""2"#2"#2"#233##"""DDVF33"""""""""""""""""""""""2""""""""D3gg33"3##2#3433#33344334433ffVW#3"#2"##""3""2"#2"#2"#243"#3333""3#DD"""""""""!""""2"!""""""""""""""""""""33ggD33"#3##""43334333433344DDxg34""##"2####2#"2#"2#34""3"3433##"""DDVF33"""""""""""""""""""""""2""""""""D3gg33"3##2#3433#33344334433ffVW#3"#2"##""3""2"#2"#2"#243"#3333""3#DD"""""""""!""""2"!""""""""""""""""""""33ggD33"#3##""43334333433344DDxg34""##"2####2#"2#"2#34""3"3433##""D4gg"""""""""""2"""""""""""""""#"""""""DDgg443334""43##333334333433ggVW"2"#"3"####3##3"#2"#3#"43443344"344DD"""""""""""##!"""""""33"""""#""""""2#"ggEE3334""3#43"#34333444"3UDyx34""##"2#"3#"3##34""4343"#3433##""D4gg"""""""""""2"""""""""""""""#"""""""DDgg443334""43##333334333433ggVW"2"#"3"####3##3"#2"#3#"43443344"344DD"""""""""""##!"""""""33"""""#""""""2#"ggEE3334""3#43"#34333444"3UDyx34""##"2#"3#"3##34""4343"#343333"#"DDgg"""""""""!"""""""""""""""""""""""""##33WV33433343##2#343433343433VWVV""#""""#"""###3"#3#"3344434##DDEE""""""""""""""""""""""""""2"""""""3"WVDD3D3434""43##3343433344DDgx##"2"#""##""#3#DD"###DD3333"#"DDgg"""""""""!"""""""""""""""""""""""""##33WV33433343##2#343433343433VWVV""#""""#"""###3"#3#"3344434##DDEE""""""""""""""""""""""""""2"""""""3"WVDD3D3434""43##3343433344DDgx##"2"#""##""#3#DD"###DD3343##"D3hg"""""!""""#"""""""""""""#""!!"""44VV33DD#3433343434433434433UDEE"""#""""""""""##33##33333433DD4E""!"""""""""""""""#""!!"""""!""""VVDD4433434343444333434433DDgx#"#"#"#"""""33""##3343##"D3hg"""""!""""#"""""""""""""#""!!"""44VV33DD#3433343434433434433UDEE"""#""""""""""##33##33333433DD4E""!"""""""""""""""#""!!"""""!""""VVDD4433434343444333434433DDgx#"#"#"#"""""33""##3343##43EEggEE34##3##2"#2"""""33"#"#""33#####34##333#43D433VFVV4C433334##333##3##33####xggg#33##33##3##3##2#33D3DD#3EEEEDCEEgghw5EC4DC$3#3###2"#"""""""#"#""#3#33#33##3#33#3E533E5fVE43##3334343"#343434####C4yx33"33334##2#####33##333433343343##43EEggEE34##3##2"#2"""""33"#"#""33#####34##333#43D433VFVV4C433334##333##3##33####xggg#33##33##3##3##2#33D3DD#3EEEEDCEEgghw5EC4DC$3#3###2"#"""""""#"#""#3#33#33##3#33#3E533E5fVE43##3334343"#343434####C4yx33"33334##2#####33##33343334ffffVWTUVWffVFCDVVEEEEEDDDEEEEggVVEEEEDCEEUUFVTEEEVVffUUgghwgfffVWVVffUUffEEEEDCEEEEEEUUFVVFVVUUggwwggggggffffffgxw wgxgxgxx xxxfggxffVWffffggVWDEEEVVETDDDDUUEEfgVVVVEEDCFVEEEEUTEUEEVVfgfggggxffFVfgVFeUgfUEUU44EEEUEEEEEEEEVVVVgggxwwggggffUUgggxgxgxgxgxw wgxggffffVWTUVWffVFCDVVEEEEEDDDEEEEggVVEEEEDCEEUUFVTEEEVVffUUgghwgfffVWVVffUUffEEEEDCEEEEEEUUFVVFVVUUggwwggggggffffffgxw wgxgxgxx xxxfggxffVWffffggVWDEEEVVETDDDDUUEEfgVVVVEEDCFVEEEEUTEUEEVVfgfggggxffFVfgVFeUgfUEUU44EEEUEEEEEEEEVVVVgggxwwggggffUUgggxgxgxgxgxw wgxgg"##""""2#"""3"#""2"#2D4UU"#33""3""3""3""3""3""3""43VFDC##3"33##""##""##""#33##2#3334333334333333343433333344EE33"333"3##2#"2"""""3"##"""2""#"3"33VF332#"2#"2#"2#"2#"2#"2#"2#"UUDD43"#33##""##""##"2#"2###33##33333334333334343433333343VF332#"2""""##""""2#"""3"#""2"#2D4UU"#33""3""3""3""3""3""3""43VFDC##3"33##""##""##""#33##2#3334333334333333343433333344EE33"333"3##2#"2"""""3"##"""2""#"3"33VF332#"2#"2#"2#"2#"2#"2#"2#"UUDD43"#33##""##""##"2#"2###33##33333334333334343433333343VF332#"2""""""##"3""""2""""""3##C4fW33#"2#3334""3333333433##33gf33#3##"2"#2###"3""##"2#"##"2####2#"##"2#"######2#3344"333####2#"2#""""##"""""#""""3333VWCD""33""3333333333##3333##VVDD34##"2"####"3""""2####""##"2####2###"""3####""33D343"#"#""""2##"#""""2""""""3##C4fW33#"2#3334""3333333433##33gf33#3##"2"#2###"3""##"2#"##"2####2#"##"2#"######2#3344"333####2#"2#""""##"""""#""""3333VWCD""33""3333333333##3333##VVDD34##"2"####"3""""2####""##"2####2###"""3####""33D343"#"#"""""""""#"2"#""2####""EEEE"2#"333333333333433333#333VV4C#"##"2""#"3""2"##""##"2##""###3"#"33######""##"2444333""43"#3#"3####""""""#""""3"#"##33VV##2#3333333333333433333433EEEE#3"###"2"""""##"##""##"2##""##"2##""####""####""3##2D433#"3#"3""""""""#"2"#""2####""EEEE"2#"333333333333433333#333VV4C#"##"2""#"3""2"##""##"2##""###3"#"33######""##"2444333""43"#3#"3####""""""#""""3"#"##33VV##2#3333333333333433333433EEEE#3"###"2"""""##"##""##"2##""##"2##""####""####""3##2D433#"3#"3""""#""""""2""#"#""""DDVV"3233333333333333#3433344VV33#3"#"##"2"#""##"""####""##"2######"##2#####""##33EE#3"###"2####"2"##""""""#"#""#"###gf##2333""33333333333433##33VV4C########""#"#""#2#####""##"2####33##"#""###3##""3"EE#3#"##"""""#""2""""#2#"#""2D4fV"3233333333333333#3433344VV33#3"#"##"2"#""##"""####""##"2######"##2#####""##33EE#3"###"2####"2"##""""""#"#""#"###gf##2333""33333333333433##33VV4C########""#"#""#2#####""##"2####33##"#""###3##""3"EE#3#"##"""""""""#"""#2#""2##D3VV3333D3DD3DD3DD3DD33#33##DCEE##2###""3"""3""##"2""###"2######"2"#2#""#2###""33EE""43##""3##2#"""""""3"""#"""3##VV4C3333DD3DD3DD3DD343##33##VV3433##2#"#2#"##"""3"####""##"2####""#"#"""##"2##33EE44"3"""""""""""#"""#2#""2##D3VV3333D3DD3DD3DD3DD33#33##DCEE##2###""3"""3""##"2""###"2######"2"#2#""#2###""33EE""43##""3##2#"""""""3"""#"""3##VV4C3333DD3DD3DD3DD343##33##VV3433##2#"#2#"##"""3"####""##"2####""#"#"""##"2##33EE44"3"""""""""""""""""""""##"244VV3333####44DD333334"#""DD5D#"##"2"#""#"#""""#"##""##""##"2##"""#"#""##"2#"44eU##2#"2##""##"2##"!#""""#2"##""3"#3VF44332###4444443334"""2##3UE33##""""3""#""""#"#""""##""##"2##"""""###"2##""3"EE44"3"""""""""""""""""""""##"244VV3333####44DD333334"#""DD5D#"##"2"#""#"#""""#"##""##""##"2##"""#"#""##"2#"44eU##2#"2##""##"2##"!#""""#2"##""3"#3VF44332###4444443334"""2##3UE33##""""3""#""""#"#""""##""##"2##"""""###"2##""3"EE44"3""""33#3434D#33#3333333#3##3#43UEEE"#"""#3#"3#UU5ED5UUFV33#3##333##3#""#####333##3##3##3##33##########344434D3ggEE44EE4444444434#####33""###3#33##3#EEggD3"""""###33D3VV5DE5fgC434##3##3##33###33##3##3##3##3########33#3334443444UUWVEE44EE4433#343D4"333#333333#3##3#43UEEE"#"""#3#"3#UU5ED5UUFV33#3##333##3#""#####333##3##3##3##33##########344434D3ggEE44EE4444444434#####33""###3#33##3#EEggD3"""""###33D3VV5DE5fgC434##3##3##33###33##3##3##3##3########33#3334443444UUWVEE44EE44ggUUggUUVVwwggDDVVDDEEEUEEUTWVUUEEEEEEEDEEffVFggggwwfgUUggUUgggfgfgfffgxxxfgffggffgxggggfgfgfgffVWgg xxxxgggxgxgggxggggffggggggffVWggVWffxxTE44EEDDUU4DUEEEEEffUDVV4CVFEDFUVFeUgggfhwffVWfgUUffggfgfgfgggyxffggffVVggxxggfgfgfgfgVFffx xxyfgggxxgggxggggffggffggffggUUggUUVVwwggDDVVDDEEEUEEUTWVUUEEEEEEEDEEffVFggggwwfgUUggUUgggfgfgfffgxxxfgffggffgxggggfgfgfgffVWgg xxxxgggxgxgggxggggffggggggffVWggVWffxxTE44EEDDUU4DUEEEEEffUDVV4CVFEDFUVFeUgggfhwffVWfgUUffggfgfgfgggyxffggffVVggxxggfgfgfgfgVFffx xxyfgggxxgggxggggffggffggff""33""3"33xxTE"3""""#2#"2#"2#####3333##33##2#33"3##""""3""3""3""3""fUyx44"333""3""3""3"##""3""333xgUU33333333343333##33##2#3333""3333ggD3""##""""#"#""3"##""3"#333##2###33"333#3"#""##""3"##""3""3D3xxVV""3##233""3"##""3""3""33VWffC4333433343333##2##3"#33"333""3"33xxTE"3""""#2#"2#"2#####3333##33##2#33"3##""""3""3""3""3""fUyx44"333""3""3""3"##""3""333xgUU33333333343333##33##2#3333""3333ggD3""##""""#"#""3"##""3"#333##2###33"333#3"#""##""3"##""3""3D3xxVV""3##233""3"##""3""3""33VWffC4333433343333##2##3"#33"333##33""gV44"3""##"""2#"2##""##""3"##""3##2"#33##2#"2##""#2#223333UD xxCD""3#""##2###""3"##""3"DDgg##33""3"#3"#2"##33##2###""3"333333VFDC##"""##""""#2###""3""3""3"##33##2##3"#2"##""3""2"#23322D4xxUU"233""3"##""3#"2##3"#2"ggEE"2#"2##3"#2"#3#"##33""3""333##33""gV44"3""##"""2#"2##""##""3"##""3##2"#33##2#"2##""#2#223333UD xxCD""3#""##2###""3"##""3"DDgg##33""3"#3"#2"##33##2###""3"333333VFDC##"""##""""#2###""3""3""3"##33##2##3"#2"##""3""2"#23322D4xxUU"233""3"##""3#"2##3"#2"ggEE"2#"2##3"#2"#3#"##33""3""333""##"2EE44"2"""""2#"""##"2"#2##"""""2##3""3""3""3""3""3333322#"eUhw#433""##"2##""####""3##244xg33"3""3"#3"#2"33""3##2##3334""4433VVEE"2"""""##""""""##""""##""##""""3""3""33""3""3""3""3332232D4whEE"2##3"##""##"2#"##"2#"2#VWVV""3""3""3#33""3"33####2#"333""##"2EE44"2"""""2#"""##"2"#2##"""""2##3""3""3""3""3""3333322#"eUhw#433""##"2##""####""3##244xg33"3""3"#3"#2"33""3##2##3334""4433VVEE"2"""""##""""""##""""##""##""""3""3""33""3""3""3""3332232D4whEE"2##3"##""##"2#"##"2#"2#VWVV""3""3""3#33""3"33####2#"3##""3"#3D4DE"""""""""""2#"2#"2""##"""3""3""3""3""3""3""33""33333322gfhw#4""####""##""3"##""3""333ggC42"#2"#2"#2##2#33""###3##2#343444UUEE""""""""""3""3""3""2"#2###"""2#"233#2"#2"#2"#33233322DDxxUU"#####""##""##"2##""3##2ffUU"3""3"33""3""333""##"2#""3##""3"#3D4DE"""""""""""2#"2#"2""##"""3""3""3""3""3""3""33""33333322gfhw#4""####""##""3"##""3""333ggC42"#2"#2"#2##2#33""###3##2#343444UUEE""""""""""3""3""3""2"#2###"""2#"233#2"#2"#2"#33233322DDxxUU"#####""##""##"2##""3##2ffUU"3""3"33""3""333""##"2#""3""##"2434DD5"""""""3""3""3"""##""3""2"#2"#2233#23333""33""33323333UDxxCD##""##"2####"#"2###""33gVD42"33#2"#2"#233""3"##33##2##33334ggDD"2"""""2"#2"#2"""""#2#"2""""3""333"3""33""332233333323C4xgEE#3"###"2##"#"2###""3""3UUVV""33""3""3##2#"233##33##"3""##"2434DD5"""""""3""3""3"""##""3""2"#2"#2233#23333""33""33323333UDxxCD##""##"2####"#"2###""33gVD42"33#2"#2"#233""3"##33##2##33334ggDD"2"""""2"#2"#2"""""#2#"2""""3""333"3""33""332233333323C4xgEE#3"###"2##"#"2###""3""3UUVV""33""3""3##2#"233##33##""##""3"334444"#""""""""2"#""""""3""3""3""3""3""3""3"33""3233""3"DDggE43""3##"#"##"2#"##"2##""gV44"3""3"33""3""333""3"##""##33##33VV4C""""""""3""""2""""##""""3""3""3""3""3"33""33""3223""33gfgf"""##"33"""#"2#####"UEEE"2#"33""33""3"23""3"""""##""3"334444"#""""""""2"#""""""3""3""3""3""3""3""3"33""3233""3"DDggE43""3##"#"##"2#"##"2##""gV44"3""3"33""3""333""3"##""##33##33VV4C""""""""3""""2""""##""""3""3""3""3""3"33""33""3223""33gfgf"""##"33"""#"2#####"UEEE"2#"33""33""3"23""3"""##343444VVVWVV33##333##3##DD5D43D433E534EE3444DD#3DD#4CD#4CD44UUEEUUffggfgEE##343433DD3D34E4DD3DVFgggxFVC4DD4433DD3DE4DDFVEEEE4434EEUU44ffVF33DD44##33#3##43E5CD44DD44DD4E44DD3DD34343D43343E5DEEEVVfffgVWff##3#DD##DD4ED3EE#3DDEEVWwhgg443434C444DD4ED3EE4EE4EE#3434344VVVWVV33##333##3##DD5D43D433E534EE3444DD#3DD#4CD#4CD44UUEEUUffggfgEE##343433DD3D34E4DD3DVFgggxFVC4DD4433DD3DE4DDFVEEEE4434EEUU44ffVF33DD44##33#3##43E5CD44DD44DD4E44DD3DD34343D43343E5DEEEVVfffgVWff##3#DD##DD4ED3EE#3DDEEVWwhgg443434C444DD4ED3EE4EE4EEggxxgxggxxggggwwffgxgggxfgggUUggVFffVFfgVFVVffggffggggxyxxggggwwxxgxw wx xxxwwggxxxxxygxx xxxxygggg xx xxxxgxwwffxxxxxyggxxxxxxˆ ˆ ‰ ™xx xxxyˆ ˆxxffggggggffgxggxxfgggfgUUVVFVVFfgVFVVffVWggggggxxxxggwwggwwwwgxˆ ˆx xggxxggx xxxxxxxgxxxgxggxxx xwwxxggwwgxgxxxgxgxxxxx ˆ‰ ‰ ™xxggxxgxggxxggggwwffgxgggxfgggUUggVFffVFfgVFVVffggffggggxyxxggggwwxxgxw wx xxxwwggxxxxxygxx xxxxygggg xx xxxxgxwwffxxxxxyggxxxxxxˆ ˆ ‰ ™xx xxxyˆ ˆxxffggggggffgxggxxfgggfgUUVVFVVFfgVFVVffVWggggggxxxxggwwggwwwwgxˆ ˆx xggxxggx xxxxxxxgxxxgxggxxx xwwxxggwwgxgxxxgxgxxxxx ˆ‰ ‰ ™xx""#2#"2#""33"""##33VU"""""""""""""2"""""22334433"333"3""3""3""3#3233333433"333333333##2#"233""3"##33"3VFCD""""3"""##"""33""#2#"2##""3""33""EE33""""2""#""""""""""3333DD""3#33#2"#2"##""3#324333333333333333##2###33""3"#3"#33D3EE33##"""""##"2""3"#"2#"2"33"""##33VU"""""""""""""2"""""22334433"333"3""3""3""3#3233333433"333333333##2#"233""3"##33"3VFCD""""3"""##"""33""#2#"2##""3""33""EE33""""2""#""""""""""3333DD""3#33#2"#2"##""3#324333333333333333##2###33""3"#3"#33D3EE33##"""""##"2"""!"""""!""""33UD""""""""!"!!#"""2UE##"2"#""""3""##"2"#2"#2"#2"#2"##""""##"3""2"##""ff34"#"""2""#""2"#""!""!""!"""EE#3"""""!"""!"""!""DC44"""""""2""#"3""2"#2"#2"#2"#2"##""3"""##""""3""EEVV""""#"#""""#"!""""!""""33UD""""""""!"!!#"""2UE##"2"#""""3""##"2"#2"#2"#2"#2"##""""##"3""2"##""ff34"#"""2""#""2"#""!""!""!"""EE#3"""""!"""!"""!""DC44"""""""2""#"3""2"#2"#2"#2"#2"##""3"""##""""3""EEVV""""#"#"""""""!"""!"""""33D3""""!"!""!"!"""""!""EE"2""""""""""2""""##""##""3""3""3"####""##""""2"#2WV44""2"#"""#"##"""""""!!"""""DD#3!"""!""""!"!"!"""DC4D""""""""2"#2#"2"#2""##""3""3""##""##"3"""2##""DDVV##""""""""!""""""""!"!""33D3""""!"!""!"!"""""!""EE"2""""""""""2""""##""##""3""3""3"####""##""""2"#2WV44""2"#"""#"##"""""""!!"""""DD#3!"""!""""!"!"!"""DC4D""""""""2"#2#"2"#2""##""3""3""##""##"3"""2##""DDVV##""""""""!""!""!!"!"""""33EE"""""""""""""!""""""EE"2""""""""""""##""""##""##"2"#2#"#2#""""""3""3VW33""""""""3""""""""!!"!""""EE#3""""""""""""!""""""DD33"""""""""""""3"""""##"""""##"2"##""""""##""""EEVF"!"""#"!!""""""!"""!""33EE"""""""""""""!""""""EE"2""""""""""""##""""##""##"2"#2#"#2#""""""3""3VW33""""""""3""""""""!!"!""""EE#3""""""""""""!""""""DD33"""""""""""""3"""""##"""""##"2"##""""""##""""EEVF"!"""#"!!""!"!"!""!""""""VV""""""""""""""!""""""DC"""""""!"""""""##""##"""2#"##"""""""3"""2#"2#UU34"""""""""""!"!"""!"""""EE34"""""""""""""""""""33##""""""""""""""2##""""#2#"2""#""""""#""2"""""DDVF!"""""""""""""""!!"!!"""2VF"""!""""""""""!""""""DC"""""""!"""""""##""##"""2#"##"""""""3"""2#"2#UU34"""""""""""!"!"""!"""""EE34"""""""""""""""""""33##""""""""""""""2##""""#2#"2""#""""""#""2"""""DDVF!"""""""""""!"!!"!"!"!""#ff"""""!"""""!""""!2"#3""""!!""#"""2""""3""3""3""3""3""3""3""3""""""2#"##"2VF3#"""""""""""!!""!""!""!""UU33""""!""""!"!""""!"""33""""""3""""""2#"2#"3#"3"""##"2#"2#"2""#"2"#2##44EE!""""""!"""""""""!""""#ff"""""!"""""!""""!2"#3""""!!""#"""2""""3""3""3""3""3""3""3""3""""""2#"##"2VF3#"""""""""""!!""!""!""!""UU33""""!""""!"!""""!"""33""""""3""""""2#"2#"3#"3"""##"2#"2#"2""#"2"#2##44EE!""""""!"######""3###""""#3VFDC##3"##33333433##33##3333E4EE33#3##"""##"""""###"""##"""2"#2##"########UU##""""""""""##"2####34""""##EEUU#4##"3"3333#333##3333##DD4E4433##"""""2""""###"##""##"""2##"########EEED##3334"""#######""3###""""#3VFDC##3"##33333433##33##3333E4EE33#3##"""##"""""###"""##"""2"#2##"########UU##""""""""""##"2####34""""##EEUU#4##"3"3333#333##3333##DD4E4433##"""""2""""###"##""##"""2##"########EEED##3334"""#UgWVggVEEUFfhwggw ‰wxxxxxxxxxxfEVUFfFVUWUVEUU5EUFfWggggVggFUEEEUggEEEVgVVEEUVgxgfxw‰wxxxwxxxxxgVEEVEVVVUWVUEUE5UUWVgggggVgggwEUU54CD4eg3#"33##33"33334333#"23##3333UgfUgfVfgggfUWfgUTD4TVTUUUUUUUD3"33gD3#3#33"#3"33333333#"33"3#33DgfVfUgffggffVg ™WTDDDUUUTUUUUV""""4g"""""2""""!"""""Dg3"2#"3"33333Vf""#"""""2"#2"#2"333VD"!""2"""""""""2hC"#""3"43333DyC"""#""2""2#"23"#"3W"""""""""""""""""Dg3"#"43333343gV"3#"#"2#""333333"33V5"!""""!""""""""3gD#"3"4333434Dx#2###"2#"2#3"33#"4f"""""""""""""""""2Dg33#3#3334333gg""#"#3#3"#3#3434344VD""!"""""""""""#"""#gE33"4#333343Ug4"#""###3"4#3333#Dg""""""""""""""#"""4V433#3#334434UV"#""###"433434343WE""""""""""""""""2WD43#33"44"44Dx#"""3##33#43#""Dg""""""!"""!""""3fD43#43434333EE"3"#"##333"#33gD"""!"""!""""""""VDD3343443343Dg"""#""3"33#3#4g4#"#"""!""""""##""##3EV3#333#3#3###fg#3#"""#""33#3#"#"4gV#"""""""""#""#"3##4f4##3433"4##2Dy233""#""#"#"#gUgUfgfEVVEEEUEfEUEUEEUVEfVfgggfgfffFVD4EEU4UVEVgxgVfUfgggxfxxxxgfggfgfVFVEDUEEVVEEEUEUUEVVUgxffgfVgfFDDEEEEDVEVgxgfVgUgggxfgxwh""3""3""2#""#DE33""33""3""33VD3"3#"3#3#333334D334DD343DDEU3D3DD3333""3""#""#3V33"3"3"3""3"3UD3333#"2##3#334343D34DD3DD3DV4C#"3"#""""#""#Dg3"3"3333#33"4fD#"#""##"""#"#"#"##2""###24D"#"#"#""2"""""#"3gD"3"3"43333##VE3##""#"#2##2#"#3#"""##"3D3"""""""#"2"#"3DF""33333333#43V33#"#"322#"#"##2#"#"#"#"34#24#"#"""""#""#""4V3"33333333433DU3#""##""""#""#"##2##"##"#34"4"#""""""#""#"EV3333333334#DE4"##""#""#"###"#"##"#""##"#3D3"#3##"""""""""#"g"#3333333#33#UD###"#"""#""##2##"##""3#"#"E3##""#""""3#4V3333DD3DD#334V3"#"#"32#"#"#"##""#"#"#"4E"#2#"#2""""""#""4V423D3DD333#34V4"#""#"#"#"#"##"###""""#"23E4""""""""""3"4V33#4DD433""#UD"#"#""3"##""#"#"#"3#"3"3V""3#"##"""""""##"f43334DD3433"U3#"#"#2#"22#"#"#"""#""#"2E4"3"##3#""3"3#3##EU""#"DE3VU###3""#3"####""""##334WD444343##3"#3""###3V3""#"#DD3g###3""#####"##"""3#3#4VV#443gfgUVxfEfUEEFVffEEU4EVfVxxggggfggfgggfVfV xggfgfVUgxgggxgggggggggxgfFTUFU3EEEEVVfV5UD5fFggxggggfgfgfgxVfgVwxfgVgVVfxxVggggggggggg33333xF"""""#3"#3333#33333#2"33"33"fxC$333"33#3"3DyUDC3D433333333"#2"#e#"#""#"3"#33#333333#2#"3"333D xf333333333333fgDD4D33D33333""3#"gC##""#"""3#""#3"#23#"#"""2#3"U xE""#""3#"2#"4g3"2##2"#3##"2#"2#3"43"2""##""#"#"3"#2##2#""3"23DxV"#2"#"#"2#3"WE"3"##"#"#3"#"3#""V3#"#""#"#"""#"2#""3#"""2#332"Ux4""3"#"2##""3x3"#3"#3"3"#3#"#3343E#""""#""#"2##"#""3"#"""3"33"3xE"3"#"#"2#""3gV""3"#23#"3#""#"3"DE"""2""#2""#"""3""3""3"33332Uy2###"#"#"#"#3xC#"2#"2#"#3#"2##344D"""""""2#""""#"2#"2#"2#33"32DxV2#"#"##"#3#UW"2"#3#"2##2""3#"#ED2""2#"2"""3""23"3"3""3233UgD#"#""#"#"2#3g33""3"#23"#3#"#3#33V""""""3"""""3"""3""33"3"3332DxE"#"2##""#"2#UV"2#"2#"3"#2#"#"2344""#"""3"""#""3323""33323323Cx4"#"##"#"##"#g323"3""33""3#"2##2#E#"""22##""""2#3"3"333"233"3gf3""##"#"3"#EV"23"3"3"3""###3#4WU#""####3##43#434##3##3#3D4DVFfE"###3#3##4EVgE3###4344444D##3#4EV32####3#43#D343##3##3343EUUVf###3##33##DVgV#3#433434434gxgxxwgwggggggfgfVfgfFfggfxxgwgxxx ˆ ™wggxxxgyxxxwˆ ‰ wxwgxxxxgxˆ™ ‰™ ‰ xxxxxwhgggggggfgUfgVVgfgfgxwggwxwx ™wxgxgxwxxxxg x ™ xwyfgxxxxxx™ ‰™33"#33"3"3DE3"2#"2#"2""33D33D3#333333D3D3D3D3333333#3DED3"33#3#33333#3"3333ED""3""3""3""D4D3343#3334CD33433D333#333333DED"#33#3#!#!""3U""!"!"""V#"""""2"2#"2#"#"#"#""#""g#""""""2""!""E3"""""""DE3"#2"2#"2#""#""#""""#TF"""""""!""""3E""""""!""E3""23""2#2"#2#""#"""#"gC""""#""""""""T#""!""!""D3"""""""#"2##"2#"#"#""""#3DV#"""""!""!"2U"""""""2"U"""""""#"#"""3#""#"""3#U4""""""""""""E3"!"""""""D4"""""""""#""""##""""""#"DV3"""""""!""3V""""""""""4"""""""2"#""""#"""#""""g3"#""""""!!"""U#"""""""""""3#"""!#""#""#"""""""""""2DF"!#""!"!!""2U""""""""!#"2""#""""2#"2#"2#"2#"""#"#"U#""""""""!!""DD""""""""3"""""2"""3""3""32"""#""34E!!"""##"#"#"!$VC##""33#""3"#D34#""""#""#"""""2##2#"4gE##"3""#3#3##"""EE#"""3"#"2#"24D#3##""#"""#"""#"""#""###EU#"3"#VggVggFfEUFgxggfh wxxxgwxxxxxfgUFVVFfVVVVVFVUEEUFgggggx ™ ‰hwxxgfggxywwyfVFUEVVgxgfg wxxxxwxxgxxxfVEVFVVVVWVVVVEUEFVgVghgggggggxEVUED"DDUg3"#"323""3#33"333"""33""#3"UgUUWUfUgfVfVffgTDEDDDDUTEUUTDUUDDfV""3##33""#"3333333"#"#3""3"3DgfUfUgUgVgfVUg ˆgDDDDDTUUTUUDV"#"3g"""""2"""""""""2Dg3"#2"#3"3343VV"""""22#"2#3""3"VU"!""2""""""""""2hD""3""3333"4DxE""#"""22#"2#3""#DV""""!""""""""""""Dg3"#"43433333gV#3"#"2##2"#33"#34"VV"""""""!""""""""3gD"#243343343Ug3"3"#"2#"2#3"#3#"Dg""""""""""""""""""Dg33"3#33344"4fg""#"##23"#2#334"43EV""""""""""""#""""gE33"4#"43343Ug4"#"3"#3"433"433#Dg""""""""""""""""""4VD343"43"4334fV"#"#"##3#3443433VU""""""""""""2"""#e443#3#433333Dx#"#""###4#333#""Dg"""""#"""""""""!"4UDD3343344433fV"3"#"33333#"3VF""!"""!""""""""!""VE34333344334Dg"#"#"!3"3333#EgD##"""""""3#3#####3#EV3#334"#33#"3gg##3"#""#"3DDEDEEDgg33###""""""#"###3#3#DV433343##3###Dx#"333#""#"33#fVUWUgVVFVU3VEVfVEEUUEEVEFffgwffgUfgfEED5UEEEVUFwxgfffUggxgf xx ˆxxxwgUggEVUFDDVUfVEEEEEUVEfVfgwgfgfWUfVEDD5UEEEVEgwggffUgfgxgg wxg""#"2#""2"#""DE#2"#23""32"#3VD"#3#"3"#3"#3#3343343D343D3DV43DD33""""#2"#""#"3U433""3""3"2##ED3#3#"3#"##333#D343343D4343DV42#""2##""""#""Dg"3"33"333#3"4f4###"#""#2##""#"##"#"3##"4D""#""##"#""""""#""g42"#3"333333#VE3#"#""#"#2##"#"##22##"#3D3"#""""""""#""3DF""3#333333#43VD"#""#"#"##""#"##2##""###"34#24""#""""""#""""#4W#2333#33334#3ED#3#""##"""#""#"2##"3"###"2433"#"""""""#"#""4V""3333334333DF33"#""#""#""#3#""##"""##""4424"#""#"""#""23g#"23#343333#3E333#2#""2##"#"###"""3#"#"E3##"""""""""""DV333DD3D3D#3#EE3##""#22#""#"###""#"#"#"4D3"##"#"2""""""3V4333DD3D33#3#V43""##2##""#"###23""##"3E3##"""""""""#"4f#3334D433#33E""#""2""#2"#"#""23""#"4E"#"32""""""""##3V34334DD43#"3#U3#""#""#""##""#2##"#""##"2E4"3"#3#3""33#3####EU"""EC4gE##3##"#""#3######"""3#344WE4434##""""""####Df3"#"4C3Eg######""3########"""##344UV4443gUgUVxgEfDEEEVUgEEEDEVgfwxgggffgfgfyfffgVxgfgfgfVgxgfhwhfggfggggUgUVVEED4EDVUEfUEUEEEVffgxggffffgfggxfVfVhwgfgfgFfxyUhwgggggggfg333#3xT"#""#2#"#333#33333""3"#"323U xD3#33#3#"3"34xUC43343333#33433fV"""""#!#"##333##33333"##"3""33Dwf3333#33"#333fgD3334333#333""3#"gE"""""#"#"#"2#"#2##2#"#"2#"3"UxD"#"2#""3#"#3g3"#2#"3"#3#3#3""EV"!#""#""#""#"2##3"3""#"""233Dxf"#"2##"3"#3"fE""33"##"3"#3"3#""ED2""2#"""#""#"2#3""#"2#"33"Uy3"#2#"#"#"3"3x3"#2#"3#"3#"#33"VE""""""""#"""2#""#2#"2#""3"33"3xE#2"##""#"2#"gF2"#3""33"#3""#"#"E4"""""""#"""#"""3""3""3"33322Vx3#"#"#"#"#"23hC"#3""3#"2####3DEV"""""#"""#""#"""3"3""3"33332DxE"22#""###""fV"3""3#"2###""3#"4CE2"""3"""#2"#2"#33"3"3"3233Vw4""#"#""##"23WD2#"2#"23"#"3"33WV""""""3""""""#22323""3"3323Dgf"##"##""#"2#VV"2#"2#"3"#2#"#"24D3"""#""""""""""3""33""33223#2DxC#"##""#"##"#g3"3"3""3""3""3""VF!"!""2"""""""23223""332232"3gg2#"#"#"#"##DV"2#33"32"##"##3#EVV#######D3#D#343434##34#4DDEUWfE####3D#D#3VVgE#3#43D#44DE343ExxC43#"####3#4D334434#4#3#34D4EUffV###3#D#3#DEFgV34#34344D4D3gxxxxggggxgwgfgVgFfggVfggfgxggwxwxx ˆxggxxxgxxxxw xˆ xxgwg xywx xx ™‰ ™ ‰ ™ ‰ ™ ‰xxgggxggfggfVfgFfVggfgywgwgxwx ˆxxgwxxxxxxxgx ˆw xxgxxx xxxx™ ‰y3"##3"#3"#3U""3"""2#"""33E33333"#3333D3333343333333333VD3""#33#3"#233""3#"3U3"#2"""#2"33DD333##323333D333333#32433333DED""3#3#3"""!""2E"""!""""U#""""""#2"#2"#"#"2#""#"#"f#""3""""""""2D#""""!"""D5!""#"3"#"#"""3""#""""##"DE""""""""!""!3E"""!""""""E""""""""#"#"#""#2"#2""#"g4"2"#""""!"!"E#""!""""""D3""""""""#""#"2##"#"#"#23DW2""""""""""2U""""!!""2E2""""""#""""#2#""#"""""3V4"2"""""!"!"E#"""!"""""!D4"""""""##""""#"#"#"""2DV#!"!"""!"""V"""""""!""D""!""""#""#"""#""""""#"e$"""""!""!!""U3!"""""!""33"""32"#232#""23""DV"""""!"!!"""V!"""""""!"3"""#"""""2#"2#"2#"2"""#"2V3"""""""!"""E3""!"""""""3"""222#"2#"2#"22#"""3"4E""""#"##"#""3V4#"3"33""3#3"ED3#"""#"#""##""#"2###"##3ED""""""""""UV"#"323##"3"#D443"""#""""3""#""#""####EU#"#""#VggVggVUEFfgxgfgxxxxxwxxxgw xgfVFVVfVWfWgVVVFVUFfgggxgggggFf5gfVFVUEVfgUUEUUggxfggwxxwxwwwxgwxfVVVFffFgfgVVVVFUUFgggxggggxgg xVUVVD"33Dx"3""3#""""3"#2##3""""3#"#""3UgUVUUUWUfUWUUfgDDD3DTDTDUUUUfUDDUfE""#3"""""3""333#"3#""3"""3""DgfTUUUWUgUWUUg ‰eDD4CDDDTDUUDD32Df"#""!2"""""#"""""Dg3"#2"#333333VV3#""""#2"#2"#2"#2"D#""""!2""!""""""2hC"#2"#243333Dy4"""""22#"2#3#"#3W#"!""#"""""""""""Dg3"#3"4333434fV#3"#"22"#23333434D3"""""""""""""""""3gD##24"433343Ug4"#2#""3#"24"33#"DF3"""""""""""""#!""Dg333#34"33433gg""#"##24#3"#343444D3""""""""""""""#""3gE333#3433343Ug3#""##3#"33#3333#Dg3""""""""""""""23g34"4#3433434UV"""#2#"#3444D43E4"""!"""""""""""2"WD433"4"43434Dx#"#""2##3##D3#""Dg"""""#""""""""""Cf443334343433EE""#""""##D34343ED!"!"""""!""#""""VD34434343443Dg"""#"""3"333#3EgE##2#""""3"23###3#334UF3##33433###"gg23###"#3"43DEDEDEgV33###3"""#"""###3##3#43EVE3#33#33##2#Dy#"34"##3""3433ffVUUgUEVUEEEDVgEVDEEVDVUFefggfgVfUgVUD4VEEEVFEVxgwgfgUxgxgxgxwxgggffffEfUEE3VEgVEU4EVEUVDgVfxffffUgUVDEEEEEUFEVgxggffVfhwhwhwgg2""#2""""#"DE3""3""3""3""3VD3#"3"#"#"2##33334333343433DE333"#2""#""#"#""#"3V32#"2#"2#"2#"UD3#"#"2#"2##3#33343333443334UD"#""""##"""#"2Dg#23"3"3333##3g4"##"##""#"#"#"#"##2#"#"#24D"4"#"2#2""2""33fD#23"33333#3#VE3"##""#22#"#"#"#"#"3##"2D#2""""#""2"#"3EV23333333343#VD"#"#2"#2#"##2##"##""##"#34#2##"#""""""#"""#3W"#333"3333343ED##2##""####""#"#3##""##"#2D#24""2"2#""##DE""3333333#333E4"#""#""#"##"#"#"##"""#"#"3424#"#2#"""""233W#2"33333334#"UD#"22322#"#"##3#""##"33D#4"""""#""2""4V333DD3DD43#33E3"##""233"#"###""""##"#3E3"###"#""""#"#""#VD333D3DD333#4V3###""#"3####""###""#"#"#"E42""""""""#"4V33#34D4332ED##""#""""#2"#"#"""#""##""4V""#"##"""""""""""4EE3#34C434""#3U3"#""#""223""##""#"#""#3E4"2"#333"#333####3UE"#"#DU5gU##3###2#C##3####"#"33444VE4DE#3##"#""###3#3g3""##DU4DV##3#3#"2"##3#####233#343VF444DgUgUVxgDVDUEEfVUEUEEUVffhwfgfffgfgU xgfgffxgfWfgUfgxxggggggggggfgfVVgEEEUEFfEEVVUVEUVDVfWfxgfggfgfgfgyfgfVwxfgfgfVfxyggxgggggfggg3"3"3xU2"#2#"23#3#"33333"#"2#"23"U xE"#2##2"#3""4ˆDD333333"33#33"Dg"#"2##""#"2#"#3#"3#333"#"#"2#"33‡F3#"3"#2"#"33VgD333D#3"33"3""3#3VD"#""""3#"#""#3"4"#2#""#"#233UxC#"3""3#"#"43g3#"3#"3#3"##3""DV#""#"""#""#"#"2##3"#3#"2#"""2333xf"#"#2##"#2"#gE"2#"#3"#3#"2"3#""ED""""""#"""#""#"2#"3"#"2#"32#Ux#2#"#"#"#"33‰3""3#"23#"#3"#"EV"""#!#""#""""#""#"23""3#""332"DxE"#2#""#"#"3"fV""3#"33""3##"3#"#E4#"""""3""#""#"""33""3""33232gg3##"#"#""#"23x4""3"3""3#"#3##DV""""""""3"#"""##"2#"3""3"23#32DxE""#"#"#"#"2#fV""3""3""3##""3#""ED"""22#""""3""3"33"3"3"3332Ux4""#""##"#"33g323""3"3""#3"#2Eg""""2"#""""""2#""323"3"3"323Dgf"#"#""##"#"2VV"2#"3""3"#2##"""4DD""""""3"#"""3"3""3"3"32#"DxD"##""#""##"2V4"#23""33""3#""Dg"""""""2""""#"""3"23""3"3232"3gV"#"#"##""#2EE"23""33"3""#343EVV######3D#4C4D434D#D#3434DEUVWfE###3DD#D3DFfgE3434C$4DE4EEEEfyC44D####3#4C43434D4434#343D4EEUgfV##4#3D#3D35fgg#4343E#E4EE3gxxgxxgggwgwggfWVfVffFfggfgxxgwwxg ˆwxgxxxxgyxxwg x ™xgwgxxxxwywš ‰ ™x ‰ ™ ‰wxgwggwggfgVfVVgfVFfggwxgxwgwwx ˆxxgwxxgy xxygw ˆxwxgxxxxxxw ™ ‰x""3"#"2#"33V""""""""#""234333#3"#3"433333333"3#"3#3333EE2""##33""3"#2#"2##DD""2222#D3D#3#33#3"4333333333"#33#3"#3DE3""#2#""""""""3E""!"!"!#"U"#""""#"2#"2#""""3#"2##"g3""22"""!"""D#""!"""""D4""""2"""#"2#"""#"223""TE"""""""""""3D"""!""!!"E"""""""#2""#"#""3"##""#"""#f42""#"!"""!""E#""!""""""DD"2"""#""#"#""3"#""#"""#"DV"""#"""""!""3E""!"""!"""E"""""22##""""#""""""3"W3"""""""""!""E#""""!""3D3""""2"#"#"""#"""""""#CV"""!!""!"""V"""""""!#!"D""""""""#"""""#"""#"""#2U4""""""""""""U3""""""""""33""!""""#"""""#"""2""2#4V"""""""!""!#U""""""""""3"""32"""3""3""3""32"""#"V3"""!""!""!"U3""""""""!##"!"2"""3""3""3""""""""3#3E"""!##334#####4gE""#"2##"#""#ED##3"32"###"##"#"43#34#4VE##3#3##4##2#44####3VF3#""#"#"""#"4U3#3#2"#"""##"#3"#"4#34#3VV#3##3###fggggxgFEVggwgfUgxwgxfxgwggwgfEfVFfWggVgWVgVFVVggxgxgxgxxgxxyxyxggggWVgVEVVghggfggwxgxggwgggxgDfFVVgggggVWVgVVFgggxgygggyxgygggg3"33Eg""""""""23""3""3""3"""#"2UgFTUFUUVUWUVUWVT44DD3DDDDDDDDDEDV3#""""#""2"""""3""3#"3"""""#3xVDUTVVUUWUUUW ˆgD334DDDDDTDDD3#"4W"""""2"""""""#!"3Cg#2#""3333333gf#""""""22#"2#3"#34""#"!""2""""!""""2hD""3""4"3433UgD""#""""""#2"#3#""DF3""""""""""""""""Dg3"#243#34343fV#"3#""#""3""4"33"#D2"""""""""""""""""3gD"##"4333434Dx#2#"##2#"24""43#"Dg""""""""""""2"""Dg433"4#333343gV"#""##3#"3#"4434"4D2""""##"""3""3""""hE24"#4"3344"Uy3"#"2###3"43"4332Dg""""""""""""""""#3W3334#"433433VV"""#"##2##344#DE""""""""""""""""""g4C43"4#33434Dg#2""#""#D##D33#Dg"""!""!"!"""#!!"4V3D3433443343U5""#""""#3#3333DE""""!""""#"""""""VD43434433443Dg##"#""3"#33#4EgE3###"#"""3""#"3##3#3#4C4VFD333#3#3#3##xg3#3##3#"3DD#EEDEggED34###2""2#"##33#33#E3EVE##343"434##Cy3"34#"##3#3334ffVUVfV4fEEEDEEgVEEDEUVDEVfUghffVVfUfEEDEEEUVFVUgwgggfffgwxgxxxfhfVffgVEEVUDDUEfVVEDVEEUTEVfgggfVfVUgTE4EUEEEEVVggwggfUggxgxg wxg#""""#""#"""DU"3""3""3""3"4V33#3#"#"#""3#"33333333343334E3"33#"""""2#"""#""3V3""3""3""3""3UD3#3#"#"#"2##3#3333333433334V3""""2#2""""""#DV4""33#33333#3g3#332#2#"2#"##2#"2###"3423##"2#"#""""""33VD"3"33333#33#VD3##"##""#"##"#"##2#""##"3D3"#"""""2""##"EE"2333333333#3VD"#""#""#"#"#"#"##23###"#"443"3##2##"""3""##3V#"33333333333EE#2#""""##"#"#"#"#"##"##"#2D#2##""""""""#"""DV"23333333#434V3#"##""2#"##"#"###"#"##"#3E#"#"3#""#""""2##g#23"3333333#3VD####""23##"#"##3#2###"2E#2#"""""""2"#DV33D3DD3DD#3#DE#"#"2""##""##"###""#""#"#"3E"4#"#2"""""#""2#VD33DD3DD34#3#V33#"#2#"""##"#"##""""#"#3E4"""""""""""#"4V33##4D333#"DE"#""2#"""#"#"#"#"""2#""4f#"2#"#"#"2"""#""3V43"#44433"""#V2#"""#"""#2"#"#"#"""#"#"2E4"3"3#3D33333#3#4UE""##"#UE5UV3##33##"#33##3###3#####344ChE4E44443##3"###3##EgD""#3DV4EfD#3##33#3#3##3#####333444UWD4E4gUgUVwgDVDEUEUVUEEEEEfVggwfUgUggfgfgxffgfggggfgfVg xxggxggggfgggfVgVfxU4EDUDEEEfUV3VEEVUgggfVgUfgfgfgyfgfVgxgfgfgVf xxggxggggfgfgf"3""3xU2""#"2###33#3#"32#"""3""3"Uy4"3""3""#"2#3xD3333333#3#"33"33gD!#"""2"#"2#3#"#3"33#"#""#"2#DxV"#23""#"2#"3VfD333333#"3"3"3#3"W4""#"""##"#""#"3"#3#"2#""#233U xC"#"#2#""#"2Dg#3""3#"#3#"#"2333V4"""#"""##"2#"2#3#"3"##"22"32DxU"3""#"32##2gE""3#"2###3"""3"#"E4"#"""""#"""#"""3"#2"#2"#332"Vw#3"#"#"##"3"4x3""3#"23"#2#33"43VE""""#"""#""#"#"""3"3""3""3322DhE"3"#"#"2#""3VV""3"#3""3##""#"2#DE""""""2#""#"""3""3""3"3"3332gg3###"#""#"2#3gD""3""3#3"##3"434UE"""2"#2"""#"#"""#32"#2"3332DxU"##"#"#"#"3"fU"3"3""33"#"2"3#"4C5"""""3"""#"22#"23#33"3"3233UxC#"#"##""##"3g333""3"3""#3#"333gD""""2"#2"""#"""2#3"23"323332DgE#2#"#""##"2#UV"3""3#"23#3#"#""344""2"2"""2#"2#"2#"23"23""DgE""#""#"2#"#"g4""33""33""#"#3#3VD""""""""""#"""3""3""3"3"23"3gf2#3"""###"EE"23"3""3""##344VVV3#3#3#DE#D3E#E34D3D#D3D4UEUfgfE#343DD#ED3VghVCD43DD4DVEE43EU4fV3D4#3#345C4D4DE4D3D34C$3EEEVffWf##D#DE3E3DEVxg434D4D4DE4EEgxggxggwfgghfgUgVfFfVVfgfggxxggwxg wxxwgxxxh xxxgg xxxgwfxxxgxxxˆ ‰x xxˆxfgggfggxfggUVVFfVVfVgggxxgwgwwg ˆxgxg xxxxgxwgxxwxgwgxxgxxx ˆ ‰x""#"23"33U"""""""""""2343"33""3"#23333#3333#"23""#3"VD"2"#""3""#"#"23"E3""""""""""33D"#32#"#"3243333333#"#3""3#3D43#"""#""""""!"3U"""""#""U#""""3#"""3""3"#""#""#"#"f33""#""""""!""E#""""""""D4""""""#""#"2#"2##"2"#""3EV""""""!""""3D""!"!""""E"""""""""#"#""3""##"#""3"W4"""""##"3!"!"D#"""""""#"D3""""322#"#""3"#"#""""#"DV#""""""""!""3E""""""""""E"""""""#""#"#"""#"#"""2#V3"""""""""!!""E#""""""!"""D3"""""""""#"""#""#"""#""EV!"#""!""""""V"!"""""!"""D"""""""#"#""""#"""2"3"U4""""""!""!"E3""!#""""""3#""!""""#"""#""""""#""""DV""2"""!"!""f!"""""""!##"""""""""2#"2#"2#"2#""""2#"V#"""""""""""""U3""!"""""!#3#!"2""""#2#"""#"2#"""""##4E!""""###"##""#VD#"#3333#3#33E433#"#"""#""#"2"#"####U#""""2#"##3#!#EU3#233#3#33#DE43#""2""##"#""#"####EE#33"#EUg4DEEEUVUVUUEDDVVVVfFVfVUVVUUVD4VE4DEEUVUUVUU4DVVVVfFVgfVUVfUE""E"""""""""V"3#333V"#"""3#2#D3"""""""E3#2333V3"#"2#23"U"""""""""U4#3334V"#"##3443E3""""""""E43#334V3""##33#"V#"""""""#U33433#V"#"""#3##U4"""""""#"E43343#V"#"""#"DDE4D34UD44DDDVUDE43D4EDVEUUVUVfEUD4D43ED4D4DDVUEDD444DEUUEUUVUE"#"""#E"3333#E3#"#""#"##"##33#"#""""#"E3"333#D4#"#""#"#"#"#"4""""""#"E333343E3"#""##"#""#"34#"#""""#D#3333353#""#"##"#""#"E"""#"""#"E3"#3#3U#"#"#"##""##3E#3##"""##D3##3#3D##"""#"#""##3E3#EDVED35DD4DEUEEDUUfEEUEDEwEVUEUEED3U#44DD4DEUEEDEUgEUEEDEwUVEUEU"3D3"""#"#"3#""3"DV""#2#3E2##2##2#34"""#"#"3"#"2#3g"#"3"#V"3"#3""#34""""""#2#2#23DV"#"#"3V""3"#3"#4D""""""#"2#2#33g""#"#2V"2#2#"#344""#3"#33#3#33EV"##3#4U#3#334"335""####33#3#33Df#"#3#3V3#333#UEUUEVEDDEDEUUVUVfUUVVUVVUUfUUVfVUVEUUEDEDDEUVUUUVfUVVUVVUUVVUVf"""D""""4"""""#""#"#""U""""""3#"""3#"""""#"2#"""#U""""""D"""""3"""""""#""""#E"""""""3#""""""#"""""#""#""""E"""""""D""""""3#"""""#""#""##U""#"""34"""""3#"""""#"""#""#E"""EUg4DEEDUVUUEUE4DVVVVfUVgVVgffVffVfD4EEDUUVUEUED4VVfVVVVgfVUVfUE""U"""""""""V"3#333W"""#"3"3#U""""""""E3#3333f3"#""3"3V"""""""""U4#3343V#"#"#3343V""""""""E43#333V3"###333#V#""""""#"#E33343#f3""#3443g"""""""#"#D433#43V"#"#"#"DDD443DED4D4DDVDEED444DEUUEUUVVfUED4D43UD44DDDVUEDD44D4EUEUEUVUE""""#"U#2333#E3#"#"#"##"#"#33#"#"""""#E3"333#D4"#""#"#"#"#"#33""""#"E"3D333E3#""#"#"#""#"34#"#""""#D33343343#"#""#"##""#"D#"#""#"#U#"##33E#"#""#"##""##3E3##"""##E3"#3#3E#"#""##"#"#"#3E3#EDVED34DD4DEUEDEDVfEEEDEEwUUEUEEEUE334D4D4DEUEDDEUgDEEDEDxEUEUEE"343""#"#"#2#"#23DV"#"3"3V"#2##3#D3"2"#"#"3"#2"33g"#"#2#V"3"#2#"#34"""""#"2#2#32DV"#"#"3U"3"3"#3E4"""""#"""3"3"33g""#"#"V2#"3#"#3D4"#"3##33#3#3DDV"#33#DF3#33333EE"#"##2#33#3#34Df##3#34V#3#33#UEUEEeEDDEDEUUEUUVUUVVUUVUUVUUVfVfUEEVDEDDDEEVUEUVUUVUVUVUUVUUVV"""4"""""3#""""#"#""#"#U""""""3""""""#3""""#""3"""#E"""""!""4""""""3"""""#""""""#E"""""32""""""#""""""#""""""E"""""""D#"""""3#"""""#"""#"#"E"""""34"""""3#"""""#""#""#"E#"EEfD4EDEUUUUEUD4DVVVVVVVgUVUVEfUUEf4DDEDEUUUUEDD4VfVVVVUhfUVVfUU#"U""""""""V#2#333V#""#2#2#33"""""""""E3#2333V3#""#2#3U"""""""""U33#343V"#"##3444D""""""""E43#334V3"###333#V#""""""#"#"#U4334#3V"#"#"3D4DE#""""""""#"#E43343#V"##""#3DDD4343V43D4DDVEDD4444DEUUEUUVUEEDD4D34ED34D4DUUDDD344DEUUEEUVUE""""#"V"3333#E3#"#"#"##"#"#33#"#"""""#E33"33344#"#"#"#"#"##"D"""""#"E234333D##""#"#"##""#34##""""#"E33333443#""#"#"##""##D""#""###U#"#3#4U##"#"####""#34E33#"""#"E3##3#3E##"#"##"##""#3E3#EDVE34DD4D4UEDDEDUgDEEDDEwEUEUEEDV444D4D4D4EUDEDEUgEEDEDEgUUEUEE"#D3""""#"#2#"#"3DV"#"3"3V"#2##3"U"""#"""#"3#2#"33g"#"#2#V"3"#3""343"""""#"2#2#23DV"#""#3U#"3"#2#V""""#"""#2#2333g""#"#"V2"3"#"#3E4"#"3#3#33#33DEU##3334V#333443g#3"##3"3333#334Dg##3#34V3#334#EUEEUVDDD4DEUUEUUUUVUVUEVUUVUUVVUVUEEUEDD5DDEVUUUUVUUVUEUUUVUUUV"""3"""""3#""""#""3""#"E""""""3"""""3#"""""#""#""#"E"""!""D""""""3"""""""#"""""E""""""3#"""""#""""#""""""""E""""#"""E#"""""3#""""#"#"#2#3#E"#"#""#""43"""""#3""""#"#"#"#3#E"#"#EUg4DDEDEUEEDUD4DVfVVVVVgVVUVffVVVD5DDEDEUEEEDED4VVfVVVVwWUVfVVU3"E"""""""""U#2#333g"#"""#2#3#""""""""""E3#2343V3"#""3"#"V"""""""""U43#333W""##"#3433""""""""ED#3#34V3"#"#333#V3""#""""#"#"3E433$33V"###"344ED#"#""""#"#"3E43343#f##"#"#3D4D3443U43D4DDVEDD434D4DUEUDVVUEDDE4434UD34D3EUUD4D444DDEUEEUVUD"""#"U#2#333E3#"#"#"##"#"#33##2#"""#D3#33334D"#""#"#"##"#"D"#""""#"E243333E#"#"#"#"##"#"34##""""#"E333433E3#""#"#"##""#"E""#"#2##E#"3#43E#3#"3###"##33E433#""###E3"##34E3##"#"####"#3#U3#EDVD443D44DEUDDEDUgDEEDDEgUEUEEDEDV3434D44DDEDDEDEgEDEEDDgUUEEDE"343"""#"#"3"#2#2DV"#"#"3V"#2##2#3U""""#""#2#"3"33f#"#"3"V"#2#3"#"43"""2#""2#2#23DV"#"#"3U#"3"#3#3U"""""#"""3"3233g"#"#"#e#2#2#"#3E4#"3#33333334DEV"3333EV33334434U##2#3#33333#4DDg"#3334V333343EEETEVDD4D4DUUEUEUUUVUVDUEUfEEUUVUDEEUED4D4DEUVDUUEUVUUEUUEVUEUV"""C""""3#"""#""3"#""#E"""#"""3#"!""3#""""#""#"#""#U""""""4""""""3"""""#""""""#D"""""!"3#"""""#"""""#"""""#"E"""""""D#""3""43"""""#""""#"#D""""""43""#""33#""""#""#""#"E3"4D#4D343EDDEU4DD3E#3D434DDEDV4DD"D""""43334#"335""""4333E"##33#D343E33344DDD43#D343E333444D4""#4#334"#"#"#4#"#"43334"#"#"#4"4D33344CDE43U4D43D#33443DU43U4D4"4""#2#33D##D#3#34""#2#33E"#D#3#43D333D4D4DD4EC4D44333D4DD4D4ED4"3"""#"""""#4"""#"""#"""""#3"4D343433EDDEUDDDED#43433DEDEV4DD#D""""4333E"#344"""""4333E"##33#D334D433444DD43#D343E333444D4""#4#334"#"#"#43"""43334"#"#"#4"4D333443DE4CED44D3#33443DU43U4D4"4"#"3#3D4#3D#3#D3"#"3#33E"#E2#343D333D44DD4DE4D43D333D44DD4DE3D""#"""3""#""4""""#""3"""#"4"4D#34343DEDEU4DD4D#34343DDEDV4DD#D""""43344"#343"""""4334D#"33#3D334E333444DD43#D334D43#4D4D4""#4"344"#"#"#43"#33334#"#"#"4#4D333443DE34U4D4D3#33434DU43U4D4"4"#2#33D4#3D#33E""#"3#33E#3D#3#43D333D44D4D4E3D43D33#D44D4D4D4D""3"""#"""#"#4""""#"""#"""#""4""4D#34333EDEDV4DDE3#33433DEDEV4DD#D"""""4333E"#343"""""4334D#"33#34334E333444DD3#34334E33#344D4""#43334#"##"#D##""43334#"##"#434D#33434DE34U4D34D#33343DU43ED43"4"3"333D43#E33334"3#3333E#3E"3343D#33D34D4D4D4433433#D34D4D4D44"3"""#"""#""4"""#"""3"""#""4"4"3#D4D34#3#D4D3"4343#3433343#344333D3D34#33D3D3#3"33343#3"333434"3#D4D4D"#34D43"4343#34#3343#344333D3D34#33D343#3#33343#3"333434"3#D4D34#3#D4D3#3343#34#3343#343333D3443333D343#3"33343#3"333434"3#D4D43##34D43#3343#3433343#343333D3D44233D3D3#3"3334#33"3334##33433343334333433343334#3343334333433343334333433433343#334333433343334#334333433333 \ No newline at end of file diff --git a/glide2x/h3/glide/tests/argb8332.3df b/glide2x/h3/glide/tests/argb8332.3df deleted file mode 100644 index 7db16f7..0000000 Binary files a/glide2x/h3/glide/tests/argb8332.3df and /dev/null differ diff --git a/glide2x/h3/glide/tests/argb8888.3df b/glide2x/h3/glide/tests/argb8888.3df deleted file mode 100644 index a6a47df..0000000 Binary files a/glide2x/h3/glide/tests/argb8888.3df and /dev/null differ diff --git a/glide2x/h3/glide/tests/ayiq.3df b/glide2x/h3/glide/tests/ayiq.3df deleted file mode 100644 index a6aac0d..0000000 Binary files a/glide2x/h3/glide/tests/ayiq.3df and /dev/null differ diff --git a/glide2x/h3/glide/tests/cmp.bat b/glide2x/h3/glide/tests/cmp.bat deleted file mode 100644 index 7b481d9..0000000 --- a/glide2x/h3/glide/tests/cmp.bat +++ /dev/null @@ -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 diff --git a/glide2x/h3/glide/tests/decal1.3df b/glide2x/h3/glide/tests/decal1.3df deleted file mode 100644 index f999d3f..0000000 Binary files a/glide2x/h3/glide/tests/decal1.3df and /dev/null differ diff --git a/glide2x/h3/glide/tests/display.c b/glide2x/h3/glide/tests/display.c deleted file mode 100644 index 3862bbe..0000000 --- a/glide2x/h3/glide/tests/display.c +++ /dev/null @@ -1,442 +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 -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#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 -r -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 " -}; - - -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; - - static void imageConvert( void *dst, - void *src, - GrLfbSrcFmt_t format, - FxU32 *bpp ); - - 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; -} - - - diff --git a/glide2x/h3/glide/tests/h3dtst01.c b/glide2x/h3/glide/tests/h3dtst01.c deleted file mode 100644 index 066b624..0000000 --- a/glide2x/h3/glide/tests/h3dtst01.c +++ /dev/null @@ -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 -#endif - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include - -#include -#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); -} - diff --git a/glide2x/h3/glide/tests/h3dtst02.c b/glide2x/h3/glide/tests/h3dtst02.c deleted file mode 100644 index f8bbbe3..0000000 --- a/glide2x/h3/glide/tests/h3dtst02.c +++ /dev/null @@ -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 -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#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 -r "; - -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); -} - - - - diff --git a/glide2x/h3/glide/tests/lava.3df b/glide2x/h3/glide/tests/lava.3df deleted file mode 100644 index f6aef2e..0000000 Binary files a/glide2x/h3/glide/tests/lava.3df and /dev/null differ diff --git a/glide2x/h3/glide/tests/light.3df b/glide2x/h3/glide/tests/light.3df deleted file mode 100644 index aef8c8b..0000000 --- a/glide2x/h3/glide/tests/light.3df +++ /dev/null @@ -1,5 +0,0 @@ -3df v1.1 -rgb565 -lod range: 1 64 -aspect ratio: 1 1 -9çAèB(B(JIJiJiJiJiZËZËRªRŠJIB(B9çBBB9Ç9Ç1¦1¦9ÇB9ç9Ç9çJIRŠRªZËZËZËRªJIBB(B9Ç1¦9Ç9ç9ç9Ç9ç9Ç9çBJIJiRŠRªZËRªRªZËc [ ZËRªJiJiAèB(B(JIJIJiJiRjJiRªRŠRªRªRŠRŠRŠJiJiJIB(J)9ç9Ç9ÇBB(BB(JiZëk-kmkmc,ZëZËRŠJiJIB9Ç1Æ9§9Ç9Ç9Ç:Aè9çB(JIJiJiRjRŠRŠRŠRŠRŠRŠRŠRŠJiJiBB(B(B(B(B(JIJIJIJiJiRjJiRŠJiRŠRŠJIBBBB9ç9çAèB(JIJiZËc,kms®s®kMc c ZËRŠJIB9Ç1¦1¦1†1†1¦9§1¦AèBBBBB(B(J)B(B(BB(JIB(J)JIBB9çB9Ç9Ç9çBB(B(J)BBJIJIJIB(Aè1Æ9§9ç1¦9Ç9Ç9çJIJiZËc kMkm{Ï{ïsŽkmkMc,ZËJiB9Ç1¦1f)…1f)E)e)e1†9Ç1¦1†1¦Aè9çAè9Ç1¦1†9Ç9çAè:B1¦9Ç9Ç9Ç1¦1†1¦1¦9çBB9Ç1¦AèB9ç9§)e)E)e1f)e)e1†9çJiZ«Zëc c,km{Ï{ïsŽsŽsŽkMZëRªB(9§)e1f!$!$!!$)%)E)E!$!)%1¦9ç9§1†!$)%)E1¦9Ç1¦1¦1†1†1†1†1†)e)E)E1†9Ç9Ç1†)…1†1†)e)E!$!$)%)E!$)E1†BRŠZËZëc c,sŽ„„s®sŽsŽkMZëRŠB(9§)e!$!$!!!!$!$!!!!)e1¦1†)E!!!$1†1†1†)e1†)E)E)E)E)E!$!)E)e1f)e1f)E!D!$!!$)%)E)E!$)e1†B(RŠZëk-kmkm„œÓ”’{ïsŽs®s®c,RŠJI9Ç)e!!!$!!$)%!$!!!!)E)e)E!!!!$1f)e1f)e!$!$!!$!!ã!!!!$)%!$!$!!ã!!$)E)e)E)E1†BRªc,sns®{ÏŒq¥4¥4Œq{ï„0„0s®ZëJI9ç)e!$!!!!!$)%!!!!!!$!ã ä!)E)e)E)e)E!ã!!ã äãã äã äã äãã äãã!!$)E)E!$1†JIZëkmsŽkm{Ï”’¥¥4”’„0ŒQ”’ŒQs®ZËB)e!$ äã ä!!$! ä äã äã äãã ä!$)%)E)E!$ã äãã äãã äãã äãã äãã äãã!!!!1¦Jic kmsŽsŽ{­u­U”ÒŒ1„0Œq”²ŒqkmJI1†!ãã äã!ã äãã äãã äãã äã!!$!$!ã äãã äãã äãã äãã äãã äãã äãã!9§ZËkmsŽs®„”²µ–ƾ­uŒq„„0œÓœÓ{ÏJi1f!ãã äã äãã äãã äãã äãã äã!!!ã äãã äãã äãã äãã äãã äãã äãã!9Çc,ƒð{Ï„0¥µÖÆ8ÎYÎy½×œÓ„0„0”²”’sŽJI1†!ãã äã äã äãã äãã äãã äãã!ã äã äãã äãã äãã äãã äãã äãã äãã!$J)sŽ„0ŒQ¥½÷Æ8Æ8ÎyÎYÆ8µv”²ŒQŒqŒQs®Ji1†)Eã äã!!ã äãã äãã äãã äã äã äãã äãã äãã äãã äãã äãã äãã äãã)EJIc s®ŒQ­uÆÆ8½÷½÷Æ8ÎyÎYµ–”²Œq”’{ïRª9§)Eã ä!!$!ãã äãã äãã äãã äã!ã äã äãã äãã äãã äãã äãã äãã äãã)%9ÇJic „0­uÆÆµ¶­u½×ÎYÎyÆ”²œ³„0ZË9Ç!$!!!!$!ãã äã äãã äãã äãã äããã äãã äãã äãã äãã äãã äãã äãã!9ÇJIc „¥4½÷ƾ½·µÖÆÎY¾­U¥4­UŒ‘c 9Ç)E!ã ä!!ã äã!!!ã äãã äãã äããã äãã äãã äãã äãã äãã äãã äãã!9çZË{ÏŒq­U¾ÎYÎyÖšÆXƽ÷½×µ¶½×µÖœÓc,B)eã äãã äã äãã äã!$!ã äãã äãã äã äãã äãã äãã äãã äãã äãã äãã!BkM”’¥T½÷Æ8ÎYÖšÖÚÖºÆ8µ¶µ¶½×½÷½×œósŽJI1†ãã äãã äãã äãã!!ã äãã äãã äã äãã äãã äãã äãã äãã äãã äãã)%BkM”’µ–ÆÆXÎYΙֺֺÆ8µ¶µ–µ–µ¶­UŒ‘s®RŠ1†ãã äãã äã äãã ä!! äãã äã äã äãã äãã äãã äãã äãã äãã äãã!$9ÇZëŒ1¥T½÷ÆÎYΙֺÎy½÷½×µ¶­uœó”²„0kmRŠ)e!!!!!!$!)%!$!$!$!$!$!$!!$!$!!$!$)%ã äãã äãã äãã äãã äãã äãã äãã!1¦RŠ„¥µ–µÖ½÷ÎYÎyÎY½÷½÷Æ­•”²ŒQ|s®bì9Ç)E)E)e1¦1†1†1†1¦1¦1†1¦9§1†)…1†1¦1†1†1†)e1f ä!!!!!)E!$!!!!$)%!$)E)E)e)%!!$)E1†1†1¦ZëŒQ­U­•­uµ¶Æ8֚ΙÎYÎYÆXµ¶œó”’”’”²„0ZëB9çB(J)BBBJiRŠRªZËZËRªJIB(BB(B9ç9ç9Ç!$)E)e)E1†9ÇB(B(Aè9Ç1¦J)B(JIJiRªRŠB9Ç9çJIRŠRªc s®œó½×µ¶¥4­uÎyÖºÞÛÖºÖšÆX½÷½×µ–µ–­u¥4„0c c kmkmZëZËZËc,s®ŒQ”’ŒQ„s®sŽkMc RªRªZ«ZË9çBB(JIRŠZëc,kMkMc c s®„s®kms®{Ï{ïs®s®{¯„ŒQ„0œÓµ–½÷µ¶­U½×ΙÞÛÞûÞÛÖºÆ8Æ8ÎYÎyÆ8µ¶¥ŒQ{ïŒqœó”’{ïsŽs®„0¥­uµ¶­Uœó”²œÓ”²Œq„0s®{Ï{ÏRŠZëc,kMs®{Ï{Ï{Ï„|ŒQœÓœÓŒQ{Ï„0œÓ¥4¥4œÓ”’œÓœó¥4µ¶Æ½÷µ¶½×Æ8ÖºÞÛÞÛÖÚÖºÎyÎyÖšÖºÎyµ¶”²Œq¥µ¶½×¥4”’ŒqŒq¥µ¶Æ½÷½×¥T¥¥4­u­u¥4”²ŒQŒQc,sŽ{ï„0ŒQŒqŒQ„0”’”Ò¥¥4¥4œóœÓœÓ¥4µ–µ–¥4”’”’¥µ¶ÆÆ8½÷½÷ÎYÖšÖÚÞÛÞÛÖÚÖºÞÛÖºÖºÖšÎy½÷­U­uÆ8ÎyÆ­u¥4­U¥4­u½÷½÷½÷½÷µ–¥4­U­•½×µ–¥T”²”’sŽ„„0ŒQ”²œÓœÓœó¥4­u­u­uµ–µ¶µ¶µ¶µ¶µ–­u¥”²œóµ–ÆÆ8½÷½×ÎYÖÚÞÛÞÛÞÛÖÚÞÛÞÛÞûÞÛÖºÎyÎyÖšÎYÎYΙ֚ÆX½×½÷ƽ÷½×ƽ÷ÆÆ8Æ8½÷µ¶µ¶µ¶µ–­•¥4œÓ{ï”r”’”’”²¥4­uµ¶½×µÖ½×½÷Æ8½÷½×½÷ƽ÷­Uœóœóµ–ÆXÎyÆ8½×½÷ÎyÞÛÞÛÞÛÞÛÖÚÞÛÞûÞÛÞÛΙÎYÖšÖÚÖºÖzΙֺÎyÎYÎyÖšÎyÎYÎYÆ8Æ8ÖºÖºÖzÆ8Ƶ¶µ–µ–­•­UŒQ”²œÓœÓœóµ–½÷Æ8Æ8ÆÎYÎyÎY½÷µ–½÷ÎYÎY½÷¥T­UÆΙ֚Æ8½÷Æ8ÎyÖºÞÛÞÛÖÚÞÛÞÛÞÛÞÛÖÚ֚Ιֺֺ֚Îyֺֺֺֺ֚֚֚ΙÎYÆÆ8ÖºÞÛÖºÎyÎyÆ8µ¶µ–µ–­•œóœó¥4­uµ¶ÆÎyÎyÎyÖšÖºÖºÖš½÷­uµ¶ÎYÖºÖšÆ8½÷ÎYÖšÖºÖšÖšÖºÖºÖšÞÛÞûÞÛÞûÞÛÞÛÖÚÞÛÖÚÞ»ÖÚÖºÎyÆ8ÎyÞÛֺֺ֚ΙÎyÎyÎyÎYÆ8ÖšÖÚÞÛÖºÖºÖš½÷µ–­•½×­U­Uµ–½÷Æ8֚֚Ιֺ֚֚ÞÛÖºÎYµ¶½×ÎyÞÛÖÚÖºÖºÖºÞÛÞÛÖÚÞÛÞûÞÛÖºÞÛÞûÞûÞûÞûÞÛÖºÞÛÞûÞÛÞÛÖÚÖºÎyÎyÞÛÞÛÖºÎYÆ8Æ8ÖšÖºÖºÎYÆXÖšÖºÞÛÞÛÖº¾µ–µ¶½÷¥4­u½×¾ÎY֚ΙÎyÎyÎYÖºÞÛÖÚÎy½×½×ÎyÖºÞÛÞÛÞÛÖÚÞÛÞÛÞÛÞûÞûÞÛÖºÞÛÞûÞûÞûÞÛÞÛÖÚÞ»ÞûÞûÞûÞÛÞÛÖšÎyÞÛÖÚÖºÎyÆ8Î9ΙÞÛÖºÎY½÷ÆÎyÖºÖºÖš½×­•½×Æœó­u½×µÖ½÷ÎYÎyÎY¾Æ8ÖšÖÚ޻Ι½÷½×Æ8ÎyÖšÖºÖºÖºÖºÖºÞ»ÞÛÞûÞÛÖÚÖºÞÛÞÛÞûÞÛÞûÞÛÖÚÞÛÞûÞûÞûÞÛÎyÎyֺֺ֚ΙÎyֺ֚֚ΙÎyƵ–µÖÎYÎyÎYµÖ­Uµ¶½÷œÓ­uµ¶µ¶­u½×ÆXÆ½×Æ8Îy֚ΙÎY½÷µ¶½×ÆÆ¾Æ8Æ8Æ8Æ8ÎyÖºÞÛÞûÞÛÖºÖºÞÛÞÛÞÛÞÛÖÚÞÛÖÚÞûÞûÞÛÖšÆÆ8ÎyÎYÆXÎyÖšÖºÖšÎYÎYÆXÆ­u­U½÷ÎyÎY½×¥T­U­u”’¥­U­U­Uµ¶½×½×Æ8Æ8Æ8Æ8Æ8½×µ–µ¶½×½×½÷Æ8½×µ¶½÷ÎYÖšÖÚÞÛÞÛÖºÖšÖºÖÚÞ»ÖÚÞÛÖÚÖºÞÛÞÛÖºÆX½×½÷Æ8½÷½÷Æ8ÎYÎYÆXÆ8½÷½÷½÷­Uœóµ–Æ8ÎY½÷­u¥”²„0”²œóœóœó¥­Uµ¶½÷ƽ÷½×¾ÆµÖµ¶½÷½×½×¾Æµ¶­U­•Æ8Özֺֺֺ֚Ιֺֺֺֺֺֺ֚֚֚ÆX½×µ–½÷¾µ¶­uµ–µ¶µ¶½÷½÷µ¶­u­u¥4”²œóµ¶ÆµÖ¥4œÓŒq{Ï„P”’œÓ¥4­uµ¶½÷µ¶µ–½×¾½÷½×µ¶½÷½×½÷½÷µ¶¥”²¥4ÆΙ֚ÎyÆXÎyÖºÞÛÖÚÖšÎyÖšÖºÖºÖºÎy½÷­U¥µ–½÷µ–œó”²¥¥4­uµ¶µ–¥4œó”²ŒQ”’¥¥T¥”²”²ŒqkMkm{ÏŒQœÓ¥¥4­u­U¥4µ¶½×µÖµ¶µ–µ–µ–µÖ­uœÓ„PŒQ¥4ÆΙ֚Æ8ÆΙÞÛÞûÞÛÖºÎyÎyÖºÞÛÖºÎyµ¶œÓŒqœó­u­U”²ŒQŒ‘Œq”’¥¥TœóŒQ{Ï{Ï„0”²ŒQs®{Ï„0„RªZËc kM„”’”²”’„„Œq¥¥œó¥œÓ”’”²œÓ”’|{ï„”²­uÆÆ8½×½÷ÖšÞÛÞûÞÛÖšÆ8ÆXÖzΙÎy½÷­u”’s®{ÏŒq”’„s®sŽc,c sŽ„0ŒQkmZëc sŽ{Ïc,RŠZËZëc BB(JIRŠc s®„s®c,c,s®„{ÏksŽkmkMc c c cL{¯s®sŽŒQ¥4­U­Uµ¶ÎyÞÛÞÛÖÚÎy½÷½÷½÷½÷µ–¥œÓ„c JiZëkMc RªJIB9Ç:RjRŠJIB(JIRŠRŠB9Ç9Ç9Ç9ç1†1¦9Ç9Ç9çJiZëZ«BBJIRŠRŠJIBB9çAè9ç9çJIRªRªJic „”’œÓ­uÆXÖºÞÛÖšÆXÆ8ƽ׭UœóŒq{ïkmB(1†9Ç9ç9ç1†)e)E)E)E)e)e)e)e9§1¦1†)e)E)e)e)e!$!$)E)E)E)E)e)e)%!$!$)E)e)%!$!$)E1†)e)E)E1†)e1†B(kmŒ1”²­uÆ8ÖšÖºÎyÎYÎyÎyÆ¥4”²„0{Ïc 9ç!$!!$)E!$!!!!!!!!$!$!$!!$!!$!$!ã äãã äãã äãã äãã äãã ä!!$!!!!)eJIkMŒQ”Òµ¶ÎYΙֺ֚֚֚Ι½÷µ–¥T”²„0kmB!$ã äãã äãã äãã äãã äãã äãã äã äãã äãã äãã äãã äãã äãã äãã ä)eRŠ{Ï”’œÓµ¶ÎyÖšÖºÖºÖºÖšÎy½÷½÷½×­U”²sŽB!$ã äãã äãã äãã äãã äãã äãã äã äãã äãã äãã äãã äãã äãã äãã ä)ERŠŒQœóœó­uÆ8ÖºÞ»ÖÚÖºÎyÆ8½÷ƽ÷µ–œós®B(!ã äãã äãã äãã äãã äãã äãã äã äãã äãã äãã äãã äãã äãã äãã ä)EJi„0œó¤ô¥TÆ8ÖšÞÛÖºÖšÆ8½÷½×µÖµ¶­U”²s®B(!$ã äãã äãã äãã äãã äãã äãã äã äãã äãã äãã äãã äãã äãã äãã ä)EJI{œó­uÆ8ÖšÖºÖšÎyÎyÆ8µ¶­u¥”²Œq{ÏRŠ)Eãã äãã äãã äãã äãã äãã äããã äãã äãã äãã äãã äãã äãã äãã ä)EJiƒðœÓœÓ¥4½×ÎY֚ΙÎyÖšÎyƵ–œÓ„0{Ïs®ZË)Eãã äãã äãã äãã äãã äãã äããã äãã äãã äãã äãã äãã äãã äãã ä)ERŠ{œÓœó­UÆÎYÎyÎYÆXÎyÎyÆ¥4{ïkMZëB!$ã äãã äãã äãã äãã äãã äãã äã äãã äãã äãã äãã äãã äãã äãã ä)ERª„0”²¥­•µ¶½÷ÎYÎY½÷µ¶½÷ÎYÆX½×Œ‘kmJi1†!$ äãã äãã äãã äãã äãã äãã äãã äãã äãã äãã äãã äãã äãã äãã ä)EZË„0œÓ­uÆÆ8ÎYΙ֚Æ­u­u½÷Æ8½÷¥4sŽJI1†!$ã äãã äãã äãã äãã äãã äãã äã äãã äãã äãã äãã äãã äãã äãã ä)ERª{­u½÷Æ8ÎYÖšÎy¾µ–µ–µ¶½×µ¶œÓkmJI1†)Eãã äãã äãã äãã äãã äãã äããã äãã äãã äãã äãã äãã äãã äãã ä)eJIc,{ïŒq¥4µ¶½÷½÷½×µ–­•µ–­Uœó”²{ïc B(1†!$ã äãã äãã äãã äãã äãã äã!ãã äãã äãã äãã äãã äãã äãã äãã ä!1ÆRjZës®”’¥¥”Ҝӥ¥T­U”²„0{ÏkMJ‰9Ç)E!ãã äãã äãã äãã äãã äãã!!$!$ äã äãã äãã äãã äãã äãã äãã äãã!1†JIc {ÏŒq”’ŒqŒ1Œqœóµ–­u”²„kbìJI1¦)E!ãã äãã äãã äãã äãã äã!!$)E!$!ã äãã äãã äãã äãã äãã äãã äãã!1†JIkM{ï”r”’”’Œ‘”’¥µ–­•”²„kmZËB(1¦)E!ãã äãã äãã äãã äãã ä!)E)E)E!$ã äãã äãã äãã äãã äãã äãã äãã ä!1†JIc sŽ{Ï„0”’œÓœóœÓœóœÓ„0{ÏsŽZëJI9ç1f!ãã äãã äãã äãã äãã ä!!$)E!$)% äã äãã äãã äãã äãã äã äãã äãã ä!)e9çJIRŠZëkM„œÓœóŒq„0„s®sŽkmRªJ)9ç)e äãã ä!$!ã äãã äã!ã!ã!!$)%)E!$ã!ã!ã äãã! äãã äã!!!ãã äã!ã ä!$1†9Ç9ÇBRªsŽ„0ŒQs®snkmc ZËRªJ)9ç1†!$ ä!!!$)e1f)E!$ äã!!!!!$!$!$)%)E)E)E!!!$!!!!$!$!!ãã äã!!!$!!ã!!!ã!$)E1†1¦9ÇJIZëkMc,RªZ«RªRŠB(B(B9Ç1†!$!$!!$)E1†1†1†)E!$)E!$)%)E)e)e)e1f)e)e1f)e!!!$!!$!!$!$)%!$!!!!!!$!$)E!$)%!$!!$!!!$1†1†9ÇBJiRŠJiJ)JIB(B(BB9ç9§)e)e)E)E!$)e1†1¦1†)e)e1†)e)e)E)e1†1†1†)e1†1†1†ã!!!!$!$!$)%!$)E!$)%!$!$)%!D)%!$)%!D)%!$!!!!$)E1f1¦AèBJIJIJIB(BB9ç9ç9Ç1†1†1†1†1†1†1†1¦9Ç1¦1¦1†1¦1¦1†1†1†1¦1†1†1†1†1†1† ä!!!!$!$!$!$!$)%!$!$!!$)%!$!$)%!$)%)E!$)%!$!!$)%)E)e1¦9çBJ)B(B(B9Ç9Ç1¦1†1†1†1†1¦1†1¦1¦1¦1¦1¦1†1¦1¦9§1¦1¦1¦9§1¦9§1¦1¦1¦1¦ãã äã!!!$!$!$!$)%ã äã!!!$!$)%!!!!! äã ä!!$1†1¦9Ç9Ç9Ç1¦1†)e)E)e)E)E)E)e1†)e1f)e1f)e1†1†1¦1¦1¦1†1¦9§1Æ9§9Ç9Ç9Ç9ÇBB(JiJiRŠRªRŠJIB(B(Aè1¦B9çJibìc ZËJIB(9Ç9Ç9Ç9çBJIRŠRªRªZËRªJiBB9çB(JIJIJIJiJI9ç9ç9ÇBRŠc sŽs®c,ZËB(9Ç1†1†1†9Ç9ç9çBAè9çBB(1¦1¦1†1f9Ç9Ç1¦9§)e)E)E)eJIZËc,s®{ÏsŽc,Ji1†!$!$!$)%!)E1¦)E!$1¦1†)E!$!$!)%)E)E!$!)E)E)eJIc,sŽ”²”’{Ïs®RŠ1¦!!!$!$!!$)Eã!$1f)eã äã äã äãã ä!!$)eZ«km{¯œóœóŒQŒqsŽ9Ç!ã! äã äã äã)%!$ã äãã äãã äãã ä)ekM{Ïœóƽ÷ŒQŒq„09ç!ã äã äãã äã äã äãã äãã äãã ä9Çs®œÓÆÆÆXµ–Œq„0B!$ ä!ã äãã äã äãã äãã äãã äãã ä)eZ«œÓ¾µ¶ÆÆ8¥”²Ji!$!!ã äã äã äããã äãã äãã äãã ä1†sŽ­UÆ8ÖšÎYµÖ½×­URÊ)%ãã äã ä!ã äããã äãã äãã äãã ä1†{ϵ¶ÎYÖšÎYµ¶­u”²c )Eã!!!!!!!!! äã!!!!!!!$!!$1fk­Uµ¶ÎyÎYÆ8¥4ŒQ{ÏB1¦9ç9ÇBB(B(9ç9ç9Ç1¦1†9ÇB(Z«RŠRªc c c ZËc,sŽœÓµÖ­uÖšÞÛÎyƽ÷­u{ï{ïs®k-|¤ô”²„0{ïkMkMc s®„„ŒQœÓœÓŒq¥4¥4”²¥4½÷½÷Æ8ÞÛÞÛֺ֚Ι­u­U¾¥œÓµ–½÷µ¶¥4µ–¥4Œq„ŒqœÓ¥4µ–µ¶½×½×½×¥4¥ÆÆÆ8ÞÛÞÛÖÚÞûÖºÎy֚ΙÖzÆ8Æ8Æ8Æ8Îyƽ׭•¥4”²¥µ–ÆXÎYΙÆ8µ¶Îy½÷½÷ÖšÎYÎyÞÛÞÛÞÛÖÚÖºÖºÖºÎyÖºÖºÖšÎyÆ8ÖºÖºÎyµ¶µ–­U½×ÎyÖšÎyÞÛΙ½×ÖšÖÚÞÛÖÚÞÛÞûÖºÞûÞûÞÛÞÛÞûÖÚÖzÖÚÖšÆ8ÖºÖzÆ8ÖºÖº½×½÷¥4µ¶½÷ÎY¾֚Ι½×Æ8ÎYÎyÎyÖºÞûÞ»ÖÚÞûÞÛÞÛÞûÖÚÎYΙÎy֚ΙÎy½×µÖÎyµ–µ–”’¥4¥µ¶Æ½÷Æ8µ¶½×½÷½÷µ–ÎyÞ»ÖºÖšÖºÖºÖºÖºÎYµÖ½÷½×¾ÆµÖ­u¥Æµ–”Òs®ŒQ¥­u­uµ–½÷µ¶µ¶½×œóœÓÎYÎyÎYÞÛÖºÎyÖºÖš­u¥µ–”’œÓ¥4¥4Œq„0œÓŒQŒQJiZË{ÏŒQsŽŒQŒQ„0{ï{Ïs®„­Uµ¶Æ8ÞÛÖºÆÆ8½×”²kM{ÏkmZËRªkmRªZëZëJIJi)e1†9§B(1¦9Ç9ç1†1¦1¦AèBc,”’½×ÖºÎyÎYµ–Œ‘sŽ1¦1†)e)E!$)%!D1f)E)E)Eã äãã äãã äã!ã)%c ”’ÆΙֺ֚½×¥T{ï1†ã äãã äãã äããã äãã äãã äãã ä!kmœó½×ÖºÖºÆ8½÷µ¶ŒQ1¦ãã äãã äãã äãã äãã äãã äãã ä!c,œÓµ¶ÖšÎ™ÎYµ¶”²{ïAèãã äãã äãã äãã äãã äãã äãã ä!kMœÓ­UÆ8ÎY¾ÎYœÓ[ 1†ãã äãã äãã äãã äãã äãã äãã ä!km¥Æ8ÎyÎY­u½÷­uZë)eã äãã äãã äããã äãã äãã äãã ä!Ji{¯¥4­u­U­uœÓ{ïJi!$ äãã äãã äã ä! äãã äãã äãã äã ä9çsŽ”’Œq”²µ–Œqc,9ç)%ãã äãã äã ä!$)Eã äãã äãã äãã ä!9ÇZËsŽ”’œÓŒq{Ïc,B!$ äã!ãã äã!!$)E!!!!!ã ä!!ã!ã)E9ÇB(sŽkmc RªJI1¦!$!)E1†!$!!$)E)E)E)e!!!$!$)%!$!!$)%!$!$!!$1f9çJIJIB(B9ç1†1f)e1†1¦1†1†)e1†1†1†1†ã!!!$!$!!!$!$!$)%!!!)E9ÇB9ç1¦1†)e1f1†1†1†1†1¦1¦9§1¦9Ç1¦BB(RjJiB(9ÇB(c c,Ji1¦9ÇBJIJIJI)e)E1†)e)E)eRª{Ï{ïZë)e!$!)e!$1†ã äãã ä!$kMœóœó„0)e äã äã!ã äãã ä)E{ïÅø¾”’1¦!ã äã äã äãã ä!$”’ÎyÆ¥TBã ä!ã!)E9§9ÇBBJIœÓÆÎy­u{ÏZËZËsŽZëRŠ{Ï”’¥¥4­U­U¾ÖºÞÛÖš½÷½÷µ¶Æµ¶¥¥4Æ8Öš¾ÎyÖšÖºÞÛÞÛÖÚÖšÖºÎyÎyÖº½·¥4µ¶Æ8ƾÆÖºÖºÞÛÖÚÎYÆ8ÎY½×½×­ukM”²”²¥œÓŒq½÷ÖšÎyÎY”’ŒQ{Ï{ï{¯kM!$)e)E)E)E1†{ÏÎYÎy­URª!$!!!$!ã äãã ä!„Æ8Îy­uZëã äãã äã äãã ä!„0ƾµ–B(ã äãã ä äãã äã äZëœó­U„1¦ã äã ä!$ã!ã ä ä9çsn{ïbì1†!!$!!$)E!!$!$!)%!$!$9ÇB9Ç)e1†1†1†1¦1¦9Ç9ç9§Zëc 1†1¦9Çãã!”’œó)Eã ä)%)e1¦µvµÖJiB9ǜ󵶽÷ÖšÖÚÎYÆ8½×”²µ–­UÎyÖš­Uœó”’!!$)%¥½÷9ç!!ã äã”’­U)eã ä!!!BRª)e)E)e)eRŠRª)EkMœó­U{ïc,”’œóZëãJ)Rª!$c kMRªbìc \ No newline at end of file diff --git a/glide2x/h3/glide/tests/makefile b/glide2x/h3/glide/tests/makefile deleted file mode 100644 index c2297a3..0000000 --- a/glide2x/h3/glide/tests/makefile +++ /dev/null @@ -1,145 +0,0 @@ -# -# Copyright (c) 1995, 3Dfx Interactive, Inc. -# All Rights Reserved. -# -# This is UNPUBLISHED PROPRIETARY SOURCE CODE of 3Dfx Interactive, Inc.; -# the contents of this file may not be disclosed to third parties, copied or -# duplicated in any form, in whole or in part, without the prior written -# permission of 3Dfx Interactive, Inc. -# -# RESTRICTED RIGHTS LEGEND: -# 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. -# - - -LDIRT= *.exe *.map *.sys *.obj *.lib - -!ifdef FX_NO_GLIDE_SWDIAGS -!include $(BUILD_ROOT_SWLIBS)/include/nmake/3dfx.mak -!else -!if "$(FX_GLIDE_DSP_TARGET)"=="SIM" -LCDEFS = $(LCDEFS) -DGLIDE_SIMULATOR -LLDLIBS = $(LLDLIBS) $(BUILD_ROOT_SWLIBS)\lib\wing32.lib -!endif - -LCINCS = $(LCINCS) -I$(BUILD_ROOT_SST1)\include - -!if "$(FX_COMPILER)"=="WATCOM" -LIBOBJS = tlib.lib plib.lib -!else -LIBOBJS = tlib.obj plib.obj -!endif - -!if "$(FX_TARGET)"=="WIN32" -FX_TARGET_MINOR=WIN95 -!endif - -LLDLIBS = $(LLDLIBS) $(BUILD_ROOT_SST1)\lib\glide2x.lib $(LIBOBJS) - -PRIVATE_HEADERS = tlib.h tlib.c plib.h plib.c tldata.inc - -CFILES = display.c \ - test00.c \ - test01.c \ - test02.c \ - test03.c \ - test04.c \ - test05.c \ - test06.c \ - test07.c \ - test08.c \ - test09.c \ - test10.c \ - test11.c \ - test12.c \ - test13.c \ - test14.c \ - test15.c \ - test16.c \ - test17.c \ - test18.c \ - test19.c \ - test20.c \ - test21.c \ - test22.c \ - test23.c \ - test24.c \ - test25.c \ - test26.c \ - test27.c \ - test28.c \ - test29.c \ - qatest00.c \ - qatest01.c \ - h3dtst01.c \ - h3dtst02.c - -PROGRAMS = $(CFILES:.c=.exe) - -DATAFILES = alpha.3df decal1.3df lava.3df light.3df matt1.3df miro.3df \ - argb1555.3df argb4444.3df argb8332.3df argb8888.3df \ - ayiq.3df yiq.3df p8.3df ap88.3df rgb332.3df rgb565.3df - -!include $(BUILD_ROOT_SWLIBS)/include/nmake/3dfx.mak - -$(PROGRAMS): $(LLDLIBS) - -!if "$(FX_COMPILER)"=="WATCOM" -!if "$(FX_TARGET)"=="DOS" -tlib.lib: tlib.obj - wlib -b -c -n -q -p=512 tlib tlib.obj -plib.lib: plib.obj - wlib -b -c -n -q -p=512 plib plib.obj -!else -tlib.lib: tlib.obj - wlib -b -c -n -q -p=512 tlib tlib.obj -plib.lib: plib.obj - wlib -b -c -n -q -p=512 plib plib.obj -!endif -!endif - -test00: test00.exe -test01: test01.exe -test02: test02.exe -test03: test03.exe -test04: test04.exe -test05: test05.exe -test06: test06.exe -test07: test07.exe -test08: test08.exe -test09: test09.exe -test10: test10.exe -test11: test11.exe -test12: test12.exe -test13: test13.exe -test14: test14.exe -test15: test15.exe -test16: test16.exe -test17: test17.exe -test18: test18.exe -test19: test19.exe -test20: test20.exe -test21: test21.exe -test22: test22.exe -test23: test23.exe -test24: test24.exe -test25: test25.exe -test26: test26.exe -test27: test27.exe -test28: test28.exe -test29: test29.exe -test30: test30.exe -test31: test31.exe -qatest00: qatest00.exe -qatest01: qatest01.exe -h3dtst01: h3dtst01.exe -h3dtst02: h3dtst02.exe - -foo: foo.exe -display:display.exe - -!endif diff --git a/glide2x/h3/glide/tests/makefile.distrib b/glide2x/h3/glide/tests/makefile.distrib deleted file mode 100644 index 2358223..0000000 --- a/glide2x/h3/glide/tests/makefile.distrib +++ /dev/null @@ -1,15 +0,0 @@ - -CFLAGS = -I. -I/usr/include/glide - -SRCS = $(wildcard test*.c) -OBJS = $(SRCS:.c=.o) -EXECS = $(basename $(SRCS)) -LIB_OBJS = tlib.o - -all: $(EXECS) - -clean: - rm $(EXECS) *.o - -$(EXECS): $(OBJS) $(LIB_OBJS) - $(CC) -o $@ $@.o $(LIB_OBJS) -lglide -lm diff --git a/glide2x/h3/glide/tests/makefile.linux b/glide2x/h3/glide/tests/makefile.linux deleted file mode 100644 index ce0a9c7..0000000 --- a/glide2x/h3/glide/tests/makefile.linux +++ /dev/null @@ -1,77 +0,0 @@ -# -# Copyright (c) 1995, 3Dfx Interactive, Inc. -# All Rights Reserved. -# -# This is UNPUBLISHED PROPRIETARY SOURCE CODE of 3Dfx Interactive, Inc.; -# the contents of this file may not be disclosed to third parties, copied or -# duplicated in any form, in whole or in part, without the prior written -# permission of 3Dfx Interactive, Inc. -# -# RESTRICTED RIGHTS LEGEND: -# 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. -# - - -LDIRT= $(PROGRAMS) - -GLIDE_ROOT = $(BUILD_ROOT)/$(FX_GLIDE_HW) - -LIBOBJS = tlib.o plib.o - -GLIDELIB = -L$(GLIDE_ROOT)/lib -lglide - -LLDLIBS = $(LIBOBJS) $(GLIDELIB) - -PRIVATE_HEADERS = tlib.h tlib.c plib.h plib.c tldata.inc - -CFILES = display.c \ - test00.c \ - test01.c \ - test02.c \ - test03.c \ - test04.c \ - test05.c \ - test06.c \ - test07.c \ - test08.c \ - test09.c \ - test10.c \ - test11.c \ - test12.c \ - test13.c \ - test14.c \ - test15.c \ - test16.c \ - test17.c \ - test18.c \ - test19.c \ - test20.c \ - test21.c \ - test22.c \ - test23.c \ - test24.c \ - test25.c \ - test26.c \ - test27.c \ - test28.c \ - test29.c \ - qatest00.c \ - qatest01.c \ - h3dtst01.c \ - h3dtst02.c - -PROGRAMS = $(CFILES:.c=) - -DATAFILES = alpha.3df decal1.3df lava.3df light.3df matt1.3df miro.3df \ - argb1555.3df argb4444.3df argb8332.3df argb8888.3df \ - ayiq.3df yiq.3df p8.3df ap88.3df rgb332.3df rgb565.3df - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak - - -$(PROGRAMS): $(LIBOBJS) - diff --git a/glide2x/h3/glide/tests/matt1.3df b/glide2x/h3/glide/tests/matt1.3df deleted file mode 100644 index c02118d..0000000 Binary files a/glide2x/h3/glide/tests/matt1.3df and /dev/null differ diff --git a/glide2x/h3/glide/tests/miro.3df b/glide2x/h3/glide/tests/miro.3df deleted file mode 100644 index 313b674..0000000 Binary files a/glide2x/h3/glide/tests/miro.3df and /dev/null differ diff --git a/glide2x/h3/glide/tests/p8.3df b/glide2x/h3/glide/tests/p8.3df deleted file mode 100644 index 391f60b..0000000 Binary files a/glide2x/h3/glide/tests/p8.3df and /dev/null differ diff --git a/glide2x/h3/glide/tests/plib.c b/glide2x/h3/glide/tests/plib.c deleted file mode 100644 index aac8164..0000000 --- a/glide2x/h3/glide/tests/plib.c +++ /dev/null @@ -1,1397 +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 -#include -#ifndef __linux__ -#include -#endif -#include -#include -#include -#include -#include - -#include -#include "tlib.h" -#include "plib.h" - -#define MAX_HANDLES 32 - -//the following may need to go onto the heap... currently need 10K, not bad -static tlTxMnTexture_t tlTxMnMngr[MAX_HANDLES]; -static hTexId_t hFstOpnTexId = H_FSTTEXID; //0 is the NULL handle -static GrChipID_t currTMU = GR_TMU0; -static FxBool bMultiRevOrder; -static FxBool bMultiOffsetFix; - -/* static helper prototypes */ -static FxU32 prGetLodSize( GrTexInfo *const disTexInfo, GrLOD_t disLOD ); -static FxU32 prTexMultiMemRequired( FxU32 deMipMask, GrTexBaseRange_t deRange, - GrTexInfo* deTexInfo ); -static void prGetLod( GrTexInfo *lpTexInfo, GrLOD_t deLod, void *data ); -static void prPopLod( GrTexInfo *lpDeTexInfo, mipMapEnd_t deMipMapEnd ); -static void prPushLod( GrTexInfo *lpDeTexInfo, mipMapEnd_t deMipMapEnd ); -static FxU32 prGetTxMnAdd( hTexId_t deTexId, GrLOD_t deLod ); -static int prGetLodWidth( GrLOD_t lod, GrAspectRatio_t aspect ); -static int prGetLodHeight( GrLOD_t lod, GrAspectRatio_t aspect ); -static FxU32 prGetMultiMemBump( const GrTexInfo *const deTexInfo, - GrTexBaseRange_t deTexBase, - FxU32 deMipMask ); - - -/*------------------------------------------------------------------- - Function: plTxMnLoadTxMngr - Date: 6/26/97 - Implementor(s): psw - Library: - Description: - Arguments: - Return: - -------------------------------------------------------------------*/ -hTexId_t -plTxMnLoadTxMngr( TlTexture* lpTexture ) -{ - /* assumptions */ - assert( lpTexture ); - - /* code */ - tlTxMnMngr[ hFstOpnTexId ].lpTlTextureInfo = lpTexture; - tlTxMnMngr[ hFstOpnTexId ].origLargeLod = lpTexture->info.largeLod; - tlTxMnMngr[ hFstOpnTexId ].origSmallLod = lpTexture->info.smallLod; - SET_DOWNLOADABLE( tlTxMnMngr[hFstOpnTexId], FXFALSE); - SET_MULTIBASE( tlTxMnMngr[hFstOpnTexId], FXFALSE); - SET_TRILINEAR( tlTxMnMngr[hFstOpnTexId], FXFALSE); - SET_BEENPOPD( tlTxMnMngr[hFstOpnTexId], FXFALSE); - SET_DIRTY( tlTxMnMngr[hFstOpnTexId], FXFALSE); - - return (hFstOpnTexId++); -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnSetDownload - Date: 6/26/97 - Implementor(s): psw - Library: - Description: - Arguments: - Return: - -------------------------------------------------------------------*/ -static void -prTxMnSetBeenPopd( hTexId_t deTexId, FxBool bBeenPopd ) -{ - SET_BEENPOPD( tlTxMnMngr[deTexId], bBeenPopd ); - SET_DIRTY( tlTxMnMngr[deTexId], FXTRUE ); /* just for messing with it */ -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnSetDownload - Date: 6/26/97 - Implementor(s): psw - Library: - Description: - Arguments: - Return: - -------------------------------------------------------------------*/ -void -plTxMnSetDownload( hTexId_t deTexId, FxBool bDownLoad ) -{ - /* assumptions */ - assert( deTexId < hFstOpnTexId ); - - /* code */ - SET_DOWNLOADABLE( tlTxMnMngr[deTexId], bDownLoad ); - SET_DIRTY( tlTxMnMngr[deTexId], FXTRUE ); /* just for messing with it */ -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnSetMultibase - Date: 6/26/97 - Implementor(s): psw - Library: - Description: - Arguments: - Return: - -------------------------------------------------------------------*/ -void -plTxMnSetMultibase( hTexId_t deTexId, FxBool bMultibase ) -{ - /* assumptions */ - assert( deTexId < hFstOpnTexId ); - - /* code */ - SET_MULTIBASE( tlTxMnMngr[deTexId], bMultibase ); - SET_DIRTY( tlTxMnMngr[deTexId], FXTRUE ); /* just for messing with it */ -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnGetMultibase - Date: 6/26/97 - Implementor(s): psw - Library: - Description: - Arguments: - Return: - -------------------------------------------------------------------*/ -FxBool -plTxMnGetMultibase( hTexId_t deTexId ) -{ - assert( deTexId < hFstOpnTexId ); - return (IS_MULTIBASE(tlTxMnMngr[deTexId]) ); -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnSetMultiRevOrder - Date: 7/6/97 - Implementor(s): psw - Library: - Description: - Sets the global bMultiRevOrder which is used by plTxMnDownloadAll - to determine the order of the multibase segments in tmu mem - Arguments: - FxBool bOrder - Return: - void - -------------------------------------------------------------------*/ -void -plTxMnSetMultiRevOrder( FxBool bOrder ) -{ - bMultiRevOrder = bOrder; -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnGetMultiRevOrder - Date: 7/6/97 - Implementor(s): psw - Library: - Description: - Returns the current status of the bMultiRevOrder static global - Arguments: - none - Return: - FxBool - -------------------------------------------------------------------*/ -FxBool -plTxMnGetMultiRevOrder( ) -{ - return ( bMultiRevOrder ); -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnSetMultiOffsetFix - Date: 7/16/97 - Implementor(s): psw - Library: - Description: - Sets the global bMultiOffsetFix which is used by plTxMnTextureSource - to determine to use the Multibase offset fix - Arguments: - FxBool bOrder - Return: - void - -------------------------------------------------------------------*/ -void -plTxMnSetMultiOffsetFix( FxBool bOffsetFix ) -{ - bMultiOffsetFix = bOffsetFix; -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnGetMultiOffsetFix - Date: 7/16/97 - Implementor(s): psw - Library: - Description: - Returns the current status of the bMultiOffsetFix static global - Arguments: - none - Return: - FxBool - -------------------------------------------------------------------*/ -FxBool -plTxMnGetMultiOffsetFix( ) -{ - return ( bMultiOffsetFix ); -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnSetTrilinear - Date: 6/26/97 - Implementor(s): psw - Library: - Description: - Arguments: - Return: - -------------------------------------------------------------------*/ -void -plTxMnSetTrilinear( hTexId_t deTexId, FxBool bTrilinear ) -{ - /* assumptions */ - assert( deTexId < hFstOpnTexId ); - - /* trilinear && <2-lods are mutex */ - if ( (tlTxMnMngr[ deTexId ].lpTlTextureInfo->info.smallLod - - tlTxMnMngr[ deTexId ].lpTlTextureInfo->info.largeLod) >= 1) - { - SET_TRILINEAR( tlTxMnMngr[deTexId], bTrilinear ); - SET_DIRTY( tlTxMnMngr[deTexId], FXTRUE ); /* just for messing with it */ - } -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnGetTrilinear - Date: 6/26/97 - Implementor(s): psw - Library: - Description: - Arguments: - Return: - -------------------------------------------------------------------*/ -FxBool -plTxMnGetTrilinear( hTexId_t deTexId ) -{ - assert( deTexId < hFstOpnTexId ); - return (IS_TRILINEAR(tlTxMnMngr[deTexId]) ); -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnReset - Date: 6/26/97 - Implementor(s): psw - Library: - Description: - Resets the respective texture back to its base state - Arguments: - hTexId_t deTexId - the id of the tlTxMnMngr texture to reset - Return: - void - -------------------------------------------------------------------*/ -void -plTxMnReset( hTexId_t deTexId ) -{ - /* initializations */ - tlTxMnTexture_t *lpThisTxMnTexture; - GrTexInfo *lpThisTexInfo; - - /* assumptions */ - assert( deTexId < hFstOpnTexId ); - - /* initializations */ - lpThisTxMnTexture = &tlTxMnMngr[deTexId]; - lpThisTexInfo = &lpThisTxMnTexture->lpTlTextureInfo->info; - - /* code */ - SET_MULTIBASE( tlTxMnMngr[deTexId], FXFALSE ); - SET_TRILINEAR( tlTxMnMngr[deTexId], FXFALSE ); - bMultiRevOrder = FXFALSE; - /* SET_DIRTY( tlTxMnMngr[deTexId], FXFALSE ); */ - - while ( lpThisTexInfo->largeLod > lpThisTxMnTexture->origLargeLod ) - prPushLod( lpThisTexInfo, topOfMipMap );/* reset d'm data ptrs */ - - while ( lpThisTexInfo->smallLod < lpThisTxMnTexture->origSmallLod ) - prPushLod (lpThisTexInfo, btmOfMipMap );/* reset d'm data ptrs */ -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnDownloadAll - Date: 6/27/97 - Implementor(s): psw - Library: - Description: - Downloads all the textures be held by tlTexManMngr[] - Will determine if the textures are to be downloaded - in (linear || multibase) && (BOTH || EVEN/ODD) mode based upon - their flags and do the right thang - Arguments: - None - Return: - void - -------------------------------------------------------------------*/ -void -plTxMnDownloadAll( ) -{ - /* definitions */ - hTexId_t hCurrTexId; - FxU32 currTexMemReq; - FxU32 currStartAdd; - tlTxMnTexture_t *lpThisTxMnTexture; - GrTexInfo *lpThisTexInfo; - TlTexture *lpThisTlTex; - - /* assumptions */ - assert(hFstOpnTexId != 0); - - /* initializations */ - currStartAdd = grTexMinAddress(currTMU); - - /* code */ - for ( hCurrTexId = H_FSTTEXID; hCurrTexId < hFstOpnTexId; ++hCurrTexId ) - { /* here we go */ - if (IS_DOWNLOADABLE(tlTxMnMngr[hCurrTexId])) - { /* download it */ - lpThisTxMnTexture = &tlTxMnMngr[hCurrTexId]; - lpThisTlTex = lpThisTxMnTexture->lpTlTextureInfo; - lpThisTexInfo = &lpThisTlTex->info; - if (!IS_MULTIBASE(*lpThisTxMnTexture)) - { /* not multibased */ - if (!IS_TRILINEAR(*lpThisTxMnTexture)) - { /* not trilinear mip'd */ - currTexMemReq = grTexTextureMemRequired(GR_MIPMAPLEVELMASK_BOTH, lpThisTexInfo); - assert( currStartAdd + currTexMemReq < grTexMaxAddress(currTMU) ); - grTexDownloadMipMap( currTMU, currStartAdd, - GR_MIPMAPLEVELMASK_BOTH, lpThisTexInfo ); - lpThisTxMnTexture->u0.bothAdd = currStartAdd; - currStartAdd += currTexMemReq; - } /* if !IS_TRILINEAR && !IS_MULTIBASE */ - else - { /* else it is being rendered as trilinear mip'd */ - /* first do the even segment */ - currTexMemReq = grTexTextureMemRequired(GR_MIPMAPLEVELMASK_EVEN, lpThisTexInfo); - assert( currStartAdd + currTexMemReq < grTexMaxAddress(currTMU) ); - grTexDownloadMipMap( currTMU, currStartAdd, - GR_MIPMAPLEVELMASK_EVEN, lpThisTexInfo ); - lpThisTxMnTexture->u0.evenAdd = currStartAdd; - currStartAdd += currTexMemReq; - /* next do the odd segment */ - currTexMemReq = grTexTextureMemRequired(GR_MIPMAPLEVELMASK_ODD, lpThisTexInfo); - assert( currStartAdd + currTexMemReq < grTexMaxAddress(currTMU) ); - grTexDownloadMipMap( currTMU, currStartAdd, - GR_MIPMAPLEVELMASK_ODD, lpThisTexInfo ); - lpThisTxMnTexture->u1.oddAdd = currStartAdd; - currStartAdd += currTexMemReq; - } /* else !IS_MULTIBASE && IS_TRILINEAR */ - } /* if !IS_MULTIBASE */ - else /* else it is multibased */ - { - /* stack frame definitions */ - FxU32 *lpxAdd; - GrTexBaseRange_t tTxBse; - - grTexMultibase(currTMU, FXTRUE); /* turn on multibase */ - if (!IS_TRILINEAR(*lpThisTxMnTexture)) - { /* non trilinear mip'd multibase texture - ** if bMultiRevOrder is True, get the addresses for the Multibase segs - ** in reverse order, 32_TO_1 to 256, else get them in 256 to 32_TO_1 */ - - for ( tTxBse = bMultiRevOrder ? GR_TEXBASE_32_TO_1 : GR_TEXBASE_256, - lpxAdd = bMultiRevOrder ? &lpThisTxMnTexture->u3.multiR3Add : - &lpThisTxMnTexture->u0.multiR0Add; - bMultiRevOrder ? lpxAdd >= &lpThisTxMnTexture->u0.multiR0Add : - lpxAdd <= &lpThisTxMnTexture->u3.multiR3Add; - (bMultiRevOrder ? --tTxBse : ++tTxBse), - (bMultiRevOrder ? --lpxAdd : ++lpxAdd) ) - { /* this loop just gets the texture addresses - the multibase - ** segments will be in reverse order, but in the same linear block */ - currTexMemReq = prTexMultiMemRequired( GR_MIPMAPLEVELMASK_BOTH, - tTxBse, lpThisTexInfo); - if (currTexMemReq != 0) /* if the LOD(s) !missing, ie. pop'd */ - { - assert( currStartAdd + currTexMemReq < grTexMaxAddress(currTMU) ); - *lpxAdd = currStartAdd; - currStartAdd += currTexMemReq; /* bump the current TMU address */ - } - } /* for */ - for ( tTxBse = GR_TEXBASE_256, lpxAdd = &lpThisTxMnTexture->u0.multiR0Add; - lpxAdd <= &lpThisTxMnTexture->u3.multiR3Add; - ++tTxBse, ++lpxAdd ) - { /* this loop actually does the downloading - in the proper order... - ** GR_TEXBASE_256 to GR_TEXBASE_32_TO_1 */ - - /* stack frame definitions */ - GrTexInfo tmpInfo; - GrTexInfo *lpTmpInfo = &tmpInfo; - - /* initializations */ - /* multibase requires that I munge the data for downloading */ - *lpTmpInfo = *lpThisTexInfo; - if ((lpThisTexInfo->largeLod <= (FxI32) tTxBse ) && - (lpThisTexInfo->smallLod >= (FxI32) tTxBse )) - { /* if the TexBase exists in the lod range */ - while ( lpTmpInfo->largeLod < (FxI32) tTxBse ) - prPopLod( lpTmpInfo, topOfMipMap ); /* munge the top */ - - if ( tTxBse != GR_TEXBASE_32_TO_1 ) - lpTmpInfo->smallLod = lpTmpInfo->largeLod; /* munge the btm */ - - grTexDownloadMipMap(currTMU, *lpxAdd, /* download mung'd data */ - GR_MIPMAPLEVELMASK_BOTH, lpTmpInfo ); - } /* if */ - } /* for */ - } /* if !IS_TRILINEAR && IS_MULTIBASE */ - else - { /* else it is a multibased trilinear mipmap, aka motherfucker - ** if bMultiRevOrder is True, get the addresses for the Multibase segs - ** in reverse order, 32_TO_1 to 256, else get them in 256 to 32_TO_1 */ - for (tTxBse = bMultiRevOrder ? GR_TEXBASE_32_TO_1+1 : GR_TEXBASE_256, - lpxAdd = bMultiRevOrder ? &lpThisTxMnTexture->u4.multiR3EvenAdd : - &lpThisTxMnTexture->u0.multiR0EvenAdd; - bMultiRevOrder ? lpxAdd >= &lpThisTxMnTexture->u0.multiR0EvenAdd : - lpxAdd <= &lpThisTxMnTexture->u4.multiR3EvenAdd; - (bMultiRevOrder ? --tTxBse : ++tTxBse), - (bMultiRevOrder ? --lpxAdd : ++lpxAdd) ) - { /* this loop just gets the texture addresses */ - if ( tTxBse % 2 ) /* is it odd? */ - currTexMemReq = prTexMultiMemRequired(GR_MIPMAPLEVELMASK_ODD, - tTxBse, lpThisTexInfo); /* 1,3 */ - else /* even */ - currTexMemReq = prTexMultiMemRequired(GR_MIPMAPLEVELMASK_EVEN, - (tTxBse>3?3:tTxBse), - lpThisTexInfo);/* 0,2,3 */ - /* prTexMulti.. only knows about 0-3 */ - if (currTexMemReq != 0) /* if the LOD(s) !missing, ie. pop'd */ - { - assert( currStartAdd + currTexMemReq < grTexMaxAddress(currTMU) ); - *lpxAdd = currStartAdd; - currStartAdd += currTexMemReq;/* bump the current TMU address */ - } - } /* for */ - for (tTxBse = GR_TEXBASE_256, - lpxAdd = &lpThisTxMnTexture->u0.multiR0EvenAdd; - lpxAdd <= &lpThisTxMnTexture->u4.multiR3EvenAdd; - ++tTxBse, ++lpxAdd ) /* tTxBse will actually overrun... - ** overrun = GR_TEXBASE_32_TO_1 + 1 - ** (tTxBse>3?3:tTxBse) will fix this - ** required for 32to1_ODD and 32to1_EVEN */ - /* actually (tTxBse>GR_TEXBASE_32_TO_1:GR_TEXBASE_32_TO_1?tTxBse) */ - { /* this loop actually does the downloading - in the proper order... - ** GR_TEXBASE_256 to GR_TEXBASE_32_TO_1 */ - - /* stack frame definitions */ - GrTexInfo tmpInfo; - GrTexInfo *lpTmpInfo = &tmpInfo; - - /* initializations */ - /* multibase requires that I munge the data, hence the data copies */ - *lpTmpInfo = *lpThisTexInfo; - - if ((lpThisTexInfo->largeLod <= (FxI32) (tTxBse>3?3:tTxBse)) && - (lpThisTexInfo->smallLod >= (FxI32) (tTxBse>3?3:tTxBse))) - { /* if an lod actually exits in the range */ - while ( lpTmpInfo->largeLod < (FxI32)(tTxBse>3?3:tTxBse) ) - prPopLod( lpTmpInfo, topOfMipMap ); /* munge the top */ - - if ( (tTxBse>3?3:tTxBse) != GR_TEXBASE_32_TO_1 ) - lpTmpInfo->smallLod = lpTmpInfo->largeLod; /* munge the btm */ - - if ( tTxBse % 2 ) /* is it odd? */ - grTexDownloadMipMap(currTMU, *lpxAdd, /* download mung'd odd data */ - GR_MIPMAPLEVELMASK_ODD, lpTmpInfo ); - else - grTexDownloadMipMap(currTMU, *lpxAdd, /* download mung'd even data */ - GR_MIPMAPLEVELMASK_EVEN, lpTmpInfo ); - } /* if */ - } /* for */ - } /* else IS_TRILINEAR && IS_MULTIBASE */ - grTexMultibase(currTMU, FXFALSE); /* turn off multibase */ - } /* else IS_MULTIBASE */ - if ( lpThisTlTex->tableType != NO_TABLE ) - grTexDownloadTable(currTMU, lpThisTlTex->tableType, - &lpThisTlTex->tableData ); - } /* if IS_DOWNLOADABLE */ - } /* for ( i = 0; i < fstOpnTexId; ++i ) */ -} /* plTxMnDownloadAll */ -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnTexSource - Date: 6/28/97 - Implementor(s): psw - Library: - Description: - Renders the texture associated with hTexId. Will setup the rendering - modes based upon the tlTxMnMngr[deTexId].flags fields, i.e., - (linear || multibase) && (BOTH || EVEN/ODD) modes. Also uses - the addresses saved by previous call to tlTxMnDownloadAll - Arguments: - hTexId_t deTexId - handle to the texture - FxU32 deMipMask - mipmap mask - Return: - void - -------------------------------------------------------------------*/ -void -plTxMnTexSource( hTexId_t deTexId, FxU32 deMipMask ) -{ - /* definitions */ - tlTxMnTexture_t *lpThisTxMnTexture; - GrTexInfo thisTexInfo, - *lpThisTexInfo; - TlTexture *lpThisTlTex; - FxU32 *lpxAdd, - xAdd; - GrTexBaseRange_t tTexBase; - - /* assumptions */ - assert( deTexId < hFstOpnTexId ); - assert((deMipMask >= GR_TEXBASE_256) && - (deMipMask <= GR_TEXBASE_32_TO_1)); - - /* initializations */ - lpThisTxMnTexture = &tlTxMnMngr[deTexId]; - lpThisTlTex = lpThisTxMnTexture->lpTlTextureInfo; - lpThisTexInfo = &thisTexInfo; - *lpThisTexInfo = lpThisTxMnTexture->lpTlTextureInfo->info; - -/* - if ((lpThisTlTex->tableType == GR_NCCTABLE_NCC0) || - (lpThisTlTex->tableType == GR_NCCTABLE_NCC1)) - grTexNCCTable( currTMU, lpThisTlTex->tableType ); -*/ - if (!IS_MULTIBASE(*lpThisTxMnTexture)) - { /* not multibased */ - if (!IS_TRILINEAR(*lpThisTxMnTexture)) - grTexSource( currTMU, lpThisTxMnTexture->u0.bothAdd, deMipMask, lpThisTexInfo ); - else /* IS_TRILINEAR */ - if ( deMipMask == GR_MIPMAPLEVELMASK_EVEN ) /* first do the even segment */ - grTexSource( currTMU, lpThisTxMnTexture->u0.evenAdd, deMipMask, lpThisTexInfo ); - else /* next do the odd segment */ - grTexSource( currTMU, lpThisTxMnTexture->u1.oddAdd, deMipMask, lpThisTexInfo ); - }/* if !IS_MULTIBASE */ - else - { /* else it is multibased */ - grTexMultibase(currTMU, FXTRUE); /* turn on multibase */ - if (!IS_TRILINEAR(*lpThisTxMnTexture)) - { /* really dependant on the unions being in the proper order */ - lpxAdd = &lpThisTxMnTexture->u0.multiR0Add; - for (tTexBase = GR_TEXBASE_256; tTexBase <= GR_TEXBASE_32_TO_1; - ++tTexBase, ++lpxAdd) - /* next i check that the current TexBase is in the lod range */ - if ((lpThisTexInfo->largeLod <= (FxI32) tTexBase) && - (lpThisTexInfo->smallLod >= (FxI32) tTexBase)) - { - xAdd = *lpxAdd; - if (bMultiOffsetFix) - xAdd -= prGetMultiMemBump(lpThisTexInfo, tTexBase, deMipMask); - grTexMultibaseAddress(currTMU, tTexBase, xAdd, deMipMask, - lpThisTexInfo ); - } - } /* if !IS_TRILINEAR */ - else - { /* else it is a multibased trilinear mipmap */ - if ( deMipMask == GR_MIPMAPLEVELMASK_EVEN ) /* do the even segments */ - { - lpxAdd = &lpThisTxMnTexture->u0.multiR0EvenAdd;/* set lpxAdd to 1st add */ - for (tTexBase = GR_TEXBASE_256; tTexBase <= GR_TEXBASE_32_TO_1; - tTexBase = ( tTexBase + 2 == GR_TEXBASE_32_TO_1 + 1 ) ? /* 32t1 is both even & odd */ - GR_TEXBASE_32_TO_1 : tTexBase + 2, lpxAdd += 2 ) /* even segs r at even indices */ - /* next i check that the current TexBase is in the lod range */ - if ((lpThisTexInfo->largeLod <= (FxI32) tTexBase) && - (lpThisTexInfo->smallLod >= (FxI32) tTexBase)) - { - xAdd = *lpxAdd; - if (bMultiOffsetFix) - xAdd -= prGetMultiMemBump(lpThisTexInfo, tTexBase, deMipMask); - grTexMultibaseAddress(currTMU, tTexBase, xAdd, deMipMask, - lpThisTexInfo); - } - } /* if - even */ - else /* else do the odd segments */ - { - lpxAdd = &lpThisTxMnTexture->u1.multiR1OddAdd; - for (tTexBase = GR_TEXBASE_128; tTexBase <= GR_TEXBASE_32_TO_1; - tTexBase+=2, lpxAdd+=2 ) /* odd segs r at odd indices */ - /* next i check that the current TexBase is in the lod range */ - if ((lpThisTexInfo->largeLod <= (FxI32) tTexBase) && - (lpThisTexInfo->smallLod >= (FxI32) tTexBase)) - { - xAdd = *lpxAdd; - if (bMultiOffsetFix) - xAdd -= prGetMultiMemBump(lpThisTexInfo, tTexBase, deMipMask); - grTexMultibaseAddress( currTMU, tTexBase, xAdd, deMipMask, - lpThisTexInfo ); - } - } /* else - odd */ - } /* else IS_TRILINEAR && IS_MULTIBASE */ - grTexMultibase(currTMU, FXFALSE); /* turn off multibase */ - } /* else IS_MULTIBASE */ -} /* plTxMnRender */ -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnGetInfo - Date: 6/27/97 - Implementor(s): psw - Library: - Description: - simply fills in GrTexInfo struct with info about Texture - Arguments: - hTexId_t deTexHndl - the texture that you want to know about - GrTexInfo *deGrTexInfo - the info struct you want filled - Return: - void - -------------------------------------------------------------------*/ -void -plTxMnGetInfo( hTexId_t deTexHndl, GrTexInfo *deGrTexInfo ) -{ - - /* assumptions */ - assert (deGrTexInfo); - assert ( deTexHndl < hFstOpnTexId ); - - *deGrTexInfo = tlTxMnMngr[deTexHndl].lpTlTextureInfo->info; -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plPopLod - Date: 6/17/97 - Implementor(s): psw - Library: - Description: - Basically a wrapper for prPopLod - Arguments: - hTexId_t thisTexId - mipMapEnd_t deMipMapEnd - Return: - none - -------------------------------------------------------------------*/ -void -plPopLod( hTexId_t hCurrTexture, mipMapEnd_t deMipMapEnd ) -{ - /* definitions */ - GrTexInfo *lpThisTexInfo; - tlTxMnTexture_t *lpThisTxMnTexture; - - /* assumptions */ - assert( hCurrTexture < hFstOpnTexId ); - - - /* initializations */ - lpThisTxMnTexture = &tlTxMnMngr[hCurrTexture]; - lpThisTexInfo = &lpThisTxMnTexture->lpTlTextureInfo->info; - - /* code */ - if ( lpThisTexInfo->smallLod == lpThisTexInfo->largeLod ) - return; /* no reason to go on, nothing to do */ - - if ((IS_TRILINEAR(*lpThisTxMnTexture)) && - ((lpThisTexInfo->smallLod - lpThisTexInfo->largeLod) == 2 ) ) - return; /* trilinear && <2-lods are mutex */ - - prPopLod( lpThisTexInfo, deMipMapEnd ); -} /* plPopLod */ -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plPushLod - Date: 6/17/97 - Implementor(s): psw - Library: - Description: - Basically a wrapper for prPushLod - Arguments: - hTexId_t thisTexId - mipMapEnd_t deMipMapEnd - Return: - none - -------------------------------------------------------------------*/ -void -plPushLod( hTexId_t hCurrTexture, mipMapEnd_t deMipMapEnd ) -{ - /* definitions */ - GrTexInfo *lpThisTexInfo;/* info struct associated with curr tlTxMnMnger obj */ - tlTxMnTexture_t *lpThisTxMnTexture; - - /* assumptions */ - assert( hCurrTexture < hFstOpnTexId ); - - /* initializations */ - lpThisTxMnTexture = &tlTxMnMngr[hCurrTexture]; - lpThisTexInfo = &lpThisTxMnTexture->lpTlTextureInfo->info; - - /* code */ - if ((deMipMapEnd == topOfMipMap) && - (lpThisTexInfo->largeLod == lpThisTxMnTexture->origLargeLod)) - return; /* already at the top of the stack */ - - if ((deMipMapEnd == btmOfMipMap) && - (lpThisTexInfo->smallLod == lpThisTxMnTexture->origSmallLod)) - return; /* already at the bottom of the stack */ - - prPushLod( lpThisTexInfo, deMipMapEnd); -} /* plPushLod */ -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plCreateTlTexture - Date: 6/20/97 - Implementor(s): psw - Library: - Description: - creates a TlTexture - Arguments: - GrTexInfo* - FxU16 [] - Return: - void - -------------------------------------------------------------------*/ -void -plCreateTlTexture( TlTexture *deTlTexture, FxU16 daColors[] ) -{ - /* definitions */ - GrLOD_t tCurrLod; /* the current LOD */ - int nBytePerPixel; /* number of bytes per pixel */ - FxU8 *spLilTex; /* 8bit LOD data ptr */ - FxU16 *mpBigTex; /* 16bit LOD data ptr */ - void *lpvCurrLod; /* curr LOD data ptr */ - FxU32 xLodNumBytes; /* number of bytes to write in curr LOD */ - GrTexInfo *lpThisTexInfo; /* ptr to GrTexInfo in TlTexture struct */ - - /* assumptions */ - assert( deTlTexture ); - assert( deTlTexture->info.data ); - assert( deTlTexture->info.smallLod > deTlTexture->info.largeLod ); - - /* no palettized */ - assert( (deTlTexture->info.format != GR_TEXFMT_YIQ_422) || - (deTlTexture->info.format != GR_TEXFMT_P_8) || - (deTlTexture->info.format != GR_TEXFMT_AYIQ_8422) || - (deTlTexture->info.format != GR_TEXFMT_AP_88) ); - - /* initializations */ - lpThisTexInfo = &deTlTexture->info; - - /* code */ - if ((lpThisTexInfo->format == GR_TEXFMT_RGB_332) || - (lpThisTexInfo->format == GR_TEXFMT_YIQ_422) || - (lpThisTexInfo->format == GR_TEXFMT_ALPHA_8) || - (lpThisTexInfo->format == GR_TEXFMT_INTENSITY_8) || - (lpThisTexInfo->format == GR_TEXFMT_P_8)) - nBytePerPixel = 1; /* 8-bit formats */ - else - nBytePerPixel = 2; /* 16-bit formats */ - - lpvCurrLod = lpThisTexInfo->data; - - if ((deTlTexture->info.format != GR_TEXFMT_YIQ_422) || - (deTlTexture->info.format != GR_TEXFMT_P_8) || - (deTlTexture->info.format != GR_TEXFMT_AYIQ_8422) || - (deTlTexture->info.format != GR_TEXFMT_AP_88) ) - deTlTexture->tableType = NO_TABLE; /* fuck me */ - - for ( tCurrLod = lpThisTexInfo->largeLod; - tCurrLod <= (lpThisTexInfo->smallLod); ++tCurrLod ) - { - if ( nBytePerPixel == 1 ) - { - xLodNumBytes = prGetLodSize( lpThisTexInfo, tCurrLod ); - for (spLilTex = (FxU8*) lpvCurrLod; - spLilTex < (FxU8*) ((FxU32)lpvCurrLod + xLodNumBytes); - ++spLilTex ) - *spLilTex = (FxU8) daColors[tCurrLod]; - - lpvCurrLod = (void*) spLilTex; - } - else - { - xLodNumBytes = prGetLodSize( lpThisTexInfo, tCurrLod ); - for (mpBigTex = (FxU16*) lpvCurrLod; - mpBigTex < (FxU16*) ((FxU32)lpvCurrLod + xLodNumBytes); - ++mpBigTex ) - *mpBigTex = daColors[tCurrLod]; - - lpvCurrLod = (void*) mpBigTex; - } - } -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnDwnldMipMapLod - Date: 7/7/97 - Implementor(s): psw - Library: - Description: - downloads a mipmap lod, deLod, from a src TxMnTexture to a dst - TxMnTexture. - ***multibase not yet supported, not clearly defined - Arguments: - hTexId_t dstTexId - destination TxMnTexture id - hTexId_t srcTexId - source TxMnTexture id - GrLOD_t deLod - the lod to download in srcTexId - Return: - void - -------------------------------------------------------------------*/ -void -plTxMnDwnldMipMapLod( hTexId_t dstTexId, hTexId_t srcTexId, GrLOD_t deLod ) -{ - /* definitions */ - GrTexInfo *lpDstTexInfo, - *lpSrcTexInfo; - tlTxMnTexture_t *lpDstTxMnTexture, - *lpSrcTxMnTexture; - void *lpvData; - FxU32 thisAdd; - GrLOD_t thisLgLod; - FxU32 thisMask; - - /* assumptions */ - assert( dstTexId < hFstOpnTexId ); - assert( srcTexId < hFstOpnTexId ); - assert( IS_DOWNLOADABLE(tlTxMnMngr[dstTexId]) ); - - /* initializations */ - lpDstTxMnTexture = &tlTxMnMngr[dstTexId]; - lpSrcTxMnTexture = &tlTxMnMngr[srcTexId]; - lpDstTexInfo = &lpDstTxMnTexture->lpTlTextureInfo->info; - lpSrcTexInfo = &lpSrcTxMnTexture->lpTlTextureInfo->info; - - /* just some error checking */ - if ( ((lpDstTexInfo->format) != (lpSrcTexInfo->format)) || - ((lpDstTexInfo->aspectRatio) != (lpSrcTexInfo->aspectRatio)) || - ((lpSrcTxMnTexture->origLargeLod) > deLod) || - ((lpSrcTxMnTexture->origSmallLod) < deLod) || - ((lpDstTxMnTexture->origLargeLod) > deLod) || - ((lpDstTxMnTexture->origSmallLod) < deLod) ) - return; /* nonfatal error, just return */ - - /* code */ - /* get the data */ - lpvData = malloc(prGetLodSize(lpSrcTexInfo, deLod)); - assert(lpvData); - prGetLod(lpSrcTexInfo, deLod, lpvData); - /* now i have an lod to download */ - - /* get the address */ - thisAdd = prGetTxMnAdd( dstTexId, deLod ); - /* get the mask */ - if (!IS_TRILINEAR(*lpDstTxMnTexture)) - thisMask = GR_MIPMAPLEVELMASK_BOTH; - else /* it is trilinear */ - thisMask = deLod%2 ? GR_MIPMAPLEVELMASK_ODD : GR_MIPMAPLEVELMASK_EVEN; - - /* get the largeLod, SPECIAL case for multibase */ - if (!IS_MULTIBASE(*lpDstTxMnTexture)) - thisLgLod = lpDstTexInfo->largeLod; - else /* is is multibase */ - thisLgLod = deLod < GR_LOD_32 ? deLod : - lpDstTexInfo->largeLod > GR_LOD_32 ? - lpDstTexInfo->largeLod : GR_LOD_32; - - grTexDownloadMipMapLevel( currTMU, thisAdd, deLod, thisLgLod, - lpDstTexInfo->aspectRatio, lpDstTexInfo->format, - thisMask, lpvData ); - free(lpvData); -} /* plTxMnDwnldMipMapLod */ -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnDwnldMipMapLod - Date: 7/7/97 - Implementor(s): psw - Library: - Description: - downloads a mipmap lod, deLod, from a src TxMnTexture to a dst - TxMnTexture. - Arguments: - hTexId_t dstTexId - destination TxMnTexture id - hTexId_t srcTexId - source TxMnTexture id - GrLOD_t deLod - the lod to download in srcTexId - Return: - void - -------------------------------------------------------------------*/ -void -plTxMnDwnldMipMapLodPrtl( hTexId_t dstTexId, hTexId_t srcTexId, GrLOD_t deLod, - int nFstRow, int nLstRow ) -{ - /* definitions */ - GrTexInfo *lpDstTexInfo, - *lpSrcTexInfo; - tlTxMnTexture_t *lpDstTxMnTexture, - *lpSrcTxMnTexture; - void *lpvData; - FxU32 thisAdd; - GrLOD_t thisLgLod; - FxU32 thisMask; - - /* assumptions */ - assert( dstTexId < hFstOpnTexId ); - assert( srcTexId < hFstOpnTexId ); - assert( IS_DOWNLOADABLE(tlTxMnMngr[dstTexId]) ); - assert( nFstRow <= nLstRow ); - - /* initializations */ - lpDstTxMnTexture = &tlTxMnMngr[dstTexId]; - lpSrcTxMnTexture = &tlTxMnMngr[srcTexId]; - lpDstTexInfo = &lpDstTxMnTexture->lpTlTextureInfo->info; - lpSrcTexInfo = &lpSrcTxMnTexture->lpTlTextureInfo->info; - - /* code */ - /* just some error checking */ - if ( ((lpDstTexInfo->format) != (lpSrcTexInfo->format)) || - ((lpDstTexInfo->aspectRatio) != (lpSrcTexInfo->aspectRatio)) || - ((lpSrcTxMnTexture->origLargeLod) > deLod) || - ((lpSrcTxMnTexture->origSmallLod) < deLod) || - ((lpDstTxMnTexture->origLargeLod) > deLod) || - ((lpDstTxMnTexture->origSmallLod) < deLod) || - (nFstRow > prGetLodHeight( deLod, lpDstTexInfo->aspectRatio)) ) - return; /* nonfatal error, just return */ - - /* because i'm a nice guy */ -// if (nLstRow >= prGetLodHeight( deLod, lpDstTexInfo->aspectRatio)) -// nLstRow = (-1) + prGetLodHeight( deLod, lpDstTexInfo->aspectRatio); - /* not so nice */ - - /* get the data */ - lpvData = malloc(prGetLodSize(lpSrcTexInfo, deLod)); - assert(lpvData); - prGetLod(lpSrcTexInfo, deLod, lpvData); - /* now i have an lod to download */ - - /* get the address */ - thisAdd = prGetTxMnAdd( dstTexId, deLod ); - - /* get the mask */ - if (!IS_TRILINEAR(*lpDstTxMnTexture)) - thisMask = GR_MIPMAPLEVELMASK_BOTH; - else /* it is trilinear */ - thisMask = deLod%2 ? GR_MIPMAPLEVELMASK_ODD : GR_MIPMAPLEVELMASK_EVEN; - - /* get the largeLod, SPECIAL case for multibase */ - if (!IS_MULTIBASE(*lpDstTxMnTexture)) - thisLgLod = lpDstTexInfo->largeLod; - else /* is is multibase */ - thisLgLod = deLod < GR_LOD_32 ? deLod : - lpDstTexInfo->largeLod > GR_LOD_32 ? - lpDstTexInfo->largeLod : GR_LOD_32; - - grTexDownloadMipMapLevelPartial( currTMU, thisAdd, deLod, thisLgLod, - lpDstTexInfo->aspectRatio, lpDstTexInfo->format, - thisMask, lpvData, nFstRow, nLstRow ); - free(lpvData); -} -/*-------------------------------------------------------------------*/ - - - -/* static helpers */ - -/*------------------------------------------------------------------- - Function: prGetTxMnAdd - Date: 7/14/97 - Implementor(s): psw - Library: - Description: - returns the address of the texture seg in linear memory that contains - the LOD being sought based on TxMn id - Arguments: - hTexId_t deTexId - destination TxMnTexture id - GrLOD_t deLod - the lod to locate the seg in - Return: - FxU32 - address of the seg containing deLod - -------------------------------------------------------------------*/ -static FxU32 -prGetTxMnAdd( hTexId_t deTexId, GrLOD_t deLod ) -{ - /* definitions */ - tlTxMnTexture_t *lpThisTxMnTxtre; - FxU32 xAdd; - - /* initializations */ - lpThisTxMnTxtre = &tlTxMnMngr[deTexId]; - - /* code */ - if (!IS_MULTIBASE(*lpThisTxMnTxtre)) - { /* not multibased */ - if (!IS_TRILINEAR(*lpThisTxMnTxtre)) - xAdd = lpThisTxMnTxtre->u0.bothAdd; - else /* IS_TRILINEAR */ - xAdd = (deLod%2) ? lpThisTxMnTxtre->u1.oddAdd : - lpThisTxMnTxtre->u0.evenAdd ; - } /* if !IS_MULTIBASE */ - else /* this is going to be fucking ugly! */ - { /* else it is multibased */ - if (!IS_TRILINEAR(*lpThisTxMnTxtre)) - { - switch ( deLod ) - { /* some things are better done with a switch... */ - case GR_LOD_256: - xAdd = (FxU32) &lpThisTxMnTxtre->u0.multiR0Add; - break; - - case GR_LOD_128: - xAdd = (FxU32) &lpThisTxMnTxtre->u1.multiR1Add; - break; - - case GR_LOD_64: - xAdd = (FxU32) &lpThisTxMnTxtre->u2.multiR2Add; - break; - - default: - xAdd = (FxU32) &lpThisTxMnTxtre->u3.multiR3Add; - break; - } - } /* if !IS_TRILINEAR */ - else - { - switch ( deLod ) - { /* some things are better done with a switch... */ - case GR_LOD_256: - xAdd = (FxU32) &lpThisTxMnTxtre->u0.multiR0EvenAdd; - break; - - case GR_LOD_128: - xAdd = (FxU32) &lpThisTxMnTxtre->u1.multiR1OddAdd; - break; - - case GR_LOD_64: - xAdd = (FxU32) &lpThisTxMnTxtre->u2.multiR2EvenAdd; - break; - - default: /* deLod <= 32_TO_1, key is could be < */ - xAdd = (deLod % 2) ? (FxU32) &lpThisTxMnTxtre->u3.multiR3OddAdd : - (FxU32) &lpThisTxMnTxtre->u4.multiR3EvenAdd; - break; - } - } /* else IS_TRILINEAR */ - } /* else IS_MULTIBASE */ - - return (xAdd); -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: prGetLod - Date: 7/7/97 - Implementor(s): psw - Library: - Description: - gets the lod specific data out of a GrTexInfo designated by - lpTexInfo, used primarily by plTxMnDwnldMipMapLod - Arguments: - GrTexInfo *lpTexInfo - destination TxMnTexture id - GrLOD_t deLod - the lod get in deTexId - void *lpvData - pointer to data to propagate - Return: - void - -------------------------------------------------------------------*/ -static void -prGetLod( GrTexInfo *lpTexInfo, GrLOD_t deLod, void *lpvData ) -{ - /* definitions */ - GrTexInfo thisTexInfo, - *lpThisTexInfo; - GrLOD_t lod; - FxU32 i, xNumBytes; - FxU8 *lpSrc, - *lpDst; - - /* initializations */ - lpThisTexInfo = &thisTexInfo; - *lpThisTexInfo = *lpTexInfo; /* munge a copy */ - - /* code */ - /* mod copy to get deLod at the top */ - for ( lod = lpThisTexInfo->largeLod; lod < deLod; ++lod ) - prPopLod( lpThisTexInfo, topOfMipMap ); - - /* get the size of top lod */ - xNumBytes = prGetLodSize( lpThisTexInfo, lpThisTexInfo->largeLod ); - - /* read the top lod data into *lpvData */ - lpSrc = (FxU8*) lpThisTexInfo->data; - lpDst = (FxU8*) lpvData; - - for ( i = 0; i < xNumBytes; ++i ) - *lpDst++ = *lpSrc++; -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: prPushLod - Date: 7/7/97 - Implementor(s): psw - Library: - Description: - This routine actually modifies the GrTexInfo struct data to push - data BACK on the top or bottom of the mipmap. pushes a single lod - Arguments: - GrTexInfo *lpDeTexInfo - mipMapEnd_t deMipMapEnd - Return: - none - -------------------------------------------------------------------*/ -static void -prPushLod( GrTexInfo *lpDeTexInfo, mipMapEnd_t deMipMapEnd ) -{ - if (deMipMapEnd == topOfMipMap) - lpDeTexInfo->data = (void*)( (FxU32) lpDeTexInfo->data - - prGetLodSize(lpDeTexInfo, --lpDeTexInfo->largeLod)); - else - ++lpDeTexInfo->smallLod; -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: prPopLod - Date: 7/7/97 - Implementor(s): psw - Library: - Description: - This routine actually modifies the GrTexInfo struct data to pop - data off the top or bottom of the mipmap. pops off a single lod - Arguments: - GrTexInfo *lpDeTexInfo - mipMapEnd_t deMipMapEnd - Return: - none - -------------------------------------------------------------------*/ -static void -prPopLod( GrTexInfo *lpDeTexInfo, mipMapEnd_t deMipMapEnd ) -{ - if (deMipMapEnd == topOfMipMap) - lpDeTexInfo->data = (void*)( (FxU32) lpDeTexInfo->data + - prGetLodSize(lpDeTexInfo, lpDeTexInfo->largeLod++)); - else - --lpDeTexInfo->smallLod; -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: prGetLodSize - Date: 6/18/97 - Implementor(s): psw - Library: - Description: - returns the size, in number of bytes, of an LOD based upon format, - LOD level and aspect ratio. this routine is meant to be used on - the void* in the GrTexInfo struct. - Arguments: - GrTexInfo *const disTexInfo - pointer to the Texture Info - GrLOD_t disLOD - the lod to get the size of - Return: - FxU32 - -------------------------------------------------------------------*/ -static FxU32 -prGetLodSize( GrTexInfo *const deTexInfo, GrLOD_t deLod ) -{ - /* definitions */ - int nPxlFctr; - int yAspctDvdr[] = {3, 2, 1, 0, 1, 2, 3}; /* ie. GR_ASPECT_1x8 = 2^3 */ - int yLodFctr[] = {8, 7, 6, 5, 4, 3, 2, 1, 0}; /* ie. GR_LOD_256 = 2^8 */ - FxU32 xNumBytes; - GrAspectRatio_t thisAR; - GrLOD_t thisLod; - - /* code */ - if ((deTexInfo->format == GR_TEXFMT_RGB_332) || - (deTexInfo->format == GR_TEXFMT_YIQ_422) || - (deTexInfo->format == GR_TEXFMT_ALPHA_8) || - (deTexInfo->format == GR_TEXFMT_INTENSITY_8) || - (deTexInfo->format == GR_TEXFMT_P_8)) - nPxlFctr = 1; /* 8-bit formats */ - else - nPxlFctr = 2; /* all else are 16-bit formats */ - - thisAR = deTexInfo->aspectRatio; /* thisAspectRatio */ - thisLod = deLod; /* thisLod */ - - /* the general formula is xNumBytes=nBytesPerPixel*nPixels - ** nPixels=maxPixels/aspectRatio - ** maxPixels for GR_LOD_256=256*256 or 2^8*2^8, hence the following formula...*/ - if ( yAspctDvdr[thisAR] < yLodFctr[thisLod] ) - xNumBytes = nPxlFctr << yLodFctr[thisLod] << yLodFctr[thisLod] >> - yAspctDvdr[thisAR]; - else - xNumBytes = nPxlFctr << yLodFctr[thisLod]; - - return xNumBytes; -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: prTexMultiMemRequired - Date: 6/27/97 - Implementor(s): psw - Library: - Description: - calculates and returns the amount of memory required for the - individual multibase texture segments in BOTH, EVEN or ODD modes - traps cases for missing LODs - Arguments: - FxU32 deMipMask (GR_MIPMAPLEVELMASK) - GrTexBaseRange_t deRange - GrAspectRatio_t deRatio - GrTextureFormat_t deFormat - Return: - FxU32 - memory required - -------------------------------------------------------------------*/ -static -FxU32 prTexMultiMemRequired( FxU32 deMipMask, GrTexBaseRange_t deMultiSeg, - GrTexInfo* deTexInfo ) -{ - /* definitions */ - GrTexInfo tmpTexInfo, - *lpTmpTexInfo; /* create a copy of the GrTexInfo */ - FxU32 thisSegMemReq = 0x0; - GrLOD_t lod; - - /* initializations */ - lpTmpTexInfo = &tmpTexInfo; - *lpTmpTexInfo = *deTexInfo; /* copy passed data, then prepare to munge */ - - /* code */ - if ((lpTmpTexInfo->largeLod > (FxI32) deMultiSeg) || - (lpTmpTexInfo->smallLod < (FxI32) deMultiSeg)) - return 0; /* the deMultiSeg !exist in the lod range of info */ - - /* else it does */ - for (lod = lpTmpTexInfo->largeLod; lod < (FxI32) deMultiSeg; ++lod) - prPopLod( lpTmpTexInfo, topOfMipMap ); /* munge the top */ - - if ( deMultiSeg != GR_TEXBASE_32_TO_1) - lpTmpTexInfo->smallLod = lpTmpTexInfo->largeLod; /* munge the btm */ - - thisSegMemReq = grTexTextureMemRequired( deMipMask, lpTmpTexInfo ); - - return thisSegMemReq; -} /* prTexMultiMemRequired */ -/*-------------------------------------------------------------------*/ - - - -/*-------------------------------------------------------------------*/ -static int -prGetLodWidth( GrLOD_t lod, GrAspectRatio_t aspect ) -{ - int yAspctWdvdr[] = {0, 0, 0, 0, 1, 2, 3}; - int yLodFctr[] = {8, 7, 6, 5, 4, 3, 2, 1, 0}; - int val; - - val = yLodFctr[lod] > yAspctWdvdr[aspect] ? - 1 << yLodFctr[lod] >> yAspctWdvdr[aspect] : 1; - - return( val ); -} -/*-------------------------------------------------------------------*/ - - - -/*-------------------------------------------------------------------*/ -static int -prGetLodHeight( GrLOD_t lod, GrAspectRatio_t aspect ) -{ - int yAspctHdvdr[] = {3, 2, 1, 0, 0, 0, 0}; - int yLodFctr[] = {8, 7, 6, 5, 4, 3, 2, 1, 0}; - int val; - - val = yLodFctr[lod] > yAspctHdvdr[aspect] ? - 1 << yLodFctr[lod] >> yAspctHdvdr[aspect] : 1; - - return( val ); -} -/*-------------------------------------------------------------------*/ - - - -/*-------------------------------------------------------------------*/ -static FxU32 -prGetMultiMemBump( const GrTexInfo *const deTexInfo, - GrTexBaseRange_t deTexBase, - FxU32 deMipMask ) -{ /* this fixes some multibase fuckage */ - /* definitions */ - FxU32 xMemBump, - xAllMemReq, - xSegMemReq; - GrTexInfo tmpTexInfo, - *lpTmpTexInfo; - - /* initializations */ - lpTmpTexInfo = &tmpTexInfo; - *lpTmpTexInfo = *deTexInfo; - - /* code */ - lpTmpTexInfo->largeLod = GR_LOD_256; - xAllMemReq = grTexTextureMemRequired( deMipMask, lpTmpTexInfo ); - - lpTmpTexInfo->largeLod = deTexBase != GR_TEXBASE_32_TO_1 ? deTexBase : - lpTmpTexInfo->largeLod > (FxI32) deTexBase ? - lpTmpTexInfo->largeLod : GR_LOD_32; - xSegMemReq = grTexTextureMemRequired( deMipMask, lpTmpTexInfo ); - - xMemBump = xAllMemReq - xSegMemReq; - return (xMemBump); -} diff --git a/glide2x/h3/glide/tests/plib.h b/glide2x/h3/glide/tests/plib.h deleted file mode 100644 index 933e272..0000000 --- a/glide2x/h3/glide/tests/plib.h +++ /dev/null @@ -1,129 +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$ -** -*/ - - -#ifndef _PLIB_H_ -#define _PLIB_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum { topOfMipMap, btmOfMipMap } mipMapEnd_t; - -typedef FxU8 hTexId_t; -#define H_NULL 0x0 -#define H_FSTTEXID 0x1 - -typedef struct { - unsigned int isDownloadable : 1; /* should tex be downloaded? */ - unsigned int isMultibase : 1; /* downloaded as multibase? */ - unsigned int isTrilinear : 1; /* downloaded as EVEN/ODD? */ - unsigned int isBeenPopd : 1; /* has it been pop'd? - not used */ - unsigned int isDirty : 1; /* has it been touched? - not used */ -} tlTxMnFlags_t; - -typedef struct { - TlTexture* lpTlTextureInfo; - GrLOD_t origLargeLod; /* for pop 'n' push */ - GrLOD_t origSmallLod; /* for pop 'n' push */ - /* I need a min of 5 start addresses worst case - Trilinear Multibase - ** The unions contain start addresses that are mutually exclusive - ** ps, if the order of these unions ever change, some shit will seriously - ** break, especially in plTxMnTexSource() */ - union u0_u { /* can you believe softice doesn't understand unnamed unions? */ - FxU32 bothAdd; /* BOTH linear start */ - FxU32 evenAdd; /* EVEN linear start */ - FxU32 multiR0Add; /* BOTH multi 1st range start */ - FxU32 multiR0EvenAdd; /* EVEN multi 1st range start */ - } u0; - union u1_u { - FxU32 oddAdd; /* ODD linear start */ - FxU32 multiR1Add; /* BOTH multi 2nd range start */ - FxU32 multiR1OddAdd; /* ODD multi 2nd range start */ - } u1; - union u2_u { - FxU32 multiR2Add; /* BOTH multi 3rd range start */ - FxU32 multiR2EvenAdd; /* EVEN multi 3rd range start */ - } u2; - union u3_u { - FxU32 multiR3Add; /* BOTH multi 4th range start */ - FxU32 multiR3OddAdd; /* EVEN multi 4th range start */ - } u3; - union u4_u { - FxU32 multiR3EvenAdd; /* ODD multi 4th range start */ - } u4; /* just for consistency */ - tlTxMnFlags_t flags; -} tlTxMnTexture_t; - -/* exposed function prototypes for TxMn */ -hTexId_t plTxMnLoadTxMngr( TlTexture* lpTexture ); -void plTxMnDownloadAll( ); -void plTxMnTexSource( hTexId_t deTexId, FxU32 deMipMask ); -void plTxMnReset( hTexId_t deTexId ); -void plTxMnSetDownload( hTexId_t theTexId, FxBool bDownLoad ); -FxBool plTxMnGetMultibase( hTexId_t deTexId ); -void plTxMnSetMultibase( hTexId_t deTexId, FxBool bMultibase ); -FxBool plTxMnGetTrilinear( hTexId_t deTexId ); -void plTxMnSetTrilinear( hTexId_t theTexId, FxBool bTrilinear ); -FxBool plTxMnGetMultiRevOrder( ); -void plTxMnSetMultiOffsetFix( FxBool bOffsetFix ); -FxBool plTxMnGetMultiOffsetFix( ); -void plTxMnSetMultiRevOrder( FxBool bOrder ); -void plTxMnGetInfo( hTexId_t deTexHndl, GrTexInfo *deGrTexInfo ); -void plTxMnDwnldMipMapLod( hTexId_t dstTexId, hTexId_t srcTexId, GrLOD_t deLod ); -void plTxMnDwnldMipMapLodPrtl( hTexId_t dstTexId, hTexId_t srcTexId, GrLOD_t deLod, - int nFstRow, int nLstRow ); - -/* public helper function prototypes */ -void plPopLod( hTexId_t hCurrTexture, mipMapEnd_t mipMapEnd ); -void plPushLod( hTexId_t hCurrTexture, mipMapEnd_t mipMapEnd ); -void plCreateTlTexture( TlTexture *disTlTexture, FxU16 daColors[] ); - - - - - -/* some macros to play with the bit fields */ -#define IS_DOWNLOADABLE( tex ) (tex).flags.isDownloadable ? FXTRUE : FXFALSE -#define IS_MULTIBASE( tex ) (tex).flags.isMultibase ? FXTRUE : FXFALSE -#define IS_BEENPOPD( tex ) (tex).flags.isBeenPopd ? FXTRUE : FXFALSE -#define IS_TRILINEAR( tex ) (tex).flags.isTrilinear ? FXTRUE : FXFALSE -#define IS_DIRTY( tex ) (tex).flags.isDirty ? FXTRUE : FXFALSE -#define SET_DOWNLOADABLE( tex, b ) (tex).flags.isDownloadable = b -#define SET_MULTIBASE( tex, b ) (tex).flags.isMultibase = b -#define SET_TRILINEAR( tex, b ) (tex).flags.isTrilinear = b -#define SET_BEENPOPD( tex, b ) (tex).flags.isBeenPopd = b -#define SET_DIRTY( tex, b ) (tex).flags.isDirty = b - - -#ifdef NDEBUG -#undef NDEBUG -#endif - -#ifdef __cplusplus -} -#endif -#endif diff --git a/glide2x/h3/glide/tests/qatest00.c b/glide2x/h3/glide/tests/qatest00.c deleted file mode 100644 index 0690717..0000000 --- a/glide2x/h3/glide/tests/qatest00.c +++ /dev/null @@ -1,1239 +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 -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" -#include "plib.h" -#include "qatest00.h" - -/* 1BgFile+8FgFile+3Algo+8DwnlodAlgo=21*/ -#define NUMTEXTURES 21 -myTexture_t theTextures[NUMTEXTURES]; - -TexCoordFactors aspctToTxtreCrdFctrs[7] = { - { 256.0f, 256.0f / 8.0f }, /* GR_ASPECT_8x1 */ - { 256.0f, 256.0f / 4.0f }, /* GR_ASPECT_4x1 */ - { 256.0f, 256.0f / 2.0f }, /* GR_ASPECT_2x1 */ - { 256.0f, 256.0f }, /* GR_ASPECT_1x1 */ - { 256.0f / 2.0f, 256.0f }, /* GR_ASPECT_1x2 */ - { 256.0f / 4.0f, 256.0f }, /* GR_ASPECT_1x4 */ - { 256.0f / 8.0f, 256.0f } /* GR_ASPECT_1x8 */ -}; - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "QATEST00"; -static const char purpose[] = "Texture Download"; -static const char usage[] = "-n -r "; - -static float scrWidth = 640.0f; -static float scrHeight = 480.0f; - -/* some global shit for mipmap lod && partial lod downloads */ -static FxBool g_bDoLodDwnld = FXFALSE; -static FxI32 g_nLodToDwnld; -static FxBool g_bDoLodPrtlDwnld = FXFALSE; -static FxI32 g_nLodPrtlFstRow; -static FxI32 g_nLodPrtlLstRow; - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - /* definitions */ - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - int frames = -1; - - /* some texture stuff */ - /* disk based textures */ - const char *lpzBgTxtrFile = "miro.3df"; - const int nNumFgTxtrFiles = 8; - const char *lpzFgTxtrFiles[] = { "rgb332.3df", "rgb565.3df", - "argb4444.3df", "argb1555.3df", - "p8.3df", "ap88.3df", - "yiq.3df", "ayiq.3df" }; - /* color stuff for algorithmic textures */ - const int nAlgFgTxtres = 4; - FxU16 yAlgFgClrs[][9] = - {{ RED_565, GRN_565, RED_565, GRN_565, RED_565, GRN_565, RED_565, GRN_565, RED_565 }, - { RED_565, GRN_565, RED_565, GRN_565, RED_565, GRN_565, RED_565, GRN_565, RED_565 }, - { RED_565, GRN_565, RED_565, GRN_565, RED_565, GRN_565, RED_565, GRN_565, RED_565 }, - { RED_565, GRN_565, RED_565, GRN_565, RED_565, GRN_565, RED_565, GRN_565, RED_565 }}; - - /* templates for all algorithmic textures */ - GrTexInfo yAlgTxtreTmplts[][9] = - {{ {GR_LOD_1, GR_LOD_256, GR_ASPECT_8x1, GR_TEXFMT_RGB_565, NULL} }, - { {GR_LOD_1, GR_LOD_256, GR_ASPECT_4x1, GR_TEXFMT_RGB_565, NULL} }, - { {GR_LOD_1, GR_LOD_256, GR_ASPECT_2x1, GR_TEXFMT_RGB_565, NULL} }, - { {GR_LOD_1, GR_LOD_256, GR_ASPECT_1x1, GR_TEXFMT_RGB_565, NULL} }}; - - const int nDwnLodTxtres = 8; - FxU16 yDwnLodClrs[][9] = - {{ BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565 }, - { BLU_332, BLU_332, BLU_332, BLU_332, BLU_332, BLU_332, BLU_332, BLU_332, BLU_332 }, - { BLU_1555, BLU_1555, BLU_1555, BLU_1555, BLU_1555, BLU_1555, BLU_1555, BLU_1555, BLU_1555 }, - { BLU_4444, BLU_4444, BLU_4444, BLU_4444, BLU_4444, BLU_4444, BLU_4444, BLU_4444, BLU_4444 }, - { BLU_8332, BLU_8332, BLU_8332, BLU_8332, BLU_8332, BLU_8332, BLU_8332, BLU_8332, BLU_8332 }, - { BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565 }, - { BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565 }, - { BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565 }}; - - GrTexInfo yDwnTxtreTmplts[][9] = - {{ {GR_LOD_1, GR_LOD_256, GR_ASPECT_1x1, GR_TEXFMT_RGB_565, NULL} }, - { {GR_LOD_1, GR_LOD_256, GR_ASPECT_1x1, GR_TEXFMT_RGB_332, NULL} }, - { {GR_LOD_1, GR_LOD_256, GR_ASPECT_1x1, GR_TEXFMT_ARGB_1555, NULL} }, - { {GR_LOD_1, GR_LOD_256, GR_ASPECT_1x1, GR_TEXFMT_ARGB_4444, NULL} }, - { {GR_LOD_1, GR_LOD_256, GR_ASPECT_1x1, GR_TEXFMT_RGB_565, NULL} }, - { {GR_LOD_1, GR_LOD_256, GR_ASPECT_8x1, GR_TEXFMT_RGB_565, NULL} }, - { {GR_LOD_1, GR_LOD_256, GR_ASPECT_4x1, GR_TEXFMT_RGB_565, NULL} }, - { {GR_LOD_1, GR_LOD_256, GR_ASPECT_2x1, GR_TEXFMT_RGB_565, NULL} }}; - - /* texture handles */ - hTexId_t hCurrFgTxtre, /* current fg texture */ - hFstFgTxtre = 0, /* first fg texture */ - hLstFgTxtre, /* last fg texture */ - hFstAlgFgTxtre, /* first algo texture */ - hLstAlgFgTxtre = 0, /* last algo texture */ - hFstDwnlTxtre = 0, /* first lod download texture */ - hLstDwnlTxtre = 0, /* last lod download texture */ - hDwlnSrcTxtre, - hTmpTxtre; - hTexId_t hBgTxtre; /* bg texture */ - - GrVertex bgVerts[4]; - GrVertex fgVerts[4]; - - const float alpha = 192.0f; /* Alpha for ,blending tringle over background */ - FxU32 fxColorValue; - int i; - - /*---- - 0-1 - |/| - 3-2 - -----*/ - bgVerts[0].x = 0.f, bgVerts[0].y = 0.f; - bgVerts[0].a = 255.f, bgVerts[0].oow = 1.f; - bgVerts[0].tmuvtx[0].sow = 0.f * bgVerts[0].oow; - bgVerts[0].tmuvtx[0].tow = 0.f * bgVerts[0].oow; - - bgVerts[1].x = scrWidth, bgVerts[1].y = 0.f; - bgVerts[1].a = 255.f,bgVerts[1].oow = 1.f; - bgVerts[1].tmuvtx[0].sow = 255.f * bgVerts[1].oow; - bgVerts[1].tmuvtx[0].tow = 0.f * bgVerts[1].oow; - - bgVerts[2].x = scrWidth, bgVerts[2].y = scrHeight; - bgVerts[2].a = 255.f, bgVerts[2].oow = 1.f; - bgVerts[2].tmuvtx[0].sow = 255.f * bgVerts[2].oow; - bgVerts[2].tmuvtx[0].tow = 255.f * bgVerts[2].oow; - - bgVerts[3].x = 0.f, bgVerts[3].y = scrHeight; - bgVerts[3].a = 255.f, bgVerts[3].oow = 1.f; - bgVerts[3].tmuvtx[0].sow = 0.f * bgVerts[3].oow; - bgVerts[3].tmuvtx[0].tow = 255.f * bgVerts[3].oow; - - fgVerts[0].x = 0.f, fgVerts[0].y = 0.f; - fgVerts[0].a = 255.f, fgVerts[0].oow = 1.f; - fgVerts[0].tmuvtx[0].sow = 0.f; - fgVerts[0].tmuvtx[0].tow = 0.f; - - fgVerts[1].x = 0.f, fgVerts[1].y = 0.f; - fgVerts[1].a = 255.f, fgVerts[1].oow = 1.f; - fgVerts[1].tmuvtx[0].sow = 0.f; - fgVerts[1].tmuvtx[0].tow = 0.f; - - fgVerts[2].x = 0.f, fgVerts[2].y = 0.f; - fgVerts[2].a = 255.f, fgVerts[2].oow = 1.f; - fgVerts[2].tmuvtx[0].sow = 0.f; - fgVerts[2].tmuvtx[0].tow = 0.f; - - fgVerts[3].x = 0.f, fgVerts[3].y = 0.f; - fgVerts[3].a = 255.f, fgVerts[3].oow = 1.f; - fgVerts[3].tmuvtx[0].sow = 0.f; - fgVerts[3].tmuvtx[0].tow = 0.f; - - /* 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; - } - } /* while */ - - 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, 40, 0xffffff ); - /* done initialize Glide */ - - /* Texure stuff */ - /* do the disk based texture stuff */ - for ( i = 0; i < nNumFgTxtrFiles; ++i ) - if ( i==0 ) - hFstFgTxtre = doLoadTexture( lpzFgTxtrFiles[i], NULL, NULL, FXTRUE ); - else - hLstFgTxtre = doLoadTexture( lpzFgTxtrFiles[i], NULL, NULL, FXTRUE ); - /* do the algorithmic fg texture stuff */ - for ( i = 0; i < nAlgFgTxtres; ++i ) - if ( i==0 ) - hFstAlgFgTxtre = doLoadTexture( NULL, &yAlgTxtreTmplts[i][0], &yAlgFgClrs[i][0], FXTRUE ); - else - hLstAlgFgTxtre = doLoadTexture( NULL, &yAlgTxtreTmplts[i][0], &yAlgFgClrs[i][0], FXTRUE ); - - hLstFgTxtre = hLstAlgFgTxtre; - /* do the algorithmic download lod texture stuff, these are not downloadable */ - for ( i = 0; i < nDwnLodTxtres; ++i ) - if ( i==0 ) - hFstDwnlTxtre = doLoadTexture( NULL, &yDwnTxtreTmplts[i][0], &yDwnLodClrs[i][0], FXFALSE ); - else - hLstDwnlTxtre = doLoadTexture( NULL, &yDwnTxtreTmplts[i][0], &yDwnLodClrs[i][0], FXFALSE ); - - hCurrFgTxtre = hFstFgTxtre; /* init hCurrFgTxtre */ - hBgTxtre = doLoadTexture( lpzBgTxtrFile, NULL, NULL, FXTRUE ); - plTxMnDownloadAll(); /* make plTxMn download everything */ - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - /* done loading plTxMn */ - -// grTexFilterMode( GR_TMU0, GR_TEXTUREFILTER_BILINEAR, GR_TEXTUREFILTER_BILINEAR ); - - fxColorValue = (0x00FFFFFF | ( ((int) alpha) << 24 ) ); - grConstantColorValue(fxColorValue); - - /* Main processing loop */ - while( frames-- ) - { - /* definitions */ - static ScaleAmt_t tCurrScle = SCALE_1; - static MipMapMode_t mipMapMode = DISABLE; - static FilterMode_t filterMode = BOTH_BILNEAR; - static float fBiasLevel = 0.0f; - static float fBiasInc = 0.25f; - static FxBool bVerboseMode = FXTRUE; - static FxBool bBgImage = FXTRUE; - - float fXsize, fYsize, fULsow, fLRsow, fULtow, fLRtow; - GrTexInfo tmpTexInfo; - FxBool isTrilinear, isMultibase; - - /* code */ - grBufferClear( 0x00404040, 0, GR_ZDEPTHVALUE_FARTHEST ); - - /* Output the diagnostic stuff */ - if (bVerboseMode) - { - tlConClear(); - plTxMnGetInfo( hCurrFgTxtre, &tmpTexInfo ); - isTrilinear = plTxMnGetTrilinear( hCurrFgTxtre ); - isMultibase = plTxMnGetMultibase( hCurrFgTxtre ); - tlConOutput("txt %d, fmt %#x, lgLod %#x, smLod %#x, aspct %#x, T:%d, M:%d\n", - hCurrFgTxtre, tmpTexInfo.format, tmpTexInfo.largeLod, - tmpTexInfo.smallLod, tmpTexInfo.aspectRatio, - isTrilinear, isMultibase ); - fXsize = fgVerts[1].x - fgVerts[0].x; - fYsize = fgVerts[3].y - fgVerts[0].y; - fULsow = fgVerts[0].tmuvtx[0].sow; - fULtow = fgVerts[0].tmuvtx[0].tow; - fLRsow = fgVerts[2].tmuvtx[0].sow; - fLRtow = fgVerts[2].tmuvtx[0].tow; - tlConOutput("Size %f by %f:\nUL s,t %f, %f: LR s,t %f, %f\n", - fXsize, fYsize, fULsow, fULtow, fLRsow, fLRtow ); - switch (tCurrScle) - { - case SCALE_1: - tlConOutput("Curr Scale is 1 LOD; "); - break; - - case SCALE_2: - tlConOutput("Curr Scale is 1/2 LOD; "); - break; - - case SCALE_4: - tlConOutput("Curr Scale is 1/4 LOD; "); - break; - - case SCALE_8: - tlConOutput("Curr Scale is 1/8 LOD; "); - break; - - case SCALE_16: - tlConOutput("Curr Scale is 1/16 LOD; "); - break; - - case SCALE_32: - tlConOutput("Curr Scale is 1/32 LOD; "); - break; - } - tlConOutput("LOD Bias is %f\n", fBiasLevel); - } /* done with the Con output stuff */ - - /* do the Bg texture */ - if (bBgImage) - { - /* Setup the system for the Bg Texture */ - grTexLodBiasValue( GR_TMU0, 0.0f ); - grHints(GR_HINT_ALLOW_MIPMAP_DITHER, FXFALSE); - grTexMipMapMode(GR_TMU0, GR_MIPMAP_DISABLE, FXFALSE); - grTexFilterMode( GR_TMU0, GR_TEXTUREFILTER_BILINEAR, GR_TEXTUREFILTER_BILINEAR ); - grTexCombine( GR_TMU0, GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_NONE, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ZERO, GR_BLEND_ZERO, GR_BLEND_ZERO ); - - /* set bgTexture as source of next rendering operations */ - plTxMnTexSource( hBgTxtre, GR_MIPMAPLEVELMASK_BOTH ); - - grDrawTriangle( &bgVerts[0], &bgVerts[1], &bgVerts[3] ); - grDrawTriangle( &bgVerts[1], &bgVerts[2], &bgVerts[3] ); - } /* done with Bg txtre */ - - /* Setup the system for the Fg Texture */ - switch( mipMapMode ) - { - case DISABLE: - grHints (GR_HINT_ALLOW_MIPMAP_DITHER, FXFALSE ); - grTexMipMapMode( GR_TMU0, GR_MIPMAP_DISABLE, FXFALSE ); - if (bVerboseMode) - tlConOutput( "MipMapMode: DISABLE " ); - break; - - case NEAREST: - grHints (GR_HINT_ALLOW_MIPMAP_DITHER, FXFALSE ); - grTexMipMapMode( GR_TMU0, GR_MIPMAP_NEAREST, FXFALSE ); - if (bVerboseMode) - tlConOutput( "MipMapMode: NEAREST " ); - break; - - case TRILINEAR: - grHints (GR_HINT_ALLOW_MIPMAP_DITHER, FXFALSE ); - grTexMipMapMode( GR_TMU0, GR_MIPMAP_NEAREST, FXTRUE ); - if (bVerboseMode) - tlConOutput( "MipMapMode: TRILINEAR " ); - break; - - case DITHRD_NREST: - grHints (GR_HINT_ALLOW_MIPMAP_DITHER, FXTRUE ); - grTexMipMapMode( GR_TMU0, GR_MIPMAP_NEAREST_DITHER, FXFALSE ); - if (bVerboseMode) - tlConOutput( "MipMapMode: NEAR_DITHRD " ); - break; - - case DITHRD_TRILIN: - grHints (GR_HINT_ALLOW_MIPMAP_DITHER, FXTRUE ); - grTexMipMapMode( GR_TMU0, GR_MIPMAP_NEAREST_DITHER, FXTRUE ); - if (bVerboseMode) - tlConOutput( "MipMapMode: NEAR_TRILNR " ); - break; - } /* switch( mipMapMode ) */ - - - switch( filterMode ) - { - case BOTH_POINT: - grTexFilterMode( GR_TMU0, GR_TEXTUREFILTER_POINT_SAMPLED, GR_TEXTUREFILTER_POINT_SAMPLED ); - if (bVerboseMode) - tlConOutput( "FltrMode: Point Samp\n" ); - break; - - case MIN_BILNEAR: - grTexFilterMode( GR_TMU0, GR_TEXTUREFILTER_BILINEAR, GR_TEXTUREFILTER_POINT_SAMPLED ); - if (bVerboseMode) - tlConOutput( "FltrMode: MinBilnr\n" ); - break; - - case MAG_BILNEAR: - grTexFilterMode( GR_TMU0, GR_TEXTUREFILTER_POINT_SAMPLED, GR_TEXTUREFILTER_BILINEAR ); - if (bVerboseMode) - tlConOutput( "FltrMode: MagBilnr\n" ); - break; - - case BOTH_BILNEAR: - grTexFilterMode( GR_TMU0, GR_TEXTUREFILTER_BILINEAR, GR_TEXTUREFILTER_BILINEAR ); - if (bVerboseMode) - tlConOutput( "FltrMode: BothBilnr\n" ); - break; - } /* switch( filterMode ) */ - - - /* do the Fg texturing stuff */ - if ((mipMapMode != TRILINEAR) && (mipMapMode != DITHRD_TRILIN)) - { - /* setup the Fg texture states */ - grTexLodBiasValue( GR_TMU0, fBiasLevel ); - grTexCombine( GR_TMU0, GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_BLEND_OTHER, GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_CONSTANT, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_SRC_ALPHA, GR_BLEND_ONE_MINUS_SRC_ALPHA, - GR_BLEND_ONE, GR_BLEND_ZERO ); - - /* set the Fg texture */ - plTxMnTexSource( hCurrFgTxtre, GR_MIPMAPLEVELMASK_BOTH ); - grDrawTriangle( &fgVerts[0], &fgVerts[1], &fgVerts[3] ); - grDrawTriangle( &fgVerts[1], &fgVerts[2], &fgVerts[3] ); - } /* if */ - else - { - /* setup system for the Even MipMaps */ - grTexLodBiasValue( GR_TMU0, fBiasLevel ); - grTexCombine( GR_TMU0, GR_COMBINE_FUNCTION_BLEND_LOCAL, GR_COMBINE_FACTOR_LOD_FRACTION, - GR_COMBINE_FUNCTION_BLEND_LOCAL,GR_COMBINE_FACTOR_LOD_FRACTION, - FXFALSE, FXFALSE ); - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_BLEND_OTHER, GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_CONSTANT, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_SRC_ALPHA, GR_BLEND_ONE_MINUS_SRC_ALPHA, - GR_BLEND_ONE, GR_BLEND_ZERO ); - - /* render with the Even MipMaps */ - plTxMnTexSource( hCurrFgTxtre, GR_MIPMAPLEVELMASK_EVEN ); - grDrawTriangle( &fgVerts[0], &fgVerts[1], &fgVerts[3] ); - grDrawTriangle( &fgVerts[1], &fgVerts[2], &fgVerts[3] ); - - /* setup system for the Odd MipMaps */ - grTexCombine( GR_TMU0, GR_COMBINE_FUNCTION_BLEND_LOCAL, GR_COMBINE_FACTOR_LOD_FRACTION, - GR_COMBINE_FUNCTION_BLEND_LOCAL,GR_COMBINE_FACTOR_LOD_FRACTION, - FXFALSE, FXFALSE ); - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_BLEND_OTHER, GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_CONSTANT, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ONE, GR_BLEND_ZERO, GR_BLEND_ZERO ); - - /* render with the Odd MipMaps */ - plTxMnTexSource( hCurrFgTxtre, GR_MIPMAPLEVELMASK_ODD ); - grDrawTriangle( &fgVerts[0], &fgVerts[1], &fgVerts[3] ); - grDrawTriangle( &fgVerts[1], &fgVerts[2], &fgVerts[3] ); - } /* else */ - - /* do the swap */ - tlConRender(); - grBufferSwap( 1 ); - - /* dynamic resizing */ - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - /* handle any keyboard input */ - while( tlKbHit() ) - { - switch( tlGetCH() ) - { - static int nCurrAlpha = -1; - GrTexInfo tFgTexInfo; - - case '+': - doScaleScreenSurf( hCurrFgTxtre, SCALE_OUT, tCurrScle ); - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case '-': - doScaleScreenSurf( hCurrFgTxtre, SCALE_IN, tCurrScle ); - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case 'a': - tlConClear(); - bVerboseMode = FXFALSE; - tlConOutput("Verbose mode Off\n"); - nCurrAlpha = (nCurrAlpha == 0) ? 0 : - (nCurrAlpha < 0) ? (int) alpha-1: --nCurrAlpha; - fxColorValue = ( 0x00FFFFFF | (nCurrAlpha << 24) ); - grConstantColorValue(fxColorValue); - tlConOutput("Current fxColorValue is %-#8x\n", fxColorValue); - break; - - case 'A': - tlConClear(); - bVerboseMode = FXFALSE; - tlConOutput("Verbose mode Off\n"); - nCurrAlpha = (nCurrAlpha == 255) ? 255 : - (nCurrAlpha < 0) ? (int) alpha+1: ++nCurrAlpha; - fxColorValue = ( 0x00FFFFFF | (nCurrAlpha << 24) ); - grConstantColorValue(fxColorValue); - tlConOutput("Current fxColorValue is %-#8x\n", fxColorValue); - break; - - case 'b': - mipMapMode++; - mipMapMode%=5; - /* set or unset the trilinear bit on all the fg textures */ - if ((mipMapMode == TRILINEAR) || (mipMapMode == DITHRD_TRILIN)) - for (hTmpTxtre = hFstFgTxtre; hTmpTxtre <= hLstFgTxtre; ++hTmpTxtre ) - plTxMnSetTrilinear( hTmpTxtre, FXTRUE ); - else - for (hTmpTxtre = hFstFgTxtre; hTmpTxtre <= hLstFgTxtre; ++hTmpTxtre ) - plTxMnSetTrilinear( hTmpTxtre, FXFALSE ); - - plTxMnDownloadAll(); /* remember to reset the TMU mem */ - break; - - case 'B': - filterMode++; - filterMode%=4; - break; - - case 'c': - case 'C': - tlConClear(); - break; - - case 'd': - tlConClear(); - bVerboseMode = FXFALSE; - tlConOutput("Verbose mode Off\n"); - plTxMnSetMultiOffsetFix( plTxMnGetMultiOffsetFix() ? FXFALSE : FXTRUE ); - tlConOutput( plTxMnGetMultiOffsetFix() ? "Multibase offset fix in\n" : - "Multibase offset fix NOT\n"); - plTxMnDownloadAll(); /* reset the tmu mem */ - break; - - case 'D': - tlConClear(); - bVerboseMode = FXFALSE; - tlConOutput("Verbose mode Off\n"); - plTxMnSetMultiRevOrder( plTxMnGetMultiRevOrder() ? FXFALSE : FXTRUE ); - tlConOutput( plTxMnGetMultiRevOrder() ? "Multibase in rev order\n" : - "Multibase in linear order\n"); - plTxMnDownloadAll(); /* reset the tmu mem */ - break; - - case 'e': - if (fBiasLevel > -8.00f) - fBiasLevel -= fBiasInc; - - grTexLodBiasValue( GR_TMU0, fBiasLevel ); - break; - - case 'E': - if (fBiasLevel < 7.750f) - fBiasLevel += fBiasInc; - - grTexLodBiasValue( GR_TMU0, fBiasLevel ); - break; - - case 'h': - case 'H': - doHelp(); - break; - - case 'l': - case 'L': - getLodToDwnld(); - if (g_bDoLodDwnld) - { - hDwlnSrcTxtre = H_NULL; - plTxMnGetInfo( hCurrFgTxtre, &tFgTexInfo ); - - for ( hTmpTxtre = hFstDwnlTxtre; hTmpTxtre <= hLstDwnlTxtre; ++hTmpTxtre) - { - plTxMnGetInfo( hTmpTxtre, &tmpTexInfo ); - if ((tFgTexInfo.format == tmpTexInfo.format) && - (tFgTexInfo.aspectRatio == tmpTexInfo.aspectRatio)) - { /* if they are compatible */ - hDwlnSrcTxtre = hTmpTxtre; - hTmpTxtre = hLstDwnlTxtre; /* get first occurence, short circut */ - } - } - - if (hDwlnSrcTxtre) - plTxMnDwnldMipMapLod( hCurrFgTxtre, hDwlnSrcTxtre, g_nLodToDwnld ); - else /* else still H_NULL */ - tlConOutput("No cmptble txtre format avlable\n"); - } - break; - - case 'm': - if ( plTxMnGetMultibase(hCurrFgTxtre) ) - plTxMnSetMultibase( hCurrFgTxtre, FXFALSE ); - else - plTxMnSetMultibase( hCurrFgTxtre, FXTRUE ); - - plTxMnDownloadAll(); /* reset the tmu mem */ - break; - - case 'M': - bBgImage = bBgImage ? FXFALSE : FXTRUE; - break; - - case 'o': - plPopLod( hCurrFgTxtre, btmOfMipMap ); - plTxMnDownloadAll(); /* reset the tmu mem */ - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case 'O': - plPopLod( hCurrFgTxtre, topOfMipMap ); - plTxMnDownloadAll(); /* reset the tmu mem */ - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case 'p': - case 'P': - getLodPrtlToDwnld(); - if (g_bDoLodPrtlDwnld) - { - hDwlnSrcTxtre = H_NULL; - plTxMnGetInfo( hCurrFgTxtre, &tFgTexInfo ); - - for ( hTmpTxtre = hFstDwnlTxtre; hTmpTxtre <= hLstDwnlTxtre; ++hTmpTxtre) - { - plTxMnGetInfo( hTmpTxtre, &tmpTexInfo ); - if ((tFgTexInfo.format == tmpTexInfo.format) && - (tFgTexInfo.aspectRatio == tmpTexInfo.aspectRatio)) - { /* if they are compatible */ - hDwlnSrcTxtre = hTmpTxtre; - hTmpTxtre = hLstDwnlTxtre; /* get first occurence, short circut */ - } - } - - if (hDwlnSrcTxtre) - plTxMnDwnldMipMapLodPrtl( hCurrFgTxtre, hDwlnSrcTxtre, g_nLodToDwnld, - g_nLodPrtlFstRow, g_nLodPrtlLstRow ); - else /* else still H_NULL */ - tlConOutput("No cmptble txtre format avlable\n"); - } - break; - - case 'r': - case 'R': - for (hTmpTxtre = hFstFgTxtre; hTmpTxtre <= hLstFgTxtre; ++hTmpTxtre ) - { - plTxMnReset( hTmpTxtre ); - doResetFgVerts( hTmpTxtre ); - } /* reset d'em puppies */ - - mipMapMode = DISABLE; - plTxMnDownloadAll(); /* reset the tmu mem */ - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case 't': - if (hCurrFgTxtre == hFstFgTxtre) - hCurrFgTxtre = hLstFgTxtre; - else - --hCurrFgTxtre; - - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case 'T': - if (hCurrFgTxtre == hLstFgTxtre) - hCurrFgTxtre = hFstFgTxtre; - else - ++hCurrFgTxtre; - - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case 'u': - plPushLod( hCurrFgTxtre, btmOfMipMap ); - plTxMnDownloadAll(); /* reset the tmu mem */ - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case 'U': - plPushLod( hCurrFgTxtre, topOfMipMap ); - plTxMnDownloadAll(); /* reset the tmu mem */ - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case 'v': - case 'V': - bVerboseMode = bVerboseMode ? FXFALSE : FXTRUE; - break; - - case 'w': - if (tCurrScle != SCALE_1) - --tCurrScle; - break; - - case 'W': - if (tCurrScle != SCALE_32) - ++tCurrScle; - break; - - default: - frames = 0; - break; - } /* switch( tlGetCH() ) */ - } /* while( tlKbHit() ) */ - } /* while (frames--) */ - - /* get the funk out */ - doUnloadTextures(); - grGlideShutdown(); - - exit(1); -} /* main */ - - - -static void -doHelp( void ) -{ - grBufferClear( 0, 0, 0 ); - tlConClear(); - tlConOutput("Keymap: (case sensitive - second letter lower case)\n"); - tlConOutput(" b (lc): cycles mipmap modes\n"); - tlConOutput(" B (uc): cycles filter modes\n"); - tlConOutput(" T xor t: cycles through fg texture formats\n"); - tlConOutput(" m (lc): toggles multibase for fg texture\n"); - tlConOutput(" M (uc): toggles the bg image\n"); - tlConOutput(" d (lc): toggles the mltbse offset fix\n"); - tlConOutput(" D (uc): toggles the order of the mltbse segs\n"); - tlConOutput(" L or l: LOD download menu\n"); - tlConOutput(" P or p: partial LOD download menu\n"); - tlConOutput(" R or r: resets all fg textures states\n"); - tlConOutput(" O xor o: pop lod off TOP or btm of stack\n"); - tlConOutput(" U xor u: push lod back on TOP or btm of stack\n"); - tlConOutput(" V or v: toggle verbose mode\n"); - tlConOutput(" + xor -: change size of fg obj by LOD frac\n"); - tlConOutput(" W xor w: change LOD frac\n"); - tlConOutput(" E xor e: INC or dec LOD Bias\n"); - tlConOutput(" A xor a: INC or dec alpha const\n"); - tlConOutput(" C or c: clears console\n"); - tlConOutput(" H or h: Help\n"); - tlConOutput(" Q or q: Quit\n"); - tlConOutput("Press a key to continue...\n"); - tlConRender(); - grBufferSwap( 1 ); - tlGetCH(); - - tlConClear(); -} - - - -static hTexId_t -doLoadTexture( const char *lpzFileName, GrTexInfo *tEtTexInfo, - FxU16 *yColors, FxBool isDwnldble ) -{ - /* definitions */ - static FxU8 lstTexIndx = 0; /* last available texture index */ - GrTexInfo *lpTmpTexInfo; - surfInfo_t *lpSurfInfo; - myTexture_t *lpTmpMyTxtre; /* for ease of read */ - double dNonFrac, ret; - - /* assumptions */ - assert( lpzFileName || tEtTexInfo ); - assert( lstTexIndx < NUMTEXTURES ); - - /* initializations */ - lpTmpMyTxtre = &theTextures[lstTexIndx]; - lpTmpMyTxtre->lpzTexFileName = lpzFileName; - - - /* code */ - lpTmpMyTxtre->lpTlTexture = (TlTexture*) malloc(sizeof(TlTexture)); - assert( lpTmpMyTxtre->lpTlTexture ); - lpTmpTexInfo = &lpTmpMyTxtre->lpTlTexture->info; - - if (lpzFileName != NULL) - { /* load from disk */ - assert(tlLoadTexture( lpTmpMyTxtre->lpzTexFileName, - &lpTmpMyTxtre->lpTlTexture->info, - &lpTmpMyTxtre->lpTlTexture->tableType, - &lpTmpMyTxtre->lpTlTexture->tableData)); - lpTmpTexInfo = &lpTmpMyTxtre->lpTlTexture->info; - } - else - { /* else create in RAM from template && lod color array */ - *lpTmpTexInfo = *tEtTexInfo; - lpTmpTexInfo->data = malloc(grTexCalcMemRequired(lpTmpTexInfo->smallLod, - lpTmpTexInfo->largeLod, - lpTmpTexInfo->aspectRatio, - lpTmpTexInfo->format)); - assert(lpTmpTexInfo->data); - plCreateTlTexture(lpTmpMyTxtre->lpTlTexture, yColors); - } - - /* save off the starting surface screen coords for this texture */ - lpSurfInfo = &lpTmpMyTxtre->surfInfo; - lpSurfInfo->currLod = lpTmpTexInfo->largeLod; - - - lpSurfInfo->fStartX = - ((scrWidth - (float) getLodWidth(lpSurfInfo->currLod, - lpTmpTexInfo->aspectRatio) )/2.f); - ret = modf((double) lpSurfInfo->fStartX, &dNonFrac); - lpSurfInfo->rStartX = (float) dNonFrac; - - lpSurfInfo->fEndX = - (lpSurfInfo->fStartX + (float) getLodWidth(lpSurfInfo->currLod, - lpTmpTexInfo->aspectRatio)); - ret = modf((double) lpSurfInfo->fEndX, &dNonFrac); - lpSurfInfo->rEndX = (float) dNonFrac; - - lpSurfInfo->fStartY = - ((scrHeight - (float) getLodHeight(lpSurfInfo->currLod, - lpTmpTexInfo->aspectRatio) )/2.f); - ret = modf((double) lpSurfInfo->fStartY, &dNonFrac); - lpSurfInfo->rStartY = (float) dNonFrac; - - lpSurfInfo->fEndY = - (lpSurfInfo->fStartY + (float) getLodHeight(lpSurfInfo->currLod, - lpTmpTexInfo->aspectRatio)); - ret = modf((double) lpSurfInfo->fEndY, &dNonFrac); - lpSurfInfo->rEndY = (float) dNonFrac; - /* done with surface coords */ - - /* give it to plTxMn */ - lpTmpMyTxtre->hTexture = plTxMnLoadTxMngr( lpTmpMyTxtre->lpTlTexture ); - plTxMnSetDownload( lpTmpMyTxtre->hTexture, isDwnldble ); - - ++lstTexIndx; - - return( lpTmpMyTxtre->hTexture ); -} - - - -static void -getFgVerts( hTexId_t deTexId, GrVertex *deFgVerts ) -{ - /* definitions */ - surfInfo_t *lpSurfInfo; - int i; - GrTexInfo tTexInfo; - float fSmulti, fTmulti; - - /* assumptions */ - assert( deTexId < NUMTEXTURES ); - assert( deFgVerts ); - - /* parse the texture array for the right one */ - for ( i = 0; (i < NUMTEXTURES) && (theTextures[i].hTexture != deTexId) ; ++i ); - if (i == NUMTEXTURES) - return; /* texture not found */ - - /* initializations */ - lpSurfInfo = &theTextures[i].surfInfo; - tTexInfo = theTextures[i].lpTlTexture->info; - fSmulti = aspctToTxtreCrdFctrs[tTexInfo.aspectRatio].sMult; - fTmulti = aspctToTxtreCrdFctrs[tTexInfo.aspectRatio].tMult; - - /*---- - 0-1 - |/| - 3-2 - -----*/ - - deFgVerts[0].x = lpSurfInfo->rStartX+0.5f; - deFgVerts[0].y = lpSurfInfo->rStartY+0.5f; - deFgVerts[0].tmuvtx[0].sow = 0.f * (fSmulti) * deFgVerts[0].oow; - deFgVerts[0].tmuvtx[0].tow = 0.f * (fTmulti) * deFgVerts[0].oow; - - deFgVerts[1].x = lpSurfInfo->rEndX+0.5f; - deFgVerts[1].y = lpSurfInfo->rStartY+0.5f; - deFgVerts[1].tmuvtx[0].sow = 1.f * (fSmulti) * deFgVerts[1].oow; - deFgVerts[1].tmuvtx[0].tow = 0.f * (fTmulti) * deFgVerts[1].oow; - - deFgVerts[2].x = lpSurfInfo->rEndX+0.5f; - deFgVerts[2].y = lpSurfInfo->rEndY+0.5f; - deFgVerts[2].tmuvtx[0].sow = 1.f * (fSmulti) * deFgVerts[2].oow; - deFgVerts[2].tmuvtx[0].tow = 1.f * (fTmulti) * deFgVerts[2].oow; - - deFgVerts[3].x = lpSurfInfo->rStartX+0.5f; - deFgVerts[3].y = lpSurfInfo->rEndY+0.5f; - deFgVerts[3].tmuvtx[0].sow = 0.f * (fSmulti) * deFgVerts[3].oow; - deFgVerts[3].tmuvtx[0].tow = 1.f * (fTmulti) * deFgVerts[3].oow; -} - - - -static void -doScaleScreenSurf( hTexId_t deTexId, ScaleDir_t deScleDir, ScaleAmt_t deScleAmt ) -{ - /* definitions */ - myTexture_t *lpTmpMyTxtre; - surfInfo_t *lpSurfInfo; - GrTexInfo *lpTexInfo; - int i; - int nNumScles; - float fScleAmt; - GrLOD_t tLodToScle; - GrAspectRatio_t tCurrAspct; - double dNonFrac, ret; - const float fScleLCD = 32.f; //least common scale denominator - - /* assumptions */ - assert( deTexId < NUMTEXTURES ); - - /* parse the texture array for the right one */ - for ( i = 0; (i < NUMTEXTURES) && (theTextures[i].hTexture != deTexId) ; ++i ); - if (i == NUMTEXTURES) - return; - - /* initializations */ - lpTmpMyTxtre = &theTextures[i]; - lpSurfInfo = &lpTmpMyTxtre->surfInfo; - lpTexInfo = &lpTmpMyTxtre->lpTlTexture->info; - - if ((lpSurfInfo->currLod == GR_LOD_1) && (deScleDir == SCALE_IN)) - return; - - if ((lpSurfInfo->currLod >= GR_LOD_32) && (deScleAmt > SCALE_8)) - deScleAmt = SCALE_8; - - /* do everything as multiples of (1/8)LOD jmps, (1)LOD jmp becomes 8*1/8 */ - nNumScles = ( (int) fScleLCD) >> deScleAmt; - - /* scale by a frac of the next LOD your are scaling to */ - tLodToScle = lpSurfInfo->currLod +1; - - tCurrAspct = lpTexInfo->aspectRatio; /* ease of read */ - fScleAmt = 0.0f; /* init then go */ - for ( i = 0; i < nNumScles; ++i) - { - /* check to see if i am in another LOD, scale change */ - if (deScleDir == SCALE_IN) - { - if ( (lpSurfInfo->rEndX - lpSurfInfo->rStartX == - (float) getLodWidth(tLodToScle, tCurrAspct)) && - (lpSurfInfo->rEndY - lpSurfInfo->rStartY == - (float) getLodHeight(tLodToScle, tCurrAspct)) ) - { - ++lpSurfInfo->currLod; - tLodToScle = lpSurfInfo->currLod +1; - } - } - else - { - if ( (lpSurfInfo->rEndX - lpSurfInfo->rStartX == - (float) getLodWidth(lpSurfInfo->currLod, tCurrAspct)) && - (lpSurfInfo->rEndY - lpSurfInfo->rStartY == - (float) getLodHeight(lpSurfInfo->currLod, tCurrAspct)) ) - { - if (lpSurfInfo->currLod != GR_LOD_256) - --lpSurfInfo->currLod; - tLodToScle = lpSurfInfo->currLod +1;// == GR_LOD_256 ? GR_LOD_128 : lpSurfInfo->currLod; - } - } - - - if ( !((deScleDir == SCALE_OUT) && /* is there somtin' to do */ - (getLodWidth(tLodToScle, tCurrAspct) == getLodWidth(tLodToScle -1, tCurrAspct)))) - { - fScleAmt = ((float) getLodWidth(tLodToScle, tCurrAspct)) / fScleLCD / 2.f; - lpSurfInfo->fStartX += deScleDir * fScleAmt; - ret = modf((double) lpSurfInfo->fStartX, &dNonFrac); - lpSurfInfo->rStartX = (float) dNonFrac + - (ret > 0.5f ? 1.0f : ret == 0.0f ? 0.0f : 0.5f); - - lpSurfInfo->fEndX -= deScleDir * fScleAmt; - if ((lpSurfInfo->fStartX) == (lpSurfInfo->fEndX)) - lpSurfInfo->fEndX += 1.0f; - ret = modf((double) lpSurfInfo->fEndX, &dNonFrac); - lpSurfInfo->rEndX = (float) dNonFrac + - (ret > 0.5f ? 1.0f : ret == 0.0f ? 0.0f : 0.5f); - } - - - - if ( !((deScleDir == SCALE_OUT) && /* is there somtin' to do */ - (getLodHeight(tLodToScle, tCurrAspct) == getLodHeight(tLodToScle -1, tCurrAspct)))) - { - fScleAmt = ((float) getLodHeight(tLodToScle, tCurrAspct)) / fScleLCD / 2.f; - - lpSurfInfo->fStartY += deScleDir * fScleAmt; - ret = modf((double) lpSurfInfo->fStartY, &dNonFrac); - lpSurfInfo->rStartY = (float) dNonFrac + - (ret > 0.5f ? 1.0f : ret == 0.0f ? 0.0f : 0.5f); - - lpSurfInfo->fEndY -= deScleDir * fScleAmt; - if ((lpSurfInfo->fStartY) == (lpSurfInfo->fEndY)) - lpSurfInfo->fEndY += 1.0f; - ret = modf((double) lpSurfInfo->fEndY, &dNonFrac); - lpSurfInfo->rEndY = (float) dNonFrac + - (ret > 0.5f ? 1.0f : ret == 0.0f ? 0.0f : 0.5f); - } - } -} /* doScaleScreenSurf */ - - - -static int -getLodWidth( GrLOD_t lod, GrAspectRatio_t aspect ) -{ - int yAspctWdvdr[] = {0, 0, 0, 0, 1, 2, 3}; - int yLodFctr[] = {8, 7, 6, 5, 4, 3, 2, 1, 0}; - int val; - - val = yLodFctr[lod] > yAspctWdvdr[aspect] ? - 1 << yLodFctr[lod] >> yAspctWdvdr[aspect] : 1; - - return( val ); -} - - - -static int -getLodHeight( GrLOD_t lod, GrAspectRatio_t aspect ) -{ - int yAspctHdvdr[] = {3, 2, 1, 0, 0, 0, 0}; - int yLodFctr[] = {8, 7, 6, 5, 4, 3, 2, 1, 0}; - int val; - - val = yLodFctr[lod] > yAspctHdvdr[aspect] ? - 1 << yLodFctr[lod] >> yAspctHdvdr[aspect] : 1; - - return( val ); -} - - - -static void -doUnloadTextures( ) -{ - int i; - - for ( i = 0; i < NUMTEXTURES; ++i ) - { /* free the textures, if they love you they'll come back */ - free(theTextures[i].lpTlTexture->info.data); - free(theTextures[i].lpTlTexture); - } -} - - - -static void -getLodToDwnld( ) -{ - /* definitions */ - char ch; - - /* initializations */ - g_bDoLodDwnld = FXFALSE; - - /* code */ - tlConClear(); - grBufferClear( 0, 0, 0 ); - grBufferSwap( 1 ); - grBufferClear( 0, 0, 0 ); - tlConOutput("LOD Download menu\n"); - tlConOutput("Choose LOD 0-8 "); - tlConRender(); - grBufferSwap( 1 ); - ch = tlGetCH(); - g_nLodToDwnld = atoi(&ch); - - if ((g_nLodToDwnld >= GR_LOD_256) && (g_nLodToDwnld <= GR_LOD_1)) - { - tlConOutput("%d\n", g_nLodToDwnld); - tlConRender(); - grBufferSwap( 1 ); - g_bDoLodDwnld = FXTRUE; - } - else - tlConOutput("invalid LOD\n"); - - tlConRender(); - grBufferSwap( 1 ); -} - - - -static void -getLodPrtlToDwnld( ) -{ - /* definitions */ - char ch; - int i; - - /* initializations */ - g_nLodToDwnld = 0x0; - g_bDoLodPrtlDwnld = FXFALSE; - g_nLodPrtlFstRow = 0x0; - g_nLodPrtlLstRow = 0x0; - - /* code */ - tlConClear(); - grBufferClear( 0, 0, 0 ); - grBufferSwap( 1 ); - grBufferClear( 0, 0, 0 ); - tlConOutput("LOD Prtl Dwnld menu\n"); - tlConOutput("Choose LOD 0-8 "); - tlConRender(); - grBufferSwap( 1 ); - ch = tlGetCH(); - g_nLodToDwnld = atoi(&ch); - - if ((g_nLodToDwnld >= GR_LOD_256) && (g_nLodToDwnld <= GR_LOD_1)) - { - tlConOutput("%d\n", g_nLodToDwnld); - tlConRender(); - grBufferSwap( 1 ); - - tlConOutput("Entr Fst Row 000-255 "); - tlConRender(); - grBufferSwap( 1 ); - for ( i = 0; i < 3; ++i ) - { - ch = tlGetCH(); - tlConOutput("%c", ch); - tlConRender(); - grBufferSwap( 1 ); - g_nLodPrtlFstRow = (g_nLodPrtlFstRow * 0xA) + atoi(&ch); - } - tlConOutput(" %d\n", g_nLodPrtlFstRow); - tlConRender(); - grBufferSwap( 1 ); - - tlConOutput("Entr Lst Row 000-255 "); - tlConRender(); - grBufferSwap( 1 ); - for ( i = 0; i < 3; ++i ) - { - ch = tlGetCH(); - tlConOutput("%c", ch); - tlConRender(); - grBufferSwap( 1 ); - g_nLodPrtlLstRow = (g_nLodPrtlLstRow * 0xA) + atoi(&ch); - } - tlConOutput(" %d\n", g_nLodPrtlLstRow); - tlConRender(); - grBufferSwap( 1 ); - - if (((g_nLodPrtlFstRow >= 0x0) && (g_nLodPrtlFstRow < 0x100)) && - ((g_nLodPrtlLstRow >= 0x0) && (g_nLodPrtlLstRow < 0x100))) - g_bDoLodPrtlDwnld = FXTRUE; - else - tlConOutput("invalid Row(s)\n"); - } - else - tlConOutput("invalid LOD\n"); - - tlConRender(); - grBufferSwap( 1 ); -} - - - -static void -doResetFgVerts( hTexId_t deTexId ) -{ - /* definitions */ - surfInfo_t *lpSurfInfo; - GrTexInfo *lpTexInfo; - int i; - double ret, dNonFrac; - - /* code */ - - /* parse the texture array for the right one */ - for ( i = 0; (i < NUMTEXTURES) && (theTextures[i].hTexture != deTexId) ; ++i ); - if (i == NUMTEXTURES) - return; - - /* initializations */ - lpSurfInfo = &theTextures[i].surfInfo; - lpSurfInfo->currLod = theTextures[i].lpTlTexture->info.largeLod; - lpTexInfo = &theTextures[i].lpTlTexture->info; - - /* reset the surf info */ - lpSurfInfo->fStartX = - ((scrWidth - (float) getLodWidth(lpSurfInfo->currLod, - lpTexInfo->aspectRatio) )/2.f); - ret = modf((double) lpSurfInfo->fStartX, &dNonFrac); - lpSurfInfo->rStartX = (float) dNonFrac; - - lpSurfInfo->fEndX = - (lpSurfInfo->fStartX + (float) getLodWidth(lpSurfInfo->currLod, - lpTexInfo->aspectRatio)); - ret = modf((double) lpSurfInfo->fEndX, &dNonFrac); - lpSurfInfo->rEndX = (float) dNonFrac; - - lpSurfInfo->fStartY = - ((scrHeight - (float) getLodHeight(lpSurfInfo->currLod, - lpTexInfo->aspectRatio) )/2.f); - ret = modf((double) lpSurfInfo->fStartY, &dNonFrac); - lpSurfInfo->rStartY = (float) dNonFrac; - - lpSurfInfo->fEndY = - (lpSurfInfo->fStartY + (float) getLodHeight(lpSurfInfo->currLod, - lpTexInfo->aspectRatio)); - ret = modf((double) lpSurfInfo->fEndY, &dNonFrac); - lpSurfInfo->rEndY = (float) dNonFrac; - /* done with surface coords */ -} - diff --git a/glide2x/h3/glide/tests/qatest00.h b/glide2x/h3/glide/tests/qatest00.h deleted file mode 100644 index 45822c8..0000000 --- a/glide2x/h3/glide/tests/qatest00.h +++ /dev/null @@ -1,94 +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 _QATEST00_H_ -#define _QATEST00_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#define RED_565 0xF800 -#define GRN_565 0x07E0 -#define BLU_565 0x001F -#define RED_1555 0x7C00 -#define GRN_1555 0x03E0 -#define BLU_1555 0x001F -#define RED_4444 0x0F00 -#define GRN_4444 0x00F0 -#define BLU_4444 0x000F -#define RED_332 0x00E0 -#define GRN_332 0x001C -#define BLU_332 0x0003 -#define RED_8332 0x00E0 -#define GRN_8332 0x001C -#define BLU_8332 0x0003 - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - -typedef enum { DISABLE, NEAREST, TRILINEAR, DITHRD_NREST, DITHRD_TRILIN } MipMapMode_t; -typedef enum { SCALE_IN=1, SCALE_OUT=-1 } ScaleDir_t; //sign -typedef enum { SCALE_1=0, SCALE_2, SCALE_4, SCALE_8, SCALE_16, SCALE_32 } ScaleAmt_t;//bitwise shift factor -typedef enum { BOTH_POINT, MIN_BILNEAR, MAG_BILNEAR, BOTH_BILNEAR } FilterMode_t; - -typedef struct { - float fStartX, fEndX; - float rStartX, rEndX; - float fStartY, fEndY; - float rStartY, rEndY; - GrLOD_t currLod; -} surfInfo_t; - -typedef struct { - const char *lpzTexFileName; - TlTexture *lpTlTexture; - hTexId_t hTexture; - surfInfo_t surfInfo; -} myTexture_t; - -typedef struct -{ - float sMult; - float tMult; -} TexCoordFactors; - - -static void doHelp( void ); -static hTexId_t doLoadTexture( const char *lpzFileName, GrTexInfo *tEtTexInfo, - FxU16 *yColors, FxBool isDwnldble ); -static void doUnloadTextures( ); -static void doScaleScreenSurf( hTexId_t deTexId, ScaleDir_t deDir, ScaleAmt_t deAmt ); -static void getFgVerts( hTexId_t deTexId, GrVertex *deFgVerts ); -static int getLodWidth( GrLOD_t lod, GrAspectRatio_t aspect ); -static int getLodHeight( GrLOD_t lod, GrAspectRatio_t aspect ); -static void getLodToDwnld( ); -static void getLodPrtlToDwnld( ); -static void doResetFgVerts( hTexId_t deTexId ); - -#ifdef NDEBUG -#undef NDEBUG -#endif - -#ifdef __cplusplus -} -#endif -#endif diff --git a/glide2x/h3/glide/tests/qatest01.c b/glide2x/h3/glide/tests/qatest01.c deleted file mode 100644 index 7e9bcd1..0000000 --- a/glide2x/h3/glide/tests/qatest01.c +++ /dev/null @@ -1,171 +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 -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - -#define RED_565 0xF800 -#define GRN_565 0x07E0 -#define BLU_565 0x001F -#define INVBLU_565 0xFFE0 -#define INVGRN_565 0xF81F -#define INVRED_565 0x07FF -#define WHT_565 0xFFFF -#define BLK_565 0x0000 - -#define NUM_X_BLCKS 7 -#define NUM_Y_BLCKS 7 - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "QATEST01"; -static const char purpose[] = "Buffer Swap Alliance bug"; -static const char usage[] = "-n -r -d "; - - -int main( int argc, char **argv) -{ - /* Definitions */ - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - - GrLfbInfo_t myLfbInfo; - int nBlckWdth; - int nBlckHght; - - FxU16 yBlckClrs[NUM_Y_BLCKS][NUM_X_BLCKS] = - {{RED_565, GRN_565, BLU_565, INVRED_565, INVGRN_565, INVBLU_565, WHT_565}, - {RED_565, GRN_565, BLU_565, INVRED_565, INVGRN_565, INVBLU_565, WHT_565}, - {RED_565, GRN_565, BLU_565, INVRED_565, INVGRN_565, INVBLU_565, WHT_565}, - {RED_565, GRN_565, BLU_565, INVRED_565, INVGRN_565, INVBLU_565, WHT_565}, - {RED_565, GRN_565, BLU_565, INVRED_565, INVGRN_565, INVBLU_565, WHT_565}, - {RED_565, GRN_565, BLU_565, INVRED_565, INVGRN_565, INVBLU_565, WHT_565}, - {BLK_565, BLK_565, BLK_565, BLK_565, BLK_565, BLK_565, BLK_565}}; - - - /* Initializations */ - nBlckWdth = ((int) scrWidth / NUM_X_BLCKS); - nBlckHght = ((int) scrHeight / NUM_Y_BLCKS); - - /* Code */ - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &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_UPPER_LEFT, 2, 1 ) ); - - myLfbInfo.size = sizeof(GrLfbInfo_t); - if ( !grLfbLock(GR_LFB_WRITE_ONLY, GR_BUFFER_BACKBUFFER, GR_LFBWRITEMODE_565, - GR_ORIGIN_UPPER_LEFT, FXFALSE, &myLfbInfo)) - frames=0; - - while ( frames-- ) - { - int i, j, k, l; - FxU16 *lpPxl; - FxU32 stride = myLfbInfo.strideInBytes; - void *tmpLfb; - - tmpLfb = (void*) ((FxU16*)myLfbInfo.lfbPtr + 1 + 2*stride/2); - grBufferClear( 0xffffff, 0, GR_WDEPTHVALUE_FARTHEST ); - - for (i=0; i < NUM_Y_BLCKS; ++i) { - for (j=0; j < NUM_X_BLCKS; ++j) { - lpPxl = ((FxU16 *) tmpLfb + j*nBlckWdth) + - (i*nBlckHght*stride/2); - for(k=0; k < nBlckHght; ++k) { - for (l=0; l < nBlckWdth; ++l) { - *lpPxl = yBlckClrs[i][j]; - ++lpPxl; - } - lpPxl += (stride/2 - nBlckWdth); /* inc in pixel space */ - } - } - } - - grBufferSwap( 1 ); - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - if ( tlKbHit() ) frames = 0; - } - grLfbUnlock( GR_LFB_WRITE_ONLY, GR_BUFFER_BACKBUFFER ); - grGlideShutdown(); - exit(0); -} diff --git a/glide2x/h3/glide/tests/rgb332.3df b/glide2x/h3/glide/tests/rgb332.3df deleted file mode 100644 index f06219a..0000000 Binary files a/glide2x/h3/glide/tests/rgb332.3df and /dev/null differ diff --git a/glide2x/h3/glide/tests/rgb565.3df b/glide2x/h3/glide/tests/rgb565.3df deleted file mode 100644 index e5fbeda..0000000 --- a/glide2x/h3/glide/tests/rgb565.3df +++ /dev/null @@ -1,748 +0,0 @@ -3df v1.1 -rgb565 -lod range: 1 256 -aspect ratio: 1 1 -R‹R‹k/k/rÍjÍjÎjÍc/c/c/c/bŒbŒR‹R‹R -R -R‹R‹bŒbŒjÍj̓p{oƒp{ok-k-s/k/ƒÏƒÏ”2Œ1“ЋЃЃГЋЃЃЃЃГЋЃЃЃЃЃЃГЋЃЃÐc,c,ZJbJbŒbŒR‹R‹bŒbŒZÌZÌbŒbŒbŒbŒR‹R‹jÍjÍR‹R‹bŒbŒR‹R‹R‹R‹R‹R‹R -R -R -R -R‹R‹bŒbŒc-c-jÎjÍc/c/k/k/s/k/c/c/bŒbŒc/c/c/c/bŒbŒR‹R‹R -R -R‹R‹R -R -R‹R‹c/c/k/k/bJZJR -R -R‹R‹bŒbŒc/c/ZÌZÌbŒbŒR -R -R‹R‹R‹R‹bŒbŒk/k/“ГÐk/k/k-s-ƒÐƒÐƒÏƒÏ”2Œ1ƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÏƒÏ“ЋЃЃЃЃГЋЃЃÐk/k/bŒbŒR‹R‹ZJbJZÌZÌZJbJZÌZÌZÌZÌbŒbŒR‹R‹jÍjÍbŒbŒR‹R‹R‹R‹R‹R‹R -R -R -R -R‹R‹R‹R‹jÍjÍZÌZÌc/c/k/k/s/k/k/k/c/c/bŒbŒk/k/c/c/c/c/ƒÏƒÏZJbJR‹R‹R‹R‹R -R -R‹R‹k/k/rÍjÍjÎjÍc/c/c/c/bŒbŒR‹R‹R -R -R‹R‹bŒbŒjÍj̓p{oƒp{ok-k-s/k/ƒÏƒÏ”2Œ1“ЋЃЃГЋЃЃЃЃГЋЃЃЃЃЃЃГЋЃЃÐc,c,ZJbJbŒbŒR‹R‹bŒbŒZÌZÌbŒbŒbŒbŒR‹R‹jÍjÍR‹R‹bŒbŒR‹R‹R‹R‹R‹R‹R -R -R -R -R‹R‹bŒbŒc-c-jÎjÍc/c/k/k/s/k/c/c/bŒbŒc/c/c/c/bŒbŒR‹R‹R -R -R‹R‹R -R -R‹R‹c/c/k/k/bJZJR -R -R‹R‹bŒbŒc/c/ZÌZÌbŒbŒR -R -R‹R‹R‹R‹bŒbŒk/k/“ГÐk/k/k-s-ƒÐƒÐƒÏƒÏ”2Œ1ƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÏƒÏ“ЋЃЃЃЃГЋЃЃÐk/k/bŒbŒR‹R‹ZJbJZÌZÌZJbJZÌZÌZÌZÌbŒbŒR‹R‹jÍjÍbŒbŒR‹R‹R‹R‹R‹R‹R -R -R -R -R‹R‹R‹R‹jÍjÍZÌZÌc/c/k/k/s/k/k/k/c/c/bŒbŒk/k/c/c/c/c/ƒÏƒÏZJbJR‹R‹R‹R‹R -R -bbbbZZbbjËjË{.{.YÇYÇAGAGQEQEAGAGAÇAÇAGAGAEAEA†A†A†A†QEQEAÇAÇI†I†QÇQÇQÇQÇI‡I‡QÇQÇQÇQÇI†I†AGAGAEAEAEAEQÇQÇAGAGAEAEAGAGA†A†I†I†YÇYÇjŠjŠk/k/s-k-jËjËs-k-{,{,jÍjÍ{,{,{.{.{.{.k/k/s-k-jËjËrÍjÍk.k-s/k/jËjËr‰j‰bbZZjŠjŠjËjËr‰j‰jËjËrËjËjËjËrËjËjËjËrËjËjËjËrjY†Y†YEYEY†Y†iÇiÇs/k/bIbIY†Y†A&A&QÇQÇAGAGAÇAÇA†A†IEIEAGAGA†A†QEQEAÇAÇQÇQÇQÇQÇQÇQÇQÇQÇI†I†QÇQÇI†I†AGAGA$A$AÇAÇQÇQÇIEIEIEIEAGAGAÇAÇY†Y†bb{oƒpc,c,jÍjÍ{,{,jËjËs-k-k.k-{,{,{.{.k/k/s-k-{,{,jÍjÍ{.{.œ“œ“{.{.j‰j‰rIjIbbbIbIjŠjŠjËjËrËjËj‰j‰rËjËjŠjŠjËjËrËjËbŒbŒbbbbZZbbjËjË{.{.YÇYÇAGAGQEQEAGAGAÇAÇAGAGAEAEA†A†A†A†QEQEAÇAÇI†I†QÇQÇQÇQÇI‡I‡QÇQÇQÇQÇI†I†AGAGAEAEAEAEQÇQÇAGAGAEAEAGAGA†A†I†I†YÇYÇjŠjŠk/k/s-k-jËjËs-k-{,{,jÍjÍ{,{,{.{.{.{.k/k/s-k-jËjËrÍjÍk.k-s/k/jËjËr‰j‰bbZZjŠjŠjËjËr‰j‰jËjËrËjËjËjËrËjËjËjËrËjËjËjËrjY†Y†YEYEY†Y†iÇiÇs/k/bIbIY†Y†A&A&QÇQÇAGAGAÇAÇA†A†IEIEAGAGA†A†QEQEAÇAÇQÇQÇQÇQÇQÇQÇQÇQÇI†I†QÇQÇI†I†AGAGA$A$AÇAÇQÇQÇIEIEIEIEAGAGAÇAÇY†Y†bb{oƒpc,c,jÍjÍ{,{,jËjËs-k-k.k-{,{,{.{.k/k/s-k-{,{,jÍjÍ{.{.œ“œ“{.{.j‰j‰rIjIbbbIbIjŠjŠjËjËrËjËj‰j‰rËjËjŠjŠjËjËrËjËbŒbŒQEQE@å@åI$I$I$I$YÉYÉk-k-QEQEHäHä@ä@ä0Ä0ä0Ä0ä0Ä0ã0Ä0ã8Ä8äHäHäAEAEHäHä0Ä0ä@ä@ä0Ä0ä8ä8ã8Ä8ä8Ä8ä8Ä8ä8Ä8ä8ä8ã8Ä8äA$A$IEIE@ä@ä0Ä0ä0Ä0ä@å@åI$I$bIbI{.{.aÇaÇQEQEQEQEQEQEQEQEAGAGYEYEaÇaÇY†Y†I‡I‡aÇaÇaÇaÇbŒbŒc,c,QEQEQEQE@å@åQEQEI$I$HäHäYEYEYEYEYDYDYEYEYEYEYEYEYEYEYEYEYEYEYEYEY†Y†Y†Y†Y†Y†jÍjÍbb8Ä8ä@ä@ä@ä@ä0Ä0ã0Ä0ã8Ä8ä0Ä0ä@ä@äHäHäAEAE8Ã8Ä@ä@ä0Ä0ä@ä@ä0Ä0ä0Ä0ä8Ä8ä8Ä8ä8ä8ã8Ä8ä8Ä8äIEIE8Ä8ä8Ä8ä0Ä0ã8Ä8äQEQEYEYEk/k/rjYEYEA&A&QEQEQEQEQEQEYEYEI‡I‡a†a†aÇaÇI‡I‡Y†Y†jIjIƒÒƒÑZZQEQE@ä@äQEQEQEQEI$I$YEYEYDYDYEYEYDYDYEYEYEYEYEYEYEYEQEQE@å@åI$I$I$I$YÉYÉk-k-QEQEHäHä@ä@ä0Ä0ä0Ä0ä0Ä0ã0Ä0ã8Ä8äHäHäAEAEHäHä0Ä0ä@ä@ä0Ä0ä8ä8ã8Ä8ä8Ä8ä8Ä8ä8Ä8ä8ä8ã8Ä8äA$A$IEIE@ä@ä0Ä0ä0Ä0ä@å@åI$I$bIbI{.{.aÇaÇQEQEQEQEQEQEQEQEAGAGYEYEaÇaÇY†Y†I‡I‡aÇaÇaÇaÇbŒbŒc,c,QEQEQEQE@å@åQEQEI$I$HäHäYEYEYEYEYDYDYEYEYEYEYEYEYEYEYEYEYEYEYEYEY†Y†Y†Y†Y†Y†jÍjÍbb8Ä8ä@ä@ä@ä@ä0Ä0ã0Ä0ã8Ä8ä0Ä0ä@ä@äHäHäAEAE8Ã8Ä@ä@ä0Ä0ä@ä@ä0Ä0ä0Ä0ä8Ä8ä8Ä8ä8ä8ã8Ä8ä8Ä8äIEIE8Ä8ä8Ä8ä0Ä0ã8Ä8äQEQEYEYEk/k/rjYEYEA&A&QEQEQEQEQEQEYEYEI‡I‡a†a†aÇaÇI‡I‡Y†Y†jIjIƒÒƒÑZZQEQE@ä@äQEQEQEQEI$I$YEYEYDYDYEYEYDYDYEYEYEYEYEYEYEYEY†Y†YEYEA&A&@å@åaÇaÇjÍjÍQEQE@ä@ä8Ä8ä0Ä0ã(ä(ä(ä(ä8Ä8ä0Ä0ä8Ä8äAEAE@ä@ä0Ä0ä0Ä0ã8Ä8ä0Ä0ä(ä(ä8Ä8ä(ä(ä9$9$8Ä8ä8Ä8ä9E9E8Ä8ä8Ä8ä8Ä8ä8ä8ã8Ä8äQEQEjjs/k/I‡I‡QEQEA&A&YEYEI‡I‡Y†Y†I‡I‡Y†Y†I‡I‡aÇaÇI‡I‡a†a†{.{.bŒbŒY†Y†QEQEA&A&QEQEA&A&QEQEQEQEQEQEHäHäYEYEa†a†Y†Y†Y†Y†I‡I‡Y†Y†I‡I‡YEYEY†Y†Y†Y†bŒbŒR -R -HäHä@ä@ä0Ä0ã(ä(ä(ä(ä(ä(ä0Ä0ä@ä@ä8Ä8ä@å@å0Ã0ä8Ä8ä0Ä0ã(ä(ä0Ä0ä8Ä8ä8Ä8ä(ä(ä8Ä8äA$A$8Ä8ä9E9E@ä@ä8Ä8äA$A$8Ä8ä@å@åY†Y†k/k/bbAGAGQEQEAGAGYEYEI‡I‡aÇaÇI‡I‡aÇaÇI‡I‡Y†Y†YÉYÉjIjIƒo{pI‡I‡YEYEAGAGQEQEA&A&QEQEQEQEQEQEQEQEQEQEQEQEY†Y†QEQEY†Y†Y†Y†YEYEA&A&@å@åaÇaÇjÍjÍQEQE@ä@ä8Ä8ä0Ä0ã(ä(ä(ä(ä8Ä8ä0Ä0ä8Ä8äAEAE@ä@ä0Ä0ä0Ä0ã8Ä8ä0Ä0ä(ä(ä8Ä8ä(ä(ä9$9$8Ä8ä8Ä8ä9E9E8Ä8ä8Ä8ä8Ä8ä8ä8ã8Ä8äQEQEjjs/k/I‡I‡QEQEA&A&YEYEI‡I‡Y†Y†I‡I‡Y†Y†I‡I‡aÇaÇI‡I‡a†a†{.{.bŒbŒY†Y†QEQEA&A&QEQEA&A&QEQEQEQEQEQEHäHäYEYEa†a†Y†Y†Y†Y†I‡I‡Y†Y†I‡I‡YEYEY†Y†Y†Y†bŒbŒR -R -HäHä@ä@ä0Ä0ã(ä(ä(ä(ä(ä(ä0Ä0ä@ä@ä8Ä8ä@å@å0Ã0ä8Ä8ä0Ä0ã(ä(ä0Ä0ä8Ä8ä8Ä8ä(ä(ä8Ä8äA$A$8Ä8ä9E9E@ä@ä8Ä8äA$A$8Ä8ä@å@åY†Y†k/k/bbAGAGQEQEAGAGYEYEI‡I‡aÇaÇI‡I‡aÇaÇI‡I‡Y†Y†YÉYÉjIjIƒo{pI‡I‡YEYEAGAGQEQEA&A&QEQEQEQEQEQEQEQEQEQEQEQEY†Y†QEQEY†Y†Y†Y†A&A&@å@åA$A$YÉYÉc,c,YEYE8Ä8ä8Ä8ä ä ä0Ä0ä0Ä0ã(ä(ä8Ä8äA$A$@å@å8Ä8ä8Ä8äA$A$(ä(ä8Ä8ä(ä(ä8Ä8ä8Ä8ä9$9$8Ä8ä9$9$@å@åIEIE8Ä8ä8Ä8ä9$9$8Ä8äIEIEZZk/k/aÇaÇI‡I‡YEYEI‡I‡AGAGY†Y†I‡I‡aÇaÇI‡I‡Y†Y†I‡I‡aÇaÇ{.{.k/k/QEQEQEQEA&A&QEQEA&A&I†I†A&A&I‡I‡QEQEAGAGYEYEAGAGaÇaÇYÉYÉaÇaÇYÉYÉaÇaÇYÉYÉI‡I‡jÎjÍrj@ä@ä8Ä8ä ä ä0Ä0ä0Ä0ä0Ä0ã8Ä8ä8Ä8äA$A$A$A$8Ä8äA$A$(ä(ä8Ä8ä8Ä8ä(ä(ä8Ä8ä9$9$8Ä8ä8Ä8ä9E9E@å@åAEAE0Ä0ä0Ä0ã8Ä8äIEIEQEQEk/k/bJZJY†Y†Y†Y†YEYEI‡I‡AGAGI‡I‡Y†Y†I‡I‡aÇaÇI‡I‡Y†Y†jŠjŠ{oƒpYÈYÉQEQEA&A&@å@åQEQEA&A&AGAGA&A&I‡I‡QEQEYÉYÉQEQEAGAGY†Y†Y†Y†A&A&@å@åA$A$YÉYÉc,c,YEYE8Ä8ä8Ä8ä ä ä0Ä0ä0Ä0ã(ä(ä8Ä8äA$A$@å@å8Ä8ä8Ä8äA$A$(ä(ä8Ä8ä(ä(ä8Ä8ä8Ä8ä9$9$8Ä8ä9$9$@å@åIEIE8Ä8ä8Ä8ä9$9$8Ä8äIEIEZZk/k/aÇaÇI‡I‡YEYEI‡I‡AGAGY†Y†I‡I‡aÇaÇI‡I‡Y†Y†I‡I‡aÇaÇ{.{.k/k/QEQEQEQEA&A&QEQEA&A&I†I†A&A&I‡I‡QEQEAGAGYEYEAGAGaÇaÇYÉYÉaÇaÇYÉYÉaÇaÇYÉYÉI‡I‡jÎjÍrj@ä@ä8Ä8ä ä ä0Ä0ä0Ä0ä0Ä0ã8Ä8ä8Ä8äA$A$A$A$8Ä8äA$A$(ä(ä8Ä8ä8Ä8ä(ä(ä8Ä8ä9$9$8Ä8ä8Ä8ä9E9E@å@åAEAE0Ä0ä0Ä0ã8Ä8äIEIEQEQEk/k/bJZJY†Y†Y†Y†YEYEI‡I‡AGAGI‡I‡Y†Y†I‡I‡aÇaÇI‡I‡Y†Y†jŠjŠ{oƒpYÈYÉQEQEA&A&@å@åQEQEA&A&AGAGA&A&I‡I‡QEQEYÉYÉQEQEAGAGY†Y†QÇQÇI‡I‡A&A&@å@åbbc/c/YEYE8Ä8ä8Ä8ä(ä(ä(ä(ä8Ä8ä0Ä0ã(ä(ä8Ä8äA$A$8Ä8äA$A$8Ä8ä(ä(ä8Ä8ä(ä(ä0å0å9$9$(ä(ä8Ä8ä8Ä8ä9E9E@å@åAEAE0Ä0ä0Ä0ã8Ä8äQEQEYÉYÉjËjËYÉYÉaÇaÇI‡I‡YEYEI‡I‡AGAGY†Y†I‡I‡YÉYÉI‡I‡aÇaÇYÉYÉjËjËbŒbŒIEIE0æ0æ(ä(ä(ä(ä å å0å0å9E9EA&A&A&A&YEYEI‡I‡aÇaÇI‡I‡YÉYÉYÇYÇYÉYÉQÇQÇYÉYÉYÇYÇjÍjÍbJZJHäHä0Ä0ä0Ä0ä0Ä0ã(ä(ä(ä(ä0Ä0ä8Ä8ä8Ä8äA$A$8Ä8ä8Ä8ä8Ä8ä(ä(ä8Ä8ä(ä(ä9$9$(ä(ä8Ä8äA$A$8Ä8ä9E9E@å@å8ã8ä8Ä8ä8Ä8ä9E9EQEQEjÍjÍbbYÉYÉaÇaÇAGAGI†I†I‡I‡YEYEI‡I‡YÉYÉYEYEI‡I‡YÉYÉjIjIƒo{pAFAG9E9E0å0å(ä(ä(ä(ä(å(å9E9E0å0åA&A&AGAGYÇYÇI‡I‡YEYEYÉYÉQÇQÇI‡I‡A&A&@å@åbbc/c/YEYE8Ä8ä8Ä8ä(ä(ä(ä(ä8Ä8ä0Ä0ã(ä(ä8Ä8äA$A$8Ä8äA$A$8Ä8ä(ä(ä8Ä8ä(ä(ä0å0å9$9$(ä(ä8Ä8ä8Ä8ä9E9E@å@åAEAE0Ä0ä0Ä0ã8Ä8äQEQEYÉYÉjËjËYÉYÉaÇaÇI‡I‡YEYEI‡I‡AGAGY†Y†I‡I‡YÉYÉI‡I‡aÇaÇYÉYÉjËjËbŒbŒIEIE0æ0æ(ä(ä(ä(ä å å0å0å9E9EA&A&A&A&YEYEI‡I‡aÇaÇI‡I‡YÉYÉYÇYÇYÉYÉQÇQÇYÉYÉYÇYÇjÍjÍbJZJHäHä0Ä0ä0Ä0ä0Ä0ã(ä(ä(ä(ä0Ä0ä8Ä8ä8Ä8äA$A$8Ä8ä8Ä8ä8Ä8ä(ä(ä8Ä8ä(ä(ä9$9$(ä(ä8Ä8äA$A$8Ä8ä9E9E@å@å8ã8ä8Ä8ä8Ä8ä9E9EQEQEjÍjÍbbYÉYÉaÇaÇAGAGI†I†I‡I‡YEYEI‡I‡YÉYÉYEYEI‡I‡YÉYÉjIjIƒo{pAFAG9E9E0å0å(ä(ä(ä(ä(å(å9E9E0å0åA&A&AGAGYÇYÇI‡I‡YEYEYÉYÉYÇYÇAGAG@å@åI$I$ZZk/k/YEYE8Ä8ä8Ä8ä8Ä8ä(ä(ä(ä(ä0Ä0ã8Ä8ä8Ä8ä8Ä8äA$A$0Ä0ä0Ä0ã8Ä8ä8Ä8ä8ä8ã8Ä8ä8Ä8äA$A$8Ä8ä0Ä0ã8Ä8äIEIEHäHä0Ä0ä8ä8ã@å@åHäHäYÇYÇc,c,jjYÉYÉaÇaÇAGAGI‡I‡I‡I‡YÉYÉaÇaÇI‡I‡aÇaÇI‡I‡a†a†ZJbJZJbJ(ä(ä0å0å1†1†Ä Ä å å å å0æ0æ ä ä ä ä8Ä8äA&A&AGAGQÇQÇI†I†I‡I‡IEIEAGAGAGAGY†Y†c/c/ZZHãHä@ä@ä0Ä0ä0Ä0ã(ä(ä(ä(ä@ä@ä0Ä0ã8Ä8äA$A$8Ä8ä9$9$0Ä0ã8Ä8ä8ä8ã8Ä8ä8Ä8äA$A$8Ä8ä8Ä8ä0Ä0ãIEIE@å@å8ã8ä8Ä8ä8ä8ãI$I$QEQEbŒbŒbIbIjjI‡I‡aÇaÇI‡I‡I‡I‡I‡I‡YÉYÉaÇaÇI‡I‡YÉYÉY†Y†jjs/k/9E9E0å0å0æ0æ å å å å(å(å å å å å(ä(ä8Ä8äAÇAÇ8Ä8ä0å0åQÇQÇYÇYÇAGAG@å@åI$I$ZZk/k/YEYE8Ä8ä8Ä8ä8Ä8ä(ä(ä(ä(ä0Ä0ã8Ä8ä8Ä8ä8Ä8äA$A$0Ä0ä0Ä0ã8Ä8ä8Ä8ä8ä8ã8Ä8ä8Ä8äA$A$8Ä8ä0Ä0ã8Ä8äIEIEHäHä0Ä0ä8ä8ã@å@åHäHäYÇYÇc,c,jjYÉYÉaÇaÇAGAGI‡I‡I‡I‡YÉYÉaÇaÇI‡I‡aÇaÇI‡I‡a†a†ZJbJZJbJ(ä(ä0å0å1†1†Ä Ä å å å å0æ0æ ä ä ä ä8Ä8äA&A&AGAGQÇQÇI†I†I‡I‡IEIEAGAGAGAGY†Y†c/c/ZZHãHä@ä@ä0Ä0ä0Ä0ã(ä(ä(ä(ä@ä@ä0Ä0ã8Ä8äA$A$8Ä8ä9$9$0Ä0ã8Ä8ä8ä8ã8Ä8ä8Ä8äA$A$8Ä8ä8Ä8ä0Ä0ãIEIE@å@å8ã8ä8Ä8ä8ä8ãI$I$QEQEbŒbŒbIbIjjI‡I‡aÇaÇI‡I‡I‡I‡I‡I‡YÉYÉaÇaÇI‡I‡YÉYÉY†Y†jjs/k/9E9E0å0å0æ0æ å å å å(å(å å å å å(ä(ä8Ä8äAÇAÇ8Ä8ä0å0åQÇQÇY†Y†AGAGI†I†A&A&YÉYÉk/k/YÉYÉAGAG9E9E0å0å8Ä8ä(ä(ä0å0å(ä(ä0Ä0ä0Ä0ã ä ä0Ä0ã0Ä0ä0Ä0ä1$1$0Ä0ä0Ä0ä9$9$9E9E0å0å8Ä8ä0æ0æA&A&9E9E0å0åAGAGAGAGI†I†ZJbJbŒbŒI‡I‡AGAGI†I†I‡I‡aÇaÇAGAGY†Y†AGAGI‡I‡YEYEA&A&AGAG{,{,k/k/0Ã0ä9E9EI‡I‡A&A&@å@åA$A$9E9EA&A&@å@åAEAEY†Y†I‡I‡A&A&I†I†A&A&IEIEA&A&9E9EI‡I‡c/c/bŒbŒAGAGIEIE0å0å0å0å(ä(ä8Ä8ä(ä(ä(ä(ä0Ä0ä0Ä0ã ä ã0Ä0ã(ä(ä8Ä8ä(ä(ä8Ä8ä1$1$0æ0æ9E9E(ä(ä0å0åA&A&@å@å0æ0æAGAGAGAGAGAGYÉYÉZÌZÌYÉYÉAGAGAGAGQÇQÇI‡I‡Y†Y†I‡I‡YEYEI‡I‡AGAGAGAGQEQEbbƒÒƒÑ9†9†0å0åQÇQÇAGAGA$A$9E9E@å@å9E9E@å@åAEAEQEQEA&A&9E9EA&A&Y†Y†AGAGI†I†A&A&YÉYÉk/k/YÉYÉAGAG9E9E0å0å8Ä8ä(ä(ä0å0å(ä(ä0Ä0ä0Ä0ã ä ä0Ä0ã0Ä0ä0Ä0ä1$1$0Ä0ä0Ä0ä9$9$9E9E0å0å8Ä8ä0æ0æA&A&9E9E0å0åAGAGAGAGI†I†ZJbJbŒbŒI‡I‡AGAGI†I†I‡I‡aÇaÇAGAGY†Y†AGAGI‡I‡YEYEA&A&AGAG{,{,k/k/0Ã0ä9E9EI‡I‡A&A&@å@åA$A$9E9EA&A&@å@åAEAEY†Y†I‡I‡A&A&I†I†A&A&IEIEA&A&9E9EI‡I‡c/c/bŒbŒAGAGIEIE0å0å0å0å(ä(ä8Ä8ä(ä(ä(ä(ä0Ä0ä0Ä0ã ä ã0Ä0ã(ä(ä8Ä8ä(ä(ä8Ä8ä1$1$0æ0æ9E9E(ä(ä0å0åA&A&@å@å0æ0æAGAGAGAGAGAGYÉYÉZÌZÌYÉYÉAGAGAGAGQÇQÇI‡I‡Y†Y†I‡I‡YEYEI‡I‡AGAGAGAGQEQEbbƒÒƒÑ9†9†0å0åQÇQÇAGAGA$A$9E9E@å@å9E9E@å@åAEAEQEQEA&A&9E9EA&A&{.{.jËjËs-k-jËjËs-k-{.{.k-k-bJZJbŒbŒbŒbŒZJbJR -R -bJZJR‹R‹ZJbJc,c,ZJbJR‹R‹ZJbJR‹R‹ZJbJZJbJRŠRŠbŒbŒZJbJc,c,bŒbŒk,k,s/k/{.{.{.{.k-k-s.k-k-k-c,c,k-k-bŒbŒbŒbŒJJYÉYÉZJbJR -R -R‹R‹YÉYÉR‹R‹bŒbŒR‹R‹bŒbŒ{oƒpƒÐƒÐk/k/bŒbŒk-k-rËjË{,{,{.{.{.{.{oƒp{oƒps,{,ƒÐƒÐ“ЋЃЃЃЃÐ{oƒp{,{,k/k/k/s/k-k-{.{.{,{,bŒbŒbŒbŒbŒbŒZJbJZIZIR‹R‹ZJbJZJbJbŒbŒZÌZÌZJbJZJbJZJbJR‹R‹ZJbJR‹R‹jŠjŠZJbJbŒbŒZÌZÌjËjËs/k/ƒÐƒÐk,k,s-k-k.k-s-k-bŒbŒ{.{.k-k-bŒbŒZIZIJJR -R -bJZJbJZJR -R -R -R -ZÌZÌZJbJbŒbŒc/c/ƒÐƒÐ{.{.c,c,bŒbŒ{.{.jËjË{.{.{.{.{oƒp{oƒps,{,{oƒp‹Ð“Ð{oƒp{o{p{.{.jËjËs-k-jËjËs-k-{.{.k-k-bJZJbŒbŒbŒbŒZJbJR -R -bJZJR‹R‹ZJbJc,c,ZJbJR‹R‹ZJbJR‹R‹ZJbJZJbJRŠRŠbŒbŒZJbJc,c,bŒbŒk,k,s/k/{.{.{.{.k-k-s.k-k-k-c,c,k-k-bŒbŒbŒbŒJJYÉYÉZJbJR -R -R‹R‹YÉYÉR‹R‹bŒbŒR‹R‹bŒbŒ{oƒpƒÐƒÐk/k/bŒbŒk-k-rËjË{,{,{.{.{.{.{oƒp{oƒps,{,ƒÐƒÐ“ЋЃЃЃЃÐ{oƒp{,{,k/k/k/s/k-k-{.{.{,{,bŒbŒbŒbŒbŒbŒZJbJZIZIR‹R‹ZJbJZJbJbŒbŒZÌZÌZJbJZJbJZJbJR‹R‹ZJbJR‹R‹jŠjŠZJbJbŒbŒZÌZÌjËjËs/k/ƒÐƒÐk,k,s-k-k.k-s-k-bŒbŒ{.{.k-k-bŒbŒZIZIJJR -R -bJZJbJZJR -R -R -R -ZÌZÌZJbJbŒbŒc/c/ƒÐƒÐ{.{.c,c,bŒbŒ{.{.jËjË{.{.{.{.{oƒp{oƒps,{,{oƒp‹Ð“Ð{oƒp{o{pIEIEIEIEQEQEQEQEQEQEQEQEI$I$8Ä8äIEIEAEAEAEAE@å@åIEIEQEQEbbZJbJAÇAÇa†a†QEQEQEQEYEYEY†Y†YEYEQEQEIEIEQEQEQEQEQÇQÇIÇIÇbŒbŒZZQÇQÇQEQEY†Y†AGAGQEQEQEQEA&A&I†I†AGAGA†A†I†I†I‡I‡QÇQÇYÇYÇYÉYÉbbQÇQÇYÇYÇYÉYÉRRZZZZYÉYÉYÇYÇZZZZZJbJjŠjŠbbbbYÇYÇZZZZYÇYÇY†Y†Y†Y†Y†Y†QEQEQEQEQEQE8Ä8äAEAEI$I$A&A&IEIE@å@åQEQEY†Y†bŒbŒIÇIÇQÇQÇYEYEQEQEQEQEY†Y†YEYEY†Y†AEAEIEIEQEQEQEQEQÇQÇR‹R‹bIbIYÇYÇY†Y†I†I†Y†Y†AGAGIEIEQEQEAGAGQEQEAGAGAGAGQÇQÇI†I†YÉYÉYÇYÇYÉYÉYÇYÇRRYÇYÇYÉYÉZIZIZIZIYÇYÇRRZZZZbbbŒbŒbbbbAGAGA$A$A†A†IEIEIEIEQEQEQEQEQEQEQEQEI$I$8Ä8äIEIEAEAEAEAE@å@åIEIEQEQEbbZJbJAÇAÇa†a†QEQEQEQEYEYEY†Y†YEYEQEQEIEIEQEQEQEQEQÇQÇIÇIÇbŒbŒZZQÇQÇQEQEY†Y†AGAGQEQEQEQEA&A&I†I†AGAGA†A†I†I†I‡I‡QÇQÇYÇYÇYÉYÉbbQÇQÇYÇYÇYÉYÉRRZZZZYÉYÉYÇYÇZZZZZJbJjŠjŠbbbbYÇYÇZZZZYÇYÇY†Y†Y†Y†Y†Y†QEQEQEQEQEQE8Ä8äAEAEI$I$A&A&IEIE@å@åQEQEY†Y†bŒbŒIÇIÇQÇQÇYEYEQEQEQEQEY†Y†YEYEY†Y†AEAEIEIEQEQEQEQEQÇQÇR‹R‹bIbIYÇYÇY†Y†I†I†Y†Y†AGAGIEIEQEQEAGAGQEQEAGAGAGAGQÇQÇI†I†YÉYÉYÇYÇYÉYÉYÇYÇRRYÇYÇYÉYÉZIZIZIZIYÇYÇRRZZZZbbbŒbŒbbbbAGAGA$A$A†A†8Ä8ä0å0å@å@åA&A&@å@å@å@å8Ä8ä9E9E8Ä8ä@å@å@å@åA$A$IEIEA&A&jjc/c/Y†Y†YEYEa†a†YEYEY†Y†Y†Y†aÇaÇY†Y†AGAGQÇQÇA†A†IEIEI‡I‡c.c-ZZAGAGQEQEA&A&IEIE@å@å9E9EA&A&@å@åAEAE8Ä8äA&A&IEIEA&A&QEQEA&A&QEQEA&A&AGAGAEAE@å@åA$A$8Ä8äA&A&AGAGAGAGYEYEYÉYÉZZYEYEA&A&YEYEA&A&QEQEA&A&QEQE@å@å@å@åQEQE@å@å8Ä8ä9E9E8Ä8ä@å@å8Ä8ä9E9EA&A&QEQEY†Y†k/k/ZZYEYEY†Y†YEYEaÇaÇYEYEI‡I‡Y†Y†QÇQÇY†Y†I†I†AGAGAGAGbŒbŒZJbJI†I†A&A&AGAG@å@åQEQE@å@å9E9EA&A&8Ä8ä9E9EA&A&A&A&@å@åIEIEIEIEIEIEA&A&I†I†A&A&IEIE0å0å8Ä8ä@å@åA&A&AGAGQEQEY†Y†bbI‡I‡QEQE@ä@ä8Ä8ä0å0å8ä8Ä0å0å@å@åA&A&@å@å@å@å8Ä8ä9E9E8Ä8ä@å@å@å@åA$A$IEIEA&A&jjc/c/Y†Y†YEYEa†a†YEYEY†Y†Y†Y†aÇaÇY†Y†AGAGQÇQÇA†A†IEIEI‡I‡c.c-ZZAGAGQEQEA&A&IEIE@å@å9E9EA&A&@å@åAEAE8Ä8äA&A&IEIEA&A&QEQEA&A&QEQEA&A&AGAGAEAE@å@åA$A$8Ä8äA&A&AGAGAGAGYEYEYÉYÉZZYEYEA&A&YEYEA&A&QEQEA&A&QEQE@å@å@å@åQEQE@å@å8Ä8ä9E9E8Ä8ä@å@å8Ä8ä9E9EA&A&QEQEY†Y†k/k/ZZYEYEY†Y†YEYEaÇaÇYEYEI‡I‡Y†Y†QÇQÇY†Y†I†I†AGAGAGAGbŒbŒZJbJI†I†A&A&AGAG@å@åQEQE@å@å9E9EA&A&8Ä8ä9E9EA&A&A&A&@å@åIEIEIEIEIEIEA&A&I†I†A&A&IEIE0å0å8Ä8ä@å@åA&A&AGAGQEQEY†Y†bbI‡I‡QEQE@ä@ä8Ä8ä0å0å8Ä8äA$A$@å@åA$A$9E9E@å@å9$9$0å0å9E9E8Ä8ä9E9EA&A&@å@åY†Y†bbbŒbŒ@å@åYEYEY†Y†aÇaÇY†Y†Y†Y†Y†Y†aÇaÇI‡I‡QÇQÇAGAGI‡I‡AÇAÇbŒbŒaÇaÇI†I†A&A&IEIEA&A&@å@å@å@åIEIE@å@å9E9E@å@å9E9EA&A&QEQEA&A&QEQEA&A&AGAGQEQEA&A&IEIE0æ0æ9E9EA&A&IEIEA&A&QEQEa†a†YÉYÉAGAGYEYEI‡I‡A&A&YEYEA&A&QEQE@å@å@å@å9$9$@å@å8Ä8ä0å0å9E9E8Ä8ä9E9EA&A&@å@åIEIEI‡I‡jÎjÍI†I†YEYEY†Y†Y†Y†Y†Y†a†a†a†a†aÇaÇY†Y†I‡I‡I‡I‡I‡I‡9†9†ZIZIjŠjŠI‡I‡A&A&QEQE@å@å9E9EA&A&@å@åAEAE8Ä8äIEIE@å@å9E9EQEQEA&A&QEQEA&A&AGAGQEQE@å@åA&A&A&A&9$9$A&A&A&A&IEIEA&A&Y†Y†YÉYÉYEYEI‡I‡YEYEA&A&8Ä8ä8ä8ÄA$A$@å@åA$A$9E9E@å@å9$9$0å0å9E9E8Ä8ä9E9EA&A&@å@åY†Y†bbbŒbŒ@å@åYEYEY†Y†aÇaÇY†Y†Y†Y†Y†Y†aÇaÇI‡I‡QÇQÇAGAGI‡I‡AÇAÇbŒbŒaÇaÇI†I†A&A&IEIEA&A&@å@å@å@åIEIE@å@å9E9E@å@å9E9EA&A&QEQEA&A&QEQEA&A&AGAGQEQEA&A&IEIE0æ0æ9E9EA&A&IEIEA&A&QEQEa†a†YÉYÉAGAGYEYEI‡I‡A&A&YEYEA&A&QEQE@å@å@å@å9$9$@å@å8Ä8ä0å0å9E9E8Ä8ä9E9EA&A&@å@åIEIEI‡I‡jÎjÍI†I†YEYEY†Y†Y†Y†Y†Y†a†a†a†a†aÇaÇY†Y†I‡I‡I‡I‡I‡I‡9†9†ZIZIjŠjŠI‡I‡A&A&QEQE@å@å9E9EA&A&@å@åAEAE8Ä8äIEIE@å@å9E9EQEQEA&A&QEQEA&A&AGAGQEQE@å@åA&A&A&A&9$9$A&A&A&A&IEIEA&A&Y†Y†YÉYÉYEYEI‡I‡YEYEA&A&8Ä8ä8Ä8ä0æ0æ8Ä8ä9E9E8Ä8ä0å0å8Ä8ä9E9E@å@å0å0åA$A$9E9E@å@åIEIER -R -bŒbŒ8ã8äY†Y†a†a†Y†Y†a†a†a†a†aÇaÇa†a†I‡I‡QÇQÇI‡I‡AGAGZIZIZJbJYÉYÉIEIEA&A&A&A&IEIE@å@å9E9E@å@å9E9E@å@å9E9EA&A&A&A&AGAGI$I$A&A&IEIEA&A&AGAG@å@å9E9E8Ä8ä9E9EA&A&A&A&QEQEAGAGa†a†bbI‡I‡QEQEAGAGQEQEA&A&AGAGI$I$@å@å0å0å8Ä8ä9E9E8Ä8ä0æ0æA$A$0å0å@å@åA$A$9E9EA&A&YEYEjÍjÍA&A&QEQEY†Y†Y†Y†a†a†a†a†aÇaÇaÇaÇaÇaÇAGAGYÇYÇA†A†A&A&R‹R‹bbI‡I‡A&A&A&A&AEAEA&A&8Ä8äIEIE@å@å9E9E@å@å9E9EA&A&AGAGQEQEA&A&A&A&IEIEA&A&A&A&9E9E@å@å0å0åA†A†A&A&QEQEA&A&YEYEZJbJI‡I‡YEYEA&A&8Ä8ä@å@å8ä8Ä0æ0æ8ä8Ä9E9E8ä8Ä0å0å8ä8Ä9E9E@å@å0å0åA$A$9E9E@å@åIEIER -R -bŒbŒ8ã8äY†Y†a†a†Y†Y†a†a†a†a†aÇaÇa†a†I‡I‡QÇQÇI‡I‡AGAGZIZIZJbJYÉYÉIEIEA&A&A&A&IEIE@å@å9E9E@å@å9E9E@å@å9E9EA&A&A&A&AGAGI$I$A&A&IEIEA&A&AGAG@å@å9E9E8Ä8ä9E9EA&A&A&A&QEQEAGAGa†a†bbI‡I‡QEQEAGAGQEQEA&A&AGAGI$I$@å@å0å0å8Ä8ä9E9E8Ä8ä0æ0æA$A$0å0å@å@åA$A$9E9EA&A&YEYEjÍjÍA&A&QEQEY†Y†Y†Y†a†a†a†a†aÇaÇaÇaÇaÇaÇAGAGYÇYÇA†A†A&A&R‹R‹bbI‡I‡A&A&A&A&AEAEA&A&8Ä8äIEIE@å@å9E9E@å@å9E9EA&A&AGAGQEQEA&A&A&A&IEIEA&A&A&A&9E9E@å@å0å0åA†A†A&A&QEQEA&A&YEYEZJbJI‡I‡YEYEA&A&8Ä8ä@å@å8Ä8ä1$1$8Ä8ä0æ0æ8Ä8äA$A$(ä(ä0å0å@å@å9$9$@å@å9E9E8å8åA&A&YÉYÉZÌZÌY†Y†aÇaÇa†a†iÇiÇzzzzzzjjrjAGAGI†I†A†A†YÉYÉbŒbŒQÇQÇIEIEA&A&IEIEA&A&0å0å@å@å9E9E8å8åIEIEA&A&9E9EA&A&QEQEA&A&IEIEA&A&A&A&IEIE@å@å9E9E8Ä8ä(ä(äA&A&IEIEA&A&YEYEYÉYÉR -R -YEYEAGAGQEQEA&A&QEQEAGAGQEQE8å8å8Ä8ä9E9E8Ä8ä8Ä8ä9$9$0å0å9E9E@å@å8Ä8ä@å@å9E9EI‡I‡bŒbŒYÉYÉY…Y…iÇiÇrjiÇiÇzzzzaÇaÇiÇiÇQÇQÇAGAGAGAGI‡I‡bŒbŒYÉYÉIEIEA&A&IEIE@å@å9E9E8å8å@å@å@å@å9E9EA&A&@å@åA&A&IEIEA&A&A&A&IEIEA&A&AGAGA&A&8Ä8ä9E9E8Ä8ä9E9EA&A&QEQEQEQEY†Y†ZJbJYÉYÉQEQE@å@å8Ä8äA$A$8ä8Ä1$1$8Ä8ä0æ0æ8Ä8äA$A$(ä(ä0å0å@å@å9$9$@å@å9E9E8å8åA&A&YÉYÉZÌZÌY†Y†aÇaÇa†a†iÇiÇzzzzzzjjrjAGAGI†I†A†A†YÉYÉbŒbŒQÇQÇIEIEA&A&IEIEA&A&0å0å@å@å9E9E8å8åIEIEA&A&9E9EA&A&QEQEA&A&IEIEA&A&A&A&IEIE@å@å9E9E8Ä8ä(ä(äA&A&IEIEA&A&YEYEYÉYÉR -R -YEYEAGAGQEQEA&A&QEQEAGAGQEQE8å8å8Ä8ä9E9E8Ä8ä8Ä8ä9$9$0å0å9E9E@å@å8Ä8ä@å@å9E9EI‡I‡bŒbŒYÉYÉY…Y…iÇiÇrjiÇiÇzzzzaÇaÇiÇiÇQÇQÇAGAGAGAGI‡I‡bŒbŒYÉYÉIEIEA&A&IEIE@å@å9E9E8å8å@å@å@å@å9E9EA&A&@å@åA&A&IEIEA&A&A&A&IEIEA&A&AGAGA&A&8Ä8ä9E9E8Ä8ä9E9EA&A&QEQEQEQEY†Y†ZJbJYÉYÉQEQE@å@å8Ä8äA$A$8Ä8äA$A$8Ä8ä8Ä8äA$A$8Ä8ä8Ä8ä9$9$(ä(ä@å@å9$9$@å@åIEIEIEIEYÉYÉbŒbŒQÇQÇQÇQÇAGAGYÉYÉbbzzYÉYÉa†a†aÇaÇ@å@å9E9EA&A&R‹R‹ZIZIIEIEA&A&QEQEA&A&@å@åA$A$0å0åIEIE8å8å@å@å9E9EA&A&@å@åQEQEA&A&QEQEA&A&IEIEA&A&@å@å0å0åIEIE@å@åA&A&IEIEAGAGQEQEa†a†bŒbŒYEYEQEQEAGAGA&A&QEQEA&A&A&A&HäHä8ä8ã8Ä8äIEIE(ä(ä8Ä8ä8Ä8ä0å0åA$A$9E9EA&A&A&A&YEYEZÌZÌYÉYÉQÇQÇI‡I‡Y†Y†YÉYÉjjrjjjYÉYÉAGAG8Ä8ä9†9†9E9ER‹R‹I†I†AGAGQEQE@å@å9E9EA&A&8Ä8ä9E9EA&A&8Ä8ä9E9EIEIE@å@åIEIEA&A&QEQEA&A&IEIEA&A&@å@åA$A$9E9EA&A&@å@åIEIEA&A&QEQEYEYEZJbJYÉYÉQEQEQEQE8Ä8ä8Ä8ä8ä8ÄA$A$8Ä8ä8Ä8äA$A$8Ä8ä8Ä8ä9$9$(ä(ä@å@å9$9$@å@åIEIEIEIEYÉYÉbŒbŒQÇQÇQÇQÇAGAGYÉYÉbbzzYÉYÉa†a†aÇaÇ@å@å9E9EA&A&R‹R‹ZIZIIEIEA&A&QEQEA&A&@å@åA$A$0å0åIEIE8å8å@å@å9E9EA&A&@å@åQEQEA&A&QEQEA&A&IEIEA&A&@å@å0å0åIEIE@å@åA&A&IEIEAGAGQEQEa†a†bŒbŒYEYEQEQEAGAGA&A&QEQEA&A&A&A&HäHä8ä8ã8Ä8äIEIE(ä(ä8Ä8ä8Ä8ä0å0åA$A$9E9EA&A&A&A&YEYEZÌZÌYÉYÉQÇQÇI‡I‡Y†Y†YÉYÉjjrjjjYÉYÉAGAG8Ä8ä9†9†9E9ER‹R‹I†I†AGAGQEQE@å@å9E9EA&A&8Ä8ä9E9EA&A&8Ä8ä9E9EIEIE@å@åIEIEA&A&QEQEA&A&IEIEA&A&@å@åA$A$9E9EA&A&@å@åIEIEA&A&QEQEYEYEZJbJYÉYÉQEQEQEQE8Ä8ä8Ä8äA&A&A&A&9†9†A&A&9E9E9E9E9E9E9E9EA†A†0æ0æA&A&A†A†A&A&AGAGR -R -R‹R‹(ä(ä ä ä Ä Ã ÄÃ Ä Ä(å(å0æ0æ ä ä å åJJR -R -AÇAÇbŒbŒR‹R‹A&A&0æ0æA&A&0æ0æ9†9†0å0å0å0å8Ä8ä(ä(ä0å0å@å@å0æ0æAGAG9E9EA&A&A&A&A&A&A&A&@å@åAEAE8Ä8ä8Ä8ä9E9EA&A&AGAGY†Y†I‡I‡YÉYÉjÍjÍR -R -YÉYÉI‡I‡YÉYÉI‡I‡I‡I‡I‡I‡A&A&AGAGAÇAÇ9E9E@å@å1†1† ä ä8Ä8ä9E9EA&A&A&A&AGAGI‡I‡ZÌZÌAÇAÇ Ä Ä ä 䣣 ä ä(ä(ä0æ0æ Ä Ä(ä(äAGAGBBBBJJjÍjÍAGAGA&A&0æ0æA†A†8æ8æ0å0å@å@å8Ä8ä8Ä8ä0æ0æ8Ä8ä0æ0æAGAGA&A&A&A&9E9EA&A&A&A&I$I$@å@å0å0å8Ä8ä8Ä8äA†A†AGAGI‡I‡AGAGI‡I‡bŒbŒbŒbŒI‡I‡YÉYÉI‡I‡I‡I‡A&A&A&A&9†9†A&A&9E9E9E9E9E9E9E9EA†A†0æ0æA&A&A†A†A&A&AGAGR -R -R‹R‹(ä(ä ä ä Ä Ã ÄÃ Ä Ä(å(å0æ0æ ä ä å åJJR -R -AÇAÇbŒbŒR‹R‹A&A&0æ0æA&A&0æ0æ9†9†0å0å0å0å8Ä8ä(ä(ä0å0å@å@å0æ0æAGAG9E9EA&A&A&A&A&A&A&A&@å@åAEAE8Ä8ä8Ä8ä9E9EA&A&AGAGY†Y†I‡I‡YÉYÉjÍjÍR -R -YÉYÉI‡I‡YÉYÉI‡I‡I‡I‡I‡I‡A&A&AGAGAÇAÇ9E9E@å@å1†1† ä ä8Ä8ä9E9EA&A&A&A&AGAGI‡I‡ZÌZÌAÇAÇ Ä Ä ä 䣣 ä ä(ä(ä0æ0æ Ä Ä(ä(äAGAGBBBBJJjÍjÍAGAGA&A&0æ0æA†A†8æ8æ0å0å@å@å8Ä8ä8Ä8ä0æ0æ8Ä8ä0æ0æAGAGA&A&A&A&9E9EA&A&A&A&I$I$@å@å0å0å8Ä8ä8Ä8äA†A†AGAGI‡I‡AGAGI‡I‡bŒbŒbŒbŒI‡I‡YÉYÉI‡I‡I‡I‡k/k/c,c,k/k/rËjËbŒbŒƒÐƒÐc,c,ZJbJc,c,jŠjŠZJbJR -R -bŒbŒbŒbŒc,c,k-k-bJZJR -R -R‹R‹JJZJbJbŒbŒc,c,jÍj̓p{oƒÐƒÐk/k/s/k/{.{.{.{.k,k,{.{.k/k/s,k,k/k/ƒo{pk/s/c,c,jÍjÍc,c,bŒbŒ“ЋÐk/k/s/k/k-k-s.k-k-k-bŒbŒjËjËs/k/ƒÐƒÐk/k/c/c/{.{.ƒÐƒÐk/k/{.{.{.{.{.{.{.{.{.{.{.{.{.{.{oƒp{oƒps.{.{,{,bŒbŒjŠjŠjŠjŠbŒbŒjŠjŠI‡I‡R -R -R‹R‹ZJbJZJbJbŒbŒZÌZÌk-k-bŒbŒR -R -R‹R‹JJR -R -ZÌZÌbŒbŒc/c/k/k/ƒÐƒÐ{oƒp{.{.{.{.{.{.k,k,{.{.k,k,s/k/k-k-{.{.ƒÐƒÐZÌZÌc,c,c/c/bŒbŒ{Ï{σЃÐc,c,k/k/rÍjÍk.k-rÍjÍbŒbŒk-k-ƒÐƒÐƒÐƒÐZÌZÌk/k/ƒo{p{.{.{.{.{.{.{.{.{oƒp{.{.{.{.{.{.{oƒpk/s/c,c,k/k/rËjËbŒbŒƒÐƒÐc,c,ZJbJc,c,jŠjŠZJbJR -R -bŒbŒbŒbŒc,c,k-k-bJZJR -R -R‹R‹JJZJbJbŒbŒc,c,jÍj̓p{oƒÐƒÐk/k/s/k/{.{.{.{.k,k,{.{.k/k/s,k,k/k/ƒo{pk/s/c,c,jÍjÍc,c,bŒbŒ“ЋÐk/k/s/k/k-k-s.k-k-k-bŒbŒjËjËs/k/ƒÐƒÐk/k/c/c/{.{.ƒÐƒÐk/k/{.{.{.{.{.{.{.{.{.{.{.{.{.{.{oƒp{oƒps.{.{,{,bŒbŒjŠjŠjŠjŠbŒbŒjŠjŠI‡I‡R -R -R‹R‹ZJbJZJbJbŒbŒZÌZÌk-k-bŒbŒR -R -R‹R‹JJR -R -ZÌZÌbŒbŒc/c/k/k/ƒÐƒÐ{oƒp{.{.{.{.{.{.k,k,{.{.k,k,s/k/k-k-{.{.ƒÐƒÐZÌZÌc,c,c/c/bŒbŒ{Ï{σЃÐc,c,k/k/rÍjÍk.k-rÍjÍbŒbŒk-k-ƒÐƒÐƒÐƒÐZÌZÌk/k/ƒo{p{.{.{.{.{.{.{.{.{oƒp{.{.{.{.{.{.{oƒpY†Y†Y†Y†Y†Y†Y†Y†QÇQÇ{oƒpbŒbŒ@å@åIEIEI$I$@å@å9E9EIEIEAGAGQEQEA&A&QÇQÇI†I†I‡I‡Y†Y†AGAGI‡I‡QÇQÇQÇQÇQÇQÇQÇQÇQEQEIEIEIEIEA†A†I†I†QEQEQÇQÇaÇaÇQEQEjËj˓ГÐbbI‡I‡I‡I‡QÇQÇAÇAÇQEQEAÇAÇQEQEAGAGQÇQÇQEQEYÇYÇZZƒÒƒÑjËjËbbZZYÇYÇZZZZYÇYÇYÇYÇQÇQÇI†I†I‡I‡Y†Y†Y†Y†I‡I‡YEYEYEYEYEYEYEYEYEYEjËjËAGAGQEQEA&A&@å@åAEAE@å@åQEQEI†I†QEQEAGAGQÇQÇY†Y†AGAGI‡I‡I†I†QÇQÇQÇQÇYÇYÇQÇQÇAGAGQEQEIEIEQEQEAGAGQEQEQÇQÇY†Y†Y†Y†ZZ“ЋÐc,c,I‡I‡QÇQÇI†I†I†I†I†I†I†I†I†I†I†I†I†I†Y†Y†I†I†YÇYÇ{,{,{oƒpbbbbYÉYÉbbbbYÇYÇjjI†I†I‡I‡Y†Y†I†I†aÇaÇY†Y†Y†Y†Y†Y†Y†Y†QÇQÇ{oƒpbŒbŒ@å@åIEIEI$I$@å@å9E9EIEIEAGAGQEQEA&A&QÇQÇI†I†I‡I‡Y†Y†AGAGI‡I‡QÇQÇQÇQÇQÇQÇQÇQÇQEQEIEIEIEIEA†A†I†I†QEQEQÇQÇaÇaÇQEQEjËj˓ГÐbbI‡I‡I‡I‡QÇQÇAÇAÇQEQEAÇAÇQEQEAGAGQÇQÇQEQEYÇYÇZZƒÒƒÑjËjËbbZZYÇYÇZZZZYÇYÇYÇYÇQÇQÇI†I†I‡I‡Y†Y†Y†Y†I‡I‡YEYEYEYEYEYEYEYEYEYEjËjËAGAGQEQEA&A&@å@åAEAE@å@åQEQEI†I†QEQEAGAGQÇQÇY†Y†AGAGI‡I‡I†I†QÇQÇQÇQÇYÇYÇQÇQÇAGAGQEQEIEIEQEQEAGAGQEQEQÇQÇY†Y†Y†Y†ZZ“ЋÐc,c,I‡I‡QÇQÇI†I†I†I†I†I†I†I†I†I†I†I†I†I†Y†Y†I†I†YÇYÇ{,{,{oƒpbbbbYÉYÉbbbbYÇYÇjjI†I†I‡I‡Y†Y†I†I†aÇaÇQEQEQEQEY†Y†AGAGYEYEk-k-bbIEIEA&A&I$I$QEQEA&A&I$I$QEQEIEIEIEIEA&A&QEQEIEIEA&A&I†I†YEYEAGAGQEQEY†Y†AGAGQEQEA&A&IEIEI$I$IEIEQEQEQEQEY†Y†YEYEjËj˓ГÐR -R -IEIEQEQE@å@åQEQEQEQEAGAGQEQEQEQEQEQEQEQEYEYEYÉYÉ{.{.QÇQÇQEQEQEQEYEYEAGAGQEQEQEQEAGAGQEQEA&A&AGAGQEQEQEQEQEQEQEQEQEQEYEYEaÇaÇYEYEYÉYÉAGAGI$I$@å@åQEQEI$I$IEIEQEQEA&A&QEQE@å@åQEQEIEIEA&A&QEQEI†I†YEYEAGAGQEQEAGAGIEIEQEQEA&A&AEAEIEIEIEIEQEQEY…Y…Y†Y†bbƒÐƒÐjÍjÍQEQEQEQEQEQEQEQEA&A&QEQEA&A&QEQEQEQEA&A&Y†Y†YEYEjÍjÍbJZJQEQEAGAGQEQEYEYEA&A&YEYEA&A&QEQEA&A&I†I†QEQEAGAGQEQEQEQEY†Y†AGAGYEYEk-k-bbIEIEA&A&I$I$QEQEA&A&I$I$QEQEIEIEIEIEA&A&QEQEIEIEA&A&I†I†YEYEAGAGQEQEY†Y†AGAGQEQEA&A&IEIEI$I$IEIEQEQEQEQEY†Y†YEYEjËj˓ГÐR -R -IEIEQEQE@å@åQEQEQEQEAGAGQEQEQEQEQEQEQEQEYEYEYÉYÉ{.{.QÇQÇQEQEQEQEYEYEAGAGQEQEQEQEAGAGQEQEA&A&AGAGQEQEQEQEQEQEQEQEQEQEYEYEaÇaÇYEYEYÉYÉAGAGI$I$@å@åQEQEI$I$IEIEQEQEA&A&QEQE@å@åQEQEIEIEA&A&QEQEI†I†YEYEAGAGQEQEAGAGIEIEQEQEA&A&AEAEIEIEIEIEQEQEY…Y…Y†Y†bbƒÐƒÐjÍjÍQEQEQEQEQEQEQEQEA&A&QEQEA&A&QEQEQEQEA&A&Y†Y†YEYEjÍjÍbJZJQEQEAGAGQEQEYEYEA&A&YEYEA&A&QEQEA&A&I†I†QEQEAGAGQEQEY†Y†A&A&QEQEYEYEbŒbŒI‡I‡IEIEI$I$A&A&I$I$I$I$AGAGI$I$A&A&QEQEI$I$QEQEA&A&IEIEQEQEA&A&QEQEQEQEYEYEAGAGIEIEI$I$IEIEQEQEQEQEY†Y†Y†Y†Y…Y…QEQEjŠjŠ{Ð{ÐYÉYÉIEIEQEQEIEIEIEIEA&A&QEQEIEIEA&A&A&A&QEQEYEYEYÇYÇ{oƒpI‡I‡YEYEYEYEI‡I‡QEQEYEYEAGAGYEYEY†Y†QEQEA&A&I†I†AGAGQEQEA&A&Y†Y†I‡I‡YÉYÉY†Y†ZJbJAGAGHäHäQEQEI$I$QEQEA&A&I$I$QEQEA&A&IEIEIEIEQEQEA&A&I$I$A&A&QEQEQEQEQEQEQEQEA&A&I$I$IEIEQEQEQEQEQEQEY†Y†Y†Y†QEQEaÇaǃЃÐZJbJQEQEAGAGQEQEA&A&QEQEA&A&QEQEQEQEA&A&QEQEYEYEYEYE{.{.bŒbŒQEQEYEYEQEQEYEYEAGAGYEYEY†Y†AGAGQEQEAGAGQEQEQEQEQEQEY†Y†A&A&QEQEYEYEbŒbŒI‡I‡IEIEI$I$A&A&I$I$I$I$AGAGI$I$A&A&QEQEI$I$QEQEA&A&IEIEQEQEA&A&QEQEQEQEYEYEAGAGIEIEI$I$IEIEQEQEQEQEY†Y†Y†Y†Y…Y…QEQEjŠjŠ{Ð{ÐYÉYÉIEIEQEQEIEIEIEIEA&A&QEQEIEIEA&A&A&A&QEQEYEYEYÇYÇ{oƒpI‡I‡YEYEYEYEI‡I‡QEQEYEYEAGAGYEYEY†Y†QEQEA&A&I†I†AGAGQEQEA&A&Y†Y†I‡I‡YÉYÉY†Y†ZJbJAGAGHäHäQEQEI$I$QEQEA&A&I$I$QEQEA&A&IEIEIEIEQEQEA&A&I$I$A&A&QEQEQEQEQEQEQEQEA&A&I$I$IEIEQEQEQEQEQEQEY†Y†Y†Y†QEQEaÇaǃЃÐZJbJQEQEAGAGQEQEA&A&QEQEA&A&QEQEQEQEA&A&QEQEYEYEYEYE{.{.bŒbŒQEQEYEYEQEQEYEYEAGAGYEYEY†Y†AGAGQEQEAGAGQEQEQEQEQEQEA&A&QEQEAGAGQEQEbbR -R -@å@åI$I$I$I$QEQEQEQEI$I$QEQEQEQEQEQEQEQE@ä@äA&A&I$I$QEQEQEQEIEIEQEQEYEYEQEQEQEQEQEQEY†Y†YEYEY†Y†Y†Y†Y†Y†QÇQÇY…Y…jËj˃҃ÑI†I†QEQEA&A&A&A&QEQEA&A&QEQEA&A&I$I$A&A&QEQEAGAGiÇiǃo{pZZYEYEYEYEQEQEQEQEYEYEYEYEQEQEYEYEA&A&I†I†AGAGQEQEQEQEAGAGAGAGY†Y†YÉYÉYÉYÉbIbIQEQEI$I$I$I$I$I$QEQEI$I$QEQEQEQEQEQEI$I$@å@åI$I$QEQEA&A&QEQEIEIEQEQEQEQEQEQEQEQEQEQEQEQEYEYEY†Y†Y†Y†YEYEaÇaÇY…Y…ZZ{Ð{ÐbŒbŒ@å@åIEIEA&A&I$I$A&A&QEQEA&A&A&A&I$I$A&A&Y†Y†AGAGjËjËrÍjÍYEYEYEYEYEYEYEYEY†Y†AGAGQEQEYEYEQEQEAGAGQEQEQEQEQEQEA&A&QEQEAGAGQEQEbbR -R -@å@åI$I$I$I$QEQEQEQEI$I$QEQEQEQEQEQEQEQE@ä@äA&A&I$I$QEQEQEQEIEIEQEQEYEYEQEQEQEQEQEQEY†Y†YEYEY†Y†Y†Y†Y†Y†QÇQÇY…Y…jËj˃҃ÑI†I†QEQEA&A&A&A&QEQEA&A&QEQEA&A&I$I$A&A&QEQEAGAGiÇiǃo{pZZYEYEYEYEQEQEQEQEYEYEYEYEQEQEYEYEA&A&I†I†AGAGQEQEQEQEAGAGAGAGY†Y†YÉYÉYÉYÉbIbIQEQEI$I$I$I$I$I$QEQEI$I$QEQEQEQEQEQEI$I$@å@åI$I$QEQEA&A&QEQEIEIEQEQEQEQEQEQEQEQEQEQEQEQEYEYEY†Y†Y†Y†YEYEaÇaÇY…Y…ZZ{Ð{ÐbŒbŒ@å@åIEIEA&A&I$I$A&A&QEQEA&A&A&A&I$I$A&A&Y†Y†AGAGjËjËrÍjÍYEYEYEYEYEYEYEYEY†Y†AGAGQEQEYEYEQEQEAGAGQEQEQEQEIEIEQEQEA&A&QEQEAGAGZJbJbb@å@åQEQEHãHäI$I$QEQEQEQEQEQEHäHäHäHäQEQEQEQEI$I$QEQEQEQEQEQEHäHäY…Y…aÇaÇYEYEY†Y†QEQEY†Y†YEYEQEQEY†Y†Y…Y…aÇaÇa†a†jŠjŠ{oƒpRRA&A&QEQEA&A&QEQE@å@å9E9EQEQEA&A&IEIEQEQEAGAGY†Y†k/k/qÇiÇY†Y†YEYEYEYEYEYEYEYEAGAGYEYEY†Y†QEQEA&A&I†I†AGAGQEQEA&A&Y†Y†A&A&QÇQÇYÇYÇbŒbŒQEQEQEQE@ä@äI$I$QEQEQEQEQEQEQEQEHäHäI$I$QEQEQEQEQEQEI$I$QEQEQEQEYEYEYEYEYEYEYEYEI†I†YEYEY†Y†QEQEY†Y†Y†Y†Y†Y†Y…Y…bbƒÐƒÐZJbJQEQEA&A&QEQEIEIEA&A&A&A&AEAEIEIEA&A&IEIEQEQEYEYEjËjËbŒbŒYEYEY…Y…YEYEYEYEQEQEYEYEYEYEY†Y†QEQEAGAGQEQEA&A&IEIEQEQEA&A&QEQEAGAGZJbJbb@å@åQEQEHãHäI$I$QEQEQEQEQEQEHäHäHäHäQEQEQEQEI$I$QEQEQEQEQEQEHäHäY…Y…aÇaÇYEYEY†Y†QEQEY†Y†YEYEQEQEY†Y†Y…Y…aÇaÇa†a†jŠjŠ{oƒpRRA&A&QEQEA&A&QEQE@å@å9E9EQEQEA&A&IEIEQEQEAGAGY†Y†k/k/qÇiÇY†Y†YEYEYEYEYEYEYEYEAGAGYEYEY†Y†QEQEA&A&I†I†AGAGQEQEA&A&Y†Y†A&A&QÇQÇYÇYÇbŒbŒQEQEQEQE@ä@äI$I$QEQEQEQEQEQEQEQEHäHäI$I$QEQEQEQEQEQEI$I$QEQEQEQEYEYEYEYEYEYEYEYEI†I†YEYEY†Y†QEQEY†Y†Y†Y†Y†Y†Y…Y…bbƒÐƒÐZJbJQEQEA&A&QEQEIEIEA&A&A&A&AEAEIEIEA&A&IEIEQEQEYEYEjËjËbŒbŒYEYEY…Y…YEYEYEYEQEQEYEYEYEYEY†Y†QEQEAGAGQEQEA&A&@å@åQEQEQEQEYEYEY†Y†YÉYÉYÉYÉ@å@åHäHäI$I$A&A&HäHäQEQEQEQEQEQEQEQE@ä@äI$I$A&A&QEQEQEQEQEQEY†Y†Y…Y…a†a†QEQEQEQEY†Y†Y†Y†Y†Y†Y…Y…Y†Y†aÇaÇQ…Q…Q…Q…ZZƒÐƒÐYÉYÉQEQEA&A&IEIEA&A&A&A&I$I$A&A&IEIEA&A&AGAGI$I$AGAGk-k-QÇQÇY…Y…Y†Y†YEYEY†Y†YEYEYEYEaÇaÇYEYEYEYEQEQEAGAGQEQEQEQEIEIEAGAGQEQEQEQEA&A&ZJbJAGAGHãHä@å@åI$I$QEQEQEQEHäHäQEQEQEQEA&A&HäHäIEIEI$I$YEYEYEYEYEYEY†Y†YEYEY†Y†QEQEY†Y†Y†Y†Y†Y†QEQEY…Y…aÇaÇY…Y…YEYEY†Y†k/k/c-c-@å@åQEQEQEQE@å@åAGAGAEAEI$I$A&A&QEQEAGAGQEQE@å@åZJbJbŒbŒYEYEY…Y…a†a†YEYEY†Y†QEQEa†a†YEYEY†Y†QEQE@å@åIEIE@å@åQEQEQEQEYEYEY†Y†YÉYÉYÉYÉ@å@åHäHäI$I$A&A&HäHäQEQEQEQEQEQEQEQE@ä@äI$I$A&A&QEQEQEQEQEQEY†Y†Y…Y…a†a†QEQEQEQEY†Y†Y†Y†Y†Y†Y…Y…Y†Y†aÇaÇQ…Q…Q…Q…ZZƒÐƒÐYÉYÉQEQEA&A&IEIEA&A&A&A&I$I$A&A&IEIEA&A&AGAGI$I$AGAGk-k-QÇQÇY…Y…Y†Y†YEYEY†Y†YEYEYEYEaÇaÇYEYEYEYEQEQEAGAGQEQEQEQEIEIEAGAGQEQEQEQEA&A&ZJbJAGAGHãHä@å@åI$I$QEQEQEQEHäHäQEQEQEQEA&A&HäHäIEIEI$I$YEYEYEYEYEYEY†Y†YEYEY†Y†QEQEY†Y†Y†Y†Y†Y†QEQEY…Y…aÇaÇY…Y…YEYEY†Y†k/k/c-c-@å@åQEQEQEQE@å@åAGAGAEAEI$I$A&A&QEQEAGAGQEQE@å@åZJbJbŒbŒYEYEY…Y…a†a†YEYEY†Y†QEQEa†a†YEYEY†Y†QEQE@å@åIEIEA&A&AGAGI‡I‡AGAGYÉYÉjÍjÍR‹R‹A&A&9E9E0å0åIEIEA&A&A&A&AGAGI‡I‡AGAGAGAGI‡I‡I‡I‡AGAGI‡I‡I‡I‡YÉYÉAGAGAGAGI†I†AGAGAGAGAGAGAGAGYÇYÇRRYÉYÉbbbŒbŒbŒbŒk-k-bJZJ0å0åA&A&AGAGA&A&AÇAÇAGAGAGAGAGAGAGAGI‡I‡ZJbJZÌZÌ{.{.R -R -I‡I‡A&A&AGAGAGAGYÉYÉAGAGI‡I‡YÉYÉYÉYÉYÉYÉYÉYÉRRAGAGAGAGI‡I‡AGAGI‡I‡R -R -ZÌZÌI‡I‡8æ8æ9E9E@å@å8æ8æA&A&AGAGAGAGAGAGAGAGI‡I‡I‡I‡AGAGBBI‡I‡I‡I‡I‡I‡AGAGAGAGAGAGAGAGAGAGAGAGQÇQÇYÉYÉYÇYÇR -R -jŠjŠjËjËbŒbŒk,k,A&A&AGAGAGAGA†A†AGAGAGAGAGAGAÇAÇAGAGAGAGBBbŒbŒk/k/bŒbŒI†I†I‡I‡AGAGI‡I‡I†I†I‡I‡I‡I‡I‡I‡YÉYÉI‡I‡I‡I‡I‡I‡A&A&AGAGI‡I‡AGAGYÉYÉjÍjÍR‹R‹A&A&9E9E0å0åIEIEA&A&A&A&AGAGI‡I‡AGAGAGAGI‡I‡I‡I‡AGAGI‡I‡I‡I‡YÉYÉAGAGAGAGI†I†AGAGAGAGAGAGAGAGYÇYÇRRYÉYÉbbbŒbŒbŒbŒk-k-bJZJ0å0åA&A&AGAGA&A&AÇAÇAGAGAGAGAGAGAGAGI‡I‡ZJbJZÌZÌ{.{.R -R -I‡I‡A&A&AGAGAGAGYÉYÉAGAGI‡I‡YÉYÉYÉYÉYÉYÉYÉYÉRRAGAGAGAGI‡I‡AGAGI‡I‡R -R -ZÌZÌI‡I‡8æ8æ9E9E@å@å8æ8æA&A&AGAGAGAGAGAGAGAGI‡I‡I‡I‡AGAGBBI‡I‡I‡I‡I‡I‡AGAGAGAGAGAGAGAGAGAGAGAGQÇQÇYÉYÉYÇYÇR -R -jŠjŠjËjËbŒbŒk,k,A&A&AGAGAGAGA†A†AGAGAGAGAGAGAÇAÇAGAGAGAGBBbŒbŒk/k/bŒbŒI†I†I‡I‡AGAGI‡I‡I†I†I‡I‡I‡I‡I‡I‡YÉYÉI‡I‡I‡I‡I‡I‡k/k/ƒÐƒÐ{oƒpƒÐƒÐƒÐƒÐ{oƒp{.{.{Ï{Ïk/k/{.{.{oƒpk-k-k/s/k/k/k-s-k.k-k-s-bŒbŒk,k,s/k/c,c,bŒbŒk-k-{.{.k/k/s,k,ƒÐƒÐƒÐƒÐk/k/{Ï{Ï{oƒpƒÐƒÐ“ЋЃЃД0Œ0œ“œ“{Ï{Ï{oƒp{.{.ƒÐƒÐƒÐƒÐƒÐƒÐ{oƒpƒÑƒÒƒÐƒÐƒÐƒÐ{Ð{Ð{oƒp„0„0œ“œ““ϋσЃÐ{oƒp{.{.ƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÐ{oƒpƒÐƒÐ„0„0”“Œ“”“Œ“”“Œ“œ“œ““ЋЃЃÐ{Ð{Ð{Ð{Ѓ҃Ñ{Ï{Ï{oƒpk/k/{.{.{oƒpk-k-k/s/k/k/k/s/k,k,k/s/jËjËc,c,k/k/rÍjÍbŒbŒk/k/s-k-k/k/s,k,{oƒpƒÐƒÐ{Ï{Ï{.{.{oƒp{Ï{σЃЃσϓЋМ“œ“ƒÏƒÏ{Ð{Ð{.{.ƒÐƒÐ{oƒpƒÐƒÐ{oƒpƒÐƒÐƒÐƒÐƒÒƒÑ{Ð{Ðk/k/“ГМ“œ““ЋЃσσ҃Ñ{.{.{.{.ƒÐƒÐƒÒƒÑƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÐ”“Œ“”“Œ“”“Œ“k/s/ƒÐƒÐ{oƒpƒÐƒÐƒÐƒÐ{oƒp{.{.{Ï{Ïk/k/{.{.{oƒpk-k-k/s/k/k/k-s-k.k-k-s-bŒbŒk,k,s/k/c,c,bŒbŒk-k-{.{.k/k/s,k,ƒÐƒÐƒÐƒÐk/k/{Ï{Ï{oƒpƒÐƒÐ“ЋЃЃД0Œ0œ“œ“{Ï{Ï{oƒp{.{.ƒÐƒÐƒÐƒÐƒÐƒÐ{oƒpƒÑƒÒƒÐƒÐƒÐƒÐ{Ð{Ð{oƒp„0„0œ“œ““ϋσЃÐ{oƒp{.{.ƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÐ{oƒpƒÐƒÐ„0„0”“Œ“”“Œ“”“Œ“œ“œ““ЋЃЃÐ{Ð{Ð{Ð{Ѓ҃Ñ{Ï{Ï{oƒpk/k/{.{.{oƒpk-k-k/s/k/k/k/s/k,k,k/s/jËjËc,c,k/k/rÍjÍbŒbŒk/k/s-k-k/k/s,k,{oƒpƒÐƒÐ{Ï{Ï{.{.{oƒp{Ï{σЃЃσϓЋМ“œ“ƒÏƒÏ{Ð{Ð{.{.ƒÐƒÐ{oƒpƒÐƒÐ{oƒpƒÐƒÐƒÐƒÐƒÒƒÑ{Ð{Ðk/k/“ГМ“œ““ЋЃσσ҃Ñ{.{.{.{.ƒÐƒÐƒÒƒÑƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÐ”“Œ“”“Œ“”“Œ“QÇQÇA†A†QEQEAGAGQÇQÇA†A†QEQEAÇAÇQEQEAÇAÇZZZJbJQÇQÇAEAEQEQEIEIEIEIEQEQEIEIEIEIEIEIEI$I$IEIEYÇYÇYÇYÇJJI‡I‡IÇIÇZIZIQÇQÇAGAGA†A†I‡I‡AÇAÇQÇQÇYÇYÇYÇYÇZIZIIÇIÇZZQÇQÇZZQÇQÇZZQÇQÇQÇQÇI‡I‡QÇQÇQÇQÇA†A†I†I†AGAGYÇYÇbbZJbJZIZIAÇAÇIEIEA†A†A†A†AGAGAÇAÇAGAGQÇQÇAÇAÇA†A†I†I†I†I†AGAGQÇQÇIEIEAGAGI†I†QÇQÇQÇQÇZJbJJJIEIEQEQEQ…Q…IEIEIEIEIEIEIEIEQEQEAEAEIEIEQEQEZZYÉYÉJJQÇQÇIÇIÇYÉYÉAÇAÇAGAGQÇQÇAÇAÇQÇQÇI‡I‡ZZZIZIYÇYÇIÇIÇYÉYÉYÇYÇIÇIÇZIZIYÇYÇIÇIÇQÇQÇAGAGYÇYÇQÇQÇAGAGQÇQÇQÇQÇQÇQÇbbZJbJZIZI9E9EA&A&A†A†A†A†AGAGAÇAÇAGAGQÇQÇA†A†QEQEAGAGQÇQÇA†A†QEQEAÇAÇQEQEAÇAÇZZZJbJQÇQÇAEAEQEQEIEIEIEIEQEQEIEIEIEIEIEIEI$I$IEIEYÇYÇYÇYÇJJI‡I‡IÇIÇZIZIQÇQÇAGAGA†A†I‡I‡AÇAÇQÇQÇYÇYÇYÇYÇZIZIIÇIÇZZQÇQÇZZQÇQÇZZQÇQÇQÇQÇI‡I‡QÇQÇQÇQÇA†A†I†I†AGAGYÇYÇbbZJbJZIZIAÇAÇIEIEA†A†A†A†AGAGAÇAÇAGAGQÇQÇAÇAÇA†A†I†I†I†I†AGAGQÇQÇIEIEAGAGI†I†QÇQÇQÇQÇZJbJJJIEIEQEQEQ…Q…IEIEIEIEIEIEIEIEQEQEAEAEIEIEQEQEZZYÉYÉJJQÇQÇIÇIÇYÉYÉAÇAÇAGAGQÇQÇAÇAÇQÇQÇI‡I‡ZZZIZIYÇYÇIÇIÇYÉYÉYÇYÇIÇIÇZIZIYÇYÇIÇIÇQÇQÇAGAGYÇYÇQÇQÇAGAGQÇQÇQÇQÇQÇQÇbbZJbJZIZI9E9EA&A&A†A†A†A†AGAGAÇAÇAGAG@ä@ä8ä8ã@å@åHäHä8ä8ã8Ä8ä8Ä8äHäHä8ä8ã@å@åY†Y†R‹R‹HäHäHäHäHäHä@ä@ã@ä@ãHäHä8ä8ãHäHä8ä8ã8Ä8ä@å@åI$I$QEQEbŒbŒA&A&AEAE@ä@ä@ä@ä0Ä0ã8Ä8äAEAE@å@åHäHäAEAE@å@å@å@åQ…Q…QEQEQEQEQEQEQEQEQEQEA&A&I$I$A&A&I$I$A&A&@å@åIEIE@å@åIEIEQEQEjÍjÍI‡I‡8Ä8ä@å@å8Ä8ä9E9E8Ä8äA$A$8Ä8äA$A$8Ä8äIEIE8Ä8ä@å@åHäHä8ä8ã8Ä8ä8ä8ãHäHä8ä8ãAEAEZJbJI†I†HãHäI$I$@ä@äHäHä@ä@ãHäHä@ä@ä0Ä0ãHäHä8ä8ã@å@åI$I$jjR -R -8ã8äAEAE@ä@ä0Ä0ä8ä8ã@å@å@å@åAEAEHäHä@å@åHäHäIEIEQEQEIEIEQEQEQEQEI$I$QEQEA&A&I$I$QEQEA&A&@å@åAEAE8Ä8äIEIE@å@åj‰j‰bŒbŒ8Ä8ä8Ä8ä9E9E8Ä8äIEIE8Ä8ä8Ä8äA$A$@ä@ä8ä8ã@å@åHäHä8ä8ã8Ä8ä8Ä8äHäHä8ä8ã@å@åY†Y†R‹R‹HäHäHäHäHäHä@ä@ã@ä@ãHäHä8ä8ãHäHä8ä8ã8Ä8ä@å@åI$I$QEQEbŒbŒA&A&AEAE@ä@ä@ä@ä0Ä0ã8Ä8äAEAE@å@åHäHäAEAE@å@å@å@åQ…Q…QEQEQEQEQEQEQEQEQEQEA&A&I$I$A&A&I$I$A&A&@å@åIEIE@å@åIEIEQEQEjÍjÍI‡I‡8Ä8ä@å@å8Ä8ä9E9E8Ä8äA$A$8Ä8äA$A$8Ä8äIEIE8Ä8ä@å@åHäHä8ä8ã8Ä8ä8ä8ãHäHä8ä8ãAEAEZJbJI†I†HãHäI$I$@ä@äHäHä@ä@ãHäHä@ä@ä0Ä0ãHäHä8ä8ã@å@åI$I$jjR -R -8ã8äAEAE@ä@ä0Ä0ä8ä8ã@å@å@å@åAEAEHäHä@å@åHäHäIEIEQEQEIEIEQEQEQEQEI$I$QEQEA&A&I$I$QEQEA&A&@å@åAEAE8Ä8äIEIE@å@åj‰j‰bŒbŒ8Ä8ä8Ä8ä9E9E8Ä8äIEIE8Ä8ä8Ä8äA$A$HäHäHäHä8ä8ãHäHäI$I$8ã8ä8ã8äHäHä8ä8ãHäHäI†I†ZJbJHäHä@ä@ãHäHäA$A#HäHãI$I$HäHä8ä8ãA$A$8ä8ãI$I$8Ä8äI$I$ZJbJA†A†HäHä8Ä8ä8Ä8äA$A$8Ä8äAEAE@å@åAEAE@å@åI$I$IEIEQEQEA&A&HäHäQEQEQEQEQEQEQEQEA&A&QEQE@å@åAEAEAEAE8Ä8äIEIE@å@åQEQEk-k-RR@å@åA$A$9E9E8Ä8ä9E9E@å@å9E9E@å@å8Ä8ä9E9E8Ä8äHäHä@ä@ãI$I$0Ã0äHäHä8ä8ãHäHäHäHäbIbIAGAGHäHäHäHäHäHä@ä@ãHäHãI$I$8ã8äHäHä8ä8ãHäHäA$A$@ä@ãZZIÇIÇ@å@å@å@å8ã8äA$A$8Ä8äAEAE8ã8äAEAE@å@åIEIEIEIEIEIEQEQEA&A&QEQEQEQEQEQEQEQEA&A&QEQEA&A&HäHäAEAE8Ä8äIEIE@å@åA†A†jIjIbŒbŒA&A&@å@å8Ä8äA$A$@å@å@å@å8ã8ä@å@åHäHäHäHä8ä8ãHäHäI$I$8ã8ä8ã8äHäHä8ä8ãHäHäI†I†ZJbJHäHä@ä@ãHäHäA$A#HäHãI$I$HäHä8ä8ãA$A$8ä8ãI$I$8Ä8äI$I$ZJbJA†A†HäHä8Ä8ä8Ä8äA$A$8Ä8äAEAE@å@åAEAE@å@åI$I$IEIEQEQEA&A&HäHäQEQEQEQEQEQEQEQEA&A&QEQE@å@åAEAEAEAE8Ä8äIEIE@å@åQEQEk-k-RR@å@åA$A$9E9E8Ä8ä9E9E@å@å9E9E@å@å8Ä8ä9E9E8Ä8äHäHä@ä@ãI$I$0Ã0äHäHä8ä8ãHäHäHäHäbIbIAGAGHäHäHäHäHäHä@ä@ãHäHãI$I$8ã8äHäHä8ä8ãHäHäA$A$@ä@ãZZIÇIÇ@å@å@å@å8ã8äA$A$8Ä8äAEAE8ã8äAEAE@å@åIEIEIEIEIEIEQEQEA&A&QEQEQEQEQEQEQEQEA&A&QEQEA&A&HäHäAEAE8Ä8äIEIE@å@åA†A†jIjIbŒbŒA&A&@å@å8Ä8äA$A$@å@å@å@å8ã8ä@å@åHäHäHäHäA$A#8ä8ãHäHä8ä8ãHäHä8ä8ãHäHãHäHäY…Y…R‹R‹HäHäHäHäA$A#HäHäI$I$I$I$HäHä8ä8ãHäHäI$I$0Ã0äAEAEI$I$jŠjŠ@å@å8Ä8äA$A$8Ä8ä9E9E8Ä8ä8Ä8äAEAEHäHäAEAEIEIEI$I$A&A&I$I$QEQEQEQEQEQEA&A&I$I$8å8å@å@åAEAEI$I$@å@å8Ä8ä9E9EQEQEAGAGjËjËYÉYÉ8Ä8äA$A$8Ä8ä9E9E@å@å8Ä8ä8Ä8äA$A$8Ä8ä0å0å8ã8ä@å@åHäHä@ä@ãHäHä8ä8ã@ä@ãHäHäI$I$ZJbJA†A†HäHäHäHäA$A#HäHäI$I$@ã@äHäHäA$A$8ä8ãHäHäA$A$HäHäZZRR8Ä8äA$A$8Ä8äA$A$8Ä8ä9$9$@å@åA$A$AEAEI$I$QEQEA&A&@å@åIEIEHäHäQEQEQEQEA&A&@å@åHäHäA$A$A$A$IEIE8Ä8ä9E9EA&A&HäHäbIbIbŒbŒ8ã8äAEAE8Ä8ä9E9E8Ä8äI$I$8ã8ä8Ä8äHäHäHäHäA$A#8ä8ãHäHä8ä8ãHäHä8ä8ãHäHãHäHäY…Y…R‹R‹HäHäHäHäA$A#HäHäI$I$I$I$HäHä8ä8ãHäHäI$I$0Ã0äAEAEI$I$jŠjŠ@å@å8Ä8äA$A$8Ä8ä9E9E8Ä8ä8Ä8äAEAEHäHäAEAEIEIEI$I$A&A&I$I$QEQEQEQEQEQEA&A&I$I$8å8å@å@åAEAEI$I$@å@å8Ä8ä9E9EQEQEAGAGjËjËYÉYÉ8Ä8äA$A$8Ä8ä9E9E@å@å8Ä8ä8Ä8äA$A$8Ä8ä0å0å8ã8ä@å@åHäHä@ä@ãHäHä8ä8ã@ä@ãHäHäI$I$ZJbJA†A†HäHäHäHäA$A#HäHäI$I$@ã@äHäHäA$A$8ä8ãHäHäA$A$HäHäZZRR8Ä8äA$A$8Ä8äA$A$8Ä8ä9$9$@å@åA$A$AEAEI$I$QEQEA&A&@å@åIEIEHäHäQEQEQEQEA&A&@å@åHäHäA$A$A$A$IEIE8Ä8ä9E9EA&A&HäHäbIbIbŒbŒ8ã8äAEAE8Ä8ä9E9E8Ä8äI$I$8ã8ä8Ä8äHäHä8ä8ã@ä@ãHäHä8ä8ã@ä@ãHäHä@ä@ã@ä@ãI$I$I†I†bŒbŒHäHäI$I$HäHäI$I$I$I$I$I$I$I$I$I$8ã8äI$I$HäHäI$I$@å@åYÉYÉ9$9$8Ä8äA$A$8Ä8ä0Ä0ä9$9$0Ä0ã@å@åI$I$@å@åIEIEI$I$A&A&I$I$@å@åI$I$QEQE@å@åQEQE8Ä8äI$I$@å@å@å@åAEAEHäHäAEAEI$I$YEYEjÍjÍAÇAÇ0Ä0ä0Ä0ä8ä8ã@å@å8Ä8ä8Ä8ä9E9E8Ä8ä9E9E8Ä8ä8Ä8äI$I$@ã@ä@ã@äA#A$@ã@äHãHäI$I$HäHäRŠRŠI‡I‡HäHäI$I$I$I$I$I$I$I$I$I$I$I$8ã8äI$I$8ã8äIEIE@ã@äQÇQÇAGAG8ã8ä8Ä8äA$A$(ä(ä8Ä8ä0Ä0ãAEAE8Ä8äI$I$A&A&I$I$QEQEA&A&HäHäQEQEI$I$QEQE@å@å@å@åI$I$8Ä8äAEAE@å@å@å@åI$I$QEQEQEQEZZbŒbŒ0Ä0ä0Ä0ä0Ä0ãA&A&8Ä8ä8Ä8ä8Ä8äHäHäHäHä8ä8ã@ä@ãHäHä8ä8ã@ä@ãHäHä@ä@ã@ä@ãI$I$I†I†bŒbŒHäHäI$I$HäHäI$I$I$I$I$I$I$I$I$I$8ã8äI$I$HäHäI$I$@å@åYÉYÉ9$9$8Ä8äA$A$8Ä8ä0Ä0ä9$9$0Ä0ã@å@åI$I$@å@åIEIEI$I$A&A&I$I$@å@åI$I$QEQE@å@åQEQE8Ä8äI$I$@å@å@å@åAEAEHäHäAEAEI$I$YEYEjÍjÍAÇAÇ0Ä0ä0Ä0ä8ä8ã@å@å8Ä8ä8Ä8ä9E9E8Ä8ä9E9E8Ä8ä8Ä8äI$I$@ã@ä@ã@äA#A$@ã@äHãHäI$I$HäHäRŠRŠI‡I‡HäHäI$I$I$I$I$I$I$I$I$I$I$I$8ã8äI$I$8ã8äIEIE@ã@äQÇQÇAGAG8ã8ä8Ä8äA$A$(ä(ä8Ä8ä0Ä0ãAEAE8Ä8äI$I$A&A&I$I$QEQEA&A&HäHäQEQEI$I$QEQE@å@å@å@åI$I$8Ä8äAEAE@å@å@å@åI$I$QEQEQEQEZZbŒbŒ0Ä0ä0Ä0ä0Ä0ãA&A&8Ä8ä8Ä8ä8Ä8äHäHäHäHä@ä@ã@ä@ã@ä@ãHäHã@ä@ã@ä@ã@ä@ãHäHãHäHäQ…Q…jŠjŠ8Ä8äHäHäI$I$@ã@äI$I$I$I$HäHäI$I$HäHäA$A$I$I$8ã8äIEIEQEQE9E9E8ã8ä8Ä8äA$A$8ä8ã@å@åI$I$AEAEI$I$QEQEQEQEQEQEQEQEYEYEQEQEQEQEQEQEQEQEQEQEQEQEQEQEI$I$I$I$QEQEA&A&I$I$AGAGHäHäjŠjŠI‡I‡8Ä8ä8Ä8ä8Ä8ä9$9$8Ä8ä9$9$(ä(ä8Ä8ä8Ä8ä0Ä0äA$A$8ä8ãHäHä@ä@ã@ä@ã@ä@ãHäHãHäHäHäHäjIjIJJ@ã@äHäHä@ä@ãI$I$HäHäI$I$I$I$HäHäI$I$HäHäHäHäI$I$A†A†IEIE8Ä8ä8Ä8äHäHä0Ä0ãAEAEHäHäHäHäIEIEI$I$QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEHäHäQEQEQEQEI$I$QEQE@å@åIEIEQEQEQEQEYÉYÉZJbJ8ä8ã@å@å0Ã0ä8Ä8ä9$9$8Ä8äA$A$8ä8ãHäHä@ä@ã@ä@ã@ä@ãHäHã@ä@ã@ä@ã@ä@ãHäHãHäHäQ…Q…jŠjŠ8Ä8äHäHäI$I$@ã@äI$I$I$I$HäHäI$I$HäHäA$A$I$I$8ã8äIEIEQEQE9E9E8ã8ä8Ä8äA$A$8ä8ã@å@åI$I$AEAEI$I$QEQEQEQEQEQEQEQEYEYEQEQEQEQEQEQEQEQEQEQEQEQEQEQEI$I$I$I$QEQEA&A&I$I$AGAGHäHäjŠjŠI‡I‡8Ä8ä8Ä8ä8Ä8ä9$9$8Ä8ä9$9$(ä(ä8Ä8ä8Ä8ä0Ä0äA$A$8ä8ãHäHä@ä@ã@ä@ã@ä@ãHäHãHäHäHäHäjIjIJJ@ã@äHäHä@ä@ãI$I$HäHäI$I$I$I$HäHäI$I$HäHäHäHäI$I$A†A†IEIE8Ä8ä8Ä8äHäHä0Ä0ãAEAEHäHäHäHäIEIEI$I$QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEHäHäQEQEQEQEI$I$QEQE@å@åIEIEQEQEQEQEYÉYÉZJbJ8ä8ã@å@å0Ã0ä8Ä8ä9$9$8Ä8äA$A$8ä8ãA&A&A&A&I$I$A&A&QEQEA&A&8Ä8ä8Ä8ä@ä@ä8ä8ãAGAGbŒbŒJJQEQEA&A&I$I$QEQEI†I†Y†Y†A&A&AEAEIEIEIEIEIEIEAGAGbbI‡I‡I‡I‡AGAG8Ä8ä8ä8ã@å@åAEAEI$I$A&A&I$I$HäHä@å@åA&A&QEQE@å@å@å@åHäHäQEQE@å@åHäHäQEQEA&A&A&A&@å@åQEQEA&A&QEQEI‡I‡k/k/bJZJA&A&0æ0æ9$9$1†1†(ä(ä(Ä(Ä0å0å0å0åAGAGAÇAÇAGAGAGAGAGAGQEQE8å8å8Ä8ä@ä@ä0Ä0äAEAEZJbJR -R -AGAGIEIEI$I$IEIEI†I†YEYEA&A&IEIEAEAEIEIEIEIEQEQEYÉYÉJJAGAGI†I†A&A&8ã8ä@å@åAEAEI$I$A&A&I$I$QEQE8Ä8äHäHäA&A&HäHä@å@åHäHäQEQEA&A&HäHäIEIEHäHäAGAG@ä@äQEQEA&A&A&A&A&A&ZJbJR‹R‹8æ8æ0æ0æ9$9$A†A†(å(å ä ä(Ä(ÄA&A&A&A&A&A&I$I$A&A&QEQEA&A&8Ä8ä8Ä8ä@ä@ä8ä8ãAGAGbŒbŒJJQEQEA&A&I$I$QEQEI†I†Y†Y†A&A&AEAEIEIEIEIEIEIEAGAGbbI‡I‡I‡I‡AGAG8Ä8ä8ä8ã@å@åAEAEI$I$A&A&I$I$HäHä@å@åA&A&QEQE@å@å@å@åHäHäQEQE@å@åHäHäQEQEA&A&A&A&@å@åQEQEA&A&QEQEI‡I‡k/k/bJZJA&A&0æ0æ9$9$1†1†(ä(ä(Ä(Ä0å0å0å0åAGAGAÇAÇAGAGAGAGAGAGQEQE8å8å8Ä8ä@ä@ä0Ä0äAEAEZJbJR -R -AGAGIEIEI$I$IEIEI†I†YEYEA&A&IEIEAEAEIEIEIEIEQEQEYÉYÉJJAGAGI†I†A&A&8ã8ä@å@åAEAEI$I$A&A&I$I$QEQE8Ä8äHäHäA&A&HäHä@å@åHäHäQEQEA&A&HäHäIEIEHäHäAGAG@ä@äQEQEA&A&A&A&A&A&ZJbJR‹R‹8æ8æ0æ0æ9$9$A†A†(å(å ä ä(Ä(ÄA&A&bŒbŒc/c/k/k/bŒbŒk/k/s/k/bŒbŒZÌZÌZJbJR‹R‹bŒbŒc/c/{Ð{Ð{.{.k/k/s-k-{pƒo‹Ï“ϋГЃЃЃЃÐ{.{.ƒÏƒÏ“ЋЃЃЃЃЃЃЃЃÐk,k,s/k/RŠRŠbŒbŒbŒbŒbŒbŒbŒbŒc,c,ZÌZÌjÍjÍZÌZÌbŒbŒbŒbŒbŒbŒbŒbŒR‹R‹R‹R‹R -R -R‹R‹bŒbŒk/k/s/k/k/k/ƒo{pk/s/{Ð{М“œ“œ“œ“{oƒp{Ï{σЃЃЃÐk/k/c,c,k/k/ƒo{p{Ð{Ѓ҃ѓЋЃσσ҃Ñc,c,bŒbŒbŒbŒR‹R‹ZJbJbŒbŒjÍjÍs/k/ƒÐƒÐk/k/s-k-{.{.“ϋϓЋЃЃЃЃЃЃÐ{Ï{σЃЃЃÐ{.{.ƒÐƒÐ“ЋЃЃÐk-k-bŒbŒZJbJbŒbŒbŒbŒbŒbŒZÌZÌbŒbŒjÍjÍrÎjÍjÍjÍZÌZÌbŒbŒbŒbŒR‹R‹R‹R‹R -R -bŒbŒbŒbŒc/c/jÍjÍs/k/{oƒpk/k/k/s/k/k/k/s/k/k/c/c/k/k/ƒÐƒÐZJbJbŒbŒR‹R‹R‹R‹bŒbŒc/c/k/k/bŒbŒk/k/s/k/bŒbŒZÌZÌZJbJR‹R‹bŒbŒc/c/{Ð{Ð{.{.k/k/s-k-{pƒo‹Ï“ϋГЃЃЃЃÐ{.{.ƒÏƒÏ“ЋЃЃЃЃЃЃЃЃÐk,k,s/k/RŠRŠbŒbŒbŒbŒbŒbŒbŒbŒc,c,ZÌZÌjÍjÍZÌZÌbŒbŒbŒbŒbŒbŒbŒbŒR‹R‹R‹R‹R -R -R‹R‹bŒbŒk/k/s/k/k/k/ƒo{pk/s/{Ð{М“œ“œ“œ“{oƒp{Ï{σЃЃЃÐk/k/c,c,k/k/ƒo{p{Ð{Ѓ҃ѓЋЃσσ҃Ñc,c,bŒbŒbŒbŒR‹R‹ZJbJbŒbŒjÍjÍs/k/ƒÐƒÐk/k/s-k-{.{.“ϋϓЋЃЃЃЃЃЃÐ{Ï{σЃЃЃÐ{.{.ƒÐƒÐ“ЋЃЃÐk-k-bŒbŒZJbJbŒbŒbŒbŒbŒbŒZÌZÌbŒbŒjÍjÍrÎjÍjÍjÍZÌZÌbŒbŒbŒbŒR‹R‹R‹R‹R -R -bŒbŒbŒbŒc/c/jÍjÍs/k/{oƒpk/k/k/s/k/k/k/s/k/k/c/c/k/k/ƒÐƒÐZJbJbŒbŒR‹R‹R‹R‹bbY†Y†bbbbjŠjŠ{oƒpY†Y†IEIEA&A&QEQEAÇAÇIEIE@å@åA†A†AEAEQEQEA†A†AGAGI†I†QÇQÇQEQEAÇAÇI†I†I†I†IEIE@å@åA$A$AÇAÇI†I†QEQEIEIEA&A&AÇAÇYEYEjŠjŠ{oƒpjËjËjËrËjÍjÍjËrËk-k-jËrËk/k/{,{,jÍjÍ{,{,jÍjÍ{,{,k-k-s.k-jŠjŠbIbIZJbJbbbbbIbIjIjIjŠjŠj‰j‰jŠjŠjŠjŠjËjËr‰j‰jIjIrËjËjËjËrIjIbb{,{,bŒbŒQEQEQEQEIEIEA&A&AGAGA†A†9†9†AEAE@å@åIEIEQEQEA†A†AÇAÇI†I†QÇQÇI†I†I†I†Y†Y†IEIEA&A&A$A$AGAGI†I†AEAEAEAEA†A†QEQEI†I†bb{.{.k-k-jŠjŠc,c,jËjËs-k-jËjË{.{.jÍjÍ{.{.{,{,jÍjÍrËjË{.{.”0Œ0{.{.jIjIbIbIZZbbj‰j‰r‰j‰jŠjŠjËjËr‰j‰jŠjŠjËjËrIjIbŒbŒbbY†Y†bbbbjŠjŠ{oƒpY†Y†IEIEA&A&QEQEAÇAÇIEIE@å@åA†A†AEAEQEQEA†A†AGAGI†I†QÇQÇQEQEAÇAÇI†I†I†I†IEIE@å@åA$A$AÇAÇI†I†QEQEIEIEA&A&AÇAÇYEYEjŠjŠ{oƒpjËjËjËrËjÍjÍjËrËk-k-jËrËk/k/{,{,jÍjÍ{,{,jÍjÍ{,{,k-k-s.k-jŠjŠbIbIZJbJbbbbbIbIjIjIjŠjŠj‰j‰jŠjŠjŠjŠjËjËr‰j‰jIjIrËjËjËjËrIjIbb{,{,bŒbŒQEQEQEQEIEIEA&A&AGAGA†A†9†9†AEAE@å@åIEIEQEQEA†A†AÇAÇI†I†QÇQÇI†I†I†I†Y†Y†IEIEA&A&A$A$AGAGI†I†AEAEAEAEA†A†QEQEI†I†bb{.{.k-k-jŠjŠc,c,jËjËs-k-jËjË{.{.jÍjÍ{.{.{,{,jÍjÍrËjË{.{.”0Œ0{.{.jIjIbIbIZZbbj‰j‰r‰j‰jŠjŠjËjËr‰j‰jŠjŠjËjËrIjIbŒbŒQEQEA&A&HäHäHäHäaÇaÇk/k/QEQE@ä@ä8Ä8ä8Ä8ä(ä(ä0Ä0ä8Ä8ä0Ä0äHäHäAEAE@ä@ä8Ä8Ã8ä8ã8Ä8ä8Ä8ä8Ä8ä8Ä8ä8Ä8ä8Ä8ä9$9$8Ä8äA$A$IEIE8Ä8ä0Ä0ä0Ä0ã@å@åQEQEjjs/k/aÇaÇQEQEQEQEQEQEQEQEYEYEI‡I‡YEYEaÇaÇaÇaÇI‡I‡a†a†jÍjÍbŒbŒQEQEQEQEI$I$QEQEHäHäHäHäYEYEHäHäYEYEYEYEYEYEYEYEYEYEY†Y†QEQEYEYEYEYEYEYEbŒbŒjŠjŠ@ä@ä8Ä8äHäHä0Ä0ã8Ä8ä0Ä0ä0Ä0ä0Ä0ä@ä@ãAEAE@å@å8ã8äHäHä0Ä0ä@ä@ä0Ä0ä0Ä0ä8Ä8ä8Ä8ä8Ä8ä0Ä0ãA$A$IEIE8Ä8ä8Ä8ä0Ä0ã8Ä8äQEQEYEYEk/k/bIbIQEQEQEQEQEQEQEQEQEQEYEYEI‡I‡Y†Y†aÇaÇYEYEI‡I‡jIjI“ГÐR -R -QEQE@å@åIEIEHäHäQEQEYDYDYEYEHäHäYEYEYEYEYEYEYEYEYEYEQEQEA&A&HäHäHäHäaÇaÇk/k/QEQE@ä@ä8Ä8ä8Ä8ä(ä(ä0Ä0ä8Ä8ä0Ä0äHäHäAEAE@ä@ä8Ä8Ã8ä8ã8Ä8ä8Ä8ä8Ä8ä8Ä8ä8Ä8ä8Ä8ä9$9$8Ä8äA$A$IEIE8Ä8ä0Ä0ä0Ä0ã@å@åQEQEjjs/k/aÇaÇQEQEQEQEQEQEQEQEYEYEI‡I‡YEYEaÇaÇaÇaÇI‡I‡a†a†jÍjÍbŒbŒQEQEQEQEI$I$QEQEHäHäHäHäYEYEHäHäYEYEYEYEYEYEYEYEYEYEY†Y†QEQEYEYEYEYEYEYEbŒbŒjŠjŠ@ä@ä8Ä8äHäHä0Ä0ã8Ä8ä0Ä0ä0Ä0ä0Ä0ä@ä@ãAEAE@å@å8ã8äHäHä0Ä0ä@ä@ä0Ä0ä0Ä0ä8Ä8ä8Ä8ä8Ä8ä0Ä0ãA$A$IEIE8Ä8ä8Ä8ä0Ä0ã8Ä8äQEQEYEYEk/k/bIbIQEQEQEQEQEQEQEQEQEQEYEYEI‡I‡Y†Y†aÇaÇYEYEI‡I‡jIjI“ГÐR -R -QEQE@å@åIEIEHäHäQEQEYDYDYEYEHäHäYEYEYEYEYEYEYEYEYEYEY†Y†YEYEIEIE@å@åZZjÍjÍQEQE@ä@ä8Ä8ä0Ä0ã(ä(ä(ä(ä8Ä8ä0Ä0ã8Ä8äAEAE@ä@ä0Ä0ä0Ä0ã8Ä8ä(ä(ä8Ä8ä(ä(ä8Ä8ä9$9$8Ä8ä8Ä8ä9E9E@å@å8Ä8ä8Ä8ä9$9$8Ä8äI$I$bbk/k/I‡I‡QEQEA&A&YEYEI‡I‡I‡I‡I‡I‡aÇaÇI‡I‡Y†Y†I‡I‡aÇaÇ{.{.bŒbŒY†Y†AGAGQEQEA&A&QEQEQEQEAGAGYEYEQEQEQEQEYEYEa†a†Y†Y†YEYEAGAGa†a†YÉYÉYEYEbŒbŒbŒbŒHãHä8Ä8ä8Ä8ä(ä(ä0Ä0ã(ä(ä0Ä0ã0Ä0ã8Ä8äIEIE@ä@ä0Ä0ä0Ä0ã8Ä8ä0Ä0ã(ä(ä8Ä8ä(ä(ä8Ä8ä9$9$8Ä8ä8Ä8ä9E9E@ä@ä8Ä8ä8Ä8äA$A$@å@åY†Y†k/k/bbYEYEAGAGQEQEI‡I‡I‡I‡aÇaÇI‡I‡aÇaÇI‡I‡YÉYÉY†Y†jŠjŠ{oƒpQÆQÇQEQEQEQEQEQEA&A&QEQEQEQEQEQEQEQEQEQEYEYEI‡I‡YEYEYEYEY†Y†YEYEIEIE@å@åZZjÍjÍQEQE@ä@ä8Ä8ä0Ä0ã(ä(ä(ä(ä8Ä8ä0Ä0ã8Ä8äAEAE@ä@ä0Ä0ä0Ä0ã8Ä8ä(ä(ä8Ä8ä(ä(ä8Ä8ä9$9$8Ä8ä8Ä8ä9E9E@å@å8Ä8ä8Ä8ä9$9$8Ä8äI$I$bbk/k/I‡I‡QEQEA&A&YEYEI‡I‡I‡I‡I‡I‡aÇaÇI‡I‡Y†Y†I‡I‡aÇaÇ{.{.bŒbŒY†Y†AGAGQEQEA&A&QEQEQEQEAGAGYEYEQEQEQEQEYEYEa†a†Y†Y†YEYEAGAGa†a†YÉYÉYEYEbŒbŒbŒbŒHãHä8Ä8ä8Ä8ä(ä(ä0Ä0ã(ä(ä0Ä0ã0Ä0ã8Ä8äIEIE@ä@ä0Ä0ä0Ä0ã8Ä8ä0Ä0ã(ä(ä8Ä8ä(ä(ä8Ä8ä9$9$8Ä8ä8Ä8ä9E9E@ä@ä8Ä8ä8Ä8äA$A$@å@åY†Y†k/k/bbYEYEAGAGQEQEI‡I‡I‡I‡aÇaÇI‡I‡aÇaÇI‡I‡YÉYÉY†Y†jŠjŠ{oƒpQÆQÇQEQEQEQEQEQEA&A&QEQEQEQEQEQEQEQEQEQEYEYEI‡I‡YEYEYEYEY†Y†A&A&@å@å8Ä8äZZk/k/QEQE@ä@ä(ä(ä(ä(ä0Ä0ä0Ä0ã0Ä0ã8Ä8ä@å@åA$A$8Ä8ä8Ä8äA$A$(ä(ä8Ä8ä(ä(ä8Ä8ä1$1$8Ä8ä8Ä8ä9$9$@å@åA$A$8Ä8ä9$9$8Ä8ä8Ä8äIEIEbbk/k/YÇYÇaÇaÇYEYEAGAGAGAGY†Y†I‡I‡aÇaÇI‡I‡YÉYÉYEYEYÉYÉ{,{,k/k/QEQEQEQEA&A&AEAEA&A&AGAGQEQEI†I†YEYEAGAGQEQEAGAGa†a†Y†Y†YÉYÉYEYEYÉYÉiÇiÇbJZJbŒbŒHäHä0Ä0ä8ä8ã(ä(ä8Ä8ä(ä(ä0Ä0ã8Ä8ä8Ä8ä9E9E@ä@ä8Ä8ä@å@å0Ã0ä8Ä8ä(ä(ä8Ä8ä0å0å8Ä8ä9$9$8Ä8ä9E9EA&A&HäHä8Ä8ä(ä(ä8Ä8äA$A$YEYEk/k/bJZJY†Y†I‡I‡YEYEI‡I‡AGAGYEYEI‡I‡aÇaÇI‡I‡I‡I‡Y†Y†jŠjŠ{oƒpYÈYÉQEQEA&A&@å@åA†A†QEQEA&A&I‡I‡QEQEI‡I‡Y†Y†I‡I‡YEYEI‡I‡Y†Y†A&A&@å@å8Ä8äZZk/k/QEQE@ä@ä(ä(ä(ä(ä0Ä0ä0Ä0ã0Ä0ã8Ä8ä@å@åA$A$8Ä8ä8Ä8äA$A$(ä(ä8Ä8ä(ä(ä8Ä8ä1$1$8Ä8ä8Ä8ä9$9$@å@åA$A$8Ä8ä9$9$8Ä8ä8Ä8äIEIEbbk/k/YÇYÇaÇaÇYEYEAGAGAGAGY†Y†I‡I‡aÇaÇI‡I‡YÉYÉYEYEYÉYÉ{,{,k/k/QEQEQEQEA&A&AEAEA&A&AGAGQEQEI†I†YEYEAGAGQEQEAGAGa†a†Y†Y†YÉYÉYEYEYÉYÉiÇiÇbJZJbŒbŒHäHä0Ä0ä8ä8ã(ä(ä8Ä8ä(ä(ä0Ä0ã8Ä8ä8Ä8ä9E9E@ä@ä8Ä8ä@å@å0Ã0ä8Ä8ä(ä(ä8Ä8ä0å0å8Ä8ä9$9$8Ä8ä9E9EA&A&HäHä8Ä8ä(ä(ä8Ä8äA$A$YEYEk/k/bJZJY†Y†I‡I‡YEYEI‡I‡AGAGYEYEI‡I‡aÇaÇI‡I‡I‡I‡Y†Y†jŠjŠ{oƒpYÈYÉQEQEA&A&@å@åA†A†QEQEA&A&I‡I‡QEQEI‡I‡Y†Y†I‡I‡YEYEI‡I‡QÇQÇI‡I‡A&A&@å@åbbc/c/YEYE8Ä8ä8Ä8ä(ä(ä(ä(ä(ä(ä8Ä8ä0Ä0ã8Ä8ä8Ä8ä9$9$8Ä8ä8Ä8ä(ä(ä8Ä8ä(ä(ä0å0å8Ä8ä1$1$0å0å8Ä8äA$A$9E9E@å@å0Ã0ä8Ä8ä9E9EQEQEYÉYÉbŒbŒbbI‡I‡I‡I‡I‡I‡YEYEI‡I‡I‡I‡YEYEI‡I‡aÇaÇI‡I‡YÉYÉ{,{,bŒbŒIEIE0æ0æ(ä(ä(ä(ä(ä(ä0æ0æ1$1$0æ0æA&A&Y†Y†AGAGa†a†YÉYÉYÉYÉaÇaÇYÉYÉQÇQÇQÇQÇbŒbŒjËjË@ä@ä@ä@ä8Ä8ä8Ä8ä(ä(ä(ä(ä0Ä0ã(ä(ä8Ä8ä8Ä8ä8Ä8äA$A$8Ä8ä(ä(ä8Ä8ä(ä(ä8Ä8ä1$1$(ä(ä8Ä8äA$A$8Ä8ä9E9E@å@å8ã8ä8Ä8ä8Ä8äIEIEAGAGjËjËrjYÉYÉI‡I‡YEYEI‡I‡AGAGI‡I‡aÇaÇI‡I‡Y†Y†I‡I‡aÇaÇjIjIƒo{pAFAG9E9E0æ0æ!$!$(ä(ä(å(å0å0å0å0åA&A&AGAGYÉYÉAGAGAGAGYÇYÇQÇQÇI‡I‡A&A&@å@åbbc/c/YEYE8Ä8ä8Ä8ä(ä(ä(ä(ä(ä(ä8Ä8ä0Ä0ã8Ä8ä8Ä8ä9$9$8Ä8ä8Ä8ä(ä(ä8Ä8ä(ä(ä0å0å8Ä8ä1$1$0å0å8Ä8äA$A$9E9E@å@å0Ã0ä8Ä8ä9E9EQEQEYÉYÉbŒbŒbbI‡I‡I‡I‡I‡I‡YEYEI‡I‡I‡I‡YEYEI‡I‡aÇaÇI‡I‡YÉYÉ{,{,bŒbŒIEIE0æ0æ(ä(ä(ä(ä(ä(ä0æ0æ1$1$0æ0æA&A&Y†Y†AGAGa†a†YÉYÉYÉYÉaÇaÇYÉYÉQÇQÇQÇQÇbŒbŒjËjË@ä@ä@ä@ä8Ä8ä8Ä8ä(ä(ä(ä(ä0Ä0ã(ä(ä8Ä8ä8Ä8ä8Ä8äA$A$8Ä8ä(ä(ä8Ä8ä(ä(ä8Ä8ä1$1$(ä(ä8Ä8äA$A$8Ä8ä9E9E@å@å8ã8ä8Ä8ä8Ä8äIEIEAGAGjËjËrjYÉYÉI‡I‡YEYEI‡I‡AGAGI‡I‡aÇaÇI‡I‡Y†Y†I‡I‡aÇaÇjIjIƒo{pAFAG9E9E0æ0æ!$!$(ä(ä(å(å0å0å0å0åA&A&AGAGYÉYÉAGAGAGAGYÇYÇYÇYÇAGAG@å@åI$I$ZZk/k/YEYE@ä@ä@ä@ä0Ä0ã(ä(ä(Ä(Ä0Ä0ä0Ä0ä8ä8ã@å@å0Ã0äA$A$0Ä0ã8Ä8ä8Ä8äA$A$8ä8ã8Ä8ä8Ä8äHäHä0Ä0ä8ä8ãIEIE8Ä8ä8ä8ã8ä8ã@ä@ä@ä@äYÉYÉjËjËbbjjaÇaÇI‡I‡I‡I‡I‡I‡aÇaÇYÉYÉI‡I‡YÉYÉI‡I‡a†a†{,{,bŒbŒ(ä(ä0å0å1†1†Ä Ä å å å å å å(ä(ä(ä(ä8Ä8äAGAGAÇAÇY†Y†I‡I‡Y†Y†AGAGQEQEIEIEbŒbŒbŒbŒ@ä@ä(Ä(Ã0Ä0ã(ä(ä0Ä0ã(ä(ä(ä(ä8Ä8ä0Ä0ãA$A$8Ä8ä0Ä0ãA$A$8Ä8ä8Ä8ä8ä8ã8Ä8ä8Ä8äAEAE@ä@ä0Ä0ä8Ä8Ã8Ä8äIEIE@ä@ä0Ä0ã8ä8ãI$I$QEQEbŒbŒZJbJiÇiÇYÉYÉI‡I‡Y†Y†I‡I‡aÇaÇI‡I‡YÉYÉaÇaÇI‡I‡YÉYÉbb{oƒp0å0å0å0å0æ0æ å å å å å å0æ0æ(ä(ä(ä(ä0Ä0ãQÇQÇ0Ã0ä8Ä8äQÇQÇYÇYÇAGAG@å@åI$I$ZZk/k/YEYE@ä@ä@ä@ä0Ä0ã(ä(ä(Ä(Ä0Ä0ä0Ä0ä8ä8ã@å@å0Ã0äA$A$0Ä0ã8Ä8ä8Ä8äA$A$8ä8ã8Ä8ä8Ä8äHäHä0Ä0ä8ä8ãIEIE8Ä8ä8ä8ã8ä8ã@ä@ä@ä@äYÉYÉjËjËbbjjaÇaÇI‡I‡I‡I‡I‡I‡aÇaÇYÉYÉI‡I‡YÉYÉI‡I‡a†a†{,{,bŒbŒ(ä(ä0å0å1†1†Ä Ä å å å å å å(ä(ä(ä(ä8Ä8äAGAGAÇAÇY†Y†I‡I‡Y†Y†AGAGQEQEIEIEbŒbŒbŒbŒ@ä@ä(Ä(Ã0Ä0ã(ä(ä0Ä0ã(ä(ä(ä(ä8Ä8ä0Ä0ãA$A$8Ä8ä0Ä0ãA$A$8Ä8ä8Ä8ä8ä8ã8Ä8ä8Ä8äAEAE@ä@ä0Ä0ä8Ä8Ã8Ä8äIEIE@ä@ä0Ä0ã8ä8ãI$I$QEQEbŒbŒZJbJiÇiÇYÉYÉI‡I‡Y†Y†I‡I‡aÇaÇI‡I‡YÉYÉaÇaÇI‡I‡YÉYÉbb{oƒp0å0å0å0å0æ0æ å å å å å å0æ0æ(ä(ä(ä(ä0Ä0ãQÇQÇ0Ã0ä8Ä8äQÇQÇQÇQÇI‡I‡I†I†A&A&ZJbJc/c/bbAGAG8æ8æ0å0å0å0å0å0å8Ä8ä0å0å(ä(ä0Ä0ã(ä(ä0Ä0ã(ä(ä8Ä8ä1$1$(ä(ä8Ä8ä9†9†A&A&1†1†(ä(äA&A&A&A&0æ0æAGAGAGAGI‡I‡AGAGZJbJbŒbŒI‡I‡AGAGI†I†I‡I‡I‡I‡YEYEAGAGAGAGQÇQÇAGAGQEQEQEQE{.{.k/k/0Ã0äA&A&AGAGAGAGAEAEA&A&IEIEIEIEA&A&AEAEQÇQÇZZbbZJbJbbZJbJZJbJJJk/k/s/k/I‡I‡9†9†AGAG0æ0æ0å0å0æ0æ8Ä8ä(ä(ä8Ä8ä(ä(ä0Ä0ã ä ä(ä(ä(ä(ä8Ä8ä(ä(ä8Ä8ä9E9E8æ8æ0å0å0å0å9E9EA&A&0æ0æA†A†A&A&I‡I‡AGAGJJjÍjÍYÉYÉAÇAÇI†I†I‡I‡I‡I‡Y†Y†AGAGAGAGI‡I‡AGAGYEYEA&A&bbƒÒƒÑAGAG9E9EAGAGQÇQÇ8Ä8äA†A†A&A&IEIE9E9EA&A&QEQEAGAGA†A†A&A&QÇQÇI‡I‡I†I†A&A&ZJbJc/c/bbAGAG8æ8æ0å0å0å0å0å0å8Ä8ä0å0å(ä(ä0Ä0ã(ä(ä0Ä0ã(ä(ä8Ä8ä1$1$(ä(ä8Ä8ä9†9†A&A&1†1†(ä(äA&A&A&A&0æ0æAGAGAGAGI‡I‡AGAGZJbJbŒbŒI‡I‡AGAGI†I†I‡I‡I‡I‡YEYEAGAGAGAGQÇQÇAGAGQEQEQEQE{.{.k/k/0Ã0äA&A&AGAGAGAGAEAEA&A&IEIEIEIEA&A&AEAEQÇQÇZZbbZJbJbbZJbJZJbJJJk/k/s/k/I‡I‡9†9†AGAG0æ0æ0å0å0æ0æ8Ä8ä(ä(ä8Ä8ä(ä(ä0Ä0ã ä ä(ä(ä(ä(ä8Ä8ä(ä(ä8Ä8ä9E9E8æ8æ0å0å0å0å9E9EA&A&0æ0æA†A†A&A&I‡I‡AGAGJJjÍjÍYÉYÉAÇAÇI†I†I‡I‡I‡I‡Y†Y†AGAGAGAGI‡I‡AGAGYEYEA&A&bbƒÒƒÑAGAG9E9EAGAGQÇQÇ8Ä8äA†A†A&A&IEIE9E9EA&A&QEQEAGAGA†A†A&A&{,{,jÍjÍrËjËjÍjÍrËjË{.{.bŒbŒbŒbŒbŒbŒbŒbŒRŠRŠbbR‹R‹ZJbJbŒbŒc,c,bŒbŒR‹R‹ZJbJR‹R‹jŠjŠZJbJZJbJbŒbŒR -R -bŒbŒc,c,k-k-s/k/{Ï{Ï{,{,c,c,k/k/rËjËc,c,k/k/c,c,ZJbJR -R -R -R -R -R -R‹R‹ZJbJZJbJZJbJbŒbŒR‹R‹bŒbŒ{Ï{σЃÐk/k/c,c,k-k-{,{,jËjË{.{.{oƒp{oƒp{o{o{,{,“ЋГЋД2Œ1“ЋЃЃЃЃÐ{Ï{Ï{oƒpjËjË{.{.{.{.ZJbJbŒbŒRŠRŠbŒbŒZIZIZIZIbŒbŒR‹R‹c,c,ZÌZÌZJbJZJbJZJbJZJbJZJbJR‹R‹bŒbŒZJbJc,c,bŒbŒc,c,{.{.{Ï{Ï{.{.k-k-s.k-k-k-rÎjÍjËjËs-k-ZÌZÌZJbJRRR -R -R -R -R‹R‹ZJbJZJbJZJbJZÌZÌZJbJk/k/ƒÏƒÏk/k/s/k/c,c,{,{,jËjË{.{.{,{,{oƒp{oƒp{o{o{.{.“ϋσЃÐ{.{.{,{,jÍjÍrËjËjÍjÍrËjË{.{.bŒbŒbŒbŒbŒbŒbŒbŒRŠRŠbbR‹R‹ZJbJbŒbŒc,c,bŒbŒR‹R‹ZJbJR‹R‹jŠjŠZJbJZJbJbŒbŒR -R -bŒbŒc,c,k-k-s/k/{Ï{Ï{,{,c,c,k/k/rËjËc,c,k/k/c,c,ZJbJR -R -R -R -R -R -R‹R‹ZJbJZJbJZJbJbŒbŒR‹R‹bŒbŒ{Ï{σЃÐk/k/c,c,k-k-{,{,jËjË{.{.{oƒp{oƒp{o{o{,{,“ЋГЋД2Œ1“ЋЃЃЃЃÐ{Ï{Ï{oƒpjËjË{.{.{.{.ZJbJbŒbŒRŠRŠbŒbŒZIZIZIZIbŒbŒR‹R‹c,c,ZÌZÌZJbJZJbJZJbJZJbJZJbJR‹R‹bŒbŒZJbJc,c,bŒbŒc,c,{.{.{Ï{Ï{.{.k-k-s.k-k-k-rÎjÍjËjËs-k-ZÌZÌZJbJRRR -R -R -R -R‹R‹ZJbJZJbJZJbJZÌZÌZJbJk/k/ƒÏƒÏk/k/s/k/c,c,{,{,jËjË{.{.{,{,{oƒp{oƒp{o{o{.{.“ϋσЃÐ{.{.IEIE@å@åQEQEIEIEQEQEQEQEQEQE@ä@ä8Ä8äIEIEIEIE@å@åIEIEQEQEbbZJbJAGAGY…Y…YEYEQEQEYEYEY†Y†QEQEQEQEAEAEQ…Q…IEIEIEIEQÇQÇbŒbŒZZYEYEAGAGY†Y†AGAGQEQEIEIEIEIEA&A&A†A†IEIEAGAGY†Y†AGAGQÇQÇYÇYÇYÉYÉQÇQÇQÇQÇI‡I‡YÇYÇbbI‡I‡YÉYÉYÇYÇZZYÇYÇbbbŒbŒbbQÇQÇZZbIbIYÇYÇY†Y†YEYEQEQEHäHäYEYEQEQEQEQE8Ä8ä@å@åIEIEAEAE@å@åIEIEI$I$I‡I‡jËjËI‡I‡Y†Y†Y†Y†QEQEQEQEY†Y†QEQEQEQEIEIEIEIEQ…Q…QEQEAGAGZJbJbIbIQÇQÇAGAGY†Y†AGAGQEQEIEIEA&A&QEQEA&A&AGAGAGAGI†I†Y†Y†AGAGZZYÇYÇYÉYÉQÇQÇQÇQÇYÉYÉYÇYÇJJYÉYÉQÇQÇYÉYÉaÇaÇZZbŒbŒbbY†Y†AGAGA$A$9E9EIEIE@å@åQEQEIEIEQEQEQEQEQEQE@ä@ä8Ä8äIEIEIEIE@å@åIEIEQEQEbbZJbJAGAGY…Y…YEYEQEQEYEYEY†Y†QEQEQEQEAEAEQ…Q…IEIEIEIEQÇQÇbŒbŒZZYEYEAGAGY†Y†AGAGQEQEIEIEIEIEA&A&A†A†IEIEAGAGY†Y†AGAGQÇQÇYÇYÇYÉYÉQÇQÇQÇQÇI‡I‡YÇYÇbbI‡I‡YÉYÉYÇYÇZZYÇYÇbbbŒbŒbbQÇQÇZZbIbIYÇYÇY†Y†YEYEQEQEHäHäYEYEQEQEQEQE8Ä8ä@å@åIEIEAEAE@å@åIEIEI$I$I‡I‡jËjËI‡I‡Y†Y†Y†Y†QEQEQEQEY†Y†QEQEQEQEIEIEIEIEQ…Q…QEQEAGAGZJbJbIbIQÇQÇAGAGY†Y†AGAGQEQEIEIEA&A&QEQEA&A&AGAGAGAGI†I†Y†Y†AGAGZZYÇYÇYÉYÉQÇQÇQÇQÇYÉYÉYÇYÇJJYÉYÉQÇQÇYÉYÉaÇaÇZZbŒbŒbbY†Y†AGAGA$A$9E9E8Ä8ä9E9E@å@å@å@åA&A&@å@å8Ä8äA$A$0å0å8Ä8ä9E9E@å@åQEQEQEQEbbc/c/YEYEY†Y†YEYEY†Y†Y†Y†YEYEaÇaÇY†Y†I†I†AGAGQÇQÇIEIEI‡I‡c,c,YÉYÉAGAGAGAGA&A&IEIEA&A&@å@åIEIE@å@å@å@å9E9EA&A&A&A&IEIEQEQEA&A&QEQEA&A&AGAGI$I$A&A&0å0å8Ä8äA†A†A&A&AGAGYEYEYÉYÉZZQEQEQEQEA&A&QEQE@å@åQEQEA&A&I$I$A&A&@å@å@å@å8Ä8äA$A$8Ä8ä8Ä8ä9E9E@ä@äA&A&QEQEYEYEjÍjÍbbYEYEYEYEYEYEY†Y†YEYEaÇaÇY†Y†Y†Y†I†I†I†I†I†I†AGAGbŒbŒZJbJY†Y†A&A&IEIEA&A&@å@åIEIE@å@å9E9EA&A&8Ä8äIEIEA&A&A&A&QEQEA&A&QEQEA&A&AGAGQEQE@å@å9E9E0å0å@å@åA&A&QEQEAGAGa†a†bbI‡I‡QEQEA&A&8Ä8ä8Ä8ä8ä8Ä9E9E@å@å@å@åA&A&@å@å8Ä8äA$A$0å0å8Ä8ä9E9E@å@åQEQEQEQEbbc/c/YEYEY†Y†YEYEY†Y†Y†Y†YEYEaÇaÇY†Y†I†I†AGAGQÇQÇIEIEI‡I‡c,c,YÉYÉAGAGAGAGA&A&IEIEA&A&@å@åIEIE@å@å@å@å9E9EA&A&A&A&IEIEQEQEA&A&QEQEA&A&AGAGI$I$A&A&0å0å8Ä8äA†A†A&A&AGAGYEYEYÉYÉZZQEQEQEQEA&A&QEQE@å@åQEQEA&A&I$I$A&A&@å@å@å@å8Ä8äA$A$8Ä8ä8Ä8ä9E9E@ä@äA&A&QEQEYEYEjÍjÍbbYEYEYEYEYEYEY†Y†YEYEaÇaÇY†Y†Y†Y†I†I†I†I†I†I†AGAGbŒbŒZJbJY†Y†A&A&IEIEA&A&@å@åIEIE@å@å9E9EA&A&8Ä8äIEIEA&A&A&A&QEQEA&A&QEQEA&A&AGAGQEQE@å@å9E9E0å0å@å@åA&A&QEQEAGAGa†a†bbI‡I‡QEQEA&A&8Ä8ä8Ä8ä8Ä8ä8Ä8ä9E9E@å@å8Ä8äA$A$0å0å9$9$9E9E@å@å@å@åA$A$9E9EAGAGjjbŒbŒ@å@åYEYEaÇaÇYEYEaÇaÇY†Y†Y†Y†aÇaÇI‡I‡QÇQÇAGAGI‡I‡AÇAÇbŒbŒZZYEYEA&A&IEIE@å@å9E9E@å@åA&A&8Ä8ä9E9EA&A&A&A&@å@åIEIEA&A&QEQEA&A&AGAGQEQEA&A&A&A&9E9E0å0åAGAGIEIEA&A&QEQEa†a†YÉYÉAGAGYEYEI‡I‡QEQE@å@åA&A&QEQE8å8å@å@åA$A$9E9E8Ä8ä9E9E0å0å9E9E8Ä8äIEIE@å@åA&A&YÉYÉjÍjÍAGAGQEQEa†a†aÇaÇI‡I‡YEYEa†a†aÇaÇI‡I‡QÇQÇI‡I‡AGAGA†A†R -R -rIjIAGAGI†I†A&A&IEIE@å@å9E9EA&A&@å@åA$A$9E9EA&A&@å@åQEQEA&A&QEQE9E9EAGAGQEQE@å@åA†A†@å@å0å0åAGAGIEIEA&A&QEQEYEYEYÉYÉI†I†Y†Y†YEYEA&A&@å@å8ä8Ä8ä8Ä9E9E@å@å8ä8ÄA$A$0å0å9$9$9E9E@å@å@å@åA$A$9E9EAGAGjjbŒbŒ@å@åYEYEaÇaÇYEYEaÇaÇY†Y†Y†Y†aÇaÇI‡I‡QÇQÇAGAGI‡I‡AÇAÇbŒbŒZZYEYEA&A&IEIE@å@å9E9E@å@åA&A&8Ä8ä9E9EA&A&A&A&@å@åIEIEA&A&QEQEA&A&AGAGQEQEA&A&A&A&9E9E0å0åAGAGIEIEA&A&QEQEa†a†YÉYÉAGAGYEYEI‡I‡QEQE@å@åA&A&QEQE8å8å@å@åA$A$9E9E8Ä8ä9E9E0å0å9E9E8Ä8äIEIE@å@åA&A&YÉYÉjÍjÍAGAGQEQEa†a†aÇaÇI‡I‡YEYEa†a†aÇaÇI‡I‡QÇQÇI‡I‡AGAGA†A†R -R -rIjIAGAGI†I†A&A&IEIE@å@å9E9EA&A&@å@åA$A$9E9EA&A&@å@åQEQEA&A&QEQE9E9EAGAGQEQE@å@åA†A†@å@å0å0åAGAGIEIEA&A&QEQEYEYEYÉYÉI†I†Y†Y†YEYEA&A&@å@å8Ä8ä9E9E8Ä8ä0å0åA$A$0å0å8Ä8ä9E9E@å@å0å0å9$9$A&A&@å@åIEIEYÉYÉZÌZÌ8Ä8äYEYEaÇaÇY†Y†a†a†aÇaÇaÇaÇaÇaÇI‡I‡Y†Y†I‡I‡A†A†JJbŒbŒQÇQÇAGAGQEQEA&A&@å@åIEIE0å0åIEIE@å@å9E9E@å@å9E9EA&A&I†I†A&A&IEIEIEIEA&A&A&A&IEIE0å0å8Ä8ä9E9EA&A&AGAGI$I$YEYEYÉYÉYÉYÉQEQEI‡I‡QEQEA&A&QEQE8å8åA&A&@å@å8Ä8ä8Ä8ä9E9E8Ä8ä0å0å@å@å9E9E@å@å0å0åIEIE@å@åI†I†k-k-AGAGQEQEYEYEaÇaÇYEYEiÇiÇYÉYÉa†a†a†a†I‡I‡QÇQÇAGAGA†A†R -R -bbAGAGI†I†A&A&@å@å9E9EA&A&8Ä8äIEIE@å@å@å@å9E9EA&A&A&A&QEQEA&A&IEIEA&A&AGAGA&A&@å@å9E9E8Ä8äA†A†A&A&IEIEA&A&YEYEZJbJI‡I‡YEYEA&A&@å@å8Ä8ä8ä8Ä9E9E8ä8Ä0å0åA$A$0å0å8Ä8ä9E9E@å@å0å0å9$9$A&A&@å@åIEIEYÉYÉZÌZÌ8Ä8äYEYEaÇaÇY†Y†a†a†aÇaÇaÇaÇaÇaÇI‡I‡Y†Y†I‡I‡A†A†JJbŒbŒQÇQÇAGAGQEQEA&A&@å@åIEIE0å0åIEIE@å@å9E9E@å@å9E9EA&A&I†I†A&A&IEIEIEIEA&A&A&A&IEIE0å0å8Ä8ä9E9EA&A&AGAGI$I$YEYEYÉYÉYÉYÉQEQEI‡I‡QEQEA&A&QEQE8å8åA&A&@å@å8Ä8ä8Ä8ä9E9E8Ä8ä0å0å@å@å9E9E@å@å0å0åIEIE@å@åI†I†k-k-AGAGQEQEYEYEaÇaÇYEYEiÇiÇYÉYÉa†a†a†a†I‡I‡QÇQÇAGAGA†A†R -R -bbAGAGI†I†A&A&@å@å9E9EA&A&8Ä8äIEIE@å@å@å@å9E9EA&A&A&A&QEQEA&A&IEIEA&A&AGAGA&A&@å@å9E9E8Ä8äA†A†A&A&IEIEA&A&YEYEZJbJI‡I‡YEYEA&A&@å@å8Ä8ä8Ä8ä(ä(ä@å@å8Ä8ä9E9E8Ä8ä(ä(ä0å0å0å0åA$A$@å@å9E9E8Ä8ä9E9EbbZÌZÌYÇYÇa†a†iÇiÇrjzzzzzziÇiÇrjAGAGQÇQÇA&A&R -R -bJZJQÇQÇA&A&AGAG@å@åIEIE0å0å@å@å9E9E@å@å9E9EA&A&IEIE@å@åA&A&QEQEA&A&A&A&AGAGIEIE@å@å9E9E8Ä8ä8Ä8äA&A&IEIEA&A&YEYEYÉYÉbbI‡I‡QEQEA&A&A&A&QEQEA&A&I$I$8Ä8äAEAE8Ä8ä@å@å(ä(äA$A$0å0å@å@å9$9$@å@å8Ä8ä9E9EAGAGbŒbŒbbY†Y†aÇaÇiÇiÇzzzziÇiÇzziÇiÇQÇQÇAGAGI†I†AGAGbŒbŒYÉYÉA†A†QEQE9E9EA&A&A&A&8Ä8ä9E9E8å8å@å@åA&A&9E9EIEIEA&A&IEIEA&A&A&A&AGAGQEQE@å@å9E9E0å0å8Ä8ä9E9EA&A&A&A&YEYEY†Y†ZJbJaÇaÇA&A&A&A&@ä@ä8Ä8ä8ä8Ä(ä(ä@å@å8ä8Ä9E9E8ä8Ä(ä(ä0å0å0å0åA$A$@å@å9E9E8Ä8ä9E9EbbZÌZÌYÇYÇa†a†iÇiÇrjzzzzzziÇiÇrjAGAGQÇQÇA&A&R -R -bJZJQÇQÇA&A&AGAG@å@åIEIE0å0å@å@å9E9E@å@å9E9EA&A&IEIE@å@åA&A&QEQEA&A&A&A&AGAGIEIE@å@å9E9E8Ä8ä8Ä8äA&A&IEIEA&A&YEYEYÉYÉbbI‡I‡QEQEA&A&A&A&QEQEA&A&I$I$8Ä8äAEAE8Ä8ä@å@å(ä(äA$A$0å0å@å@å9$9$@å@å8Ä8ä9E9EAGAGbŒbŒbbY†Y†aÇaÇiÇiÇzzzziÇiÇzziÇiÇQÇQÇAGAGI†I†AGAGbŒbŒYÉYÉA†A†QEQE9E9EA&A&A&A&8Ä8ä9E9E8å8å@å@åA&A&9E9EIEIEA&A&IEIEA&A&A&A&AGAGQEQE@å@å9E9E0å0å8Ä8ä9E9EA&A&A&A&YEYEY†Y†ZJbJaÇaÇA&A&A&A&@ä@ä8Ä8ä8Ä8ä8Ä8ä9$9$8Ä8ä8Ä8äA$A$8Ä8ä8Ä8ä8Ä8ä9E9E8Ä8ä9E9EA&A&QEQEYÉYÉZÌZÌI‡I‡QÇQÇAGAGaÇaÇYÉYÉjjYÉYÉa†a†I‡I‡A&A&8Ä8äAÇAÇI‡I‡R -R -QEQEIEIEA&A&AEAE@å@å8Ä8ä9E9E@å@å8Ä8ä9E9EA&A&8Ä8äIEIEIEIEA&A&QEQEA&A&IEIE@å@å@å@å9E9E@å@å9†9†@å@åIEIEA&A&YEYEYÉYÉZJbJYEYEA&A&YEYEAGAGHäHäQEQE@å@å@å@åHäHä0Ä0ãIEIE(ä(ä8Ä8ä8Ä8ä9E9E8Ä8ä9E9EIEIEA&A&Y†Y†bŒbŒRRI‡I‡I†I†I‡I‡YÉYÉbbjjYÉYÉYÇYÇAGAG8Ä8äA†A†A&A&R‹R‹QÇQÇA&A&QEQE@å@å9E9E@å@å8Ä8ä@å@å9E9E8Ä8ä9E9EA&A&A&A&@å@åQEQEIEIEIEIEA&A&A&A&8Ä8ä9E9EA&A&@å@å9E9EQEQEA&A&QEQEYEYEZJbJYÉYÉQEQEQEQE8Ä8ä8Ä8ä8ä8Ä8ä8Ä9$9$8Ä8ä8Ä8äA$A$8Ä8ä8Ä8ä8Ä8ä9E9E8Ä8ä9E9EA&A&QEQEYÉYÉZÌZÌI‡I‡QÇQÇAGAGaÇaÇYÉYÉjjYÉYÉa†a†I‡I‡A&A&8Ä8äAÇAÇI‡I‡R -R -QEQEIEIEA&A&AEAE@å@å8Ä8ä9E9E@å@å8Ä8ä9E9EA&A&8Ä8äIEIEIEIEA&A&QEQEA&A&IEIE@å@å@å@å9E9E@å@å9†9†@å@åIEIEA&A&YEYEYÉYÉZJbJYEYEA&A&YEYEAGAGHäHäQEQE@å@å@å@åHäHä0Ä0ãIEIE(ä(ä8Ä8ä8Ä8ä9E9E8Ä8ä9E9EIEIEA&A&Y†Y†bŒbŒRRI‡I‡I†I†I‡I‡YÉYÉbbjjYÉYÉYÇYÇAGAG8Ä8äA†A†A&A&R‹R‹QÇQÇA&A&QEQE@å@å9E9E@å@å8Ä8ä@å@å9E9E8Ä8ä9E9EA&A&A&A&@å@åQEQEIEIEIEIEA&A&A&A&8Ä8ä9E9EA&A&@å@å9E9EQEQEA&A&QEQEYEYEZJbJYÉYÉQEQEQEQE8Ä8ä8Ä8äAGAGA†A†AGAGA†A†9E9E9E9E9E9E9†9†AGAG9†9†A&A&A&A&AGAGAGAGZJbJR‹R‹(ä(ä(ä(äÄ Ä£ £ Ä Ä(å(å0æ0æÄ Ä0æ0æR -R -BBBBc/c/ZJbJAGAG0æ0æA†A†A&A&AGAG0å0å0å0å@å@å0æ0æ8Ä8ä9E9EAGAGAGAGA&A&A&A&A&A&A&A&A&A&A&A&9E9E8å8å0å0å@å@åA†A†AGAGI‡I‡I‡I‡YÉYÉjÍjÍbJZJYÉYÉYÉYÉI‡I‡I‡I‡AGAGA&A&IEIE8Ä8ä9E9E8Ä8ä(ä(ä(ä(ä(ä(ä0å0å0æ0æAGAGA&A&AGAGRRc-c-AÇAÇ Ä Ä ÄÄ ÄÃ(Ä(ÃÄ Ä0æ0æ(ä(ä å åI‡I‡BBAÇAÇR -R -c/c/AGAGA&A&AGAG0æ0æAGAG0æ0æ9E9E0å0å@å@å1†1†8Ä8äA&A&AGAGA&A&A&A&A&A&A&A&A&A&A&A&IEIE8å8å8Ä8ä9E9EA&A&AGAGI‡I‡I‡I‡YÉYÉjŠjŠbŒbŒYÉYÉYÉYÉYÉYÉI‡I‡AGAGA†A†AGAGA†A†9E9E9E9E9E9E9†9†AGAG9†9†A&A&A&A&AGAGAGAGZJbJR‹R‹(ä(ä(ä(äÄ Ä£ £ Ä Ä(å(å0æ0æÄ Ä0æ0æR -R -BBBBc/c/ZJbJAGAG0æ0æA†A†A&A&AGAG0å0å0å0å@å@å0æ0æ8Ä8ä9E9EAGAGAGAGA&A&A&A&A&A&A&A&A&A&A&A&9E9E8å8å0å0å@å@åA†A†AGAGI‡I‡I‡I‡YÉYÉjÍjÍbJZJYÉYÉYÉYÉI‡I‡I‡I‡AGAGA&A&IEIE8Ä8ä9E9E8Ä8ä(ä(ä(ä(ä(ä(ä0å0å0æ0æAGAGA&A&AGAGRRc-c-AÇAÇ Ä Ä ÄÄ ÄÃ(Ä(ÃÄ Ä0æ0æ(ä(ä å åI‡I‡BBAÇAÇR -R -c/c/AGAGA&A&AGAG0æ0æAGAG0æ0æ9E9E0å0å@å@å1†1†8Ä8äA&A&AGAGA&A&A&A&A&A&A&A&A&A&A&A&IEIE8å8å8Ä8ä9E9EA&A&AGAGI‡I‡I‡I‡YÉYÉjŠjŠbŒbŒYÉYÉYÉYÉYÉYÉI‡I‡k/k/rËjËk/k/rËjËbŒbŒƒÐƒÐk/k/bJZJc,c,bbR‹R‹ZJbJZJbJZÌZÌjËjËs-k-ZJbJZJbJZJbJJJZJbJbŒbŒc/c/k-k-{Ï{σЃÐ{.{.{.{.{.{.{,{,k,k,s/k/k,k,s/k/c,c,ƒÒƒÑ{.{.c,c,c,c,c/c/bŒbŒƒÐƒÐk/k/s,k,k/k/c,c,{.{.c,c,jÍjÍs/k/ƒÐƒÐ{oƒpc,c,{oƒp{oƒp{o{o{.{.{.{.{oƒp{,{,{.{.{.{.{.{.k/k/jËrËk-k-jËrËjÍjÍbŒbŒZJbJR -R -R -R -JJR -R -ZIZIbŒbŒR‹R‹RŠRŠjÍjÍrËjËZJbJR‹R‹ZJbJR -R -bJZJbŒbŒc,c,k-k-{.{.ƒÐƒÐ{oƒpk-k-k-s.{,{,k-k-k,s,k/k/k,s,k/k/{.{.ƒÐƒÐk-k-bŒbŒk-k-ZÌZÌ{oƒp{oƒpc.c/k-k-s.k-k-k-s.k-bŒbŒk-k-ƒÐƒÐƒÒƒÑbŒbŒ{oƒp{oƒps.{.{.{.{.{.{.{.{oƒp{.{.{.{.k-k-{.{.k/s/jËjËk/s/jËjËbŒbŒƒÐƒÐk/k/bJZJc,c,bbR‹R‹ZJbJZJbJZÌZÌjËjËs-k-ZJbJZJbJZJbJJJZJbJbŒbŒc/c/k-k-{Ï{σЃÐ{.{.{.{.{.{.{,{,k,k,s/k/k,k,s/k/c,c,ƒÒƒÑ{.{.c,c,c,c,c/c/bŒbŒƒÐƒÐk/k/s,k,k/k/c,c,{.{.c,c,jÍjÍs/k/ƒÐƒÐ{oƒpc,c,{oƒp{oƒp{o{o{.{.{.{.{oƒp{,{,{.{.{.{.{.{.k/k/jËrËk-k-jËrËjÍjÍbŒbŒZJbJR -R -R -R -JJR -R -ZIZIbŒbŒR‹R‹RŠRŠjÍjÍrËjËZJbJR‹R‹ZJbJR -R -bJZJbŒbŒc,c,k-k-{.{.ƒÐƒÐ{oƒpk-k-k-s.{,{,k-k-k,s,k/k/k,s,k/k/{.{.ƒÐƒÐk-k-bŒbŒk-k-ZÌZÌ{oƒp{oƒpc.c/k-k-s.k-k-k-s.k-bŒbŒk-k-ƒÐƒÐƒÒƒÑbŒbŒ{oƒp{oƒps.{.{.{.{.{.{.{.{oƒp{.{.{.{.k-k-{.{.Y†Y†Y†Y†Y†Y†AGAGY†Y†ƒÐƒÐjŠjŠ8Ä8äQEQEA&A&@å@åAEAEAEAEQEQEA&A&QEQEAGAGQÇQÇAGAGI†I†AGAGQÇQÇI†I†Y†Y†QÇQÇI†I†QEQEIEIEIEIEIEIEA&A&QEQEQÇQÇY…Y…Y†Y†jŠjŠ“Ð‹ÐR -R -QÇQÇQEQEI†I†I†I†AGAGI†I†AGAGQEQEI†I†YEYEY†Y†YÉYɃЃÐjŠjŠbbZZQÇQÇYÇYÇYÉYÉY†Y†Y†Y†I‡I‡I†I†AGAGQÇQÇY†Y†YÉYÉY†Y†YÇYÇ{,{,bŒbŒIEIE@å@åI$I$AEAEI$I$A&A&8ã8äQEQEQEQEA&A&AGAGI†I†I‡I‡Y†Y†AGAGAGAGQÇQÇI†I†Y†Y†I‡I‡QÇQÇIEIEQEQEA&A&IEIEI†I†QEQEQEQEY†Y†Y†Y†ZZƒÏƒÏk-k-Y†Y†I†I†I†I†I†I†A&A&I†I†I†I†QEQEA&A&Y†Y†Y†Y†Y†Y†k-k-{.{.bbZZQÇQÇYÇYÇYÉYÉYÇYÇaÇaÇI†I†AGAGY†Y†I†I†Y†Y†Y†Y†Y†Y†Y†Y†AGAGY†Y†ƒÐƒÐjŠjŠ8Ä8äQEQEA&A&@å@åAEAEAEAEQEQEA&A&QEQEAGAGQÇQÇAGAGI†I†AGAGQÇQÇI†I†Y†Y†QÇQÇI†I†QEQEIEIEIEIEIEIEA&A&QEQEQÇQÇY…Y…Y†Y†jŠjŠ“Ð‹ÐR -R -QÇQÇQEQEI†I†I†I†AGAGI†I†AGAGQEQEI†I†YEYEY†Y†YÉYɃЃÐjŠjŠbbZZQÇQÇYÇYÇYÉYÉY†Y†Y†Y†I‡I‡I†I†AGAGQÇQÇY†Y†YÉYÉY†Y†YÇYÇ{,{,bŒbŒIEIE@å@åI$I$AEAEI$I$A&A&8ã8äQEQEQEQEA&A&AGAGI†I†I‡I‡Y†Y†AGAGAGAGQÇQÇI†I†Y†Y†I‡I‡QÇQÇIEIEQEQEA&A&IEIEI†I†QEQEQEQEY†Y†Y†Y†ZZƒÏƒÏk-k-Y†Y†I†I†I†I†I†I†A&A&I†I†I†I†QEQEA&A&Y†Y†Y†Y†Y†Y†k-k-{.{.bbZZQÇQÇYÇYÇYÉYÉYÇYÇaÇaÇI†I†AGAGY†Y†I†I†Y†Y†QEQEQEQEY†Y†AGAGYEYEk-k-R -R -IEIEI$I$I$I$QEQE@å@åQEQEQEQEA&A&QEQEA&A&QEQEIEIEA&A&QEQEAGAGQEQEAGAGQEQEYEYEA&A&IEIEA&A&IEIEIEIEQEQEYEYEY†Y†YEYEjËjË{Ð{ÐbIbIQEQEA&A&QEQEQEQEA&A&QEQEQEQEQEQEA&A&YEYEAGAGiÇiÇs/k/I†I†YEYEAGAGYEYEYEYEQEQEAGAGQEQEAGAGQEQEA&A&I†I†AGAGI†I†YEYEYEYEZJbJbŒbŒHäHäHäHäHäHä8ä8ã@å@åQEQEIEIE@å@åQEQEQEQEA&A&I$I$QEQEA&A&QEQEIEIEAGAGQEQEAGAGQEQEY†Y†IEIEIEIEA&A&IEIEI$I$IEIEQEQEY†Y†Y†Y†bbƒÐƒÐk-k-I$I$AGAGQEQEQEQEQEQEA&A&QEQEAGAGQEQEQEQEAGAGYEYE{,{,ZJbJQEQEQEQEYEYEI‡I‡QEQEQEQEA&A&QEQEAGAGQEQEQEQEAGAGQEQEQEQEY†Y†AGAGYEYEk-k-R -R -IEIEI$I$I$I$QEQE@å@åQEQEQEQEA&A&QEQEA&A&QEQEIEIEA&A&QEQEAGAGQEQEAGAGQEQEYEYEA&A&IEIEA&A&IEIEIEIEQEQEYEYEY†Y†YEYEjËjË{Ð{ÐbIbIQEQEA&A&QEQEQEQEA&A&QEQEQEQEQEQEA&A&YEYEAGAGiÇiÇs/k/I†I†YEYEAGAGYEYEYEYEQEQEAGAGQEQEAGAGQEQEA&A&I†I†AGAGI†I†YEYEYEYEZJbJbŒbŒHäHäHäHäHäHä8ä8ã@å@åQEQEIEIE@å@åQEQEQEQEA&A&I$I$QEQEA&A&QEQEIEIEAGAGQEQEAGAGQEQEY†Y†IEIEIEIEA&A&IEIEI$I$IEIEQEQEY†Y†Y†Y†bbƒÐƒÐk-k-I$I$AGAGQEQEQEQEQEQEA&A&QEQEAGAGQEQEQEQEAGAGYEYE{,{,ZJbJQEQEQEQEYEYEI‡I‡QEQEQEQEA&A&QEQEAGAGQEQEQEQEAGAGQEQEY†Y†A&A&QEQEYEYEZJbJRR@å@åQEQE@å@åI$I$QEQEQEQEA&A&I$I$QEQE@å@åIEIEI$I$IEIEA&A&IEIEQEQEQEQEY†Y†QEQEQEQEA&A&IEIEQEQEQEQEYEYEY†Y†QÇQÇYEYEjŠjŠƒÒƒÑI‡I‡QEQEAGAGQEQEA&A&QEQEA&A&QEQEA&A&QEQEAGAGYEYEYÇYǃЃÐI‡I‡YEYEYEYEYEYEAGAGYEYEYEYEAGAGYEYEI†I†AGAGQEQEA&A&I†I†I‡I‡YEYEjËjËbJZJI$I$@å@åHäHä0Ä0ãA$A$IEIEI$I$QEQE@å@åIEIEIEIEI$I$QEQEIEIEA&A&IEIEI$I$AGAGQEQEQEQEQEQEQEQEA&A&IEIEQEQEQEQEQEQEY†Y†Y†Y†QEQEaÇaǃЃÐZJbJAGAGQEQEQEQEA&A&A&A&QEQEQEQEA&A&QEQEIEIEYEYEYEYEjÍjÍbŒbŒYEYEYEYEYEYEAGAGQEQEYEYEYEYEI†I†YEYEA&A&I†I†QEQEQEQEY†Y†A&A&QEQEYEYEZJbJRR@å@åQEQE@å@åI$I$QEQEQEQEA&A&I$I$QEQE@å@åIEIEI$I$IEIEA&A&IEIEQEQEQEQEY†Y†QEQEQEQEA&A&IEIEQEQEQEQEYEYEY†Y†QÇQÇYEYEjŠjŠƒÒƒÑI‡I‡QEQEAGAGQEQEA&A&QEQEA&A&QEQEA&A&QEQEAGAGYEYEYÇYǃЃÐI‡I‡YEYEYEYEYEYEAGAGYEYEYEYEAGAGYEYEI†I†AGAGQEQEA&A&I†I†I‡I‡YEYEjËjËbJZJI$I$@å@åHäHä0Ä0ãA$A$IEIEI$I$QEQE@å@åIEIEIEIEI$I$QEQEIEIEA&A&IEIEI$I$AGAGQEQEQEQEQEQEQEQEA&A&IEIEQEQEQEQEQEQEY†Y†Y†Y†QEQEaÇaǃЃÐZJbJAGAGQEQEQEQEA&A&A&A&QEQEQEQEA&A&QEQEIEIEYEYEYEYEjÍjÍbŒbŒYEYEYEYEYEYEAGAGQEQEYEYEYEYEI†I†YEYEA&A&I†I†QEQEQEQEA&A&QEQEA&A&YEYER -R -YÉYÉ@å@åI$I$I$I$QEQEI$I$QEQEI$I$A&A&HäHäQEQEI$I$A&A&I$I$QEQEQEQEQEQEQEQEYEYEY†Y†QEQEQEQEQEQEYEYEY†Y†Y†Y†Y†Y†Y…Y…Y…Y…jËj˃ЃÐI‡I‡A&A&I$I$A&A&I$I$A&A&QEQEA&A&AEAEA&A&IEIEQEQEa†a†{oƒpbbYEYEYEYEY†Y†QEQEYEYEAGAGYEYEYEYEQEQEAGAGIEIEA&A&AGAGQÇQÇjjbJZJbŒbŒI$I$@ä@ä@å@å8ã8äI$I$I$I$QEQEA&A&QEQEHäHäQEQEQEQE@å@åI$I$A&A&I$I$QEQEQEQEQEQEYEYEY†Y†QEQEQEQEQEQEYEYEY†Y†Y†Y†Y†Y†Y†Y†Y…Y…bIbIƒÐƒÐZJbJAEAEQEQE8å8åQEQEA&A&QEQE@å@åIEIEA&A&A&A&QEQEYEYE{,{,bŒbŒYEYEY†Y†YEYEQEQEYEYEAGAGQEQEYEYEAGAGQEQEA&A&QEQEQEQEA&A&QEQEA&A&YEYER -R -YÉYÉ@å@åI$I$I$I$QEQEI$I$QEQEI$I$A&A&HäHäQEQEI$I$A&A&I$I$QEQEQEQEQEQEQEQEYEYEY†Y†QEQEQEQEQEQEYEYEY†Y†Y†Y†Y†Y†Y…Y…Y…Y…jËj˃ЃÐI‡I‡A&A&I$I$A&A&I$I$A&A&QEQEA&A&AEAEA&A&IEIEQEQEa†a†{oƒpbbYEYEYEYEY†Y†QEQEYEYEAGAGYEYEYEYEQEQEAGAGIEIEA&A&AGAGQÇQÇjjbJZJbŒbŒI$I$@ä@ä@å@å8ã8äI$I$I$I$QEQEA&A&QEQEHäHäQEQEQEQE@å@åI$I$A&A&I$I$QEQEQEQEQEQEYEYEY†Y†QEQEQEQEQEQEYEYEY†Y†Y†Y†Y†Y†Y†Y†Y…Y…bIbIƒÐƒÐZJbJAEAEQEQE8å8åQEQEA&A&QEQE@å@åIEIEA&A&A&A&QEQEYEYE{,{,bŒbŒYEYEY†Y†YEYEQEQEYEYEAGAGQEQEYEYEAGAGQEQEA&A&QEQEIEIEQEQEA&A&QEQEI‡I‡jjbJZJHäHäIEIEHãHäHäHäQEQEQEQEQEQEQEQEHäHäQEQEQEQEQEQEQEQEQEQEQEQEQEQEYEYEY†Y†Y†Y†QEQEY†Y†QEQEY†Y†YEYEaÇaÇY…Y…aÇaÇY†Y†bŒbŒ{Ï{ÏYÉYÉIEIEIEIEA&A&QEQEA&A&@å@åQEQEIEIEA&A&QEQEQEQEaÇaÇjÍjÍZZa†a†YEYEYEYEYEYEYEYEQEQEYEYEY†Y†QEQEA&A&QEQEAGAGIEIEY†Y†I‡I‡jÎjÍbŒbŒI$I$@ä@ä@å@å8ã8ä@å@åIEIEI$I$QEQEQEQEQEQEHäHäQEQEIEIEHäHäQEQEQEQEQEQEHäHäYEYEa†a†Y…Y…Y†Y†QEQEYEYEY†Y†QEQEY†Y†aÇaÇY…Y…a†a†bbk/k/c,c,I$I$A&A&AGAGI$I$A&A&A&A&AEAEQEQEA&A&IEIEQEQEYEYEbŒbŒbŒbŒY…Y…YEYEYEYEYEYEYEYEQEQEYEYEY†Y†YEYEAGAGQEQEA&A&IEIEQEQEA&A&QEQEI‡I‡jjbJZJHäHäIEIEHãHäHäHäQEQEQEQEQEQEQEQEHäHäQEQEQEQEQEQEQEQEQEQEQEQEQEQEYEYEY†Y†Y†Y†QEQEY†Y†QEQEY†Y†YEYEaÇaÇY…Y…aÇaÇY†Y†bŒbŒ{Ï{ÏYÉYÉIEIEIEIEA&A&QEQEA&A&@å@åQEQEIEIEA&A&QEQEQEQEaÇaÇjÍjÍZZa†a†YEYEYEYEYEYEYEYEQEQEYEYEY†Y†QEQEA&A&QEQEAGAGIEIEY†Y†I‡I‡jÎjÍbŒbŒI$I$@ä@ä@å@å8ã8ä@å@åIEIEI$I$QEQEQEQEQEQEHäHäQEQEIEIEHäHäQEQEQEQEQEQEHäHäYEYEa†a†Y…Y…Y†Y†QEQEYEYEY†Y†QEQEY†Y†aÇaÇY…Y…a†a†bbk/k/c,c,I$I$A&A&AGAGI$I$A&A&A&A&AEAEQEQEA&A&IEIEQEQEYEYEbŒbŒbŒbŒY…Y…YEYEYEYEYEYEYEYEQEQEYEYEY†Y†YEYEAGAGQEQEA&A&@å@åQEQEQEQEYEYEI‡I‡bbJJI$I$@ä@äI$I$A&A&QEQEI$I$QEQEI$I$QEQEI$I$@å@åIEIEI$I$QEQEYEYEYEYEYEYEaÇaÇQEQEQEQEYEYEY†Y†Y†Y†Y…Y…Y…Y…QÇQÇYEYEQ…Q…bbƒÐƒÐRRA&A&QEQEA&A&A&A&QEQE@å@åIEIEIEIEA&A&AGAGI$I$A&A&c/c/aÇaÇYEYEY†Y†YEYEY†Y†YEYEYEYEY†Y†YEYEQEQEQEQEQEQEIEIEIEIEIEIE@å@åbŒbŒbŒbŒ@ã@äHäHä8Ä8Ã@ä@ä8Ä8Ã8ä8ãI$I$QEQEQEQEI$I$QEQEI$I$I$I$QEQEI$I$QEQEQEQEY†Y†Y…Y…Y…Y…Y†Y†IEIEYEYEY†Y†Y†Y†Y…Y…Y…Y…Y†Y†Y…Y…QEQEY†Y†k/k/s-k-HäHäYEYEA&A&IEIEA&A&I$I$A&A&IEIEA&A&QEQEA&A&A&A&bIbIbŒbŒYEYEY…Y…YEYEY†Y†Y†Y†YEYEY†Y†Y…Y…YEYEQEQEA&A&HäHä@å@åQEQEQEQEYEYEI‡I‡bbJJI$I$@ä@äI$I$A&A&QEQEI$I$QEQEI$I$QEQEI$I$@å@åIEIEI$I$QEQEYEYEYEYEYEYEaÇaÇQEQEQEQEYEYEY†Y†Y†Y†Y…Y…Y…Y…QÇQÇYEYEQ…Q…bbƒÐƒÐRRA&A&QEQEA&A&A&A&QEQE@å@åIEIEIEIEA&A&AGAGI$I$A&A&c/c/aÇaÇYEYEY†Y†YEYEY†Y†YEYEYEYEY†Y†YEYEQEQEQEQEQEQEIEIEIEIEIEIE@å@åbŒbŒbŒbŒ@ã@äHäHä8Ä8Ã@ä@ä8Ä8Ã8ä8ãI$I$QEQEQEQEI$I$QEQEI$I$I$I$QEQEI$I$QEQEQEQEY†Y†Y…Y…Y…Y…Y†Y†IEIEYEYEY†Y†Y†Y†Y…Y…Y…Y…Y†Y†Y…Y…QEQEY†Y†k/k/s-k-HäHäYEYEA&A&IEIEA&A&I$I$A&A&IEIEA&A&QEQEA&A&A&A&bIbIbŒbŒYEYEY…Y…YEYEY†Y†Y†Y†YEYEY†Y†Y…Y…YEYEQEQEA&A&HäHäA&A&AGAGI‡I‡AGAGZJbJbŒbŒbŒbŒAGAG8æ8æA&A&A&A&A&A&AGAGAGAGJJI‡I‡AGAGRRAGAGI‡I‡I‡I‡I‡I‡YÉYÉAÇAÇI‡I‡AGAGAGAGAÇAÇI‡I‡AGAGYÉYÉRRbbZJbJjËjËrÍjÍc,c,ZJbJA&A&AGAGAGAGA&A&I‡I‡BBAGAGBBAGAGI‡I‡R‹R‹jÍjÍ{.{.R -R -AGAGI‡I‡AGAGI‡I‡I‡I‡JJI‡I‡YÉYÉYÉYÉJJR -R -I‡I‡JJI‡I‡R -R -ƒÐƒÐƒÐƒÐbbJJAGAGAGAG9E9EA&A&AGAGA&A&AGAGI‡I‡AGAGI‡I‡BBI‡I‡I‡I‡I‡I‡JJI‡I‡YÉYÉAGAGI‡I‡AGAGAÇAÇAGAGAGAGYÉYÉRRYÉYÉZJbJjŠjŠk-k-c,c,jÍjÍA&A&AGAGAGAGAGAGAGAGJJAGAGI‡I‡AGAGBBR -R -bŒbŒk/k/bŒbŒI‡I‡I‡I‡AGAGI‡I‡I‡I‡I‡I‡I‡I‡YÉYÉJJYÉYÉBBI‡I‡A&A&AGAGI‡I‡AGAGZJbJbŒbŒbŒbŒAGAG8æ8æA&A&A&A&A&A&AGAGAGAGJJI‡I‡AGAGRRAGAGI‡I‡I‡I‡I‡I‡YÉYÉAÇAÇI‡I‡AGAGAGAGAÇAÇI‡I‡AGAGYÉYÉRRbbZJbJjËjËrÍjÍc,c,ZJbJA&A&AGAGAGAGA&A&I‡I‡BBAGAGBBAGAGI‡I‡R‹R‹jÍjÍ{.{.R -R -AGAGI‡I‡AGAGI‡I‡I‡I‡JJI‡I‡YÉYÉYÉYÉJJR -R -I‡I‡JJI‡I‡R -R -ƒÐƒÐƒÐƒÐbbJJAGAGAGAG9E9EA&A&AGAGA&A&AGAGI‡I‡AGAGI‡I‡BBI‡I‡I‡I‡I‡I‡JJI‡I‡YÉYÉAGAGI‡I‡AGAGAÇAÇAGAGAGAGYÉYÉRRYÉYÉZJbJjŠjŠk-k-c,c,jÍjÍA&A&AGAGAGAGAGAGAGAGJJAGAGI‡I‡AGAGBBR -R -bŒbŒk/k/bŒbŒI‡I‡I‡I‡AGAGI‡I‡I‡I‡I‡I‡I‡I‡YÉYÉJJYÉYÉBBI‡I‡k/k/ƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÐ{oƒp{.{.{oƒpc-c-ƒÐƒÐk/k/{Ï{Ïc/c/k-k-{.{.bŒbŒk/k/bŒbŒk,k,s/k/c/c/bŒbŒk-k-{.{.c/c/k-k-{.{.ƒÐƒÐ{oƒpk/k/{Ï{σЃЃσσЃГЋД2Œ1ƒÐƒÐ{.{.{.{.ƒÐƒÐƒÐƒÐƒÐƒÐ{oƒpƒÐƒÐƒÐƒÐ{Ð{Ð{Ð{Ð{oƒp‹Ð“ÐŒ0”0‹Ð“ЋГÐ{oƒpsÏ{Ïk/k/“ГЃ҃Ñ{Ð{Ð{Ð{ГЋЃ҃є“Œ“”“Œ“œ“œ“œ“œ“œ“œ“”“Œ“œ“œ“”“Œ“ƒÐƒÐƒÐƒÐk/k/s/k/{.{.ƒÐƒÐk/k/s/k/k,k,s/k/k/k/s-k-bŒbŒc,c,k/k/bŒbŒk-k-bŒbŒk/k/s/k/k,k,s/k/ƒÒƒÑƒÐƒÐ{.{.{Ï{Ï{oƒpƒÐƒÐƒÏƒÏ“ЋД0Œ0“ЋЃЃÐk/k/{Ï{σЃЃЃЃЃÐ{Ð{Ѓ҃уЃÐ{Ð{Ðk/k/ƒÐƒÐ”2Œ1“ϋϓЋЃЃÐk/k/ƒÐƒÐƒÐƒÐ{Ð{ГЋÐ{Ð{ЃЃЃ҃є“Œ“œ“œ“ƒÒƒÑk/s/ƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÐ{oƒp{.{.{oƒpc-c-ƒÐƒÐk/k/{Ï{Ïc/c/k-k-{.{.bŒbŒk/k/bŒbŒk,k,s/k/c/c/bŒbŒk-k-{.{.c/c/k-k-{.{.ƒÐƒÐ{oƒpk/k/{Ï{σЃЃσσЃГЋД2Œ1ƒÐƒÐ{.{.{.{.ƒÐƒÐƒÐƒÐƒÐƒÐ{oƒpƒÐƒÐƒÐƒÐ{Ð{Ð{Ð{Ð{oƒp‹Ð“ÐŒ0”0‹Ð“ЋГÐ{oƒpsÏ{Ïk/k/“ГЃ҃Ñ{Ð{Ð{Ð{ГЋЃ҃є“Œ“”“Œ“œ“œ“œ“œ“œ“œ“”“Œ“œ“œ“”“Œ“ƒÐƒÐƒÐƒÐk/k/s/k/{.{.ƒÐƒÐk/k/s/k/k,k,s/k/k/k/s-k-bŒbŒc,c,k/k/bŒbŒk-k-bŒbŒk/k/s/k/k,k,s/k/ƒÒƒÑƒÐƒÐ{.{.{Ï{Ï{oƒpƒÐƒÐƒÏƒÏ“ЋД0Œ0“ЋЃЃÐk/k/{Ï{σЃЃЃЃЃÐ{Ð{Ѓ҃уЃÐ{Ð{Ðk/k/ƒÐƒÐ”2Œ1“ϋϓЋЃЃÐk/k/ƒÐƒÐƒÐƒÐ{Ð{ГЋÐ{Ð{ЃЃЃ҃є“Œ“œ“œ“ƒÒƒÑA†A†QEQEA&A&AGAGA†A†IEIEAGAGA†A†IEIEAGAGYÇYÇRŠRŠQEQEIEIEIEIEQEQEI$I$IEIEIEIEIEIEI$I$AEAEAEAEY†Y†Y†Y†R -R -IÇIÇQÇQÇAÇAÇQÇQÇA†A†IEIEAGAGQÇQÇAGAGYÇYÇYÇYÇRRYÇYÇIÇIÇYÇYÇYÇYÇIÇIÇYÉYÉQÇQÇI†I†I†I†I†I†I‡I‡I†I†I†I†I†I†I‡I‡Y†Y†bŒbŒZIZIAÇAÇA$A$9E9EA&A&A†A†A†A†A&A&AÇAÇIEIEAGAGAEAEA†A†A†A†QEQE9E9EI†I†AGAGQEQEAÇAÇjŠjŠI‡I‡IEIEIEIEQEQEIEIEHäHäIEIEIEIEIEIE@å@åI$I$I†I†aÇaÇRRRRAÇAÇQÇQÇQÇQÇA&A&AGAGAÇAÇQEQEAÇAÇQÇQÇQÇQÇYÇYÇRRQÇQÇQÇQÇYÇYÇQÇQÇQÇQÇQÇQÇAGAGQÇQÇQEQEI‡I‡QÇQÇA†A†I†I†QÇQÇY†Y†ZZZJbJRR9E9E9E9EIEIEA&A&AÇAÇA&A&A†A†A†A†QEQEA&A&AGAGA†A†IEIEAGAGA†A†IEIEAGAGYÇYÇRŠRŠQEQEIEIEIEIEQEQEI$I$IEIEIEIEIEIEI$I$AEAEAEAEY†Y†Y†Y†R -R -IÇIÇQÇQÇAÇAÇQÇQÇA†A†IEIEAGAGQÇQÇAGAGYÇYÇYÇYÇRRYÇYÇIÇIÇYÇYÇYÇYÇIÇIÇYÉYÉQÇQÇI†I†I†I†I†I†I‡I‡I†I†I†I†I†I†I‡I‡Y†Y†bŒbŒZIZIAÇAÇA$A$9E9EA&A&A†A†A†A†A&A&AÇAÇIEIEAGAGAEAEA†A†A†A†QEQE9E9EI†I†AGAGQEQEAÇAÇjŠjŠI‡I‡IEIEIEIEQEQEIEIEHäHäIEIEIEIEIEIE@å@åI$I$I†I†aÇaÇRRRRAÇAÇQÇQÇQÇQÇA&A&AGAGAÇAÇQEQEAÇAÇQÇQÇQÇQÇYÇYÇRRQÇQÇQÇQÇYÇYÇQÇQÇQÇQÇQÇQÇAGAGQÇQÇQEQEI‡I‡QÇQÇA†A†I†I†QÇQÇY†Y†ZZZJbJRR9E9E9E9EIEIEA&A&AÇAÇA&A&A†A†@å@åHäHä8ä8ã@å@åHäHä8ä8ã8ä8ãHäHä8ä8ã@å@åY…Y…ZJbJ@å@åHäHäHäHä@ä@ãHäHä@ä@ãHäHä0Ä0ã8ä8ãHäHä8ä8ãI$I$QEQEjŠjŠA&A&AEAE@å@å@ä@ä0Ä0ä@å@åA$A$8Ä8äAEAE@å@åHäHäAEAEQEQEQEQEQEQEQEQEQEQEI$I$A&A&IEIEQEQEQEQE@å@åIEIE@å@å9E9EA&A&QEQE{,{,AGAG@å@åA$A$@å@å9E9E@å@å8Ä8ä9E9E@ä@ä8Ä8äHäHä8Ä8äHäHä8ä8ã@å@å8ã8ä@å@å8ã8äHäHäAEAEbIbIAGAGHäHäHäHä@ä@ã@ä@ãHäHä@ä@ãHäHä8ä8ãHäHä8ä8ãI$I$@å@åbbR -R -8ã8ä@å@å8Ä8äA$A$0Ä0ãAEAE@å@å@å@åAEAEI$I$A&A&I$I$AGAGHäHäQEQEQEQEQEQEQEQEQEQEA&A&IEIEI$I$@å@å9E9E@å@åA&A&IEIEbIbIZJbJ8Ä8äIEIE8å8å8Ä8ä9E9E8Ä8ä8Ä8äAEAE@å@åHäHä8ä8ã@å@åHäHä8ä8ã8ä8ãHäHä8ä8ã@å@åY…Y…ZJbJ@å@åHäHäHäHä@ä@ãHäHä@ä@ãHäHä0Ä0ã8ä8ãHäHä8ä8ãI$I$QEQEjŠjŠA&A&AEAE@å@å@ä@ä0Ä0ä@å@åA$A$8Ä8äAEAE@å@åHäHäAEAEQEQEQEQEQEQEQEQEQEQEI$I$A&A&IEIEQEQEQEQE@å@åIEIE@å@å9E9EA&A&QEQE{,{,AGAG@å@åA$A$@å@å9E9E@å@å8Ä8ä9E9E@ä@ä8Ä8äHäHä8Ä8äHäHä8ä8ã@å@å8ã8ä@å@å8ã8äHäHäAEAEbIbIAGAGHäHäHäHä@ä@ã@ä@ãHäHä@ä@ãHäHä8ä8ãHäHä8ä8ãI$I$@å@åbbR -R -8ã8ä@å@å8Ä8äA$A$0Ä0ãAEAE@å@å@å@åAEAEI$I$A&A&I$I$AGAGHäHäQEQEQEQEQEQEQEQEQEQEA&A&IEIEI$I$@å@å9E9E@å@åA&A&IEIEbIbIZJbJ8Ä8äIEIE8å8å8Ä8ä9E9E8Ä8ä8Ä8äAEAEHäHä8ä8ãI$I$8ã8ä@å@åHäHä8ä8ã8ä8ã@ä@ãHäHäQÇQÇR -R -I$I$8ã8äI$I$I$I$8ã8äI$I$I$I$8ã8ä8Ä8äI$I$8Ä8äI$I$AEAEZJbJIEIE8Ä8ä8Ä8äA$A$8Ä8äA$A$8Ä8äIEIE8Ä8äQEQEAEAEI$I$A&A&QEQEA&A&HäHäYEYEAGAGIEIEI$I$A&A&@å@åIEIE@å@å8Ä8ä9E9EA&A&YEYEk-k-YÉYÉA$A$8Ä8ä9E9E8Ä8ä9E9E@å@å8Ä8ä8Ä8äAEAE@ã@äHäHäHäHäHäHä8ä8ãHäHä8ä8ã@ä@ã8ä8ãI$I$ZJbJA&A&HäHäI$I$HäHäA$A#HäHãI$I$8ã8ä8ã8äAEAE@ä@ä8ä8ãHäHäbbIÇIÇ@å@åAEAE8ã8ä@å@å8Ä8äAEAE8Ä8äAEAEI$I$A&A&I$I$QEQEA&A&QEQEQEQEYEYEA&A&QEQEA&A&I$I$A&A&I$I$A&A&8Ä8äIEIE@å@åIEIEbIbIjÍjÍ8Ä8äIEIE0å0å8Ä8äIEIE@ä@äHäHä@ä@äHäHä8ä8ãI$I$8ã8ä@å@åHäHä8ä8ã8ä8ã@ä@ãHäHäQÇQÇR -R -I$I$8ã8äI$I$I$I$8ã8äI$I$I$I$8ã8ä8Ä8äI$I$8Ä8äI$I$AEAEZJbJIEIE8Ä8ä8Ä8äA$A$8Ä8äA$A$8Ä8äIEIE8Ä8äQEQEAEAEI$I$A&A&QEQEA&A&HäHäYEYEAGAGIEIEI$I$A&A&@å@åIEIE@å@å8Ä8ä9E9EA&A&YEYEk-k-YÉYÉA$A$8Ä8ä9E9E8Ä8ä9E9E@å@å8Ä8ä8Ä8äAEAE@ã@äHäHäHäHäHäHä8ä8ãHäHä8ä8ã@ä@ã8ä8ãI$I$ZJbJA&A&HäHäI$I$HäHäA$A#HäHãI$I$8ã8ä8ã8äAEAE@ä@ä8ä8ãHäHäbbIÇIÇ@å@åAEAE8ã8ä@å@å8Ä8äAEAE8Ä8äAEAEI$I$A&A&I$I$QEQEA&A&QEQEQEQEYEYEA&A&QEQEA&A&I$I$A&A&I$I$A&A&8Ä8äIEIE@å@åIEIEbIbIjÍjÍ8Ä8äIEIE0å0å8Ä8äIEIE@ä@äHäHä@ä@äHäHäHäHä8ä8ãHäHä@ä@ã8ä8ã@ä@ãHäHãHäHä@ä@ãY…Y…R‹R‹8ã8äI$I$@å@åHäHäI$I$I$I$8ã8ä@å@åA#A$HäHäA$A$8ä8ãQEQEZJbJ8Ä8äAEAE8Ä8ä8Ä8äA$A$8Ä8äA$A$A$A$9E9E@å@åIEIEQEQE@å@åI$I$QEQEQEQEQEQEA&A&I$I$@å@å@å@åAEAE@å@åAEAE8ã8äIEIEQEQEQEQEjÍjÍI‡I‡8Ä8äA$A$8Ä8ä9E9E@å@å8Ä8ä9E9E8Ä8äHäHä0Ä0ä8ä8ãHäHäHäHä8ä8ã@ä@ãHäHä@ä@ãHäHäI$I$ZJbJAGAGI$I$I$I$HäHäA$A#I$I$HäHäHäHäA$A$@ä@ãHäHäA$A$@ä@ãbbRR8Ä8ä8Ä8ä8Ä8äA$A$8Ä8ä8Ä8äA$A$8Ä8äIEIE@å@åQEQEA&A&I$I$QEQE@ä@äQEQEQEQEHäHäA&A&@å@å@å@åAEAE@å@åA$A$8Ä8äIEIEQEQEbbZÌZÌ8Ä8äA&A&8ã8ä@å@å8Ä8ä8Ä8ä8ä8ã@å@åHäHäHäHä8ä8ãHäHä@ä@ã8ä8ã@ä@ãHäHãHäHä@ä@ãY…Y…R‹R‹8ã8äI$I$@å@åHäHäI$I$I$I$8ã8ä@å@åA#A$HäHäA$A$8ä8ãQEQEZJbJ8Ä8äAEAE8Ä8ä8Ä8äA$A$8Ä8äA$A$A$A$9E9E@å@åIEIEQEQE@å@åI$I$QEQEQEQEQEQEA&A&I$I$@å@å@å@åAEAE@å@åAEAE8ã8äIEIEQEQEQEQEjÍjÍI‡I‡8Ä8äA$A$8Ä8ä9E9E@å@å8Ä8ä9E9E8Ä8äHäHä0Ä0ä8ä8ãHäHäHäHä8ä8ã@ä@ãHäHä@ä@ãHäHäI$I$ZJbJAGAGI$I$I$I$HäHäA$A#I$I$HäHäHäHäA$A$@ä@ãHäHäA$A$@ä@ãbbRR8Ä8ä8Ä8ä8Ä8äA$A$8Ä8ä8Ä8äA$A$8Ä8äIEIE@å@åQEQEA&A&I$I$QEQE@ä@äQEQEQEQEHäHäA&A&@å@å@å@åAEAE@å@åA$A$8Ä8äIEIEQEQEbbZÌZÌ8Ä8äA&A&8ã8ä@å@å8Ä8ä8Ä8ä8ä8ã@å@åHäHä8ä8ã@ä@ã@ä@ãI$I$@ã@äHäHä8ä8ã@ä@ãI$I$QEQEbŒbŒ@å@åI$I$A#A$HäHäI$I$I$I$I$I$I$I$HäHäA$A#HäHäI$I$@å@åRR8Ä8ä8Ä8äI$I$0Ä0ä0Ä0ã9$9$8Ä8ä8Ä8äIEIE@å@åIEIEI$I$QEQEA&A&HäHäI$I$QEQEA&A&I$I$@å@åHäHäHäHäAEAEHäHä8Ä8äQEQEA&A&QEQEjËjËI‡I‡0Ä0ä0Ä0äA$A$8Ä8ä8Ä8ä9$9$8Ä8ä8Ä8äHäHä8ä8ãHäHä8ä8ãI$I$8ã8ä@ã@ä@ã@ä@ã@äHäHäI$I$jŠjŠAÇAÇHãHä@å@åI$I$I$I$HäHäI$I$I$I$HäHäA$A#8ä8ãI$I$HäHäIÇIÇAGAG8ã8äA$A$8Ä8ä0Ä0ä9$9$0Ä0ãAEAE@å@åIEIEI$I$A&A&HäHäQEQE@å@åQEQEHäHäQEQEA&A&HäHäHäHäI$I$8Ä8äIEIE@å@åAEAEI$I$QEQEbbbŒbŒ0Ã0ä8Ä8ä8Ä8ä9$9$0å0åA$A$8ä8ãHäHäHäHä8ä8ã@ä@ã@ä@ãI$I$@ã@äHäHä8ä8ã@ä@ãI$I$QEQEbŒbŒ@å@åI$I$A#A$HäHäI$I$I$I$I$I$I$I$HäHäA$A#HäHäI$I$@å@åRR8Ä8ä8Ä8äI$I$0Ä0ä0Ä0ã9$9$8Ä8ä8Ä8äIEIE@å@åIEIEI$I$QEQEA&A&HäHäI$I$QEQEA&A&I$I$@å@åHäHäHäHäAEAEHäHä8Ä8äQEQEA&A&QEQEjËjËI‡I‡0Ä0ä0Ä0äA$A$8Ä8ä8Ä8ä9$9$8Ä8ä8Ä8äHäHä8ä8ãHäHä8ä8ãI$I$8ã8ä@ã@ä@ã@ä@ã@äHäHäI$I$jŠjŠAÇAÇHãHä@å@åI$I$I$I$HäHäI$I$I$I$HäHäA$A#8ä8ãI$I$HäHäIÇIÇAGAG8ã8äA$A$8Ä8ä0Ä0ä9$9$0Ä0ãAEAE@å@åIEIEI$I$A&A&HäHäQEQE@å@åQEQEHäHäQEQEA&A&HäHäHäHäI$I$8Ä8äIEIE@å@åAEAEI$I$QEQEbbbŒbŒ0Ã0ä8Ä8ä8Ä8ä9$9$0å0åA$A$8ä8ãHäHäHäHä@ä@ã@ä@ãHäHã@ä@ã@ä@ã@ä@ã@ä@ãHäHãHäHäIEIEbŒbŒHäHä@ä@ãI$I$I$I$HãHäI$I$I$I$HäHäI$I$HäHäI$I$8ã8äI$I$I‡I‡A$A$8ä8ã8Ä8äA$A$8ä8ã@å@åAEAEI$I$QEQEI$I$QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEI$I$I$I$QEQEA&A&IEIEQEQEHäHäbŒbŒI‡I‡8ä8ãA$A$(ä(ä8Ä8ä9$9$8Ä8ä9$9$@å@åHäHä@ä@ãHäHäHäHä@ä@ãHäHãHäHä8ä8ãHäHãHäHãHäHäZKbJI‡I‡HäHä@ä@ãI$I$HãHäI$I$I$I$I$I$8ã8äHäHäI$I$HäHäI$I$QEQE9†9†@ä@ä8ä8ã8Ä8äA$A$8ä8ãAEAEHäHäIEIEHäHäYEYEQEQEQEQEYEYEQEQEQEQEQEQEQEQEQEQEQEQEHäHäQEQEIEIEHäHäIEIEQEQEQEQEQEQEYÉYÉZJbJ8Ä8ä8Ä8ä8Ä8ä(ä(ä8Ä8ä8Ä8ä8Ä8äHäHäHäHä@ä@ã@ä@ãHäHã@ä@ã@ä@ã@ä@ã@ä@ãHäHãHäHäIEIEbŒbŒHäHä@ä@ãI$I$I$I$HãHäI$I$I$I$HäHäI$I$HäHäI$I$8ã8äI$I$I‡I‡A$A$8ä8ã8Ä8äA$A$8ä8ã@å@åAEAEI$I$QEQEI$I$QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEI$I$I$I$QEQEA&A&IEIEQEQEHäHäbŒbŒI‡I‡8ä8ãA$A$(ä(ä8Ä8ä9$9$8Ä8ä9$9$@å@åHäHä@ä@ãHäHäHäHä@ä@ãHäHãHäHä8ä8ãHäHãHäHãHäHäZKbJI‡I‡HäHä@ä@ãI$I$HãHäI$I$I$I$I$I$8ã8äHäHäI$I$HäHäI$I$QEQE9†9†@ä@ä8ä8ã8Ä8äA$A$8ä8ãAEAEHäHäIEIEHäHäYEYEQEQEQEQEYEYEQEQEQEQEQEQEQEQEQEQEQEQEHäHäQEQEIEIEHäHäIEIEQEQEQEQEQEQEYÉYÉZJbJ8Ä8ä8Ä8ä8Ä8ä(ä(ä8Ä8ä8Ä8ä8Ä8äHäHäA&A&IEIEA&A&A&A&QEQEA&A&@å@å8Ä8ä@ä@ä8Ä8äAÇAÇbŒbŒYÉYÉAGAGIEIEIEIEQEQEQÇQÇY†Y†IEIEIEIEIEIEA&A&QÇQÇQEQEZJbJRRI‡I‡AGAGIEIE8Ä8äA$A$A&A&I$I$A&A&I$I$HäHä@å@åA&A&A&A&HäHä@å@å@å@åQEQE@å@åHäHäQEQEA&A&A&A&A&A&QEQEA&A&A&A&I‡I‡ZJbJJJ(Ä(Ä(Ä(Ã8Ä8ä0Ä0ã(ä(ä8Ä8ä8Ä8ä@ä@ã8ä8ã@ä@ã@ä@ãHäHãHäHäHäHä8ä8ã@ä@ãHäHäHäHäI$I$RŠRŠbŒbŒA&A&QEQEIEIEAGAGY…Y…QÇQÇQEQEA&A&QEQEAGAGQEQEAGAGZIZIYÉYÉI‡I‡I‡I‡IEIE8Ä8ä8Ä8äQEQEA&A&HäHäIEIEI$I$@å@å@å@åIEIE@å@å@å@å@å@åI$I$A&A&I$I$QEQEA&A&QEQE@å@åA&A&AGAGA&A&A&A&R -R -R‹R‹8æ8æ0æ0æ9E9EAGAG(å(å(ä(ä(ä(ä0æ0æA&A&IEIEA&A&A&A&QEQEA&A&@å@å8Ä8ä@ä@ä8Ä8äAÇAÇbŒbŒYÉYÉAGAGIEIEIEIEQEQEQÇQÇY†Y†IEIEIEIEIEIEA&A&QÇQÇQEQEZJbJRRI‡I‡AGAGIEIE8Ä8äA$A$A&A&I$I$A&A&I$I$HäHä@å@åA&A&A&A&HäHä@å@å@å@åQEQE@å@åHäHäQEQEA&A&A&A&A&A&QEQEA&A&A&A&I‡I‡ZJbJJJ(Ä(Ä(Ä(Ã8Ä8ä0Ä0ã(ä(ä8Ä8ä8Ä8ä@ä@ã8ä8ã@ä@ã@ä@ãHäHãHäHäHäHä8ä8ã@ä@ãHäHäHäHäI$I$RŠRŠbŒbŒA&A&QEQEIEIEAGAGY…Y…QÇQÇQEQEA&A&QEQEAGAGQEQEAGAGZIZIYÉYÉI‡I‡I‡I‡IEIE8Ä8ä8Ä8äQEQEA&A&HäHäIEIEI$I$@å@å@å@åIEIE@å@å@å@å@å@åI$I$A&A&I$I$QEQEA&A&QEQE@å@åA&A&AGAGA&A&A&A&R -R -R‹R‹8æ8æ0æ0æ9E9EAGAG(å(å(ä(ä(ä(ä0æ0æZÌZÌk/k/s/k/jÍjÍ{.{.k/k/rÍjÍR‹R‹R -R -bŒbŒZÌZÌc/c/ƒÐƒÐ{.{.k,k,{.{.ƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÐ{Ï{σЃЃЃЃЃÐ{.{.{Ï{ϓЋÐ{.{.c,c,bŒbŒbŒbŒbŒbŒbŒbŒc,c,jÍjÍrÎjÍc-c-jÎjÍc/c/jÍjÍbŒbŒbŒbŒbŒbŒbŒbŒR‹R‹bŒbŒjÍjÍc/c/{.{.{oƒp{oƒpk.k/k/s/k/k/k/s/k/k/bŒbŒZÌZÌR -R -c/c/k-k-bŒbŒbŒbŒbŒbŒjŠjŠZJbJbŒbŒ{,{,{.{.jËjËjŠjŠZJbJR‹R‹jŠjŠc/c/{.{.ƒÐƒÐk,k,s/k/{.{.ƒÏƒÏ“ЋЃЃЃσσЃÐ{Ï{σσσσσЃÐk/k/ƒÏƒÏƒÐƒÐk,k,ZÌZÌbŒbŒbŒbŒbŒbŒZÌZÌk-k-bŒbŒc/c/c,c,c/c/jÍjÍZÌZÌbŒbŒbŒbŒbŒbŒR‹R‹R‹R‹bŒbŒc/c/k/k/ƒo{pƒo{p{oƒok/k/k/s/k/k/{Ð{Ðk/k/s/k/“ЋÐZÌZÌR‹R‹ZÌZÌZÌZÌZÌZÌk/k/s/k/jÍjÍ{.{.k/k/rÍjÍR‹R‹R -R -bŒbŒZÌZÌc/c/ƒÐƒÐ{.{.k,k,{.{.ƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÐ{Ï{σЃЃЃЃЃÐ{.{.{Ï{ϓЋÐ{.{.c,c,bŒbŒbŒbŒbŒbŒbŒbŒc,c,jÍjÍrÎjÍc-c-jÎjÍc/c/jÍjÍbŒbŒbŒbŒbŒbŒbŒbŒR‹R‹bŒbŒjÍjÍc/c/{.{.{oƒp{oƒpk.k/k/s/k/k/k/s/k/k/bŒbŒZÌZÌR -R -c/c/k-k-bŒbŒbŒbŒbŒbŒjŠjŠZJbJbŒbŒ{,{,{.{.jËjËjŠjŠZJbJR‹R‹jŠjŠc/c/{.{.ƒÐƒÐk,k,s/k/{.{.ƒÏƒÏ“ЋЃЃЃσσЃÐ{Ï{σσσσσЃÐk/k/ƒÏƒÏƒÐƒÐk,k,ZÌZÌbŒbŒbŒbŒbŒbŒZÌZÌk-k-bŒbŒc/c/c,c,c/c/jÍjÍZÌZÌbŒbŒbŒbŒbŒbŒR‹R‹R‹R‹bŒbŒc/c/k/k/ƒo{pƒo{p{oƒok/k/k/s/k/k/{Ð{Ðk/k/s/k/“ЋÐZÌZÌR‹R‹ZÌZÌZÌZÌbbQEQEaÇaÇYÇYÇjIjIƒo{pI†I†QEQEIEIE9E9EAGAGAEAEHäHäA$A$9E9EQEQE9E9EIEIEAGAGQEQEAGAGQEQEA†A†QEQE@å@åA$A$9E9EI†I†AGAGAEAE@å@åAEAEAEAEQEQEjŠjŠk/k/rËjËbŒbŒjŠjŠjËjËrËjËjÍjÍrËjËk-k-rËjËjÍjÍrËjËjËjËc,c,k/k/rIjIbbZIZIQÇQÇbbj‰j‰rIjIj‰j‰rIjIjËjËrËjËjËjËjŠjŠ{,{,jËjËrIjIjIjIjŠjŠ{,{,ZJbJIEIE@å@åIEIEA†A†IEIEIEIEA$A$@å@åA$A$A†A†IEIEIEIEAGAGA†A†I†I†AGAGIEIEI†I†A&A&AEAEHäHä9†9†QEQEIEIE8Ä8äA†A†AEAEQEQEbb{.{.k-k-r‰j‰jËjËrËjËjËjËrÍjÍjËjË{.{.jËjËrÍjÍjËjËrËjË{.{.”2Œ1{,{,bIbIZZZZbbjIjIbIbIjIjIr‰j‰jIjIjŠjŠjŠjŠjŠjŠjIjIbbQEQEaÇaÇYÇYÇjIjIƒo{pI†I†QEQEIEIE9E9EAGAGAEAEHäHäA$A$9E9EQEQE9E9EIEIEAGAGQEQEAGAGQEQEA†A†QEQE@å@åA$A$9E9EI†I†AGAGAEAE@å@åAEAEAEAEQEQEjŠjŠk/k/rËjËbŒbŒjŠjŠjËjËrËjËjÍjÍrËjËk-k-rËjËjÍjÍrËjËjËjËc,c,k/k/rIjIbbZIZIQÇQÇbbj‰j‰rIjIj‰j‰rIjIjËjËrËjËjËjËjŠjŠ{,{,jËjËrIjIjIjIjŠjŠ{,{,ZJbJIEIE@å@åIEIEA†A†IEIEIEIEA$A$@å@åA$A$A†A†IEIEIEIEAGAGA†A†I†I†AGAGIEIEI†I†A&A&AEAEHäHä9†9†QEQEIEIE8Ä8äA†A†AEAEQEQEbb{.{.k-k-r‰j‰jËjËrËjËjËjËrÍjÍjËjË{.{.jËjËrÍjÍjËjËrËjË{.{.”2Œ1{,{,bIbIZZZZbbjIjIbIbIjIjIr‰j‰jIjIjŠjŠjŠjŠjŠjŠjIjIY†Y†@å@åIEIEHäHäbbk-k-QEQE@å@å8Ä8ä8Ä8ä0Ä0ä0Ä0ä0Ä0ä0Ä0ã@å@åIEIE@ä@ä0Ä0äHäHä0Ä0ã8Ä8ä8Ä8ä(ä(ä8Ä8ä8Ä8ä8Ä8ä8ä8ã@å@åAEAEHäHä0Ä0ä0Ä0ãAEAEHäHäjIjIs/k/YÇYÇQEQEQEQEQEQEQEQEQEQEI‡I‡Y†Y†aÇaÇY†Y†I‡I‡a†a†jÍjÍbŒbŒY†Y†A&A&I$I$QEQEHäHäQEQEYEYEYEYEQEQEYEYEYEYEYEYEYEYEYEYEYEYEYEYEYEYEYEYEjjAGAG8Ä8ä8Ä8ä8Ä8ä8Ä8ä0Ä0ã8Ä8ä(ä(ä8Ä8ä8ä8ã@å@åAEAE8ã8ä@ä@ä@ä@ä0Ä0ä@ä@ä0Ä0ã8Ä8ä8Ä8ä8Ä8ä8ä8ã8Ä8äIEIE@å@å8Ä8ä8Ä8ä8Ä8äQEQEYEYEk/k/bbYEYEQEQEQEQEQEQEQEQEYEYEI‡I‡Y†Y†aÇaÇI‡I‡a†a†jIjIƒÒƒÑYÉYÉHäHäI$I$QEQEQEQEHäHäHäHäYEYEHäHäYEYEYEYEYEYEYEYEYEYEY†Y†@å@åIEIEHäHäbbk-k-QEQE@å@å8Ä8ä8Ä8ä0Ä0ä0Ä0ä0Ä0ä0Ä0ã@å@åIEIE@ä@ä0Ä0äHäHä0Ä0ã8Ä8ä8Ä8ä(ä(ä8Ä8ä8Ä8ä8Ä8ä8ä8ã@å@åAEAEHäHä0Ä0ä0Ä0ãAEAEHäHäjIjIs/k/YÇYÇQEQEQEQEQEQEQEQEQEQEI‡I‡Y†Y†aÇaÇY†Y†I‡I‡a†a†jÍjÍbŒbŒY†Y†A&A&I$I$QEQEHäHäQEQEYEYEYEYEQEQEYEYEYEYEYEYEYEYEYEYEYEYEYEYEYEYEYEYEjjAGAG8Ä8ä8Ä8ä8Ä8ä8Ä8ä0Ä0ã8Ä8ä(ä(ä8Ä8ä8ä8ã@å@åAEAE8ã8ä@ä@ä@ä@ä0Ä0ä@ä@ä0Ä0ã8Ä8ä8Ä8ä8Ä8ä8ä8ã8Ä8äIEIE@å@å8Ä8ä8Ä8ä8Ä8äQEQEYEYEk/k/bbYEYEQEQEQEQEQEQEQEQEYEYEI‡I‡Y†Y†aÇaÇI‡I‡a†a†jIjIƒÒƒÑYÉYÉHäHäI$I$QEQEQEQEHäHäHäHäYEYEHäHäYEYEYEYEYEYEYEYEYEYEY†Y†AGAGI$I$A&A&iÇiÇrÍjÍAGAGHäHä0Ä0ä0Ä0ã0Ä0ã(ä(ä0Ä0ä@ä@ä8ä8ã@å@å8ã8ä8ã8ä8Ä8ä(ä(ä8Ä8ä(ä(ä8Ä8ä8Ä8ä1$1$8Ä8ä9$9$@å@åA$A$8Ä8ä8Ä8ä8Ä8ä8Ä8äQEQEjjs/k/I‡I‡QEQEQEQEAGAGYEYEI‡I‡aÇaÇI‡I‡aÇaÇI‡I‡aÇaÇYÉYÉ{,{,bŒbŒY†Y†AGAGQEQEA&A&QEQEQEQE@å@åQEQEQEQEYEYEYEYEY†Y†a†a†Y†Y†Y†Y†YÉYÉa†a†YÉYÉbbI‡I‡@å@åI$I$8Ä8ä8Ä8ä!$!$0Ä0ã(ä(ä8Ä8ä8Ä8äIEIE8Ä8ä0Ä0ä8ä8ã(ä(ä0Ä0ä0Ä0ä8Ä8ä(ä(ä8Ä8ä8Ä8ä9$9$9E9E8Ä8ä@å@å0Ã0ä9$9$8Ä8ä@å@åY†Y†k/k/bbAGAGAGAGQEQEI‡I‡YEYEI‡I‡aÇaÇI‡I‡aÇaÇI‡I‡aÇaÇjŠjŠ{.{.YÉYÉQEQEAGAGQEQEA&A&QEQEQEQEYEYEAGAGYEYEYEYEI‡I‡YEYEY†Y†Y†Y†AGAGI$I$A&A&iÇiÇrÍjÍAGAGHäHä0Ä0ä0Ä0ã0Ä0ã(ä(ä0Ä0ä@ä@ä8ä8ã@å@å8ã8ä8ã8ä8Ä8ä(ä(ä8Ä8ä(ä(ä8Ä8ä8Ä8ä1$1$8Ä8ä9$9$@å@åA$A$8Ä8ä8Ä8ä8Ä8ä8Ä8äQEQEjjs/k/I‡I‡QEQEQEQEAGAGYEYEI‡I‡aÇaÇI‡I‡aÇaÇI‡I‡aÇaÇYÉYÉ{,{,bŒbŒY†Y†AGAGQEQEA&A&QEQEQEQE@å@åQEQEQEQEYEYEYEYEY†Y†a†a†Y†Y†Y†Y†YÉYÉa†a†YÉYÉbbI‡I‡@å@åI$I$8Ä8ä8Ä8ä!$!$0Ä0ã(ä(ä8Ä8ä8Ä8äIEIE8Ä8ä0Ä0ä8ä8ã(ä(ä0Ä0ä0Ä0ä8Ä8ä(ä(ä8Ä8ä8Ä8ä9$9$9E9E8Ä8ä@å@å0Ã0ä9$9$8Ä8ä@å@åY†Y†k/k/bbAGAGAGAGQEQEI‡I‡YEYEI‡I‡aÇaÇI‡I‡aÇaÇI‡I‡aÇaÇjŠjŠ{.{.YÉYÉQEQEAGAGQEQEA&A&QEQEQEQEYEYEAGAGYEYEYEYEI‡I‡YEYEY†Y†Y†Y†A&A&@å@å8Ä8äZZbŒbŒY†Y†8Ä8ä0Ä0ä0Ä0ã(ä(ä0Ä0ã(ä(ä8Ä8ä8Ä8äIEIE8Ä8äA$A$8Ä8ä(ä(ä8Ä8ä8Ä8ä(ä(ä9$9$8Ä8ä9$9$8Ä8ä9E9EA&A&8ã8ä8Ä8ä8Ä8ä9$9$@å@åZZ{.{.YÇYÇaÇaÇI‡I‡YEYEI‡I‡I‡I‡YEYEI‡I‡aÇaÇI‡I‡I‡I‡a†a†{.{.k/k/QEQEQEQEA&A&AEAEA&A&AGAGQEQEI‡I‡A&A&I‡I‡QEQEAGAGaÇaÇYÉYÉaÇaÇYÉYÉYÉYÉYÉYÉjjI‡I‡@å@å8Ä8ä9$9$0Ä0ä0Ä0ã(ä(ä0Ä0ä0Ä0ä8Ä8ä9E9E@å@å8ã8ä@å@å0Ã0ä8Ä8ä(ä(ä8Ä8ä0å0å9$9$8Ä8ä8Ä8ä@å@å9E9E@å@å8ã8ä8Ä8ä9$9$@å@åQEQEk/k/bJZJa†a†Y†Y†I‡I‡A&A&I‡I‡I‡I‡aÇaÇI‡I‡aÇaÇI‡I‡Y†Y†jŠjŠ{oƒpI‡I‡QEQEQEQE@å@å9E9EAGAGAGAGAGAGQEQEY†Y†I‡I‡YEYEI‡I‡aÇaÇY†Y†A&A&@å@å8Ä8äZZbŒbŒY†Y†8Ä8ä0Ä0ä0Ä0ã(ä(ä0Ä0ã(ä(ä8Ä8ä8Ä8äIEIE8Ä8äA$A$8Ä8ä(ä(ä8Ä8ä8Ä8ä(ä(ä9$9$8Ä8ä9$9$8Ä8ä9E9EA&A&8ã8ä8Ä8ä8Ä8ä9$9$@å@åZZ{.{.YÇYÇaÇaÇI‡I‡YEYEI‡I‡I‡I‡YEYEI‡I‡aÇaÇI‡I‡I‡I‡a†a†{.{.k/k/QEQEQEQEA&A&AEAEA&A&AGAGQEQEI‡I‡A&A&I‡I‡QEQEAGAGaÇaÇYÉYÉaÇaÇYÉYÉYÉYÉYÉYÉjjI‡I‡@å@å8Ä8ä9$9$0Ä0ä0Ä0ã(ä(ä0Ä0ä0Ä0ä8Ä8ä9E9E@å@å8ã8ä@å@å0Ã0ä8Ä8ä(ä(ä8Ä8ä0å0å9$9$8Ä8ä8Ä8ä@å@å9E9E@å@å8ã8ä8Ä8ä9$9$@å@åQEQEk/k/bJZJa†a†Y†Y†I‡I‡A&A&I‡I‡I‡I‡aÇaÇI‡I‡aÇaÇI‡I‡Y†Y†jŠjŠ{oƒpI‡I‡QEQEQEQE@å@å9E9EAGAGAGAGAGAGQEQEY†Y†I‡I‡YEYEI‡I‡aÇaÇQÇQÇI‡I‡A&A&@å@åbbk/k/Y†Y†@ä@ä0Ä0ä0Ä0ã(ä(ä(ä(ä8Ä8ä(ä(ä8Ä8ä8Ä8ä8Ä8ä9$9$8Ä8ä(ä(ä8Ä8ä(ä(ä0å0å8Ä8ä(ä(ä8Ä8äA$A$8Ä8äIEIE8Ä8ä8Ä8ä(ä(ä@å@åIEIEYÇYÇk-k-YÇYÇYÉYÉYEYEI‡I‡A&A&I‡I‡I‡I‡aÇaÇI‡I‡I‡I‡aÇaÇYÉYÉjËjËbŒbŒA$A$0æ0æ(ä(ä(ä(ä(ä(ä0æ0æ(ä(ä9E9EA&A&YEYEAGAGa†a†YÉYÉYÉYÉYÉYÉZZYÉYÉQÇQÇZJbJYÉYÉHäHä0Ä0ã(ä(ä0Ä0ä0Ä0ä(ä(ä0Ä0ã(ä(ä8Ä8ä8Ä8ä@å@å8ã8ä8Ä8ä8Ä8ä(ä(ä8Ä8ä(ä(ä8Ä8ä(ä(äA$A$8Ä8ä9$9$9E9E@å@å8Ä8ä8Ä8ä(ä(äIEIEQEQEjÍjÍbbYÉYÉY†Y†I‡I‡YEYEI‡I‡YEYEI‡I‡I‡I‡I‡I‡Y†Y†YÉYÉjIjIƒo{pAFAG9E9E0æ0æ!$!$(ä(ä å å8Ä8ä9E9EA&A&AGAGYÇYÇAGAGA&A&ZZQÇQÇI‡I‡A&A&@å@åbbk/k/Y†Y†@ä@ä0Ä0ä0Ä0ã(ä(ä(ä(ä8Ä8ä(ä(ä8Ä8ä8Ä8ä8Ä8ä9$9$8Ä8ä(ä(ä8Ä8ä(ä(ä0å0å8Ä8ä(ä(ä8Ä8äA$A$8Ä8äIEIE8Ä8ä8Ä8ä(ä(ä@å@åIEIEYÇYÇk-k-YÇYÇYÉYÉYEYEI‡I‡A&A&I‡I‡I‡I‡aÇaÇI‡I‡I‡I‡aÇaÇYÉYÉjËjËbŒbŒA$A$0æ0æ(ä(ä(ä(ä(ä(ä0æ0æ(ä(ä9E9EA&A&YEYEAGAGa†a†YÉYÉYÉYÉYÉYÉZZYÉYÉQÇQÇZJbJYÉYÉHäHä0Ä0ã(ä(ä0Ä0ä0Ä0ä(ä(ä0Ä0ã(ä(ä8Ä8ä8Ä8ä@å@å8ã8ä8Ä8ä8Ä8ä(ä(ä8Ä8ä(ä(ä8Ä8ä(ä(äA$A$8Ä8ä9$9$9E9E@å@å8Ä8ä8Ä8ä(ä(äIEIEQEQEjÍjÍbbYÉYÉY†Y†I‡I‡YEYEI‡I‡YEYEI‡I‡I‡I‡I‡I‡Y†Y†YÉYÉjIjIƒo{pAFAG9E9E0æ0æ!$!$(ä(ä å å8Ä8ä9E9EA&A&AGAGYÇYÇAGAGA&A&ZZYÇYÇAGAGI$I$@å@åZZk/k/QEQEHäHä0Ä0ä0Ä0ä0Ä0ã(ä(ä0Ä0ä0Ä0ä8ä8ã@å@å8ã8ä0Ã0ä8Ä8ä8Ä8ä8ä8ã8Ä8äA$A$8Ä8ä8Ä8äA$A$0Ä0ã8Ä8äA$A$8Ä8ä8Ä8ä8ä8ãHäHäHäHäYÇYÇc,c,jjYÉYÉYÇYÇI‡I‡aÇaÇI‡I‡I‡I‡YÉYÉaÇaÇI‡I‡aÇaÇaÇaÇZJbJZJbJ(ä(ä9E9E0æ0æ å å å å!$!$ å å(ä(ä(ä(ä8Ä8äA&A&AGAGbbYÇYÇYÉYÉYÇYÇYÉYÉYÇYÇZJbJRR@ä@ä ä ã0Ä0ä0Ä0ã ä ä0Ä0ã(ä(ä@ä@ä0Ä0ä8ä8ãHäHä0Ä0äA$A$0Ä0ã8ä8ã8Ä8ä8ä8ã8Ä8äA$A$8Ä8ä0Ä0ã0Ä0ã@å@åI$I$0Ã0ä8ã8ä@å@åHäHäIEIEbŒbŒbIbIiÇiÇYÉYÉI‡I‡I‡I‡I‡I‡I‡I‡YÉYÉaÇaÇYÉYÉI‡I‡aÇaÇbbk/k/9E9E0å0å0æ0æ å å å å å å(å(å å å!$!$0Ä0äA†A†8Ä8ä8Ä8äAÇAÇYÇYÇAGAGI$I$@å@åZZk/k/QEQEHäHä0Ä0ä0Ä0ä0Ä0ã(ä(ä0Ä0ä0Ä0ä8ä8ã@å@å8ã8ä0Ã0ä8Ä8ä8Ä8ä8ä8ã8Ä8äA$A$8Ä8ä8Ä8äA$A$0Ä0ã8Ä8äA$A$8Ä8ä8Ä8ä8ä8ãHäHäHäHäYÇYÇc,c,jjYÉYÉYÇYÇI‡I‡aÇaÇI‡I‡I‡I‡YÉYÉaÇaÇI‡I‡aÇaÇaÇaÇZJbJZJbJ(ä(ä9E9E0æ0æ å å å å!$!$ å å(ä(ä(ä(ä8Ä8äA&A&AGAGbbYÇYÇYÉYÉYÇYÇYÉYÉYÇYÇZJbJRR@ä@ä ä ã0Ä0ä0Ä0ã ä ä0Ä0ã(ä(ä@ä@ä0Ä0ä8ä8ãHäHä0Ä0äA$A$0Ä0ã8ä8ã8Ä8ä8ä8ã8Ä8äA$A$8Ä8ä0Ä0ã0Ä0ã@å@åI$I$0Ã0ä8ã8ä@å@åHäHäIEIEbŒbŒbIbIiÇiÇYÉYÉI‡I‡I‡I‡I‡I‡I‡I‡YÉYÉaÇaÇYÉYÉI‡I‡aÇaÇbbk/k/9E9E0å0å0æ0æ å å å å å å(å(å å å!$!$0Ä0äA†A†8Ä8ä8Ä8äAÇAÇQÇQÇI‡I‡AGAGI†I†ZJbJk/k/R -R -AGAGAGAG9E9E0æ0æ0æ0æ9$9$0å0å(ä(ä0Ä0ã(ä(ä(ä(ä8Ä8ä1†1†(ä(ä8Ä8ä0æ0æ9E9EA†A†8æ8æ0æ0æAGAGAGAGA†A†AGAGAÇAÇI‡I‡I‡I‡R‹R‹bŒbŒI‡I‡AGAGAGAGQÇQÇAGAGI‡I‡Y†Y†I‡I‡AGAGAGAGA&A&QEQE{.{.k/k/(ä(äIEIEAÇAÇA&A&A&A&AGAGQEQEA&A&I†I†IEIEYÉYÉYÇYÇJJZJbJbbZJbJbIbIR -R -{.{.bŒbŒAÇAÇI‡I‡AGAG0æ0æA&A&1†1†(ä(ä0å0å8Ä8ä(ä(ä0Ä0ä!$!$0Ä0ã0æ0æ1$1$0æ0æ(ä(ä9E9EA&A&A&A&0æ0æ9†9†AGAGAGAGAGAGAGAGI‡I‡I‡I‡R -R -ZÌZÌR -R -I‡I‡AGAGQÇQÇY†Y†AGAGI‡I‡Y†Y†AGAGAGAGQEQEA&A&bbƒÒƒÑAGAG9E9EAGAGI‡I‡IEIEA&A&AGAGA†A†QEQEIEIEAGAGI‡I‡AÇAÇI†I†QÇQÇI‡I‡AGAGI†I†ZJbJk/k/R -R -AGAGAGAG9E9E0æ0æ0æ0æ9$9$0å0å(ä(ä0Ä0ã(ä(ä(ä(ä8Ä8ä1†1†(ä(ä8Ä8ä0æ0æ9E9EA†A†8æ8æ0æ0æAGAGAGAGA†A†AGAGAÇAÇI‡I‡I‡I‡R‹R‹bŒbŒI‡I‡AGAGAGAGQÇQÇAGAGI‡I‡Y†Y†I‡I‡AGAGAGAGA&A&QEQE{.{.k/k/(ä(äIEIEAÇAÇA&A&A&A&AGAGQEQEA&A&I†I†IEIEYÉYÉYÇYÇJJZJbJbbZJbJbIbIR -R -{.{.bŒbŒAÇAÇI‡I‡AGAG0æ0æA&A&1†1†(ä(ä0å0å8Ä8ä(ä(ä0Ä0ä!$!$0Ä0ã0æ0æ1$1$0æ0æ(ä(ä9E9EA&A&A&A&0æ0æ9†9†AGAGAGAGAGAGAGAGI‡I‡I‡I‡R -R -ZÌZÌR -R -I‡I‡AGAGQÇQÇY†Y†AGAGI‡I‡Y†Y†AGAGAGAGQEQEA&A&bbƒÒƒÑAGAG9E9EAGAGI‡I‡IEIEA&A&AGAGA†A†QEQEIEIEAGAGI‡I‡AÇAÇI†I†{,{,{,{,jÍjÍrËjËjËjË{.{.jËjËbJZJbŒbŒjŠjŠZJbJR -R -bJZJZIZIZÌZÌk/k/bJZJbŒbŒZIZIZJbJZJbJbŒbŒZIZIbŒbŒR‹R‹bŒbŒjËjËc,c,k/k/{.{.k,k,s/k/jÍjÍc,c,jËjËs-k-jÎjÍRŠRŠbbR -R -R‹R‹ZJbJZJbJR -R -bŒbŒbŒbŒZJbJZÌZ̃ЃÐ{.{.{Ï{Ïc/c/{,{,{.{.jËj˃o{p{.{.ƒÐƒÐ{oƒp{oƒp{o{oƒÐƒÐ{oƒpƒÐƒÐ{oƒp{.{.{.{.{,{,{,{,{,{,k-k-bJZJc,c,jŠjŠZJbJR -R -bbR‹R‹ZJbJc/c/bŒbŒZJbJR‹R‹bbZJbJbŒbŒZJbJRŠRŠbŒbŒRŠRŠk-k-bŒbŒk,k,ƒÐƒÐk-k-c,c,k-k-c,c,jËjËs-k-jËjËbŒbŒZIZIR -R -R -R -R‹R‹ZJbJR -R -R‹R‹bŒbŒZJbJbŒbŒk/k/ƒÐƒÐ{oƒpk/k/c,c,{,{,jÍjÍ{,{,{oƒp{oƒp{o{oƒp{oƒp{o“Ï‹Ï{.{.{oƒp{,{,{,{,jÍjÍrËjËjËjË{.{.jËjËbJZJbŒbŒjŠjŠZJbJR -R -bJZJZIZIZÌZÌk/k/bJZJbŒbŒZIZIZJbJZJbJbŒbŒZIZIbŒbŒR‹R‹bŒbŒjËjËc,c,k/k/{.{.k,k,s/k/jÍjÍc,c,jËjËs-k-jÎjÍRŠRŠbbR -R -R‹R‹ZJbJZJbJR -R -bŒbŒbŒbŒZJbJZÌZ̃ЃÐ{.{.{Ï{Ïc/c/{,{,{.{.jËj˃o{p{.{.ƒÐƒÐ{oƒp{oƒp{o{oƒÐƒÐ{oƒpƒÐƒÐ{oƒp{.{.{.{.{,{,{,{,{,{,k-k-bJZJc,c,jŠjŠZJbJR -R -bbR‹R‹ZJbJc/c/bŒbŒZJbJR‹R‹bbZJbJbŒbŒZJbJRŠRŠbŒbŒRŠRŠk-k-bŒbŒk,k,ƒÐƒÐk-k-c,c,k-k-c,c,jËjËs-k-jËjËbŒbŒZIZIR -R -R -R -R‹R‹ZJbJR -R -R‹R‹bŒbŒZJbJbŒbŒk/k/ƒÐƒÐ{oƒpk/k/c,c,{,{,jÍjÍ{,{,{oƒp{oƒp{o{oƒp{oƒp{o“Ï‹Ï{.{.{oƒp@å@å9E9EI$I$QEQEQEQEQEQE@ä@ä@å@åHäHäA$A$9E9E@å@åIEIEQEQEbbZJbJA†A†YEYEYEYEQEQEQEQEYEYEQEQEQEQEIEIEQEQEIEIEQEQEAÇAÇbŒbŒZZY†Y†AGAGQEQEAGAGI$I$A&A&QEQEA&A&IEIE9E9EAGAGAGAGQEQEQÇQÇQÇQÇYÇYÇI‡I‡QÇQÇI‡I‡QÇQÇQÇQÇI‡I‡QÇQÇYÉYÉQÇQÇYÇYÇbbZJbJY†Y†Y†Y†YÇYÇYEYEAGAGIEIEI$I$QEQE@å@å9E9EI$I$A&A&HäHä8ä8ãA&A&AEAE@å@åAEAEQEQEY†Y†bŒbŒI‡I‡Q…Q…YEYEQEQEQEQEYEYEQEQEYEYEIEIEIEIEQ…Q…IEIEQEQER‹R‹bbQÇQÇAGAGYEYEA&A&QEQEIEIEIEIEIEIE9E9EIEIEA&A&I†I†AGAGY†Y†QÇQÇQÇQÇYÉYÉQÇQÇI†I†QÇQÇQÇQÇYÉYÉI‡I‡YÇYÇQÇQÇYÇYÇYÉYÉjŠjŠbbQEQEAGAG0Ã0ä9E9E@å@å9E9EI$I$QEQEQEQEQEQE@ä@ä@å@åHäHäA$A$9E9E@å@åIEIEQEQEbbZJbJA†A†YEYEYEYEQEQEQEQEYEYEQEQEQEQEIEIEQEQEIEIEQEQEAÇAÇbŒbŒZZY†Y†AGAGQEQEAGAGI$I$A&A&QEQEA&A&IEIE9E9EAGAGAGAGQEQEQÇQÇQÇQÇYÇYÇI‡I‡QÇQÇI‡I‡QÇQÇQÇQÇI‡I‡QÇQÇYÉYÉQÇQÇYÇYÇbbZJbJY†Y†Y†Y†YÇYÇYEYEAGAGIEIEI$I$QEQE@å@å9E9EI$I$A&A&HäHä8ä8ãA&A&AEAE@å@åAEAEQEQEY†Y†bŒbŒI‡I‡Q…Q…YEYEQEQEQEQEYEYEQEQEYEYEIEIEIEIEQ…Q…IEIEQEQER‹R‹bbQÇQÇAGAGYEYEA&A&QEQEIEIEIEIEIEIE9E9EIEIEA&A&I†I†AGAGY†Y†QÇQÇQÇQÇYÉYÉQÇQÇI†I†QÇQÇQÇQÇYÉYÉI‡I‡YÇYÇQÇQÇYÇYÇYÉYÉjŠjŠbbQEQEAGAG0Ã0ä9E9E8Ä8ä@å@å9E9E@å@åA&A&@ä@ä@å@å8Ä8ä9$9$0å0åA&A&8Ä8äQEQEQEQEbbc/c/Y†Y†YEYEa†a†YEYEaÇaÇYEYEYÇYÇY†Y†Y†Y†I†I†AGAGAGAGIÇIÇk-k-YÉYÉQEQEA&A&A&A&QEQEA&A&A&A&@å@åAEAE@å@å9E9EA&A&I$I$A&A&QEQEA&A&QEQEA&A&AGAGAEAEA&A&8Ä8ä0å0åA&A&QEQEAGAGYEYEYÉYÉZZYEYEI‡I‡QEQEA&A&QEQEQEQEA&A&@å@åAEAE@å@å@å@åA$A$8Ä8ä9E9E8Ä8ä@å@åA$A$@å@åQEQEI‡I‡{,{,ZZY†Y†YEYEY†Y†YEYEaÇaÇY†Y†YÇYÇY†Y†I†I†AGAGQÇQÇA&A&bŒbŒZJbJI‡I‡QEQEA&A&A&A&IEIE@å@åA&A&@å@å9E9E@å@å9E9EA&A&QEQEA&A&QEQEA&A&QEQEA&A&QEQEA&A&0å0å0å0å9E9EA&A&AGAGYEYEYEYEbbI‡I‡YEYE@å@å0å0å8Ä8ä8ä8Ä@å@å9E9E@å@åA&A&@ä@ä@å@å8Ä8ä9$9$0å0åA&A&8Ä8äQEQEQEQEbbc/c/Y†Y†YEYEa†a†YEYEaÇaÇYEYEYÇYÇY†Y†Y†Y†I†I†AGAGAGAGIÇIÇk-k-YÉYÉQEQEA&A&A&A&QEQEA&A&A&A&@å@åAEAE@å@å9E9EA&A&I$I$A&A&QEQEA&A&QEQEA&A&AGAGAEAEA&A&8Ä8ä0å0åA&A&QEQEAGAGYEYEYÉYÉZZYEYEI‡I‡QEQEA&A&QEQEQEQEA&A&@å@åAEAE@å@å@å@åA$A$8Ä8ä9E9E8Ä8ä@å@åA$A$@å@åQEQEI‡I‡{,{,ZZY†Y†YEYEY†Y†YEYEaÇaÇY†Y†YÇYÇY†Y†I†I†AGAGQÇQÇA&A&bŒbŒZJbJI‡I‡QEQEA&A&A&A&IEIE@å@åA&A&@å@å9E9E@å@å9E9EA&A&QEQEA&A&QEQEA&A&QEQEA&A&QEQEA&A&0å0å0å0å9E9EA&A&AGAGYEYEYEYEbbI‡I‡YEYE@å@å0å0å8Ä8ä8Ä8ä9E9E8Ä8ä@å@å@å@å9E9E(ä(ä@å@å9E9E8Ä8ä9E9EA&A&@å@åI†I†ZJbJbŒbŒHäHäYEYEYÇYÇY†Y†Y†Y†Y†Y†Y†Y†aÇaÇI‡I‡QÇQÇI‡I‡AÇAÇAGAGbŒbŒbbIEIEA&A&IEIEA&A&8Ä8äIEIE9E9E@å@å@å@å9E9EA&A&IEIEA&A&AGAGQEQEA&A&AGAGQEQEA&A&A&A&@å@å9E9EA&A&A&A&QEQEAGAGa†a†YÉYÉAGAGYEYEAGAGQEQE@å@åA&A&QEQE@å@å@å@åA$A$9E9E8Ä8ä9E9E0å0å@å@å9$9$9E9E@å@åA&A&YÇYÇjÍjÍA&A&YEYEY†Y†aÇaÇY†Y†YEYEa†a†aÇaÇI‡I‡Y†Y†I‡I‡I‡I‡9†9†ZJbJbbAGAGAGAGIEIEA&A&A&A&8Ä8äIEIE@å@å9E9EA&A&A&A&A&A&@å@åQEQEA&A&QEQEA&A&I†I†A&A&A&A&9E9E@å@åA&A&A&A&QEQEAGAGYEYEbbI‡I‡YEYEI‡I‡@å@åA$A$8ä8Ä9E9E8ä8Ä@å@å@å@å9E9E(ä(ä@å@å9E9E8ä8Ä9E9EA&A&@å@åI†I†ZJbJbŒbŒHäHäYEYEYÇYÇY†Y†Y†Y†Y†Y†Y†Y†aÇaÇI‡I‡QÇQÇI‡I‡AÇAÇAGAGbŒbŒbbIEIEA&A&IEIEA&A&8Ä8äIEIE9E9E@å@å@å@å9E9EA&A&IEIEA&A&AGAGQEQEA&A&AGAGQEQEA&A&A&A&@å@å9E9EA&A&A&A&QEQEAGAGa†a†YÉYÉAGAGYEYEAGAGQEQE@å@åA&A&QEQE@å@å@å@åA$A$9E9E8Ä8ä9E9E0å0å@å@å9$9$9E9E@å@åA&A&YÇYÇjÍjÍA&A&YEYEY†Y†aÇaÇY†Y†YEYEa†a†aÇaÇI‡I‡Y†Y†I‡I‡I‡I‡9†9†ZJbJbbAGAGAGAGIEIEA&A&A&A&8Ä8äIEIE@å@å9E9EA&A&A&A&A&A&@å@åQEQEA&A&QEQEA&A&I†I†A&A&A&A&9E9E@å@åA&A&A&A&QEQEAGAGYEYEbbI‡I‡YEYEI‡I‡@å@åA$A$8Ä8ä(ä(ä@å@å9E9E8Ä8ä8Ä8ä(ä(ä9E9E8å8å@å@å9E9E@å@å9E9EA&A&bbZJbJIEIEQEQEa†a†Y†Y†a†a†aÇaÇaÇaÇa†a†aÇaÇAGAGI‡I‡A†A†AÇAÇZJbJYÉYÉIEIEA&A&IEIE@å@åA&A&9E9E8å8åA&A&8Ä8äIEIEA&A&A&A&IEIEA&A&IEIEA&A&QEQEA&A&A&A&9E9E8Ä8ä9E9EA&A&IEIEA&A&YEYEaÇaÇYÉYÉYEYEI‡I‡A&A&YEYEAGAGQEQE8å8åA&A&8Ä8ä8Ä8ä0å0å8Ä8ä(ä(äIEIE0å0å@å@å9E9E@å@å9E9EI‡I‡jÎjÍAGAGQ…Q…YEYEaÇaÇY†Y†aÇaÇaÇaÇa†a†aÇaÇI‡I‡I‡I‡AGAG9$9$R‹R‹bbAGAGQEQEIEIE@å@å9E9E@å@å9E9E@å@å9E9E@å@å9E9EA&A&QEQEA&A&IEIEA&A&A&A&I†I†A&A&@å@å@å@å1$1$A&A&AGAGAEAEQEQEI‡I‡jjI‡I‡I‡I‡I$I$0å0å8Ä8ä8ä8Ä(ä(ä@å@å9E9E8ä8Ä8ä8Ä(ä(ä9E9E8å8å@å@å9E9E@å@å9E9EA&A&bbZJbJIEIEQEQEa†a†Y†Y†a†a†aÇaÇaÇaÇa†a†aÇaÇAGAGI‡I‡A†A†AÇAÇZJbJYÉYÉIEIEA&A&IEIE@å@åA&A&9E9E8å8åA&A&8Ä8äIEIEA&A&A&A&IEIEA&A&IEIEA&A&QEQEA&A&A&A&9E9E8Ä8ä9E9EA&A&IEIEA&A&YEYEaÇaÇYÉYÉYEYEI‡I‡A&A&YEYEAGAGQEQE8å8åA&A&8Ä8ä8Ä8ä0å0å8Ä8ä(ä(äIEIE0å0å@å@å9E9E@å@å9E9EI‡I‡jÎjÍAGAGQ…Q…YEYEaÇaÇY†Y†aÇaÇaÇaÇa†a†aÇaÇI‡I‡I‡I‡AGAG9$9$R‹R‹bbAGAGQEQEIEIE@å@å9E9E@å@å9E9E@å@å9E9E@å@å9E9EA&A&QEQEA&A&IEIEA&A&A&A&I†I†A&A&@å@å@å@å1$1$A&A&AGAGAEAEQEQEI‡I‡jjI‡I‡I‡I‡I$I$0å0å8Ä8ä8Ä8ä9$9$0å0å8Ä8ä0å0å9E9E8Ä8ä0å0å@å@å8Ä8ä9E9E@å@å8Ä8äIEIEYÉYÉZÌZÌY†Y†YÇYÇiÇiÇrjzzzzzzzzYÉYÉY†Y†AGAG9†9†AÇAÇZJbJI‡I‡QEQEA&A&A&A&9E9E@å@å@å@å9E9E@å@å9E9E@å@åA†A†@å@åA&A&IEIEA&A&A&A&AGAGIEIE@å@å0å0å8Ä8ä9$9$A&A&A&A&QEQEA&A&a†a†ZJbJI‡I‡QEQEA&A&A&A&AGAGQEQEA&A&@å@åA$A$8Ä8ä9E9E8Ä8ä0å0å0å0åA$A$0å0åA&A&8Ä8äIEIEAGAGbŒbŒbbY†Y†iÇiÇa†a†zzzzzzzziÇiÇI‡I‡QÇQÇAGAGI‡I‡bŒbŒIÇIÇAGAGAGAGA&A&IEIE@å@å9E9E@å@å@å@å9E9EA&A&A&A&A&A&A&A&QEQE@å@åAGAGIEIEA&A&@å@å9E9E0å0å8Ä8ä9E9EA&A&QEQEA&A&YEYEZJbJYÉYÉQEQE8å8å@ä@ä8Ä8ä8ä8Ä9$9$0å0å8Ä8ä0å0å9E9E8Ä8ä0å0å@å@å8Ä8ä9E9E@å@å8Ä8äIEIEYÉYÉZÌZÌY†Y†YÇYÇiÇiÇrjzzzzzzzzYÉYÉY†Y†AGAG9†9†AÇAÇZJbJI‡I‡QEQEA&A&A&A&9E9E@å@å@å@å9E9E@å@å9E9E@å@åA†A†@å@åA&A&IEIEA&A&A&A&AGAGIEIE@å@å0å0å8Ä8ä9$9$A&A&A&A&QEQEA&A&a†a†ZJbJI‡I‡QEQEA&A&A&A&AGAGQEQEA&A&@å@åA$A$8Ä8ä9E9E8Ä8ä0å0å0å0åA$A$0å0åA&A&8Ä8äIEIEAGAGbŒbŒbbY†Y†iÇiÇa†a†zzzzzzzziÇiÇI‡I‡QÇQÇAGAGI‡I‡bŒbŒIÇIÇAGAGAGAGA&A&IEIE@å@å9E9E@å@å@å@å9E9EA&A&A&A&A&A&A&A&QEQE@å@åAGAGIEIEA&A&@å@å9E9E0å0å8Ä8ä9E9EA&A&QEQEA&A&YEYEZJbJYÉYÉQEQE8å8å@ä@ä8Ä8ä8Ä8ä8Ä8ä8Ä8ä9$9$8Ä8ä8Ä8ä0Ä0ã8Ä8ä8Ä8ä9E9E8Ä8ä9E9EA&A&QEQEYÉYÉbŒbŒAÇAÇI‡I‡AGAGY†Y†YÉYÉjjYÉYÉY†Y†Y†Y†0å0å9E9E@å@åR -R -R -R -QEQEA&A&IEIE@å@å9E9E@å@å8Ä8ä9E9E8Ä8ä9E9EA&A&8Ä8äIEIEIEIEA&A&QEQEA&A&IEIE8Ä8ä9E9E@å@åA$A$9E9EA&A&A&A&QEQEYEYEYÉYÉbŒbŒQEQEQEQEA&A&YEYEA&A&A&A&QEQE@ä@ä8Ä8ä8Ä8äAEAE0Ä0ä8Ä8ä8Ä8ä9E9E8Ä8äA$A$9E9EQEQEI‡I‡ZJbJR -R -QÇQÇAGAGQÇQÇI‡I‡jjYÉYÉaÇaÇI‡I‡QEQE(å(å9E9EI‡I‡R‹R‹Y†Y†IEIEA&A&@å@åA$A$@å@å0å0å9E9E8Ä8ä@å@å9E9E@å@åAEAE@å@åIEIEQEQEIEIE@å@åA&A&9E9E@å@åAEAE8Ä8äA&A&IEIEQEQEA&A&a†a†ZJbJYÉYÉQEQEQEQE8Ä8ä@å@å8ä8Ä8ä8Ä8ä8Ä9$9$8Ä8ä8Ä8ä0Ä0ã8Ä8ä8Ä8ä9E9E8Ä8ä9E9EA&A&QEQEYÉYÉbŒbŒAÇAÇI‡I‡AGAGY†Y†YÉYÉjjYÉYÉY†Y†Y†Y†0å0å9E9E@å@åR -R -R -R -QEQEA&A&IEIE@å@å9E9E@å@å8Ä8ä9E9E8Ä8ä9E9EA&A&8Ä8äIEIEIEIEA&A&QEQEA&A&IEIE8Ä8ä9E9E@å@åA$A$9E9EA&A&A&A&QEQEYEYEYÉYÉbŒbŒQEQEQEQEA&A&YEYEA&A&A&A&QEQE@ä@ä8Ä8ä8Ä8äAEAE0Ä0ä8Ä8ä8Ä8ä9E9E8Ä8äA$A$9E9EQEQEI‡I‡ZJbJR -R -QÇQÇAGAGQÇQÇI‡I‡jjYÉYÉaÇaÇI‡I‡QEQE(å(å9E9EI‡I‡R‹R‹Y†Y†IEIEA&A&@å@åA$A$@å@å0å0å9E9E8Ä8ä@å@å9E9E@å@åAEAE@å@åIEIEQEQEIEIE@å@åA&A&9E9E@å@åAEAE8Ä8äA&A&IEIEQEQEA&A&a†a†ZJbJYÉYÉQEQEQEQE8Ä8ä@å@åAGAGAGAGAÇAÇAÇAÇ9E9EA&A&AÇAÇA†A†AÇAÇAGAG0æ0æAGAGAGAGAGAGR‹R‹ZJbJ å å0Ä0ä ä ä££Ä Ä0æ0æ0æ0æ!$!$AGAGBBR‹R‹R -R -c/c/R‹R‹AGAGAGAG9†9†AGAGAGAG0æ0æ0æ0æ9E9E@å@å8æ8æ0æ0æAÇAÇAGAGAGAGAGAGA&A&A&A&AGAGAGAG@å@åIEIE0å0å8æ8æAGAGI‡I‡YÉYÉI‡I‡YÉYÉjÍjÍbJZJYÉYÉbbR -R -I‡I‡I‡I‡A&A&8æ8æ9E9E0æ0æ(ä(ä(ä(ä(ä(ä(ä(äA&A&0æ0æAGAGA†A†AGAGI‡I‡c.c-AÇAÇ Ä Ä ä ä ä ä Ä Ä(å(å0æ0æ å å0æ0æJJR‹R‹BBBBbŒbŒAGAGAGAGAGAGAGAG9†9†AGAG0å0å@å@å9E9E0æ0æ0å0åAGAGAGAGAGAGAGAGA&A&AGAGA&A&AGAGIEIE0å0å9E9E@å@åA†A†AGAGI‡I‡YÉYÉY†Y†bŒbŒbŒbŒYÉYÉYÉYÉYÉYÉJJAGAGAGAGAÇAÇAÇAÇ9E9EA&A&AÇAÇA†A†AÇAÇAGAG0æ0æAGAGAGAGAGAGR‹R‹ZJbJ å å0Ä0ä ä ä££Ä Ä0æ0æ0æ0æ!$!$AGAGBBR‹R‹R -R -c/c/R‹R‹AGAGAGAG9†9†AGAGAGAG0æ0æ0æ0æ9E9E@å@å8æ8æ0æ0æAÇAÇAGAGAGAGAGAGA&A&A&A&AGAGAGAG@å@åIEIE0å0å8æ8æAGAGI‡I‡YÉYÉI‡I‡YÉYÉjÍjÍbJZJYÉYÉbbR -R -I‡I‡I‡I‡A&A&8æ8æ9E9E0æ0æ(ä(ä(ä(ä(ä(ä(ä(äA&A&0æ0æAGAGA†A†AGAGI‡I‡c.c-AÇAÇ Ä Ä ä ä ä ä Ä Ä(å(å0æ0æ å å0æ0æJJR‹R‹BBBBbŒbŒAGAGAGAGAGAGAGAG9†9†AGAG0å0å@å@å9E9E0æ0æ0å0åAGAGAGAGAGAGAGAGA&A&AGAGA&A&AGAGIEIE0å0å9E9E@å@åA†A†AGAGI‡I‡YÉYÉY†Y†bŒbŒbŒbŒYÉYÉYÉYÉYÉYÉJJk/k/rËjËk/k/rËjËbŒbŒƒÐƒÐk/k/bIbIbŒbŒZIZIR‹R‹ZJbJZJbJc,c,bŒbŒjËjËbJZJR‹R‹ZJbJZJbJR‹R‹bŒbŒk-k-c,c,{oƒp{oƒpk-k-k-s.{,{,{,{,k-k-k.s-k-k-k/s/jËj˓ЋЃo{pc,c,c/c/c,c,k-k-ƒÐƒÐk/k/s-k-jÎjÍs-k-k/k/rËjËc,c,{.{.ƒÒƒÑ{Ð{Ðk/k/{.{.{oƒp{.{.{.{.{.{.{.{.{.{.{.{.{.{.k-k-{.{.k-k-bŒbŒjÍjÍc/c/ZJbJR -R -bJZJR‹R‹R -R -bŒbŒc,c,ZJbJZJbJZÌZÌbŒbŒjËjËbŒbŒZJbJR‹R‹bŒbŒbIbIZÌZÌk-k-rÎjÍk,k,ƒÐƒÐ{.{.{,{,{.{.{.{.k-k-s.k-k-k-s.k-k-k-s/k/ƒÒƒÑk,k,c/c/k-k-bŒbŒ{Ï{σЃÐc,c,k/k/s-k-k.k-s-k-bŒbŒk-k-ƒÐƒÐƒÒƒÑk/k/{.{.ƒÐƒÐ{oƒp{.{.{.{.{.{.{oƒps,{,{.{.k/k/{.{.k/s/jËjËk/s/jËjËbŒbŒƒÐƒÐk/k/bIbIbŒbŒZIZIR‹R‹ZJbJZJbJc,c,bŒbŒjËjËbJZJR‹R‹ZJbJZJbJR‹R‹bŒbŒk-k-c,c,{oƒp{oƒpk-k-k-s.{,{,{,{,k-k-k.s-k-k-k/s/jËj˓ЋЃo{pc,c,c/c/c,c,k-k-ƒÐƒÐk/k/s-k-jÎjÍs-k-k/k/rËjËc,c,{.{.ƒÒƒÑ{Ð{Ðk/k/{.{.{oƒp{.{.{.{.{.{.{.{.{.{.{.{.{.{.k-k-{.{.k-k-bŒbŒjÍjÍc/c/ZJbJR -R -bJZJR‹R‹R -R -bŒbŒc,c,ZJbJZJbJZÌZÌbŒbŒjËjËbŒbŒZJbJR‹R‹bŒbŒbIbIZÌZÌk-k-rÎjÍk,k,ƒÐƒÐ{.{.{,{,{.{.{.{.k-k-s.k-k-k-s.k-k-k-s/k/ƒÒƒÑk,k,c/c/k-k-bŒbŒ{Ï{σЃÐc,c,k/k/s-k-k.k-s-k-bŒbŒk-k-ƒÐƒÐƒÒƒÑk/k/{.{.ƒÐƒÐ{oƒp{.{.{.{.{.{.{oƒps,{,{.{.k/k/{.{.QÇQÇQEQEY†Y†YEYEY†Y†ƒÐƒÐRŠRŠ@å@åIEIEI$I$A&A&@å@åAEAEIEIEIEIEQEQEI†I†AGAGI†I†AGAGQEQEI†I†I†I†I‡I‡Y†Y†I†I†QEQEA&A&IEIEQEQEIEIEIEIEQEQEY†Y†QEQEjËj˓ГÐR -R -QEQEAGAGQEQEAGAGAEAEQEQEIEIEIEIEI†I†QEQEYEYEYÉYɃЃÐjIjIbbYÇYÇQÇQÇYÇYÇYÇYÇY†Y†QÇQÇQEQEAGAGQÇQÇQEQEI‡I‡QÇQÇQEQEjj{.{.QEQEA&A&IEIEQEQEQEQEA&A&IEIE@å@åAEAEQEQEQEQEA&A&QEQEAGAGY†Y†AGAGQEQEAGAGQEQEQÇQÇQÇQÇI†I†QEQEA&A&QEQEA&A&IEIEIEIEQEQEYEYEQÇQÇaÇaǃσÏbŒbŒY†Y†AGAGQEQEAGAGAEAEQEQEIEIEIEIEA&A&QEQEY†Y†Y†Y†jÍjÍ{.{.bbQÇQÇI‡I‡Y†Y†bbY†Y†I‡I‡QEQEI†I†I†I†QEQEY†Y†QÇQÇQEQEY†Y†YEYEY†Y†ƒÐƒÐRŠRŠ@å@åIEIEI$I$A&A&@å@åAEAEIEIEIEIEQEQEI†I†AGAGI†I†AGAGQEQEI†I†I†I†I‡I‡Y†Y†I†I†QEQEA&A&IEIEQEQEIEIEIEIEQEQEY†Y†QEQEjËj˓ГÐR -R -QEQEAGAGQEQEAGAGAEAEQEQEIEIEIEIEI†I†QEQEYEYEYÉYɃЃÐjIjIbbYÇYÇQÇQÇYÇYÇYÇYÇY†Y†QÇQÇQEQEAGAGQÇQÇQEQEI‡I‡QÇQÇQEQEjj{.{.QEQEA&A&IEIEQEQEQEQEA&A&IEIE@å@åAEAEQEQEQEQEA&A&QEQEAGAGY†Y†AGAGQEQEAGAGQEQEQÇQÇQÇQÇI†I†QEQEA&A&QEQEA&A&IEIEIEIEQEQEYEYEQÇQÇaÇaǃσÏbŒbŒY†Y†AGAGQEQEAGAGAEAEQEQEIEIEIEIEA&A&QEQEY†Y†Y†Y†jÍjÍ{.{.bbQÇQÇI‡I‡Y†Y†bbY†Y†I‡I‡QEQEI†I†I†I†QEQEY†Y†QEQEQEQEYEYEAGAGY†Y†jÍjÍbbIEIEA&A&I$I$I$I$IEIEQEQEQEQEA&A&I$I$A&A&QEQEQEQEA&A&I†I†YEYEI‡I‡QEQEAGAGQEQEA&A&QEQE@å@åAEAEI$I$AGAGYEYEY†Y†Y†Y†jŠjŠƒÐƒÐbbAGAGIEIEQEQEQEQEIEIEAGAGQEQEQEQEA&A&YEYEI‡I‡iÇiÇs/k/I‡I‡QEQEQEQEY†Y†A&A&QEQEY†Y†A&A&I†I†QEQEA&A&AGAGA†A†QEQEQEQEjjrÍjÍA&A&HäHäI$I$A&A&I$I$QEQEI$I$A&A&I$I$QEQEA&A&QEQEA&A&IEIEQEQEIEIEA&A&I†I†YEYEA&A&Y†Y†AGAGQEQEIEIEA&A&IEIEI$I$IEIEQEQEY†Y†Y†Y†aÇaǃЃÐk-k-QEQEAGAGI$I$AGAGQEQEQEQEAGAGI$I$AGAGQEQEYEYEYEYEk/k/bJZJIEIEYEYEQEQEYEYEA&A&Y†Y†QEQEA&A&I†I†AGAGQEQEYEYEQEQEQEQEYEYEAGAGY†Y†jÍjÍbbIEIEA&A&I$I$I$I$IEIEQEQEQEQEA&A&I$I$A&A&QEQEQEQEA&A&I†I†YEYEI‡I‡QEQEAGAGQEQEA&A&QEQE@å@åAEAEI$I$AGAGYEYEY†Y†Y†Y†jŠjŠƒÐƒÐbbAGAGIEIEQEQEQEQEIEIEAGAGQEQEQEQEA&A&YEYEI‡I‡iÇiÇs/k/I‡I‡QEQEQEQEY†Y†A&A&QEQEY†Y†A&A&I†I†QEQEA&A&AGAGA†A†QEQEQEQEjjrÍjÍA&A&HäHäI$I$A&A&I$I$QEQEI$I$A&A&I$I$QEQEA&A&QEQEA&A&IEIEQEQEIEIEA&A&I†I†YEYEA&A&Y†Y†AGAGQEQEIEIEA&A&IEIEI$I$IEIEQEQEY†Y†Y†Y†aÇaǃЃÐk-k-QEQEAGAGI$I$AGAGQEQEQEQEAGAGI$I$AGAGQEQEYEYEYEYEk/k/bJZJIEIEYEYEQEQEYEYEA&A&Y†Y†QEQEA&A&I†I†AGAGQEQEYEYEQEQEY†Y†A&A&QEQEYEYEZJbJJJI$I$QEQE@ä@äQEQEHäHäQEQEA&A&I$I$QEQEQEQEA&A&I$I$QEQEA&A&QEQEQEQEQEQEQEQEY†Y†QEQEA&A&IEIEQEQEQEQEYEYEaÇaÇY…Y…QEQEjËj˃o{pI‡I‡QEQEAGAGI$I$A&A&QEQEA&A&QEQEA&A&QEQEAGAGHäHäaÇaǃ҃ÑQÇQÇYEYEQEQEYEYEAGAGQEQEYEYEY†Y†AGAGQEQEA&A&I†I†QEQEA&A&YEYEZJbJZÌZÌQEQEHäHä@å@åI$I$A&A&HãHäQEQEQEQEI$I$A&A&I$I$QEQEI$I$IEIEA&A&I$I$IEIEA&A&QEQEYEYEI†I†YEYEQEQEIEIEA&A&QEQEQEQEQEQEY†Y†Y…Y…QEQEbbƒÐƒÐZJbJQEQEAGAGQEQEA&A&IEIEQEQEA&A&QEQEA&A&QEQEAGAGYEYE{,{,bŒbŒYEYEYEYEY†Y†AGAGQEQEYEYEI†I†QEQEYEYEAGAGQEQEAGAGQEQEY†Y†A&A&QEQEYEYEZJbJJJI$I$QEQE@ä@äQEQEHäHäQEQEA&A&I$I$QEQEQEQEA&A&I$I$QEQEA&A&QEQEQEQEQEQEQEQEY†Y†QEQEA&A&IEIEQEQEQEQEYEYEaÇaÇY…Y…QEQEjËj˃o{pI‡I‡QEQEAGAGI$I$A&A&QEQEA&A&QEQEA&A&QEQEAGAGHäHäaÇaǃ҃ÑQÇQÇYEYEQEQEYEYEAGAGQEQEYEYEY†Y†AGAGQEQEA&A&I†I†QEQEA&A&YEYEZJbJZÌZÌQEQEHäHä@å@åI$I$A&A&HãHäQEQEQEQEI$I$A&A&I$I$QEQEI$I$IEIEA&A&I$I$IEIEA&A&QEQEYEYEI†I†YEYEQEQEIEIEA&A&QEQEQEQEQEQEY†Y†Y…Y…QEQEbbƒÐƒÐZJbJQEQEAGAGQEQEA&A&IEIEQEQEA&A&QEQEA&A&QEQEAGAGYEYE{,{,bŒbŒYEYEYEYEY†Y†AGAGQEQEYEYEI†I†QEQEYEYEAGAGQEQEAGAGQEQEIEIEAGAGQEQEA&A&ZJbJYÉYÉA&A&I$I$I$I$I$I$QEQEQEQEQEQEQEQEQEQE@å@åIEIEI$I$A&A&I$I$QEQEQEQEQEQEY†Y†QEQEQEQEQEQEQEQEYEYEY…Y…aÇaÇY…Y…Y†Y†Y…Y…k-k-ƒp{oI‡I‡QEQEA&A&IEIEA&A&QEQEA&A&AEAEI$I$A&A&QEQEQEQEYÇYÇ{oƒpYÈYÉYEYEYEYEQEQEYEYEY†Y†YEYEQEQEYEYEAGAGQEQEA&A&I†I†AGAGAGAGZZjÍjÍQEQE@ä@ä@ä@äHäHäIEIEI$I$HäHäQEQEQEQEQEQEQEQEA&A&I$I$QEQE@å@åQEQEA&A&QEQEQEQEQEQEYEYEY†Y†QEQEQEQEQEQEQEQEY…Y…aÇaÇYEYEaÇaÇY…Y…bb{Ð{ÐZJbJIEIEIEIEA&A&I$I$A&A&QEQEA&A&IEIEA&A&IEIEQEQEQEQE{,{,bŒbŒYEYEYEYEQEQEYEYEYEYEYEYEYEYEYEYEAGAGQEQEA&A&QEQEQEQEIEIEAGAGQEQEA&A&ZJbJYÉYÉA&A&I$I$I$I$I$I$QEQEQEQEQEQEQEQEQEQE@å@åIEIEI$I$A&A&I$I$QEQEQEQEQEQEY†Y†QEQEQEQEQEQEQEQEYEYEY…Y…aÇaÇY…Y…Y†Y†Y…Y…k-k-ƒp{oI‡I‡QEQEA&A&IEIEA&A&QEQEA&A&AEAEI$I$A&A&QEQEQEQEYÇYÇ{oƒpYÈYÉYEYEYEYEQEQEYEYEY†Y†YEYEQEQEYEYEAGAGQEQEA&A&I†I†AGAGAGAGZZjÍjÍQEQE@ä@ä@ä@äHäHäIEIEI$I$HäHäQEQEQEQEQEQEQEQEA&A&I$I$QEQE@å@åQEQEA&A&QEQEQEQEQEQEYEYEY†Y†QEQEQEQEQEQEQEQEY…Y…aÇaÇYEYEaÇaÇY…Y…bb{Ð{ÐZJbJIEIEIEIEA&A&I$I$A&A&QEQEA&A&IEIEA&A&IEIEQEQEQEQE{,{,bŒbŒYEYEYEYEQEQEYEYEYEYEYEYEYEYEYEYEAGAGQEQEA&A&QEQEIEIEQEQEA&A&QEQEYEYER -R -bbI$I$HäHäI$I$QEQEQEQEHäHäQEQEQEQEHäHäI$I$QEQEQEQEQEQEQEQEQEQEQEQEYEYEY†Y†Y†Y†QEQEY†Y†YEYEY†Y†YEYEY†Y†Y†Y†aÇaÇY…Y…jŠjŠ{Ð{ÐYÉYÉIEIEIEIEA&A&QEQE@å@åIEIEA&A&IEIEA&A&QEQEAGAGa†a†k/k/aÇaÇY…Y…a†a†YEYEQEQEQEQEYEYEY†Y†QEQEQEQEA&A&I†I†YEYEAGAGQEQEZJbJk/k/I$I$@ä@ä@ä@äHäHäI$I$HäHäHäHäQEQEQEQEQEQEHäHäQEQEI$I$QEQEI$I$QEQEQEQEQEQEHäHäYEYEa†a†Y…Y…Y†Y†QEQEY†Y†YEYEY†Y†YEYEaÇaÇY…Y…Y†Y†bbk/k/c,c,QEQEA&A&QEQEA&A&IEIE@å@åIEIEA&A&IEIEA&A&QEQEQEQEjËjËbŒbŒYEYEY…Y…YEYEYEYEY†Y†QEQEYEYEY†Y†QEQEAGAGQEQEA&A&IEIEQEQEA&A&QEQEYEYER -R -bbI$I$HäHäI$I$QEQEQEQEHäHäQEQEQEQEHäHäI$I$QEQEQEQEQEQEQEQEQEQEQEQEYEYEY†Y†Y†Y†QEQEY†Y†YEYEY†Y†YEYEY†Y†Y†Y†aÇaÇY…Y…jŠjŠ{Ð{ÐYÉYÉIEIEIEIEA&A&QEQE@å@åIEIEA&A&IEIEA&A&QEQEAGAGa†a†k/k/aÇaÇY…Y…a†a†YEYEQEQEQEQEYEYEY†Y†QEQEQEQEA&A&I†I†YEYEAGAGQEQEZJbJk/k/I$I$@ä@ä@ä@äHäHäI$I$HäHäHäHäQEQEQEQEQEQEHäHäQEQEI$I$QEQEI$I$QEQEQEQEQEQEHäHäYEYEa†a†Y…Y…Y†Y†QEQEY†Y†YEYEY†Y†YEYEaÇaÇY…Y…Y†Y†bbk/k/c,c,QEQEA&A&QEQEA&A&IEIE@å@åIEIEA&A&IEIEA&A&QEQEQEQEjËjËbŒbŒYEYEY…Y…YEYEYEYEY†Y†QEQEYEYEY†Y†QEQEAGAGQEQEA&A&A&A&I$I$QEQEQEQEYÉYÉjjJJ@å@å@å@å@å@åHäHäIEIEQEQEI$I$QEQEQEQE@å@å@å@åIEIEHäHäQEQEQEQEYEYEYEYEa†a†QEQEQEQEY†Y†QEQEY†Y†QEQEaÇaÇQ…Q…QEQEYEYEZIZIƒÐƒÐRRA&A&QEQEA&A&@å@åIEIEA&A&@å@åQEQEIEIEA&A&QEQEIEIEbŒbŒYÉYÉYEYEYEYEYEYEY†Y†YEYEYEYEY†Y†a†a†QEQEQEQEQEQEA&A&QEQE@å@åZZk/k/QEQE@Ã@Ä@ä@ä@ä@äHäHäI$I$AEAEI$I$QEQEQEQEI$I$QEQE@ä@äI$I$A&A&I$I$QEQEQEQEYEYEYEYEY…Y…Y…Y…QEQEQEQEY†Y†QEQEY†Y†Y…Y…Y†Y†Y…Y…QEQEQÇQÇk-k-rÎjÍHäHäAGAGI$I$A&A&IEIEA&A&A&A&AEAEI$I$AGAGQEQE@å@åZJbJZJbJYEYEYEYEY†Y†YEYEYEYEYEYEY†Y†YEYEY†Y†IEIE@å@åHäHäA&A&I$I$QEQEQEQEYÉYÉjjJJ@å@å@å@å@å@åHäHäIEIEQEQEI$I$QEQEQEQE@å@å@å@åIEIEHäHäQEQEQEQEYEYEYEYEa†a†QEQEQEQEY†Y†QEQEY†Y†QEQEaÇaÇQ…Q…QEQEYEYEZIZIƒÐƒÐRRA&A&QEQEA&A&@å@åIEIEA&A&@å@åQEQEIEIEA&A&QEQEIEIEbŒbŒYÉYÉYEYEYEYEYEYEY†Y†YEYEYEYEY†Y†a†a†QEQEQEQEQEQEA&A&QEQE@å@åZZk/k/QEQE@Ã@Ä@ä@ä@ä@äHäHäI$I$AEAEI$I$QEQEQEQEI$I$QEQE@ä@äI$I$A&A&I$I$QEQEQEQEYEYEYEYEY…Y…Y…Y…QEQEQEQEY†Y†QEQEY†Y†Y…Y…Y†Y†Y…Y…QEQEQÇQÇk-k-rÎjÍHäHäAGAGI$I$A&A&IEIEA&A&A&A&AEAEI$I$AGAGQEQE@å@åZJbJZJbJYEYEYEYEY†Y†YEYEYEYEYEYEY†Y†YEYEY†Y†IEIE@å@åHäHäA&A&I‡I‡I‡I‡I‡I‡ZJbJbŒbŒbŒbŒAGAGAGAGA&A&AGAGA&A&AGAGAGAGJJI‡I‡I‡I‡RRI‡I‡JJYÉYÉI‡I‡YÉYÉRRAGAGRRAGAGI‡I‡I‡I‡I‡I‡YÉYÉZIZIZJbJjŠjŠjÍjÍrÎjÍc,c,ZJbJA&A&AGAGAGAGI‡I‡BBBBI‡I‡BBI‡I‡BBbŒbŒjÍjÍs/k/ZJbJI‡I‡I‡I‡I‡I‡I‡I‡JJI‡I‡YÉYÉJJR -R -R -R -bJZJR -R -bJZJbJZJs.k-ƒÒƒÑbbYÉYÉYÉYÉJJAGAGAGAGA&A&AGAGAGAGAGAGI‡I‡BBI‡I‡I‡I‡JJI‡I‡YÉYÉJJYÉYÉYÉYÉAÇAÇI‡I‡AGAGI‡I‡I‡I‡I‡I‡RRYÉYÉR -R -bJZJrËjË{.{.c,c,jÍjÍAGAGAGAGI‡I‡AGAGAÇAÇBBAGAGI‡I‡BBI‡I‡R -R -rÍjÍk/k/s/k/I‡I‡I‡I‡I‡I‡I‡I‡I‡I‡R -R -I‡I‡R -R -YÉYÉR -R -R -R -JJA&A&I‡I‡I‡I‡I‡I‡ZJbJbŒbŒbŒbŒAGAGAGAGA&A&AGAGA&A&AGAGAGAGJJI‡I‡I‡I‡RRI‡I‡JJYÉYÉI‡I‡YÉYÉRRAGAGRRAGAGI‡I‡I‡I‡I‡I‡YÉYÉZIZIZJbJjŠjŠjÍjÍrÎjÍc,c,ZJbJA&A&AGAGAGAGI‡I‡BBBBI‡I‡BBI‡I‡BBbŒbŒjÍjÍs/k/ZJbJI‡I‡I‡I‡I‡I‡I‡I‡JJI‡I‡YÉYÉJJR -R -R -R -bJZJR -R -bJZJbJZJs.k-ƒÒƒÑbbYÉYÉYÉYÉJJAGAGAGAGA&A&AGAGAGAGAGAGI‡I‡BBI‡I‡I‡I‡JJI‡I‡YÉYÉJJYÉYÉYÉYÉAÇAÇI‡I‡AGAGI‡I‡I‡I‡I‡I‡RRYÉYÉR -R -bJZJrËjË{.{.c,c,jÍjÍAGAGAGAGI‡I‡AGAGAÇAÇBBAGAGI‡I‡BBI‡I‡R -R -rÍjÍk/k/s/k/I‡I‡I‡I‡I‡I‡I‡I‡I‡I‡R -R -I‡I‡R -R -YÉYÉR -R -R -R -JJk/k/ƒÐƒÐ{Ð{Ð{oƒp{oƒpƒÐƒÐ{.{.k/k/s/k/{Ï{Ïk/k/{Ï{Ïk/k/s/k/k-k-rÎjÍbŒbŒk-k-bŒbŒk-k-c,c,bŒbŒk-k-s/k/k/k/c,c,{oƒp{Ð{ЃЃÐk/k/{Ï{Ï{Ï{σЃÐ{oƒpŒ0”0‹Ï“σЃÐ{.{.ƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÐ{oƒpƒÑƒÒƒÑƒÒƒÐƒÐ{oƒp{.{.‹Ð“М“œ“ƒÐƒÐ{oƒp{Ï{Ï{.{.ƒÐƒÐƒÐƒÐƒÒƒÑƒÐƒÐ{Ï{σ҃уЃД“Œ“œ“œ“”“Œ““ЋМ“œ“œ“œ“œ“œ“ƒÏƒÏƒÐƒÐk/k/{Ï{Ïk/k/s/k/{Ï{Ïk/k/s/k/k,k,s/k/jÍjÍc,c,jÍjÍbŒbŒk/k/c,c,bŒbŒbŒbŒk,k,s/k/k/k/{Ï{σЃÐ{oƒp{oƒpsÎ{Ïk/k/ƒÏƒÏƒÏƒÏ“ЋД0Œ0“ЋЃЃÐk/k/{Ï{σЃЃЃÐ{oƒpƒÑƒÒ“ЋЃ҃у҃Ñk/k/ƒÏƒÏ”0Œ0“ЋЃσσЃÐk/k/ƒÐƒÐƒÐƒÐƒÐƒÐ{Ð{ЃЃЃЃÐ{Ï{Ï”“Œ“œ“œ“ƒÐƒÐk/s/ƒÐƒÐ{Ð{Ð{oƒp{oƒpƒÐƒÐ{.{.k/k/s/k/{Ï{Ïk/k/{Ï{Ïk/k/s/k/k-k-rÎjÍbŒbŒk-k-bŒbŒk-k-c,c,bŒbŒk-k-s/k/k/k/c,c,{oƒp{Ð{ЃЃÐk/k/{Ï{Ï{Ï{σЃÐ{oƒpŒ0”0‹Ï“σЃÐ{.{.ƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÐ{oƒpƒÑƒÒƒÑƒÒƒÐƒÐ{oƒp{.{.‹Ð“М“œ“ƒÐƒÐ{oƒp{Ï{Ï{.{.ƒÐƒÐƒÐƒÐƒÒƒÑƒÐƒÐ{Ï{σ҃уЃД“Œ“œ“œ“”“Œ““ЋМ“œ“œ“œ“œ“œ“ƒÏƒÏƒÐƒÐk/k/{Ï{Ïk/k/s/k/{Ï{Ïk/k/s/k/k,k,s/k/jÍjÍc,c,jÍjÍbŒbŒk/k/c,c,bŒbŒbŒbŒk,k,s/k/k/k/{Ï{σЃÐ{oƒp{oƒpsÎ{Ïk/k/ƒÏƒÏƒÏƒÏ“ЋД0Œ0“ЋЃЃÐk/k/{Ï{σЃЃЃÐ{oƒpƒÑƒÒ“ЋЃ҃у҃Ñk/k/ƒÏƒÏ”0Œ0“ЋЃσσЃÐk/k/ƒÐƒÐƒÐƒÐƒÐƒÐ{Ð{ЃЃЃЃÐ{Ï{Ï”“Œ“œ“œ“ƒÐƒÐIEIEAEAEIEIEIEIEA&A&IEIE9E9EQEQE9E9EI†I†QÇQÇbŒbŒAEAEHäHäI$I$IEIEI$I$AEAEHäHäIEIE@å@åI$I$AEAEY…Y…QÇQÇYÉYÉAÇAÇI†I†I‡I‡AGAGA†A†IEIEAGAGA†A†QEQEI‡I‡YÇYÇIÇIÇQÇQÇI†I†QÇQÇY†Y†I‡I‡QÇQÇQEQEI†I†AGAGQEQEI†I†A&A&A†A†I†I†Y†Y†Y†Y†ZJbJR -R -A†A†9$9$9E9E9E9EA&A&A†A†8Ä8äA†A†AEAEAEAEAEAEQEQEAGAGIEIE9E9EQEQEIEIEIEIEAGAGbIbIRR@å@åI$I$IEIEIEIEHäHäIEIEHäHäIEIEHäHäAEAEQEQEbbI‡I‡RRAGAGAÇAÇAGAGA†A†A†A†AGAGA†A†QEQEI‡I‡QÇQÇQÇQÇQÇQÇQÇQÇI†I†QÇQÇY†Y†I‡I‡QÇQÇQEQEAGAGQEQEQÇQÇA&A&A†A†QEQEAGAGQÇQÇbbZJbJAÇAÇ@å@å9E9E9E9E9E9EA&A&9E9EIEIEIEIEAEAEIEIEIEIEA&A&IEIE9E9EQEQE9E9EI†I†QÇQÇbŒbŒAEAEHäHäI$I$IEIEI$I$AEAEHäHäIEIE@å@åI$I$AEAEY…Y…QÇQÇYÉYÉAÇAÇI†I†I‡I‡AGAGA†A†IEIEAGAGA†A†QEQEI‡I‡YÇYÇIÇIÇQÇQÇI†I†QÇQÇY†Y†I‡I‡QÇQÇQEQEI†I†AGAGQEQEI†I†A&A&A†A†I†I†Y†Y†Y†Y†ZJbJR -R -A†A†9$9$9E9E9E9EA&A&A†A†8Ä8äA†A†AEAEAEAEAEAEQEQEAGAGIEIE9E9EQEQEIEIEIEIEAGAGbIbIRR@å@åI$I$IEIEIEIEHäHäIEIEHäHäIEIEHäHäAEAEQEQEbbI‡I‡RRAGAGAÇAÇAGAGA†A†A†A†AGAGA†A†QEQEI‡I‡QÇQÇQÇQÇQÇQÇQÇQÇI†I†QÇQÇY†Y†I‡I‡QÇQÇQEQEAGAGQEQEQÇQÇA&A&A†A†QEQEAGAGQÇQÇbbZJbJAÇAÇ@å@å9E9E9E9E9E9EA&A&9E9EIEIE@å@åHäHä8ä8ã@å@å8ã8ä@å@å8ã8ä@å@åHäHä8ä8ãY†Y†ZJbJHäHäHäHäI$I$8ã8äHäHä@ä@ãHäHä8ä8ã8ä8ãHäHä8ä8ãAEAEYDYDjŠjŠA&A&A&A&8ã8ä8Ä8ä8Ä8ä8Ä8äAEAE@å@åAEAE@å@åHäHäAEAEQEQEQEQEQEQEQEQEQEQEHäHäQEQEIEIEQEQEA&A&I$I$@å@å9E9EA&A&A&A&QEQEk-k-I‡I‡8Ä8äIEIE8å8å8Ä8äIEIE0å0åAEAEHãHäHäHä@ä@ä@ä@ä@ä@ä@ä@ä8ä8ã8Ä8ä8ä8ã8Ä8ä@å@åIEIEbbAGAGI$I$HäHäHäHä8ä8ãHäHä@ä@ãHäHä0Ä0ãHäHä8ä8ãHäHäI$I$ZZR -R -8ã8äAEAE@ä@ä0Ä0ä8ä8ã@å@åAEAE@å@åI$I$8Ä8äQEQEA&A&QEQEQEQEQEQEQEQEHäHäQEQEA&A&IEIEIEIE@å@åAEAE@å@åAEAEIEIE@å@åj‰j‰bJZJ@å@åA$A$@å@å8Ä8ä9E9E@ä@ä@å@å8Ä8ä@å@åHäHä8ä8ã@å@å8ã8ä@å@å8ã8ä@å@åHäHä8ä8ãY†Y†ZJbJHäHäHäHäI$I$8ã8äHäHä@ä@ãHäHä8ä8ã8ä8ãHäHä8ä8ãAEAEYDYDjŠjŠA&A&A&A&8ã8ä8Ä8ä8Ä8ä8Ä8äAEAE@å@åAEAE@å@åHäHäAEAEQEQEQEQEQEQEQEQEQEQEHäHäQEQEIEIEQEQEA&A&I$I$@å@å9E9EA&A&A&A&QEQEk-k-I‡I‡8Ä8äIEIE8å8å8Ä8äIEIE0å0åAEAEHãHäHäHä@ä@ä@ä@ä@ä@ä@ä@ä8ä8ã8Ä8ä8ä8ã8Ä8ä@å@åIEIEbbAGAGI$I$HäHäHäHä8ä8ãHäHä@ä@ãHäHä0Ä0ãHäHä8ä8ãHäHäI$I$ZZR -R -8ã8äAEAE@ä@ä0Ä0ä8ä8ã@å@åAEAE@å@åI$I$8Ä8äQEQEA&A&QEQEQEQEQEQEQEQEHäHäQEQEA&A&IEIEIEIE@å@åAEAE@å@åAEAEIEIE@å@åj‰j‰bJZJ@å@åA$A$@å@å8Ä8ä9E9E@ä@ä@å@å8Ä8äHäHä8ä8ã@å@åHäHäHäHä8ä8ãHäHä8ä8ã@ä@ãHäHäI†I†bb8Ä8äI$I$HäHäI$I$HäHäA$A#HäHä8ä8ãI$I$8ã8ä@å@å@ã@äI$I$ZJbJIEIE8Ä8äAEAE8Ä8äAEAE8Ä8äAEAE@å@åHäHäAEAEIEIEI$I$A&A&I$I$A&A&YEYEQEQEQEQEIEIEA&A&A&A&@å@åQEQE9E9E8Ä8äIEIE@å@åQEQEk-k-YÉYÉ8Ä8äAEAE8Ä8ä9E9E8Ä8äA&A&HäHä@ä@ä@ä@ä8ä8ã@ä@äHäHäHäHä8ä8ãHäHä8ä8ãHäHä8ä8ãI$I$ZJbJAGAG@ã@äI$I$HäHä@ä@ãI$I$I$I$8ã8äA$A$8ä8ãI$I$0Ã0äI$I$ZZRR8Ä8ä@å@å8ã8äIEIE8Ä8ä8Ä8äAEAE@å@åAEAEIEIEI$I$A&A&I$I$A&A&QEQEYEYEYEYEIEIEA&A&I$I$IEIEA&A&AEAE8Ä8äIEIE0å0åQEQEbIbIbŒbŒIEIE@å@å8Ä8ä9E9EA&A&HäHä@ä@ä8ä8ãHäHä8ä8ã@å@åHäHäHäHä8ä8ãHäHä8ä8ã@ä@ãHäHäI†I†bb8Ä8äI$I$HäHäI$I$HäHäA$A#HäHä8ä8ãI$I$8ã8ä@å@å@ã@äI$I$ZJbJIEIE8Ä8äAEAE8Ä8äAEAE8Ä8äAEAE@å@åHäHäAEAEIEIEI$I$A&A&I$I$A&A&YEYEQEQEQEQEIEIEA&A&A&A&@å@åQEQE9E9E8Ä8äIEIE@å@åQEQEk-k-YÉYÉ8Ä8äAEAE8Ä8ä9E9E8Ä8äA&A&HäHä@ä@ä@ä@ä8ä8ã@ä@äHäHäHäHä8ä8ãHäHä8ä8ãHäHä8ä8ãI$I$ZJbJAGAG@ã@äI$I$HäHä@ä@ãI$I$I$I$8ã8äA$A$8ä8ãI$I$0Ã0äI$I$ZZRR8Ä8ä@å@å8ã8äIEIE8Ä8ä8Ä8äAEAE@å@åAEAEIEIEI$I$A&A&I$I$A&A&QEQEYEYEYEYEIEIEA&A&I$I$IEIEA&A&AEAE8Ä8äIEIE0å0åQEQEbIbIbŒbŒIEIE@å@å8Ä8ä9E9EA&A&HäHä@ä@ä8ä8ãHäHäHäHä8ä8ã@ä@ã@ä@ã@ä@ã8ä8ãHäHã@ä@ãHäHäQÇQÇZJbJ8Ä8äI$I$I$I$8ã8äI$I$I$I$HäHäA$A$8ä8ãHäHäA$A$HäHäI$I$ZJbJ9E9E8Ä8äA$A$8Ä8ä8Ä8ä8Ä8äA$A$8Ä8äAEAEHäHäAEAEQEQEA&A&I$I$QEQEHäHäQEQEA&A&QEQE8Ä8ä@å@åI$I$A$A$@å@å8Ä8äIEIEIEIEQEQEjÍjÍIÇIÇ8Ä8ä8Ä8äA$A$@å@å@å@å8Ä8ä8Ä8ä8ä8ã8ä8ãHäHä@ä@ä8ä8ãHäHä8ä8ã@ä@ãHäHä@ä@ãHäHäI$I$ZJbJAGAGI$I$HäHäI$I$I$I$HäHäA$A#HäHä8ä8ãHäHä8ä8ãAEAEHäHäbbI‡I‡8Ä8äA$A$8Ä8ä8Ä8ä9$9$8Ä8äA$A$8Ä8äAEAEI$I$AGAGI$I$A&A&HäHäQEQEI$I$A&A&QEQE@å@å8Ä8äIEIE@ä@ä@å@åA$A$8Ä8äQEQEQEQEbbZÌZÌ8Ä8ä8Ä8äA$A$@å@å8Ä8ä8ä8ã8ä8ã@å@åHäHäHäHä8ä8ã@ä@ã@ä@ã@ä@ã8ä8ãHäHã@ä@ãHäHäQÇQÇZJbJ8Ä8äI$I$I$I$8ã8äI$I$I$I$HäHäA$A$8ä8ãHäHäA$A$HäHäI$I$ZJbJ9E9E8Ä8äA$A$8Ä8ä8Ä8ä8Ä8äA$A$8Ä8äAEAEHäHäAEAEQEQEA&A&I$I$QEQEHäHäQEQEA&A&QEQE8Ä8ä@å@åI$I$A$A$@å@å8Ä8äIEIEIEIEQEQEjÍjÍIÇIÇ8Ä8ä8Ä8äA$A$@å@å@å@å8Ä8ä8Ä8ä8ä8ã8ä8ãHäHä@ä@ä8ä8ãHäHä8ä8ã@ä@ãHäHä@ä@ãHäHäI$I$ZJbJAGAGI$I$HäHäI$I$I$I$HäHäA$A#HäHä8ä8ãHäHä8ä8ãAEAEHäHäbbI‡I‡8Ä8äA$A$8Ä8ä8Ä8ä9$9$8Ä8äA$A$8Ä8äAEAEI$I$AGAGI$I$A&A&HäHäQEQEI$I$A&A&QEQE@å@å8Ä8äIEIE@ä@ä@å@åA$A$8Ä8äQEQEQEQEbbZÌZÌ8Ä8ä8Ä8äA$A$@å@å8Ä8ä8ä8ã8ä8ã@å@åHäHä8ä8ã@ä@ãHäHãI$I$8ã8äHãHäHäHä@ä@ãI$I$QEQEbŒbŒI$I$AEAEHäHäHäHäI$I$I$I$I$I$I$I$8ã8äAEAE@ã@äHäHäI$I$RR@å@å8Ä8äA$A$0Ä0ã9$9$8Ä8ä9$9$8Ä8äAEAEI$I$QEQEA&A&I$I$QEQE@å@åI$I$QEQE@å@åI$I$@å@åI$I$A$A$A&A&AEAEHäHäAEAEQEQEQEQEjËjËI‡I‡8Ä8ä(ä(ä8Ä8ä9E9E8Ä8äA$A$8Ä8äAEAEHäHä8ä8ãHäHäHäHä@ä@ã@ä@ã@ä@ã@ä@ã@ä@ãHäHäI$I$jŠjŠAÇAÇHäHäI$I$8ã8äI$I$I$I$I$I$I$I$AEAEHäHäI$I$HäHäHäHäQÇQÇA†A†8Ä8ä8Ä8äA$A$0Ä0ä0Ä0ãA$A$8Ä8äAEAEI$I$QEQEA&A&HäHäQEQEQEQE@ä@äQEQEQEQE@ä@äQEQE@å@åHäHäAEAEI$I$8Ä8äIEIEIEIEQEQEYÉYÉbŒbŒ0Ä0ä8Ä8ä8Ä8ä9$9$9$9$0å0åHäHä8ä8ãHäHä8ä8ã@ä@ãHäHãI$I$8ã8äHãHäHäHä@ä@ãI$I$QEQEbŒbŒI$I$AEAEHäHäHäHäI$I$I$I$I$I$I$I$8ã8äAEAE@ã@äHäHäI$I$RR@å@å8Ä8äA$A$0Ä0ã9$9$8Ä8ä9$9$8Ä8äAEAEI$I$QEQEA&A&I$I$QEQE@å@åI$I$QEQE@å@åI$I$@å@åI$I$A$A$A&A&AEAEHäHäAEAEQEQEQEQEjËjËI‡I‡8Ä8ä(ä(ä8Ä8ä9E9E8Ä8äA$A$8Ä8äAEAEHäHä8ä8ãHäHäHäHä@ä@ã@ä@ã@ä@ã@ä@ã@ä@ãHäHäI$I$jŠjŠAÇAÇHäHäI$I$8ã8äI$I$I$I$I$I$I$I$AEAEHäHäI$I$HäHäHäHäQÇQÇA†A†8Ä8ä8Ä8äA$A$0Ä0ä0Ä0ãA$A$8Ä8äAEAEI$I$QEQEA&A&HäHäQEQEQEQE@ä@äQEQEQEQE@ä@äQEQE@å@åHäHäAEAEI$I$8Ä8äIEIEIEIEQEQEYÉYÉbŒbŒ0Ä0ä8Ä8ä8Ä8ä9$9$9$9$0å0åHäHä8ä8ãHäHä@ä@ã@ä@ã@ä@ã@ä@ãHäHã8ä8ã@ä@ãHäHã@ä@ãIEIEjŠjŠ8Ä8äHäHäI$I$I$I$@ã@äI$I$I$I$I$I$HäHäI$I$HäHäI$I$I$I$AÇAÇ8Ä8äA$A$8ä8ã8Ä8ä8ä8ãAEAEHäHäIEIEI$I$QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEYEYEQEQEQEQEQEQEHäHäIEIEI$I$QEQEQEQEA&A&HäHäbŒbŒAÇAÇ@ä@ä0Ä0ä8ä8ã8Ä8ä8Ä8ä9$9$8ä8ãHäHä8ä8ãHäHã@ä@ãHäHã@ä@ãHäHã@ä@ã@ä@ã@ä@ãHäHã@ä@ãjŠjŠI‡I‡@ä@äHäHäI$I$@ã@äI$I$I$I$I$I$HäHäHäHäI$I$A$A$A$A#QEQEA&A&8Ä8äA$A$8ä8ã8Ä8äI$I$8Ä8äIEIEI$I$QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEHäHäQEQEHäHäIEIEI$I$QEQEQEQEA&A&YÇYÇZJbJ@ä@ä0Ä0ã8Ä8ä(ä(ä8Ä8ä0Ä0ã8ä8ãHäHäHäHä@ä@ã@ä@ã@ä@ã@ä@ãHäHã8ä8ã@ä@ãHäHã@ä@ãIEIEjŠjŠ8Ä8äHäHäI$I$I$I$@ã@äI$I$I$I$I$I$HäHäI$I$HäHäI$I$I$I$AÇAÇ8Ä8äA$A$8ä8ã8Ä8ä8ä8ãAEAEHäHäIEIEI$I$QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEYEYEQEQEQEQEQEQEHäHäIEIEI$I$QEQEQEQEA&A&HäHäbŒbŒAÇAÇ@ä@ä0Ä0ä8ä8ã8Ä8ä8Ä8ä9$9$8ä8ãHäHä8ä8ãHäHã@ä@ãHäHã@ä@ãHäHã@ä@ã@ä@ã@ä@ãHäHã@ä@ãjŠjŠI‡I‡@ä@äHäHäI$I$@ã@äI$I$I$I$I$I$HäHäHäHäI$I$A$A$A$A#QEQEA&A&8Ä8äA$A$8ä8ã8Ä8äI$I$8Ä8äIEIEI$I$QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEHäHäQEQEHäHäIEIEI$I$QEQEQEQEA&A&YÇYÇZJbJ@ä@ä0Ä0ã8Ä8ä(ä(ä8Ä8ä0Ä0ã8ä8ãHäHäAGAGAGAGY†Y†I‡I‡I‡I‡AGAGAGAGA&A&A&A&A&A&YÉYÉc/c/R -R -QEQEIEIEA&A&IEIEQEQEA&A&AGAG@å@åAEAE8Ä8äIEIEA&A&ZJbJRRAGAGAGAGI†I†@å@å@å@åIEIE@å@åIEIEI$I$A&A&HäHäA&A&A&A&@å@åA&A&HäHäA&A&QEQEA&A&QEQEI‡I‡I‡I‡A&A&I‡I‡I‡I‡AGAGYÉYÉZÌZÌR -R -AGAGAGAGAGAGAGAG1†1†AGAGAGAGI‡I‡AGAGAGAGYEYEAGAGI‡I‡YÉYÉA&A&A&A&A&A&A&A&I†I†bŒbŒbŒbŒI†I†A&A&IEIEQEQEA&A&QEQEA&A&IEIE8Ä8ä9E9EA&A&I$I$YÉYÉR‹R‹A†A†AGAGI†I†A&A&8Ä8äQEQEIEIEA&A&I$I$@å@åQEQE8æ8æA&A&@å@å@å@åA&A&HäHäAGAGQEQEA&A&YEYEI‡I‡AGAGI‡I‡I‡I‡AGAGI‡I‡bŒbŒbŒbŒAGAG1†1†AGAGAGAG9†9†0æ0æAGAGAGAGAGAGAGAGY†Y†I‡I‡I‡I‡AGAGAGAGA&A&A&A&A&A&YÉYÉc/c/R -R -QEQEIEIEA&A&IEIEQEQEA&A&AGAG@å@åAEAE8Ä8äIEIEA&A&ZJbJRRAGAGAGAGI†I†@å@å@å@åIEIE@å@åIEIEI$I$A&A&HäHäA&A&A&A&@å@åA&A&HäHäA&A&QEQEA&A&QEQEI‡I‡I‡I‡A&A&I‡I‡I‡I‡AGAGYÉYÉZÌZÌR -R -AGAGAGAGAGAGAGAG1†1†AGAGAGAGI‡I‡AGAGAGAGYEYEAGAGI‡I‡YÉYÉA&A&A&A&A&A&A&A&I†I†bŒbŒbŒbŒI†I†A&A&IEIEQEQEA&A&QEQEA&A&IEIE8Ä8ä9E9EA&A&I$I$YÉYÉR‹R‹A†A†AGAGI†I†A&A&8Ä8äQEQEIEIEA&A&I$I$@å@åQEQE8æ8æA&A&@å@å@å@åA&A&HäHäAGAGQEQEA&A&YEYEI‡I‡AGAGI‡I‡I‡I‡AGAGI‡I‡bŒbŒbŒbŒAGAG1†1†AGAGAGAG9†9†0æ0æAGAGAGAGc,c,{oƒpk/k/{.{.{oƒp{oƒpc.c/bŒbŒZJbJZÌZÌk/k/{.{.{Ï{Ïk/k/s-k-jËjË{.{.ƒÐƒÐ{Ï{Ï{oƒp{oƒpsm{m{pƒo{oƒpsÏ{Ï{.{.{.{.ƒÏƒÏ{.{.k-k-bJZJc,c,bŒbŒbŒbŒk-k-rÎjÍk/k/s/k/jÍjÍs/k/jÍjÍrÎjÍc/c/bŒbŒbŒbŒbŒbŒbŒbŒc/c/{oƒp{oƒp{o{oƒp{oƒp{o{oƒp{oƒp{o{o{Ð{Ðk/k/ƒÐƒÐƒÒƒÑƒÒƒÑƒÒƒÑƒÒƒÑ{Ð{Ð{oƒpc/c/k/k/s/k/jÍjÍbŒbŒc/c/bŒbŒZJbJZÌZÌjÍjÍs/k/{oƒp{.{.k/k/k-s-k.k-ƒo{p{Ï{Ï{oƒp{.{.ƒÐƒÐ{.{.{oƒp{Ï{Ï{.{.{.{.{oƒp{o{p{.{.jŠjŠZÌZÌbŒbŒbŒbŒbŒbŒk/k/s/k/c/c/k/k/s/k/jÍjÍrÎjÍjÍjÍc/c/bŒbŒbŒbŒbŒbŒc/c/k/k/ƒo{pƒo{p{oƒoƒÒƒÒk.k/ƒo{pk/s/ƒÑƒÒ{Ð{Ðk/k/ƒÒƒÑk/k/c/c/c/c/c/c/c,c,{oƒpk/k/{.{.{oƒp{oƒpc.c/bŒbŒZJbJZÌZÌk/k/{.{.{Ï{Ïk/k/s-k-jËjË{.{.ƒÐƒÐ{Ï{Ï{oƒp{oƒpsm{m{pƒo{oƒpsÏ{Ï{.{.{.{.ƒÏƒÏ{.{.k-k-bJZJc,c,bŒbŒbŒbŒk-k-rÎjÍk/k/s/k/jÍjÍs/k/jÍjÍrÎjÍc/c/bŒbŒbŒbŒbŒbŒbŒbŒc/c/{oƒp{oƒp{o{oƒp{oƒp{o{oƒp{oƒp{o{o{Ð{Ðk/k/ƒÐƒÐƒÒƒÑƒÒƒÑƒÒƒÑƒÒƒÑ{Ð{Ð{oƒpc/c/k/k/s/k/jÍjÍbŒbŒc/c/bŒbŒZJbJZÌZÌjÍjÍs/k/{oƒp{.{.k/k/k-s-k.k-ƒo{p{Ï{Ï{oƒp{.{.ƒÐƒÐ{.{.{oƒp{Ï{Ï{.{.{.{.{oƒp{o{p{.{.jŠjŠZÌZÌbŒbŒbŒbŒbŒbŒk/k/s/k/c/c/k/k/s/k/jÍjÍrÎjÍjÍjÍc/c/bŒbŒbŒbŒbŒbŒc/c/k/k/ƒo{pƒo{p{oƒoƒÒƒÒk.k/ƒo{pk/s/ƒÑƒÒ{Ð{Ðk/k/ƒÒƒÑk/k/c/c/c/c/c/c/YÇYÇYEYEaÇaÇaÇaÇZJbJ{.{.QEQEI$I$IEIE8Ä8äIEIE8Ä8äA$A$8Ä8äAEAEQEQE8Ä8äA†A†IEIEIEIEQEQEIEIEIEIEIEIE8Ä8äAEAE8ã8äI†I†QEQE8Ä8ä9E9EA&A&AEAEQEQEjŠjŠ{.{.bŒbŒj‰j‰jŠjŠbŒbŒjŠjŠjËjËrÍjÍjËjËrÍjÍjËjËbŒbŒjËjËrÍjÍbŒbŒjŠjŠZZYÉYÉbbbbZZbIbIjIjIbIbIjIjIbIbIjIjIbIbIbIbIjjbJZJrjbŒbŒZZ@å@åIEIEHäHäQEQEQEQE@å@åA$A$A$A$8Ä8äAEAEAEAEI$I$A$A$IEIEQEQEA†A†QEQEIEIEIEIEA&A&@å@å8ã8äA†A†IEIEAEAEHäHäA$A$9E9EQEQEYÇYÇ{oƒpbŒbŒj‰j‰jŠjŠjŠjŠjËjËbŒbŒjËjËrËjËjÍjÍrËjËjËjËrËjËjÍjÍ”2”2s.{.bbYÇYÇYÇYÇYÉYÉbbbbj‰j‰rIjIbbj‰j‰bIbIjIjIrIjIYÇYÇYEYEaÇaÇaÇaÇZJbJ{.{.QEQEI$I$IEIE8Ä8äIEIE8Ä8äA$A$8Ä8äAEAEQEQE8Ä8äA†A†IEIEIEIEQEQEIEIEIEIEIEIE8Ä8äAEAE8ã8äI†I†QEQE8Ä8ä9E9EA&A&AEAEQEQEjŠjŠ{.{.bŒbŒj‰j‰jŠjŠbŒbŒjŠjŠjËjËrÍjÍjËjËrÍjÍjËjËbŒbŒjËjËrÍjÍbŒbŒjŠjŠZZYÉYÉbbbbZZbIbIjIjIbIbIjIjIbIbIjIjIbIbIbIbIjjbJZJrjbŒbŒZZ@å@åIEIEHäHäQEQEQEQE@å@åA$A$A$A$8Ä8äAEAEAEAEI$I$A$A$IEIEQEQEA†A†QEQEIEIEIEIEA&A&@å@å8ã8äA†A†IEIEAEAEHäHäA$A$9E9EQEQEYÇYÇ{oƒpbŒbŒj‰j‰jŠjŠjŠjŠjËjËbŒbŒjËjËrËjËjÍjÍrËjËjËjËrËjËjÍjÍ”2”2s.{.bbYÇYÇYÇYÇYÉYÉbbbbj‰j‰rIjIbbj‰j‰bIbIjIjIrIjIY†Y†A&A&@ä@äI$I$YÉYÉjÍjÍQEQE@ä@ä@ä@ä8Ä8ä(ä(ä8Ä8ä(ä(ä8ä8ã@å@åIEIEHäHä0Ä0äHäHä0Ä0ä0Ä0ã8Ä8ä8Ä8ä8Ä8äA$A$8Ä8ä8Ä8ä9E9EA&A&8ã8ä8Ä8ä8Ä8ä@å@åQEQEbb{.{.Y†Y†QEQEA&A&QEQEQEQEYEYEI‡I‡Y†Y†aÇaÇI‡I‡Y†Y†a†a†{.{.c,c,A&A&QEQEHäHäQEQEHäHäQEQEYDYDQEQEHäHäYEYEYEYEYEYEYEYEYEYEI‡I‡YEYEYEYEI‡I‡YÉYÉI$I$QEQEA&A&HäHä0Ä0ä0Ä0ã(ä(ä8Ä8ä8Ä8ä8ä8ã@å@åAEAE@ä@ä0Ä0ä8Ä8ä8Ä8ä8Ä8ä(ä(ä8Ä8ä8ä8ã8Ä8ä8ä8ã8Ä8äQEQE8Ä8ä8Ä8ä8Ä8ä8Ä8äQEQEYEYEk/k/bIbIQEQEQEQEQEQEQEQEQEQEI‡I‡YEYEaÇaÇI‡I‡Y†Y†Y†Y†jŠjŠ{oƒpbbQEQE@å@åQEQEI$I$I$I$QEQEYEYEHäHäYEYEYEYEYEYEYEYEQEQEY†Y†A&A&@ä@äI$I$YÉYÉjÍjÍQEQE@ä@ä@ä@ä8Ä8ä(ä(ä8Ä8ä(ä(ä8ä8ã@å@åIEIEHäHä0Ä0äHäHä0Ä0ä0Ä0ã8Ä8ä8Ä8ä8Ä8äA$A$8Ä8ä8Ä8ä9E9EA&A&8ã8ä8Ä8ä8Ä8ä@å@åQEQEbb{.{.Y†Y†QEQEA&A&QEQEQEQEYEYEI‡I‡Y†Y†aÇaÇI‡I‡Y†Y†a†a†{.{.c,c,A&A&QEQEHäHäQEQEHäHäQEQEYDYDQEQEHäHäYEYEYEYEYEYEYEYEYEYEI‡I‡YEYEYEYEI‡I‡YÉYÉI$I$QEQEA&A&HäHä0Ä0ä0Ä0ã(ä(ä8Ä8ä8Ä8ä8ä8ã@å@åAEAE@ä@ä0Ä0ä8Ä8ä8Ä8ä8Ä8ä(ä(ä8Ä8ä8ä8ã8Ä8ä8ä8ã8Ä8äQEQE8Ä8ä8Ä8ä8Ä8ä8Ä8äQEQEYEYEk/k/bIbIQEQEQEQEQEQEQEQEQEQEI‡I‡YEYEaÇaÇI‡I‡Y†Y†Y†Y†jŠjŠ{oƒpbbQEQE@å@åQEQEI$I$I$I$QEQEYEYEHäHäYEYEYEYEYEYEYEYEQEQEY†Y†AGAGI$I$@å@åbbbŒbŒY†Y†8Ä8ä8Ä8ä0Ä0ã(ä(ä(ä(ä8Ä8ä8Ä8ä8Ä8äAEAE0Ä0ä8ä8ã8Ä8ä(ä(ä0Ä0ä8Ä8ä(ä(ä0å0å8Ä8ä0Ä0ãA$A$0å0åAEAEHäHä0Ä0ã9$9$8Ä8äI$I$jjs/k/QÇQÇYEYEAGAGQEQEI‡I‡aÇaÇAGAGY†Y†YÉYÉY†Y†YÉYÉaÇaÇ{,{,jÍjÍAGAGQEQEQEQEA&A&QEQEQEQE@å@åQEQEYEYEQEQEQEQEYEYEI‡I‡YEYEa†a†Y†Y†QEQEAGAGZZHäHäQEQEI$I$I$I$(ä(ä8Ä8ä0Ä0ã(ä(ä(ä(ä8Ä8äIEIE8Ä8ä0Ä0ã8Ä8ä8Ä8ä(ä(ä8Ä8ä(ä(ä8Ä8ä8Ä8ä9$9$8Ä8ä9$9$9E9E@ä@ä8Ä8ä9$9$8Ä8ä@å@åY†Y†k/k/bbYEYEAGAGA&A&YEYEI‡I‡aÇaÇI‡I‡aÇaÇI‡I‡Y†Y†YÉYÉjIjIƒo{pI‡I‡YEYEA&A&QEQEA&A&AGAGQEQEQEQEQEQEYEYEI‡I‡YEYEYEYEI‡I‡Y†Y†AGAGI$I$@å@åbbbŒbŒY†Y†8Ä8ä8Ä8ä0Ä0ã(ä(ä(ä(ä8Ä8ä8Ä8ä8Ä8äAEAE0Ä0ä8ä8ã8Ä8ä(ä(ä0Ä0ä8Ä8ä(ä(ä0å0å8Ä8ä0Ä0ãA$A$0å0åAEAEHäHä0Ä0ã9$9$8Ä8äI$I$jjs/k/QÇQÇYEYEAGAGQEQEI‡I‡aÇaÇAGAGY†Y†YÉYÉY†Y†YÉYÉaÇaÇ{,{,jÍjÍAGAGQEQEQEQEA&A&QEQEQEQE@å@åQEQEYEYEQEQEQEQEYEYEI‡I‡YEYEa†a†Y†Y†QEQEAGAGZZHäHäQEQEI$I$I$I$(ä(ä8Ä8ä0Ä0ã(ä(ä(ä(ä8Ä8äIEIE8Ä8ä0Ä0ã8Ä8ä8Ä8ä(ä(ä8Ä8ä(ä(ä8Ä8ä8Ä8ä9$9$8Ä8ä9$9$9E9E@ä@ä8Ä8ä9$9$8Ä8ä@å@åY†Y†k/k/bbYEYEAGAGA&A&YEYEI‡I‡aÇaÇI‡I‡aÇaÇI‡I‡Y†Y†YÉYÉjIjIƒo{pI‡I‡YEYEA&A&QEQEA&A&AGAGQEQEQEQEQEQEYEYEI‡I‡YEYEYEYEI‡I‡Y†Y†A&A&@å@å8Ä8äZZk/k/YEYE8Ä8ä8Ä8ä(ä(ä(ä(ä0Ä0ã(ä(ä8Ä8ä8Ä8äIEIE8Ä8ä8Ä8ä8Ä8ä8Ä8ä(ä(ä8Ä8ä(ä(ä9$9$8Ä8ä9$9$8Ä8ä9E9E@å@åHäHä(ä(ä8Ä8ä8Ä8äIEIEbbc/c/YÉYÉY†Y†I‡I‡YEYEI‡I‡AGAGY†Y†aÇaÇI‡I‡aÇaÇI‡I‡aÇaÇ{.{.jÍjÍQEQEQEQE@å@å9E9EA&A&AGAGAGAGAGAGQEQEQEQEAGAGQEQEI‡I‡YÉYÉY†Y†YÉYÉYEYEYÉYÉbb@ä@äQEQEHäHä8Ä8ä(ä(ä8Ä8ä(ä(ä(Ä(Ã8Ä8ä8Ä8äA&A&8ã8ä@å@åA$A$0Ä0ä0Ä0ä(ä(ä8Ä8ä1†1†0Ã0ä8Ä8ä9$9$0å0åIEIE8Ä8ä8Ä8ä(ä(ä8Ä8äIEIEQEQEk/k/bJZJY†Y†I‡I‡YEYEAGAGI‡I‡YEYEI‡I‡aÇaÇI‡I‡YÉYÉYEYEjŠjŠƒÒƒÑI‡I‡YEYEA&A&IEIE9E9EAGAGQEQEA&A&I‡I‡YEYEI‡I‡I‡I‡YEYEI‡I‡Y†Y†A&A&@å@å8Ä8äZZk/k/YEYE8Ä8ä8Ä8ä(ä(ä(ä(ä0Ä0ã(ä(ä8Ä8ä8Ä8äIEIE8Ä8ä8Ä8ä8Ä8ä8Ä8ä(ä(ä8Ä8ä(ä(ä9$9$8Ä8ä9$9$8Ä8ä9E9E@å@åHäHä(ä(ä8Ä8ä8Ä8äIEIEbbc/c/YÉYÉY†Y†I‡I‡YEYEI‡I‡AGAGY†Y†aÇaÇI‡I‡aÇaÇI‡I‡aÇaÇ{.{.jÍjÍQEQEQEQE@å@å9E9EA&A&AGAGAGAGAGAGQEQEQEQEAGAGQEQEI‡I‡YÉYÉY†Y†YÉYÉYEYEYÉYÉbb@ä@äQEQEHäHä8Ä8ä(ä(ä8Ä8ä(ä(ä(Ä(Ã8Ä8ä8Ä8äA&A&8ã8ä@å@åA$A$0Ä0ä0Ä0ä(ä(ä8Ä8ä1†1†0Ã0ä8Ä8ä9$9$0å0åIEIE8Ä8ä8Ä8ä(ä(ä8Ä8äIEIEQEQEk/k/bJZJY†Y†I‡I‡YEYEAGAGI‡I‡YEYEI‡I‡aÇaÇI‡I‡YÉYÉYEYEjŠjŠƒÒƒÑI‡I‡YEYEA&A&IEIE9E9EAGAGQEQEA&A&I‡I‡YEYEI‡I‡I‡I‡YEYEI‡I‡QÇQÇY†Y†@å@å9E9Ejjc/c/YEYE8Ä8ä8Ä8ä(ä(ä(ä(ä(ä(ä8Ä8ä0Ä0ã8Ä8ä8Ä8ä9$9$8Ä8ä9$9$(ä(ä8Ä8ä(ä(ä8Ä8ä1$1$8Ä8ä0å0å8Ä8äA$A$IEIE8Ä8ä8Ä8ä8Ä8äA$A$A&A&YÇYÇjÍjÍqÇiÇI‡I‡aÇaÇI‡I‡AGAGYEYEI‡I‡I‡I‡aÇaÇI‡I‡I‡I‡a†a†jÍjÍbŒbŒA$A$0æ0æ!$!$(ä(ä å å0æ0æ9$9$0å0åA&A&AGAGYEYEAGAGYEYEI‡I‡YÉYÉI‡I‡AGAGZZZJbJHäHäI$I$@å@å@ä@ä0Ä0ã(ä(ä(ä(ä(ä(ä8Ä8ä(ä(ä@å@å8ã8ä8Ä8ä8Ä8ä8Ä8ä(ä(ä0Ä0ã8Ä8ä(ä(ä8Ä8ä8Ä8ä8Ä8ä8Ä8äIEIE8Ä8äA$A$8Ä8ä8Ä8ä9E9EQEQEjÍjÍbbjjI‡I‡I‡I‡YEYEI‡I‡AGAGaÇaÇI‡I‡I‡I‡Y†Y†YÉYÉjjƒo{pAFAG9E9E å å(å(å(ä(ä(å(å0æ0æ9E9E0å0åAGAGbbA&A&AGAGZZQÇQÇY†Y†@å@å9E9Ejjc/c/YEYE8Ä8ä8Ä8ä(ä(ä(ä(ä(ä(ä8Ä8ä0Ä0ã8Ä8ä8Ä8ä9$9$8Ä8ä9$9$(ä(ä8Ä8ä(ä(ä8Ä8ä1$1$8Ä8ä0å0å8Ä8äA$A$IEIE8Ä8ä8Ä8ä8Ä8äA$A$A&A&YÇYÇjÍjÍqÇiÇI‡I‡aÇaÇI‡I‡AGAGYEYEI‡I‡I‡I‡aÇaÇI‡I‡I‡I‡a†a†jÍjÍbŒbŒA$A$0æ0æ!$!$(ä(ä å å0æ0æ9$9$0å0åA&A&AGAGYEYEAGAGYEYEI‡I‡YÉYÉI‡I‡AGAGZZZJbJHäHäI$I$@å@å@ä@ä0Ä0ã(ä(ä(ä(ä(ä(ä8Ä8ä(ä(ä@å@å8ã8ä8Ä8ä8Ä8ä8Ä8ä(ä(ä0Ä0ã8Ä8ä(ä(ä8Ä8ä8Ä8ä8Ä8ä8Ä8äIEIE8Ä8äA$A$8Ä8ä8Ä8ä9E9EQEQEjÍjÍbbjjI‡I‡I‡I‡YEYEI‡I‡AGAGaÇaÇI‡I‡I‡I‡Y†Y†YÉYÉjjƒo{pAFAG9E9E å å(å(å(ä(ä(å(å0æ0æ9E9E0å0åAGAGbbA&A&AGAGZZQÇQÇI‡I‡A&A&HãHäbbc/c/YEYE@ä@ä@ä@ä0Ä0ã(ä(ä(Ä(Ã0Ä0ä0Ä0ä8ä8ã@å@å0Ã0ä8ã8ä8Ä8ä8ä8ã8Ä8ä8ä8ã8Ä8ä8Ä8äA$A$8ä8ã0Ä0ä8ä8ã@å@åHäHä0Ä0ã8ä8ã8ä8ãI$I$YÉYÉbŒbŒaÇaÇbbI‡I‡I‡I‡aÇaÇI‡I‡I‡I‡YÉYÉaÇaÇI‡I‡YÉYÉY†Y†jŠjŠR -R -(ä(ä9E9E8æ8æ å å å å!$!$(å(å!$!$(ä(ä8Ä8äA&A&A†A†AGAGY†Y†I†I†I‡I‡YÇYÇbbR -R -0Ä0äHäHä8Ä8à ä ã(Ä(Ã0Ä0ã(Ä(Ä(Ä(Ã@ä@ä0Ä0ä8ä8ãHäHä1$1$8ä8ã0Ä0ã8Ä8ä8ä8ã8Ä8ä8ä8ã@å@åA$A$0Ä0ã0Ä0ã@å@åI$I$0Ã0ä0Ã0ä8ã8äI$I$QEQEbŒbŒbIbIYÉYÉiÇiÇI‡I‡I‡I‡I‡I‡YÉYÉI‡I‡aÇaÇI‡I‡YÉYÉaÇaÇbb{oƒp0æ0æ0å0å0æ0æ(å(å å å å å!$!$ å å ä ä0Ä0äA†A†8Ä8ä8Ä8äAGAGQÇQÇI‡I‡A&A&HãHäbbc/c/YEYE@ä@ä@ä@ä0Ä0ã(ä(ä(Ä(Ã0Ä0ä0Ä0ä8ä8ã@å@å0Ã0ä8ã8ä8Ä8ä8ä8ã8Ä8ä8ä8ã8Ä8ä8Ä8äA$A$8ä8ã0Ä0ä8ä8ã@å@åHäHä0Ä0ã8ä8ã8ä8ãI$I$YÉYÉbŒbŒaÇaÇbbI‡I‡I‡I‡aÇaÇI‡I‡I‡I‡YÉYÉaÇaÇI‡I‡YÉYÉY†Y†jŠjŠR -R -(ä(ä9E9E8æ8æ å å å å!$!$(å(å!$!$(ä(ä8Ä8äA&A&A†A†AGAGY†Y†I†I†I‡I‡YÇYÇbbR -R -0Ä0äHäHä8Ä8à ä ã(Ä(Ã0Ä0ã(Ä(Ä(Ä(Ã@ä@ä0Ä0ä8ä8ãHäHä1$1$8ä8ã0Ä0ã8Ä8ä8ä8ã8Ä8ä8ä8ã@å@åA$A$0Ä0ã0Ä0ã@å@åI$I$0Ã0ä0Ã0ä8ã8äI$I$QEQEbŒbŒbIbIYÉYÉiÇiÇI‡I‡I‡I‡I‡I‡YÉYÉI‡I‡aÇaÇI‡I‡YÉYÉaÇaÇbb{oƒp0æ0æ0å0å0æ0æ(å(å å å å å!$!$ å å ä ä0Ä0äA†A†8Ä8ä8Ä8äAGAGQÇQÇI‡I‡AGAGI‡I‡ZJbJc/c/ZJbJI‡I‡AGAGAGAG0æ0æ9E9E8æ8æ9E9E(ä(ä8Ä8ä(ä(ä(ä(ä1†1†0å0å9E9E0æ0æ9$9$9†9†AGAG0æ0æ0æ0æI‡I‡AGAGAÇAÇAGAGI‡I‡JJI‡I‡bŒbŒbŒbŒJJI‡I‡I†I†I‡I‡AGAGQÇQÇAGAGAGAGAGAGI†I†A&A&AGAG{oƒp{.{.0æ0æ9†9†AGAGI†I†AGAGAGAGAGAGAGAGQEQEI†I†ZZbbI‡I‡R -R -bJZJbbZJbJk/k/ƒo{pR -R -JJBBI‡I‡0æ0æAGAG0æ0æ0æ0æ9E9E(å(å8Ä8ä(ä(ä(ä(ä(ä(ä9E9E0å0å0å0å9E9E0æ0æAGAGA†A†8æ8æ9†9†AGAGAGAGAÇAÇAGAGR -R -I‡I‡R -R -ZÌZÌR -R -AGAGAGAGQÇQÇI‡I‡I‡I‡YEYEI‡I‡I‡I‡I‡I‡A&A&A&A&bbƒÒƒÑAÇAÇ9E9EAÇAÇI‡I‡AGAGQEQEA&A&AGAGY†Y†AGAGI†I†I‡I‡AÇAÇI‡I‡QÇQÇI‡I‡AGAGI‡I‡ZJbJc/c/ZJbJI‡I‡AGAGAGAG0æ0æ9E9E8æ8æ9E9E(ä(ä8Ä8ä(ä(ä(ä(ä1†1†0å0å9E9E0æ0æ9$9$9†9†AGAG0æ0æ0æ0æI‡I‡AGAGAÇAÇAGAGI‡I‡JJI‡I‡bŒbŒbŒbŒJJI‡I‡I†I†I‡I‡AGAGQÇQÇAGAGAGAGAGAGI†I†A&A&AGAG{oƒp{.{.0æ0æ9†9†AGAGI†I†AGAGAGAGAGAGAGAGQEQEI†I†ZZbbI‡I‡R -R -bJZJbbZJbJk/k/ƒo{pR -R -JJBBI‡I‡0æ0æAGAG0æ0æ0æ0æ9E9E(å(å8Ä8ä(ä(ä(ä(ä(ä(ä9E9E0å0å0å0å9E9E0æ0æAGAGA†A†8æ8æ9†9†AGAGAGAGAÇAÇAGAGR -R -I‡I‡R -R -ZÌZÌR -R -AGAGAGAGQÇQÇI‡I‡I‡I‡YEYEI‡I‡I‡I‡I‡I‡A&A&A&A&bbƒÒƒÑAÇAÇ9E9EAÇAÇI‡I‡AGAGQEQEA&A&AGAGY†Y†AGAGI†I†I‡I‡AÇAÇI‡I‡{,{,{,{,jÍjÍjŠjŠjÍjÍ{,{,bŒbŒbbZÌZÌZJbJZJbJR -R -ZIZIZJbJZJbJk/k/ZÌZÌZJbJZJbJbbZJbJRŠRŠbŒbŒjŠjŠZJbJbŒbŒc,c,jËjËs/k/{oƒpk-k-c,c,jÍjÍbŒbŒc,c,jËjËc,c,ZJbJZJbJRRZJbJZJbJZJbJR‹R‹bŒbŒbŒbŒbŒbŒjËjË{.{.{Ï{Ï{.{.{.{.{.{.{,{,{,{,{,{,{oƒp‹Ï“Ï{oƒp{o{oƒp{o“ЋЃЃÐk-k-ƒp{o{,{,jÍjÍ{,{,{,{,{.{.jÍjÍR -R -bJZJbŒbŒRŠRŠbIbIZIZIR‹R‹ZJbJk.k-ZÌZÌbŒbŒZJbJbbbŒbŒZJbJZJbJRŠRŠjŠjŠZJbJZÌZÌk-k-s.k-k/k/ƒo{pc,c,bŒbŒk-k-bŒbŒjËjËs-k-jŠjŠR‹R‹YÉYÉR -R -R‹R‹ZJbJZJbJZJbJZJbJZÌZÌbŒbŒk/k/ƒo{p{Ï{Ï{.{.k/k/{,{,jËjË{.{.{oƒp{oƒp{o{oƒp{oƒp{o“Ï‹Ï{oƒp{.{.{,{,{,{,jÍjÍjŠjŠjÍjÍ{,{,bŒbŒbbZÌZÌZJbJZJbJR -R -ZIZIZJbJZJbJk/k/ZÌZÌZJbJZJbJbbZJbJRŠRŠbŒbŒjŠjŠZJbJbŒbŒc,c,jËjËs/k/{oƒpk-k-c,c,jÍjÍbŒbŒc,c,jËjËc,c,ZJbJZJbJRRZJbJZJbJZJbJR‹R‹bŒbŒbŒbŒbŒbŒjËjË{.{.{Ï{Ï{.{.{.{.{.{.{,{,{,{,{,{,{oƒp‹Ï“Ï{oƒp{o{oƒp{o“ЋЃЃÐk-k-ƒp{o{,{,jÍjÍ{,{,{,{,{.{.jÍjÍR -R -bJZJbŒbŒRŠRŠbIbIZIZIR‹R‹ZJbJk.k-ZÌZÌbŒbŒZJbJbbbŒbŒZJbJZJbJRŠRŠjŠjŠZJbJZÌZÌk-k-s.k-k/k/ƒo{pc,c,bŒbŒk-k-bŒbŒjËjËs-k-jŠjŠR‹R‹YÉYÉR -R -R‹R‹ZJbJZJbJZJbJZJbJZÌZÌbŒbŒk/k/ƒo{p{Ï{Ï{.{.k/k/{,{,jËjË{.{.{oƒp{oƒp{o{oƒp{oƒp{o“Ï‹Ï{oƒp{.{.8Ä8äA&A&HäHäQEQEHäHäQEQE@å@å8Ä8äAEAE@å@åAEAEHäHäAEAEQEQEbbR‹R‹QEQEY†Y†QEQEYEYEYEYEQEQEQEQEQEQEAEAEIEIEQEQEAEAEI‡I‡bŒbŒbbAGAGQEQEI†I†AGAGI$I$A&A&I$I$A&A&IEIE@å@åA†A†AGAGQEQEY†Y†I‡I‡QÇQÇY†Y†I‡I‡QÇQÇI†I†YÇYÇI‡I‡I‡I‡QÇQÇYÇYÇaÇaÇYÉYÉZJbJQÇQÇYEYEQÇQÇQEQEAGAGQEQEHäHäYEYEI$I$QEQEQEQEA&A&HäHä8Ä8äAEAE@å@åAEAE@å@åQEQEY†Y†bŒbŒQÇQÇIEIEYEYEQEQEQEQEYEYEQEQEYEYEIEIEIEIEIEIEIEIEQEQER‹R‹bIbII‡I‡YEYEI†I†AGAGI$I$A&A&QEQEA&A&AEAEAEAEIEIEA&A&I†I†AGAGQÇQÇY†Y†QÇQÇI‡I‡I†I†Y†Y†I‡I‡I‡I‡I‡I‡QÇQÇYÇYÇaÇaÇI‡I‡bŒbŒaÇaÇQEQEIEIE8Ä8ä9$9$8ä8ÄA&A&HäHäQEQEHäHäQEQE@å@å8Ä8äAEAE@å@åAEAEHäHäAEAEQEQEbbR‹R‹QEQEY†Y†QEQEYEYEYEYEQEQEQEQEQEQEAEAEIEIEQEQEAEAEI‡I‡bŒbŒbbAGAGQEQEI†I†AGAGI$I$A&A&I$I$A&A&IEIE@å@åA†A†AGAGQEQEY†Y†I‡I‡QÇQÇY†Y†I‡I‡QÇQÇI†I†YÇYÇI‡I‡I‡I‡QÇQÇYÇYÇaÇaÇYÉYÉZJbJQÇQÇYEYEQÇQÇQEQEAGAGQEQEHäHäYEYEI$I$QEQEQEQEA&A&HäHä8Ä8äAEAE@å@åAEAE@å@åQEQEY†Y†bŒbŒQÇQÇIEIEYEYEQEQEQEQEYEYEQEQEYEYEIEIEIEIEIEIEIEIEQEQER‹R‹bIbII‡I‡YEYEI†I†AGAGI$I$A&A&QEQEA&A&AEAEAEAEIEIEA&A&I†I†AGAGQÇQÇY†Y†QÇQÇI‡I‡I†I†Y†Y†I‡I‡I‡I‡I‡I‡QÇQÇYÇYÇaÇaÇI‡I‡bŒbŒaÇaÇQEQEIEIE8Ä8ä9$9$8Ä8ä9E9EA&A&@å@åAEAE@å@å8Ä8äAEAE8Ä8ä8Ä8ä9E9E8Ä8äQEQEA&A&jjrÍjÍI‡I‡YEYEYEYEY†Y†I‡I‡YEYEa†a†YÇYÇI†I†I‡I‡Y†Y†AGAGAÇAÇk-k-YÇYÇAGAGAGAG@å@åQEQE@å@åIEIEA&A&@å@å9E9E@å@åA&A&IEIEIEIEA&A&QEQEA&A&AGAGQEQE@å@åA&A&9E9EIEIEA&A&A&A&AGAGYEYEaÇaÇYÉYÉQEQEY†Y†A&A&AGAGQEQEQEQEQEQE@å@å@å@åA&A&@ä@ä8Ä8ä@å@å9$9$0å0å8Ä8äIEIE8Ä8äI†I†Y†Y†jÍjÍZZYEYEa†a†YEYEY†Y†Y†Y†Y†Y†YÇYÇY†Y†AGAGQÇQÇI†I†A&A&ZÌZÌjIjII‡I‡AGAG@å@åIEIEA&A&A&A&@å@åAEAE@å@å8Ä8äIEIEA&A&A&A&QEQEA&A&QEQEA&A&AGAGQEQEA&A&0å0å8Ä8ä9E9EA&A&A&A&YEYEY†Y†bbI‡I‡YEYE@å@å0å0å8Ä8ä8ä8Ä9E9EA&A&@å@åAEAE@å@å8Ä8äAEAE8Ä8ä8Ä8ä9E9E8Ä8äQEQEA&A&jjrÍjÍI‡I‡YEYEYEYEY†Y†I‡I‡YEYEa†a†YÇYÇI†I†I‡I‡Y†Y†AGAGAÇAÇk-k-YÇYÇAGAGAGAG@å@åQEQE@å@åIEIEA&A&@å@å9E9E@å@åA&A&IEIEIEIEA&A&QEQEA&A&AGAGQEQE@å@åA&A&9E9EIEIEA&A&A&A&AGAGYEYEaÇaÇYÉYÉQEQEY†Y†A&A&AGAGQEQEQEQEQEQE@å@å@å@åA&A&@ä@ä8Ä8ä@å@å9$9$0å0å8Ä8äIEIE8Ä8äI†I†Y†Y†jÍjÍZZYEYEa†a†YEYEY†Y†Y†Y†Y†Y†YÇYÇY†Y†AGAGQÇQÇI†I†A&A&ZÌZÌjIjII‡I‡AGAG@å@åIEIEA&A&A&A&@å@åAEAE@å@å8Ä8äIEIEA&A&A&A&QEQEA&A&QEQEA&A&AGAGQEQEA&A&0å0å8Ä8ä9E9EA&A&A&A&YEYEY†Y†bbI‡I‡YEYE@å@å0å0å8Ä8ä8Ä8ä8Ä8äA$A$@å@å9$9$@å@å(ä(ä9E9E@å@å8Ä8ä9E9EA&A&A&A&QEQEZJbJZJbJAEAEYEYEa†a†Y†Y†a†a†a†a†aÇaÇaÇaÇI‡I‡Y†Y†AÇAÇAGAGAÇAÇbŒbŒZZQEQEA&A&IEIE@å@å9E9E@å@å9E9E@å@å9E9EA&A&9E9EA&A&QEQEA&A&IEIEA&A&AGAGQEQE@å@åA†A†A&A&A&A&A&A&IEIEA&A&YEYEYÉYÉI‡I‡Y†Y†YEYEI‡I‡QEQEAGAGQEQEA&A&A&A&8Ä8ä8Ä8äIEIE(ä(ä0å0åIEIE8Ä8ä9E9E@å@åIEIEA&A&aÇaÇbŒbŒAGAGQEQEa†a†Y†Y†Y†Y†a†a†a†a†aÇaÇI‡I‡QÇQÇI†I†I‡I‡A†A†ZJbJZJbJAGAGQEQEA&A&IEIE@å@åA$A$9E9EA&A&8Ä8äA&A&9E9EA&A&QEQEA&A&QEQEA&A&QEQEA&A&IEIEA&A&A&A&9$9$A&A&A&A&QEQEAGAGYEYEbbI‡I‡YEYEAGAGIEIE@å@å8ä8Ä8ä8ÄA$A$@å@å9$9$@å@å(ä(ä9E9E@å@å8Ä8ä9E9EA&A&A&A&QEQEZJbJZJbJAEAEYEYEa†a†Y†Y†a†a†a†a†aÇaÇaÇaÇI‡I‡Y†Y†AÇAÇAGAGAÇAÇbŒbŒZZQEQEA&A&IEIE@å@å9E9E@å@å9E9E@å@å9E9EA&A&9E9EA&A&QEQEA&A&IEIEA&A&AGAGQEQE@å@åA†A†A&A&A&A&A&A&IEIEA&A&YEYEYÉYÉI‡I‡Y†Y†YEYEI‡I‡QEQEAGAGQEQEA&A&A&A&8Ä8ä8Ä8äIEIE(ä(ä0å0åIEIE8Ä8ä9E9E@å@åIEIEA&A&aÇaÇbŒbŒAGAGQEQEa†a†Y†Y†Y†Y†a†a†a†a†aÇaÇI‡I‡QÇQÇI†I†I‡I‡A†A†ZJbJZJbJAGAGQEQEA&A&IEIE@å@åA$A$9E9EA&A&8Ä8äA&A&9E9EA&A&QEQEA&A&QEQEA&A&QEQEA&A&IEIEA&A&A&A&9$9$A&A&A&A&QEQEAGAGYEYEbbI‡I‡YEYEAGAGIEIE@å@å8Ä8ä9$9$0æ0æ8Ä8ä9E9E8Ä8ä8Ä8ä9E9E0å0å9E9E8å8å@å@å8Ä8äIEIEbbZÌZÌ@å@åY…Y…a†a†Y†Y†a†a†aÇaÇa†a†aÇaÇaÇaÇAGAGI‡I‡9†9†YÉYÉbŒbŒQÇQÇAGAGQEQE@å@åA&A&9E9E@å@å@å@å9E9EA&A&8Ä8äIEIEA&A&A&A&IEIEA&A&IEIEA&A&AGAGA&A&8Ä8äAGAGAEAEA&A&A&A&QEQEA&A&a†a†ZJbJAGAGQEQEA&A&QEQEAGAGA&A&QEQE8å8åA&A&8Ä8ä0å0å8Ä8ä8Ä8ä9E9E@å@å0å0å9E9E@å@å@å@åAGAGk-k-AGAGQ…Q…a†a†YEYEaÇaÇa†a†aÇaÇaÇaÇa†a†I‡I‡QÇQÇA&A&AÇAÇbŒbŒbbAGAGA&A&A&A&A&A&AEAE@å@å@å@å9E9E@å@å9E9EA&A&A&A&QEQEA&A&IEIEA&A&A&A&I†I†A&A&@å@å9E9E(ä(äA&A&AGAGA&A&QEQEYEYER -R -I‡I‡YEYEA&A&8Ä8ä8Ä8ä8ä8Ä9$9$0æ0æ8Ä8ä9E9E8Ä8ä8Ä8ä9E9E0å0å9E9E8å8å@å@å8Ä8äIEIEbbZÌZÌ@å@åY…Y…a†a†Y†Y†a†a†aÇaÇa†a†aÇaÇaÇaÇAGAGI‡I‡9†9†YÉYÉbŒbŒQÇQÇAGAGQEQE@å@åA&A&9E9E@å@å@å@å9E9EA&A&8Ä8äIEIEA&A&A&A&IEIEA&A&IEIEA&A&AGAGA&A&8Ä8äAGAGAEAEA&A&A&A&QEQEA&A&a†a†ZJbJAGAGQEQEA&A&QEQEAGAGA&A&QEQE8å8åA&A&8Ä8ä0å0å8Ä8ä8Ä8ä9E9E@å@å0å0å9E9E@å@å@å@åAGAGk-k-AGAGQ…Q…a†a†YEYEaÇaÇa†a†aÇaÇaÇaÇa†a†I‡I‡QÇQÇA&A&AÇAÇbŒbŒbbAGAGA&A&A&A&A&A&AEAE@å@å@å@å9E9E@å@å9E9EA&A&A&A&QEQEA&A&IEIEA&A&A&A&I†I†A&A&@å@å9E9E(ä(äA&A&AGAGA&A&QEQEYEYER -R -I‡I‡YEYEA&A&8Ä8ä8Ä8ä8Ä8ä(ä(äA$A$0å0å8Ä8ä9E9E8Ä8ä8Ä8ä0å0å@å@å9E9E8Ä8äIEIEA&A&JJbŒbŒYÇYÇa†a†jjrjzzzzzzzzjjAGAGQÇQÇA&A&JJZJbJAGAGQEQEA&A&9E9EIEIE8å8å@å@å9E9E8å8åA&A&IEIE@å@å9E9EA&A&QEQEA&A&A&A&AGAG@å@åAEAEIEIE@å@å9E9E@å@åIEIEA&A&YEYEaÇaÇR -R -YEYEI‡I‡A&A&QEQEAGAGQEQE@å@å@ä@ä8Ä8ä8Ä8ä9E9E8Ä8ä9E9E0å0å8Ä8ä9E9E8å8å8Ä8äIEIEAGAGbŒbŒZZaÇaÇiÇiÇrjzzzzzzzzjjI‡I‡AGAGI†I†AGAGbŒbŒI‡I‡I†I†AGAGIEIE@å@å@å@å9E9E0å0åA&A&8Ä8äIEIE9E9EA&A&A&A&IEIEA&A&IEIEA&A&A&A&IEIE0å0å@å@å8Ä8ä9E9EA&A&QEQEA&A&a†a†ZJbJYÉYÉQEQE@å@å8Ä8äA$A$8ä8Ä(ä(äA$A$0å0å8Ä8ä9E9E8Ä8ä8Ä8ä0å0å@å@å9E9E8Ä8äIEIEA&A&JJbŒbŒYÇYÇa†a†jjrjzzzzzzzzjjAGAGQÇQÇA&A&JJZJbJAGAGQEQEA&A&9E9EIEIE8å8å@å@å9E9E8å8åA&A&IEIE@å@å9E9EA&A&QEQEA&A&A&A&AGAG@å@åAEAEIEIE@å@å9E9E@å@åIEIEA&A&YEYEaÇaÇR -R -YEYEI‡I‡A&A&QEQEAGAGQEQE@å@å@ä@ä8Ä8ä8Ä8ä9E9E8Ä8ä9E9E0å0å8Ä8ä9E9E8å8å8Ä8äIEIEAGAGbŒbŒZZaÇaÇiÇiÇrjzzzzzzzzjjI‡I‡AGAGI†I†AGAGbŒbŒI‡I‡I†I†AGAGIEIE@å@å@å@å9E9E0å0åA&A&8Ä8äIEIE9E9EA&A&A&A&IEIEA&A&IEIEA&A&A&A&IEIE0å0å@å@å8Ä8ä9E9EA&A&QEQEA&A&a†a†ZJbJYÉYÉQEQE@å@å8Ä8äA$A$8Ä8äA$A$8Ä8ä8Ä8äA$A$8Ä8ä0Ä0ä1$1$8Ä8ä8Ä8äA$A$9E9EA&A&QEQEYÉYÉbŒbŒAÇAÇY†Y†A&A&AGAGYÉYÉjjI‡I‡Y†Y†I‡I‡8Ä8ä0æ0æ9E9EJJR -R -QEQEA&A&IEIE@å@å@å@å9E9E0å0å@å@å8Ä8äA$A$0å0åIEIEA&A&I$I$A&A&QEQEA&A&IEIEA&A&8Ä8äIEIE@å@å0å0åIEIEA&A&QEQEQEQEYÉYÉjËjËAGAGQEQEQEQEA&A&QEQEA&A&QEQEA&A&@å@å8ã8äAEAE0Ä0ä0Ä0ä0Ä0ã9E9E8Ä8äA&A&AEAEQEQEAGAGbŒbŒYÉYÉAÇAÇQEQEA&A&YÉYÉYÉYÉYÉYÉY†Y†I‡I‡QEQE(ä(ä9E9EAGAGR‹R‹I†I†A&A&QEQE8Ä8äIEIE0å0å8Ä8ä@å@åA$A$9E9E@å@å@å@å9E9EI$I$A&A&QEQEA&A&QEQEA&A&8Ä8ä@å@åA$A$9E9EA&A&IEIEA&A&QEQEYEYEZJbJYÉYÉQEQEQEQE8Ä8ä8Ä8ä8ä8ÄA$A$8Ä8ä8Ä8äA$A$8Ä8ä0Ä0ä1$1$8Ä8ä8Ä8äA$A$9E9EA&A&QEQEYÉYÉbŒbŒAÇAÇY†Y†A&A&AGAGYÉYÉjjI‡I‡Y†Y†I‡I‡8Ä8ä0æ0æ9E9EJJR -R -QEQEA&A&IEIE@å@å@å@å9E9E0å0å@å@å8Ä8äA$A$0å0åIEIEA&A&I$I$A&A&QEQEA&A&IEIEA&A&8Ä8äIEIE@å@å0å0åIEIEA&A&QEQEQEQEYÉYÉjËjËAGAGQEQEQEQEA&A&QEQEA&A&QEQEA&A&@å@å8ã8äAEAE0Ä0ä0Ä0ä0Ä0ã9E9E8Ä8äA&A&AEAEQEQEAGAGbŒbŒYÉYÉAÇAÇQEQEA&A&YÉYÉYÉYÉYÉYÉY†Y†I‡I‡QEQE(ä(ä9E9EAGAGR‹R‹I†I†A&A&QEQE8Ä8äIEIE0å0å8Ä8ä@å@åA$A$9E9E@å@å@å@å9E9EI$I$A&A&QEQEA&A&QEQEA&A&8Ä8ä@å@åA$A$9E9EA&A&IEIEA&A&QEQEYEYEZJbJYÉYÉQEQEQEQE8Ä8ä8Ä8äAÇAÇAGAGI‡I‡BB0æ0æAÇAÇAGAGAÇAÇAÇAÇAÇAÇAGAGAGAGAGAGI‡I‡R‹R‹ZJbJ å å å å!$!$ Ä Ä ÄÄ0æ0æAGAG å åAGAGR‹R‹R -R -R -R -R‹R‹bŒbŒAÇAÇAGAGAGAGAÇAÇAGAGAGAG8æ8æ9E9E8æ8æ0æ0æAGAGAÇAÇAGAGAGAGAGAGAGAGAGAGA&A&I†I†A&A&AGAGA&A&A&A&AGAGI‡I‡YÉYÉI‡I‡jjs/k/ZJbJYÉYÉR -R -YÉYÉYÉYÉYÉYÉYÉYÉI‡I‡A&A&A&A&0æ0æ9†9†9E9EA&A&0æ0æAGAGA†A†AGAGAGAGZJbJk/k/JJ ä ä ÄÄ ä ä ÄÄ(ä(ä0æ0æ0æ0æ1†1†BBbŒbŒR -R -R -R -s-k-BBI‡I‡AGAGAGAGAGAGAGAG9†9†8æ8æ0æ0æ0æ0æA†A†AGAGAGAGAGAGAGAGAGAGAGAGA&A&AGAGA&A&A&A&A†A†8æ8æA†A†I‡I‡YÉYÉI‡I‡YÉYÉjËjËrÍjÍR -R -YÉYÉR -R -YÉYÉAÇAÇAGAGI‡I‡BB0æ0æAÇAÇAGAGAÇAÇAÇAÇAÇAÇAGAGAGAGAGAGI‡I‡R‹R‹ZJbJ å å å å!$!$ Ä Ä ÄÄ0æ0æAGAG å åAGAGR‹R‹R -R -R -R -R‹R‹bŒbŒAÇAÇAGAGAGAGAÇAÇAGAGAGAG8æ8æ9E9E8æ8æ0æ0æAGAGAÇAÇAGAGAGAGAGAGAGAGAGAGA&A&I†I†A&A&AGAGA&A&A&A&AGAGI‡I‡YÉYÉI‡I‡jjs/k/ZJbJYÉYÉR -R -YÉYÉYÉYÉYÉYÉYÉYÉI‡I‡A&A&A&A&0æ0æ9†9†9E9EA&A&0æ0æAGAGA†A†AGAGAGAGZJbJk/k/JJ ä ä ÄÄ ä ä ÄÄ(ä(ä0æ0æ0æ0æ1†1†BBbŒbŒR -R -R -R -s-k-BBI‡I‡AGAGAGAGAGAGAGAG9†9†8æ8æ0æ0æ0æ0æA†A†AGAGAGAGAGAGAGAGAGAGAGAGA&A&AGAGA&A&A&A&A†A†8æ8æA†A†I‡I‡YÉYÉI‡I‡YÉYÉjËjËrÍjÍR -R -YÉYÉR -R -YÉYÉk/k/rËjËk/k/rËjËbŒbŒƒÏƒÏk/k/bIbIbŒbŒZIZIR -R -R‹R‹ZJbJRŠRŠjÍjÍrËjËZJbJZJbJZJbJR -R -bJZJc,c,bŒbŒc/c/{.{.{Ï{Ïk-k-rËjË{.{.jËjËs/k/k-k-s.k-k-k-c,c,{oƒp{Ð{Ðk-k-c,c,k/k/c,c,{oƒpk/k/k/s/k-k-k-s.k-k-c,c,jÍjÍ{.{.“ЋÐ{Ð{Ðk/k/ƒo{pƒo{p{.{.{oƒp{.{.{.{.{,{,{.{.{.{.{.{.{,{,jÍjÍ{.{.jÍjÍ{,{,{Ð{ÐjŠjŠYÉYÉZJbJZIZIR‹R‹bbR‹R‹ZJbJZJbJc,c,jŠjŠbŒbŒbbbŒbŒR -R -R‹R‹bŒbŒjËjËs/k/k-k-ƒp{o{,{,jÍjÍs.k-jËjË{,{,k/k/s-k-k.k-s-k-k/k/ƒÒƒÑk,k,s/k/{,{,ZÌZÌk/k/{Ð{Ðk/k/s-k-k.k-s-k-k.k-bŒbŒk,k,“ГЃ҃Ñk-k-s/k/ƒÐƒÐ{.{.{oƒp{.{.{.{.{,{,{.{.{,{,k/k/{,{,k/s/jËjËk/s/jËjËbŒbŒƒÏƒÏk/k/bIbIbŒbŒZIZIR -R -R‹R‹ZJbJRŠRŠjÍjÍrËjËZJbJZJbJZJbJR -R -bJZJc,c,bŒbŒc/c/{.{.{Ï{Ïk-k-rËjË{.{.jËjËs/k/k-k-s.k-k-k-c,c,{oƒp{Ð{Ðk-k-c,c,k/k/c,c,{oƒpk/k/k/s/k-k-k-s.k-k-c,c,jÍjÍ{.{.“ЋÐ{Ð{Ðk/k/ƒo{pƒo{p{.{.{oƒp{.{.{.{.{,{,{.{.{.{.{.{.{,{,jÍjÍ{.{.jÍjÍ{,{,{Ð{ÐjŠjŠYÉYÉZJbJZIZIR‹R‹bbR‹R‹ZJbJZJbJc,c,jŠjŠbŒbŒbbbŒbŒR -R -R‹R‹bŒbŒjËjËs/k/k-k-ƒp{o{,{,jÍjÍs.k-jËjË{,{,k/k/s-k-k.k-s-k-k/k/ƒÒƒÑk,k,s/k/{,{,ZÌZÌk/k/{Ð{Ðk/k/s-k-k.k-s-k-k.k-bŒbŒk,k,“ГЃ҃Ñk-k-s/k/ƒÐƒÐ{.{.{oƒp{.{.{.{.{,{,{.{.{,{,k/k/{,{,QEQEY†Y†QEQEYEYEY†Y†ƒÐƒÐRŠRŠ@å@åIEIEI$I$@å@å@å@åAEAEQEQEQEQEIEIEA&A&AGAGI†I†I†I†AGAGI†I†AGAGQEQEQÇQÇQEQEA&A&I$I$IEIEIEIEIEIEAEAEQEQEYEYEQEQEjËj˃҃ÑYÉYÉQEQEA†A†QEQEIEIEIEIEIEIEIEIEA&A&QEQEQEQEQEQEYÇYÇ{oƒpjŠjŠQÇQÇQÇQÇY†Y†QÇQÇI‡I‡Y†Y†Y†Y†A&A&I†I†AGAGYEYEYÇYÇY†Y†YEYEY†Y†a†a†k/k/ZZI$I$A&A&I$I$QEQE@å@å@å@åAEAEQEQEA&A&QEQEIEIEAGAGI†I†AGAGQEQEA&A&QÇQÇQEQEQÇQÇAGAGIEIEI$I$A&A&IEIEQEQEA&A&QEQEYEYEQEQEbbƒÐƒÐbŒbŒQEQEAGAGQEQEA†A†QEQEIEIEA&A&AEAEQEQEIEIEQEQEY†Y†jÍjÍs,k,ZZYÇYÇI‡I‡Y†Y†I‡I‡Y†Y†Y†Y†AGAGQEQEAGAGQEQEY†Y†QEQEY†Y†QEQEYEYEY†Y†ƒÐƒÐRŠRŠ@å@åIEIEI$I$@å@å@å@åAEAEQEQEQEQEIEIEA&A&AGAGI†I†I†I†AGAGI†I†AGAGQEQEQÇQÇQEQEA&A&I$I$IEIEIEIEIEIEAEAEQEQEYEYEQEQEjËj˃҃ÑYÉYÉQEQEA†A†QEQEIEIEIEIEIEIEIEIEA&A&QEQEQEQEQEQEYÇYÇ{oƒpjŠjŠQÇQÇQÇQÇY†Y†QÇQÇI‡I‡Y†Y†Y†Y†A&A&I†I†AGAGYEYEYÇYÇY†Y†YEYEY†Y†a†a†k/k/ZZI$I$A&A&I$I$QEQE@å@å@å@åAEAEQEQEA&A&QEQEIEIEAGAGI†I†AGAGQEQEA&A&QÇQÇQEQEQÇQÇAGAGIEIEI$I$A&A&IEIEQEQEA&A&QEQEYEYEQEQEbbƒÐƒÐbŒbŒQEQEAGAGQEQEA†A†QEQEIEIEA&A&AEAEQEQEIEIEQEQEY†Y†jÍjÍs,k,ZZYÇYÇI‡I‡Y†Y†I‡I‡Y†Y†Y†Y†AGAGQEQEAGAGQEQEY†Y†QEQEY†Y†AGAGI†I†YEYEjÍjÍYÉYÉIEIEI$I$A&A&IEIEHäHäIEIEQEQEA&A&I$I$A&A&QEQEQEQEA&A&QEQEAGAGQEQEQEQEY†Y†AGAGQEQEIEIEA&A&QEQE@å@åQEQEY…Y…Y†Y†Y†Y†jŠjŠ“Ð‹ÐZZQEQEAGAGI$I$AGAGQEQEA&A&QEQEQEQEA&A&QEQEYEYEjjs/k/AGAGY†Y†QEQEYEYEAGAGQEQEYEYEA&A&I†I†AGAGQEQEA&A&YEYEYEYEY†Y†Y†Y†Y†Y†bŒbŒbbA&A&HäHäQEQEA&A&I$I$QEQE@å@åQEQEA&A&IEIEQEQEIEIEIEIEQEQEA&A&Y†Y†AGAGQEQEAGAGYEYEQEQEA&A&IEIEIEIE@å@åIEIEYEYEY†Y†Y…Y…bbƒÐƒÐjËjËQEQEI†I†QEQEQEQEA&A&QEQEAGAGHäHäQEQEAGAGYEYEYEYE{.{.ZJbJQEQEQEQEYEYEAGAGQEQEYEYEAGAGQEQEA&A&I†I†QEQEYEYEQEQEY†Y†AGAGI†I†YEYEjÍjÍYÉYÉIEIEI$I$A&A&IEIEHäHäIEIEQEQEA&A&I$I$A&A&QEQEQEQEA&A&QEQEAGAGQEQEQEQEY†Y†AGAGQEQEIEIEA&A&QEQE@å@åQEQEY…Y…Y†Y†Y†Y†jŠjŠ“Ð‹ÐZZQEQEAGAGI$I$AGAGQEQEA&A&QEQEQEQEA&A&QEQEYEYEjjs/k/AGAGY†Y†QEQEYEYEAGAGQEQEYEYEA&A&I†I†AGAGQEQEA&A&YEYEYEYEY†Y†Y†Y†Y†Y†bŒbŒbbA&A&HäHäQEQEA&A&I$I$QEQE@å@åQEQEA&A&IEIEQEQEIEIEIEIEQEQEA&A&Y†Y†AGAGQEQEAGAGYEYEQEQEA&A&IEIEIEIE@å@åIEIEYEYEY†Y†Y…Y…bbƒÐƒÐjËjËQEQEI†I†QEQEQEQEA&A&QEQEAGAGHäHäQEQEAGAGYEYEYEYE{.{.ZJbJQEQEQEQEYEYEAGAGQEQEYEYEAGAGQEQEA&A&I†I†QEQEYEYEQEQEI†I†QEQEA&A&YEYEZJbJYÉYÉ@å@åIEIEHäHäI$I$QEQEIEIEI$I$A&A&HäHäQEQEQEQEA&A&IEIEI$I$QEQEAGAGQEQEQEQEQEQEQEQEIEIEIEIEQEQEQEQEY†Y†Y†Y†Y…Y…YEYEjËj˃o{pI‡I‡I†I†QEQEA&A&QEQEA&A&QEQEA&A&A&A&QEQEAGAGQEQEYÉYÉ{oƒpYÆYÇYEYEYEYEYEYEAGAGQEQEYEYEY†Y†YEYEAGAGQEQEA&A&I†I†I‡I‡YEYEYÉYÉaÇaÇbŒbŒZJbJHäHäQEQEI$I$I$I$A&A&I$I$QEQEI$I$A&A&I$I$QEQEA&A&I$I$A&A&I$I$IEIEQEQEQEQEQEQEY†Y†IEIEIEIEAEAEQEQEQEQEYEYEY†Y†Y…Y…Y…Y…bb{oƒpZJbJQEQEAGAGQEQEA&A&QEQEA&A&QEQEQEQEA&A&QEQEQEQEYEYEjÍjÍbŒbŒYEYEYEYEYEYEYEYEAGAGY†Y†QEQEQEQEY†Y†A&A&AGAGQEQEQEQEI†I†QEQEA&A&YEYEZJbJYÉYÉ@å@åIEIEHäHäI$I$QEQEIEIEI$I$A&A&HäHäQEQEQEQEA&A&IEIEI$I$QEQEAGAGQEQEQEQEQEQEQEQEIEIEIEIEQEQEQEQEY†Y†Y†Y†Y…Y…YEYEjËj˃o{pI‡I‡I†I†QEQEA&A&QEQEA&A&QEQEA&A&A&A&QEQEAGAGQEQEYÉYÉ{oƒpYÆYÇYEYEYEYEYEYEAGAGQEQEYEYEY†Y†YEYEAGAGQEQEA&A&I†I†I‡I‡YEYEYÉYÉaÇaÇbŒbŒZJbJHäHäQEQEI$I$I$I$A&A&I$I$QEQEI$I$A&A&I$I$QEQEA&A&I$I$A&A&I$I$IEIEQEQEQEQEQEQEY†Y†IEIEIEIEAEAEQEQEQEQEYEYEY†Y†Y…Y…Y…Y…bb{oƒpZJbJQEQEAGAGQEQEA&A&QEQEA&A&QEQEQEQEA&A&QEQEQEQEYEYEjÍjÍbŒbŒYEYEYEYEYEYEYEYEAGAGY†Y†QEQEQEQEY†Y†A&A&AGAGQEQEQEQEA&A&QEQEQEQEAGAGjjR -R -I$I$I$I$I$I$QEQEI$I$QEQEQEQEQEQEQEQEI$I$A&A&HäHäIEIEIEIEQEQEQEQEYEYEYEYEQEQEQEQEQEQEQEQEY†Y†YEYEY†Y†Y†Y†Y†Y†Y…Y…k-k-ƒp{oI‡I‡QEQEA&A&A&A&I$I$A&A&QEQEIEIEA&A&QEQEIEIEQEQEaÇaÇ{.{.bbYEYEYEYEYEYEYEYEYEYEAGAGQEQEY†Y†QEQEA&A&AGAGAGAGQEQEI‡I‡I‡I‡YÉYÉjËjËR -R -HäHäI$I$QEQEHäHäHäHäQEQEQEQEQEQEQEQEQEQEHäHäQEQE@å@åQEQEA&A&QEQEHäHäYEYEYEYEQÇQÇQEQEQEQEQEQEYEYEYEYEaÇaÇY…Y…Y†Y†Y…Y…bIbIƒÐƒÐR‹R‹QEQEA&A&A&A&I$I$A&A&QEQEA&A&IEIEA&A&QEQEAGAGQEQE{,{,jËjËYEYEYEYEYEYEY†Y†QEQEQEQEYEYEY†Y†QEQEA&A&QEQEQEQEQEQEA&A&QEQEQEQEAGAGjjR -R -I$I$I$I$I$I$QEQEI$I$QEQEQEQEQEQEQEQEI$I$A&A&HäHäIEIEIEIEQEQEQEQEYEYEYEYEQEQEQEQEQEQEQEQEY†Y†YEYEY†Y†Y†Y†Y†Y†Y…Y…k-k-ƒp{oI‡I‡QEQEA&A&A&A&I$I$A&A&QEQEIEIEA&A&QEQEIEIEQEQEaÇaÇ{.{.bbYEYEYEYEYEYEYEYEYEYEAGAGQEQEY†Y†QEQEA&A&AGAGAGAGQEQEI‡I‡I‡I‡YÉYÉjËjËR -R -HäHäI$I$QEQEHäHäHäHäQEQEQEQEQEQEQEQEQEQEHäHäQEQE@å@åQEQEA&A&QEQEHäHäYEYEYEYEQÇQÇQEQEQEQEQEQEYEYEYEYEaÇaÇY…Y…Y†Y†Y…Y…bIbIƒÐƒÐR‹R‹QEQEA&A&A&A&I$I$A&A&QEQEA&A&IEIEA&A&QEQEAGAGQEQE{,{,jËjËYEYEYEYEYEYEY†Y†QEQEQEQEYEYEY†Y†QEQEA&A&QEQEQEQEIEIEQEQEA&A&QEQEI‡I‡jjR -R -@å@åI$I$I$I$QEQEQEQEQEQEQEQEQEQEI$I$A&A&QEQEIEIEHäHäYEYEQEQEQEQEY…Y…aÇaÇYEYEY†Y†Y†Y†QEQEY†Y†QEQEaÇaÇY…Y…aÇaÇY†Y†jŠjŠƒÐƒÐRRA&A&QEQEA&A&QEQEA&A&A&A&@å@åIEIEIEIEA&A&QEQEaÇaÇjÍjÍZZYEYEaÇaÇQEQEYEYEYEYEYEYEY†Y†QEQEQEQEA&A&I†I†AGAGQEQEAGAGY†Y†I‡I‡{.{.bIbIHäHäQEQEHäHäI$I$HäHäQEQEQEQEQEQEQEQEI$I$QEQE@å@åQEQEQEQEI$I$QEQEQEQEYEYEaÇaÇYEYEQEQEY†Y†YEYEY†Y†Y…Y…Y†Y†Y†Y†aÇaÇY…Y…ZZ{oƒpZJbJAGAGQEQEA&A&QEQEA&A&@å@åAEAEIEIEA&A&IEIEQEQEQEQEjËjËbŒbŒYEYEa†a†YEYEYEYEYEYEAGAGYEYEYEYEY†Y†A&A&I†I†A&A&IEIEQEQEA&A&QEQEI‡I‡jjR -R -@å@åI$I$I$I$QEQEQEQEQEQEQEQEQEQEI$I$A&A&QEQEIEIEHäHäYEYEQEQEQEQEY…Y…aÇaÇYEYEY†Y†Y†Y†QEQEY†Y†QEQEaÇaÇY…Y…aÇaÇY†Y†jŠjŠƒÐƒÐRRA&A&QEQEA&A&QEQEA&A&A&A&@å@åIEIEIEIEA&A&QEQEaÇaÇjÍjÍZZYEYEaÇaÇQEQEYEYEYEYEYEYEY†Y†QEQEQEQEA&A&I†I†AGAGQEQEAGAGY†Y†I‡I‡{.{.bIbIHäHäQEQEHäHäI$I$HäHäQEQEQEQEQEQEQEQEI$I$QEQE@å@åQEQEQEQEI$I$QEQEQEQEYEYEaÇaÇYEYEQEQEY†Y†YEYEY†Y†Y…Y…Y†Y†Y†Y†aÇaÇY…Y…ZZ{oƒpZJbJAGAGQEQEA&A&QEQEA&A&@å@åAEAEIEIEA&A&IEIEQEQEQEQEjËjËbŒbŒYEYEa†a†YEYEYEYEYEYEAGAGYEYEYEYEY†Y†A&A&I†I†A&A&I$I$A&A&QEQEQEQEY†Y†YÉYÉYÉYÉ8ã8ä@å@åHäHäHäHäAEAEI$I$HäHäQEQE@å@åI$I$I$I$QEQEIEIEQEQEYEYEYEYEYEYEYEYEQEQEIEIEQEQEYEYEY†Y†QEQEY…Y…Y†Y†QEQEYEYEZIZI{.{.R -R -AEAEQEQEA&A&@å@åIEIEA&A&AEAEQEQEA&A&QEQEA&A&QEQEjÍjÍYÉYÉYEYEYEYEYEYEY†Y†YEYEYEYEQEQEY†Y†YEYEQEQEA&A&QEQEA&A&Y†Y†A&A&QÇQÇbŒbŒbb@å@åHäHäI$I$@å@åI$I$@å@åIEIEI$I$HäHäQEQE@ä@äI$I$A&A&I$I$QEQEYEYEQEQEYEYEYEYEYEYEIEIEQEQEY†Y†YEYEY†Y†QEQEY…Y…Y…Y…QEQEYÇYÇk-k-s.k-HäHäQEQEA&A&@å@åA†A†I$I$@å@åIEIEIEIEA&A&AGAG@ä@äZJbJZJbJYEYEYEYEY†Y†YEYEY†Y†QEQEYEYEY…Y…YEYEQEQE@å@åHäHäI$I$A&A&QEQEQEQEY†Y†YÉYÉYÉYÉ8ã8ä@å@åHäHäHäHäAEAEI$I$HäHäQEQE@å@åI$I$I$I$QEQEIEIEQEQEYEYEYEYEYEYEYEYEQEQEIEIEQEQEYEYEY†Y†QEQEY…Y…Y†Y†QEQEYEYEZIZI{.{.R -R -AEAEQEQEA&A&@å@åIEIEA&A&AEAEQEQEA&A&QEQEA&A&QEQEjÍjÍYÉYÉYEYEYEYEYEYEY†Y†YEYEYEYEQEQEY†Y†YEYEQEQEA&A&QEQEA&A&Y†Y†A&A&QÇQÇbŒbŒbb@å@åHäHäI$I$@å@åI$I$@å@åIEIEI$I$HäHäQEQE@ä@äI$I$A&A&I$I$QEQEYEYEQEQEYEYEYEYEYEYEIEIEQEQEY†Y†YEYEY†Y†QEQEY…Y…Y…Y…QEQEYÇYÇk-k-s.k-HäHäQEQEA&A&@å@åA†A†I$I$@å@åIEIEIEIEA&A&AGAG@ä@äZJbJZJbJYEYEYEYEY†Y†YEYEY†Y†QEQEYEYEY…Y…YEYEQEQE@å@åHäHäAGAGI‡I‡I‡I‡YÉYÉbŒbŒjÍjÍZÌZÌI‡I‡AGAGAÇAÇAGAGAGAGAGAGJJR -R -I‡I‡JJI‡I‡R -R -I‡I‡bJZJI‡I‡YÉYÉJJI‡I‡JJI‡I‡JJI‡I‡RRYÉYÉR‹R‹ZJbJjËjË{,{,k/k/s-k-ZJbJA&A&I‡I‡I‡I‡AÇAÇJJBBI‡I‡R -R -BBBBbŒbŒk/k/ƒo{pbŒbŒjjbIbIYÉYÉiÇiÇbbbbR -R -rjbŒbŒZJbJZJbJYÉYÉI‡I‡ZJbJR‹R‹YÉYÉc,c,bŒbŒYÇYÇZZYÉYÉA&A&AÇAÇAGAGAGAGI‡I‡R -R -BBYÉYÉJJYÉYÉJJR -R -YÉYÉJJbbBBI‡I‡I‡I‡JJI‡I‡I‡I‡R -R -R -R -bJZJbŒbŒ{,{,k-k-rÎjÍc,c,AGAGAGAGRRAGAGBBR -R -BBR -R -I‡I‡BBZJbJjÎj̓o{pc/c/YÈYÉI‡I‡I‡I‡BBYÉYÉJJR -R -bbR -R -R -R -R -R -R -R -AGAGI‡I‡I‡I‡YÉYÉbŒbŒjÍjÍZÌZÌI‡I‡AGAGAÇAÇAGAGAGAGAGAGJJR -R -I‡I‡JJI‡I‡R -R -I‡I‡bJZJI‡I‡YÉYÉJJI‡I‡JJI‡I‡JJI‡I‡RRYÉYÉR‹R‹ZJbJjËjË{,{,k/k/s-k-ZJbJA&A&I‡I‡I‡I‡AÇAÇJJBBI‡I‡R -R -BBBBbŒbŒk/k/ƒo{pbŒbŒjjbIbIYÉYÉiÇiÇbbbbR -R -rjbŒbŒZJbJZJbJYÉYÉI‡I‡ZJbJR‹R‹YÉYÉc,c,bŒbŒYÇYÇZZYÉYÉA&A&AÇAÇAGAGAGAGI‡I‡R -R -BBYÉYÉJJYÉYÉJJR -R -YÉYÉJJbbBBI‡I‡I‡I‡JJI‡I‡I‡I‡R -R -R -R -bJZJbŒbŒ{,{,k-k-rÎjÍc,c,AGAGAGAGRRAGAGBBR -R -BBR -R -I‡I‡BBZJbJjÎj̓o{pc/c/YÈYÉI‡I‡I‡I‡BBYÉYÉJJR -R -bbR -R -R -R -R -R -R -R -k/k/ƒÐƒÐ{oƒpk/k/ƒÐƒÐ{.{.{.{.{Ï{Ïc,c,{oƒpk/k/ƒo{pk-k-c/c/jËjËs/k/bŒbŒc,c,bŒbŒk-k-bŒbŒbŒbŒc,c,k/k/s,k,c/c/{.{.ƒÒƒÑƒÐƒÐk/k/{.{.{Ï{σЃÐ{oƒp‹Ï“ϋГЃЃÐ{Ï{Ï{.{.ƒÐƒÐ{Ð{Ѓ҃Ñ{oƒp‹Ð“Ð{Ð{Ѓ҃Ñ{.{.{.{.“ЋГЋЃЃÐ{oƒp{Ï{Ï{,{,ƒÐƒÐ{Ð{Ѓ҃Ñ{.{.ƒÐƒÐƒÐƒÐƒÐƒÐ”0Œ0œ“œ“{Ð{ГЋЃ҃є0Œ0ƒÐƒÐc,c,{.{.{.{.{.{.k,k,ƒo{p{.{.ƒÐƒÐk-k-c/c/k-k-rËjËbŒbŒbŒbŒbŒbŒk-k-bŒbŒbŒbŒc,c,jÍjÍs/k/k/k/s/k/ƒÐƒÐƒÐƒÐk/k/{Ï{Ï{.{.ƒÏƒÏ{Ï{Ï{oƒpŒ0”0‹Ð“Ð{.{.ƒÐƒÐk/k/“ГЃЃЃЃЃЃÐ{oƒp{Ð{Ð{oƒps.{.ƒÐƒÐ“ЋЃσσЃÐ{.{.{Ï{Ï{oƒp{oƒpsÐ{Ð{oƒp{oƒpsÐ{Ð{Ð{Д2Œ1œ“œ“ƒÐƒÐk/s/ƒÐƒÐ{oƒpk/k/ƒÐƒÐ{.{.{.{.{Ï{Ïc,c,{oƒpk/k/ƒo{pk-k-c/c/jËjËs/k/bŒbŒc,c,bŒbŒk-k-bŒbŒbŒbŒc,c,k/k/s,k,c/c/{.{.ƒÒƒÑƒÐƒÐk/k/{.{.{Ï{σЃÐ{oƒp‹Ï“ϋГЃЃÐ{Ï{Ï{.{.ƒÐƒÐ{Ð{Ѓ҃Ñ{oƒp‹Ð“Ð{Ð{Ѓ҃Ñ{.{.{.{.“ЋГЋЃЃÐ{oƒp{Ï{Ï{,{,ƒÐƒÐ{Ð{Ѓ҃Ñ{.{.ƒÐƒÐƒÐƒÐƒÐƒÐ”0Œ0œ“œ“{Ð{ГЋЃ҃є0Œ0ƒÐƒÐc,c,{.{.{.{.{.{.k,k,ƒo{p{.{.ƒÐƒÐk-k-c/c/k-k-rËjËbŒbŒbŒbŒbŒbŒk-k-bŒbŒbŒbŒc,c,jÍjÍs/k/k/k/s/k/ƒÐƒÐƒÐƒÐk/k/{Ï{Ï{.{.ƒÏƒÏ{Ï{Ï{oƒpŒ0”0‹Ð“Ð{.{.ƒÐƒÐk/k/“ГЃЃЃЃЃЃÐ{oƒp{Ð{Ð{oƒps.{.ƒÐƒÐ“ЋЃσσЃÐ{.{.{Ï{Ï{oƒp{oƒpsÐ{Ð{oƒp{oƒpsÐ{Ð{Ð{Д2Œ1œ“œ“ƒÐƒÐAEAE@å@åAEAEAEAEIEIE8Ä8äA†A†I$I$@å@åAGAGQÇQÇR‹R‹IEIEHãHäI$I$I$I$AEAEHäHäI$I$AEAEHäHäI$I$A$A$Y…Y…QÇQÇYÉYÉAÇAÇQEQEAÇAÇQEQE9E9EIEIEIEIE9E9EAGAGY…Y…QÇQÇI†I†I‡I‡QÇQÇQEQEQÇQÇI†I†Y†Y†I†I†AGAGIEIEQEQEI†I†IEIEIEIEA&A&QÇQÇQEQEbŒbŒRRIEIE8Ä8ä9E9E8Ä8ä9E9EA&A&A$A$@å@å9†9†IEIE@å@å9E9EIEIEA&A&AEAEAEAE@å@åA†A†QEQEZJbJAÇAÇHäHäI$I$IEIEHäHäIEIEI$I$HäHäI$I$A$A$8Ä8äQEQEYÇYÇYÇYÇJJIEIEAGAGAÇAÇAEAEAEAEIEIEA&A&QEQEAGAGY…Y…I‡I‡QÇQÇQÇQÇA†A†Y†Y†I†I†Y†Y†I†I†AGAGQEQEA&A&I†I†QEQE9E9EAGAGQEQEI†I†jjR -R -AÇAÇA&A&8Ä8äA$A$9E9EA&A&9E9E@å@åAEAE@å@åAEAEAEAEIEIE8Ä8äA†A†I$I$@å@åAGAGQÇQÇR‹R‹IEIEHãHäI$I$I$I$AEAEHäHäI$I$AEAEHäHäI$I$A$A$Y…Y…QÇQÇYÉYÉAÇAÇQEQEAÇAÇQEQE9E9EIEIEIEIE9E9EAGAGY…Y…QÇQÇI†I†I‡I‡QÇQÇQEQEQÇQÇI†I†Y†Y†I†I†AGAGIEIEQEQEI†I†IEIEIEIEA&A&QÇQÇQEQEbŒbŒRRIEIE8Ä8ä9E9E8Ä8ä9E9EA&A&A$A$@å@å9†9†IEIE@å@å9E9EIEIEA&A&AEAEAEAE@å@åA†A†QEQEZJbJAÇAÇHäHäI$I$IEIEHäHäIEIEI$I$HäHäI$I$A$A$8Ä8äQEQEYÇYÇYÇYÇJJIEIEAGAGAÇAÇAEAEAEAEIEIEA&A&QEQEAGAGY…Y…I‡I‡QÇQÇQÇQÇA†A†Y†Y†I†I†Y†Y†I†I†AGAGQEQEA&A&I†I†QEQE9E9EAGAGQEQEI†I†jjR -R -AÇAÇA&A&8Ä8äA$A$9E9EA&A&9E9E@å@å@å@åHäHä8ä8ãI$I$8Ä8ä@å@å8ã8ä8ã8ä@å@åHäHäI†I†jŠjŠ@ä@ä@å@åHäHäHäHä@ä@ãHäHäHäHä8ä8ã8ä8ã8ä8ã@å@åI$I$IEIEjŠjŠA&A&IEIE8Ä8ä@å@å8Ä8ä8Ä8ä9E9EQEQE8Ä8äA&A&HäHäIEIEQEQEQEQEQEQEQEQEQEQEQEQEA&A&I$I$QEQEA&A&@å@åIEIE@å@å9E9EA&A&QEQE{,{,I‡I‡@å@å9E9E8Ä8äIEIE@å@å9E9E8Ä8ä9E9E@ä@ä@å@åHäHäHäHä8ä8ã@å@å8ã8ä8ã8äHäHä8ä8ãIEIEZJbJAGAGHäHäHäHäHäHä8ä8ãHäHãHäHä9$9$0Ä0ãHäHäA$A$8ä8ãI$I$bbYÉYÉA$A$@å@å8Ä8ä8Ä8ä8Ä8äAEAE8Ä8äIEIE@å@åAEAE@å@åIEIEQEQEQEQEQEQEQEQEQEQEQEQEA&A&IEIEIEIEI$I$A&A&@å@åA$A$9E9EQEQEZJbJbŒbŒHäHä8Ä8ä9E9E@å@å@å@å8Ä8ä@å@åA$A$@å@åHäHä8ä8ãI$I$8Ä8ä@å@å8ã8ä8ã8ä@å@åHäHäI†I†jŠjŠ@ä@ä@å@åHäHäHäHä@ä@ãHäHäHäHä8ä8ã8ä8ã8ä8ã@å@åI$I$IEIEjŠjŠA&A&IEIE8Ä8ä@å@å8Ä8ä8Ä8ä9E9EQEQE8Ä8äA&A&HäHäIEIEQEQEQEQEQEQEQEQEQEQEQEQEA&A&I$I$QEQEA&A&@å@åIEIE@å@å9E9EA&A&QEQE{,{,I‡I‡@å@å9E9E8Ä8äIEIE@å@å9E9E8Ä8ä9E9E@ä@ä@å@åHäHäHäHä8ä8ã@å@å8ã8ä8ã8äHäHä8ä8ãIEIEZJbJAGAGHäHäHäHäHäHä8ä8ãHäHãHäHä9$9$0Ä0ãHäHäA$A$8ä8ãI$I$bbYÉYÉA$A$@å@å8Ä8ä8Ä8ä8Ä8äAEAE8Ä8äIEIE@å@åAEAE@å@åIEIEQEQEQEQEQEQEQEQEQEQEQEQEA&A&IEIEIEIEI$I$A&A&@å@åA$A$9E9EQEQEZJbJbŒbŒHäHä8Ä8ä9E9E@å@å@å@å8Ä8ä@å@åA$A$HäHäI$I$8ã8ä@å@åHäHä8ä8ãHäHä8ä8ã@ä@ãHäHäI†I†bb8Ä8äI$I$HäHäA$A#HäHãI$I$8ã8äHäHä8ä8ãAEAEHäHä8ä8ãI$I$ZJbJIEIE@å@å8Ä8äA$A$9E9E8Ä8ä@å@å8Ä8äAEAEI$I$IEIEA&A&I$I$A&A&QEQEQEQEQEQEQEQEQEQEA&A&A&A&I$I$A&A&@å@åA$A$@å@å9E9EYEYEjÍjÍYÉYÉ8Ä8äAEAE8Ä8ä@å@å9$9$@å@å9E9EA&A&8Ä8äHäHä0Ä0ãIEIEHäHä@ä@ã8ä8ãHäHä8ä8ãHäHäHäHäbIbIAGAG@ã@äI$I$@ã@äHãHäI$I$I$I$8ã8äHäHä8ä8ã8ä8ã@å@åI$I$bbJJ8Ä8äA$A$8Ä8ä9E9E8Ä8ä@å@åAEAE@å@åAEAEHäHäIEIEIEIEI$I$A&A&QEQEQEQEQEQEQEQEA&A&I$I$A&A&@å@åIEIE8Ä8ä9E9EA&A&QEQEjjZÌZÌA&A&@å@å8Ä8äA$A$9E9EHäHä8ä8ãHäHäHäHäI$I$8ã8ä@å@åHäHä8ä8ãHäHä8ä8ã@ä@ãHäHäI†I†bb8Ä8äI$I$HäHäA$A#HäHãI$I$8ã8äHäHä8ä8ãAEAEHäHä8ä8ãI$I$ZJbJIEIE@å@å8Ä8äA$A$9E9E8Ä8ä@å@å8Ä8äAEAEI$I$IEIEA&A&I$I$A&A&QEQEQEQEQEQEQEQEQEQEA&A&A&A&I$I$A&A&@å@åA$A$@å@å9E9EYEYEjÍjÍYÉYÉ8Ä8äAEAE8Ä8ä@å@å9$9$@å@å9E9EA&A&8Ä8äHäHä0Ä0ãIEIEHäHä@ä@ã8ä8ãHäHä8ä8ãHäHäHäHäbIbIAGAG@ã@äI$I$@ã@äHãHäI$I$I$I$8ã8äHäHä8ä8ã8ä8ã@å@åI$I$bbJJ8Ä8äA$A$8Ä8ä9E9E8Ä8ä@å@åAEAE@å@åAEAEHäHäIEIEIEIEI$I$A&A&QEQEQEQEQEQEQEQEA&A&I$I$A&A&@å@åIEIE8Ä8ä9E9EA&A&QEQEjjZÌZÌA&A&@å@å8Ä8äA$A$9E9EHäHä8ä8ãHäHäHäHä8ä8ãHäHä8ä8ãHäHã8ä8ã@ä@ãHäHä@ä@ãI$I$QÇQÇZJbJ@å@åI$I$I$I$HäHäI$I$I$I$HäHäA$A$8ä8ãHäHäA$A$HäHäI$I$ZJbJ9E9E8Ä8äA$A$8Ä8ä8Ä8ä9$9$8Ä8äA$A$9E9EA&A&I$I$QEQEA&A&I$I$A&A&HäHäQEQEQEQE8å8å@å@å@å@åAEAEHäHäA$A$8Ä8äIEIEIEIEQEQEjÍjÍIÇIÇ8Ä8ä8Ä8äA$A$9E9E8Ä8ä9E9E@ä@ä8Ä8ä@å@åHäHä8ä8ãHäHäHäHä8ä8ã@ä@ã@ä@ãHäHãHäHäI$I$ZJbJAGAGI$I$HäHäI$I$I$I$I$I$HäHäA$A$8ä8ãI$I$8Ä8äI$I$HäHäZIZIAÇAÇ8Ä8äA$A$8Ä8ä8Ä8äA$A$8Ä8äA$A$8Ä8äAEAEIEIEI$I$QEQEA&A&I$I$QEQEHäHäA&A&QEQE8Ä8äA&A&HäHäA$A$IEIE8Ä8äA&A&I$I$QEQER -R -bŒbŒ@ä@ä8ä8ãA$A$0å0å@å@å8ã8ä8ã8ä@å@åHäHä8ä8ãHäHä8ä8ãHäHã8ä8ã@ä@ãHäHä@ä@ãI$I$QÇQÇZJbJ@å@åI$I$I$I$HäHäI$I$I$I$HäHäA$A$8ä8ãHäHäA$A$HäHäI$I$ZJbJ9E9E8Ä8äA$A$8Ä8ä8Ä8ä9$9$8Ä8äA$A$9E9EA&A&I$I$QEQEA&A&I$I$A&A&HäHäQEQEQEQE8å8å@å@å@å@åAEAEHäHäA$A$8Ä8äIEIEIEIEQEQEjÍjÍIÇIÇ8Ä8ä8Ä8äA$A$9E9E8Ä8ä9E9E@ä@ä8Ä8ä@å@åHäHä8ä8ãHäHäHäHä8ä8ã@ä@ã@ä@ãHäHãHäHäI$I$ZJbJAGAGI$I$HäHäI$I$I$I$I$I$HäHäA$A$8ä8ãI$I$8Ä8äI$I$HäHäZIZIAÇAÇ8Ä8äA$A$8Ä8ä8Ä8äA$A$8Ä8äA$A$8Ä8äAEAEIEIEI$I$QEQEA&A&I$I$QEQEHäHäA&A&QEQE8Ä8äA&A&HäHäA$A$IEIE8Ä8äA&A&I$I$QEQER -R -bŒbŒ@ä@ä8ä8ãA$A$0å0å@å@å8ã8ä8ã8ä@å@åHäHä@ä@ã8ä8ãHäHä@ä@ãHäHã@ä@ã@ä@ã@ä@ãI$I$QEQEbŒbŒHäHäI$I$8ã8äI$I$I$I$IEIEHãHäI$I$HäHäA$A#HäHäI$I$I$I$JJ8Ä8ä8Ä8äA$A$8Ä8ä1$1$0Ä0ãA$A$8Ä8äIEIEI$I$A&A&I$I$A&A&QEQEHäHäQEQEHäHäA&A&I$I$@å@åHäHäI$I$@å@åAEAE8Ä8äIEIEQEQEQEQEjËjËI‡I‡(ä(ä8Ä8ä8Ä8ä8Ä8ä@å@å8Ä8ä8Ä8äAEAEHäHä8ä8ãHäHä8ä8ãHäHä@ä@ã@ä@ã@ä@ã@ä@ãHäHäI$I$ZJbJI‡I‡@ä@ãI$I$I$I$8ã8äIEIEI$I$HäHäI$I$HäHäI$I$A$A$HäHäQÇQÇA&A&8Ä8ä8Ä8äA$A$0Ä0ä0Ä0ãA$A$8Ä8äAEAEI$I$QEQEA&A&I$I$QEQE@å@åQEQEQEQEHäHäQEQE@ä@ä@å@åI$I$@å@åAEAE@å@åAEAEI$I$QEQEbbbŒbŒ0Ã0ä8Ä8ä8Ä8ä9$9$8Ä8ä9E9E@ä@äHäHäHäHä@ä@ã8ä8ãHäHä@ä@ãHäHã@ä@ã@ä@ã@ä@ãI$I$QEQEbŒbŒHäHäI$I$8ã8äI$I$I$I$IEIEHãHäI$I$HäHäA$A#HäHäI$I$I$I$JJ8Ä8ä8Ä8äA$A$8Ä8ä1$1$0Ä0ãA$A$8Ä8äIEIEI$I$A&A&I$I$A&A&QEQEHäHäQEQEHäHäA&A&I$I$@å@åHäHäI$I$@å@åAEAE8Ä8äIEIEQEQEQEQEjËjËI‡I‡(ä(ä8Ä8ä8Ä8ä8Ä8ä@å@å8Ä8ä8Ä8äAEAEHäHä8ä8ãHäHä8ä8ãHäHä@ä@ã@ä@ã@ä@ã@ä@ãHäHäI$I$ZJbJI‡I‡@ä@ãI$I$I$I$8ã8äIEIEI$I$HäHäI$I$HäHäI$I$A$A$HäHäQÇQÇA&A&8Ä8ä8Ä8äA$A$0Ä0ä0Ä0ãA$A$8Ä8äAEAEI$I$QEQEA&A&I$I$QEQE@å@åQEQEQEQEHäHäQEQE@ä@ä@å@åI$I$@å@åAEAE@å@åAEAEI$I$QEQEbbbŒbŒ0Ã0ä8Ä8ä8Ä8ä9$9$8Ä8ä9E9E@ä@äHäHäHäHä@ä@ãHäHã@ä@ãHäHã@ä@ãHäHä@ä@ãHäHãHäHäIEIEc,c,HäHä8ä8ãI$I$HäHäHäHãI$I$I$I$HäHä@ä@ãI$I$I$I$8ã8äIEIEAGAGA$A$A$A$8ä8ã8ä8ã8Ä8äAEAEI$I$QEQEI$I$QEQEQEQEQEQEYEYEQEQEQEQEQEQEQEQEYEYEQEQEQEQEQEQEHäHäQEQEI$I$QEQEQEQEA&A&QEQEbŒbŒAGAG@å@åA$A$0Ä0ã9$9$(ä(ä9E9E8Ä8ä@å@å@ã@ä@ã@äHäHäHäHãHäHã@ä@ã@ä@ã@ä@ãHäHãHäHãHäHäjŠjŠAÇAÇHäHäHäHäI$I$@ã@äI$I$I$I$HãHäHäHä@ä@ãI$I$HäHäA$A#QEQEA†A†8ã8ä@å@å8ã8äA$A$8ä8ãAEAEI$I$QEQEHäHäQEQEYEYEQEQEAGAGYEYEHäHäYEYEA&A&YEYEQEQEYEYEQEQEHäHäIEIEHäHäQEQEYEYEA&A&YÉYÉZJbJ8ä8ã8Ä8ä9$9$(ä(ä8Ä8ä8Ä8ä0Ä0ãHäHäHäHä@ä@ãHäHã@ä@ãHäHã@ä@ãHäHä@ä@ãHäHãHäHäIEIEc,c,HäHä8ä8ãI$I$HäHäHäHãI$I$I$I$HäHä@ä@ãI$I$I$I$8ã8äIEIEAGAGA$A$A$A$8ä8ã8ä8ã8Ä8äAEAEI$I$QEQEI$I$QEQEQEQEQEQEYEYEQEQEQEQEQEQEQEQEYEYEQEQEQEQEQEQEHäHäQEQEI$I$QEQEQEQEA&A&QEQEbŒbŒAGAG@å@åA$A$0Ä0ã9$9$(ä(ä9E9E8Ä8ä@å@å@ã@ä@ã@äHäHäHäHãHäHã@ä@ã@ä@ã@ä@ãHäHãHäHãHäHäjŠjŠAÇAÇHäHäHäHäI$I$@ã@äI$I$I$I$HãHäHäHä@ä@ãI$I$HäHäA$A#QEQEA†A†8ã8ä@å@å8ã8äA$A$8ä8ãAEAEI$I$QEQEHäHäQEQEYEYEQEQEAGAGYEYEHäHäYEYEA&A&YEYEQEQEYEYEQEQEHäHäIEIEHäHäQEQEYEYEA&A&YÉYÉZJbJ8ä8ã8Ä8ä9$9$(ä(ä8Ä8ä8Ä8ä0Ä0ãHäHäA&A&A&A&A&A&IEIEAGAGA&A&0å0å8Ä8ä0Ä0ä8Ä8äAGAGbŒbŒJJAGAGQEQEA&A&Y†Y†QÇQÇI‡I‡I†I†AGAGA†A†AGAGI†I†Y†Y†R -R -R -R -QÇQÇAGAGA&A&0Ä0äHäHä8Ä8äA&A&@ä@äI$I$@å@å8Ä8ä@å@åA&A&8å8å@ä@ä@å@åA&A&I$I$@ä@äQEQEIEIEA&A&@å@åAGAGA&A&A&A&AGAGR‹R‹AGAG0Ã0ä ä ä0Ä0ä0Ä0ã0Ä0ã(Ä(Ã0Ä0äHäHäAEAEA&A&QEQEA&A&A&A&I‡I‡8å8å0å0å@ä@ä0Ä0ãA&A&ZJbJR‹R‹I‡I‡A&A&@å@åQEQEYÇYÇQÇQÇAGAGI†I†AGAGA†A†I†I†AGAGbbR -R -YÉYÉAÇAÇA&A&8Ä8ä8Ä8ä@å@å@å@å@å@åIEIE@ä@ä8Ä8ä@å@å@å@åA&A&@ä@äA&A&I$I$A&A&HäHä8Ä8äQEQEA&A&@å@åA&A&AGAGA&A&A&A&ZJbJR -R -0æ0æ0æ0æ9†9†I‡I‡ å å(ä(ä(å(å8æ8æA&A&A&A&A&A&IEIEAGAGA&A&0å0å8Ä8ä0Ä0ä8Ä8äAGAGbŒbŒJJAGAGQEQEA&A&Y†Y†QÇQÇI‡I‡I†I†AGAGA†A†AGAGI†I†Y†Y†R -R -R -R -QÇQÇAGAGA&A&0Ä0äHäHä8Ä8äA&A&@ä@äI$I$@å@å8Ä8ä@å@åA&A&8å8å@ä@ä@å@åA&A&I$I$@ä@äQEQEIEIEA&A&@å@åAGAGA&A&A&A&AGAGR‹R‹AGAG0Ã0ä ä ä0Ä0ä0Ä0ã0Ä0ã(Ä(Ã0Ä0äHäHäAEAEA&A&QEQEA&A&A&A&I‡I‡8å8å0å0å@ä@ä0Ä0ãA&A&ZJbJR‹R‹I‡I‡A&A&@å@åQEQEYÇYÇQÇQÇAGAGI†I†AGAGA†A†I†I†AGAGbbR -R -YÉYÉAÇAÇA&A&8Ä8ä8Ä8ä@å@å@å@å@å@åIEIE@ä@ä8Ä8ä@å@å@å@åA&A&@ä@äA&A&I$I$A&A&HäHä8Ä8äQEQEA&A&@å@åA&A&AGAGA&A&A&A&ZJbJR -R -0æ0æ0æ0æ9†9†I‡I‡ å å(ä(ä(å(å8æ8æR‹k/jÍrÍc/c/bŒR‹R -R‹bŒj̓p{ok-k/ƒÏ”2‹ÐƒÐ“ЃЃГЃЃЃГЃÐc,ZJbŒR‹bŒZÌbŒbŒR‹jÍR‹bŒR‹R‹R‹R -R -R‹bŒc-jÍc/k/k/c/bŒc/c/bŒR‹R -R‹R -R‹c/k/bJR -R‹bŒc/ZÌbŒR -R‹R‹bŒk/“Ðk/k-ƒÐƒÏ”2ƒÐƒÐƒÐƒÐƒÏ“ЃЃГЃÐk/bŒR‹ZJZÌZJZÌZÌbŒR‹jÍbŒR‹R‹R‹R -R -R‹R‹jÍZÌc/k/k/s/c/bŒk/c/c/ƒÏZJR‹R‹R -bbZbjË{.YÇAGQEAGAÇAGAEA†A†QEAÇI†QÇQÇI‡QÇQÇI†AGAEAEQÇAGAEAGA†I†YÇjŠk/k-rËk-{,jÍ{,{.{.k/k-rËjÍk-k/rËj‰bZjŠjËj‰rËjËjËjËrËjËjËjY†YEY†iÇk/bIY†A&QÇAGAÇA†IEAGA†QEAÇQÇQÇQÇQÇI†QÇI†AGA$AÇQÇIEIEAGAÇY†b{oc,jÍ{,jËk-s-{,{.k/k-{,jÍ{.œ“{.j‰jIbbIjŠjËjËr‰jËjŠjËjËbŒQE@åI$I$YÉk-QEHä@ä0Ä0ä0Ä0ã8ÄHäAEHä0ä@ä0Ä8ä8ä8Ä8ä8Ä8ä8äA$IE@ä0Ä0ä@åI$bI{.aÇQEQEQEQEAGYEaÇY†I‡aÇaÇbŒc,QEQE@åQEI$HäYEYEYDYEYEYEYEYEYEYEY†Y†Y†jÍb8Ä@ä@ä0ä0Ã8ä0Ä@äHäAE8Ä@ä0Ä@ä0ä0Ä8ä8Ä8ä8ä8ÄIE8ä8Ä0ä8ÄQEYEk/jYEA&QEQEQEYEI‡a†aÇI‡Y†jIƒÒZQE@äQEQEI$YEYDYEYDYEYEYEYEY†YEA&@åaÇjÍQE@ä8Ä0ä(ä(ä8Ä0ä8ÄAE@ä0ä0Ä8ä0Ä(ä8ä(ä9$8Ä8ä9E8Ä8ä8Ä8ä8äQEjk/I‡QEA&YEI‡Y†I‡Y†I‡aÇI‡a†{.bŒY†QEA&QEA&QEQEQEHäYEa†Y†Y†I‡Y†I‡YEY†Y†bŒR -Hä@ä0Ä(ä(ä(ä0ä@ä8Ä@å0ã8Ä0ä(ä0Ä8ä8Ä(ä8äA$8Ä9E@ä8äA$8Ä@åY†k/bAGQEAGYEI‡aÇI‡aÇI‡Y†YÉjIƒoI‡YEAGQEA&QEQEQEQEQEQEY†QEY†Y†A&@åA$YÉc,YE8Ä8ä ä0Ä0ä(ä8ÄA$@å8Ä8äA$(ä8Ä(ä8ä8Ä9$8Ä9$@åIE8Ä8ä9$8ÄIEZk/aÇI‡YEI‡AGY†I‡aÇI‡Y†I‡aÇ{.k/QEQEA&QEA&I†A&I‡QEAGYEAGaÇYÉaÇYÉaÇYÉI‡jÍj@ä8Ä ä0ä0Ä0ä8Ä8äA$A$8ÄA$(ä8Ä8ä(ä8Ä9$8Ä8ä9E@åAE0Ä0ã8ÄIEQEk/bJY†Y†YEI‡AGI‡Y†I‡aÇI‡Y†jŠ{oYÉQEA&@åQEA&AGA&I‡QEYÉQEAGY†QÇI‡A&@åbc/YE8Ä8ä(ä(ä8Ä0ä(ä8ÄA$8ÄA$8Ä(ä8ä(ä0å9$(ä8Ä8ä9E@åAE0Ä0ã8ÄQEYÉjËYÉaÇI‡YEI‡AGY†I‡YÉI‡aÇYÉjËbŒIE0æ(ä(ä å0å9EA&A&YEI‡aÇI‡YÉYÇYÉQÇYÉYÇjÍbJ@ä0Ä0ä0Ä(ä(ä0ä8Ä8äA$8Ä8ä8Ä(ä8ä(ä9$(ä8ÄA$8Ä9E@å8ã8ä8Ä9EQEjÍbYÉaÇAGI†I‡YEI‡YÉYEI‡YÉjIƒoAG9E0å(ä(ä(å9E0åA&AGYÇI‡YEYÉYÇAG@åI$Zk/YE8Ä8ä8Ä(ä(ä0ä8Ä8ä8ÄA$0Ä0ä8Ä8ä8ä8Ä8äA$8Ä0ä8ÄIEHä0ä8ä@åHäYÇc,jYÉaÇAGI‡I‡YÉaÇI‡aÇI‡a†ZJbJ(ä0å1†Ä å å0æ ä ä8ÄA&AGQÇI†I‡IEAGAGY†c/ZHã@ä0Ä0ä(ä(ä@ä0Ä8äA$8Ä9$0Ä8ä8ã8Ä8äA$8Ä8ä0ÄIE@å8ã8ä8äI$QEbŒbIjI‡aÇI‡I‡I‡YÉaÇI‡YÉY†jk/9E0å0æ å å(å å å(ä8ÄAÇ8Ä0åQÇY†AGI†A&YÉk/YÉAG9E0å8Ä(ä0å(ä0ä0Ä ä0ã0Ä0ä1$0Ä0ä9$9E0å8Ä0æA&9E0åAGAGI†ZJbŒI‡AGI†I‡aÇAGY†AGI‡YEA&AG{,k/0Ã9EI‡A&@åA$9EA&@åAEY†I‡A&I†A&IEA&9EI‡c/bŒAGIE0å0å(ä8Ä(ä(ä0ä0Ä ã0ä(ä8Ä(ä8ä1$0æ9E(ä0åA&@å0æAGAGAGYÉZÌYÉAGAGQÇI‡Y†I‡YEI‡AGAGQEbƒÒ9…0åQÇAGA$9E@å9E@åAEQEA&9EA&{.jËk-rËk-{.k-bJbŒbŒZJR -bJR‹ZJc,bJR‹ZJR‹ZJbJRŠbŒZJc,bŒk,k/{.{.k-k-s.c,k-bŒbŒJYÉZJR -R‹YÉR‹bŒR‹bŒ{oƒÐk/bŒk-jË{,{.{.{oƒp{,ƒÐ“ЃЃÐ{o{,k/k/s-{.{,bŒbŒbŒZJZIR‹ZJbJbŒZÌZJbJZJR‹ZJR‹jŠZJbŒZÌjËk/ƒÐk,k-s-k.bŒ{.k-bŒZIJR -bJZJR -R -ZÌZJbŒc/ƒÐ{.c,bŒ{.jË{.{.{oƒp{,{o“Ð{oƒpIEIEQEQEQEQEI$8ÄIEAEAE@åIEQEbZJAÇa†QEQEYEY†YEQEIEQEQEQÇIÇbŒZQÇQEY†AGQEQEA&I†AGA†I†I‡QÇYÇYÉbQÇYÇYÉRZZYÉYÇZZZJjŠbbYÇZZYÇY†Y†Y†QEQEQE8ÄAEI$A&IE@åQEY†bŒIÇQÇYEQEQEY†YEY†AEIEQEQEQÇR‹bIYÇY†I†Y†AGIEQEAGQEAGAGQÇI†YÉYÇYÉYÇRYÇYÉZIZIYÇRZZbbŒbbAGA$A†8Ä0å@åA&@å@å8Ä9E8ä@å@åA$IEA&jc/Y†YEa†YEY†Y†aÇY†AGQÇA†IEI‡c-ZAGQEA&IE@å9EA&@åAE8ÄA&IEA&QEA&QEA&AGAE@åA$8ÄA&AGAGYEYÉZYEA&YEA&QEA&QE@å@åQE@å8Ä9E8ä@å8Ä9EA&QEY†k/ZYEY†YEaÇYEI‡Y†QÇY†I†AGAGbŒZJI†A&AG@åQE@å9EA&8Ä9EA&A&@åIEIEIEA&I†A&IE0å8Ä@åA&AGQEY†bI‡QE@ä8Ä0å8äA$@åA$9E@å9$0å9E8Ä9EA&@åY†bbŒ@åYEY†aÇY†Y†Y†aÇI‡QÇAGI‡AÇbŒaÇI†A&IEA&@å@åIE@å9E@å9EA&QEA&QEA&AGQEA&IE0æ9EA&IEA&QEa†YÉAGYEI‡A&YEA&QE@å@å9$@å8Ä0å9E8ä9EA&@åIEI‡jÍI†YEY†Y†Y†a†a†aÇY†I‡I‡I‡9†ZIjŠI‡A&QE@å9EA&@åAE8ÄIE@å9EQEA&QEA&AGQE@åA&A&9$A&A&IEA&Y†YÉYEI‡YEA&8Ä8Ä0æ8ä9E8Ä0å8ä9E@å0åA$9E@åIER -bŒ8ãY†a†Y†a†a†aÇa†I‡QÇI‡AGZIZJYÉIEA&A&IE@å9E@å9E@å9EA&A&AGI$A&IEA&AG@å9E8Ä9EA&A&QEAGa†bI‡QEAGQEA&AGI$@å0å8Ä9E8ä0æA$0å@åA$9EA&YEjÍA&QEY†Y†a†a†aÇaÇaÇAGYÇA†A&R‹bI‡A&A&AEA&8ÄIE@å9E@å9EA&AGQEA&A&IEA&A&9E@å0åA†A&QEA&YEZJI‡YEA&8Ä@å8ä1$8Ä0æ8äA$(ä0å@å9$@å9E8åA&YÉZÌY†aÇa†iÇzzzjjAGI†A†YÉbŒQÇIEA&IEA&0å@å9E8åIEA&9EA&QEA&IEA&A&IE@å9E8Ä(äA&IEA&YEYÉR -YEAGQEA&QEAGQE8å8Ä9E8ä8Ä9$0å9E@å8Ä@å9EI‡bŒYÉY…iÇjqÇzzaÇiÇQÇAGAGI‡bŒYÉIEA&IE@å9E8å@å@å9EA&@åA&IEA&A&IEA&AGA&8Ä9E8ä9EA&QEQEY†ZJYÉQE@å8ÄA$8ÄA$8Ä8äA$8Ä8ä9$(ä@å9$@åIEIEYÉbŒQÇQÇAGYÉbzYÉa†aÇ@å9EA&R‹ZIIEA&QEA&@åA$0åIE8å@å9EA&@åQEA&QEA&IEA&@å0åIE@åA&IEAGQEa†bŒYEQEAGA&QEA&A&Hä8ã8ÄIE(ä8ä8Ä0åA$9EA&A&YEZÌYÉQÇI‡Y†YÉjjrYÉAG8Ä9†9ER‹I†AGQE@å9EA&8Ä9EA&8Ä9EIE@åIEA&QEA&IEA&@åA$9EA&@åIEA&QEYEZJYÉQEQE8Ä8äA&A&9†A&9E9E9E9EA†0æA&A†A&AGR -R‹(ä ä Ä Ã Ä(å0æ ä åJR -AÇbŒR‹A&0æA&0æ9†0å0å8Ä(ä0å@å0æAG9EA&A&A&A&@åAE8Ä8ä9EA&AGY†I‡YÉjÍR -YÉI‡YÉI‡I‡I‡A&AGAÇ9E@å1† ä8Ä9EA&A&AGI‡ZÌAÇ Ä ä£ ä(ä0æ Ä(äAGBBJjÍAGA&0æA†8æ0å@å8Ä8ä0æ8Ä0æAGA&A&9EA&A&I$@å0å8Ä8äA†AGI‡AGI‡bŒbŒI‡YÉI‡I‡k/c,k/jËbŒƒÐc,ZJc,jŠZJR -bŒbŒc,k-bJR -R‹JZJbŒc,j̓pƒÐk/k/{.{.k,{.k/k,s/{ok/c,jÍc,bŒ“Ðk/k/k-s-k.bŒjËk/ƒÐk/c/{.ƒÐk/{.{.{.{.{.{.{.{oƒp{.{,bŒjŠjŠbŒjŠI‡R -R‹ZJbJbŒZÌk-bŒR -R‹JR -ZÌbŒc/k/ƒÐ{o{.{.{.k,{.k,k/s-{.ƒÐZÌc,c/bŒ{σÐc,k/jÍs-jÎbŒk-ƒÐƒÐZÌk/ƒos.{.{.{.{o{.{.{.{oY†Y†Y†Y†QÇ{obŒ@åIEI$@å9EIEAGQEA&QÇI†I‡Y†AGI‡QÇQÇQÇQÇQEIEIEA†I†QEQÇaÇQEjË“ÐbI‡I‡QÇAÇQEAÇQEAGQÇQEYÇZƒÒjËbZYÇZZYÇYÇQÇI†I‡Y†Y†I‡YEYEYEYEYEjËAGQEA&@åAE@åQEI†QEAGQÇY†AGI‡I†QÇQÇYÇQÇAGQEIEQEAGQEQÇY†Y†Z“Ðc,I‡QÇI†I†I†I†I†I†I†Y†I†YÇ{,{obbYÉbbYÇjI†I‡Y†I†aÇQEQEY†AGYEk-bIEA&I$QEA&I$QEIEIEA&QEIEA&I†YEAGQEY†AGQEA&IEI$IEQEQEY†YEjË“ÐR -IEQE@åQEQEAGQEQEQEQEYEYÉ{.QÇQEQEYEAGQEQEAGQEA&AGQEQEQEQEQEYEaÇYEYÉAGI$@åQEI$IEQEA&QE@åQEIEA&QEI†YEAGQEAGIEQEA&AEIEIEQEY…Y†bƒÐjÍQEQEQEQEA&QEA&QEQEA&Y†YEjÍbJQEAGQEYEA&YEA&QEA&I†QEAGQEY†A&QEYEbŒI‡IEI$A&I$I$AGI$A&QEI$QEA&IEQEA&QEQEYEAGIEI$IEQEQEY†Y†Y…QEjŠ{ÐYÉIEQEIEIEA&QEIEA&A&QEYEYÇ{oI‡YEYEI‡QEYEAGYEY†QEA&I†AGQEA&Y†I‡YÉY†ZJAGHäQEI$QEA&I$QEA&IEIEQEA&I$A&QEQEQEQEA&I$IEQEQEQEY†Y†QEaǃÐZJQEAGQEA&QEA&QEQEA&QEYEYE{.bŒQEYEQEYEAGYEY†AGQEAGQEQEQEA&QEAGQEbR -@åI$I$QEQEI$QEQEQEQE@äA&I$QEQEIEQEYEQEQEQEY†YEY†Y†Y†QÇY…j˃ÒI…QEA&A&QEA&QEA&I$A&QEAGiǃoZYEYEQEQEYEYEQEYEA&I†AGQEQEAGAGY†YÉYÉbIQEI$I$I$QEI$QEQEQEI$@åI$QEA&QEIEQEQEQEQEQEQEYEY†Y†YEaÇY…Z{ÐbŒ@åIEA&I$A&QEA&A&I$A&Y†AGjËjÍYEYEYEYEY†AGQEYEQEAGQEQEIEQEA&QEAGZJb@åQEHãI$QEQEQEHäHäQEQEI$QEQEQEHäY…aÇYEY†QEY†YEQEY†Y…aÇa†jŠ{oRA&QEA&QE@å9EQEA&IEQEAGY†k/iÇY†YEYEYEYEAGYEY†QEA&I†AGQEA&Y†A&QÇYÇbŒQEQE@äI$QEQEQEQEHäI$QEQEQEI$QEQEYEYEYEYEI†YEY†QEY†Y†Y†Y…bƒÐZJQEA&QEIEA&A&AEIEA&IEQEYEjËbŒYEY…YEYEQEYEYEY†QEAGQEA&@åQEQEYEY†YÉYÉ@åHäI$A&HäQEQEQEQE@äI$A&QEQEQEY†Y…a†QEQEY†Y†Y†Y…Y†aÇQ…Q…ZƒÐYÉQEA&IEA&A&I$A&IEA&AGI$AGk-QÇY…Y†YEY†YEYEaÇYEYEQEAGQEQEIEAGQEQEA&ZJAGHã@åI$QEQEHäQEQEA&HäIEI$YEYEYEY†YEY†QEY†Y†Y†QEY…aÇY…YEY†k/c-@åQEQE@åAGAEI$A&QEAGQE@åZJbŒYEY…a†YEY†QEa†YEY†QE@åIEA&AGI‡AGYÉjÍR‹A&9E0åIEA&A&AGI‡AGAGI‡I‡AGI‡I‡YÉAGAGI†AGAGAGAGYÇRYÉbbŒbŒk-bJ0åA&AGA&AÇAGAGAGAGI‡ZJZÌ{.R -I‡A&AGAGYÉAGI‡YÉYÉYÉYÉRAGAGI‡AGI‡R -ZÌI‡8æ9E@å8æA&AGAGAGAGI‡I‡AGBI‡I‡I‡AGAGAGAGAGAGQÇYÉYÇR -jŠjËbŒk,A&AGAGA†AGAGAGAÇAGAGBbŒk/bŒI†I‡AGI‡I†I‡I‡I‡YÉI‡I‡I‡k/ƒÐ{oƒÐƒÐ{o{.{Ïk/{.{os.k/k/k-s-k-bŒk,k/c,bŒk-{.k/k,ƒÐƒÐk/{Ï{oƒÐ“ЃД0œ“{Ï{o{.ƒÐƒÐƒÐ{oƒÒƒÐƒÐ{Ð{o„0œ““σÐ{o{.ƒÐƒÐƒÐƒÐ{oƒÐ„0”“Œ“”“œ““ЃÐ{Ð{ЃÒ{Î{ps/{.{ok.s/k/k/k,s/jËc,k/jÍbŒk/s-k/k,ƒoƒÐ{Ï{.{o{σЃϓМ“ƒÏ{Ð{.ƒÐ{oƒÐ{oƒÐƒÐƒÒ{Ðk/“М““ЃσÒ{.{.ƒÐƒÒƒÐƒÐƒÐƒÐ”“Œ“”“QÇA†QEAGQÇA†QEAÇQEAÇZZJQÇAEQEIEIEQEIEIEIEI$IEYÇYÇJI‡IÇZIQÇAGA†I‡AÇQÇYÇYÇZIIÇZQÇZQÇZQÇQÇI‡QÇQÇA†I†AGYÇbZJZIAÇIEA†A†AGAÇAGQÇAÇA†I†I†AGQÇIEAGI†QÇQÇZJJIEQEQ…IEIEIEIEQEAEIEQEZYÉJQÇIÇYÉAÇAGQÇAÇQÇI‡ZZIYÇIÇYÉYÇIÇZIYÇIÇQÇAGYÇQÇAGQÇQÇQÇbZJZI9EA&A†A†AGAÇAG@ä8ã@åHä8ä8Ä8äHä8ä@åY†R‹HäHäHä@ä@ãHä8äHä8ã8Ä@åI$QEbŒA&AE@ä@ä0Ä8äAE@åHäAE@å@åQ…QEQEQEQEQEA&I$A&I$A&@åIE@åIEQEjÍI‡8Ä@å8ä9E8ÄA$8ÄA$8ÄIE8ä@åHä8ä8Ä8ãHä8äAEZJI†HãI$@äHä@äHä@ä0ÄHä8ã@åI$jR -8ãAE@ä0Ä8ä@å@åAEHä@åHäIEQEIEQEQEI$QEA&I$QEA&@åAE8ÄIE@åj‰bŒ8Ä8ä9E8ÄIE8ä8ÄA$HäHä8äHäI$8ã8äHä8ãHäI†ZJHä@äHäA#HäI$Hä8ãA$8äI$8ÄI$ZJA†Hä8Ä8äA$8ÄAE@åAE@åI$IEQEA&HäQEQEQEQEA&QE@åAEAE8ÄIE@åQEk-R@åA$9E8Ä9E@å9E@å8ä9E8ÄHä@äI$0ÃHä8äHäHäbIAGHäHäHä@äHãI$8ãHä8äHäA$@äZIÇ@å@å8ãA$8ÄAE8äAE@åIEIEIEQEA&QEQEQEQEA&QEA&HäAE8ÄIE@åA†jIbŒA&@å8ÄA$@å@å8ã@åHäHäA$8ãHä8äHä8ãHäHäY…R‹HäHäA$HäI$I$Hä8ãHäI$0ÃAEI$jŠ@å8ÄA$8Ä9E8ä8ÄAEHäAEIEI$A&I$QEQEQEA&I$8å@åAEI$@å8Ä9EQEAGjËYÉ8ÄA$8Ä9E@å8ä8ÄA$8Ä0å8ã@åHä@äHä8ã@äHäI$ZJA†HäHäA$HäI$@ãHäA$8äHäA$HäZR8ÄA$8ÄA$8Ä9$@åA$AEI$QEA&@åIEHäQEQEA&@åHäA$A$IE8Ä9EA&HäbIbŒ8ãAE8Ä9E8äI$8ã8ÄHä8ä@ãHä8ä@ãHä@ä@ãI$I†bŒHäI$HäI$I$I$I$I$8ãI$HäI$@åYÉ9$8ÄA$8Ä0ä9$0Ä@åI$@åIEI$A&I$@åI$QE@åQE8ÄI$@å@åAEHäAEI$YEjÍAÇ0Ä0ä8ä@å8Ä8ä9E8Ä9E8ä8ÄI$@ã@äA#@äHãI$HäRŠI‡HäI$I$I$I$I$I$8ãI$8ãIE@äQÇAG8ã8ÄA$(ä8Ä0äAE8ÄI$A&I$QEA&HäQEI$QE@å@åI$8ÄAE@å@åI$QEQEZbŒ0Ä0ä0ÄA&8Ä8ä8ÄHäHä@ä@ã@äHã@ä@ã@äHãHäQ…jŠ8ÄHäI$@ãI$I$HäI$HäA$I$8ãIEQE9E8ã8ÄA$8ä@åI$AEI$QEQEQEQEYEQEQEQEQEQEQEQEI$I$QEA&I$AGHäjŠI‡8Ä8ä8Ä9$8Ä9$(ä8Ä8ä0ÄA$8äHä@ã@ä@ãHäHäHäjIJ@ãHä@äI$HäI$I$HäI$HäHäI$A†IE8Ä8äHä0ÄAEHäHäIEI$QEQEQEQEQEQEQEQEQEHäQEQEI$QE@åIEQEQEYÉZJ8ã@å0Ä8ä9$8ÄA$8äA&A&I$A&QEA&8Ä8ä@ä8äAGbŒJQEA&I$QEI†Y†A&AEIEIEIEAGbI‡I‡AG8Ä8ã@åAEI$A&I$Hä@åA&QE@å@åHäQE@åHäQEA&A&@åQEA&QEI‡k/bJ9&0æ9$1†(ä(Ä0å0åAGAÇAGAGAGQE8å8Ä@ä0äAEZJR -AGIEI$IEI†YEA&IEAEIEIEQEYÉJAGI†A&8ã@åAEI$A&I$QE8ÄHäA&Hä@åHäQEA&HäIEHäAG@äQEA&A&A&ZJR‹8æ0æ9$A†(å ä(ÄA&bŒc/k/bŒk/k/bŒZÌZJR‹bŒc/{Ð{.k/k-ƒp‹Î“ЃЃÐ{.ƒÏ“ЃЃЃЃÐk,k/RŠbŒbŒbŒbŒc,ZÌjÍZÌbŒbŒbŒbŒR‹R‹R -R‹bŒk/k/s/{ok/{М“œ“{o{σЃÐk/c,k/ƒosЃғЃσÒc,bŒbŒR‹ZJbŒjÍs/ƒÐk/k-{.“ϋЃЃЃÐ{σЃÐ{.ƒÐ“ЃÐk-bŒZJbŒbŒbŒZÌbŒjÍjÍrÎZÌbŒbŒR‹R‹R -bŒbŒc/jÍk/ƒok/k/k/s/k/c/k/ƒÐZJbŒR‹R‹bY†bbjŠ{oY†IEA&QEAÇIE@åA†AEQEA†AGI†QÇQEAÇI†I†IE@åA$AÇI†QEIEA&AÇYEjŠ{orËjËjÍjËs-jËk/{,jÍ{,jÍ{,k-k-jŠbIZJbbbIjIjŠj‰jŠjŠjËj‰rIjËjËjIb{,bŒQEQEIEA&AGA†9†AE@åIEQEA†AÇI†QÇI†I†Y†IEA&A$AGI†AEAEA†QEI†b{.k-jŠc,jËk-rË{.jÍ{.{,jÍjË{.”0s.rIbIZbj‰j‰jŠjËj‰jŠjËjIbŒQEA&HäHäaÇk/QE@ä8Ä8ä(ä0Ä8ä0ÄHäAE@ä8Ä8ã8Ä8ä8Ä8ä8Ä8ä9$8ÄA$IE8Ä0ä0Ä@åQEjk/aÇQEQEQEQEYEI‡YEaÇaÇI‡a†jÍbŒQEQEI$QEHäHäYEHäYEYEYEYEYEY†QEYEYEYEbŒjŠ@ä8ÄHä0ä8Ä0ä0Ä0ä@äAE@å8ãHä0Ä@ä0ä0Ä8ä8Ä8ä0ÄA$IE8Ä8ä0Ä8äQEYEk/bIQEQEQEQEQEYEI‡Y†aÇYEI‡jI“ÐR -QE@åIEHäQEYDYEHäYEYEYEYEYEY†YEIE@åZjÍQE@ä8Ä0ä(ä(ä8Ä0ä8ÄAE@ä0ä0Ä8ä(ä8Ä(ä8ä9$8Ä8ä9E@å8Ä8ä9$8ÄI$bk/I‡QEA&YEI‡I‡I‡aÇI‡Y†I‡aÇ{.bŒY†AGQEA&QEQEAGYEQEQEYEa†Y†YEAGa†YÉYEbŒbŒHã8Ä8ä(ä0Ä(ä0ã0Ä8äIE@ä0Ä0ä8Ä0ã(ä8Ä(ä8ä9$8Ä8ä9E@ä8Ä8äA$@åY†k/bYEAGQEI‡I‡aÇI‡aÇI‡YÉY†jŠ{oQÇQEQEQEA&QEQEQEQEQEYEI‡YEYEY†A&@å8ÄZk/QE@ä(ä(ä0Ä0ä0Ã8ä@åA$8Ä8äA$(ä8Ä(ä8ä1$8Ä8ä9$@åA$8Ä9$8Ä8äIEbk/YÇaÇYEAGAGY†I‡aÇI‡YÉYEYÉ{,k/QEQEA&AEA&AGQEI†YEAGQEAGa†Y†YÉYEYÉiÇbJbŒHä0Ä8ä(ä8ä(ä0Ä8ä8Ä9E@ä8ä@å0Ã8ä(ä8Ä0å8ä9$8Ä9EA&Hä8Ä(ä8äA$YEk/bJY†I‡YEI‡AGYEI‡aÇI‡I‡Y†jŠ{oYÉQEA&@åA†QEA&I‡QEI‡Y†I‡YEI‡QÇI‡A&@åbc/YE8Ä8ä(ä(ä(ä8Ä0ä8Ä8ä9$8Ä8ä(ä8Ä(ä0å8ä1$0å8ÄA$9E@å0Ã8ä9EQEYÉbŒbI‡I‡I‡YEI‡I‡YEI‡aÇI‡YÉ{,bŒIE0æ(ä(ä(ä0æ1$0æA&Y†AGa†YÉYÉaÇYÉQÇQÇbŒjË@ä@ä8Ä8ä(ä(ä0Ä(ä8ä8Ä8äA$8Ä(ä8ä(ä8Ä1$(ä8ÄA$8Ä9E@å8ã8ä8ÄIEAGjËjYÉI‡YEI‡AGI‡aÇI‡Y†I‡aÇjIƒoAG9E0æ!$(ä(å0å0åA&AGYÉAGAGYÇYÇAG@åI$Zk/YE@ä@ä0Ä(ä(Ä0Ä0ä8ä@å0ÃA$0Ä8ä8ÄA$8ä8Ä8äHä0Ä8äIE8ä8ã8ä@ä@äYÉjËbjaÇI‡I‡I‡aÇYÉI‡YÉI‡a†{,bŒ(ä0å1†Ä å å å(ä(ä8ÄAGAÇY†I‡Y†AGQEIEbŒbŒ@ä(Ã0Ä(ä0ã(ä(ä8Ä0äA$8Ä0äA$8Ä8ä8ä8Ä8äAE@ä0Ä8Ä8ÄIE@ä0ã8äI$QEbŒZJqÇYÉI‡Y†I‡aÇI‡YÉaÇI‡YÉb{o0å0å0æ å å å0æ(ä(ä0ÄQÇ0Ã8äQÇQÇI‡I†A&ZJc/bAG8æ0å0å0å8Ä0å(ä0ã(ä0Ä(ä8ä1$(ä8Ä9†A&1†(äA&A&0æAGAGI‡AGZJbŒI‡AGI†I‡I‡YEAGAGQÇAGQEQE{.k/0ÃA&AGAGAEA&IEIEA&AEQÇZbZJbbJZJJk/k/I‡9†AG0æ0å0æ8Ä(ä8ä(ä0Ä ä(ä(ä8ä(ä8Ä9E8æ0å0å9EA&0æA†A&I‡AGJjÍYÉAÇI†I‡I‡Y†AGAGI‡AGYEA&bƒÒAF9EAGQÇ8ÄA†A&IE9EA&QEAGA†A&{,jÍjËrÍjË{.bŒbŒbŒbŒRŠbR‹ZJbŒc,bŒR‹ZJR‹jŠZJbJbŒR -bŒc,k-k/{Ï{,c,k/jËc,k/c,bJR -R -R -R‹ZJbJZJbŒR‹bŒ{σÐk/c,k-{,jË{.{oƒp{o{,“ЋД2‹ÐƒÐƒÐ{Ï{orË{.{.ZJbŒRŠbŒZIZIbŒR‹c,ZÌZJbJZJbJZJR‹bŒZJc,bŒc,{.{Ï{.k-k-s.jÍjËk-ZÌZJRR -R -R‹ZJbJZJZÌZJs/ƒÏk/k/c,{,jË{.{,{oƒp{o{.“σÐ{.IE@åQEIEQEQEQE@ä8ÄIEIE@åIEQEbZJAGY…YEQEYEY†QEQEAEQ…IEIEQÇbŒZYEAGY†AGQEIEIEA&A†IEAGY†AGQÇYÇYÉQÇQÇI‡YÇbI‡YÉYÇZYÇbbŒbQÇZbIYÇY†YEQEHäYEQEQE8Ä@åIEAE@åIEI$I‡jËI‡Y†Y†QEQEY†QEQEIEIEQ…QEAGZJbIQÇAGY†AGQEIEA&QEA&AGAGI†Y†AGZYÇYÉQÇQÇYÉYÇJYÉQÇYÉaÇZbŒbY†AGA$9E8Ä9E@å@åA&@å8ÄA$0å8Ä9E@åQEQEbc/YEY†YEY†Y†YEaÇY†I†AGQÇIEI‡c,YÉAGAGA&IEA&@åIE@å@å9EA&A&IEQEA&QEA&AGI$A&0å8ÄA†A&AGYEYÉZQEQEA&QE@åQEA&I$A&@å@å8ÄA$8Ä8ä9E@äA&QEYEjÍbYEYEYEY†YEaÇY†Y†I†I†I†AGbŒZJY†A&IEA&@åIE@å9EA&8ÄIEA&A&QEA&QEA&AGQE@å9E0å@åA&QEAGa†bI‡QEA&8Ä8ä8ä8Ä9E@å8äA$0å9$9E@å@åA$9EAGjbŒ@åYEaÇYEaÇY†Y†aÇI‡QÇAGI‡AÇbŒZYEA&IE@å9E@åA&8Ä9EA&A&@åIEA&QEA&AGQEA&A&9E0åAGIEA&QEa†YÉAGYEI‡QE@åA&QE8å@åA$9E8Ä9E0å9E8äIE@åA&YÉjÍAGQEa†aÇI‡YEa†aÇI‡QÇI‡AGA†R -jIAGI†A&IE@å9EA&@åA$9EA&@åQEA&QE9EAGQE@åA†@å0åAGIEA&QEYEYÉI†Y†YEA&@å8Ä9E8ä0åA$0å8Ä9E@å0å9$A&@åIEYÉZÌ8ÄYEaÇY†a†aÇaÇaÇI‡Y†I‡A†JbŒQÇAGQEA&@åIE0åIE@å9E@å9EA&I†A&IEIEA&A&IE0å8Ä9EA&AGI$YEYÉYÉQEI‡QEA&QE8åA&@å8Ä8ä9E8Ä0å@å9E@å0åIE@åI†k-AGQEYEaÇYEiÇYÉa†a†I‡QÇAGA†R -bAGI†A&@å9EA&8ÄIE@å@å9EA&A&QEA&IEA&AGA&@å9E8ÄA†A&IEA&YEZJI‡YEA&@å8Ä8ä(ä@å8Ä9E8ä(ä0å0åA$@å9E8Ä9EbZÌYÇa†iÇjzzziÇjAGQÇA&R -bJQÇA&AG@åIE0å@å9E@å9EA&IE@åA&QEA&A&AGIE@å9E8Ä8äA&IEA&YEYÉbI‡QEA&A&QEA&I$8ÄAE8ä@å(äA$0å@å9$@å8Ä9EAGbŒbY†aÇiÇzziÇziÇQÇAGI†AGbŒYÉA†QE9EA&A&8Ä9E8å@åA&9EIEA&IEA&A&AGQE@å9E0å8Ä9EA&A&YEY†ZJaÇA&A&@ä8Ä8Ä8ä9$8Ä8äA$8Ä8ä8Ä9E8ä9EA&QEYÉZÌI‡QÇAGaÇYÉjYÉa†I‡A&8ÄAÇI‡R -QEIEA&AE@å8Ä9E@å8ä9EA&8ÄIEIEA&QEA&IE@å@å9E@å9†@åIEA&YEYÉZJYEA&YEAGHäQE@å@åHä0ÃIE(ä8ä8Ä9E8ä9EIEA&Y†bŒRI‡I†I‡YÉbjYÉYÇAG8ÄA†A&R‹QÇA&QE@å9E@å8Ä@å9E8ä9EA&A&@åQEIEIEA&A&8Ä9EA&@å9EQEA&QEYEZJYÉQEQE8Ä8äAGA†AGA†9E9E9E9†AG9†A&A&AGAGZJR‹(ä(äÄ £ Ä(å0æÄ0æR -BBc/ZJAG0æA†A&AG0å0å@å0æ8Ä9EAGAGA&A&A&A&A&A&9E8å0å@åA†AGI‡I‡YÉjÍbJYÉYÉI‡I‡AGA&IE8Ä9E8ä(ä(ä(ä0å0æAGA&AGRc-AÇ ÄÄ Ä(ÃÄ0æ(ä åI‡BAÇR -c/AGA&AG0æAG0æ9E0å@å1†8ÄA&AGA&A&A&A&A&A&IE8å8Ä9EA&AGI‡I‡YÉjŠbŒYÉYÉYÉI‡k/jËs/jËbŒƒÐk/bJc,bR‹ZJbJZÌjËk-bJZJbJJZJbŒc/k-{σÐ{.{.{.{,k,k/s,k/c,ƒÒ{.c,c,c/bŒƒÐk/k,s/c,{.c,jÍk/ƒÐ{oc,ƒp{o{o{.{.{o{,{.{.{.k/jËs-jËjÍbŒZJR -R -JR -ZIbŒR‹RŠjÍjËbJR‹ZJR -bJbŒc,k-{.ƒÐ{os.k-{,k-k,s/k,k/{.ƒÐk-bŒk-ZÌ{oƒpc/k-k-s-k.bŒk-ƒÐƒÒbŒ{oƒp{.{.{.{.{o{.{.k-{.Y†Y†Y†AGY†ƒÐjŠ8ÄQEA&@åAEAEQEA&QEAGQÇAGI†AGQÇI†Y†QÇI†QEIEIEIEA&QEQÇY…Y†jŠ“ÐR -QÇQEI†I†AGI†AGQEI†YEY†YɃÐjŠbZQÇYÇYÉY†Y†I‡I†AGQÇY†YÉY†YÇ{,bŒIE@åI$AEI$A&8ãQEQEA&AGI†I‡Y†AGAGQÇI†Y†I‡QÇIEQEA&IEI†QEQEY†Y†ZƒÏk-Y†I†I†I†A&I†I†QEA&Y†Y†Y†k-{.bZQÇYÇYÉYÇaÇI†AGY†I†Y†QEQEY†AGYEk-R -IEI$I$QE@åQEQEA&QEA&QEIEA&QEAGQEAGQEYEA&IEA&IEIEQEYEY†YEjË{ÐbIQEA&QEQEA&QEQEQEA&YEAGiÇk/I†YEAGYEYEQEAGQEAGQEA&I†AGI†YEYEZJbŒHäHäHä8ä@åQEIE@åQEQEA&I$QEA&QEIEAGQEAGQEY†IEIEA&IEI$IEQEY†Y†bƒÐk-I$AGQEQEQEA&QEAGQEQEAGYE{,ZJQEQEYEI‡QEQEA&QEAGQEQEAGQEY†A&QEYEZJR@åQE@åI$QEQEA&I$QE@åIEI$IEA&IEQEQEY†QEQEA&IEQEQEYEY†QÇYEjŠƒÒI‡QEAGQEA&QEA&QEA&QEAGYEYǃÐI‡YEYEYEAGYEYEAGYEI†AGQEA&I†I‡YEjËbJI$@åHä0ÃA$IEI$QE@åIEIEI$QEIEA&IEI$AGQEQEQEQEA&IEQEQEQEY†Y†QEaǃÐZJAGQEQEA&A&QEQEA&QEIEYEYEjÍbŒYEYEYEAGQEYEYEI†YEA&I†QEQEA&QEA&YER -YÉ@åI$I$QEI$QEI$A&HäQEI$A&I$QEQEQEQEYEY†QEQEQEYEY†Y†Y†Y…Y…j˃ÐI‡A&I$A&I$A&QEA&AEA&IEQEa†{obYEYEY†QEYEAGYEYEQEAGIEA&AGQÇjbJbŒI$@ä@å8ãI$I$QEA&QEHäQEQE@åI$A&I$QEQEQEYEY†QEQEQEYEY†Y†Y†Y†Y…bIƒÐZJAEQE8åQEA&QE@åIEA&A&QEYE{,bŒYEY†YEQEYEAGQEYEAGQEA&QEIEQEA&QEI‡jbJ@äIEHãHäQEQEQEQEHäQEQEQEQEQEQEQEYEY†Y†QEY†QEY†YEaÇY…aÇY†bŒ{ÏYÉIEIEA&QEA&@åQEIEA&QEQEaÇjÍZa†YEYEYEYEQEYEY†QEA&QEAGIEY†I‡jÍbŒI$@ä@å8ã@åIEI$QEQEQEHäQEIEHäQEQEQEHäYEa†Y…Y†QEYEY†QEY†aÇY…a†bk/c,I$A&AGI$A&A&AEQEA&IEQEYEbŒbŒY…YEYEYEYEQEYEY†YEAGQEA&@åQEQEYEI‡bJI$@äI$A&QEI$QEI$QEI$@åIEI$QEYEYEYEaÇQEQEYEY†Y†Y…Y…QÇYEQ…bƒÐRA&QEA&A&QE@åIEIEA&AGI$A&c/aÇYEY†YEY†YEYEY†YEQEQEQEIEIEIE@åbŒbŒ@ãHä8Ä@ä8Ã8äI$QEQEI$QEI$I$QEI$QEQEY†Y…Y…Y†IEYEY†Y†Y…Y…Y†Y…QEY†k/k-HäYEA&IEA&I$A&IEA&QEA&A&bIbŒYEY…YEY†Y†YEY†Y…YEQEA&HäA&AGI‡AGZJbŒbŒAG8æA&A&A&AGAGJI‡AGRAGI‡I‡I‡YÉAÇI‡AGAGAÇI‡AGYÉRbZJrËjÍc,ZJA&AGAGA&I‡BAGBAGI‡R‹jÍ{.R -AGI‡AGI‡I‡JI‡YÉYÉJR -I‡JI‡R -ƒÐƒÐbJAGAG9EA&AGA&AGI‡AGI‡BI‡I‡I‡JI‡YÉAGI‡AGAÇAGAGYÉRYÉZJjŠk-c,jÍA&AGAGAGAGJAGI‡AGBR -bŒk/bŒI‡I‡AGI‡I‡I‡I‡YÉJYÉBI‡k/ƒÐƒÐƒÐƒÐ{o{.{pc-ƒÐk/{Ïc/k-{.bŒk/bŒk,k/c/bŒk-{.c/k-{.ƒÐ{os/{σЃσГЌ2ƒÐ{.{.ƒÐƒÐƒÐ{oƒÐƒÐ{Ð{Ð{o“Д0‹Ð“Ð{o{Ïk/“ЃÒ{Ð{ГЃҔ“Œ“œ“œ“œ“”“œ“”“ƒÐƒÐk/k/{.ƒÐk/k/s,k/k/k-bŒc,k/bŒk-bŒk/k/s,k/ƒÒƒÐ{.{Ï{oƒÐƒÏ“ÐŒ0“ЃÐk/{σЃЃÐ{Ѓ҃Ð{Ðk/ƒÐ”2‹Î“ЃÐk/ƒÐƒÐ{ГÐsЃЃҔ“œ“ƒÒA†QEA&AGA†IEAGA†IEAGYÇRŠQEIEIEQEI$IEIEIEI$AEAEY†Y†R -IÇQÇAÇQÇA†IEAGQÇAGYÇYÇRYÇIÇYÇYÇIÇYÉQÇI†I†I†I‡I†I†I†I‡Y†bŒZIAÇA$9EA&A†A†A&AÇIEAGAEA†A†QE9EI†AGQEAÇjŠI‡IEIEQEIEHäIEIEIE@åI$I†aÇRRAÇQÇQÇA&AGAÇQEAÇQÇQÇYÇRQÇQÇYÇQÇQÇQÇAGQÇQEI‡QÇA†I†QÇY†ZZJR9E9EIEA&AÇA&A†@åHä8ã@åHä8ä8ãHä8ä@åY…ZJ@åHäHä@äHä@ãHä0Ä8ãHä8äI$QEjŠA&AE@å@ä0Ä@åA$8ÄAE@åHäAEQEQEQEQEQEI$A&IEQEQE@åIE@å9EA&QE{,AG@åA$@å9E@å8Ä9E@ä8äHä8ÄHä8ä@å8ã@å8äHäAEbIAGHäHä@ä@ãHä@äHä8ãHä8äI$@åbR -8ã@å8ÄA$0ÄAE@å@åAEI$A&I$AGHäQEQEQEQEQEA&IEI$@å9E@åA&IEbIZJ8ÄIE8å8ä9E8Ä8äAEHä8ãI$8ã@åHä8ä8ã@äHäQÇR -I$8ãI$I$8ãI$I$8ã8ÄI$8ÄI$AEZJIE8Ä8äA$8ÄA$8ÄIE8äQEAEI$A&QEA&HäYEAGIEI$A&@åIE@å8Ä9EA&YEk-YÉA$8Ä9E8ä9E@å8Ä8äAE@ãHäHäHä8äHä8ã@ä8ãI$ZJA&HäI$HäA#HäI$8ã8äAE@ä8ãHäbIÇ@åAE8ã@å8ÄAE8äAEI$A&I$QEA&QEQEYEA&QEA&I$A&I$A&8ÄIE@åIEbIjÍ8ÄIE0å8äIE@äHä@äHäHä8äHä@ã8ä@ãHäHä@ãY…R‹8ãI$@åHäI$I$8ã@åA$HäA$8äQEZJ8ÄAE8ä8ÄA$8ÄA$A$9E@åIEQE@åI$QEQEQEA&I$@å@åAE@åAE8ãIEQEQEjÍI‡8ÄA$8Ä9E@å8ä9E8ÄHä0ä8äHäHä8ä@ãHä@äHäI$ZJAGI$I$HäA#I$HäHäA$@äHäA$@äbR8Ä8ä8ÄA$8Ä8äA$8ÄIE@åQEA&I$QE@äQEQEHäA&@å@åAE@åA$8ÄIEQEbZÌ8ÄA&8ã@å8Ä8ä8ä@åHä8ä@ã@äI$@ãHä8ä@ãI$QEbŒ@åI$A#HäI$I$I$I$HäA#HäI$@åR8Ä8äI$0Ä0ã9$8Ä8äIE@åIEI$QEA&HäI$QEA&I$@åHäHäAEHä8ÄQEA&QEjËI‡0Ä0äA$8Ä8ä9$8Ä8äHä8äHä8ãI$8ã@ä@ã@äHäI$jŠAÇHã@åI$I$HäI$I$HäA#8äI$HäIÇAG8ãA$8Ä0ä9$0ÄAE@åIEI$A&HäQE@åQEHäQEA&HäHäI$8ÄIE@åAEI$QEbbŒ0Ã8ä8Ä9$0åA$8äHäHä@ä@ãHä@ã@ä@ã@äHãHäIEbŒHä@äI$I$HãI$I$HäI$HäI$8ãI$I‡A$8ä8ÄA$8ä@åAEI$QEI$QEQEQEQEQEQEQEQEQEQEQEI$I$QEA&IEQEHäbŒI‡8ãA$(ä8Ä9$8Ä9$@åHä@äHäHä@äHãHä8äHãHäHäZJI‡Hä@äI$HãI$I$I$8ãHäI$HäI$QE9†@ä8ã8ÄA$8äAEHäIEHäYEQEQEYEQEQEQEQEQEQEHäQEIEHäIEQEQEQEYÉZJ8Ä8ä8Ä(ä8ä8Ä8äHäA&IEA&A&QEA&@å8Ä@ä8äAÇbŒYÉAGIEIEQEQÇY†IEIEIEA&QÇQEZJRI‡AGIE8ÄA$A&I$A&I$Hä@åA&A&Hä@å@åQE@åHäQEA&A&A&QEA&A&I‡ZJJ(Ä(Ã8Ä0ä(ä8Ä8ä@ä8ã@ä@ãHäHäHä8ä@ãHäHäI$RŠbŒA&QEIEAGY…QÇQEA&QEAGQEAGZIYÉI‡I‡IE8Ä8äQEA&HäIEI$@å@åIE@å@å@åI$A&I$QEA&QE@åA&AGA&A&R -R‹8æ0æ9EAG(å(ä(ä0æZÌk/k/rÍ{.k/jÍR‹R -bŒZÌc/ƒÐ{.k,{.ƒÐƒÐƒÐƒÐƒÐ{σЃЃÐ{.{Ï“Ðs.c,bŒbŒbŒbŒc,jÍjÍc.jÍc/jÍbŒbŒbŒbŒR‹bŒjÍc/{.{oƒpk/k/k/s/k/bŒZÌR -c/k-bŒbŒbŒjŠZJbŒ{,{.jËjŠZJR‹jŠc/{.ƒÐk,k/{.ƒÏ“ЃЃσÐ{σσσÐk/ƒÏƒÐk,ZÌbŒbŒbŒZÌk-bŒc/c,c/jÍZÌbŒbŒbŒR‹R‹bŒc/k/ƒo{p{os/k/k/{Ðk/k/“ÐZÌR‹ZÌZÌbQEaÇYÇjIƒoA†QEIE9EAGAEHäA$9EQE9EIEAGQEAGQEA†QE@åA$9EI†AGAE@åAEAEQEjŠk/jËbŒjŠjËjËrÍjËk-jËrÍjËjËc,k/jIbZIQÇbj‰jIr‰jIjËjËrËjŠ{,jËjIjIjŠ{,ZJIE@åIEA†IEIEA$@åA$A†IEIEAGA†I†AGIEI†A&AEHä9†QEIE8ÄA†AEQEb{.k-j‰rËjËjËjÍrË{.jËjÍjËrË{.Œ2{,bIZZbjIbIjIj‰rIjŠjŠjŠjIY†@åIEHäbk-QE@å8Ä8ä0Ä0ä0Ä0ä@åIE@ä0ÄHä0ä8Ä8ä(ä8Ä8ä8Ä8ä@åAEHä0ä0ÄAEHäjIk/YÇQEQEQEQEQEI‡Y†aÇY†I‡a†jÍbŒY†A&I$QEHäQEYEYEQEYEYEYEYEYEYEYEYEYEjAG8Ä8ä8Ä8ä0Ä8ä(ä8Ä8ä@åAE8ã@ä@ä0ä@ä0Ä8ä8Ä8ä8ä8ÄIE@å8ä8Ä8äQEYEk/bYEQEQEQEQEYEI‡Y†aÇI‡a†jIƒÒYÈHäI$QEQEHäHäYEHäYEYEYEYEYEY†AGI$A&iÇjÍAGHä0Ä0ä0Ã(ä0ä@ä8ä@å8ã8ä8Ä(ä8ä(ä8Ä8ä1$8Ä9$@åA$8Ä8ä8Ä8äQEjk/I‡QEQEAGYEI‡aÇI‡aÇI‡aÇYÉ{,bŒY†AGQEA&QEQE@åQEQEYEYEY†a†Y†Y†YÉa†YÉbI‡@åI$8Ä8ä!$0Ä(ä8ä8ÄIE8ä0Ä8ä(ä0ä0Ä8ä(ä8Ä8ä9$9E8Ä@å0ã9$8Ä@åY†k/bAGAGQEI‡YEI‡aÇI‡aÇI‡aÇjŠ{.YÉQEAGQEA&QEQEYEAGYEYEI‡YEY†Y†A&@å8ÄZbŒY†8Ä0ä0Ä(ä0ã(ä8Ä8äIE8ÄA$8Ä(ä8ä8Ä(ä9$8Ä9$8Ä9EA&8ã8Ä8ä9$@åZ{.YÇaÇI‡YEI‡I‡YEI‡aÇI‡I‡a†{.k/QEQEA&AEA&AGQEI‡A&I‡QEAGaÇYÉaÇYÉYÉYÉjI‡@å8Ä9$0Ä0ä(ä0Ä0ä8Ä9E@å8ã@å0ä8Ä(ä8ä0å9$8Ä8ä@å9E@å8ã8Ä9$@åQEk/bJa†Y†I‡A&I‡I‡aÇI‡aÇI‡Y†jŠ{oI‡QEQE@å9EAGAGAGQEY†I‡YEI‡aÇQÇI‡A&@åbk/Y†@ä0Ä0ä(ä(ä8Ä(ä8ä8Ä8ä9$8Ä(ä8ä(ä0å8Ä(ä8äA$8ÄIE8ä8Ä(ä@åIEYÇk-YÇYÉYEI‡A&I‡I‡aÇI‡I‡aÇYÉjËbŒA$0æ(ä(ä(ä0æ(ä9EA&YEAGa†YÉYÉYÉZYÉQÇZJYÉHä0Ã(ä0ä0Ä(ä0ä(ä8Ä8ä@å8ã8Ä8ä(ä8Ä(ä8ä(äA$8Ä9$9E@å8Ä8ä(äIEQEjÍbYÉY†I‡YEI‡YEI‡I‡I‡Y†YÉjIƒoAG9E0æ!$(ä å8Ä9EA&AGYÇAGA&ZYÇAGI$@åZk/QEHä0Ä0ä0Ä(ä0ä0Ä8ä@å8ã0ä8Ä8ä8ä8ÄA$8Ä8äA$0Ä8äA$8Ä8ä8äHäHäYÇc,jYÉYÇI‡aÇI‡I‡YÉaÇI‡aÇaÇZJbJ(ä9E0æ å å!$ å(ä(ä8ÄA&AGbYÇYÉYÇYÉYÇZJR@ä ã0Ä0ä ä0Ã(ä@ä0ä8äHä0ÄA$0Ä8ã8ä8ä8ÄA$8Ä0ä0Ã@åI$0Ã8ä@åHäIEbŒbIiÇYÉI‡I‡I‡I‡YÉaÇYÉI‡aÇbk/9E0å0æ å å å(å å!$0ÄA†8Ä8äAÇQÇI‡AGI†ZJs/R -AGAG9E0æ0æ9$0å(ä0Ã(ä(ä8ä1†(ä8Ä0æ9EA†8æ0æAGAGA†AGAÇI‡I‡R‹bŒI‡AGAGQÇAGI‡Y†I‡AGAGA&QE{.k/(äIEAÇA&A&AGQEA&I†IEYÉYÇJZJbbJbIR -{.bŒAÇI‡AG0æA&1†(ä0å8Ä(ä0ä!$0Ä0æ1$0æ(ä9EA&A&0æ9†AGAGAGAGI‡I‡R -ZÌR -I‡AGQÇY†AGI‡Y†AGAGQEA&bƒÒAF9EAGI‡IEA&AGA†QEIEAGI‡AÇI†{,{,jÍjËrË{.jËZJbŒjŠZJR -bJZIZÌk/bJbŒZIZJbJbŒZIbŒR‹bŒjËc,k/{.k,k/rÍc,jËk-rÍRŠbR -R‹ZJbJR -bŒbŒZJZ̃Ð{.{Ïc/{,{.j˃os.ƒÐ{oƒp{oƒÐ{oƒÐ{o{.{.{,{,{,k-bJc,jŠZJR -bR‹ZJc/bŒZJR‹bZJbŒbJRŠbŒRŠk-bŒk,ƒÐk-c,k-c,jËk-rËbŒZIR -R -R‹ZJR -R‹bŒZJbŒk/ƒÐ{os/c,{,jÍ{,{oƒp{oƒp{o“Ïs.ƒo@å9EI$QEQEQE@ä@åHäA$9E@åIEQEbZJA†YEYEQEQEYEQEQEIEQEIEQEAÇbŒZY†AGQEAGI$A&QEA&IE9EAGAGQEQÇQÇYÇI‡QÇI‡QÇQÇI‡QÇYÉQÇYÇbZJY†Y†YÇYEAGIEI$QE@å9EI$A&Hä8ãA&AE@åAEQEY†bŒI‡Q…YEQEQEYEQEYEIEIEQ…IEQER‹bQÇAGYEA&QEIEIEIE9EIEA&I†AGY†QÇQÇYÉQÇI†QÇQÇYÉI‡YÇQÇYÇYÉjŠbQEAG0Ã9E8Ä@å9E@åA&@ä@å8Ä9$0åA&8ÄQEQEbc/Y†YEa†YEaÇYEYÇY†Y†I†AGAGIÇk-YÉQEA&A&QEA&A&@åAE@å9EA&I$A&QEA&QEA&AGAEA&8Ä0åA&QEAGYEYÉZYEI‡QEA&QEQEA&@åAE@å@åA$8Ä9E8ä@åA$@åQEI‡{,ZY†YEY†YEaÇY†YÇY†I†AGQÇA&bŒZJI‡QEA&A&IE@åA&@å9E@å9EA&QEA&QEA&QEA&QEA&0å0å9EA&AGYEYEbI‡YE@å0å8Ä8ä9E8Ä@å@å9E(ä@å9E8ä9EA&@åI†ZJbŒHäYEYÇY†Y†Y†Y†aÇI‡QÇI‡AÇAGbŒbIEA&IEA&8ÄIE9E@å@å9EA&IEA&AGQEA&AGQEA&A&@å9EA&A&QEAGa†YÉAGYEAGQE@åA&QE@å@åA$9E8Ä9E0å@å9$9E@åA&YÇjÍA&YEY†aÇY†YEa†aÇI‡Y†I‡I‡9†ZJbAGAGIEA&A&8ÄIE@å9EA&A&A&@åQEA&QEA&I†A&A&9E@åA&A&QEAGYEbI‡YEI‡@åA$8Ä(ä@å9E8ä8Ä(ä9E8å@å9E@å9EA&bZJIEQEa†Y†a†aÇaÇa†aÇAGI‡A†AÇZJYÉIEA&IE@åA&9E8åA&8ÄIEA&A&IEA&IEA&QEA&A&9E8Ä9EA&IEA&YEaÇYÉYEI‡A&YEAGQE8åA&8Ä8ä0å8Ä(äIE0å@å9E@å9EI‡jÍAGQ…YEaÇY†aÇaÇa†aÇI‡I‡AG9$R‹bAGQEIE@å9E@å9E@å9E@å9EA&QEA&IEA&A&I†A&@å@å1$A&AGAEQEI‡jI‡I‡I$0å8Ä8ä9$0å8Ä0å9E8ä0å@å8Ä9E@å8äIEYÉZÌY†YÇiÇjzzzzYÉY†AG9†AÇZJI‡QEA&A&9E@å@å9E@å9E@åA†@åA&IEA&A&AGIE@å0å8Ä9$A&A&QEA&a†ZJI‡QEA&A&AGQEA&@åA$8Ä9E8ä0å0åA$0åA&8ÄIEAGbŒbY†iÇa†zzzziÇI‡QÇAGI‡bŒIÇAGAGA&IE@å9E@å@å9EA&A&A&A&QE@åAGIEA&@å9E0å8Ä9EA&QEA&YEZJYÉQE8å@ä8Ä8Ä8ä8Ä9$8Ä8ä0Ä8ä8Ä9E8ä9EA&QEYÉbŒAÇI‡AGY†YÉjYÉY†Y†0å9E@åR -R -QEA&IE@å9E@å8Ä9E8ä9EA&8ÄIEIEA&QEA&IE8Ä9E@åA$9EA&A&QEYEYÉbŒQEQEA&YEA&A&QE@ä8Ä8äAE0Ä8ä8Ä9E8äA$9EQEI‡ZJR -QÇAGQÇI‡jYÉaÇI‡QE(å9EI‡R‹Y†IEA&@åA$@å0å9E8Ä@å9E@åAE@åIEQEIE@åA&9E@åAE8ÄA&IEQEA&a†ZJYÉQEQE8Ä@åAGAGAÇAÇ9EA&AÇA†AÇAG0æAGAGAGR‹ZJ å0Ä ä£Ä0æ0æ!$AGBR‹R -c/R‹AGAG9†AGAG0æ0æ9E@å8æ0æAÇAGAGAGA&A&AGAG@åIE0å8æAGI‡YÉI‡YÉjÍbJYÉbR -I‡I‡A&8æ9E0æ(ä(ä(ä(äA&0æAGA†AGI‡c-AÇ Ä ä ä Ä(å0æ å0æJR‹BBbŒAGAGAGAG9†AG0å@å9E0æ0åAGAGAGAGA&AGA&AGIE0å9E@åA†AGI‡YÉY†bŒbŒYÉYÉYÉJk/jËs/jËbŒƒÐk/bIbŒZIR‹ZJbJc,bŒjËbJR‹ZJbJR‹bŒk-c,{oƒpk-k-{,{,k-k-s.k/jË“Ð{oc,c/c,k-ƒÐk/k-rÍk.k/jËc,{.ƒÒ{Ðk/{.{o{.{.{.{.{.{.{.k-{.k-bŒjÍc/ZJR -bJR‹R -bŒc,ZJbJZÌbŒjËbŒZJR‹bŒbIZÌk-jÍs,ƒÐ{.{,{.{.k-k-s.k-k-k/ƒÒk,c/k-bŒ{σÐc,k/k-s-k.bŒk-ƒÐƒÒk.{.ƒÐ{o{.{.{.{o{,{.k/{.QÇQEY†YEY†ƒÐRŠ@åIEI$A&@åAEIEIEQEI†AGI†AGQEI†I†I‡Y†I†QEA&IEQEIEIEQEY†QEjË“ÐR -QEAGQEAGAEQEIEIEI†QEYEYɃÐjIbYÇQÇYÇYÇY†QÇQEAGQÇQEI‡QÇQEj{.QEA&IEQEQEA&IE@åAEQEQEA&QEAGY†AGQEAGQEQÇQÇI†QEA&QEA&IEIEQEYEQÇaǃÏbŒY†AGQEAGAEQEIEIEA&QEY†Y†jÍ{.bQÇI‡Y†bY†I‡QEI†I†QEY†QEQEYEAGY†jÍbIEA&I$I$IEQEQEA&I$A&QEQEA&I†YEI‡QEAGQEA&QE@åAEI$AGYEY†Y†jŠƒÐbAGIEQEQEIEAGQEQEA&YEI‡iÇk/I‡QEQEY†A&QEY†A&I†QEA&AGA†QEQEjjÍA&HäI$A&I$QEI$A&I$QEA&QEA&IEQEIEA&I†YEA&Y†AGQEIEA&IEI$IEQEY†Y†aǃÐk-QEAGI$AGQEQEAGI$AGQEYEYEk/bJAEYEQEYEA&Y†QEA&I†AGQEYEQEY†A&QEYEZJJI$QE@äQEHäQEA&I$QEQEA&I$QEA&QEQEQEQEY†QEA&IEQEQEYEaÇY…QEj˃oI‡QEAGI$A&QEA&QEA&QEAGHäaǃÒQÆYEQEYEAGQEYEY†AGQEA&I†QEA&YEZJZÌQEHä@åI$A&HãQEQEI$A&I$QEI$IEA&I$IEA&QEYEI†YEQEIEA&QEQEQEY†Y…QEbƒÐZJQEAGQEA&IEQEA&QEA&QEAGYE{,bŒYEYEY†AGQEYEI†QEYEAGQEAGQEIEAGQEA&ZJYÉA&I$I$I$QEQEQEQEQE@åIEI$A&I$QEQEQEY†QEQEQEQEYEY…aÇY…Y†Y…k-ƒpI‡QEA&IEA&QEA&AEI$A&QEQEYÇ{oYÉYEYEQEYEY†YEQEYEAGQEA&I†AGAGZjÍQE@ä@äHäIEI$HäQEQEQEQEA&I$QE@åQEA&QEQEQEYEY†QEQEQEQEY…aÇYEaÇY…b{ÐZJIEIEA&I$A&QEA&IEA&IEQEQE{,bŒYEYEQEYEYEYEYEYEAGQEA&QEIEQEA&QEYER -bI$HäI$QEQEHäQEQEHäI$QEQEQEQEQEQEYEY†Y†QEY†YEY†YEY†Y†aÇY…jŠ{ÐYÉIEIEA&QE@åIEA&IEA&QEAGa†k/aÇY…a†YEQEQEYEY†QEQEA&I†YEAGQEZJs/I$@ä@äHäI$HäHäQEQEQEHäQEI$QEI$QEQEQEHäYEa†Y…Y†QEY†YEY†YEaÇY…Y†bk/c,QEA&QEA&IE@åIEA&IEA&QEQEjËbŒYEY…YEYEY†QEYEY†QEAGQEA&A&I$QEQEYÉjJ@å@å@åHäIEQEI$QEQE@å@åIEHäQEQEYEYEa†QEQEY†QEY†QEaÇQ…QEYEZIƒÐRA&QEA&@åIEA&@åQEIEA&QEIEbŒYÉYEYEYEY†YEYEY†a†QEQEQEA&QE@åZk/QE@Ã@ä@äHäI$AEI$QEQEI$QE@äI$A&I$QEQEYEYEY…Y…QEQEY†QEY†Y…Y†Y…QEQÇk-jÍHäAGI$A&IEA&A&AEI$AGQE@åZJbJYEYEY†YEYEYEY†YEY†IE@åHäA&I‡I‡I‡ZJbŒbŒAGAGA&AGA&AGAGJI‡I‡RI‡JYÉI‡YÉRAGRAGI‡I‡I‡YÉZIZJjŠjÍjÍc,bJ9&AGAGI‡BBI‡BI‡BbŒjÍk/bJI‡I‡I‡I‡JI‡YÉJR -R -bJR -bJZJs.ƒÑbYÉYÉJAGAGA&AGAGAGI‡BI‡I‡JI‡YÉJYÉYÉAÇI‡AGI‡I‡I‡RYÉR -bJjË{.c,jÍAGAGI‡AGAÇBAGI‡BI‡R -jÍs/k/I‡I‡I‡I‡I‡R -I‡R -YÉR -R -Jk/ƒÐ{Ð{oƒpƒÐ{.k/k/{Ïk/{Ïk/k/s-jÍbŒk-bŒk-c,bŒk-k/s/c,{o{ЃÐk/{Ï{σÐ{o”0“σÐ{.ƒÐƒÐƒÐƒÐ{oƒÒƒÒƒÐ{o{.“М“ƒÐ{o{Ï{.ƒÐƒÐƒÒƒÐ{σ҃Д“œ“”“‹Ðœ“œ“œ“ƒÏƒÐk/{Ïk/k/{Ïk/k/s,k/jÍc,jÍbŒk/c,bŒbŒk,k/s/{σÐ{oƒp{Ïk/ƒÏƒÏ“ÐŒ0“ЃÐk/{σЃÐ{oƒÒ“Ѓ҃Ñk/ƒÏ”0‹ÐƒÏƒÐk/ƒÐƒÐƒÐ{ЃЃÐ{Ï”“œ“ƒÐIEAEIEIEA&IE9EQE9EI†QÇbŒAEHäI$IEI$AEHäIE@åI$AEY…QÇYÉAÇI†I‡AGA†IEAGA†QEI‡YÇIÇQÇI†QÇY†I‡QÇQEI†AGQEI†A&A†I†Y†Y†ZJR -A†9$9E9EA&A†8ÄA†AEAEAEQEAGIE9EQEIEIEAGbIR@åI$IEIEHäIEHäIEHäAEQEbI‡RAGAÇAGA†A†AGA†QEI‡QÇQÇQÇQÇI†QÇY†I‡QÇQEAGQEQÇA&A†QEAGQÇbZJAÇ@å9E9E9EA&9EIE@åHä8ã@å8ä@å8ã@åHä8äY†ZJHäHäI$8ãHä@äHä8ã8äHä8ãAEYDjŠA&A&8ã8Ä8ä8ÄAE@åAE@åHäAEQEQEQEQEQEHäQEIEQEA&I$@å9EA&A&QEk-I‡8ÄIE8å8äIE0åAEHãHä@ä@ä@ä@ä8ä8Ä8ã8ä@åIEbAGI$HäHä8äHä@ãHä0ÄHä8ãHäI$ZR -8ãAE@ä0Ä8ä@åAE@åI$8ÄQEA&QEQEQEQEHäQEA&IEIE@åAE@åAEIE@åj‰bJ8åA$@å8Ä9E@ä@å8äHä8ã@åHäHä8äHä8ã@äHäI†b8ÄI$HäI$HäA#Hä8äI$8ã@å@äI$ZJIE8ÄAE8äAE8ÄAE@åHäAEIEI$A&I$A&YEQEQEIEA&A&@åQE9E8ÄIE@åQEk-YÉ8ÄAE8ä9E8ÄA&Hä@ä@ä8ä@äHäHä8äHä8ãHä8äI$ZJAG@ãI$Hä@äI$I$8ãA$8äI$0ÃI$ZR8Ä@å8ãIE8ä8ÄAE@åAEIEI$A&I$A&QEYEYEIEA&I$IEA&AE8ÄIE0åQEbIbŒIE@å8Ä9EA&Hä@ä8äHäHä8ä@ã@ä@ã8äHã@äHäQÇZJ8ÄI$I$8ãI$I$HäA$8äHäA$HäI$ZJ9E8ÄA$8Ä8ä8ÄA$8ÄAEHäAEQEA&I$QEHäQEA&QE8Ä@åI$A$@å8ÄIEIEQEjÍIÇ8Ä8äA$@å@å8Ä8ä8ä8ãHä@ä8äHä8ã@äHä@ãHäI$ZJAGI$HäI$I$HäA#Hä8äHä8ãAEHäbI‡8ÄA$8Ä8ä9$8ÄA$8ÄAEI$AGI$A&HäQEI$A&QE@å8ÄIE@ä@åA$8ÄQEQEbZÌ8Ä8äA$@å8Ä8ä8ã@åHä8ä@ãHäI$8ãHäHä@ãI$QEbŒI$AEHäHäI$I$I$I$8ãAE@äHäI$R@å8ÄA$0Ä9$8Ä9$8ÄAEI$QEA&I$QE@åI$QE@åI$@åI$A$A&AEHäAEQEQEjËI‡8Ä(ä8ä9E8ÄA$8ÄAEHä8äHäHä@ä@ã@ä@ã@äHäI$jŠAÇHäI$8ãI$I$I$I$AEHäI$HäHäQÇA†8Ä8äA$0Ä0äA$8ÄAEI$QEA&HäQEQE@äQEQE@äQE@åHäAEI$8ÄIEIEQEYÉbŒ0Ä8ä8Ä9$9$0åHä8äHä@ä@ã@ä@ãHä8ã@äHã@äIEjŠ8ÄHäI$I$@ãI$I$I$HäI$HäI$I$AÇ8ÄA$8ä8Ä8ãAEHäIEI$QEQEQEQEQEQEQEQEYEQEQEQEHäIEI$QEQEA&HäbŒAÇ@ä0Ä8ä8ä8Ä9$8äHä8ãHä@ãHä@ãHä@ã@ä@ãHä@ãjŠI‡@äHäI$@ãI$I$I$HäHäI$A$A#QEA&8ÄA$8ä8ÄI$8ÄIEI$QEQEQEQEQEQEQEQEQEQEQEHäQEHäIEI$QEQEA&YÇZJ@ä0Ä8ä(ä8Ä0ä8ãHäAGAGY†I‡I‡AGAGA&A&A&YÉc/R -QEIEA&IEQEA&AG@åAE8ÄIEA&ZJRAGAGI†@å@åIE@åIEI$A&HäA&A&@åA&HäA&QEA&QEI‡I‡A&I‡I‡AGYÉZÌR -AGAGAGAG1†AGAGI‡AGAGYEAGI‡YÉA&A&A&A&I†bŒbŒI†A&IEQEA&QEA&IE8Ä9EA&I$YÉR‹A†AGI†A&8ÄQEIEA&I$@åQE8æA&@å@åA&HäAGQEA&YEI‡AGI‡I‡AGI‡bŒbŒAG1†AGAG9†0æAGAGc,{os/{.{oƒpc/bŒZJZÌk/{.{Ïk/k-rË{.ƒÐ{Ï{oƒp{m{oƒpsÏ{.{.ƒÏ{.k-bJc,bŒbŒk-jÍs/k/jÍk/rÍjÍc/bŒbŒbŒbŒc/{oƒp{oƒp{o{oƒp{o{Ðk/ƒÐƒÒƒÑƒÒƒÑ{Ð{oc/k/s/jÍbŒc/bŒZJZÌjÍk/ƒo{.k/k-k-ƒp{Ï{o{.ƒÐ{.{o{Ï{.{.{oƒp{.jŠZÌbŒbŒbŒk/k/c/k/s/jÍjÍjÎc/bŒbŒbŒc/k/ƒo{p{oƒÒk/ƒok/ƒÒ{Ðk/ƒÒk.c/c/c/YÇYEaÇaÇZJ{.QEI$IE8ÄIE8äA$8ÄAEQE8äA†IEIEQEIEIEIE8ÄAE8ãI†QE8Ä9EA&AEQEjŠ{.bŒj‰jŠbŒjŠjËjÍrËjÍjËbŒjËjÍbŒjŠZYÉbbZbIjIbIjIbIjIbIbIjbJjbŒZ@åIEHäQEQE@åA$A$8ÄAEAEI$A$IEQEA†QEIEIEA&@å8ãA†IEAEHäA$9EQEYÇ{obŒj‰jŠjŠjËbŒjËjËrÍjËjËjËrÍŒ2{.bYÇYÇYÉbbj‰jIbj‰bIjIrIY†A&@äI$YÉjÍQE@ä@ä8Ä(ä8ä(ä8ä@åIEHä0ÄHä0ä0Ä8ä8Ä8äA$8Ä8ä9EA&8ã8Ä8ä@åQEb{.Y†QEA&QEQEYEI‡Y†aÇI‡Y†a†{.c,A&QEHäQEHäQEYDQEHäYEYEYEYEYEI‡YEYEI‡YÉI$QEA&Hä0Ä0ä(ä8Ä8ä8ä@åAE@ä0Ä8ä8Ä8ä(ä8Ä8ä8ä8ã8ÄQE8ä8Ä8ä8ÄQEYEk/bIQEQEQEQEQEI‡YEaÇI‡Y†Y†jŠ{obQE@åQEI$I$QEYEHäYEYEYEYEQEY†AGI$@åbbŒY†8Ä8ä0Ä(ä(ä8ä8Ä8äAE0Ä8ä8ä(ä0Ä8ä(ä0å8Ä0äA$0åAEHä0Ã9$8ÄI$jk/QÇYEAGQEI‡aÇAGY†YÉY†YÉaÇ{,jÍAGQEQEA&QEQE@åQEYEQEQEYEI‡YEa†Y†QEAGZHäQEI$I$(ä8Ä0ä(ä(ä8ÄIE8ä0Ä8ä8Ä(ä8ä(ä8Ä8ä9$8Ä9$9E@ä8Ä9$8Ä@åY†k/bYEAGA&YEI‡aÇI‡aÇI‡Y†YÉjIƒoI‡YEA&QEA&AGQEQEQEYEI‡YEYEI‡Y†A&@å8ÄZk/YE8Ä8ä(ä(ä0Ä(ä8ä8ÄIE8ä8Ä8ä8Ä(ä8ä(ä9$8Ä9$8Ä9E@åHä(ä8ä8ÄIEbc/YÉY†I‡YEI‡AGY†aÇI‡aÇI‡aÇ{.jÍQEQE@å9EA&AGAGAGQEQEAGQEI‡YÉY†YÉYEYÉb@äQEHä8Ä(ä8ä(ä(Ä8Ä8äA&8ã@åA$0Ä0ä(ä8Ä1†0Ã8ä9$0åIE8Ä8ä(ä8ÄIEQEk/bJY†I‡YEAGI‡YEI‡aÇI‡YÉYEjŠƒÒI‡YEA&IE9EAGQEA&I‡YEI‡I‡YEI‡QÇY†@å9Ejc/YE8Ä8ä(ä(ä(ä8Ä0ä8Ä8ä9$8Ä9$(ä8Ä(ä8ä1$8Ä0å8äA$IE8Ä8ä8ÄA$A&YÇjÍiÇI‡aÇI‡AGYEI‡I‡aÇI‡I‡a†jÍbŒA$0æ!$(ä å0æ9$0åA&AGYEAGYEI‡YÉI‡AGZZJHäI$@å@ä0Ã(ä(ä(ä8ä(ä@å8ä8Ä8ä8Ä(ä0ä8Ä(ä8ä8Ä8ä8ÄIE8äA$8Ä8ä9EQEjÍbjI‡I‡YEI‡AGaÇI‡I‡Y†YÉjƒoAG9E å(å(ä(å0æ9E0åAGbA&AGZQÇI‡A&Hãbc/YE@ä@ä0Ä(ä(Ã0Ä0ä8ä@å0Ã8ä8ä8ã8Ä8ä8ä8ÄA$8ä0Ä8ã@åHä0ä8ã8äI$YÉbŒaÇbI‡I‡aÇI‡I‡YÉaÇI‡YÉY†jŠR -(ä9E8æ å å!$(å!$(ä8ÄA&A†AGY†I†I‡YÇbR -0ÄHä8Ä ã(Ä0Ã(Ä(Ä@ä0Ä8äHä1$8ä0Ã8ä8ä8Ä8ã@åA$0Ä0ã@åI$0Ã0ä8ãI$QEbŒbIYÉiÇI‡I‡I‡YÉI‡aÇI‡YÉaÇb{o0æ0å0æ(å å å!$ å ä0ÄA†8Ä8äAGQÇI‡AGI‡ZJc/bJI‡AGAG0æ9E8æ9E(ä8Ä(ä(ä1†0å9E0æ9$9†AG0æ0æI‡AGAÇAGI‡JI‡bŒbŒJI‡I†I‡AGQÇAGAGAGI†A&AG{o{.0æ9†AGI†AGAGAGAGQEI†ZbI‡R -bJbZJs/{oR -JBI‡0æAG0æ0æ9E(å8Ä(ä(ä(ä9E0å0å9E0æAGA†8æ9†AGAGAÇAGR -I‡R -ZÌR -AGAGQÇI‡I‡YEI‡I‡I‡A&A&bƒÒAÆ9EAÇI‡AGQEA&AGY†AGI†I‡AÇI‡{,{,jÍjŠjÍ{,bŒbZÌZJbJR -ZIZJbJk/ZÌZJbJbZJRŠbŒjŠZJbŒc,jËk/ƒok.c,jÍbŒc,jËc,ZJbJRZJbJZJR‹bŒbŒbŒjË{.{Ï{.{.{.{,{,{,{o“Ï{oƒp{o“ЃÐk-ƒps,rÍ{,{,{.jÍR -bJbŒRŠbIZIR‹ZJs-ZÌbŒZJbbŒZJbJRŠjŠZJZÌk-k-s/{oc,bŒk-bŒjËk-jŠR‹YÉR -R‹ZJbJZJbJZÌbŒk/ƒosÏ{.k/{,jË{.{oƒp{oƒp{o“Ï{o{.8ÄA&HäQEHäQE@å8ÄAE@åAEHäAEQEbR‹QEY†QEYEYEQEQEQEAEIEQEAEI‡bŒbAGQEI†AGI$A&I$A&IE@åA†AGQEY†I‡QÇY†I‡QÇI†YÇI‡I‡QÇYÇaÇYÉZJQÇYEQÇQEAGQEHäYEI$QEQEA&Hä8ÄAE@åAE@åQEY†bŒQÇIEYEQEQEYEQEYEIEIEIEIEQER‹bII‡YEI†AGI$A&QEA&AEAEIEA&I†AGQÇY†QÇI‡I†Y†I‡I‡I‡QÇYÇaÇI‡bŒaÇQEIE8Ä9$8ä9EA&@åAE@å8ÄAE8ä8Ä9E8äQEA&jjÍI‡YEYEY†I‡YEa†YÇI†I‡Y†AGAÇk-YÇAGAG@åQE@åIEA&@å9E@åA&IEIEA&QEA&AGQE@åA&9EIEA&A&AGYEaÇYÉQEY†A&AGQEQEQE@å@åA&@ä8Ä@å9$0å8ÄIE8äI†Y†jÍZYEa†YEY†Y†Y†YÇY†AGQÇI†A&ZÌjII‡AG@åIEA&A&@åAE@å8ÄIEA&A&QEA&QEA&AGQEA&0å8Ä9EA&A&YEY†bI‡YE@å0å8Ä8Ä8äA$@å9$@å(ä9E@å8Ä9EA&A&QEZJbJAEYEa†Y†a†a†aÇaÇI‡Y†AÇAGAÇbŒZQEA&IE@å9E@å9E@å9EA&9EA&QEA&IEA&AGQE@åA†A&A&A&IEA&YEYÉI‡Y†YEI‡QEAGQEA&A&8Ä8äIE(ä0åIE8Ä9E@åIEA&aÇbŒAGQEa†Y†Y†a†a†aÇI‡QÇI†I‡A†ZJbJAGQEA&IE@åA$9EA&8ÄA&9EA&QEA&QEA&QEA&IEA&A&9$A&A&QEAGYEbI‡YEAGIE@å8ä9$0æ8Ä9E8ä8Ä9E0å9E8å@å8äIEbZÌ@åY…a†Y†a†aÇa†aÇaÇAGI‡9†YÉbŒQÇAGQE@åA&9E@å@å9EA&8ÄIEA&A&IEA&IEA&AGA&8ÄAGAEA&A&QEA&a†ZJAGQEA&QEAGA&QE8åA&8Ä0å8ä8Ä9E@å0å9E@å@åAGk-AGQ…a†YEaÇa†aÇaÇa†I‡QÇA&AÇbŒbAGA&A&A&AE@å@å9E@å9EA&A&QEA&IEA&A&I†A&@å9E(äA&AGA&QEYER -I‡YEA&8Ä8ä8Ä(äA$0å8Ä9E8ä8Ä0å@å9E8äIEA&JbŒYÇa†jjzzzzjAGQÇA&JZJAGQEA&9EIE8å@å9E8åA&IE@å9EA&QEA&A&AG@åAEIE@å9E@åIEA&YEaÇR -YEI‡A&QEAGQE@å@ä8Ä8ä9E8Ä9E0å8ä9E8å8ÄIEAGbŒZaÇiÇjzzzzjI‡AGI†AGbŒI‡I†AGIE@å@å9E0åA&8ÄIE9EA&A&IEA&IEA&A&IE0å@å8Ä9EA&QEA&a†ZJYÉQE@å8ÄA$8äA$8Ä8äA$8Ä0ä1$8Ä8äA$9EA&QEYÉbŒAÇY†A&AGYÉjI‡Y†I‡8Ä0æ9EJR -QEA&IE@å@å9E0å@å8ÄA$0åIEA&I$A&QEA&IEA&8ÄIE@å0åIEA&QEQEYÉjËAGQEQEA&QEA&QEA&@å8ãAE0Ä0ä0Ä9E8äA&AEQEAGbŒYÉAÇQEA&YÉYÉYÉY†I‡QE(ä9EAGR‹I†A&QE8ÄIE0å8ä@åA$9E@å@å9EI$A&QEA&QEA&8Ä@åA$9EA&IEA&QEYEZJYÉQEQE8Ä8äAÇAGI‡B0æAÇAGAÇAÇAÇAGAGAGI‡R‹ZJ å å!$ Ä Ä0æAG åAGR‹R -R -R‹bŒAÇAGAGAÇAGAG8æ9E8æ0æAGAÇAGAGAGAGAGA&I†A&AGA&A&AGI‡YÉI‡jk/bJYÉR -YÉYÉYÉYÉI‡A&A&0æ9†9EA&0æAGA†AGAGZJs/B ä Ä äÄ(ä0æ0æ1†BbŒR -R -s-:I‡AGAGAGAG9†8æ0æ0æA†AGAGAGAGAGAGA&AGA&A&A†8æA†I‡YÉI‡YÉjËjÍR -YÉR -YÉk/jËs/jËbŒƒÏk/bIbŒZIR -R‹ZJRŠjÍjËbJZJbJR -bJc,bŒc/{.{Ïk-jË{.jËk/s-k-k.c,{o{Ðk-c,k/c,{os/k/k-k-s.c,jÍ{.“ÐsÐs/{oƒps.ƒo{.{.{,{.{.{.{,jÍ{.jÍ{,{ÐjŠYÉZJZIR‹bR‹ZJbJc,jŠbŒbbŒR -R‹bŒjËk/s-{p{,jÍk-rË{,k/k-k-s.k/ƒÑk,k/{,ZÌk/{Ðk/k-s-k.k-bŒk,“ЃÒk-k/ƒÐ{.{o{.{.{,{.{,k/{,QEY†QEYEY†ƒÐRŠ@åIEI$@å@åAEQEQEIEA&AGI†I†AGI†AGQEQÇQEA&I$IEIEIEAEQEYEQEj˃ÒYÈQEA†QEIEIEIEIEA&QEQEQEYÇ{ojŠQÇQÇY†QÇI‡Y†Y†A&I†AGYEYÇY†YEY†a†k/ZI$A&I$QE@å@åAEQEA&QEIEAGI†AGQEA&QÇQEQÇAGIEI$A&IEQEA&QEYEQEbƒÐbŒQEAGQEA†QEIEA&AEQEIEQEY†jÍk,ZYÇI‡Y†I‡Y†Y†AGQEAGQEY†QEY†AGI†YEjÍYÉIEI$A&IEHäIEQEA&I$A&QEQEA&QEAGQEQEY†AGQEIEA&QE@åQEY…Y†Y†jŠ“ÐZQEAGI$AGQEA&QEQEA&QEYEjk/AGY†QEYEAGQEYEA&I†AGQEA&YEYEY†Y†Y†bŒbA&HäQEA&I$QE@åQEA&IEQEIEIEQEA&Y†AGQEAGYEQEA&IEIE@åIEYEY†Y…bƒÐjËQEI†QEQEA&QEAGHäQEAGYEYE{.ZJQEQEYEAGQEYEAGQEA&I†QEYEQEI†QEA&YEZJYÉ@åIEHäI$QEIEI$A&HäQEQEA&IEI$QEAGQEQEQEQEIEIEQEQEY†Y†Y…YEj˃oI‡I†QEA&QEA&QEA&A&QEAGQEYÉ{oYÇYEYEYEAGQEYEY†YEAGQEA&I†I‡YEYÉaÇbŒZJHäQEI$I$A&I$QEI$A&I$QEA&I$A&I$IEQEQEQEY†IEIEAEQEQEYEY†Y…Y…b{obJQEAGQEA&QEA&QEQEA&QEQEYEjÍbŒYEYEYEYEAGY†QEQEY†A&AGQEQEA&QEQEAGjR -I$I$I$QEI$QEQEQEQEI$A&HäIEIEQEQEYEYEQEQEQEQEY†YEY†Y†Y†Y…k-ƒpI‡QEA&A&I$A&QEIEA&QEIEQEaÇ{.bYEYEYEYEYEAGQEY†QEA&AGAGQEI‡I‡YÉjËR -HäI$QEHäHäQEQEQEQEQEHäQE@åQEA&QEHäYEYEQÇQEQEQEYEYEaÇY…Y†Y…bIƒÐR‹QEA&A&I$A&QEA&IEA&QEAGQE{,jËYEYEYEY†QEQEYEY†QEA&QEQEIEQEA&QEI‡jR -@åI$I$QEQEQEQEQEI$A&QEIEHäYEQEQEY…aÇYEY†Y†QEY†QEaÇY…aÇY†jŠƒÐRA&QEA&QEA&A&@åIEIEA&QEaÇjÍZYEaÇQEYEYEYEY†QEQEA&I†AGQEAGY†I‡{.bIHäQEHäI$HäQEQEQEQEI$QE@åQEQEI$QEQEYEaÇYEQEY†YEY†Y…Y†Y†aÇY…Z{obJAGQEA&QEA&@åAEIEA&IEQEQEjËbŒYEa†YEYEYEAGYEYEY†A&I†A&I$A&QEQEY†YÉYÉ8ã@åHäHäAEI$HäQE@åI$I$QEIEQEYEYEYEYEQEIEQEYEY†QEY…Y†QEYEZI{.R -AEQEA&@åIEA&AEQEA&QEA&QEjÍYÉYEYEYEY†YEYEQEY†YEQEA&QEA&Y†A&QÇbŒb@åHäI$@åI$@åIEI$HäQE@äI$A&I$QEYEQEYEYEYEIEQEY†YEY†QEY…Y…QEYÇk-k-HäQEA&@åA†I$@åIEIEA&AG@äZJbJYEYEY†YEY†QEYEY…YEQE@åHäAGI‡I‡YÉbŒjÍZÌI‡AGAÇAGAGAGJR -I‡JI‡R -I‡bJI‡YÉJI‡JI‡JI‡RYÉR‹ZJrË{,k/k-bJ9&I‡I‡AÇJBI‡R -BBbŒk/ƒobŒjbIYÉiÇbbR -jbŒbJZJYÉI‡ZJR‹YÉc,bŒYÇZYÉA&AÇAGAGI‡R -BYÉJYÉJR -YÉJbBI‡I‡JI‡I‡R -R -bJbŒ{,k-jÍc,AGAGRAGBR -BR -I‡BZJrÍ{pc/YÈI‡I‡BYÉJR -bR -R -R -R -k/ƒÐ{os/ƒÐ{.{.{Ïc,{os/{ok.c/jËs/bŒc,bŒk-bŒbŒc,k/k,c/{.ƒÒƒÐk/{.{σÐ{o“ϓЃÐ{Ï{.ƒÐ{ЃÒ{o“Ð{ЃÒ{.{.“ЋЃÐ{o{Ï{,ƒÐ{ЃÒ{.ƒÐƒÐƒÐ”0œ“{ГЃҔ0ƒÐc,{.{.{.k,ƒos.ƒÐk-c/k-jËbŒbŒbŒk-bŒbŒc,jÍk/s/k/ƒÐƒÐk/{Ï{.ƒÏ{Ï{o”0“Ðs.ƒÐk/“ЃЃЃÐ{o{Ð{o{.ƒÐ“ЃσÐ{.{Ï{oƒp{Ð{oƒpsÐ{Д2œ“ƒÐAE@åAEAEIE8ÄA†I$@åAGQÇR‹IEHãI$I$AEHäI$AEHäI$A$Y…QÇYÉAÇQEAÇQE9EIEIE9EAGY…QÇI†I‡QÇQEQÇI†Y†I†AGIEQEI†IEIEA&QÇQEbŒRIE8Ä9E8ä9EA&A$@å9†IE@å9EIEA&AEAE@åA†QEZJAÇHäI$IEHäIEI$HäI$A$8ÄQEYÇYÇJIEAGAÇAEAEIEA&QEAGY…I‡QÇQÇA†Y†I†Y†I†AGQEA&I†QE9EAGQEI†jR -AÇA&8ÄA$9EA&9E@å@åHä8ãI$8Ä@å8ã8ä@åHäI†jŠ@ä@åHäHä@äHäHä8ä8ã8ä@åI$IEjŠA&IE8Ä@å8ä8Ä9EQE8äA&HäIEQEQEQEQEQEQEA&I$QEA&@åIE@å9EA&QE{,I‡@å9E8ÄIE@å9E8ä9E@ä@åHäHä8ä@å8ã8äHä8ãIEZJAGHäHäHä8äHãHä9$0ÄHäA$8äI$bYÉA$@å8Ä8ä8ÄAE8äIE@åAE@åIEQEQEQEQEQEQEA&IEIEI$A&@åA$9EQEZJbŒHä8Ä9E@å@å8ä@åA$HäI$8ã@åHä8äHä8ã@äHäI†b8ÄI$HäA#HäI$8ãHä8äAEHä8ãI$ZJIE@å8ÄA$9E8Ä@å8äAEI$IEA&I$A&QEQEQEQEQEA&A&I$A&@åA$@å9EYEjÍYÉ8ÄAE8ä@å9$@å9EA&8ÄHä0äIEHä@ã8äHä8ãHäHäbIAG@ãI$@ãHäI$I$8ãHä8ä8ã@åI$bJ8ÄA$8Ä9E8ä@åAE@åAEHäIEIEI$A&QEQEQEQEA&I$A&@åIE8Ä9EA&QEjZÌA&@å8ÄA$9EHä8äHäHä8äHä8ãHä8ã@äHä@ãI$QÇZJ@åI$I$HäI$I$HäA$8äHäA$HäI$ZJ9E8ÄA$8Ä8ä9$8ÄA$9EA&I$QEA&I$A&HäQEQE8å@å@åAEHäA$8ÄIEIEQEjÍIÇ8Ä8äA$9E8Ä9E@ä8ä@åHä8äHäHä8ä@ã@äHãHäI$ZJAGI$HäI$I$I$HäA$8äI$8ÄI$HäZIAÇ8ÄA$8Ä8äA$8ÄA$8ÄAEIEI$QEA&I$QEHäA&QE8ÄA&HäA$IE8ÄA&I$QER -bŒ@ä8ãA$0å@å8ã8ä@åHä@ä8ãHä@äHã@ä@ã@äI$QEbŒHäI$8ãI$I$IEHãI$HäA$HäI$I$J8Ä8äA$8Ä1$0ÄA$8ÄIEI$A&I$A&QEHäQEHäA&I$@åHäI$@åAE8ÄIEQEQEjËI‡(ä8Ä8ä8Ä@å8ä8ÄAEHä8äHä8ãHä@ä@ã@ä@ãHäI$ZJI‡@äI$I$8ãIEI$HäI$HäI$A$HäQÇA&8Ä8äA$0Ä0äA$8ÄAEI$QEA&I$QE@åQEQEHäQE@ä@åI$@åAE@åAEI$QEbbŒ0Ã8ä8Ä9$8Ä9E@äHäHä@äHã@äHã@äHä@ãHäHäIEc,Hä8ãI$HäHäI$I$Hä@ãI$I$8ãIEAGA$A$8ä8ã8ÄAEI$QEI$QEQEQEYEQEQEQEQEYEQEQEQEHäQEI$QEQEA&QEbŒAG@åA$0Ã9$(ä9E8Ä@å@ã@äHäHãHä@ã@ä@ãHäHãHäjŠAÇHäHäI$@ãI$I$HãHä@äI$HäA#QEA†8ã@å8äA$8ãAEI$QEHäQEYEQEAGYEHäYEA&YEQEYEQEHäIEHäQEYEA&YÉZJ8ã8Ä9$(ä8Ä8ä0ÄHäA&A&A&IEAGA&0å8Ä0ä8ÄAGbŒJAGQEA&Y†QÇI‡I†AGA†AGI†Y†R -R -QÇAGA&0ÄHä8äA&@äI$@å8Ä@åA&8å@ä@åA&I$@äQEIEA&@åAGA&A&AGR‹AG0à ä0ä0Ä0ã(Ä0ÄHäAEA&QEA&A&I‡8å0å@ä0ÃA&ZJR‹I‡A&@åQEYÇQÇAGI†AGA†I†AGbR -YÉAÇA&8Ä8ä@å@å@åIE@ä8Ä@å@åA&@äA&I$A&Hä8ÄQEA&@åA&AGA&A&ZJR -0æ0æ9†I‡ å(ä(å8æbjbkkR QÈR -bjZJbËrËj¬j«b‹j«ZjQéR bÌbÌjìbÌbÍbŒb¬kjìb‹jÌjÌbŠb‹bÌb*QÈj¬ZJQÈJ bjZJb«jÌjËj«b‹b«b‹QéR j«bÍjÌbÌbÌbŒbÌsOríj«b¬jís bŠZkQEAjjI%0ä0ä0ÄA$8ä0ä0ä0ä8ä990äIj«QfQEIfY†Q‡a¦jÍQeI%I%QEY$YfYfQfY…b -If8ä0ä0ä@ä8ä0ä0ä8Ä0ä8ä98äAbJY§IEQfQ†a§Q‡zíQ†I%IEQEYEYeYeI†Ab‹I0ä0ä(äA8ä0ä0ä0å0ä9A0äAbkY§QfIgQ‡Q§Y§jíI%9%1%AFIFQfY¨YÈYÈb*Q†0ä(ä0ä8ä98ä0ä0ä0ä99%8ä9b*YèYfI‡QfY§Q‡ríIf199%IFQ§QgQgA%b‹IF10ä0ä0Ä0ä0ä0ä8ä90äA%9A%bjQ¨Q†Q‡Q‡Y‡Ifj¬11F119IfI†AFAFZKQ§9(ä0ä0ä0ä0ä0ä8ä90äA9A%Z -YÈQ§Q‡Q‡Q‡QfrÌ1%9F119AF9EZ)b(b*QÈQèI¨QÈbjRQÈYèYèRZ)b¬bŠbJZ)QéI§QÈQèZ*Z)j¬bjbjjŠj¬rËrÌjìjjbJb)YéQèQÇQÈb*R)YÈQèYèQèZbÌbŠbJZ*Z I§QÈQèZ Z -b«b‹bjbŠj«rÌj«bj8äA9999%I%bkQEa†Y†Y¦I‡IfRJQ§A%A%A%9%9I%IFA&AEA9%AFYfQ§QFI%IF@åA199%A%bJQ†YeY†Y†Q§IgIèYèAFA%99A%A%IEA&AEA&9A&QeY§IF8å0å98ä199%AZKQea†iÇiÇQ§Afb*I†A&99%A%9%AFA%A%A&99%A&Y†Y¨IFIEIF8å90å9%8ä9%b -Qfa¦iÇiÇY§IfQéQ§A&9%A9%9AFA%A&A&9%9%I%QFYéI%8ä999$9%1A%AFZ*9F9%IfAFAfA‡Zk9%A&9%90å9AFA%A&A99%IfY‡b*IgQgAfA9E10ä9%A&R)A‡9%AfIfAG9¦R)AFA&998å9A%AFA%A99%IFIfbKQfA&bJbIjíZ*ZI§QéZ)QèQèQéZjj«Z*bJZIbjj«s ZJbjZJZ*Z)bj{ob‹j«j‹bjbJjjjKbaèbJI‡IÈQÈZ)QéIÈR ZJb‹bJb*Z)bjbjsnZjZJZŠZJbJZIƒbŠjŒj‹j‹bJjkQeIFb Q†A%I$I%IEI%AEIFIEQfI%IEQeYebjÍIEI%IEIEIEY‡bkQEQfQEQfA&IeIEQfY†Q¨IIDI%IEI%AFIEQEIFI%AEIEYeY¦s.IEIEI&IEI%Yej­QEQEQFIFAFQEIEIFQ§Q‡I$QEQEI$I%I%QEIEYeQeYfYeY¦bb¬I%IFA%A%IEQgj«YeQEQEYeAFIfIEIfYÈYÈI$I$QEI%I$QEI%QEQEQeYeYfY†YÆsA%I%A%AFA%QejÌYeYEQeYeIFIEA&QfYéI§AA%IFIfI%IFIfQ‡QfIfQfY¦YÇZ)j¬A%A&AfAFAFQéb‹QfIfQfY‡Y‡Q‡IFIfI‡Qé9AI%IFAFIFQ†QfIfIfQfQ‡YÇbjíA%AFAFAFIFI¨b¬QfQfQ†QfQ‡IFb‹bkb«bŠZJj¬ZJZ)Z Z)RbJbŠb¬b«b‹j«s jËj«jÌjÌjËb¬jìj‹j‹s b«b‹bìk jìb«b¬bjbkb«ZkbIZ)Z)Z Z)b‹bËb‹b‹bËrìjìj‹j¬jÌjÌZ‹zìj«j‹jÌjÌb‹bÌk @ä@ä8ä@ä8äQèHäAA@ä8äAYÈA%8ä8äA%A%AIEQEQEA%I%A%AIEZj@å9$999@äA8ä@äQ§A%I@äA8äAQ†AfA8ä9A%A%IEIEQEI%IEA9$A%jk8å9A8ä@äA8ä@äAZIAI$IAAQ‡8ä919AIDA%I%I%AAA%9QEZJ8ä98å91@ä@äAAQ§AEII$I9AIfAE98ä9AI%A%I%QEAAA%9I%bJ198ä8äAAA8ä@äYèAEIIEI%A$A%Q†AF98äI$I%I%IEI%I%I%I%I%A%IFbj8å1%0ä0å9%A%A%8ä@äQ§I‡AIEI$I%I$IfAfA%9AI%I%I%I%I%I%I%I%A%IEZ*8å919bJbjsZ QÈR*ZJZ*b‹j«bŠj«bjb«ZIQèZ jìjÌbÌjÌbÌb¬bÌs.jÌj̃Ns {-jìrÌsNzìs-YéIÈZ ZkZ)bjj«j«b«bJb‹bjQèYéb«jÌjíbÌjÍb¬j¬sOs j«j¬jÌs b‹ZkQEAjkI$0Ä(ä0ÄA%8ä0ä0ä8ä9990äIj‹QfQEQfQ‡Y¦Y‡jÍQeI%I%Q%QEYeYeQfYfb‹8ä8ä0ä0ÄA$8ä8ä0ä0ä8ä8ä98äAbJY§IEQfQ‡Y¦Y‡{ Q‡IEI%QEQ%QeYEI†@åb‹I(ä0ä0Ä8ä8ä0ä0ä0å0ä998äA%bKYÇIfQfQ‡Y§Qˆs A%1%99EQFIfY§Y§YÇbŒ8ä8ä(ä0ä8ä8ä0ä0ä0å0ä9A0äAZ)aèQfIgQ†Y‡Q§rìIf19%9&IFQ‡QfQ‡A%b¬Qf0ä0å0ä0ä0ä0ä199%0å9A%A&bJY§Q§QgQ‡I‡Qfs 0ä1F19%9I§YèYÈQ§jí9%10å0ä0ä0ä0ä0ä8ä90å99%A%Z*YèI‡Q‡IgQ§QgrÌ9%9F191IEAFZ Zb)QÈQÉI§QèbjQéYèYèYÈQèZ)bÌbib*Z*RI¨IÈYÈZ Z*b«bŠbjbjr«rÌrÌzìj‹bjb)YèIÈQÈQÇZŠZ YÈYèQèRZ(b¬j‹ZJZ R Q§I¨QèZ Z)b‹bkbŠbjj‹rÍjjZJ8ä9A999IEbkQEYfY†a¦I‡IfRJQ‡AFA%A99%A%I&AFI%9&9%A&Y†Q‡IFI%I%A991AA&b*Q†aeQfa¦Q‡I†IÉYèAEAA%9%A%A%I&AEI&9%9A&QeQ¨QE8å18å9199%9bjQeaÇqÇiÇQ‡I†Z*I†A&A%9%9%A%A&A%AFA%19IEY‡Q§IFI%A%990å999Z)Q†a§iÇiÇY§IfIéQ§AE9&9A9%A&A%AFA%9%9%A%QFYéA%8å9%9%9%9%9E9AFZK9E9%AgAFAgA§Z*A&AE9919%IFA%A&999EIFQˆb*Q‡IFA&A9(ä19AFZJA†1%AFIgAf9†R*AFA&9%99%9A&A%A&A%99%IFQgbJQ‡IFbIZ*rìZ*QèIÈQèZ QèIÈYéZjb«b)b)Z)bjjËs ZJZJZJZ*bIbK{nj«j‹jkjjZJbjbJj«Z*I‡I¦I¨QèZ QèQÈQéZij‹bJZ)ZIbIbk{nZ)ZJZJZJZ*b){oj‹j‹jkjjbJbJQeIFbI‡I$I%IEI%A%IEAEQFQeI%IEQEY†bjÌIFIEI%IEIFY†b‹QEQFQEIFIFAFQfaèQÈ@ä8äIEI%IEI$IFIEIFQeIEIEIEYeY§sNIEIEI&IEIEQFj¬QEQfQEIEIFIeIEI&YÇQgI$I%QEIQEI%QEQEY…QeQeY†Y†b(j¬A%I%A%AEI&Y…j‹YeYeQFYeIFAEQfb*YÈ@ä9I%IEI%I%I%QEQ%Y…QeYeYfY¦aÇk A%I%A%AEA&QEj¬YeYEQEYeIFI%A&QfZ QÈAA%IFI†IFIFQfQ†QgIfQ†Y§YçbIbÌA&A&AfA†AGQèbŒQfQfQ†Q‡Q†I‡I†ZKbJAE9A%IEIFIfIfI†Y‡Q†IfIfY§YÇb)k I%AFAfIFAfI©j¬QfQfQ†Q‡Q¦Afbjb‹b‹ZJZjbÌZ)Z Z Z)R bIbkb‹b‹bŠb«rÌj«j‹jËj¬b«b‹jËj«j‹jíb«Z‹bÌjírìjìjÌZjb*bÌZJZ*YéZIQéZ)bŠb¬j‹Zkj«jËrÌb«jËjÌb¬bŠjÌj«b‹rìb«Z‹bÌjÌ@ä9@ä8ä@äYèAIA8äAAQÇA%8å8ä9AA$IEI%QEA%I%A%9IEbJ9999A@ä8ä@ä8äQÇAIAA9AQfAf98ä9A%I%I%IEQEIEA%I9%A%bjA0äAA@ä@äA@äAYèAAI$AAAQ§8ä8ä99A%IEA%Q$I&AAA%AIEZ*8ä98å8ä8ä@äA@ä@äYÇAEIIIAAIeAF8ä99AA%I%I%I%AAA9QEbJ8ä8ä8å8äAAA8ä@äR IFI$IEQ%I$AEQ‡AfA%8äA%I$I%I%I%I%I%I%A%IEI&R)0ä0ä0ä8ä@ä@äHä8äHäQÇI‡I$I%QeAI%I†IgA%8äA%I$I%I%I%I%I%I%I%AEI&Z*0å90ä0åZJjjs R QÈR*bJZ)bŠb‹b‹j‹ZJbŠZ*QÈQéjìjÍjÌjÌjÌb¬jÌk.rÌb‹j¬j«bjjíj«j‹bjrìYèIèZ ZJZ)bjb‹b‹bŠbŠZJbiIéYèjÌjÌjìjÌjÍb¬b«so{ j«j¬jÌzìZ‹b‹IFI%jjA%0Ä0ä0äA8ä0ä8ä0ä8ä9A0ÄA%r«QfIEQfQ‡Y¦Y§jÍIfI%QEQ%QEYeYeYfY†Y§8å8ä0ä0ä998ä0ä0ä8Ä9A0äAbJY§IEQfQ†Y§Y‡rìQgIEI%Q%QEQfYeI†@åbkI%0ä(ä0ä8ä90ä0ä0å0ä9A0äAbŠYÇQfIgQ†Q‡Y§jíA%19&AEIFIfYÈYÈYÈYè8ä0ä(ä0ä8å8ä8ä0ä0å18ä9%8ä9b)YèQ‡IfY‡Q‡Q§rìIf91%9&IFQfQ§Q‡AEb¬If9(å0ä0ä0ä10ä99%99%AEIFZŠQ¨Q‡Q‡Q‡I‡Y†j¬1%1&1%99%Q‡ZYèYèbk9E11%0ä0ä0ä0ä0å991A%9IFR*YèQ‡I‡Q‡Q‡Qfj¬9%9&1%1&9$AFAfZ(Zb)QÇQÈI§QÇbŒQèYÇYÈYèQèZ(b¬bjZ)Z QèQ§IÈQÈZ)Z b‹b‹bjbjr«j¬j«jkbJb)Z(QèQèI§QÇbkQéYÇYÈQçQèZ)b«bŠZ)Z ZI§IÈQÈZ Z b‹b‹bjbjjŒrÌjjZ*9998ä19IEbkQEY†Y†Y¦Q‡A‡Z*Q†A&A%A%A9%A%IFA&AEA9&IEQgQ§QfI%I%A9999$AbJQ†Y†Yea§Q†I‡IèQÈIEA&A9%9%A&I%IFAE9&9AFQEYÈQE8å0ä9118å9%A%Z*QeiÇiÇqÇQ‡A†R QfA&9%9%9A%A&A%AFA%19%I%YfYÈAFIFA%A10å99%9Z -Q†a¦iÇiÇY§IgIéI§IEA%9%9%A%A&A%A&A%99AEIFYèI%8å99f99E9F9AFZK9F1IfAFAgI¨ZkAFAF9%199&AFA&AF9A%9&QgQ‡bJQ‡I‡IF910ä19AfZ)A‡1EAFAGIf9§R*IfA&9%999%A&AEA&AE9%9%IfQ‡bKQ‡IfbIb)ríZ)QÈI¨RZIèQÈR ZJj‹Z)b)Z)bJj«s R*bjZ*Z)Z)bJ{oj‹j‹jjbJbJbJZ)jÍQ§QÈQÈQèQèYèQÉR QèbJbŠb)b*Z)b)bjsNZJZJbiZ*Z)b){pbŠj‹jkbJbJbJQeIFaéI¦I%I$IEI%I%IEIEQfQeI&AEQEY…bj¬IFI%AEIEIFY†bŒQEIFYeIfI%AfQEbkIA$I%I%I$IEA%IEAEQEQfIEA%QEYeY¦sNIFI%IEIEIFQEjÍQEQeQFIEIfQFIEIEQ¨Q†IQEI%QEI%I%QEQEYeQeYeY†Y†b(j¬AEI%A%AEI&Q†j‹YeQEYeQeIFIeAGb‹I@äI$I%QEI%I$I%IEQ%Y…QeQeY†a†YÆkIEA%I%A&AEQEjÌYeYEYeYeIFI%A&Qfb*I¨AA&IEI†IFIfQ‡Y†Q‡IfQfYÇYèbJbËA&AFA§AfA†Z blQfQfQ†Y§Q¨Q¨Q¨k QfIfA%A&IFI†IEIfQ‡Y‡Q†IfQfYÇYÈbIjíA&IFA†AFA†QÉj¬QfQfQ‡Q‡Q§IgbjbjbkZ*ZjbÌZ*Z ZYéQèZJbjb«bkZŠb‹j«j‹j«j«j¬b‹bJjÌb‹jŠjíb‹ZŠbÌjÌj«rìb‹ZjZ*b«ZJZ Z YéRZ bkb«b‹ZŠb‹j«rËb‹j«j‹j¬bkj«jŠb‹ríZ‹bŠZ«j«@ä@ä8ä@ä@äYÇAAA@äA9YÇA98åA%A%A$I%QEI%IEA%A%9%I%bk999A@ä@ä8ä8ä@äQ§A%IAA8äAQ†AfA99A%I$A%IEQ%AEIEA%AA%bjA9A8ä@ä@ãA@äAYèA$AI$I9AQ¦998ä9A%IEI%II%AA$A%AIEZJ0ä98ä9@ä@ä@ä@ä@äYÇAEIII$AAQf9%98ä9A%I%I%I$I%I%AA9QEZJ8Ä90ä@äA%IEA%AAZ)IFI$I%A%AAI‡AF9%AA%I$I%IFI%I%IEQEIFIfIFRJ9A%9%A&A%I%IFAAQèI§I%A$I%AA%IEA‡A%9I%I%I%I%I%I%IEI%IFIfIFbJ9%91A%bjjjsZ IÈZ Z*Z(ZJbjbjbjZJZIZ QèQéríjÌjÍjÌjÍj¬bÌsrÌj¬r¬jÌ{ s s j¬j¬Z -QéYèR Z*Z)Z)bjbjbJZJZJbJQÇQéjÌjÍjÌjÌjíj¬jÌ{os j‹jŒs rÌjÌj¬IfIbKI%8ä(ä0äA8ä0ä8Ä0ä8ä9A0äAr‹QeIFQfQ†Y§Y§s IEI%I%QEQ%YEQeYfIfQfIE8ä0ä0ä990Ä8ä0ä8ä8äA8äAbJY¦IFQeQ‡Y§Y†ríQ†I%A%QEQ%QeQfQ†9j‹I0ä(ä0ä8ä8ä0ä0ä10å9A0äAbkY§Q†IgY‡Y§Y‡jÍA%11&9&IEIFQ‡Y¨Q‡Q†I0ä0ä0Ä98ä8ä(ä18Ä0äA%0ä9b)aèQgIfQ‡Q‡Y§ríIf11%A&AFQ‡Q‡I§I&b¬Q‡9118ä(ä9199%9AF9%IfbKQÇI‡Q‡I‡I‡QgjÌ1%9&1&1&A%Q§Q‡QèbJR -Af10å10ä110å9A&1A%9%IfZ*QÈQ§I‡Q‡Q‡QgrÌ1E9F9&1%9%AfAfZYèb I‡QèI§QÇbkYèYÇQÇYèQèZ(b¬bjZ ZQèI§QÈQÈZ Z)b‹bjbJbir¬j¬j‹bjb)b b)Q¨IÈIÇQÇbkR Y§YèYÇQèZ)b‹b‹Z)YèZ I§IÈQÈQèZ)bkbŠbJbjj‹rÍjjZ)8äA99$8å9%I%bkQeYfY†a¦I‡IfRJQ†A&A%A%9%9%IEA&AFI%9FA%A&Y†Q‡QfIFIE8åA0ä99AEb*Q†YeY†a¦I‡I†IéYèA%A%9%A9%A%I&IEAF99%A&QeYÈI%90ä99919A%ZJQeiÇiÇqÇQ‡A†Z*IfA%9%A9%A9&IEA&A%A%9%I&YfQÈIFIFI%8å18å91%AR -Q¦i§iÇqçY§AfR -Q‡AFA999EA&A%A&AE91I&QEQéI%8äAE9F9%9F9EAFIFZK9E1AgAFI‡AˆRJAfAFAF98å9fI&AFA&A%A&9%QgY§bkQ‡Q‡Q‡A&91%99&IFZKA§1AFAGA†I¨RJA‡A&A&91%A&AEAFA&A&A%9&IgQ†bkQ‡Igb)b)rìZ)QÈIˆQçZ QÈQÈR R -bŠZZ)Z)b)j«s.ZIZJZ*Z)Z)bJ{nb‹jjjkb)bJjJb)jIjìQ‡QÇI‡QÈZQÈQÉQèbIbkZZ Z)b)bjsOb*R)bjR*Z)b){ob‹j‹jkbJb)bJQeAFaèIgI%I$IEAIEI%IEIFQeIEIEIEY†bj¬IeI%IFI%IFY†bkYeIFYEIeIFIFQfY§bJII$I%I%A%IEI%IEIEQfIEIEI%Y…YÆsIeIEI&IEIFYEj¬QEQEQfIEIFQEIEIEY§I‡I$QEQEQEA%I$QEQeYeQfYeYfY¦b(j¬I%A%A&A%IEY†j‹YeYEQEQfI%AgIfQ‡j‹II$I%QEQEI%I%IEQ%Y†QeYeY†Y†YækIEA%A&AEI%IFrËYeYeQFYeIFIEAFQfb*IÈAFA&IeIgIfI‡Y‡Q¦Q†I†Q‡QÇaèbŠj¬AFAFA§I‡A¦Z -j¬a§Y¦a§Y§YèQ§Q§IÈb‹QfIFAEIFI‡IfI†Q‡Y¦Q†I†QgQÇYèbik I&AfI§A‡A†QÉjÍQfQ§Q§Y§Q§IgZJZJbJZjZ*b¬Z)ZQèZ QÈZ)bjb‹b‹Zjbjr‹b«b‹j«j‹b‹b*j‹bkbŠk ZJbjb‹b‹b‹bŠZ)Z*ZJj«RJZYÈYéQèZ bkb‹Z‹ZjbŠj‹j‹b‹j«j«b‹bJj‹b‹bjr¬Z‹ZJb‹b«I9@ä8ä@äYç@äAI@ä9AQÇA%8å8äA%AA%IEQEQEA%I%A9%IEbJ9999%@äA@ä8ä@äQ§A%IAA8ä9Y†Af8ä8å9%A%A%IEIEQEI%AEA%9IEbk@å99A@ä@ä@ã@äAYèIAI$IAAQ¦8å919A%I%A%I%I%AAA%AIEZJ0ä999@ä@ä@ä@ã@äY§A%I$A$IAAQf9%98ä9A%I%IEI%IA$AA%9Q$bK0ä99@äAAA%8ä8äZ AEI%QEIEA%AEI‡I†99AI$AI%I%I%I$I%I%IEA&Qé10ä0ä8äAI$A%8ä@äQ§I¨AIEIEA%IEIfI‡9%8äAI%IA&II%I%I%A%I%A&Z -0å9E0å0äYÈZ)AgI§QÈQÈQÈI‡Z)Z Z)b)b‹YèYèbYÇZ*AfI§QÈIÈQÇI§Z Z)Z)Z)j¬Yèb)YèIFQÈ0ä0ä0ä8ä19QÈQ‡Q‡Q‡Qé1%A%Q‡Q‡Yé0ä0ä0ä0ä99I§Y§Q‡Q‡Z 1%9%IfI‡I‡AfYéQ§YÇQÇZJQ§I‡I‡Q§QèQÈb)b QÈI‡IfQÉYÇYÇQÇZJQ§I‡I‡Q§QèQÈb)QÈ919%Q¨IfY†I‡QÈ9%9A&A%9AFY¨IfA&99I§IfY§I†IÈA%9A%A&9%A%QÈI%YÇZ*I†Q§I‡Q§YèQÇb)bJQÈQÇbkaèYèYÈYÇYèIfQ‡I‡QÇYèQÇbb‹QÇQÈjjYèYèYèIFQ¨I$IEIFQeQfQ†açQéAEIFZ)QfYfIfIFQÈI$IEIEQfQeQfYÇZ)AFAFZ)YeQfIfQ§QÈRQ§I†Q‡Z IÈZYèZYèQèbJIÈRQèQÇQèQ§I§I‡ZIÈYèZZYèYèbJQÈQèA@äI†II%A$IF9A%I%I%A%A%YÈ90å9AIEIEI$A$If9A%I%I%AA%QÈ98åYÈZ)AgI§QÇI¨QÇI‡Z)Z b)Z)j‹b)b)b)jIZ)AgI§QÇIÈQ§I‡Z b)Z)b)j¬Yèb)YèIFYè0ä0ä0ä0ä99QÈQ§Q‡Q‡R 1%A%Q§Y§Qé0ä0ä0ä0ä99I§Y§Q‡Q‡Z 1%9&IfI‡I‡AfZ Q§YÇQÇZJQ§IgI‡Q§QèQÈb)b QÈI‡AfYèY§YÇQÈZ*Q§I‡IgQ§QèQÈb)QÈ919%QÈIfY‡I‡QÈA%9A%AF9AEYÈIFA19I¨IfY‡I†IÈA&99%A&A%A%YÈI&YÇZ*Q†Q§I†Q¨YèQÇb)bjQÈQÇjkYèYèQÈbQ‡AfQ‡I‡QÇYèQÇaèb‹QÈQÇjkYèYèYÈIFQÈI%IEIEQfQfQ†aèRAFIFb)QfQfIfYèQ‡A$IFIEQfQfQ†aÇZ)AFAFZ YfQfIfQ§Q§R Q‡I†Q‡RQÈQèYèZQèYèbJIÈQèYèQÈQèQ§I†I‡ZIÈQèYèZYèQèbJIÈQèAAIfI%I$A$If9A%I%I%IA%Q§0ä8ä@äAIEIEI%AIf9A%I%I%I%A%QÇ8å8äQÈb)AgI‡IÇI¨I§I‡Z)Z b)b)b‹YèYèb)aèYèAfI‡IÇIÇI§I‡Z Z)b)Z)r¬Yèb ZIFYè0å0ä0ä199QèQ§Q‡Q‡Qé1%A%Q¨YèI§10ä8ä0ä99Q§Y¨Q‡Q‡Z 1%A&I†I†IgAfZ Y¦Y§QÈZ*I§IfI‡Q§QèQÈb YèQ§I‡AfQèY§Y§QÇZ*Q§IfIgQ§QèQÈb)Q§919%QÈIfY‡I‡QÈ9%9A&AF9AFYÈIfA%0å9%I§I†Y‡I‡IÈA%9A&A%9&A%YÈAFYÇZ)IfQ§I‡QÇYÈQÇb(bJQÈQ§j‹YèYèQÈb)IfI‡Q†I‡Q§YèQ§Yèb‹QÇQ¨jkYèYÈYèIFQÈI%IEIFQfQfY†bQéAFIfb QfQ†Q†Z*I%I%IEIEQfQfQ†açZ*AFAFb)QfYfIfQ§I§Z Q‡I†I†Z IÇQèYèYèQèQèbJIÈQèYèI§QèQ§I†I†Z IÇQèYèYèYèQèbJIÈQÈAAI‡I%I$AAf9A%I%I%I%AEQÈ99AAIfIEI$AIf9A%I%I%I%A%YÈ99YÈZ)AgI‡I§I§I§I†Z)b Z)b*j‹Yèb b)b Q§AfI‡I§I§I‡I‡Z Z)b)b*r¬Yèb Z IFYé10å0ä999QÈQ§Q‡Q‡R 1%A&Q‡YÈI‡0ä0å90ä99QÇQ¨Q‡Q‡Z 1%A&IfI†IgAfYéY¦YÇQÇZJI§IfI‡Q§QÈQÈb)YèQ§IgAfQèY§Y§QÇZ*Q§IfI‡Q§QÈQÈb)Q§9%9%9%QÈIfY‡I‡QÈAE9A&AFA%AFYÈIfI&19%Q¨I†Y‡I‡IèA&9AEA&9%AFYÈIFQÇb)IfI‡I‡Q§QÇQÇb)bjQÇQ¨jjYèYÈYÈaèYéIfQ†I‡Q§YÇQ§bb‹QÇQ¨jjYèYÈYÇIFQÈI%IeIFQfQ†Q†bYéAfIfb*Y†Y†I‡Q‡YèI%IeIFQfQ†Q†açZ*AFIfZ*YfQ†QfQ§I§YèI†I†I‡ZI§QÈYèYèQÈQÈbII¨QèQÇI‡YèQ§IfIfZI¨QÈYèYèQÈQèb)I¨QÈA@äI†I%I$A%If9A%I%I%I$A%Q¨0ä8äAAIEIFI$A%If9AI%I%I%A%Q§98äQÈ9%AfAFYèYÈQèQ§YÈ9EAfAFQèYÈRQ§AFI‡Q†QèAFIfI‡YÈAfI‡Q§QÈAfIfI‡Q§QÇIfQ†Q§b I†Z Y§Q§IFQ†Q§b)I†Z Y§IfI†IfI‡Q†Q‡QÈAfIfI‡IEI‡I†Q‡QÈAfQÈ9%AfAFYèYÈR YÇZ 9%AfAFYèYÈR Q§AFI‡Q¦QÈAfIfI‡YÈAFI‡Q§QÈAfIfI‡Q§QÇIfQ†Q§b)I‡ZQ§YÈIEQ†Q§b)I‡YèY§IFI†IfI†I‡Q†QÈAfIfI†IFI†I‡Q†QÈAfQÈ9%AfAFYèYèQéQ§Yè9EAFAfYèYÈR Q§AFI‡Q¦QÈAfIfI‡YÈAFI‡Q§QÈAfIfI‡Q§QÇIfQ†Q§b)I‡aèQ§QÈIfQ†Q§b)I†aéQ§IfI‡IEI‡I†Q‡QÈAfIfQ‡IEI‡I†Q‡QÈAfQÈAEAFAFYèYÈQéQÇYÈ9%AFAFYèYÈR Q§AFI‡Q†QèAFIgI‡YÈAFI‡Q§QèAFIfI‡Q§QÇIfQ†Q§b)I‡bQ§YÈIfQ†Q§b)I‡bQ§IFI†IFI†I‡Q†QÈAfIFI†IEI‡I†Q‡Q§AfIfI‡I§QÈI‡I‡I§Q§I‡Q†Q§Q¨I†Q†Q§Q¨I†I‡Q§QÈI‡I†I§Q¨I‡Q†Q§Q§I‡Q†Q§Q§IfI‡Q§Q¨I†I‡Q§Q¨I‡Q†Q§QÇI‡Q†Q§Q§I†I‡Q§QÈIfI‡Q§Q¨I†Q‡Q§Q§Q‡I†Q§Q§I†Q¨I†Q¨I‡Q§I‡Q§I†Q§I‡Q§I†Q¨I†Q§Q§Q§Q‡I§Q§ \ No newline at end of file diff --git a/glide2x/h3/glide/tests/sst1img.bat b/glide2x/h3/glide/tests/sst1img.bat deleted file mode 100644 index 91d13fd..0000000 --- a/glide2x/h3/glide/tests/sst1img.bat +++ /dev/null @@ -1,48 +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_SRCIMG%]==[] goto Default - -goto Output - -:Default -set FX_GLIDE_TEST_SRCIMG=%BUILD_ROOT_SST1%\glide\images - -:Output -set sdir=%FX_GLIDE_TEST_SRCIMG% - -@echo on -test00 -d %sdir%\test00.vgm -sleep 1 -test01 -d %sdir%\test01.vgm -sleep 1 -test02 -d %sdir%\test02.vgm -sleep 1 -test03 -d %sdir%\test03.vgm -sleep 1 -test04 -d %sdir%\test04.vgm -sleep 1 -test05 -d %sdir%\test05.vgm -sleep 1 -test06 -d %sdir%\test06.vgm -sleep 1 -test07 -d %sdir%\test07.vgm -sleep 1 -test08 -d %sdir%\test08.vgm -sleep 1 -test09 -d %sdir%\test09.vgm -sleep 1 -test10 -d %sdir%\test10.vgm -sleep 1 -test13 -d %sdir%\test13.vgm -sleep 1 -test16 -d %sdir%\test16.vgm -sleep 1 -test17 -d %sdir%\test17.vgm -sleep 1 -test18 -d %sdir%\test18.vgm -sleep 1 -test19 -d %sdir%\test19.vgm -sleep 1 diff --git a/glide2x/h3/glide/tests/test00.c b/glide2x/h3/glide/tests/test00.c deleted file mode 100644 index 275e702..0000000 --- a/glide2x/h3/glide/tests/test00.c +++ /dev/null @@ -1,137 +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 -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test00"; -static const char purpose[] = "Clear screen to blue"; -static const char usage[] = "-n -r -d "; - -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; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while(( rv = tlGetOpt( argc, argv, "nrd", &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 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, 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 ); - - tlConOutput( "Press a key to quit\n" ); - - while( frames-- && tlOkToRender()) { - grBufferClear( 0xff0000, 0, GR_WDEPTHVALUE_FARTHEST ); - tlConRender(); - grBufferSwap( 1 ); - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - exit(0); -} - diff --git a/glide2x/h3/glide/tests/test01.c b/glide2x/h3/glide/tests/test01.c deleted file mode 100644 index deae094..0000000 --- a/glide2x/h3/glide/tests/test01.c +++ /dev/null @@ -1,157 +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 -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test01"; -static const char purpose[] = "draws a diagonal line of points from top-left to bottom-right"; -static const char usage[] = "-n -r -d "; - -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; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &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 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, 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 - flat shading */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grConstantColorValue( 0xFFFFFF ); - - - tlConOutput( "Press a key to quit\n" ); - while( frames-- && tlOkToRender()) { - int i; - GrVertex vtx; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - grBufferClear( 0x0, 0, GR_WDEPTHVALUE_FARTHEST ); - - - for( i = 0; i < 100; i++ ) { - float pos = ((float)i)/100.0f; - - vtx.x = tlScaleX( pos ), vtx.y = tlScaleY( pos ); - grDrawPoint( &vtx ); - } - - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - exit(0); -} - - - - - diff --git a/glide2x/h3/glide/tests/test02.c b/glide2x/h3/glide/tests/test02.c deleted file mode 100644 index 03a74a3..0000000 --- a/glide2x/h3/glide/tests/test02.c +++ /dev/null @@ -1,159 +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 -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test02"; -static const char purpose[] = "draws a parabolic envelope of lines"; -static const char usage[] = "-n -r -d "; - -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; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &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 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, 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, 0xff0000 ); - - /* Set up Render State - flat shading */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grConstantColorValue( 0xFFFFFF ); - - - tlConOutput( "Press a key to quit\n" ); - while( frames-- && tlOkToRender()) { - int i; - GrVertex vtxA, vtxB; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00, 0, GR_WDEPTHVALUE_FARTHEST ); - - for( i = 0; i < 100; i++ ) { - float pos = ((float)i)/100.0f; - - vtxA.x = tlScaleX( pos ), vtxA.y = tlScaleY( 0.0f ); - vtxB.x = tlScaleX( 1.0f), vtxB.y = tlScaleY( pos ); - - grDrawLine( &vtxA, &vtxB ); - } - - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - exit(0); -} - - - - - diff --git a/glide2x/h3/glide/tests/test03.c b/glide2x/h3/glide/tests/test03.c deleted file mode 100644 index 2205235..0000000 --- a/glide2x/h3/glide/tests/test03.c +++ /dev/null @@ -1,154 +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 -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test03"; -static const char purpose[] = "draws gouraud shaded lines"; -static const char usage[] = "-n -r -d "; - -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; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &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 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, 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 - gouraud shading */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - - tlConOutput( "Press a key to quit\n" ); - while( frames-- && tlOkToRender() ) { - GrVertex vtxA, vtxB; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - - grBufferClear( 0x00, 0, GR_WDEPTHVALUE_FARTHEST ); - - vtxA.x = tlScaleX( 0.0f ), vtxA.y = tlScaleY( 0.0f ); - vtxA.r = 255.0f, vtxA.g = 0.0f, vtxA.b = 0.0f; - - vtxB.x = tlScaleX( 1.0f ), vtxB.y = tlScaleY( 1.0f ); - vtxB.r = 0.0f, vtxB.g = 255.0f, vtxB.b = 0.0f; - - grDrawLine( &vtxA, &vtxB ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - exit(0); -} - - - - - diff --git a/glide2x/h3/glide/tests/test04.c b/glide2x/h3/glide/tests/test04.c deleted file mode 100644 index 3c33d77..0000000 --- a/glide2x/h3/glide/tests/test04.c +++ /dev/null @@ -1,157 +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 -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test04"; -static const char purpose[] = "draws gouraud shaded triangle"; -static const char usage[] = "-n -r -d "; - -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; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &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 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, 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 - gouraud shading */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - - tlConOutput( "Press a key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00, 0, GR_WDEPTHVALUE_FARTHEST ); - - vtxA.x = tlScaleX( 0.3f ), vtxA.y = tlScaleY( 0.3f ); - vtxA.r = 255.0f, vtxA.g = 0.0f, vtxA.b = 0.0f; - - vtxB.x = tlScaleX( 0.8f ), vtxB.y = tlScaleY( 0.4f ); - vtxB.r = 0.0f, vtxB.g = 255.0f, vtxB.b = 0.0f; - - vtxC.x = tlScaleX( 0.5f ), vtxC.y = tlScaleY( 0.8f ); - vtxC.r = 0.0f, vtxC.g = 0.0f, vtxC.b = 255.0f; - - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - exit(0); -} - - - - - diff --git a/glide2x/h3/glide/tests/test05.c b/glide2x/h3/glide/tests/test05.c deleted file mode 100644 index 11829a4..0000000 --- a/glide2x/h3/glide/tests/test05.c +++ /dev/null @@ -1,191 +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 -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test05"; -static const char purpose[] = "renders two interpenetrating triangles with z-buffering"; -static const char usage[] = "-n -r -d "; - -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; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &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 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, 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 - flat shading + Z-buffering */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grDepthBufferMode( GR_DEPTHBUFFER_ZBUFFER ); - grDepthBufferFunction( GR_CMP_GREATER ); - grDepthMask( FXTRUE ); - - tlConOutput( "Press a key to quit\n" ); - - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - float zDist; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - grBufferClear( 0x00, 0, GR_ZDEPTHVALUE_FARTHEST ); - - vtxA.x = tlScaleX( 0.25f ), vtxA.y = tlScaleY( 0.21f ); - vtxB.x = tlScaleX( 0.75f ), vtxB.y = tlScaleY( 0.21f ); - vtxC.x = tlScaleX( 0.5f ), vtxC.y = tlScaleY( 0.79f ); - - /*----------------------------------------------------------- - Depth values should be scaled from reciprocated Depth Value - then scaled from 0 to 65535.0. - - ooz = ( 1.0f / Z ) * 65535.0f = 65535.0f / Z - -----------------------------------------------------------*/ - - zDist = 10.0f; - vtxA.ooz = vtxB.ooz = vtxC.ooz = ( 65535.0f / zDist ); - - grConstantColorValue( 0x00808080 ); - - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - - vtxA.x = tlScaleX( 0.86f ), vtxA.y = tlScaleY( 0.21f ); - vtxB.x = tlScaleX( 0.86f ), vtxB.y = tlScaleY( 0.79f ); - vtxC.x = tlScaleX( 0.14f ), vtxC.y = tlScaleY( 0.5f ); - - /*----------------------------------------------------------- - Depth values should be scaled from reciprocated Depth Value - then scaled to ( 0, 65535 ) - - ooz = ( 1.0f / Z ) * 65535.0f = 65535.0f / Z - -----------------------------------------------------------*/ - - zDist = 12.5f; - vtxA.ooz = vtxB.ooz = ( 65535.0f / zDist ); - zDist = 7.5f; - vtxC.ooz = ( 65535.0f / zDist ); - - grConstantColorValue( 0x0000FF00 ); - - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - exit(0); -} - - - - - diff --git a/glide2x/h3/glide/tests/test06.c b/glide2x/h3/glide/tests/test06.c deleted file mode 100644 index 9ef1cd6..0000000 --- a/glide2x/h3/glide/tests/test06.c +++ /dev/null @@ -1,188 +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 -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test06"; -static const char purpose[] = "renders two interpenetrating triangles with w-buffering"; -static const char usage[] = "-n -r -d "; - -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; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &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 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, remArgs[0]); - } - } - - 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 - flat shading + w-buffering */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grDepthBufferMode( GR_DEPTHBUFFER_WBUFFER ); - grDepthBufferFunction( GR_CMP_LESS ); - grDepthMask( FXTRUE ); - - tlConOutput( "Press a key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - float wDist; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00, 0, GR_WDEPTHVALUE_FARTHEST ); - - vtxA.x = tlScaleX( 0.25f ), vtxA.y = tlScaleY( 0.21f ); - vtxB.x = tlScaleX( 0.75f ), vtxB.y = tlScaleY( 0.21f ); - vtxC.x = tlScaleX( 0.5f ), vtxC.y = tlScaleY( 0.79f ); - - /*----------------------------------------------------------- - OOW Values are in the range (1,1/65535) - - This can be the exact same computed 1/W that you use - for texture mapping. This saves on host computation and - vertex data transferred across the PCI bus. - -----------------------------------------------------------*/ - wDist = 10.0f; - vtxA.oow = vtxB.oow = vtxC.oow = ( 1.0f / wDist ); - - grConstantColorValue( 0x00808080 ); - - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - - vtxA.x = tlScaleX( 0.86f ), vtxA.y = tlScaleY( 0.21f ); - vtxB.x = tlScaleX( 0.86f ), vtxB.y = tlScaleY( 0.79f ); - vtxC.x = tlScaleX( 0.14f ), vtxC.y = tlScaleY( 0.5f ); - - /*----------------------------------------------------------- - OOW Values are in the range (1,1/65535) - - This can be the exact same computed 1/W that you use - for texture mapping. This saves on host computation and - vertex data transferred across the PCI bus. - -----------------------------------------------------------*/ - wDist = 12.5f; - vtxA.oow = vtxB.oow = ( 1.0f / wDist ); - wDist = 7.5f; - vtxC.oow = ( 1.0f / wDist ); - - grConstantColorValue( 0x0000FF00 ); - - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - exit(0); -} - - - - - diff --git a/glide2x/h3/glide/tests/test07.c b/glide2x/h3/glide/tests/test07.c deleted file mode 100644 index da05ef3..0000000 --- a/glide2x/h3/glide/tests/test07.c +++ /dev/null @@ -1,171 +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 -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test07"; -static const char purpose[] = "alpha blending test"; -static const char usage[] = "-n -r -d "; - -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; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &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 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, 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 - flat shading + alpha blend on constant alpha */ - 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_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_SRC_ALPHA, GR_BLEND_ONE_MINUS_SRC_ALPHA, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - - - tlConOutput( "Press a key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00, 0, 0 ); - - vtxA.x = tlScaleX( 0.25f ), vtxA.y = tlScaleY( 0.21f ); - vtxB.x = tlScaleX( 0.75f ), vtxB.y = tlScaleY( 0.21f ); - vtxC.x = tlScaleX( 0.5f ), vtxC.y = tlScaleY( 0.79f ); - - grConstantColorValue( 0xFF0000FF ); - - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - - vtxA.x = tlScaleX( 0.86f ), vtxA.y = tlScaleY( 0.21f ); - vtxB.x = tlScaleX( 0.86f ), vtxB.y = tlScaleY( 0.79f ); - vtxC.x = tlScaleX( 0.14f ), vtxC.y = tlScaleY( 0.5f ); - - grConstantColorValue( 0x80FF0000 ); - - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - exit(0); -} - - - - - diff --git a/glide2x/h3/glide/tests/test08.c b/glide2x/h3/glide/tests/test08.c deleted file mode 100644 index 90d26ec..0000000 --- a/glide2x/h3/glide/tests/test08.c +++ /dev/null @@ -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 -** -*/ - -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test08"; -static const char purpose[] = "fogging"; -static const char usage[] = "-n -r -d "; - -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; - FxBool scrgrab = FXFALSE; - char filename[256]; - - GrFog_t fogtable[GR_FOG_TABLE_SIZE]; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &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 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, 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 - gouraud shading + fog */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grFogMode( GR_FOG_WITH_TABLE ); - grFogColorValue( 0xff00ff00 ); - guFogGenerateExp( fogtable, .01f ); - grFogTable( fogtable ); - - tlConOutput( "Press a key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - float wDist; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00, 0, 0 ); - - vtxA.x = tlScaleX( 0.0f ), vtxA.y = tlScaleY( 0.0f ); - vtxA.r = 0.0f, vtxA.g = 0.0f, vtxA.b = 64.0f; - wDist = 20.0f; - vtxA.oow = ( 1.0f / wDist ); - - vtxB.x = tlScaleX( 0.016f ), vtxB.y = tlScaleY( 1.0f ); - vtxB.r = 0.0f, vtxB.g = 0.0f, vtxB.b = 128.0f; - wDist = 2000.0f; - vtxB.oow = ( 1.0f / wDist ); - - vtxC.x = tlScaleX( 1.0f ), vtxC.y = tlScaleY( 0.0208f ); - vtxC.r = 0.0f, vtxC.g = 0.0f, vtxC.b = 64.0f; - wDist = 20.0f; - vtxC.oow = ( 1.0f / wDist ); - - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - exit(0); -} - - - - - diff --git a/glide2x/h3/glide/tests/test09.c b/glide2x/h3/glide/tests/test09.c deleted file mode 100644 index 9a9d0de..0000000 --- a/glide2x/h3/glide/tests/test09.c +++ /dev/null @@ -1,212 +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 -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test09"; -static const char purpose[] = "chromakey - render a red and blue" - " triangle but chromakey one out"; -static const char usage[] = "-n -r -d "; - -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; - FxBool scrgrab = FXFALSE; - char filename[256]; - FxU8 subframe = 0; - - unsigned long chromaColor; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &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 'd': - scrgrab = FXTRUE; - frames = 2; - strcpy(filename, 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 - gouraud shading + enable chromakey on blue */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grChromakeyMode( GR_CHROMAKEY_ENABLE ); - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - - chromaColor = BLUE; - grChromakeyValue( chromaColor ); - - tlConOutput( "Press to toggle chomakey color\n" ); - tlConOutput( "Press any other key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - switch( chromaColor ) { - case RED: - tlConOutput( "Chromakey RED \r" ); - break; - case BLUE: - tlConOutput( "Chromakey BLUE\r" ); - break; - } - - grBufferClear( 0x00, 0, 0 ); - - vtxA.x = tlScaleX( 0.5f ), vtxA.y = tlScaleY( 0.1f ); - vtxB.x = tlScaleX( 0.8f ), vtxB.y = tlScaleY( 0.9f ); - vtxC.x = tlScaleX( 0.2f ), vtxC.y = tlScaleY( 0.9f ); - - grConstantColorValue( RED ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - grSstOrigin( GR_ORIGIN_LOWER_LEFT ); - - grConstantColorValue( BLUE ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - grSstOrigin( GR_ORIGIN_UPPER_LEFT ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - char fname[256], tmp[32]; - FxU16 cnt; - - cnt = strcspn(filename, "."); - strncpy(fname, filename, cnt); - fname[cnt] = 0; - sprintf(tmp,"_%d", subframe); - strcat(fname, tmp); - strcat(fname, filename+cnt); - if (!tlScreenDump(fname, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - - /* cycle through all mode */ - if ( chromaColor == RED ) - chromaColor = BLUE; - else - chromaColor = RED; - grChromakeyValue( chromaColor ); - - subframe++; - /* scrgrab = FXFALSE; */ - } - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case ' ': - if ( chromaColor == RED ) - chromaColor = BLUE; - else - chromaColor = RED; - grChromakeyValue( chromaColor ); - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} - - - - - diff --git a/glide2x/h3/glide/tests/test10.c b/glide2x/h3/glide/tests/test10.c deleted file mode 100644 index 9cb1d70..0000000 --- a/glide2x/h3/glide/tests/test10.c +++ /dev/null @@ -1,207 +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 -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test10"; -static const char purpose[] = "culling test - render a red and blue" - " triangle but cull one out - red positive" - ", blue negative"; -static const char usage[] = "-n -r -d "; - -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; - FxBool scrgrab = FXFALSE; - char filename[256]; - FxU8 subframe = 0; - - GrCullMode_t cullMode; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &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 'd': - scrgrab = FXTRUE; - frames = 2; - strcpy(filename, 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 */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - cullMode = GR_CULL_POSITIVE; - grCullMode( cullMode ); - - tlConOutput( "Press to toggle cull orientation\n" ); - tlConOutput( "Press any other key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - switch( cullMode ) { - case GR_CULL_POSITIVE: - tlConOutput( "CULL POSITIVE\r" ); - break; - case GR_CULL_NEGATIVE: - tlConOutput( "CULL NEGATIVE\r" ); - break; - } - - grBufferClear( 0x00, 0, 0 ); - - vtxA.x = tlScaleX( 0.5f ), vtxA.y = tlScaleY( 0.1f ); - vtxB.x = tlScaleX( 0.8f ), vtxB.y = tlScaleY( 0.9f ); - vtxC.x = tlScaleX( 0.2f ), vtxC.y = tlScaleY( 0.9f ); - - grConstantColorValue( 0x000000ff ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - grSstOrigin( GR_ORIGIN_LOWER_LEFT ); - - grConstantColorValue( 0x00ff0000 ); - grDrawTriangle( &vtxA, &vtxC, &vtxB ); - - grSstOrigin( GR_ORIGIN_UPPER_LEFT ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - char fname[256], tmp[32]; - FxU16 cnt; - - cnt = strcspn(filename, "."); - strncpy(fname, filename, cnt); - fname[cnt] = 0; - sprintf(tmp,"_%d", subframe); - strcat(fname, tmp); - strcat(fname, filename+cnt); - if (!tlScreenDump(fname, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - - /* cycle through all mode */ - if ( cullMode == GR_CULL_POSITIVE ) - cullMode = GR_CULL_NEGATIVE; - else - cullMode = GR_CULL_POSITIVE; - grCullMode( cullMode ); - - subframe++; - } - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case ' ': - if ( cullMode == GR_CULL_POSITIVE ) - cullMode = GR_CULL_NEGATIVE; - else - cullMode = GR_CULL_POSITIVE; - grCullMode( cullMode ); - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} - - - - - diff --git a/glide2x/h3/glide/tests/test11.c b/glide2x/h3/glide/tests/test11.c deleted file mode 100644 index 305bc66..0000000 --- a/glide2x/h3/glide/tests/test11.c +++ /dev/null @@ -1,260 +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 -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test11"; -static const char purpose[] = "simple lfb read/write test"; -static const char usage[] = "-n -r "; - -static int rRandom(int s, int e); -static unsigned int iRandom (unsigned int maxr); - -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; - - static unsigned short colorBuf[64][64]; - static unsigned short grabBuf[64][64]; - - int x,y; - - /* 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(0); - } - 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_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - disable dithering*/ - grDitherMode( GR_DITHER_DISABLE ); - - - /* Create Source Bitmap to be copied to framebuffer */ - for( y = 0; y < 64; y++ ) { - for( x = 0; x < 64; x++ ) { - FxU8 red = x << 2; - FxU8 grn = y << 2; - FxU8 blu = ( x + y )<<1; - colorBuf[y][x] = (red & 0xF8) << 8; - colorBuf[y][x] |= (grn & 0xFC) << 3; - colorBuf[y][x] |= (blu & 0xF8) >> 3; - } - } - - - tlConOutput( "Press any key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrLfbInfo_t info; - int startX, startY; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00, 0, 0 ); - - /* prepare info structure */ - info.size = sizeof( GrLfbInfo_t ); - - /* lock back buffer */ - if ( grLfbLock( GR_LFB_WRITE_ONLY, - GR_BUFFER_BACKBUFFER, - GR_LFBWRITEMODE_565, - GR_ORIGIN_UPPER_LEFT, - FXFALSE, - &info )==FXFALSE) { - tlConOutput( "Error, failed to take write lock\n" ); - break; - } - - if ( tlScaleX(1.0f) < 64.0 || - tlScaleY(1.0f) < 64.0 ) - exit(1); - - /* generate random start position */ - startX = (int)rRandom( 64, (int)tlScaleX(1.0f) - 65 ); - startY = (int)rRandom( 64, (int)tlScaleY(1.0f) - 65 ); - - /* render image to back buffer */ - for( y = 0; y < 64; y++ ) { - for( x = 0; x < 64; x++ ) { - FxU16 *pixel = - (FxU16*)(((char*)info.lfbPtr) + - (y+startY)*info.strideInBytes+ - (x+startX)*2); - *pixel = colorBuf[y][x]; - } - } - /* unlock the backbuffer */ - grLfbUnlock( GR_LFB_WRITE_ONLY, GR_BUFFER_BACKBUFFER ); - - /* swap to front buffer */ - grBufferSwap( 1 ); - grBufferClear( 0,0,0 ); - - tlSleep( 1 ); - - /* lock the front buffer */ - if ( grLfbLock( GR_LFB_READ_ONLY, - GR_BUFFER_FRONTBUFFER, - GR_LFBWRITEMODE_ANY, - GR_ORIGIN_UPPER_LEFT, - FXFALSE, - &info )==FXFALSE) { - tlConOutput( "Error, failed to take read lock\n" ); - break; - } - - /* grab the source image out of the front buffer */ - for( y = 0; y < 64; y++ ) { - for( x = 0; x < 64; x++ ) { - FxU16 *pixel = - (FxU16*)(((char*)info.lfbPtr) + - (y+startY)*info.strideInBytes+ - (x+startX)*2); - grabBuf[y][x] = *pixel; - } - } - /* unlock the front buffer */ - grLfbUnlock( GR_LFB_READ_ONLY, GR_BUFFER_FRONTBUFFER ); - - tlConClear(); - - /* compare the source image to the readback image */ - if ( memcmp( colorBuf, grabBuf, sizeof( colorBuf ) ) ) { - tlConOutput( "Failed readback test\n" ); - } else { - tlConOutput( "Passed readback test\n" ); - } - - grBufferSwap( 1 ); - tlConOutput( "Press any key to quit\n" ); - tlConRender(); - grBufferSwap( 1 ); - - tlSleep( 1 ); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - 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); -} - - - diff --git a/glide2x/h3/glide/tests/test12.c b/glide2x/h3/glide/tests/test12.c deleted file mode 100644 index 4abd5e1..0000000 --- a/glide2x/h3/glide/tests/test12.c +++ /dev/null @@ -1,345 +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 -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test12"; -static const char purpose[] = "lfb write modes, render buffer, pixpipe, yorigin test"; -static const char usage[] = "-n -r "; - - -static const char *originString[] = { - "GR_ORIGIN_UPPER_LEFT ", - "GR_ORIGIN_LOWER_RIGHT" -}; - -static const char *renderBufferString[] = { - "GR_BUFFER_FRONTBUFFER", - "GR_BUFFER_BACKBUFFER " -}; - -static const char *writeModeString[] = { - "GR_LFBWRITEMODE_565 ", - "GR_LFBWRITEMODE_555 ", - "GR_LFBWRITEMODE_1555 ", - "GR_LFBWRITEMODE_RESERVED1 ", - "GR_LFBWRITEMODE_888 ", - "GR_LFBWRITEMODE_8888 ", - "GR_LFBWRITEMODE_RESERVED2 ", - "GR_LFBWRITEMODE_RESERVED3 ", - "GR_LFBWRITEMODE_RESERVED4 ", - "GR_LFBWRITEMODE_RESERVED5 ", - "GR_LFBWRITEMODE_RESERVED6 ", - "GR_LFBWRITEMODE_RESERVED7 ", - "GR_LFBWRITEMODE_565_DEPTH ", - "GR_LFBWRITEMODE_555_DEPTH ", - "GR_LFBWRITEMODE_1555_DEPTH", - "GR_LFBWRITEMODE_ZA16 " -}; - -static const char *pixPipeString[] = { - "PIXELPIPE DISABLED", - "PIXELPIPE ENABLED " -}; - -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; - - TlTexture texture; - - GrOriginLocation_t lfbOrigin; - GrOriginLocation_t sstOrigin; - GrLfbWriteMode_t writeMode; - GrBuffer_t lfbBuffer; - GrBuffer_t sstBuffer; - GrBuffer_t curBuffer; - GrLfbInfo_t info; - FxBool pixPipe; - - /* 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; - } - } - - if ( resolution == GR_RESOLUTION_NONE ) { - tlErrorMessage( "Error!: Frontbuffer rendering not supported in a window\n" ); - exit(1); - } - - 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, 0.5f, - 60, 15, 0xffffff ); - - - /* Load source bitmap from a .3df file */ - assert( tlLoadTexture( "decal1.3df", - &texture.info, - &texture.tableType, - &texture.tableData ) ); - - lfbOrigin = GR_ORIGIN_UPPER_LEFT; - sstOrigin = GR_ORIGIN_UPPER_LEFT; - lfbBuffer = GR_BUFFER_BACKBUFFER; - sstBuffer = GR_BUFFER_BACKBUFFER; - curBuffer = GR_BUFFER_BACKBUFFER; - pixPipe = FXFALSE; - writeMode = GR_LFBWRITEMODE_565; - - info.size = sizeof( info ); - - while( frames-- && tlOkToRender()) { - - static const char *console = { - "Current Buffer: %s\n" - "1 - lock yOrigin (%s)\n" - "2 - glide yOrigin (%s)\n" - "3 - lfb render buffer (%s)\n" - "4 - glide render buffer (%s)\n" - "5 - pixpipe enable (%s)\n" - "6 - lfb write mode (%s)\n" - "Press any other key to quit\n" - }; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grRenderBuffer( GR_BUFFER_BACKBUFFER ); - grBufferClear( 0, 0, 0 ); - grRenderBuffer( GR_BUFFER_FRONTBUFFER ); - grBufferClear( 0, 0, 0 ); - grRenderBuffer( GR_BUFFER_BACKBUFFER ); - - - /* set Glide State */ - grRenderBuffer( sstBuffer ); - grSstOrigin( sstOrigin ); - - /* Attempt Lock */ - if ( grLfbLock( GR_LFB_WRITE_ONLY, - lfbBuffer, - writeMode, - lfbOrigin, - pixPipe, - &info ) ) { - int x, y; - FxU32 *longData = info.lfbPtr; - FxU16 *shortData = info.lfbPtr; - FxU16 *srcData = texture.info.data; - FxU32 longStride = info.strideInBytes >> 2; - FxU32 shortStride = info.strideInBytes >> 1; - FxU32 longColor; - FxU16 shortColor; - for( y = 0; y < 256; y++ ) - for( x = 0; x < 256; x++ ) { - switch( writeMode ) { - case GR_LFBWRITEMODE_565: - shortData[y*shortStride+x] = - srcData[y*256+x]; - break; - case GR_LFBWRITEMODE_555: - case GR_LFBWRITEMODE_1555: - shortColor = srcData[y*256+x]; - shortColor = - (0x8000) | // Alpha == 1 - ((shortColor >> 1) & 0x7C00) | - ((shortColor >> 1) & 0x03E0) | - ((shortColor) & 0x1f); - shortData[y*shortStride+x] = - shortColor; - break; - case GR_LFBWRITEMODE_888: - case GR_LFBWRITEMODE_8888: - longColor = srcData[y*256+x]; - longColor = - (0xFF000000) | - ((longColor<<8)&0x00F80000) | - ((longColor<<5)&0x0000FC00) | - ((longColor<<3)&0x000000F8); - longData[y*longStride+x] = longColor; - break; - case GR_LFBWRITEMODE_565_DEPTH: - longColor = srcData[y*256+x]; - longData[y*longStride+x] = longColor; - break; - case GR_LFBWRITEMODE_1555_DEPTH: - case GR_LFBWRITEMODE_555_DEPTH: - longColor = srcData[y*256+x]; - longColor = - (0x00008000) | - ((longColor>>1) & 0x00007C00) | - ((longColor>>1) & 0x000003E0) | - ((longColor ) & 0x0000001f); - longData[y*longStride+x] = longColor; - default: - break; - } - - } - - grLfbUnlock( GR_LFB_WRITE_ONLY, - lfbBuffer ); - - grRenderBuffer( GR_BUFFER_BACKBUFFER ); - - tlConClear(); - curBuffer = GR_BUFFER_BACKBUFFER; - tlConOutput( console, - renderBufferString[curBuffer], - originString[lfbOrigin], - originString[sstOrigin], - renderBufferString[lfbBuffer], - renderBufferString[sstBuffer], - pixPipeString[pixPipe], - writeModeString[writeMode] ); - tlConRender(); - grBufferSwap( 1 ); - tlSleep( 1 ); - tlConClear(); - curBuffer = GR_BUFFER_FRONTBUFFER; - tlConOutput( console, - renderBufferString[curBuffer], - originString[lfbOrigin], - originString[sstOrigin], - renderBufferString[lfbBuffer], - renderBufferString[sstBuffer], - pixPipeString[pixPipe], - writeModeString[writeMode] ); - tlConRender(); - grBufferSwap( 1 ); - tlSleep( 1 ); - } else { - grRenderBuffer( GR_BUFFER_BACKBUFFER ); - tlConClear(); - tlConOutput( console, - renderBufferString[curBuffer], - originString[lfbOrigin], - originString[sstOrigin], - renderBufferString[lfbBuffer], - renderBufferString[sstBuffer], - pixPipeString[pixPipe], - writeModeString[writeMode] ); - tlConOutput( "\nLock Failed....no output\n" ); - tlConRender(); - grBufferSwap( 1 ); - tlSleep( 1 ); - } - - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case '1': - lfbOrigin = !lfbOrigin; - break; - case '2': - sstOrigin = !sstOrigin; - break; - case '3': - lfbBuffer = !lfbBuffer; - break; - case '4': - sstBuffer = !sstBuffer; - break; - case '5': - pixPipe = !pixPipe; - break; - case '6': - writeMode++; - if ( writeMode > GR_LFBWRITEMODE_ZA16 ) - writeMode = GR_LFBWRITEMODE_565; - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} /* main */ - - - diff --git a/glide2x/h3/glide/tests/test13.c b/glide2x/h3/glide/tests/test13.c deleted file mode 100644 index 740c29c..0000000 --- a/glide2x/h3/glide/tests/test13.c +++ /dev/null @@ -1,174 +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 -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test13"; -static const char purpose[] = "iterated alpha test - blue triangle fades towards one vertex\n"; -static const char usage[] = "-n -r -d "; - -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; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &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 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, 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, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - iterated alpha + constant color */ - 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 ); - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - - tlConOutput( "Press any key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00, 0, 0 ); - - vtxA.x = tlScaleX( 0.5f ), vtxA.y = tlScaleY( 0.1f ); - vtxB.x = tlScaleX( 0.8f ), vtxB.y = tlScaleY( 0.9f ); - vtxC.x = tlScaleX( 0.2f ), vtxC.y = tlScaleY( 0.9f ); - vtxA.a = vtxB.a = vtxC.a = 255.0f; - - grConstantColorValue( RED ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - grSstOrigin( GR_ORIGIN_LOWER_LEFT ); - - vtxA.a = 0.0f; - grConstantColorValue( BLUE ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - grSstOrigin( GR_ORIGIN_UPPER_LEFT ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - while( tlKbHit() ) { - switch( tlGetCH() ) { - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} diff --git a/glide2x/h3/glide/tests/test14.c b/glide2x/h3/glide/tests/test14.c deleted file mode 100644 index 42170ed..0000000 --- a/glide2x/h3/glide/tests/test14.c +++ /dev/null @@ -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 -** -*/ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test14"; -static const char purpose[] = "depth bias test: vary depth bias \n" - "over time with two interpenetrating triangles"; -static const char usage[] = "-n -r "; - -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; - - short zBias; - short zDelta; - - /* 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_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - iterated alpha + z buffering */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grDepthBufferMode( GR_DEPTHBUFFER_ZBUFFER ); - grDepthBufferFunction( GR_CMP_GREATER ); - grDepthMask( FXTRUE ); - - zBias = 0; - zDelta = 10; - -#define RED 0x000000ff -#define GREEN 0x0000ff00 -#define BLUE 0x00ff0000 -#define GRAY 0x00808080 - -#define MAX_ZBIAS 500 -#define MIN_ZBIAS -500 - - tlConOutput( "Press any key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - float zDist; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - if ( ( zBias > MAX_ZBIAS ) || - ( zBias < MIN_ZBIAS ) ) { - zDelta = -zDelta; - } - zBias += zDelta; - - tlConOutput( "DepthBiasLevel: %+.03d \r", zBias ); - - grBufferClear( 0x00, 0, GR_ZDEPTHVALUE_FARTHEST ); - - vtxA.x = tlScaleX( 0.25f ), vtxA.y = tlScaleY( 0.21f ); - vtxB.x = tlScaleX( 0.75f ), vtxB.y = tlScaleY( 0.21f ); - vtxC.x = tlScaleX( 0.5f ), vtxC.y = tlScaleY( 0.79f ); - zDist = 10.0f; - vtxA.ooz = vtxB.ooz = vtxC.ooz = ( 65535.0f / zDist ); - - grConstantColorValue( GRAY ); - - grDepthBiasLevel( zBias ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - vtxA.x = tlScaleX( 0.86f ), vtxA.y = tlScaleY( 0.21f ); - vtxB.x = tlScaleX( 0.86f ), vtxB.y = tlScaleY( 0.79f ); - vtxC.x = tlScaleX( 0.14f ), vtxC.y = tlScaleY( 0.5f ); - zDist = 12.5f; - vtxA.ooz = vtxB.ooz = ( 65535.0f / zDist ); - zDist = 7.5f; - vtxC.ooz = ( 65535.0f / zDist ); - - grConstantColorValue( GREEN ); - - grDepthBiasLevel( 0 ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} diff --git a/glide2x/h3/glide/tests/test15.c b/glide2x/h3/glide/tests/test15.c deleted file mode 100644 index 95d820d..0000000 --- a/glide2x/h3/glide/tests/test15.c +++ /dev/null @@ -1,217 +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 -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test15"; -static const char purpose[] = "clip rectangle testing - clip rectangle travels around screen"; -static const char usage[] = "-n -r "; - -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; - - float clipX, clipY, clipSize, clipSizeDelta, clipPosDelta; - - /* 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_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - iterated alpha + z buffering */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - - clipX = 0.2f; - clipY = 0.5f; - clipSize = 0.3f; - - clipSizeDelta = 0.005f; - clipPosDelta = 0.01f; - -#define CLIPSIZE_MIN 0.05f -#define CLIPSIZE_MAX 0.6f - -#define GRAY 0x00808080 -#define BLACK 0x00000000 - - tlConOutput( "+/- - grow/shrink clip rectangle\n" ); - tlConOutput( "a/d - clip window left/right \n" ); - tlConOutput( "w/s - clip window up/down \n" ); - tlConOutput( "Press any other key to quit\n" ); - while( frames-- && tlOkToRender()) { - int x, y; - GrVertex vtxA, vtxB, vtxC; - int minx, miny, maxx, maxy; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grClipWindow( (int)tlScaleX(0.0f),(int)tlScaleY(0.0f), - (int)tlScaleX(1.0f),(int)tlScaleY(1.0f) ); - grBufferClear( BLACK, 0, GR_ZDEPTHVALUE_FARTHEST ); - - /* Set Clipping Rectangle */ - minx = (int)tlScaleX(clipX); - miny = (int)tlScaleY(clipY); - if ( (clipX+clipSize)>1.0f ) - maxx = (int)tlScaleX( 1.0f ); - else - maxx = (int)tlScaleX( clipX + clipSize ); - if ( (clipY+clipSize)>1.0f ) - maxy = (int)tlScaleY( 1.0f ); - else - maxy = (int)tlScaleY( clipY + clipSize ); - grClipWindow( minx, miny, maxx, maxy ); - - /* Draw 10x10 grid of triangles */ - for( y = 0; y < 10; y++ ) { - for( x = 0; x < 10; x++ ) { - /* - A - |\ - B-C - */ - vtxA.x = vtxB.x = tlScaleX( ((float)x)/10.0f ); - vtxA.y = tlScaleY( ((float)y)/10.0f ); - vtxB.y = vtxC.y = tlScaleY( (((float)y)/10.0f) + 0.1f ); - vtxC.x = tlScaleX( (((float)x)/10.0f) + 0.1f ); - - grConstantColorValue( GRAY ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - } - } - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case '+': - if ( clipSize < CLIPSIZE_MAX ) - clipSize += clipSizeDelta; - break; - case '-': - if ( clipSize > CLIPSIZE_MIN ) - clipSize -= clipSizeDelta; - break; - case 'a': - case 'A': - if ( clipX > 0.0f ) - clipX -= clipPosDelta; - if ( clipX < 0.0f ) clipX = 0.0f; - break; - case 'd': - case 'D': - if ( clipX < 1.0f ) - clipX += clipPosDelta; - break; - case 'w': - case 'W': - if ( clipY > 0.0f ) - clipY -= clipPosDelta; - if ( clipY < 0.0f ) clipY = 0.0f; - break; - case 's': - case 'S': - if ( clipY < 1.0f ) - clipY += clipPosDelta; - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} diff --git a/glide2x/h3/glide/tests/test16.c b/glide2x/h3/glide/tests/test16.c deleted file mode 100644 index a696250..0000000 --- a/glide2x/h3/glide/tests/test16.c +++ /dev/null @@ -1,201 +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 -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test16"; -static const char purpose[] = "test grShamelessPlug and grSplash"; -static const char usage[] = "-n -r -d "; - -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; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &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 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, 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, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - flat shading */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - -#define BLUE 0x00ff0000 -#define RED 0x000000ff -#define BLACK 0x00000000 - - tlConOutput( "p - toggle shameless plug on/off\n" ); - tlConOutput( "s - run the splash screen\n" ); - tlConOutput( "r - render splash continuously\n" ); - tlConOutput( "Press any other key to quit\n" ); - while( frames-- && tlOkToRender()) { - int x, y; - GrVertex vtxA, vtxB, vtxC, vtxD; - static int plug; - static int render; - static int frame = 1; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( BLACK, 0, GR_ZDEPTHVALUE_FARTHEST ); - - /* Draw 10x10 grid of triangles */ - for( y = 0; y < 10; y++ ) { - for( x = 0; x < 10; x++ ) { - /* - A-D - |\| - B-C - */ - vtxA.x = vtxB.x = tlScaleX( ((float)x)/10.0f ); - vtxA.y = vtxD.y = tlScaleY( ((float)y)/10.0f ); - vtxB.y = vtxC.y = tlScaleY( (((float)y)/10.0f) + 0.1f ); - vtxC.x = vtxD.x = tlScaleX( (((float)x)/10.0f) + 0.1f ); - - grConstantColorValue( RED ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - grConstantColorValue( BLUE ); - grDrawTriangle( &vtxA, &vtxC, &vtxD ); - } - } - - - if ( render ) { - grSplash( tlScaleX( 0.0f ), tlScaleY( 0.79f ), - tlScaleX( 0.2f ), tlScaleY( 0.2f ), - frame ); - frame++; - } - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case 'p': - case 'P': - plug = !plug; - grGlideShamelessPlug( plug ); - break; - case 's': - case 'S': - grSplash( 0.0f, 0.0f, scrWidth, scrHeight, 0 ); - break; - case 'r': - case 'R': - render = !render; - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} diff --git a/glide2x/h3/glide/tests/test17.c b/glide2x/h3/glide/tests/test17.c deleted file mode 100644 index d2e7a01..0000000 --- a/glide2x/h3/glide/tests/test17.c +++ /dev/null @@ -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 -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test17"; -static const char purpose[] = "texturing example, decal, rgb lit, white lit, flat lit"; -static const char usage[] = "-n -r -d "; - -typedef enum { DECAL, FLATLIT, RGBLIT, WHITELIT, SPECALPHA } TextureMode; -const char *textureModeNames[] = { - "DECAL TEXTURE ", - "FLAT SHADING * TEXTURE ", - "ITERATED RGB * TEXTURE ", - "INTENSITY LIGHTING * TEXTURE ", - "(ITRGB * TEXTURE)+WHITE SPECULAR" -}; - -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; - FxBool scrgrab = FXFALSE; - char filename[256]; - FxU8 subframe = 0; - - TlTexture texture; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &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 'd': - scrgrab = FXTRUE; - frames = 5; - strcpy(filename, 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, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - Decal Texture - color combine set in render loop */ - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_NONE, - GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - - /* Load texture data into system ram */ - assert( tlLoadTexture( "miro.3df", - &texture.info, - &texture.tableType, - &texture.tableData ) ); - /* Download texture data to TMU */ - grTexDownloadMipMap( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - if ( texture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - texture.tableType, - &texture.tableData ); - } - - /* Select Texture As Source of all texturing operations */ - grTexSource( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - - /* Enable Bilinear Filtering + Mipmapping */ - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR ); - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_NEAREST, - FXFALSE ); - - tlConOutput( "m - change lighting mode\n" ); - tlConOutput( "Press any other key to quit\n\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC, vtxD; - static TextureMode textureMode; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0, 0, GR_ZDEPTHVALUE_FARTHEST ); - - tlConOutput( "Current Texture Mode: %s\r", - textureModeNames[textureMode] ); - - switch( textureMode ) { - case DECAL: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - break; - case FLATLIT: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_LOCAL, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - break; - case RGBLIT: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_LOCAL, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - break; - case WHITELIT: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_LOCAL_ALPHA, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - break; - case SPECALPHA: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA, - GR_COMBINE_FACTOR_LOCAL, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - break; - } - - /*---- - A-B - |\| - C-D - -----*/ - vtxA.oow = 1.0f; - vtxB = vtxC = vtxD = vtxA; - - vtxA.x = vtxC.x = tlScaleX( 0.2f ); - vtxB.x = vtxD.x = tlScaleX( 0.8f ); - vtxA.y = vtxB.y = tlScaleY( 0.2f ); - vtxC.y = vtxD.y = tlScaleY( 0.8f ); - - vtxA.tmuvtx[0].sow = vtxC.tmuvtx[0].sow = 0.0f; - vtxB.tmuvtx[0].sow = vtxD.tmuvtx[0].sow = 255.0f; - vtxA.tmuvtx[0].tow = vtxB.tmuvtx[0].tow = 0.0f; - vtxC.tmuvtx[0].tow = vtxD.tmuvtx[0].tow = 255.0f; - - vtxA.r = 255.0f, vtxA.g = 0.0f, vtxA.b = 0.0f, vtxA.a = 255.0f; - vtxB.r = 0.0f, vtxB.g = 255.0f, vtxB.b = 0.0f, vtxB.a = 128.0f; - vtxC.r = 0.0f, vtxC.g = 0.0f, vtxC.b = 255.0f, vtxC.a = 128.0f; - vtxD.r = 0.0f, vtxD.g = 0.0f, vtxD.b = 0.0f, vtxD.a = 0.0f; - - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - - grConstantColorValue( 0x00ff0000 ); - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - /* grab the frame buffer */ - if (scrgrab) { - char fname[256], tmp[32]; - FxU16 cnt; - - cnt = strcspn(filename, "."); - strncpy(fname, filename, cnt); - fname[cnt] = 0; - sprintf(tmp,"_%d", subframe); - strcat(fname, tmp); - strcat(fname, filename+cnt); - if (!tlScreenDump(fname, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - - /* cycle through all mode */ - textureMode++; - if ( textureMode > SPECALPHA ) textureMode = DECAL; - - subframe++; - } - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case 'm': - case 'M': - textureMode++; - if ( textureMode > SPECALPHA ) textureMode = DECAL; - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} diff --git a/glide2x/h3/glide/tests/test18.c b/glide2x/h3/glide/tests/test18.c deleted file mode 100644 index 20bdaa5..0000000 --- a/glide2x/h3/glide/tests/test18.c +++ /dev/null @@ -1,258 +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 -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test18"; -static const char purpose[] = "alpha texture test"; -static const char usage[] = "-n -r -d "; - -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; - FxBool scrgrab = FXFALSE; - char filename[256]; - - TlTexture texture; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &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 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, 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, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - Decal Texture - alpha blend */ - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - - /* Load texture data into system ram */ - assert( tlLoadTexture( "alpha.3df", - &texture.info, - &texture.tableType, - &texture.tableData ) ); - /* Download texture data to TMU */ - grTexDownloadMipMap( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - if ( texture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - texture.tableType, - &texture.tableData ); - } - - /* Select Texture As Source of all texturing operations */ - grTexSource( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - - /* Enable Bilinear Filtering + Mipmapping */ - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR ); - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_NEAREST, - FXFALSE ); - - tlConOutput( "Press any key to quit\n\n" ); - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC, vtxD; - int x,y; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0, 0, GR_ZDEPTHVALUE_FARTHEST ); - - /* Draw 10x10 grid of triangles */ - - 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_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_ONE, - GR_BLEND_ZERO, - GR_BLEND_ZERO, - GR_BLEND_ZERO ); - for( y = 0; y < 10; y++ ) { - for( x = 0; x < 10; x++ ) { - /* - A-D - |\| - B-C - */ - vtxA.x = vtxB.x = tlScaleX( ((float)x)/10.0f ); - vtxA.y = vtxD.y = tlScaleY( ((float)y)/10.0f ); - vtxB.y = vtxC.y = tlScaleY( (((float)y)/10.0f) + 0.1f ); - vtxC.x = vtxD.x = tlScaleX( (((float)x)/10.0f) + 0.1f ); - - grConstantColorValue( RED ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - grConstantColorValue( BLUE ); - grDrawTriangle( &vtxA, &vtxC, &vtxD ); - } - } - - /*---- - A-B - |\| - C-D - -----*/ - vtxA.oow = 1.0f; - vtxB = vtxC = vtxD = vtxA; - - vtxA.x = vtxC.x = tlScaleX( 0.2f ); - vtxB.x = vtxD.x = tlScaleX( 0.8f ); - vtxA.y = vtxB.y = tlScaleY( 0.2f ); - vtxC.y = vtxD.y = tlScaleY( 0.8f ); - - vtxA.tmuvtx[0].sow = vtxC.tmuvtx[0].sow = 0.0f; - vtxB.tmuvtx[0].sow = vtxD.tmuvtx[0].sow = 255.0f; - vtxA.tmuvtx[0].tow = vtxB.tmuvtx[0].tow = 0.0f; - vtxC.tmuvtx[0].tow = vtxD.tmuvtx[0].tow = 255.0f; - - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grAlphaCombine( 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 ); - - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - while( tlKbHit() ) { - switch( tlGetCH() ) { - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} diff --git a/glide2x/h3/glide/tests/test19.c b/glide2x/h3/glide/tests/test19.c deleted file mode 100644 index 7867175..0000000 --- a/glide2x/h3/glide/tests/test19.c +++ /dev/null @@ -1,369 +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 -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test19"; -static const char purpose[] = "texture filter modes test"; -static const char usage[] = "-n -r -d "; - -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; - -typedef struct { - GrTexInfo info; - GrTexTable_t tableType; - TextureTable tableData; -} Texture; - -#define NO_TABLE ((GrTexTable_t)(~0)) - -static int loadTexture( const char *filename, - GrTexInfo *info, - GrTexTable_t *tableType, - void *table ); -static GrTexTable_t texTableType( GrTextureFormat_t format ); - -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; - FxBool scrgrab = FXFALSE; - char filename[256]; - FxU8 subframe = 0; - - Texture texture; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &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 'd': - scrgrab = FXTRUE; - frames = 4; - strcpy(filename, 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, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - Decal Texture - DISABLE mipmapping */ - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_DISABLE, - FXFALSE ); - - /* Load texture data into system ram */ - assert( loadTexture( "miro.3df", - &texture.info, - &texture.tableType, - &texture.tableData ) ); - /* Download texture data to TMU */ - grTexDownloadMipMap( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - if ( texture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - texture.tableType, - &texture.tableData ); - } - - /* Select Texture As Source of all texturing operations */ - grTexSource( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - - - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - - - tlConOutput( "m - toggle magnify/minify texture\n" ); - tlConOutput( "f - toggle pointSample/Bilinear\n" ); - tlConOutput( "Press any other key to quit\n\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC, vtxD; - - static int minify; - static int bilerp; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0, 0, GR_ZDEPTHVALUE_FARTHEST ); - - /*---- - A-B - |\| - C-D - -----*/ - vtxA.oow = 1.0f; - vtxB = vtxC = vtxD = vtxA; - - if ( minify ) { - vtxA.x = vtxC.x = tlScaleX( 0.0f ); - vtxB.x = vtxD.x = tlScaleX( 1.0f ); - vtxA.y = vtxB.y = tlScaleY( 0.0f ); - vtxC.y = vtxD.y = tlScaleY( 1.0f ); - } else { /* magnify */ - vtxA.x = vtxC.x = tlScaleX( 0.45f ); - vtxB.x = vtxD.x = tlScaleX( 0.55f ); - vtxA.y = vtxB.y = tlScaleY( 0.45f ); - vtxC.y = vtxD.y = tlScaleY( 0.55f ); - } - - vtxA.tmuvtx[0].sow = vtxC.tmuvtx[0].sow = 0.0f; - vtxB.tmuvtx[0].sow = vtxD.tmuvtx[0].sow = 255.0f; - vtxA.tmuvtx[0].tow = vtxB.tmuvtx[0].tow = 0.0f; - vtxC.tmuvtx[0].tow = vtxD.tmuvtx[0].tow = 255.0f; - - if ( bilerp ) { - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR ); - tlConOutput( "GR_TEXTUREFILTER_BILINEAR \r" ); - } else { - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_POINT_SAMPLED, - GR_TEXTUREFILTER_POINT_SAMPLED ); - tlConOutput( "GR_TEXTUREFILTER_POINT_SAMPLED\r" ); - } - - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - /* grab the frame buffer */ - if (scrgrab) { - char fname[256], tmp[32]; - FxU16 cnt; - - cnt = strcspn(filename, "."); - strncpy(fname, filename, cnt); - fname[cnt] = 0; - sprintf(tmp,"_%d", subframe); - strcat(fname, tmp); - strcat(fname, filename+cnt); - if (!tlScreenDump(fname, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - - subframe++; - - /* cycle through all mode */ - switch (subframe) - { - case 0: - minify = 0; - bilerp = 0; - break; - case 1: - minify = 0; - bilerp = 1; - break; - case 2: - minify = 1; - bilerp = 0; - break; - case 3: - minify = 1; - bilerp = 1; - break; - } - } - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case 'm': - case 'M': - minify = !minify; - break; - case 'f': - case 'F': - bilerp = !bilerp; - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} - - -/*------------------------------------------------------ - Load Texture - - This example loads textures from a .3df file. 3DF files - containe pre-computed mipmaps data along with any - necessary supplementary information, for example - palettes, ncc-tables, level-of-detail description, - aspect ratio or format - - The gu3dfGetInfo and gu3dfLoad APIs load A 3DF file - into Gu3DfInfo structure from a file on disk. Data - can then be extracted from the gu3DfInfo structure - to initialize a GrTexInfo structure used in the - glide texturing routines. Also note that texture table - ( either NCC or Palette ) management is left up to the - application programmer. - ------------------------------------------------------*/ -static int loadTexture( const char *filename, - GrTexInfo *info, - GrTexTable_t *tableType, - void *table ) { - Gu3dfInfo tdfInfo; - int rv = 0; - - assert( filename ); - assert( info ); - assert( tableType ); - assert( table ); - if ( gu3dfGetInfo( filename, &tdfInfo ) ) { - tdfInfo.data = malloc( tdfInfo.mem_required ); - assert( tdfInfo.data ); - if ( gu3dfLoad( filename, &tdfInfo ) ) { - info->smallLod = tdfInfo.header.small_lod; - info->largeLod = tdfInfo.header.large_lod; - info->aspectRatio = tdfInfo.header.aspect_ratio; - info->format = tdfInfo.header.format; - info->data = tdfInfo.data; - *tableType = texTableType( info->format ); - switch( *tableType ) { - case GR_TEXTABLE_NCC0: - case GR_TEXTABLE_NCC1: - case GR_TEXTABLE_PALETTE: - memcpy( table, &(tdfInfo.table), sizeof( TextureTable ) ); - break; - default: - break; - } - rv = 1; - } - } - return rv; -} - -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; -} diff --git a/glide2x/h3/glide/tests/test20.c b/glide2x/h3/glide/tests/test20.c deleted file mode 100644 index f99640f..0000000 --- a/glide2x/h3/glide/tests/test20.c +++ /dev/null @@ -1,320 +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 -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test20"; -static const char purpose[] = "mipmap modes"; -static const char usage[] = "-n -r "; - -typedef enum { DISABLE, NEAREST, TRILINEAR } MipMapMode; - - -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; - - TlTexture texture; - TlVertex3D srcVerts[4]; - float distance, dDelta; - - MipMapMode mipMapMode; - - /* 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 - Decal Texture - bilinear */ - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR ); - - /* Load texture data into system ram */ - assert( tlLoadTexture( "decal1.3df", - &texture.info, - &texture.tableType, - &texture.tableData ) ); - /* Download texture data to TMU */ - grTexDownloadMipMap( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - if ( texture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - texture.tableType, - &texture.tableData ); - } - - /* Select Texture As Source of all texturing operations */ - grTexSource( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - - /* Initialize Source 3D data - Rectangle on X/Z Plane - Centered about Y Axis - - 0--1 Z+ - | | | - 2--3 - X+ - - */ - srcVerts[0].x = -0.5f, srcVerts[0].y = 0.0f, srcVerts[0].z = 0.5f, srcVerts[0].w = 1.0f; - srcVerts[1].x = 0.5f, srcVerts[1].y = 0.0f, srcVerts[1].z = 0.5f, srcVerts[1].w = 1.0f; - srcVerts[2].x = -0.5f, srcVerts[2].y = 0.0f, srcVerts[2].z = -0.5f, srcVerts[2].w = 1.0f; - srcVerts[3].x = 0.5f, srcVerts[3].y = 0.0f, srcVerts[3].z = -0.5f, srcVerts[3].w = 1.0f; - - srcVerts[0].s = 0.0f, srcVerts[0].t = 0.0f; - srcVerts[1].s = 1.0f, srcVerts[1].t = 0.0f; - srcVerts[2].s = 0.0f, srcVerts[2].t = 1.0f; - srcVerts[3].s = 1.0f, srcVerts[3].t = 1.0f; - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - -#define MAX_DIST 2.5f -#define MIN_DIST 1.0f - - distance = 1.0f; - dDelta = 0.01f; - - mipMapMode = DISABLE; - - tlConOutput( "m - change mipmapping mode\n" ); - tlConOutput( "Press any other key to quit\n\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC, vtxD; - TlVertex3D xfVerts[4]; - TlVertex3D prjVerts[4]; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00404040, 0, GR_ZDEPTHVALUE_FARTHEST ); - - - switch( mipMapMode ) { - case DISABLE: - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_DISABLE, - FXFALSE ); - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - tlConOutput( "GR_MIPMAP_DISABLE \r" ); - break; - case NEAREST: - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_NEAREST, - FXFALSE ); - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - tlConOutput( "GR_MIPMAP_NEAREST \r" ); - break; - case TRILINEAR: - tlConOutput( "GR_MIPMAP_TRILINEAR\r" ); - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_NEAREST, - FXTRUE ); - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_BLEND_LOCAL, - GR_COMBINE_FACTOR_LOD_FRACTION, - GR_COMBINE_FUNCTION_BLEND_LOCAL, - GR_COMBINE_FACTOR_LOD_FRACTION, - FXFALSE, - FXFALSE ); - break; - } - - - /*---- - A-B - |\| - C-D - -----*/ - vtxA.oow = 1.0f; - vtxB = vtxC = vtxD = vtxA; - - distance += dDelta; - if ( distance > MAX_DIST || - distance < MIN_DIST ) { - dDelta *= -1.0f; - distance += dDelta; - } - - tlSetMatrix( tlIdentity() ); - tlMultMatrix( tlXRotation( -20.0f ) ); - tlMultMatrix( tlTranslation( 0.0f, -0.3f, distance ) ); - - tlTransformVertices( xfVerts, srcVerts, 4 ); - tlProjectVertices( prjVerts, xfVerts, 4 ); - - vtxA.x = tlScaleX( prjVerts[0].x ); - vtxA.y = tlScaleY( prjVerts[0].y ); - vtxA.oow = 1.0f / prjVerts[0].w; - - vtxB.x = tlScaleX( prjVerts[1].x ); - vtxB.y = tlScaleY( prjVerts[1].y ); - vtxB.oow = 1.0f / prjVerts[1].w; - - vtxC.x = tlScaleX( prjVerts[2].x ); - vtxC.y = tlScaleY( prjVerts[2].y ); - vtxC.oow = 1.0f / prjVerts[2].w; - - vtxD.x = tlScaleX( prjVerts[3].x ); - vtxD.y = tlScaleY( prjVerts[3].y ); - vtxD.oow = 1.0f / prjVerts[3].w; - - vtxA.tmuvtx[0].sow = prjVerts[0].s * 255.0f * vtxA.oow; - vtxA.tmuvtx[0].tow = prjVerts[0].t * 255.0f * vtxA.oow; - - vtxB.tmuvtx[0].sow = prjVerts[1].s * 255.0f * vtxB.oow; - vtxB.tmuvtx[0].tow = prjVerts[1].t * 255.0f * vtxB.oow; - - vtxC.tmuvtx[0].sow = prjVerts[2].s * 255.0f * vtxC.oow; - vtxC.tmuvtx[0].tow = prjVerts[2].t * 255.0f * vtxC.oow; - - vtxD.tmuvtx[0].sow = prjVerts[3].s * 255.0f * vtxD.oow; - vtxD.tmuvtx[0].tow = prjVerts[3].t * 255.0f * vtxD.oow; - - - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - - if ( mipMapMode == TRILINEAR ) { - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ONE, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_BLEND_LOCAL, - GR_COMBINE_FACTOR_ONE_MINUS_LOD_FRACTION, - GR_COMBINE_FUNCTION_BLEND_LOCAL, - GR_COMBINE_FACTOR_ONE_MINUS_LOD_FRACTION, - FXFALSE, - FXFALSE ); - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ZERO, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - } - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case 'm': - case 'M': - mipMapMode++; - mipMapMode%=3; - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} - - - diff --git a/glide2x/h3/glide/tests/test21.c b/glide2x/h3/glide/tests/test21.c deleted file mode 100644 index 4aec274..0000000 --- a/glide2x/h3/glide/tests/test21.c +++ /dev/null @@ -1,374 +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 -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test21"; -static const char purpose[] = "texture compositing"; -static const char usage[] = "-n -r "; - -typedef enum { LIGHTMAP, SPECULAR, DETAIL } Mode; - -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; - - TlTexture baseTexture; - unsigned long baseTextureAddr; - TlTexture lightTexture; - unsigned long lightTextureAddr; - TlTexture detailTexture; - unsigned long detailTextureAddr; - - TlVertex3D srcVerts[4]; - float distance, dDelta; - - Mode mode; - - /* 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 - decal - bilinear - nearest mipmapping */ - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_NEAREST, - FXFALSE ); - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR ); - - /* Load texture data into system ram */ - assert( tlLoadTexture( "decal1.3df", - &baseTexture.info, - &baseTexture.tableType, - &baseTexture.tableData ) ); - assert( tlLoadTexture( "light.3df", - &lightTexture.info, - &lightTexture.tableType, - &lightTexture.tableData ) ); - assert( tlLoadTexture( "lava.3df", - &detailTexture.info, - &detailTexture.tableType, - &detailTexture.tableData ) ); - - /* Download texture data to TMU */ - baseTextureAddr = grTexMinAddress( GR_TMU0 ); - grTexDownloadMipMap( GR_TMU0, - baseTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &baseTexture.info ); - if ( baseTexture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - baseTexture.tableType, - &baseTexture.tableData ); - } - - lightTextureAddr = - baseTextureAddr + - grTexTextureMemRequired( GR_MIPMAPLEVELMASK_BOTH, - &baseTexture.info ); - grTexDownloadMipMap( GR_TMU0, - lightTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &lightTexture.info ); - if ( lightTexture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - lightTexture.tableType, - &lightTexture.tableData ); - } - - detailTextureAddr = - lightTextureAddr + - grTexTextureMemRequired( GR_MIPMAPLEVELMASK_BOTH, - &lightTexture.info ); - grTexDownloadMipMap( GR_TMU0, - detailTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &detailTexture.info ); - if ( detailTexture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - detailTexture.tableType, - &detailTexture.tableData ); - } - - /* Initialize Source 3D data - Rectangle on X/Z Plane - Centered about Y Axis - - 0--1 Z+ - | | | - 2--3 - X+ - - */ - srcVerts[0].x = -0.5f, srcVerts[0].y = 0.0f, srcVerts[0].z = 0.5f, srcVerts[0].w = 1.0f; - srcVerts[1].x = 0.5f, srcVerts[1].y = 0.0f, srcVerts[1].z = 0.5f, srcVerts[1].w = 1.0f; - srcVerts[2].x = -0.5f, srcVerts[2].y = 0.0f, srcVerts[2].z = -0.5f, srcVerts[2].w = 1.0f; - srcVerts[3].x = 0.5f, srcVerts[3].y = 0.0f, srcVerts[3].z = -0.5f, srcVerts[3].w = 1.0f; - - srcVerts[0].s = 0.0f, srcVerts[0].t = 0.0f; - srcVerts[1].s = 1.0f, srcVerts[1].t = 0.0f; - srcVerts[2].s = 0.0f, srcVerts[2].t = 1.0f; - srcVerts[3].s = 1.0f, srcVerts[3].t = 1.0f; - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - -#define MAX_DIST 2.5f -#define MIN_DIST 1.0f - - distance = 1.0f; - dDelta = 0.01f; - - mode = LIGHTMAP; - - tlConOutput( "m - change texture compositing mode\n" ); - tlConOutput( "Press any other key to quit\n\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC, vtxD; - TlVertex3D xfVerts[4]; - TlVertex3D prjVerts[4]; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00404040, 0, GR_ZDEPTHVALUE_FARTHEST ); - - - /* 3D Transformations */ - /*---- - A-B - |\| - C-D - -----*/ - vtxA.oow = 1.0f; - vtxB = vtxC = vtxD = vtxA; - - distance += dDelta; - if ( distance > MAX_DIST || - distance < MIN_DIST ) { - dDelta *= -1.0f; - distance += dDelta; - } - - tlSetMatrix( tlIdentity() ); - tlMultMatrix( tlXRotation( -20.0f ) ); - tlMultMatrix( tlTranslation( 0.0f, -0.3f, distance ) ); - - tlTransformVertices( xfVerts, srcVerts, 4 ); - tlProjectVertices( prjVerts, xfVerts, 4 ); - - vtxA.x = tlScaleX( prjVerts[0].x ); - vtxA.y = tlScaleY( prjVerts[0].y ); - vtxA.oow = 1.0f / prjVerts[0].w; - - vtxB.x = tlScaleX( prjVerts[1].x ); - vtxB.y = tlScaleY( prjVerts[1].y ); - vtxB.oow = 1.0f / prjVerts[1].w; - - vtxC.x = tlScaleX( prjVerts[2].x ); - vtxC.y = tlScaleY( prjVerts[2].y ); - vtxC.oow = 1.0f / prjVerts[2].w; - - vtxD.x = tlScaleX( prjVerts[3].x ); - vtxD.y = tlScaleY( prjVerts[3].y ); - vtxD.oow = 1.0f / prjVerts[3].w; - - vtxA.tmuvtx[0].sow = prjVerts[0].s * 255.0f * vtxA.oow; - vtxA.tmuvtx[0].tow = prjVerts[0].t * 255.0f * vtxA.oow; - - vtxB.tmuvtx[0].sow = prjVerts[1].s * 255.0f * vtxB.oow; - vtxB.tmuvtx[0].tow = prjVerts[1].t * 255.0f * vtxB.oow; - - vtxC.tmuvtx[0].sow = prjVerts[2].s * 255.0f * vtxC.oow; - vtxC.tmuvtx[0].tow = prjVerts[2].t * 255.0f * vtxC.oow; - - vtxD.tmuvtx[0].sow = prjVerts[3].s * 255.0f * vtxD.oow; - vtxD.tmuvtx[0].tow = prjVerts[3].t * 255.0f * vtxD.oow; - - /* Render First Pass */ - switch( mode ) { - case LIGHTMAP: - case SPECULAR: - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, - FXFALSE ); - break; - case DETAIL: - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_BLEND_LOCAL, - GR_COMBINE_FACTOR_DETAIL_FACTOR, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, - FXFALSE ); - grTexDetailControl( GR_TMU0, 2, 7, 1.0f ); - break; - } - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ZERO, - GR_BLEND_ONE, GR_BLEND_ZERO ); - grTexSource( GR_TMU0, - baseTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &baseTexture.info ); - - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - - /* Render Second Pass */ - switch( mode ) { - case LIGHTMAP: - grAlphaBlendFunction( GR_BLEND_DST_COLOR, GR_BLEND_ZERO, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - grTexSource( GR_TMU0, - lightTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &lightTexture.info ); - tlConOutput( "LIGHTMAP - TEXTURE MODULATE \r" ); - break; - case DETAIL: - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_BLEND_LOCAL, - GR_COMBINE_FACTOR_ONE_MINUS_DETAIL_FACTOR, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ONE, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - grTexSource( GR_TMU0, - detailTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &detailTexture.info ); - tlConOutput( "DETAIL - BLEND ON LOD \r" ); - break; - case SPECULAR: - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ONE, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - grTexSource( GR_TMU0, - lightTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &lightTexture.info ); - tlConOutput( "SPECULAR - TEXTURE ACCUMULATE\r" ); - break; - } - - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case 'm': - case 'M': - mode++; - mode%=3; - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} - - - diff --git a/glide2x/h3/glide/tests/test22.c b/glide2x/h3/glide/tests/test22.c deleted file mode 100644 index 042cf3d..0000000 --- a/glide2x/h3/glide/tests/test22.c +++ /dev/null @@ -1,306 +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 -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test22"; -static const char purpose[] = "fog with multi-pass texturing"; -static const char usage[] = "-n -r "; - -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; - - TlTexture baseTexture; - unsigned long baseTextureAddr; - TlTexture lightTexture; - unsigned long lightTextureAddr; - - GrFog_t fogtable[GR_FOG_TABLE_SIZE]; - - TlVertex3D srcVerts[4]; - float distance, dDelta; - - /* 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 - decal - bilinear - nearest mipmapping - fogging */ - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_NEAREST, - FXFALSE ); - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR ); - grFogColorValue( 0x404040 ); - guFogGenerateExp( fogtable, .2f ); - grFogTable( fogtable ); - - /* Load texture data into system ram */ - assert( tlLoadTexture( "decal1.3df", - &baseTexture.info, - &baseTexture.tableType, - &baseTexture.tableData ) ); - assert( tlLoadTexture( "light.3df", - &lightTexture.info, - &lightTexture.tableType, - &lightTexture.tableData ) ); - - /* Download texture data to TMU */ - baseTextureAddr = grTexMinAddress( GR_TMU0 ); - grTexDownloadMipMap( GR_TMU0, - baseTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &baseTexture.info ); - if ( baseTexture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - baseTexture.tableType, - &baseTexture.tableData ); - } - - lightTextureAddr = - baseTextureAddr + - grTexTextureMemRequired( GR_MIPMAPLEVELMASK_BOTH, - &baseTexture.info ); - grTexDownloadMipMap( GR_TMU0, - lightTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &lightTexture.info ); - if ( lightTexture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - lightTexture.tableType, - &lightTexture.tableData ); - } - - /* Initialize Source 3D data - Rectangle on X/Z Plane - Centered about Y Axis - - 0--1 Z+ - | | | - 2--3 - X+ - - */ - srcVerts[0].x = -0.5f, srcVerts[0].y = 0.0f, srcVerts[0].z = 0.5f, srcVerts[0].w = 1.0f; - srcVerts[1].x = 0.5f, srcVerts[1].y = 0.0f, srcVerts[1].z = 0.5f, srcVerts[1].w = 1.0f; - srcVerts[2].x = -0.5f, srcVerts[2].y = 0.0f, srcVerts[2].z = -0.5f, srcVerts[2].w = 1.0f; - srcVerts[3].x = 0.5f, srcVerts[3].y = 0.0f, srcVerts[3].z = -0.5f, srcVerts[3].w = 1.0f; - - srcVerts[0].s = 0.0f, srcVerts[0].t = 0.0f; - srcVerts[1].s = 1.0f, srcVerts[1].t = 0.0f; - srcVerts[2].s = 0.0f, srcVerts[2].t = 1.0f; - srcVerts[3].s = 1.0f, srcVerts[3].t = 1.0f; - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - -#define MAX_DIST 10.0f -#define MIN_DIST 1.0f - - distance = 1.0f; - dDelta = 0.05f; - - tlConOutput( "Press any key to quit\n\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC, vtxD; - TlVertex3D xfVerts[4]; - TlVertex3D prjVerts[4]; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00404040, 0, GR_ZDEPTHVALUE_FARTHEST ); - - - /* 3D Transformations */ - /*---- - A-B - |\| - C-D - -----*/ - vtxA.oow = 1.0f; - vtxB = vtxC = vtxD = vtxA; - - distance += dDelta; - if ( distance > MAX_DIST || - distance < MIN_DIST ) { - dDelta *= -1.0f; - distance += dDelta; - } - - tlSetMatrix( tlIdentity() ); - tlMultMatrix( tlXRotation( -90.0f ) ); - tlMultMatrix( tlTranslation( 0.0f, 0.0f, distance ) ); - - tlTransformVertices( xfVerts, srcVerts, 4 ); - tlProjectVertices( prjVerts, xfVerts, 4 ); - - vtxA.x = tlScaleX( prjVerts[0].x ); - vtxA.y = tlScaleY( prjVerts[0].y ); - vtxA.oow = 1.0f / prjVerts[0].w; - - vtxB.x = tlScaleX( prjVerts[1].x ); - vtxB.y = tlScaleY( prjVerts[1].y ); - vtxB.oow = 1.0f / prjVerts[1].w; - - vtxC.x = tlScaleX( prjVerts[2].x ); - vtxC.y = tlScaleY( prjVerts[2].y ); - vtxC.oow = 1.0f / prjVerts[2].w; - - vtxD.x = tlScaleX( prjVerts[3].x ); - vtxD.y = tlScaleY( prjVerts[3].y ); - vtxD.oow = 1.0f / prjVerts[3].w; - - vtxA.tmuvtx[0].sow = prjVerts[0].s * 255.0f * vtxA.oow; - vtxA.tmuvtx[0].tow = prjVerts[0].t * 255.0f * vtxA.oow; - - vtxB.tmuvtx[0].sow = prjVerts[1].s * 255.0f * vtxB.oow; - vtxB.tmuvtx[0].tow = prjVerts[1].t * 255.0f * vtxB.oow; - - vtxC.tmuvtx[0].sow = prjVerts[2].s * 255.0f * vtxC.oow; - vtxC.tmuvtx[0].tow = prjVerts[2].t * 255.0f * vtxC.oow; - - vtxD.tmuvtx[0].sow = prjVerts[3].s * 255.0f * vtxD.oow; - vtxD.tmuvtx[0].tow = prjVerts[3].t * 255.0f * vtxD.oow; - - /* Render First Pass */ - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ZERO, - GR_BLEND_ONE, GR_BLEND_ZERO ); - grTexSource( GR_TMU0, - baseTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &baseTexture.info ); - - grFogMode( GR_FOG_ADD2 | GR_FOG_WITH_TABLE ); - - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - - /* Render Second Pass */ - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_PREFOG_COLOR, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - grTexSource( GR_TMU0, - lightTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &lightTexture.info ); - - grFogMode( GR_FOG_MULT2 | GR_FOG_WITH_TABLE ); - - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} - - - diff --git a/glide2x/h3/glide/tests/test23.c b/glide2x/h3/glide/tests/test23.c deleted file mode 100644 index ff48f4d..0000000 --- a/glide2x/h3/glide/tests/test23.c +++ /dev/null @@ -1,260 +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 -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test23"; -static const char purpose[] = "anti-aliased points test"; -static const char usage[] = "-n -r "; - -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; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - - Mode mode; - int speed; - - int i; - 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 ); - grFogMode( GR_FOG_WITH_TABLE ); - grFogColorValue( 0x0 ); - guFogGenerateExp( fogtable, .8f ); - grFogTable( fogtable ); - 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; - speed = 0; - - tlConOutput( "a - toggles anti-aliasing\n" ); - tlConOutput( "s - toggles speed of rotation\n" ); - tlConOutput( "Press any key to quit\n\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA; - static TlVertex3D xfVerts[100]; - static TlVertex3D prjVerts[100]; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x0, 0, GR_ZDEPTHVALUE_FARTHEST ); - - /* 3D Transformations */ - if ( speed ) { - angle += 1.0f; - } else { - angle += 0.05f; - } - if ( angle >= 360.0f ) angle -= 360.0f; - - tlSetMatrix( tlIdentity() ); - tlMultMatrix( tlYRotation( angle ) ); - tlMultMatrix( tlTranslation( 0.0f, 0.0f, 1.5f ) ); - - tlTransformVertices( xfVerts, srcVerts, 100 ); - tlProjectVertices( prjVerts, xfVerts, 100 ); - - grConstantColorValue( 0xffffffff ); - - switch( mode ) { - case NORMAL: - tlConOutput( "NORMAL POINTS \r" ); - break; - case ANTIALIASED: - tlConOutput( "ANTIALIASED POINTS \r" ); - break; - } - - for( i = 0; i < 100; i++ ) { - vtxA.x = tlScaleX( prjVerts[i].x ); - vtxA.y = tlScaleY( prjVerts[i].y ); - vtxA.oow = 1.0f / prjVerts[i].w; - vtxA.a = 255.0f; - switch( mode ) { - case NORMAL: - grDrawPoint( &vtxA ); - break; - case ANTIALIASED: - grAADrawPoint( &vtxA ); - break; - } - } - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case 'a': - case 'A': - mode++; - mode%=2; - break; - case 's': - case 'S': - speed = !speed; - 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); -} - - - - diff --git a/glide2x/h3/glide/tests/test24.c b/glide2x/h3/glide/tests/test24.c deleted file mode 100644 index 1d6b088..0000000 --- a/glide2x/h3/glide/tests/test24.c +++ /dev/null @@ -1,255 +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 -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#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 -r "; - -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; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - - Mode mode; - - int i; - 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 ); - grFogMode( GR_FOG_WITH_TABLE ); - grFogColorValue( 0x0 ); - guFogGenerateExp( fogtable, .9f ); - grFogTable( fogtable ); - 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 ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - 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)) - - 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; - } - } - - tlConRender(); - 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); -} - - - - diff --git a/glide2x/h3/glide/tests/test25.c b/glide2x/h3/glide/tests/test25.c deleted file mode 100644 index 7864a0f..0000000 --- a/glide2x/h3/glide/tests/test25.c +++ /dev/null @@ -1,898 +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 -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -#define SNAP_COORD(v) ( ( v ) = (( float )( ( long )( ( v ) * 16 ) )) / 16.0f ) - -#define WREFWIDTH 640.f -#define WREFHEIGHT 480.f - -#define WINSCALEX(x) ((x/WREFWIDTH) * wWidth) -#define WINSCALEY(y) ((y/WREFHEIGHT) * wHeight) - -#ifndef M_PI -#define M_PI 3.14159265358979323846f -#endif -#define DEG2RAD( x ) ( (x) * M_PI / 180.0f ) - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test25"; -static const char purpose[] = "anti-aliased triangle test"; -static const char usage[] = "-n -r -b -t -aalphavalue"; - - -static void doHelp( void ) { - grBufferClear( 0, 0, 0 ); - tlConOutput("Keymap:\n"); - tlConOutput(" A or a: toggle Antialiasing\n"); - tlConOutput(" C or c: toggle Compositing\n"); - tlConOutput(" B or b: toggle Bilinear\n"); - tlConOutput(" F or f: toggle Front buffer \n"); - tlConOutput(" H, h, or ?: Help\n"); - tlConOutput(" I or i: toggle background Image\n"); - tlConOutput(" L or l: Draw lines\n"); - tlConOutput(" N or n: print performance Numbers\n"); - tlConOutput(" P or p: Pause rendering\n"); - tlConOutput(" R or r: Print screen Resolution\n"); - tlConOutput(" Q or q or esc: Quit\n"); - tlConOutput(" S or s: toggle hidden Surface removal (backface culling)\n"); - tlConOutput(" T or t: toggle Texturing\n"); - tlConOutput(" U or u: toggle shameless Plug\n"); - tlConOutput(" V or v: toggle VGA/Voodoo\n"); - tlConOutput("Press a key to continue...\n"); - tlConRender(); - grBufferSwap( 1 ); - tlGetCH(); - tlConClear(); -} - -typedef float Matrix[4][4]; -typedef float Point[3]; - -void MatMakeXRot( Matrix m, float radians ) -{ - float c = (float)cos( radians ); - float s = (float)sin( radians ); - - m[0][0] = 1.0f; m[0][1] = 0.0f; m[0][2] = 0.0f; m[0][3] = 0.0f; - m[1][0] = 0.0f; m[1][1] = c; m[1][2] = s; m[1][3] = 0.0f; - m[2][0] = 0.0f; m[2][1] = -s; m[2][2] = c; m[2][3] = 0.0f; - m[3][0] = 0.0f; m[3][1] = 0.0f; m[3][2] = 0.0f; m[3][3] = 1.0f; -} - -void MatMakeYRot( Matrix m, float radians ) -{ - float c = (float)cos( radians ); - float s = (float)sin( radians ); - - m[0][0] = c; m[0][1] = 0.0f; m[0][2] = -s; m[0][3] = 0.0f; - m[1][0] = 0.0f; m[1][1] = 1.0f; m[1][2] = 0.0f; m[1][3] = 0.0f; - m[2][0] = s; m[2][1] = 0.0f; m[2][2] = c; m[2][3] = 0.0f; - m[3][0] = 0.0f; m[3][1] = 0.0f; m[3][2] = 0.0f; m[3][3] = 1.0f; -} - -void MatMakeZRot( Matrix m, float radians ) -{ - float c = (float)cos( radians ); - float s = (float)sin( radians ); - - m[0][0] = c; m[0][1] = s; m[0][2] = 0.0f; m[0][3] = 0.0f; - m[1][0] = -s; m[1][1] = c; m[1][2] = 0.0f; m[1][3] = 0.0f; - m[2][0] = 0.0f; m[2][1] = 0.0f; m[2][2] = 1.0f; m[2][3] = 0.0f; - m[3][0] = 0.0f; m[3][1] = 0.0f; m[3][2] = 0.0f; m[3][3] = 1.0f; -} - -void MatMakeIdent( Matrix m ) -{ - int i, j; - - for( i = 0; i < 4; i++ ) - { - for( j = 0; j < 4; j++ ) - { - if( i == j ) - m[i][j] = 1.0f; - else - m[i][j] = 0.0f; - } - } -} - -void PointMatMult( GrVertex *result, GrVertex *v, Matrix m ) -{ - float w; - GrVertex ptmp; - - ptmp = *v; - ptmp.x = ( v->x * m[0][0] ) + ( v->y * m[1][0] ) + - ( v->z * m[2][0] ) + m[3][0]; - ptmp.y = ( v->x * m[0][1] ) + ( v->y * m[1][1] ) + - ( v->z * m[2][1] ) + m[3][1]; - ptmp.z = ( v->x * m[0][2] ) + ( v->y * m[1][2] ) + - ( v->z * m[2][2] ) + m[3][2]; - w = ( v->x * m[0][3] ) + ( v->y * m[1][3] ) + - ( v->z * m[2][3] ) + m[3][3]; - if( w != 0.0f ) { ptmp.x /= w; ptmp.y /= w; ptmp.z /= w; } - *result = ptmp; -} - -static int screenFulls[] = { - 320*200, - 320*240, - 400*256, - 512*384, - 640*200, - 640*350, - 640*400, - 640*480, - 800*600, - 960*720, - 856*480 -}; - -#define NTRIS 1 -#define NFRAMES 20 -#define NVERTS 3 - -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; - - float - minColor = 10.f, /* Vertex min color */ - maxColor = 245.f; /* Vertex max color */ - - GrVertex - localVerts[3], /* Vertices in world coordinates */ - texVerts[4]; /* Texture vertices for background */ - - float - alpha = 192.0f, /* Alpha for blending tringle over background */ - y_angle = 0.0f; /* rotation amount */ - - int - firstTime = 0; /* Used for performance calculations */ - - GrPassthruMode_t - passthruMode = GR_PASSTHRU_SHOW_SST1; /* For toggling passthru */ - - FxBool - plugging = FXFALSE, /* Show shameless plug */ - printPerf = FXFALSE, /* Print performance numbers */ - lines = FXFALSE, /* Draw lines instead of triangles */ - blend = FXFALSE, /* Blend the triangle over the background */ - texturing = FXFALSE, /* Texture the tiangle */ - antialias = FXTRUE, /* Antialias the triangle? */ - bilinear = FXTRUE, /* Perform bilinear filtering on the texture? */ - render = FXTRUE, /* Draw? */ - backbuffer = FXTRUE, /* Draw to backbuffer? */ - background = FXTRUE; /* Draw background? */ - - GrOriginLocation_t - origin = GR_ORIGIN_LOWER_LEFT; /* Origin */ - - FxU32 - swapDelay = 1, /* Arg to grBufferSwap */ - trisDrawn, /* # triangles drawn */ - trisProcessed, /* # triangles through pipeline */ - lastFrame = 0, /* Number of last frame we did perf stats */ - frameNum = 0L; /* id of each frame drawn */ - - GrCullMode_t - cullMode = GR_CULL_DISABLE; /* backface culling */ - - - GrMipMapId_t - triDecal, /* Triangle decal texture */ - bgDecal; /* Background decal texture */ - - Gu3dfInfo - bgInfo, /* Info on background texture */ - triInfo; /* Info on triangle texture */ - - GrColorCombineFnc_t - ccFnc = GR_COLORCOMBINE_ITRGB; /* Start of w/ Gouraud shading */ - - char - *bgFileName = NULL, /* Name of background texture file */ - *triFileName = NULL; /* Name of triangle texture file */ - - int - frameCount = 0; - - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrbtea", &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 'b': - bgFileName = strdup( remArgs[0] ); - break; - case 't': - triFileName = strdup( remArgs[0] ); - break; - case 'a': - alpha = (float)atof( 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, - origin, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 80, 40, 0xffffff ); - - if(frames == -1) { - doHelp(); - } - - localVerts[0].x = 0.f; - localVerts[0].y = 0.75f; - localVerts[0].z = 0.0f; - localVerts[0].tmuvtx[0].sow = 255.f; - localVerts[0].tmuvtx[0].tow = 255.f; - localVerts[0].oow = 1.f; - localVerts[0].r = maxColor; - localVerts[0].g = minColor; - localVerts[0].b = minColor; - localVerts[0].a = 255.f; - - localVerts[1].x = -0.75f; - localVerts[1].y = -0.75f; - localVerts[1].z = 0.0f; - localVerts[1].tmuvtx[0].sow = 0.f; - localVerts[1].tmuvtx[0].tow = 255.f; - localVerts[1].oow = 1.f; - localVerts[1].r = minColor; - localVerts[1].g = maxColor; - localVerts[1].b = minColor; - localVerts[1].a = 255.f; - - localVerts[2].x = 0.75f; - localVerts[2].y = -0.75f; - localVerts[2].z = 0.0f; - localVerts[2].tmuvtx[0].sow = 255.f; - localVerts[2].tmuvtx[0].tow = 0.f; - localVerts[2].oow = 1.f; - localVerts[2].r = minColor; - localVerts[2].g = minColor; - localVerts[2].b = maxColor; - localVerts[2].a = 255.f; - - texVerts[0].x = 0.f; - texVerts[0].y = 0.f; - texVerts[0].a = 255.f; - texVerts[0].oow = 1.f; - texVerts[0].tmuvtx[0].sow = 0.f * texVerts[0].oow; - texVerts[0].tmuvtx[0].tow = 255.f * texVerts[0].oow; - - texVerts[1].x = scrWidth; - texVerts[1].y = 0.f; - texVerts[1].a = 255.f; - texVerts[1].oow = 1.f; - texVerts[1].tmuvtx[0].sow = 255.f * texVerts[1].oow; - texVerts[1].tmuvtx[0].tow = 255.f * texVerts[1].oow; - - texVerts[2].x = scrWidth; - texVerts[2].y = scrHeight; - texVerts[2].a = 255.f; - texVerts[2].oow = 1.f; - texVerts[2].tmuvtx[0].sow = 255.f * texVerts[2].oow; - texVerts[2].tmuvtx[0].tow = 0.f * texVerts[2].oow; - - texVerts[3].x = 0.f; - texVerts[3].y = scrHeight; - texVerts[3].a = 255.f; - texVerts[3].oow = 1.f; - texVerts[3].tmuvtx[0].sow = 0.f * texVerts[3].oow; - texVerts[3].tmuvtx[0].tow = 0.f * texVerts[3].oow; - - if (bgFileName == NULL) - bgFileName = "miro.3df"; - if (triFileName == NULL) - triFileName = "matt1.3df"; - - /* Read in background texture file */ - if ( gu3dfGetInfo( bgFileName, &bgInfo ) ) { - bgInfo.data = malloc( bgInfo.mem_required ); - - if ( bgInfo.data == 0 ) { - fprintf( stderr, "out of memory for texture file %s\n", bgFileName ); - grGlideShutdown(); - exit( -1 ); - } - - if ( !gu3dfLoad( bgFileName, &bgInfo ) ) { - fprintf( stderr, "could not load texture file %s\n", bgFileName ); - grGlideShutdown(); - exit( -1 ); - } - - bgDecal = guTexAllocateMemory( 0, GR_MIPMAPLEVELMASK_BOTH, - bgInfo.header.width, bgInfo.header.height, - bgInfo.header.format, - GR_MIPMAP_NEAREST, - bgInfo.header.small_lod, bgInfo.header.large_lod, - bgInfo.header.aspect_ratio, - GR_TEXTURECLAMP_WRAP, GR_TEXTURECLAMP_WRAP, - GR_TEXTUREFILTER_BILINEAR, GR_TEXTUREFILTER_BILINEAR, - 0.0F, - FXFALSE ); - if ( bgDecal == GR_NULL_MIPMAP_HANDLE ) { - fprintf( stderr, "could not allocate memory for texture file %s\n", bgFileName ); - grGlideShutdown(); - exit( -1 ); - } - guTexDownloadMipMap( bgDecal, bgInfo.data, &bgInfo.table.nccTable ); - free( bgInfo.data ); - } else { - fprintf( stderr, "could not get info on %s\n", bgFileName ); - grGlideShutdown(); - exit( -1 ); - } - - if ( gu3dfGetInfo( triFileName, &triInfo ) ) { - triInfo.data = malloc( triInfo.mem_required ); - - if ( triInfo.data == 0 ) { - fprintf( stderr, "out of memory for texture file %s\n", triFileName ); - grGlideShutdown(); - exit( -1 ); - } - - if ( !gu3dfLoad( triFileName, &triInfo ) ) { - fprintf( stderr, "could not load texture file %s\n", triFileName ); - grGlideShutdown(); - exit( -1 ); - } - - triDecal = guTexAllocateMemory( 0, GR_MIPMAPLEVELMASK_BOTH, - triInfo.header.width, - triInfo.header.height, - triInfo.header.format, - GR_MIPMAP_NEAREST, - triInfo.header.small_lod, - triInfo.header.large_lod, - triInfo.header.aspect_ratio, - GR_TEXTURECLAMP_WRAP, - GR_TEXTURECLAMP_WRAP, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR, - 0.0F, - FXFALSE ); - if ( triDecal == GR_NULL_MIPMAP_HANDLE ) { - fprintf( stderr, "could not allocate memory for %s\n", triFileName ); - grGlideShutdown(); - exit( -1 ); - } - guTexDownloadMipMap( triDecal, triInfo.data, &triInfo.table.nccTable ); - free( triInfo.data ); - } else { - fprintf( stderr, "could not get info on %s\n", triFileName ); - grGlideShutdown(); - exit( -1 ); - } - - grTexCombineFunction(GR_TMU0, GR_TEXTURECOMBINE_DECAL); - grRenderBuffer(backbuffer == FXTRUE ? GR_BUFFER_BACKBUFFER : GR_BUFFER_FRONTBUFFER); - - /* Set up alpha blending for AA and compositing... */ - guAlphaSource( GR_ALPHASOURCE_ITERATED_ALPHA ); - grAlphaBlendFunction( GR_BLEND_SRC_ALPHA, - GR_BLEND_ONE_MINUS_SRC_ALPHA, GR_BLEND_ONE, - GR_BLEND_ZERO ); - grAlphaTestFunction( GR_CMP_ALWAYS ); - - - while ( 1 ) { - Matrix rotm; - GrVertex xformedVerts[4]; - int i; - - - MatMakeYRot( rotm, DEG2RAD( y_angle ) ); - - if (resolution == GR_RESOLUTION_NONE) - tlGetResolutionConstant("0", - &scrWidth, - &scrHeight ); - - - for( i = 0; i < 4; i++ ) { - PointMatMult( &xformedVerts[i], &localVerts[i], rotm ); - xformedVerts[i].x = xformedVerts[i].x / ( xformedVerts[i].z + 2.0f ); - xformedVerts[i].y = xformedVerts[i].y / ( xformedVerts[i].z + 2.0f ); - xformedVerts[i].x *= scrWidth / 2.0f; - xformedVerts[i].y *= scrHeight / 2.0f; - xformedVerts[i].x += scrWidth / 2.0f; - xformedVerts[i].y += scrHeight / 2.0f; - xformedVerts[i].oow = 1.f / ((xformedVerts[i].z + 2) * scrHeight); - xformedVerts[i].tmuvtx[0].sow *= xformedVerts[i].oow; - xformedVerts[i].tmuvtx[0].tow *= xformedVerts[i].oow; - SNAP_COORD( xformedVerts[i].x ); - SNAP_COORD( xformedVerts[i].y ); - } - - guColorCombineFunction( ccFnc ); - - /* grLfbBypassMode(GR_LFBBYPASS_ENABLE); */ - - if (render == FXTRUE) { - ++frameNum; - if ((frameNum % NFRAMES) == 0) { - if (printPerf) { - if (!firstTime) { - GrSstPerfStats_t - pStats; - FxU32 - lfbWritePixels, - nFrames = frameNum - lastFrame, - fillPixels = nFrames * screenFulls[resolution], - totFail; - - lastFrame = frameNum; - - grSstPerfStats(&pStats); - grTriStats(&trisProcessed, &trisDrawn); - - totFail = pStats.chromaFail + pStats.zFuncFail + - pStats.aFuncFail; - - lfbWritePixels = pStats.pixelsOut - pStats.pixelsIn - fillPixels; - - tlConOutput("In the last %d frames:\n", nFrames); - tlConOutput(" Pixels Processed: %d\n", - pStats.pixelsIn); - tlConOutput(" Chroma Failures: %d\n", - pStats.chromaFail); - tlConOutput(" Z Compare Failures: %d\n", - pStats.zFuncFail); - tlConOutput(" Alpha Compare Failures: %d\n", - pStats.aFuncFail); - tlConOutput(" Fast Fill Pixels: %d\n", - fillPixels); - tlConOutput(" LFB Write Pixels: %d\n", - lfbWritePixels); - tlConOutput(" Total Pixels Drawn: %d\n", - pStats.pixelsOut); - tlConOutput(" Triangles Processed %d\n", - trisProcessed); - tlConOutput(" Triangles Drawn %d\n", - trisDrawn); - - if ( - (pStats.pixelsOut - lfbWritePixels - fillPixels - pStats.pixelsIn) != totFail) - tlConOutput("Error: %d != %d\n", - pStats.pixelsOut - lfbWritePixels - fillPixels, - totFail); - - grSstResetPerfStats(); - } else { - lastFrame = frameNum; - grSstResetPerfStats(); - firstTime = 0; - } - } - } - grBufferClear( 0xffffffff, 0, GR_WDEPTHVALUE_FARTHEST ); - - if (background == FXTRUE) { - GrState - oldState; - - texVerts[0].x = 0.f; - texVerts[0].y = 0.f; - - texVerts[1].x = scrWidth; - texVerts[1].y = 0.f; - - texVerts[1].x = scrWidth; - texVerts[1].y = 0.f; - - texVerts[2].x = scrWidth; - texVerts[2].y = scrHeight; - - texVerts[3].x = 0.f; - texVerts[3].y = scrHeight; - - grGlideGetState(&oldState); - - grAlphaBlendFunction( - GR_BLEND_ONE, GR_BLEND_ZERO, - GR_BLEND_ONE, GR_BLEND_ZERO); - - grColorCombine( - GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, FXFALSE - ); - - guTexSource(bgDecal); - - for (i = 0; i < NTRIS; i++) { - grDrawTriangle(&texVerts[0], &texVerts[1], &texVerts[2]); - grDrawTriangle(&texVerts[2], &texVerts[3], &texVerts[0]); - } - grGlideSetState(&oldState); - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - - } - - if (texturing == FXTRUE) - guTexSource(bgDecal); - - if (texturing) - guTexSource(triDecal); - - if (antialias == FXTRUE) { - if (lines == FXTRUE) { - grAADrawLine(&xformedVerts[0], &xformedVerts[1]); - grAADrawLine(&xformedVerts[1], &xformedVerts[2]); - grAADrawLine(&xformedVerts[2], &xformedVerts[0]); - } else { - grAADrawTriangle( - &xformedVerts[0], &xformedVerts[1], - &xformedVerts[2], FXTRUE, FXTRUE, FXTRUE - ); - } - } else { - if (lines == FXTRUE) { - grDrawLine(&xformedVerts[0], &xformedVerts[1]); - grDrawLine(&xformedVerts[1], &xformedVerts[2]); - grDrawLine(&xformedVerts[2], &xformedVerts[0]); - } else { - grDrawTriangle( - &xformedVerts[0], &xformedVerts[1], - &xformedVerts[2] - ); - } - } - - if (plugging) - grSplash(0.f, 0.f, scrWidth / 5.f, scrHeight / 5.f, frameNum); - - if (backbuffer) { - tlConRender(); - grBufferSwap( swapDelay ); - } - } - - if (tlKbHit()) { - char c = (char) tlGetCH(); - - switch (c) { - case 'a': - case 'A': - if (antialias == FXFALSE) { - tlConOutput("Turning ON Antialiasing\n"); - antialias = FXTRUE; - } else { - tlConOutput("Turning OFF Antialiasing\n"); - antialias = FXFALSE; - } - break; - case 'B': - case 'b': - if (bilinear == FXFALSE) { - bilinear = FXTRUE; - tlConOutput("Turning ON BiLinear blending\n"); - guTexChangeAttributes( - triDecal, bgInfo.header.width, - bgInfo.header.height, - bgInfo.header.format, GR_MIPMAP_NEAREST, - bgInfo.header.small_lod, - bgInfo.header.large_lod, - bgInfo.header.aspect_ratio, - GR_TEXTURECLAMP_WRAP, GR_TEXTURECLAMP_WRAP, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR); - } else { - bilinear = FXFALSE; - tlConOutput("Turning OFF BiLinear blending\n"); - guTexChangeAttributes( - triDecal, bgInfo.header.width, - bgInfo.header.height, - bgInfo.header.format, GR_MIPMAP_NEAREST, - bgInfo.header.small_lod, - bgInfo.header.large_lod, - bgInfo.header.aspect_ratio, - GR_TEXTURECLAMP_WRAP, GR_TEXTURECLAMP_WRAP, - GR_TEXTUREFILTER_POINT_SAMPLED, - GR_TEXTUREFILTER_POINT_SAMPLED); - } - break; - - case 'c': - case 'C': - if (blend == FXTRUE) { - blend = FXFALSE; - localVerts[0].a = 255.0f; - localVerts[1].a = 255.0f; - localVerts[2].a = 255.0f; - localVerts[3].a = 255.0f; - } else { - blend = FXTRUE; - localVerts[0].a = alpha; - localVerts[1].a = alpha; - localVerts[2].a = alpha; - localVerts[3].a = alpha; - } - break; - - case 'd': - case 'D': - tlConOutput("vtxa = (%.2f, %.2f), vtxb = (%.2f, %.2f), vtxc = (%.2f, %.2f)\n", - xformedVerts[0].x, xformedVerts[0].y, - xformedVerts[1].x, xformedVerts[1].y, - xformedVerts[2].x, xformedVerts[2].y - ); - break; - - case 'f': - case 'F': - if (backbuffer == FXTRUE) { - backbuffer = FXFALSE; - grRenderBuffer(GR_BUFFER_FRONTBUFFER); - } else { - backbuffer = FXTRUE; - grRenderBuffer(GR_BUFFER_BACKBUFFER); - } - break; - - case 'g': - case 'G': -#if 0 - grLfbBegin(); - - grLfbWriteMode(GR_LFBWRITEMODE_565); - grLfbOrigin(GR_ORIGIN_UPPER_LEFT); - grLfbGetReadPtr(GR_BUFFER_FRONTBUFFER); - tlConOutput("Press a key to get front buffer\n"); - while (!tlKbHit()); - c = (char) tlGetCH(); - guFbReadRegion(0,0,(int)wWidth,(int)scrHeight,scrnImage,(int)wWidth * sizeof(FxU16)); - tlConOutput("Press a key to put image in back buffer and swap\n"); - while (!tlKbHit()); - tlGetCH(); - - grLfbGetWritePtr(GR_BUFFER_BACKBUFFER); - guFbWriteRegion(0,0,(int)wWidth,(int)scrHeight,scrnImage,(int)wWidth * sizeof(FxU16)); - grBufferSwap(swapDelay); - - tlConOutput("Press a key to continue...\n"); - while (!tlKbHit()); - tlGetCH(); - - grLfbEnd(); -#endif - break; - - case 'h': - case 'H': - case '?': - doHelp(); - break; - - case 'i': - case 'I': - if (background == FXTRUE) { - background = FXFALSE; - tlConOutput("Turning off background\n"); - } else { - tlConOutput("Turning on background\n"); - background = FXTRUE; - } - break; - - case 'l': - case 'L': - if (lines == FXTRUE) { - lines = FXFALSE; - tlConOutput("Turning OFF lines\n"); - } else { - lines = FXTRUE; - tlConOutput("Turning ON lines\n"); - } - break; - case 'm': - case 'M': - ccFnc = GR_COLORCOMBINE_TEXTURE_TIMES_ITRGB; - break; - - case 'n': - case 'N': - if (printPerf == FXFALSE) { - printPerf = FXTRUE; - firstTime = 1; - grSstResetPerfStats(); - grResetTriStats(); - } else { - printPerf= FXFALSE; - } - break; - - case 'o': - case 'O': - if (origin == GR_ORIGIN_LOWER_LEFT) - origin = GR_ORIGIN_UPPER_LEFT; - else - origin = GR_ORIGIN_LOWER_LEFT; - - grSstOrigin(origin); - break; - - case 'p': - case 'P': - if (render == FXTRUE) - render = FXFALSE; - else - render = FXTRUE; - break; - - case 'q': - case 'Q': - case 27: - grGlideShutdown(); - exit(0); - break; - - case 'r': - case 'R': - tlConOutput("Screen Resolution is %s\n", tlGetResolutionString( resolution ) ); - break; - - case 'S': - case 's': - if (cullMode == GR_CULL_DISABLE) { - cullMode = GR_CULL_NEGATIVE; - tlConOutput("Turning ON backface culling (hidden Surface removal)\n"); - } else { - cullMode = GR_CULL_DISABLE; - tlConOutput("Turning OFF backface culling (hidden Surface removal)\n"); - } - grCullMode(cullMode); - break; - case 'T': - case 't': - if (texturing == FXFALSE) { - tlConOutput("Turning ON texturing\n"); - ccFnc = GR_COLORCOMBINE_DECAL_TEXTURE; - texturing = FXTRUE; - } else { - tlConOutput("Turning OFF texturing\n"); - ccFnc = GR_COLORCOMBINE_ITRGB; - texturing = FXFALSE; - } - break; - case 'u': - case 'U': - if (plugging == FXTRUE) - plugging = FXFALSE; - else - plugging = FXTRUE; - - grGlideShamelessPlug(plugging); - break; - - case 'v': - case 'V': - if (passthruMode == GR_PASSTHRU_SHOW_VGA) { - passthruMode = GR_PASSTHRU_SHOW_SST1; - tlConOutput("Changing Passthru to show Voodoo\n"); - } - else { - passthruMode = GR_PASSTHRU_SHOW_VGA; - tlConOutput("Changing Passthru to show VGA\n"); - } - /* grSstPassthruMode(passthruMode); */ - break; - - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case '0': - { - char str[256]; - swapDelay = (int) c - 0x30; - sprintf(str, "Swapdelay = %ld\n", swapDelay); - tlConOutput(str); - } - break; - } - } - - if (render) { - y_angle += 2.f; - if( y_angle > 360.0f ) - y_angle -= 360.0f; - } - frameCount++; - if(frameCount < 0) - frameCount = 0; - if(frames == frameCount) - break; - } - grGlideShutdown(); - exit(0); -} diff --git a/glide2x/h3/glide/tests/test26.c b/glide2x/h3/glide/tests/test26.c deleted file mode 100644 index 08a09e9..0000000 --- a/glide2x/h3/glide/tests/test26.c +++ /dev/null @@ -1,370 +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 -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test26"; -static const char purpose[] = "tests grLfbWriteRegion, and grLfbReadRegion"; -static const char usage[] = "-b <# color buffers> -d <# aux buffers> -n -r "; - -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 " -}; - - -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; - int bufCount = 2; - int auxBuf = 1; - - TlTexture texture; - void *image; - void *readImage; - FxU32 bpp; - - GrLfbSrcFmt_t sourceFormat; - - static FxU32 imageWidth; - static FxU32 imageHeight; - - static void imageConvert( void *dst, - void *src, - GrLfbSrcFmt_t format, - FxU32 *bpp ); - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "bdnr", &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 'b': - bufCount = atoi(remArgs[0]); - if (bufCount < 2) bufCount = 2; - if (bufCount > 3) bufCount = 3; - break; - - case 'd': - auxBuf = atoi(remArgs[0]); - if (auxBuf > 1) auxBuf = 1; - if (auxBuf < 0) auxBuf = 0; - break; - - 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_UPPER_LEFT, - bufCount, auxBuf ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xffffff ); - - /* Set up Render State - disable dithering */ - grDitherMode( GR_DITHER_DISABLE ); - - /* Load image from disk */ - assert( tlLoadTexture( "decal1.3df", - &texture.info, - &texture.tableType, - &texture.tableData ) ); - - imageWidth = 256; - imageHeight = 256; - image = calloc( imageWidth * imageHeight, sizeof( FxU32 ) ); - readImage = calloc( imageWidth * imageHeight, sizeof( FxU32 ) ); - - if ( ( imageWidth > (FxU32)scrWidth ) || - ( imageHeight > (FxU32)scrHeight ) ) { - char errMsg[1024]; - sprintf(errMsg, - "imgWidth: %d, imgHeight: %d\nscrWidth: %d, scrHeight: %d\n", - (int) imageWidth, (int) imageHeight, - (int) scrWidth, (int) scrHeight); - - tlErrorMessage(errMsg); - exit(1); - } - - sourceFormat = GR_LFB_SRC_FMT_565; - - imageConvert( image, texture.info.data, sourceFormat, &bpp ); - - while( frames-- ) { - static int x = 0, y = 0; - - if (!tlOkToRender()) - continue; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00303030, 0, 0 ); - - - if ( ( imageWidth < (FxU32)tlScaleX(1.0f) ) && - ( imageHeight < (FxU32)tlScaleY(1.0f) ) && - grLfbWriteRegion( GR_BUFFER_BACKBUFFER, - x, y, sourceFormat, - imageWidth, imageHeight, 256*bpp, image ) ) { - tlConClear(); - tlConOutput( "Width - %d\n", imageWidth); - tlConOutput( "1 - lfb source format (%s)\n" - "+/- - change width of source image copied\n" - " any other key to quit\n\n", - sourceFormatString[sourceFormat] ); - - if ( sourceFormat == GR_LFB_SRC_FMT_565 ) { - memcpy(readImage, image, 256 * 256 * sizeof(FxU16)); - grLfbReadRegion( GR_BUFFER_BACKBUFFER, - x, y, imageWidth, imageHeight, - 256 * 2, readImage ); - if ( memcmp( image, readImage, 256*256*2 ) ) { - FILE* bufFile = fopen("fuckme.txt", "w"); - - if (bufFile != NULL) { - int i, j; - const FxU16* imagePtr = (const FxU16*)image; - const FxU16* readPtr = (const FxU16*)readImage; - - for(i = 0; i < 256; i++) { - for(j = 0; j < 256; j++) { - if (imagePtr[i * 256 + j] != readPtr[i * 256 + j]) { - fprintf(bufFile, "(0x%X 0x%X) : 0x%hX : 0x%hX\n", - j, i, imagePtr[i * 256 + j], readPtr[i * 256 + j]); - } - } - } - fclose(bufFile); - } - - grBufferSwap(1); - grBufferSwap(1); - - tlConOutput( "Failed Readback Test\n" ); - - grBufferClear(0x00303030, 0, 0); - grLfbWriteRegion(GR_BUFFER_BACKBUFFER, - x, y, sourceFormat, - imageWidth, imageHeight, - 256 * bpp, readImage); - - grBufferSwap(1); - grBufferSwap(1); - } else { - tlConOutput( "Passed Readback Test\n" ); - } - } - } else { - tlConClear(); - tlConOutput( "1 - lfb source format (%s)\n" - "+/- - change width of source image copied\n" - "any other key to quit\n\n", - sourceFormatString[sourceFormat] ); - tlConOutput( "grLfbWriteRegion Failed\n" ); - } - - x++; - if ( x + 256 >= (int)tlScaleX(1.0f) ) { - x = 0; y++; - } - if ( y + 256 >= (int)tlScaleY(1.0f) ) { - y = 0; - } - - tlConRender(); - grBufferSwap( 1 ); - while( tlKbHit() ) { - switch( tlGetCH() ) { - case '1': - sourceFormat++; - if ( sourceFormat > GR_LFB_SRC_FMT_ZA16 ) - sourceFormat = GR_LFB_SRC_FMT_565; - imageConvert( image, texture.info.data, sourceFormat, &bpp ); - break; - case '+': - if ( imageWidth < 256 ) imageWidth++; - break; - case '-': - if ( imageWidth > 0 ) imageWidth--; - break; - default: - frames = 0; - break; - } - - imageHeight = imageWidth; - } - } - - grGlideShutdown(); - 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 = 256; - FxU32 shortStride = 256; - 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 < 256; y++ ) { - for( x = 0; x < 256; x++ ) { - switch( format ) { - case GR_LFB_SRC_FMT_565: - shortData[y*shortStride+x] = srcData[y*256+x]; - break; - - case GR_LFB_SRC_FMT_555: - case GR_LFB_SRC_FMT_1555: - shortColor = srcData[y*256+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*256+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*256+x]; - longData[y*longStride+x] = longColor; - break; - - case GR_LFB_SRC_FMT_1555_DEPTH: - case GR_LFB_SRC_FMT_555_DEPTH: - longColor = srcData[y*256+x]; - longColor = ((0x00008000) | - ((longColor>>1) & 0x00007C00) | - ((longColor>>1) & 0x000003E0) | - ((longColor ) & 0x0000001f)); - longData[y*longStride+x] = longColor; - break; - - default: - break; - } - } - } -} - - - diff --git a/glide2x/h3/glide/tests/test27.c b/glide2x/h3/glide/tests/test27.c deleted file mode 100644 index 95cbf3a..0000000 --- a/glide2x/h3/glide/tests/test27.c +++ /dev/null @@ -1,204 +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 -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test27"; -static const char purpose[] = "Cycle the 3D hardware on and off"; -static const char usage[] = "-n -r "; - -static int rRandom(int s, int e); -static unsigned int iRandom (unsigned int maxr); - -#define SNAP_BIAS ((float)(3<<18)) - -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; - int doNothing = 0; - - int cycles; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "Nnr", &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 'N': - doNothing = 1; - 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 ); - - - cycles = 0; - while( frames-- && tlOkToRender()) { - GrVertex a, b, c; - char inchar; - - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, - 1 ) ); - - /* - * Don't like gotos? In the immortal words of Schwarzenegger - * (Total Recall): "...so sue me d**khead" - */ - if (doNothing) goto doNothing; - - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xffffff ); - - - /* deal with dynamic resizing */ - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, &scrWidth, &scrHeight); - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - tlConOutput( "Press to cycle hardware\n" ); - tlConOutput( "Any other key to quit\n" ); - - grBufferClear( 0x000000, 0, GR_WDEPTHVALUE_FARTHEST ); - - a.r = a.g = a.b = 0.0f; - b = c = a; - - a.x = tlScaleX(((float)rRandom( 0, 100 ))/100.0f) + SNAP_BIAS; - a.y = tlScaleY(((float)rRandom( 0, 100 ))/100.0f) + SNAP_BIAS; - a.r = 255.0f; - - b.x = tlScaleX(((float)rRandom( 0, 100 ))/100.0f) + SNAP_BIAS; - b.y = tlScaleY(((float)rRandom( 0, 100 ))/100.0f) + SNAP_BIAS; - b.g = 255.0f; - - c.x = tlScaleX(((float)rRandom( 0, 100 ))/100.0f) + SNAP_BIAS; - c.y = tlScaleY(((float)rRandom( 0, 100 ))/100.0f) + SNAP_BIAS; - c.b = 255.0f; - - grDrawTriangle( &a, &b, &c ); - - tlConOutput( "Cycle: %d\r", cycles ); - tlConRender(); - grBufferSwap( 1 ); - -doNothing: - inchar = tlGetCH(); - if ( inchar != ' ' ) frames = 0; - - grSstWinClose(); - cycles++; - } - - 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); -} - - - diff --git a/glide2x/h3/glide/tests/test28.c b/glide2x/h3/glide/tests/test28.c deleted file mode 100644 index 79e5d32..0000000 --- a/glide2x/h3/glide/tests/test28.c +++ /dev/null @@ -1,229 +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 -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - -#include -#include - -#define PI 3.141592653589793 -#define RAD_TO_DEG(t) ((t) * 180.0 / PI) -#define DEG_TO_RAD(t) ((t) * PI / 180.0) - -typedef struct _RGB { - float r, g, b; -} RGB, *RGBPtr; - - -#define FUDGE(x) ((x) * 255.0f) -#define PHASE(x, y, m) (((x) + (y)) % (m)) - -static float -value(float n1, float n2, float hue) -{ - float retval; - - if (hue > 360.0f) hue -= 360.0f; - if (hue < 0.0f) hue += 360.0f; - - if (hue < 60.0f) { - retval = n1 + (n2 - n1) * hue / 60.0f; - } else if (hue < 180.0f) { - retval = n2; - } else if (hue < 240.0f) { - retval = n1 + (n2 - 1.0f) * (240.0f - hue) / 60.0f; - } else { - retval = n1; - } -// assert((retval >= 0.0f) && (retval <= 1.0f)); - if (retval < 0.0f) retval = 0.0f; - if (retval > 1.0f) retval = 1.0f; - return FUDGE(retval); -} - -static void -hlsToRGB(float h, float l, float s, RGBPtr color) -{ - float p1, p2; - - p2 = (l <= 0.5f) ? l * (1.0f + s) : l + s - l * s; - p1 = 2 * l - p2; - - if (s == 0.0f) { - color->r = color->g = color->b = l; - } else { - color->r = value(p1, p2, h+120.0f); - color->g = value(p1, p2, h); - color->b = value(p1, p2, h-120.0f); - } - -} /* end hlsToRGB() */ - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test28"; -static const char purpose[] = "planar polygon test"; -static const char usage[] = "-n -r "; - -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; -#define NVERT 5 - GrVertex vtx[NVERT]; - int index[NVERT]; - int frames = -1; - int i, idx; -#define NHUE 360 - RGB hues[NHUE]; - - /* 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_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xffffff ); - - /* Set up Render State - gouraud shading */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - -// grRenderBuffer(GR_BUFFER_FRONTBUFFER); /* debug only */ - - tlConOutput( "Press a key to quit\n" ); - - /* init a table of hues */ - for (i=0; i -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test29"; -static const char purpose[] = "oow diff hint"; -static const char usage[] = "-n -r "; - -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; - - TlTexture texture; - TlVertex3D srcVerts[4]; - float distance, dDelta; - - /* 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 - Decal Texture - bilinear */ - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_POINT_SAMPLED, - GR_TEXTUREFILTER_POINT_SAMPLED ); - - /* Load texture data into system ram */ - assert( tlLoadTexture( "decal1.3df", - &texture.info, - &texture.tableType, - &texture.tableData ) ); - /* Download texture data to TMU */ - grTexDownloadMipMap( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - if ( texture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - texture.tableType, - &texture.tableData ); - } - - /* Select Texture As Source of all texturing operations */ - grTexSource( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_NEAREST, - FXFALSE ); - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - - /* enable oow depth buffering */ - grDepthBufferMode( GR_DEPTHBUFFER_WBUFFER ); - grDepthBufferFunction( GR_CMP_LESS ); - grDepthMask( FXTRUE ); - - /* Set hint to separate w for depth and tex */ - grHints( GR_HINT_STWHINT, GR_STWHINT_W_DIFF_TMU0 ); - /* oow for the texture coords will be set to one - in effect disabling perspective correction */ - - /* Initialize Source 3D data - Rectangle on X/Z Plane - Centered about Y Axis - - 0--1 Z+ - | | | - 2--3 - X+ - - */ - srcVerts[0].x = -0.5f, srcVerts[0].y = 0.0f, srcVerts[0].z = 0.5f, srcVerts[0].w = 1.0f; - srcVerts[1].x = 0.5f, srcVerts[1].y = 0.0f, srcVerts[1].z = 0.5f, srcVerts[1].w = 1.0f; - srcVerts[2].x = -0.5f, srcVerts[2].y = 0.0f, srcVerts[2].z = -0.5f, srcVerts[2].w = 1.0f; - srcVerts[3].x = 0.5f, srcVerts[3].y = 0.0f, srcVerts[3].z = -0.5f, srcVerts[3].w = 1.0f; - - srcVerts[0].s = 0.0f, srcVerts[0].t = 0.0f; - srcVerts[1].s = 1.0f, srcVerts[1].t = 0.0f; - srcVerts[2].s = 0.0f, srcVerts[2].t = 1.0f; - srcVerts[3].s = 1.0f, srcVerts[3].t = 1.0f; - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - -#define MAX_DIST 2.5f -#define MIN_DIST 1.0f - - distance = 1.0f; - dDelta = 0.01f; - - tlConOutput( "Press any key to quit\n\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC, vtxD; - TlVertex3D xfVerts[4]; - TlVertex3D prjVerts[4]; - - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - - grBufferClear( 0x00404040, 0, GR_WDEPTHVALUE_FARTHEST ); - - - /*---- - A-B - |\| - C-D - -----*/ - vtxA.oow = 1.0f; - vtxB = vtxC = vtxD = vtxA; - - distance += dDelta; - if ( distance > MAX_DIST || - distance < MIN_DIST ) { - dDelta *= -1.0f; - distance += dDelta; - } - - tlSetMatrix( tlIdentity() ); - tlMultMatrix( tlXRotation( -20.0f ) ); - tlMultMatrix( tlTranslation( 0.0f, -0.3f, distance ) ); - - tlTransformVertices( xfVerts, srcVerts, 4 ); - tlProjectVertices( prjVerts, xfVerts, 4 ); - - vtxA.x = tlScaleX( prjVerts[0].x ); - vtxA.y = tlScaleY( prjVerts[0].y ); - vtxA.oow = 1.0f / prjVerts[0].w; - - vtxB.x = tlScaleX( prjVerts[1].x ); - vtxB.y = tlScaleY( prjVerts[1].y ); - vtxB.oow = 1.0f / prjVerts[1].w; - - vtxC.x = tlScaleX( prjVerts[2].x ); - vtxC.y = tlScaleY( prjVerts[2].y ); - vtxC.oow = 1.0f / prjVerts[2].w; - - vtxD.x = tlScaleX( prjVerts[3].x ); - vtxD.y = tlScaleY( prjVerts[3].y ); - vtxD.oow = 1.0f / prjVerts[3].w; - - vtxA.tmuvtx[0].oow = 1.0f; - vtxA.tmuvtx[0].sow = prjVerts[0].s * 255.0f * vtxA.tmuvtx[0].oow; - vtxA.tmuvtx[0].tow = prjVerts[0].t * 255.0f * vtxA.tmuvtx[0].oow; - - vtxB.tmuvtx[0].oow = 1.0f; - vtxB.tmuvtx[0].sow = prjVerts[1].s * 255.0f * vtxB.tmuvtx[0].oow; - vtxB.tmuvtx[0].tow = prjVerts[1].t * 255.0f * vtxB.tmuvtx[0].oow; - - vtxC.tmuvtx[0].oow = 1.0f; - vtxC.tmuvtx[0].sow = prjVerts[2].s * 255.0f * vtxC.tmuvtx[0].oow; - vtxC.tmuvtx[0].tow = prjVerts[2].t * 255.0f * vtxC.tmuvtx[0].oow; - - vtxD.tmuvtx[0].oow = 1.0f; - vtxD.tmuvtx[0].sow = prjVerts[3].s * 255.0f * vtxD.tmuvtx[0].oow; - vtxD.tmuvtx[0].tow = prjVerts[3].t * 255.0f * vtxD.tmuvtx[0].oow; - - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} - - - diff --git a/glide2x/h3/glide/tests/testdesc.txt b/glide2x/h3/glide/tests/testdesc.txt deleted file mode 100644 index 2bd5594..0000000 --- a/glide2x/h3/glide/tests/testdesc.txt +++ /dev/null @@ -1,46 +0,0 @@ -************************************************* -TEST NAMES - -test00 - buffer clear -test01 - draw points -test02 - draw lines -test03 - gouraud lines -test04 - gouraud triangle -test05 - z buffer -test06 - w buffer -test07 - alpha blend -test08 - fog -test09 - chromakey -test10 - backface culling -test11 - lfb -test12 - lfb + renderbuffer + yorigin -test13 - iterated alpha -test14 - depth bias -test15 - clip rectangle -test16 - shameless plug and splash screen -test17 - decal texture - rgb lit texture - white lit texture -test18 - texture alpha -test19 - texture filters -test20 - mipmap modes ( nomip, mip, trilinear ) -test21 - texture compositing ( lightmap, detail, specular ) -test22 - multi-pass fog -test23 - anti-aliased points -test24 - anti-aliased lines -test25 - anti-aliased triangles -test26 - grLfbWriteRegion -test27 - cycle 3d hardware on and off, excersie open/close -test28 - planar polygon test -test29 - simple palette texture test -test30 - hints - separate texture, polygon oow -test32 - Mindlessly simple multiple board test - -qatest00 - Texture download, multibase, LOD downloads, Partial LODs -qatest01 - Alliance Buffer Swap bug - -Tests that should be done -* - anti-aliased polygons -* - clipped polygons -* - gratuitous c++ test -* - alpha test -* - alpha selects lighting -* - cockpit bit diff --git a/glide2x/h3/glide/tests/testimg.bat b/glide2x/h3/glide/tests/testimg.bat deleted file mode 100644 index 04431eb..0000000 --- a/glide2x/h3/glide/tests/testimg.bat +++ /dev/null @@ -1,48 +0,0 @@ -@echo off -REM -REM if FX_GLIDE_TEST_DSTIMG is not initiated, the default directory is -REM \3dfx\devel\sst1\glide\images -REM -if [%FX_GLIDE_TEST_DSTIMG%]==[] goto Default - -goto Output - -:Default -set FX_GLIDE_TEST_DSTIMG=%BUILD_ROOT_SST1%\glide\images - -:Output -set tdir=%FX_GLIDE_TEST_DSTIMG% - -@echo on -test00 -d %tdir%\test00.tst -sleep 1 -test01 -d %tdir%\test01.tst -sleep 1 -test02 -d %tdir%\test02.tst -sleep 1 -test03 -d %tdir%\test03.tst -sleep 1 -test04 -d %tdir%\test04.tst -sleep 1 -test05 -d %tdir%\test05.tst -sleep 1 -test06 -d %tdir%\test06.tst -sleep 1 -test07 -d %tdir%\test07.tst -sleep 1 -test08 -d %tdir%\test08.tst -sleep 1 -test09 -d %tdir%\test09.tst -sleep 1 -test10 -d %tdir%\test10.tst -sleep 1 -test13 -d %tdir%\test13.tst -sleep 1 -test16 -d %tdir%\test16.tst -sleep 1 -test17 -d %tdir%\test17.tst -sleep 1 -test18 -d %tdir%\test18.tst -sleep 1 -test19 -d %tdir%\test19.tst -sleep 1 diff --git a/glide2x/h3/glide/tests/tldata.inc b/glide2x/h3/glide/tests/tldata.inc deleted file mode 100644 index c8682db..0000000 --- a/glide2x/h3/glide/tests/tldata.inc +++ /dev/null @@ -1,69 +0,0 @@ - - -static unsigned char fontData[] = { -0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, -0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - diff --git a/glide2x/h3/glide/tests/tlib.c b/glide2x/h3/glide/tests/tlib.c deleted file mode 100644 index 408d306..0000000 --- a/glide2x/h3/glide/tests/tlib.c +++ /dev/null @@ -1,1787 +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 -#include -#ifndef __linux__ -#include -#else -#include -#endif -#include -#include -#include -#include -#include - -#include - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) -#include -#else -#endif - -#ifdef __DJGPP__ -#include -int crt0_startup_flags = _CRT0_FLAG_NONMOVE_SBRK; -#endif - -#include "tlib.h" - -static FxBool okToRender = FXTRUE; -static FxBool fullScreen = FXTRUE; - - -FxBool -tlOkToRender() -{ - return okToRender; -} /* tlOkToRender */ - -/*------------------------------------------------------------------- - Function:tlGetOpt - Date: 2/26 - Implementor(s): jdt - Library: Test Library - Description: - Incrementally search an argument list for matches. - Arguments: - argc - first argument to main - argv - second argument to main - tags - string of non-whitespace characters to be search for in the - argument string - match - pointer to storage for matched character - remArgs - pointer to storage for remaining arglist after any match - Return: - 1 if matched - 0 if no more arguments - -1 if unrecognized - -------------------------------------------------------------------*/ -int tlGetOpt( int argc, char *argv[], - const char *tags, char *match, - char **remArgs[] ){ - static int firstCall; - static int lastArg; - - int rv = 0; - - if ( !firstCall ) { - lastArg = 1; - firstCall = 1; - } - - while( (lastArg|[]{}! "; - -static const int fontWidth = 9*2; -static const int fontHeight = 12*2; -static const int charsPerLine = 14; - -static int fontInitialized; - -static void putTex( FxU32 addr, void *storage ); -static void consoleScroll( void ); -static void drawChar( char character, float x, float y, float w, float h ); - -#include "tldata.inc" - -/*------------------------------------------------------------------- - Function: tlSetConsole - Date: 2/28 - Implementor(s): jdt - Library: Test Library - Description: - Initialize Console for printing. The console will scroll text - 60 column text in the window described by minx, miny, maxx, maxy. - Arguments: - minX, minY - upper left corner of console - maxX, maxY - lower right corner of console - rows - rows of text to display - columns - columns to display before scroll - Return: - none - -------------------------------------------------------------------*/ -static char *consoleGrid; -static int consoleRows; -static int consoleColumns; -static int consoleX; -static int consoleY; -static int consoleColor; -static float consoleOriginX; -static float consoleOriginY; -static float consoleCharWidth; -static float consoleCharHeight; - -void tlConSet( float minX, float minY, - float maxX, float maxY, - int columns, int rows, - int color ) { - int entry; - char xCoord; - char yCoord; - - fontInfo.smallLod = GR_LOD_128; - fontInfo.largeLod = GR_LOD_128; - fontInfo.aspectRatio = GR_ASPECT_2x1; - fontInfo.format = GR_TEXFMT_ALPHA_8; - fontInfo.data = &fontData[0]; - - if ( getenv( "FX_GLIDE_NO_FONT" ) ) { - fontInitialized = 0; - return; - } - - for( entry = 1; entry < 128; entry++ ) { - char *hit = strchr( fontString, entry ); - if ( hit ) { - int offset = hit - fontString; - - xCoord = ( offset % charsPerLine ) * fontWidth; - yCoord = ( offset / charsPerLine ) * fontHeight; - - fontTable[entry][0] = xCoord; - fontTable[entry][1] = yCoord; - } - } - - if ( consoleGrid ) free( consoleGrid ); - - consoleGrid = calloc( sizeof( char ), rows * columns ); - memset( consoleGrid, 32, rows*columns ); - consoleRows = rows; - consoleColumns = columns; - consoleX = consoleY = 0; - - consoleColor = color; - consoleOriginX = minX; - consoleOriginY = minY; - consoleCharWidth = ( (maxX - minX)/(float)columns ); - consoleCharHeight = ( (maxY - minY)/(float)rows ); - - fontAddress = grTexMaxAddress( 0 ) - - grTexCalcMemRequired( fontInfo.smallLod, fontInfo.largeLod, - fontInfo.aspectRatio, fontInfo.format ); - - fontInitialized = 1; - - return; -}; - -#ifdef __linux__ -static void strupr(char *str) { - while (*str) { - if (islower(*str)) *str=toupper(*str); - str++; - } -} -#endif - -/*------------------------------------------------------------------- - Function: tlConOutput - Date: 2/28 - Implementor(s): jdt - Library: Test Library - Description: - Output a printf style string to the console - Arguments: - fmt - format string - ... - other args - Return: - int - number of chars printed - -------------------------------------------------------------------*/ -int tlConOutput( const char *fmt, ... ) { - int rv = 0; - va_list argptr; - - if( fontInitialized ) { - static char buffer[1024]; - const char *c; - - va_start( argptr, fmt ); - rv = vsprintf( buffer, fmt, argptr ); - va_end( argptr ); - - strupr( buffer ); - - c = buffer; - - /* update console grid */ - - while( *c ) { - switch( *c ) { - case '\n': - consoleY++; - case '\r': - consoleX = 0; - if ( consoleY >= consoleRows ) { - consoleY = consoleRows - 1; - consoleScroll(); - } - break; - default: - if ( consoleX >= consoleColumns ) { - consoleX = 0; - consoleY++; - if ( consoleY >= consoleRows ) { - consoleY = consoleRows - 1; - consoleScroll(); - } - } - consoleGrid[(consoleY*consoleColumns)+consoleX]=*c; - consoleX++; - break; - } - c++; - } - } - - return rv; -} - -/*------------------------------------------------------------------- - Function: tlConClear - Date: 3/1 - Implementor(s): jdt - Library: Test Library - Description: - Clear the console - Arguments: - none - Return: - none - -------------------------------------------------------------------*/ -void tlConClear() { - memset( consoleGrid, 32, consoleRows*consoleColumns ); - consoleX = consoleY = 0; - return; -} - - -/*------------------------------------------------------------------- - Function: tlConRender - Date: 2/28 - Implementor(s): jdt - Library: test library - Description: - Render the console - Arguments: - none - Return: - none - -------------------------------------------------------------------*/ -void tlConRender( void ) { - if( fontInitialized ) { - int x, y; - - grGlideGetState( &state ); - - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_LOCAL, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_SRC_ALPHA, GR_BLEND_ONE_MINUS_SRC_ALPHA, - GR_BLEND_ONE, GR_BLEND_ZERO ); - grAlphaTestFunction( GR_CMP_ALWAYS ); - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR ); - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_DISABLE, - FXFALSE ); - grDepthBufferFunction( GR_CMP_ALWAYS ); - grAlphaTestReferenceValue( 0x1 ); - grSstOrigin( GR_ORIGIN_UPPER_LEFT ); - grCullMode( GR_CULL_DISABLE ); - grTexDownloadMipMap( 0, fontAddress, GR_MIPMAPLEVELMASK_BOTH, - &fontInfo ); - grTexSource( 0, fontAddress, - GR_MIPMAPLEVELMASK_BOTH, &fontInfo ); - grClipWindow( (int)tlScaleX(0.0f),(int)tlScaleY(0.0f), - (int)tlScaleX(1.0f),(int)tlScaleY(1.0f) ); - - for( y = 0; y < consoleRows; y++ ) { - float charX = consoleOriginX; - float charY = consoleOriginY+(consoleCharHeight*y); - for( x = 0; x < consoleColumns; x++ ) { - drawChar( consoleGrid[(y*consoleColumns)+x], - charX, charY, - consoleCharWidth, - consoleCharHeight ); - charX += consoleCharWidth; - } - } - - grGlideSetState(&state); - } - - return; -} - -/*------------------------------------------------------------------- - Function: tlSleep - Date: 3/1 - Implementor(s): jdt - Library: Test Library - Description: - Block for a number of seconds - Arguments: - seconds - number of seconds before function returns - Return: - none - -------------------------------------------------------------------*/ -void tlSleep( int seconds ) { - time_t time0 = time( 0 ); - while( (time(0)-time0) < seconds ); -} - -/*------------------------------------------------------------------- - Function: tlIdentity - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - Return an identity matrix - Arguments: - none - Return: - const pointer to identity matrix - -------------------------------------------------------------------*/ -static TlMatrix currentMatrix; - -#define DEGREE (.01745328f) - -const float *tlIdentity( void ) { - static TlMatrix m; - m[0][0] = 1.0f, m[0][1] = 0.0f, m[0][2] = 0.0f, m[0][3] = 0.0f; - m[1][0] = 0.0f, m[1][1] = 1.0f, m[1][2] = 0.0f, m[1][3] = 0.0f; - m[2][0] = 0.0f, m[2][1] = 0.0f, m[2][2] = 1.0f, m[2][3] = 0.0f; - m[3][0] = 0.0f, m[3][1] = 0.0f, m[3][2] = 0.0f, m[3][3] = 1.0f; - return &m[0][0]; -} - -/*------------------------------------------------------------------- - Function: tlXRotation - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - Generate a rotation about the x axis - Arguments: - degrees - number of degrees to rotate - Return: - const point to rotation matrix - -------------------------------------------------------------------*/ -const float *tlXRotation( float degrees ) { - static TlMatrix m; - float c = (float)cos( degrees * DEGREE ); - float s = (float)sin( degrees * DEGREE ); - m[0][0] = 1.0f, m[0][1] = 0.0f, m[0][2] = 0.0f, m[0][3] = 0.0f; - m[1][0] = 0.0f, m[1][1] = c, m[1][2] = s, m[1][3] = 0.0f; - m[2][0] = 0.0f, m[2][1] = -s, m[2][2] = c, m[2][3] = 0.0f; - m[3][0] = 0.0f, m[3][1] = 0.0f, m[3][2] = 0.0f, m[3][3] = 1.0f; - return &m[0][0]; -} - - -/*------------------------------------------------------------------- - Function: tlYRotation - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - Generate a rotation about the y axis - Arguments: - degrees - number of degrees to rotate - Return: - const point to rotation matrix - -------------------------------------------------------------------*/ -const float *tlYRotation( float degrees ) { - static TlMatrix m; - float c = (float)cos( degrees * DEGREE ); - float s = (float)sin( degrees * DEGREE ); - m[0][0] = c, m[0][1] = 0.0f, m[0][2] = -s, m[0][3] = 0.0f; - m[1][0] = 0.0f, m[1][1] = 1.0f, m[1][2] = 0.0f, m[1][3] = 0.0f; - m[2][0] = s, m[2][1] = 0.0f, m[2][2] = c, m[2][3] = 0.0f; - m[3][0] = 0.0f, m[3][1] = 0.0f, m[3][2] = 0.0f, m[3][3] = 1.0f; - return &m[0][0]; -} - - -/*------------------------------------------------------------------- - Function: tlZRotation - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - Generate about the z axis - Arguments: - degrees - number of degrees to rotate - Return: - const point to rotation matrix - -------------------------------------------------------------------*/ -const float *tlZRotation( float degrees ) { - static TlMatrix m; - float c = (float)cos( degrees * DEGREE ); - float s = (float)sin( degrees * DEGREE ); - m[0][0] = c, m[0][1] = s, m[0][2] = 0.0f, m[0][3] = 0.0f; - m[1][0] = -s, m[1][1] = c, m[1][2] = 0.0f, m[1][3] = 0.0f; - m[2][0] = 0.0f, m[2][1] = 0.0f, m[2][2] = 1.0f, m[2][3] = 0.0f; - m[3][0] = 0.0f, m[3][1] = 0.0f, m[3][2] = 0.0f, m[3][3] = 1.0f; - return &m[0][0]; -} - -/*------------------------------------------------------------------- - Function: tlTranslation - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - Generate a translation matrix - Arguments: - x, y, z - offsets to translate origin - Return: - const point to translation matrix - -------------------------------------------------------------------*/ -const float *tlTranslation( float x, float y, float z ) { - static TlMatrix m; - m[0][0] = 1.0f, m[0][1] = 0.0f, m[0][2] = 0.0f, m[0][3] = 0.0f; - m[1][0] = 0.0f, m[1][1] = 1.0f, m[1][2] = 0.0f, m[1][3] = 0.0f; - m[2][0] = 0.0f, m[2][1] = 0.0f, m[2][2] = 1.0f, m[2][3] = 0.0f; - m[3][0] = x, m[3][1] = y, m[3][2] = z, m[3][3] = 1.0f; - return &m[0][0]; -} - -/*------------------------------------------------------------------- - Function: tlSetMatrix - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - Set the current matrix. This matrix translates the object into - View space from local coordiantes during calls to transformVertices - All spaces are considered to by -1.0->1.0 normalized. - Arguments: - m - pointer to matrix - Return: - none - -------------------------------------------------------------------*/ -void tlSetMatrix( const float *m ) { - memcpy( currentMatrix, m, sizeof( TlMatrix ) ); - return; -} - -/*------------------------------------------------------------------- - Function: tlMultMatrix - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - Multiply the current matrix by the provided matrix - Arguments: - matrix to post-cat to the current matrix - Return: - none - -------------------------------------------------------------------*/ -void tlMultMatrix( const float *m ) { - TlMatrix result; - TlMatrix mat; - int i, j; - - memcpy( mat, m, sizeof( TlMatrix ) ); - - for( j = 0; j < 4; j++ ) { - for( i = 0; i < 4; i++ ) { - result[j][i] = - currentMatrix[j][0] * mat[0][i] + - currentMatrix[j][1] * mat[1][i] + - currentMatrix[j][2] * mat[2][i] + - currentMatrix[j][3] * mat[3][i]; - } - } - memcpy( currentMatrix, result, sizeof( TlMatrix ) ); - -} - -/*------------------------------------------------------------------- - Function: tlTransformVertices - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - Transform a list of vertices from model space into view space - Arguments: - dstVerts - memory to store transformed vertices - srcVerts - array of vertices to be transformed - length - number of vertices to transform - Return: - none - -------------------------------------------------------------------*/ -void tlTransformVertices( TlVertex3D *dstVerts, TlVertex3D *srcVerts, unsigned length ) { - TlVertex3D tmp, v; - TlMatrix m; - unsigned i; - - memcpy( m, currentMatrix, sizeof( TlMatrix ) ); - for( i = 0; i < length; i++ ) { - v = srcVerts[i]; - tmp = v; - tmp.x = v.x * m[0][0] + v.y * m[1][0] + v.z * m[2][0] + v.w * m[3][0]; - tmp.y = v.x * m[0][1] + v.y * m[1][1] + v.z * m[2][1] + v.w * m[3][1]; - tmp.z = v.x * m[0][2] + v.y * m[1][2] + v.z * m[2][2] + v.w * m[3][2]; - tmp.w = v.x * m[0][3] + v.y * m[1][3] + v.z * m[2][3] + v.w * m[3][3]; - dstVerts[i] = tmp; - } - return; -} - -/*------------------------------------------------------------------- - Function: tlProjectVertices - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - perspective project a set of vertices into normalized 2D space (0,1) - Arguments: - dstVerts - memory to store projected vertices - srcVerts - array of vertices to be transformed - length - number of vertices to transform - Return: - none - -------------------------------------------------------------------*/ -#define VP_OFFSET 1.0f -#define VP_SCALE 0.5f - -void tlProjectVertices( TlVertex3D *dstVerts, TlVertex3D *srcVerts, unsigned length ) { - TlVertex3D tmp, v; - TlMatrix m; - unsigned i; - - /* simplified perspective proj matrix assume unit clip volume */ - m[0][0] = 1.0f, m[0][1] = 0.0f, m[0][2] = 0.0f, m[0][3] = 0.0f; - m[1][0] = 0.0f, m[1][1] = 1.0f, m[1][2] = 0.0f, m[1][3] = 0.0f; - m[2][0] = 0.0f, m[2][1] = 0.0f, m[2][2] = 1.0f, m[2][3] = 1.0f; - m[3][0] = 0.0f, m[3][1] = 0.0f, m[3][2] = 0.0f, m[3][3] = 0.0f; - - for( i = 0; i < length; i++ ) { - v = srcVerts[i]; - tmp = v; - tmp.x = v.x * m[0][0] + v.y * m[1][0] + v.z * m[2][0] + v.w * m[3][0]; - tmp.y = v.x * m[0][1] + v.y * m[1][1] + v.z * m[2][1] + v.w * m[3][1]; - tmp.z = v.x * m[0][2] + v.y * m[1][2] + v.z * m[2][2] + v.w * m[3][2]; - tmp.w = v.x * m[0][3] + v.y * m[1][3] + v.z * m[2][3] + v.w * m[3][3]; - tmp.x /= tmp.w, tmp.y /= tmp.w, tmp.z /= tmp.w; - tmp.x += VP_OFFSET, tmp.x *= VP_SCALE; - tmp.y += VP_OFFSET, tmp.y *= VP_SCALE; - dstVerts[i] = tmp; - } -} - - -/*------------------------------------------------------------------- - Function: tlLoadTexture - Date: 3/3 - Implementor(s): jdt - Library: Test Libarary - Description: - Load Texture - - This example loads textures from a .3df file. 3DF files - containe pre-computed mipmaps data along with any - necessary supplementary information, for example - palettes, ncc-tables, level-of-detail description, - aspect ratio or format - - The gu3dfGetInfo and gu3dfLoad APIs load A 3DF file - into Gu3DfInfo structure from a file on disk. Data - can then be extracted from the gu3DfInfo structure - to initialize a GrTexInfo structure used in the - glide texturing routines. Also note that texture table - ( either NCC or Palette ) management is left up to the - application programmer. - Arguments: - filename - name of .3df file on disk - info - Pointer to GrTexInfo - tableType - pointer to tabletype - table - pointer to table data - Return: - 0 - fail - 1 - pass - -------------------------------------------------------------------*/ -static GrTexTable_t texTableType( GrTextureFormat_t format ); - -int tlLoadTexture( const char *filename, - GrTexInfo *info, - GrTexTable_t *tableType, - void *table ) { - Gu3dfInfo tdfInfo; - int rv = 0; - - assert( filename ); - assert( info ); - assert( tableType ); - assert( table ); - if ( gu3dfGetInfo( filename, &tdfInfo ) ) { - tdfInfo.data = malloc( tdfInfo.mem_required ); - assert( tdfInfo.data ); - if ( gu3dfLoad( filename, &tdfInfo ) ) { - info->smallLod = tdfInfo.header.small_lod; - info->largeLod = tdfInfo.header.large_lod; - info->aspectRatio = tdfInfo.header.aspect_ratio; - info->format = tdfInfo.header.format; - info->data = tdfInfo.data; - *tableType = texTableType( info->format ); - switch( *tableType ) { - case GR_TEXTABLE_NCC0: - case GR_TEXTABLE_NCC1: - case GR_TEXTABLE_PALETTE: - memcpy( table, &(tdfInfo.table), sizeof( TlTextureTable ) ); - break; - default: - break; - } - rv = 1; - } - } - return rv; -} - - - -/*-------------------------------------------------------------------- - Static Helpers - --------------------------------------------------------------------*/ - -static void consoleScroll( void ) { - memmove( consoleGrid, - consoleGrid + consoleColumns, - (consoleRows-1)*consoleColumns ); - memset( consoleGrid+(consoleRows-1)*consoleColumns, - 32, - consoleColumns ); -} - -static void drawChar( char character, float x, float y, float w, float h ) { - GrVertex a, b, c, d; - /* a---b - |\ | - | \ | - | \| - c---d */ - - if ( character == 32 ) return; - - a.oow = b.oow = c.oow = d.oow = 1.0f; - - a.x = c.x = tlScaleX(x); - a.y = b.y = tlScaleY(y); - d.x = b.x = tlScaleX(x+w); - d.y = c.y = tlScaleY(y+h); - - grConstantColorValue( consoleColor ); - - a.tmuvtx[0].sow = c.tmuvtx[0].sow = (float)fontTable[(int) character][0]; - a.tmuvtx[0].tow = b.tmuvtx[0].tow = (float)fontTable[(int) character][1]; - d.tmuvtx[0].sow = b.tmuvtx[0].sow = a.tmuvtx[0].sow + (float)fontWidth; - d.tmuvtx[0].tow = c.tmuvtx[0].tow = a.tmuvtx[0].tow + (float)fontHeight; - - grDrawTriangle( &a, &d, &c ); - grDrawTriangle( &a, &b, &d ); - return; -} - - - - -static void readRegion( void *data, - int x, int y, - int w, int h ); -static void writeRegion( void *data, - int x, int y, - int w, int h ); - - -static void putTex( FxU32 addr, void *storage ) { - GrTexInfo texInfo; - - texInfo.smallLod = GR_LOD_256; - texInfo.largeLod = GR_LOD_256; - texInfo.aspectRatio = GR_ASPECT_1x1; - texInfo.format = GR_TEXFMT_RGB_565; - texInfo.data = storage; - - grTexDownloadMipMap( 0, addr, GR_MIPMAPLEVELMASK_BOTH, &fontInfo ); -} - -static void readRegion( void *data, - int sx, int sy, - int w, int h ) { - int x; int y; - GrLfbInfo_t info; - - info.size = sizeof( info ); - - assert( grLfbLock( GR_LFB_READ_ONLY, - GR_BUFFER_BACKBUFFER, - GR_LFBWRITEMODE_ANY, - GR_ORIGIN_UPPER_LEFT, - FXFALSE, - &info ) ); - - for( y = 0; y < h; y++ ) { - unsigned short *dst = ((unsigned short *)data+ - (w*y)); - unsigned short *src = (unsigned short*)(((char*)info.lfbPtr) - +(info.strideInBytes*(sy+y)) - +(sx<<1)); - for( x = 0; x < w; x++ ) { - *dst++ = *src++; - } - } - - - assert( grLfbUnlock( GR_LFB_READ_ONLY, GR_BUFFER_BACKBUFFER ) ); - return; -} -static void writeRegion( void *data, - int sx, int sy, - int w, int h ) { - int x; int y; - GrLfbInfo_t info; - - info.size = sizeof( info ); - - assert( grLfbLock( GR_LFB_WRITE_ONLY, - GR_BUFFER_BACKBUFFER, - GR_LFBWRITEMODE_ANY, - GR_ORIGIN_UPPER_LEFT, - FXFALSE, - &info ) ); - - for( y = 0; y < h; y++ ) { - unsigned short *src = ((unsigned short *)data+ - (w*y)); - unsigned short *dst = (unsigned short*)(((char*)info.lfbPtr) - +(info.strideInBytes*(sy+y)) - +(sx<<1)); - for( x = 0; x < w; x++ ) { - *dst++ = *src++; - } - } - - assert( grLfbUnlock( GR_LFB_WRITE_ONLY, GR_BUFFER_BACKBUFFER ) ); - return; -} - - -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; -} - -/* - * SimpleRleDecode - * simple rle decoder - * Arguments: - * width : width of the image - * height : height of the image - * pixelsize : 1-4 - * *mem : compressed data - * *buff : uncompressed data - * Return: - * TRUE if decode sucessful. otherwise FALSE - * The simple rle file file format - * width: 2 bytes - * height: 2 bytes - * compression type: 1 byte (0: literal data, 1: rle) - * depth: 1 byte (16 for sst1) - * image data - * 1st byte: control byte. msb = 1 indicate a run, msb = 0 indicate a literal string - * bit 7-0 is counter. it is zero based. - * next depth/8 bytes: pixel data - */ -FxBool -SimpleRleDecode -( - FxU16 width, - FxU16 height, - FxU8 pixelsize, - FxU8 *mem, - FxU8 *buff -) -{ - FxU32 count = width * height; - FxU8 run, lit; - - while (count) { - if (*mem & 0x80) { - run = *mem & 0x7f; - run++; - mem++; - count -= run; - while (run) { - memcpy(buff, mem, pixelsize); - run--; - buff+=pixelsize; - } - mem+=pixelsize; - } - else { - lit = *mem; - lit++; - mem++; - count -= lit; - while (lit) { - memcpy(buff, mem, pixelsize); - lit--; - buff+=pixelsize; - mem+=pixelsize; - } - } - if (count < 0) - return FXFALSE; - } - return FXTRUE; -} - -/* - * WritePixel - * write rle run/literal strings - * Arguments: - * flag: TRUE if it is a run. otherwise it is a string - * count: number of run/literal (0 based) - * *buff: output area - * *tmp: source area - * pixelsize: pixel size (1-4) - * Return: - * none - */ -static void -WritePixel -( - FxBool flag, - FxU8 count, - FxU8 *buff, - FxU8 *tmp, - FxU8 pixelsize -) -{ - FxU8 val; - FxU32 i; - - if (flag) { - val = 0x80 | count; - count = 0; - } - else - val = count; - - *buff = val; - buff++; - for (i = 0; i <= count; i++) { - memcpy(buff, tmp, pixelsize); - buff+=pixelsize; - tmp+=4; - } -} - -/* - * SimpleRleEncode - * simple rle encoder - * Arguments: - * pixelcount : number of pixels - * pixelsize : 1-4 - * *mem : source image - * *buff : compressed data - * Return: - * none - */ -static FxU32 -SimpleRleEncode -( - FxU32 pixelcount, /* number of pixels */ - FxU8 pixelsize, /* size of pixel (in bytes) 1-4 */ - FxU8 *mem, /* src image */ - FxU8 *buff /* compressed data */ -) -{ - FxU8 *src = buff; - FxU8 run = 0, lit = 0; - FxU32 tmp[130]; - FxU32 pval = 0, cval = 0; - FxU32 i; - FxU32 tt; - FxBool flag = FXFALSE; - - /* determine run or literal */ - mem+=pixelsize; - - for (i = 1; i < pixelcount; i++) { - if (i > 300000) - tt = 1; - memcpy(&pval, mem-pixelsize, pixelsize); - memcpy(&cval, mem, pixelsize); - if (cval == pval) { - flag = FXFALSE; - if (lit) { - WritePixel(FXFALSE, (FxU8)(lit - 1), buff, (FxU8 *)&tmp[0], pixelsize); - buff += (1 + pixelsize * lit); - lit = 0; - } - run++; - if (run == 128) { - WritePixel(FXTRUE, (FxU8)(run - 1), buff, (FxU8 *)&tmp[0], pixelsize); - buff += (1 + pixelsize); - run -= 128; - } - memcpy(&tmp[0], mem, pixelsize); - } - else { - flag = FXTRUE; - if (run) { - WritePixel(FXTRUE, run, buff, (FxU8 *)&tmp[0], pixelsize); - buff += (1 + pixelsize); - run = 0; - } - else { - if (lit == 128) { - WritePixel(FXFALSE, (FxU8)(lit - 1), buff, (FxU8 *)&tmp[0], pixelsize); - buff += (1 + pixelsize * lit); - lit -= 128; - } - memcpy(&tmp[lit], mem-pixelsize, pixelsize); - lit++; - } - } - mem+=pixelsize; - } - /* last pixel */ - if (flag) { - if (lit == 128) { - WritePixel(FXFALSE, (FxU8)(lit - 1), buff, (FxU8 *)&tmp[0], pixelsize); - buff += (1 + pixelsize * lit); - lit -= 128; - } - memcpy(&tmp[lit], mem-pixelsize, pixelsize); - WritePixel(FXFALSE, (FxU8)lit, buff, (FxU8 *)&tmp[0], pixelsize); - lit++; - buff += (1 + pixelsize * lit); - lit = 0; - } - else if (run) { - WritePixel(FXTRUE, run, buff, (FxU8 *)&tmp[0], pixelsize); - buff += (1 + pixelsize); - run = 0; - } - - return( (FxU32) (buff - src)); -} - -/*------------------------------------------------------------------- - Function: tlScreenDump - Date: 6/6/97 - Implementor(s): - Library: test library - Description: - dump the lfb data - Arguments: - filename - filename - width - width for frame buffer - height - height for frame buffer - Return: - none - -------------------------------------------------------------------*/ -FxBool -tlScreenDump -( - const char *filename, - FxU16 width, - FxU16 height -) -{ - FILE *fp; - FxU16 *pixel, *region; - FxU8 *buff; - FxU32 count, signature; - FxU8 type, depth; - - fp = fopen(filename, "wb"); - if (fp == NULL) - return(FXFALSE); - - region = malloc(width * height * sizeof(FxU16)); - buff = malloc(width * height * sizeof(FxU16) * 2); - grLfbReadRegion( GR_BUFFER_FRONTBUFFER, - 0, 0, width, height, - width*2, region ); - - pixel = (FxU16 *)region; - - count = SimpleRleEncode( (FxU32)width * (FxU32)height, 2, (FxU8 *)region, (FxU8 *)buff); - - /* header of the file */ - type = LFB_DATA_RLE; - depth = 16; - signature = IMAGE_SRLE; - fwrite(&signature, sizeof(FxU32), 1, fp); - fwrite(&width, sizeof(FxU16), 1, fp); - fwrite(&height, sizeof(FxU16), 1, fp); - fwrite(&depth, sizeof(FxU8), 1, fp); - fwrite(&type, sizeof(FxU8), 1, fp); - - /* LFB data */ - fwrite(buff, count, 1, fp); - - free(buff); - free(region); - fclose(fp); - - return FXTRUE; -} - -#ifdef __linux__ -#include - -/*------------------------------------------------------------------- - Function: tlKbHit - Date: 2/28 - Implementor(s): jdt - Library: test library - Description: - Returns true if there are pending characters in the input queue - Arguments: - none - Return: - nonzero if keys in queue - -------------------------------------------------------------------*/ -int tlKbHit( void ) { - return lin_kbhit(); -} - -/*------------------------------------------------------------------- - Function: tlGetCH - Date: 2/28 - Implementor(s): jdt - Library: test library - Description: - Returns character from top of input fifo, blocks if fifo is empty - Arguments: - none - Return: - character - -------------------------------------------------------------------*/ -char tlGetCH( void ) { - return lin_getch(); -} - -FxBool -tlErrorMessage( char *err) { - return !!fprintf(stderr, err); -} /* tlErrorMessage */ - -#else -#ifdef __DOS32__ -/*------------------------------------------------------------------- - Function: tlKbHit - Date: 2/28 - Implementor(s): jdt - Library: test library - Description: - Returns true if there are pending characters in the input queue - Arguments: - none - Return: - nonzero if keys in queue - -------------------------------------------------------------------*/ -int tlKbHit( void ) { - return kbhit(); -} - -/*------------------------------------------------------------------- - Function: tlGetCH - Date: 2/28 - Implementor(s): jdt - Library: test library - Description: - Returns character from top of input fifo, blocks if fifo is empty - Arguments: - none - Return: - character - -------------------------------------------------------------------*/ -char tlGetCH( void ) { - return getch(); -} - -FxBool -tlErrorMessage( char *err) { - fprintf(stderr, err); -} /* tlErrorMessage */ - -#else /* __WIN32__ */ - - -/* This segment simulates main() for Windows, creates a window, etc. */ -#define WIN32_LEAN_AND_MEAN -#include - -/* Forward declarations */ -HWND hWndMain; -char ** commandLineToArgv(LPSTR lpCmdLine, int *pArgc); - -/* - * MainWndproc - * - * Callback for all Windows messages - */ -static int qhead = 0; -static int qtail = 0; -static int queue[256] = {0}; - -long FAR PASCAL -MainWndproc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) -{ - PAINTSTRUCT ps; - HDC hdc; - - extern GrHwConfiguration hwconfig; - - switch( message ) - { - case WM_SETCURSOR: - if (Res != GR_RESOLUTION_NONE) { - SetCursor(NULL); - return 0; - } - break; - - case WM_CREATE: - break; - - case WM_PAINT: - hdc = BeginPaint( hWnd, &ps ); - EndPaint( hWnd, &ps ); - return 1; - - case WM_CLOSE: - queue[qhead++] = 'q'; qhead &= 255; - break; - - case WM_DESTROY: - break; - - case WM_MOVE: - if (!grSstControl(GR_CONTROL_MOVE)) { - PostMessage( hWndMain, WM_CLOSE, 0, 0 ); - return 0; - } - break; - - case WM_ACTIVATE: - if (hwconfig.SSTs[0].type == GR_SSTTYPE_VOODOO) { - if (wParam & WA_INACTIVE) - grSstControl(GR_CONTROL_DEACTIVATE); - else { - grSstControl(GR_CONTROL_ACTIVATE); -#if 0 - grHints(GR_HINT_H3DENABLE,1); -#endif - } - } else - return 0; - break; - - case WM_DISPLAYCHANGE: - case WM_SIZE: - { - extern void getWindowSize(float *width, float *height); - float width, height; - - getWindowSize(&width, &height); -#ifndef H3D - tlSetScreen( width, height); -#endif - } - if (!grSstControl(GR_CONTROL_RESIZE)) { - MessageBox( hWnd, "Resize failed due to lack of sufficient buffer memory.\n", "Allocation Failure", MB_OK | MB_APPLMODAL ); - PostMessage( hWndMain, WM_CLOSE, 0, 0 ); - okToRender = FXFALSE; - return 0; - } else { - okToRender = FXTRUE; - } - break; - - case WM_CHAR: - if (!isascii(wParam)) break; -#if 0 - printf("Posting keystroke %.02x\n", wParam); - fflush(stdout); -#endif - /* queue[qhead++] = tolower(wParam); */ - queue[qhead++] = wParam; - qhead &= 255; - break; - - default: - break; - } - return DefWindowProc(hWnd, message, wParam, lParam); - -} /* MainWndproc */ - -/* - * initApplication - * - * Do that Windows initialization stuff... - */ -static FxBool -initApplication( HANDLE hInstance, int nCmdShow ) -{ - WNDCLASS wc; - FxBool rc; - - wc.style = CS_DBLCLKS; - wc.lpfnWndProc = MainWndproc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = hInstance; - wc.hIcon = LoadIcon( NULL, IDI_APPLICATION); /* generic icon */ - wc.hCursor = LoadCursor( NULL, IDC_ARROW ); - wc.hbrBackground = GetStockObject( BLACK_BRUSH ); - wc.lpszMenuName = NULL; - wc.lpszClassName = "WinGlideClass"; - rc = RegisterClass( &wc ); - if( !rc ) { - return FALSE; - } - - hWndMain = - CreateWindowEx( -#if 0 - WS_EX_APPWINDOW gives you regular borders? - WS_EX_TOPMOST Works as advertised. -#endif - WS_EX_APPWINDOW, - "WinGlideClass", - "Glide Test", - WS_OVERLAPPED | - WS_CAPTION | - WS_THICKFRAME | - WS_MAXIMIZEBOX | - WS_MINIMIZEBOX | - WS_VISIBLE | /* so we don't have to call ShowWindow */ - WS_POPUP | /* non-app window */ - WS_SYSMENU, /* so we get an icon in the tray */ - CW_USEDEFAULT, - CW_USEDEFAULT, - 0x110, /* GetSystemMetrics(SM_CXSCREEN), */ - 0x120, /* GetSystemMetrics(SM_CYSCREEN), */ - NULL, - NULL, - hInstance, - NULL - ); - - if( !hWndMain ) { - return FALSE; - } - - SetCursor(NULL); - - ShowWindow( hWndMain, SW_NORMAL); - UpdateWindow( hWndMain ); - - return TRUE; - -} /* initApplication */ - -/* - * WinMain - */ -int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, - LPSTR lpCmdLine, int nCmdShow ) -{ - if( !initApplication(hInstance, nCmdShow) ) - return FALSE; - - { - /* - * Since printfs go into the bit bucket on Win32, - * put up a message in the window. - */ - HDC hDC = GetDC(hWndMain); - char *message = "Press any Key to continue!"; - RECT rect; - - GetClientRect(hWndMain, &rect); - SetTextColor(hDC, RGB(0, 255, 255)); - SetBkColor(hDC, RGB(0, 0, 0)); - SetTextAlign(hDC, TA_CENTER); - ExtTextOut(hDC, rect.right/2, rect.bottom/2, ETO_OPAQUE, &rect, - message, strlen(message), NULL); - ReleaseDC(hWndMain, hDC); - GdiFlush(); - } - - { - int argc; - char **argv; - extern int main(int argc, char **argv); - - argv = commandLineToArgv(lpCmdLine, &argc); - main(argc, argv); - } - - printf("Exiting winMain()\n"); - fflush(stdout); - - DestroyWindow(hWndMain); - return 0; - -} /* WinMain */ - -FxBool -tlErrorMessage( char *err) -{ - /* make the cursor visible */ - SetCursor(LoadCursor( NULL, IDC_ARROW )); - - /* - ** warn user if there is one - */ - printf("Error %s..\n", err); - fflush(stdout); - - MessageBox( hWndMain, err, "ERROR", MB_OK ); - return FALSE; -} /* tlErrorMessage */ - -/* - * Converts lpCmdLine to WinMain into argc, argv - */ -static char *fakeName = "WinTest"; -static char *argvbuf[32]; -static char cmdLineBuffer[1024]; -char ** -commandLineToArgv(LPSTR lpCmdLine, int *pArgc) -{ - char *p, *pEnd; - int argc = 0; - - argvbuf[argc++] = fakeName; - - if (lpCmdLine == NULL) { - *pArgc = argc; - return argvbuf; - } - - strcpy(cmdLineBuffer, lpCmdLine); - p = cmdLineBuffer; - pEnd = p + strlen(cmdLineBuffer); - if (pEnd >= &cmdLineBuffer[1022]) pEnd = &cmdLineBuffer[1022]; - - fflush(stdout); - - while (1) { - /* skip over white space */ - fflush(stdout); - - while (*p == ' ') p++; - if (p >= pEnd) break; - - argvbuf[argc++] = p; - if (argc >= 32) break; - - /* skip till there's a 0 or a white space */ - while (*p && (*p != ' ')) p++; - - if (*p == ' ') *p++ = 0; - } - - *pArgc = argc; - return argvbuf; -} - -/*------------------------------------------------------------------- - Function: tlKbHit - Date: 2/28 - Implementor(s): jdt - Library: test library - Description: - Returns true if there are pending characters in the input queue - Arguments: - none - Return: - nonzero if keys in queue - -------------------------------------------------------------------*/ -int -tlKbHit( void ) -{ - MSG msg; - - if (qhead != qtail) { - return 1; - } - - while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { - TranslateMessage(&msg); - DispatchMessage(&msg); /* this might change qhead */ - if (qhead != qtail) { - return 1; - } - } - return 0; -} - -/*------------------------------------------------------------------- - Function: tlGetCH - Date: 2/28 - Implementor(s): jdt - Library: test library - Description: - Returns character from top of input fifo, blocks if fifo is empty - Arguments: - none - Return: - character - -------------------------------------------------------------------*/ -char -tlGetCH( void ) -{ - MSG msg; - char rv; - - if (qtail != qhead) { - rv = queue[qtail++]; - qtail &= 255; - return rv; - } - - while (GetMessage( &msg, NULL, 0, 0 )) { - TranslateMessage(&msg); - DispatchMessage(&msg); - - if (qtail != qhead) { - rv = queue[qtail++]; - qtail &= 255; - return rv; - } - } - - /* Should never get here!! */ - /* printf("Bad exit..\n"); */ - /* fflush(stdout); */ -} - -void -tlExit() -{ - PostMessage( hWndMain, WM_CLOSE, 0, 0 ); -} - - -void -getWindowSize(float *width, float *height) -{ - RECT rect; - - if (fullScreen) { - GetWindowRect(hWndMain, &rect); - *width = (float) (rect.right-rect.left); - *height = (float) (rect.bottom-rect.top); - } - else { - GetClientRect(hWndMain, &rect); - *width = (float) (rect.right-rect.left); - *height = (float) (rect.bottom-rect.top); - } -} - - -#endif /* __DOS32__ */ -#endif /* __linux__ */ diff --git a/glide2x/h3/glide/tests/tlib.h b/glide2x/h3/glide/tests/tlib.h deleted file mode 100644 index d21dce9..0000000 --- a/glide2x/h3/glide/tests/tlib.h +++ /dev/null @@ -1,141 +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$ -** -*/ - - -#ifndef _TLIB_H_ -#define _TLIB_H_ -#ifdef __cplusplus -extern "C" { -#endif - - -/* If not debugging, change the meaning of the ANSI assert - * so that it is a harmless wrapper rather than ((void)0) as in - */ -#ifndef DEBUG -#define NDEBUG -#endif - -int tlGetOpt( int argc, char *argv[], const char *tags, char *match, char **remArgs[] ); - -int tlGetResolutionConstant( const char *identifier, float *width, float *height ); -void tlGetDimsByConst(const int res, float *w, float *h); -const char *tlGetResolutionString( int res ); -const char *tlGetResolutionList( void ); - -void tlSetScreen( float width, float height ); -float tlScaleX( float coord ); -float tlScaleY( float coord ); - -void tlConSet( float minX, float minY, - float maxX, float maxY, - int columns, int rows, - int color ); -int tlConOutput( const char *fmt, ... ); -void tlConClear(); -void tlConRender(); - -int tlKbHit( void ); -char tlGetCH( void ); - -void tlSleep( int seconds ); - -#define LFB_DATA_LITERAL 0 -#define LFB_DATA_RLE 1 -#define IMAGE_SRLE (((FxU32)'S' << 24) | ((FxU32)'R' << 16) | ((FxU32)'L' << 8) | ((FxU32)'E')) - -FxBool SimpleRleDecode(FxU16 width,FxU16 height,FxU8 pixelsize, FxU8 *mem,FxU8 *buff); -void tlGrabRect(void *memory, FxU32 minx, FxU32 miny, FxU32 maxx, FxU32 maxy); -FxBool tlScreenDump(const char *filename, FxU16 width, FxU16 height); - -typedef struct { - float x; - float y; - float z; - float w; - float s; - float t; - float r; - float g; - float b; - float a; -} TlVertex3D; - -typedef float TlMatrix[4][4]; - -const float *tlIdentity( void ); -const float *tlZRotation( float degrees ); -const float *tlYRotation( float degrees ); -const float *tlXRotation( float degrees ); -const float *tlTranslation( float x, float y, float z ); -void tlSetMatrix( const float *m ); -void tlMultMatrix( const float *m ); -void tlTransformVertices( TlVertex3D *dstList, - TlVertex3D *srcList, - unsigned length ); -void tlProjectVertices( TlVertex3D *dstList, - TlVertex3D *srcList, - unsigned length ); - -FxBool tlOkToRender(void); - -FxBool -tlErrorMessage(char *err); - -typedef FxU32 TlPalette[256]; -typedef struct { - FxU8 yRGB[16]; - FxI16 iRGB[4][3]; - FxI16 qRGB[4][3]; - FxU32 packed_data[12]; -} TlNCCTable; - -typedef union { - TlPalette palette; - TlNCCTable nccTable; -} TlTextureTable; - -typedef struct { - GrTexInfo info; - GrTexTable_t tableType; - TlTextureTable tableData; -} TlTexture; - -#define NO_TABLE ((GrTexTable_t)(~0)) - -int tlLoadTexture( const char *filename, - GrTexInfo *info, - GrTexTable_t *tableType, - void *table ); - -/* We are making function calls from within assert() */ -#ifdef NDEBUG -#undef NDEBUG -#endif - -#ifdef __cplusplus -} -#endif -#endif diff --git a/glide2x/h3/glide/tests/yiq.3df b/glide2x/h3/glide/tests/yiq.3df deleted file mode 100644 index 40b79d5..0000000 Binary files a/glide2x/h3/glide/tests/yiq.3df and /dev/null differ diff --git a/glide2x/h3/include/makefile b/glide2x/h3/include/makefile deleted file mode 100644 index 28ecd22..0000000 --- a/glide2x/h3/include/makefile +++ /dev/null @@ -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 = *.h - -!include $(BUILD_ROOT_SWLIBS)/include/nmake/3dfx.mak diff --git a/glide2x/h3/include/makefile.linux b/glide2x/h3/include/makefile.linux deleted file mode 100644 index 11ef236..0000000 --- a/glide2x/h3/include/makefile.linux +++ /dev/null @@ -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 = $(wildcard *.h) - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak diff --git a/glide2x/h3/incsrc/fxhal.h b/glide2x/h3/incsrc/fxhal.h deleted file mode 100644 index 0c9d1c0..0000000 --- a/glide2x/h3/incsrc/fxhal.h +++ /dev/null @@ -1,217 +0,0 @@ -#ifndef __FXHAL_H__ -#define __FXHAL_H__ - -/* -** 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$ -*/ - -#if defined(BUILD_HAL) -#define FX_DLL_DEFINITION -#endif -#include -#include - -#include - -// Allow SourceSafe to track Revision values -#define HAL_H_REV "$Revision$" - -// Just to unconfuse myself: -// -// CHIP FBI-REV TMU-REV DEV-ID -// SST1-0.6u 1 0 1 -// SST1-0.5u 2 1 1 -// SST-96 2 (1) 2 -// H3 A0 1 4 3 -// H3 A1 2 4 3 -// H3 B0 3 4 3 -// H4_OEM 1 4 4 -// H4 1 4 5 - -#define SST_DEVICE_ID_SST1 1 -#define SST_DEVICE_ID_SST96 2 -#define SST_DEVICE_ID_H3 3 -#define SST_DEVICE_ID_H4_OEM 4 -#define SST_DEVICE_ID_H4 5 - -#define MBYTE(n) (((FxU32)(n))<<20) -#define DEAD 0xDEAD - -// Maximum number of boards and TMUs supported -#define HAL_MAX_BOARDS 4 - -//---------------------------------------------------------------------- -// the root of all Hal information -//---------------------------------------------------------------------- -typedef struct { - int csim; - int hsim; - int hw; - int csimio; - FxU32 boardsFound; // number of boards found - FxDeviceInfo boardInfo[HAL_MAX_BOARDS]; - - int pollLimit; // number of pixels to poll msg Q after - int pollCount; // current pixel counter - int video; // video output enabled - FxU32 csimLastRead; -} HalInfo; - -//---------------------------------------------------------------------- -/* -** SST Hardware Initialization routine protypes -** -** If all initialization routines are called, it is assumed they are called -** in the following order: -** 0. fxHalInit(); -** 1. fxHalMapBoard(); -** 2. fxHalInitRegisters(); -** 3. fxHalInitGamma(); -** 4. fxHalInitVideo(); -** 5. fxHalShutdown(); -** -** fxHalShutdown() is called at the end of an application to turn off -** the graphics subsystem -** -*/ - -FX_ENTRY void FX_CALL fxHalPutenv(char *buf); -FX_ENTRY HalInfo * FX_CALL fxHalInit(FxU32 flags); -FX_ENTRY FxU32 FX_CALL fxHalNumBoardsInSystem(void); -FX_ENTRY SstRegs * FX_CALL fxHalMapBoard(FxU32 boardNum); -FX_ENTRY FxBool FX_CALL fxHalInitCmdFifo( SstRegs *sst, int which, FxU32 fifoStart, - FxU32 size, FxBool directExec, FxBool disableHoles, FxBool agpEnable); -FX_ENTRY FxBool FX_CALL fxHalInitRegisters(SstRegs *sst); -FX_ENTRY FxBool FX_CALL fxHalInitRenderingRegisters(SstRegs *sst); -FX_ENTRY FxBool FX_CALL fxHalInitGuiRegisters(SstGRegs *sstg); -FX_ENTRY FxBool FX_CALL fxHalInitCmdAgpRegisters(SstCRegs *sstc); -FX_ENTRY FxBool FX_CALL fxHalInitGamma(SstRegs *sst, FxFloat gamma); -FX_ENTRY FxBool FX_CALL fxHalInitGammaRGB(SstRegs *sst, FxFloat r, FxFloat g, FxFloat b); -FX_ENTRY FxBool FX_CALL fxHalInitVideo(SstRegs *sst, FxU32 resolution, - FxU32 refresh, FxVideoTimingInfo *); -FX_ENTRY FxBool FX_CALL fxHalIdle(SstRegs *sst); -FX_ENTRY FxBool FX_CALL fxHalIdleNoNop(SstRegs *sst); -FX_ENTRY FxBool FX_CALL fxHalIdle2(SstRegs *sst); -FX_ENTRY FxBool FX_CALL fxHalIdleNoNop2(SstRegs *sst); -FX_ENTRY FxBool FX_CALL fxHalInitUSWC(SstRegs *sst); -FX_ENTRY FxBool FX_CALL fxHalShutdown(SstRegs *sst); -FX_ENTRY void FX_CALL fxHalShutdownAll(void); -FX_ENTRY FxBool FX_CALL fxHalGetDeviceInfo(SstRegs *sst, FxDeviceInfo *); - -FX_ENTRY FxBool FX_CALL fxHalVsync(SstRegs *sst); -FX_ENTRY FxBool FX_CALL fxHalVsyncNot(SstRegs *sst); - -FX_ENTRY void FX_CALL -fxHalInitVideoOverlaySurface( - SstRegs *sst, // pointer to hw - FxU32 enable, // 1=enable Overlay surface (OS), 1=disable - FxU32 stereo, // 1=enable OS stereo, 0=disable - FxU32 horizScaling, // 1=enable horizontal scaling, 0=disable - FxU32 dudx, // horizontal scale factor (ignored if not - // scaling) - FxU32 verticalScaling, // 1=enable vertical scaling, 0=disable - FxU32 dvdy, // vertical scale factor (ignored if not - // scaling) - FxU32 filterMode, // duh - FxU32 tiled, // 0=OS linear, 1=tiled - FxU32 pixFmt, // pixel format of OS - FxU32 clutBypass, // bypass clut for OS? - FxU32 clutSelect, // 0=lower 256 CLUT entries, 1=upper 256 - FxU32 startAddress, // board address of beginning of OS - FxU32 stride); // distance between scanlines of the OS, in - // units of bytes for linear OS's and - // tiles for tiled OS's - -#if !defined(MSVC16) && !defined(THUNK32) && !defined(DIRECTX) - - #define GET8(s) s - #define GET16(s) s - #define GET(s) s - #define SET8(d,s) d = s - #define SET16(d,s) d = s - #define SET(d,s) d = s - #define SETF(d,s) (*(float *)&(d)) = s - - #define AGPMEMINIT() GDBG_ERROR("AGPMEMINIT","nyi for hardware\n"); - #define AGPMEMALLOC(sst,size) GDBG_ERROR("AGPMEMALLOC","nyi for hardware\n"); - #define AGPWRV(v,d) (v) = (d) - #define AGPRDV(v) (v) - #define AGPWRP(aHi,aLo,d) AGPWRV( *agpPhysToVirt(aHi,aLo), d ) - #define AGPRDP(aHi,aLo) AGPRDP( *agpPhysToVirt(aHi,aLo) ) - -#define GET_IO8(p) pioInByte(p) -#define GET_IO16(p) pioInWord(p) -#define GET_IO(p) pioInLong(p) -#define SET_IO8(p,d) pioOutByte(p,d) -#define SET_IO16(p,d) pioOutWord(p,d) -#define SET_IO(p,d) pioOutLong(p,d) - -#endif // #if !defined(MSVC16) && !defined(THUNK32) && !defined(DIRECTX) - -//--------------------------------------------------------------------------- -// internal HAL stuff not meant for external use -//--------------------------------------------------------------------------- -#if defined(BUILD_HAL) || defined(BUILD_DIAGS) - -// GMT: Init code SET/GET always go thru subroutines (allows for P6 fencing) -#define IGET(A) fxHalRead32((FxU32 *) &(A)) -#define ISET(A,D) fxHalWrite32((FxU32 *) &(A), D) - - - -// this is the FAKE address where the hardware lives -// we use a large address so attempts to write to it get an access violation -// and it has 28 zero bits so that we can easily figure out the board number -// and the offset into the board -#define SST_BAD_ADDRESS(a) (((FxU32)a&0xF0000000)==0 || ((FxU32)a&0x0C000000)!=0) -#define SST_FAKE_ADDRESS_MAKE(boardNum) (SstRegs *)(0x200000|((boardNum+1)<<28)) -#define SST_FAKE_ADDRESS_GET_BOARD(a) ((((FxU32)a>>28)&0xF)-1) -#define SST_FAKE_ADDRESS_GET_OFFSET(a) ((FxU32)a&0x0FFFFFFF) -#define SST_FAKE_ADDRESS_GET_BASE_OFFSET(a) ((FxU32)a&0x01FFFFFF) -#define SST_FAKE_ADDRESS_GET_BASE(a) ( ((FxU32)a&BIT(25))>>25 ) - -#define SST_BAD_PORT(a) (((FxU32)a&0xF000)==0) -#define SST_FAKE_PORT_MAKE(boardNum) (FxU16)((boardNum+1)<<12) -#define SST_FAKE_PORT_GET_BOARD(a) ((((FxU16)a>>12)&0xF)-1) -#define SST_FAKE_PORT_GET_OFFSET(a) ((FxU16)a&0x0FFF) - -extern HalInfo halInfo; - -// internal HAL routines -FxU32 fxHalRead32(FxU32 *addr); -void fxHalWrite32(FxU32 *addr, FxU32 data); - -void fxHalResetBoardInfo( FxDeviceInfo *info ); -FxBool fxHalFillDeviceInfo( SstRegs *sst ); -// FxBool fxHalGetFbiInfo( SstRegs *sst, FxDeviceInfo *info ); -// FxBool fxHalGetTmuInfo( SstRegs *sst, FxDeviceInfo *info ); -FxBool fxHalVaddrToBoardNumber( SstRegs *sst, FxU32 *boardNumber ); - -// GUI interface -FX_ENTRY void FX_CALL guiNewViewWindow(FxU32 boardNumber, const char *name); -void guiReadMessageQueue(void); -FxBool guiOpen( FxU32 boardNumber ); -void guiShutdown( SstRegs *sst ); - -#endif /* BUILD_HAL */ - -#endif /* !__FXHAL_H__ */ diff --git a/glide2x/h3/incsrc/fxvid.h b/glide2x/h3/incsrc/fxvid.h deleted file mode 100644 index 3750091..0000000 --- a/glide2x/h3/incsrc/fxvid.h +++ /dev/null @@ -1,52 +0,0 @@ -#ifndef __FX_VID_H__ -#define __FX_VID_H__ - -/* -** 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$ -*/ - -/* Get old resolution/refresh definitions */ -#include - -/* XXX GMT: some of these are still machine dependent */ -typedef struct { - FxU32 hSyncOn; - FxU32 hSyncOff; - FxU32 vSyncOn; - FxU32 vSyncOff; - FxU32 hBackPorch; - FxU32 vBackPorch; - FxU32 xDimension; - FxU32 yDimension; - FxU32 memOffset; - FxU32 memFifoEntries_1MB; - FxU32 memFifoEntries_2MB; - FxU32 memFifoEntries_4MB; - FxU32 tilesInX_Over2; - FxU32 vFifoThreshold; - FxBool video16BPPIsOK; - FxBool video24BPPIsOK; - float clkFreq16bpp; - float clkFreq24bpp; -} FxVideoTimingInfo; - -#endif /* __FX_VID_H__ */ diff --git a/glide2x/h3/incsrc/gdebug.h b/glide2x/h3/incsrc/gdebug.h deleted file mode 100644 index 5bb405b..0000000 --- a/glide2x/h3/incsrc/gdebug.h +++ /dev/null @@ -1,144 +0,0 @@ -/*-*-c++-*-*/ -#ifndef __GDEBUG_H__ -#define __GDEBUG_H__ - -/* -** 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 - -#if defined(FX_DLL_ENABLE) -#define FX_DLL_DEFINITION - -#endif -#include -#include - -#define GDBG_MAX_LEVELS 512 - -#ifndef GETENV -#ifndef __linux__ -#define GETENV(a) getenv(a) -#else -#define GETENV hwcGetenv -#endif -#endif - -// if debug info turned on then GDBG_INFO does something -#ifdef GDBG_INFO_ON - -// Standard C provides no clean way to do this, but the GNU C tools do.. -#ifdef __GNUC__ - -#define GDBG_INFO(level, format, args...) \ - gdbg_info(level, format , ## args) -#define GDBG_INFO_MORE(level, format, args...) \ - gdbg_info_more(level, format , ## args) -#define GDBG_PRINTF(format, args...) \ - gdbg_printf(format , ## args) - -#else - -#define GDBG_INFO gdbg_info -#define GDBG_INFO_MORE gdbg_info_more -#define GDBG_PRINTF gdbg_printf - -#endif - -#define GDBG_ERROR_SET_CALLBACK gdbg_error_set_callback -#define GDBG_ERROR_CLEAR_CALLBACK gdbg_error_clear_callback - -#define GDBG_GET_DEBUGLEVEL gdbg_get_debuglevel -#define GDBG_SET_DEBUGLEVEL gdbg_set_debuglevel - -// otherwise GDBG_INFO does nothing -#else - -#if defined(__WATCOMC__) || defined(__WATCOM_CPLUSPLUS__) -/* Turn off the dead code warnings. Also changed the macro definitions - * to use an 'if' rather than the ternary operator because the - * type of the result sub-expressions must match. - * - * w111: Meaningless use of an expression - * w201: Unreachable code - * w302: Expression only useful for side-effects. - */ -#pragma disable_message (111, 201, 302) -#endif /* defined(__WATCOMC__) || defined(__WATCOM_CPLUSPLUS__) */ - -// Standard C provides no clean way to do this, but the GNU C tools do.. -#ifdef __GNUC__ - -#define GDBG_INFO(level, format, args...) -#define GDBG_INFO_MORE(level, format, args...) -#define GDBG_PRINTF(format, args...) - -#else - -#define GDBG_INFO 0 && (unsigned long) -#define GDBG_INFO_MORE 0 && (unsigned long) -#define GDBG_PRINTF 0 && (unsigned long) - -#define GDBG_ERROR_SET_CALLBACK 0 && (unsigned long) -#define GDBG_ERROR_CLEAR_CALLBACK 0 && (unsigned long) - -#endif - -#define GDBG_GET_DEBUGLEVEL(x) 0 -#define GDBG_SET_DEBUGLEVEL(a,b) - - -#endif - -#define GDBG_INIT gdbg_init -#define GDBG_SHUTDOWN gdbg_shutdown -#define GDBG_ERROR gdbg_error -#define GDBG_GET_ERRORS gdbg_get_errors -#define GDBG_SET_FILE gdbg_set_file - -FX_ENTRY void FX_CALL gdbg_init(void); -FX_ENTRY void FX_CALL gdbg_parse(const char *env); -FX_ENTRY void FX_CALL gdbg_shutdown(void); -FX_ENTRY void FX_CALL gdbg_vprintf(const char *format, va_list); -FX_ENTRY void FX_CALL gdbg_printf(const char *format, ...); -FX_ENTRY int FX_CALL gdbg_info(const int level, const char *format, ...); -FX_ENTRY int FX_CALL gdbg_info_more(const int level, const char *format, ...); -FX_ENTRY void FX_CALL gdbg_error(const char *name, const char *format, ...); -FX_ENTRY int FX_CALL gdbg_get_errors(void); -FX_ENTRY int FX_CALL gdbg_set_file(const char *name); -FX_ENTRY int FX_CALL gdbg_get_debuglevel(const int level); -FX_ENTRY void FX_CALL gdbg_set_debuglevel(const int level, const int value); - -// these routines allow for a library (like Glide) to get called back -typedef void (*GDBGErrorProc)(const char* const procName, - const char* const format, - va_list args); -FX_ENTRY int FX_CALL gdbg_error_set_callback(GDBGErrorProc p); -FX_ENTRY void FX_CALL gdbg_error_clear_callback(GDBGErrorProc p); - -// these routines allow for some GUI code to get called once in a while -// so that it can keep the UI alive by reading the message queue -typedef void (*GDBGKeepAliveProc)(int adjust); -FX_ENTRY void FX_CALL gdbg_set_keepalive(GDBGKeepAliveProc p); - -#endif /* !__GDEBUG_H__ */ diff --git a/glide2x/h3/incsrc/h3.h b/glide2x/h3/incsrc/h3.h deleted file mode 100644 index abc73cb..0000000 --- a/glide2x/h3/incsrc/h3.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef __H3_H__ -#define __H3_H__ - -/* -** 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 <3dfx.h> -#include -#include -#include -#include -#include -#include -#include - -#endif /* !__H3_H__ */ diff --git a/glide2x/h3/incsrc/h3cinit.h b/glide2x/h3/incsrc/h3cinit.h deleted file mode 100644 index a078997..0000000 --- a/glide2x/h3/incsrc/h3cinit.h +++ /dev/null @@ -1,153 +0,0 @@ -/* -*-c++-*- */ -/* $Header$ */ -/* -** 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 -** -** File name: h3cinit.h -** -** Description: Macros & function definitions for Banshee/Avenger. -** -** $Revision$ -** $Date$ -** -** $History: h3cinit.h $ -** -** ***************** Version 1 ***************** -** User: Sapphire Date: 2/17/99 Time: 8:26p -** Created in $/Releases/Voodoo3/MT2/3Dfx/devel/H3/INCSRC -** -** ***************** Version 21 ***************** -** User: Michael Date: 1/05/99 Time: 8:45a -** Updated in $/devel/h3/Win95/dx/minivdd -** Implement the 3Dfx/STB unified header. -** -*/ - - -#ifndef __H3CINIT_H__ -#define __H3CINIT_H__ - -#include <3dfx.h> - -#define H3_GRXCLK_SPEED 100 -#define H4_GRXCLK_SPEED 143 -#define H4_OEM_GRXCLK_SPEED 141 -#define H4_BRINGUP_GRXCLK_SPEED 100 - -#ifdef H4 -#define DEFAULT_GRXCLK_SPEED H4_BRINGUP_GRXCLK_SPEED -#else -#define DEFAULT_GRXCLK_SPEED H3_GRXCLK_SPEED -#endif - -FxU32 // return # of MB of memory -h3InitGetMemSize(FxU32 regBase);// init register base - -FxU32 // return # of MB of memory -h3InitSgram(FxU32 regBase, // init iegister base - FxU32 sgramMode, - FxU32 sgramMask, - FxU32 sgramColor, - char *vendorName); // NULL or name of SGRAM vendor - -void -h3InitPlls(FxU32 regBase, // init iegister base - FxU32 grxSpeedInMHz, // desired GRX clock frequency (MHz) - FxU32 memSpeedInMHz); // desired MEM clock frequency (MHz) - -void -h4InitPlls(FxU32 regBase, // init register base - FxU32 deviceID, // H4 or H4_OEM - FxU32 grxSpeedInMHz); // desired clock frequency (MHz) - -void -h3InitVga( - FxU32 regBase, // memory base address - FxU32 legacyDecode); // 1=enable VGA decode, 0=disable - -void -h3InitVideoProc( - FxU32 regBase, // memory base address - FxU32 vidProcCfg); // vidProcCfg register control bits - -FxBool -h3InitSetVideoMode( - FxU32 regBase, // memory base address - FxU32 xRes, // x resolution - FxU32 yRes, // y resolution - FxU32 refresh, // refresh freq -#if defined(H3VDD) - FxU32 loadClut, // really a bool, should we load the lookup table - FxU32 scanlinedouble); // set scanline double bit and double y? -#else - FxU32 loadClut) ; // initialize clut entries? -#endif - -void -h3InitVideoDesktopSurface( - FxU32 regBase, - FxU32 enable, // 1=enable desktop surface (DS), 1=disable - FxU32 tiled, // 0=DS linear, 1=tiled - FxU32 pixFmt, // pixel format of DS - FxU32 clutBypass, // bypass clut for DS? - FxU32 clutSelect, // 0=lower 256 CLUT entries, 1=upper 256 - FxU32 startAddress, // board address of beginning of DS - FxU32 stride); // distance between scanlines of the DS, in - // units of bytes for linear DS's and tiles for - // tiled DS's - -void -h3InitVideoOverlaySurface( - FxU32 regBase, - FxU32 enable, // 1=enable Overlay surface (OS), 1=disable - FxU32 stereo, // 1=enable OS stereo, 0=disable - FxU32 horizScaling, // 1=enable horizontal scaling, 0=disable - FxU32 dudx, // horizontal scale factor (ignored if not - // scaling) - FxU32 verticalScaling, // 1=enable vertical scaling, 0=disable - FxU32 dvdy, // vertical scale factor (ignored if not - // scaling) - FxU32 filterMode, // duh - FxU32 tiled, // 0=OS linear, 1=tiled - FxU32 pixFmt, // pixel format of OS - FxU32 clutBypass, // bypass clut for OS? - FxU32 clutSelect, // 0=lower 256 CLUT entries, 1=upper 256 - FxU32 startAddress, // board address of beginning of OS - FxU32 stride); // distance between scanlines of the OS, in - // units of bytes for linear OS's and tiles for - // tiled OS's - -#ifndef H3VDD -void -h3InitMeasureSiProcess( - FxU32 regBase); // init register base -#endif // #ifndef H3VDD - -void -h3InitBlockWrite( - FxU32 regBase, - FxU32 enable, // 1=enable block writes, 0=disable - FxU32 threshhold); // block write threshhold - -void -h3InitResetAll( - FxU32 regBase); // init register base - -#endif /* __H3CINIT_H__ */ - diff --git a/glide2x/h3/incsrc/h3defs.h b/glide2x/h3/incsrc/h3defs.h deleted file mode 100644 index af1f393..0000000 --- a/glide2x/h3/incsrc/h3defs.h +++ /dev/null @@ -1,1346 +0,0 @@ -#ifndef __H3DEFS_H__ -#define __H3DEFS_H__ - -/* -** 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$ -*/ - -#if defined(H4) -#define MAX_NUM_TMUS 2 -#else -#define MAX_NUM_TMUS 1 -#endif - -// SST commands -#define SST_NOPCMD 1 -#define SST_TRIANGLECMD 2 -#define SST_FASTFILLCMD 3 -#define SST_SWAPBUFCMD 4 -#define SST_SBEGINTRICMD 5 -#define SST_SDRAWTRICMD 6 -#define SST_USERINTRCMD 7 - -// this crazy macro fixes the binary point within a floating point -// number so that it has 'fracbits' to the right of the binary point -// it also adds a '1' bit to the MSB so that slightly negative numbers -// end up looking like twos complement numbers (they carry out from the '1') -#define FLOAT_FIX(f,fracbits) ((f)+(float)(3L<<(22-(fracbits)))) - -#define SST_FLOAT(f,scale,shift) (unsigned long)((f)*((scale)*(float)(1L<= 0; -1 if < 0) -#define ISIGN(x) (((x) | 0x40000000L) >> 30) -#define FSIGN(f) ISIGN(*(long *)&f) - -#define BIT(n) (1UL<<(n)) -#define SST_MASK(n) (0xFFFFFFFFL >> (32-(n))) -#define SST_MASK64(n) FX_MASK64(n) - -//----------------- SST binary point locations --------------- -#define SST_LOD_SIZE 6 -#define SST_LOD_FRACBITS 2 -#define SST_XY_SIZE 16 -#define SST_XY_INTBITS 12 -#define SST_XY_FRACBITS 4 -#define SST_RGBA_SIZE 24 -#define SST_RGBA_INTBITS 8 -#define SST_RGBA_FRACBITS 12 -#define SST_Z_SIZE 32 -#define SST_Z_INTBITS 16 -#define SST_Z_FRACBITS 12 -// NOTE: below are ONLY for the fixed point registers -#define SST_ST_SIZE 32 -#define SST_ST_INTBITS 14 -#define SST_ST_FRACBITS 18 -#define SST_W_SIZE 32 -#define SST_W_INTBITS 2 -#define SST_W_FRACBITS 30 - -//----------------- SST status bits --------------------------- -#define SST_FIFOLEVEL 0x3F -#define SST_PCIFIFO_FREE 0x1F -#define SST_PCIFIFO_BUSY BIT(5) -#define SST_VRETRACE BIT(6) -#define SST_FBI_BUSY BIT(7) -#define SST_TMU_BUSY BIT(8) -#define SST_TREX_BUSY SST_TMU_BUSY -#define SST_BUSY BIT(9) -#define SST_GUI_BUSY BIT(10) -#define SST_CMD0_BUSY BIT(11) -#define SST_CMD1_BUSY BIT(12) -#define SST_SWAPBUFPENDING_SHIFT 28 -#define SST_SWAPBUFPENDING (0x7L<= SST_IO_OFFSET && (a) < SST_CMDAGP_OFFSET ) -#define SST_IS_CMDAGP_ADDR(a) ( (a) >= SST_CMDAGP_OFFSET && (a) < SST_2D_OFFSET ) -#define SST_IS_2D_ADDR(a) ( (a) >= SST_2D_OFFSET && (a) < SST_3D_OFFSET ) -#define SST_IS_3D_ADDR(a) ( (a) >= SST_3D_OFFSET && (a) < SST_3D_ALT_OFFSET ) -#define SST_IS_3D_ALT_ADDR(a) ( (a) >= SST_3D_ALT_OFFSET && (a) < SST_TEX_OFFSET ) -#ifdef H4 -#define SST_IS_TEX_ADDR(a) ( (a) >= SST_TEX0_OFFSET && (a) < SST_RESERVED_OFFSET ) -#define SST_IS_TEX0_ADDR(a) ( (a) >= SST_TEX0_OFFSET && (a) < SST_TEX1_OFFSET ) -#define SST_IS_TEX1_ADDR(a) ( (a) >= SST_TEX1_OFFSET && (a) < SST_RESERVED_OFFSET ) -#else -#define SST_IS_TEX_ADDR(a) ( (a) >= SST_TEX_OFFSET && (a) < SST_RESERVED_OFFSET ) -#endif -#define SST_IS_RESERVED_ADDR(a) ( (a) >= SST_RESERVED_OFFSET && (a) < SST_YUV_OFFSET ) -#define SST_IS_YUV_ADDR(a) ( (a) >= SST_YUV_OFFSET && (a) < SST_LFB_OFFSET ) -#define SST_IS_LFB_ADDR(a) ( (a) >= SST_LFB_OFFSET && (a) < SST_RAW_LFB_OFFSET ) -#define SST_IS_RAW_LFB_ADDR(a) ( (a) >= SST_RAW_LFB_OFFSET && (a) < SST_MAX_LEGAL_OFFSET ) - -#define SST_IS_REGISTER_ADDR(a) ( (a) >= SST_IO_OFFSET && (a) < SST_TEX_OFFSET ) - -#define SST_BASE_ADDRESS(sst) ((FxI32)(sst)-SST_3D_OFFSET) -#define SST_IO_ADDRESS(sst) (SST_IO_OFFSET+SST_BASE_ADDRESS(sst)) -#define SST_CMDAGP_ADDRESS(sst) (SST_CMDAGP_OFFSET+SST_BASE_ADDRESS(sst)) -#define SST_GUI_ADDRESS(sst) (SST_2D_OFFSET+SST_BASE_ADDRESS(sst)) -#ifdef H4 -#define SST_TEX_ADDRESS(sst) (SST_TEX0_OFFSET+SST_BASE_ADDRESS(sst)) -#define SST_TEX0_ADDRESS(sst) (SST_TEX0_OFFSET+SST_BASE_ADDRESS(sst)) -#define SST_TEX1_ADDRESS(sst) (SST_TEX1_OFFSET+SST_BASE_ADDRESS(sst)) -#else -#define SST_TEX_ADDRESS(sst) (SST_TEX_OFFSET+SST_BASE_ADDRESS(sst)) -#endif -#define SST_LFB_ADDRESS(sst) (SST_LFB_OFFSET+SST_BASE_ADDRESS(sst)) -#define SST_YUV_ADDRESS(sst) (SST_YUV_OFFSET+SST_BASE_ADDRESS(sst)) -#define SST_PORT_ADDRESS(sst) (SST_FAKE_PORT_MAKE(SST_FAKE_ADDRESS_GET_BOARD(sst))) - -#define SST_IS_MOVECMD(iaddr) (iaddr >= (SST_CMDAGP_OFFSET + AGPREQSIZE) && iaddr <= (SST_CMDAGP_OFFSET + MOVECMD)) - - - -// SET macros for FBI -#define SET_FBI(d,s) SET (*(&(d)+0x100),s) -#define SET_FBIF(d,s) SETF(*(&(d)+0x100),s) - -// SET macros for TMU0 -#define SET_0(d,s) SET (*(&(d)+0x200),s) -#define SET_0F(d,s) SETF(*(&(d)+0x200),s) - -// SET macros for FBI+TMU0 -#define SET_FBI_0(d,s) SET (*(&(d)+0x300),s) -#define SET_FBI_0F(d,s) SETF(*(&(d)+0x300),s) - -// SET macros for TMU1 -#define SET_1(d,s) SET (*(&(d)+0x400),s) -#define SET_1F(d,s) SETF(*(&(d)+0x400),s) - -// SET macros for FBI+TMU1 -#define SET_FBI_1(d,s) SET (*(&(d)+0x500),s) -#define SET_FBI_1F(d,s) SETF(*(&(d)+0x500),s) - -#endif /* !__H3DEFS_H__ */ - diff --git a/glide2x/h3/incsrc/h3gdefs.h b/glide2x/h3/incsrc/h3gdefs.h deleted file mode 100644 index 44c2121..0000000 --- a/glide2x/h3/incsrc/h3gdefs.h +++ /dev/null @@ -1,307 +0,0 @@ -#ifndef __H3GDEFS_H__ -#define __H3GDEFS_H__ - -/* -** 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$ -*/ - -// STB Begin Changes -// STB-SR 1/13/98 Adding code for bj -#ifdef _H2INC -#include "cmddefs.h" -#endif - -#ifndef _H2INC -// STB End Changes - -// compute 2D base from 3D base -#define SSTG_CHIP(sst) ((SstGRegs *)SST_GUI_ADDRESS(sst)) - -// STB Begin Changes -#endif -// STB End Changes - - -#define SSTG_XY_SIZE 13 - -//----------------- SSTG command bits --------------------------- -#define SSTG_COMMAND_SHIFT 0 -#define SSTG_COMMAND (0xF<>4)&0xF) == (rop&0xF) - -// It's so annoying to have to put that << in real code, I'm shifting -// the rops here, damnit -#define SSTG_ROP_SRCCOPY (0xccUL << SSTG_ROP0_SHIFT) - -//----------------------- CMDFIFO Section --------------------------- -//----------------------- CMDFIFO Section --------------------------- -//----------------------- CMDFIFO Section --------------------------- - -// CVG/H3 abstraction -#define SSTC_IS_EITHER_CMDFIFO_ENABLED(sstc) \ - (((sstc)->cmdFifo0.baseSize & SST_EN_CMDFIFO) || ((sstc)->cmdFifo1.baseSize & SST_EN_CMDFIFO)) - -//----------------- SST cmdFifo*.baseSize bits --------------------------- -#define SST_CMDFIFO_SIZE 0xFF -#define SST_EN_CMDFIFO BIT(8) -#define SST_CMDFIFO_AGP BIT(9) -#define SST_CMDFIFO_DISABLE_HOLES BIT(10) - -// SST COMMAND PACKET defines -#define SSTCP_PKT_SIZE 3 -#define SSTCP_PKT SST_MASK(SSTCP_PKT_SIZE) -#define SSTCP_PKT0 0 -#define SSTCP_PKT1 1 -#define SSTCP_PKT2 2 -#define SSTCP_PKT3 3 -#define SSTCP_PKT4 4 -#define SSTCP_PKT5 5 -#define SSTCP_PKT6 6 -#define SSTCP_PKT7 7 - -#define SSTCP_BOGUS_WORDS_SHIFT 29 -#define SSTCP_BOGUS_WORDS (7 << SSTCP_BOGUS_WORDS_SHIFT) - -// packet 0 defines -#define SSTCP_PKT0_FUNC_SHIFT 3 -#define SSTCP_PKT0_FUNC (7<>2) & 0x7FF) << SSTCP_REGBASE_SHIFT ) -#else -#define SSTCP_REGBASE ((0x3FF)<>2) & 0x3FF) << SSTCP_REGBASE_SHIFT ) -#endif -#define SSTCP_PKT1_2D BIT(14) -#define SSTCP_INC BIT(15) -#define SSTCP_PKT1_NWORDS_SHIFT 16 -#define SSTCP_PKT1_NWORDS (0xFFFFUL< -#include -#include - -#define HWC_DEFAULT_FBI_REV 1 -#define HWC_DEFAULT_FBI_MEM 4 - -#define DEV_PRIVATE(hwc) ((FxDeviceInfo *)hwc->devInfo) - -#define HWC_BASE_ADDRESS(hwc) ((FxI32)(hwc->virtAddr[0])) -#define HWC_IO_ADDRESS(hwc) (SST_IO_OFFSET+HWC_BASE_ADDRESS(hwc)) -#define HWC_CMDAGP_ADDRESS(hwc) (SST_CMDAGP_OFFSET+HWC_BASE_ADDRESS(hwc)) -#define HWC_GUI_ADDRESS(hwc) (SST_2D_OFFSET+HWC_BASE_ADDRESS(hwc)) -#define HWC_3D_ADDRESS(hwc) (SST_2D_OFFSET+HWC_BASE_ADDRESS(hwc)) -#define HWC_TEX_ADDRESS(hwc) (SST_TEX_OFFSET+HWC_BASE_ADDRESS(hwc)) -#define HWC_LFB_ADDRESS(hwc) (SST_LFB_OFFSET+HWC_BASE_ADDRESS(hwc)) -#define HWC_YUV_ADDRESS(hwc) (SST_YUV_OFFSET+HWC_BASE_ADDRESS(hwc)) -#define HWC_PORT_ADDRESS(hwc) ((FxI32)(hwc->virtPort)) - -//----------------- useful addressing macros ----------------------- -// return pointer to SST at specified WRAP, CHIP, or TREX -#define HWC_WRAP(hwc,n) ((SstRegs *)((n)*0x4000+HWC_3D_ADDRESS(hwc))) -#define HWC_CHIP(hwc,n) ((SstRegs *)((n)*0x400+HWC_3D_ADDRESS(hwc))) -#define HWC_TMU(hwc,n) ((SstRegs *)((0x800<<(n))+HWC_3D_ADDRESS(hwc))) -#define HWC_TREX(hwc,n) HWC_TMU(hwc,n) - -#define HWC_IO_UNIT(hwc) ((SstIORegs *)HWC_IO_ADDRESS(hwc)) -#define HWC_CMDAGP_UNIT(hwc) ((SstCRegs *)HWC_CMDAGP_ADDRESS(hwc)) -#define HWC_GUI_UNIT(hwc) ((SstGRegs *)HWC_GUI_ADDRESS(hwc)) -#define HWC_3D_UNIT(hwc) ((SstRegs *)HWC_3D_ADDRESS(hwc)) - - -#define SST_DEVICE_ID_H3 3 - -#define MBYTE(n) (((FxU32)(n))<<20) -#define DEAD 0xDEAD - -// Maximum number of boards and TMUs supported -#define HAL_MAX_BOARDS 4 - -#define SST_FAKE_ADDRESS_GET_OFFSET(a) ((FxU32)a&0x0FFFFFFF) - -#define SST_FAKE_PORT_GET_OFFSET(a) ((FxU16)a&0x0FFF) - -typedef struct { - int csim; - int hsim; - int hw; - FxU32 boardsFound; // number of boards found - FxDeviceInfo boardInfo[HAL_MAX_BOARDS]; - - int pollLimit; // number of pixels to poll msg Q after - int pollCount; // current pixel counter - int video; // video output enabled - FxU32 csimLastRead; -} HalInfo; - -FX_ENTRY HalInfo * FX_CALL fxHalInit(FxU32 flags); - -FX_ENTRY FxBool FX_CALL fxHalInitRegisters(SstRegs *sst); - -FxBool guiOpen( FxU32 boardNumber ); - -FX_ENTRY FxU32 * FX_CALL agpPhysToVirt( FxU32 physAddrHi, FxU32 physAddrLo ); - -extern HalInfo halInfo; - -FxBool h3HwcMapBoard( HwcContext *hwc); - -FX_ENTRY SstRegs * FX_CALL fxHalMapBoard(FxU32 boardNum); - -FxBool h3HwcUnmapBoard( HwcContext *hwc); - -FxBool h3HwcShutdownBoard( HwcContext *hwc); - -FxBool h3HwcInitRegisters( HwcContext *hwc ); - -FxBool h3HwcInitRenderingRegisters( HwcContext *hwc); - -FxBool h3HwcInitGuiRegisters( HwcContext *hwc); - -FxBool h3HwcIdleNoNop( HwcContext *hwc); - -FxBool h3HwcInitVideo( HwcContext *hwc, FxU32 resolution, - FxU32 refresh, void *vti); - -FxBool h3HwcVideoEnable( HwcContext *hwc, FxBool enable ); - -FxBool h3HwcIdle( HwcContext *hwc ); - -FxBool h3HwcVsync( HwcContext *hwc); - -FxBool h3HwcVsyncNot( HwcContext *hwc); - -FxBool h3HwcInitCmdFifo( HwcContext *hwc, int which, FxU32 fifoStart, - FxU32 size, FxBool disableHoles, FxBool agpEnable); - -FxBool h3HwcFillDeviceInfo( HwcContext *hwc); - -FxBool h3HwcInitGamma( HwcContext *hwc, FxFloat gamma ); - -FxBool h3HwcInitGammaRGB( HwcContext *hwc, FxFloat r, FxFloat g, FxFloat b); - -void h3HwcStore8( HwcContext *hwc, volatile void *addr, FxU8 data ); - -void h3HwcStore16( HwcContext *hwc, volatile void *addr, FxU16 data ); - -void h3HwcStore32( HwcContext *hwc, volatile void *addr, FxU32 data ); - -FxU8 h3HwcLoad8( HwcContext *hwc, volatile void *addr ); - -FxU16 h3HwcLoad16( HwcContext *hwc, volatile void *addr ); - -FxU32 h3HwcLoad32( HwcContext *hwc, volatile void *addr ); - -FxBool h3HwcInitBuffer(HwcBuffer *this); - -FxBool h3HwcReadPixel(HwcBuffer *this, FxU32 which, int x, int y, HwcPixel *); - -FxBool h3HwcWritePixel(HwcBuffer *this, FxU32 which, int x, int y, HwcPixel *); - -FxBool h3HwcSetBuffer(HwcBuffer *this, HwcBufferType type); - -#endif /* !__H3HWC_H__ */ diff --git a/glide2x/h3/incsrc/h3info.h b/glide2x/h3/incsrc/h3info.h deleted file mode 100644 index 548804c..0000000 --- a/glide2x/h3/incsrc/h3info.h +++ /dev/null @@ -1,95 +0,0 @@ -#ifndef __H3INFO_H__ -#define __H3INFO_H__ - -/* -** 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$ -*/ - -#if defined(__unix__) && ! defined(__H3REGS_H__) -// basic data types -#define FxU8 unsigned char -#define FxU16 unsigned short -#define FxU32 unsigned long -#define FxBool int -// defn of registers not reqd, treat (SstRegs *) as (void *) -typedef void SstRegs; -#endif - -#if defined(H4) -#define MAX_NUM_TMUS 2 -#else -#define MAX_NUM_TMUS 1 -#endif - -/* -** H3 Device Information Structure -** -*/ - -#define MAX_NUM_TMUS_SUPPORTED 4 -#if MAX_NUM_TMUS > MAX_NUM_TMUS_SUPPORTED -# error "need to increase MAX_NUM_TMUS_SUPPORTED" -#endif - -typedef struct { // H3 Device Information Structure - FxU32 size; // size of this structure - SstRegs *virtAddr[2]; // virtual memory base address - FxU32 physAddr[2]; // physical memory base address - FxU16 virtPort; // virtual i/o port base address - FxU16 physPort; // physical i/o port base address - FxU32 deviceNumber; // PCI device number - FxU32 vendorID; // PCI vendor ID - FxU32 deviceID; // PCI device ID - FxU32 fbiRevision; // FBI revision number - FxU32 fbiConfig; // FBI strapping pins - FxU32 fbiMemType; // FBI memory type (poweron strapping bits) - FxU32 fbiVideoWidth; // FBI video display X-resolution - FxU32 fbiVideoHeight; // FBI video display Y-resolution - FxU32 fbiVideoRefresh; // FBI video refresh rate - FxU32 fbiMemoryFifoEn; // FBI memory fifo enabled - FxU32 tmuRevision; // TMU revision number (for all TMUs) - FxU32 numberTmus; // number of TMUs installed - FxU32 tmuConfig; // TMU configuration bits - FxU32 fbiMemSize; // FBI frame buffer memory (in MBytes) - FxU32 tmuMemSize[MAX_NUM_TMUS_SUPPORTED]; // TMU texture memory (in MBytes) -#ifndef CVG - FxU8 *agpMem; // AGP true base address - FxU8 *agpVirtAddr; // AGP virtual base address - FxU32 agpSizeInBytes; // AGP memory size (in Bytes) - FxU32 agpBaseAddrH; // upper 4 bits of AGP physical base address - FxU32 agpBaseAddrL; // lower 32 bits of AGP physical base address - FxU32 agpRqDepth; // AGP request depth -#endif - - // These cannot be read from the hardware, so we shadow them here - FxU32 tmuInit0[MAX_NUM_TMUS_SUPPORTED]; - FxU32 tmuInit1[MAX_NUM_TMUS_SUPPORTED]; - - // Misc - FxU32 initGrxClkDone; - - // CSIM specific - SstRegs *sstCSIM; // pointer to CSIM structure - SstRegs *sstHW; // pointer to HW -} FxDeviceInfo; - -#endif /* !__H3INFO_H__ */ diff --git a/glide2x/h3/incsrc/h3regs.h b/glide2x/h3/incsrc/h3regs.h deleted file mode 100644 index e3b4233..0000000 --- a/glide2x/h3/incsrc/h3regs.h +++ /dev/null @@ -1,386 +0,0 @@ -#ifndef __H3REGS_H__ -#define __H3REGS_H__ - -/* -*-c++-*- */ -/* $Header$ */ -/* -** 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$ -** -** $History: h3regs.h $ -** -** ***************** Version 1 ***************** -** User: Sapphire Date: 2/17/99 Time: 8:26p -** Created in $/Releases/Voodoo3/MT2/3Dfx/devel/H3/INCSRC -** -** ***************** Version 21 ***************** -** User: Stb_srogers Date: 2/09/99 Time: 9:55a -** Updated in $/devel/h3/win95/dx/inc -** -** ***************** Version 20 ***************** -** User: Michael Date: 9/08/98 Time: 4:16p -** Updated in $/devel/h3/Win95/dx/inc -** MarkL's fix for 2281. Modify members of "stats" structure from ints to -** longs. -*/ - -// STB Begin Changes -// STB-SR 1/13/98 Adding code for bj -#ifdef _H2INC -typedef unsigned long FxU32; -#endif -// STB End Changes - -//----------------- SST chip I/O layout ------------------------- -// I/O registers remapped into memory space -// Includes init, dac/pll, video, and VGA registers -typedef volatile struct sstioregs { - - // Init Registers - FxU32 status; // aliased status register - FxU32 pciInit0; - FxU32 sipMonitor; - FxU32 lfbMemoryConfig; - FxU32 miscInit0; - FxU32 miscInit1; - FxU32 dramInit0; - FxU32 dramInit1; - FxU32 agpInit; - FxU32 tmuGbeInit; - FxU32 vgaInit0; - FxU32 vgaInit1; - FxU32 dramCommand; - FxU32 dramData; - FxU32 reservedZ[2]; - - // PLL Registers - FxU32 pllCtrl0; - FxU32 pllCtrl1; - FxU32 pllCtrl2; - - // DAC Registers - FxU32 dacMode; - FxU32 dacAddr; - FxU32 dacData; - - // Video Registers I - FxU32 vidMaxRGBDelta; - FxU32 vidProcCfg; - FxU32 hwCurPatAddr; - FxU32 hwCurLoc; - FxU32 hwCurC0; - FxU32 hwCurC1; - FxU32 vidInFormat; - FxU32 vidInStatus; - FxU32 vidSerialParallelPort; - FxU32 vidInXDecimDeltas; - FxU32 vidInDecimInitErrs; - FxU32 vidInYDecimDeltas; - FxU32 vidPixelBufThold; - FxU32 vidChromaMin; - FxU32 vidChromaMax; - FxU32 vidCurrentLine; - FxU32 vidScreenSize; - FxU32 vidOverlayStartCoords; - FxU32 vidOverlayEndScreenCoord; - FxU32 vidOverlayDudx; - FxU32 vidOverlayDudxOffsetSrcWidth; - FxU32 vidOverlayDvdy; - - // VGA Registers - FxU32 vgaRegister[12]; - - // Video Registers II - FxU32 vidOverlayDvdyOffset; - FxU32 vidDesktopStartAddr; - FxU32 vidDesktopOverlayStride; - FxU32 vidInAddr0; - FxU32 vidInAddr1; - FxU32 vidInAddr2; - FxU32 vidInStride; - FxU32 vidCurrOverlayStartAddr; -} SstIORegs; - -typedef volatile struct cmdfifo { - FxU32 baseAddrL; - FxU32 baseSize; - FxU32 bump; - FxU32 readPtrL; - FxU32 readPtrH; - FxU32 aMin; - FxU32 unusedA; - FxU32 aMax; - FxU32 unusedB; - FxU32 depth; - FxU32 holeCount; - FxU32 reserved; -} CmdFifo; - -//---------- SST chip AGP/CMD Transfer/Misc Register layout ------------------ -typedef volatile struct sstcregs { - // AGP - FxU32 agpReqSize; - FxU32 hostAddrLow; - FxU32 hostAddrHigh; - FxU32 graphicsAddr; - FxU32 graphicsStride; - FxU32 moveCMD; - FxU32 reservedL[2]; - - // CMD FIFO 0,1 - CmdFifo cmdFifo0; - CmdFifo cmdFifo1; - - FxU32 cmdFifoThresh; - FxU32 cmdHoleInit; - FxU32 reservedO[6]; - FxU32 reservedP[8]; - FxU32 reservedQ[8]; - FxU32 reservedR[8]; - // misc - FxU32 yuvBaseAddr; - FxU32 yuvStride; - FxU32 reservedS[6]; - FxU32 crc1; - FxU32 reservedT[3]; - FxU32 crc2; -} SstCRegs; - -//----------------- SST chip 2D layout ------------------------- -typedef volatile struct sstgregs { // THE 2D CHIP - FxU32 status; // aliased status register - FxU32 unused0; - FxU32 clip0min; - FxU32 clip0max; - FxU32 dstBaseAddr; - FxU32 dstFormat; - FxU32 srcColorkeyMin; - FxU32 srcColorkeyMax; - FxU32 dstColorkeyMin; - FxU32 dstColorkeyMax; - FxU32 bresError0; - FxU32 bresError1; - FxU32 rop; - FxU32 srcBaseAddr; - FxU32 commandEx; - FxU32 lineStipple; - FxU32 lineStyle; - FxU32 pattern0alias; - FxU32 pattern1alias; - FxU32 clip1min; - FxU32 clip1max; - FxU32 srcFormat; - FxU32 srcSize; - FxU32 srcXY; - FxU32 colorBack; - FxU32 colorFore; - FxU32 dstSize; - FxU32 dstXY; - FxU32 command; - FxU32 reserved[3]; - FxU32 launch[32]; - FxU32 colorPattern[64]; -#if COLORTRANSLUT - FxU32 colorTransLut[256]; -#endif -} SstGRegs; - -// STB Begin changes -// STB-SR 1/13/99 Adding code for bj -#ifndef _H2INC -// STB End changes - -//----------------- SST chip 3D layout ------------------------- -// registers are in groups of 8 for easy decode -typedef struct vertex_Rec { - unsigned long x; // 12.4 format - unsigned long y; // 12.4 -} vtxRec; - -typedef volatile struct sstregs { // THE 3D CHIP - // EXTERNAL registers - FxU32 status; // chip status, Read Only - FxU32 intrCtrl; // interrupt control - vtxRec vA; // Vertex A,B,C - vtxRec vB; - vtxRec vC; - - long r; // 12.12 Parameters - long g; // 12.12 - long b; // 12.12 - long z; // 20.12 - long a; // 12.12 - long s; // 14.18 - long t; // 14.18 - long w; // 2.30 - - long drdx; // X Gradients - long dgdx; - long dbdx; - long dzdx; - long dadx; - long dsdx; - long dtdx; - long dwdx; - - long drdy; // Y Gradients - long dgdy; - long dbdy; - long dzdy; - long dady; - long dsdy; - long dtdy; - long dwdy; - - unsigned long triangleCMD; // execute a triangle command (float) - unsigned long reservedA; - vtxRec FvA; // floating point version - vtxRec FvB; - vtxRec FvC; - - long Fr; // floating point version - long Fg; - long Fb; - long Fz; - long Fa; - long Fs; - long Ft; - long Fw; - - long Fdrdx; - long Fdgdx; - long Fdbdx; - long Fdzdx; - long Fdadx; - long Fdsdx; - long Fdtdx; - long Fdwdx; - - long Fdrdy; - long Fdgdy; - long Fdbdy; - long Fdzdy; - long Fdady; - long Fdsdy; - long Fdtdy; - long Fdwdy; - - unsigned long FtriangleCMD; // execute a triangle command - unsigned long fbzColorPath; // color select and combine - unsigned long fogMode; // fog Mode - unsigned long alphaMode; // alpha Mode - unsigned long fbzMode; // framebuffer and Z mode - unsigned long lfbMode; // linear framebuffer Mode - unsigned long clipLeftRight; // (6)10(6)10 - unsigned long clipBottomTop; // (6)10(6)10 - - unsigned long nopCMD; // execute a nop command - unsigned long fastfillCMD; // execute a fast fill command - unsigned long swapbufferCMD;// execute a swapbuffer command - unsigned long fogColor; // (8)888 - unsigned long zaColor; // 8(8)16 - unsigned long chromaKey; // (8)888 - unsigned long chromaRange; - unsigned long userIntrCmd; - - unsigned long stipple; // 32 bits, MSB masks pixels - unsigned long c0; // 8.8.8.8 (ARGB) - unsigned long c1; // 8.8.8.8 (ARGB) - struct { // statistic gathering variables - unsigned long fbiPixelsIn; - unsigned long fbiChromaFail; - unsigned long fbiZfuncFail; - unsigned long fbiAfuncFail; - unsigned long fbiPixelsOut; - } stats; - - unsigned long fogTable[32]; // 64 entries, 2 per word, 2 bytes each - - unsigned long reservedB[3]; - - unsigned long colBufferAddr; - unsigned long colBufferStride; - unsigned long auxBufferAddr; - unsigned long auxBufferStride; - unsigned long reservedC; - - unsigned long clipLeftRight1; - unsigned long clipBottomTop1; - unsigned long reservedD[6]; // NOTE: used to store TMUprivate ptr - - - unsigned long reservedE[8]; - - unsigned long reservedF[3]; - unsigned long swapBufferPend; - unsigned long leftOverlayBuf; - unsigned long rightOverlayBuf; - unsigned long fbiSwapHistory; - unsigned long fbiTrianglesOut; // triangles out counter - - FxU32 sSetupMode; - FxU32 sVx; - FxU32 sVy; - FxU32 sARGB; - FxU32 sRed; - FxU32 sGreen; - FxU32 sBlue; - FxU32 sAlpha; - - FxU32 sVz; - FxU32 sOowfbi; - FxU32 sOow0; - FxU32 sSow0; - FxU32 sTow0; - FxU32 sOow1; - FxU32 sSow1; - FxU32 sTow1; - - FxU32 sDrawTriCMD; - FxU32 sBeginTriCMD; - unsigned long reservedG[6]; - - unsigned long reservedH[8]; - - unsigned long reservedI[8]; - - unsigned long textureMode; // texture Mode - unsigned long tLOD; // texture LOD settings - unsigned long tDetail; // texture detail settings - unsigned long texBaseAddr; // current texture base address - unsigned long texBaseAddr1; - unsigned long texBaseAddr2; - unsigned long texBaseAddr38; - unsigned long trexInit0; // hardware init bits - unsigned long trexInit1; // hardware init bits - - unsigned long nccTable0[12]; // NCC decode tables, bits are packed - unsigned long nccTable1[12]; // 4 words Y, 4 words I, 4 words Q - - unsigned long tChromaKeyMin; - unsigned long tChromaKeyMax; -} SstRegs; - -// STB Begin changes -#endif // #ifndef _H2INC -// STB End changes - -#endif /* !__H3REGS_H__ */ diff --git a/glide2x/h3/incsrc/makefile b/glide2x/h3/incsrc/makefile deleted file mode 100644 index 5eba28f..0000000 --- a/glide2x/h3/incsrc/makefile +++ /dev/null @@ -1,29 +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$ -# - -HEADERS=*.h - -INSTALL_DESTINATION=$(BUILD_ROOT)\h3 - -!include $(BUILD_ROOT_SWLIBS)/include/nmake/3dfx.mak - diff --git a/glide2x/h3/incsrc/makefile.linux b/glide2x/h3/incsrc/makefile.linux deleted file mode 100644 index 599b0d5..0000000 --- a/glide2x/h3/incsrc/makefile.linux +++ /dev/null @@ -1,29 +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$ -# - -HEADERS=*.h - -INSTALL_DESTINATION=$(BUILD_ROOT)/$(FX_GLIDE_HW) - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak - diff --git a/glide2x/h3/incsrc/sst1vid.h b/glide2x/h3/incsrc/sst1vid.h deleted file mode 100644 index 4032513..0000000 --- a/glide2x/h3/incsrc/sst1vid.h +++ /dev/null @@ -1,128 +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$ -** -** 2 3/02/99 8:13p Dow -** Added new resolutiions. -** -** 10 2/27/99 12:28p Dow -** new resolutions -** -** 6 2/13/99 1:56p Dow -** Added new resolution constants -** -** 5 7/24/98 1:38p Hohn - * - * 4 9/09/97 7:35p Sellers - * Added 400x300 resolution - * - * 3 8/24/97 9:31a Sellers - * moved new video timing to sst1vid.h - * redefined 1600x1280 to be 1600x1200 - * - * 2 6/05/97 11:14p Pgj - * - * 5 7/24/96 3:43p Sellers - * added 512x384 @ 60 Hz for arcade monitors - * added 512x256 @ 60 Hz for arcade monitors - * - * 4 7/18/96 10:58a Sellers - * fixed FT and TF clock delay values for lower frequencies with - * .5/.5 combos - * - * 3 6/18/96 6:54p Sellers - * added sst1InitShutdownSli() to fix Glide Splash screen problems with - * SLI - * - * 2 6/13/96 7:45p Sellers - * added "voodoo.ini" support - * added DirectX support - * misc cleanup - * - * 2 6/11/96 1:43p Sellers - * added support for 60, 75, 85, and 120 Hz refresh rates for "most" - * resolutions - * - * 1 5/08/96 5:43p Paik - * Video definitions -*/ -#ifndef __SST1VID_H__ -#define __SST1VID_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Video defines */ - -typedef FxI32 GrScreenRefresh_t; -#define GR_REFRESH_60Hz 0x0 -#define GR_REFRESH_70Hz 0x1 -#define GR_REFRESH_72Hz 0x2 -#define GR_REFRESH_75Hz 0x3 -#define GR_REFRESH_80Hz 0x4 -#define GR_REFRESH_90Hz 0x5 -#define GR_REFRESH_100Hz 0x6 -#define GR_REFRESH_85Hz 0x7 -#define GR_REFRESH_120Hz 0x8 -#define GR_REFRESH_NONE 0xff - -typedef FxI32 GrScreenResolution_t; -#define GR_RESOLUTION_320x200 0x0 -#define GR_RESOLUTION_320x240 0x1 -#define GR_RESOLUTION_400x256 0x2 -#define GR_RESOLUTION_512x384 0x3 -#define GR_RESOLUTION_640x200 0x4 -#define GR_RESOLUTION_640x350 0x5 -#define GR_RESOLUTION_640x400 0x6 -#define GR_RESOLUTION_640x480 0x7 -#define GR_RESOLUTION_800x600 0x8 -#define GR_RESOLUTION_960x720 0x9 -#define GR_RESOLUTION_856x480 0xa -#define GR_RESOLUTION_512x256 0xb -#define GR_RESOLUTION_1024x768 0xC -#define GR_RESOLUTION_1280x1024 0xD -#define GR_RESOLUTION_1600x1200 0xE -#define GR_RESOLUTION_400x300 0xF -#define GR_RESOLUTION_1152x864 0x10 -#define GR_RESOLUTION_1280x960 0x11 -#define GR_RESOLUTION_1600x1024 0x12 -#define GR_RESOLUTION_1792x1344 0x13 -#define GR_RESOLUTION_1856x1392 0x14 -#define GR_RESOLUTION_1920x1440 0x15 -#define GR_RESOLUTION_2048x1536 0x16 -#define GR_RESOLUTION_2048x2048 0x17 -#define GR_RESOLUTION_NONE 0xff - -#ifdef GR_RESOLUTION_MAX -#undef GR_RESOLUTION_MAX -#endif -#ifdef GR_RESOLUTION_MIN -#undef GR_RESOLUTION_MIN -#endif -#define GR_RESOLUTION_MIN GR_RESOLUTION_320x200 -#define GR_RESOLUTION_MAX GR_RESOLUTION_2048x2048 - -#ifdef __cplusplus -} -#endif - -#endif /* __SST1VID_H__ */ diff --git a/glide2x/h3/incsrc/vector.h b/glide2x/h3/incsrc/vector.h deleted file mode 100644 index b2079f5..0000000 --- a/glide2x/h3/incsrc/vector.h +++ /dev/null @@ -1,63 +0,0 @@ -#ifndef __VECTOR_H__ -#define __VECTOR_H__ - -/* -** 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 - -// Defines for different types of vector files -#define VECTORID_MAX 2 -#define VECTORID_CACHE 0 -#define VECTORID_DECOMPRESSOR 1 -#define VECTORID_CACHEm 1 << VECTORID_CACHE -#define VECTORID_DECOMPRESSORm 1 << VECTORID_DECOMPRESSOR - -extern void openVectorFiles(); -extern void closeVectorFiles( ); -extern void dumpVector( ); - - -typedef struct vectorFiles { - FILE * vectorHandles[VECTORID_MAX]; - void (* dumpVector)(); -} vectorFiles; - -// extern vectorFiles vectorf; - -typedef struct { - FxU32 data[2]; -} CBlock; - -typedef struct CacheOutput { - int u; - int v; - CBlock bank[ 4 ]; -} CacheOutput; - -typedef struct DecompOutput { - FxU32 Texel[4]; -} DecompOutput; - - -#endif diff --git a/glide2x/h3/incsrc/vxd.h b/glide2x/h3/incsrc/vxd.h deleted file mode 100644 index 02eedff..0000000 --- a/glide2x/h3/incsrc/vxd.h +++ /dev/null @@ -1,39 +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$ -*/ - -#ifndef _VXD_H_ -#define _VXD_H_ - -#if defined(KERNEL) && !defined(KERNEL_NT) -#define WANTVXDWRAPS -#define DEBUG -#include -#include -#include -#include -#pragma VxD_LOCKED_CODE_SEG -//#pragma VxD_LOCKED_DATA_SEG -#endif /* #ifdef KERNEL */ - -#endif /* #ifndef _VXD_H_ */ diff --git a/glide2x/h3/lib/makefile b/glide2x/h3/lib/makefile deleted file mode 100644 index 87862ca..0000000 --- a/glide2x/h3/lib/makefile +++ /dev/null @@ -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 = *.lib - -!include $(BUILD_ROOT_SWLIBS)\include\nmake\3dfx.mak diff --git a/glide2x/h3/lib/makefile.linux b/glide2x/h3/lib/makefile.linux deleted file mode 100644 index 728178d..0000000 --- a/glide2x/h3/lib/makefile.linux +++ /dev/null @@ -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 = $(wildcard *.a *.so) - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak diff --git a/glide2x/h3/libsrc/makefile b/glide2x/h3/libsrc/makefile deleted file mode 100644 index 67f7bfb..0000000 --- a/glide2x/h3/libsrc/makefile +++ /dev/null @@ -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$ -# - -INSTALL_DESTINATION=$(BUILD_ROOT)\h3 - -!include $(BUILD_ROOT_SWLIBS)\include\nmake\3dfx.mak - diff --git a/glide2x/h3/libsrc/makefile.linux b/glide2x/h3/libsrc/makefile.linux deleted file mode 100644 index cef34c9..0000000 --- a/glide2x/h3/libsrc/makefile.linux +++ /dev/null @@ -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$ -# - -INSTALL_DESTINATION=$(BUILD_ROOT)/$(FX_GLIDE_HW) - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak diff --git a/glide2x/h3/makefile b/glide2x/h3/makefile deleted file mode 100644 index d614fda..0000000 --- a/glide2x/h3/makefile +++ /dev/null @@ -1,38 +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 = h3 - - - -SUBDIRS = bin binsrc lib libsrc include incsrc minihwc - -!if ("$(FX_HW_PROJECTS)" == "") -FX_HW_PROJECTS = glide -!endif - -SUBDIRS = $(SUBDIRS) $(FX_HW_PROJECTS) - -!endif - -!include $(BUILD_ROOT_SWLIBS)/include/nmake/3dfx.mak diff --git a/glide2x/h3/makefile.linux b/glide2x/h3/makefile.linux deleted file mode 100644 index 863e3b6..0000000 --- a/glide2x/h3/makefile.linux +++ /dev/null @@ -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$ -# - -THISDIR = h3 - -# BUILD_ROOT_CHIP is used by 3dfx.mak to define the path to bat2sh.awk. -# This allows for more than one level of diag directory hierarchy. -export BUILD_ROOT_CHIP = $(BUILD_ROOT)/$(THISDIR) - -SUBDIRS = bin binsrc lib libsrc include incsrc minihwc - -ifeq ($(FX_HW_PROJECTS),) -FX_HW_PROJECTS = glide -endif - -SUBDIRS += $(FX_HW_PROJECTS) - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak - - diff --git a/glide2x/h3/minihwc/dos_mode.c b/glide2x/h3/minihwc/dos_mode.c deleted file mode 100644 index c7b7b51..0000000 --- a/glide2x/h3/minihwc/dos_mode.c +++ /dev/null @@ -1,113 +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 3/17/99 6:14p Dow -** Fixes Phantom Menace, OGL, and others. -** -** 4 10/08/98 10:14a Dow -** Fixes 512x384 sometimes -** -** 3 9/02/98 1:34p Peter -** watcom warnings -** -** 2 6/25/98 7:40p Dow -** Made it compile -** -*/ - -#include - -#include <3dfx.h> -#include -#include - -static FxU16 oldVidMode; - -typedef struct { - int xres; - int yres; - int mode; -} ResTableEntry; - -static ResTableEntry _table[] = { - { 512, 384, 0x188 }, - { 640, 480, 0x111 }, - { 800, 600, 0x114 }, - { 1024, 768, 0x117 }, - { 0, 0, 0 } -}; - -static unsigned long _tableSize = sizeof( _table ) / sizeof( ResTableEntry ); - -FxBool -setVideoMode( unsigned long dummy, int xres, int yres, int refresh, void *hmon ) -{ - union REGS r, rOut; - int i; - int mode; - - dummy = dummy; - - r.w.ax = 0x4f03; - int386(0x10, &r, &rOut); - - oldVidMode = rOut.w.bx; - - mode = 0; - for( i = 0; i < _tableSize; i++ ) { - if ( ( _table[i].xres == xres ) && - ( _table[i].yres == yres ) ) { - mode = _table[i].mode; - } - } - - if ( mode == 0 ) { - GDBG_INFO(80, "Setmode failed -- unimplemented resolution\n" ); - return FXFALSE; - } - - - r.w.ax = 0x4f02; - r.w.bx = mode; - - GDBG_INFO(80, "Setting mode 0x%x, 0x%x\n", r.w.ax, r.w.bx); - - /* Do VGA Magic */ - int386(0x10, &r, &rOut); - - /* XXXTACO!! - We should check the return value */ - - return FXTRUE; -} /* setVideoMode */ - -void -resetVideo( void ) -{ - union REGS r; - - memset(&r, 0, sizeof(r)); - - r.w.ax = 0x4f02; - r.w.bx = oldVidMode; - GDBG_INFO(80, "resetVideo(): Setting mode 0x%x, 0x%x\n", r.w.ax, r.w.bx); - int386( 0x10, &r, &r ); -} /* resetVideo */ diff --git a/glide2x/h3/minihwc/dxdrvr.c b/glide2x/h3/minihwc/dxdrvr.c deleted file mode 100644 index 598012b..0000000 --- a/glide2x/h3/minihwc/dxdrvr.c +++ /dev/null @@ -1,1024 +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 -** -** $Log$ -** -** 3 3/17/99 6:14p Dow -** Fixes Phantom Menace, OGL, and others. -** -** 43 6/24/98 11:05a Dow -** better error message -** -** 42 6/11/98 7:45p Jdt -** Win98/NT5 Multimon 1st Pass -** -** 41 6/04/98 6:52p Dow -** Resolutions to 1600x1200 -** -** 40 5/27/98 3:10p Dow -** DOS happiness -** -** 39 4/14/98 11:55a Dow -** -** 38 4/05/98 2:19p Dow -** DOS/WIN32 stepping on each others' feet -** -** 37 4/03/98 2:03p Dow -** DOS Glide modes -** -** 36 3/11/98 8:27p Dow -** WinGlide - * - * 33 11/06/97 9:51a Jdt - * Fixes window resize events to not crash/hang - * - * 32 10/01/97 3:21p Atai - * fix 819, DOS tests flicker on glide - * - * 31 9/08/97 12:05p Atai - * fixed resize problem in dxControl() - * - * 30 8/28/97 10:24a Odo - * moved debugging varaible - * - * 29 8/27/97 10:32a Dow - * added more debugging info - * - * 28 8/21/97 4:24p Dow - * Fixed @#$%! C++ Comments, Added Debugging info -** -** $Revision$ -** $Date$ -** -*/ - -/* 3Dfx Headers */ -#include <3dfx.h> -#include -#include - -#include -#define FX_DLL_DEFINIION -#include -#include - -#ifdef __DOS32__ -#include -#endif - -/* Local Headers */ -#include "minihwc.h" - -#define H3_BUF_MAGIC 0x666 - -FxBool tripleBuffering = 0; - -#ifdef GDBG_INFO_ON -static char *bufTypeNames[] = { - "HWC_BUFFER_FRONTBUFFER", - "HWC_BUFFER_BACKBUFFER", - "HWC_BUFFER_AUXBUFFER", - "HWC_BUFFER_DEPTHBUFFER", - "HWC_BUFFER_ALPHABUFFER", - "HWC_BUFFER_TRIPLEBUFFER", - "HWC_BUFFER_FIFOBUFFER", - "HWC_BUFFER_SCREENBUFFER", - "HWC_BUFFER_TEXTUREBUFFER" -}; -#endif - -#if defined( __WIN32__) && defined(HWC_ACCESS_DDRAW) -#define WIN32_LEAN_AND_MEAN -#include -#include - -#define NUM_BUFS 6 - -static HWND hWndApp = 0; -static FxU32 FifoOffset = 0; -static FxU32 Width = 0; -static FxU32 Height = 0; -static FxBool IsFullScreen = 0; -static hwcBufferDesc BufDesc[NUM_BUFS] = {0}; - -/* Direct Draw stuff */ -static LPDIRECTDRAWCLIPPER lpClipper = NULL; -static LPDIRECTDRAWSURFACE lpFront = NULL; -static LPDIRECTDRAWSURFACE lpBack = NULL; -static LPDIRECTDRAWSURFACE lpAux = NULL; -static LPDIRECTDRAWSURFACE lpTriple = NULL; -static LPDIRECTDRAW2 lpDD = NULL; -static LPDIRECTDRAW lpDD1 = NULL; - - - -FxBool -ErrorMessage(HWND hWnd, char *err) -{ - GDBG_INFO(0, "Error %s \n", err); -// MessageBox( hWnd, err, "ERROR", MB_OK ); - return FALSE; -} /* ErrorMessage */ - - - -/* - * Takes a DirectDraw Surface object (LPDIRECTDRAWSURFACE), looks up its - * description (DDSURFACEDESC), and returns a pointer to the surface and its - * stride value in pDesc. - */ -FxBool -_dxSurfaceToBufDesc(LPDIRECTDRAWSURFACE lpSurf, hwcBufferDesc *pDesc) -{ - DDSURFACEDESC ddsd; - - ddsd.dwSize = sizeof(ddsd); - if (IDirectDrawSurface2_Lock(lpSurf, NULL, &ddsd, DDLOCK_WAIT, NULL) - !=DD_OK) { - return ErrorMessage(hWndApp, "_dxSurfaceToBufDesc: DdrawSurface Lock failed\n"); - } - - /* pDesc->bufType should be filled in by caller */ - pDesc->bufOffset = (FxU32) (ddsd.lpSurface); /* virtual address. */ - pDesc->bufStride = (FxI32) (ddsd.lPitch); /* in bytes */ - pDesc->bufBPP = (FxI32) 16; - - IDirectDrawSurface2_Unlock(lpSurf, NULL); - return FXTRUE; -} /* _dxSurfaceToBufDesc */ - - - -/* - * Convert front, back and aux surfaces from DDraw to Glide bufDescriptors. - */ -FxBool -_dxDDrawToGlideDesc(hwcBufferDesc *pDesc) -{ - hwcBufferDesc *dFront = &pDesc[0]; - hwcBufferDesc *dBack = &pDesc[1]; - hwcBufferDesc *dAux = &pDesc[2]; - hwcBufferDesc *dFifo = &pDesc[3]; - hwcBufferDesc *dScreen = &pDesc[4]; - hwcBufferDesc *dTriple = &pDesc[5]; - - GDBG_INFO(80, "_dxDDrawToGlide entry\n"); - - /* Initialize all descriptors. */ - dScreen->bufMagic = H3_BUF_MAGIC; - dScreen->bufType = HWC_BUFFER_SCREENBUFFER; - dScreen->bufOffset = 0; - dScreen->bufStride = 0; - dScreen->bufBPP = 0; - - /* Get info about screen (primary display) */ - dScreen->bufType = HWC_BUFFER_SCREENBUFFER; - if (!_dxSurfaceToBufDesc( lpFront, dScreen)) - return ErrorMessage(hWndApp, "Couldn't get Screen Info"); - - *dFront = *dBack = *dAux = *dFifo = - *dTriple = - *dScreen; - - dFront->bufType = HWC_BUFFER_FRONTBUFFER; - - /* Get info about back buffer */ - dBack->bufType = HWC_BUFFER_BACKBUFFER; - if (!_dxSurfaceToBufDesc( lpBack, dBack)) - return ErrorMessage(hWndApp, "Couldn't get Backbuffer Info"); - - /* Get info about aux buffer */ - dAux->bufType = HWC_BUFFER_AUXBUFFER; - if (!_dxSurfaceToBufDesc( lpAux, dAux)) - return ErrorMessage(hWndApp, "Couldn't get AuxBuffer Info"); - - /* Get info about triple buffer */ - if (tripleBuffering) { - dTriple->bufType = HWC_BUFFER_TRIPLEBUFFER; - if (!_dxSurfaceToBufDesc( lpTriple, dTriple)) - return ErrorMessage(hWndApp, "Couldn't get triple buffer Info"); - } - - /* Get info about cmdFifo */ - dFifo->bufType = HWC_BUFFER_FIFOBUFFER; - dFifo->bufOffset = FifoOffset; - dFifo->bufStride = 65536 << 1; /* Fixme!!! what's this? */ - - /* Now convert buf addresses for draw buffers into video memory offsets */ - dFront->bufOffset -= dScreen->bufOffset; - dBack ->bufOffset -= dScreen->bufOffset; - dAux ->bufOffset -= dScreen->bufOffset; - if (tripleBuffering) - dTriple->bufOffset -= dScreen->bufOffset; - - GDBG_INFO(80, "_dxDDrawToGlideDesc: dFront->bufOffset = 0x%x\n", dFront->bufOffset); - GDBG_INFO(80, "_dxDDrawToGlideDesc: dBack->bufOffset = 0x%x\n", dBack->bufOffset); - GDBG_INFO(80, "_dxDDrawToGlideDesc: dAux->bufOffset = 0x%x\n", dAux->bufOffset); - GDBG_INFO(80, "_dxDDrawToGlideDesc: dFifo->bufOffset = 0x%x\n", dFifo->bufOffset); - if (tripleBuffering) - GDBG_INFO(80, "_dxDDrawToGlideDesc: dTriple->bufOffset = 0x%x\n", dTriple->bufOffset); - - GDBG_INFO(80, - "F:%.06x %5d B:%.06x %5d B2:%.06x %5d A:%.06x %5d, C:%.06x %5d\n", - dFront->bufOffset, dFront->bufStride, - dBack ->bufOffset, dBack ->bufStride, - dTriple->bufOffset, dTriple->bufStride, - dAux ->bufOffset, dAux ->bufStride, - dFifo ->bufOffset, dFifo ->bufStride); - return TRUE; -} /* _dxDDrawToGlideDesc */ - - -static GUID fooGuid; - -BOOL FAR PASCAL ddEnumCbEx( GUID FAR *guid, LPSTR desc, LPSTR name, LPVOID ctx, HMONITOR hmon ) { - DWORD *data = (DWORD*)ctx; - HMONITOR target = (HMONITOR)data[0]; - BOOL rv = DDENUMRET_OK; - - if ( target == hmon ) { - fooGuid = *guid; - data[1] = (DWORD)&fooGuid; - rv = DDENUMRET_CANCEL; - } - return rv; -} - -/* - * Allocate (or re-allocate for WM_SIZE) buffers from DDraw. - */ -FxBool -_dxAllocSurfaces(int xRes, int yRes, int vRefresh, hwcBufferDesc *pDesc, void *hmon ) -{ - DDSURFACEDESC ddsd; - LPGUID ddGuid; - - GDBG_INFO(80, "_dxAS: hWnd = %x, fs=%d, xRes=%d, yRes=%d, vRefresh=%d\n", - hWndApp, IsFullScreen, xRes, yRes, vRefresh); - - - ddGuid = NULL; - { - HMODULE ddraw = GetModuleHandle( "ddraw.dll" ); - - if ( ddraw ) { - LPDIRECTDRAWENUMERATEEXA ddEnumEx; - ddEnumEx = (void*)GetProcAddress( ddraw, "DirectDrawEnumerateExA" ); - if ( ddEnumEx ) { - DWORD data[2]; - data[0] = (DWORD)hmon; - data[1] = 0; - ddEnumEx( ddEnumCbEx, data, DDENUM_ATTACHEDSECONDARYDEVICES ); - if ( data[1] ) { - ddGuid = (LPGUID)data[1]; - } - } - } - } - - - if (lpDD1 == NULL) { - if (DirectDrawCreate( ddGuid, &lpDD1, NULL ) != DD_OK) { - return ErrorMessage(hWndApp, "DirectDrawCreate Failed!"); - } else { - GDBG_INFO(80, "_dxAS: DDraw Obj created!\n"); - } - } else { - GDBG_INFO(80, "_dxAS: DDraw Obj already existed!\n"); - } - - lpDD = 0L; - - if (IDirectDraw_QueryInterface( lpDD1, &IID_IDirectDraw2, - (LPVOID*)&lpDD) !=DD_OK) { - - IDirectDraw_Release( lpDD1 ); - lpDD1 = NULL; - lpDD = NULL; - return ErrorMessage(hWndApp, "DDraw2 interface object failed!"); - } else { - GDBG_INFO(80, "_dxAS: DDraw2 Obj created!\n"); - } - - /* - * Make sure this is done after creating direct draw object!!! - * First time, only one time, get ourselves a command fifo. - * Fix me - XXX - */ - if (FifoOffset == 0) { - /* CHD HACK!!! */ - FifoOffset = 0x200000U - 65536*3; /* fixme!!! why 3? */ - } - - /* - * If there are any previously allocated surfaces, free them now - * before asking for more. - */ - if( lpClipper) IDirectDrawSurface2_Release( lpClipper); - if( lpAux ) IDirectDrawSurface2_Release( lpAux ); - if( lpBack ) IDirectDrawSurface2_Release( lpBack ); - if( lpTriple ) IDirectDrawSurface2_Release( lpTriple ); - if( lpFront ) IDirectDrawSurface2_Release( lpFront ); - - lpClipper = NULL; - lpFront = NULL; - lpBack = NULL; - lpTriple = NULL; - lpAux = NULL; - - if ( !IsFullScreen ) { /* In a window */ - - GDBG_INFO(80, "_dxAS: Allocating buffers for a windowed mode\n"); - - /* Verify screen pixel format is 16bpp, and set cooperative level */ - ddsd.dwSize = sizeof( ddsd ); - if (IDirectDraw2_GetDisplayMode( lpDD, &ddsd ) != DD_OK) - return ErrorMessage(hWndApp, "Couldn't get display mode!"); - - if (ddsd.ddpfPixelFormat.dwRGBBitCount / 8 != 2) - return ErrorMessage(hWndApp, "Display is not in 16bpp format!"); - - if (IDirectDraw2_SetCooperativeLevel(lpDD,hWndApp, DDSCL_NORMAL ) != DD_OK) - return ErrorMessage(hWndApp, "Couldn't set cooperative level!"); - - /* Allocate Front Buffer Surface */ - ddsd.dwSize = sizeof( ddsd ); - ddsd.dwFlags = DDSD_CAPS; - ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_3DDEVICE; - - if (IDirectDraw2_CreateSurface( lpDD, &ddsd, &lpFront, 0 ) != DD_OK) - return ErrorMessage(hWndApp, "Couldn't allocate primary surface!"); - - GDBG_INFO(80, "_dxAS: Screen: xRes = %d, yRes = %d, stride = %d\n", - xRes, yRes, ddsd.lPitch); - /* From jdt */ - if (IDirectDraw2_CreateClipper( lpDD, 0, &lpClipper, 0 ) != DD_OK) - return ErrorMessage(hWndApp, "Create Clipper failed!\n"); - - if (IDirectDrawClipper_SetHWnd( lpClipper, 0, hWndApp ) != DD_OK) - return ErrorMessage(hWndApp, "Clipper SethWnd failed!\n"); - - if (IDirectDrawSurface2_SetClipper( lpFront, lpClipper ) != DD_OK) - return ErrorMessage(hWndApp, "Set Clipper failed!\n"); - - /* Always allocate back buffer. - */ - ddsd.dwSize = sizeof( ddsd ); - ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; - ddsd.dwWidth = xRes; - ddsd.dwHeight = yRes; - ddsd.ddsCaps.dwCaps = - DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY | DDSCAPS_3DDEVICE; - - if (IDirectDraw2_CreateSurface( lpDD, &ddsd, &lpBack, 0 ) != DD_OK) - return ErrorMessage(hWndApp, "Couldn't allocate secondary surface!" ); - - GDBG_INFO(80, "_dxAS: Back buffer allocated!\n"); - - /* - * Always allocate Aux Buffer Surface - * XXX - (use nAuxBuffers, and deal with 8bpp for alpha) - */ - ddsd.dwSize = sizeof( ddsd ); - ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; - ddsd.dwWidth = xRes; - ddsd.dwHeight = yRes; - ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY - | DDSCAPS_3DDEVICE; - - if (IDirectDraw2_CreateSurface( lpDD, &ddsd, &lpAux, 0 ) != DD_OK) - return ErrorMessage(hWndApp, "Couldn't allocate aux surface" ); - - GDBG_INFO(80, "_dxAS: Aux Buffer allocated!\n"); - - } else { - - /* Full screen - Set Exclusive Mode, change resolution, */ - GDBG_INFO(80, "_dxAS: Setting Full screen exclusive mode!\n"); - - if (IDirectDraw2_SetCooperativeLevel(lpDD, hWndApp, - DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN ) != DD_OK) - return ErrorMessage(hWndApp, "Couldn't set cooperative level!"); - - if (IDirectDraw2_SetDisplayMode( lpDD, xRes, yRes, 16, 0,0) != DD_OK) - return ErrorMessage(hWndApp, "Couldn't set display mode!"); - -#if WE_WERE_HELPLESS - /* Allocate Front/Back Buffer Surfaces, skip triple buffer XXX */ - ddsd.dwSize = sizeof( ddsd ); - ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT; - ddsd.dwBackBufferCount = 1; - ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | - DDSCAPS_FLIP | - DDSCAPS_COMPLEX | - DDSCAPS_VIDEOMEMORY | DDSCAPS_3DDEVICE; - - if (IDirectDraw2_CreateSurface( lpDD, &ddsd, &lpFront, 0 ) != DD_OK) - return ErrorMessage(hWndApp, "Couldn't allocate primary surface!"); - - /* Get back buffer information */ - ddsd.ddsCaps.dwCaps = DDSCAPS_BACKBUFFER; - if (IDirectDrawSurface2_GetAttachedSurface( lpFront, &ddsd.ddsCaps, - &lpBack) != DD_OK) - return ErrorMessage(hWndApp, "Couldn't get back buffer info!\n"); - - GDBG_INFO(80, "_dxAS: Full Screen: front/back buffer allocated!\n"); - - /* Allocate Aux Buffer Surface - XXX */ - ddsd.dwSize = sizeof( ddsd ); - ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; - ddsd.dwWidth = xRes; - ddsd.dwHeight = yRes; - ddsd.ddsCaps.dwCaps = - DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY | DDSCAPS_3DDEVICE; - - if (IDirectDraw2_CreateSurface( lpDD, &ddsd, &lpAux, 0 ) != DD_OK) - return ErrorMessage(hWndApp, "Couldn't allocate aux surface" ); - - GDBG_INFO(80, "_dxAS: Full Screen: aux buffer allocated!\n"); - -/* - * Triple buffer hack: full-screen only for now. Allocate as Aux DD surf, - * after everything else N.B. Allocation order may be important!!! - * god knows how DD would implement dwBackBufferCount == 2 - */ - if (tripleBuffering) { - if (IDirectDraw2_CreateSurface( lpDD, &ddsd, &lpTriple, 0 ) != DD_OK) - return ErrorMessage(hWndApp, "Couldn't allocate triple buffer" ); - - GDBG_INFO(80, "_dxAS: Triple buffer allocated!\n"); - } -#endif - - } -#if WE_WERE_HELPLESS - /* Convert direct draw surfaces to Glide's idea of buffer descriptors */ - return _dxDDrawToGlideDesc(pDesc); -#else /* We help ourselves */ - return FXTRUE; -#endif - -} /* _dxAllocSurfaces */ - -FxBool -_dxReallocSurfaces(int xRes, int yRes, int vRefresh, hwcBufferDesc *pDesc) - -{ - DDSURFACEDESC ddsd; - const char *errorMessage = "no error"; - - /* for now this is a goddamn baseball bat - it can be trimmed down */ - if ( !IsFullScreen ) { /* this *REALLY* should be called for fullscreen */ - if( lpClipper) IDirectDrawClipper_Release( lpClipper); - if( lpAux ) IDirectDrawSurface2_Release( lpAux ); - if( lpBack ) IDirectDrawSurface2_Release( lpBack ); - if( lpTriple ) IDirectDrawSurface2_Release( lpTriple ); - if( lpFront ) IDirectDrawSurface2_Release( lpFront ); - - lpClipper = NULL; - lpFront = NULL; - lpBack = NULL; - lpTriple = NULL; - lpAux = NULL; - - /* Verify screen pixel format is 16bpp, and set cooperative level */ - ddsd.dwSize = sizeof( ddsd ); - - /* Allocate Front Buffer Surface */ - ddsd.dwSize = sizeof( ddsd ); - ddsd.dwFlags = DDSD_CAPS; - ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_3DDEVICE; - - if (IDirectDraw2_CreateSurface( lpDD, &ddsd, &lpFront, 0 ) != DD_OK) { - errorMessage = "Couldn't allocate primary surface!"; - goto FUBAR; - } - - /* From jdt */ - if (IDirectDraw2_CreateClipper( lpDD, 0, &lpClipper, 0 ) != DD_OK) { - errorMessage = "Create Clipper failed!\n"; - goto FUBAR; - } - - if (IDirectDrawClipper_SetHWnd( lpClipper, 0, hWndApp ) != DD_OK) { - errorMessage = "Clipper SethWnd failed!\n"; - goto FUBAR; - } - - if (IDirectDrawSurface2_SetClipper( lpFront, lpClipper ) != DD_OK) { - errorMessage = "Set Clipper failed!\n"; - goto FUBAR; - } - - /* Always allocate back buffer. - */ - ddsd.dwSize = sizeof( ddsd ); - ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; - ddsd.dwWidth = xRes; - ddsd.dwHeight = yRes; - ddsd.ddsCaps.dwCaps = - DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY | DDSCAPS_3DDEVICE; - - if (IDirectDraw2_CreateSurface( lpDD, &ddsd, &lpBack, 0 ) != DD_OK) { - errorMessage = "Couldn't allocate secondary surface!"; - goto FUBAR; - } - - /* - * Always allocate Aux Buffer Surface - * XXX - (use nAuxBuffers, and deal with 8bpp for alpha) - */ - ddsd.dwSize = sizeof( ddsd ); - ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; - ddsd.dwWidth = xRes; - ddsd.dwHeight = yRes; - ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY - | DDSCAPS_3DDEVICE; - - if (IDirectDraw2_CreateSurface( lpDD, &ddsd, &lpAux, 0 ) != DD_OK) { - errorMessage = "Couldn't allocate aux surface"; - goto FUBAR; - } - } - return _dxDDrawToGlideDesc(pDesc); -FUBAR: - /* if you don't free these you can't make another attempt */ - if( lpClipper) IDirectDrawClipper_Release( lpClipper); - if( lpAux ) IDirectDrawSurface2_Release( lpAux ); - if( lpBack ) IDirectDrawSurface2_Release( lpBack ); - if( lpTriple ) IDirectDrawSurface2_Release( lpTriple ); - if( lpFront ) IDirectDrawSurface2_Release( lpFront ); - lpClipper = NULL; - lpFront = NULL; - lpBack = NULL; - lpTriple = NULL; - lpAux = NULL; - return ErrorMessage( hWndApp, (char*)errorMessage ); -} /* _dxReallocSurfaces */ - -/* - * Restore lost surfaces, or move the window. - * Note: Resizing is done by deleting and re-allocation, and is done in - * _dxAllocSurfaces(); - */ -static FxBool -_dxRestoreSurfaces(hwcBufferDesc *pDesc) -{ - if (lpDD == NULL) return TRUE; - - if (IDirectDrawSurface2_IsLost(lpFront) == DDERR_SURFACELOST) { - if (IDirectDrawSurface2_Restore(lpFront) != DD_OK) - return ErrorMessage(hWndApp, "Front Buffer restore failure\n"); - } - - if (!IsFullScreen) { - if (IDirectDrawSurface2_IsLost(lpBack) == DDERR_SURFACELOST) { - if (IDirectDrawSurface2_Restore(lpBack) != DD_OK) - return ErrorMessage(hWndApp, "Back Buffer restore failure\n"); - } - } - - if (IDirectDrawSurface2_IsLost(lpAux) == DDERR_SURFACELOST) { - if (IDirectDrawSurface2_Restore(lpAux) != DD_OK) - return ErrorMessage(hWndApp, "Aux Buffer restore failure\n"); - } - - if (!IsFullScreen) { - if (IDirectDrawSurface2_IsLost(lpTriple) == DDERR_SURFACELOST) { - if (IDirectDrawSurface2_Restore(lpTriple) != DD_OK) - return ErrorMessage(hWndApp, "Back Buffer restore failure\n"); - } - } - - GDBG_INFO(80, "_dxRS: restore surfaces OK\n"); - return _dxDDrawToGlideDesc(pDesc); -} /* _dxRestoreSurfaces */ - -FxBool -dxOpen( - FxU32 hWindow, - GrScreenResolution_t sRes, - GrScreenRefresh_t vRefresh, - hwcColorFormat cFormat, - hwcOriginLocation yOrigin, - int nColBuffers, - int nAuxBuffers, - hwcBufferDesc *pBufDesc, /* return values */ - int *width, - int *height, - hwcSwapType *swapType, - void *hmon -) -{ - int i; - - GDBG_INFO(80, "dxOpen: hWnd = %x, sRes=%d, yOrg=%d, ncb=%d, nab=%d\n", - hWindow, sRes, yOrigin, nColBuffers, nAuxBuffers); - - /* - * Get ourselves a valid window handle - */ - hWndApp = (hWindow == 0) ? GetActiveWindow() : (HWND) hWindow; - - if (hWndApp == NULL) { - return MessageBox(NULL, "grSstWinOpen was passed a NULL window handle!\n\ -Contact the application Vendor\n", - "Programmer Error", MB_OK); - } - - if (sRes == GR_RESOLUTION_NONE ) { /* In a window */ - RECT rect; - - /* Find out how big the window is */ - GetClientRect(hWndApp, &rect); - IsFullScreen = FXFALSE; - Width = rect.right; - Height = rect.bottom; - } else { - /* Full screen mode - convert resolution to Width, Height */ - static int _w[] = {320,320,400,512,640,640,640,640,800,960,856,512,1024,1280,1600,400}; - static int _h[] = {200,240,256,384,200,350,400,480,600,720,480,256,768,1024,1200,300}; - - if ((sRes < GR_RESOLUTION_320x200) || - (sRes > GR_RESOLUTION_1600x1200)) - - return ErrorMessage(hWndApp, "Bad Fullscreen resolution"); - - tripleBuffering = (nColBuffers == 3); - - IsFullScreen = FXTRUE; - - Width = _w[sRes]; - Height = _h[sRes]; - } - - GDBG_INFO(80, "dxOpen: W=%d, H=%d, FullScr=%d, vRefresh=%d\n", - Width, Height, IsFullScreen, vRefresh); - - if (!_dxAllocSurfaces(Width, Height, vRefresh, BufDesc, hmon)) - return ErrorMessage(hWndApp, "failed dxOpen"); - - GDBG_INFO(80, "_dxAllocSurfaces OK!!!\n"); - - for (i=0; i< NUM_BUFS; i++) { - pBufDesc[i] = BufDesc[i]; - GDBG_INFO(80, "dxOpen: pBufDesc[%d]: \n", i); - GDBG_INFO(80, "\tbufMagic = 0x%x\n", pBufDesc[i].bufMagic); - GDBG_INFO(80, "\tbufType = 0x%x\n", pBufDesc[i].bufType); - GDBG_INFO(80, "\tbufOffset = 0x%x\n", pBufDesc[i].bufOffset); - GDBG_INFO(80, "\tbufStride = 0x%x\n", pBufDesc[i].bufStride); - GDBG_INFO(80, "\tbufBPP = 0x%x\n", pBufDesc[i].bufBPP); - } - - *width = Width; - *height = Height; - *swapType = (IsFullScreen) ? HWC_SWAP_FLIP : HWC_SWAP_BLT; - - GDBG_INFO(80, "dxOpen: Returning TRUE\n"); - - return FXTRUE; - -} /* dxOpen */ - -FxBool -dxControl(FxU32 code, hwcBufferDesc *pBufDesc, int *width, int *height) -{ - RECT rect; - int i; - - GDBG_INFO(80, "dxControl: code = %d\n", code); - - /* dx is not initizized */ - if ( lpDD== NULL ) { - return TRUE; - } - - /* Why was I called? */ - switch(code) { - case HWC_CONTROL_RESIZE: /* recreate surfaces */ - GetClientRect(hWndApp, &rect); - if ((Width != (FxU32) rect.right) || (Height != (FxU32) rect.bottom)) { - Width = rect.right; - Height = rect.bottom; - GDBG_INFO(120, "W and H changed to %d %d\n", - Width, Height); - - if (!_dxReallocSurfaces(Width, Height, 0, BufDesc)) { - /* - Let's find some other way to do this! - ErrorMessage(hWndApp, "dxControl: Resize failed\n"); */ - return FXFALSE; - } - } - break; - - case HWC_CONTROL_MOVE: - break; - - case HWC_CONTROL_ACTIVATE: - GDBG_INFO(120, "dxControl: Activate\n"); - break; - - case HWC_CONTROL_DEACTIVATE: - GDBG_INFO(120, "dxControl: DeActivate\n"); - break; - - default: - GDBG_INFO(120, "dxControl: Strange control %d\n", code); - return FXFALSE; - break; - } - for (i=0; i<5; i++) pBufDesc[i] = BufDesc[i]; - *width = Width; - *height = Height; - GDBG_INFO(80, "dxControl: code = %d, w = %d, h = %d\n", code, - Width, Height); - - return FXTRUE; -} /* dxControl */ - -FxBool -dxClose() -{ - GDBG_INFO(80, "dxClose:\n"); -/* - * fixme! nulling out this code fixes bug 541... why is unclear??? XXX - * A little more information... the problem is releasing lpDD1, and - * only in fullscreen mode. Temporary refined hack is to not release - * lpDD1 in fullscreen mode. Also rearrange code in dxAllocSurfaces - * to only create lpDD1 once per application execution. /PGJ - */ -#if 1 - // Release any allocated buffers - if( lpClipper) IDirectDrawSurface2_Release( lpClipper); - if( lpFront ) IDirectDrawSurface2_Release( lpFront ); - if(!IsFullScreen) { - if( lpBack ) IDirectDrawSurface2_Release( lpBack ); - } - if( lpAux ) IDirectDrawSurface2_Release( lpAux ); - if( lpDD ) IDirectDraw2_Release( lpDD ); - if (1 /* !IsFullScreen */) { - if( lpDD1 ) IDirectDraw_Release( lpDD1 ); - lpDD1 = NULL; - } - - lpClipper = NULL; - lpFront = NULL; - lpBack = NULL; - lpTriple = NULL; - lpAux = NULL; - lpDD = NULL; - -#endif /* 0 */ - GDBG_INFO(80, "dxClose: Returning TRUE\n"); - return FXTRUE; -} /* dxClose */ - -void -dxSwap(FxU32 code) -{ - static RECT dest, src; - static POINT point; - static HRESULT hr; - - GDBG_INFO(80, "dxSwap:\n"); - if ( !IsFullScreen ) { - GDBG_INFO(120, "Swap: using BLTs\n"); - - src.left = 0; - src.right = Width-1; - src.top = 0; - src.bottom = Height-1; - - dest = src; - point.x = 0; - point.y = 0; - ClientToScreen( hWndApp, &point ); - dest.left += point.x; - dest.right += point.x; - dest.top += point.y; - dest.bottom += point.y; - - hr = IDirectDrawSurface_Blt( lpFront, - &dest, - lpBack, - &src, - DDBLT_WAIT, - NULL ); - - while( IDirectDrawSurface_GetBltStatus( lpFront, DDGBS_ISBLTDONE ) != - DD_OK ); - - if ( hr != DD_OK ) { - ErrorMessage(hWndApp, "Couldn't blit!\n"); - } - } - return; - -} /* dxSwap */ -#else /* it's either DOS or the Hoopti Lab Setup */ - -static FxU16 oldVidMode; - -FxBool -dxOpen( - FxU32 hWindow, - GrScreenResolution_t sRes, - GrScreenRefresh_t vRefresh, - hwcColorFormat cFormat, - hwcOriginLocation yOrigin, - int nColBuffers, - int nAuxBuffers, - hwcBufferDesc *pBufDesc, // return values - int *width, - int *height, - hwcSwapType *swapType -) -{ -#define FN_NAME "dxOpen" - FxU32 mode; - hwcBufferDesc *dFront = &pBufDesc[0]; - hwcBufferDesc *dBack = &pBufDesc[1]; - hwcBufferDesc *dAux = &pBufDesc[2]; - hwcBufferDesc *dFifo = &pBufDesc[3]; - hwcBufferDesc *dScreen = &pBufDesc[4]; - hwcBufferDesc *dTriple = &pBufDesc[5]; - FxBool rv = FXTRUE; - FxU32 endAddr; - union REGS r, rOut; - - r.w.ax = 0x4f03; - int386(0x10, &r, &rOut); - - oldVidMode = rOut.w.bx; - GDBG_INFO(80, "%s: Saving Current video mode (0x%x).\n", - FN_NAME, oldVidMode); - - - GDBG_INFO(80, "%s: Resolution == 0x%x\n", FN_NAME, sRes); - - switch (sRes) { - case GR_RESOLUTION_640x480: - *width = 640; - *height = 480; - mode = 0x111; - break; - - case GR_RESOLUTION_800x600: - case GR_RESOLUTION_320x200: - case GR_RESOLUTION_320x240: - case GR_RESOLUTION_512x384: - case GR_RESOLUTION_400x256: - case GR_RESOLUTION_640x200: - case GR_RESOLUTION_640x350: - case GR_RESOLUTION_640x400: - case GR_RESOLUTION_960x720: - case GR_RESOLUTION_856x480: - case GR_RESOLUTION_512x256: - case GR_RESOLUTION_NONE: - default: - GDBG_INFO(80, "%s: Unimplemented resolution\n", FN_NAME); - return FXFALSE; - break; - } - - - - r.w.ax = 0x4f02; - r.w.bx = mode; - - GDBG_INFO(80, "%s: Setting mode 0x%x, 0x%x\n", FN_NAME, r.w.ax, r.w.bx); - - /* Do VGA Magic */ - int386(0x10, &r, &rOut); - - /* AT3D buffers need to be 4K (Intel) page-aligned */ -#define BUMP(x, y) (((x) + ((y)-1)) & ~((y)-1)) -#define BUMP_PAGE(x) (BUMP(x, 1<<12)) - - /* Initialize all descriptors. */ - dFront->bufMagic = H3_BUF_MAGIC; - dFront->bufType = HWC_BUFFER_FRONTBUFFER; - dFront->bufOffset = 0; - dFront->bufStride = (*width)*2; - dFront->bufBPP = 16; - endAddr = BUMP_PAGE((*width)*(*height)*2); - - dBack->bufMagic = H3_BUF_MAGIC; - dBack->bufType = HWC_BUFFER_BACKBUFFER; - dBack->bufOffset = endAddr; - dBack->bufStride = (*width)*2; - dBack->bufBPP = 16; - endAddr = BUMP_PAGE(endAddr + (*width)*(*height)*2); - - tripleBuffering = (nColBuffers == 3); - if (tripleBuffering) { - dTriple->bufMagic = H3_BUF_MAGIC; - dTriple->bufType = HWC_BUFFER_TRIPLEBUFFER; - dTriple->bufOffset = endAddr; - dTriple->bufStride = (*width)*2; - dTriple->bufBPP = 16; - endAddr = BUMP_PAGE(endAddr + (*width)*(*height)*2); - } - - dAux->bufMagic = H3_BUF_MAGIC; - dAux->bufType = HWC_BUFFER_AUXBUFFER; - dAux->bufOffset = endAddr; - dAux->bufStride = (*width)*2; - dAux->bufBPP = 16; - endAddr = BUMP_PAGE(endAddr + (*width)*(*height)*2); - - dFifo->bufMagic = H3_BUF_MAGIC; - dFifo->bufType = HWC_BUFFER_FIFOBUFFER; - dFifo->bufOffset = endAddr; - dFifo->bufStride = 65536; - dFifo->bufBPP = 16; - - dScreen->bufMagic = H3_BUF_MAGIC; - dScreen->bufType = HWC_BUFFER_SCREENBUFFER; - dScreen->bufOffset = 0; - dScreen->bufStride = 0; - dScreen->bufBPP = 0; - - GDBG_INFO(80, "%s: dFront = 0x%x, dBack = 0x%x, dAux = 0x%x\n", - FN_NAME, dFront, dBack, dAux, dFifo); - GDBG_INFO(80, "dxOpen: F:%.06x %5d B:%.06x %5d A:%.06x %5d, C:%.06x %5d\n", - dFront->bufOffset, dFront->bufStride, - dBack ->bufOffset, dBack ->bufStride, - dAux ->bufOffset, dAux ->bufStride, - dFifo ->bufOffset, dFifo ->bufStride); - -#ifdef GDBG_INFO_ON - { - int i; - - for (i = 0; i < 5; i++) { - GDBG_INFO(80, "%s: pBufDesc[%d] = 0x%x:\n", - FN_NAME, i, &pBufDesc[i]); - GDBG_INFO(80, "%s: pBufDesc.bufType = %s\n", - FN_NAME, bufTypeNames[pBufDesc[i].bufType]); - GDBG_INFO(80, "%s: pBufDesc.bufOffset = 0x%x\n", - FN_NAME, pBufDesc[i].bufOffset ); - GDBG_INFO(80, "%s: pBufDesc.bufStride = 0x%x\n", - FN_NAME, pBufDesc[i].bufStride); - GDBG_INFO(80, "%s: pBufDesc.bufBPP = 0x%x\n", - FN_NAME, pBufDesc[i].bufBPP); - } - } -#endif - - *swapType = HWC_SWAP_FLIP; - -BAIL: - return rv; -#undef FN_NAME -} /* dxOpen */ - -FxBool -dxControl(FxU32 code, hwcBufferDesc *pBufDesc, int *width, int *height) -{ - return FXTRUE; -} /* dxControl */ -FxBool -dxClose() -{ -#define FN_NAME "dxClose" - GDBG_INFO(80, "%s: Setting up VESA mode 640*480*\n", FN_NAME); - { - union REGS r; - - memset(&r, 0, sizeof(r)); - - r.w.ax = 0x4f02; - r.w.bx = oldVidMode; - GDBG_INFO(80, "%s: Setting mode 0x%x, 0x%x\n", FN_NAME, r.w.ax, r.w.bx); - int386( 0x10, &r, &r ); - } - return FXTRUE; -#undef FN_NAME -} /* dxClose */ - -void -dxSwap(FxU32 code) -{ -} /* dxSwap */ -#endif /* __DOS32__ || (defined(__WIN32__) && !defined(HWC_ACCESS_DDRAW) */ - - diff --git a/glide2x/h3/minihwc/exttest.c b/glide2x/h3/minihwc/exttest.c deleted file mode 100644 index 6df75d7..0000000 --- a/glide2x/h3/minihwc/exttest.c +++ /dev/null @@ -1,243 +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$ -** -** 2 3/16/99 1:20a Dow -** Sync to various workarounds. -** -** 1 3/10/99 10:48a Peter -** mmmm.... yawmnw -** -** 1 3/10/99 10:46a Peter -** mmmm.... yawmnw -** -** 1 5/01/98 9:16a Dow -** -*/ - -#include -#include <3dfx.h> -#include "..\hwcext.h" -/* This segment simulates main() for Windows, creates a window, etc. */ -#define WIN32_LEAN_AND_MEAN -#include -#include - -/* Forward declarations */ -HWND hWndMain; - -/* - * MainWndproc - * - * Callback for all Windows messages - */ -static int qhead = 0; -static int qtail = 0; -static int queue[256] = {0}; - -long FAR PASCAL -MainWndproc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) -{ - PAINTSTRUCT ps; - HDC hdc; - - switch( message ) - { - case WM_SETCURSOR: - SetCursor(NULL); - break; - - case WM_CREATE: - break; - - case WM_PAINT: - hdc = BeginPaint( hWnd, &ps ); - EndPaint( hWnd, &ps ); - return 1; - - case WM_CLOSE: - queue[qhead++] = 'q'; qhead &= 255; - break; - - case WM_DESTROY: - break; - - case WM_MOVE: - break; - - case WM_DISPLAYCHANGE: - case WM_SIZE: - break; - - case WM_CHAR: - break; - - default: - break; - } - return DefWindowProc(hWnd, message, wParam, lParam); - -} /* MainWndproc */ - -void -main(int argc, char **argv) -{ - HWND hWndMain; - HANDLE hInstance = GetModuleHandle(NULL); - HDC dc; - int extRes; - hwcExtRequest_t req; - hwcExtResult_t res; - WNDCLASS wc; - BOOL rc; - - FxU32 contextID; - - - wc.style = CS_DBLCLKS; - wc.lpfnWndProc = MainWndproc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = hInstance; - wc.hIcon = LoadIcon( NULL, IDI_APPLICATION); /* generic icon */ - wc.hCursor = LoadCursor( NULL, IDC_ARROW ); - wc.hbrBackground = GetStockObject( BLACK_BRUSH ); - wc.lpszMenuName = NULL; - wc.lpszClassName = "ExtTestClass"; - rc = RegisterClass( &wc ); - - if( !rc ) { - printf("Failed to register class!\n"); - exit(1); - } - - hWndMain = - CreateWindowEx( -#if 0 - WS_EX_APPWINDOW gives you regular borders? - WS_EX_TOPMOST Works as advertised. -#endif - WS_EX_APPWINDOW, - "ExtTestClass", - "ExtEscape Test", - WS_OVERLAPPED | - WS_CAPTION | - WS_THICKFRAME | - WS_MAXIMIZEBOX | - WS_MINIMIZEBOX | - WS_POPUP | /* non-app window */ - WS_SYSMENU, /* so we get an icon in the tray */ - CW_USEDEFAULT, - CW_USEDEFAULT, - 0x110, /* GetSystemMetrics(SM_CXSCREEN), */ - 0x120, /* GetSystemMetrics(SM_CYSCREEN), */ - NULL, - NULL, - hInstance, - NULL - ); - - - if( !hWndMain ) { - printf("Failed to create window\n"); - exit(2); - } - - /* HWCEXT_GETDRIVERVERSION */ - - req.which = HWCEXT_GETDRIVERVERSION; - - dc = GetDC(hWndMain); - - extRes = ExtEscape(dc, EXT_HWC, sizeof(req), (LPCSTR) &req, - sizeof(res), (LPCSTR) &res); - - if (extRes == 0) { - printf("No escape!\n"); - exit(3); - } - - printf("HWCEXT_GETDRIVERVERSION:\n\tMajor:\t0x%x\n\tMinor:\t0x%x\n", - res.optData.driverVersionRes.major, - res.optData.driverVersionRes.minor); - - /* HWCEXT_ALLOCCONTEXT */ - req.which = HWCEXT_ALLOCCONTEXT; - - req.optData.allocContextReq.protocolRev = HWCEXT_PROTOCOLREV; - req.optData.allocContextReq.appType = HWCEXT_ABAPPTYPE_FSEM; - - extRes = ExtEscape(dc, EXT_HWC, sizeof(req), (LPCSTR) &req, - sizeof(res), (LPCSTR) &res); - - printf("HWCEXT_ALLOCCONTEXT:\n\tStatus:\t0x%x\n\tContext ID:\t0x%x\n", - res.resStatus, res.optData.allocContextRes.contextID); - - contextID = res.optData.allocContextRes.contextID; - - /* HWCEXT_GETDEVICECONFIG */ - req.which = HWCEXT_GETDEVICECONFIG; - - extRes = ExtEscape(dc, EXT_HWC, sizeof(req), (LPCSTR) &req, - sizeof(res), (LPCSTR) &res); - - printf("HWCEXT_GETDEVICECONFIG:\ -\n\tStatus:\t0x%x\ -\n\tdevNum:\t0x%x\ -\n\tvendorDI:\t0x%x\ -\n\tfbRam:\t0x%x\ -\n\tchipRev:\t0x%x\n", - res.resStatus, res.optData.deviceConfigRes.devNum, - res.optData.deviceConfigRes.vendorID, - res.optData.deviceConfigRes.fbRam, - res.optData.deviceConfigRes.chipRev); - - /* HWCEXT_GETLINEARADDR */ - req.which = HWCEXT_GETLINEARADDR; - - req.optData.linearAddrReq.devNum = 0; - - extRes = ExtEscape(dc, EXT_HWC, sizeof(req), (LPCSTR) &req, - sizeof(res), (LPCSTR) &res); - - printf("HWCEXT_LINEARADDRESS:\ -\n\tStatus:\t0x%x\ -\n\tnumBaseAddrs: %d\ -\n\tbaseAddresses[0]: 0x%x\ -\n\tbaseAddresses[1]: 0x%x\ -\n\tbaseAddresses[2]: 0x%x\n", - res.resStatus, res.optData.linearAddressRes.numBaseAddrs, - res.optData.linearAddressRes.baseAddresses[0], - res.optData.linearAddressRes.baseAddresses[1], - res.optData.linearAddressRes.baseAddresses[2] - ); - - /* HWCEXT_RELEASECONTEXT */ - req.which = HWCEXT_RELEASECONTEXT; - - req.optData.releaseContextReq.contextID = contextID; - - extRes = ExtEscape(dc, EXT_HWC, sizeof(req), (LPCSTR) &req, - sizeof(res), (LPCSTR) &res); - - printf("HWCEXT_RELEASECONTEXT:\n\tStatus:\t0x%x\n", res.resStatus); - -} /* main */ diff --git a/glide2x/h3/minihwc/fxhwc.h b/glide2x/h3/minihwc/fxhwc.h deleted file mode 100644 index 51da389..0000000 --- a/glide2x/h3/minihwc/fxhwc.h +++ /dev/null @@ -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 -** -** $Header$ -** $Log$ -** Revision 1.1.1.1 1999/12/07 21:49:43 joseph -** Initial checkin into SourceForge. -** -** -** 3 3/17/99 6:14p Dow -** Fixes Phantom Menace, OGL, and others. -** -** 1 3/04/98 4:13p Dow -** -*/ -#ifndef FXHWC_H -#define FXHWC_H - - - -/* -** I/O Macros -*/ -#warning Here! -#define HWC_IO_LOAD(regInfo, reg, val) -GDBG_INFO(120, "%s: Storing 0x%x to IO Register %s\n", -((SstIORegs *) regInfo.ioMemBase)-> - - -#endif /* FXHWC_H not defined */ diff --git a/glide2x/h3/minihwc/gdebug.c b/glide2x/h3/minihwc/gdebug.c deleted file mode 100644 index 287a40d..0000000 --- a/glide2x/h3/minihwc/gdebug.c +++ /dev/null @@ -1,491 +0,0 @@ -/*-*-c++-*-*/ -#include "vxd.h" - -/* -** 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 -#include -#include -#include - -#include <3dfx.h> - -#if __MWERKS__ -/* Dork w/ the console window */ -#include - -/* So the debug level comes from the right place */ -#include -#include -#endif /* __MWERKS__ */ - -#define FX_DLL_DEFINITION -#include -#include -#include - -#if defined(__WIN32__) && !defined(KERNEL) -#include -#endif /* defined(__WIN32__) && !defined(KERNEL) */ - -#define USE_DEBUG_STRING (__DOS32__ || __WIN32__) -#if USE_DEBUG_STRING -static FxBool UseDebugString = 0; -#endif /* USE_DEBUG_STRING */ - -#ifdef KERNEL_NT - -void __stdcall -EngDebugPrint( - char * StandardPrefix, - const char * DebugMessage, - va_list ap - ); - -#endif - -static char *gdbg_myname = "gd"; // default library name -static char gdbg_debuglevel[GDBG_MAX_LEVELS]; // array of debuglevel controls - -static long gdbg_errors = 0; - - -#ifdef KERNEL -// gdbgout is array to store strings for debug output -//#include -static char gdbgout[512]; - -// for setting levels interactively through the debugger while you're -// running in the KERNEL mode -void setLevel(int level, int value) -{ - if (level >= GDBG_MAX_LEVELS) - level = GDBG_MAX_LEVELS - 1; - - gdbg_debuglevel[level] = value; -} - - -#ifndef KERNEL_NT -// we need to call a kernal printf. -extern int __cdecl klvfprintf(FILE *stream, - const char *format, - va_list arg ) ; -#endif - -static FILE *gdbg_msgfile; // GDBG info/error file -#else /* #ifdef KERNEL */ - -#ifndef __linux__ -static FILE *gdbg_msgfile = stdout; // GDBG info/error file -#else -static FILE *gdbg_msgfile; // GDBG info/error file -#endif - -//---------------------------------------------------------------------- -// initialize gdbg_level from an environment variable -//---------------------------------------------------------------------- -static const char *setRange(const char *buf, int val) -{ - int r0,r1,pos; - - sscanf(buf,"%i%n",&r0,&pos); // parse the first integer - if (buf[pos]=='-' || buf[pos]==':') { // if there's a second - buf += pos+1; - sscanf(buf,"%i%n",&r1,&pos); // then parse it - } - else - r1 = r0; - - if (r0 < 0) r0 = 0; // sanity checks - if (r1 >= GDBG_MAX_LEVELS) r1 = GDBG_MAX_LEVELS-1; - if (r1 < r0) r1 = r0; - - while (r0 <= r1) // now set the debuglevel levels - gdbg_debuglevel[r0++] = val; - - return buf + pos; // and return rest of string -} - -FX_EXPORT void FX_CSTYLE -gdbg_parse(const char *env) -{ - int level, pos; - - do { - if (env[0] == ',') // advance past commas - env++; - if (env[0] == '+') // if + then enable a range - env = setRange(env+1,1); - else if (env[0] == '-') // if - then disable a range - env = setRange(env+1,0); - else { // else just a number - if (sscanf(env,"%i%n",&level,&pos) <= 0) return; - if (pos==0) return; // oops, guess not - if (level >= GDBG_MAX_LEVELS) level = GDBG_MAX_LEVELS-1; - while (level >= 0) // enable the range [0,#] - gdbg_debuglevel[level--] = 1; - env += pos; - } - } while (env[0] == ','); -} - -#endif /* #ifndef KERNEL */ - -FX_EXPORT void FX_CSTYLE -gdbg_init(void) -{ - static int done=0; // only execute once - char *env; - - if (done) return; - -#if __MWERKS__ - SIOUXSettings.standalone = false; - SIOUXSettings.setupmenus = false; - SIOUXSettings.autocloseonquit = true; - SIOUXSettings.asktosaveonclose = false; -#endif - -#ifdef __linux__ - gdbg_msgfile = stderr; // GDBG info/error file -#endif - -#ifdef KERNEL - // put code in here to set the default level - gdbg_debuglevel[0] = 1; // always enable level 0 - gdbg_debuglevel[120] = 1; // always enable level 0 - done = 1; - env = 0; - return; -#else /* #ifdef KERNEL */ - done = 1; - gdbg_debuglevel[0] = 1; // always enable level 0 - env = GETENV("GDBG_FILE"); - if (env != NULL) GDBG_SET_FILE(env); - env = GETENV("GDBG_LEVEL"); - if (env == NULL) env = "0"; - gdbg_parse(env); - gdbg_info(1,"gdbg_init(): debug level = %s\n",env); -#endif /* #ifndef KERNEL */ -} - -FX_EXPORT void FX_CSTYLE -gdbg_shutdown(void) -{ - gdbg_info(1,"gdbg_shutdown()\n"); -#ifndef KERNEL - if (gdbg_msgfile != stdout) { // close any existing output file -#if USE_DEBUG_STRING - if (!UseDebugString) -#endif /* USE_DEBUG_STRING */ - fclose(gdbg_msgfile); - gdbg_msgfile = stdout; - } -#endif /* #ifndef KERNEL */ -} - -#if defined(KERNEL) && !defined(KERNEL_NT) - extern void MyPrintf(); -#endif /* #ifdef KERNEL */ - -#ifdef KERNEL_NT -//---------------------------------------------------------------------- -// NT Debug print helper routine -//---------------------------------------------------------------------- -static void gdbg_NTPrint( const char *format, ... ) -{ - va_list arglist; - - va_start(arglist, format); - EngDebugPrint( "\nHAL: ", format, arglist ); - va_end(arglist); -} -#endif // KERNEL_NT - -static GDBGKeepAliveProc keepAliveProc; - -FX_EXPORT void FX_CSTYLE gdbg_set_keepalive(GDBGKeepAliveProc p) -{ - keepAliveProc = p; -} - -//---------------------------------------------------------------------- -// the MAIN message display suboutine - ALL messages come thru here -//---------------------------------------------------------------------- -FX_EXPORT void FX_CSTYLE -gdbg_vprintf (const char *format,va_list args) -{ - if (gdbg_msgfile != NULL) { -#ifdef KERNEL - // shouldn't get here now - //commented out for now -KMW - //nwvsprintf(gdbgout,format,args); - //OutputDebugString("\n"); - //OutputDebugString("HAL: "); - //OutputDebugString(gdbgout); -#else -#if USE_DEBUG_STRING - if (UseDebugString) { - static char msgBuf[1024]; - - vsprintf(msgBuf, format, args); - -#if __DOS32__ - pciOutputDebugString(msgBuf); -#else - OutputDebugString(msgBuf); -#endif /* !__DOS32__ */ - } else -#endif /* USE_DEBUG_STRING */ - { - vfprintf(gdbg_msgfile,format,args); - // if there is a keepAlive callback, then call it - fflush(gdbg_msgfile); - } - - if (keepAliveProc) keepAliveProc(100); -#endif /* !KERNEL */ - } -} - -FX_EXPORT void FX_CSTYLE -gdbg_printf (const char *format, ...) -{ -#ifndef KERNEL - va_list args; - - va_start(args, format); - gdbg_vprintf(format,args); - va_end(args); -#elif defined( KERNEL_NT ) - va_list args; - - va_start(args, format); - EngDebugPrint( "\nHAL: ", format, args ); - va_end(args); -#else - __asm lea eax, (format+4); - __asm mov ebx, format; - MyPrintf(); -#endif /* #ifndef KERNEL */ - -} - -//---------------------------------------------------------------------- -// INFO message subroutines -//---------------------------------------------------------------------- - -//---------------------------------------------------------------------- -// display an INFO message if level <= debug level and return whether -// debug level high enough to allow display -//---------------------------------------------------------------------- -FX_EXPORT int FX_CSTYLE -gdbg_info (const int level, const char *format, ...) -{ - va_list args; -#ifndef KERNEL_NT - char newformat[4095]; -#endif - - if (!gdbg_debuglevel[level>=GDBG_MAX_LEVELS ? GDBG_MAX_LEVELS-1 : level]) - return(0); -#ifndef KERNEL - va_start(args, format); - sprintf(newformat, "%s.%d:\t", gdbg_myname,level); - strcat(newformat,format); - gdbg_vprintf(newformat,args); - va_end(args); -#elif defined( KERNEL_NT ) - gdbg_NTPrint( "%s.%d:\t", gdbg_myname, level ); - va_start(args, format); - EngDebugPrint( "", format, args ); - va_end(args); -#else /* #ifndef KERNEL */ - Debug_Printf("%s.%d:\t", gdbg_myname, level); - __asm lea eax, (format+4); - __asm mov ebx, format; - MyPrintf(); - FXUNUSED(args); - FXUNUSED(newformat[0]); -#endif /* #ifndef KERNEL */ - - return (1); -} - - -//---------------------------------------------------------------------- -// same as gdbg_info but does not display INFO header -//---------------------------------------------------------------------- -FX_EXPORT int FX_CSTYLE -gdbg_info_more (const int level, const char *format, ...) -{ - va_list args; - - if (!gdbg_debuglevel[level>=GDBG_MAX_LEVELS ? GDBG_MAX_LEVELS-1 : level]) - return(0); -#ifndef KERNEL - va_start(args, format); - gdbg_vprintf(format,args); - va_end(args); -#elif defined( KERNEL_NT ) - va_start(args, format); - EngDebugPrint( "\nHAL: ", format, args ); - va_end(args); -#else - __asm lea eax, (format+4); - __asm mov ebx, format; - MyPrintf(); - FXUNUSED(args); -#endif /* #ifndef KERNEL */ - return (1); -} - -static GDBGErrorProc errorProcList[3]; - -FX_EXPORT int FX_CSTYLE gdbg_error_set_callback(GDBGErrorProc p) -{ - int i; - const int count = sizeof(errorProcList) / sizeof(errorProcList[0]); - - for(i = 0; i < count; i++) { - if (errorProcList[i] == p) { - break; - } else if (errorProcList[i] == NULL) { - errorProcList[i] = p; - break; - } - } - - return (i < count); -} - -FX_EXPORT void FX_CSTYLE gdbg_error_clear_callback(GDBGErrorProc p) -{ - int i; - const int count = sizeof(errorProcList) / sizeof(errorProcList[0]); - - for(i = 0; i < count; i++) { - if (errorProcList[i] == p) { - errorProcList[i] = NULL; - break; - } - } -} - -//---------------------------------------------------------------------- -// ALL errors must come thru here, this subroutine adds a preamble -// and then displays the message and increments the error counter -//---------------------------------------------------------------------- -FX_EXPORT void FX_CSTYLE -gdbg_error (const char *kind, const char *format, ...) -{ -#ifndef KERNEL - va_list args; - - char newformat[1024]; - - va_start(args, format); - sprintf(newformat, "%s error (%s): ", gdbg_myname,kind); - strcat(newformat,format); // add a preamble to message - gdbg_vprintf(newformat,args); - gdbg_errors++; // increment the error counter - va_end(args); - - { - int i; - const int count = sizeof(errorProcList) / sizeof(errorProcList[0]); - - for(i = 0; i < count; i++) { - if (errorProcList[i] != NULL) { - va_start(args, format); - (*errorProcList[i])(kind, newformat, args); - va_end(args); - } - } - } -#elif defined( KERNEL_NT ) - va_list args; - - gdbg_NTPrint( "%s error (%s): ", gdbg_myname, kind); - va_start(args, format); - EngDebugPrint( "", format, args ); - va_end(args); -#else - Debug_Printf("%s error (%s): ", gdbg_myname, kind); - __asm lea eax, (format+4); - __asm mov ebx, format; - MyPrintf(); -#endif /* #ifndef KERNEL */ -} - -// return the error counter -FX_EXPORT int FX_CSTYLE -gdbg_get_errors(void) -{ - return gdbg_errors; -} - -// return a debuglevel level -FX_EXPORT int FX_CSTYLE -gdbg_get_debuglevel(const int level) -{ - return gdbg_debuglevel[level>=GDBG_MAX_LEVELS ? GDBG_MAX_LEVELS-1 : level]; -} - -// set a debuglevel level -FX_EXPORT void FX_CSTYLE -gdbg_set_debuglevel(const int level, const int value) -{ - gdbg_debuglevel[level>=GDBG_MAX_LEVELS ? GDBG_MAX_LEVELS-1 : level] = value; -} - -// open up a new output file -FX_EXPORT int FX_CSTYLE -gdbg_set_file(const char *name) -{ -#ifndef KERNEL - FILE *outf; - - if (gdbg_msgfile != stdout) { // close any existing output file - fclose(gdbg_msgfile); - gdbg_msgfile = stdout; - } - -#if USE_DEBUG_STRING - if (!strcmp(name, "DEBUG")) { - gdbg_msgfile = (FILE *) 1; - UseDebugString = 1; - } else -#endif /* USE_DEBUG_STRING */ - { - outf = fopen(name,"w"); // open up a new one - if (outf) gdbg_msgfile = outf; - } - - return (outf != NULL); -#else /* #ifndef KERNEL */ - return 0; -#endif /* #ifndef KERNEL */ -} diff --git a/glide2x/h3/minihwc/hwcext.h b/glide2x/h3/minihwc/hwcext.h deleted file mode 100644 index 55db621..0000000 --- a/glide2x/h3/minihwc/hwcext.h +++ /dev/null @@ -1,459 +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 -** -** File name: hwcext.h -** -** Description: Structures for the hwc extensions. -** -** $Header$ -** -** $History: hwcext.h $ -** -** ***************** Version 3 ***************** -** User: Dow Date: 3/17/99 Time: 6:14p -** Updated in $/Releases/Voodoo3/MT2/3Dfx/devel/H3/minihwc -** Fixes Phantom Menace, OGL, and others. -** -** ***************** Version 22 ***************** -** User: Michael Date: 2/26/99 Time: 10:21a -** Updated in $/devel/h3/Win95/dx/dd16 -** Proxy for KenW - These changes make alt-tab from winglide apps *much* -** more reliable. -** -** ***************** Version 21 ***************** -** User: Stuartb Date: 1/08/99 Time: 11:05a -** Updated in $/devel/h3/Win95/dx/dd16 -** Backed out LCDCTRL changes as advised by KMW. -** -** ***************** Version 20 ***************** -** User: Stuartb Date: 1/07/99 Time: 12:18p -** Updated in $/devel/h3/Win95/dx/dd16 -** Added HWCEXT_LCDCTRL for control panel flat panel ops. -** -** ***************** Version 19 ***************** -** User: Michael Date: 12/29/98 Time: 1:19p -** Updated in $/devel/h3/Win95/dx/dd16 -** Implement the 3Dfx/STB unified header. -** -*/ -#ifndef HWCEXT_H -#define HWCEXT_H - -#if !defined( WINNT ) && !defined( __linux__ ) - -#define WIN32_LEAN_AND_MEAN -#include - -/* -** D3D notification function -*/ - -extern void D3notify(void); - -#endif /* WINNT */ - -/* -** Constants -*/ -#define HWCEXT_PROTOCOLREV 0x1 - -#define HWCEXT_MAX_BASEADDR 0x9 -#define HWCEXT_MAX_COLORBUFFERS 0x3 - -/* The HWC escape */ -#define EXT_HWC 0xfd3 - -/******************************************************************** -** Here's the protocol: -*********************************************************************/ - -/* -** HWCEXT_GETDRIVERVERION -** -** INPUT: Nothing -** OUTPUT: Driver Major & Minor Version -*/ -#define HWCEXT_GETDRIVERVERSION 0x0 -typedef struct hwcExtDriverVersionRes_s { - FxU32 - major, /* Driver major version */ - minor; /* Driver minor version */ -} hwcExtDriverVersionRes_t; - -/* -** HWCEXT_ALLOCCONTEXT -** -** INPUT: Nothing -** OUTPUT: Context ID -*/ -#define HWCEXT_ALLOCCONTEXT 0x1 - - -#define HWCEXT_ABAPPTYPE_FSEM 0x0 /* Full-screen app */ -#define HWCEXT_ABAPPTYPE_WIND 0x1 /* Windowed app */ - -/* Given to HWCEXT_ALLOCCONTEXT */ -typedef struct hwcExtAllocContextReq_s { - FxU32 - protocolRev, /* Revision of this protocol */ - appType; /* FSEM or WIND */ -} hwcExtAllocContextReq_t; - -/* Returned from HWCEXT_ALLOCCONTEXT*/ -typedef struct hwcExtAllocContextRes_s { - FxU32 - contextID; -} hwcExtAllocContextRes_t; - -/* -** HWCEXT_GETDEVICECONFIG -** -** INPUT: Device number (0 for first, 1 for second....) -** OUTPUT: VendorID, deviceID, fbRAM, chip rev -*/ -#define HWCEXT_GETDEVICECONFIG 0x2 -/* Given to HWCEXT_GETDEVICECONFIG */ -typedef struct hwcExtDeviceConfigReq_s { - HDC - dc; /* Device context */ - FxU32 - devNo; /* Device number (0, 1, ...) */ -} hwcExtDeviceConfigReq_t; - -/* Returned from HWCEXT_GETDEVICECONFIG */ -typedef struct hwcExtDeviceConfigRes_s { - FxU32 - devNum, /* Device Number */ - vendorID, /* PCI Vendor ID */ - deviceID, /* PCI Device ID */ - fbRam, /* How much frame buuffer RAM */ - chipRev; /* Chip Revision */ - FxU32 - pciStride, /* 1024, 2048, 4096, 8192, 16384 */ - hwStride, /* hardware x-translation stride */ - tileMark; /* hardware tile addressing watermark */ -} hwcExtDeviceConfigRes_t; - -/* -** HWCEXT_GETLINEARADDR -** -** INPUT: Device number -** OUTPUT: Number of base addresses, base address list -*/ -#define HWCEXT_GETLINEARADDR 0x3 -/* Given to HWCEXT_GETLINEARADDR */ -typedef struct hwcExtLinearAddrReq_s { - FxU32 devNum; /* Device Number */ - FxU32 pHandle; /* Process Handle */ -} hwcExtLinearAddrReq_t; - -/* Returned from HWCEXT_GETLINEARADDR */ -typedef struct hwcExtLinearAddrRes_s { - FxU32 - numBaseAddrs, /* # base addresses */ - baseAddresses[HWCEXT_MAX_BASEADDR]; /* linear Addresses */ -} hwcExtLinearAddrRes_t; - -/* -** HWCEXT_ALLOCFIFO -** -** OBSOLTE: Do not use -*/ -#define HWCEXT_ALLOCFIFO 0x4 - -typedef struct hwcExtAllocFIFORes_s { - FxU32 - commandBuffer, /* Command buffer */ - commandBufferSz, /* Size of command buffer */ - psBuffer, /* Persistent state buffer */ - psBufferSz; /* Size of persistent state buffer */ -} hwcExtAllocFIFORes_t; - -/* -** HWCEXT_EXECUTEFIFO -** -** INPUT: ptr to FIFO buffer, fifosize, persistent state FIFO & size -** OUTPUT: Status only. -** -*/ -#define HWCEXT_EXECUTEFIFO 0x5 - -/* Given to HWCEXT_EXECUTEFIFO */ -typedef struct hwcExtExecuteFifoReq_s { - /* NB: These fields must be first to support old drivers that do not - * support multiple fifo types. - */ - FxU32 - fifoPtr, /* Linear address of command stream to execute */ - fifoSize, /* Size of command stream (DWORDS) */ - statePtr, /* Linear address of persistent state buffer */ - stateSize; /* Size of persistent state buffer (DWORDS) */ - - FxU32 - fifoType; /* One of HWCEXT_FIFO_XXXX */ - - /* These are only necessary if fifoType != HWCEXT_FIFO_HOST */ - FxU32 - fifoOffset, /* HW relative address of command stream */ - stateOffset, /* HW relative address of state buffer */ - sentinalOffset, /* HW relative address of buffer to write serialNumber */ - serialNumber; /* Client specified value to write to indicate that the - * current command stream has been committed by the hw. - */ -} hwcExtExecuteFifoReq_t; - -/* -** HWCEXT_QUERYCONTEXT -** -** INPUT: Context ID -** OUTPUT: Status -*/ -#define HWCEXT_QUERYCONTEXT 0x6 - -#define HWC_CONTEXT_ACTIVE 0x0 -#define HWC_CONTEXT_LOST 0x1 - -/* -** HWCEXT_RELEASECONTEXT -** -** INPUT: Context ID -** OUTPUT: Status -*/ -#define HWCEXT_RELEASECONTEXT 0x7 - -/* Given to HWCEXT_RELEASECONTEXT */ -typedef struct hwcExtReleaseContextReq_s { - FxU32 - contextID; /* duh */ -} hwcExtReleaseContextReq_t; - -#define HWCEXT_HWCSETEXCLUSIVE 0x8 -#define HWCEXT_HWCRLSEXCLUSIVE 0x9 - -/* -** HWCEXT_I2C_WRITE_REQ -** -** INPUT: i2c address, register number, dwValue to write -** OUTPUT: status (FXTRUE if OK, FXFALSE if fail, I2C_BUSY if busy) -*/ - -#define HWCEXT_I2C_WRITE_REQ 0xa - -typedef struct hwcExtI2CwriteReq_s { - FxU32 deviceAddress; /* bus address of device */ - FxU32 i2c_regNum; /* sometimes called subaddress */ - FxU32 i2c_regValue; /* the value to write */ -} hwcExtI2CwriteReq_t; - -/* -** HWCEXT_I2C_READ_REQ -** -** INPUT: i2c address, register number -** OUTPUT: status (FXTRUE if OK, FXFALSE if fail, I2C_BUSY if busy) -** value read: optRes.i2c_ReadRes.i2c_regValue -*/ - -#define HWCEXT_I2C_READ_REQ 0xb - -typedef struct hwcExtI2CreadReq_s { - FxU32 deviceAddress; /* bus address of device */ - FxU32 i2c_regNum; /* sometimes called subaddress */ -} hwcExtI2CreadReq_t; - -#define HWCEXT_I2C_READ_RES 0xc - -typedef struct hwcExtI2CreadRes_s { - FxU32 i2c_regValue; /* the value read from reg above */ -} hwcExtI2CreadRes_t; - -/* -** HWCEXT_I2C_WRITE_REQ -** -** INPUT: i2c address, register number, dwValue to write -** OUTPUT: status (FXTRUE if OK, FXFALSE if fail, I2C_BUSY if busy) -*/ - -#define HWCEXT_I2C_MULTI_WRITE_REQ 0xd -typedef struct hwcExtI2CmultiWriteReq_s { - FxU32 deviceAddress; /* bus address of device */ - FxU32 i2c_regNum; /* sometimes called subaddress */ - FxU8 *i2c_regValues; /* the value to write */ - FxU32 i2c_numBytes; /* number of bytes to xfer */ -} hwcExtI2CmultiWriteReq_t; - - -/* -** HWCEXT_GETAGPINFO -** -** Get the relavent AGP info: linear address, physical address, size. -*/ -#define HWCEXT_GETAGPINFO 0xe -typedef struct hwcExtAGPInfoRes_s { - FxU32 - lAddr, /* Linear Address of AGP memory */ - pAddr, /* Physical Address of AGP memory */ - size; /* Size */ -} hwcExtAGPInfoRes_t; - -/* -** HWCEXT_VIDTIMING -** -** Send the FxVidTiming structure to the driver. -** -*/ -#define HWCEXT_VIDTIMING 0xf -typedef struct hwcExtVidTimingReq_s { - void *vidTiming; -} hwcExtVidTimingReq_t; - -/* HWCEXT_FIFOINFO - * - * Find out information about the current physcal location of the - * current command fifo. - */ -#define HWCEXT_FIFOINFO 0x10UL - -#define HWCEXT_FIFO_INVALID 0x00UL -#define HWCEXT_FIFO_FB 0x01UL /* FIFO in frame buffer */ -#define HWCEXT_FIFO_HOST 0x02UL /* FIFO in host memory */ -#define HWCEXT_FIFO_AGP 0x03UL /* FIFO in AGP */ - -typedef struct { - FxU32 fifoType; -} hwcExtFifoInfoRes_t; - -/* Returns the offset that a linear address is from a given 'base' - * linear page address. This offset is suitable for use as a hw - * relative address for buffers etc. - * - * mapAddr: Linear address used to be the 'base' of the physical - * address also mapped by remapAddr. - * remapAddr: Target linear addr to compute the offset for. - */ -#define HWCEXT_LINEAR_MAP_OFFSET 0x11UL - -typedef struct { - FxU32 - mapAddr, - remapAddr; -} hwcExtLinearMapInfoReq_t; - -typedef struct { - FxU32 linAddrOffset; -} hwcExtLinearMapInfoRes_t; - -/* HWCEXT_GAMMATABLE_DOWNLOAD - * - * Downloads a gamma table from Glide that is then impressed upon - * the hardware. This is a transient gamma, and is not preserved - * in the registry or anywhere in the drivers. There is no answer - * or status return. - * - * INPUT: a pointer to a complete gamma table (256 entries) - * - * OUTPUT: none - */ -#define HWCEXT_DOWNLOAD_GAMMA 0x12UL - -typedef struct { - FxU32 gammaPtr; - FxI32 numGammaEntries; -} hwcExtDownloadGammaReq_t; - - -/* HWCEXT_RESTORE_DESKTOP - * - * Restores the video settings to those of the desktop before glide - * exclusive mode took over. We need this because there are cases where - * we do not get a mode set call (Enable1) when task-switching (e.g., ALT-TAB) - * out of exclusive mode glide apps. We do this by calling the same function - * that is used to restore the desktop when returning from full screen - * DOS mode. This resets video, the cmdfifo, the desktop's cursor, sets - * some overlay video flags saying that the desktop was reset, etc. - * - * INPUT: none - * OUTPUT: none - */ -#define HWCEXT_RESTORE_DESKTOP 0x13UL - - - -/* -** The Request structure (given as input data to ExtEscape() ) -*/ -typedef struct hwcExtRequest_s { - FxU32 - contextID, /* ID of this context */ - which; /* Which request */ - union reqOptData { - hwcExtAllocContextReq_t allocContextReq; - hwcExtDeviceConfigReq_t deviceConfigReq; - hwcExtLinearAddrReq_t linearAddrReq; - hwcExtExecuteFifoReq_t executeFifoReq; - hwcExtReleaseContextReq_t releaseContextReq; - hwcExtI2CwriteReq_t i2c_WriteReq; - hwcExtI2CreadReq_t i2c_ReadReq; - hwcExtI2CmultiWriteReq_t i2c_MultiWriteReq; - hwcExtVidTimingReq_t vidTimingReq; - hwcExtLinearMapInfoReq_t mapInfoReq; - hwcExtDownloadGammaReq_t gamma; - } optData; -} hwcExtRequest_t; - -typedef struct hwcExtResult_s { - FxI32 - resStatus; - union resOptData { - hwcExtDriverVersionRes_t driverVersionRes; - hwcExtAllocContextRes_t allocContextRes; - hwcExtDeviceConfigRes_t deviceConfigRes; - hwcExtLinearAddrRes_t linearAddressRes; - hwcExtAllocFIFORes_t allocFifoRes; - hwcExtI2CreadRes_t i2c_ReadRes; - hwcExtAGPInfoRes_t agpInfoRes; - hwcExtFifoInfoRes_t fifoInfoRes; - hwcExtLinearMapInfoRes_t mapInfoRes; - /* no result for gamma download */ - } optData; -} hwcExtResult_t; - -#ifdef WINNT -/* - * Global structure used to store Glide state, used by the display driver - * - * This will need changing if one driver supports multiple boards. - * - */ - -typedef struct -{ - LONG glideGDIFlags; /* For cooperation with GDI. (Exclusive flag) */ - HANDLE glideProcessHandle; /* Handle of glide process that last mapped membases */ - BYTE* glideRegBase; /* Saved glide register base address */ - BYTE* glideLfbBase; /* Saved glide Lfb base address - for mapping only */ - BYTE* glideScreenBase; /* Saved glide screen base address - used by glide. */ - - ULONG vidProcCfg; - ULONG vidDesktopOverlayStride; -} GLIDESTATE; - -extern GLIDESTATE glideState; -#endif /* WINNT */ - -#endif /* HWCEXT_H not defined */ diff --git a/glide2x/h3/minihwc/hwcio.c b/glide2x/h3/minihwc/hwcio.c deleted file mode 100644 index caab19e..0000000 --- a/glide2x/h3/minihwc/hwcio.c +++ /dev/null @@ -1,808 +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 3/17/99 6:14p Dow -** Fixes Phantom Menace, OGL, and others. -** -** 1 3/04/98 4:13p Dow -** -*/ - - -char * ioRegNames[] = { - "status", - "pciInit0", - "sipMonitor", - "lfbMemoryConfig", - "miscInit0", - "miscInit1", - "dramInit0", - "dramInit1", - "agpInit", - "tmuGbeInit", - "vgaInit0", - "vgaInit1", - "dramCommand", - "dramData", - "reservedZ0", - "reservedZ1", - "pllCtrl0", - "pllCtrl1", - "pllCtrl2", - "dacMode", - "dacAddr", - "dacData", - "vidMaxRGBDelta", - "vidProcCfg", - "hwCurPatAddr", - "hwCurLoc", - "hwCurC0", - "hwCurC1", - "vidInFormat", - "vidInStatus", - "vidSerialParallelPort", - "vidInXDecimDeltas", - "vidInDecimInitErrs", - "vidInYDecimDeltas", - "vidPixelBufThold", - "vidChromaMin", - "vidChromaMax", - "vidCurrentLine", - "vidScreenSize", - "vidOverlayStartCoords", - "vidOverlayEndScreenCoord", - "vidOverlayDudx", - "vidOverlayDudxOffsetSrcWidth", - "vidOverlayDvdy", - "vgaRegister00", - "vgaRegister01", - "vgaRegister02", - "vgaRegister03", - "vgaRegister04", - "vgaRegister05", - "vgaRegister06", - "vgaRegister07", - "vgaRegister08", - "vgaRegister09", - "vgaRegister0a", - "vgaRegister0b", - "vidOverlayDvdyOffset", - "vidDesktopStartAddr", - "vidDesktopOverlayStride", - "vidInAddr0", - "vidInAddr1", - "vidInAddr2", - "vidInStride", - "vidCurrOverlayStartAddr" -}; - -char *cmdAGPRegNames[] = { - // AGP - "agpReqSize", - "hostAddrLow", - "hostAddrHigh", - "graphicsAddr", - "graphicsStride", - "moveCMD", - "reservedL0", - "reservedL1", - // CMD FIFO 0 - "baseAddrL0", - "baseSize0", - "bump0", - "readPtrL0", - "readPtrH0", - "aMin0", - "unusedA0", - "aMax0", - "unusedB0", - "depth0", - "holeCount0", - "reserved0", - // CMD FIFO 1 - "baseAddrL1", - "baseSize1", - "bump1", - "readPtrL1", - "readPtrH1", - "aMin1", - "unusedA1", - "aMax1", - "unusedB1", - "depth1", - "holeCount1", - "reserved1", - "cmdFifoThresh", - - "reservedO00", - "reservedO01", - "reservedO02", - "reservedO03", - "reservedO04", - "reservedO05", - "reservedO06", - "reserved007", - "reservedP00", - "reservedP01", - "reservedP02", - "reservedP03", - "reservedP04", - "reservedP05", - "reservedP06", - "reservedP07", - "reservedQ00", - "reservedQ01", - "reservedQ02", - "reservedQ03", - "reservedQ04", - "reservedQ05", - "reservedQ06", - "reservedQ07", - "reservedR00", - "reservedR01", - "reservedR02", - "reservedR03", - "reservedR04", - "reservedR05", - "reservedR06", - "reservedR07", - - // misc - "yuvBaseAddr", - "yuvStride" -}; - -char *waxRegNames[] = { - "status", - "unused0", - "clip0min", - "clip0max", - "dstBaseAddr", - "dstFormat", - "srcColorkeyMin", - "srcColorkeyMax", - "dstColorkeyMin", - "dstColorkeyMax", - "bresError0", - "bresError1", - "rop", - "srcBaseAddr", - "commandEx", - "lineStipple", - "lineStyle", - "pattern0alias", - "pattern1alias", - "clip1min", - "clip1max", - "srcFormat", - "srcSize", - "srcXY", - "colorBack", - "colorFore", - "dstSize", - "dstXY", - "command", - "reserved00", - "reserved01", - "reserved02", - "launch00", - "launch01", - "launch02", - "launch03", - "launch04", - "launch05", - "launch06", - "launch07", - "launch08", - "launch09", - "launch0A", - "launch0B", - "launch0C", - "launch0D", - "launch0E", - "launch0F", - "launch10", - "launch11", - "launch12", - "launch13", - "launch14", - "launch15", - "launch16", - "launch17", - "launch18", - "launch19", - "launch1A", - "launch1B", - "launch1C", - "launch1D", - "launch1E", - "launch1F", - "colorPattern00", - "colorPattern01", - "colorPattern02", - "colorPattern03", - "colorPattern04", - "colorPattern05", - "colorPattern06", - "colorPattern07", - "colorPattern08", - "colorPattern09", - "colorPattern0A", - "colorPattern0B", - "colorPattern0C", - "colorPattern0D", - "colorPattern0E", - "colorPattern0F", - "colorPattern10", - "colorPattern11", - "colorPattern12", - "colorPattern13", - "colorPattern14", - "colorPattern15", - "colorPattern16", - "colorPattern17", - "colorPattern18", - "colorPattern19", - "colorPattern1A", - "colorPattern1B", - "colorPattern1C", - "colorPattern1D", - "colorPattern1E", - "colorPattern1F", - "colorPattern20", - "colorPattern21", - "colorPattern22", - "colorPattern23", - "colorPattern24", - "colorPattern25", - "colorPattern26", - "colorPattern27", - "colorPattern28", - "colorPattern29", - "colorPattern2A", - "colorPattern2B", - "colorPattern2C", - "colorPattern2D", - "colorPattern2E", - "colorPattern2F", - "colorPattern30", - "colorPattern31", - "colorPattern32", - "colorPattern33", - "colorPattern34", - "colorPattern35", - "colorPattern36", - "colorPattern37", - "colorPattern38", - "colorPattern39", - "colorPattern3A", - "colorPattern3B", - "colorPattern3C", - "colorPattern3D", - "colorPattern3E", - "colorPattern3F", - "colorTransLut000", - "colorTransLut001", - "colorTransLut002", - "colorTransLut003", - "colorTransLut004", - "colorTransLut005", - "colorTransLut006", - "colorTransLut007", - "colorTransLut008", - "colorTransLut009", - "colorTransLut00A", - "colorTransLut00B", - "colorTransLut00C", - "colorTransLut00D", - "colorTransLut00E", - "colorTransLut00F", - "colorTransLut010", - "colorTransLut011", - "colorTransLut012", - "colorTransLut013", - "colorTransLut014", - "colorTransLut015", - "colorTransLut016", - "colorTransLut017", - "colorTransLut018", - "colorTransLut019", - "colorTransLut01A", - "colorTransLut01B", - "colorTransLut01C", - "colorTransLut01D", - "colorTransLut01E", - "colorTransLut01F", - "colorTransLut020", - "colorTransLut021", - "colorTransLut022", - "colorTransLut023", - "colorTransLut024", - "colorTransLut025", - "colorTransLut026", - "colorTransLut027", - "colorTransLut028", - "colorTransLut029", - "colorTransLut02A", - "colorTransLut02B", - "colorTransLut02C", - "colorTransLut02D", - "colorTransLut02E", - "colorTransLut02F", - "colorTransLut030", - "colorTransLut031", - "colorTransLut032", - "colorTransLut033", - "colorTransLut034", - "colorTransLut035", - "colorTransLut036", - "colorTransLut037", - "colorTransLut038", - "colorTransLut039", - "colorTransLut03A", - "colorTransLut03B", - "colorTransLut03C", - "colorTransLut03D", - "colorTransLut03E", - "colorTransLut03F", - "colorTransLut040", - "colorTransLut041", - "colorTransLut042", - "colorTransLut043", - "colorTransLut044", - "colorTransLut045", - "colorTransLut046", - "colorTransLut047", - "colorTransLut048", - "colorTransLut049", - "colorTransLut04A", - "colorTransLut04B", - "colorTransLut04C", - "colorTransLut04D", - "colorTransLut04E", - "colorTransLut04F", - "colorTransLut050", - "colorTransLut051", - "colorTransLut052", - "colorTransLut053", - "colorTransLut054", - "colorTransLut055", - "colorTransLut056", - "colorTransLut057", - "colorTransLut058", - "colorTransLut059", - "colorTransLut05A", - "colorTransLut05B", - "colorTransLut05C", - "colorTransLut05D", - "colorTransLut05E", - "colorTransLut05F", - "colorTransLut060", - "colorTransLut061", - "colorTransLut062", - "colorTransLut063", - "colorTransLut064", - "colorTransLut065", - "colorTransLut066", - "colorTransLut067", - "colorTransLut068", - "colorTransLut069", - "colorTransLut06A", - "colorTransLut06B", - "colorTransLut06C", - "colorTransLut06D", - "colorTransLut06E", - "colorTransLut06F", - "colorTransLut070", - "colorTransLut071", - "colorTransLut072", - "colorTransLut073", - "colorTransLut074", - "colorTransLut075", - "colorTransLut076", - "colorTransLut077", - "colorTransLut078", - "colorTransLut079", - "colorTransLut07A", - "colorTransLut07B", - "colorTransLut07C", - "colorTransLut07D", - "colorTransLut07E", - "colorTransLut07F", - "colorTransLut080", - "colorTransLut081", - "colorTransLut082", - "colorTransLut083", - "colorTransLut084", - "colorTransLut085", - "colorTransLut086", - "colorTransLut087", - "colorTransLut088", - "colorTransLut089", - "colorTransLut08A", - "colorTransLut08B", - "colorTransLut08C", - "colorTransLut08D", - "colorTransLut08E", - "colorTransLut08F", - "colorTransLut090", - "colorTransLut091", - "colorTransLut092", - "colorTransLut093", - "colorTransLut094", - "colorTransLut095", - "colorTransLut096", - "colorTransLut097", - "colorTransLut098", - "colorTransLut099", - "colorTransLut09A", - "colorTransLut09B", - "colorTransLut09C", - "colorTransLut09D", - "colorTransLut09E", - "colorTransLut09F", - "colorTransLut0A0", - "colorTransLut0A1", - "colorTransLut0A2", - "colorTransLut0A3", - "colorTransLut0A4", - "colorTransLut0A5", - "colorTransLut0A6", - "colorTransLut0A7", - "colorTransLut0A8", - "colorTransLut0A9", - "colorTransLut0AA", - "colorTransLut0AB", - "colorTransLut0AC", - "colorTransLut0AD", - "colorTransLut0AE", - "colorTransLut0AF", - "colorTransLut0B0", - "colorTransLut0B1", - "colorTransLut0B2", - "colorTransLut0B3", - "colorTransLut0B4", - "colorTransLut0B5", - "colorTransLut0B6", - "colorTransLut0B7", - "colorTransLut0B8", - "colorTransLut0B9", - "colorTransLut0BA", - "colorTransLut0BB", - "colorTransLut0BC", - "colorTransLut0BD", - "colorTransLut0BE", - "colorTransLut0BF", - "colorTransLut0C0", - "colorTransLut0C1", - "colorTransLut0C2", - "colorTransLut0C3", - "colorTransLut0C4", - "colorTransLut0C5", - "colorTransLut0C6", - "colorTransLut0C7", - "colorTransLut0C8", - "colorTransLut0C9", - "colorTransLut0CA", - "colorTransLut0CB", - "colorTransLut0CC", - "colorTransLut0CD", - "colorTransLut0CE", - "colorTransLut0CF", - "colorTransLut0D0", - "colorTransLut0D1", - "colorTransLut0D2", - "colorTransLut0D3", - "colorTransLut0D4", - "colorTransLut0D5", - "colorTransLut0D6", - "colorTransLut0D7", - "colorTransLut0D8", - "colorTransLut0D9", - "colorTransLut0DA", - "colorTransLut0DB", - "colorTransLut0DC", - "colorTransLut0DD", - "colorTransLut0DE", - "colorTransLut0DF", - "colorTransLut0E0", - "colorTransLut0E1", - "colorTransLut0E2", - "colorTransLut0E3", - "colorTransLut0E4", - "colorTransLut0E5", - "colorTransLut0E6", - "colorTransLut0E7", - "colorTransLut0E8", - "colorTransLut0E9", - "colorTransLut0EA", - "colorTransLut0EB", - "colorTransLut0EC", - "colorTransLut0ED", - "colorTransLut0EE", - "colorTransLut0EF", - "colorTransLut0F0", - "colorTransLut0F1", - "colorTransLut0F2", - "colorTransLut0F3", - "colorTransLut0F4", - "colorTransLut0F5", - "colorTransLut0F6", - "colorTransLut0F7", - "colorTransLut0F8", - "colorTransLut0F9", - "colorTransLut0FA", - "colorTransLut0FB", - "colorTransLut0FC", - "colorTransLut0FD", - "colorTransLut0FE", - "colorTransLut0FF" -}; - -char *sstRegNames[] = { - "status", - "intrCtrl", - "vAx", - "vAy", - "vBx", - "vBy", - "vCx", - "vCy", - - "r", - "g", - "b", - "z", - "a", - "s", - "t", - "w", - - "drdx", - "dgdx", - "dbdx", - "dzdx", - "dadx", - "dsdx", - "dtdx", - "dwdx", - - "drdy", - "dgdy", - "dbdy", - "dzdy", - "dady", - "dsdy", - "dtdy", - "dwdy", - - "triangleCMD", - "reservedA", - "FvA", - "FvA", - "FvB", - "FvB", - "FvC", - "FvC", - - "Fr", - "Fg", - "Fb", - "Fz", - "Fa", - "Fs", - "Ft", - "Fw", - - "Fdrdx", - "Fdgdx", - "Fdbdx", - "Fdzdx", - "Fdadx", - "Fdsdx", - "Fdtdx", - "Fdwdx", - - "Fdrdy", - "Fdgdy", - "Fdbdy", - "Fdzdy", - "Fdady", - "Fdsdy", - "Fdtdy", - "Fdwdy", - - "FtriangleCMD", - "fbzColorPath", - "fogMode", - "alphaMode", - "fbzMode", - "lfbMode", - "clipLeftRight", - "clipBottomTop", - - "nopCMD", - "fastfillCMD", - "swapbufferCMD", - "fogColor", - "zaColor", - "chromaKey", - "chromaRange", - "userIntrCmd", - - "stipple", - "c0", - "c1", - "fbiPixelsIn", - "fbiChromaFail", - "fbiZfuncFail", - "fbiAfuncFail", - "fbiPixelsOut", - - "fogTable00", - "fogTable01", - "fogTable02", - "fogTable03", - "fogTable04", - "fogTable05", - "fogTable06", - "fogTable07", - "fogTable08", - "fogTable09", - "fogTable0A", - "fogTable0B", - "fogTable0C", - "fogTable0D", - "fogTable0E", - "fogTable0F", - "fogTable10", - "fogTable11", - "fogTable12", - "fogTable13", - "fogTable14", - "fogTable15", - "fogTable16", - "fogTable17", - "fogTable18", - "fogTable19", - "fogTable1A", - "fogTable1B", - "fogTable1C", - "fogTable1D", - "fogTable1E", - "fogTable1F", - - "reservedB0", - "reservedB1", - "reservedB2", - - "colBufferAddr", - "colBufferStride", - "auxBufferAddr", - "auxBufferStride", - "reservedC", - - "clipLeftRight1", - "clipBottomTop1", - "reservedD00", - "reservedD01", - "reservedD02", - "reservedD03", - "reservedD04", - "reservedD05", - - "reservedE00", - "reservedE01", - "reservedE02", - "reservedE03", - "reservedE04", - "reservedE05", - - "reservedF0", - "reservedF1", - "reservedF2", - "swapBufferPend", - "leftOverlayBuf", - "rightOverlayBuf", - "fbiSwapHistory", - "fbiTrianglesOut", - - "sSetupMode", - "sVx", - "sVy", - "sARGB", - "sRed", - "sGreen", - "sBlue", - "sAlpha", - - "sVz", - "sOowfbi", - "sOow0", - "sSow0", - "sTow0", - "sOow1", - "sSow1", - "sTow1", - - "sDrawTriCMD", - "sBeginTriCMD", - "reservedG00", - "reservedG01", - "reservedG02", - "reservedG03", - "reservedG04", - "reservedG05", - - "reservedH00", - "reservedH01", - "reservedH02", - "reservedH03", - "reservedH04", - "reservedH05", - - "reservedI00", - "reservedI01", - "reservedI02", - "reservedI03", - "reservedI04", - "reservedI05", - - "textureMode", - "tLOD", - "tDetail", - "texBaseAddr", - "texBaseAddr1", - "texBaseAddr2", - "texBaseAddr38", - "trexInit0", - "trexInit1", - - "nccTable000", - "nccTable001", - "nccTable002", - "nccTable003", - "nccTable004", - "nccTable005", - "nccTable006", - "nccTable007", - "nccTable008", - "nccTable009", - "nccTable00A", - "nccTable00B", - - "nccTable100", - "nccTable101", - "nccTable102", - "nccTable103", - "nccTable104", - "nccTable105", - "nccTable106", - "nccTable107", - "nccTable108", - "nccTable109", - "nccTable10A", - "nccTable10B", - - "tChromaKeyMin", - "tChromaKeyMax" -}; diff --git a/glide2x/h3/minihwc/hwcio.h b/glide2x/h3/minihwc/hwcio.h deleted file mode 100644 index dd0afe6..0000000 --- a/glide2x/h3/minihwc/hwcio.h +++ /dev/null @@ -1,83 +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 3/17/99 6:14p Dow -** Fixes Phantom Menace, OGL, and others. -** -** 2 3/11/98 8:27p Dow -** WinGlide -** -** 1 3/04/98 4:13p Dow -** -*/ -#ifndef HWCIO_H -#define HWCIO_H - -extern char *ioRegNames[]; -extern char *cmdAGPRegNames[]; -extern char *waxRegNames[]; -extern char *sstRegNames[]; - -/* -** I/O Macros -*/ -#define HWC_IO_STORE(regInfo, reg, val)\ -GDBG_INFO(120, "Storing 0x%x to IO Register %s\n", val,\ - ioRegNames[(offsetof(SstIORegs, reg)) >> 2]);\ -((SstIORegs *) regInfo.ioMemBase)->reg = val - -#define HWC_IO_LOAD(regInfo, reg, val)\ -val = ((SstIORegs *) regInfo.ioMemBase)->reg;\ -GDBG_INFO(120, "Loaded 0x%x from IO Register %s\n", val,\ - ioRegNames[(offsetof(SstIORegs, reg)) >> 2]); - -#define HWC_CAGP_STORE(regInfo, reg, val)\ -GDBG_INFO(120, "Storing 0x%x to CAGP Register %s\n", val,\ - cmdAGPRegNames[(offsetof(SstCRegs, reg)) >> 2]);\ -((SstCRegs *) (regInfo.cmdAGPBase))->reg = val - -#define HWC_CAGP_LOAD(regInfo, reg, val)\ -val = ((SstCRegs *) (regInfo).cmdAGPBase)->reg;\ -GDBG_INFO(120, "Loaded 0x%x from CAGP Register %s\n", val,\ - cmdAGPRegNames[(offsetof(SstCRegs, reg)) >> 2]); - -#define HWC_WAX_STORE(regInfo, reg, val)\ -GDBG_INFO(120, "Storing 0x%x to WAX Register %s\n", val,\ - waxRegnames[(offsetof(SstGRegs, reg)) >> 2]);\ -((SstGRegs *) regInfo->waxRegs)->reg = val - -#define HWC_WAX_LOAD(regInfo, reg, val)\ -val = ((SstGRegs *) regInfo->waxRegs)->reg;\ -GDBG_INFO(120, "Loaded 0x%x from WAX Register %s\n", val,\ - waxRegnames[(offsetof(SstGRegs, reg)) >> 2]); - -#define HWC_SST_STORE(regInfo, reg, val)\ -GDBG_INFO(120, "Storing 0x%x to 3D Register %s\n", val,\ - sstRegNames[(offsetof(SstRegs, reg)) >> 2]);\ -((SstRegs *) regInfo->sstRegs)->reg = val - -#define HWC_SST_LOAD(regInfo, reg, val)\ -val = ((SstRegs *) regInfo->sstRegs)->reg;\ -GDBG_INFO(120, "Loaded 0x%x from WAX Register %s\n", val,\ - sstRegNames[(offsetof(SstRegs, reg)) >> 2]); - -#endif /* HWCIO_H not defined */ diff --git a/glide2x/h3/minihwc/initvga.h b/glide2x/h3/minihwc/initvga.h deleted file mode 100644 index d61b7ee..0000000 --- a/glide2x/h3/minihwc/initvga.h +++ /dev/null @@ -1,121 +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$ -** -*/ - -#ifndef _INITVGA_H_ -#define _INITVGA_H_ - -#if defined(__WATCOMC__) -#define _inp inp -#define _outp outp -#define _outpw outpw -#endif - -/* -** Some Standard VGA Registers -*/ -/* Reading */ -#define VGA_MISC_OUTPUT_READ 0x3cc - -/* Writing */ -#define VGA_MISC_OUTPUT_WRITE 0x3c2 - -/* Read/Write */ -#define VGA_REGISTER_INPUT_STATUS_1_MONO 0x3BA -#define VGA_REGISTER_INPUT_STATUS_1_COLOR 0x3DA -#define VGA_INPUT_STATUS_1C 0x3DA -#define VIS1C_PIXEL_DISPLAY_INACTIVE BIT(0) -#define VIS1C_VERTICAL_RETRACE_ACTIVE BIT(3) - -#define VGA_REGISTER_CRTC 0x3D4 -#define VR_CRTC_SERIAL_START_ADDRESS_HI_INDEX 0x0C -#define VR_CRTC_SERIAL_START_ADDRESS_LO_INDEX 0x0D -#define AR_CRTC_SERIAL_OVERFLOW_INDEX 0x1C - -/* General Port I/O */ -#ifdef GDBG_INFO_ON - -#define OUTP(port,val)\ -GDBG_INFO((80, "%s: Writing 0x%x to port 0x%x\n", FN_NAME, val, port));\ -_outp(port, val) - -#define OUTPW(port,val)\ -GDBG_INFO((80, "%s: Writing 0x%x to port 0x%x\n", FN_NAME, val, port));\ -_outpw(port, val) - - -#define INP(port, val)\ -val = _inp(port);\ -GDBG_INFO((80, "%s: Read 0x%x from port 0x%x\n", FN_NAME, val, port)) - -#define INPW(port, val)\ -val = _inpW(port);\ -GDBG_INFO((80, "%s: Read 0x%x from port 0x%x\n", FN_NAME, val, port)) - -#else - -#define OUTP(port, val) _outp(port, val) -#define INP(port, val) val = _inp(port) - -#define OUTPW(port, val) _outpw(port, val) -#define INPW(port, val) val = _inpw(port) - -#endif - -/* Macros for Sequencer registers */ -#define SEQU_INDEX 0x3c4 -#define SEQU_DATA 0x3c5 - -/* Macros for CRTC registers */ -#define CRTC_INDEX 0x3d4 -#define CRTC_DATA 0x3d5 - -#ifdef GDBG_INFO_ON - -#define SEQU_SET(reg,val)\ -GDBG_INFO((80, "%s: Writing 0x%x to Sequencer Index 0x%x\n", FN_NAME, val, reg));\ -_outp(SEQU_INDEX, reg); _outp(SEQU_DATA, val) -#define SEQU_GET(reg,val)\ -_outp(SEQU_INDEX, reg);val = _inp(SEQU_DATA);\ -GDBG_INFO((80, "%s: Read 0x%x from Sequencer Index 0x%x\n", val, reg)); - -#define CRTC_SET(reg,val)\ -GDBG_INFO((80, "%s: Writing 0x%x to CRTC Index 0x%x\n", FN_NAME, val, reg));\ -_outp(CRTC_INDEX, reg); _outp(CRTC_DATA, val) -#define CRTC_GET(reg,val)\ -_outp(CRTC_INDEX, reg); val = _inp(CRTC_DATA);\ -GDBG_INFO((80, "%s: Read 0x%x from CRTC Index 0x%x\n", FN_NAME, val, reg)) - -#else - -#define SEQU_SET(reg,val) _outp(SEQU_INDEX, reg); _outp(SEQU_DATA, val) -#define SEQU_GET(reg,val) _outp(SEQU_INDEX, reg); val = _inp(SEQU_DATA) - -#define CRTC_SET(reg,val) _outp(CRTC_INDEX, reg); _outp(CRTC_DATA, val) -#define CRTC_GET(reg,d) _outp(CRTC_INDEX, reg); d = _inp(CRTC_DATA) - -#endif - - -#endif /* _INITVGA_H_ */ diff --git a/glide2x/h3/minihwc/linhwc.c b/glide2x/h3/minihwc/linhwc.c deleted file mode 100644 index 8193999..0000000 --- a/glide2x/h3/minihwc/linhwc.c +++ /dev/null @@ -1,1256 +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 -*/ - -/* - We need to provide the following functions: - -char * -hwcGetErrorString(void); - -hwcInfo * -hwcInit(FxU32 vID, FxU32 dID); - -FxBool -hwcMapBoard(hwcBoardInfo *bInfo, FxU32 bAddrMask); - -FxBool -hwcInitRegisters(hwcBoardInfo *bInfo); - -FxBool -hwcAllocBuffers(hwcBoardInfo *bInfo, FxU32 nColBuffers, FxU32 nAuxBuffers); - -FxBool -hwcInitFifo(hwcBoardInfo *bInfo); - -FxU32 -hwcInitAGPFifo(hwcBoardInfo *bInfo); - -FxBool -hwcInitVideo(hwcBoardInfo *bInfo, FxBool tiled, FxVideoTimingInfo - *vidTiming, FxBool overlay); - -FxBool -hwcRestoreVideo(hwcBoardInfo *bInfo); - -FxBool -hwcCheckMemSize(hwcBoardInfo *bInfo, FxU32 xres, FxU32 yres, FxU32 nColBuffers, - FxU32 nAuxBuffers, FxBool tiled); -*/ - -#include -#include -#include -#include -#include -#include -#include -#include - -static FxU32 fenceVar; -#define P6FENCE asm("xchg %%eax, %0" : : "m" (fenceVar) : "eax"); - -#define MAXFIFOSIZE 0x40000 -#define FIFOPAD 0x0000 -#define AUXPAD 0x1000 -#define HWC_TILED_BUFFER_BYTES 0x1000UL /* 128 Bytes x 32 lines */ -#define HWC_TILED_BUFFER_Y_ALIGN 0x20000UL -#define HWC_TILED_BUFFER_X_ADJUST 0x80UL - -static hwcInfo hInfo; -static char errorString[1024]; -static FxU32 saveVidProcCfg; -static FxU32 saveLfbMemoryConfig; -static FxU32 saveMiscInit0; -static FxU32 finalVidProcCfg; -static FxU32 finalLfbMemoryCfg; -static FxU32 finalVidDesktopOverlayStride; - -static Display *dpy = 0; -static int screenNum = 0; -static int screenWidth = 0; -static int screenHeight= 0; -static int screenDepth = 0; -static void* screenPhys = 0; -static int screenMem = 0; -static XF86VidModeModeInfo **vidModes = 0; -static int inDGA = 0; - -static FxU32 calcBufferStride(FxU32 xres, FxBool tiled); -static FxU32 calcBufferSize(FxU32 xres, FxU32 yres, FxBool tiled); -static FxU32 calcBufferSizeInTiles(FxU32 xres, FxU32 yres); -static FxU32 calcBufferHeightInTiles(FxU32 yres); -static FxU32 hwcBufferLfbAddr(FxU32 bufNum, const hwcBoardInfo* bInfo, - FxBool colBufAlignP); - -typedef struct envitem_t { - char *env; - char *val; - struct envitem_t *next; -} envitem; - -static envitem *first=0; -static int envinit=0; - -static void loadEnvFile() { - FILE *file; - char data[128]; - char *env, *val; - envitem *item; - int first_err=1; - - if (envinit) return; - envinit=1; - file=fopen("/etc/conf.3dfx/voodoo3", "r"); - if (!file) return; - while (1) { - if (!fgets(data, 128, file)) return; - if (*data=='#') continue; - if (*data=='\n') continue; - val=strchr(data, '='); - if (!val) { - if (first_err) { - fprintf(stderr, "In config file /etc/conf.3dfx/voodoo3:\n"); - first_err=0; - } - fprintf(stderr, "Malformed line: %s\n", data); - continue; - - } - *val=0; - env=data; - val++; - item=malloc(sizeof(envitem)); - item->env=malloc(strlen(env)+1); - strcpy(item->env, env); - item->val=malloc(strlen(val)+1); - strcpy(item->val, val); - item->next=first; - first=item; - } -} - -static void deleteEnvData() { - envitem *ptr, *next; - - ptr=first; - while (ptr) { - next=ptr->next; - if (ptr->env) free(ptr->env); - if (ptr->val) free(ptr->val); - free(ptr); - ptr=next; - } - first=0; - envinit=0; -} - -char * -hwcGetErrorString() -{ -#define FN_NAME "hwcGetErrorString" - return errorString; -#undef FN_NAME -} /* hwcGetErrorString */ - -static int initX(int index) { - int eventbase, errorbase, flags; - int banksize; - - if (dpy!=0) return FXTRUE; - dpy=XOpenDisplay(""); - if (!dpy) { - sprintf(errorString, "Banshee/V3 only runs under local X connection\n"); - return FXFALSE; - } - if (XF86DGAQueryExtension(dpy, &eventbase, &errorbase)) { - int major, minor; - XF86DGAQueryVersion(dpy, &major, &minor); - if (major>1 && minor<0) { - XCloseDisplay(dpy); - sprintf(errorString,"Banshee/V3 requires DGA version 1.x\n"); - return FXFALSE; - } - } - screenNum=DefaultScreen(dpy); - XF86DGAGetVideoLL(dpy, screenNum, (int*)&screenPhys, &screenWidth, &banksize, - &screenMem); - screenMem*=1024; - screenHeight=DisplayHeight(dpy, screenNum); - screenDepth=DefaultDepth(dpy, screenNum); - if (XF86DGAQueryDirectVideo(dpy, DefaultScreen(dpy), &flags)==False || - !flags) { - sprintf(errorString,"Banshee/V3 requires X server to suppoer direct video\n"); - return FXFALSE; - } - hInfo.boardInfo[index].h3Mem = screenMem>>20; - return FXTRUE; -} - -hwcInfo * -hwcInit(FxU32 vID, FxU32 dID) { - int i; - FxU32 bn; - - pciOpen(); - - hInfo.nBoards = 0; - - errorString[0] = '\0'; - - for (i = 0; i < HWC_MAX_BOARDS; i++) { - hInfo.boardInfo[i].pciInfo.initialized = 0; - if (pciFindCardMulti(vID, dID, &bn, i)) { - hInfo.nBoards++; - hInfo.boardInfo[i].boardNum = 0; - - hInfo.boardInfo[i].pciInfo.initialized = 1; - hInfo.boardInfo[i].pciInfo.vendorID = vID; - hInfo.boardInfo[i].pciInfo.deviceID = dID; - /* - * NOTE: in the code above we learn about memsize here: - * hInfo.boardInfo[i].h3Mem - * - * However, in DOS, since we have not mapped the board yet, so we have - * to wait until later. (see hwcInitRegisters()) - dwj - */ - - /* Get some board Info */ - pciGetConfigData( PCI_REVISION_ID, bn, &hInfo.boardInfo[i].devRev); - - /* Get all the base addresses */ - pciGetConfigData(PCI_BASE_ADDRESS_0, bn, - &hInfo.boardInfo[i].pciInfo.pciBaseAddr[0]); - pciGetConfigData(PCI_BASE_ADDRESS_1, bn, - &hInfo.boardInfo[i].pciInfo.pciBaseAddr[1]); - pciGetConfigData(PCI_IO_BASE_ADDRESS, bn, - &hInfo.boardInfo[i].pciInfo.pciBaseAddr[2]); - pciGetConfigData(PCI_ROM_BASE_ADDRESS, bn, - &hInfo.boardInfo[i].pciInfo.pciBaseAddr[3]); - } - } - if (hInfo.nBoards) { - if (!initX(0)) return 0; - return &hInfo; - } else { - sprintf(errorString, "Can't find or access Banshee/V3 board\n"); - return 0; - } -} - -FxBool -hwcMapBoard(hwcBoardInfo *bInfo, FxU32 bAddrMask) { - FxU32 bAddr; - - if (bInfo->pciInfo.initialized == FXFALSE) { - sprintf(errorString, "hwcMapBoard: Called before hwcInit\n"); - return FXFALSE; - } - - bInfo->linearInfo.initialized = FXTRUE; - - for (bAddr = 0; bAddr < HWC_NUM_BASE_ADDR; bAddr++) { - if ((bAddrMask >> bAddr) & 0x1) { - bInfo->linearInfo.linearAddress[bAddr] = (FxU32) - pciMapCardMulti(bInfo->pciInfo.vendorID, bInfo->pciInfo.deviceID, - 0x2000000, &bInfo->deviceNum, bInfo->boardNum, bAddr); - } - } - return FXTRUE; -} - -FxBool -hwcUnmapBoard(hwcBoardInfo *bInfo) { - FxU32 bAddr; - - for (bAddr=0; bAddrlinearInfo.linearAddress[bAddr], 0x2000000); - } - return FXTRUE; -} - -FxBool -hwcInitRegisters(hwcBoardInfo *bInfo) { - int dramInit1; - - if (bInfo->linearInfo.initialized == FXFALSE) { - printf(errorString, "hwcInitRegisters Called before hwcMapBoard\n"); - return FXFALSE; - } - - bInfo->regInfo.initialized = FXTRUE; - - bInfo->regInfo.ioMemBase = - bInfo->linearInfo.linearAddress[0] + SST_IO_OFFSET; - bInfo->regInfo.cmdAGPBase = - bInfo->linearInfo.linearAddress[0] + SST_CMDAGP_OFFSET; - bInfo->regInfo.waxBase = - bInfo->linearInfo.linearAddress[0] + SST_2D_OFFSET; - bInfo->regInfo.sstBase = - bInfo->linearInfo.linearAddress[0] + SST_3D_OFFSET; - bInfo->regInfo.lfbBase = - bInfo->linearInfo.linearAddress[0] + SST_LFB_OFFSET; - bInfo->regInfo.rawLfbBase = - bInfo->linearInfo.linearAddress[1]; - bInfo->regInfo.ioPortBase = (FxU16) bInfo->pciInfo.pciBaseAddr[2] & ~0x1; - - /* Figure out if it's SDRAM */ - HWC_IO_LOAD(bInfo->regInfo, dramInit1, dramInit1); - dramInit1 &= SST_MCTL_TYPE_SDRAM; - if ( dramInit1 & SST_MCTL_TYPE_SDRAM ) - bInfo->sdRAM = FXTRUE; - else - bInfo->sdRAM = FXFALSE; - - { - FxU32 - pciInit0, - pciCommandReg = - BIT(0) | /* enable i/o decode */ - BIT(1); /* enable memory decode */ - - /* Enable PCI memory and I/O decode */ - pciSetConfigData(PCI_COMMAND, bInfo->deviceNum, &pciCommandReg); - - HWC_IO_LOAD(bInfo->regInfo, pciInit0, pciInit0); - pciInit0 |= SST_PCI_READ_WS | SST_PCI_WRITE_WS; - HWC_IO_STORE(bInfo->regInfo, pciInit0, pciInit0); - } - - return FXTRUE; -} - -FxBool -hwcAllocBuffers(hwcBoardInfo *bInfo, FxU32 nColBuffers, FxU32 nAuxBuffers) -{ -#define FN_NAME "hwcAllocBuffers" - FxBool - bufferAlignP; - FxU32 - bNum, - h3Mem = bInfo->h3Mem << 20, - bufStride, - bufSize; - FxI32 - i, - tramSize, fifoSize; - - if (bInfo->vidInfo.initialized == FXFALSE) { - sprintf(errorString, "%s: Called before video initialization\n", FN_NAME); - return FXFALSE; - } - - GDBG_INFO(80, "%s(0x%x, 0x%x, 0x%x)\n", FN_NAME, bInfo, nColBuffers, nAuxBuffers); - - /* I've decided on > 2 instead of == 3 because we may support more - than 3 buffers in the future, and want 4 to set the - triple-buffering bit in dramInit1, also */ - bInfo->vidInfo.tripleBuffering = (nColBuffers > 2); - - bInfo->vidInfo.stride = bufStride = - calcBufferStride(bInfo->vidInfo.xRes, bInfo->vidInfo.tiled); - - /* We want to place the FIFO after the tram but before the color - buffers with some pad */ - bufSize = calcBufferSize(bInfo->vidInfo.xRes, bInfo->vidInfo.yRes, - bInfo->vidInfo.tiled); - - bInfo->buffInfo.bufStride = bufStride; - bInfo->buffInfo.bufSize = bufSize; - - if (bInfo->vidInfo.tiled) { - bInfo->buffInfo.bufStrideInTiles = (bufStride >> 7); - bInfo->buffInfo.bufSizeInTiles = - calcBufferSizeInTiles(bInfo->vidInfo.xRes, bInfo->vidInfo.yRes); - bInfo->buffInfo.bufHeightInTiles = - calcBufferHeightInTiles(bInfo->vidInfo.yRes); - } - - bInfo->buffInfo.initialized = FXTRUE; - bInfo->buffInfo.nColBuffers = nColBuffers; - bInfo->buffInfo.nAuxBuffers = nAuxBuffers; - - /* Subtract 0x1000 from h3mem to leave the X cursor (in high mem) alone */ - h3Mem-=0x1000; - - /* First, do the buffer allocation */ - - if (nAuxBuffers > 0) { - bInfo->buffInfo.auxBuffEnd = - bInfo->buffInfo.auxBuffStart = h3Mem; - - bInfo->buffInfo.auxBuffStart -= bufSize; - - /* auxBuffers start on odd pages, so we need to check to see if - * it's on an even page and, if so, make it odd. - * - * NB: We need to do the same sort of 'alignment' thing here as for - * the color buffers. - */ - bufferAlignP = ((bInfo->buffInfo.auxBuffStart & 0x1000UL) == 0); - if (bufferAlignP) bInfo->buffInfo.auxBuffStart -= 0x1000; - - } - - for (i = nColBuffers - 1; i >= 0; i--) { - if ((FxU32) i == (nColBuffers - 1)) { - FxU32 top; - if (nAuxBuffers > 0) - top = bInfo->buffInfo.auxBuffStart; - else - top = h3Mem; - - bInfo->buffInfo.colBuffStart[i] = - bInfo->buffInfo.colBuffEnd[i] = top; - } else { - bInfo->buffInfo.colBuffStart[i] = - bInfo->buffInfo.colBuffEnd[i] = - bInfo->buffInfo.colBuffStart[i + 1]; - } - - bInfo->buffInfo.colBuffStart[i] -= bufSize; - - /* As a memory access optmization colorBuffers start on even - * pages, while aux buffers start on odd pages. Thus we must - * check to see if we're startding on an odd page here and, if so, - * add a page to the start. - */ - bufferAlignP = ((bInfo->buffInfo.colBuffStart[i] & 0x1000UL) != 0); - if (bufferAlignP) bInfo->buffInfo.colBuffStart[i] -= 0x1000; - } - - /* Now we can calculate some other stuff... */ - bInfo->fbOffset = bInfo->buffInfo.colBuffStart[0]; - bInfo->tramOffset = 0; - fifoSize = MAXFIFOSIZE; - tramSize = bInfo->fbOffset - bInfo->tramOffset - fifoSize; - if (tramSize < (FxI32)bInfo->min_tramSize) { - /* Now we have to shrink the FIFO */ - tramSize = bInfo->min_tramSize; - fifoSize = bInfo->fbOffset - bInfo->min_tramSize; - if (fifoSize < 0) { - GDBG_INFO(80, "%s: Not enough memory for resolution + min texture\n", - FN_NAME); - sprintf(errorString, - "%s: Not enough memory for resolution + min texture\n", - FN_NAME); - return FXFALSE; - } - } - - bInfo->fifoInfo.fifoLength = (FxU32) fifoSize; - bInfo->fifoInfo.fifoStart = bInfo->fbOffset - fifoSize; - - bInfo->fifoInfo.fifoLength -= 0x20000; - - if (tramSize>screenWidth*screenHeight*(screenDepth+7)/8+bInfo->min_tramSize) { - bInfo->tramOffset = screenWidth*screenHeight*(screenDepth+7)/8; - bInfo->tramSize = (FxU32)(tramSize-screenWidth*screenHeight*(screenDepth+7)/8); - } else { - bInfo->tramOffset = 0; - bInfo->tramSize = (FxU32)tramSize; - } - -#define LFBSTRIDE 0x1000 - { - FxU32 colBuffOffset = 0; - FxU32 colBufAlignP = 0; - - for (bNum = 0; bNum < nColBuffers; bNum++) { - if ((colBuffOffset & 0x1000UL) != 0) { - colBuffOffset += 0x1000UL; - colBufAlignP++; - } - bInfo->buffInfo.lfbBuffAddr[bNum] = - hwcBufferLfbAddr(bNum, bInfo, colBufAlignP); - colBuffOffset += bufSize; - } - - if (nAuxBuffers > 0) { - if ((colBuffOffset & 0x1000UL) != 0) { - colBuffOffset += 0x1000UL; - colBufAlignP++; - } - bInfo->buffInfo.lfbBuffAddr[nColBuffers] = - hwcBufferLfbAddr(nColBuffers, bInfo, colBufAlignP); - } - } - - GDBG_INFO(80, "%s: Board Info:\n", FN_NAME); - GDBG_INFO(80, "\thdc: 0x%x\n", bInfo->hdc); - GDBG_INFO(80, "\textContextID: 0x%x\n", bInfo->extContextID); - GDBG_INFO(80, "\tdevRev: 0x%x\n", bInfo->devRev); - GDBG_INFO(80, "\tfbOffset: 0x%x\n", bInfo->fbOffset); - GDBG_INFO(80, "\th3Rev: 0x%x\n", bInfo->h3Rev); - GDBG_INFO(80, "\th3Mem: 0x%x\n", bInfo->h3Mem); - GDBG_INFO(80, "\tboardNum: 0x%x\n", bInfo->boardNum); - GDBG_INFO(80, "\tdeviceNum: 0x%x\n", bInfo->deviceNum); - - GDBG_INFO(80, "%s: Buffer Info:\n", FN_NAME); - GDBG_INFO(80, "\tbufSize: 0x%x\n", bInfo->buffInfo.bufSize); - GDBG_INFO(80, "\tbufSizeInTiles: 0x%x\n", bInfo->buffInfo.bufSizeInTiles); - GDBG_INFO(80, "\tbufStride: 0x%x\n", bInfo->buffInfo.bufStride); - GDBG_INFO(80, "\tbufStrideInTiles:0x%x\n", bInfo->buffInfo.bufStrideInTiles); - GDBG_INFO(80, "\tbufHeightInTiles:0x%x\n", bInfo->buffInfo.bufHeightInTiles); - GDBG_INFO(80, "\tnColBuffers: 0x%x\n", bInfo->buffInfo.nColBuffers); - GDBG_INFO(80, "\tcolBuffStart: 0x%x\n", bInfo->buffInfo.colBuffStart); - GDBG_INFO(80, "\tcolBuffEnd: 0x%x\n", bInfo->buffInfo.colBuffEnd); - GDBG_INFO(80, "\tnAuxBuffers: 0x%x\n", bInfo->buffInfo.nAuxBuffers); - GDBG_INFO(80, "\tauxBuffStart: 0x%x\n", bInfo->buffInfo.auxBuffStart); - GDBG_INFO(80, "\tauxBuffEnd: 0x%x\n", bInfo->buffInfo.auxBuffEnd); - - GDBG_INFO(80, "%s: FIFO Info:\n", FN_NAME); - GDBG_INFO(80, "\tfifoStart: 0x%x\n", bInfo->fifoInfo.fifoStart); - GDBG_INFO(80, "\tfifoLength: 0x%x\n", bInfo->fifoInfo.fifoLength); - return FXTRUE; - -#undef FN_NAME -} /* hwcAllocBuffers */ - -FxBool -hwcInitFifo(hwcBoardInfo *bInfo, FxBool enableHoleCounting) -{ -#define FN_NAME "hwcInitFifo" - FxBool - agpEnable = FXFALSE; - FxU32 - cagpRegs; /* pointer to Cmd/AGP regs */ - - if (bInfo->regInfo.initialized == FXFALSE) { - sprintf(errorString, "%s: Called before hwcMapBoard\n", FN_NAME); - return FXFALSE; - } - cagpRegs = bInfo->regInfo.cmdAGPBase; - - if (bInfo->buffInfo.initialized == FXFALSE) { - sprintf(errorString, "%s: Called before hwcInitBuffers\n", FN_NAME); - return FXFALSE; - } - - /* disable the CMD fifo */ - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.baseSize, 0); - - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.baseAddrL, - bInfo->fifoInfo.fifoStart>>12); - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.readPtrL, bInfo->fifoInfo.fifoStart); - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.readPtrH, 0); - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.aMin, bInfo->fifoInfo.fifoStart-4); - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.aMax, bInfo->fifoInfo.fifoStart-4); - - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.depth, 0); - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.holeCount, 0); - /* Fifo LWM /HWM/ THRESHOLD */ - if (bInfo->pciInfo.deviceID == 0x3) { /* banshee */ - HWC_CAGP_STORE(bInfo->regInfo, cmdFifoThresh, - (0x09 << SST_HIGHWATER_SHIFT) | 0x2); - } else { - HWC_CAGP_STORE(bInfo->regInfo, cmdFifoThresh, - (0xf << SST_HIGHWATER_SHIFT) | 0x8); - } - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.baseSize, - ((bInfo->fifoInfo.fifoLength >> 12) - 1) | SST_EN_CMDFIFO | - (enableHoleCounting ? 0 : SST_CMDFIFO_DISABLE_HOLES) | - (agpEnable ? SST_CMDFIFO_AGP : 0)); - - GDBG_INFO(80 ,"%s: CMD FIFO placed at physical addr 0x%x\n", FN_NAME, - bInfo->fifoInfo.fifoStart); - - return FXTRUE; - -#undef FN_NAME -} /* hwcInitFifo */ - -static void -hwcInitVideoOverlaySurface( - hwcRegInfo *rInfo, - FxU32 enable, /* 1=enable Overlay surface (OS), 1=disable */ - FxU32 stereo, /* 1=enable OS stereo, 0=disable */ - FxU32 horizScaling, /* 1=enable horizontal scaling, 0=disable */ - FxU32 dudx, /* horizontal scale factor (ignored if not */ - /* scaling) */ - FxU32 verticalScaling, /* 1=enable vertical scaling, 0=disable */ - FxU32 dvdy, /* vertical scale factor (ignored if not */ - /* scaling) */ - FxU32 filterMode, /* duh */ - FxU32 tiled, /* 0=OS linear, 1=tiled */ - FxU32 pixFmt, /* pixel format of OS */ - FxU32 clutBypass, /* bypass clut for OS? */ - FxU32 clutSelect, /* 0=lower 256 CLUT entries, 1=upper 256 */ - FxU32 startAddress, /* board address of beginning of OS */ - FxU32 stride) /* distance between scanlines of the OS, in */ - /* units of bytes for linear OS's and tiles for */ - /* tiled OS's */ -{ - FxU32 doStride; - FxU32 vidProcCfg; - - HWC_IO_LOAD((*rInfo), vidProcCfg, vidProcCfg); - - vidProcCfg &= ~(SST_OVERLAY_TILED_EN | - SST_OVERLAY_STEREO_EN | - SST_OVERLAY_HORIZ_SCALE_EN | - SST_OVERLAY_VERT_SCALE_EN | - SST_OVERLAY_TILED_EN | - SST_OVERLAY_PIXEL_FORMAT | - SST_OVERLAY_CLUT_BYPASS | - SST_OVERLAY_CLUT_SELECT); - - if (enable) - vidProcCfg |= SST_OVERLAY_EN; - - if (stereo) - vidProcCfg |= SST_OVERLAY_STEREO_EN; - - if (horizScaling) - vidProcCfg |= SST_OVERLAY_HORIZ_SCALE_EN; - - if (verticalScaling) - vidProcCfg |= SST_OVERLAY_VERT_SCALE_EN; - - if (tiled) { - vidProcCfg |= SST_OVERLAY_TILED_EN; - } - - vidProcCfg |= pixFmt; - - vidProcCfg &= ~SST_CURSOR_EN; /* Turn off HW Cursor */ - - if (clutBypass) - vidProcCfg |= SST_OVERLAY_CLUT_BYPASS; - - if (clutSelect) - vidProcCfg |= SST_OVERLAY_CLUT_SELECT; - - /* Overlay Hack: setup the state that I want */ - if (GETENV ("SSTH3_DESKTOP_OVERLAY")) - { - /* Check this because my cursor gets funny */ - vidProcCfg |= SST_CURSOR_EN; - - vidProcCfg |= SST_CHROMA_EN; - - /* Tile the 3D which will use the DESKTOP */ - /* Don't tile the 2D which will be the OVERLAY */ - vidProcCfg |= SST_DESKTOP_TILED_EN; - vidProcCfg &= ~SST_OVERLAY_TILED_EN; - - /* Setup the chroma range to magenta. */ - /* FIXME: it would be nice to be able to pick this */ - HWC_IO_STORE ((*rInfo), vidChromaMin, 0x0000F81F); - HWC_IO_STORE ((*rInfo), vidChromaMax, 0x0000F81F); - } - - HWC_IO_STORE((*rInfo), vidProcCfg, vidProcCfg); - - /* */ - HWC_IO_LOAD((*rInfo), vidDesktopOverlayStride, doStride); - doStride &= ~(SST_OVERLAY_LINEAR_STRIDE | SST_OVERLAY_TILE_STRIDE); - - - /* Overlay Hack: leave the stride alone for the hack */ - if (!GETENV ("SSTH3_DESKTOP_OVERLAY")) - { - stride <<= SST_OVERLAY_STRIDE_SHIFT; - if (tiled) - stride &= SST_OVERLAY_TILE_STRIDE; - else - stride &= SST_OVERLAY_LINEAR_STRIDE; - doStride |= stride; - } - - HWC_IO_STORE((*rInfo), vidDesktopOverlayStride, doStride); - - finalVidDesktopOverlayStride = doStride; - -} /* hwcInitVideoOverlaySurface */ - -FxBool -hwcInitVideo(hwcBoardInfo *bInfo, FxBool tiled, FxVideoTimingInfo - *vidTiming, FxBool overlay) { - FxU32 pixFmt = SST_OVERLAY_PIXEL_RGB565D; - FxU32 stride, dramInit1, miscInit0, lfbMemoryConfig; - FxU32 scrWidth, scrHeight, ovlWidth, ovlHeight, scale, - vidOverlayDudx, vidOverlayDvdy, - vidProcCfg, vidScreenSize, vidOverlayEndScreenCoord; - int i, numModes; - - if (!dpy) { - if (!initX(0)) /* Should be the index of the card */ - return FXFALSE; - } - if (!GETENV ("SSTH3_DESKTOP_OVERLAY")) - { - if (XF86DGADirectVideo(dpy, DefaultScreen(dpy), XF86DGADirectGraphics)) { - inDGA=1; - } - } - if (XF86VidModeGetAllModeLines(dpy, DefaultScreen(dpy), &numModes, - &vidModes)==False) { - sprintf(errorString, "Couldn't query vidmode list\n"); - return FXFALSE; - } - for (i=0; ihdisplay==bInfo->vidInfo.xRes) && - (vidModes[i]->vdisplay==bInfo->vidInfo.yRes)) - break; - if (i==numModes) { - sprintf(errorString, "Server doesn't support requested resolution\n"); - if (inDGA) { - XF86DGADirectVideo(dpy, DefaultScreen(dpy), 0); - inDGA=0; - } - if (vidModes) { - XFree(vidModes); - vidModes=0; - } - return FXFALSE; - } - if (XF86VidModeSwitchToMode(dpy, DefaultScreen(dpy), vidModes[i])==False) { - sprintf(errorString, "Failed to set required video mode\n"); - return FXFALSE; - } - XSync(dpy, False); - - stride= (tiled) ? bInfo->buffInfo.bufStrideInTiles : bInfo->vidInfo.stride; - - HWC_IO_LOAD(bInfo->regInfo, vidProcCfg, saveVidProcCfg); - HWC_IO_LOAD(bInfo->regInfo, lfbMemoryConfig, saveLfbMemoryConfig); - HWC_IO_LOAD(bInfo->regInfo, miscInit0, saveMiscInit0); - - HWC_IO_STORE(bInfo->regInfo, vidOverlayDudxOffsetSrcWidth, - ((bInfo->vidInfo.xRes << 1) << 19)); - - /* Video pixel buffer threshold */ - { - FxU32 vidPixelBufThold; - FxU32 thold = 32; - - if (getenv("SSTVB_PIXTHOLD")) { - thold = atoi(getenv("SSTVB_PIXTHOLD")); - } - - thold &= 0x3f; - - vidPixelBufThold = (thold | (thold << 6) | (thold << 12)); - - HWC_IO_STORE(bInfo->regInfo, vidPixelBufThold, vidPixelBufThold); - } - - hwcInitVideoOverlaySurface( - &bInfo->regInfo, - FXTRUE, /* 1=enable Overlay surface (OS), 1=disable */ - FXFALSE, /* 1=enable OS stereo, 0=disable */ - FXFALSE, /* 1=enable horizontal scaling, 0=disable */ - 0, /* horizontal scale factor (ignored if not) */ - FXFALSE, /* 1=enable vertical scaling, 0=disable */ - 0, /* vertical scale factor (ignored if not) */ - 0, /* Filter mode */ - tiled, /* tiled */ - pixFmt, /* pixel format of OS */ - FXFALSE, /* bypass clut for OS? */ - 0, /* 0=lower 256 CLUT entries, 1=upper 256 */ - bInfo->buffInfo.colBuffStart[0],/* board address of beginning of OS */ - stride); /* distance between scanlines of the OS, in - units of bytes for linear OS's and tiles for - tiled OS's */ - HWC_IO_STORE(bInfo->regInfo, vidOverlayStartCoords, 0); - HWC_IO_STORE(bInfo->regInfo, vidOverlayEndScreenCoord, - (bInfo->vidInfo.yRes << SST_OVERLAY_Y_SHIFT) | - (bInfo->vidInfo.xRes & SST_OVERLAY_X) ); - - /* - Setup video scaling for half-modes - */ - - /* Get some important info */ - HWC_IO_LOAD(bInfo->regInfo, vidScreenSize, vidScreenSize); - HWC_IO_LOAD(bInfo->regInfo, vidProcCfg, vidProcCfg); - HWC_IO_LOAD(bInfo->regInfo, vidOverlayEndScreenCoord, vidOverlayEndScreenCoord); - - scrWidth = (vidScreenSize >> SST_VIDEO_SCREEN_WIDTH_SHIFT) & 0xfff; - scrHeight = (vidScreenSize >> SST_VIDEO_SCREEN_HEIGHT_SHIFT) & 0xfff; - - ovlWidth = ((vidOverlayEndScreenCoord) >> SST_OVERLAY_X_SHIFT) & 0xfff; - ovlHeight = ((vidOverlayEndScreenCoord) >> SST_OVERLAY_Y_SHIFT) & 0xfff; - - ovlWidth += 1; - ovlHeight += 1; - - /* Check to see if the screen and overlay dimensions match. - * There are two cases that can happen in reality. - * - * scrXXX > appXXX: This is a 'real' case, and the overlay dimension - * needs to mag scaled so that it fits the requested size. - * - * (scrXXX == appXXX) && (ovlXXX != scrXXX): This is a somewhat artificial - * case where someone left the overlay set to some value, and these did - * not get reset in the setVideoMode processing. (For example, if the user is - * running an application which bus masters data directly to our video overlay - * when launching a glide application). In this case we need to fiddle w/ the - * overlay dimension so that it matches the requested resolution. - * - * (scrXXX < appXXX): If setVideoMode is actually working correctly, this cannot - * happen because that code has to know that we can't do min scaling. - */ - - if (scrWidth > bInfo->vidInfo.xRes) { - vidProcCfg |= SST_OVERLAY_HORIZ_SCALE_EN; - - ovlWidth = scrWidth; - - scale = ((float) bInfo->vidInfo.xRes) / ((float) ovlWidth); - - vidOverlayDudx = (FxU32) (scale * ((float) (1 << 20))); - HWC_IO_STORE(bInfo->regInfo, vidOverlayDudx, vidOverlayDudx); - } else if (ovlWidth != scrWidth) { - ovlWidth = scrWidth; - } - - if (scrHeight > bInfo->vidInfo.yRes) { - vidProcCfg |= SST_OVERLAY_VERT_SCALE_EN; - - ovlHeight = scrHeight; - - scale = ((float) bInfo->vidInfo.yRes) / ((float) ovlHeight); - - vidOverlayDvdy = (FxU32) (scale * ((float) (1 << 20))); - HWC_IO_STORE(bInfo->regInfo, vidOverlayDvdy, vidOverlayDvdy); - } else if (ovlHeight != scrHeight) { - ovlHeight = scrHeight; - } - - vidOverlayEndScreenCoord = (((ovlHeight - 1) << SST_OVERLAY_Y_SHIFT) | - ((ovlWidth - 1) << SST_OVERLAY_X_SHIFT)); - HWC_IO_STORE(bInfo->regInfo, vidOverlayEndScreenCoord, vidOverlayEndScreenCoord); - - vidProcCfg &= ~SST_OVERLAY_FILTER_MODE; - if (GETENV("SSTH3_OVERLAY_FILTER_2x2")) { - if (!(vidProcCfg & SST_VIDEO_2X_MODE_EN)) - vidProcCfg |= SST_OVERLAY_FILTER_2X2; - } else { - vidProcCfg |= SST_OVERLAY_FILTER_4X4; - } - - HWC_IO_STORE(bInfo->regInfo, vidProcCfg, vidProcCfg); - - finalVidProcCfg = vidProcCfg; - - /* Get miscInit0 for y-sub */ - HWC_IO_LOAD(bInfo->regInfo, miscInit0, miscInit0); - - /* Clear out relavent bits */ - miscInit0 &= ~SST_YORIGIN_TOP; - miscInit0 |= ((bInfo->vidInfo.yRes - 1) << SST_YORIGIN_TOP_SHIFT); - - HWC_IO_STORE(bInfo->regInfo, miscInit0, miscInit0); - - /* Set up lfbMemoryConfig */ - lfbMemoryConfig = - (bInfo->fbOffset >> 12) | - SST_RAW_LFB_ADDR_STRIDE_4K | - (bInfo->buffInfo.bufStrideInTiles << SST_RAW_LFB_TILE_STRIDE_SHIFT); - - HWC_IO_STORE(bInfo->regInfo, lfbMemoryConfig, lfbMemoryConfig); - - finalLfbMemoryCfg = lfbMemoryConfig; - - /* Set up dramInit1 for triple or double buffering */ - HWC_IO_LOAD(bInfo->regInfo, dramInit1, dramInit1); - if (bInfo->vidInfo.tripleBuffering) - dramInit1 |= SST_TRIPLE_BUFFER_EN; - else - dramInit1 &= ~SST_TRIPLE_BUFFER_EN; - HWC_IO_STORE(bInfo->regInfo, dramInit1, dramInit1); - - HWC_IO_STORE(bInfo->regInfo, vidMaxRGBDelta, 0x100810); - - HWC_IO_STORE( bInfo->regInfo, vidDesktopOverlayStride, - ( bInfo->buffInfo.bufStrideInTiles << 16 ) | - bInfo->buffInfo.bufStrideInTiles ); - - /* Overlay Hack: setup tiledness */ - if (GETENV ("SSTH3_DESKTOP_OVERLAY")) - { - /* The desktop is rarely tiled, though the video... - */ - HWC_IO_STORE( bInfo->regInfo, vidDesktopOverlayStride, - ( bInfo->buffInfo.bufStrideInTiles << 16 ) | - ( bInfo->buffInfo.bufStride ) ); - /* Hack for 3d as desktop 2d as overlay */ - HWC_IO_STORE( bInfo->regInfo, vidDesktopOverlayStride, - ( bInfo->buffInfo.bufStride << 16 ) | - ( bInfo->buffInfo.bufStrideInTiles ) ); - } - - HWC_IO_LOAD( bInfo->regInfo, vidDesktopOverlayStride, finalVidDesktopOverlayStride); - - return FXTRUE; -} - -void repaintX() { - XSetWindowAttributes xswa; - unsigned long mask=0; - Visual visual; - int win; - - xswa.background_pixmap = None; - mask |= CWBackPixmap; - xswa.override_redirect = True; - xswa.backing_store = NotUseful; - xswa.save_under = False; - mask |= (CWOverrideRedirect | CWBackingStore | CWSaveUnder); - visual.visualid = CopyFromParent; - win = XCreateWindow(dpy, DefaultRootWindow(dpy), 0, 0, - screenWidth, screenHeight, 0, - DefaultDepth(dpy, screenNum), InputOutput, &visual, - mask, &xswa); - XMapWindow (dpy, win); -} - -FxBool -hwcRestoreVideo(hwcBoardInfo *bInfo) { - FxU32 depth; - - /* Disable FIFO */ - do { - HWC_CAGP_LOAD(bInfo->regInfo, cmdFifo0.depth, depth); - } while (depth); - - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.baseSize, 0); - HWC_IO_STORE(bInfo->regInfo, lfbMemoryConfig, saveLfbMemoryConfig); - HWC_IO_STORE(bInfo->regInfo, vidProcCfg, saveVidProcCfg); - HWC_IO_STORE(bInfo->regInfo, miscInit0, saveMiscInit0); - if (!dpy) return FXTRUE; - - /* Overlay Hack to get X to restore properly without using DGA direct - * graphics. */ - if (GETENV ("SSTH3_DESKTOP_OVERLAY")) - { - if (XF86VidModeSwitchToMode(dpy, DefaultScreen(dpy), vidModes[1])==False) { - GDBG_INFO(80, "Failed to return to previous video mode\n"); - } - } - - if (XF86VidModeSwitchToMode(dpy, DefaultScreen(dpy), vidModes[0])==False) { - GDBG_INFO(80, "Failed to return to previous video mode\n"); - } - if (inDGA) { - XF86DGADirectVideo(dpy, DefaultScreen(dpy), 0); - inDGA=0; - } - if (vidModes) { - XFree(vidModes); - vidModes=0; - } - repaintX(); - XCloseDisplay(dpy); - dpy=0; - return FXTRUE; -} - -static FxU32 -calcBufferStride(FxU32 xres, FxBool tiled) -{ - FxU32 - strideInTiles; - - if (tiled == FXTRUE) { - /* Calculate tile width stuff */ - strideInTiles = (xres << 1) >> 7; - if ((xres << 1) & (HWC_TILE_WIDTH - 1)) - strideInTiles++; - - return (strideInTiles * HWC_TILE_WIDTH); - - } else { - return (xres << 1); - } -} /* calcBufferStride */ - -static FxU32 -calcBufferHeightInTiles(FxU32 yres) -{ - FxU32 - heightInTiles; /* Height of buffer in tiles */ - - - /* Calculate tile height stuff */ - heightInTiles = yres >> 5; - - if (yres & (HWC_TILE_HEIGHT - 1)) - heightInTiles++; - - return heightInTiles; - -} /* calcBufferHeightInTiles */ - -static FxU32 -calcBufferSizeInTiles(FxU32 xres, FxU32 yres) { - FxU32 - bufSizeInTiles; /* Size of buffer in tiles */ - - bufSizeInTiles = - calcBufferHeightInTiles(yres) * (calcBufferStride(xres, FXTRUE) >> 7); - - return bufSizeInTiles; - -} /* calcBufferSizeInTiles */ - -static FxU32 -calcBufferSize(FxU32 xres, FxU32 yres, FxBool tiled) -{ - FxU32 - stride, - height, - bufSize; /* Size of buffer in bytes */ - - if (tiled) { - stride = calcBufferStride(xres, tiled); - height = HWC_TILE_HEIGHT * calcBufferHeightInTiles(yres); - } else { - stride = xres << 1; - height = yres; - } - - bufSize = stride * height; - - return bufSize; - -} /* calcBufferSize */ - -FxBool -hwcCheckMemSize(hwcBoardInfo *bInfo, FxU32 xres, FxU32 yres, FxU32 nColBuffers, - FxU32 nAuxBuffers, FxBool tiled) -{ -#define FN_NAME "hwcCheckMemSize" - FxU32 - bufSize, totSize; - - bufSize = calcBufferSize(xres, yres, tiled); - - totSize = (nColBuffers + nAuxBuffers) * bufSize; - - if (totSize < ((bInfo->h3Mem << 20) - 0x200000)) /* Need 2M for texture */ - return FXTRUE; - else - return FXFALSE; -#undef FN_NAME -} /* hwcCheckMemSize */ - -static FxU32 -pow2Round(FxU32 val, FxU32 pow2Const) -{ - const FxU32 pow2Mask = (pow2Const - 1UL); - - return ((val + pow2Mask) & ~pow2Mask); -} - -static FxU32 -hwcBufferLfbAddr(FxU32 bufNum, - const hwcBoardInfo* bInfo, - FxBool colBufAlignP) -{ - FxU32 retVal = 0x00UL; - - if (bInfo->vidInfo.tiled) { - retVal = (bInfo->fbOffset + - pow2Round(bufNum * bInfo->vidInfo.yRes * HWC_TILED_BUFFER_BYTES, - HWC_TILED_BUFFER_Y_ALIGN) + - (colBufAlignP ? HWC_TILED_BUFFER_X_ADJUST : 0)); - } else if (bufNum < bInfo->buffInfo.nColBuffers) { - retVal = bInfo->buffInfo.colBuffStart[bufNum]; - } else if (bufNum == bInfo->buffInfo.nColBuffers) { - retVal = bInfo->buffInfo.auxBuffStart; - } - - return retVal; -} - -FxU32 -hwcInitAGPFifo(hwcBoardInfo *bInfo, FxBool enableHoleCounting) -{ - return hwcInitFifo(bInfo, enableHoleCounting); -} - -#define RED_SHIFT 16 -#define GREEN_SHIFT 8 -#define BLUE_SHIFT 0 - -FxBool -hwcGammaTable(hwcBoardInfo *bInfo, FxU32 nEntries, FxU32 *r, FxU32 *g, FxU32 *b) -{ -#define FN_NAME "hwcGammaTable" - FxU32 gRamp[256]; - FxU32 i; - FxU32 vidProcCfg; - FxU32 dacBase; - FxU32 rDacBase; - FxU32 rDacData; - - /* Load the table into the Display driver as above */ - for (i = 0; i < nEntries; i++) { - gRamp[i] = - ((r[i] & 0xff) << RED_SHIFT) | - ((g[i] & 0xff) << GREEN_SHIFT) | - ((b[i] & 0xff) << BLUE_SHIFT); - } - - /* - ** On W9X/DOS, we can do this ourselves--which is much easier than - ** mucking about with a bunch of 32-bit data in 16-bit driver - ** code. - */ - HWC_IO_LOAD( bInfo->regInfo, vidProcCfg, vidProcCfg); - - /* Determin which set of CLUT entries are selected */ - if (vidProcCfg & SST_OVERLAY_CLUT_SELECT) - dacBase = 256; - else - dacBase = 0; - - /* Print out some useful info RE the vidProcCfg register */ - GDBG_INFO(80, "%s: vidProcCFG(SST_OVERLAY_CLUT_SELECT) = %d\n", - FN_NAME, (vidProcCfg & SST_OVERLAY_CLUT_SELECT) ? 1 : 0); - GDBG_INFO(80, "%s: vidProcCFG(SST_OVERLAY_EN) = %d\n", - FN_NAME, (vidProcCfg & SST_OVERLAY_EN) ? 1 : 0); - GDBG_INFO(80, "%s: vidProcCFG(SST_OVERLAY_CLUT_BYPASS) = %d\n", - FN_NAME, (vidProcCfg & SST_OVERLAY_CLUT_BYPASS) ? 1 : 0); - - for (i = 0; i < nEntries; i++) { - int repeat = 100; - do { - HWC_IO_STORE( bInfo->regInfo, dacAddr, dacBase + i); - P6FENCE; - HWC_IO_LOAD( bInfo->regInfo, dacAddr, rDacBase); - P6FENCE; - repeat--; - } while (repeat && rDacBase != dacBase + i); - if (!repeat) { - GDBG_INFO(0, "%s:Error Writting DacAddr %d. DacBase =%d\n", - FN_NAME, dacBase+i, dacBase); - } - repeat = 100; - do { - HWC_IO_STORE( bInfo->regInfo, dacData, gRamp[i]); - P6FENCE; - HWC_IO_LOAD( bInfo->regInfo, dacData, rDacData); - P6FENCE; - repeat--; - } while (repeat && rDacData != gRamp[i]); - if (!repeat) { - GDBG_INFO(0, "%s:Error Writting Data [%d, %x]. DacBase =%d\n", - FN_NAME, i, gRamp[i], dacBase); - } - } - - return FXTRUE; - -#undef FN_NAME -} /* hwcGammaTable */ - -FxBool -hwcGammaRGB(hwcBoardInfo *bInfo, float gammaR, float gammaG, float gammaB) -{ -#define FN_NAME "hwcGammaRGB" - FxU32 - grRamp[256], ggRamp[256], gbRamp[256]; - int - i; - - GDBG_INFO(80, FN_NAME "(0x%x, %1.2f, %1.2f, %1.2f)\n", - bInfo, gammaR, gammaG, gammaB); - - /* - ** NB: The system eventually devised by Bob and Ken *may* require - ** separate R, G, and B vectors. - */ - - for (i = 0; i < 256; i++) { - grRamp[i] = (FxU32)((pow(i/255.0F, 1.0F/gammaR)) * 255.0F + 0.5F); - ggRamp[i] = (FxU32)((pow(i/255.0F, 1.0F/gammaG)) * 255.0F + 0.5F); - gbRamp[i] = (FxU32)((pow(i/255.0F, 1.0F/gammaB)) * 255.0F + 0.5F); - } - - - hwcGammaTable(bInfo, 256, grRamp, ggRamp, gbRamp); - - /* - ** Now that we have a gamma table, we can give it to the driver via - ** a call to ExtEscape() when that is defined..... - */ - - return FXFALSE; - -#undef FN_NAME -} /* hwcGammaRGB */ - -#define M 1 -#define K 1 - -FxBool -hwcSetGrxClock(hwcBoardInfo *bInfo, FxU32 speedInMHz) -{ -#define FN_NAME "hwcSetGrxClock" - FxU32 - pllCtrl1, - dramInit0 = 0xc17ae29, - dramInit1 = 0x26c031, - n, - m = 1; - - n = (FxU32) ((speedInMHz - 4.76f)/2.38f); - - pllCtrl1 = - (K << SST_PLL_K_SHIFT) | (m << SST_PLL_M_SHIFT) | (n << SST_PLL_N_SHIFT); - - GDBG_INFO(80, "%s: Setting Graphics Clock to %d\n", FN_NAME, speedInMHz); - - HWC_IO_STORE( bInfo->regInfo, dramInit0, dramInit0); - HWC_IO_STORE( bInfo->regInfo, dramInit1, dramInit1); - HWC_IO_STORE( bInfo->regInfo, pllCtrl1, pllCtrl1); - - return FXTRUE; - -#undef FN_NAME -} /* hwcSetGrxClock */ - -FxBool -hwcSetMemClock(hwcBoardInfo *bInfo, FxU32 speedInMHz) -{ -#define FN_NAME "hwcSetMemClock" - return FXFALSE; -#undef FN_NAME -} /* hwcSetMemClock */ - -char * -hwcGetenv(char *a) -{ - envitem *ptr; - - char *result; - result=getenv(a); - if (result) return result; - if (!envinit) loadEnvFile(); - ptr=first; - while (ptr) { - if (!strcmp(ptr->env, a)) return ptr->val; - ptr=ptr->next; - } - return 0; -} diff --git a/glide2x/h3/minihwc/makefile b/glide2x/h3/minihwc/makefile deleted file mode 100644 index 0233177..0000000 --- a/glide2x/h3/minihwc/makefile +++ /dev/null @@ -1,76 +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$ -# - -!if "$(DEBUG)" == "1" -VCDEFS = $(VCDEFS) -DGDBG_INFO_ON -!endif - -!if "$(FX_TARGET)" == "DOS" -#Target Dos -PCILIB = $(BUILD_ROOT)\swlibs\lib\fxpci.lib -CINITLIB = $(BUILD_ROOT)\h3\lib\h3cinit.lib -VMODE = dos_mode.c - - -!else -#Target Windows -DXINCS = -I$(DIRECTXSDK)\include -DXDEFS = -DHWC_ACCESS_DDRAW -DXLIBS = $(DIRECTXSDK)\lib\dxguid.lib \ - $(DIRECTXSDK)\lib\ddraw.lib -CINITLIB = -VMODE = win_mode.c -!if "$(HWC_INIT_VXD)" == "1" -PCILIB = $(BUILD_ROOT)\swlibs\lib\fxpci.lib -CINITLIB = $(BUILD_ROOT)\h3\lib\h3cinit.lib -!else -LCDEFS = -DHWC_EXT_INIT -PRIVATE_HEADERS = $(PRIVATE_HEADERS) hwcext.h -!endif -!endif - -!if "$(FX_COMPILER)" == "MICROSOFT" -LCOPTS = /WX -!endif - -LDIRT = -LCINCS = $(LCINCS) \ - $(DXINCS) \ - -I$(DXDDK)\inc \ - -I$(DXDDK)\inc32 \ - -I$(BUILD_ROOT_SWLIBS)\include \ - -I$(BUILD_ROOT)\h3\include -LCDEFS = $(LCDEFS) $(DXDEFS) -HEADERS = $(PRIVATE_HEADERS) minihwc.h setmode.h hwcio.h - -CFILES = minihwc.c hwcio.c gdebug.c $(VMODE) - -SUBLIBRARIES = $(PCILIB) $(DXLIBS) $(CINITLIB) - -LIBRARIES= minihwc.lib - -INSTALL_DESTINATION = $(BUILD_ROOT)\h3 - - -!include $(BUILD_ROOT_SWLIBS)/include/nmake/3dfx.mak - diff --git a/glide2x/h3/minihwc/makefile.linux b/glide2x/h3/minihwc/makefile.linux deleted file mode 100644 index f488661..0000000 --- a/glide2x/h3/minihwc/makefile.linux +++ /dev/null @@ -1,42 +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 = -LCOPTS = -LCINCS += -I$(BUILD_ROOT_SWLIBS)/include -I$(BUILD_ROOT)/h3/include -HEADERS = minihwc.h setmode.h - - -OSDEPC = linhwc.c - -CFILES = $(OSDEPC) hwcio.c gdebug.c - -SUBLIBRARIES = $(PCILIB) - -LIBRARIES= libminihwc.a - -INSTALL_DESTINATION = $(BUILD_ROOT)/$(FX_GLIDE_HW) - - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak - diff --git a/glide2x/h3/minihwc/minihwc.c b/glide2x/h3/minihwc/minihwc.c deleted file mode 100644 index b050372..0000000 --- a/glide2x/h3/minihwc/minihwc.c +++ /dev/null @@ -1,3807 +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 3/17/99 6:14p Dow -** Fixes Phantom Menace, OGL, and others. -** -** 122 3/17/99 3:46p Dow -** Luke Skywalker -** -** 121 3/11/99 8:37p Peter -** update vidOverlayEndScreenCoord when the overlay dims != screen dims -** (w/ optional scaling) -** -** 120 3/10/99 11:52a Peter -** initFifo enable hole counting parameter -** -** 119 3/09/99 12:31p Kcd -** Added MacOS stuff. Fixed refresh constant table (mis)use. -** -** 118 3/05/99 10:06p Peter -** allocate independent state buffers in parallel w/ the command buffers -** -** 117 3/03/99 3:52p Peter -** removed hemorrhaging GetDC and create glide private dc's for ExtEscape -** -** 116 3/02/99 8:03p Dow -** -** 115 2/27/99 12:24p Dow -** New resolutions -** -** 114 2/22/99 5:06p Peter -** cleaned up monitor enum crap -** -** 113 2/19/99 2:00p Atai -** fixed lfbBuffAddr for 800x600 triple buffering lfb access -** -** 112 2/17/99 2:36p Peter -** removed extra dd call, fail agp fifo if no dd agp support, release -** window dc after enum -** -** 111 2/13/99 1:57p Dow -** Added code for new resolutions -** -** 110 2/08/99 6:42p Atai -** use the active window display as sst 0 -** -** 109 2/02/99 4:37p Peter -** hwGetSurfaceinfo gets depth, releasing memory fifo creation dd object -** -** 108 1/25/99 6:37p Peter -** removed redundant macros -** -** 107 1/22/99 4:28p Dow -** Fixed 1600x1200 the right way. -** -** 106 1/22/99 3:02p Dow -** Turned off 2x2 filtering in 2x mode -** -** 105 1/21/99 1:43p Dow -** Fencing for Pallette Download -** -** 104 1/20/99 6:04p Peter -** cleaned up warning -** -** 103 1/20/99 1:51p Dow -** Pithy workaround for PCI gamma problem -** -** 102 1/14/99 11:38a Dow -** Left bits alone in vidproccfg -** -** 101 1/11/99 8:22p Peter -** fixed stride vs width effage that I somehow convinced myself was right -** -** 100 1/11/99 6:31p Dow -** Added Debugging -** -** 99 1/04/99 11:58a Peter -** added windowed context support -** -** 98 12/23/98 12:39p Peter -** hdc cleanup/hwcext_getlinearaddr is not idempotent -** -** 97 12/22/98 5:43p Atai -** turn on 2x mode for vidProcCfg if greater than or equal to 1280 -** -** 96 12/22/98 3:29p Jeske -** use h3InitGetMemSize() instead so that we don't have to worry about it -** screwing up dramInit1 like h3InitSgram() did in the past... -** -** 95 12/22/98 2:46p Atai -** fixed for Banshee/DOS draminit1 value -** -** 94 12/22/98 1:07p Peter -** all dd surface pointers must go through linear map offset to get their -** hw relative offsets -** -** 93 12/17/98 2:08p Jeske -** comment fix -** -** 92 12/16/98 7:13p Peter -** query directdraw object for surface memory area caps and set the -** process id when getting the linear addresses via -** -** 91 12/11/98 1:35p Peter -** window fifo serial # vs pixel cache -** -** 90 12/09/98 5:17p Dow -** Fixed video scaling for lame resolutions -** -** 89 12/07/98 2:18p Dow -** Added debug message for process handle -** -** 88 12/07/98 11:32a Dow -** Fixed 2X resolutions -** -** 87 12/06/98 11:04a Dow -** -** 86 12/04/98 8:42a Dow -** Fixed broken DOS build AGAIN -** -** 85 12/03/98 10:27p Dow -** Added stuff for hwcGetenv -** -** 84 12/03/98 9:11p Dow -** Fixed resolution check -** -** 83 12/02/98 9:35p Dow -** Query Resolutions -** -** 82 12/02/98 2:41p Jeske -** ugh... text badness -** -** 81 12/02/98 2:38p Jeske -** don't set the clocks unless they use the environment variable -** overrides, even for banshee... -** -** 80 12/02/98 2:06p Dow -** Gamma Fully Implemented -** -** 79 11/30/98 6:53p Peter -** video memory fifo's -** -** 78 11/24/98 12:25p Mikec -** made multi-mon on win95 happy -** -** 77 11/24/98 9:43a Atai -** detect multiple cards -** -** 76 11/23/98 3:28p Atai -** fixed the refresh rate stuff -** -** 75 11/20/98 4:48p Jeske -** avenger-dos, for now, make sure we don't call h3InitPlls() on avenger.. -** -** 74 11/19/98 1:51p Dow -** Fixed refresh/resolution issue -** -** 73 11/18/98 8:04p Dow -** grxclk -** -** 72 11/15/98 2:16a Atai -** set device id = 5. Hack for comdex -** -** 71 11/10/98 6:29p Atai -** added min_tramSize for board information. min_tramSize = 0x200000 if -** device id is 3 or mem size is 4 -** -** 70 10/30/98 3:44p Dow -** Fixed Tiled/Linear color/aux bug -** -** 69 10/29/98 5:15p Dow -** Fixed 512x384 -** -** 68 10/21/98 11:22a Peter -** dos happiness w/ the new chris pci library (nee tarolli) -** -** 67 10/14/98 3:37p Dow -** Gamma stuff -** -** 66 10/13/98 8:48p Dow -** Env Var for Board mem -** -** 65 10/08/98 10:15a Dow -** Triple buffering fix -** -** 64 9/18/98 3:08p Dow -** Fixed DOS build -** -** 63 9/17/98 3:58p Dow -** Vidmode Stuff -** -** 62 9/11/98 1:07p Peter -** rounding on raw lfb port addr -** -** 61 9/02/98 1:34p Peter -** watcom warnings -** -** 60 8/25/98 6:48p Dow -** Added scaling for low-res -** -** 59 8/25/98 3:07p Dow -** Checked res of hwcRLSEXCLUSIVE -** -** 58 8/06/98 7:49p Dow -** Moved detection of SDRAM -** -** 57 8/02/98 5:00p Dow -** Glide Surface Extension -** -** 56 7/29/98 3:34p Dow -** -** 55 7/29/98 3:09p Dow -** SDRAM Fixes -** -** 54 7/24/98 6:34p Dow -** Fixed DOS Build -** -** 53 7/24/98 2:02p Dow -** AGP Stuff -** -** 52 7/23/98 1:18a Dow -** Bump & Grind -** -** 51 7/18/98 12:21a Jdt -** added state abuffer -** -** 50 7/16/98 10:26p Dow -** GIW Stuff -** -** 49 7/16/98 2:53p Dow -** Removed useless colBufferAddr frmo surface info -** -** 48 7/15/98 4:09p Dow -** GIW Stuff & DOS Protection -** -** 47 7/14/98 7:19p Dow -** protected some win32 stuff -** -** 46 7/13/98 10:35p Jdt -** Implemented hwcAllocWinFifo, hwcExecuteWinFifo. -** -** 45 7/08/98 5:45p Dow -** Moved fifo back up -** -** 44 7/02/98 12:11p Dow -** LFB fixes -** -** 43 6/30/98 10:28a Dow -** Fixed fouled checkin -** -** 41 6/25/98 6:45p Jdt -** Changes to remove the evil of dxdrvr.c -** -** 40 6/25/98 12:16p Dow -** Added (protected) alternate FIFO layout -** -** 39 6/16/98 6:11p Dow -** Rearranged texture memory -** -** 38 6/16/98 9:49a Dow -** Fixed protected stuff -** -** 37 6/16/98 9:35a Dow -** Comment -> GDBG_INFO conversion -** -** 36 6/12/98 10:09a Jdt -** Fix broken dos build. -** -** 35 6/11/98 7:44p Jdt -** Win98/NT5 Mulitmon 1st Pass -** -** 34 6/10/98 9:49a Peter -** lfb buffer addressing -** -** 33 6/09/98 10:09a Dow -** Init register performance tweaks. -** -** 32 6/06/98 11:42a Dow -** Better buffer alignment for all resolutions. -** -** 31 6/06/98 10:11a Dow -** Changed AUXPAD from 0 to 0x1000 to offset aux buffer. -** -** 30 6/05/98 7:34p Dow -** Fixed 8x6-12x10 resolutions -** -** 29 6/05/98 6:21p Jeske -** now everyone will dxClose(), not just windows -** -** 28 6/05/98 6:37p Dow -** 1600x1200 perf tuning -** -** 27 6/05/98 5:28p Jeske -** apparently we need to not call h3InitSetVideoMode() for this to work, -** will this work in non640x480 resolutions? we may need to fix that later -** -** 26 6/05/98 3:27p Dow -** 1600x1200 Works -** -** 25 6/04/98 9:36p Jeske -** now we leave VGA legacy decoding on in hwcInitRegisters so we can set -** video modes -** -** 24 6/04/98 6:52p Dow -** Resolutions to 1600x1200 -** -** 23 6/03/98 1:52p Jeske -** added code to convert from Glide's ordinal refresh number to a refresh -** rate in Hz when calling h3InitSetVideoMode(). We really should specify -** -** 22 6/01/98 5:48p Jeske -** allow h3InitSetVideoMode to fail and handle it... -** -** 21 5/31/98 9:02a Dow -** 800x600 Resolution -** -** 20 5/28/98 6:34p Dow -** Fixed top scanline bug -** -** 19 5/27/98 3:35p Mc -** Removed blocks of HW_IO_LOAD and HW_IO_STORE that chris put in. -** -** 18 5/20/98 8:13p Dow -** device rev -** -** 17 5/20/98 4:16p Dow -** Added env var for FIFO size -** -** 16 5/15/98 2:46p Dow -** Attempt to patch back regs on NT -** -** 15 5/13/98 4:26p Dow -** Protected obsolete IO code that was bodging NT -** -** 14 4/27/98 2:30p Dow -** OpenProcess stuff -** -** 13 4/22/98 5:29p Dow -** Added calls to HWCEXT_HWCSETEXCLUSIVE and HWCEXT_HWCRLSEXCLUSIVE -** -** 12 4/16/98 10:14p Dow -** EXT_HWC is default init method -** -** 11 4/13/98 5:49p Dow -** Turning theory into practice -** -** 10 4/09/98 9:34p Dow -** synched with change in h3cinit -** -** 9 4/08/98 12:25p Dow -** LfbMemoryConfig fix -** -** 8 4/07/98 10:40p Dow -** LFB Fixes -** -** 7 4/05/98 2:19p Dow -** DOS/WIN32 stepping on each others' dicks -** -** 6 4/03/98 2:03p Dow -** DOS Glide modes -** -** 5 3/28/98 10:51a Dow -** Fixes for FIFO bug -** -** 4 3/20/98 1:11p Dow -** Now checking revision of chip -** -** 3 3/20/98 11:43a Dow -** fifo placement for windows -** -** 2 3/11/98 8:27p Dow -** WinGlide -** -** 1 3/04/98 4:13p Dow -** -*/ -#if !defined(GDBG_INFO_ON) || (GDBG_INFO_ON == 0) -#if defined(GDBG_INFO_ON) -#undef GDBG_INFO_ON -#endif /* defined(GDBG_INFO_ON) */ -#define GDBG_INFO_ON -#endif /* !defined(GDBG_INFO_ON) || (GDBG_INFO_ON == 0) */ - -#include -#include -#include - -#include <3dfx.h> - -#ifdef HWC_EXT_INIT -#include "hwcext.h" -#else -#include -#endif - -#include -#include -#include "hwcio.h" -#include "setmode.h" - -#ifdef __WIN32__ -#define WIN32_LEAN_AND_MEAN -#include - -#include -#include "qmodes.h" -#define IS_32 -#define Not_VxD -#include -#include -#include - -#endif - -#ifdef macintosh -#include -#include -#endif - -#ifdef GETENV -#undef GETENV -#endif - -#define GETENV hwcGetenv - -#define MAXFIFOSIZE 0x40000 - -static hwcInfo hInfo; -static char errorString[1024]; -static int num_monitor = 0; -static FxU32 fenceVar; - - -#if defined(__WATCOMC__) -/* - * P6 Fence - * - * Here's the stuff to do P6 Fencing. This is required for the - * certain things on the P6 - * - * dpc - 21 may 1997 - FixMe! - * This was yoinked from sst1/include/sst1init.h, and should be - * merged back into something if we decide that we need it later. - */ -void -p6Fence(void); -#pragma aux p6Fence = \ -"xchg eax, fenceVar" \ -modify [eax]; - - -#define P6FENCE p6Fence() -#elif defined(__MSC__) -#define P6FENCE {_asm xchg eax, fenceVar} -#elif defined(__POWERPC__) && defined(__MWERKS__) -#define P6FENCE __eieio() -#else -#error "P6 Fencing in-line assembler code needs to be added for this compiler" -#endif /* Compiler specific fence commands */ - -/* Hack */ -#if macintosh -#define __DOS32__ 1 -#endif - -static FxU32 -pow2Round(FxU32 val, FxU32 roundVal); - -static FxU32 -hwcBufferLfbAddr(FxU32 bufNum, - const hwcBoardInfo* bInfo, - FxBool colBufAlignP); - -static FxU32 -calcBufferSize(FxU32 xres, FxU32 yres, FxBool tiled); - -static FxU32 -calcBufferStride(FxU32 xres, FxBool tiles); - -static FxU32 -calcBufferSizeInTiles(FxU32 xres, FxU32 yres); - -static FxU32 -calcBufferHeightInTiles(FxU32 yres); - -static FxBool resolutionSupported[HWC_MAX_BOARDS][0xF]; - -/* -** Function Prototypes -*/ -#ifdef HWC_EXT_INIT - -typedef void *HMONITOR; -typedef BOOL (CALLBACK* MONITORENUMPROC)(HMONITOR, HDC, LPRECT, LPARAM); -typedef WINUSERAPI BOOL WINAPI -EnumDisplayMonitors_func( HDC hdc, - LPCRECT lprcClip, - MONITORENUMPROC lpfnEnum, - LPARAM dwData); - -typedef struct { - HDC dc; - HMONITOR mon; -} DevEnumRec; - -static BOOL CALLBACK -monitorEnum( HMONITOR handle, HDC dc, LPRECT rect, LPARAM param ) -{ - BOOL rv = TRUE; - hwcExtRequest_t - ctxReq; - hwcExtResult_t - ctxRes; - - ctxReq.which = HWCEXT_GETDEVICECONFIG; - - GDBG_INFO(80, "monitorEnum: ExtEscape:HWCEXT_GETDEVICECONFIG\n"); - if ( ExtEscape(dc, EXT_HWC, sizeof(ctxReq), (LPSTR) &ctxReq, sizeof(ctxRes), (LPSTR) &ctxRes) ) { - if ( ctxRes.optData.deviceConfigRes.vendorID == 0x121a ) { - DevEnumRec* - data = (DevEnumRec*)param; - LPCSTR - drvName = "DISPLAY", - devName = NULL; - - /* If we're on a multi-mon capable system then we may have - * different display type devices so we have to get the device - * name explicitly for the CreateDC call. - */ - if (handle != NULL) { -#define CCHDEVICENAME 32 - typedef struct { - DWORD cbSize; - RECT rcMonitor; - RECT rcWork; - DWORD dwFlags; - TCHAR szDevice[CCHDEVICENAME]; - } MONITORINFOEX, *LPMONITORINFOEX; - typedef BOOL (CALLBACK* GetMonitorInfoProc)(HMONITOR, LPMONITORINFOEX); - static GetMonitorInfoProc monitorInfoProc = NULL; - - if (monitorInfoProc == NULL) { - HMODULE user32 = GetModuleHandle("user32"); - - if (user32 != NULL) { - monitorInfoProc = (GetMonitorInfoProc)GetProcAddress(user32, "GetMonitorInfoA"); - } - } - - if (monitorInfoProc != NULL) { - MONITORINFOEX monInfo; - - monInfo.cbSize = sizeof(monInfo); - if ((*monitorInfoProc)(handle, &monInfo)) { - devName = monInfo.szDevice; - drvName = NULL; - } - } - } - - /* Make a private 'copy' of the dc so that we're not affected by - * other people dorking with dc's etc. - * - * FixMe: Is there a better way to do this? I did not see a - * CopyDC or anything like that. - */ - dc = CreateDC(drvName, - devName, - NULL, - NULL); - - data[num_monitor].dc = dc; - data[num_monitor].mon = handle; - - num_monitor++; - rv = (num_monitor < HWC_MAX_BOARDS); - } - } - - return rv; -} /* monitorEnum */ - -/* -** Use the active window display as the first sst device -*/ -static BOOL CALLBACK -displayMonitor( HMONITOR handle, HDC dc, LPRECT rect, LPARAM param ) -{ - BOOL rv = TRUE; - hwcExtRequest_t - ctxReq; - hwcExtResult_t - ctxRes; - - ctxReq.which = HWCEXT_GETDEVICECONFIG; - - GDBG_INFO(80, "displayMonitor: ExtEscape:HWCEXT_GETDEVICECONFIG\n"); - if ( ExtEscape(dc, EXT_HWC, sizeof(ctxReq), (LPSTR) &ctxReq, sizeof(ctxRes), (LPSTR) &ctxRes) ) { - if ( ctxRes.optData.deviceConfigRes.vendorID == 0x121a ) { - DevEnumRec* - data = (DevEnumRec*) param; - FxI32 - i; - - for (i = 0; i < num_monitor; i++) { - HDC *return_dc = ( HDC* ) data + (2*i); - HMONITOR *return_hmon = ( HMONITOR* ) data + (2*i+1); - - if ((data[i].dc == dc) && (data[i].mon == handle)) { - data[i].dc = data[0].dc; - data[i].mon = data[0].mon; - - data[0].dc = dc; - data[0].mon = handle; - - break; - } - } - rv = FALSE; - } - } - return rv; -} /* displayMonitor */ -#endif - -hwcInfo * -hwcInit(FxU32 vID, FxU32 dID) -{ -#define FN_NAME "hwcInit" -#ifdef HWC_EXT_INIT - { - DevEnumRec - data[HWC_MAX_BOARDS*2]; - int monitor; - - GDBG_INFO(80, "%s\n", FN_NAME); - errorString[0] = '\0'; - - /* find glide compatible devices */ - GDBG_INFO(80, "%s: Finding Glide compatible devices\n", FN_NAME); - { - /* Grab the DC of the Desktop. */ - HDC hdc = GetDC(NULL); - HMODULE user32 = GetModuleHandle( "user32.dll" ); - - for (monitor = 0; monitor < HWC_MAX_BOARDS; monitor++) { - data[monitor].dc = NULL; - data[monitor].mon = NULL; - } - num_monitor = 0; - - if ( user32 ) { - EnumDisplayMonitors_func* - enumDisplayMonitors = (void*)GetProcAddress( user32, "EnumDisplayMonitors" ); - - if ( enumDisplayMonitors ) { - HWND - curWindow = GetActiveWindow(); - - GDBG_INFO(80, "%s: multi-monitor capable OS ( NT5/W98 )\n", FN_NAME); - enumDisplayMonitors( hdc, 0, monitorEnum, (LPARAM)data ); - - /* - ** use the active window display (if there is one yet - ** associated w/ the current thread) as sst 0 - */ - if (curWindow != NULL) { - HDC curWindowDC = GetDC(curWindow); - - if (curWindowDC != NULL) { - enumDisplayMonitors( curWindowDC, 0, displayMonitor, (LPARAM)data ); - ReleaseDC(curWindow, curWindowDC); - } - } - } else { /* for win95/nt4, assume we have one board */ - monitorEnum(NULL, hdc, NULL, (LPARAM)&data); - } - } - - ReleaseDC(NULL, hdc); - } - - hInfo.nBoards = 0; - for (monitor = 0; monitor < num_monitor; monitor++) { - hwcExtRequest_t - ctxReq; - hwcExtResult_t - ctxRes; - HDC - hdc = data[monitor].dc; - HMONITOR - hmon = data[monitor].mon; - int - status; - - /* Allocate a context with the Driver */ - ctxReq.which = HWCEXT_ALLOCCONTEXT; - ctxReq.optData.allocContextReq.protocolRev = HWCEXT_PROTOCOLREV; - ctxReq.optData.allocContextReq.appType = HWCEXT_ABAPPTYPE_FSEM; - - GDBG_INFO(80, FN_NAME ": ExtEscape:HWCEXT_ALLOCCONTEXT\n"); - status = ExtEscape(hdc, EXT_HWC, - sizeof(ctxReq), (LPSTR) &ctxReq, - sizeof(ctxRes), (LPSTR) &ctxRes); - - if (status < 1) { - if (status == 0) { - strcpy(errorString, "HWCEXT Not Implemented"); - } else { - strcpy(errorString, "HWCEXT: Alloc Context Failed"); - } - GDBG_INFO(80, "%s: %s.\n", FN_NAME, errorString); - return NULL; - } - - hInfo.boardInfo[monitor].extContextID = ctxRes.optData.allocContextRes.contextID; - - hInfo.nBoards++; - hInfo.boardInfo[monitor].boardNum = monitor; - hInfo.boardInfo[monitor].hdc = hdc; - hInfo.boardInfo[monitor].hMon = hmon; - - ctxReq.which = HWCEXT_GETDEVICECONFIG; - - GDBG_INFO(80, FN_NAME ": ExtEscape:HWCEXT_GETDEVICECONFIG.\n"); - status = ExtEscape(hdc, EXT_HWC, - sizeof(ctxReq), (void *) &ctxReq, - sizeof(ctxRes), (void *) &ctxRes); - - hInfo.boardInfo[monitor].pciInfo.initialized = 1; - hInfo.boardInfo[monitor].pciInfo.vendorID = - ctxRes.optData.deviceConfigRes.vendorID; - - hInfo.boardInfo[monitor].pciInfo.deviceID = - ctxRes.optData.deviceConfigRes.deviceID; - hInfo.boardInfo[monitor].devRev = - ctxRes.optData.deviceConfigRes.chipRev; - hInfo.boardInfo[monitor].h3Mem = - (ctxRes.optData.deviceConfigRes.fbRam >> 20); - - hInfo.boardInfo[monitor].min_tramSize = - ((hInfo.boardInfo[monitor].h3Mem == 4 ) || - (hInfo.boardInfo[monitor].pciInfo.deviceID == 3)) ? 0x200000 : 0x400000; - - if (getenv("FX_GLIDE_FBRAM")) { - hInfo.boardInfo[monitor].h3Mem = atoi(getenv("FX_GLIDE_FBRAM")); - } - - checkResolutions(resolutionSupported[monitor], - (void *) hInfo.boardInfo[monitor].hMon); - } - } -#elif defined(HWC_GDX_INIT) - { - GDHandle screenDeviceHandle; - CntrlParam paramBlock; - OSErr myErr; - FxU32 i = 0; - hwcControl_t control; - - hInfo.nBoards = 0; - - screenDeviceHandle = DMGetFirstScreenDevice(dmOnlyActiveDisplays); - while(screenDeviceHandle) { - /* First, verify that it's a screen device */ - if(TestDeviceAttribute(screenDeviceHandle,screenDevice)) { - /* Then verify it actually has a driver, so we know gdRefNum - is valid. */ - if(!TestDeviceAttribute(screenDeviceHandle,noDriver)) { - /* HLock((Handle)screenDeviceHandle); */ - paramBlock.ioCRefNum = (*screenDeviceHandle)->gdRefNum; - /* HUnlock((Handle)screenDeviceHandle); */ - /* driver-specific status request */ - paramBlock.csCode = k3DfxGetDeviceConfig; - *(hwcControl_t **)(¶mBlock.csParam[0]) = &control; - - myErr = PBControl((ParmBlkPtr)¶mBlock, false); - - if (myErr == noErr) { - /* Woohoo! Save off the config info for this card */ - hInfo.nBoards++; - hInfo.boardInfo[i].hMon = screenDeviceHandle; - hInfo.boardInfo[i].devRev = - control.res.optData.deviceConfigRes.devRev; - hInfo.boardInfo[i].h3Mem = - control.res.optData.deviceConfigRes.h3Mem; - hInfo.boardInfo[i].pciInfo.vendorID = - control.res.optData.deviceConfigRes.vendorID; - hInfo.boardInfo[i].pciInfo.deviceID = - control.res.optData.deviceConfigRes.deviceID; - hInfo.boardInfo[i].pciInfo.pciBaseAddr[0] = - control.res.optData.deviceConfigRes.hwBase; - hInfo.boardInfo[i].pciInfo.pciBaseAddr[1] = - control.res.optData.deviceConfigRes.lfbBase; - hInfo.boardInfo[i].pciInfo.pciBaseAddr[2] = - control.res.optData.deviceConfigRes.ioPortBase; - hInfo.boardInfo[i].pciInfo.initialized = 1; - - /* No ROM info, don't care */ - i++; - } - } - } - screenDeviceHandle = DMGetNextScreenDevice(screenDeviceHandle,dmOnlyActiveDisplays); - } - } -#else /* HWC_GDX_INIT */ - { - int i; - FxU32 bn; - - pciOpen(); - - hInfo.nBoards = 0; - - errorString[0] = '\0'; - - for (i = 0; i < HWC_MAX_BOARDS; i++) { - hInfo.boardInfo[i].pciInfo.initialized = 0; - if (pciFindCardMulti(vID, dID, &bn, i)) { - hInfo.nBoards++; - hInfo.boardInfo[i].boardNum = 0; - - hInfo.boardInfo[i].boardNum = 0; - - hInfo.boardInfo[i].pciInfo.initialized = 1; - hInfo.boardInfo[i].pciInfo.vendorID = vID; - hInfo.boardInfo[i].pciInfo.deviceID = dID; - /* - * NOTE: in the code above we learn about memsize here: - * hInfo.boardInfo[i].h3Mem - * - * However, in DOS, since we have not mapped the board yet, we have - * to wait until later. (see hwcInitRegisters()) - dwj - */ - - /* Get some board Info */ - pciGetConfigData( PCI_REVISION_ID, bn, &hInfo.boardInfo[i].devRev); - - /* Get all the base addresses */ - pciGetConfigData(PCI_BASE_ADDRESS_0, bn, - &hInfo.boardInfo[i].pciInfo.pciBaseAddr[0]); - pciGetConfigData(PCI_BASE_ADDRESS_1, bn, - &hInfo.boardInfo[i].pciInfo.pciBaseAddr[1]); - pciGetConfigData(PCI_IO_BASE_ADDRESS, bn, - &hInfo.boardInfo[i].pciInfo.pciBaseAddr[2]); - pciGetConfigData(PCI_ROM_BASE_ADDRESS, bn, - &hInfo.boardInfo[i].pciInfo.pciBaseAddr[3]); - } - } - - } -#endif /* HWC_EXT_INIT */ - if (hInfo.nBoards) - return &hInfo; - else - return NULL; - -#undef FN_NAME -} /* hwcInit */ - -FxBool -hwcMapBoard(hwcBoardInfo *bInfo, FxU32 bAddrMask) -{ -#define FN_NAME "hwcMapBoard" - - if (bInfo->pciInfo.initialized == FXFALSE) { - sprintf(errorString, "%s: Called before hwcInit\n", FN_NAME); - return FXFALSE; - } - - bInfo->linearInfo.initialized = FXTRUE; - -#ifdef HWC_EXT_INIT - { - hwcExtRequest_t req; - hwcExtResult_t res; - - req.which = HWCEXT_GETLINEARADDR; - req.optData.linearAddrReq.devNum = 0; - req.optData.linearAddrReq.pHandle = (FxU32)OpenProcess(PROCESS_ALL_ACCESS, - FALSE, - GetCurrentProcessId()); - - GDBG_INFO(80, FN_NAME ": Process Handle = 0x%x\n", - req.optData.linearAddrReq.pHandle); - - GDBG_INFO(80, FN_NAME ": ExtEscape:HWCEXT_GETLINEARADDR\n"); - ExtEscape((HDC) bInfo->hdc, EXT_HWC, sizeof(req), (void *) &req, - sizeof(res), (void *) &res); - - if (res.resStatus != 1) { - strcpy(errorString, "HWCEXT_GETLINEARADDR Failed"); - return FXFALSE; - } - bInfo->linearInfo.linearAddress[0] = - res.optData.linearAddressRes.baseAddresses[0]; - bInfo->linearInfo.linearAddress[1] = - res.optData.linearAddressRes.baseAddresses[1]; - - /* What is this????? */ - bInfo->pciInfo.pciBaseAddr[2] = - res.optData.linearAddressRes.baseAddresses[1]; - } -#elif defined(HWC_GDX_INIT) - { - FxU32 - bAddr; - - /* memory mapped register spaces */ - for (bAddr = 0; bAddr < 2; bAddr++) { - if ((bAddrMask & (0x01UL << bAddr)) != 0x00UL) { - bInfo->linearInfo.linearAddress[bAddr] = bInfo->pciInfo.pciBaseAddr[bAddr]; - } - } - /* FixMe: This gets used to set the pll's so I guess we need it here - * unconditionally - */ - bInfo->linearInfo.linearAddress[2] = bInfo->pciInfo.pciBaseAddr[2]; - - /* Sorry, ROM mapping on MacOS seems whacked out for some reason. */ - bInfo->linearInfo.linearAddress[3] = 0; - - /* Kludge. Pass boardInfo to acceleration stuff. */ -#if GLIDE3 - { - extern hwcBoardInfo *acceleratorBoardInfo; - acceleratorBoardInfo = bInfo; - } -#endif - } -#else - { - FxU32 - bAddr; - - /* memory mapped register spaces */ - for (bAddr = 0; bAddr < 2; bAddr++) { - if ((bAddrMask & (0x01UL << bAddr)) != 0x00UL) { - bInfo->linearInfo.linearAddress[bAddr] = - (FxU32)pciMapCardMulti(bInfo->pciInfo.vendorID, bInfo->pciInfo.deviceID, - 0x1000000, &bInfo->deviceNum, bInfo->boardNum, bAddr); - } - } - - /* FixMe: This gets used to set the pll's so I guess we need it here - * unconditionally - */ - bInfo->linearInfo.linearAddress[2] = - (FxU32)pciMapCardMulti(bInfo->pciInfo.vendorID, bInfo->pciInfo.deviceID, - 0x1000000, &bInfo->deviceNum, bInfo->boardNum, 2); - - /* Does the caller want the rom bios? */ - if ((bAddrMask & 0x08UL) != 0x00UL) { - bInfo->linearInfo.linearAddress[3] = - (FxU32)pciMapCardMulti(bInfo->pciInfo.vendorID, bInfo->pciInfo.deviceID, - 0x1000000, &bInfo->deviceNum, bInfo->boardNum, 3); - } - } -#endif - - return FXTRUE; -#undef FN_NAME -} /* hwcMapBoard */ - -FxBool -hwcInitRegisters(hwcBoardInfo *bInfo) -{ -#define FN_NAME hwcInitRegisters - FxU32 - grxSpeedInMHz, memSpeedInMHz, - sgramMode, sgramMask, sgramColor; - - if (bInfo->linearInfo.initialized == FXFALSE) { - printf(errorString, "%s: Called before hwcMapBoard\n", FN_NAME); - return FXFALSE; - } - - bInfo->regInfo.initialized = FXTRUE; - - bInfo->regInfo.ioMemBase = - bInfo->linearInfo.linearAddress[0] + SST_IO_OFFSET; - bInfo->regInfo.cmdAGPBase = - bInfo->linearInfo.linearAddress[0] + SST_CMDAGP_OFFSET; - bInfo->regInfo.waxBase = - bInfo->linearInfo.linearAddress[0] + SST_2D_OFFSET; - bInfo->regInfo.sstBase = - bInfo->linearInfo.linearAddress[0] + SST_3D_OFFSET; - bInfo->regInfo.lfbBase = - bInfo->linearInfo.linearAddress[0] + SST_LFB_OFFSET; - bInfo->regInfo.rawLfbBase = - bInfo->linearInfo.linearAddress[1]; - bInfo->regInfo.ioPortBase = (FxU16) bInfo->pciInfo.pciBaseAddr[2] & ~0x1; - - /* Figure out if it's SDRAM */ - { - FxU32 dramInit1; - - HWC_IO_LOAD(bInfo->regInfo, dramInit1, dramInit1); - bInfo->sdRAM = ((dramInit1 & SST_MCTL_TYPE_SDRAM) != 0x00UL); - - if (GETENV("SSTH3_SDRAM")) - bInfo->sdRAM = FXTRUE; - } - -#if !defined(HWC_EXT_INIT) && !defined(HWC_GDX_INIT) - { - FxU32 - pciInit0, - pciCommandReg = - BIT(0) | /* enable i/o decode */ - BIT(1); /* enable memory decode */ - - /* Enable PCI memory and I/O decode */ - pciSetConfigData(PCI_COMMAND, bInfo->deviceNum, &pciCommandReg); - - HWC_IO_LOAD(bInfo->regInfo, pciInit0, pciInit0); - pciInit0 |= SST_PCI_READ_WS | SST_PCI_WRITE_WS; - HWC_IO_STORE(bInfo->regInfo, pciInit0, pciInit0); - } -#endif - - if (GETENV("SSTH3_SGRAM_MODE")) - sgramMode = atoi(GETENV("SSTH3_SGRAM_MODE")); - else if (GETENV("SSTH3_SGRAM_222") && - (atoi(GETENV("SSTH3_SGRAM_222")) != 0)) - sgramMode = 0x27; - else - sgramMode = 0x37; - - if (GETENV("SSTH3_SGRAM_MASK")) - sgramMask = atoi(GETENV("SSTH3_SGRAM_MASK")); - else - sgramMask = 0xFFFFFFFF; - - if (GETENV("SSTH3_SGRAM_COLOR")) - sgramColor = atoi(GETENV("SSTH3_SGRAM_COLOR")); - else - sgramColor = 0; - - if (GETENV("SSTH3_GRXCLOCK")) - grxSpeedInMHz = atoi(GETENV("SSTH3_GRXCLOCK")); - else - grxSpeedInMHz = 100; - - if (GETENV("SSTH3_MEMCLOCK")) - memSpeedInMHz = atoi(GETENV("SSTH3_MEMCLOCK")); - else - memSpeedInMHz = 100; - -#if !defined(HWC_ACCESS_DDRAW) && !defined(HWC_GDX_INIT) - if (GETENV("HAL_NOINIT") == NULL || atoi(GETENV("HAL_NOINIT")) == 0) { - - /* - * final DOS initialiation - */ - - /* don't set the clocks unless they used the environment variables */ - - if (GETENV("SSTH3_GRXCLOCK") || GETENV("SSTH3_MEMCLOCK")) { - switch (bInfo->pciInfo.deviceID) { - case 0x03: /* banshee */ - h3InitPlls(bInfo->regInfo.ioPortBase, grxSpeedInMHz, memSpeedInMHz); - break; - case 0x5: /* voodoo3/avenger */ - break; - default: /* unknown board type!!! */ - return FXFALSE; - } - } - - /* read back the memory size, since we - * don't know it under DOS (see hwcInit) - dwj - */ - bInfo->h3Mem = h3InitGetMemSize(bInfo->regInfo.ioPortBase); - - h3InitVga(bInfo->regInfo.ioPortBase, FXTRUE); - } -#endif - - return FXTRUE; - -#undef FN_NAME -} /* hwcInitRegisters */ - -#define FIFOPAD 0x0000 -#define AUXPAD 0x1000 - -FxBool -hwcAllocBuffers(hwcBoardInfo *bInfo, FxU32 nColBuffers, FxU32 nAuxBuffers) -{ -#define FN_NAME "hwcAllocBuffers" - FxBool - bufferAlignP; - FxU32 - bNum, - h3Mem = bInfo->h3Mem << 20, - bufStride, - bufSize; - FxI32 - i, - tramSize, fifoSize; - - if (bInfo->vidInfo.initialized == FXFALSE) { - sprintf(errorString, "%s: Called before video initialization\n", FN_NAME); - return FXFALSE; - } - - GDBG_INFO(80, "%s(0x%x, 0x%x, 0x%x)\n", FN_NAME, bInfo, nColBuffers, nAuxBuffers); - - /* I've decided on > 2 instead of == 3 because we may support more - than 3 buffers in the future, and want 4 to set the - triple-buffering bit in dramInit1, also */ - bInfo->vidInfo.tripleBuffering = (nColBuffers > 2); - - bInfo->vidInfo.stride = bufStride = - calcBufferStride(bInfo->vidInfo.xRes, bInfo->vidInfo.tiled); - - /* We want to place the FIFO after the tram but before the color - buffers with some pad */ - bufSize = calcBufferSize(bInfo->vidInfo.xRes, bInfo->vidInfo.yRes, - bInfo->vidInfo.tiled); - - bInfo->buffInfo.bufStride = bufStride; - bInfo->buffInfo.bufSize = bufSize; - - if (bInfo->vidInfo.tiled) { - bInfo->buffInfo.bufStrideInTiles = (bufStride >> 7); - bInfo->buffInfo.bufSizeInTiles = - calcBufferSizeInTiles(bInfo->vidInfo.xRes, bInfo->vidInfo.yRes); - bInfo->buffInfo.bufHeightInTiles = - calcBufferHeightInTiles(bInfo->vidInfo.yRes); - } - - bInfo->buffInfo.initialized = FXTRUE; - bInfo->buffInfo.nColBuffers = nColBuffers; - bInfo->buffInfo.nAuxBuffers = nAuxBuffers; - - /* First, do the buffer allocation */ - - - if (nAuxBuffers > 0) { - bInfo->buffInfo.auxBuffEnd = - bInfo->buffInfo.auxBuffStart = h3Mem; - - bInfo->buffInfo.auxBuffStart -= bufSize; - - /* auxBuffers start on odd pages, so we need to check to see if - * it's on an even page and, if so, make it odd. - * - * NB: We need to do the same sort of 'alignment' thing here as for - * the color buffers. - */ - bufferAlignP = ((bInfo->buffInfo.auxBuffStart & 0x1000UL) == 0); - if (bufferAlignP) bInfo->buffInfo.auxBuffStart -= 0x1000; - - } - - for (i = nColBuffers - 1; i >= 0; i--) { - if ((FxU32) i == (nColBuffers - 1)) { - FxU32 top; - if (nAuxBuffers > 0) - top = bInfo->buffInfo.auxBuffStart; - else - top = h3Mem; - - bInfo->buffInfo.colBuffStart[i] = - bInfo->buffInfo.colBuffEnd[i] = top; - - } else { - bInfo->buffInfo.colBuffStart[i] = - bInfo->buffInfo.colBuffEnd[i] = - bInfo->buffInfo.colBuffStart[i + 1]; - } - - bInfo->buffInfo.colBuffStart[i] -= bufSize; - - /* As a memory access optmization colorBuffers start on even - * pages, while aux buffers start on odd pages. Thus we must - * check to see if we're startding on an odd page here and, if so, - * add a page to the start. - */ - bufferAlignP = ((bInfo->buffInfo.colBuffStart[i] & 0x1000UL) != 0); - if (bufferAlignP) bInfo->buffInfo.colBuffStart[i] -= 0x1000; - } - - /* Now we can calculate some other stuff... */ - bInfo->fbOffset = bInfo->buffInfo.colBuffStart[0]; -#if 0 - bInfo->tramOffset = - fifoSize = MAXFIFOSIZE; - tramSize = bInfo->fbOffset - bInfo->tramOffset; - if (tramSize < bInfo->min_tramSize) { - /* Now we have to shrink the FIFO */ - tramSize = bInfo->min_tramSize; - fifoSize = bInfo->fbOffset - bInfo->min_tramSize; - if (fifoSize < 0) { - GDBG_INFO(80, "%s: Not enough memory for resolution + min texture\n", - FN_NAME); - sprintf(errorString, - "%s: Not enough memory for resolution + min texture\n", - FN_NAME); - return FXFALSE; - } - } - - - bInfo->fifoInfo.fifoLength = (FxU32) fifoSize; - bInfo->fifoInfo.fifoStart = 0; - bInfo->tramOffset = (FxU32) fifoSize; - bInfo->tramSize = (FxU32) tramSize; - -#else - bInfo->tramOffset = 0; - fifoSize = MAXFIFOSIZE; - tramSize = bInfo->fbOffset - bInfo->tramOffset - fifoSize; - if (tramSize < (FxI32)bInfo->min_tramSize) { - /* Now we have to shrink the FIFO */ - tramSize = bInfo->min_tramSize; - fifoSize = bInfo->fbOffset - bInfo->min_tramSize; - if (fifoSize < 0) { - GDBG_INFO(80, "%s: Not enough memory for resolution + min texture\n", - FN_NAME); - sprintf(errorString, - "%s: Not enough memory for resolution + min texture\n", - FN_NAME); - return FXFALSE; - } - } - - bInfo->fifoInfo.fifoLength = (FxU32) fifoSize; - bInfo->fifoInfo.fifoStart = bInfo->fbOffset - fifoSize; - - bInfo->fifoInfo.fifoLength -= 0x2000; - - bInfo->tramOffset = 0; - bInfo->tramSize = (FxU32) tramSize; - -#endif - -#if 1 -#define LFBSTRIDE 0x1000 - { - FxU32 colBuffOffset = 0; - FxU32 colBufAlignP = 0; - - for (bNum = 0; bNum < nColBuffers; bNum++) { - if ((colBuffOffset & 0x1000UL) != 0) { - colBuffOffset += 0x1000UL; - colBufAlignP++; - } - bInfo->buffInfo.lfbBuffAddr[bNum] = - hwcBufferLfbAddr(bNum, bInfo, colBufAlignP); - colBuffOffset += bufSize; - } - - if (nAuxBuffers > 0) { - if ((colBuffOffset & 0x1000UL) == 0) { - colBuffOffset += 0x1000UL; - colBufAlignP++; - } - bInfo->buffInfo.lfbBuffAddr[nColBuffers] = - hwcBufferLfbAddr(nColBuffers, bInfo, colBufAlignP); - } - } -#endif - - bInfo->buffInfo.initialized = FXTRUE; - - GDBG_INFO(80, "%s: Board Info:\n", FN_NAME); - GDBG_INFO(80, "\thdc: 0x%x\n", bInfo->hdc); - GDBG_INFO(80, "\textContextID: 0x%x\n", bInfo->extContextID); - GDBG_INFO(80, "\tdevRev: 0x%x\n", bInfo->devRev); - GDBG_INFO(80, "\tfbOffset: 0x%x\n", bInfo->fbOffset); - GDBG_INFO(80, "\th3Rev: 0x%x\n", bInfo->h3Rev); - GDBG_INFO(80, "\th3Mem: 0x%x\n", bInfo->h3Mem); - GDBG_INFO(80, "\tboardNum: 0x%x\n", bInfo->boardNum); - GDBG_INFO(80, "\tdeviceNum: 0x%x\n", bInfo->deviceNum); - - GDBG_INFO(80, "%s: Buffer Info:\n", FN_NAME); - GDBG_INFO(80, "\tbufSize: 0x%x\n", bInfo->buffInfo.bufSize); - GDBG_INFO(80, "\tbufSizeInTiles: 0x%x\n", bInfo->buffInfo.bufSizeInTiles); - GDBG_INFO(80, "\tbufStride: 0x%x\n", bInfo->buffInfo.bufStride); - GDBG_INFO(80, "\tbufStrideInTiles:0x%x\n", bInfo->buffInfo.bufStrideInTiles); - GDBG_INFO(80, "\tbufHeightInTiles:0x%x\n", bInfo->buffInfo.bufHeightInTiles); - GDBG_INFO(80, "\tnColBuffers: 0x%x\n", bInfo->buffInfo.nColBuffers); - for (i = 0; i < (FxI32) nColBuffers; i++) { - GDBG_INFO(80, "\tcolBuff %d Start: 0x%x\n", i, bInfo->buffInfo.colBuffStart[i]); - GDBG_INFO(80, "\tcolBuff %d End: 0x%x\n", i, bInfo->buffInfo.colBuffEnd[i]); - } - GDBG_INFO(80, "\tnAuxBuffers: 0x%x\n", bInfo->buffInfo.nAuxBuffers); - GDBG_INFO(80, "\tauxBuffStart: 0x%x\n", bInfo->buffInfo.auxBuffStart); - GDBG_INFO(80, "\tauxBuffEnd: 0x%x\n", bInfo->buffInfo.auxBuffEnd); - - GDBG_INFO(80, "%s: FIFO Info:\n", FN_NAME); - GDBG_INFO(80, "\tfifoStart: 0x%x\n", bInfo->fifoInfo.fifoStart); - GDBG_INFO(80, "\tfifoLength: 0x%x\n", bInfo->fifoInfo.fifoLength); - - return FXTRUE; -#undef FN_NAME -} /* hwcAllocBuffers */ - -FxBool -hwcInitFifo(hwcBoardInfo *bInfo, FxBool enableHoleCounting) -{ -#define FN_NAME "hwcInitFifo" - FxBool - agpEnable = FXFALSE; - FxU32 - cagpRegs; /* pointer to Cmd/AGP regs */ - - if (bInfo->regInfo.initialized == FXFALSE) { - sprintf(errorString, "%s: Called before hwcMapBoard\n", FN_NAME); - return FXFALSE; - } - cagpRegs = bInfo->regInfo.cmdAGPBase; - - if (bInfo->buffInfo.initialized == FXFALSE) { - sprintf(errorString, "%s: Called before hwcInitBuffers\n", FN_NAME); - return FXFALSE; - } - - /* disable the CMD fifo */ - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.baseSize, 0); - - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.baseAddrL, - bInfo->fifoInfo.fifoStart>>12); - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.readPtrL, bInfo->fifoInfo.fifoStart); - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.readPtrH, 0); - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.aMin, bInfo->fifoInfo.fifoStart-4); - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.aMax, bInfo->fifoInfo.fifoStart-4); - - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.depth, 0); - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.holeCount, 0); - /* Fifo LWM /HWM/ THRESHOLD */ - if (bInfo->pciInfo.deviceID == 0x3) { /* banshee */ - HWC_CAGP_STORE(bInfo->regInfo, cmdFifoThresh, - (0x09 << SST_HIGHWATER_SHIFT) | 0x2); - } else { - HWC_CAGP_STORE(bInfo->regInfo, cmdFifoThresh, - (0xf << SST_HIGHWATER_SHIFT) | 0x8); - } - - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.baseSize, (((bInfo->fifoInfo.fifoLength >> 12) - 1) | - SST_EN_CMDFIFO | - (enableHoleCounting ? 0 : SST_CMDFIFO_DISABLE_HOLES) | - (agpEnable ? SST_CMDFIFO_AGP : 0))); - - GDBG_INFO(80, "%s: CMD FIFO placed at physical addr 0x%x\n", - FN_NAME, - bInfo->fifoInfo.fifoStart); - - return FXTRUE; - -#undef FN_NAME -} /* hwcInitFifo */ - -#if 0 -/* Currently unused. */ -static SstIORegs savedIORegs; -#endif - -void -hwcInitVideoOverlaySurface( - hwcRegInfo *rInfo, - FxU32 enable, /* 1=enable Overlay surface (OS), 1=disable */ - FxU32 stereo, /* 1=enable OS stereo, 0=disable */ - FxU32 horizScaling, /* 1=enable horizontal scaling, 0=disable */ - FxU32 dudx, /* horizontal scale factor (ignored if not */ - /* scaling) */ - FxU32 verticalScaling, /* 1=enable vertical scaling, 0=disable */ - FxU32 dvdy, /* vertical scale factor (ignored if not */ - /* scaling) */ - FxU32 filterMode, /* duh */ - FxU32 tiled, /* 0=OS linear, 1=tiled */ - FxU32 pixFmt, /* pixel format of OS */ - FxU32 clutBypass, /* bypass clut for OS? */ - FxU32 clutSelect, /* 0=lower 256 CLUT entries, 1=upper 256 */ - FxU32 startAddress, /* board address of beginning of OS */ - FxU32 stride) /* distance between scanlines of the OS, in */ - /* units of bytes for linear OS's and tiles for */ - /* tiled OS's */ -{ - FxU32 doStride; - FxU32 vidProcCfg; - - HWC_IO_LOAD((*rInfo), vidProcCfg, vidProcCfg); - - vidProcCfg &= ~(SST_OVERLAY_TILED_EN | - SST_OVERLAY_STEREO_EN | - SST_OVERLAY_HORIZ_SCALE_EN | - SST_OVERLAY_VERT_SCALE_EN | - SST_OVERLAY_TILED_EN | - SST_OVERLAY_PIXEL_FORMAT | - SST_OVERLAY_CLUT_BYPASS | - SST_OVERLAY_CLUT_SELECT); - - if (enable) - vidProcCfg |= SST_OVERLAY_EN; - - if (stereo) - vidProcCfg |= SST_OVERLAY_STEREO_EN; - - if (horizScaling) - vidProcCfg |= SST_OVERLAY_HORIZ_SCALE_EN; - - if (verticalScaling) - vidProcCfg |= SST_OVERLAY_VERT_SCALE_EN; - - if (tiled) { - vidProcCfg |= SST_OVERLAY_TILED_EN; - } - - vidProcCfg |= SST_OVERLAY_PIXEL_RGB565D; /* Turn on RGB565Dithered */ - vidProcCfg &= ~SST_CURSOR_EN; /* Turn off HW Cursor */ - vidProcCfg |= SST_OVERLAY_TILED_EN; /* Overlay tile space enable */ - - - if (clutBypass) - vidProcCfg |= SST_OVERLAY_CLUT_BYPASS; - - if (clutSelect) - vidProcCfg |= SST_OVERLAY_CLUT_SELECT; - - HWC_IO_STORE((*rInfo), vidProcCfg, vidProcCfg); - - /* */ - HWC_IO_LOAD((*rInfo), vidDesktopOverlayStride, doStride); - doStride &= ~(SST_OVERLAY_LINEAR_STRIDE | SST_OVERLAY_TILE_STRIDE); - - stride <<= SST_OVERLAY_STRIDE_SHIFT; - if (tiled) - stride &= SST_OVERLAY_TILE_STRIDE; - else - stride &= SST_OVERLAY_LINEAR_STRIDE; - doStride |= stride; - - HWC_IO_STORE((*rInfo), vidDesktopOverlayStride, doStride); - -} /* hwcInitVideoOverlaySurface */ - -FxU32 -hwcInitLookupRefresh(FxU32 ord_refresh) -{ -#define FN_NAME "hwcInitLookupRefresh" - FxU32 refresh_hz; - - switch(ord_refresh) { - case(GR_REFRESH_60Hz): - refresh_hz = 60; - break; - case(GR_REFRESH_70Hz): - refresh_hz = 70; - break; - case(GR_REFRESH_72Hz): - refresh_hz = 72; - break; - case(GR_REFRESH_75Hz): - refresh_hz = 75; - break; - case(GR_REFRESH_80Hz): - refresh_hz = 80; - break; - case(GR_REFRESH_85Hz): - refresh_hz = 85; - break; - case(GR_REFRESH_90Hz): - refresh_hz = 90; - break; - case(GR_REFRESH_100Hz): - refresh_hz = 100; - break; - case(GR_REFRESH_120Hz): - refresh_hz = 120; - break; - default: - GDBG_ERROR(FN_NAME, "Unsupported Refresh Rate -- defaulting to 60hz\n"); - refresh_hz = 60; - break; - } - return (refresh_hz); -#undef FN_NAME -} /* hwcInitLookupRefresh */ - -#ifdef HWC_ACCESS_DDRAW - -#define LINEAR_STRIDE_ALIGN 16UL - -static FxBool -_hwcLinear2HWAddr(const FxU32 linearAddr, - const FxU32 linearBaseAddr, - const FxU32 linearStride, - const hwcBoardInfo* bInfo, - hwcSurfaceInfo* ret) -{ -#define FN_NAME "_hwcLinear2HWAddr" - FxU32 - pciStride, /* page stride */ - hwStride, /* tile stride */ - tileMark, /* delineation between linear and tiled */ - lpTileBase; /* linear addr of tileMark */ - FxBool - retVal = FXFALSE, - isTiled; /* is the surface tiled? */ - - /* determine lfb baseAddress and hw offset to buffer */ - { - hwcExtRequest_t - req; /* Request to HWC_EXT */ - hwcExtResult_t - res; /* Result from HWC_EXT */ - - /* query for tile watermark & compute tile characteristics */ - req.which = HWCEXT_GETDEVICECONFIG; - GDBG_INFO(80, FN_NAME ": ExtEscape:HWCEXT_GETDEVICECONFIG\n"); - retVal = (ExtEscape(bInfo->hdc, EXT_HWC, - sizeof(req), (LPSTR)&req, - sizeof(res), (LPSTR)&res) > 0); - if (!retVal) { - strcpy(errorString, "HWCEXT_GETDEVICECONFIG failed"); - GDBG_INFO(80, "%s: %s.\n", FN_NAME, errorString); - goto __errExit; - } - pciStride = res.optData.deviceConfigRes.pciStride; - hwStride = res.optData.deviceConfigRes.hwStride; - tileMark = res.optData.deviceConfigRes.tileMark; - - lpTileBase = linearBaseAddr + tileMark; - isTiled = (linearAddr >= lpTileBase); - } - - ret->pciStride = pciStride; - ret->tileBase = tileMark; - ret->lpSurface = linearAddr; - ret->lpLFB = linearBaseAddr; - ret->hwStride = hwStride; - - /* Compute things that depend on the offset wrt the tile mark */ - ret->isTiled = isTiled; - if (ret->isTiled) { - const FxU32 - tileStride = hwStride, - tilePitch = pciStride, - tileOffset = linearAddr - lpTileBase, - y = tileOffset / tilePitch, - x = tileOffset - (y * tilePitch), - tile = ((y / HWC_TILE_HEIGHT) * tileStride) + (x / HWC_TILE_WIDTH); - - ret->fbOffset = (tile << 12UL) + tileMark; - ret->fbStride = ret->hwStride | SST_BUFFER_MEMORY_TILED; - } else { - /* NB: Banshee (and derivatives) have a 16-byte alignment - * restriction on the stride and offset for color/aux buffers, but - * it is left to the client to correctly adjust for this when - * setting the values. - */ - ret->fbOffset = linearAddr - linearBaseAddr; - ret->fbStride = linearStride; - } - - __errExit: - return retVal; -#undef FN_NAME -} /* _hwcLinear2HWAddr */ - -static FxU32 -_hwcPixelFormat2Bytes(const DDPIXELFORMAT* pixelFormat) -{ -#define FN_NAME "_hwcPixelFormat2Bytes" - const DWORD - formatFlags = pixelFormat->dwFlags; - FxU32 - retVal = 0x00UL; - - if ((formatFlags & DDPF_PALETTEINDEXED8) == DDPF_PALETTEINDEXED8) { - retVal = 1; - } else if ((formatFlags & DDPF_RGB) == DDPF_RGB) { - retVal = (pixelFormat->dwRGBBitCount >> 0x03UL); - if ((retVal == 0) || (retVal > 2)) { - retVal = 0; - GDBG_INFO(80, FN_NAME": Invalid surface rgb bit count(0x%X)\n", - pixelFormat->dwRGBBitCount); - } - } else { - GDBG_INFO(80, FN_NAME": Invalid surface pixel format flags(0x%X)\n", - formatFlags); - } - - return retVal; -#undef FN_NAME -} /* _hwcPixelFormat2Bytes */ - -/*------------------------------------------------------------------- - Function: hwcGetSurfaceInfo - Date: 14-Jul-98 - Implementor(s): dow - Description: - Returns information about a Glide (or DDraw) surface - - Arguments: - - Return: - -------------------------------------------------------------------*/ -FxBool -hwcGetSurfaceInfo(const hwcBoardInfo* bInfo, - FxU32 *sfc, - hwcSurfaceInfo *ret) -{ -#define FN_NAME "hwcGetSurfaceInfo" - /* AssUMe it's a DDraw surface for now */ - LPDIRECTDRAWSURFACE2 - surf = (LPDIRECTDRAWSURFACE2) sfc; - DDSURFACEDESC - desc; - DWORD - ddErr; - FxBool - retVal; - FxU32 - lfbBase, /* linear addr for base of LFB */ - lpSurface; /* Linear addr for the surface */ - - /* Lock the surface and get some info */ - desc.dwSize = sizeof(desc); - ddErr = IDirectDrawSurface2_Lock(surf, 0, &desc, - DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR, 0); - retVal = (ddErr == DD_OK); - if (!retVal) { - sprintf(errorString, "%s: IDirectDrawSurface2_Lock (0x%X)\n", - FN_NAME, ddErr); - GDBG_INFO(80, "%s", errorString); - goto __errExit; - } - - /* Grab the memory pointer */ - lpSurface = (DWORD) desc.lpSurface; - - /* Unlock the surface */ - desc.dwSize = sizeof(desc); - IDirectDrawSurface2_Unlock(surf, desc.lpSurface); - - /* Get surface dimensions here rather than re-getting the surface - * description later since these should all be valid here. - */ - ret->height = desc.dwHeight; - ret->width = desc.dwWidth; - ret->depth = _hwcPixelFormat2Bytes(&desc.ddpfPixelFormat); - retVal = (ret->depth != 0x00UL); - if (!retVal) { - sprintf(errorString, "%s: Invalid surface pixel format (0x%X)\n", - FN_NAME, desc.ddpfPixelFormat.dwFlags); - GDBG_INFO(80, "%s", errorString); - goto __errExit; - } - - /* Get base addresses of the board */ - { - hwcExtRequest_t - req; /* Request to HWC_EXT */ - hwcExtResult_t - res; /* Result from HWC_EXT */ - - /* This address was set when the board was mapped in hwcMapBoard */ - lfbBase = bInfo->linearInfo.linearAddress[1]; - - /* The DirectDraw driver may have re-mapped memory different than - * the 2d driver's hw mapping. We have to figure out the correct - * hw address for packet offsets and color buffer stuff. - */ - if (retVal) { - req.which = HWCEXT_LINEAR_MAP_OFFSET; - req.optData.mapInfoReq.mapAddr = lfbBase; - req.optData.mapInfoReq.remapAddr = lpSurface; - - GDBG_INFO(80, FN_NAME ": ExtEscape:HWCEXT_LINEAR_MAP_OFFSET\n"); - retVal = (ExtEscape(bInfo->hdc, EXT_HWC, - sizeof(req), (LPCSTR)&req, - sizeof(res), (LPSTR)&res) > 0); - if (!retVal) { - strcpy(errorString, "HWCEXT_LINEAR_MAP_OFFSET failed"); - GDBG_INFO(80, "%s: %s.\n", FN_NAME, errorString); - } - - /* lpSurface is now an address relative to the 2d driver's base - * address as returned by the HWCEXT_GETLINEARADDR callback. - */ - lpSurface = (lfbBase + res.optData.mapInfoRes.linAddrOffset); - } - } - if (!retVal) goto __errExit; - - /* Get the rest of the information about the hw relative address - * from the linear address's location in memory. - */ - retVal = _hwcLinear2HWAddr(lpSurface, - lfbBase, - desc.lPitch, - bInfo, - ret); - - __errExit: - return retVal; -#undef FN_NAME -} /* hwcGetSurfaceInfo */ - -FxU32 -hwcAllocWinContext(hwcBoardInfo* bInfo) -{ -#define FN_NAME "hwcAllocWinContext" - FxU32 - retVal = 0x00UL; - hwcExtRequest_t - ctxReq; - hwcExtResult_t - ctxRes; - - /* Allocate a context with the Driver */ - ctxReq.which = HWCEXT_ALLOCCONTEXT; - ctxReq.optData.allocContextReq.protocolRev = HWCEXT_PROTOCOLREV; - ctxReq.optData.allocContextReq.appType = HWCEXT_ABAPPTYPE_WIND; - - GDBG_INFO(80, FN_NAME ": ExtEscape:HWCEXT_ALLOCCONTEXT\n"); - if (ExtEscape(bInfo->hdc, EXT_HWC, - sizeof(ctxReq), (LPSTR)&ctxReq, - sizeof(ctxRes), (LPSTR)&ctxRes) < 1) { - strcpy(errorString, FN_NAME": HWCEXT_ALLOCCONTEXT failed"); - } else { - retVal = ctxRes.optData.allocContextRes.contextID; - } - - return retVal; -#undef FN_NAME -} /* hwcAllocWinContext */ - -FxBool -hwcFreeWinContext(hwcBoardInfo* bInfo, - FxU32 winContextId) -{ -#define FN_NAME "hwcFreeWinContext" - hwcExtRequest_t - req; - hwcExtResult_t - res; - - req.which = HWCEXT_RELEASECONTEXT; - req.optData.releaseContextReq.contextID = winContextId; - - GDBG_INFO(80, FN_NAME ": ExtEscape:HWCEXT_RELEASECONTEXT\n"); - return (ExtEscape(bInfo->hdc, EXT_HWC, - sizeof(req), (void*)&req, - sizeof(res), (void*)&res) > 0); -#undef FN_NAME -} /* hwcFreeWinContext */ - - -FxBool -hwcAllocWinFifo(hwcBoardInfo* bInfo, - HwcWinFifo* fifo, - FxU32* surface) -{ -#define FN_NAME "hwcAllocWinFifo" - FxBool - retVal = FXFALSE; - hwcExtRequest_t - req; - hwcExtResult_t - res; - - /* Set undefined fifo type to start, and always clear the serial - * number for this context. - */ - fifo->fifoType = 0xFFFFFFFFUL; - - /* Check to see that we have valid surface owner to hang - * the command fifo surface off of. - */ - retVal = (surface != NULL); - if (retVal) { - LPDIRECTDRAW - objDD = NULL; - LPDIRECTDRAWSURFACE - objSentinal = NULL, - objFifo = NULL; - DDSURFACEDESC - fifoDesc, - sentinalDesc; - - /* Get the surface owner so that we can try to allocate a new - * surface for the fifo. On windows this will be a direct draw - * object, and we need a dd4 object for agp surfaces. - */ - { - LPDIRECTDRAWSURFACE2 - objSurface = NULL; - - /* Make sure that this is a Surface2 object so that we can get - * the DirectDraw object that owns this surface and piggy back - * our objects ontop of it. - */ - retVal = (IDirectDrawSurface_QueryInterface((LPDIRECTDRAWSURFACE)surface, - &IID_IDirectDrawSurface2, - &objSurface) == DD_OK); - if (!retVal) { - GDBG_INFO(80, "%s: Require atleast IDirectDrawSurface2.\n", FN_NAME); - goto __errSurfaceFifo; - } - - /* Get the dd object for the surface creation */ - retVal = (IDirectDrawSurface2_GetDDInterface(objSurface, - &objDD) == DD_OK); - if (!retVal) { - GDBG_INFO(80, "%s: Could not acquire DirectDraw object.\n", FN_NAME); - goto __errSurfaceDDObj; - } - - __errSurfaceDDObj: - if (objSurface != NULL) IDirectDrawSurface_Release(objSurface); - if (!retVal) goto __errSurfaceFifo; - } - - /* Is the 2d command fifo in agp or local frame buffer space? */ - memset(&req, 0, sizeof(req)); - memset(&res, 0, sizeof(res)); - - req.which = HWCEXT_FIFOINFO; - GDBG_INFO(80, FN_NAME ": ExtEscape:HWCEXT_FIFOINFO\n"); - retVal = (ExtEscape((HDC)bInfo->hdc, EXT_HWC, - sizeof(req), (void*)&req, - sizeof(res), (void*)&res) > 0); - if (!retVal) { - GDBG_INFO(80, "%s: HWCEXT_FIFOINFO failed to determine current 2d fifo type.\n", - FN_NAME); - goto __errSurfaceFifo; - } - - /* Basic surface type for the fifo */ - memset(&fifoDesc, 0, sizeof(fifoDesc)); - fifoDesc.dwSize = sizeof(fifoDesc); - fifoDesc.dwFlags = (DDSD_CAPS | - DDSD_WIDTH | DDSD_HEIGHT | - DDSD_PITCH | - DDSD_PIXELFORMAT); - - /* Set pixel format to make the allocation be 32-bit words */ - fifoDesc.ddpfPixelFormat.dwSize = sizeof(fifoDesc.ddpfPixelFormat); - fifoDesc.ddpfPixelFormat.dwFlags = (DDPF_ALPHAPIXELS | - DDPF_RGB); - fifoDesc.ddpfPixelFormat.dwRGBBitCount = 32UL; - fifoDesc.ddpfPixelFormat.dwRGBAlphaBitMask = 0xFF000000UL; - fifoDesc.ddpfPixelFormat.dwRBitMask = 0x00FF0000UL; - fifoDesc.ddpfPixelFormat.dwGBitMask = 0x0000FF00UL; - fifoDesc.ddpfPixelFormat.dwBBitMask = 0x000000FFUL; - - /* We want the command fifo someplace that the hw can get to - * directly. Whether this is is local to the board or agp is - * controlled by where the 2d driver has its fifo. - */ - fifoDesc.ddsCaps.dwCaps = (DDSCAPS_OFFSCREENPLAIN | - DDSCAPS_VIDEOMEMORY); - - { - DDCAPS - ddCaps; - - /* Make sure that the DirectDraw driver knows about different - * video memory types before setting the bits to differentiate - * local from agp memory. - */ - memset(&ddCaps, 0, sizeof(ddCaps)); - ddCaps.dwSize = sizeof(ddCaps); - - retVal = (IDirectDraw_GetCaps(objDD, - &ddCaps, - NULL) == DD_OK); - if (!retVal) { - GDBG_INFO(80, "%s: Could not determine if DirectDraw handles separate memory types.\n", - FN_NAME); - goto __errSurfaceFifo; - } - - /* Make the fifo type match the 2d fifo type if the driver can - * handle different memory types. - */ - switch (res.optData.fifoInfoRes.fifoType) { - case HWCEXT_FIFO_AGP: - if ((ddCaps.dwCaps2 & DDCAPS2_NONLOCALVIDMEM) != 0x00UL) { - fifoDesc.ddsCaps.dwCaps |= DDSCAPS_NONLOCALVIDMEM; - } else { - retVal = FXFALSE; - } - break; - - case HWCEXT_FIFO_FB: - if ((ddCaps.ddsCaps.dwCaps & DDSCAPS_LOCALVIDMEM) != 0x00UL) - fifoDesc.ddsCaps.dwCaps |= DDSCAPS_LOCALVIDMEM; - break; - - case HWCEXT_FIFO_HOST: - default: - retVal = FXFALSE; - break; - } - if (!retVal) goto __errSurfaceFifo; - } - - /* Allocate a sentinal surface so that the client can 'know' when - * a given fifo segment has actually been executed by reading a - * client specified serial # out of the buffer. This only needs to - * be big enough to hold the size of a serial #, but we need to - * work around some sort of whacked agp bug when reading back. See - * hwcExecuteStatusWinFifo() for details. - */ - sentinalDesc = fifoDesc; - - sentinalDesc.dwHeight = 4; - sentinalDesc.dwWidth = 4; - - retVal = (IDirectDraw_CreateSurface(objDD, - &sentinalDesc, - &objSentinal, - 0) == DD_OK); - if (!retVal) { - GDBG_INFO(80, "%s: Could not allocate surface for serial #'s.\n", FN_NAME); - goto __errSurfaceFifo; - } - - /* Make stride and width the same so that we get the entire - * surface as teh command fifo for the hw to just jsr to. - * - * NB: Currently DirectDraw will not allow surfaces to have a - * width greater than that of the primary surface. We will fail if - * we don't get this surface w/o checking the primary surface's - * width because if we don't have a contiguous block it is going - * to be a pain to have the hw jsr to each of these 'lines'. It is - * likely that DirectDraw is not going to sub-allocate out of this - * slop like it could, but I would prefer not to take chances - * until we have to. - */ - fifoDesc.lPitch = 0x1000UL; - fifoDesc.dwWidth = (fifoDesc.lPitch >> 2UL); - - /* Try to allocate a surface that contains some # of command - * stream and persistant state buffers. This is - * allocated in hw page units (4k) rather than the client - * allocation units, but that should be transparent since - * the client will just not use the extra slop. - */ -#define MAX(__a, __b) (((__a) > (__b)) ? (__a) : (__b)) - { - const FxU32 - allocFifo = MAX(fifo->cmdBuf.allocUnit, 0x1000UL), - allocState = MAX(fifo->stateBuf.allocUnit, 0x1000UL), - allocUnit = pow2Round(allocFifo + allocState + 0xFFFUL, 0x1000UL); - const char* - numAllocStr = GETENV("FX_WINFIFO_INIT_ALLOC"); - FxU32 - numAlloc = ((numAllocStr == NULL) - ? 0x8UL - : atoi(numAllocStr)); - DWORD - ddErr; - - while(numAlloc > 0) { - fifoDesc.dwHeight = (allocUnit * numAlloc) / fifoDesc.lPitch; - ddErr = IDirectDraw_CreateSurface(objDD, - &fifoDesc, - &objFifo, - 0); - retVal = (ddErr == DD_OK); - if (retVal) break; - - if ((ddErr != DDERR_OUTOFVIDEOMEMORY) || - (ddErr != DDERR_OUTOFMEMORY)) break; - - /* Try a smaller allocation */ - numAlloc--; - } - if (!retVal) { - GDBG_INFO(80, "%s: Could not get cmdFifo DirectDraw surface. (0x%X)\n", - FN_NAME, ddErr); - goto __errSurfaceFifo; - } - - /* Its now safe to overwrite the client allocUnit's to the - * rounded allocation units because we've finally done all of - * the stuff that could fail. - */ - fifo->cmdBuf.size = allocFifo * numAlloc; - fifo->cmdBuf.allocUnit = allocFifo; - - fifo->stateBuf.size = allocState * numAlloc; - fifo->stateBuf.allocUnit = allocState; - } -#undef MAX - - /* Fill in the rest of the client's return buffer */ - fifo->fifoType = res.optData.fifoInfoRes.fifoType; - - fifo->surfaceFifo = (FxU32*)objFifo; - fifo->surfaceSentinal = (FxU32*)objSentinal; - - /* Do the lock so that we can write the sentinal, but the - * client is responsible for locking before use. - */ - if (hwcLockWinFifo(bInfo, fifo)) { - /* Write bogus serial # */ - *(volatile FxU32*)fifo->sentinalBufferAddr = 0x0UL; - - hwcUnlockWinFifo(bInfo, fifo); - } - - __errSurfaceFifo: - /* Free our directdraw objects if something bad happened. */ - if (!retVal) { - if (objSentinal != NULL) IDirectDrawSurface_Release(objSentinal); - if (objFifo != NULL) IDirectDrawSurface_Release(objFifo); - } - if (objDD != NULL) IDirectDraw_Release(objDD); - } - - /* Could not allocate directly accessible fifo so setup the host - * memory backed fifo which will get dumped at execute time. - */ - if (!retVal && (bInfo->hdc != 0x00UL)) { - fifo->fifoType = HWCEXT_FIFO_HOST; - - fifo->cmdBuf.hwOffset = 0x00UL; - fifo->cmdBuf.size = fifo->cmdBuf.allocUnit; - fifo->stateBuf.hwOffset = 0x00UL; - fifo->stateBuf.size = fifo->stateBuf.allocUnit; - - /* This can never fail since the client is responsible for - * allocating this memory. - */ - retVal = FXTRUE; - } - - return retVal; -#undef FN_NAME -} /* hwcAllocWinFifo */ - -FxBool -hwcLockWinFifo(hwcBoardInfo* bInfo, - HwcWinFifo* fifo) -{ -#define FN_NAME "hwcLockWinFifo" - FxBool - retVal = FXFALSE; - - if (fifo->fifoType == HWCEXT_FIFO_HOST) { - retVal = FXTRUE; - } else if ((fifo->fifoType == HWCEXT_FIFO_FB) || - (fifo->fifoType == HWCEXT_FIFO_AGP)) { - DDSURFACEDESC - fifoDesc, - sentinalDesc; - - if (fifo->lockCount > 0) goto __alreadyLocked; - if ((fifo->surfaceFifo == NULL) || - (fifo->surfaceSentinal == NULL)) goto __errFifoLock; - - /* Get base pointer to the fifo surfaces. - * - * NB: In theory we should leave these locked for the duration of - * the of the fifo lock and we would need to set the - * DDLOCK_NOSYSLOCK flag when doing the lock. However, when we do - * this type of lock the directDraw driver re-maps the physical - * address to a new set of linear address pages. So we take advantage - * of the fact taht the current implementation will not move memory - * behind our backs outside of a surface lock. - */ -#define HWC_DIRECTDRAW_DRIVER_NOSYSLOCK_FLAGS 0 - fifoDesc.dwSize = sizeof(fifoDesc); - retVal = (IDirectDrawSurface_Lock((LPDIRECTDRAWSURFACE)fifo->surfaceFifo, - NULL, - &fifoDesc, - HWC_DIRECTDRAW_DRIVER_NOSYSLOCK_FLAGS | - DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT, - NULL) == DD_OK); - - /* NB: Since there's no working DDLOCK_NOSYSLOCK we unlock the surface - * here, and rely on the current implementation to leave the linear - * mapping to the hw intact after the unlocking. - */ - IDirectDrawSurface_Unlock((LPDIRECTDRAWSURFACE)fifo->surfaceFifo, NULL); - if (!retVal) { - strcpy(errorString, "Could not lock cmdFifo surface"); - GDBG_INFO(80, "%s: %s.\n", FN_NAME, errorString); - goto __errFifoLock; - } - - sentinalDesc.dwSize = sizeof(sentinalDesc); - retVal = (IDirectDrawSurface_Lock((LPDIRECTDRAWSURFACE)fifo->surfaceSentinal, - NULL, - &sentinalDesc, - HWC_DIRECTDRAW_DRIVER_NOSYSLOCK_FLAGS | - DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT, - NULL) == DD_OK); - - /* NB: Since there's no working DDLOCK_NOSYSLOCK we unlock the surface - * here, and rely on the current implementation to leave the linear - * mapping to the hw intact after the unlocking. - */ - IDirectDrawSurface_Unlock((LPDIRECTDRAWSURFACE)fifo->surfaceSentinal, NULL); - if (!retVal) { - strcpy(errorString, "Could not lock serial # surface"); - GDBG_INFO(80, "%s: %s.\n", FN_NAME, errorString); - goto __errFifoLock; - } - - fifo->cmdBuf.baseAddr = (FxU32)fifoDesc.lpSurface; - fifo->stateBuf.baseAddr = (fifo->cmdBuf.baseAddr + - fifo->cmdBuf.size); - fifo->sentinalBufferAddr = (FxU32)sentinalDesc.lpSurface; - - /* The DirectDraw driver may have re-mapped memory different than - * the 2d driver's hw mapping. We have to figure out the correct - * hw address for packet offsets and color buffer stuff. - */ - { - hwcExtRequest_t - req; - hwcExtResult_t - res; - const FxU32 - lfbBase = bInfo->linearInfo.linearAddress[1]; /* lfb space */ - FxU32 - tileMark; - - /* query for tile watermark & compute tile characteristics */ - req.which = HWCEXT_GETDEVICECONFIG; - GDBG_INFO(80, FN_NAME ": ExtEscape:HWCEXT_GETDEVICECONFIG\n"); - retVal = (ExtEscape((HDC)bInfo->hdc, EXT_HWC, - sizeof(req), (LPSTR)&req, - sizeof(res), (LPSTR)&res) > 0); - if (!retVal) { - strcpy(errorString, "HWCEXT_GETDEVICECONFIG failed"); - GDBG_INFO(80, "%s: %s.\n", FN_NAME, errorString); - goto __errFifoLock; - } - tileMark = res.optData.deviceConfigRes.tileMark; - - { - struct remapRec { - FxU32 remapAddr; - FxU32* remapOffset; - FxU32 surfaceType; - } remapAddrList[] = { - { fifo->cmdBuf.baseAddr, &fifo->cmdBuf.hwOffset, fifo->fifoType }, - { fifo->stateBuf.baseAddr, &fifo->stateBuf.hwOffset, fifo->fifoType }, - { fifo->sentinalBufferAddr, &fifo->sentinalBufferOffset, HWCEXT_FIFO_FB } - }; - FxU32 i; - - for(i = 0; i < sizeof(remapAddrList) / sizeof(remapAddrList[0]); i++) { - FxU32 hwOffset; - - req.which = HWCEXT_LINEAR_MAP_OFFSET; - req.optData.mapInfoReq.mapAddr = lfbBase; - req.optData.mapInfoReq.remapAddr = remapAddrList[i].remapAddr; - - GDBG_INFO(80, FN_NAME ": ExtEscape:HWCEXT_LINEAR_MAP_OFFSET\n"); - retVal = (ExtEscape((HDC)bInfo->hdc, EXT_HWC, - sizeof(req), (LPCSTR)&req, - sizeof(res), (LPSTR)&res) > 0); - if (!retVal) { - strcpy(errorString, "HWCEXT_LINEAR_MAP_OFFSET failed"); - GDBG_INFO(80, "%s: %s.\n", FN_NAME, errorString); - goto __errFifoLock; - } - - /* Make sure we have the right offset for tiled/linear addresses */ - hwOffset = res.optData.mapInfoRes.linAddrOffset; - if ((remapAddrList[i].surfaceType == HWCEXT_FIFO_FB) && (hwOffset >= tileMark)) { - hwcSurfaceInfo surfaceInfo; - - retVal = _hwcLinear2HWAddr(remapAddrList[i].remapAddr, - remapAddrList[i].remapAddr - hwOffset, - 0x00UL, - bInfo, - &surfaceInfo); - if (!retVal) goto __errFifoLock; - hwOffset = surfaceInfo.fbOffset; - } - *remapAddrList[i].remapOffset = hwOffset; - } - } - } - - __alreadyLocked: - /* Finally, declare success */ - retVal = FXTRUE; - - __errFifoLock: - ; - } - - if (retVal) fifo->lockCount++; - - return retVal; -#undef FN_NAME -} /* hwcLockWinFifo */ - -FxBool -hwcUnlockWinFifo(hwcBoardInfo* bInfo, - HwcWinFifo* fifo) -{ -#define FN_NAME "hwcUnlockWinFifo" - FxBool - retVal = ((fifo->lockCount > 0) && - ((fifo->fifoType == HWCEXT_FIFO_HOST) || - (fifo->fifoType == HWCEXT_FIFO_FB) || - (fifo->fifoType == HWCEXT_FIFO_AGP))); - - if (retVal) { - fifo->lockCount--; - - if (fifo->lockCount == 0) { - if ((fifo->fifoType == HWCEXT_FIFO_FB) || - (fifo->fifoType == HWCEXT_FIFO_AGP)) { - /* Do nothing for now since the surfaces were unlocked in - * hwcLockWinFifo since we're not using the NOSYSLOCK flags - * when doing the DirectDraw surface lock. - */ - } - } - } - - return retVal; -#undef FN_NAME -} /* hwcUnlockWinFifo */ - -FxBool -hwcFreeWinFifo( hwcBoardInfo* bInfo, - HwcWinFifo* fifo ) -{ -#define FN_NAME "hwcFreeWinFifo" - - /* What type of fifo do we have? */ - if ((fifo->fifoType == HWCEXT_FIFO_FB) || - (fifo->fifoType == HWCEXT_FIFO_AGP)) { - if (fifo->surfaceFifo != NULL) { - LPDIRECTDRAWSURFACE - objFifo = (LPDIRECTDRAWSURFACE)fifo->surfaceFifo; - - IDirectDrawSurface_Release(objFifo); - - fifo->surfaceFifo = NULL; - fifo->cmdBuf.baseAddr = - fifo->cmdBuf.hwOffset = - fifo->cmdBuf.size = - fifo->stateBuf.baseAddr = - fifo->stateBuf.hwOffset = 0x00UL; - } - - if (fifo->surfaceSentinal != NULL) { - LPDIRECTDRAWSURFACE - objSentinal = (LPDIRECTDRAWSURFACE)fifo->surfaceSentinal; - - IDirectDrawSurface_Release(objSentinal); - - fifo->surfaceSentinal = NULL; - fifo->sentinalBufferAddr = - fifo->sentinalBufferOffset = 0x00UL; - } - } - - fifo->fifoType = HWCEXT_FIFO_INVALID; - - return FXTRUE; -#undef FN_NAME -} /* hwcFreeWinFifo */ - -FxBool -hwcExecuteWinFifo(hwcBoardInfo* bInfo, - const FxU32 winContextId, - const HwcWinFifo* fifo, - const FxU32 serialNumber) -{ -#define FN_NAME "hwcExecuteWinFifo" - hwcExtRequest_t req; - hwcExtResult_t res; - - memset( &req, 0, sizeof( req ) ); - memset( &res, 0, sizeof( res ) ); - - req.which = HWCEXT_EXECUTEFIFO; - req.contextID = winContextId; - - req.optData.executeFifoReq.fifoType = fifo->fifoType; - - req.optData.executeFifoReq.fifoPtr = fifo->cmdBuf.baseAddr; - req.optData.executeFifoReq.fifoSize = fifo->cmdBuf.size >> 2UL; - req.optData.executeFifoReq.statePtr = fifo->stateBuf.baseAddr; - req.optData.executeFifoReq.stateSize = fifo->stateBuf.size >> 2UL; - req.optData.executeFifoReq.serialNumber = serialNumber; - - if (fifo->fifoType != HWCEXT_FIFO_HOST) { - req.optData.executeFifoReq.fifoOffset = fifo->cmdBuf.hwOffset; - req.optData.executeFifoReq.stateOffset = fifo->stateBuf.hwOffset; - req.optData.executeFifoReq.sentinalOffset = fifo->sentinalBufferOffset; - } - - GDBG_INFO(80, FN_NAME": Id(0x%X) state(0x%X) cmd(0x%X)\n", - winContextId, - req.optData.executeFifoReq.stateSize, - req.optData.executeFifoReq.fifoSize); - - GDBG_INFO(80, FN_NAME ": ExtEscape:HWCEXT_EXECUTEFIFO\n"); - return ( ExtEscape( (HDC)bInfo->hdc, EXT_HWC, - sizeof( req ), (void*)&req, - sizeof( res ), (void*)&res ) > 0 ); -#undef FN_NAME -} /* hwcExecuteWinFifo */ - -FxU32 -hwcExecuteStatusWinFifo(hwcBoardInfo* bInfo, - const HwcWinFifo* fifo, - const FxU32 serialNumber) -{ -#define FN_NAME "hwcExecuteStatusWinFifo" - FxU32 - retVal = ~0x00UL; - - switch(fifo->fifoType) { - /* Host fifo always executes synchronously */ - case HWCEXT_FIFO_HOST: - retVal = serialNumber; - break; - - case HWCEXT_FIFO_FB: - case HWCEXT_FIFO_AGP: - { - volatile FxU32* - bufAddr = (volatile FxU32*)fifo->sentinalBufferAddr; - - /* We need to do some extra reads here so that we make sure taht - * the data we're returning is coherent w/ the actual frame - * buffer due to the intervening pixel cache. The cache is, - * currently, 4 dwords, and appears to be aligned on this - * boundary as well so reading 4 dwords away should be flushing. - * - * NB: The surface for the serial # was allocated big enough to - * handle this so we would not have to worry about it here. - */ - retVal = bufAddr[0]; - retVal = bufAddr[0 + 4]; - retVal = bufAddr[0]; - } - break; - - case HWCEXT_FIFO_INVALID: - default: - GDBG_ERROR(FN_NAME, "Invalid fifoType"); - break; - } - - return retVal; -#undef FN_NAME -} /* hwcExecuteStatusWinFifo */ - -#endif /* HWC_ACCESS_DDRAW */ - -#ifdef HWC_ACCESS_GDX - -FxBool -hwcGetSurfaceInfo(const hwcBoardInfo* bInfo, - FxU32 *sfc, - hwcSurfaceInfo *ret) -{ - CntrlParam paramBlock; - OSErr myErr; - GDXSurfaceDesc_t desc; - hwcControl_t control; - - memset( &control, 0, sizeof( control ) ); - - /* HLock((Handle)bInfo->hMon); */ - paramBlock.ioCRefNum = (*((GDHandle)bInfo->hMon))->gdRefNum; - /* HUnlock((Handle)bInfo->hMon); */ - - paramBlock.csCode = k3DfxGetDeviceConfig; /* driver-specific status request */ - *(hwcControl_t **)(¶mBlock.csParam[0]) = &control; - - myErr = PBControl((ParmBlkPtr)¶mBlock, false); - if(myErr != noErr) - return FXFALSE; - - ret->tileBase = control.res.optData.deviceConfigRes.tileMark; - ret->lpLFB = control.res.optData.deviceConfigRes.lfbBase; - ret->pciStride = control.res.optData.deviceConfigRes.pciStride; - ret->hwStride = control.res.optData.deviceConfigRes.hwStride; - - gdxSurfaceGetDesc(sfc, &desc); - - ret->lpSurface = desc.surface; - ret->width = desc.width; - ret->height = desc.height; - ret->depth = desc.bytesPerPixel; - ret->fbStride = desc.pitch; - ret->fbOffset = ret->lpSurface - ret->lpLFB; - ret->isTiled = (ret->fbOffset >= ret->tileBase) ? FXTRUE : FXFALSE; - - return FXTRUE; -} /* hwcGetSurfaceInfo */ - -FxU32 -hwcAllocWinContext(hwcBoardInfo* bInfo) -{ - CntrlParam paramBlock; - OSErr myErr; - hwcControl_t control; - - memset( &control, 0, sizeof( control ) ); - - /* HLock((Handle)bInfo->hMon); */ - paramBlock.ioCRefNum = (*((GDHandle)bInfo->hMon))->gdRefNum; - /* HUnlock((Handle)bInfo->hMon); */ - - paramBlock.csCode = k3DfxAllocWinContext; /* driver-specific status request */ - *(hwcControl_t **)(¶mBlock.csParam[0]) = &control; - - - myErr = PBControl((ParmBlkPtr)¶mBlock, false); - - if (myErr == noErr) { - setLfbSwizzleMode(bInfo->regInfo.rawLfbBase,bInfo->regInfo.ioMemBase,control.res.optData.allocContextRes.depthMode); - return control.res.optData.allocContextRes.contextID; - } - return 0; -} - -FxBool -hwcFreeWinContext(hwcBoardInfo* bInfo, - FxU32 winContextId) -{ - CntrlParam paramBlock; - OSErr myErr; - hwcControl_t control; - - memset( &control, 0, sizeof( control ) ); - - /* HLock((Handle)bInfo->hMon); */ - paramBlock.ioCRefNum = (*((GDHandle)bInfo->hMon))->gdRefNum; - /* HUnlock((Handle)bInfo->hMon); */ - - paramBlock.csCode = k3DfxReleaseWinContext; /* driver-specific status request */ - *(hwcControl_t **)(¶mBlock.csParam[0]) = &control; - control.req.contextID = winContextId; - - myErr = PBControl((ParmBlkPtr)¶mBlock, false); - - return myErr == noErr ? FXTRUE : FXFALSE; -} - -FxBool -hwcAllocWinFifo(hwcBoardInfo* bInfo, - HwcWinFifo* fifo, - FxU32* surface) -{ -#define FN_NAME "hwcAllocWinFifo" - FxBool - retVal = FXFALSE; - - /* Set undefined fifo type to start, and always clear the serial - * number for this context. - */ - fifo->fifoType = 0xFFFFFFFFUL; - - /* Check to see that we have valid surface owner to hang - * the command fifo surface off of. - */ - retVal = (surface != NULL); - if (retVal) { - GDHandle gDevice; - GDXSurface_t - *objSentinal = NULL, - *objFifo = NULL; - GDXSurfaceDesc_t - fifoDesc, - sentinalDesc, - surfaceDesc; - - /* Get the graphics devices for the surface so we can allocate new - * surfaces on the same device. */ - - gdxSurfaceGetDesc(surface, &surfaceDesc); - - gDevice = surfaceDesc.owner; - - memset(&fifoDesc, 0, sizeof(fifoDesc)); - - /* Allocate a sentinal surface so that the client can 'know' when - * a given fifo segment has actually been executed by reading a - * client specified serial # out of the buffer. This only needs to - * be big enough to hold the size of a serial #, but we need to - * work around some sort of whacked agp bug when reading back. See - * hwcExecuteStatusWinFifo() for details. - */ - sentinalDesc = fifoDesc; - - sentinalDesc.height = 4; - sentinalDesc.width = 4; - sentinalDesc.bytesPerPixel = 4; - - objSentinal = gdxSurfaceAlloc(gDevice, &sentinalDesc); - - if (!objSentinal) { - GDBG_INFO(80, "%s: Could not allocate surface for serial #'s.\n", FN_NAME); - retVal = FXFALSE; - goto __errSurfaceFifo; - } - - /* Assume for now that 2D command fifo is in local framebuffer space */ - - /* Make pitch and width the same so that indexing is easy. - * Setup the allocation in hw page unit sizes. (4k bytes) - */ - fifoDesc.pitch = 0x1000UL; - fifoDesc.width = (fifoDesc.pitch >> 2UL); - fifoDesc.bytesPerPixel = 4; - - /* Try to allocate a surface that contains some # of command - * stream buffers and one persistant state buffer. This is - * allocated in hw page units (4k) rather than the client - * allocation units, but that should be transparent since - * the client will just not use the extra slop. - */ -#define MAX(__a, __b) (((__a) > (__b)) ? (__a) : (__b)) - { - const FxU32 - allocFifo = MAX(fifo->cmdBuf.allocUnit, 0x1000UL), - allocState = MAX(fifo->stateBuf.allocUnit, 0x1000UL), - allocUnit = pow2Round(allocFifo + allocState + 0xFFFUL, 0x1000UL); - const char* - numAllocStr = GETENV("FX_WINFIFO_INIT_ALLOC"); - FxU32 - numAlloc = ((numAllocStr == NULL) - ? 0x8UL - : atoi(numAllocStr)); - - while(numAlloc > 0) { - fifoDesc.height = (allocUnit * numAlloc) / fifoDesc.pitch; - /* objFifo = NULL; */ - objFifo = gdxSurfaceAlloc(gDevice,&fifoDesc); - if(objFifo) - break; - - /* Try a smaller allocation */ - numAlloc--; - } - if(!objFifo) { - GDBG_INFO(80, "%s: Could not get cmdFifo GDX Surface.\n", - FN_NAME); - retVal = FXFALSE; - goto __errSurfaceFifo; - } - - /* Its now safe to overwrite the client allocUnit's to the - * rounded allocation units because we've finally done all of - * the stuff that could fail. - */ - fifo->cmdBuf.size = allocFifo * numAlloc; - fifo->cmdBuf.allocUnit = allocFifo; - - fifo->stateBuf.size = allocState * numAlloc; - fifo->stateBuf.allocUnit = allocState; - } -#undef MAX - - retVal = FXTRUE; - /* Fill in some more of the return buffer info, but were not quite - * done and ready to declare success until we lock the fifo down. - */ - fifo->fifoType = HWCEXT_FIFO_FB; - - fifo->surfaceFifo = (FxU32*)objFifo; - fifo->surfaceSentinal = (FxU32*)objSentinal; - - /* Do the lock so that we can write the sentinal, but the - * client is responsible for locking before use. - */ - if (hwcLockWinFifo(bInfo, fifo)) { - /* Write bogus serial # */ - *(volatile FxU32*)fifo->sentinalBufferAddr = 0x0UL; - - hwcUnlockWinFifo(bInfo, fifo); - } - - __errSurfaceFifo: - /* Free our directdraw objects if something bad happened. */ - if (!retVal) { - if (objSentinal != NULL) gdxSurfaceFree(objSentinal); - if (objFifo != NULL) gdxSurfaceFree(objFifo); - } - } - - /* Could not allocate directly accessible fifo so setup the host - * memory backed fifo which will get dumped at execute time. - */ - if (!retVal) { - fifo->fifoType = HWCEXT_FIFO_HOST; - - fifo->cmdBuf.hwOffset = 0x00UL; - fifo->cmdBuf.size = fifo->cmdBuf.allocUnit; - fifo->stateBuf.hwOffset = 0x00UL; - fifo->stateBuf.size = fifo->stateBuf.allocUnit; - - /* This can never fail since the client is responsible for - * allocating this memory. - */ - retVal = FXTRUE; - } - - return retVal; -#undef FN_NAME -} - -FxBool -hwcLockWinFifo(hwcBoardInfo* bInfo, - HwcWinFifo* fifo) -{ -#define FN_NAME "hwcLockWinFifo" - FxBool - retVal = FXFALSE; - - if (fifo->fifoType == HWCEXT_FIFO_HOST) { - retVal = FXTRUE; - } else if ((fifo->fifoType == HWCEXT_FIFO_FB) || - (fifo->fifoType == HWCEXT_FIFO_AGP)) { - - GDXSurfaceDesc_t - fifoDesc, - sentinalDesc; - - if (fifo->lockCount > 0) goto __alreadyLocked; - if ((fifo->surfaceFifo == NULL) || - (fifo->surfaceSentinal == NULL)) goto __errFifoLock; - - /* Get base pointer to the fifo surfaces. - */ - - gdxSurfaceGetDesc(fifo->surfaceFifo,&fifoDesc); - gdxSurfaceGetDesc(fifo->surfaceSentinal,&sentinalDesc); - - /* Since there's no remapping crap in MacOS, this is easy. */ - fifo->cmdBuf.baseAddr = fifoDesc.surface; - fifo->stateBuf.baseAddr = fifo->cmdBuf.baseAddr + fifo->cmdBuf.size; - fifo->sentinalBufferAddr = sentinalDesc.surface; - - /* Compute hardware offsets as well */ - fifo->cmdBuf.hwOffset = fifo->cmdBuf.baseAddr - bInfo->regInfo.rawLfbBase; - fifo->stateBuf.hwOffset = fifo->stateBuf.baseAddr - bInfo->regInfo.rawLfbBase; - fifo->sentinalBufferOffset = fifo->sentinalBufferAddr - bInfo->regInfo.rawLfbBase; - - __alreadyLocked: - /* Finally, declare success */ - retVal = FXTRUE; - - __errFifoLock: - ; - } - - if (retVal) fifo->lockCount++; - - return retVal; -#undef FN_NAME -} - -FxBool -hwcUnlockWinFifo(hwcBoardInfo* bInfo, - HwcWinFifo* fifo) -{ -#define FN_NAME "hwcUnlockWinFifo" - FxBool - retVal = ((fifo->lockCount > 0) && - ((fifo->fifoType == HWCEXT_FIFO_HOST) || - (fifo->fifoType == HWCEXT_FIFO_FB) || - (fifo->fifoType == HWCEXT_FIFO_AGP))); - - if (retVal) { - fifo->lockCount--; - - if (fifo->lockCount == 0) { - if ((fifo->fifoType == HWCEXT_FIFO_FB) || - (fifo->fifoType == HWCEXT_FIFO_AGP)) { - /* Don't currently do anything since surfaces don't get moved - * around yet on MacOS. - */ - } - } - } - - return retVal; -#undef FN_NAME -} - -FxBool -hwcFreeWinFifo( hwcBoardInfo* bInfo, - HwcWinFifo* fifo ) -{ -#define FN_NAME "hwcFreeWinFifo" - - /* What type of fifo do we have? */ - if ((fifo->fifoType == HWCEXT_FIFO_FB) || - (fifo->fifoType == HWCEXT_FIFO_AGP)) { - if (fifo->surfaceFifo != NULL) { - gdxSurfaceFree(fifo->surfaceFifo); - - fifo->surfaceFifo = NULL; - fifo->cmdBuf.baseAddr = - fifo->cmdBuf.hwOffset = - fifo->cmdBuf.size = - fifo->stateBuf.baseAddr = - fifo->stateBuf.hwOffset = 0x00UL; - } - - if (fifo->surfaceSentinal != NULL) { - gdxSurfaceFree(fifo->surfaceSentinal); - - fifo->surfaceSentinal = NULL; - fifo->sentinalBufferAddr = - fifo->sentinalBufferOffset = 0x00UL; - } - } - - fifo->fifoType = HWCEXT_FIFO_INVALID; - - return FXTRUE; -#undef FN_NAME -} - -FxBool -hwcExecuteWinFifo(hwcBoardInfo* bInfo, - const FxU32 winContextId, - const HwcWinFifo* fifo, - const FxU32 serialNumber) -{ - CntrlParam paramBlock; - OSErr myErr; - hwcControl_t control; - - memset( &control, 0, sizeof( control ) ); - - /* HLock((Handle)bInfo->hMon); */ - paramBlock.ioCRefNum = (*((GDHandle)bInfo->hMon))->gdRefNum; - /* HUnlock((Handle)bInfo->hMon); */ - - paramBlock.csCode = k3DfxExecuteFifo; /* driver-specific status request */ - *(hwcControl_t **)(¶mBlock.csParam[0]) = &control; - - control.req.contextID = winContextId; - control.req.optData.executeFifoReq.fifoType = fifo->fifoType; - control.req.optData.executeFifoReq.fifoPtr = fifo->cmdBuf.baseAddr; - control.req.optData.executeFifoReq.fifoSize = fifo->cmdBuf.size >> 2UL; - control.req.optData.executeFifoReq.statePtr = fifo->stateBuf.baseAddr; - control.req.optData.executeFifoReq.stateSize = fifo->stateBuf.size >> 2UL; - control.req.optData.executeFifoReq.serialNumber = serialNumber; - - if (fifo->fifoType != HWCEXT_FIFO_HOST) { - control.req.optData.executeFifoReq.fifoOffset = fifo->cmdBuf.hwOffset; - control.req.optData.executeFifoReq.stateOffset = fifo->stateBuf.hwOffset; - control.req.optData.executeFifoReq.sentinalOffset = fifo->sentinalBufferOffset; - } - - myErr = PBControl((ParmBlkPtr)¶mBlock, false); - - return myErr == noErr ? FXTRUE : FXFALSE; -} - -FxU32 -hwcExecuteStatusWinFifo(hwcBoardInfo* bInfo, - const HwcWinFifo* fifo, - const FxU32 serialNumber) -{ -#define FN_NAME "hwcExecuteStatusWinFifo" - FxU32 - retVal = ~0x00UL; - - switch(fifo->fifoType) { - /* Host fifo always executes synchronously */ - case HWCEXT_FIFO_HOST: - retVal = serialNumber; - break; - - case HWCEXT_FIFO_FB: - case HWCEXT_FIFO_AGP: - { - volatile FxU32* - bufAddr = (volatile FxU32*)fifo->sentinalBufferAddr; - - /* We need to do some extra reads here so that we make sure taht - * the data we're returning is coherent w/ the actual frame - * buffer due to the intervening pixel cache. The cache is, - * currently, 4 dwords, and appears to be aligned on this - * boundary as well so reading 4 dwords away should be flushing. - * - * NB: The surface for the serial # was allocated big enough to - * handle this so we would not have to worry about it here. */ - retVal = (bufAddr[0]); - retVal = (bufAddr[0 + 4]); - retVal = (bufAddr[0]); - } - break; - - case HWCEXT_FIFO_INVALID: - default: - GDBG_ERROR(FN_NAME, "Invalid fifoType"); - break; - } - - return retVal; -#undef FN_NAME -} - -/* #define LINEAR_STRIDE_ALIGN 16UL */ -/* #define TILE_BIT 0x00008000UL */ - -#endif /* HWC_ACCESS_GDX */ - -FxBool -hwcInitVideo(hwcBoardInfo *bInfo, FxBool tiled, FxVideoTimingInfo *vidTiming, - FxBool overlay) -{ -#define FN_NAME "hwcInitVideo" - FxU32 pixFmt = SST_OVERLAY_PIXEL_RGB565U; - FxU32 - stride= (tiled) ? bInfo->buffInfo.bufStrideInTiles : bInfo->vidInfo.stride; - FxU32 - scrWidth, scrHeight, - ovlWidth, ovlHeight, - vidProcCfg, vidScreenSize, vidOverlayEndScreenCoord, - vidOverlayDudx, vidOverlayDvdy, - dramInit1; - - FxBool - lfbMemoryConfig, - miscInit0; - - float - scale; - - -#ifdef HWC_EXT_INIT - hwcExtRequest_t - ctxReq; - hwcExtResult_t - ctxRes; -#endif - - { - FxU32 refresh; - static FxU32 refConstToRefreshHz[] = { - 60, /* GR_REFRESH_60Hz */ - 70, /* GR_REFRESH_70Hz */ - 72, /* GR_REFRESH_72Hz */ - 75, /* GR_REFRESH_75Hz */ - 80, /* GR_REFRESH_80Hz */ - 90, /* GR_REFRESH_90Hz */ - 100, /* GR_REFRESH_100Hz */ - 85, /* GR_REFRESH_85Hz */ - 120, /* GR_REFRESH_120Hz */ - 0 - }; - - if (bInfo->vidInfo.vRefresh > GR_REFRESH_120Hz) - refresh = 0; - else - refresh = bInfo->vidInfo.vRefresh; - - if ( !setVideoMode( (void*)bInfo->vidInfo.hWnd, - bInfo->vidInfo.xRes, - bInfo->vidInfo.yRes, - refConstToRefreshHz[refresh], /* Make sure we use the table, otherwise - we will always pass 0Hz to setVideoMode */ - bInfo->hMon ) ) { - GDBG_INFO(80, "%s: dxOpen() failed!\n", FN_NAME); - return FXFALSE; - } - } - -#ifdef HWC_EXT_INIT - ctxReq.which = HWCEXT_HWCSETEXCLUSIVE; - ctxReq.optData.linearAddrReq.devNum = 0; - - - GDBG_INFO(80, FN_NAME ": ExtEscape:HWCEXT_HWCSETEXCLUSIVE\n"); - ExtEscape((HDC) bInfo->hdc, EXT_HWC, sizeof(ctxReq), (void *) &ctxReq, - sizeof(ctxRes), (void *) &ctxRes); - - if (ctxRes.resStatus != 1) { - strcpy(errorString, "HWCEXT_HWCSETEXCLUSIVE Failed"); - return FXFALSE; - } -#else - /* This is off for now until the rest of the alt-tab type things are done. */ -#if 0 - /* Before letting glide party on the hw check to see if we're on a - * system w/ a 2d environment, and make sure taht its happy about us - * doing this before dorking w/ things that are going to make it - * unhappy. - */ - if (Dpmi2DEnvironmentP()) { - bInfo->hdc = DpmiDeviceContextGet("3DFXVB"); - if (bInfo->hdc == 0x00UL) return FXFALSE; - - if (!DpmiDeviceContextDispatch(bInfo->hdc, FxDCIsFullscreenP)) return FXFALSE; - if (!DpmiDeviceContextDispatch(bInfo->hdc, FxDCExclusiveLock)) return FXFALSE; - } -#endif -#endif - - HWC_IO_STORE(bInfo->regInfo, vidOverlayDudxOffsetSrcWidth, - ((bInfo->vidInfo.xRes << 1) << 19)); - - /* Video pixel buffer threshold */ - { - FxU32 vidPixelBufThold; - FxU32 thold = 32; - - if (getenv("SSTVB_PIXTHOLD")) { - thold = atoi(getenv("SSTVB_PIXTHOLD")); - } - - thold &= 0x3f; - - vidPixelBufThold = (thold | (thold << 6) | (thold << 12)); - - HWC_IO_STORE(bInfo->regInfo, vidPixelBufThold, vidPixelBufThold); - } - -#ifdef __WIN32__ - if (vidTiming) { - hwcExtRequest_t req; - hwcExtResult_t res; - - req.which = HWCEXT_VIDTIMING; - req.optData.vidTimingReq.vidTiming = (void *) vidTiming; - - GDBG_INFO(80, FN_NAME ": ExtEscape:HWCEXT_VIDTIMING\n"); - ExtEscape((HDC) bInfo->hdc, EXT_HWC, sizeof(req), (void *) &req, - sizeof(res), (void *) &res); - - /* Ignore failure */ - - } -#endif - -#ifdef __DOS32__ - /* Now call the cinit code */ - - h3InitVideoOverlaySurface( - bInfo->regInfo.ioPortBase, - FXTRUE, /* 1=enable Overlay surface (OS), 1=disable */ - FXFALSE, /* 1=enable OS stereo, 0=disable */ - FXFALSE, /* 1=enable horizontal scaling, 0=disable */ - 0, /* horizontal scale factor (ignored if not) */ - FXFALSE, /* 1=enable vertical scaling, 0=disable */ - 0, /* vertical scale factor (ignored if not) */ - 0, /* Filter mode */ - FXTRUE, /* tiled */ - pixFmt, /* pixel format of OS */ - FXTRUE, /* bypass clut for OS? */ - 0, /* 0=lower 256 CLUT entries, 1=upper 256 */ - bInfo->buffInfo.colBuffStart[0],/* board address of beginning of OS */ - stride); /* distance between scanlines of the OS, in - units of bytes for linear OS's and tiles for - tiled OS's */ - HWC_IO_STORE(bInfo->regInfo, vidOverlayStartCoords, 0); - HWC_IO_STORE(bInfo->regInfo, vidOverlayEndScreenCoord, - (bInfo->vidInfo.yRes << SST_OVERLAY_Y_SHIFT) | - (bInfo->vidInfo.xRes & SST_OVERLAY_X) ); -#else - hwcInitVideoOverlaySurface( - &bInfo->regInfo, - FXTRUE, /* 1=enable Overlay surface (OS), 1=disable */ - FXFALSE, /* 1=enable OS stereo, 0=disable */ - FXFALSE, /* 1=enable horizontal scaling, 0=disable */ - 0, /* horizontal scale factor (ignored if not) */ - FXFALSE, /* 1=enable vertical scaling, 0=disable */ - 0, /* vertical scale factor (ignored if not) */ - 0, /* Filter mode */ - FXTRUE, /* tiled */ - pixFmt, /* pixel format of OS */ - FXFALSE, /* bypass clut for OS? */ - 0, /* 0=lower 256 CLUT entries, 1=upper 256 */ - bInfo->buffInfo.colBuffStart[0],/* board address of beginning of OS */ - stride); /* distance between scanlines of the OS, in - units of bytes for linear OS's and tiles for - tiled OS's */ - HWC_IO_STORE(bInfo->regInfo, vidOverlayStartCoords, 0); - -#endif - - /* - Setup video scaling for half-modes - */ - - /* Get some important info */ - HWC_IO_LOAD(bInfo->regInfo, vidScreenSize, vidScreenSize); - HWC_IO_LOAD(bInfo->regInfo, vidProcCfg, vidProcCfg); - HWC_IO_LOAD(bInfo->regInfo, vidOverlayEndScreenCoord, vidOverlayEndScreenCoord); - - scrWidth = (vidScreenSize >> SST_VIDEO_SCREEN_WIDTH_SHIFT) & 0xfff; - scrHeight = (vidScreenSize >> SST_VIDEO_SCREEN_HEIGHT_SHIFT) & 0xfff; - - ovlWidth = ((vidOverlayEndScreenCoord) >> SST_OVERLAY_X_SHIFT) & 0xfff; - ovlHeight = ((vidOverlayEndScreenCoord) >> SST_OVERLAY_Y_SHIFT) & 0xfff; - - ovlWidth += 1; - ovlHeight += 1; - - /* Check to see if the screen and overlay dimensions match. - * There are two cases that can happen in reality. - * - * scrXXX > appXXX: This is a 'real' case, and the overlay dimension - * needs to mag scaled so that it fits the requested size. - * - * (scrXXX == appXXX) && (ovlXXX != scrXXX): This is a somewhat artificial - * case where someone left the overlay set to some value, and these did - * not get reset in the setVideoMode processing. (For example, if the user is - * running an application which bus masters data directly to our video overlay - * when launching a glide application). In this case we need to fiddle w/ the - * overlay dimension so that it matches the requested resolution. - * - * (scrXXX < appXXX): If setVideoMode is actually working correctly, this cannot - * happen because that code has to know that we can't do min scaling. - */ - - if (scrWidth > bInfo->vidInfo.xRes) { - vidProcCfg |= SST_OVERLAY_HORIZ_SCALE_EN; - - ovlWidth = scrWidth; - - scale = ((float) bInfo->vidInfo.xRes) / ((float) ovlWidth); - - vidOverlayDudx = (FxU32) (scale * ((float) (1 << 20))); - HWC_IO_STORE(bInfo->regInfo, vidOverlayDudx, vidOverlayDudx); - } else if (ovlWidth != scrWidth) { - ovlWidth = scrWidth; - } - - if (scrHeight > bInfo->vidInfo.yRes) { - vidProcCfg |= SST_OVERLAY_VERT_SCALE_EN; - - ovlHeight = scrHeight; - - scale = ((float) bInfo->vidInfo.yRes) / ((float) ovlHeight); - - vidOverlayDvdy = (FxU32) (scale * ((float) (1 << 20))); - HWC_IO_STORE(bInfo->regInfo, vidOverlayDvdy, vidOverlayDvdy); - } else if (ovlHeight != scrHeight) { - ovlHeight = scrHeight; - } - - vidOverlayEndScreenCoord = (((ovlHeight - 1) << SST_OVERLAY_Y_SHIFT) | - ((ovlWidth - 1) << SST_OVERLAY_X_SHIFT)); - HWC_IO_STORE(bInfo->regInfo, vidOverlayEndScreenCoord, vidOverlayEndScreenCoord); - - vidProcCfg &= ~SST_OVERLAY_FILTER_MODE; - if (GETENV("SSTH3_OVERLAY_FILTER_2x2")) { - if (!(vidProcCfg & SST_VIDEO_2X_MODE_EN)) - vidProcCfg |= SST_OVERLAY_FILTER_2X2; - } else { - vidProcCfg |= SST_OVERLAY_FILTER_4X4; - } - - HWC_IO_STORE(bInfo->regInfo, vidProcCfg, vidProcCfg); - - /* Get miscInit0 for y-sub */ - HWC_IO_LOAD(bInfo->regInfo, miscInit0, miscInit0); - - /* Clear out relavent bits */ - miscInit0 &= ~SST_YORIGIN_TOP; - miscInit0 |= ((bInfo->vidInfo.yRes - 1) << SST_YORIGIN_TOP_SHIFT); - - HWC_IO_STORE(bInfo->regInfo, miscInit0, miscInit0); - - /* Set up lfbMemoryConfig */ - lfbMemoryConfig = - (bInfo->fbOffset >> 12) | - SST_RAW_LFB_ADDR_STRIDE_4K | - (bInfo->buffInfo.bufStrideInTiles << SST_RAW_LFB_TILE_STRIDE_SHIFT); - - HWC_IO_STORE(bInfo->regInfo, lfbMemoryConfig, lfbMemoryConfig); - - /* Filthy memclock hack */ - if (getenv("H3_MEM_CLOCK")) { - int mHz; - FxU32 pllVal; - mHz = atoi(getenv("H3_MEM_CLOCK")); - - switch (mHz) { - case 50: - pllVal = 0x2806; - break; - - case 75: - pllVal = 0x7125; - break; - - case 80: - pllVal = 0x7925; - break; - - case 100: - pllVal = 0x2805; - break; - - default: - pllVal = 0; - gdbg_printf("%s: Bogus MEMCLOCK setting!\n", FN_NAME); - break; - } - - if (pllVal) { - HWC_IO_STORE(bInfo->regInfo, pllCtrl1, pllVal); - HWC_IO_STORE(bInfo->regInfo, pllCtrl2, pllVal); - gdbg_printf("%s: Setting memory clock to %d MHz\n", FN_NAME, - mHz); - } - - } - - /* Set up dramInit1 for triple or double buffering */ - HWC_IO_LOAD(bInfo->regInfo, dramInit1, dramInit1); - if (bInfo->vidInfo.tripleBuffering) - dramInit1 |= SST_TRIPLE_BUFFER_EN; - else - dramInit1 &= ~SST_TRIPLE_BUFFER_EN; - - HWC_IO_STORE(bInfo->regInfo, dramInit1, dramInit1); - - HWC_IO_STORE(bInfo->regInfo, vidMaxRGBDelta, 0x100810); - - HWC_IO_STORE( bInfo->regInfo, vidDesktopOverlayStride, - ( bInfo->buffInfo.bufStrideInTiles << 16 ) | - bInfo->buffInfo.bufStrideInTiles ); - - return FXTRUE; - -#undef FN_NAME -} /* hwcInitVideo */ - -FxBool -hwcRestoreVideo(hwcBoardInfo *bInfo) -{ -#define FN_NAME "hwcRestoreVideo" - FxU32 depth; - - /* Disable FIFO */ - do { - HWC_CAGP_LOAD(bInfo->regInfo, cmdFifo0.depth, depth); - } while (depth); - - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.baseSize, 0); - -#ifdef HWC_ACCESS_DDRAW - - { - hwcExtRequest_t req; - hwcExtResult_t res; - - req.which = HWCEXT_HWCRLSEXCLUSIVE; - req.optData.linearAddrReq.devNum = 0; - GDBG_INFO(90, FN_NAME ": ExtEscape:HWCEXT_HWCRLSEXCLUSIVE\n"); - ExtEscape((HDC) bInfo->hdc, EXT_HWC, sizeof(req), (void *) &req, - sizeof(res), (void *) &res); - - GDBG_INFO(80, "%s: sizeof(res) = %d\n", FN_NAME, sizeof(res)); - GDBG_INFO(80, "%s: res.resStatus = %d\n", FN_NAME, res.resStatus); - GDBG_INFO(80, "%s: &res = 0x%x\n", FN_NAME, &res); - - if (res.resStatus != 1) { - strcpy(errorString, "HWCEXT_HWCRLSEXCLUSIVE Failed"); - return FXFALSE; - } - - req.which = HWCEXT_RELEASECONTEXT; - req.optData.releaseContextReq.contextID = bInfo->extContextID; - GDBG_INFO(90, FN_NAME ": ExtEscape:HWCEXT_RELEASECONTEXT\n"); - ExtEscape((HDC) bInfo->hdc, EXT_HWC, sizeof(req), (void *) &req, - sizeof(res), (void *) &res); - } - -#ifdef HWC_EXT_INIT - - -#endif -#endif - -#ifndef HWC_EXT_INIT - /* This is off for now until the rest of the alt-tab stuff is done */ -#if 0 - /* Release our exclusive hw lock */ - DpmiDeviceContextDispatch(bInfo->hdc, FxDCUnlock); -#endif -#endif /* HWC_EXT_INIT */ - - /* Restore display */ - resetVideo(); - - return FXTRUE; -#undef FN_NAME -} /* hwcRestoreVideo */ - -char * -hwcGetErrorString() -{ -#define FN_NAME "hwcGetErrorString" - return errorString; -#undef FN_NAME -} /* hwcGetErrorString */ - -FxBool -hwcCheckMemSize(hwcBoardInfo *bInfo, FxU32 xres, FxU32 yres, FxU32 nColBuffers, - FxU32 nAuxBuffers, FxBool tiled) -{ -#define FN_NAME "hwcCheckMemSize" - FxU32 - bufSize, totSize; - - bufSize = calcBufferSize(xres, yres, tiled); - - totSize = (nColBuffers + nAuxBuffers) * bufSize; - - if (totSize < ((bInfo->h3Mem << 20) - bInfo->min_tramSize)) /* Need 2M for texture */ - return FXTRUE; - else - return FXFALSE; -#undef FN_NAME -} /* hwcCheckMemSize */ - -static FxU32 -calcBufferStride(FxU32 xres, FxBool tiled) -{ - FxU32 - strideInTiles; - - if (tiled == FXTRUE) { - /* Calculate tile width stuff */ - strideInTiles = (xres << 1) >> 7; - if ((xres << 1) & (HWC_TILE_WIDTH - 1)) - strideInTiles++; - - return (strideInTiles * HWC_TILE_WIDTH); - - } else { - return (xres << 1); - } -} /* calcBufferStride */ - -static FxU32 -calcBufferHeightInTiles(FxU32 yres) -{ - FxU32 - heightInTiles; /* Height of buffer in tiles */ - - - /* Calculate tile height stuff */ - heightInTiles = yres >> 5; - - if (yres & (HWC_TILE_HEIGHT - 1)) - heightInTiles++; - - return heightInTiles; - -} /* calcBufferHeightInTiles */ - -static FxU32 -calcBufferSizeInTiles(FxU32 xres, FxU32 yres) { - FxU32 - bufSizeInTiles; /* Size of buffer in tiles */ - - bufSizeInTiles = - calcBufferHeightInTiles(yres) * (calcBufferStride(xres, FXTRUE) >> 7); - - return bufSizeInTiles; - -} /* calcBufferSizeInTiles */ - -static FxU32 -calcBufferSize(FxU32 xres, FxU32 yres, FxBool tiled) -{ - FxU32 - stride, - height, - bufSize; /* Size of buffer in bytes */ - - if (tiled) { - stride = calcBufferStride(xres, tiled); - height = HWC_TILE_HEIGHT * calcBufferHeightInTiles(yres); - } else { - stride = xres << 1; - height = yres; - } - - bufSize = stride * height; - - return bufSize; - -} /* calcBufferSize */ - -/* How the hw treats lfb accesses are dependent on the 'type' of - * memory (tiled/linear) that the color/aux buffers are in. We - * pre-compute the actual lfb address here while we know about the - * memory space and if we adjusted the page alignment above. - * - * NB: If we are in tiled mode then the fact that we align the color - * buffers on page boundaries means that the y offset of the buffers - * may not actually be on a boundary for the tile addressing scheme. - * The 'rounding' done to HWC_TILED_BUFFER_Y_ALIGN adjust for this. - * - * NB: The memory optimization of aligning color buffers on even page - * boundaries will cause the tiled lfb access to be off by a page so - * we add in the width of a page (HWC_TILED_BUFFER_X_ADJUST) here. - */ -#define HWC_TILED_BUFFER_BYTES 0x1000UL /* 128 Bytes x 32 lines */ -#define HWC_TILED_BUFFER_Y_ALIGN 0x20000UL -#define HWC_TILED_BUFFER_X_ADJUST 0x80UL - -static FxU32 -hwcBufferLfbAddr(FxU32 bufNum, - const hwcBoardInfo* bInfo, - FxBool colBufAlignP) -{ - FxU32 retVal = 0x00UL; - - if (bInfo->vidInfo.tiled) { - retVal = (bInfo->fbOffset + - pow2Round(bufNum * bInfo->vidInfo.yRes * HWC_TILED_BUFFER_BYTES, - HWC_TILED_BUFFER_Y_ALIGN) + - colBufAlignP * HWC_TILED_BUFFER_X_ADJUST); - } else if (bufNum < bInfo->buffInfo.nColBuffers) { - retVal = bInfo->buffInfo.colBuffStart[bufNum]; - } else if (bufNum == bInfo->buffInfo.nColBuffers) { - retVal = bInfo->buffInfo.auxBuffStart; - } - - return retVal; -} - -static FxU32 -pow2Round(FxU32 val, FxU32 pow2Const) -{ - const FxU32 pow2Mask = (pow2Const - 1UL); - - return ((val + pow2Mask) & ~pow2Mask); -} - -FxU32 -hwcInitAGPFifo(hwcBoardInfo *bInfo, FxBool enableHoleCounting) -{ -#define FN_NAME "hwcInitAGPFifo" -#if HWC_EXT_INIT - FxU32 - agpSize, agpLAddr, agpPAddr; - FxU32 - cagpRegs; /* pointer to Cmd/AGP regs */ - hwcExtRequest_t req; - hwcExtResult_t res; - - - if (bInfo->regInfo.initialized == FXFALSE) { - sprintf(errorString, "%s: Called before hwcMapBoard\n", FN_NAME); - return FXFALSE; - } - cagpRegs = bInfo->regInfo.cmdAGPBase; - - if (bInfo->buffInfo.initialized == FXFALSE) { - sprintf(errorString, "%s: Called before hwcInitBuffers\n", FN_NAME); - return FXFALSE; - } - - req.which = HWCEXT_GETAGPINFO; - - GDBG_INFO(80, FN_NAME ": ExtEscape:HWCEXT_GETAGPINFO\n"); - ExtEscape((HDC) bInfo->hdc, EXT_HWC, sizeof(req), (void *) &req, - sizeof(res), (void *) &res); - - /* If we fail, bail and go to memory fifo */ - if (res.resStatus != 1) { - return hwcInitFifo(bInfo, enableHoleCounting); - } - - agpLAddr = res.optData.agpInfoRes.lAddr; - agpPAddr = res.optData.agpInfoRes.pAddr; - agpSize = res.optData.agpInfoRes.size; - - /* disable the CMD fifo */ - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.baseSize, 0); - - bInfo->fifoInfo.agpFifo = 1; - bInfo->fifoInfo.agpVirtAddr = agpLAddr; - bInfo->fifoInfo.agpPhysAddr = agpPAddr; - bInfo->fifoInfo.fifoStart = agpPAddr; - bInfo->fifoInfo.agpSize = agpSize; - - GDBG_INFO(80, "%s AGP linear address = 0x%x\n", FN_NAME, agpLAddr); - GDBG_INFO(80, "%s AGP physical address = 0x%x\n", FN_NAME, agpPAddr); - GDBG_INFO(80, "%s AGP Size = 0x%x\n", FN_NAME, agpSize); - -#if 0 - From Windows code: - - SETDW(_FF(lpCRegs)->cmdFifo0.baseSize, 0); - SETDW(_FF(lpCRegs)->cmdFifo0.baseAddrL, - (_FF(agpPhysAddr) >> 12) ); - SETDW(_FF(lpCRegs)->cmdFifo0.readPtrL, _FF(agpPhysAddr) ); - SETDW(_FF(lpCRegs)->cmdFifo0.readPtrH, 0); - SETDW(_FF(lpCRegs)->cmdFifo0.aMin, _FF(agpPhysAddr) - 4); - SETDW(_FF(lpCRegs)->cmdFifo0.aMax, _FF(agpPhysAddr) - 4); - SETDW(_FF(lpCRegs)->cmdFifo0.depth, 0); - SETDW(_FF(lpCRegs)->cmdFifo0.holeCount, 0); - SETDW(_FF(lpCRegs)->cmdFifoThresh, 0x122); - SETDW(_FF(lpCRegs)->cmdFifo0.baseSize, 0x700); -#endif - - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.baseAddrL, - bInfo->fifoInfo.fifoStart>>12); - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.readPtrL, bInfo->fifoInfo.fifoStart); - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.readPtrH, 0); - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.aMin, bInfo->fifoInfo.fifoStart-4); - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.aMax, bInfo->fifoInfo.fifoStart-4); - - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.depth, 0); - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.holeCount, 0); - /* Fifo LWM /HWM/ THRESHOLD */ - HWC_CAGP_STORE(bInfo->regInfo, cmdFifoThresh, (0x09 << SST_HIGHWATER_SHIFT) | 0x2); - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.baseSize, - ((bInfo->fifoInfo.fifoLength >> 12) - 1) | SST_EN_CMDFIFO | - SST_CMDFIFO_DISABLE_HOLES | SST_CMDFIFO_AGP); - - GDBG_INFO(2,"%s: CMD FIFO placed at physical addr 0x%x\n", FN_NAME, - bInfo->fifoInfo.fifoStart); - - return FXTRUE; -#else /* !HWC_EXT_INIT */ - return hwcInitFifo(bInfo, enableHoleCounting); -#endif /* !HWC_EXT_INIT */ -#undef FN_NAME -} /* hwcInitAGPFifo */ - - -FxBool -hwcAllocAuxRenderingBuffer(hwcBoardInfo *bInfo, hwcBufferDesc *bp, int width, - int height) -{ -#define FN_NAME "hwcAllocAuxRenderingBuffer" - /* For now, these buffers */ - FxBool - rVal = FXFALSE; - - FxU32 - bufSize, - offset; - - bufSize = (width * height) << 2; - - offset = bInfo->fbOffset - bufSize; - - if ((offset - bInfo->tramSize) < bInfo->min_tramSize) { - sprintf(errorString, "%s: Insufficient memory", FN_NAME); - } else { - bp->bufOffset = offset; - bp->bufStride = width << 2; /* Below tiled memory for now */ - bp->bufBPP = 16; - bp->tiled = 0; - bp->bufType = HWC_BUFFER_AUXRENDER; - - bInfo->fbOffset -= bufSize; - - rVal = FXTRUE; - } - - return rVal; - -#undef FN_NAME -} /* hwcAllocAuxRenderingBuffer */ - -#define RED_SHIFT 16 -#define GREEN_SHIFT 8 -#define BLUE_SHIFT 0 - -FxBool -hwcGammaTable(hwcBoardInfo *bInfo, FxU32 nEntries, FxU32 *r, FxU32 *g, FxU32 *b) -{ -#define FN_NAME "hwcGammaTable" - FxU32 gRamp[256]; - FxU32 i; - FxU32 vidProcCfg; - FxU32 dacBase; - - /* Load the table into the Display driver as above */ - for (i = 0; i < nEntries; i++) { - gRamp[i] = - ((r[i] & 0xff) << RED_SHIFT) | - ((g[i] & 0xff) << GREEN_SHIFT) | - ((b[i] & 0xff) << BLUE_SHIFT); - } - - /* - ** On W9X/DOS, we can do this ourselves--which is much easier than - ** mucking about with a bunch of 32-bit data in 16-bit driver - ** code. - */ - HWC_IO_LOAD( bInfo->regInfo, vidProcCfg, vidProcCfg); - - /* Determin which set of CLUT entries are selected */ - if (vidProcCfg & SST_OVERLAY_CLUT_SELECT) - dacBase = 256; - else - dacBase = 0; - - /* Print out some useful info RE the vidProcCfg register */ - GDBG_INFO(80, "%s: vidProcCFG(SST_OVERLAY_CLUT_SELECT) = %d\n", - FN_NAME, (vidProcCfg & SST_OVERLAY_CLUT_SELECT) ? 1 : 0); - GDBG_INFO(80, "%s: vidProcCFG(SST_OVERLAY_EN) = %d\n", - FN_NAME, (vidProcCfg & SST_OVERLAY_EN) ? 1 : 0); - GDBG_INFO(80, "%s: vidProcCFG(SST_OVERLAY_CLUT_BYPASS) = %d\n", - FN_NAME, (vidProcCfg & SST_OVERLAY_CLUT_BYPASS) ? 1 : 0); - - for (i = 0; i < nEntries; i++) { - HWC_IO_STORE( bInfo->regInfo, dacAddr, dacBase + i); - P6FENCE; - HWC_IO_STORE( bInfo->regInfo, dacData, gRamp[i]); - P6FENCE; - } - - return FXTRUE; - -#undef FN_NAME -} /* hwcGammaTable */ - -FxBool -hwcGammaRGB(hwcBoardInfo *bInfo, float gammaR, float gammaG, float gammaB) -{ -#define FN_NAME "hwcGammaRGB" - FxU32 - grRamp[256], ggRamp[256], gbRamp[256]; - int - i; - - GDBG_INFO(80, FN_NAME "(0x%x, %1.2f, %1.2f, %1.2f)\n", - bInfo, gammaR, gammaG, gammaB); - - /* - ** NB: The system eventually devised by Bob and Ken *may* require - ** separate R, G, and B vectors. - */ - - for (i = 0; i < 256; i++) { - grRamp[i] = (FxU32)((pow(i/255.0F, 1.0F/gammaR)) * 255.0F + 0.5F); - ggRamp[i] = (FxU32)((pow(i/255.0F, 1.0F/gammaG)) * 255.0F + 0.5F); - gbRamp[i] = (FxU32)((pow(i/255.0F, 1.0F/gammaB)) * 255.0F + 0.5F); - } - - - hwcGammaTable(bInfo, 256, grRamp, ggRamp, gbRamp); - - /* - ** Now that we have a gamma table, we can give it to the driver via - ** a call to ExtEscape() when that is defined..... - */ - - return FXFALSE; - -#undef FN_NAME -} /* hwcGammaRGB */ - - -#define M 1 -#define K 1 - -FxBool -hwcSetGrxClock(hwcBoardInfo *bInfo, FxU32 speedInMHz) -{ -#define FN_NAME "hwcSetGrxClock" - FxU32 - pllCtrl1, - dramInit0 = 0xc17ae29, - dramInit1 = 0x26c031, - n, - m = 1; - - n = (FxU32) ((speedInMHz - 4.76f)/2.38f); - - pllCtrl1 = - (K << SST_PLL_K_SHIFT) | (m << SST_PLL_M_SHIFT) | (n << SST_PLL_N_SHIFT); - - GDBG_INFO(80, "%s: Setting Graphics Clock to %d\n", FN_NAME, speedInMHz); - - HWC_IO_STORE( bInfo->regInfo, dramInit0, dramInit0); - HWC_IO_STORE( bInfo->regInfo, dramInit1, dramInit1); - HWC_IO_STORE( bInfo->regInfo, pllCtrl1, pllCtrl1); - - return FXTRUE; - -#undef FN_NAME -} /* hwcSetGrxClock */ - -FxBool -hwcSetMemClock(hwcBoardInfo *bInfo, FxU32 speedInMHz) -{ -#define FN_NAME "hwcSetMemClock" - - return FXFALSE; -#undef FN_NAME -} /* hwcSetMemClock */ - - - -FxBool -hwcResolutionSupported(hwcBoardInfo *bInfo, GrScreenResolution_t res) -{ -#define FN_NAME "hwcResolutionSupported" - static char *resNames[] = { - "GR_RESOLUTION_320x200", - "GR_RESOLUTION_320x240", - "GR_RESOLUTION_400x256", - "GR_RESOLUTION_512x384", - "GR_RESOLUTION_640x200", - "GR_RESOLUTION_640x350", - "GR_RESOLUTION_640x400", - "GR_RESOLUTION_640x480", - "GR_RESOLUTION_800x600", - "GR_RESOLUTION_960x720", - "GR_RESOLUTION_856x480", - "GR_RESOLUTION_512x256", - "GR_RESOLUTION_1024x768", - "GR_RESOLUTION_1280x1024", - "GR_RESOLUTION_1600x1200", - "GR_RESOLUTION_400x300", - "GR_RESOLUTION_1152x864", - "GR_RESOLUTION_1280x960", - "GR_RESOLUTION_1600x1024", - "GR_RESOLUTION_1792x1344", - "GR_RESOLUTION_1856x1392", - "GR_RESOLUTION_1920x1440", - "GR_RESOLUTION_2048x1536", - "GR_RESOLUTION_2048x2048" - }; - - struct WidthHeight_s { - FxU32 width; - FxU32 height; - } whByRes[] = { - {320, 200}, /* GR_RESOLUTION_320x200 */ - {320, 240}, /* GR_RESOLUTION_320x240 */ - {400, 256}, /* GR_RESOLUTION_400x256 */ - {512, 384}, /* GR_RESOLUTION_512x384 */ - {640, 200}, /* GR_RESOLUTION_640x200 */ - {640, 350}, /* GR_RESOLUTION_640x350 */ - {640, 400}, /* GR_RESOLUTION_640x400 */ - {640, 480}, /* GR_RESOLUTION_640x480 */ - {800, 600}, /* GR_RESOLUTION_800x600 */ - {960, 720}, /* GR_RESOLUTION_960x720 */ - {856, 480}, /* GR_RESOLUTION_856x480 */ - {512, 256}, /* GR_RESOLUTION_512x256 */ - {1024, 768}, /* GR_RESOLUTION_1024x768 */ - {1280, 1024}, /* GR_RESOLUTION_1280x1024 */ - {1600, 1200}, /* GR_RESOLUTION_1600x1200 */ - {400, 300}, /* GR_RESOLUTION_400x300 */ - {1152, 864}, /* GR_RESOLUTION_1152x864 */ - {1280, 960}, /* GR_RESOLUTION_1280x960 */ - {1600, 1024}, /* GR_RESOLUTION_1600x1024 */ - {1792, 1344}, /* GR_RESOLUTION_1792x1344 */ - {1856, 1392}, /* GR_RESOLUTION_1856x1392 */ - {1920, 1440}, /* GR_RESOLUTION_1920x1440 */ - {2048, 1536}, /* GR_RESOLUTION_2048x1536 */ - {2048, 2048} /* GR_RESOLUTION_2048x2048 */ - }; - - - GDBG_INFO(80, FN_NAME ": res == %s (0x%x), supported == %s\n", - resNames[res], resolutionSupported[bInfo->boardNum][res], - resolutionSupported[bInfo->boardNum][res] ? "FXTRUE" : "FXFALSE"); - - - /* Glide has very good checking to see if the memory required is - available, so we'll just return whether the driver can do it. */ - return resolutionSupported[bInfo->boardNum][res]; - -#undef FN_NAME -} /* hwcResolutionSupported */ - -#ifdef __WIN32__ -static char * -getRegPath() -{ - char *retVal = NULL; - OSVERSIONINFO ovi; - - ovi.dwOSVersionInfoSize = sizeof ( ovi ); - GetVersionEx ( &ovi ); - if (ovi.dwPlatformId == VER_PLATFORM_WIN32_NT) { - GDBG_INFO(80, "OS == WNT\n"); - /* It is hardcoded on NT via Display Control code. see: - * $/devel/swtools/bansheecp2 */ - retVal = "SYSTEM\\CurrentControlSet\\Services\\3Dfx\\Device0\\glide"; - } else { - QDEVNODE QDevNode; - QIN Qin; - int status; - - GDBG_INFO(80, "OS == W9X\n"); - - Qin.dwSubFunc = QUERYDEVNODE; - { - HDC curDC = GetDC(NULL); - - status = ExtEscape ( curDC, QUERYESCMODE, - sizeof(Qin), (LPCSTR)&Qin, - sizeof(QDevNode), (LPSTR)&QDevNode ); - ReleaseDC(NULL, curDC); - } - - if ( status > 0 ) { - static char regPath[255]; - - CM_Get_DevNode_Key( QDevNode.dwDevNode, NULL, - ®Path, sizeof(regPath), - CM_REGISTRY_SOFTWARE ); - strcat(regPath, "\\glide"); - - retVal = regPath; - } - } - - return retVal; -} /* getRegPath */ -#endif - - -char * -hwcGetenv(char *a) -{ -#if __WIN32__ - char *retVal = NULL; - static char *regPath; - HKEY hKey; - DWORD type, szData; - static char strval[255]; - - /* This should work for both NT and Win95/98 (getRegPath works) */ - if (retVal = getenv(a)) - return retVal; - - szData = sizeof(strval); - - if (regPath == NULL) { - regPath = getRegPath(); - - GDBG_INFO(80, "_grGetEnv: regPath = %s\n", regPath); - - if (regPath == NULL) - return NULL; - } - - if (RegOpenKey(HKEY_CURRENT_USER, regPath, &hKey) == ERROR_SUCCESS) { - if (RegQueryValueEx(hKey, a, NULL, &type, strval, &szData) == - ERROR_SUCCESS) { - if (type != REG_SZ) { - retVal = NULL; - } else { - retVal = strval; - } - } - RegCloseKey(hKey); - } - - if ((retVal == NULL) && RegOpenKey(HKEY_LOCAL_MACHINE, regPath, &hKey) == ERROR_SUCCESS) { - - if (RegQueryValueEx(hKey, a, NULL, &type, strval, &szData) == - ERROR_SUCCESS) { - if (type != REG_SZ) { - retVal = NULL; - } else { - retVal = strval; - } - } - RegCloseKey(hKey); - } - return (char*)retVal; -#else - return getenv(a); -#endif -} /* _grGetenv */ diff --git a/glide2x/h3/minihwc/minihwc.h b/glide2x/h3/minihwc/minihwc.h deleted file mode 100644 index edc3eb1..0000000 --- a/glide2x/h3/minihwc/minihwc.h +++ /dev/null @@ -1,553 +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 3/17/99 6:14p Dow -** Fixes Phantom Menace, OGL, and others. -** -** 38 3/17/99 4:09p Dow -** It's my sandbox -** -** 37 3/10/99 11:52a Peter -** initFifo enable hole counting parameter -** -** 36 3/09/99 12:20p Kcd -** Made ioPort variable 32-bit for PPC. -** -** 35 3/05/99 10:06p Peter -** allocate independent state buffers in parallel w/ the command buffers -** -** 34 2/02/99 4:37p Peter -** hwGetSurfaceinfo gets depth -** -** 33 1/04/99 11:58a Peter -** added windowed context support -** -** 32 12/23/98 12:38p Peter -** hdc cleanup -** -** 31 12/03/98 10:27p Dow -** Added stuff for hwcGetenv -** -** 30 12/02/98 9:35p Dow -** Query Resolutions -** -** 29 11/30/98 6:53p Peter -** video memory fifo's -** -** 28 11/18/98 8:03p Dow -** grxclk -** -** 27 11/10/98 6:29p Atai -** added min_tramSize for board information. min_tramSize = 0x200000 if -** device id is 3 or mem size is 4 -** -** 26 10/30/98 3:44p Dow -** Fixed Tiled/Linear color/aux bug -** -** 25 10/21/98 11:22a Peter -** dos happiness w/ the new chris pci library (nee tarolli) -** -** 24 10/14/98 3:37p Dow -** Gamma stuff -** -** 23 10/08/98 10:15a Dow -** Triple buffering fix -** -** 22 9/17/98 3:58p Dow -** Vidmode Stuff -** -** 21 8/02/98 5:00p Dow -** Glide Surface Extension -** -** 20 7/29/98 3:09p Dow -** SDRAM Fixes -** -** 19 7/24/98 2:02p Dow -** AGP Stuff -** -** 18 7/23/98 1:18a Dow -** Bump & Grind -** -** 17 7/18/98 12:21a Jdt -** Added state buffer -** -** 16 7/16/98 10:26p Dow -** GIW Stuf -** -** 15 7/16/98 3:05p Dow -** Removed useless colBufferAddr from surface info -** -** 14 7/15/98 4:09p Dow -** GIW Stuff & DOS Protection -** -** 13 7/13/98 10:35p Jdt -** Added hwcWinFifo, hwcAllocWinFifo, hwcexecuteWinFifo -** -** 12 7/02/98 12:11p Dow -** LFB fixes -** -** 11 6/16/98 6:11p Dow -** Rearranged texture memory -** -** 10 6/12/98 9:22a Peter -** lfb read for triple buffering -** -** 9 6/11/98 7:44p Jdt -** Win98/NT5 Multimon 1st pass -** -** 8 6/10/98 9:49a Peter -** lfb buffer addressing -** -** 7 5/08/98 10:58a Dow -** Volatile declarations -** -** 6 4/16/98 10:14p Dow -** EXT_HWC is default init method -** -** 5 4/07/98 10:40p Dow -** LFB Fixes -** -** 4 3/28/98 10:51a Dow -** Fixes for FIFO bug -** -** 3 3/20/98 1:11p Dow -** Now checking revision of chip -** -** 2 3/11/98 8:27p Dow -** WinGlide -** -** 1 3/04/98 4:13p Dow -** -*/ -#ifndef MINIHWC_H -#define MINIHWC_H - -#ifdef HWC_EXT_INIT -#define WIN32_LEAN_AND_MEAN -#include -#endif - -#include <3dfx.h> -#include -#include - -/* -** Constants -*/ -#define HWC_MAX_BOARDS 4 /* Max # boards we can handle */ -#define HWC_NUM_BASE_ADDR 4 /* Max # base addresses - * - * 0-1 : Memory mapped registers - * 2 : i/o port - * 3 : rom (bios) - */ - -#define HWC_TILE_WIDTH_SHIFT SST_TILE_WIDTH_BITS -#define HWC_TILE_WIDTH (0x01UL << HWC_TILE_WIDTH_SHIFT) - -#define HWC_TILE_HEIGHT_SHIFT SST_TILE_HEIGHT_BITS -#define HWC_TILE_HEIGHT (0x01UL << HWC_TILE_HEIGHT_SHIFT) - -typedef FxU32 hwcBuffer; -#define HWC_BUFFER_FRONTBUFFER 0x0 -#define HWC_BUFFER_BACKBUFFER 0x1 -#define HWC_BUFFER_AUXBUFFER 0x2 -#define HWC_BUFFER_DEPTHBUFFER 0x3 -#define HWC_BUFFER_ALPHABUFFER 0x4 -#define HWC_BUFFER_TRIPLEBUFFER 0x5 -#define HWC_BUFFER_FIFOBUFFER 0x6 -#define HWC_BUFFER_SCREENBUFFER 0x7 -#define HWC_BUFFER_TEXTUREBUFFER 0x8 -#define HWC_BUFFER_AUXRENDER 0x9 -#define HWC_BUFFER_NONE 0xff - -typedef FxU32 hwcOriginLocation; -#define HWC_ORIGIN_UPPER_LEFT 0x0 -#define HWC_ORIGIN_LOWER_LEFT 0x1 - -typedef FxI32 hwcColorFormat; -#define HWC_COLORFORMAT_ARGB 0x0 -#define HWC_COLORFORMAT_ABGR 0x1 -#define HWC_COLORFORMAT_RGBA 0x2 -#define HWC_COLORFORMAT_BGRA 0x3 - -typedef FxU32 hwcSwapType; -#define HWC_SWAP_FLIP 0x0 -#define HWC_SWAP_BLT 0x1 - -typedef FxU32 hwcControl; -#define HWC_CONTROL_ACTIVATE 0x1 -#define HWC_CONTROL_DEACTIVATE 0x2 -#define HWC_CONTROL_RESIZE 0x3 -#define HWC_CONTROL_MOVE 0x4 - -/* -** Data Structures -*/ - -typedef struct hwcPCIInfo_s { - FxBool - initialized; - FxU32 - vendorID, /* PCI Vendor ID */ - deviceID, /* PCI Device ID */ - pciBaseAddr[HWC_NUM_BASE_ADDR]; -} hwcPCIInfo; - -typedef struct hwcLinearInfo_s { - FxBool - initialized; - FxU32 - linearAddress[HWC_NUM_BASE_ADDR]; -} hwcLinearInfo; - -typedef struct hwcRegInfo_s { - FxBool - initialized; - volatile FxU32 - ioMemBase, /* mem base for I/O aliases */ - cmdAGPBase, /* CMD/AGP register base */ - waxBase, /* 2D register base */ - sstBase, /* 3D register base */ - lfbBase, /* 3D lfb base */ - rawLfbBase; /* Raw LFB base (base address 1) */ -#if __POWERPC__ - ioPortBase; /* PPC does I/O via a 32-bit address */ -#else - volatile FxU16 - ioPortBase, /* I/O base address */ - pad; /* Keep things aligned */ -#endif -} hwcRegInfo; - -typedef struct hwcFifoInfo_s { - FxBool - agpFifo, - initialized; - FxU32 - agpVirtAddr, - agpPhysAddr, - agpSize, - fifoStart, /* Beg of fifo (offset from base) */ - fifoLength; /* Fifo size in bytes */ -} hwcFifoInfo; - -/* -** CHD: Reconcile the following two types -*/ - -typedef struct hwcBufferDesc_s { - FxU32 bufMagic; - hwcBuffer bufType; - FxU32 bufOffset; - FxI32 bufStride; - FxU32 bufSize; - FxU32 bufBPP; /* bits per pixel */ - FxU32 width, height; - FxBool tiled; /* Is it tiled? */ -} hwcBufferDesc; - -typedef struct hwcBufferInfo_s { - FxBool - initialized; - - FxU32 - bufSize, /* size of buffer in bytes */ - bufSizeInTiles, /* Buffer Size in tiles */ - bufStride, /* stride of buffer in bytes */ - bufStrideInTiles, /* stride of buffer in tiles */ - bufHeightInTiles, /* height of buffer in tiles */ - nColBuffers, /* # color buffers */ - colBuffStart[3], /* Beg of color buffers */ - colBuffEnd[3], /* End of color buffers */ - lfbBuffAddr[4], /* Start address of lfb (tiled relative) buffers. - * NB: This only includes enough space - * for 3 color buffers and 1 aux buffer. - */ - nAuxBuffers, /* # aux buffer (0 or 1) */ - auxBuffStart, /* End of aux buffer */ - auxBuffEnd; /* End of aux buffer */ - void - *colBuffPriv, /* Private color buffer info */ - *auxBuffPriv; /* Private aux buffer info */ - hwcBufferDesc - buffers[6]; /* 3 col + 1 aux + 1 tex + 1 fifo */ -} hwcBufferInfo; - -typedef struct hwcVidInfo_s { - FxU32 - hWnd; /* Window Handle */ - FxBool - initialized, - tiled; /* Is it tiled or linear? */ - GrScreenResolution_t - sRes; - GrScreenRefresh_t - vRefresh; - FxU32 - stride, /* Stride in bytes */ - xRes, /* X resolution */ - yRes, /* Y resolution */ - refresh; /* refresh rate */ - FxBool - tripleBuffering; /* Are we? */ -} hwcVidInfo; - -typedef struct hwcSurfaceInfo_s { - FxU32 - lpSurface, - fbOffset, - fbStride, - depth, - width, - height, - tileBase, - pciStride, - lpLFB, - hwStride; - FxBool - sdRam, - isTiled; -} hwcSurfaceInfo; - -typedef struct hwcAGPInfo_s { - FxU32 - linAddr, /* Linear address of AGP memory */ - physAddr, /* physical address of AGP memory */ - size; /* size of physical memory */ -} hwcAGPInfo; - - -/* Here's the wrapper in which we keep all of the above: */ -typedef struct hwcBoardInfo_s { - FxBool - sdRAM; /* Is the board SDRAM? */ - void - *hdc, /* This is really an HDC */ - *hMon; /* this is an HMONITOR */ - FxU32 - extContextID, /* HWC_EXT Context ID (if needed) */ - devRev, /* Device Revision */ - tramOffset, /* Offset to texture memory */ - tramSize, /* Size of texure memory */ - min_tramSize, /* minimum texture memory required */ - fbOffset, /* Frame Buffer Offset (in bytes) */ - h3Rev, /* Banshee Revision Number */ - h3Mem, /* Megs of RAM on board */ - boardNum, /* Board ID for hwc */ - deviceNum; /* Device ID for PCILib */ - hwcPCIInfo - pciInfo; - hwcLinearInfo - linearInfo; - hwcRegInfo - regInfo; - hwcFifoInfo - fifoInfo; - hwcBufferInfo - buffInfo; - hwcVidInfo - vidInfo; - void * - deviceConfigData; - hwcAGPInfo - agpInfo; -} hwcBoardInfo; - -/* Now, let's tie it all together */ -typedef struct hwcInfo_s { - FxU32 - nBoards; - hwcBoardInfo - boardInfo[HWC_MAX_BOARDS]; -} hwcInfo; - -#define HWC_WIN_FIFO_HOST 0x00UL -#define HWC_WIN_FIFO_LOCAL 0x01UL -#define HWC_WIN_FIFO_AGP 0x02UL - -typedef struct { - /* One of the HWCEXT_FIFO_XXX values defined in hwcext.h. */ - FxU32 - fifoType; - - /* If > 0 xxxBufferAddr is a valid fifo write */ - FxU32 - lockCount; - - /* Information about the current command stream to the hw fifo. - * Fields prefaced w/ cmd are for storing the current command stream - * since the last syncronization point via hwcExecuteFifo. Fields - * prefaced w/ state are the command stream to restore the state - * at the last call to hwcExecuteFifo. - * - * xxxBufferAddr: Linear address if lockedP == FXTRUE. - * xxxBufferOffset: HW relative address of the buffer. - * xxxBufferSize: Total size of valid range of the buffer. (bytes) - * xxxBufferAllocUnit: Minimum allocation unit for the buffer sub-allocation. (bytes) - */ - struct { - FxU32 - baseAddr, - hwOffset, - size, - allocUnit; - } cmdBuf, - stateBuf; - - FxU32 - sentinalBufferAddr, - sentinalBufferOffset; - - /* System dependent bookkepping state information if fifoType != - * HWCEXT_FIFO_HOST. This should be considered logically const to - * the client. - */ - FxU32 - *surfaceFifo, - *surfaceSentinal; -} HwcWinFifo; - -/* -** Function Prototypes -*/ - -hwcInfo * -hwcInit(FxU32 vID, FxU32 dID); - -FxBool -hwcMapBoard(hwcBoardInfo *bInfo, FxU32 bAddrMask); - -FxBool -hwcUnmapBoard(hwcBoardInfo *bInfo); - -FxBool -hwcInitRegisters(hwcBoardInfo *bInfo); - -FxBool -hwcAllocBuffers(hwcBoardInfo *bInfo, FxU32 nColBuffers, FxU32 nAuxBuffers); - -FxBool -hwcInitFifo(hwcBoardInfo *bInfo, FxBool enableHoleCounting); - -/* The enableHoleCounting parameter here is a bit of a red herring since - * having an agp fifo implies no hole counting. This routine will call - * the default hwcInitFifo when it cannot allocate an agp fifo, and the - * hole counting parameter only applies in this case. - */ -FxU32 -hwcInitAGPFifo(hwcBoardInfo *bInfo, FxBool enableHoleCounting); - -FxBool -hwcInitVideo(hwcBoardInfo *bInfo, FxBool tiled, FxVideoTimingInfo - *vidTiming, FxBool overlay); - -FxBool -hwcRestoreVideo(hwcBoardInfo *bInfo); - -char * -hwcGetErrorString(void); - -FxBool -hwcCheckMemSize(hwcBoardInfo *bInfo, FxU32 xres, FxU32 yres, FxU32 nColBuffers, - FxU32 nAuxBuffers, FxBool tiled); - -#ifdef __WIN32__ - -FxU32 -hwcAllocWinContext(hwcBoardInfo* bInfo); - -FxBool -hwcFreeWinContext(hwcBoardInfo* bInfo, - FxU32 winContextId); - -/* surfaceInfo: - * Describes the currently setup os surfaces. - * fifo: - * Input: - * cmdBuf.allocUnit: - * stateBuf.allocUnit: - * Minimum allocation unit of each section. - * Output: - * cmdBuf: - * stateBuf: - */ -FxBool -hwcAllocWinFifo(hwcBoardInfo* bInfo, - HwcWinFifo* fifo, - FxU32* surface); - -FxBool -hwcFreeWinFifo(hwcBoardInfo* bInfo, - HwcWinFifo* fifo); - -FxBool -hwcExecuteWinFifo(hwcBoardInfo* bInfo, - const FxU32 winContextId, - const HwcWinFifo* fifo, - const FxU32 serialNumber); - -FxU32 -hwcExecuteStatusWinFifo(hwcBoardInfo* bInfo, - const HwcWinFifo* fifo, - const FxU32 serialNumber); - -FxBool -hwcLockWinFifo(hwcBoardInfo* bInfo, - HwcWinFifo* fifo); - -FxBool -hwcUnlockWinFifo(hwcBoardInfo* binfo, - HwcWinFifo* fifo); - -FxBool -hwcGetSurfaceInfo(const hwcBoardInfo* binfo, - FxU32 *sfc, - hwcSurfaceInfo *ret); - -FxBool -hwcAllocAuxRenderingBuffer(hwcBoardInfo *bInfo, - hwcBufferDesc *bp, - int width, int height); - -#endif /* __WIN32__ */ - -FxBool -hwcGammaRGB(hwcBoardInfo *bInfo, float r, float g, float b); - -FxBool -hwcGammaTable(hwcBoardInfo *bInfo, FxU32 nEntries, FxU32 *r, FxU32 *g, FxU32 *b); - -FxBool -hwcSetGrxClock(hwcBoardInfo *bInfo, FxU32 speedInMHz); - -FxBool -hwcSetMemClock(hwcBoardInfo *bInfo, FxU32 speedInMHz); - -FxBool -hwcResolutionSupported(hwcBoardInfo *bInfo, GrScreenResolution_t res); - -char * -hwcGetenv(char *a); - - -#endif /* MINIHWC_H not defined */ diff --git a/glide2x/h3/minihwc/qmodes.h b/glide2x/h3/minihwc/qmodes.h deleted file mode 100644 index ab60193..0000000 --- a/glide2x/h3/minihwc/qmodes.h +++ /dev/null @@ -1,402 +0,0 @@ -/* $Header$ */ -/* -** 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 -** -** File name: qmodes.h -** -** Description: Structures, macros, etc to support query mode. -** -** $Revision$ -** $Date$ -** -** $History: qmodes.h $ -** -** ***************** Version 3 ***************** -** User: Dow Date: 3/17/99 Time: 6:14p -** Updated in $/Releases/Voodoo3/MT2/3Dfx/devel/H3/minihwc -** Fixes Phantom Menace, OGL, and others. -** -** ***************** Version 20 ***************** -** User: Stuartb Date: 2/25/99 Time: 12:48p -** Updated in $/devel/h3/Win95/dx/dd16 -** Added FPFLAG_CAPABLE. -** -** ***************** Version 19 ***************** -** User: Stuartb Date: 2/18/99 Time: 2:54p -** Updated in $/devel/h3/Win95/dx/dd16 -** Added xlcd FPFLAGS for filter mode setting. -** -** ***************** Version 18 ***************** -** User: Andrew Date: 2/11/99 Time: 11:17a -** Updated in $/devel/h3/Win95/dx/dd16 -** Added AGP Cap Query -** -** ***************** Version 17 ***************** -** User: Stuartb Date: 1/21/99 Time: 11:18a -** Updated in $/devel/h3/Win95/dx/dd16 -** Added FPFLAG_SETRES and FPFLAG_SETREFR for app code. Removed -** broadcastMonitorChange calls. -** -** ***************** Version 16 ***************** -** User: Stuartb Date: 1/12/99 Time: 2:27p -** Updated in $/devel/h3/Win95/dx/dd16 -** Added QUERY_ANALOG_MONITOR & modified QUERY_LCDCTRL. -** -** ***************** Version 15 ***************** -** User: Stuartb Date: 1/08/99 Time: 3:34p -** Updated in $/devel/h3/Win95/dx/dd16 -** Added QUERY_LCDCTRL for control panel flat panel ops. -** -** ***************** Version 14 ***************** -** User: Bob Date: 1/05/99 Time: 5:57p -** Updated in $/devel/h3/WinNT/src/Video/Displays/H3 -** BIOS version reporting to Control Panel applet. -** -** Shared qmodes.h with Win9x and the rest of the universe. -** -** ***************** Version 13 ***************** -** User: Bob Date: 1/05/99 Time: 5:14p -** Updated in $/devel/h3/Win95/dx/dd16 -** Altered nesting of header files so that tv.h is not inside qmodes.h. -** -** This is a sharing issue with NT. -** -** ***************** Version 12 ***************** -** User: Larryw Date: 1/05/99 Time: 4:36p -** Updated in $/devel/swtools/3DfxV2ps -** Changed QUERY[GS]ETDESKTOPGAMMA back to QUERY[GS]ETGAMMA. -** -** ***************** Version 11 ***************** -** User: Larryw Date: 1/05/99 Time: 3:45p -** Updated in $/devel/swtools/3DfxV2ps -** Put MAX_BIOS_VERSION_STRING in; changed some Gamma query values -** -** ***************** Version 10 ***************** -** User: Andrew Date: 1/05/99 Time: 10:50a -** Updated in $/devel/h3/Win95/dx/dd16 -** Added new function to get the bios version string -** -** ***************** Version 9 ***************** -** User: Michael Date: 12/29/98 Time: 2:37p -** Updated in $/devel/h3/Win95/dx/dd16 -** Implement the 3Dfx/STB unified header. -** -** 8 10/10/98 5:21p Hsohel -** -** 7 10/10/98 4:52p Hsohel -** -** 6 10/10/98 3:36p Hsohel -** -** 5 10/09/98 3:54p Hsohel -** -** 4 7/13/98 5:26p Andrew -** Changed to support a gamma table -** -** 3 7/11/98 8:16a Andrew -** Added gamma correction -** -** 2 5/12/98 9:35a Andrew -** Added some minor changes for valid modes -** -** 1 4/22/98 2:47p Andrew -** Query Modes Protocol Information -** -** -*/ - -#ifndef _QMODES_H_ -#define _QMODES_H_ - -/* The QUERYMODES ESC Code */ -#define QUERYESCMODE (0x8001) - -#define TDFXACK (0x3DF0) -#define TDFXERR (0xFFFF) - -// General Queries -#define QUERYVERSION (0x0000) - -// Mode Queries -#define QUERYNUMMODES (0x0001) -#define QUERYMODES (0x0002) -#define QUERYDEVNODE (0x0003) - -// Virtual Desktop Queries -#define QUERYMAXFREEMEM (0x100) -#define QUERYSETVIRTUALSIZE (0x101) -#define QUERYGETSTARTADDR (0x102) -#define QUERYSETSTARTADDR (0x103) - -// Gamma Queries -#define QUERYGETGAMMA (0x200) -#define QUERYSETGAMMA (0x201) -#define QUERYGETGLIDEGAMMA (0x202) -#define QUERYSETGLIDEGAMMA (0x203) - -// BIOS Version -#define QUERYGETBIOSVERSION (0x280) - -// AGP Query -#define QUERYGETAGPCAPS (0x2A0) - -// TVOUT Queries -// see ..\inc\tv.h uses 0x300 -> 0x38f approx. - -// LCD CONTROL -#define QUERY_LCDCTRL (0x3a0) - -// ANALOG MONITOR ON/OFF override - -#define QUERY_ANALOG_MONITOR (0x3b0) - - -/* -** Protocol: -** -** Call will be of the form -** ExtEscape(hdc, QUERYESCMODE, sizeof(QIN), &Qin, sizeof(Output), &Output); -** Escape(hdc, QUERYESCMODE, sizeof(QIN), &Qin, &Output); -** -*/ - - -/* -** Standard Input Structure -** -*/ -typedef struct qin { - DWORD dwSubFunc; // Subfunction -} QIN, FAR * LPQIN, * PQIN; - -/* -** -** -** INPUT: qin.dwSubFunc = QUERYVERSION -** OUTPUT: Driver Major & Minor Version -*/ -typedef struct qversion { - DWORD dwMajor; - DWORD dwMinor; - } QVERSION, FAR * LPQVERSION, * PQVERSION; - -#define QUERYMODE_MAJOR 0x00000000 -#define QUERYMODE_MINOR 0x00009999 - -/* -** Call this function first to know how many modes to allow -** the following structure for -** -** INPUT: qin.dwSubFunc = QUERYNUMMODES -** OUTPUT: Number of modes -*/ -typedef struct qnummode { - DWORD dwNum; - } QNUMMODE, FAR * LPQNUMMODE, * PQNUMODE; - -/* -** This is the mode information. You will need to allocate -** # modes * QMODE structures that the Driver will fill in. -** -** INPUT: qin.dwSubFunc = QUERYMODES -** OUTPUT: #Modes * QMODE -*/ -typedef struct qmode { - DWORD dwX; - DWORD dwY; - DWORD dwBpp; - DWORD dwRef; - DWORD dwValid; // This will be a field of flags - } QMODE, FAR * LPQMODE, * PQMODE; - -#define QUERY_MODE_VALID (0x000000001L) -#define QUERY_TV_MODE (0x000000002L) - -/* -** This is Devnode that the driver is using -** -** INPUT: qin.dwSubFunc = QUERYDEVNODE -** OUTPUT: dwDevNode -*/ -typedef struct qdevnode { - DWORD dwDevNode; // Monitor Device Node - DWORD dwValidDefGamma; // 1 ==> bGamma is valid; 0 ==> Invalid - BYTE bGamma; // Monitor Default Gamma - } QDEVNODE, FAR * LPQDEVNODE, * PQDEVNODE; - -#define QUERY_MONITOR_GAMMA_VALID (0x00000001L) - -/* -** This is maximum free memory available for Virtual Desktop Usage in -** this mode -** -** INPUT: qin.dwSubFunc = QUERYMAXFREEMEM -** OUTPUT: Maximum Free Memory -*/ -typedef struct qmaxfree { - DWORD dwSubFunc; // Should be set to QUERYSETVIRTUALSIZE - DWORD dwMaxFree; // Free Memory Available for Virtual Desktop - DWORD dwMaxX; // Maximum Free X ==> min(dwMaxFree/Y, MaxHardwareX) - DWORD dwMaxY; // Maximum Free Y ==> min(dwMaxFree/(X*BPP), MaxHardwareY) - } QMAXFREE, FAR * LPQMAXFREE, * PQMAXFREE; - -/* -** This is used to set the Virtual Desktop Size -** -** INPUT: qsetvsize.dwSubFunc = QUERYSETVIRTUALSIZE -** OUTPUT: None -*/ -typedef struct qsetvsize { - DWORD dwSubFunc; // Should be set to QUERYSETVIRTUALSIZE - DWORD dwX; // X Size in Pixels (X * BPP * Y <= MaxMemSize) - DWORD dwY; // Y Size in Lines - } QSETVSIZE, FAR * LPQSETVSIZE, * PQSETVSIZE; - -/* -** This is used to get the Virtual Desktop Start Address -** -** INPUT: qin.dwSubFunc = QUERYGETSTARTADDR -** OUTPUT: QGetStartAddr -*/ -typedef struct qgetstartaddr { - DWORD dwX; // X Location in Pixels - DWORD dwY; // Y Location in Lines - } QGETSTARTADDR, FAR * LPQGETSTARTADDR, * PQGETSTARTADDR; - -/* -** This is used to move the Virtual Desktop Start Address -** -** INPUT: qsetstartaddr.dwSubFunc = QUERYSETSTARTADDR -** OUTPUT: None -*/ -typedef struct qsetstartaddr { - DWORD dwSubFunc; // Should be set to QUERYSETSTARTADDR - DWORD dwX; // X Location in Pixels (Note: Start Addr = X * BPP + Y * Display Pitch) - DWORD dwY; // Y Location in Lines - } QSETSTARTADDR, FAR * LPQSETSTARTADDR, * PQSETSTARTADDR; - -/* -** This is used to get the gamma values currently in use -** -** INPUT: qin.dwSubFunc = QUERYGETGAMMA -** OUTPUT: QGETGAMMA -*/ -typedef struct qgetgamma { - DWORD dwRed; // Red Gamma * 100 - DWORD dwGreen; // Green Gamma * 100 - DWORD dwBlue; // Blue Gamma * 100 - DWORD GammaTable[256]; // Gamma Table Defined as 0x00BBGGRR - } QGETGAMMA, FAR * LPQGETGAMMA, * PQGETGAMMA; - -/* -** This is used to set the Gamma Value -** -** INPUT: qSetGamma.dwSubFunc = QUERYSETSTARTADDR -** OUTPUT: None -*/ -typedef struct qsetgamma { - DWORD dwSubFunc; // Should be set to QUERYSETGAMMA - DWORD dwRed; // Red Gamma * 100 - DWORD dwGreen; // Green Gamma * 100 - DWORD dwBlue; // Blue Gamma * 100 - DWORD GammaTable[256]; // Gamma Table Defined as 0x00BBGGRR - } QSETGAMMA, FAR * LPQSETGAMMA, * PQSETGAMMA; - -#define MAX_BIOS_VERSION_STRING (32) - -/* -** This is used to get the BIOS version -** -** INPUT: qin.dwSubFunc = QUERYGETBIOSVERSION -** OUTPUT: QGETBIOSVERSION -*/ -typedef struct qgetbiosversion { - BYTE bBIOSVersion[MAX_BIOS_VERSION_STRING]; - } QGETBIOSVERSION, FAR * LPQGETBIOSVERSION, * PQGETBIOSVERSION; - - -/* -** This is used to get the AGP Caps -** -** INPUT: qin.dwSubFunc = QUERYGETAGPCAPS -** OUTPUT: QGETAGPCAPS -*/ -// These are also defined in h3g.h -#define IS_AGP_CARD (0x00000001L) //Card has AGP capabilities -#define IS_GART_AVAILABLE (0x00000002L) //VMM Gart Functions are present -#define IS_AGP_READY (IS_AGP_CARD|IS_GART_AVAILABLE) //We can do AGP Functions on this card - -typedef struct qgetagpcaps { - DWORD dwAGPCaps; - } QGETAGPCAPS, FAR * LPQGETAGPCAPS, * PQGETAGPCAPS; - -/* HWCEXT_LCDCTRL -* -* Enables or disables flat panel monitor and also returns current status as -* given in IN-OUT struct below: -* -*/ - -// CAUTION: this is mirrored in h3g.h!!! - -typedef struct { - DWORD dwSubFunc; // Should be set to QGETSET_LCDCTRL - DWORD maxWidth; // out - DWORD maxHeight; // out - DWORD refreshRate; // out - DWORD fpFlags; // in - out -} QGETSET_LCDCTRL; - -#define FPFLAG_ENABLED BIT(0) // is currently enabled (OUT) -#define FPFLAG_PRESENT BIT(1) // panel & controller connected (OUT) -#define FPFLAG_PRESENT_AT_BOOT BIT(2) // panel & controller connected - // at boot time (OUT) -#define FPFLAG_ENABLE BIT(3) // try to enable panel (IN) -#define FPFLAG_DISABLE BIT(4) // try to disable panel (IN) -#define FPFLAG_GET_DIMS BIT(5) // read the EDID to get panel's - // physical dimensions (IN) -#define FPFLAG_SETRES BIT(6) // current desktop resolution too hi - // (OUT) -#define FPFLAG_SETREFR BIT(7) // current refresh rate wrong (OUT) - -// filter bits -// 00 bilinear 01 gausian -// 10 crisp 11 extra crisp -#define FPFLAG_FILTER_SOFT BIT(8) // use these 2 bits together (IN) -#define FPFLAG_FILTER_HARD BIT(9) -#define FPFLAG_CAPABLE BIT(10) // board has controller & BIOS - - -typedef struct { - DWORD dwSubFunc; // Should be set to QUERY_ANALOG_MONITOR - DWORD monitorStatus; - DWORD monitorControl; -} QGETSET_MONITOR_CTL; - -#define ENABLE_MONITOR BIT(0) -#define DISABLE_MONITOR BIT(1) -#define MONITOR_IS_ENABLED BIT(2) - - -#ifdef WINNT -int QueryMode(PDEV *, LPQIN lpQIN, LPVOID lpOutput); -#else -int QueryMode(LPQIN lpQIN, LPVOID lpOutput); -#endif - -#endif diff --git a/glide2x/h3/minihwc/setmode.h b/glide2x/h3/minihwc/setmode.h deleted file mode 100644 index 54dc190..0000000 --- a/glide2x/h3/minihwc/setmode.h +++ /dev/null @@ -1,28 +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 -*/ - -FxBool setVideoMode( void *hwnd, - int xRes, - int yRes, - int refresh, - void *hmon ); -void resetVideo( void ); - -FxBool checkResolutions(FxBool *reslist, void *hmon); diff --git a/glide2x/h3/minihwc/test/exttest.c b/glide2x/h3/minihwc/test/exttest.c deleted file mode 100644 index af142ed..0000000 --- a/glide2x/h3/minihwc/test/exttest.c +++ /dev/null @@ -1,234 +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 5/01/98 9:16a Dow -** -*/ - -#include -#include <3dfx.h> -#include "..\hwcext.h" -/* This segment simulates main() for Windows, creates a window, etc. */ -#define WIN32_LEAN_AND_MEAN -#include -#include - -/* Forward declarations */ -HWND hWndMain; - -/* - * MainWndproc - * - * Callback for all Windows messages - */ -static int qhead = 0; -static int qtail = 0; -static int queue[256] = {0}; - -long FAR PASCAL -MainWndproc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) -{ - PAINTSTRUCT ps; - HDC hdc; - - switch( message ) - { - case WM_SETCURSOR: - SetCursor(NULL); - break; - - case WM_CREATE: - break; - - case WM_PAINT: - hdc = BeginPaint( hWnd, &ps ); - EndPaint( hWnd, &ps ); - return 1; - - case WM_CLOSE: - queue[qhead++] = 'q'; qhead &= 255; - break; - - case WM_DESTROY: - break; - - case WM_MOVE: - break; - - case WM_DISPLAYCHANGE: - case WM_SIZE: - break; - - case WM_CHAR: - break; - - default: - break; - } - return DefWindowProc(hWnd, message, wParam, lParam); - -} /* MainWndproc */ - -void -main(int argc, char **argv) -{ - HWND hWndMain; - HANDLE hInstance = GetModuleHandle(NULL); - HDC dc; - int extRes; - hwcExtRequest_t req; - hwcExtResult_t res; - WNDCLASS wc; - BOOL rc; - - FxU32 contextID; - - - wc.style = CS_DBLCLKS; - wc.lpfnWndProc = MainWndproc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = hInstance; - wc.hIcon = LoadIcon( NULL, IDI_APPLICATION); /* generic icon */ - wc.hCursor = LoadCursor( NULL, IDC_ARROW ); - wc.hbrBackground = GetStockObject( BLACK_BRUSH ); - wc.lpszMenuName = NULL; - wc.lpszClassName = "ExtTestClass"; - rc = RegisterClass( &wc ); - - if( !rc ) { - printf("Failed to register class!\n"); - exit(1); - } - - hWndMain = - CreateWindowEx( -#if 0 - WS_EX_APPWINDOW gives you regular borders? - WS_EX_TOPMOST Works as advertised. -#endif - WS_EX_APPWINDOW, - "ExtTestClass", - "ExtEscape Test", - WS_OVERLAPPED | - WS_CAPTION | - WS_THICKFRAME | - WS_MAXIMIZEBOX | - WS_MINIMIZEBOX | - WS_POPUP | /* non-app window */ - WS_SYSMENU, /* so we get an icon in the tray */ - CW_USEDEFAULT, - CW_USEDEFAULT, - 0x110, /* GetSystemMetrics(SM_CXSCREEN), */ - 0x120, /* GetSystemMetrics(SM_CYSCREEN), */ - NULL, - NULL, - hInstance, - NULL - ); - - - if( !hWndMain ) { - printf("Failed to create window\n"); - exit(2); - } - - /* HWCEXT_GETDRIVERVERSION */ - - req.which = HWCEXT_GETDRIVERVERSION; - - dc = GetDC(hWndMain); - - extRes = ExtEscape(dc, EXT_HWC, sizeof(req), (LPCSTR) &req, - sizeof(res), (LPCSTR) &res); - - if (extRes == 0) { - printf("No escape!\n"); - exit(3); - } - - printf("HWCEXT_GETDRIVERVERSION:\n\tMajor:\t0x%x\n\tMinor:\t0x%x\n", - res.optData.driverVersionRes.major, - res.optData.driverVersionRes.minor); - - /* HWCEXT_ALLOCCONTEXT */ - req.which = HWCEXT_ALLOCCONTEXT; - - req.optData.allocContextReq.protocolRev = HWCEXT_PROTOCOLREV; - req.optData.allocContextReq.appType = HWCEXT_ABAPPTYPE_FSEM; - - extRes = ExtEscape(dc, EXT_HWC, sizeof(req), (LPCSTR) &req, - sizeof(res), (LPCSTR) &res); - - printf("HWCEXT_ALLOCCONTEXT:\n\tStatus:\t0x%x\n\tContext ID:\t0x%x\n", - res.resStatus, res.optData.allocContextRes.contextID); - - contextID = res.optData.allocContextRes.contextID; - - /* HWCEXT_GETDEVICECONFIG */ - req.which = HWCEXT_GETDEVICECONFIG; - - extRes = ExtEscape(dc, EXT_HWC, sizeof(req), (LPCSTR) &req, - sizeof(res), (LPCSTR) &res); - - printf("HWCEXT_GETDEVICECONFIG:\ -\n\tStatus:\t0x%x\ -\n\tdevNum:\t0x%x\ -\n\tvendorDI:\t0x%x\ -\n\tfbRam:\t0x%x\ -\n\tchipRev:\t0x%x\n", - res.resStatus, res.optData.deviceConfigRes.devNum, - res.optData.deviceConfigRes.vendorID, - res.optData.deviceConfigRes.fbRam, - res.optData.deviceConfigRes.chipRev); - - /* HWCEXT_GETLINEARADDR */ - req.which = HWCEXT_GETLINEARADDR; - - req.optData.linearAddrReq.devNum = 0; - - extRes = ExtEscape(dc, EXT_HWC, sizeof(req), (LPCSTR) &req, - sizeof(res), (LPCSTR) &res); - - printf("HWCEXT_LINEARADDRESS:\ -\n\tStatus:\t0x%x\ -\n\tnumBaseAddrs: %d\ -\n\tbaseAddresses[0]: 0x%x\ -\n\tbaseAddresses[1]: 0x%x\ -\n\tbaseAddresses[2]: 0x%x\n", - res.resStatus, res.optData.linearAddressRes.numBaseAddrs, - res.optData.linearAddressRes.baseAddresses[0], - res.optData.linearAddressRes.baseAddresses[1], - res.optData.linearAddressRes.baseAddresses[2] - ); - - /* HWCEXT_RELEASECONTEXT */ - req.which = HWCEXT_RELEASECONTEXT; - - req.optData.releaseContextReq.contextID = contextID; - - extRes = ExtEscape(dc, EXT_HWC, sizeof(req), (LPCSTR) &req, - sizeof(res), (LPCSTR) &res); - - printf("HWCEXT_RELEASECONTEXT:\n\tStatus:\t0x%x\n", res.resStatus); - -} /* main */ diff --git a/glide2x/h3/minihwc/test/makefile b/glide2x/h3/minihwc/test/makefile deleted file mode 100644 index f143cbd..0000000 --- a/glide2x/h3/minihwc/test/makefile +++ /dev/null @@ -1,39 +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 -# - - -LDIRT= *.exe *.map *.sys *.obj *.lib - -LCINCS = $(LCINCS) -I$(BUILD_ROOT)\h3\include - -LLDLIBS = $(LIBOBJS) $(BUILD_ROOT)\h3\lib\miniHwc.lib\ - $(BUILD_ROOT_SWLIBS)\lib\fxpci.lib\ - $(BUILD_ROOT_SWLIBS)\lib\fxmisc.lib - -CFILES = test.c exttest.c - -PROGRAMS = $(CFILES:.c=.exe) - - -!include $(BUILD_ROOT)\swlibs/include/nmake/3dfx.mak - -$(PROGRAMS): $(LLDLIBS) - -test: test.exe \ No newline at end of file diff --git a/glide2x/h3/minihwc/test/test.c b/glide2x/h3/minihwc/test/test.c deleted file mode 100644 index c9affeb..0000000 --- a/glide2x/h3/minihwc/test/test.c +++ /dev/null @@ -1,64 +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 -#include -#include - -void -main(int argc, char **argv) -{ - FxU32 - devId, venId, - i; - hwcInfo *hInfo; - - if (argc < 3) { - printf("usage: test vid did\n"); - exit(1); - } - - sscanf(argv[1], "%x", &venId); - sscanf(argv[2], "%x", &devId); - - if ((hInfo = hwcInit(venId, devId)) == NULL) { - printf(hwcGetErrorString()); - exit(2); - } - - printf("nBoards = %d\n", hInfo->nBoards); - - for (i = 0; i < hInfo->nBoards; i++) { - int pbAddr; - hwcPCIInfo *pciInfo = &hInfo->boardInfo[i].pciInfo; - - printf("Board %d\n", i); - printf("\tVendor ID = 0x%x\n", pciInfo->vendorID); - printf("\tDevice ID = 0x%x\n", pciInfo->deviceID); - - hwcMapBoard(&hInfo->boardInfo[i], 0x1ff); - for (pbAddr = 0; pbAddr < 9; pbAddr++) { - printf("\tPCI Base Address %d = 0x%x\n", pbAddr, pciInfo->pciBaseAddr[pbAddr]); - printf("\tLinear Address: 0x%x\n", - hInfo->boardInfo[i].linearInfo.linearAddress[pbAddr]); - } - } -} /* main */ - diff --git a/glide2x/h3/minihwc/tv.h b/glide2x/h3/minihwc/tv.h deleted file mode 100644 index 0edc136..0000000 --- a/glide2x/h3/minihwc/tv.h +++ /dev/null @@ -1,573 +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$ -** $Log$ -** -** 3 3/17/99 6:14p Dow -** Fixes Phantom Menace, OGL, and others. -** -** 10 3/02/99 4:20p Stuartb -** Removed obsolete TV_STANDARD_XXX defines. -** -** 9 2/16/99 3:47p Stuartb -** Added some BIOS_XXXX tvout & LCD defines. -** -** 8 2/13/99 6:45p Stuartb -** First cut at PAL_M, PAL_N, PAL_NC support in tvout. -** -** 7 99/01/26 11:51 Larryw -** Bringing the other tv.h's into sync with the changes made to -** $/devel/h3/Win95/dx/inc/tv.h (including QUERYENABLETV). -** -** 2 1/14/99 3:50p Stuartb -** Added #define QUERYENABLETV. -** -** 1 9/10/98 2:55p Stuartb -** Interface file for TVOUT. -** -** 2 7/11/98 8:18a Andrew -** changed some comments -** -** 1 5/12/98 9:34a Andrew -** First attempt at TV out interface -** -*/ - -#ifndef _TV_H_ -#define _TV_H_ - -#ifdef VDDONLY -#define FAR -#endif - -// TVOut Queries -#define QUERYTVAVAIL (0x300) // Returns Status Determined at Boot -#define QUERYTVSENSE (0x301) // Performs a Sense on the available connectors - -// Individual Queries on Capabilities -#define QUERYGETPICCAP (0x321) // Get Individual Picture Control Capability -#define QUERYGETFILTERCAP (0x322) // Get Individual Filter Control Capability -#define QUERYGETPOSCAP (0x323) // Get Individual Position Control Capability -#define QUERYGETSIZECAP (0x324) // Get Individual Size Control Capability -#define QUERYGETSPECIALCAP (0x325) // Get Individual Special Control Capability - -// Get Current Settings -#define QUERYGETSTANDARD (0x340) // Get Current Standard Setting -#define QUERYGETPICCONTROL (0x341) // Get Individual Picture Control Setting -#define QUERYGETFILTERCONTROL (0x342) // Get Individual Filter Control Setting -#define QUERYGETPOSCONTROL (0x343) // Get Position Control Setting -#define QUERYGETSIZECONTROL (0x344) // Get Size Control Setting -#define QUERYGETSPECIAL (0x345) // Get Individual Special Control Setting -#define QUERYGETCONSTATUS (0x346) // Get Connector Status - -// Set Settings -#define QUERYSETSTANDARD (0x360) // Set Current Standard Setting -#define QUERYSETPICCONTROL (0x361) // Set Individual Picture Control Setting -#define QUERYSETFILTERCONTROL (0x362) // Set Individual Filter Control Setting -#define QUERYSETPOSCONTROL (0x363) // Set Individual Position Control Setting -#define QUERYSETSIZECONTROL (0x364) // Set Individual Size Control Setting -#define QUERYSSETSPECIAL (0x365) // Set Individual Special Control Setting -#define QUERYSETCONSTATUS (0x366) // Set Connector Status - -// Registery Updates -#define QUERYCOMMITREG (0x380) // This should be called after the user hits ok -#define QUERYREFRESH (0x381) // This should be called if the user hits cancel - -// Enable/Disable TV-Out -#define QUERYDISABLETV (0x500) // Disable TV-Out and switch CRT On -#define QUERYENABLETV (0x501) // This just enables mode selection - -/* -** Call this function first to know how if a TV Encoder is -** available and what general functionality it provides -** -** INPUT: qin.dwSubFunc = QUERYTVAVAIL -** OUTPUT: TVSTATUS -*/ - -typedef struct tvcon { - DWORD dwType; // Type of the Connector - DWORD dwStatus; // Connector Status -} TVCON, FAR * LPTVCON, * PTVCON; - -// To be used in the Type Field of TVCON -#define TV_TYPE_SVIDEO (0x00000001L) -#define TV_TYPE_COMPOSITE (0x00000002L) -#define TV_TYPE_SCART (0x00000004L) -#define TV_TYPE_UNKNOWN (0x08L) // for broken bt868 rev d - -// To be used in the Status Field of TVCON -#define TV_PRESENT (0x00000001L) // Did sense determine TV on connector ? -#define TV_CONNECTOR_ENABLED (0x00000002L) // Is Connector Currently Enabled ? - -#define MAX_CONNECTORS (0x000000004L) - -// This structure defines what we are capable of -typedef struct qtvstatus { - DWORD dwEncoder; // Did I2C Query find a TV Encoder - DWORD dwStandard; // Bit Map of Standard's Supported - DWORD dwPicControl; // Bit Map of Picture Controls - DWORD dwFilterControl; // Bit Map of Filter Controls - DWORD dwPosControl; // Bit Map of Position Controls - DWORD dwSizeControl; // Bit Map of Size Controls - DWORD dwSpecial; // Bit Map of Special Controls - DWORD dwNumSimultaneous; // How many outputs can you support at the same time? - DWORD dwNumConnectors; // How many connectors does the Encoder support - TVCON TVCon[MAX_CONNECTORS]; // TV Connector Status - BYTE szName[10]; // Name of the Encoder - } QTVSTATUS, FAR * LPQTVSTATUS, * PTVSTATUS; - -// To be used in TVStatus.dwEncoder -#define TV_ENCODER_PRESENT (0x00000001L) - -// To be used in TVStatus.dwPicControl -#define TV_BRIGHTNESS (0x00000001) -#define TV_CONTRAST (0x00000002) -#define TV_GAMMA (0x00000004) -#define TV_HUE (0x00000008) -#define TV_SATURATION (0x00000010) -#define TV_SHARPNESS (0x00000020) - -// To be used in TVStatus.dwFilter -#define TV_FLICKER (0x10000001) -#define TV_CHROMA (0x10000002) -#define TV_LUMA (0x10000004) - -// To be used in TVStatus.dwPosControl -#define TV_HORIZONTAL (0x00000001) -#define TV_VERTICAL (0x00000002) - -// To be used in TVStatus.dwSizeControl -#define TV_UNDERSCAN (0x00000001) -#define TV_OVERSCAN (0x00000002) -#define TV_ADJUST_UNDERSCAN (0x00000004) -#define TV_ADJUST_OVERSCAN (0x00000008) - -// To be used in TVStatus.dwSpecial -#define TV_CLOSED_CAPTION (0x00000001) -#define TV_MACROVISION (0x00000002) -#define TV_LCDPANEL (0x00000004) /* Flat panel out */ - -// To be used in TVSetSpec.dwCap for miscellaneous features -#define TV_SETSPECIAL_CCAPTION (0x00000001) -#define TV_SETSPECIAL_MACROVISION (0x00000002) -#define TV_SETSPECIAL_LCDPANEL (0x00000004) /* Flat panel out */ -#define TV_SETSPECIAL_WR_LCDREG (0x00000005) /* For debug */ -#define TV_SETSPECIAL_RD_LCDREG (0x00000006) /* For debug */ - -#define MAX_SPECIAL_DATA 512 -/* -** Call this function to request the Driver to perform -** a sense on every connector -** -** INPUT: qin.dwSubFunc = QUERYTVSENSE -** OUTPUT: TVCONSTATUS -*/ - -typedef struct tvconstatus { - DWORD dwNumConnectors; // How many connectors does the Encoder support - TVCON TVCon[MAX_CONNECTORS]; // TV Connector Status - } TVCONSTATUS, FAR * LPTVCONSTATUS, * PTVCONSTATUS; - -/**************************************************************************** -** -** Get Capabilities -** -****************************************************************************/ - -typedef struct qind { - DWORD dwSubFunc; // Sub Function - DWORD dwCap; // Capability of Interest -} QIND, FAR * LPQIND, * PQIND; - -/* -** Call this function to request the Driver to -** report individual Picture Capability -** -** INPUT: qind.dwSubFunc = QUERYGETPICCAP -** qind.dwCap = TV_BRIGHTNESS | -** TV_CONTRAST | -** TV_GAMMA | -** TV_HUE | -** TV_SATURATION | -** TV_SHARPNESS -** OUTPUT: TVCAPDATA -*/ - -typedef struct tvcapdata { - DWORD dwCap; // Capability of Interest - DWORD dwNumSteps; // Number of Steps Supported by Hardware - } TVCAPDATA, FAR * LPTVCAPDATA, * PTVCAPDATA; - -/* -** Call this function to request the Driver to -** report all Position Capability -** -** INPUT: qin.dwSubFunc = QUERYGETPOSITIONCAP -** OUTPUT: TVPOSCAP -** Note this is a good match for Chrontel but unknown now to do this on Brooktree -*/ -typedef struct tvposcap { - DWORD dwMaxLeft; // Maximum Left Position in Hardware Units - DWORD dwMaxRight; // Maximum Right Position in Hardware Units - DWORD dwHorGranularity; // Size of Movement in Pixels - DWORD dwMaxTop; // Maximum Top Position in Hardware Units - DWORD dwMaxBottom; // Maximum Bottom Position in Hardware Units - DWORD dwVGAGranularity; // Granularity in VGA Lines - } TVPOSCAP, FAR * LPTVPOSCAP, * PTVPOSCAP; - -/* -** Call this function to request the Driver to -** report all Size Capability -** -** INPUT: qin.dwSubFunc = QUERYGETSIZECAP -** OUTPUT: TVSIZECAP -** Note this is a good match for BrookTree but unknown now to do this on Chrontel -*/ -typedef struct tvsizecap { - DWORD dwMaxHorInput; // Maximum Input Horizontal Size in Active Pixels - DWORD dwMaxVerInput; // Maximum Input Vertical Size in Active Lines - DWORD dwMaxHorOutput; // Maximum Output Horizontal Size in Active Pixels - DWORD dwMaxVerOutput; // Maximum Output Vertical Size in Active Pixels - DWORD dwMinHorInput; // Minimum Input Horizontal Size in Active Pixels - DWORD dwMinVerInput; // Minimum Input Vertical Size in Active Lines - DWORD dwMinHorOutput; // Minimum Output Horizontal Size in Active Pixels - DWORD dwMinVerOutput; // Minimum Output Vertical Size in Active Pixels - DWORD dwHorStepSize; // In Percentage * 1000 - DWORD dwVerStepSize; // In Percentage * 1000 - } TVSIZECAP, FAR * LPTVSIZECAP, * PTVSIZECAP; - -/* -** Call this function to request the Driver to -** report on a Special Capability -** -** INPUT: qind.dwSubFunc = QUERYGETSPECIALCAP -** qind.dwCap = TV_CLOSED_CAPTION | -** TV_MACROVISION | -** TV_LCDPANEL -** OUTPUT: TVSPECCAP -*/ - -/**************************************************************************** -** -** Get Current Settings -** -****************************************************************************/ - -/* -** Call this function to request the Driver to -** report current Standard Setting -** -** INPUT: qin.dwSubFunc = QUERYGETSTANDARD -** OUTPUT: TVGETSTANDARD -*/ -typedef struct tvgetstandard { - DWORD dwStandard; // Standard Currently in Use -} TVGETSTANDARD, FAR * LPTVGETSTANDARD, * PTVGETSTANDARD; - -/* -** Call this function to request the Driver to -** report current individual Picture Capability -** -** INPUT: qind.dwSubFunc = QUERYGETPICCONTROL -** qind.dwCap = TV_BRIGHTNESS | -** TV_CONTRAST | -** TV_GAMMA | -** TV_HUE | -** TV_SATURATION | -** TV_SHARPNESS -** OUTPUT: TVCURCAP -*/ - -typedef struct tvcurcap { - DWORD dwCap; // Capability Requested - DWORD dwStep; // Current Hardware Step we are on - } TVCURCAP, FAR * LPTVCURCAP, * PTVCURCAP; - -/* -** Call this function to request the Driver to -** report current individual Filter Capability -** -** INPUT: qind.dwSubFunc = QUERYGETFILTERCONTROL -** qind.dwCap = TV_FLICKER | -** TV_CHROMA | -** TV_LUMA -** OUTPUT: TVCURCAP -*/ - -/* -** Call this function to request the Driver to -** report all current Position Capability -** -** INPUT: qin.dwSubFunc = QUERYGETPOSITIONCONTROL -** OUTPUT: TVCURPOS -** Note this is a good match for Chrontel but unknown now to do this on Brooktree -*/ -typedef struct tvcurpos { - DWORD dwCurLeft; // Current Left Position in Hardware Units - DWORD dwCurRight; // Current Right Position in Hardware Units - DWORD dwCurTop; // Current Top Position in Hardware Units - DWORD dwCurBottom; // Current Bottom Position in Hardware Units - } TVCURPOS, FAR * LPTVCURPOS, * PTVCURPOS; - -/* -** Call this function to request the Driver to -** report current Size Capability -** -** INPUT: qin.dwSubFunc = QUERYGETSIZECONTROL -** OUTPUT: TVCURSIZE -** Note this is a good match for BrookTree but unknown now to do this on Chrontel -*/ -typedef struct tvcursize { - DWORD dwCurHorInput; // Current Input Horizontal Size in Active Pixels - DWORD dwCurVerInput; // Current Input Vertical Size in Active Lines - DWORD dwCurHorOutput; // Current Output Horizontal Size in Active Pixels - DWORD dwCurVerOutput; // Current Output Vertical Size in Active Pixels - } TVCURSIZE, FAR * LPTVCURSIZE, * PTVCURSIZE; - -/* -** Call this function to request the Driver to -** report on current a Special Capability -** -** INPUT: qind.dwSubFunc = QUERYGETSPECIAL -** qind.dwCap = TV_CLOSED_CAPTION | -** TV_MACROVISION -** OUTPUT: TVCURSPEC -*/ - -/* -** Call this function to request the Driver to return -** in memory data on every connector -** -** INPUT: qin.dwSubFunc = QUERYGETCONSTATUS -** OUTPUT: TVCONSTATUS -*/ - - -/**************************************************************************** -** -** Set Functions -** -****************************************************************************/ - -/* -** Call this function to request the Driver to -** change the current Standard Setting -** -** INPUT: TvSetStandard.dwSubFunc = QUERYSETSTANDARD -** TvSetStandard.dwStandard = TV_STANDARD_NTSCRS170A | -** TV_STANDARD_NTSCM | -** TV_STANDARD_NTSCN | -** TV_STANDARD_NTSC443 | -** TV_STANDARD_NTSCJAPAN | -** TV_STANDARD_PALBDGHI | -** TV_STANDARD_PALM | -** TV_STANDARD_PALN | -** TV_STANDARD_PALN_ARGENTINA | -** -** OUTPUT: None -*/ -typedef struct tvsetstandard { - DWORD dwSubFunc; // Sub Function - DWORD dwStandard; // Standard Currently in Use -} TVSETSTANDARD, FAR * LPTVSETSTANDARD, * PTVSETSTANDARD; - -/* -** Call this function to request the Driver to -** set individual Picture Capability -** -** INPUT: TVSetCap.dwSubFunc = QUERYSETPICCONTROL -** TVSetCap.dwCap = TV_BRIGHTNESS | -** TV_CONTRAST | -** TV_GAMMA | -** TV_HUE | -** TV_SATURATION | -** TV_SHARPNESS -** TVSetCap.dwStep = -** OUTPUT: None -*/ - -typedef struct tvsetcap { - DWORD dwSubFunc; // SubFunction - DWORD dwCap; // Capability Requested - LONG dwStep; // Hardware Step to set - } TVSETCAP, FAR * LPTVSETCAP, * PTVSETCAP; - -/* -** Call this function to request the Driver to -** set individual Filter Capability -** -** INPUT: TVSetCap.dwSubFunc = QUERYSETFILTERCONTROL -** TVSetCap.dwCap = TV_FLICKER | -** TV_CHROMA | -** TV_LUMA -** TVSetCap.dwStep = -** OUTPUT: None -*/ - -/* -** Call this function to request the Driver to -** move the Output Image -** -** INPUT: TVSetPos.dwSubFunc = QUERYSETPOSCONTROL -** TVSetPos.dwLeft = -** TVSetPos.dwRight = -** TVSetPos.dwTop = -** TVSetPos.dwBottom = -** OUTPUT: None -** Note this is a good match for Chrontel but unknown now to do this on Brooktree -*/ -typedef struct tvsetpos { - DWORD dwSubFunc; // SubFunction - DWORD dwLeft; // Left Position in Hardware Units - DWORD dwRight; // Right Position in Hardware Units - DWORD dwTop; // Top Position in Hardware Units - DWORD dwBottom; // Bottom Position in Hardware Units - } TVSETPOS, FAR * LPTVSETPOS, * PTVSETPOS; - -/* -** Call this function to request the Driver to -** set the resize the input/output -** -** INPUT: TVSetSize.dwSubFunc = QUERYSETSIZECONTROL -** TvSetSize.dwHorOutput = -** TvSetSize.dwVerOutput = -** OUTPUT: None -** Note this is a good match for BrookTree but unknown now to do this on Chrontel -*/ -typedef struct tvsetsize { - DWORD dwSubFunc; // SubFunction - DWORD dwOverScan; // Overscan enable/disable - DWORD dwHorOutput; // Output Horizontal Size in Active Pixels - DWORD dwVerOutput; // Output Vertical Size in Active Lines - } TVSETSIZE, FAR * LPTVSETSIZE, * PTVSETSIZE; - -/* -** Call this function to request the Driver to -** set the a Special Capability -** -** INPUT: TVSetSpec.dwSubFunc = QUERYSETSPECIAL -** TVSetSpec.dwCap = TV_SETSPECIAL_CCAPTION | -** TV_SETSPECIAL_MACROVISION | -** TV_SETSPECIAL_LCDPANEL -** OUTPUT: None -*/ -typedef struct tvsetspecial { - DWORD dwSubFunc; // Sub Function - DWORD dwCap; // Feature to set - DWORD dwIndex; // Index to data array: 0 - none - WORD wData[MAX_SPECIAL_DATA]; // Data array: format specific to caps - DWORD dwIPclock; // Flat panel clock - } TVSETSPECIAL, FAR * LPTVSETSPECIAL, * PTVSETSPECIAL; - -/* -** Call this function to request the Driver to enable/disable -** connectors -** -** INPUT: TVSetConnector.dwSubFunc = QUERYSETCONSTATUS -** Note i can range from 0 to < dwNumSimultaneous -** TVSetConnector.TVCon[i].dwType = TV_TYPE_SVIDEO | TV_TYPE_COMPOSITE | TV_TYPE_SCART -** TVSetConnector.TVCon[i].dwStatus = TV_CONNECTOR_ENABLED | 0x00 -** -** OUTPUT: None -*/ - -typedef struct tvsetconnector { - DWORD dwSubFunc; // SubFunction - TVCON TVCon[MAX_CONNECTORS]; // TV Connector Status - } TVSETCONNECTOR, FAR * LPTVSETCONNECTOR, * PTVSETCONNECTOR; - -/**************************************************************************** -** -** Registry Functions -** -****************************************************************************/ -/* -** Call this function to request the Driver to save -** in memory data to registry -** -** INPUT: qin.dwSubFunc = QUERYCOMMITREG -** OUTPUT: None -*/ - -/* -** Call this function to request the Driver to refresh -** in memory data with registry data -** -** INPUT: qin.dwSubFunc = QUERYREFRESH -** OUTPUT: None -*/ - - - -/**************************************************************************** -** -** Error codes -** -****************************************************************************/ -#define TV_STANDARD_UNSUPPORTED (0x00000001L) -#define TV_CONTROL_UNSUPPORTED (0x00000002L) -#define TV_INVALID_DEVICE (0x000000ffL) - - -/**************************************************************************** -** -** TV standards that we support taken from win98 ddk tvout.h -** -****************************************************************************/ - -#define VP_TV_STANDARD_NTSC_M 0x0001 // 75 IRE Setup -#define VP_TV_STANDARD_NTSC_M_J 0x0002 // Japan, 0 IRE Setup -#define VP_TV_STANDARD_PAL_B 0x0004 -#define VP_TV_STANDARD_PAL_D 0x0008 -#define VP_TV_STANDARD_PAL_H 0x0010 -#define VP_TV_STANDARD_PAL_I 0x0020 -#define VP_TV_STANDARD_PAL_M 0x0040 -#define VP_TV_STANDARD_PAL_N 0x0080 -#define VP_TV_STANDARD_SECAM_B 0x0100 -#define VP_TV_STANDARD_SECAM_D 0x0200 -#define VP_TV_STANDARD_SECAM_G 0x0400 -#define VP_TV_STANDARD_SECAM_H 0x0800 -#define VP_TV_STANDARD_SECAM_K 0x1000 -#define VP_TV_STANDARD_SECAM_K1 0x2000 -#define VP_TV_STANDARD_SECAM_L 0x4000 -#define VP_TV_STANDARD_WIN_VGA 0x8000 -// and the rest -#define VP_TV_STANDARD_NTSC_433 0x00010000 -#define VP_TV_STANDARD_PAL_G 0x00020000 -#define VP_TV_STANDARD_PAL_60 0x00040000 -#define VP_TV_STANDARD_SECAM_L1 0x00080000 - -#define VP_TV_STANDARD_PAL_NC VP_TV_STANDARD_SECAM_L1 - - -#define BIOS_NTSC 0x01 // 00001 -#define BIOS_PAL 0x02 // (BGDHI) 00010 -#define BIOS_PAL_N 0x0a // 01010 -#define BIOS_PAL_M 0x12 // 10010 -#define BIOS_PAL_Nc 0x1a // 11010 - -#define BIOS_TVSTD_MASK (BIOS_NTSC | BIOS_PAL | BIOS_PAL_N | BIOS_PAL_M | BIOS_PAL_Nc) -#define BIOS_LCD_ACTIVE 0x04 -#define BIOS_TVOUT_ACTIVE 0x20 - - -#endif diff --git a/glide2x/h3/minihwc/win_mode.c b/glide2x/h3/minihwc/win_mode.c deleted file mode 100644 index c8be745..0000000 --- a/glide2x/h3/minihwc/win_mode.c +++ /dev/null @@ -1,682 +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 -#include <3dfx.h> -#include -#define WIN32_LEAN_AND_MEAN -#include -#include -#include -#include "qmodes.h" -#define IS_32 -#define Not_VxD -#include -#include -#include - -/* Windows */ -#define SEPARATOR '\\' -/* UNIX */ -#define SEPARATOR2 '/' - -/* - * parseFilename - * - * Return the file name portion of a filename/path. - */ - -static char * -_parseFilename(char *name) -{ - int i; - - if (name == NULL) - return NULL; - for(i = strlen(name); i >= 0; i--) - if ((name[i] == SEPARATOR) || - (name[i] == SEPARATOR2)) - return (name + i + 1); - return name; -} /* End of parseFilename*/ - - -static int _set_exclusive_relaxed; -static int _set_vidmode_relaxed; - -static BOOL FAR PASCAL -ddEnumCbEx( GUID FAR *guid, LPSTR desc, LPSTR name, LPVOID ctx, HMONITOR hmon ) -{ - DWORD *data = (DWORD*)ctx; - HMONITOR target = (HMONITOR)data[0]; - BOOL rv = DDENUMRET_OK; - - if ( target == hmon ) { - if ( guid ) { - fooGuid = *guid; - data[1] = (DWORD)&fooGuid; - } else { - /* guid for primary display device */ - data[1] = 0; - } - rv = DDENUMRET_CANCEL; - } - return rv; -} - -typedef struct _emcStruct { - FxU32 xRes, yRes, Refresh; - FxBool modeOK; -} EMCData; - -static HRESULT WINAPI -enumModesCallback(LPDDSURFACEDESC surfaceDesc, LPVOID lpContext) -{ - EMCData *emcData = (EMCData *) lpContext; - - GDBG_INFO(80, "enumModesCallbac:\n"); - GDBG_INFO(80, "\tsurfaceDesc->dwWidth == %d\n", surfaceDesc->dwWidth); - GDBG_INFO(80, "\tsurfaceDesc->dwHeight == %d\n", surfaceDesc->dwHeight); - GDBG_INFO(80, - "\tsurfaceDesc->dwRefreshRate == %d\n",surfaceDesc->dwRefreshRate); - GDBG_INFO(80, "\tsurfaceDesc->ddpfPixelFormat.dwRGBBitCount == %d\n", - surfaceDesc->ddpfPixelFormat.dwRGBBitCount); - if ( - (surfaceDesc->dwWidth == emcData->xRes) && - (surfaceDesc->dwHeight == emcData->yRes) && - (surfaceDesc->ddpfPixelFormat.dwRGBBitCount == 16) && - (surfaceDesc->dwRefreshRate == emcData->Refresh)) { - emcData->modeOK = FXTRUE; - return DDENUMRET_CANCEL; - } else - return DDENUMRET_OK; - -} /* enumModesCallback */ - -static void -msgModeSetFailure(HRESULT hResult) -{ - - if (hResult& DDERR_GENERIC) - GDBG_INFO(80, "Mode set failed due to DDERR_GENERIC\n"); - - if (hResult & DDERR_INVALIDMODE) - GDBG_INFO(80, "Mode set failed due to DDERR_INVALIDMODE\n"); - - if (hResult & DDERR_INVALIDOBJECT) - GDBG_INFO(80, "Mode set failed due to DDERR_INVALIDOBJECT\n"); - - if (hResult & DDERR_INVALIDPARAMS) - GDBG_INFO(80, "Mode set failed due to DDERR_INVALIDPARAMS\n"); - - if (hResult & DDERR_LOCKEDSURFACES) - GDBG_INFO(80, "Mode set failed due to DDERR_LOCKEDSURFACES\n"); - - if (hResult & DDERR_NOEXCLUSIVEMODE) - GDBG_INFO(80, "Mode set failed due to DDERR_NOEXCLUSIVEMODE\n"); - - if (hResult & DDERR_SURFACEBUSY) - GDBG_INFO(80, "Mode set failed due to DDERR_SURFACEBUSY\n"); - - if (hResult & DDERR_UNSUPPORTED) - GDBG_INFO(80, "Mode set failed due to DDERR_UNSUPPORTED\n"); - - if (hResult & DDERR_UNSUPPORTEDMODE) - GDBG_INFO(80, "Mode set failed due to DDERR_UNSUPPORTEDMODE\n"); - - if (hResult & DDERR_WASSTILLDRAWING) - GDBG_INFO(80, "Mode set failed due to DDERR_WASSTILLDRAWING\n"); - -} /* msgModeSetFailure */ - -static void -msgEnumDisplayModes(hResult) -{ - if (hResult & DDERR_INVALIDOBJECT) - GDBG_INFO(80, "DDERR_INVALIDOBJECT\n"); - - if (hResult & DDERR_INVALIDPARAMS) - GDBG_INFO(80, "DDERR_INVALIDPARAMS\n"); - -} /* msgEnumDisplayModes */ - -#ifdef __WIN32__ -static char * -getModesRegPath() -{ - char *retVal = NULL; - OSVERSIONINFO ovi; - - ovi.dwOSVersionInfoSize = sizeof ( ovi ); - GetVersionEx ( &ovi ); - if (ovi.dwPlatformId == VER_PLATFORM_WIN32_NT) { - GDBG_INFO(80, "OS == WNT\n"); - /* It is hardcoded on NT via Display Control code. see: - * $/devel/swtools/bansheecp2 */ - retVal = "SYSTEM\\CurrentControlSet\\Services\\3Dfx\\Device0\\modes\\"; - } else { - QDEVNODE QDevNode; - QIN Qin; - int status; - - GDBG_INFO(80, "OS == W9X\n"); - - Qin.dwSubFunc = QUERYDEVNODE; - { - HDC curDC = GetDC(NULL); - - status = ExtEscape ( curDC, QUERYESCMODE, - sizeof(Qin), (LPCSTR)&Qin, - sizeof(QDevNode), (LPSTR)&QDevNode ); - ReleaseDC(NULL, curDC); - } - - if ( status > 0 ) { - static char regPath[255]; - - CM_Get_DevNode_Key( QDevNode.dwDevNode, NULL, - ®Path, sizeof(regPath), - CM_REGISTRY_SOFTWARE ); - strcat(regPath, "\\modes\\"); - - retVal = regPath; - } - } - - return retVal; -} /* getRegPath */ -#endif - -FxBool -setVideoMode( HWND hwnd, int xRes, int yRes, int refresh, void *hmon ) -{ - LPGUID ddGuid = NULL; - HMODULE ddraw = NULL; - DDSURFACEDESC ddsd; - HRESULT hResult; - DEVMODE devMode; - FxU32 bpp = 16; - EMCData emcData; /* Enum Modes Callbac Data */ - - GDBG_INFO( 80, "setVideoMode sees hwnd %x\n", hwnd); - hwndApp = ( hwnd == NULL ) ? GetActiveWindow() : hwnd; - - if ( hwndApp == NULL ) { - GDBG_INFO( 80, "Couldn't get a valid window handle\n" ); - } - - ddGuid = NULL; - ddraw = GetModuleHandle( "ddraw.dll" ); - if ( ddraw ) { - LPDIRECTDRAWENUMERATEEXA ddEnumEx; - ddEnumEx = (void*)GetProcAddress( ddraw, "DirectDrawEnumerateExA" ); - if ( ddEnumEx ) { - DWORD data[2]; - data[0] = (DWORD)hmon; - data[1] = 0; - ddEnumEx( ddEnumCbEx, data, DDENUM_ATTACHEDSECONDARYDEVICES ); - if ( data[1] ) { - ddGuid = (LPGUID)data[1]; - } - } - } - - - EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &devMode); - - /* - ** Oh, this is lovely. What we have here is a failure to - ** communicate. If the current mode is exactly the same as the - ** mode in which Glide wishes to run, then the DirecDraw driver - ** doesn't get called when we restore the video (or on an alt-tab) - ** this would be fine, except Glide has its way with the video - ** overlya registers. So, if we detect this case, we ask DDraw for - ** an 8-bit display, and fix up vidProcCfg in the minihwc. - */ - if ((devMode.dmPelsWidth == (FxU32) xRes) && - (devMode.dmPelsHeight == (FxU32) yRes) && - (devMode.dmBitsPerPel == 16UL)) { - bpp = 8; - } - - checkSpecialList(); - if (lpDD == NULL) { - /* only create directdraw object once */ - if ( DirectDrawCreate( ddGuid, &lpDD1, NULL ) != DD_OK) { - GDBG_INFO(80, "DDraw Obj Create Failed!\n"); - } - else GDBG_INFO(80, "DDraw Obj created!\n"); - if ( IDirectDraw_QueryInterface( lpDD1, &IID_IDirectDraw2, - (LPVOID*)&lpDD ) != DD_OK ) { - IDirectDraw_Release( lpDD1 ); - lpDD1 = NULL; - lpDD = NULL; - GDBG_INFO(80, "DDraw Obj Create Failed!\n"); - return FXFALSE; - } - else GDBG_INFO(80, "DDraw2 Obj created!\n"); - } - - /* Set Exclusive Mode, change resolution, */ - GDBG_INFO(80, "Setting Full screen exclusive mode!\n"); - GDBG_INFO(80, "Calling IDD2_SetCoop: 0x%x, 0x%x, 0x%x\n", lpDD, hwndApp, - DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN ); - - if ( - (hResult = - IDirectDraw2_SetCooperativeLevel(lpDD, hwndApp, - DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN )) - != DD_OK) { - GDBG_INFO(80, "Couldn't set cooperative level: " ); - if (hResult & DDERR_EXCLUSIVEMODEALREADYSET) - GDBG_INFO_MORE(80, "DDERR_EXCLUSIVEMODEALREADYSET\n" ); - - if (hResult & DDERR_HWNDALREADYSET) { - GDBG_INFO_MORE(80, "DDERR_HWNDALREADYSET\n" ); - if (hResult == DDERR_HWNDALREADYSET) - _set_exclusive_relaxed = 1; - } - if (hResult & DDERR_HWNDSUBCLASSED) - GDBG_INFO_MORE(80, "DDERR_HWNDSUBCLASSED\n" ); - - if (hResult & DDERR_INVALIDOBJECT) - GDBG_INFO_MORE(80, "DDERR_INVALIDOBJECT\n" ); - - if (hResult & DDERR_INVALIDPARAMS) - GDBG_INFO_MORE(80, "DDERR_INVALIDPARAMS\n" ); - - if (hResult & DDERR_OUTOFMEMORY) - GDBG_INFO_MORE(80, "DDERR_OUTOFMEMORY\n" ); - - if (!_set_exclusive_relaxed) - return FXFALSE; - } - - GDBG_INFO(80, "FSEM Set\n" ); - GDBG_INFO(80, "Enumerating Display Modes.\n"); - - /* Figure out if we can support the requested display mode. If not, - try to use the same x & y res, but the default refresh rate.*/ - - - ddsd.dwSize = sizeof(ddsd); - ddsd.dwFlags = DDSD_WIDTH | DDSD_HEIGHT; - ddsd.dwWidth = xRes; - ddsd.dwHeight = yRes; - ddsd.dwRefreshRate = refresh; - - /* Set these for use by the callback */ - emcData.xRes = xRes; - emcData.yRes = yRes; - emcData.Refresh = refresh; - emcData.modeOK = FXFALSE; - - hResult = IDirectDraw2_EnumDisplayModes(lpDD, 0, &ddsd, - (LPVOID) &emcData, enumModesCallback); - - if (hResult != DD_OK) { - GDBG_INFO(80, "Warning: EnumDisplayModes failed due to: \n"); - msgEnumDisplayModes(hResult); - } - - GDBG_INFO(80, "Setting Display Mode!\n"); - - if (emcData.modeOK) { - GDBG_INFO(80, "Found mode %dx%d. Attempting at %dHz\n", xRes, - yRes, refresh); - hResult = IDirectDraw2_SetDisplayMode( lpDD, xRes, yRes, bpp, refresh, 0); - if (hResult != DD_OK) { - GDBG_INFO(80, "Couldn't set display mode\n" ); - msgModeSetFailure(hResult); - GDBG_INFO(80, "Retrying at default resolution\n"); - hResult = IDirectDraw2_SetDisplayMode( lpDD, xRes, yRes, 16, 0, 0 ); - - if (hResult != DD_OK) { - GDBG_INFO(80, "Setting video mode %dx%d@default refresh failed!\n", - xRes, yRes); - msgModeSetFailure(hResult); - - if (!_set_vidmode_relaxed) { - GDBG_INFO(80, "Returning FXFALSE\n"); - return FXFALSE; - } else { - GDBG_INFO(80, "Continuing operation due to relaxation condition\n"); - } - } - } - GDBG_INFO(80, "Display Mode Set\n" ); - } else { - - GDBG_INFO(80, "Did not find mode %dx%d@any refresh\n", xRes, yRes); - GDBG_INFO(80, "Setting video mode %dx%d@default refresh\n", xRes, yRes); - - /* - ** This is really a hack here. We use the registry key entry to work - ** around DDraw refresh rate problem. - */ - { - static char *regPath = NULL; - char mpath[256], mpath_8[256], tmp[32]; - FxU32 reg_flag = 1; - if (regPath == NULL) { - regPath = getModesRegPath(); - } - if ((regPath) && (bpp == 8)) { - HKEY hKey, hKey8; - FxU32 retVal; - DWORD type, szData, type8, szData8; - static char strval[255], strval8[255]; - - /* get the current bpp path */ - szData = sizeof(strval); - strcpy(mpath, regPath); - sprintf(tmp, "%d\\%d,%d",devMode.dmBitsPerPel,xRes,yRes); - strcat(mpath, tmp); - /* get the 8 bpp path */ - szData8 = sizeof(strval8); - strcpy(mpath_8, regPath); - sprintf(tmp, "8\\%d,%d",xRes,yRes); - strcat(mpath_8, tmp); - /* - ** Get the original refresh rate from registry key - */ - if (RegOpenKey(HKEY_LOCAL_MACHINE, mpath, &hKey) == ERROR_SUCCESS) { - if (RegQueryValueEx(hKey, "RefreshRate", NULL, &type, strval, - &szData) == ERROR_SUCCESS) { - /* - ** overwrite 8 bit registry with glide refresh rate and set - ** the display mode. this is a workaround of the DDraw - ** refresh rate problem - */ - if (RegOpenKey(HKEY_LOCAL_MACHINE, mpath_8, &hKey8) - == ERROR_SUCCESS) { - if (RegQueryValueEx(hKey8, "RefreshRate", NULL, &type8, - strval8, &szData8) == ERROR_SUCCESS) { - retVal = 1; - } else { - retVal = 0; - } - RegSetValueEx(hKey8, "RefreshRate", 0, REG_SZ, strval, - strlen(strval)); - hResult = IDirectDraw2_SetDisplayMode(lpDD, xRes, yRes, - bpp, 0, 0); - reg_flag = 0; - /* - ** reset the original refresh rate - */ - if (retVal) { - RegSetValueEx(hKey8, "RefreshRate", 0, - REG_SZ, strval8, strlen(strval8)); - } - RegCloseKey(hKey8); - /* - ** delete the key if the refresh rate isn't there in the - ** first place - */ - if (!retVal) { - RegDeleteValue(hKey8, "RefreshRate" ); - RegDeleteKey(hKey8, "RefreshRate" ); - } - RegCloseKey(hKey); - } - } else { - /* - ** We did not find the "RefreshRate" key in the - ** devMode.dmBitsPerPel node so let's see if it exists for - ** this resolution under the 8 bpp node: - */ - if (RegOpenKey(HKEY_LOCAL_MACHINE, mpath_8, &hKey8) - == ERROR_SUCCESS) { - if (RegQueryValueEx(hKey8, "RefreshRate", NULL, &type8, strval8, - &szData8) == ERROR_SUCCESS) { - retVal = 1; - } else { - retVal = 0; - } - RegSetValueEx(hKey8, "RefreshRate", 0, REG_SZ, strval, - strlen(strval)); - hResult = IDirectDraw2_SetDisplayMode(lpDD, xRes, yRes, - bpp, 0, 0); - reg_flag = 0; - /* - ** reset the original refresh rate - */ - if (retVal) { - RegSetValueEx(hKey8, "RefreshRate", 0, - REG_SZ, strval8, strlen(strval8)); - } - RegCloseKey(hKey8); - /* - ** delete the key if the refresh rate isn't there in the - ** first place - */ - if (!retVal) { - RegDeleteValue(hKey8, "RefreshRate" ); - RegDeleteKey(hKey8, "RefreshRate" ); - } - RegCloseKey(hKey); - } - } - } - } - if (reg_flag) - hResult = IDirectDraw2_SetDisplayMode( lpDD, xRes, yRes, bpp, 0, 0 ); - } - - if (hResult != DD_OK) { - GDBG_INFO(80, "Failed!\n", - xRes, yRes); - msgModeSetFailure(hResult); - if (!_set_vidmode_relaxed) { - GDBG_INFO(80, "Returning FXFALSE\n"); - return FXFALSE; - } else { - GDBG_INFO(80, "Continuing operation due to relaxation condition\n"); - } - } - } - - return FXTRUE; - -} /* setVideoMode */ - -void -resetVideo( void ) -{ -#define FN_NAME "resetVideo" - if ( lpDD ) { - IDirectDraw2_RestoreDisplayMode( lpDD ); - GDBG_INFO(80, "%s: Restored Display Mode!\n", FN_NAME); - IDirectDraw2_SetCooperativeLevel( lpDD, hwndApp, DDSCL_NORMAL ); - GDBG_INFO(80, "%s: Set cooperative level!\n", FN_NAME); - IDirectDraw2_Release( lpDD ); - GDBG_INFO(80, "%s: Released lpDD!\n", FN_NAME); - - if ( lpDD1 ) { - IDirectDraw_Release( lpDD1 ); - GDBG_INFO(80, "%s: Released lpDD1!\n", FN_NAME); - } - } - lpDD = NULL; - lpDD1 = NULL; - - return; -#undef FN_NAME -} /* resetVideo */ - -typedef struct WidthHeight_s { - FxU32 width; - FxU32 height; -} WidthHeight_t; - -static WidthHeight_t widthHeightByResolution[] = { - {320, 200}, /* GR_RESOLUTION_320x200 */ - {320, 240}, /* GR_RESOLUTION_320x240 */ - {400, 256}, /* GR_RESOLUTION_400x256 */ - {512, 384}, /* GR_RESOLUTION_512x384 */ - {640, 200}, /* GR_RESOLUTION_640x200 */ - {640, 350}, /* GR_RESOLUTION_640x350 */ - {640, 400}, /* GR_RESOLUTION_640x400 */ - {640, 480}, /* GR_RESOLUTION_640x480 */ - {800, 600}, /* GR_RESOLUTION_800x600 */ - {960, 720}, /* GR_RESOLUTION_960x720 */ - {856, 480}, /* GR_RESOLUTION_856x480 */ - {512, 256}, /* GR_RESOLUTION_512x256 */ - {1024, 768}, /* GR_RESOLUTION_1024x768 */ - {1280, 1024}, /* GR_RESOLUTION_1280x1024 */ - {1600, 1200}, /* GR_RESOLUTION_1600x1200 */ - {400, 300}, /* GR_RESOLUTION_400x300 */ - {1152, 864}, /* GR_RESOLUTION_1152x864 */ - {1280, 960}, /* GR_RESOLUTION_1280x960 */ - {1600, 1024}, /* GR_RESOLUTION_1600x1024 */ - {1792, 1344}, /* GR_RESOLUTION_1792x1344 */ - {1856, 1392}, /* GR_RESOLUTION_1856x1392 */ - {1920, 1440}, /* GR_RESOLUTION_1920x1440 */ - {2048, 1536}, /* GR_RESOLUTION_2048x1536 */ - {2048, 2048} /* GR_RESOLUTION_2048x2048 */ -}; - -static char *resNames[] = { - "GR_RESOLUTION_320x200", - "GR_RESOLUTION_320x240", - "GR_RESOLUTION_400x256", - "GR_RESOLUTION_512x384", - "GR_RESOLUTION_640x200", - "GR_RESOLUTION_640x350", - "GR_RESOLUTION_640x400", - "GR_RESOLUTION_640x480", - "GR_RESOLUTION_800x600", - "GR_RESOLUTION_960x720", - "GR_RESOLUTION_856x480", - "GR_RESOLUTION_512x256", - "GR_RESOLUTION_1024x768", - "GR_RESOLUTION_1280x1024", - "GR_RESOLUTION_1600x1200", - "GR_RESOLUTION_400x300", - "GR_RESOLUTION_1152x864", - "GR_RESOLUTION_1280x960", - "GR_RESOLUTION_1600x1024", - "GR_RESOLUTION_1792x1344", - "GR_RESOLUTION_1856x1392", - "GR_RESOLUTION_1920x1440", - "GR_RESOLUTION_2048x1536", - "GR_RESOLUTION_2048x2048" -}; - - -static HRESULT WINAPI -checkResEMCallback(LPDDSURFACEDESC surfaceDesc, LPVOID lpContext) -{ -#define FN_NAME "checkResEMCallback" - FxBool *resList = (FxBool *) lpContext; - int res; - - GDBG_INFO(80, FN_NAME ":\n"); - GDBG_INFO(80, FN_NAME "\tsurfaceDesc->dwWidth == %d\n",surfaceDesc->dwWidth); - GDBG_INFO(80, FN_NAME - "\tsurfaceDesc->dwHeight == %d\n",surfaceDesc->dwHeight); - GDBG_INFO(80, FN_NAME - "\tsurfaceDesc->dwRefreshRate == %d\n",surfaceDesc->dwRefreshRate); - GDBG_INFO(80, FN_NAME - "\tsurfaceDesc->ddpfPixelFormat.dwRGBBitCount == %d\n", - surfaceDesc->ddpfPixelFormat.dwRGBBitCount); - - for ( - res = 0x0; - res < (sizeof(widthHeightByResolution) / sizeof(WidthHeight_t)); - res++) { - if ( - (surfaceDesc->dwWidth == widthHeightByResolution[res].width) && - (surfaceDesc->dwHeight == widthHeightByResolution[res].height) - ) { - resList[res] = FXTRUE; - return DDENUMRET_OK; - } - } - - return DDENUMRET_OK; -#undef FN_NAME -} /* checkResEMCallback */ - - -/* -** checkResolution - check to see if a given resolution is available -** -** This routine may only be called once and IT MUST BE CALLED FROM -** hwcInit(). -** Any other useage will be very very bad, as it will mess with the -** app's DirectDraw context. -*/ -FxBool -checkResolutions(FxBool *supportedByResolution, void *hmon) -{ -#define FN_NAME "checkResolution" - LPGUID ddGuid = NULL; - HMODULE ddraw = NULL; - HRESULT hResult; - - hwndApp = GetActiveWindow(); - - if ( hwndApp == NULL ) { - GDBG_INFO( 80, "Couldn't get a valid window handle\n" ); - } - - ddGuid = NULL; - ddraw = GetModuleHandle( "ddraw.dll" ); - if ( ddraw ) { - LPDIRECTDRAWENUMERATEEXA ddEnumEx; - ddEnumEx = (void*)GetProcAddress( ddraw, "DirectDrawEnumerateExA" ); - if ( ddEnumEx ) { - DWORD data[2]; - data[0] = (DWORD)hmon; - data[1] = 0; - ddEnumEx( ddEnumCbEx, data, DDENUM_ATTACHEDSECONDARYDEVICES ); - if ( data[1] ) { - ddGuid = (LPGUID)data[1]; - } - } - } - - checkSpecialList(); - if (lpDD == NULL) { - /* only create directdraw object once */ - if ( DirectDrawCreate( ddGuid, &lpDD1, NULL ) != DD_OK) { - GDBG_INFO(80, "DDraw Obj Create Failed!\n"); - } - else GDBG_INFO(80, "DDraw Obj created!\n"); - if ( IDirectDraw_QueryInterface( lpDD1, &IID_IDirectDraw2, - (LPVOID*)&lpDD ) != DD_OK ) { - IDirectDraw_Release( lpDD1 ); - lpDD1 = NULL; - lpDD = NULL; - GDBG_INFO(80, "DDraw Obj Create Failed!\n"); - return FXFALSE; - } - else GDBG_INFO(80, "DDraw2 Obj created!\n"); - } - - hResult = IDirectDraw2_EnumDisplayModes(lpDD, 0, NULL, - (LPVOID) supportedByResolution, - checkResEMCallback); - - resetVideo(); - return FXTRUE; -#undef FN_NAME -} /* checkResolutions */ diff --git a/glide2x/makefile.linux b/glide2x/makefile.linux deleted file mode 100644 index ccb3b16..0000000 --- a/glide2x/makefile.linux +++ /dev/null @@ -1,62 +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$ -# - -export TOPDIR := $(shell pwd) - -THISDIR = devel -SUBDIRS = swlibs - -# We branched glide starting w/ Voodoo2(aka CVG) so -# make sure that the right thing happens. If this sort -# of branching happens again then add it to the list below. -ifeq ($(FX_GLIDE_HW),sst1) - SUBDIRS += sst1 -else - ifeq ($(FX_GLIDE_HW),sst96) - SUBDIRS += sst1 - else - ifeq ($(FX_GLIDE_HW),cvg) - SUBDIRS += cvg - else - ifeq ($(FX_GLIDE_HW),h3) - SUBDIRS += h3 - else - FX_GLIDE_HW = h3 - SUBDIRS += h3 - endif - endif - endif -endif - -# -# Other variables we need to set -# -export FX_HW_PROJECTS=glide -ifeq ($(HAL_HW),) - export HAL_HW=1 -endif -export FX_NO_GET_BOF=1 -export FX_GLIDE_HW -export SCRIPTDIR=$(TOPDIR)/swlibs/include/make - -include swlibs/include/make/3dfx.linux.mak diff --git a/glide2x/sst1/bin/makefile.linux b/glide2x/sst1/bin/makefile.linux deleted file mode 100644 index 360d40d..0000000 --- a/glide2x/sst1/bin/makefile.linux +++ /dev/null @@ -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 diff --git a/glide2x/sst1/bin/makefile.unix b/glide2x/sst1/bin/makefile.unix deleted file mode 100644 index 1007a59..0000000 --- a/glide2x/sst1/bin/makefile.unix +++ /dev/null @@ -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 makefile%,,$(wildcard *)) - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak diff --git a/glide2x/sst1/binsrc/makefile.linux b/glide2x/sst1/binsrc/makefile.linux deleted file mode 100644 index 7316f8b..0000000 --- a/glide2x/sst1/binsrc/makefile.linux +++ /dev/null @@ -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$ -# - - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak - diff --git a/glide2x/sst1/binsrc/makefile.unix b/glide2x/sst1/binsrc/makefile.unix deleted file mode 100644 index 7316f8b..0000000 --- a/glide2x/sst1/binsrc/makefile.unix +++ /dev/null @@ -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$ -# - - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak - diff --git a/glide2x/sst1/cmd/makefile.linux b/glide2x/sst1/cmd/makefile.linux deleted file mode 100644 index 84a17c5..0000000 --- a/glide2x/sst1/cmd/makefile.linux +++ /dev/null @@ -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 diff --git a/glide2x/sst1/cmd/makefile.unix b/glide2x/sst1/cmd/makefile.unix deleted file mode 100644 index 84a17c5..0000000 --- a/glide2x/sst1/cmd/makefile.unix +++ /dev/null @@ -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 diff --git a/glide2x/sst1/cmd/pass/makefile.linux b/glide2x/sst1/cmd/pass/makefile.linux deleted file mode 100644 index 82d583c..0000000 --- a/glide2x/sst1/cmd/pass/makefile.linux +++ /dev/null @@ -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_HW)/include - -# sources -CFILES = pass.c -LLDLIBS = -L$(BUILD_ROOT_HW)/lib -linit -lsst1 \ - -L$(BUILD_ROOT_SWLIBS)/lib -lfxmisc -lfxpci - - -# targets -PROGRAM = pass -INSTALL_DESTINATION = $(BUILD_ROOT_HW) - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak - diff --git a/glide2x/sst1/cmd/pass/makefile.unix b/glide2x/sst1/cmd/pass/makefile.unix deleted file mode 100644 index e787ba3..0000000 --- a/glide2x/sst1/cmd/pass/makefile.unix +++ /dev/null @@ -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_SST1)/include - -# sources -CFILES = pass.c -LLDLIBS = -L$(BUILD_ROOT_SST1)/lib -linit -lsst1 \ - -L$(BUILD_ROOT_SWLIBS)/lib -lfxmisc -lfxpci - - -# targets -PROGRAM = pass -INSTALL_DESTINATION = $(BUILD_ROOT_SST1) - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak - diff --git a/glide2x/sst1/cmd/pass/pass.c b/glide2x/sst1/cmd/pass/pass.c deleted file mode 100644 index fcd9fcd..0000000 --- a/glide2x/sst1/cmd/pass/pass.c +++ /dev/null @@ -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 -#include - -#include <3dfx.h> -#include -#include - -/* 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; -} diff --git a/glide2x/sst1/glide/makefile.linux b/glide2x/sst1/glide/makefile.linux deleted file mode 100644 index a00e768..0000000 --- a/glide2x/sst1/glide/makefile.linux +++ /dev/null @@ -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 = src tests - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak diff --git a/glide2x/sst1/glide/makefile.unix b/glide2x/sst1/glide/makefile.unix deleted file mode 100644 index a00e768..0000000 --- a/glide2x/sst1/glide/makefile.unix +++ /dev/null @@ -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 = src tests - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak diff --git a/glide2x/sst1/glide/src/banner.inc b/glide2x/sst1/glide/src/banner.inc deleted file mode 100644 index 4401d19..0000000 --- a/glide2x/sst1/glide/src/banner.inc +++ /dev/null @@ -1,122 +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 - */ - - -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 diff --git a/glide2x/sst1/glide/src/cpudetect.c b/glide2x/sst1/glide/src/cpudetect.c deleted file mode 100644 index a125f1c..0000000 --- a/glide2x/sst1/glide/src/cpudetect.c +++ /dev/null @@ -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 - */ - -#include -#include - -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"); -} - diff --git a/glide2x/sst1/glide/src/cpudtect.S b/glide2x/sst1/glide/src/cpudtect.S deleted file mode 100644 index cb18e25..0000000 --- a/glide2x/sst1/glide/src/cpudtect.S +++ /dev/null @@ -1,130 +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:48:51 joseph -# Initial checkin into SourceForge. -# -# -# 2 3/04/97 9:10p Dow -# Neutered mutiplatform multiheaded monster. -# -# - -# This used to be cpudtect.s but I renamed it as a quick way to make it work -# with the shared 3dfx.mak - -.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 - - diff --git a/glide2x/sst1/glide/src/cpudtect.asm b/glide2x/sst1/glide/src/cpudtect.asm deleted file mode 100644 index 771ef02..0000000 --- a/glide2x/sst1/glide/src/cpudtect.asm +++ /dev/null @@ -1,160 +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$ -; -; 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 \ No newline at end of file diff --git a/glide2x/sst1/glide/src/ddgump.c b/glide2x/sst1/glide/src/ddgump.c deleted file mode 100644 index 2caee27..0000000 --- a/glide2x/sst1/glide/src/ddgump.c +++ /dev/null @@ -1,604 +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$ - * - * 2 3/04/97 9:08p Dow - * Neutered multiplatform multiheaded monster - * - * 1 12/23/96 1:39p Dow - * Changes for multiplatform -** -*/ - -/* Implements multipass drawing */ - -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" -#include "gump.h" - -extern GrMPState _gumpState; - -/* CHD BUG this belongs in fxglide.h */ -void FX_CSTYLE -_gumpTexCombineFunction( int virtual_tmu ); - -/* -** _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 )) -{ - FxU32 texmode; - GrMPTextureCombineFnc_t tc; - - GR_BEGIN("_gumpTexCombineFunction",99,4+2*PACKER_WORKAROUND_SIZE); - 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; - } - PACKER_WORKAROUND; - GR_SET( SST_TMU(hw,0)->textureMode , texmode ); - PACKER_WORKAROUND; - GR_END_SLOPPY(); -} /* _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; - FxU32 fogmode, fogmode_orig; - - 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 ); - - GR_SET_EXPECTED_SIZE(16); - /* 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); - - GR_SET( hw->alphaMode, alphamode ); - - /* if depth buffering, set to z= mode and disable writes */ - - if ( gc->state.fbi_config.fbzMode & SST_ENDEPTHBUFFER ) - { - fbzmode = fbzmode_orig = gc->state.fbi_config.fbzMode; - - fbzmode &= ~(SST_ZAWRMASK | SST_ZFUNC); - fbzmode |= GR_CMP_EQUAL; - - GR_SET( hw->fbzMode, fbzmode ); - } - - /* disable (fogta * fogColor) bias */ - /* xxx setting ADD_FOG with fog disabled is harmless */ - if ( gc->state.fbi_config.fogMode & SST_ENFOGGING ) { - fogmode = fogmode_orig = gc->state.fbi_config.fogMode; - fogmode |= SST_FOGADD; - GR_SET( hw->fogMode, fogmode ); - } - - /* 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); - GR_SET( hw->fbzColorPath, fbzcolorpath ); - GR_CHECK_SIZE_SLOPPY(); - - /* render other pass */ - grDrawTriangle( a, b, c ); - - /* restore */ - GR_SET_EXPECTED_SIZE(16); - - /* restore alpha blending state */ - GR_SET( hw->alphaMode, alphamode_orig ); - - /* restore depth buffer state */ - if ( gc->state.fbi_config.fbzMode & SST_ENDEPTHBUFFER ) { - GR_SET( hw->fbzMode, fbzmode_orig ); - } - - /* restore fog state */ - if ( gc->state.fbi_config.fogMode & SST_ENFOGGING ) { - GR_SET( hw->fogMode, fogmode_orig ); - } - - /* restore ccu/acu state */ - GR_SET( hw->fbzColorPath, fbzcolorpath_orig ); - - 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; - FxU32 fogmode, fogmode_orig; - - 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 */ - GR_SET_EXPECTED_SIZE(8); - - /* disable (fogta * fogColor) bias */ - /* xxx setting ADD_FOG with fog disabled is harmless */ - - if ( gc->state.fbi_config.fogMode & SST_ENFOGGING ) { - fogmode = fogmode_orig = gc->state.fbi_config.fogMode; - fogmode |= SST_FOGADD; - GR_SET( hw->fogMode, fogmode ); - } - - /* 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); - GR_SET( hw->fbzColorPath, fbzcolorpath ); - GR_CHECK_SIZE_SLOPPY(); - - /* 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 ); - GR_SET_EXPECTED_SIZE(16); - - /* 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); - - GR_SET( hw->alphaMode, alphamode ); - - /* if depth buffering, set to z= mode and disable writes */ - if ( gc->state.fbi_config.fbzMode & SST_ENDEPTHBUFFER ) - { - fbzmode = fbzmode_orig = gc->state.fbi_config.fbzMode; - fbzmode &= ~(SST_ZAWRMASK | SST_ZFUNC); - fbzmode |= GR_CMP_EQUAL; - GR_SET( hw->fbzMode, fbzmode ); - } - - /* disable fog */ - if ( gc->state.fbi_config.fogMode & SST_ENFOGGING ) { - GR_SET( hw->fogMode, 0 ); - } - - /* 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; - GR_SET( hw->fbzColorPath, fbzcolorpath ); - GR_CHECK_SIZE_SLOPPY(); - - /* render second pass */ - grDrawTriangle( a, b, c ); - - /* if bias, third pass */ - if ( ( gc->state.fbi_config.fogMode & SST_ENFOGGING ) - /* xxxXXXxxx it isn't very easy to check following any more! - || - gc->state.cc_fnc == GR_COLORCOMBINE_TEXTURE_TIMES_ITRGB_ADD_ITALPHA || - gc->state.cc_fnc == GR_COLORCOMBINE_TEXTURE_TIMES_ITALPHA_ADD_ITRGB || - gc->state.cc_fnc == GR_COLORCOMBINE_TEXTURE_ADD_ITRGB || - gc->state.cc_fnc == GR_COLORCOMBINE_TEXTURE_SUB_ITRGB || - gc->state.cc_fnc == GR_COLORCOMBINE_CCRGB_BLEND_ITRGB_ON_TEXALPHA || - gc->state.cc_fnc == GR_COLORCOMBINE_DIFF_SPEC_A || - gc->state.cc_fnc == GR_COLORCOMBINE_DIFF_SPEC_B */ ) - { - /* enable alpha blend to add to destination buffers */ - GR_SET_EXPECTED_SIZE(8); - - 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); - - GR_SET( hw->alphaMode, alphamode ); - - /* disable fog factor, leave fog bias enabled */ - /* xxx setting ADD_MULT with fog disabled is harmless */ - if ( gc->state.fbi_config.fogMode & SST_ENFOGGING ) { - fogmode = fogmode_orig; - fogmode |= SST_FOGMULT; - GR_SET( hw->fogMode, fogmode ); - } - - /* disable factor in color combine, enable bias */ - /* this can change the parameters output */ - - fbzcolorpath = fbzcolorpath_orig; - fbzcolorpath &= ~( SST_ENTEXTUREMAP | - 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 ); - -#if 0 - /* xxx the following doesn't work anymore! */ - - switch ( gc->state.cc_fnc ) - { - case GR_COLORCOMBINE_TEXTURE_TIMES_ITRGB_ADD_ITALPHA: - fbzcolorpath |= SST_CC_ADD_ALOCAL | SST_CC_ZERO_OTHER; - break; - - /* unimplemented in Glide */ - case GR_COLORCOMBINE_TEXTURE_TIMES_ITALPHA_ADD_ITRGB: - fbzcolorpath |= SST_CC_ADD_CLOCAL | SST_CC_ZERO_OTHER; - break; - - case GR_COLORCOMBINE_TEXTURE_ADD_ITRGB: - fbzcolorpath |= SST_CC_ADD_CLOCAL | SST_CC_ZERO_OTHER; - break; - - case GR_COLORCOMBINE_TEXTURE_SUB_ITRGB: - /* Can't do this on SST1, can't subtract in alpha blender */ - GrErrorCallback( "guDrawTriangleM: GR_COLORCOMBINE_TEXTURE_SUB_ITRGB does not work with GR_MPTEXTURECOMBINE_MULTIPLY.", FXFALSE ); - fbzcolorpath |= SST_CC_ZERO_OTHER; - break; - - case GR_COLORCOMBINE_CCRGB_BLEND_ITRGB_ON_TEXALPHA: - fbzcolorpath |= SST_CC_ZERO_OTHER; - break; - - case GR_COLORCOMBINE_DIFF_SPEC_A: - fbzcolorpath |= SST_CC_ADD_CLOCAL; - break; - - case GR_COLORCOMBINE_DIFF_SPEC_B: - fbzcolorpath |= SST_CC_ADD_ALOCAL; - break; - } -#endif - GR_CHECK_SIZE_SLOPPY(); - - /* render third pass */ - grDrawTriangle( a, b, c ); - } - - GR_SET_EXPECTED_SIZE(16); - - /* restore alpha blending state */ - GR_SET( hw->alphaMode, alphamode_orig ); - - /* restore depth buffer state */ - if ( gc->state.fbi_config.fbzMode & SST_ENDEPTHBUFFER ) { - GR_SET( hw->fbzMode, fbzmode_orig ); - } - - /* restore fog state */ - if ( gc->state.fbi_config.fogMode & SST_ENFOGGING ) { - GR_SET( hw->fogMode, fogmode_orig ); - } - - /* restore ccu/acu state */ - GR_SET( hw->fbzColorPath, fbzcolorpath_orig ); - - 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_SLOPPY(); -} diff --git a/glide2x/sst1/glide/src/diglide.c b/glide2x/sst1/glide/src/diglide.c deleted file mode 100644 index e0a3171..0000000 --- a/glide2x/sst1/glide/src/diglide.c +++ /dev/null @@ -1,346 +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 6/18/97 5:54p Dow - * P6 adjustments - * - * 9 3/13/97 2:51a Jdt - * Removed splash from grGlideInit(). - * - * 8 3/09/97 10:31a Dow - * Added GR_DIENTRY for di glide functions - * - * 7 2/12/97 2:09p Hanson - * Hopefully removed the rest of my muckage. - * - * 6 2/12/97 11:25a Hanson - * - * 5 1/18/97 11:38p Dow - * Removed _curGCFuncs Global (moved into _GlideRoot) - * - * 4 1/16/97 3:37p Dow - * Added _curGCFuncs global - * - * 3 1/14/97 10:44a Dow - * Modified grGlideInit to only call sstopen if splash screen is going to - * happen && HW != SST96 - * - * 2 1/09/97 10:50a Dow - * disabled splash screen for sst-96 - * - * 1 12/23/96 1:39p Dow - * Changes for multiplatform - * - * 32 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. - * - * 31 11/18/96 1:37a Tarolli - * fixed grAlphaBlendFunction warning bug - * - * 29 11/15/96 3:40p Jdt - * Fixed SST-96 build. - * - * 28 11/15/96 3:24p Tarolli - * renamed version.h to rcver.h , added some alpha blend function - * checking -** -*/ - -#include -#include <3dfx.h> -#include - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -#if ( GLIDE_PLATFORM & GLIDE_HW_SST96 ) -#include -#endif - -#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: fifo spins: %7d\n", - _GlideRoot.stats.fifoSpins); - 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); -#ifdef GLIDE_DEBUG - /* these stats are only kept in debugging mode */ - gdbg_info(80," Min PCI FIFO free: 0x%04x (%d)\n", - _GlideRoot.stats.minPciFIFOFree, _GlideRoot.stats.minPciFIFOFree ); - gdbg_info(80," Min Memory FIFO free: 0x%04x (%d)\n", - _GlideRoot.stats.minMemFIFOFree, _GlideRoot.stats.minMemFIFOFree); -#endif -} -/* -** 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 ) -{ - GR_DCL_GC; - gc->state.fifoFree = ((grSstStatus() >> SST_MEMFIFOLEVEL_SHIFT) & 0xffff)<<2; - gc->state.fifoFree -= gc->hwDep.sst1Dep.swFifoLWM + n; -} - -FxI32 GR_CDECL -_grSpinFifo( FxI32 n ) -{ - GR_DCL_GC; - do { - _GlideRoot.stats.fifoSpins++; - _grReCacheFifo( n ); - } while (gc->state.fifoFree < 0); - return gc->state.fifoFree; -} - -/*--------------------------------------------------------------------------- -** No Comment -*/ -#ifdef GLIDE_DEBUG -FxBool -_grCanSupportDepthBuffer( void ) -{ - GR_DCL_GC; - if ( gc->state.screen_height == 640 ) { - if ( gc->fbuf_size == 1 ) { - return FXFALSE; - } - } else if ( gc->state.screen_width == 800 ) { - if ( ( gc->fbuf_size == 1 ) || - ( gc->fbuf_size == 2 ) ) { - return FXFALSE; - } - } - return FXTRUE; -} /* _grCanSupportDepthBuffer */ -#endif - -/*--------------------------------------------------------------------------- -** -*/ -void -_grSwizzleColor( GrColor_t *color ) -{ - GR_DCL_GC; - unsigned long red, green, blue, alpha; - - switch( gc->state.color_format ) { - case GR_COLORFORMAT_ARGB: - break; - case GR_COLORFORMAT_ABGR: - blue = *color & 0x00ff; - red = ( *color >> 16 ) & 0xff; - *color &= 0xff00ff00; - *color |= ( blue << 16 ); - *color |= red; - break; - case GR_COLORFORMAT_RGBA: - red = ( *color & 0x0000ff00 ) >> 8; - green = ( *color & 0x00ff0000 ) >> 16; - blue = ( *color & 0xff000000 ) >> 24; - alpha = ( *color & 0x000000ff ); - *color = ( alpha << 24 ) | ( blue << 16 ) | ( green << 8 ) | red; - break; - case GR_COLORFORMAT_BGRA: - red = ( *color & 0xff000000 ) >> 24; - green = ( *color & 0x00ff0000 ) >> 16; - blue = ( *color & 0x0000ff00 ) >> 8; - alpha = ( *color & 0x000000ff ); - *color = ( alpha << 24 ) | ( blue << 16 ) | ( green << 8 ) | red; - 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 */ - -/*--------------------------------------------------------------------------- -** grHints -*/ -GR_DIENTRY(grHints, void, (GrHint_t hintType, FxU32 hints)) -{ - extern void GR_CDECL single_precision_asm(void); - extern void GR_CDECL double_precision_asm(void); - 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: - if (hints) { - gc->state.checkFifo = FXTRUE; - /* swFifoLWM is kept internally in bytes, hints are in fifo - entries */ - if (_GlideRoot.environment.swFifoLWM >= 0) - gc->hwDep.sst1Dep.swFifoLWM = - _GlideRoot.environment.swFifoLWM << 2; - else - gc->hwDep.sst1Dep.swFifoLWM = (hints & 0xffff) << 2; - - } else - gc->state.checkFifo = FXFALSE; - break; - case GR_HINT_FPUPRECISION: - hints ? double_precision_asm() : single_precision_asm(); - break; - case GR_HINT_ALLOW_MIPMAP_DITHER: - gc->state.allowLODdither = hints; - break; - default: - GR_CHECK_F( myName, 1, "invalid hints type" ); - } - GR_END(); -} /* grHints */ - -/*--------------------------------------------------------------------------- -** grGlideInit -*/ -GR_DIENTRY(grGlideInit, void, ( void )) -{ - GDBG_INIT(); - - GDBG_INFO((80,"grGlideInit()\n")); - _GlideInitEnvironment(); /* the main init code */ - FXUNUSED(*glideIdent); - - 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.fifoSpins = 0; - _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 ) -{ -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) - GR_DCL_GC; - GDBG_INFO((125,"\t\t\t\t%d writes since last fence\n", - gc->hwDep.sst96Dep.writesSinceFence)); -#endif - GDBG_INFO((125,"\t\t\t\t\t\t\tFENCE\n")); - - P6FENCE; -} diff --git a/glide2x/sst1/glide/src/digutex.c b/glide2x/sst1/glide/src/digutex.c deleted file mode 100644 index f283685..0000000 --- a/glide2x/sst1/glide/src/digutex.c +++ /dev/null @@ -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$ - * - * 5 8/14/97 7:02p Pgj - * per GMT - * - * 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 -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include -#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].format == GR_TEXFMT_AYIQ_8422) { - 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 )) -{ - GR_BEGIN_NOFIFOCHECK("guTexGetCurrentMipMap",99); - GDBG_INFO_MORE((gc->myLevel,"(%d)\n",tmu)); - GR_CHECK_TMU( myName, tmu ); - - GR_RETURN(gc->state.current_mm[tmu]); -} /* 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 )) -{ - GR_BEGIN_NOFIFOCHECK("guTexMemQueryAvail",99); - GDBG_INFO_MORE((gc->myLevel,"(%d)\n",tmu)); - GR_CHECK_TMU( myName, tmu ); - GR_RETURN(gc->tmu_state[tmu].total_mem - gc->tmu_state[tmu].freemem_base); -} /* 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 */ - diff --git a/glide2x/sst1/glide/src/disst.c b/glide2x/sst1/glide/src/disst.c deleted file mode 100644 index 1f4053e..0000000 --- a/glide2x/sst1/glide/src/disst.c +++ /dev/null @@ -1,167 +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$ - * - * 9 8/13/97 8:51a Pgj - * Fix Bug 710 - * - * 8 7/24/97 10:55a Dow - * Fixed bogus check in grSstQueryHardware - * - * 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 - * Neutered multiplatform multiheaded monster - * - * 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 -#include -#include <3dfx.h> - -#include -#include - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - - -/*--------------------------------------------------------------------------- -** grSstQueryBoards -** -** NOTE: it is OK to call this routine before grGlideInit -*/ -GR_DIENTRY(grSstQueryBoards, FxBool, ( GrHwConfiguration *hwc )) -{ - GDBG_INFO((80,"grSstQueryBoards(0x%x)\n",hwc)); - - hwc->num_sst = initNumBoardsInSystem(); - return FXTRUE; -} /* grSstQueryBoards */ - -/*--------------------------------------------------------------------------- -** grSstQueryHardware -** -*/ -GR_DIENTRY(grSstQueryHardware, FxBool, ( GrHwConfiguration *hwc )) -{ - FxBool retVal; - - GDBG_INFO((80, "grSstQueryHardware\n")); - GDBG_INFO_MORE((80,"(0x%x)\n",hwc)); - - /* init and copy the data back to the user's structure */ - retVal = _GlideRoot.hwConfig.num_sst > 0; - *hwc = _GlideRoot.hwConfig; - - return(retVal); -} /* grSstQueryHardware */ - -/*--------------------------------------------------------------------------- -** grSstSelect -*/ -GR_DIENTRY(grSstSelect, void, ( int which )) -{ - if ( which >= _GlideRoot.hwConfig.num_sst ) - GrErrorCallback( "grSstSelect: non-existent SST", FXTRUE ); - - _GlideRoot.current_sst = which; - _GlideRoot.curGC = &_GlideRoot.GCs[which]; -#ifdef GLIDE_MULTIPLATFORM - _GlideRoot.curGCFuncs = _GlideRoot.curGC->gcFuncs; -#endif - /* now begin a normal Glide routine's flow */ - { - GR_BEGIN_NOFIFOCHECK("grSstSelect",80); - GDBG_INFO_MORE((gc->myLevel,"(%d)\n",which)); - - _GlideRoot.packerFixAddress = ( FxU32 ) gc->tex_ptr; - _GlideRoot.packerFixAddress += ( ( ( FxU32 ) 3 ) << 21 ); - _GlideRoot.packerFixAddress += ( ( ( FxU32 ) 1 ) << 17 ); - - /* Now that we have selected a board, we can build the offests and register - lists for the optimized triangle setup code */ - _grRebuildDataList(); - - initDeviceSelect( which ); - - 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, sst1VideoTimingStruct *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: %d greater than MAX_NUM_SST (%d)\n", - whichSst, MAX_NUM_SST); - - GrErrorCallback(errStr, FXTRUE); - } -#endif - - _GlideRoot.GCs[whichSst].vidTimings = vidTimings; -} /* grSstVidMode */ - diff --git a/glide2x/sst1/glide/src/ditex.c b/glide2x/sst1/glide/src/ditex.c deleted file mode 100644 index f35484e..0000000 --- a/glide2x/sst1/glide/src/ditex.c +++ /dev/null @@ -1,642 +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 8/19/97 5:02p Atai - * delete the hack for 4MB texture memory - * - * 10 8/14/97 6:45p Pgj - * Fixed bug per GMT - * - * 9 8/11/97 3:56p Atai - * fixed error message - * - * 8 8/11/97 1:39p Atai - * step 1: use environment variable to set up texture memory size - * - * 7 7/18/97 6:46p Jdt - * Protected access to vgInfo structure - * - * 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 -#include <3dfx.h> - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -FxU32 _gr_aspect_index_table[] = -{ - 3, - 2, - 1, - 0, - 1, - 2, - 3, -}; - -/* size in texels */ -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 */ -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 -}; - -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] */ -unsigned long _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] */ -unsigned long _grMipMapOffset[4][16]; -unsigned long _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 */ - -/*--------------------------------------------------------------------------- -** -*/ -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" ); - - if ( aspect > GR_ASPECT_1x1 ) /* mirror aspect ratios */ - 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) ? 1 : 0; - 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; - - if ( aspect > GR_ASPECT_1x1 ) /* mirror aspect ratios */ - 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 )) -{ - FxU32 memrequired; - - 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 )) -{ - 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( myName, 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(); -} /* grTexDetailControl */ - -GR_DIENTRY(grTexMinAddress, FxU32, ( GrChipID_t tmu )) -{ - GR_BEGIN_NOFIFOCHECK("grTexMinAddress",88); - GDBG_INFO_MORE((gc->myLevel,"(%d)\n",tmu)); - GR_CHECK_TMU(myName,tmu); - FXUNUSED( tmu ); - GR_RETURN(0); -} /* 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 )) -{ - GR_BEGIN_NOFIFOCHECK("grTexMaxAddress",88); - GDBG_INFO_MORE((gc->myLevel,"(%d)\n",tmu)); - GR_CHECK_TMU( myName, tmu ); - GR_RETURN(gc->tmu_state[tmu].total_mem-8); -} /* 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_F( "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)) - 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 )) -{ - 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(myName,tmu); - GR_CHECK_F(myName, type > 0x2, "invalid table specified"); - GR_CHECK_F(myName, !data, "invalid data pointer"); -#if (GLIDE_PLATFORM & GLIDE_HW_SST1) - GR_CHECK_F(myName, _GlideRoot.hwConfig.SSTs[_GlideRoot.current_sst].sstBoard.VoodooConfig.tmuConfig[0].tmuRev < 1, - "Texelfx rev 0 does not support paletted textures"); -#endif - - 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 ); - } - GR_END(); -} /* 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)); - 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; - -#ifdef __WIN32__ -void rle_decode_line_asm(FxU16 *tlut,FxU8 *src,FxU16 *dest) -{ - /* don't do anything just shut up the compiler */ -} -#endif - -#ifdef __GNUC__ -void rle_decode_line_asm(FxU16 *tlut,FxU8 *src,FxU16 *dest) { -} -#endif - diff --git a/glide2x/sst1/glide/src/fxbldno.c b/glide2x/sst1/glide/src/fxbldno.c deleted file mode 100644 index c4e86bb..0000000 --- a/glide2x/sst1/glide/src/fxbldno.c +++ /dev/null @@ -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 -#include -#include - -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() */ diff --git a/glide2x/sst1/glide/src/fxgasm.c b/glide2x/sst1/glide/src/fxgasm.c deleted file mode 100644 index 1f4d895..0000000 --- a/glide2x/sst1/glide/src/fxgasm.c +++ /dev/null @@ -1,194 +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 - -#include <3dfx.h> -#include - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -/*---------------------------------------------------------------------- - * macros for creating assembler offset files - *----------------------------------------------------------------------*/ - -#ifndef __linux__ -#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\t= %08xh\n",pname,((int)&p.o)-(int)&p); \ - else printf("%s\t= %10d\n",pname,((int)&p.o)-(int)&p) - -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) -#define HWOFFSET(p, o, pname) if (hex) \ - printf("%s\t= %08xh\n",pname,(((int) &p.o)-(int)&p)>>2);\ - else printf("%s\t= %10d\n",pname,(((int)&p.o)-(int)&p)) -#endif /* (GLIDE_PLATFORM & GLIDE_HW_SST96) */ - -#define OFFSET2(p,o,pname) if (hex) \ - printf("%s\t= %08xh\n",pname,((int)&o)-(int)&p); \ - else printf("%s\t= %10d\n",pname,((int)&o)-(int)&p) - -#define SIZEOF(p,pname) if (hex) \ - printf("SIZEOF_%s\t= %08xh\n",pname,sizeof(p)); \ - else printf("SIZEOF_%s\t= %10d\n",pname,sizeof(p)) -#else -#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\t .EQU %08x\n",pname,((int)&p.o)-(int)&p); \ - else printf("%s\t .EQU %10d\n",pname,((int)&p.o)-(int)&p) - -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) -#define HWOFFSET(p, o, pname) if (hex) \ - printf("%s\t .EQU %08x\n",pname,(((int) &p.o)-(int)&p)>>2);\ - else printf("%s\t .EQU %10d\n",pname,(((int)&p.o)-(int)&p)) -#endif /* (GLIDE_PLATFORM & GLIDE_HW_SST96) */ - -#define OFFSET2(p,o,pname) if (hex) \ - printf("%s\t .EQU %08x\n",pname,((int)&o)-(int)&p); \ - else printf("%s\t .EQU %10d\n",pname,((int)&o)-(int)&p) - -#define SIZEOF(p,pname) if (hex) \ - printf("SIZEOF_%s\t .EQU %08x\n",pname,sizeof(p)); \ - else printf("SIZEOF_%s\t .EQU %10d\n",pname,sizeof(p)) -#endif - -int -main (int argc, char **argv) -{ - int hex=0; /* default is print in decimal */ - static Sstregs sst; - static struct _GlideRoot_s gr; - static GrGC gc; - static struct dataList_s dl; - - if (argc > 1) { - if (strcmp("-inline", argv[1]) == 0) { - Sstregs dummyRegs; - - printf("#ifndef __FX_INLINE_H__\n"); - printf("#define __FX_INLINE_H__\n"); - printf("\n"); - - printf("/* The # of 2-byte entries in the hw fog table */\n"); - printf("#define kInternalFogTableEntryCount 0x%XUL\n", - sizeof(dummyRegs.fogTable) >> 1); - - printf("\n"); - printf("#endif /* __FX_INLINE_H__ */\n"); - - return 0; - } - - hex = 1; - } - -#ifndef __linux__ - printf("SST_CHIP_MASK = 0%xh\n",SST_CHIP_MASK); -#else - printf("SST_CHIP_MASK .EQU 0x%x\n", SST_CHIP_MASK); -#endif - - HEADER ("SSTREGS"); -#if (GLIDE_PLATFORM & GLIDE_HW_SST1) - OFFSET (sst,FvA.x,"FVAX\t\t"); - OFFSET (sst,FvA.y,"FVAY\t\t"); - OFFSET (sst,FvB.x,"FVBX\t\t"); - OFFSET (sst,FvB.y,"FVBY\t\t"); - OFFSET (sst,FvC.x,"FVCX\t\t"); - OFFSET (sst,FvC.y,"FVCY\t\t"); - OFFSET (sst,FtriangleCMD,"FTRIANGLECMD\t"); -#elif (GLIDE_PLATFORM & GLIDE_HW_SST96) - HWOFFSET (sst,FvA.x,"FVAX\t\t"); - HWOFFSET (sst,FvA.y,"FVAY\t\t"); - HWOFFSET (sst,FvB.x,"FVBX\t\t"); - HWOFFSET (sst,FvB.y,"FVBY\t\t"); - HWOFFSET (sst,FvC.x,"FVCX\t\t"); - HWOFFSET (sst,FvC.y,"FVCY\t\t"); - HWOFFSET (sst,FtriangleCMD,"FTRIANGLECMD\t"); -#else -#error "Update fxgasm.c for this chip" -#endif - NEWLINE; -#ifdef GLIDE_USE_ALT_REGMAP - OFFSET2(sst.Fr_ALT,sst.Fdrdx_ALT,"FDPDX_OFFSET\t"); - OFFSET2(sst.Fr_ALT,sst.Fdrdy_ALT,"FDPDY_OFFSET\t"); -#else - OFFSET2(sst.Fr,sst.Fdrdx,"FDPDX_OFFSET\t"); - OFFSET2(sst.Fr,sst.Fdrdy,"FDPDY_OFFSET\t"); -#endif - 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,state.cull_mode,"cull_mode\t"); - OFFSET (gc,dataList,"dataList\t"); -#if (GLIDE_PLATFORM & GLIDE_HW_SST1) - OFFSET (gc,state.fifoFree, "fifoFree\t"); -#endif -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) - OFFSET (gc,hwDep.sst96Dep.writesSinceFence, "writesSinceFence" ); - OFFSET (gc,hwDep.sst96Dep.paramMask, "paramMask\t"); - OFFSET (gc,hwDep.sst96Dep.gwCommand, "gwCommand\t"); - OFFSET (gc,hwDep.sst96Dep.gwHeaders, "gwHeaders\t"); - OFFSET (gc,fifoData.hwDep.vg96FIFOData.fifoPtr, "fifoPtr\t\t"); - OFFSET (gc,fifoData.hwDep.vg96FIFOData.fifoSize, "fifoSize\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"); - SIZEOF (gr,"GlideRoot"); - NEWLINE; - - HEADER ("dataList"); - OFFSET (dl,i,"dl_i\t\t"); - OFFSET (dl,addr,"dl_addr\t\t"); - SIZEOF (dl,"dataList\t"); - NEWLINE; - - return 0; -} diff --git a/glide2x/sst1/glide/src/fxglide.h b/glide2x/sst1/glide/src/fxglide.h deleted file mode 100644 index 7886cbe..0000000 --- a/glide2x/sst1/glide/src/fxglide.h +++ /dev/null @@ -1,1406 +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$ -** -** 86 2/12/98 4:01p Atai -** change refresh rate if oemdll updated for tv out - * - * 85 12/19/97 11:04a Atai - * oeminit dll stuff - * - * 84 12/03/97 9:36a Dow - * Fixed bug in grSstIsBusy() - * - * 83 9/19/97 12:38p Peter - * asm rush trisetup vs alt fifo - * - * 82 9/11/97 9:31a Peter - * This is what happens when you don't listen to Chris - * - * 81 9/10/97 10:15p Peter - * fifo logic from GaryT - * - * 80 9/08/97 3:24p Peter - * fixed my fifo muckage - * - * 79 8/19/97 8:54p Peter - * lots of stuff, hopefully no muckage - * - * 78 8/01/97 11:48a Dow - * Made some macros use conventional FIFO accounting - * - * 77 7/10/97 1:36p Dow - * Modified Nudge of Love to work around likely hardware bug. - * - * 76 7/09/97 10:18a Dow - * Further Nudge Of Love adjustments - * - * 75 7/08/97 8:55p Dow - * Fixed muckage in the Nudge Of Love - * - * 74 7/08/97 1:29p Jdt - * Fixed watcom muckage - * - * 73 7/07/97 8:33a Jdt - * New tracing macros. - * - * 72 7/04/97 12:07p Dow - * Changed the DUMPGWH stuff, added const for triangle command packet - * - * 71 6/29/97 11:28p Jdt - * Added gwCommand - * - * 70 6/26/97 3:08p Dow - * New metrics for P6 stuff. - * - * 69 6/21/97 1:05p Dow - * Moved the Nudge of Love to a macro - * - * 68 6/20/97 5:50p Dow - * Changes for Chip Field - * - * 67 6/19/97 7:35p Dow - * More P6 Stuff - * - * 66 6/18/97 6:07p Dow - * Protected P6 Stuff - * - * 65 6/18/97 5:54p Dow - * P6 adjustments - * - * 64 6/16/97 12:45p Dow - * P6 Fixes - * - * 63 6/08/97 11:06p Pgj - * use Group Write for Texture Downloads - * - * 62 5/28/97 2:08p Dow - * Added checks for int10h when in debugging mode. - * - * 61 5/27/97 11:37p Pgj - * Fix for Bug report 545 - * - * 60 5/27/97 2:02p Dow - * Fixed up some macros--GR_CHECK_FOR_ROOM & a call to assert() - * - * 59 5/22/97 11:18a Dow - * Changed GR_ASSERT to fix stack muckage - * - * 58 5/19/97 7:35p Pgj - * Print cogent error message if h/w not found - * - * 57 5/15/97 12:20p Dow - * Fixed improper definition of GR_SET - * - * 56 5/04/97 12:47p Dow - * Added direct write macro fro grSstControl - * - * 55 5/02/97 2:07p Pgj - * screen_width/height now FxU32 - * - * 54 5/02/97 9:34a Dow - * Changed indentation of GrState to match the rest of file, modified - * GR_ASSERT - * - * 53 4/13/97 2:06p Pgj - * eliminate all anonymous unions (use hwDep) - * - * 52 3/24/97 2:00p Dow - * Fixed some chip field problems - * - * 51 3/21/97 12:42p Dow - * Made STWHints not send the Bend Over Baby Packet to FBI Jr. - * - * 50 3/19/97 10:43p Dow - * windowsInit stuff - * - * 49 3/19/97 1:37a Jdt - * Added fbStride to gc - * - * 48 3/18/97 9:08p Dow - * Added FX_GLIDE_NO_DITHER_SUB environment variable - * - * 47 3/17/97 6:25a Jdt - * Added open flag to gc - * - * 46 3/16/97 12:38a Jdt - * Shouldn't have removed fifoData, duh.. - * - * 45 3/16/97 12:19a Jdt - * Removed redundant data - * - * 44 3/13/97 2:51a Jdt - * Removed lockIdle flag - * - * 43 3/13/97 1:18a Jdt - * Added flag for sli lfb reads. - * - * 42 3/09/97 10:31a Dow - * Added GR_DIENTRY for di glide functions - * - * 41 3/04/97 9:11p Dow - * Neutered mutiplatform multiheaded monster. - * - * 40 2/26/97 2:18p Dow - * moved all debug set functions to __cdecl - * - * 39 2/26/97 11:54a Jdt - * Added glide buffer locking and fixed bug in GR_SET - * - * 38 2/19/97 4:42p Dow - * Fixed debug build for Watcom - * - * 37 2/14/97 12:55p Dow - * moved vg96 fifo wrap into init code - * - * 36 2/12/97 5:31p Dow - * Fixed my ^$%^^&*^%^ error. - * - * 35 2/12/97 2:09p Hanson - * Hopefully removed the rest of my muckage. - * - * 34 2/11/97 6:58p Dow - * Changes to support vid tiles and ser status - * - * 33 1/18/97 11:44p Dow - * Moved _curGCFuncs into _GlideRoot - * Added support for GMT's register debugging - * - * 32 1/16/97 3:41p Dow - * Embedded fn protos in ifndef FX_GLIDE_NO_FUNC_PROTO - * - * 31 12/23/96 1:37p Dow - * chagnes for multiplatform glide - * - * 30 11/14/96 1:04p Jdt - * Test for keywords -** -*/ - -/* -** fxglide.h -** -** Internal declarations for use inside Glide. -** -** GLIDE_LIB: Defined if building the Glide Library. This macro -** should ONLY be defined by a makefile intended to build -** GLIDE.LIB or glide.a. -** -** GLIDE_HARDWARE: Defined if GLIDE should use the actual SST hardware. An -** application is responsible for defining this macro. -** -** GLIDE_NUM_TMU: Number of physical TMUs installed. Valid values are 1 -** and 2. If this macro is not defined by the application -** it is automatically set to the value 2. -** -*/ - -#ifndef __FXGLIDE_H__ -#define __FXGLIDE_H__ - -/* -** ----------------------------------------------------------------------- -** INCLUDE FILES -** ----------------------------------------------------------------------- -*/ -#include -#include -#include <3dfx.h> -#include -#include -#include -#include - -#if GLIDE_MULTIPLATFORM -#include "gcfuncs.h" -#endif - -/* isolate this 'hack' here so as to make the code look cleaner */ -#ifdef __WATCOMC__ -#define GR_CDECL __cdecl -#else -#define GR_CDECL -#endif - -/*==========================================================================*/ -/* -** GrState -** -** If something changes in here, then go into glide.h, and look for a -** declaration of the following form: -** -** #define GLIDE_STATE_PAD_SIZE N -** #ifndef GLIDE_LIB -** typedef struct { -** char pad[GLIDE_STATE_PAD_SIZE]; -** } GrState; -** #endif -** -** Then change N to sizeof(GrState) AS DECLARED IN THIS FILE! -** -*/ - -struct _GrState_s -{ - GrCullMode_t /* these go in front for cache hits */ - cull_mode; /* cull neg, cull pos, don't cull */ - - GrHint_t - paramHints; /* Tells us if we need to pointcast a - parameter to a specific chip */ - FxI32 - fifoFree; /* # free entries in FIFO */ - FxU32 - paramIndex, /* Index into array containing - parameter indeces to be sent ot the - triangle setup code */ - tmuMask; /* Tells the paramIndex updater which - TMUs need values */ - struct{ - FxU32 fbzColorPath; - FxU32 fogMode; - FxU32 alphaMode; - FxU32 fbzMode; - FxU32 lfbMode; - FxU32 clipLeftRight; - FxU32 clipBottomTop; - - FxU32 fogColor; - FxU32 zaColor; - FxU32 chromaKey; - - FxU32 stipple; - FxU32 color0; - FxU32 color1; - } fbi_config; /* fbi register shadow */ - - struct { - FxU32 textureMode; - FxU32 tLOD; - FxU32 tDetail; - FxU32 texBaseAddr; - FxU32 texBaseAddr_1; - FxU32 texBaseAddr_2; - FxU32 texBaseAddr_3_8; - GrMipMapMode_t mmMode; /* saved to allow MM en/dis */ - GrLOD_t smallLod, largeLod; /* saved to allow MM en/dis */ - FxU32 evenOdd; - GrNCCTable_t nccTable; - } tmu_config[GLIDE_NUM_TMU]; /* tmu register shadow */ - - FxBool /* Values needed to determine which */ - ac_requires_it_alpha, /* parameters need gradients computed */ - ac_requires_texture, /* when drawing triangles */ - cc_requires_it_rgb, - cc_requires_texture, - cc_delta0mode, /* Use constants for flat shading */ - allowLODdither, /* allow LOD dithering */ - checkFifo; /* Check fifo status as specified by hints */ - - FxU16 - lfb_constant_depth; /* Constant value for depth buffer (LFBs) */ - GrAlpha_t - lfb_constant_alpha; /* Constant value for alpha buffer (LFBs) */ - - FxI32 - num_buffers; /* 2 or 3 */ - - GrColorFormat_t - color_format; /* ARGB, RGBA, etc. */ - - GrMipMapId_t - current_mm[GLIDE_NUM_TMU]; /* Which guTex** thing is the TMU set - up for? THIS NEEDS TO GO!!! */ - - float - clipwindowf_xmin, clipwindowf_ymin, /* Clipping info */ - clipwindowf_xmax, clipwindowf_ymax; - FxU32 - screen_width, screen_height; /* Screen width and height */ - float - a, r, g, b; /* Constant color values for Delta0 mode */ -}; - -typedef struct GrGC_s -{ - FxU32 - *base_ptr, /* base address of SST */ - *reg_ptr, /* pointer to base of SST registers */ - *tex_ptr, /* texture memory address */ - *lfb_ptr, /* linear frame buffer address */ - *slave_ptr; /* Scanline Interleave Slave address */ - -#if GLIDE_MULTIPLATFORM - GrGCFuncs - gcFuncs; -#endif - - void *oemInit; - - struct dataList_s { - int i; /* index into GrVertex struct for src data */ - float *addr; /* address of hardware register to write to */ - } dataList[20+12*GLIDE_NUM_TMU+3];/* add 3 for: - fbi-tmu0 trans - tmu0-tmu1 trans - tmu1-tmu2 trans - */ - GrState - state; /* state of Glide/SST */ - - FxBool - nopCMD; /* Have we placed a NOP in the FIFO ? */ - - InitFIFOData - fifoData; - - union hwDep_u { - struct sst96Dep_s { -#if (GLIDE_PLATFORM & GLIDE_OS_DOS32) - FxBool - int10Called; /* Did the app call int10h? */ - void (__interrupt __far *prevInt10)(); -#endif - FxU32 - writesSinceFence, /* Writes since last fence */ - writesSinceHeader, /* Grouped Writes since last header */ - paramMask, /* Mask indicating required parameters */ - gwCommand, /* Command for initiating a triangle gw packet */ - gwHeaders[4]; /* Group write headers for SST96 */ - FxU32 - *serialStatus, /* address of serial status register */ - *fifoApertureBase; /* base of fifo apurture (if different) */ - -#if 0 - *fifoPtr, /* pointer to FIFO */ - fifoSize, /* # bytes left in FIFO */ - *fifoVirt, /* start virtual address */ - fifoPhys, /* start physical address */ - fifoMax, /* in bytes */ - fifoCur, /* how much used up so far */ - fifoLfb; /* use LFB, use hostblt if 0. */ -#endif - } sst96Dep; - struct sst1Dep_s { - FxU32 - /* fifoFree, # Free entries in FIFO */ - swFifoLWM; /* fudge factor */ - } sst1Dep; - - } hwDep; - - FxU32 lockPtrs[2]; /* pointers to locked buffers */ - FxU32 fbStride; - - struct { - FxU32 freemem_base; - FxU32 total_mem; - FxU32 next_ncc_table; - GrMipMapId_t ncc_mmids[2]; - const GuNccTable *ncc_table[2]; - } tmu_state[GLIDE_NUM_TMU]; - - int - grSstRez, /* Video Resolution of board */ - grSstRefresh, /* Video Refresh of board */ - fbuf_size, /* in MB */ - num_tmu; /* number of TMUs attached */ - - FxBool - scanline_interleaved; - - struct { - GrMipMapInfo data[MAX_MIPMAPS_PER_SST]; - GrMipMapId_t free_mmid; - } mm_table; /* mip map table */ - - /* LFB Flags */ - FxU32 lfbSliOk; - - /* DEBUG and SANITY variables */ - FxI32 myLevel; /* debug level */ - FxI32 counter; /* counts bytes sent to HW */ - FxI32 expected_counter; /* the number of bytes expected to be sent */ - - sst1VideoTimingStruct /* init code overrides */ - *vidTimings; - - FxBool open; /* Has GC Been Opened? */ - FxBool closedP; /* Have we closed since an init call? (see grSstWinOpen) */ -} GrGC; - -/* NOTE: this changes the P6FENCE macro expansion from sst1init.h !!! */ -#define p6FenceVar _GlideRoot.p6Fencer - -/* if we are debugging, call a routine so we can trace fences */ -#ifdef GLIDE_DEBUG -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) -#define GR_P6FENCE {_grFence(); gc->hwDep.sst96Dep.writesSinceFence = 0;} -#else /* SST1 */ -#define GR_P6FENCE _grFence(); -#endif /* SST1 or SST96 */ -#else /* Not DEBUG */ -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) -#define GR_P6FENCE {P6FENCE; gc->hwDep.sst96Dep.writesSinceFence = 0;} -#else /* SST1 */ -#define GR_P6FENCE P6FENCE -#endif /* SST1 or SST96 */ -#endif /* DEBUG or not */ - -/* -** The root of all Glide data, all global data is in here -** stuff near the top is accessed a lot -*/ -struct _GlideRoot_s { - int p6Fencer; /* xchg to here to keep this in cache!!! */ - int current_sst; - FxU32 CPUType; - GrGC *curGC; /* point to the current GC */ - FxI32 curTriSize; /* the size in bytes of the current triangle */ - FxI32 curTriSizeNoGradient; /* special for _trisetup_nogradients */ - FxU32 packerFixAddress; /* address to write packer fix to */ - FxBool windowsInit; /* Is the Windows part of glide initialized? */ - -#if GLIDE_MULTIPLATFORM - GrGCFuncs - curGCFuncs; /* Current dd Function pointer table */ -#endif - int initialized; - - struct { /* constant pool (minimizes cache misses) */ - float f0; - float fHalf; - float f1; - float f255; - float f256; - float ftemp1, ftemp2; /* temps to convert floats to ints */ - } pool; - - struct { /* environment data */ - FxBool ignoreReopen; - FxBool triBoundsCheck; /* check triangle bounds */ - FxBool noSplash; /* don't draw it */ - FxBool shamelessPlug; /* translucent 3Dfx logo in lower right */ - FxU32 rsrchFlags; - FxI32 swapInterval; /* swapinterval override */ - FxI32 swFifoLWM; - FxU32 snapshot; /* register trace snapshot */ - FxBool disableDitherSub; /* Turn off dither subtraction? */ - } environment; - - struct { - FxU32 minMemFIFOFree; - FxU32 minPciFIFOFree; - - FxU32 fifoSpins; /* number of times we spun on fifo */ - - FxU32 bufferSwaps; /* number of buffer swaps */ - FxU32 pointsDrawn; - FxU32 linesDrawn; - FxU32 trisProcessed; - FxU32 trisDrawn; - - FxU32 texDownloads; /* number of texDownload calls */ - FxU32 texBytes; /* number of texture bytes downloaded */ - - FxU32 palDownloads; /* number of palette download calls */ - FxU32 palBytes; /* number of palette bytes downloaded */ - } stats; - - GrHwConfiguration hwConfig; - - GrGC GCs[MAX_NUM_SST]; /* one GC per board */ -}; - - -extern struct _GlideRoot_s GR_CDECL _GlideRoot; -#if GLIDE_MULTIPLATFORM -extern GrGCFuncs _curGCFuncs; -#endif -/*==========================================================================*/ -/* Macros for declaring functions */ -#define GR_DDFUNC(name, type, args) \ -type FX_CSTYLE name args - -#define GR_ENTRY(name, type, args) \ -FX_ENTRY type FX_CSTYLE name args - -#define GR_DIENTRY(name, type, args) \ -FX_ENTRY type FX_CSTYLE name args - -/*==========================================================================*/ - -#define STATE_REQUIRES_IT_DRGB FXBIT(0) -#define STATE_REQUIRES_IT_ALPHA FXBIT(1) -#define STATE_REQUIRES_OOZ FXBIT(2) -#define STATE_REQUIRES_OOW_FBI FXBIT(3) -#define STATE_REQUIRES_W_TMU0 FXBIT(4) -#define STATE_REQUIRES_ST_TMU0 FXBIT(5) -#define STATE_REQUIRES_W_TMU1 FXBIT(6) -#define STATE_REQUIRES_ST_TMU1 FXBIT(7) -#define STATE_REQUIRES_W_TMU2 FXBIT(8) -#define STATE_REQUIRES_ST_TMU2 FXBIT(9) - -#define GR_TMUMASK_TMU0 FXBIT(GR_TMU0) -#define GR_TMUMASK_TMU1 FXBIT(GR_TMU1) -#define GR_TMUMASK_TMU2 FXBIT(GR_TMU2) - -/* -** Parameter gradient offsets -** -** These are the offsets (in bytes)of the DPDX and DPDY registers from -** from the P register -*/ -#ifdef GLIDE_USE_ALT_REGMAP -#define DPDX_OFFSET 0x4 -#define DPDY_OFFSET 0x8 -#else -#define DPDX_OFFSET 0x20 -#define DPDY_OFFSET 0x40 -#endif - -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) /* Stuff for group write packet header */ - -#define GWH_VTX_AX_BIT FXBIT(0) -#define GWH_VTX_AY_BIT FXBIT(1) -#define GWH_VTX_BX_BIT FXBIT(2) -#define GWH_VTX_BY_BIT FXBIT(3) -#define GWH_VTX_CX_BIT FXBIT(4) -#define GWH_VTX_CY_BIT FXBIT(5) -#define GWH_FSTARTR_BIT FXBIT(6) -#define GWH_FDRDX_BIT FXBIT(7) -#define GWH_FDRDY_BIT FXBIT(8) -#define GWH_FSTARTG_BIT FXBIT(9) -#define GWH_FDGDX_BIT FXBIT(10) -#define GWH_FDGDY_BIT FXBIT(11) -#define GWH_FSTARTB_BIT FXBIT(12) -#define GWH_FDBDX_BIT FXBIT(13) -#define GWH_FDBDY_BIT FXBIT(14) -#define GWH_FSTARTZ_BIT FXBIT(15) -#define GWH_FDZDX_BIT FXBIT(16) -#define GWH_FDZDY_BIT FXBIT(17) -#define GWH_FSTARTA_BIT FXBIT(18) -#define GWH_FDADX_BIT FXBIT(19) -#define GWH_FDADY_BIT FXBIT(20) -#define GWH_FSTARTS_BIT FXBIT(21) -#define GWH_FDSDX_BIT FXBIT(22) -#define GWH_FDSDY_BIT FXBIT(23) -#define GWH_FSTARTT_BIT FXBIT(24) -#define GWH_FDTDX_BIT FXBIT(25) -#define GWH_FDTDY_BIT FXBIT(26) -#define GWH_FSTARTW_BIT FXBIT(27) -#define GWH_FDWDX_BIT FXBIT(28) -#define GWH_FDWDY_BIT FXBIT(29) -#define GWH_FTRIANGLECMD_BIT FXBIT(30) -#define GWH_ENABLE_BIT FXBIT(31) - -#define GWH_VTX_BITS (GWH_VTX_AX_BIT | GWH_VTX_AY_BIT | \ - GWH_VTX_BX_BIT | GWH_VTX_BY_BIT | \ - GWH_VTX_CX_BIT | GWH_VTX_CY_BIT) -#define GWH_RGB_BITS (GWH_FSTARTR_BIT | GWH_FDRDX_BIT | GWH_FDRDY_BIT |\ - GWH_FSTARTG_BIT | GWH_FDGDX_BIT | GWH_FDGDY_BIT |\ - GWH_FSTARTB_BIT | GWH_FDBDX_BIT | GWH_FDBDY_BIT) -#define GWH_Z_BITS (GWH_FSTARTZ_BIT | GWH_FDZDX_BIT | GWH_FDZDY_BIT) -#define GWH_A_BITS (GWH_FSTARTA_BIT | GWH_FDADX_BIT | GWH_FDADY_BIT) -#define GWH_ST_BITS (GWH_FSTARTS_BIT | GWH_FDSDX_BIT | GWH_FDSDY_BIT |\ - GWH_FSTARTT_BIT | GWH_FDTDX_BIT | GWH_FDTDY_BIT) -#define GWH_W_BITS (GWH_FSTARTW_BIT | GWH_FDWDX_BIT | GWH_FDWDY_BIT) - -/* All gradient bits... used in trisetup_nogradients hack */ -#define GWH_DXY_BITS ( \ - GWH_FDRDX_BIT | GWH_FDRDY_BIT | GWH_FDGDX_BIT | GWH_FDGDY_BIT | \ - GWH_FDBDX_BIT | GWH_FDBDY_BIT | GWH_FDZDX_BIT | GWH_FDZDY_BIT | \ - GWH_FDADX_BIT | GWH_FDADY_BIT | GWH_FDSDX_BIT | GWH_FDSDY_BIT | \ - GWH_FDTDX_BIT | GWH_FDTDY_BIT | GWH_FDWDX_BIT | GWH_FDWDY_BIT ) - -void -_grDebugGroupWriteHeader(FxU32 header, FxU32 address); - -#if defined(GDBG_INFO_ON) -#define DUMPGWH(header, address) {\ - _grDebugGroupWriteHeader(header, address);\ -} -#else -#define DUMPGWH(header,address) -#endif - -#ifdef GLIDE_SANITY_SIZE -# define GW_UPDATE_COUNT(a) (gc->counter += a) -#else -# define GW_UPDATE_COUNT(a) -#endif - -#define FENCE_AMOUNT 128 - -#define GWH_REG_SHIFT 2 -#define GWH_WRAP_SHIFT 12 -#define GWH_CHIP_SHIFT 16 - -#define GWH_REG_OFFSET(a) ((FxU32) (a) - (FxU32) gc->reg_ptr) -#define GWH_REG(a) ((GWH_REG_OFFSET(a) >> GWH_REG_SHIFT) & 0xff) -#define GWH_WRAP(a) (((FxU32)(a) >> GWH_WRAP_SHIFT) & 0xf) -#define GWH_CHIP(a) (((FxU32)(a) >> GWH_CHIP_SHIFT) & 0xf) - -#define GWH_GEN_WRAP(w) (((w) & 0xf) << GWH_WRAP_SHIFT) -#define GWH_GEN_CHIP(c) (((c) & 0xf) << GWH_CHIP_SHIFT) - -#define GEN_PCI_ADDRESS - -#define GWH_FENCE_TRIANGLE \ -if ((gc->hwDep.sst96Dep.writesSinceFence + (_GlideRoot.curTriSize>>2 ) + 4) > FENCE_AMOUNT)\ - GR_P6FENCE - -#define GW_TRICMD_MASK 0x40000000 - -#define GWH_BUILD_PCI_ADDRESS(a,c,w)\ - (GWH_REG(a) | (GWH_WRAP(w) << GWH_WRAP_SHIFT) | (GWH_CHIP(c) << GWH_CHIP_SHIFT)) - -#define PUMA_DWORD_REG_OFFSET 0x100000 - -#define GWH_GEN_ADDRESS(a) \ - ((((FxU32)(a) - (FxU32) gc->lfb_ptr) >> 2) | PUMA_DWORD_REG_OFFSET | GWH_ENABLE_BIT) - -#ifdef DEBUG -# define GWH_RESET_WSH gc->hwDep.sst96Dep.writesSinceHeader = 0 -# define GWH_INC_WSH gc->hwDep.sst96Dep.writesSinceHeader++ -#else -# define GWH_RESET_WSH -# define GWH_INC_WSH -#endif - -#if defined( GLIDE_DEBUG ) - /* defined in GPCI.C */ -extern void GR_CDECL -_GR_SET_GW_CMD( volatile void *addr, unsigned long data ); -extern void GR_CDECL -_GR_SET_GW_HEADER( volatile void *addr, unsigned long data ); -extern void GR_CDECL -_GR_SET_GW_ENTRY( volatile void *addr, unsigned long data ); - -#define SET_GW_CMD( addr, offset, data ) \ -_GR_SET_GW_CMD( ((FxU32*)(addr))+(offset), (data) ); GR_INC_SIZE(4) - -#define SET_GW_HEADER( addr, offset, data ) \ -_GR_SET_GW_HEADER( ((FxU32*)(addr))+(offset), (data) ); GR_INC_SIZE(4) - -#define FSET_GW_ENTRY( addr, offset, data ) \ -{ \ - float _tacoFTemp; \ - _tacoFTemp = (data); \ - _GR_SET_GW_ENTRY( ((FxU32*)(addr))+(offset), (*(FxU32*)&_tacoFTemp) ); \ - GR_INC_SIZE(4);\ -} -#else - -#define SET_GW_CMD( addr, offset, data ) \ -*(addr+offset)=data; - -#define SET_GW_HEADER( addr, offset, data ) \ -*(addr+offset)=data; - -#define FSET_GW_ENTRY( addr, offset, data ) \ -*((float*)(addr+offset))=data; - -#endif - -#if SST96_ALT_FIFO_WRAP -#define GWH_PACKET_SIZE_CHECK(__s) \ - if (gc->fifoData.hwDep.vg96FIFOData.fifoSize < (FxU32) ((__s) + 12)) {\ - gc->fifoData.hwDep.vg96FIFOData.blockSize = (__s) + 12; \ - initWrapFIFO(&gc->fifoData); \ - } -#else -#define GWH_PACKET_SIZE_CHECK(__s) \ - if (gc->fifoData.hwDep.vg96FIFOData.fifoSize < (FxU32) ((__s) + 12)) {\ - _grSst96FifoMakeRoom();\ - GR_ASSERT(!(gc->fifoData.hwDep.vg96FIFOData.fifoSize < 0x1000));\ - } -#endif - -#define GWH_BEGIN_TRIANGLE_PACKET(header, address) \ -{\ - GWH_RESET_WSH;\ - GR_ASSERT(!(((FxU32)(gc->fifoData.hwDep.vg96FIFOData.fifoPtr) & 0x7)));\ - GWH_FENCE_TRIANGLE;\ - GDBG_INFO((120, "Beginning Grouped Write Packet\n"));\ - GDBG_INFO((120, "fifoPtr = 0x%x fifoSize = 0x%x\n", gc->fifoData.hwDep.vg96FIFOData.fifoPtr, gc->fifoData.hwDep.vg96FIFOData.fifoSize));\ - GDBG_INFO((120, "Base = 0x%x Mask = 0x%x\n", (FxU32) address, header));\ - GW_UPDATE_COUNT(8);\ - GWH_PACKET_SIZE_CHECK(_GlideRoot.curTriSize); \ - DUMPGWH(header,address);\ - GLIDE_FIFO_CHECK(); \ - *gc->fifoData.hwDep.vg96FIFOData.fifoPtr++ = GWH_GEN_ADDRESS(address);\ - *gc->fifoData.hwDep.vg96FIFOData.fifoPtr++ = header;\ - gc->fifoData.hwDep.vg96FIFOData.fifoSize -= 8;\ - gc->hwDep.sst96Dep.writesSinceFence += 2;\ -} - -#define GWH_FENCE_TEXDL \ -if ((gc->hwDep.sst96Dep.writesSinceFence + 34) >= FENCE_AMOUNT)\ - GR_P6FENCE - -#define GWH_BEGIN_TEXDL_PACKET(header, address) \ -{\ - GWH_RESET_WSH;\ - GR_ASSERT(!(((FxU32)(gc->fifoData.hwDep.vg96FIFOData.fifoPtr) & 0x7)));\ - GWH_FENCE_TEXDL;\ - GDBG_INFO((120, "Beginning Texture Grouped Write Packet\n"));\ - GDBG_INFO((120, "fifoPtr = 0x%x fifoSize = 0x%x\n", gc->fifoData.hwDep.vg96FIFOData.fifoPtr, gc->fifoData.hwDep.vg96FIFOData.fifoSize));\ - GDBG_INFO((120, "Base = 0x%x Mask = 0x%x\n", address, header));\ - GW_UPDATE_COUNT(8);\ - GWH_PACKET_SIZE_CHECK(34 << 2); \ - GLIDE_FIFO_CHECK(); \ - DUMPGWH(header,((((FxU32) address - (FxU32) gc->lfb_ptr)) >> 2) | GWH_ENABLE_BIT);\ - *gc->fifoData.hwDep.vg96FIFOData.fifoPtr++ =\ - ((((FxU32) address - (FxU32) gc->lfb_ptr)) >> 2) | GWH_ENABLE_BIT;\ - *gc->fifoData.hwDep.vg96FIFOData.fifoPtr++ = header;\ - gc->fifoData.hwDep.vg96FIFOData.fifoSize -= 8;\ - gc->hwDep.sst96Dep.writesSinceFence += 2;\ -} - -#define GR_SETF_GW(s) {\ -GLIDE_FIFO_CHECK(); \ -GR_ASSERT(gc->hwDep.sst96Dep.writesSinceHeader < 32);\ -GDBG_INFO((120, "Group Write: fifoPtr = 0x%x, value = %4.2f sinceFence = 0x%x\n", gc->fifoData.hwDep.vg96FIFOData.fifoPtr, s, gc->hwDep.sst96Dep.writesSinceFence));\ -*((float *) gc->fifoData.hwDep.vg96FIFOData.fifoPtr++) = s;\ -gc->fifoData.hwDep.vg96FIFOData.fifoSize-=4;\ -GW_UPDATE_COUNT(4);\ -GR_ASSERT(gc->hwDep.sst96Dep.writesSinceFence <= FENCE_AMOUNT);\ -gc->hwDep.sst96Dep.writesSinceFence++;\ -GWH_INC_WSH;\ -} - -#define GR_SET_GW(s) {\ -GLIDE_FIFO_CHECK(); \ -GR_ASSERT(gc->hwDep.sst96Dep.writesSinceHeader < 32);\ -GDBG_INFO((120, "Group Write: fifoPtr = 0x%x, value = 0x%x sinceFence=%d\n", gc->fifoData.hwDep.vg96FIFOData.fifoPtr, s, gc->hwDep.sst96Dep.writesSinceFence));\ -P6FENCEFIFO;\ -*gc->fifoData.hwDep.vg96FIFOData.fifoPtr++ = s;\ -gc->fifoData.hwDep.vg96FIFOData.fifoSize-=4;\ -GW_UPDATE_COUNT(4);\ -GR_ASSERT(gc->hwDep.sst96Dep.writesSinceFence <= FENCE_AMOUNT);\ -gc->hwDep.sst96Dep.writesSinceFence++;\ -GWH_INC_WSH;\ -} - -#endif /* stuff for group write packet header */ - -/*==========================================================================*/ -/* -** Here's the infamous Packer Bug Check and Workaround: -** XOR the two addresses together to find out which bits are different. -** AND the result with the bits that represent the chip field of the -** SST address. If ANY of them are different, then do the packer hack. -** Save this address as the last with which we compared. -*/ - -#define SST_CHIP_MASK 0x3C00 - -#if ( GLIDE_PLATFORM & GLIDE_HW_SST1 ) -#define GLIDE_DRIVER_NAME "Voodoo Graphics" -#elif ( GLIDE_PLATFORM & GLIDE_HW_SST96 ) -#define GLIDE_DRIVER_NAME "Voodoo Rush" -#else -#define GLIDE_DRIVER_NAME "Unknown" -#endif - -#if (GLIDE_PLATFORM & GLIDE_HW_SST1) - #define PACKER_WORKAROUND_SIZE 4 - - #define PACKER_WORKAROUND \ - if (_GlideRoot.CPUType == 6) {\ - GR_P6FENCE;\ - GR_SET( *(FxU32 *)_GlideRoot.packerFixAddress, 0 );\ - GR_P6FENCE;\ - } \ - else {\ - GR_SET( *(FxU32 *)_GlideRoot.packerFixAddress, 0 ); \ - } - - #define PACKER_BUGCHECK(a)\ - if ( (((FxU32) a) ^ lastAddress) & SST_CHIP_MASK ) {\ - PACKER_WORKAROUND; \ - lastAddress = (FxU32)a; \ - } - -#else - #define PACKER_WORKAROUND_SIZE 0 - #define PACKER_WORKAROUND - #define PACKER_BUGCHECK(a) -#endif - -/* On a P6 we have to fence around commands to ensure write-ordering */ -#if 0 -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) -# ifdef GR_P6FENCE -# undef GR_P6FENCE -# endif -# define GR_P6FENCE -#endif -#endif - -/* GMT: a very useful macro for making sure that SST commands are properly - fenced on a P6, e.g. P6FENCH_CMD( GR_SET(hw->nopCMD,1) ); -*/ -/* #if (GLIDE_PLATFORM & GLIDE_HW_SST1) */ -#if 1 -#define P6FENCE_CMD( cmd ) \ - if (_GlideRoot.CPUType == 6) { /* if it's a p6 */ \ - GR_P6FENCE; /* then fence off the cmd */ \ - cmd; \ - GR_P6FENCE; /* to ensure write order */ \ - } \ - else \ - cmd -#else -#define P6FENCE_CMD( cmd ) cmd -#endif - -/*==========================================================================*/ -#ifndef FX_GLIDE_NO_FUNC_PROTO - -void _grMipMapInit(void); -FxI32 FX_CSTYLE -_trisetup_asm(const GrVertex *va, const GrVertex *vb, const GrVertex *vc ); -FxI32 FX_CSTYLE -_trisetup(const GrVertex *va, const GrVertex *vb, const GrVertex *vc ); -FxI32 FX_CSTYLE -_trisetup_nogradients(const GrVertex *va, const GrVertex *vb, const GrVertex *vc ); - -#endif /* FX_GLIDE_NO_FUNC_PROTO */ - -/* GMT: BUG need to make this dynamically switchable */ -#if defined(GLIDE_USE_C_TRISETUP) - #define TRISETUP _trisetup -#else - #define TRISETUP _trisetup_asm -#endif /* GLIDE_USE_C_TRISETUP */ - -/*==========================================================================*/ -/* -** Function Prototypes -*/ -#ifdef GLIDE_DEBUG -FxBool -_grCanSupportDepthBuffer( void ); -#endif - -void -_grClipNormalizeAndGenerateRegValues(FxU32 minx, FxU32 miny, FxU32 maxx, - FxU32 maxy, FxU32 *clipLeftRight, - FxU32 *clipBottomTop); - -void -_grSwizzleColor( GrColor_t *color ); - -void -_grDisplayStats(void); - -void -_GlideInitEnvironment(void); - -void FX_CSTYLE -_grColorCombineDelta0Mode( FxBool delta0Mode ); - -void -_doGrErrorCallback( const char *name, const char *msg, FxBool fatal ); - -void _grErrorDefaultCallback( const char *s, FxBool fatal ); - -#ifdef __WIN32__ -void _grErrorWindowsCallback( const char *s, FxBool fatal ); -#endif /* __WIN32__ */ - -extern void -(*GrErrorCallback)( const char *string, FxBool fatal ); - -void GR_CDECL -_grFence( void ); - -int -_guHeapCheck( void ); - -void FX_CSTYLE -_grRebuildDataList( void ); - -void -_grReCacheFifo( FxI32 n ); - -FxI32 GR_CDECL -_grSpinFifo( FxI32 n ); - -void -_grShamelessPlug(void); - -FxBool -_grSstDetectResources(void); - -FxU16 -_grTexFloatLODToFixedLOD( float value ); - -void FX_CSTYLE -_grTexDetailControl( GrChipID_t tmu, FxU32 detail ); - -void FX_CSTYLE -_grTexDownloadNccTable( GrChipID_t tmu, FxU32 which, - const GuNccTable *ncc_table, - int start, int end ); -void FX_CSTYLE -_grTexDownloadPalette( GrChipID_t tmu, - GuTexPalette *pal, - int start, int end ); - -FxU32 -_grTexCalcBaseAddress( - FxU32 start_address, GrLOD_t largeLod, - GrAspectRatio_t aspect, GrTextureFormat_t fmt, - FxU32 odd_even_mask ); - -void -_grTexForceLod( GrChipID_t tmu, int value ); - -FxU32 -_grTexTextureMemRequired( GrLOD_t small_lod, GrLOD_t large_lod, - GrAspectRatio_t aspect, GrTextureFormat_t format, - FxU32 evenOdd ); -void FX_CSTYLE -_grUpdateParamIndex( void ); - -#if 0 -FX_ENTRY void FX_CALL -grSstConfigPipeline(GrChipID_t chip, GrSstRegister reg, FxU32 value); -#endif - -/*==========================================================================*/ -/* GMT: have to figure out when to include this and when not to -*/ -#if defined(GLIDE_DEBUG) || defined(GLIDE_ASSERT) || \ - defined(GLIDE_SANITY_ASSERT) || defined(GLIDE_SANITY_SIZE) || \ - defined(GDBG_INFO_ON) -#define DEBUG_MODE 1 -#include - -#if SST96_FIFO -/* sst96.c */ -extern void -_grSst96CheckFifoData(void); - -#define GLIDE_FIFO_CHECK() _grSst96CheckFifoData() -#else -#define GLIDE_FIFO_CHECK() -#endif -#else -#define GLIDE_FIFO_CHECK() -#endif - -#if (GLIDE_PLATFORM & GLIDE_HW_SST1) -/* NOTE: fifoFree is the number of entries, each is 8 bytes */ -#define GR_CHECK_FOR_ROOM(n) \ -{ \ - FxI32 fifoFree = gc->state.fifoFree - (n); \ - if (fifoFree < 0) \ - fifoFree = _grSpinFifo(n); \ - gc->state.fifoFree = fifoFree;\ -} -#elif (GLIDE_PLATFORM & GLIDE_HW_SST96) -/* NOTE: fifoSize is in bytes, and each fifo entry is 8 bytes. Since - the fifoSize element of the sst96Dep data structure must be - accurate, we subtract after we write, instead of at the beginning - as above. */ -#if (GLIDE_PLATFORM & GLIDE_OS_DOS32) && defined(GLIDE_DEBUG) -#define GR_CHECKINT10 if (gc->hwDep.sst96Dep.int10Called)_doGrErrorCallback("Glide Error:", "Application called Int 10 between grSstWinOpen and Close.\n", FXTRUE) -#else -#define GR_CHECKINT10 -#endif - -#if SST96_ALT_FIFO_WRAP - -#define GR_CHECK_FOR_ROOM(n) \ -{\ - FxI32 fifoSize = gc->fifoData.hwDep.vg96FIFOData.fifoSize - ((n) << 1);\ - if (fifoSize < 0) {\ - gc->fifoData.hwDep.vg96FIFOData.blockSize = ((n) << 1); \ - initWrapFIFO(&gc->fifoData); \ - GR_CHECKINT10;\ - }\ -} -#else /* !SST96_ALT_FIFO_WRAP */ -#define GR_CHECK_FOR_ROOM(n) \ -{\ - FxI32 fifoSize = gc->fifoData.hwDep.vg96FIFOData.fifoSize - ((n) << 1);\ - if (fifoSize < 0) {\ - _grSst96FifoMakeRoom();\ - GR_ASSERT(!(gc->fifoData.hwDep.vg96FIFOData.fifoSize < 0x1000));\ - GR_CHECKINT10;\ - }\ -} -#endif /* !SST96_ALT_FIFO_WRAP */ -#endif - -#ifdef GLIDE_SANITY_SIZE - -#define FIFO_SUB_VAL ((FxU32)gc->fifoData.hwDep.vg96FIFOData.fifoPtr - \ - (FxU32)gc->fifoData.hwDep.vg96FIFOData.fifoVirt) - -#define GR_CHECK_SIZE() \ - if(gc->counter != gc->expected_counter) \ - GDBG_ERROR("GR_ASSERT_SIZE","byte counter should be %d but is %d\n", \ - gc->expected_counter,gc->counter); \ - ASSERT(gc->counter == gc->expected_counter); \ - gc->counter = gc->expected_counter = 0 -#define GR_CHECK_SIZE_SLOPPY() \ - if(gc->counter > gc->expected_counter) \ - GDBG_ERROR("GR_ASSERT_SIZE","byte counter should be < %d but is %d\n", \ - gc->expected_counter,gc->counter); \ - ASSERT(gc->counter <= gc->expected_counter); \ - gc->counter = gc->expected_counter = 0 -#define GR_SET_EXPECTED_SIZE(n) \ - GLIDE_FIFO_CHECK(); \ - GDBG_INFO((gc->myLevel, \ - "FIFO: 0x%X 0x%X (0x%X)\n", \ - (n), \ - (FxU32)gc->fifoData.hwDep.vg96FIFOData.fifoPtr, \ - FIFO_SUB_VAL)); \ - GDBG_INFO((gc->myLevel, \ - "FIFOSize: 0x%X\n", \ - (FxU32)gc->fifoData.hwDep.vg96FIFOData.fifoSize));\ - ASSERT(gc->counter == 0); \ - ASSERT(gc->expected_counter == 0); \ - GR_CHECK_FOR_ROOM((n)); \ - gc->expected_counter = n -#define GR_INC_SIZE(n) gc->counter += n -#else /* !GLIDE_SANITY_SIZE */ - /* define to do nothing */ -#define GR_CHECK_SIZE_SLOPPY() -#define GR_CHECK_SIZE() -#define GR_SET_EXPECTED_SIZE(n) GR_CHECK_FOR_ROOM((n)) -#define GR_INC_SIZE(n) -#endif /* !GLIDE_SANITY_SIZE */ - -#define GR_DCL_GC GrGC *gc = _GlideRoot.curGC -#define GR_DCL_HW Sstregs *hw = (Sstregs *)gc->reg_ptr - -#ifdef DEBUG_MODE - #define ASSERT(exp) GR_ASSERT(exp) - - #define GR_BEGIN_NOFIFOCHECK(name,level) \ - GR_DCL_GC; \ - GR_DCL_HW; \ - static char myName[] = name; \ - GR_ASSERT(gc != NULL); \ - GR_ASSERT(hw != NULL); \ - gc->myLevel = level; \ - GDBG_INFO((gc->myLevel,"%s\n", myName)); \ - FXUNUSED( hw ) - -#else - #define ASSERT(exp) - - #define GR_BEGIN_NOFIFOCHECK(name,level) \ - GR_DCL_GC; \ - GR_DCL_HW; \ - FXUNUSED( hw ) -#endif - -#define GR_BEGIN(name,level,size) \ - GR_BEGIN_NOFIFOCHECK(name,level); \ - GR_SET_EXPECTED_SIZE(size) - -#if SST96_ALT_FIFO_WRAP -#define GR_EXIT_TRACE \ - GLIDE_FIFO_CHECK(); \ - GDBG_INFO((gc->myLevel, \ - "%s Done: FifoPtr(0x%X) FifoTest(0x%X)\n", \ - myName, \ - (FxU32)gc->fifoData.hwDep.vg96FIFOData.fifoPtr, \ - gc->fifoData.hwDep.vg96FIFOData.fifoSize)) -#else -#define GR_EXIT_TRACE GDBG_INFO((gc->myLevel, "%s Done\n", myName)) -#endif - -#define GR_END() {GR_CHECK_SIZE(); GR_EXIT_TRACE;} -#define GR_END_SLOPPY() {GR_CHECK_SIZE_SLOPPY(); GR_EXIT_TRACE;} -#define GR_RETURN(val) \ - if ( GDBG_GET_DEBUGLEVEL(gc->myLevel) ) { \ - GR_CHECK_SIZE(); \ - } \ - else \ - GR_END(); \ - GDBG_INFO((gc->myLevel,"%s() => 0x%x---------------------\n",myName,val,val)); \ - return val - -#ifndef GR_ASSERT -#if defined(GLIDE_SANITY_ASSERT) -# define GR_ASSERT(exp) if (!(exp)) _grAssert(#exp, __FILE__, __LINE__) -#else -# define GR_ASSERT(exp) -#endif -#endif - -#if defined(GLIDE_DEBUG) - #define GR_CHECK_F(name,condition,msg) \ - if ( condition ) _doGrErrorCallback( name, msg, FXTRUE ) - #define GR_CHECK_W(name,condition,msg) \ - if ( condition ) _doGrErrorCallback( name, msg, FXFALSE ) -#else - #define GR_CHECK_F(name,condition,msg) - #define GR_CHECK_W(name,condition,msg) -#endif - -/* macro define some basic and common GLIDE debug checks */ -#define GR_CHECK_TMU(name,tmu) \ - GR_CHECK_F(name, tmu < GR_TMU0 || tmu >= gc->num_tmu , "invalid TMU specified") - - -FxBool -_grSst96PCIFifoEmpty(void); -FxU32 -_grSst96Load32(FxU32 *s); -void -_grSst96Store32(FxU32 *d, FxU32 s); -void -_grSst96Store16(FxU16 *d, FxU16 s); -void -_grSst96Store32F(float *d, float s); -void -_grAssert(char *, char *, int); - -#if defined(SST96) -/* sst.h defines SET,GET,SETF, and SET16 */ -#undef SET -#undef SETF -#undef SET16 - -void GR_CDECL -_grSst96FifoMakeRoom(void); - -#define SST96_LFB_OFFSET 0x000000 -#define SST96_REG_OFFSET 0x400000 -#define SST96_TEX_OFFSET 0x600000 - -#ifdef SST96_FIFO -#ifdef GDBG_INFO_ON -void -_grFifoWriteDebug(FxU32 addr, FxU32 val, FxU32 fifoPtr); -#define DEBUGFIFOWRITE(a,b,c) \ -_grFifoWriteDebug((FxU32) a, (FxU32) b, (FxU32) c) -void -_grFifoFWriteDebug(FxU32 addr, float val, FxU32 fifoPtr); -#define DEBUGFIFOFWRITE(a,b,c) \ -_grFifoFWriteDebug((FxU32) a, (float) b, (FxU32) c) -#else -#define DEBUGFIFOWRITE(a,b,c) -#define DEBUGFIFOFWRITE(a,b,c) -#endif - -/* -** Here lies the infamous Nudge Of Love. The Nudge Of Love is -** required to on P6s, where the read pointer trails the write -** pointer by 256 bytes (64 DWORDS). The problem with that is -** sometimes we really need the hardware to have read all the data we -** have sent--thus the Nudge, which gently strokes the read pointer -** through the last commands we've placed in the commadn FIFO. -** -** That would be all well and good except for one thing: If the -** frame time is very short, Jr, doesn't like the Nudge Of Love. So, -** instead of a whole bunch of nopCmds, we must draw a smallish -** triangle. The problem with that, however, is the app may be -** reusing the contents of the color or depth buffers. Thus, we have -** to disable the color and depth mask before drawing the triangle -** and replace the shadowed values after we draw it. -** -* dpc - 19 aug 1997 - FixMe! -* This macro is called the P6_NUDGE_OF_LOVE, but it was not previously -* conditional on running on a p6. Is this right? I moved the set expected -* size thing into here, and made usages of the macro not set the expected -* size and do the sloppy check. -*/ -#define P6_NUDGE_OF_LOVE \ -if (_GlideRoot.CPUType == 6) {\ - int i;\ - GR_SET_EXPECTED_SIZE(32 << 2); \ - GR_SET(hw->fbzMode, (gc->state.fbi_config.fbzMode & (~(SST_RGBWRMASK | SST_ZAWRMASK))));\ - GR_SETF(hw->FvA.x, 0.f);\ - GR_SETF(hw->FvA.y, 0.f);\ - GR_SETF(hw->FvB.x, 100.f);\ - GR_SETF(hw->FvB.y, 0.f);\ - GR_SETF(hw->FvC.x, 100.f);\ - GR_SETF(hw->FvC.y, 100.f);\ - GR_SETF(hw->FtriangleCMD, 1.f);\ - GR_SET(hw->fbzMode, gc->state.fbi_config.fbzMode);\ - for (i = 0; i < 23; i++) GR_SET(hw->nopCMD, 0); \ - GR_CHECK_SIZE(); \ -} - -#define P6FENCEFIFO \ -if (_GlideRoot.CPUType == 6) {\ - GR_ASSERT(gc->hwDep.sst96Dep.writesSinceFence <= FENCE_AMOUNT);\ - if (gc->hwDep.sst96Dep.writesSinceFence == FENCE_AMOUNT) {\ - GR_P6FENCE;\ - }\ -} - -#define SST96_STORE_FIFO(addr,val){\ - GR_ASSERT(!(((FxU32)(gc->fifoData.hwDep.vg96FIFOData.fifoPtr) & 0x7)));\ - GR_ASSERT(gc->fifoData.hwDep.vg96FIFOData.fifoSize > 0);\ - P6FENCEFIFO;\ - DEBUGFIFOWRITE(addr, val, gc->fifoData.hwDep.vg96FIFOData.fifoPtr);\ - GLIDE_FIFO_CHECK(); \ - *gc->fifoData.hwDep.vg96FIFOData.fifoPtr++ =\ - (((FxU32) ((FxU32) addr) - ((FxU32) gc->lfb_ptr)) >> 2);\ - *gc->fifoData.hwDep.vg96FIFOData.fifoPtr++ = val;\ - gc->hwDep.sst96Dep.writesSinceFence+=2;\ - gc->fifoData.hwDep.vg96FIFOData.fifoSize -= 8;\ - GLIDE_FIFO_CHECK(); \ -} - -#define SST96_STOREF_FIFO(addr,fVal){\ - GR_ASSERT(!(((FxU32)(gc->fifoData.hwDep.vg96FIFOData.fifoPtr) & 0x7)));\ - GR_ASSERT(gc->fifoData.hwDep.vg96FIFOData.fifoSize);\ - P6FENCEFIFO;\ - DEBUGFIFOFWRITE((addr), fVal, gc->fifoData.hwDep.vg96FIFOData.fifoPtr);\ - GLIDE_FIFO_CHECK(); \ - *gc->fifoData.hwDep.vg96FIFOData.fifoPtr++ =\ - (((addr) - ((FxU32) gc->lfb_ptr)) >> 2);\ - *((float *)gc->fifoData.hwDep.vg96FIFOData.fifoPtr) = fVal;\ - gc->fifoData.hwDep.vg96FIFOData.fifoPtr++;\ - gc->hwDep.sst96Dep.writesSinceFence+=2;\ - gc->fifoData.hwDep.vg96FIFOData.fifoSize -= 8;\ - GLIDE_FIFO_CHECK(); \ -} - -#define SET16(d,s) SST96_STORE_FIFO((&d), (FxU32) s) -#define SET(d,s) SST96_STORE_FIFO((&d),s) -#define SETF(d,s) SST96_STOREF_FIFO(((FxU32)(&(d))), s) - -/* -** Here are some macro for the very few times when we must perform a -** direct write of the hardware--even when using the memory-backed -** command FIFO. -*/ -#ifndef GDBG_INFO_ON -#define SET_DIRECT(d,s) (hw->d) = (s) -#define SETF_DIRIECT(d,s) *((float *) &hw->d) = s -#else -#define REGOFFSET(d) (((FxU32) &hw->d - (FxU32) hw) >> 2) -#define SET_DIRECT(d,s)\ - GDBG_INFO((120, "DIRECT SET of register 0x%x with value 0x%x\n",\ - REGOFFSET(d), s));\ - (hw->d) = (s) -#define SETF_DIRECT(d,s)\ - GDBG_INFO((120, "DIRECT SET of register 0x%x with value %4.4f\n",\ - REGOFFSET(d), s));\ - *((float *) &hw->d) = s -#endif - -#else - -#ifndef GDBG_INFO_ON -#define GET(s) s -#define SET(d,s) d = s -#define SET16(d,s) d = s -#define SETF(d,s) (*(float *)&(d)) = s -#else -#undef GET - -#define GET(s) _grSst96Load32(&s) -#define SET(d,s) _grSst96Store32((FxU32 *)&d, s) -#define SET16(d,s) _grSst96Store16(&d,s) -#define SETF(d,s) _grSst96Store32F((float *) &d, s) -#endif /* GDBG_INFO_ON */ -#endif /* SST96_FIFO */ - -#endif /* defined(SST96) */ - -#if defined(GLIDE_DEBUG) && !defined(SST96) - extern FxU32 GR_CDECL _GR_GET(void *); - extern void GR_CDECL _GR_SET16(void *, unsigned short); - extern void GR_CDECL _GR_SET(void *, unsigned long); - extern void GR_CDECL _GR_SETF(void *, float); - - #define GR_GET(s) _GR_GET(&(s)) - #define GR_SET(d,s) {_GR_SET(&(d),s); SET(d,s); GR_INC_SIZE(4);} - #define GR_SETF(d,s) {_GR_SETF(&(d),s); SETF(d,s); GR_INC_SIZE(4);} - #define GR_SET16(d,s) {_GR_SET16(&(d),s); SET16(d,s); GR_INC_SIZE(2);} -#else - #define GR_GET(s) GET(s) - #define GR_SET(d,s) {SET(d,s); GR_INC_SIZE(4);} - #define GR_SETF(d,s) {SETF(d,s); GR_INC_SIZE(4);} - #define GR_SET16(d,s) {SET16(d,s); GR_INC_SIZE(2);} -#endif - - - -#define VG96_REGISTER_OFFSET 0x400000 -#define VG96_TEXTURE_OFFSET 0x600000 -/* make SST96 addresses */ -#define SST96_REG_PTR(a) \ - ((FxU32 *) (((FxU32) a) + VG96_REGISTER_OFFSET)) -#define SST96_LFB_PTR(a) \ - ((FxU32 *) a) -#define SST96_TEX_PTR(a) \ - ((FxU32 *) (((FxU32) a) + VG96_TEXTURE_OFFSET)) - -void rle_decode_line_asm(FxU16 *tlut,FxU8 *src,FxU16 *dest); - -extern FxU16 rle_line[256]; -extern FxU16 *rle_line_end; - -#define RLE_CODE 0xE0 -#define NOT_RLE_CODE 31 - -#ifdef __WATCOMC__ -#pragma aux rle_decode_line_asm parm [edx] [edi] [esi] value [edi] modify exact [eax ebx ecx edx esi edi] = \ -" next_pixel: " \ -" xor ecx,ecx " \ -" mov al,byte ptr[edi] " \ -" mov cl,byte ptr[edi] " \ -" inc edi " \ -" " \ -" and al,0xE0 " \ -" cmp al,0xE0 " \ -" jne unique " \ -" " \ -" and cl,0x1F " \ -" mov al,cl " \ -" jz done_rle " \ -" " \ -" mov cl,byte ptr[edi] " \ -" inc edi " \ -" mov bx,word ptr[edx+ecx*2] " \ -" " \ -" copy_block: " \ -" mov word ptr[esi],bx " \ -" add esi,0x2 " \ -" dec al " \ -" jz next_pixel " \ -" jmp copy_block " \ -" " \ -" unique: " \ -" mov bx,word ptr[edx+ecx*2] " \ -" mov word ptr[esi],bx " \ -" add esi,0x2 " \ -" jmp next_pixel " \ -" done_rle: "; -#endif /* __WATCOMC__ */ - -#endif /* __FXGLIDE_H__ */ - diff --git a/glide2x/sst1/glide/src/fxinline.h b/glide2x/sst1/glide/src/fxinline.h deleted file mode 100644 index b9abb63..0000000 --- a/glide2x/sst1/glide/src/fxinline.h +++ /dev/null @@ -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 - */ - -#ifndef __FX_INLINE_H__ -#define __FX_INLINE_H__ - -/* The # of 2-byte entries in the hw fog table */ -#define kInternalFogTableEntryCount 0x40UL - -#endif /* __FX_INLINE_H__ */ diff --git a/glide2x/sst1/glide/src/g3df.c b/glide2x/sst1/glide/src/g3df.c deleted file mode 100644 index 508df12..0000000 --- a/glide2x/sst1/glide/src/g3df.c +++ /dev/null @@ -1,523 +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 3/09/97 10:31a Dow - * Added GR_DIENTRY for di glide functions -** -*/ -#include -#include - -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" -#ifdef __linux__ -#include -#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 ) ) != 0 ) -const char *openmode = "rb"; -#else -const char *openmode = "r"; -#endif - -typedef struct -{ - const char *name; - GrTextureFormat_t fmt; - FxBool valid; -} CfTableEntry; - -#ifdef __linux__ -static void strupr(char *str) { - while (*str) { - if (islower(*str)) *str=toupper(*str); - str++; - } -} -#endif - -/*--------------------------------------------------------------------------- -** gu3dfGetInfo -*/ -GR_DIENTRY(gu3dfGetInfo, FxBool, - ( const char *FileName, Gu3dfInfo *Info )) -{ - FILE *image_file; - FxU32 index, i; - FxU32 newlines = 0; - 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; - - /* - ** check header - */ - index=0; - while(newlines<4) /* Read the header into a buffer. */ - if((buffer[index++]=getc(image_file))=='\n') - { - newlines++; - buffer[index-1] = ' '; - } - buffer[--index] = 0; - - /* - ** 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 - */ - 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 - */ - strupr( color_format ); - - 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 - */ - 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; - FxU32 newlines = 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; - - /* - ** examine the header - */ - index = 0; - while ( newlines < 4 ) - { - if ( ( buffer[index++] = getc( image_file ) ) == '\n') - { - newlines++; - buffer[index-1] = ' '; - } - } - buffer[--index] = 0; - - /* - ** 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 value; - - /* - ** read in the MSB - */ - value = ( ( FxU16 ) getc( fp ) ) << 8; - - /* - ** read in the LSB - */ - value |= ( getc( fp ) & 0x00FF ); - - return value; -} - -/* -** 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; -} - - - diff --git a/glide2x/sst1/glide/src/gaa.c b/glide2x/sst1/glide/src/gaa.c deleted file mode 100644 index ad60d8b..0000000 --- a/glide2x/sst1/glide/src/gaa.c +++ /dev/null @@ -1,846 +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$ - * - * 13 8/21/97 2:26p Atai - * fix FIFO size - * - * 12 7/25/97 2:55p Atai - * Remove slope calculation in edge sense code, use cross product instead. - * Move grAADrawTriEdgeSense() 1/area calculation after pci write command. - * - * 11 7/24/97 5:59p Atai - * optimize grAADrawPoint, grAADrawLine and grAADrawTriangle for sst1 - * - * 10 3/04/97 9:08p Dow - * Neutered multiplatform multiheaded monster - * - * 9 12/23/96 1:37p Dow - * chagnes for multiplatform glide -** -*/ - -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -#define FARRAY(p,i) (*(float *)((i)+(int)(p))) - -/* -** ----------------------------------------------------------------------- -** -** Antialiasing rendering functions -** -** ----------------------------------------------------------------------- -*/ - -/*--------------------------------------------------------------------------- -** grAADrawPoint -** -** |-w-| -** A---B - -** |\ /| | -** | E | h -** |/ \| | -** D --C - -** w = h = 2pixels -** -** pci write command -** 1st triangle EDA -** 8 + 3 * n -** 2nd triangle BEC -** 8 -** 3rd triangle AED -** 5 -** 4th triangle ABE -** 8 -** total = 29 + 3 * n -*/ -GR_ENTRY(grAADrawPoint, void, ( const GrVertex *e )) -{ - int i, j; - float *fp; - struct dataList_s *dlp; - float dp; - float PX, PY; - - GR_BEGIN("grAADrawPoint",94,((_GlideRoot.curTriSize - _GlideRoot.curTriSizeNoGradient) >> 3) * 12 + 116); - - PX = e->x; - PY = e->y; - j = *(long *)&e->a; - j ^= 0x80000000; - - /* 1st triangle EDA */ - GR_SETF(hw->FvA.x, PX); - dp = PX - _GlideRoot.pool.f1; - GR_SETF(hw->FvB.x, dp); - dp = PX + _GlideRoot.pool.f1; - GR_SETF(hw->FvC.x, dp); - dlp = gc->dataList; - GR_SETF(hw->FvA.y, PY); - dp = PY + _GlideRoot.pool.f1; - GR_SETF(hw->FvB.y, dp); - i = dlp->i; - GR_SETF(hw->FvC.y, dp); - while (i) { - fp = dlp->addr; - if (i & 1) { /* packer bug check */ - if (i & 2) P6FENCE; - GR_SETF( fp[0], 0.0f); - if (i & 2) P6FENCE; - dlp++; - i = dlp->i; - } - else { - dp = FARRAY(e,i); - GR_SETF( fp[0], dp ); - GR_SETF( fp[DPDX_OFFSET>>2] , _GlideRoot.pool.f0); - dlp++; - i = dlp->i; - GR_SETF( fp[DPDY_OFFSET>>2] , _GlideRoot.pool.f0 ); - } - } - GR_SET(hw->Fdady, j); - P6FENCE_CMD( GR_SET(hw->triangleCMD, 0xffffffff) ); - - /* 2nd triangle BEC */ - dp = PX + _GlideRoot.pool.f1; - GR_SETF(hw->FvA.x, dp); - GR_SETF(hw->FvB.x, PX); - dp = PY - _GlideRoot.pool.f1; - GR_SETF(hw->FvA.y, dp); - GR_SETF(hw->FvB.y, PY); - - GR_SET(hw->Fa, 0); - GR_SET(hw->Fdadx, j); - GR_SET(hw->Fdady, 0); - P6FENCE_CMD( GR_SET(hw->triangleCMD, 0xffffffff) ); - - /* 3rd triangle AED */ - dp = PX - _GlideRoot.pool.f1; - GR_SETF(hw->FvA.x, dp); - GR_SETF(hw->FvC.x, dp); - - j ^= 0x80000000; - GR_SET(hw->Fa, 0); - GR_SET(hw->Fdadx, j); - P6FENCE_CMD( GR_SET(hw->triangleCMD, 1) ); - - /* 4th triangle ABE */ - dp = PX + _GlideRoot.pool.f1; - GR_SETF(hw->FvB.x, dp); - GR_SETF(hw->FvC.x, PX); - dp = PY - _GlideRoot.pool.f1; - GR_SETF(hw->FvB.y, dp); - GR_SETF(hw->FvC.y, PY); - - GR_SET(hw->Fa, 0); - GR_SET(hw->Fdadx, 0); - GR_SET(hw->Fdady, j); - P6FENCE_CMD( GR_SET(hw->triangleCMD, 1) ); - - GR_END(); -} /* grAADrawPoint */ - -static void grSetVertexParameter(const GrVertex *v1) -{ - GR_DCL_GC; - GR_DCL_HW; - struct dataList_s *dlp; - int i; - float *fp, dp; - - dlp = gc->dataList; - i = dlp->i; - - while (i) { - fp = dlp->addr; - if (i & 1) { /* packer bug check */ - if (i & 2) P6FENCE; - GR_SETF( fp[0], 0.0f); - if (i & 2) P6FENCE; - dlp++; - i = dlp->i; - } - else { - dp = FARRAY(v1,i); - GR_SETF( fp[0], dp ); - dlp++; - i = dlp->i; - } - } -} - -/*--------------------------------------------------------------------------- -** grAADrawLine -** A(x1,y1-1.0)+ -** | \ -** | \ \ -** | \ \ -** V1(x1,y1)* \ -** | * \ \ -** | \ * \ -** | \ \ -** E(x1,y1+1.0)+ \ * \ \ -** \ * +B(x2,y2-1.0) -** \ \ * \ | -** \ | -** \ \ * \| -** \ +V2(x2,y2) -** \ \ | -** \ | -** \ \| -** +F(x2,y2+1.0) -** -** pci write command (x major line ) -** 1st triangle A-B-V2 -** 10 + 3 * n -** 2nd triangle A-V1-V2 -** 6 + n -** 3rd triangle V1-E-F -** 6 + n -** 4th triangle V1-V2-F -** 5 + n -** total = -*/ -GR_ENTRY(grAADrawLine, void, ( const GrVertex *v1, const GrVertex *v2 )) -{ - float adx; /* |dX| */ - const GrVertex *tv; - struct dataList_s *dlp; - int i; - float *fp, dp; - float tmp1, tmp2; - float dx, dy; /* delta X and Y */ - - GR_BEGIN("grAADrawLine",95, ((_GlideRoot.curTriSize - _GlideRoot.curTriSizeNoGradient) >> 3) * 24 + 108); - - GDBG_INFO((95,"grAADrawLine(0x%x,0x%x)\n",v1,v2)); - - /* turn off culling so triangles unconditionally draw */ - - /* draw from low Y to high Y */ - if ( v2->y < v1->y ) { - tv = v1; v1 = v2; v2 = tv; - } - - /* compute deltas and absolute deltas */ - dx = adx = v1->x - v2->x; - dy = v2->y - v1->y; - if ( adx < 0 ) - adx = -adx; - - if ( adx >= dy ) { /* X major line */ - - if (dx == 0.0f) - return; - - /* 1st triangle A-B-V2*/ - - GR_SETF( hw->FvA.x, v1->x); - dx = _GlideRoot.pool.f1 / dx; - GR_SETF( hw->FvA.y, v1->y - _GlideRoot.pool.f1); - tmp1 = -v1->a * dy; - GR_SETF( hw->FvB.x, v2->x); - GR_SETF( hw->FvB.y, v2->y - _GlideRoot.pool.f1); - tmp2 = -v2->a * dy; - GR_SETF( hw->FvC.x, v2->x); - dlp = gc->dataList; - GR_SETF( hw->FvC.y, v2->y); - i = dlp->i; - while (i) { - fp = dlp->addr; - if (i & 1) { /* packer bug check */ - if (i & 2) P6FENCE; - GR_SETF( fp[0], 0.0f); - if (i & 2) P6FENCE; - dlp++; - i = dlp->i; - } - else { - dp = FARRAY(v1,i); - GR_SETF( fp[0], dp ); - dp -= FARRAY(v2, i); - GR_SETF( fp[DPDX_OFFSET>>2] , dp * dx); - dlp++; - i = dlp->i; - GR_SETF( fp[DPDY_OFFSET>>2] , _GlideRoot.pool.f0 ); - } - } - GR_SET( hw->Fa , 0 ); - dp = - tmp2 * dx; - GR_SETF( hw->Fdadx , dp ); - GR_SETF( hw->Fdady , v2->a ); - P6FENCE_CMD( GR_SETF( hw->FtriangleCMD, -dx ) ); - - /* 2nd triangle A-V1-V2*/ - GR_SETF( hw->FvB.x, v1->x); - grSetVertexParameter(v1); - GR_SET( hw->Fa , 0 ); - dp = v1->a - v2->a; - GR_SETF( hw->FvB.y, v1->y); - dp -= tmp1; - GR_SETF( hw->Fdady , v1->a ); - dp *= dx; - GR_SETF( hw->Fdadx , dp ); - P6FENCE_CMD( GR_SETF( hw->FtriangleCMD, dx ) ); - - /* 3rd triangle v1-E-F */ - GR_SETF( hw->FvA.y, v1->y); - GR_SETF( hw->FvB.y, v1->y + _GlideRoot.pool.f1); - GR_SETF( hw->FvC.y, v2->y + _GlideRoot.pool.f1); - - grSetVertexParameter(v1); - - GR_SETF( hw->Fdady , -v1->a ); - dp = tmp1 * dx; - GR_SETF( hw->Fdadx , dp ); - P6FENCE_CMD( GR_SETF( hw->FtriangleCMD, dx ) ); - - /* 4th triangle V1-V2-F*/ - GR_SETF( hw->FvB.x, v2->x); - dp = v1->a - v2->a + tmp2; - GR_SETF( hw->FvB.y, v2->y); - dp *= dx; - - grSetVertexParameter(v1); - - GR_SETF( hw->Fdadx , dp ); - GR_SETF( hw->Fdady , -v2->a ); - P6FENCE_CMD( GR_SETF( hw->FtriangleCMD, -dx ) ); - - } else { /* Y major line */ - - if (dy == 0.0f) - return; - - /* 1st triangle v1-v2-b */ - GR_SETF( hw->FvA.x, v1->x); - tmp1 = v1->a * dx; - GR_SETF( hw->FvA.y, v1->y); - tmp2 = v2->a * dx; - GR_SETF( hw->FvB.x, v2->x); - dy = - 1.0f / dy; - GR_SETF( hw->FvB.y, v2->y); - GR_SETF( hw->FvC.x, v2->x - _GlideRoot.pool.f1); - dlp = gc->dataList; - GR_SETF( hw->FvC.y, v2->y); - i = dlp->i; - while (i) { - fp = dlp->addr; - if (i & 1) { /* packer bug check */ - if (i & 2) P6FENCE; - GR_SETF( fp[0], 0.0f); - if (i & 2) P6FENCE; - dlp++; - i = dlp->i; - } - else { - dp = FARRAY(v1,i); - GR_SETF( fp[0], dp ); - dp -= FARRAY(v2, i); - GR_SETF( fp[DPDX_OFFSET>>2] , _GlideRoot.pool.f0); - dlp++; - i = dlp->i; - GR_SETF( fp[DPDY_OFFSET>>2] , dp * dy ); - } - } - dp = (v1->a - tmp2 - v2->a); - GR_SETF( hw->Fdadx , v2->a ); - dp *= dy; - GR_SETF( hw->Fdady , dp ); - P6FENCE_CMD( GR_SETF( hw->FtriangleCMD, -dy ) ); - - /* 2nd triangle v1-a-b */ - - GR_SETF( hw->FvB.x, v1->x - _GlideRoot.pool.f1); - GR_SETF( hw->FvB.y, v1->y); - grSetVertexParameter(v1); - GR_SETF( hw->Fdadx , v1->a ); - dp = - tmp1 * dy; - GR_SETF( hw->Fdady , dp ); - P6FENCE_CMD( GR_SETF( hw->FtriangleCMD, dy ) ); - - /* 3rd triangle e-v1-v2 */ - GR_SETF( hw->FvA.x, v1->x + _GlideRoot.pool.f1); - dp = (v1->a - v2->a + tmp1); - GR_SETF( hw->FvB.x, v1->x); - dp *= dy; - GR_SETF( hw->FvC.x, v2->x); - - grSetVertexParameter(v1); - GR_SET( hw->Fa , 0 ); - GR_SETF( hw->Fdadx , -v1->a ); - GR_SETF( hw->Fdady , dp ); - P6FENCE_CMD( GR_SETF( hw->FtriangleCMD, dy ) ); - - /* 4th triangle e-f-v2 */ - GR_SETF( hw->FvB.x, v2->x + _GlideRoot.pool.f1); - GR_SETF( hw->FvB.y, v2->y); - - grSetVertexParameter(v1); - GR_SET( hw->Fa , 0 ); - - GR_SETF( hw->Fdadx , -v2->a ); - dp = tmp2 * dy; - GR_SETF( hw->Fdady , dp ); - P6FENCE_CMD( GR_SETF( hw->FtriangleCMD, -dy ) ); - - } - GR_END(); -} /* grAADrawLine */ - -typedef enum { - aaEdgeSenseTop, - aaEdgeSenseLeft, - aaEdgeSenseBottom, - aaEdgeSenseRight -} aaEdgeSense; - -/* -** grAADrawTriEdgeSense -** -** This routine combines aaCalcEdgeSense(), grAADrawTriEdge(), and -** grAADrawEdgeTriangle(). The goal is to -** 1. reduce the number of divide from 3 to 1 -** 2. minimize pci write command. -*/ -static void -grAADrawTriEdgeSense(const GrVertex *a,const GrVertex *b,const GrVertex *c) -{ - const GrVertex *tv; - float dx, dy, m, dp; - aaEdgeSense sense; - - GR_BEGIN_NOFIFOCHECK("grAADrawTriEdgeSense",gc->myLevel); - - - if (a->y >= b->y) { - tv = a; a = b; b = tv; - } - dx = a->x - b->x; - dy = a->y - b->y; - - if (dx == 0.f) { - if (c->x > a->x) - sense = aaEdgeSenseLeft; - else - sense = aaEdgeSenseRight; - } - else if (dy == 0.0f) { - if (c->y > a->y) - sense = aaEdgeSenseBottom; - else - sense = aaEdgeSenseTop; - } - else { - float dcax, dcay, dcbx, dcby, cp; - dcax = a->x - c->x; - dcay = a->y - c->y; - dcbx = b->x - c->x; - dcby = b->y - c->y; - cp = dcax * dcby - dcay * dcbx; - - if (dx > 0.0f) { - if (dx >= -dy) /* X-major line */ - sense = (cp > 0) ? aaEdgeSenseTop : aaEdgeSenseBottom; - else /* Y-major line */ - sense = (cp > 0) ? aaEdgeSenseRight : aaEdgeSenseLeft; - } - else { - if (dx <= dy) /* X-major line */ - sense = (cp < 0) ? aaEdgeSenseTop : aaEdgeSenseBottom; - else /* Y-major line */ - sense = (cp < 0) ? aaEdgeSenseLeft : aaEdgeSenseRight; - } - } - - switch (sense) { - case aaEdgeSenseTop: - /* pci comamnd 14 + 2 * n */ - GR_SET_EXPECTED_SIZE(_GlideRoot.curTriSizeNoGradient << 1); - GR_SETF( hw->FvA.x, a->x); - GR_SETF( hw->FvA.y, a->y); - GR_SETF( hw->FvB.x, a->x); - GR_SETF( hw->FvC.x, b->x); - m = 1.0f / dx; - GR_SETF( hw->FvB.y, a->y + _GlideRoot.pool.f1); - dp = a->a * dy; - GR_SETF( hw->FvC.y, b->y + _GlideRoot.pool.f1); - - grSetVertexParameter(a); - - GR_SETF( hw->Fdady, -a->a); - dp *= m; - GR_SETF( hw->Fdadx, dp); - P6FENCE_CMD( GR_SETF( hw->triangleCMD, dx ) ); - - dp = b->a * dy; - GR_SETF( hw->FvB.x, b->x); - dp = a->a - b->a + dp; - GR_SETF( hw->FvB.y, b->y); - - grSetVertexParameter(a); - - GR_SETF( hw->Fdady, -b->a); - dp *= m; - GR_SETF( hw->Fdadx, dp); - P6FENCE_CMD( GR_SETF( hw->triangleCMD, -dx ) ); - - break; - - case aaEdgeSenseLeft: - /* pci comamnd 16 + 2 * n */ - GR_SET_EXPECTED_SIZE(8+(_GlideRoot.curTriSizeNoGradient << 1)); - GR_SETF( hw->FvA.y, a->y); - GR_SETF( hw->FvB.x, a->x); - GR_SETF( hw->FvB.y, a->y); - GR_SETF( hw->FvC.y, b->y); - m = 1.0f / dy; - GR_SETF( hw->FvA.x, a->x - _GlideRoot.pool.f1); - GR_SETF( hw->FvC.x, b->x - _GlideRoot.pool.f1); - - grSetVertexParameter(a); - GR_SET(hw->Fa, 0); - - GR_SETF( hw->Fdadx, a->a); - dp = - a->a * dx * m; - GR_SETF( hw->Fdady, dp); - P6FENCE_CMD( GR_SETF( hw->triangleCMD, -dy ) ); - - GR_SETF( hw->FvA.x, a->x); - dp = b->a * dx; - GR_SETF( hw->FvB.x, b->x); - dp = a->a - dp - b->a; - GR_SETF( hw->FvB.y, b->y); - - grSetVertexParameter(a); - - GR_SETF( hw->Fdadx, b->a); - dp *= m; - GR_SETF( hw->Fdady, dp); - P6FENCE_CMD( GR_SETF( hw->triangleCMD, -dy ) ); - - break; - - case aaEdgeSenseBottom: - - if (dy < -1.0f) { - /* pci comamnd 17 + 2 * n */ - GR_SET_EXPECTED_SIZE(12+(_GlideRoot.curTriSizeNoGradient << 1)); - GR_SETF( hw->FvA.x, a->x); - GR_SETF( hw->FvB.x, a->x); - GR_SETF( hw->FvB.y, a->y); - GR_SETF( hw->FvC.x, b->x); - m = 1.0f / dx; - GR_SETF( hw->FvA.y, a->y - _GlideRoot.pool.f1); - GR_SETF( hw->FvC.y, b->y - _GlideRoot.pool.f1); - - grSetVertexParameter(a); - GR_SET(hw->Fa, 0); - - dp = a->a * dy; - dp *= m; - GR_SETF( hw->Fdadx, -dp); - GR_SETF( hw->Fdady, a->a); - P6FENCE_CMD( GR_SETF( hw->triangleCMD, dx ) ); - - GR_SETF( hw->FvA.y, a->y); - dp = b->a * dy; - GR_SETF( hw->FvB.x, b->x); - GR_SETF( hw->FvB.y, b->y - _GlideRoot.pool.f1); - dp = a->a - b->a - dp; - GR_SETF( hw->FvC.y, b->y); - grSetVertexParameter(a); - - GR_SETF( hw->Fdady, b->a); - dp *= m; - GR_SETF( hw->Fdadx, dp); - P6FENCE_CMD( GR_SETF( hw->triangleCMD, -dx ) ); - } - else if (dy == 0.0f) { - - /* pci comamnd 16 + 2 * n */ - GR_SET_EXPECTED_SIZE(8+(_GlideRoot.curTriSizeNoGradient << 1)); - GR_SETF( hw->FvA.x, a->x); - GR_SETF( hw->FvC.x, b->x); - GR_SETF( hw->FvC.y, b->y); - GR_SETF( hw->FvB.x, b->x); - m = 1.0f / dx; - GR_SETF( hw->FvA.y, a->y - _GlideRoot.pool.f1); - GR_SETF( hw->FvB.y, b->y - _GlideRoot.pool.f1); - - grSetVertexParameter(a); - GR_SET(hw->Fa, 0); - - GR_SET( hw->Fdadx, 0); - GR_SETF( hw->Fdady, b->a); - P6FENCE_CMD( GR_SETF( hw->triangleCMD, -dx ) ); - - GR_SETF( hw->FvB.x, a->x); - GR_SETF( hw->FvB.y, a->y); - grSetVertexParameter(a); - GR_SET(hw->Fa, 0); - - dp = a->a - b->a; - GR_SETF( hw->Fdady, a->a); - dp *= m; - GR_SETF( hw->Fdadx, dp); - P6FENCE_CMD( GR_SETF( hw->triangleCMD, dx ) ); - } - else { - - /* pci comamnd 20 + 2 * n */ - GR_SET_EXPECTED_SIZE(24+(_GlideRoot.curTriSizeNoGradient << 1)); - GR_SETF( hw->FvA.x, a->x); - GR_SETF( hw->FvB.x, b->x); - GR_SETF( hw->FvC.x, a->x); - GR_SETF( hw->FvC.y, a->y); - m = 1.0f / dx; - GR_SETF( hw->FvA.y, a->y - _GlideRoot.pool.f1); - GR_SETF( hw->FvB.y, b->y - _GlideRoot.pool.f1); - - grSetVertexParameter(a); - GR_SET(hw->Fa, 0); - - dp = -a->a * dy * m; - GR_SETF( hw->Fdadx, dp); - GR_SETF( hw->Fdady, a->a); - P6FENCE_CMD( GR_SETF( hw->triangleCMD, -dx ) ); - - GR_SETF( hw->FvA.x, b->x); - GR_SETF( hw->FvA.y, b->y - _GlideRoot.pool.f1); - GR_SETF( hw->FvB.x, a->x); - GR_SETF( hw->FvB.y, a->y); - dp = b->a * dy; - GR_SETF( hw->FvC.x, b->x); - GR_SETF( hw->FvC.y, b->y); - - grSetVertexParameter(b); - GR_SET(hw->Fa, 0); - dp = a->a - dp - b->a; - GR_SETF( hw->Fdady, b->a); - dp *= m; - GR_SETF( hw->Fdadx, dp); - P6FENCE_CMD( GR_SETF( hw->triangleCMD, dx ) ); - } - - break; - case aaEdgeSenseRight: - /* pci comamnd 16 + 2 * n */ - GR_SET_EXPECTED_SIZE(8+(_GlideRoot.curTriSizeNoGradient << 1)); - GR_SETF( hw->FvA.y, a->y); - GR_SETF( hw->FvB.x, a->x); - GR_SETF( hw->FvB.y, a->y); - GR_SETF( hw->FvC.y, b->y); - m = 1.0f / dy; - GR_SETF( hw->FvA.x, a->x + _GlideRoot.pool.f1); - GR_SETF( hw->FvC.x, b->x + _GlideRoot.pool.f1); - - grSetVertexParameter(a); - GR_SET(hw->Fa, 0); - - dp = a->a * dx; - GR_SETF( hw->Fdadx, -a->a); - dp *= m; - GR_SETF( hw->Fdady, dp); - P6FENCE_CMD( GR_SETF( hw->triangleCMD, dy ) ); - - GR_SETF( hw->FvA.x, a->x); - dp = b->a * dx; - GR_SETF( hw->FvB.x, b->x); - dp = dp + a->a - b->a; - GR_SETF( hw->FvB.y, b->y); - grSetVertexParameter(a); - - GR_SETF( hw->Fdadx, -b->a); - dp *= m; - GR_SETF( hw->Fdady, dp); - P6FENCE_CMD( GR_SETF( hw->triangleCMD, dy ) ); - break; - } - GR_END_SLOPPY(); -} /* grAADrawTriEdge */ - -#if 0 -/* -** aaCalculateSignOfSinTheta -** -*/ -float -aaCalculateSignOfSinTheta(GrVertex *a, GrVertex *b, GrVertex *c) -{ - float - x1, y1, x2, y2; - - /* - Now, we make two vectors: ab [x1 y1] and ac [x2 y2] - Fromt the cross product, we know that - - x1*y2 - x2*y1 = |ab|*|ac|*sin(theta), where theta is the angle - between the two lines. If sin(theta) > 0, c is above the line ab, - and if it's negative, it's below ab. - */ - x1 = b->x - a->x; - y1 = b->y - a->y; - - x2 = c->x - a->x; - y2 = c->y - a->y; - - return ((x1 * y2) - (x2 * y1)); - -} /* aaCalculateSignOfSinTheta */ -#endif - - -/*--------------------------------------------------------------------------- -** grAADrawTriangle -** -** NOTE: This doesn't quite work yet -*/ -GR_ENTRY(grAADrawTriangle, void, (const GrVertex *a, const GrVertex *b, const GrVertex *c, FxBool ab_antialias, FxBool bc_antialias, FxBool ca_antialias ) ) -{ - FxU32 - fbzMode, /* What we write to fbzMode */ - fbzModeOld; /* Squirrel away current fbzMode */ - - GR_BEGIN_NOFIFOCHECK("grAADrawTriangle",96); - GDBG_INFO_MORE((gc->myLevel,"(0x%x,0x%x,0x%x,%d,%d,%d)\n", - a,b,c,ab_antialias,bc_antialias,ca_antialias)); - - fbzModeOld = gc->state.fbi_config.fbzMode; - if ( TRISETUP ( a, b, c ) <= 0) {/* backfaced or zero area */ - GR_END(); - return; - } - /* Disable depth buffer writes for edge triangles */ - fbzMode = fbzModeOld; - fbzMode &= ~(SST_ZAWRMASK); - GR_SET_EXPECTED_SIZE(4); - GR_SET( hw->fbzMode, fbzMode ); - GR_CHECK_SIZE(); - - if ( ab_antialias ) { - grAADrawTriEdgeSense(a, b, c); - } - - if ( bc_antialias ) { - grAADrawTriEdgeSense(b, c, a); - } - - if ( ca_antialias ) { - grAADrawTriEdgeSense(c, a, b); - } - - /* Restore the old fbzMode */ - GR_SET_EXPECTED_SIZE(4); - GR_SET( hw->fbzMode, fbzModeOld ); - GR_END(); -} /* grAADrawTriangle */ - -/*--------------------------------------------------------------------------- -** grAADrawPolygon -** NOTE: This routine does not do backface culling!!! -*/ - -GR_ENTRY(grAADrawPolygon, void, (const int nverts, const int ilist[], const GrVertex vlist[])) -{ - int - i = 1; /* index into ilist */ - const GrVertex - *a, *b, *c; /* What we end up sending */ - - GR_BEGIN_NOFIFOCHECK("grAADrawPolygon",97); - GDBG_INFO_MORE((gc->myLevel,"(%d,0x%x,0x%x)\n",nverts,ilist,vlist)); - - for (i=1; i < nverts - 1; i++) { - a = &vlist[ilist[0]]; - b = &vlist[ilist[i]]; - c = &vlist[ilist[i+1]]; - if ( TRISETUP ( a, b, c ) <= 0 ) /* backfaced or zero area */ - continue; - - /* - ** Always draw the BC edge. - ** On the first triangle, additionally draw the AB edge. - ** On the last triangle, draw the CA edge. - */ - if (i == 1) { - grAADrawTriEdgeSense(a, b, c); - - } else if (i == (nverts - 2)) { - grAADrawTriEdgeSense(c, a, b); - } - - grAADrawTriEdgeSense(b, c, a); - - } - GR_END(); -} /* grAADrawPolygon */ - -/*--------------------------------------------------------------------------- -** grAADrawPolygonVertexList -** NOTE: This routine does not do backface culling!!! -*/ - -GR_ENTRY(grAADrawPolygonVertexList, void, (const int nverts, const GrVertex vlist[])) -{ - int - i = 1; /* index into ilist */ - const GrVertex - *a, *b, *c; /* What we end up sending */ - FxI32 - res; - - GR_BEGIN_NOFIFOCHECK("grAADrawPolygonVertexList",97); - GDBG_INFO_MORE((gc->myLevel,"(%d,0x%x)\n",nverts,vlist)); - - for (i=1; i < nverts - 1; i++) { - a = &vlist[0]; - b = &vlist[i]; - c = &vlist[i+1]; - - res = TRISETUP ( a, b, c ); - if (res <= 0) /* backfaced or zero area */ - continue; - - /* - ** Always draw the BC edge. - ** On the first triangle, additionally draw the AB edge. - ** On the last triangle, draw the CA edge. - */ - if (i == 1) { - grAADrawTriEdgeSense(a, b, c); - } else if (i == (nverts - 2)) { - grAADrawTriEdgeSense(c, a, b); - } - - grAADrawTriEdgeSense(b, c, a); - - } - GR_END(); -} /* grAADrawPolygonVertexList */ - - - diff --git a/glide2x/sst1/glide/src/gbanner.c b/glide2x/sst1/glide/src/gbanner.c deleted file mode 100644 index 597f031..0000000 --- a/glide2x/sst1/glide/src/gbanner.c +++ /dev/null @@ -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 -** -** $Header$ -** $Log$ - * - * 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 - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -#ifdef GLIDE_PLUG -#include "banner.inc" -#endif - -/* display the translucent 3Dfx powerfield logo */ -void -_grShamelessPlug( void ) -{ -#ifdef GLIDE_PLUG - GrState state; - GrLfbInfo_t info; - - GR_BEGIN_NOFIFOCHECK("_grShamelessPlug",80); - GDBG_INFO_MORE((gc->myLevel,"()\n")); - -#if ( GLIDE_PLATFORM & GLIDE_HW_SST1 ) - 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 ); - - grChromakeyValue( 0x0000 ); - grChromakeyMode( GR_CHROMAKEY_ENABLE ); - grLfbConstantAlpha( (FxU8) 90); - grLfbWriteColorFormat(GR_COLORFORMAT_ARGB); - - /* Attempt to lock with pixpipe enabled */ - info.size = sizeof( info ); - if ( grLfbLock( GR_LFB_WRITE_ONLY, GR_BUFFER_BACKBUFFER, - GR_LFBWRITEMODE_565,GR_ORIGIN_UPPER_LEFT, - FXTRUE, &info ) ) { - FxU32 *dstData; - FxU32 dstJump; - FxU32 *srcData; - FxI32 srcJump; - FxU32 srcScanlineLength; - FxU32 scrWidth = gc->state.screen_width; - FxU32 scrHeight = gc->state.screen_height; - - FxU32 scanline; - - /* Draw Banner in lower right of screen */ - if ( scrWidth < (FxU32)banner_width ) return; - if ( scrHeight < (FxU32)banner_height ) return; - - dstData = info.lfbPtr; - dstData = (FxU32*)( ((char*)dstData) + - (info.strideInBytes*((scrHeight-1)-banner_height)) + - ((scrWidth-banner_width)<<1) ); - dstJump = ((info.strideInBytes >> 1) - banner_width)>>1; - srcData = (FxU32*)&banner_data[banner_width*(banner_height-1)]; - srcScanlineLength = banner_width>>1; - srcJump = (-banner_width); - - for( scanline = 0; scanline < (FxU32)banner_height; scanline++ ) { - FxU32 *end = srcData + srcScanlineLength; - while( srcData < end ) *dstData++ = *srcData++; - dstData += dstJump; - srcData += srcJump; - } - - grLfbUnlock( GR_LFB_WRITE_ONLY, GR_BUFFER_BACKBUFFER ); - } - grGlideSetState( &state ); - -#elif ( GLIDE_PLATFORM & GLIDE_HW_SST96 ) - FXUNUSED( state ); - info.size = sizeof( info ); - if ( grLfbLock( GR_LFB_WRITE_ONLY, GR_BUFFER_BACKBUFFER, - GR_LFBWRITEMODE_565,GR_ORIGIN_UPPER_LEFT, - FXFALSE, &info ) ) { - - FxU16 *dstData; - FxU32 dstJump; - FxU16 *srcData; - FxI32 srcJump; - FxU32 srcScanlineLength; - FxU32 scrWidth = gc->state.screen_width; - FxU32 scrHeight = gc->state.screen_height; - - FxU32 scanline; - - /* Draw Banner in lower right of screen */ - if ( scrWidth < (FxU32)banner_width ) return; - if ( scrHeight < (FxU32)banner_height ) return; - - dstData = info.lfbPtr; - dstData = (FxU16*)( ((char*)dstData) + - (info.strideInBytes*((scrHeight-1)-banner_height)) + - ((scrWidth-banner_width)<<1) ); - dstJump = ((info.strideInBytes >> 1) - banner_width); - srcData = (FxU16*)&banner_data[banner_width*(banner_height-1)]; - srcScanlineLength = banner_width; - srcJump = (-banner_width)*2; - - for( scanline = 0; scanline < (FxU32)banner_height; scanline++ ) { - FxU16 *end = srcData + srcScanlineLength; - while( srcData < end ) { - if ( *srcData ) - *dstData = *srcData; - dstData++; - srcData++; - } - dstData += dstJump; - srcData += srcJump; - } - - grLfbUnlock( GR_LFB_WRITE_ONLY, GR_BUFFER_BACKBUFFER ); - } - -#else -# error "Shameless Plug Unimplemented on this Hardware" -#endif - - - GR_END(); -#endif -} /* _grShamelessPlug */ diff --git a/glide2x/sst1/glide/src/gdraw.c b/glide2x/sst1/glide/src/gdraw.c deleted file mode 100644 index 2761282..0000000 --- a/glide2x/sst1/glide/src/gdraw.c +++ /dev/null @@ -1,528 +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$ -** -** 31 6/02/98 8:03p Peter -** Mmmmm.... points - * - * 30 9/07/97 1:52p Atai - * performance tuning for previous check-in - * - * 29 9/05/97 7:20p Atai - * fixed bug 764 (grDrawPoint integer snapping). - * - * 28 6/20/97 5:51p Dow - * Moved grDebugGroupWriteHEader to sst96.c - * - * 27 5/27/97 11:37p Pgj - * Fix for Bug report 545 - * - * 26 5/27/97 2:00p Dow - * Parenthesized a ternary op in GR_BEGIN to work around a Watcom compiler - * bug. - * - * 25 3/21/97 12:42p Dow - * Made STWHints not send the Bend Over Baby Packet to FBI Jr. - * - * 24 3/04/97 9:08p Dow - * Neutered multiplatform multiheaded monster - * - * 23 2/18/97 9:51a Jdt - * Ifdefed out some if(0) code to supress watcom warnings - * - * 22 12/23/96 1:37p Dow - * chagnes for multiplatform glide - * - * 21 11/18/96 12:13p Jdt - * Made all debugging code go through the C-call to the assembly trisetup - * code. - * - * 20 11/14/96 11:52p Jdt - * Fixed Watcom Assembly calling bug -** -*/ -#include <3dfx.h> - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -#include - -#define SST_XY_HALF ( 1 << ( SST_XY_FRACBITS - 1 ) ) -#define SST_XY_ONE ( 1 << SST_XY_FRACBITS ) - -#define OUTBOUNDSX(a) ((a->x < 0.f ? 1 : 0) || (a->x > gc->state.screen_width ? 1 : 0)) -#define OUTBOUNDSY(a) ((a->y < 0.f ? 1 : 0) || (a->y > gc->state.screen_height ? 1 : 0)) -#define OUTBOUNDS(a) (OUTBOUNDSX(a) || OUTBOUNDSY(a)) - -/* access a floating point array with a byte index */ -#define FARRAY(p,i) (*(float *)((i)+(int)(p))) - -/*--------------------------------------------------------------------------- - NOTE: by Gary Tarolli - - The following code is very carefully scheduled for MSVC4.2 Version 10.20.6166 - The trick is to schedule operations between PCI writes (GR_SET*). - This is because PCI writes cannot get off the CPU chip quickly and there - are about 6-12 dead clocks between back-to-back writes (P-90 to P-166). - So we try to do useful work during this time - this makes the code hard to - read because simple operations like mem++ may be broken up into three lines - of C code to perform, to allow the compiler to move the pieces around more. - PLEASE PLEASE PLEASE don't touch this code without benchmarkng it before - and after you touch it. Moving a line of code up/down changes performance! - ---------------------------------------------------------------------------*/ - - -/*--------------------------------------------------------------------------- -** grDrawPoint -*/ - -GR_ENTRY(grDrawPoint, void, ( const GrVertex *p )) -{ - int i, x,y; - struct dataList_s *dlp; - - /* GMT: gross overestimate of fifo requirements */ - GR_BEGIN("grDrawPoint",90,_GlideRoot.curTriSize); - GDBG_INFO_MORE((gc->myLevel,"(0x%x)\n",p));\ - - /* we snap to an integer by adding a large enough number that it - * shoves all fraction bits off the right side of the mantissa. - * - * NB: IEEE rounds to nearest integer by default, but applications - * can change the rounding mode so that it is difficult to get the - * correct truncation/ceiling operation w/ a simple adjustment to - * the bias. - * - * NB: The constant kNumMantissaBits defines how many bits of - * integer precision a coordinate can have. This needs to be atleast - * as large as the maximum hw screen resolution. We later use this - * to compute a logical 1/2 value to fill an entire pixel. - */ -#define kNumMantissaBits 18UL - { - const float bias = (const float)(3UL << kNumMantissaBits); - - /* Convert to 32-bit representation */ -#define FP_TRUNC_BIAS(__fpVal, __fpBias) \ - ((__fpVal) < (__fpBias) ? (float)((__fpVal) + (__fpBias)) : (__fpVal)) - _GlideRoot.pool.ftemp1 = FP_TRUNC_BIAS(p->x, bias); - _GlideRoot.pool.ftemp2 = FP_TRUNC_BIAS(p->y, bias); - - /* Mask off the real fractional bits from the mantissa */ - x = ((*(FxU32*)&_GlideRoot.pool.ftemp1 & (0xFFFFFFFFUL << (22UL - kNumMantissaBits))) + - (0x01UL << (21UL - kNumMantissaBits))); - y = ((*(FxU32*)&_GlideRoot.pool.ftemp2 & (0xFFFFFFFFUL << (22UL - kNumMantissaBits))) + - (0x01UL << (21UL - kNumMantissaBits))); - } - -#ifdef GLIDE_USE_ALT_REGMAP - hw = SST_WRAP(hw,128); /* use alternate register mapping */ -#endif - - _GlideRoot.stats.pointsDrawn++; - - /* draw a little triangle, with the lower left corner at pixel center */ - GR_SET( hw->vA.x, x ); - GR_SET( hw->vA.y, y ); - - x += (0x01UL << (21UL - kNumMantissaBits)); - GR_SET( hw->vB.x, x ); - GR_SET( hw->vB.y, y ); - - y += (0x01UL << (21UL - kNumMantissaBits)); - GR_SET( hw->vC.y, y ); - GR_SET( hw->vC.x, x ); - - /* we don't care what the slopes are because the pixel center that is drawn */ - /* is exactly at vertex A - isn't that wonderful */ - dlp = gc->dataList; - i = dlp->i; - while (i) { - if (i & 1) { /* packer bug check */ - if (i & 2) P6FENCE; - GR_SETF( *dlp->addr, 0.0F ); - if (i & 2) P6FENCE; - } - else - GR_SETF( *dlp->addr, FARRAY(p,i) ); - dlp++; - i = dlp->i; - } - P6FENCE_CMD( GR_SET( hw->triangleCMD, 0x0000001UL) ); - - GR_END_SLOPPY(); -} /* grDrawPoint */ - -/*--------------------------------------------------------------------------- -** grDrawLine -** -** NOTE: 1. this will not fill the last pixel in line because -** B2 or C is on the right edge and the right edge is not -** drawn. -** (0,0) -** -** A(x1,y1-0.5)+ -** | \ -** | \ \ -** (x1,y1)* \ -** | * \ -** | *\ \ -** B1(x1,y1+0.5)+ * \ -** \ \ * +B2(x2,y2-0.5) -** \ * | -** \ \ * | -** \ \ + (x2,y2) -** \ | -** \ | -** +C(x2,y2+0.5) -*/ - -GR_ENTRY(grDrawLine, void, ( const GrVertex *a, const GrVertex *b )) -{ - float m, dp; - #define DX _GlideRoot.pool.ftemp1 - #define ADY _GlideRoot.pool.ftemp2 - - int i,j; - float *fp; - struct dataList_s *dlp; - - - GR_BEGIN("grDrawLine",91,12+ _GlideRoot.curTriSize); - GDBG_INFO_MORE((gc->myLevel,"(0x%x,0x%x)\n",a,b)); - -#ifdef GLIDE_USE_ALT_REGMAP - hw = SST_WRAP(hw,128); /* use alternate register mapping */ -#endif - /* - ** compute absolute deltas and draw from low Y to high Y - */ - ADY = b->y - a->y; - i = *(long *)&ADY; - if ( i < 0 ) { - const GrVertex *tv; - tv = a; a = b; b = tv; - i ^= 0x80000000; /* ady = -ady; */ - (*(long *)&ADY) = i; - } - - DX = b->x - a->x; - j = *(long *)&DX; - if (j < 0 ) { - j ^= 0x80000000; /* adx = -adx; */ - } - - /* - ** X major line - */ - if (j >= i ) { /* if (adx > ady) */ - if (j == 0) goto all_done; /* check for zero-length lines */ - /* start up divide and overlap with as much integer stuff as possible*/ - m = _GlideRoot.pool.f1 / DX; - dlp = gc->dataList; - GR_SETF(hw->FvA.x,a->x); - dp = b->x; - GR_SETF(hw->FvB.x,dp); - GR_SETF(hw->FvC.x,dp) - _GlideRoot.stats.linesDrawn++; - - GR_SETF(hw->FvA.y,a->y - _GlideRoot.pool.fHalf); - - dp = b->y; - GR_SETF(hw->FvB.y,dp - _GlideRoot.pool.fHalf); - - i = dlp->i; - GR_SETF(hw->FvC.y,dp + _GlideRoot.pool.fHalf); - - while (i) { - fp = dlp->addr; - if (i & 1) { /* packer bug check */ - if (i & 2) P6FENCE; - GR_SETF( fp[0], 0.0f); - if (i & 2) P6FENCE; - dlp++; - i = dlp->i; - } - else { - dp = FARRAY(a,i); - GR_SETF( fp[0], dp ); - dp = FARRAY(b,i) - dp; - GR_SETF( fp[DPDX_OFFSET>>2] , dp * m ); - dlp++; - i = dlp->i; - GR_SETF( fp[DPDY_OFFSET>>2] , _GlideRoot.pool.f0 ); - } - } - P6FENCE_CMD( GR_SETF(hw->FtriangleCMD,_GlideRoot.pool.ftemp1) ); - - GR_SETF(hw->FvB.x,a->x); - GR_SETF(hw->FvB.y,a->y + _GlideRoot.pool.fHalf); - P6FENCE_CMD( GR_SETF(hw->FtriangleCMD,-_GlideRoot.pool.ftemp1)); - } - - /* - ** Y major line - */ - else { - m = _GlideRoot.pool.f1 / ADY; - dlp = gc->dataList; - GR_SETF(hw->FvA.y,a->y); - dp = b->y; - GR_SETF(hw->FvB.y,dp); - _GlideRoot.stats.linesDrawn++; - GR_SETF(hw->FvC.y,dp); - - GR_SETF(hw->FvA.x,a->x - _GlideRoot.pool.fHalf); - - dp = b->x; - GR_SETF(hw->FvB.x,dp - _GlideRoot.pool.fHalf); - - i = dlp->i; - GR_SETF(hw->FvC.x,dp + _GlideRoot.pool.fHalf); - - while (i) { - fp = dlp->addr; - if (i & 1) { /* packer bug check */ - if (i & 2) P6FENCE; - GR_SETF( fp[0], 0.0f ); - if (i & 2) P6FENCE; - dlp++; - i = dlp->i; - } - else { - dp = FARRAY(a,i); - GR_SETF( fp[0], dp ); - dp = FARRAY(b,i) - dp; - GR_SETF( fp[DPDX_OFFSET>>2] , _GlideRoot.pool.f0 ); - dlp++; - i = dlp->i; - GR_SETF( fp[DPDY_OFFSET>>2] , dp * m ); - } - } - P6FENCE_CMD( GR_SET( hw->triangleCMD, 0xFFFFFFFF) ); - - GR_SETF(hw->FvB.x,a->x + _GlideRoot.pool.fHalf); - GR_SETF(hw->FvB.y,a->y); - P6FENCE_CMD( GR_SET( hw->triangleCMD, 1) ); - } - - GR_END_SLOPPY(); - return; - -all_done: /* come here on degenerate lines */ - _GlideRoot.stats.linesDrawn++; - GR_END_SLOPPY(); -} /* grDrawLine */ - -/*--------------------------------------------------------------------------- -** grDrawTriangle -*/ - -#if !defined(__linux__) || defined(GLIDE_USE_C_TRISETUP) || defined(GLIDE_DEBUG) -GR_ENTRY(grDrawTriangle, void, ( const GrVertex *a, const GrVertex *b, const GrVertex *c )) -{ -#if defined(GLIDE_USE_C_TRISETUP) || defined( __WATCOMC__ ) || defined( GLIDE_DEBUG ) - GR_BEGIN_NOFIFOCHECK("grDrawTriangle",92); - 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"); - - /* Silly warning killer */ - if ( 0 ) goto all_done; - -#ifdef GLIDE_DEBUG -#if 0 -if (0) { /* GMT: only use this if needed */ - FxU32 statBits; /* bits we care about in status register */ - FxU32 status; - - status = GR_GET(hw->status); - if ((statBits = status & SST_FIFOLEVEL) < _GlideRoot.stats.minPciFIFOFree) - _GlideRoot.stats.minPciFIFOFree = statBits; - - statBits = (status >> SST_MEMFIFOLEVEL_SHIFT) & 0xffff; - if (statBits < _GlideRoot.stats.minMemFIFOFree) - _GlideRoot.stats.minMemFIFOFree = statBits; -} -#endif - - if (_GlideRoot.environment.triBoundsCheck) { - if (OUTBOUNDS(a) || OUTBOUNDS(b) || OUTBOUNDS(c)) { - GDBG_PRINTF(("Triangle out of bounds:\n")); - GDBG_PRINTF(("a->x = %3.2f, a->y = %3.2f\n", a->x, a->y)); - GDBG_PRINTF(("b->x = %3.2f, b->y = %3.2f\n", b->x, b->y)); - GDBG_PRINTF(("c->x = %3.2f, c->y = %3.2f\n", c->x, c->y)); - GDBG_PRINTF(("Culling triangle based on these bogus values.\n")); - goto all_done; - } - } -#endif /* GLIDE_DEBUG */ - - /* _trisetup and _trisetup_asm return 0 if culled, 1 if drawn */ - TRISETUP( a, b, c ); - -all_done: - GR_END(); -#else -#if defined( __linux__ ) - asm("jmp grDrawTriangle_asm"); -#endif -# if defined( __MSC__ ) - extern void grDrawTriangle_asm(void); - {_asm jmp grDrawTriangle_asm} -# endif -#endif -} /* grDrawTriangle */ -#endif - -/*--------------------------------------------------------------------------- -** grDrawPlanarPolygon -** -** Brute force "triangle-fan" implementation of a convex polygon drawer. -*/ - -GR_ENTRY(grDrawPlanarPolygon, void, ( int nverts, const int ilist[], const GrVertex vlist[] )) -{ -#if 1 - int n,i = nverts-2; - const GrVertex *firstv = &vlist[ilist[0]]; - - GR_BEGIN_NOFIFOCHECK("grDrawPlanarPolygon",93); - GDBG_INFO_MORE((gc->myLevel,"(%d,0x%x,0x%x)\n",nverts,ilist,vlist)); - GR_CHECK_F(myName, !ilist || !vlist, "NULL pointer passed"); - - for ( i = 1; i < nverts - 1; i++ ) { - n = TRISETUP( firstv, &vlist[ilist[i]], &vlist[ilist[i+1]] ); - if (n > 0) break; /* stop after 1st non-zero-area triangle */ - if (n < 0) goto all_done; - } - /* now all the gradients are loaded into the chip, so we just have to */ - /* draw all the rest of the triangles */ - for ( i = i+1; i < nverts - 1; i++ ) { - _trisetup_nogradients( firstv, &vlist[ilist[i]], &vlist[ilist[i+1]] ); - } - -all_done: - GR_END(); -#else - grDrawPolygon(nverts, ilist, vlist); -#endif -} /* grDrawPlanarPolygon */ - -/*--------------------------------------------------------------------------- -** grDrawPlanarPolygonVertexList -** -** Brute force "triangle-fan" implementation of a convex polygon drawer. -*/ - -GR_ENTRY(grDrawPlanarPolygonVertexList, void, ( int nverts, const GrVertex vlist[] )) -{ -#if 1 - int n,i = nverts-2; - const GrVertex *firstv = &vlist[0]; - - GR_BEGIN_NOFIFOCHECK("grDrawPlanarPolygonVertexList",93); - GDBG_INFO_MORE((gc->myLevel,"(%d,0x%x)\n",nverts,vlist)); - GR_CHECK_F(myName, !vlist, "NULL pointer passed"); - - for ( i = 1; i < nverts - 1; i++ ) { - n = TRISETUP( firstv, &vlist[i], &vlist[i+1] ); - if (n > 0) break; /* stop after 1st non-zero-area triangle */ - if (n < 0) goto all_done; - } - /* now all the gradients are loaded into the chip, so we just have to */ - /* draw all the rest of the triangles */ - for ( i = i+1; i < nverts - 1; i++ ) { - _trisetup_nogradients( firstv, &vlist[i], &vlist[i+1] ); - } - -all_done: - GR_END(); -#else - grDrawPolygonVertexList(nverts, vlist); -#endif -} /* grDrawPlanarPolygonVertexList */ - -/*--------------------------------------------------------------------------- -** grDrawPolygon -** -** Brute force "triangle-fan" implementation of a convex polygon drawer. -*/ - -GR_ENTRY(grDrawPolygon, void, ( int nverts, const int ilist[], const GrVertex vlist[] )) -{ - int i; - - GDBG_INFO((93,"grDrawPolygon(%d,0x%x,0x%x)\n",nverts,ilist,vlist)); - for ( i = 1; i < nverts - 1; i++ ) { - grDrawTriangle( &vlist[ilist[0]], &vlist[ilist[i]], &vlist[ilist[i+1]] ); - } -} /* grDrawPolygon */ - -/*--------------------------------------------------------------------------- -** grDrawPolygonVertexList -** -** Brute force "triangle-fan" implementation of a convex polygon drawer. -*/ - -GR_ENTRY(grDrawPolygonVertexList, void, ( int nverts, const GrVertex vlist[] )) -{ - int i; - - GDBG_INFO((93,"grDrawPolygonVertexList(%d,0x%x)\n",nverts,vlist)); - for ( i = 1; i < nverts - 1; i++ ) { - grDrawTriangle( &vlist[0], &vlist[i], &vlist[i+1] ); - } -} /* grDrawPolygonVertexList */ - -/*--------------------------------------------------------------------------- -** _grColorCombineDelta0Mode -** -** GMT: when we are in delta0 mode, color comes from the RGB iterators -** but the slopes are 0.0. So when we enter delta0 mode we set -** the iterators up and then we leave them alone during primitive -** rendering -*/ - -GR_DDFUNC(_grColorCombineDelta0Mode, void, ( FxBool delta0mode )) -{ - GR_BEGIN("_grColorCombineDelta0Mode",85,(delta0mode ? 9*4 : 0)); - GDBG_INFO_MORE((gc->myLevel,"(%d)\n",delta0mode)); - - if ( delta0mode ) { - GR_SETF( hw->Fr, gc->state.r ); - GR_SETF( hw->Fg, gc->state.g ); - GR_SETF( hw->Fb, gc->state.b ); - GR_SET( hw->drdx, 0); - GR_SET( hw->drdy, 0); - GR_SET( hw->dgdx, 0); - GR_SET( hw->dgdy, 0); - GR_SET( hw->dbdx, 0); - GR_SET( hw->dbdy, 0); - } - - gc->state.cc_delta0mode = delta0mode; - GR_END(); - -} /* _grColorCombineDeltaMode */ - diff --git a/glide2x/sst1/glide/src/gerror.c b/glide2x/sst1/glide/src/gerror.c deleted file mode 100644 index 246f80c..0000000 --- a/glide2x/sst1/glide/src/gerror.c +++ /dev/null @@ -1,161 +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 6/03/97 11:57p Pgj - * fix bug 558 - * - * 9 5/28/97 2:10p Dow - * Some mode setting, other cleanup - * - * 8 5/27/97 2:02p Dow - * added _grAssert - * - * 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 - -#ifdef __WIN32__ -# include -#endif - -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -#if(GLIDE_PLATFORM & GLIDE_OS_DOS32) -# include -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) -# include -# include -#endif -#endif - -void (*GrErrorCallback)( const char *string, FxBool fatal ); - -void _doGrErrorCallback( const char *name, const char *msg, FxBool fatal ) -{ - char buf[1024]; - sprintf(buf,"%s: %s.\n", name, msg); - GrErrorCallback(buf,fatal); -} - -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); - MessageBox(NULL, s, NULL, MB_OK); - grSstWinClose(); - grGlideShutdown(); - exit(1); - } else { - OutputDebugString(s); - } -} -#endif - -void -_grErrorDefaultCallback( const char *s, FxBool fatal ) -{ - if ( fatal ) - { - grSstWinClose(); - grGlideShutdown(); - -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) && (GLIDE_PLATFORM & GLIDE_OS_DOS32) - { - /* Set Mode 3 before going */ - union REGS - inR, outR; - - inR.w.ax = 0x0003; - int386(0x10, &inR, &outR); - - } -#endif -#ifdef GDBG_INFO_ON - GDBG_ERROR("glide", s); - GDBG_PRINTF((s)); -#else - puts( s ); -#endif - exit( 1 ); - } - else - { -#ifdef GDBG_INFO_ON - GDBG_PRINTF((s)); -#else - puts( s ); -#endif - } -} - -#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) -{ - initRestoreVideo(); - - GDBG_PRINTF(("ASSERTION FAILED:\n")); - GDBG_PRINTF(("\tExpression: %s\n", exp)); - GDBG_PRINTF(("\tFile: %s\n", fileName)); - GDBG_PRINTF(("\tLine: %d\n", lineNo)); - GDBG_PRINTF(("ABNORMAL TERMINATION\n")); - - exit(-1); - -} /* _grAssert */ diff --git a/glide2x/sst1/glide/src/gglide.c b/glide2x/sst1/glide/src/gglide.c deleted file mode 100644 index e2baa38..0000000 --- a/glide2x/sst1/glide/src/gglide.c +++ /dev/null @@ -1,2089 +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$ -** -** 78 1/21/98 2:25p Peter -** fixed assertion muckage - * - * 77 1/12/98 10:25p Dow - * H3D Stereo Support - * - * 76 1/07/98 9:58a Jdt - * Include Z in datalist for GR_COMBINE_LOCAL_DEPTH...Fixes Bug 1084 - * - * 75 12/19/97 8:09a Peter - * fog table propogation - * - * 74 9/24/97 7:02p Atai - * 1. use initStatus() instead of grSstStatus() in grBufferNumPending - * 2. add one p6 nudge code in grBufferSwap() - * - * 73 9/07/97 12:14p Pgj - * fix bug 660 - * - * 72 9/05/97 4:46p Peter - * fixed fifo silliness, sorry - * - * 71 8/19/97 8:55p Peter - * lots of stuff, hopefully no muckage - * - * 70 8/17/97 10:04p Pgj - * Fix bug 735 - * - * 69 8/01/97 11:48a Dow - * Added a size check for debugging - * - * 68 7/20/97 2:05p Dow - * Hopefully worked around VSYNC bug - * - * 67 7/18/97 6:48p Jdt - * grGlideShutdown now unsets _GlideRoot.initialized, further open/close - * symmetry fix - * - * 66 7/09/97 10:18a Dow - * Further Nudge Of Love adjustments - * - * 65 7/04/97 12:08p Dow - * Separated SST96 & SST1 versions of grRebuildDataList, fixed chip field - * muckage - * - * 64 6/30/97 6:43p Dow - * Added more blank lines - * - * 63 6/29/97 11:47p Jdt - * Adjustments for triangle optimization - * - * 62 6/29/97 1:58p Dow - * Fixed busted ifdef - * - * 61 6/26/97 3:09p Dow - * protected P6 stuff - * - * 60 6/20/97 5:52p Dow - * Changes to make chip field work - * - * 59 6/19/97 7:35p Dow - * More P6 Stuff - * - * 58 6/18/97 6:08p Dow - * Fixed bogus call to gdbg_error - * - * 57 6/18/97 5:54p Dow - * P6 adjustments - * - * 56 6/12/97 5:19p Pgj - * Fix bug 578 - * - * 55 5/27/97 11:37p Pgj - * Fix for Bug report 545 - * - * 54 5/22/97 2:18p Pgj - * maxx --> maxy - * - * 53 5/11/97 11:27p Pgj - * bug report 1152 - * - * 52 5/04/97 12:47p Dow - * Moved ClipWindow sanity check to internal routine as grSstControl needs - * it. - * - * 51 5/02/97 2:09p Pgj - * grClipWindow sanity checks coords (intersect w/screen rect) - * - * 50 3/24/97 2:00p Dow - * Fixed some chip field problems - * - * 49 3/22/97 7:04p Dow - * Fixed chip field - * - * 48 3/21/97 12:58p Dow - * Fixed error for SST1 - * - * 47 3/21/97 12:42p Dow - * Made STWHints not send the Bend Over Baby Packet to FBI Jr. - * - * 46 3/19/97 10:42p Dow - * Dither subtraction sense, windowsInit - * - * 45 3/18/97 9:08p Dow - * Added FX_GLIDE_NO_DITHER_SUB environment variable - * - * 44 3/17/97 6:26a Jdt - * Re-worked grGlideShutdown() - * - * 43 3/07/97 2:51p Jdt - * Fix for SST96 register offsets. - * - * 42 3/07/97 2:29p Dow - * Maybe fixed lines - * - * 41 3/05/97 1:07p Dow - * Clipping and origin changes for SST98 - * - * 40 3/04/97 9:08p Dow - * Neutered multiplatform multiheaded monster - * - * 39 3/01/97 2:48p Dow - * Moved buffer swap count increment so that it works for both VG & VR - * - * 38 2/26/97 11:56a Jdt - * Updated lfb api, fixed swapping - * - * 37 2/18/97 9:51a Jdt - * Removed a bunch of warnings, no functional changes. - * - * 36 2/12/97 10:39p Hanson - * - * 35 2/12/97 2:09p Hanson - * Hopefully removed the rest of my muckage. - * - * 34 1/14/97 10:45a Dow - * Added check for pending swaps to grBufferSwap for VG96 - * Modified grBufferNumPending to work with VG96 - * - * 33 12/23/96 1:37p Dow - * chagnes for multiplatform glide - * - * 32 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. - * - * 31 11/18/96 1:37a Tarolli - * fixed grAlphaBlendFunction warning bug - * - * 29 11/15/96 3:40p Jdt - * Fixed SST-96 build. - * - * 28 11/15/96 3:24p Tarolli - * renamed version.h to rcver.h , added some alpha blend function - * checking -** -*/ - -#include -#include <3dfx.h> -#include - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" -#include "fxinline.h" - -#if ( GLIDE_PLATFORM & GLIDE_HW_SST96 ) -#include -#endif - -#include "rcver.h" -static char glideIdent[] = "@#%" VERSIONSTR ; - -/*--------------------------------------------------------------------------- -** grAlphaBlendFunction -** -** GMT: BUG if grColorMask() turns off alphaplanes then destination alpha -** blending wont work! -*/ - -GR_ENTRY(grAlphaBlendFunction, void, ( GrAlphaBlendFnc_t rgb_sf, GrAlphaBlendFnc_t rgb_df, GrAlphaBlendFnc_t alpha_sf, GrAlphaBlendFnc_t alpha_df )) -{ - FxU32 alphamode; - - GR_BEGIN("grAlphaBlendFunction",85,4); - GDBG_INFO_MORE((gc->myLevel,"(%d,%d,%d,%d)\n",rgb_sf,rgb_df,alpha_sf,alpha_df)); - - /* Watcom warning suppressor */ - glideIdent[0] = glideIdent[0]; - - alphamode = gc->state.fbi_config.alphaMode; - if (alpha_sf != GR_BLEND_ONE && alpha_sf != GR_BLEND_ZERO) { - // GR_CHECK_W(myName, 1, "unsupported alpha source blend function"); - alpha_sf = GR_BLEND_ONE; - } - if (alpha_df != GR_BLEND_ONE && alpha_df != GR_BLEND_ZERO) { - // GR_CHECK_W(myName, 1, "unsupported alpha destination blend function"); - alpha_df = GR_BLEND_ZERO; - } - if ( rgb_sf == GR_BLEND_ONE && rgb_df == GR_BLEND_ZERO && - alpha_sf == GR_BLEND_ONE && alpha_df == GR_BLEND_ZERO ) - alphamode &= ~SST_ENALPHABLEND; - else - alphamode |= SST_ENALPHABLEND; - - alphamode &= ~( SST_RGBSRCFACT | SST_RGBDSTFACT | SST_ASRCFACT | SST_ADSTFACT ); - - alphamode |= ( ( ( FxU32 ) rgb_sf ) << SST_RGBSRCFACT_SHIFT ) | - ( ( ( FxU32 ) rgb_df ) << SST_RGBDSTFACT_SHIFT ) | - ( ( ( FxU32 ) alpha_sf ) << SST_ASRCFACT_SHIFT ) | - ( ( ( FxU32 ) alpha_df ) << SST_ADSTFACT_SHIFT ); - - GR_SET( hw->alphaMode, alphamode ); - gc->state.fbi_config.alphaMode = alphamode; - GR_END(); -} /* grAlphaBlendFunction */ - -/*--------------------------------------------------------------------------- -** grAlphaCombine -*/ -GR_ENTRY(grAlphaCombine, void, (GrCombineFunction_t function, GrCombineFactor_t factor, GrCombineLocal_t local, GrCombineOther_t other, FxBool invert )) -{ - FxU32 fbzColorPath; - FxU32 oldTextureEnabled; - - GR_BEGIN("grAlphaCombine",85,8); - GDBG_INFO_MORE((gc->myLevel,"(%d,%d,%d,%d,%d)\n",function,factor,local,other,invert)); - GR_CHECK_W(myName, - function < GR_COMBINE_FUNCTION_ZERO || - function > GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA, - "unsupported alpha combine function"); - GR_CHECK_W(myName, - (factor & 0x7) < GR_COMBINE_FACTOR_ZERO || - (factor & 0x7) > GR_COMBINE_FACTOR_TEXTURE_ALPHA || - factor > GR_COMBINE_FACTOR_ONE_MINUS_TEXTURE_ALPHA, - "unsupported alpha combine scale factor"); - - GR_CHECK_W(myName, - local < GR_COMBINE_LOCAL_ITERATED || local > GR_COMBINE_LOCAL_DEPTH, - "unsupported alpha combine local color"); - GR_CHECK_W(myName, - other < GR_COMBINE_OTHER_ITERATED || other > GR_COMBINE_OTHER_CONSTANT, - "unsupported alpha combine other color"); - - fbzColorPath = gc->state.fbi_config.fbzColorPath; - oldTextureEnabled = fbzColorPath & SST_ENTEXTUREMAP; - fbzColorPath &= ~( SST_ENTEXTUREMAP | - SST_ASELECT | - SST_ALOCALSELECT | - SST_CCA_ZERO_OTHER | - SST_CCA_SUB_CLOCAL | - SST_CCA_MSELECT | - SST_CCA_REVERSE_BLEND | - SST_CCA_ADD_CLOCAL | - SST_CCA_ADD_ALOCAL | - SST_CCA_INVERT_OUTPUT ); - - /* setup reverse blending first, then strip off the the high bit */ - if ( (factor & 0x8) == 0 ) - fbzColorPath |= SST_CCA_REVERSE_BLEND; - factor &= 0x7; - - /* NOTE: we use boolean OR instead of logical to avoid branches */ - gc->state.ac_requires_texture = ( factor == GR_COMBINE_FACTOR_TEXTURE_ALPHA ) | - ( other == GR_COMBINE_OTHER_TEXTURE ); - gc->state.ac_requires_it_alpha = ( local == GR_COMBINE_LOCAL_ITERATED ) | - ( other == GR_COMBINE_OTHER_ITERATED ); - - /* setup scale factor bits */ - fbzColorPath |= factor << SST_CCA_MSELECT_SHIFT; - - /* setup local color bits */ - fbzColorPath |= local << SST_ALOCALSELECT_SHIFT; - - /* setup other color bits */ - fbzColorPath |= other << SST_ASELECT_SHIFT; - - - /* setup invert output bits */ - if ( invert ) - fbzColorPath |= SST_CCA_INVERT_OUTPUT; - - /* setup core color combine unit bits */ - switch ( function ) { - case GR_COMBINE_FUNCTION_ZERO: - fbzColorPath |= SST_CCA_ZERO_OTHER; - break; - - case GR_COMBINE_FUNCTION_LOCAL: - case GR_COMBINE_FUNCTION_LOCAL_ALPHA: - fbzColorPath |= SST_CCA_ZERO_OTHER | SST_CCA_ADD_ALOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER: - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL: - case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA: - fbzColorPath |= SST_CCA_ADD_ALOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL: - fbzColorPath |= SST_CCA_SUB_CLOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL: - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL_ALPHA: - fbzColorPath |= SST_CCA_SUB_CLOCAL | SST_CCA_ADD_ALOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL: - case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA: - fbzColorPath |= SST_CCA_ZERO_OTHER | SST_CCA_SUB_CLOCAL | SST_CCA_ADD_ALOCAL; - break; - } - - /* if either color or alpha combine requires texture then enable it */ - if ( gc->state.cc_requires_texture || gc->state.ac_requires_texture ) - fbzColorPath |= SST_ENTEXTUREMAP; - - /* transition into/out of texturing ... add nopCMD */ - if(oldTextureEnabled != (fbzColorPath & SST_ENTEXTUREMAP)) - P6FENCE_CMD( GR_SET(hw->nopCMD,0) ); - - GR_SET( hw->fbzColorPath, fbzColorPath ); - gc->state.fbi_config.fbzColorPath = fbzColorPath; - - /* setup paramIndex bits */ - _grUpdateParamIndex(); - GR_END_SLOPPY(); -} /* grAlphaCombine */ - -/*--------------------------------------------------------------------------- -** grAlphaControlsITRGBLighting -** -** Determines whether the LSB of alpha controls what lighting is used-- -** Specifically whether grConstantColorValu or the interated RGB values are used -** during TEXTURE_TIMES_itrgb & TEXTURE_TIMES_ITRGB_DELTA0 color combine modes. -** -*/ - -GR_ENTRY(grAlphaControlsITRGBLighting, void, (FxBool enable)) -{ - FxU32 fbzColorPath; - - GR_BEGIN("grAlphaControlsITRGBLighting",85,4); - GDBG_INFO_MORE((gc->myLevel,"(%d)\n",enable)); - - fbzColorPath = gc->state.fbi_config.fbzColorPath; - if ( enable ) { - fbzColorPath |= SST_LOCALSELECT_OVERRIDE_WITH_ATEX; - } else { - fbzColorPath &= ~SST_LOCALSELECT_OVERRIDE_WITH_ATEX; - } - - GR_SET( hw->fbzColorPath, fbzColorPath ); - gc->state.fbi_config.fbzColorPath = fbzColorPath; - GR_END(); -} /* grAlphaControlsITRGBLighting() */ - -/*--------------------------------------------------------------------------- -** grAlphaTestFunction -*/ - -GR_ENTRY(grAlphaTestFunction, void, ( GrCmpFnc_t fnc )) -{ - FxU32 alphamode; - - GR_BEGIN("grAlphaTestFunction",85,4); - GDBG_INFO_MORE((gc->myLevel,"(%d)\n",fnc)); - - alphamode = gc->state.fbi_config.alphaMode; - alphamode &= ~(SST_ALPHAFUNC | SST_ENALPHAFUNC); - if ( fnc != GR_CMP_ALWAYS ) - alphamode |= ( ( fnc << SST_ALPHAFUNC_SHIFT ) | SST_ENALPHAFUNC ); - - GR_SET( hw->alphaMode, alphamode ); - gc->state.fbi_config.alphaMode = alphamode; - GR_END(); -} /* grAlphaTestFunction */ - -/*--------------------------------------------------------------------------- -** grAlphaTestReferenceValue -*/ - -GR_ENTRY(grAlphaTestReferenceValue, void, ( GrAlpha_t value )) -{ - FxU32 alphamode; - - GR_BEGIN("grAlphaTestReferenceValue",85,4); - GDBG_INFO_MORE((gc->myLevel,"(%d)\n",value)); - - alphamode = gc->state.fbi_config.alphaMode; - alphamode &= ~SST_ALPHAREF; - alphamode |= ( ( ( FxU32 ) value ) << SST_ALPHAREF_SHIFT ); - GR_SET( hw->alphaMode, alphamode ); - gc->state.fbi_config.alphaMode = alphamode; - GR_END(); -} /* grAlphaTestReferenceValue */ - -/*--------------------------------------------------------------------------- -** grBufferClear -*/ - -GR_ENTRY(grBufferClear, void, ( GrColor_t color, GrAlpha_t alpha, FxU16 depth )) -{ - GrColor_t oldc1; - FxU32 oldzacolor, zacolor; -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) - GR_BEGIN("grBufferClear",86,44); -#else - GR_BEGIN("grBufferClear",86,24); -#endif - GDBG_INFO_MORE((gc->myLevel,"(0x%x,0x%x,0x%x)\n",color,alpha,depth)); - - oldc1 = gc->state.fbi_config.color1; - zacolor = oldzacolor = gc->state.fbi_config.zaColor; - - /* - ** Setup source registers - */ - if ( gc->state.fbi_config.fbzMode & SST_RGBWRMASK ) - { - _grSwizzleColor( &color ); - GR_SET( hw->c1, color ); - } - if ( ( gc->state.fbi_config.fbzMode & ( SST_ENALPHABUFFER | SST_ZAWRMASK ) ) == ( SST_ENALPHABUFFER | SST_ZAWRMASK ) ) - { - zacolor &= ~SST_ZACOLOR_ALPHA; - zacolor |= ( ( ( FxU32 ) alpha ) << SST_ZACOLOR_ALPHA_SHIFT ); - GR_SET( hw->zaColor, zacolor ); - } - if ( ( gc->state.fbi_config.fbzMode & ( SST_ENDEPTHBUFFER | SST_ZAWRMASK ) ) == ( SST_ENDEPTHBUFFER | SST_ZAWRMASK ) ) { - zacolor &= ~SST_ZACOLOR_DEPTH; - zacolor |= ( ( ( FxU32 ) depth ) << SST_ZACOLOR_DEPTH_SHIFT ); - GR_SET( hw->zaColor, zacolor ); - } -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) - /* - ** On SST96, it's faster if clear the buffers separately if we need - ** to clear both of them. - */ - if ( - (gc->state.fbi_config.fbzMode & (SST_RGBWRMASK | SST_ZAWRMASK)) - == (SST_RGBWRMASK | SST_ZAWRMASK) - ) { - FxU32 fbzMode; - /* Disable ZA write and fill */ - fbzMode = gc->state.fbi_config.fbzMode & ~SST_ZAWRMASK; - GR_SET(hw->fbzMode, fbzMode); - GR_SET(hw->fastfillCMD,1); - - /* Disable RGB write mask and fill */ - fbzMode = gc->state.fbi_config.fbzMode & ~SST_RGBWRMASK; - GR_SET(hw->fbzMode, fbzMode); - GR_SET(hw->fastfillCMD,1); - - /* Restore fbzMode to previous state */ - GR_SET(hw->fbzMode, gc->state.fbi_config.fbzMode); - - } else -#endif - /* - ** Execute the FASTFILL command - */ - P6FENCE_CMD( GR_SET(hw->fastfillCMD,1) ); - - - /* - ** Restore C1 and ZACOLOR - */ - GR_SET( hw->c1, oldc1 ); - GR_SET( hw->zaColor, oldzacolor ); - GR_END_SLOPPY(); -} /* grBufferClear */ - - -/*--------------------------------------------------------------------------- -** grBufferSwap -** -** NOTE: This routine should be COMPLETELY device-independant, -** but it isn't right now because we need to move all the -** code for the splash screen into the init library. -*/ - -GR_ENTRY(grBufferSwap, void, ( int swapInterval )) -{ -#define FN_NAME "grBuferSwap" - int vSync; - -#if ( GLIDE_PLATFORM & GLIDE_HW_SST96 ) -#ifdef GDBG_INFO_ON - int - nTries; -#endif - - int pending; -#endif - - GR_BEGIN_NOFIFOCHECK(FN_NAME,80); - GDBG_INFO_MORE((gc->myLevel,"(%d)\n",swapInterval)); - -#if ( GLIDE_PLATFORM & GLIDE_HW_SST96 ) - FXUNUSED( vSync ); - -#ifdef GDBG_INFO_ON - nTries = 0; -#endif - - /* - * For improved speed we take the following steps - * 1. remove the status checking - * 2. modify grBufferNumPending so it does not need to do P6 nudge code - * 3. add one p6 nudge code - * Here is step 3. - * If we introduce new bugs in 2.43, please undo the above steps - */ - P6_NUDGE_OF_LOVE; - - pending = grBufferNumPending(); - - if (pending < 1 && gc->grSstRez != GR_RESOLUTION_NONE) { - GR_SET_EXPECTED_SIZE((9 << 2)); - GR_SET(hw->fbzMode, (gc->state.fbi_config.fbzMode & (~(SST_RGBWRMASK | SST_ZAWRMASK)))); - GR_SETF(hw->FvA.x, 0.f); - GR_SETF(hw->FvA.y, 0.f); - GR_SETF(hw->FvB.x, 640.f); - GR_SETF(hw->FvB.y, 0.f); - GR_SETF(hw->FvC.x, 640.f); - GR_SETF(hw->FvC.y, 480.f); - GR_SETF(hw->FtriangleCMD, 1.f); - GR_SET(hw->fbzMode, gc->state.fbi_config.fbzMode); - GR_CHECK_SIZE(); - } - - while (pending > 3) { -#ifdef GDBG_INFO_ON - GDBG_INFO((86, "%s: Checked pending %d times\n", FN_NAME, - ++nTries)); - if (nTries > 10000) - GDBG_ERROR(FN_NAME , "Exiting after %d tries for pending\n", nTries); -#endif /* GDBG_INFO_ON */ - pending = grBufferNumPending(); - } while (pending > 3); - - /* optionally display the 3Dfx powerfield logo overlay */ - if (_GlideRoot.environment.shamelessPlug) - _grShamelessPlug(); - - initSwapBuffers( swapInterval ); - -#ifdef H3D - if (GR_RESOLUTION_IS_AUTOFLIPPED(gc->grSstRez)) { - extern void pageflippingSwapWait(void); - do { - pending = grBufferNumPending(); - } while (pending > 0); - pageflippingSwapWait(); - } -#endif - - P6_NUDGE_OF_LOVE; - -#elif ( GLIDE_PLATFORM & GLIDE_HW_SST1 ) - /* optionally display the 3Dfx powerfield logo overlay */ - if (_GlideRoot.environment.shamelessPlug) - _grShamelessPlug(); - - /* check for environmental override */ - if (_GlideRoot.environment.swapInterval >= 0) { - swapInterval = _GlideRoot.environment.swapInterval; - } - - GR_CHECK_F(myName, - ( swapInterval > 255 ) || ( swapInterval < 0 ), - "swap_interval out of range"); - - /* wait until there's 6 or fewer buffer swaps pending */ - /* the hardware counter is only 3 bits so we don't want it to overflow */ - /* also the latency gets too long */ - while (grBufferNumPending() > 6); - - /* if the interval is non-zero turn on VSYNC waiting */ - vSync = swapInterval > 0 ? 1 : 0; - - if ((swapInterval > 0) && - (_GlideRoot.hwConfig.SSTs[_GlideRoot.current_sst].sstBoard.VoodooConfig.fbiRev == 1)) - { - /* Adjust for .6 micron FBI */ - if (swapInterval == 2) - swapInterval = 3; - else if (swapInterval != 1) - swapInterval <<= 1; - } else { - if (swapInterval > 0) swapInterval--; - } - - /* NOTE: we need a PCI read before and after the swap command */ - /* but since we already called grBufferNumPending() we've done a read */ - GR_SET_EXPECTED_SIZE(4); - P6FENCE_CMD( GR_SET(hw->swapbufferCMD, (swapInterval<<1) | vSync) ); - -#ifdef GLIDE_DEBUG - if (_GlideRoot.environment.snapshot > 0) { - static char saveDBG[GDBG_MAX_LEVELS]; - int i; - - /* turn off tracing after frame 0 and the snapshot frame */ - if (_GlideRoot.stats.bufferSwaps == 1 || - _GlideRoot.stats.bufferSwaps == _GlideRoot.environment.snapshot+1) - { - for (i=1; i> SST_SWAPBUFPENDING_SHIFT; -#elif (GLIDE_PLATFORM & GLIDE_HW_SST96) -#define SST96_SWAPPEND_SHIFT 0x4 -#define SST96_SWAPPEND_BITS (0x7 << SST96_SWAPPEND_SHIFT) - pend = ((status & SST96_SWAPPEND_BITS) >> SST96_SWAPPEND_SHIFT); -#else -# error "Implement BufferNumPending for this hardware" -#endif - - GDBG_INFO((86,"grBufferNumPending() => %d\n",pend)); - - return pend; - -} /* grBufferNumPending */ - -/*--------------------------------------------------------------------------- -** grChromakeyMode -*/ - -GR_ENTRY(grChromakeyMode, void, ( GrChromakeyMode_t mode )) -{ - FxU32 fbzMode; - - GR_BEGIN("grChromakeyMode",85,4); - GDBG_INFO_MORE((gc->myLevel,"(%d)\n",mode)); - - fbzMode = gc->state.fbi_config.fbzMode; - if ( mode == GR_CHROMAKEY_ENABLE ) - fbzMode |= SST_ENCHROMAKEY; - else - fbzMode &= ~SST_ENCHROMAKEY; - - GR_SET( hw->fbzMode, fbzMode ); - gc->state.fbi_config.fbzMode = fbzMode; - GR_END(); -} /* grChromaKeyMode */ - -/*--------------------------------------------------------------------------- -** grChromakeyValue -*/ - -GR_ENTRY(grChromakeyValue, void, ( GrColor_t color )) -{ - GR_BEGIN("grChromakeyValue",85,4); - GDBG_INFO_MORE((gc->myLevel,"(0x%x)\n",color)); - - _grSwizzleColor( &color ); - GR_SET( hw->chromaKey, color ); - gc->state.fbi_config.chromaKey = color; - GR_END(); -} /* grChromaKeyValue */ - -/*--------------------------------------------------------------------------- -** _grClipNormalizeAndGenerateRegValues -** -** This routine normalizes clip variables to screen_width and -** screen_height, then generates the values to be written to the -** registers clipLeftRight and clipBottomTop. The reason for its -** existence is that BOTH grClipWindow() and grSstControl() need to -** write these registers. -*/ -void -_grClipNormalizeAndGenerateRegValues(FxU32 minx, FxU32 miny, FxU32 maxx, - FxU32 maxy, FxU32 *clipLeftRight, - FxU32 *clipBottomTop) -{ -#define FN_NAME "_grClipNormalizeAndGenerateRegValues" - GR_DCL_GC; - - GDBG_INFO((41, "%s: minx = %d, maxx = %d, miny = %d, maxy = %d\n", - FN_NAME, minx, maxx, miny, maxy)); - - /* don't allow bogus clip coords!!! */ - if (maxx > gc->state.screen_width) maxx = gc->state.screen_width; - if (maxy > gc->state.screen_height) maxy = gc->state.screen_height; - if (minx > maxx) minx = maxx; - if (miny > maxy) miny = maxy; - - GDBG_INFO((41, "%s: normalized minx = %d, maxx = %d, miny = %d, maxy = %d\n", - FN_NAME, minx, maxx, miny, maxy)); - - *clipLeftRight = - ( minx << SST_CLIPLEFT_SHIFT ) | ( maxx << SST_CLIPRIGHT_SHIFT ); - - *clipBottomTop = - ( miny << SST_CLIPBOTTOM_SHIFT ) | ( maxy << SST_CLIPTOP_SHIFT ); - - GDBG_INFO((41, "%s: clipLeftRight = 0x%x, clipBottomTop = 0x%x\n", - FN_NAME, clipLeftRight, clipBottomTop)); - -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) - /* Enable clipping */ - *clipLeftRight |= 0x80000000; -#endif -#undef FN_NAME -} /* _grClipNormalizeAndGenerateRegValues */ - -/*--------------------------------------------------------------------------- -** grClipWindow -*/ -GR_ENTRY(grClipWindow, void, ( FxU32 minx, FxU32 miny, FxU32 maxx, - FxU32 maxy )) -{ - FxU32 - clipLeftRight, /* SST Clipping Registers */ - clipBottomTop; - - GR_BEGIN("grClipWindow",41,8); - GDBG_INFO_MORE((gc->myLevel,"(%d,%d %d,%d)\n",minx,miny,maxx,maxy)); - - _grClipNormalizeAndGenerateRegValues(minx, miny, maxx, maxy, - &clipLeftRight, &clipBottomTop); - - GR_SET( hw->clipLeftRight, clipLeftRight); - GR_SET( hw->clipBottomTop, clipBottomTop); - - gc->state.fbi_config.clipLeftRight = clipLeftRight; - gc->state.fbi_config.clipBottomTop = clipBottomTop; - - gc->state.clipwindowf_xmin = ( float ) minx; - gc->state.clipwindowf_xmax = ( float ) maxx; - gc->state.clipwindowf_ymin = ( float ) miny; - gc->state.clipwindowf_ymax = ( float ) maxy; - GR_END(); -} /* grClipWindow */ - -/*--------------------------------------------------------------------------- -** grColorCombine -*/ - -GR_ENTRY(grColorCombine, void, ( GrCombineFunction_t function, GrCombineFactor_t factor, GrCombineLocal_t local, GrCombineOther_t other, FxBool invert )) -{ - FxU32 fbzColorPath; - FxU32 oldTextureEnabled; - - GR_BEGIN("grColorCombine",85,8); - GDBG_INFO_MORE((gc->myLevel,"(%d,%d,%d,%d,%d)\n",function,factor,local,other,invert)); - - GR_CHECK_W( myName, - function < GR_COMBINE_FUNCTION_ZERO || - function > GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA, - "unsupported color combine function" ); - - GR_CHECK_W( myName, - (factor & 0x7) < GR_COMBINE_FACTOR_ZERO || - (factor & 0x7) > GR_COMBINE_FACTOR_TEXTURE_ALPHA || - factor > GR_COMBINE_FACTOR_ONE_MINUS_TEXTURE_ALPHA, - "unsupported color combine scale factor"); - GR_CHECK_W( myName, - local < GR_COMBINE_LOCAL_ITERATED || local > GR_COMBINE_LOCAL_DEPTH, - "unsupported color combine local color"); - GR_CHECK_W( myName, - other < GR_COMBINE_OTHER_ITERATED || other > GR_COMBINE_OTHER_CONSTANT, - "unsupported color combine other color"); - - fbzColorPath = gc->state.fbi_config.fbzColorPath; - oldTextureEnabled = fbzColorPath & SST_ENTEXTUREMAP; - fbzColorPath &= ~( SST_ENTEXTUREMAP | - 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 ); - - /* this is bogus, it should be done once, somewhere. */ - fbzColorPath |= SST_PARMADJUST; - - /* setup reverse blending first, then strip off the the high bit */ - if ( (factor & 0x8) == 0 ) - fbzColorPath |= SST_CC_REVERSE_BLEND; - factor &= 0x7; - - /* NOTE: we use boolean OR instead of logical to avoid branches */ - gc->state.cc_requires_texture = ( factor == GR_COMBINE_FACTOR_TEXTURE_ALPHA ) | - ( other == GR_COMBINE_OTHER_TEXTURE ); - gc->state.cc_requires_it_rgb = ( local == GR_COMBINE_LOCAL_ITERATED ) | - ( other == GR_COMBINE_OTHER_ITERATED ); - - /* setup scale factor bits */ - fbzColorPath |= factor << SST_CC_MSELECT_SHIFT; - - /* setup local color bits */ - fbzColorPath |= local << SST_LOCALSELECT_SHIFT; - - /* setup other color bits */ - fbzColorPath |= other << SST_RGBSELECT_SHIFT; - - /* setup invert output bits */ - if ( invert ) - fbzColorPath |= SST_CC_INVERT_OUTPUT; - - /* setup core color combine unit bits */ - switch ( function ) - { - case GR_COMBINE_FUNCTION_ZERO: - fbzColorPath |= SST_CC_ZERO_OTHER; - break; - - case GR_COMBINE_FUNCTION_LOCAL: - fbzColorPath |= SST_CC_ZERO_OTHER | SST_CC_ADD_CLOCAL; - break; - - case GR_COMBINE_FUNCTION_LOCAL_ALPHA: - fbzColorPath |= SST_CC_ZERO_OTHER | SST_CC_ADD_ALOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER: - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL: - fbzColorPath |= SST_CC_ADD_CLOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA: - fbzColorPath |= SST_CC_ADD_ALOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL: - fbzColorPath |= SST_CC_SUB_CLOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL: - fbzColorPath |= SST_CC_SUB_CLOCAL | SST_CC_ADD_CLOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL_ALPHA: - fbzColorPath |= SST_CC_SUB_CLOCAL | SST_CC_ADD_ALOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL: - fbzColorPath |= SST_CC_ZERO_OTHER | SST_CC_SUB_CLOCAL | SST_CC_ADD_CLOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA: - fbzColorPath |= SST_CC_ZERO_OTHER | SST_CC_SUB_CLOCAL | SST_CC_ADD_ALOCAL; - break; - } - - /* if either color or alpha combine requires texture then enable it */ - if ( gc->state.cc_requires_texture || gc->state.ac_requires_texture ) - fbzColorPath |= SST_ENTEXTUREMAP; - - /* if we transition into/out of texturing ... add nopCMD */ - if(oldTextureEnabled != (fbzColorPath & SST_ENTEXTUREMAP)) - P6FENCE_CMD( GR_SET(hw->nopCMD,0) ); - - /* update register */ - GR_SET( hw->fbzColorPath, fbzColorPath ); - gc->state.fbi_config.fbzColorPath = fbzColorPath; - - /* setup paramIndex bits */ - _grUpdateParamIndex(); - - GR_END_SLOPPY(); -} /* grColorCombine */ - -/*--------------------------------------------------------------------------- -** grColorMask -*/ - -GR_ENTRY(grColorMask, void, ( FxBool rgb, FxBool alpha )) -{ - FxU32 fbzMode; - - GR_BEGIN("grColorMask",85,4); - GDBG_INFO_MORE((gc->myLevel,"(0x%x,0x%x)\n",rgb,alpha)); - - fbzMode = gc->state.fbi_config.fbzMode; - GR_CHECK_W( myName, - ( fbzMode & SST_ENDEPTHBUFFER ) && alpha, - "alpha writes enabled even though depth buffering" ); - GR_CHECK_W( myName, - (gc->state.num_buffers == 3) && alpha, - "alpha writes enabled while triple buffering" ); - - if ( rgb ) - fbzMode |= SST_RGBWRMASK; - else - fbzMode &= ~SST_RGBWRMASK; - - /* GMT: BUG leave SST_ENALPHABUFFER on if dest. alpha being used */ - /* Don't do anything if depth buffering on */ - /* XXX Should check for triple buffering too */ - - if ( !(fbzMode & SST_ENDEPTHBUFFER) && (gc->state.num_buffers != 3) ) { - if ( alpha ) - fbzMode |= SST_ENALPHABUFFER | SST_ZAWRMASK; - else - fbzMode &= ~(SST_ENALPHABUFFER | SST_ZAWRMASK); - } - - GR_SET( hw->fbzMode, fbzMode ); - gc->state.fbi_config.fbzMode = fbzMode; - GR_END(); -} /* grColorMask */ - -/*--------------------------------------------------------------------------- -** grConstantColorValue -*/ - -GR_ENTRY(grConstantColorValue, void, ( GrColor_t color )) -{ - GR_BEGIN("grConstantColorValue",85,8); - GDBG_INFO_MORE((gc->myLevel,"(0x%x)\n",color)); - - _grSwizzleColor( &color ); - GR_SET( hw->c0, color ); - GR_SET( hw->c1, color ); - gc->state.fbi_config.color0 = color; - gc->state.fbi_config.color1 = color; - GR_END(); -} /* grConstanColorValue */ - -/*--------------------------------------------------------------------------- -** grConstantColorValue4 -** GMT: obsolete routine -** GMT: send values to hardware immediately -*/ - -GR_ENTRY(grConstantColorValue4, void, ( float a, float r, float g, float b )) -{ - GR_BEGIN("grConstantColorValue4",85,12); - GDBG_INFO_MORE((gc->myLevel,"(%d,%d,%d,%d)\n",a,r,g,b)); - gc->state.a = a; - gc->state.r = r; - gc->state.g = g; - gc->state.b = b; - if ( gc->state.cc_delta0mode ) { - GR_SETF( hw->Fr, r ); - GR_SETF( hw->Fg, g ); - GR_SETF( hw->Fb, b ); - } - GR_END_SLOPPY(); -} /* grConstantColorValue4 */ - -/*--------------------------------------------------------------------------- -** grCullMode -** -** GMT: warning - gaa.c has the guts of this in-line -*/ - -GR_ENTRY(grCullMode, void, ( GrCullMode_t mode )) -{ - GR_BEGIN_NOFIFOCHECK("grCullMode",85); - GDBG_INFO_MORE((gc->myLevel,"(%d)\n",mode)); - gc->state.cull_mode = mode; - GR_END(); -} /* grCullMode */ - -/*--------------------------------------------------------------------------- -** grDepthBiasLevel -** -** Sets the depth bias level. -*/ - -GR_ENTRY(grDepthBiasLevel, void, ( FxI16 level )) -{ - FxU32 zacolor; - - GR_BEGIN("grDepthBiasLevel",85,4); - GDBG_INFO_MORE((gc->myLevel,"(%d)\n",level)); - - zacolor = gc->state.fbi_config.zaColor; - zacolor = ( zacolor & ~SST_ZACOLOR_DEPTH ) | (level & SST_ZACOLOR_DEPTH); - GR_SET( hw->zaColor, zacolor ); - gc->state.fbi_config.zaColor = zacolor; - GR_END(); -} /* grDepthBiasLevel */ - -/*--------------------------------------------------------------------------- -** grDepthBufferFunction -*/ - -GR_ENTRY(grDepthBufferFunction, void, ( GrCmpFnc_t fnc )) -{ - FxU32 fbzMode; - - GR_BEGIN("grDepthBufferFunction",85,4); - GDBG_INFO_MORE((gc->myLevel,"(%d)\n",fnc)); - - fbzMode = gc->state.fbi_config.fbzMode; - fbzMode &= ~SST_ZFUNC; - fbzMode |= ( fnc << SST_ZFUNC_SHIFT ); - GR_SET( hw->fbzMode, fbzMode ); - gc->state.fbi_config.fbzMode = fbzMode; - GR_END(); -} /* grDepthBufferFunction */ - -/*--------------------------------------------------------------------------- -** grDepthBufferMode -*/ - -GR_ENTRY(grDepthBufferMode, void, ( GrDepthBufferMode_t mode )) -{ - FxU32 fbzMode; - - GR_BEGIN("grDepthBufferMode",85,4); - GDBG_INFO_MORE((gc->myLevel,"(%d)\n",mode)); - - /* - ** depth buffering cannot be enabled at the same time as triple buffering - */ -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) - GR_CHECK_F( myName, - mode != GR_DEPTHBUFFER_DISABLE && gc->state.num_buffers == 3 && gc->fbuf_size <= 2, - "cannot enable depth buffer when triple buffering" ); -#endif - /* - ** depth buffering cannot be enabled on systems running at: - ** 800x600 w/ 2MB - ** 640x480 w/ 1MB - */ - GR_CHECK_F( myName, - mode != GR_DEPTHBUFFER_DISABLE && !_grCanSupportDepthBuffer(), - "cannot enable depthbuffer with configuration" ); - - /* turn off all the bits and then turn them back on selectively */ - fbzMode = gc->state.fbi_config.fbzMode; - fbzMode &= ~(SST_ENDEPTHBUFFER | SST_WBUFFER | SST_ENZBIAS | SST_ZCOMPARE_TO_ZACOLOR); - - switch (mode) { - case GR_DEPTHBUFFER_DISABLE: - break; - - case GR_DEPTHBUFFER_ZBUFFER: - fbzMode |= SST_ENDEPTHBUFFER | SST_ENZBIAS; - break; - - case GR_DEPTHBUFFER_WBUFFER: - fbzMode |= SST_ENDEPTHBUFFER | SST_WBUFFER | SST_ENZBIAS; - break; - - case GR_DEPTHBUFFER_ZBUFFER_COMPARE_TO_BIAS: - fbzMode |= SST_ENDEPTHBUFFER | SST_ZCOMPARE_TO_ZACOLOR; - break; - - case GR_DEPTHBUFFER_WBUFFER_COMPARE_TO_BIAS: - fbzMode |= SST_ENDEPTHBUFFER | SST_WBUFFER | SST_ZCOMPARE_TO_ZACOLOR; - break; - } - - /* - ** Update hardware and Glide state - */ - GR_SET( hw->fbzMode, fbzMode); - gc->state.fbi_config.fbzMode = fbzMode; - - _grUpdateParamIndex(); - GR_END(); -} /* grDepthBufferMode */ - -/*--------------------------------------------------------------------------- -** grDepthMask -*/ -GR_ENTRY(grDepthMask, void, ( FxBool enable )) -{ - FxU32 fbzMode; - - GR_BEGIN("grDepthMask",85,4); - GDBG_INFO_MORE((gc->myLevel,"(%d)\n",enable)); - - fbzMode = gc->state.fbi_config.fbzMode; - GR_CHECK_F( myName, - enable && !_grCanSupportDepthBuffer(), - "called in a non-depthbufferable configuration" ); - - if ( enable ) - fbzMode |= SST_ZAWRMASK; - else - fbzMode &= ~SST_ZAWRMASK; - - GR_SET( hw->fbzMode, fbzMode ); - gc->state.fbi_config.fbzMode = fbzMode; - GR_END(); -} /* grDepthMask */ - -/*--------------------------------------------------------------------------- -** grDisableAllEffects -*/ - -GR_ENTRY(grDisableAllEffects, void, ( void )) -{ - GDBG_INFO((87,"grDisableAllEffects()\n")); - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ZERO, GR_BLEND_ONE, GR_BLEND_ZERO ); - grAlphaTestFunction( GR_CMP_ALWAYS ); - grChromakeyMode( GR_CHROMAKEY_DISABLE ); - grDepthBiasLevel( 0 ); - grDepthBufferMode( GR_DEPTHBUFFER_DISABLE ); - grFogMode( GR_FOG_DISABLE ); -} /* grDisableAllEffects */ - -/*--------------------------------------------------------------------------- -** grDitherMode -*/ - -GR_ENTRY(grDitherMode, void, ( GrDitherMode_t mode )) -{ - FxU32 fbzMode; - - GR_BEGIN("grDitherMode",85,4); - GDBG_INFO_MORE((gc->myLevel,"(%d)\n",mode)); - - fbzMode = gc->state.fbi_config.fbzMode & - ~( SST_ENDITHER | SST_DITHER2x2 | SST_ENDITHERSUBTRACT ); - - switch ( mode ) { - case GR_DITHER_DISABLE: - break; - case GR_DITHER_2x2: - fbzMode |= ( SST_ENDITHER | SST_DITHER2x2 ); - break; - case GR_DITHER_4x4: - /* test per bug 660 */ - if (_GlideRoot.environment.disableDitherSub == FXTRUE) { - fbzMode |= SST_ENDITHER; - } else { - fbzMode |= (SST_ENDITHER | SST_ENDITHERSUBTRACT); - } - break; - } - - GR_SET( hw->fbzMode, fbzMode ); - gc->state.fbi_config.fbzMode = fbzMode; - GR_END(); -} /* grDitherMode */ - -/*--------------------------------------------------------------------------- -** grFogMode -*/ - -GR_ENTRY(grFogMode, void, ( GrFogMode_t mode )) -{ - FxU32 fogmode; - - GR_BEGIN("grFogMode",85,4); - GDBG_INFO_MORE((gc->myLevel,"(%d)\n",mode)); - - fogmode = gc->state.fbi_config.fogMode; - fogmode &= ~( SST_ENFOGGING | SST_FOGADD | SST_FOGMULT | SST_FOG_ALPHA | SST_FOG_Z | SST_FOG_CONSTANT ); - - switch ( mode & 0xFF ) { /* switch based on lower 8 bits */ - case GR_FOG_DISABLE: - break; - case GR_FOG_WITH_ITERATED_ALPHA: - fogmode |= ( SST_ENFOGGING | SST_FOG_ALPHA ); - break; - case GR_FOG_WITH_ITERATED_Z: /* Bug 735 */ - fogmode |= ( SST_ENFOGGING | SST_FOG_Z ); - break; - case GR_FOG_WITH_TABLE: - fogmode |= ( SST_ENFOGGING ); - } - if ( mode & GR_FOG_MULT2 ) fogmode |= SST_FOGMULT; - if ( mode & GR_FOG_ADD2 ) fogmode |= SST_FOGADD; - - /* - ** Update the hardware and Glide state - */ - GR_SET( hw->fogMode, fogmode ); - gc->state.fbi_config.fogMode = fogmode; - - _grUpdateParamIndex(); - GR_END(); -} /* grFogMode */ - -/*--------------------------------------------------------------------------- -** grFogColorValue -*/ - -GR_ENTRY(grFogColorValue, void, ( GrColor_t color )) -{ - GR_BEGIN("grFogColorValue",85,4); - GDBG_INFO_MORE((gc->myLevel,"(0x%x)\n",color)); - - _grSwizzleColor( &color ); - GR_SET( hw->fogColor, color ); - gc->state.fbi_config.fogColor = color; - GR_END(); -} /* grFogColorValue */ - -/*--------------------------------------------------------------------------- -** grFogTable -*/ - -GR_ENTRY(grFogTable, void, ( const GrFog_t fogtable[kInternalFogTableEntryCount] )) -{ - int i, iend = kInternalFogTableEntryCount / 2 - 1; - const GrFog_t *locTable = fogtable; - - GR_BEGIN("grFogTable",85,kInternalFogTableEntryCount*2); - GDBG_INFO_MORE((gc->myLevel,"(0x%x)\n",fogtable)); - GR_ASSERT(fogtable != NULL); - GR_ASSERT(kInternalFogTableEntryCount == 64); - - for ( i = 0; i <= iend; i++ ) { - GrFog_t e0,e1,d0,d1; - - e0 = locTable[0]; /* lower entry */ - e1 = locTable[1]; /* upper entry */ - d0 = (e1-e0)<<2; /* del0 in .2 format */ - d1 = (i==iend) ? e1 : locTable[2]; /* don't access beyond end of table */ - d1 = (d1-e1)<<2; /* del1 in .2 format */ - - GR_SET( hw->fogTable[i], (e1<<24) | (d1<<16) | (e0<<8) | d0); - locTable += 2; - } - GR_END(); -} /* grFogTable */ - - - -/*------------------------------------------------------------------- - Function: grGlideShutdown - Date: 3/16 - Implementor(s): dow, gmt, jdt - Library: Glide - Description: - Shutdown the Glide Library. Iterate through all hardware and - call grSstWinClose(). Call InitShutdown() which unmaps all - hardware from linear memory. - Arguments: - none - Return: - none - -------------------------------------------------------------------*/ - -GR_ENTRY(grGlideShutdown, void, ( void )) -{ - _GlideRoot.windowsInit = FXFALSE; - - if ( _GlideRoot.initialized ) { - { /* GMT: reset the counter so we can proceed without assertions */ - GR_DCL_GC; - gc->counter = gc->expected_counter = 0; - } - { - int i; - GR_BEGIN_NOFIFOCHECK("grGlideShutdown",80); - GDBG_INFO_MORE((gc->myLevel,"()\n")); - - for( i = 0; i < _GlideRoot.hwConfig.num_sst; i++ ) { - grSstSelect( i ); - grSstWinClose(); - } - - initClose(); - - _grDisplayStats(); - gc->grSstRez = GR_RESOLUTION_NONE; - gc->grSstRefresh = GR_REFRESH_NONE; - _GlideRoot.initialized = FXFALSE; - GR_END(); - } - } -} /* grGlideShutdown */ - -/*--------------------------------------------------------------------------- -** grGlideSetState -*/ - -GR_ENTRY(grGlideSetState, void, ( const GrState *state )) -{ - int tmu; - Sstregs *tmuregs; - - GR_BEGIN("grGlideSetState",87,(1+13+7*gc->num_tmu)*4+(gc->num_tmu+1)*PACKER_WORKAROUND_SIZE); - GDBG_INFO_MORE((gc->myLevel,"(0x%x)\n",state)); - GR_ASSERT(state != NULL); - - /* if texture mapping changed then we need to issue a NOP command*/ - if ( (gc->state.fbi_config.fbzColorPath ^ state->fbi_config.fbzColorPath) & - SST_ENTEXTUREMAP) - { - P6FENCE_CMD( GR_SET(hw->nopCMD,0) ); - } - - /* copy all the state */ - gc->state = *state; - - /* Update the hardware state from the saved state */ - GR_SET( hw->fbzColorPath, gc->state.fbi_config.fbzColorPath ); - GR_SET( hw->fogMode, gc->state.fbi_config.fogMode ); - GR_SET( hw->alphaMode, gc->state.fbi_config.alphaMode ); - GR_SET( hw->fbzMode, gc->state.fbi_config.fbzMode ); -#if !(GLIDE_PLATFORM & GLIDE_HW_SST96) - GR_SET( hw->lfbMode, gc->state.fbi_config.lfbMode ); -#endif - GR_SET( hw->clipLeftRight, gc->state.fbi_config.clipLeftRight ); - GR_SET( hw->clipBottomTop, gc->state.fbi_config.clipBottomTop ); - GR_SET( hw->fogColor, gc->state.fbi_config.fogColor ); - GR_SET( hw->zaColor, gc->state.fbi_config.zaColor ); - GR_SET( hw->chromaKey, gc->state.fbi_config.chromaKey ); - GR_SET( hw->stipple, gc->state.fbi_config.stipple ); - GR_SET( hw->c0, gc->state.fbi_config.color0 ); - GR_SET( hw->c1, gc->state.fbi_config.color1 ); - - for ( tmu = 0; tmu < gc->num_tmu; tmu++ ) { - tmuregs = SST_TMU(hw,tmu); - PACKER_WORKAROUND; - GR_SET( tmuregs->textureMode, gc->state.tmu_config[tmu].textureMode ); - GR_SET( tmuregs->tLOD, gc->state.tmu_config[tmu].tLOD ); - GR_SET( tmuregs->tDetail, gc->state.tmu_config[tmu].tDetail ); - GR_SET( tmuregs->texBaseAddr, gc->state.tmu_config[tmu].texBaseAddr ); - GR_SET( tmuregs->texBaseAddr1, gc->state.tmu_config[tmu].texBaseAddr_1 ); - GR_SET( tmuregs->texBaseAddr2, gc->state.tmu_config[tmu].texBaseAddr_2 ); - GR_SET( tmuregs->texBaseAddr38, gc->state.tmu_config[tmu].texBaseAddr_3_8 ); - } - PACKER_WORKAROUND; - - /* NOTE: since glide state includes things like hints and - all cached variables like paramIndex we needn't recompute these, - BUT: we do need to rebuild stuff that depends on them!!! */ - - _grUpdateParamIndex(); - - GR_END_SLOPPY(); - -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) - if (gc->state.fbi_config.fbzMode & SST_YORIGIN) - grSstOrigin(GR_ORIGIN_LOWER_LEFT); - else - grSstOrigin(GR_ORIGIN_UPPER_LEFT); -#endif - -} /* grGlideSetState */ - -/*--------------------------------------------------------------------------- -** grRenderBuffer -** -** Although SST1 supports triple buffering, it's a hack in the hardware, -** and the only drawbuffer modes supported by the fbzMode register are 0 -** (back) and 1 (front) -*/ - -GR_ENTRY(grRenderBuffer, void, ( GrBuffer_t buffer )) -{ - - GR_BEGIN_NOFIFOCHECK("grRenderBuffer",85); - GDBG_INFO_MORE((gc->myLevel,"(%d)\n",buffer)); - GR_CHECK_F( myName, buffer >= GR_BUFFER_AUXBUFFER, "invalid buffer" ); - -#if ( GLIDE_PLATFORM & GLIDE_HW_SST1 ) - { - FxU32 fbzMode; - GR_SET_EXPECTED_SIZE( 4 ); - - fbzMode = gc->state.fbi_config.fbzMode; - fbzMode &= ~( SST_DRAWBUFFER ); - fbzMode |= buffer == GR_BUFFER_FRONTBUFFER ? SST_DRAWBUFFER_FRONT : SST_DRAWBUFFER_BACK; - - GR_SET( hw->fbzMode, fbzMode ); - gc->state.fbi_config.fbzMode = fbzMode; - } -#elif ( GLIDE_PLATFORM & GLIDE_HW_SST96 ) - initRenderBuffer( buffer ); -#else -# error "No renderbuffer implementation" -#endif - - GR_END(); -} /* grRenderBuffer */ - -GR_ENTRY(grCheckForRoom, void, (FxI32 n)) -{ - GR_DCL_GC; - GR_CHECK_FOR_ROOM(n); -} - -/*--------------------------------------------------------------------------- -** _grUpdateParamIndex -** -** Updates the paramIndex bits based on Glide state and the hints. -** -*/ -GR_DDFUNC(_grUpdateParamIndex, void, ( void )) -{ - GR_DCL_GC; - FxU32 paramIndex = 0; - FxU32 hints = gc->state.paramHints; - FxU32 fbzColorPath = gc->state.fbi_config.fbzColorPath; - FxU32 fogMode = gc->state.fbi_config.fogMode; - FxU32 fbzMode = gc->state.fbi_config.fbzMode; - -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) - FxU32 gwHeaderNum = 0; - /* Set up bits for vtx a,b,c x & y */ - gc->hwDep.sst96Dep.gwHeaders[gwHeaderNum] = GWH_VTX_BITS; -#endif - - /* - ** First, turn on every bit that we think we need. We can prune them - ** back later. - */ - - /* Turn on the texture bits based on what grTexCombine set */ - if (fbzColorPath & SST_ENTEXTUREMAP) { - /* No matter what, we need oow from the main grvertex structure */ - static FxU32 paramI_array[8] = { - STATE_REQUIRES_OOW_FBI, - STATE_REQUIRES_OOW_FBI | STATE_REQUIRES_W_TMU0 | STATE_REQUIRES_ST_TMU0, - STATE_REQUIRES_OOW_FBI | STATE_REQUIRES_W_TMU1 | STATE_REQUIRES_ST_TMU1, - STATE_REQUIRES_OOW_FBI | STATE_REQUIRES_W_TMU0 | STATE_REQUIRES_ST_TMU0 | - STATE_REQUIRES_W_TMU1 | STATE_REQUIRES_ST_TMU1, - STATE_REQUIRES_OOW_FBI | STATE_REQUIRES_W_TMU2 | STATE_REQUIRES_ST_TMU2, - STATE_REQUIRES_OOW_FBI | STATE_REQUIRES_W_TMU2 | STATE_REQUIRES_ST_TMU2 | - STATE_REQUIRES_W_TMU0 | STATE_REQUIRES_ST_TMU0, - STATE_REQUIRES_OOW_FBI | STATE_REQUIRES_W_TMU2 | STATE_REQUIRES_ST_TMU2 | - STATE_REQUIRES_W_TMU1 | STATE_REQUIRES_ST_TMU1, - STATE_REQUIRES_OOW_FBI | STATE_REQUIRES_W_TMU2 | STATE_REQUIRES_ST_TMU2 | - STATE_REQUIRES_W_TMU0 | STATE_REQUIRES_ST_TMU0 | - STATE_REQUIRES_W_TMU1 | STATE_REQUIRES_ST_TMU1 - }; - GR_ASSERT(gc->state.tmuMask < sizeof(paramI_array)/sizeof(paramI_array[0])); - paramIndex |= paramI_array[gc->state.tmuMask]; - } - - /* See if we need iterated RGB */ - if ( gc->state.cc_requires_it_rgb && !gc->state.cc_delta0mode ) { - paramIndex |= STATE_REQUIRES_IT_DRGB; -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) - gc->hwDep.sst96Dep.gwHeaders[gwHeaderNum] |= (GWH_RGB_BITS); -#endif - } - - /* See if we need to iterate alpha based on the value of - ac_requires_it_alpha */ - if (gc->state.ac_requires_it_alpha) { - paramIndex |= STATE_REQUIRES_IT_ALPHA; -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) - gc->hwDep.sst96Dep.gwHeaders[gwHeaderNum] |= GWH_A_BITS; -#endif - } - - /* See what fbzColorPath contributes - BUG 1084*/ - if ( ( fbzColorPath & SST_ALOCALSELECT ) == - ( SST_ALOCAL_Z ) ) { - paramIndex |= STATE_REQUIRES_OOZ; -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) - gc->hwDep.sst96Dep.gwHeaders[gwHeaderNum] |= GWH_Z_BITS; -#endif - } - - /* See what fbzMode contributes */ - if (fbzMode & SST_ENDEPTHBUFFER) { - if (fbzMode & SST_WBUFFER) { - paramIndex |= STATE_REQUIRES_OOW_FBI; -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) - gc->hwDep.sst96Dep.gwHeaders[gwHeaderNum] |= GWH_W_BITS; -#endif - } else { - paramIndex |= STATE_REQUIRES_OOZ; -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) - gc->hwDep.sst96Dep.gwHeaders[gwHeaderNum] |= GWH_Z_BITS; -#endif - } - } - - /* See what fogMode contributes */ - if (fogMode & SST_ENFOGGING) { - if (fogMode & SST_FOG_Z) { - paramIndex |= STATE_REQUIRES_OOZ; -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) - gc->hwDep.sst96Dep.gwHeaders[gwHeaderNum] |= GWH_Z_BITS; -#endif - } else { - if (fogMode & SST_FOG_ALPHA) { - paramIndex |= STATE_REQUIRES_IT_ALPHA; -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) - gc->hwDep.sst96Dep.gwHeaders[gwHeaderNum] |= GWH_A_BITS; -#endif - } else { - paramIndex |= STATE_REQUIRES_OOW_FBI; -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) - gc->hwDep.sst96Dep.gwHeaders[gwHeaderNum] |= GWH_W_BITS; -#endif - } - } - } - - /* - ** Now we know everything that needs to be iterated. Prune back - ** the stuff that isn't explicitly different - ** - ** NOTE: by GMT, STATE_REQUIRES_OOW_FBI is set whenever texture mapping - ** is enabled - */ - /* Turn off W for TMU0 if we don't have a hint */ - if (paramIndex & STATE_REQUIRES_W_TMU0) { - GR_ASSERT(paramIndex & STATE_REQUIRES_OOW_FBI); - if (!(hints & GR_STWHINT_W_DIFF_TMU0)) - paramIndex &= ~STATE_REQUIRES_W_TMU0; - } - - /* Turn off ST for TMU1 if TMU0 is active and TMU1 is not different */ - if (((paramIndex & (STATE_REQUIRES_ST_TMU0 | STATE_REQUIRES_ST_TMU1)) == - (STATE_REQUIRES_ST_TMU0 | STATE_REQUIRES_ST_TMU1)) && - !(hints & GR_STWHINT_ST_DIFF_TMU1)) - paramIndex &= ~STATE_REQUIRES_ST_TMU1; - - /* Turn off W for TMU1 if we have a previous W, and don't have a hint */ - if ((paramIndex & STATE_REQUIRES_W_TMU1) && !(hints & GR_STWHINT_W_DIFF_TMU1)) - paramIndex &= ~STATE_REQUIRES_W_TMU1; - -#if (GLIDE_NUM_TMU > 2) - /* Turn off ST for TMU1 if it's not different & any other is set up. */ - if ((paramIndex & (STATE_REQUIRES_ST_TMU0 | STATE_REQURES_ST_TMU1)) && - (paramIndex & STATE_REQUIRES_ST_TMU2) && - !(hints & GR_STWHINT_ST_DIFF_TMU2)) - paramIndex &= ~STATE_REQUIRES_ST_TMU2; - - /* Turn off W for TMU2 if we have a previous W, and don't have a hint */ - if ((paramIndex & STATE_REQUIRES_W_TMU2) && !(hints & GR_STWHINT_W_DIFF_TMU2)) - paramIndex &= ~STATE_REQUIRES_W_TMU2; -#endif - - gc->state.paramIndex = paramIndex; - - _grRebuildDataList(); - -} /* _grUpdateParamIndex */ - -#if defined(GLIDE_USE_ALT_REGMAP) - #define RED Fr_ALT - #define DRDX Fdrdx_ALT - #define DRDY Fdrdy_ALT - #define GRN Fg_ALT - #define DGDX Fdgdx_ALT - #define DGDY Fdgdy_ALT - #define BLU Fb_ALT - #define DBDX Fdbdx_ALT - #define DBDY Fdbdy_ALT - #define ALF Fa_ALT - #define DADX Fdadx_ALT - #define DADY Fdady_ALT - #define Z Fz_ALT - #define DZDX Fdzdx_ALT - #define DZDY Fdzdy_ALT - #define S Fs_ALT - #define DSDX Fdsdx_ALT - #define DSDY Fdsdy_ALT - #define T Ft_ALT - #define DTDX Fdtdx_ALT - #define DTDY Fdtdy_ALT - - #define W Fw_ALT - #define DWDX Fdwdx_ALT - #define DWDY Fdwdy_ALT -#else - - #define RED Fr - #define DRDX Fdrdx - #define DRDY Fdrdy - #define GRN Fg - #define DGDX Fdgdx - #define DGDY Fdgdy - #define BLU Fb - #define DBDX Fdbdx - #define DBDY Fdbdy - #define ALF Fa - #define DADX Fdadx - #define DADY Fdady - #define Z Fz - #define DZDX Fdzdx - #define DZDY Fdzdy - #define S Fs - #define DSDX Fdsdx - #define DSDY Fdsdy - #define T Ft - #define DTDX Fdtdx - #define DTDY Fdtdy - #define W Fw - #define DWDX Fdwdx - #define DWDY Fdwdy -#endif - -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) - -/*--------------------------------------------------------------------------- -** _grRebuildDataList -*/ -GR_DDFUNC(_grRebuildDataList, void, ( void )) -{ - GR_DCL_GC; - GR_DCL_HW; - int curTriSize, params; - FxU32 gwHeaderNum, gwpSize; /* header + vertices */ - FxU32 i, packMask=1; - Sstregs *tmu0; - Sstregs *tmu1; - -#ifdef GDBG_INFO_ON - static char *p_str[] = {"x","y","z","r","g","b","ooz","a","oow", - "s0","t0","w0","s1","t1","w1","s2","t2","w2"}; -#endif - - GDBG_INFO((80,"_grRebuildDataList() paramHints=0x%x paramIndex=0x%x\n", - gc->state.paramHints,gc->state.paramIndex)); - - curTriSize = params = 0; - i = gc->state.paramIndex; - if (_GlideRoot.CPUType == 6) packMask |= 2; - - tmu0 = SST_CHIP(hw,0xE); /* tmu 0,1,2 */ - tmu1 = SST_CHIP(hw,0xC); /* tmu 1,2 */ - - /* init group write data */ - gwHeaderNum = 0; - gwpSize = 8; /* header + vertices */ - /* !!! fixme - jdt - this won't ever change, actually, but this is the safest - place I can think of to init this for now */ - gc->hwDep.sst96Dep.gwCommand = GWH_GEN_ADDRESS(&hw->FvA.x); - - /* - ((((FxU32)((FxU32) &hw->FvA.x) - (FxU32) gc->lfb_ptr) >> 2) | 0x100000 | ( 1L << (31) )); - */ - - gc->hwDep.sst96Dep.gwHeaders[gwHeaderNum] = 0; - gc->hwDep.sst96Dep.gwHeaders[gwHeaderNum] |= GWH_VTX_BITS; - - if (i & STATE_REQUIRES_IT_DRGB) { - /* add 9 to size array for r,drdx,drdy,g,dgdx,dgdy,b,dbdx,dbdy */ - gc->dataList[curTriSize + 0].i = GR_VERTEX_R_OFFSET<<2; - gc->dataList[curTriSize + 0].addr = (float *)&hw->RED; - gc->dataList[curTriSize + 1].i = GR_VERTEX_G_OFFSET<<2; - gc->dataList[curTriSize + 1].addr = (float *)&hw->GRN; - gc->dataList[curTriSize + 2].i = GR_VERTEX_B_OFFSET<<2; - gc->dataList[curTriSize + 2].addr = (float *)&hw->BLU; - curTriSize += 3; - params += 3; - - gc->hwDep.sst96Dep.gwHeaders[gwHeaderNum] |= GWH_RGB_BITS; - gwpSize += 9; - } - - if (i & STATE_REQUIRES_OOZ) { - gc->dataList[curTriSize + 0].i = GR_VERTEX_OOZ_OFFSET<<2; - gc->dataList[curTriSize + 0].addr = (float *)&hw->Z; - curTriSize += 1; - params += 1; - - gc->hwDep.sst96Dep.gwHeaders[gwHeaderNum] |= GWH_Z_BITS; - gwpSize += 3; - } - - if (i & STATE_REQUIRES_IT_ALPHA) { - gc->dataList[curTriSize + 0].i = GR_VERTEX_A_OFFSET<<2; - gc->dataList[curTriSize + 0].addr = (float *)&hw->ALF; - curTriSize += 1; - params += 1; - - gc->hwDep.sst96Dep.gwHeaders[gwHeaderNum] |= GWH_A_BITS; - gwpSize += 3; - } - - /* TMU1 --------------------------------- */ - /* always output to ALL chips, saves from having to change CHIP field */ - if (i & STATE_REQUIRES_ST_TMU0) { - gc->dataList[curTriSize + 0].i = GR_VERTEX_SOW_TMU0_OFFSET<<2; - gc->dataList[curTriSize + 0].addr = (float *)&hw->S; - gc->dataList[curTriSize + 1].i = GR_VERTEX_TOW_TMU0_OFFSET<<2; - gc->dataList[curTriSize + 1].addr = (float *)&hw->T; - curTriSize += 2; - params += 2; - - gc->hwDep.sst96Dep.gwHeaders[gwHeaderNum] |= GWH_ST_BITS; - gwpSize += 6; - } - - /* we squeeze FBI.OOW in here for sequential writes in the simple case */ - if (i & STATE_REQUIRES_OOW_FBI) { - gc->dataList[curTriSize + 0].i = GR_VERTEX_OOW_OFFSET<<2; - gc->dataList[curTriSize + 0].addr = (float *)&hw->W; - curTriSize += 1; - params += 1; - - gc->hwDep.sst96Dep.gwHeaders[gwHeaderNum] |= GWH_W_BITS; - gwpSize += 3; - } - - /* NOTE: this is the first */ - if (i & STATE_REQUIRES_W_TMU0) { - /* We do this a bit differently for grouped writes */ - gc->dataList[curTriSize + 0].i = packMask; - gc->dataList[curTriSize + 0].addr = - (float *) GWH_GEN_ADDRESS(&tmu0->FvA.x); - gc->dataList[curTriSize + 1].i = GR_VERTEX_OOW_TMU0_OFFSET<<2; - gc->dataList[curTriSize + 1].addr = 0L; - - if (gwpSize & 1) - ++gwpSize; /* Justify your love */ - gwpSize += 5; /* 2 header + grads */ - - ++gwHeaderNum; - gc->hwDep.sst96Dep.gwHeaders[gwHeaderNum] |= GWH_W_BITS; - curTriSize += 2; - params += 1; - } - - gc->dataList[curTriSize++].i = 0; /* terminate the list with 0,* */ - /* followed by the FtriangleCMD reg */ - gc->dataList[curTriSize].i = packMask;/* encode P6 flag here for asm code */ - gc->dataList[curTriSize].addr = (float *)&hw->FtriangleCMD; - - /* 6 X,Y values plus AREA = 7, plus parameters */ - if (gwHeaderNum) { - if (gwpSize & 1) - ++gwpSize; /* justify your love */ - - /* If we've had a chip field change above then we need to start a - ** new packet for the triangle command, so we don't put it in the - ** original */ - gwpSize +=4; /* The triangleCMD GWP constitutes 4 DWORDS */ - } else { - gc->hwDep.sst96Dep.gwHeaders[gwHeaderNum] |= GWH_FTRIANGLECMD_BIT; - gwpSize++; /* Triangle Command */ - - if (gwpSize & 1) - ++gwpSize; /* justify the fifo */ - } - - _GlideRoot.curTriSize = gwpSize << 2; /* GR.curTriSize in bytes */ - - /* Need to know tri size without gradients for planar polygons */ - _GlideRoot.curTriSizeNoGradient = _GlideRoot.curTriSize - (params<<3); - -#ifdef GDBG_INFO_ON - GDBG_INFO((282, "DataList\n")); - for (i = 0; gc->dataList[i].i; i++) { - GDBG_INFO((282," dataList[%d] = %2d 0x%x [%s]\n", - i,gc->dataList[i].i>>2,gc->dataList[i].addr, - (gc->dataList[i].i & 1) ? "packer" : p_str[gc->dataList[i].i>>2])); - } -#endif - -} /* _grRebuildDataList */ - -#else /* It's SST1 */ - -/*--------------------------------------------------------------------------- -** _grRebuildDataList -*/ -GR_DDFUNC(_grRebuildDataList, void, ( void )) -{ - GR_DCL_GC; - GR_DCL_HW; - int curTriSize, params, packerFlag; - FxU32 i, packMask=1; - Sstregs *tmu0; - Sstregs *tmu1; - -#ifdef GLIDE_DEBUG - static char *p_str[] = {"x","y","z","r","g","b","ooz","a","oow", - "s0","t0","w0","s1","t1","w1","s2","t2","w2"}; -#endif - - GDBG_INFO((80,"_grRebuildDataList() paramHints=0x%x paramIndex=0x%x\n", - gc->state.paramHints,gc->state.paramIndex)); - - curTriSize = params = 0; - i = gc->state.paramIndex; - if (_GlideRoot.CPUType == 6) packMask |= 2; -#ifdef GLIDE_USE_ALT_REGMAP - hw = SST_WRAP(hw,128); /* wrap 128-257 are alternate - register mappings */ -#endif /* GLIDE_USE_ALT_REGMAP */ - - tmu0 = SST_CHIP(hw,0xE); /* tmu 0,1,2 */ - tmu1 = SST_CHIP(hw,0xC); /* tmu 1,2 */ - - if (i & STATE_REQUIRES_IT_DRGB) { - /* add 9 to size array for r,drdx,drdy,g,dgdx,dgdy,b,dbdx,dbdy */ - gc->dataList[curTriSize + 0].i = GR_VERTEX_R_OFFSET<<2; - gc->dataList[curTriSize + 0].addr = (float *)&hw->RED; - gc->dataList[curTriSize + 1].i = GR_VERTEX_G_OFFSET<<2; - gc->dataList[curTriSize + 1].addr = (float *)&hw->GRN; - gc->dataList[curTriSize + 2].i = GR_VERTEX_B_OFFSET<<2; - gc->dataList[curTriSize + 2].addr = (float *)&hw->BLU; - curTriSize += 3; - params += 3; - } - - if (i & STATE_REQUIRES_OOZ) { - gc->dataList[curTriSize + 0].i = GR_VERTEX_OOZ_OFFSET<<2; - gc->dataList[curTriSize + 0].addr = (float *)&hw->Z; - curTriSize += 1; - params += 1; - } - - if (i & STATE_REQUIRES_IT_ALPHA) { - gc->dataList[curTriSize + 0].i = GR_VERTEX_A_OFFSET<<2; - gc->dataList[curTriSize + 0].addr = (float *)&hw->ALF; - curTriSize += 1; - params += 1; - } - - /* TMU1 --------------------------------- */ - /* always output to ALL chips, saves from having to change CHIP field */ - if (i & STATE_REQUIRES_ST_TMU0) { - gc->dataList[curTriSize + 0].i = GR_VERTEX_SOW_TMU0_OFFSET<<2; - gc->dataList[curTriSize + 0].addr = (float *)&hw->S; - gc->dataList[curTriSize + 1].i = GR_VERTEX_TOW_TMU0_OFFSET<<2; - gc->dataList[curTriSize + 1].addr = (float *)&hw->T; - curTriSize += 2; - params += 2; - } - - /* we squeeze FBI.OOW in here for sequential writes in the simple case */ - if (i & STATE_REQUIRES_OOW_FBI) { - gc->dataList[curTriSize + 0].i = GR_VERTEX_OOW_OFFSET<<2; - gc->dataList[curTriSize + 0].addr = (float *)&hw->W; - curTriSize += 1; - params += 1; - } - /* NOTE: this is the first */ - if (i & STATE_REQUIRES_W_TMU0) { - gc->dataList[curTriSize + 0].i = packMask; - gc->dataList[curTriSize + 0].addr = (float *)_GlideRoot.packerFixAddress; - gc->dataList[curTriSize + 1].i = GR_VERTEX_OOW_TMU0_OFFSET<<2; - gc->dataList[curTriSize + 1].addr = (float *)&tmu0->W; - curTriSize += 2; - params += 1; - } - - /* TMU1 --------------------------------- */ - if (i & STATE_REQUIRES_ST_TMU1) { - gc->dataList[curTriSize + 0].i = packMask; - gc->dataList[curTriSize + 0].addr = (float *)_GlideRoot.packerFixAddress; - packerFlag = 0; - gc->dataList[curTriSize + 1].i = GR_VERTEX_SOW_TMU1_OFFSET<<2; - gc->dataList[curTriSize + 1].addr = (float *)&tmu1->S; - gc->dataList[curTriSize + 2].i = GR_VERTEX_TOW_TMU1_OFFSET<<2; - gc->dataList[curTriSize + 2].addr = (float *)&tmu1->T; - curTriSize += 3; - params += 2; - } - else packerFlag = 1; - - if (i & STATE_REQUIRES_W_TMU1) { - if (packerFlag) { - gc->dataList[curTriSize + 0].i = packMask; - gc->dataList[curTriSize + 0].addr = (float *)_GlideRoot.packerFixAddress; - curTriSize += 1; - } - gc->dataList[curTriSize + 0].i = GR_VERTEX_OOW_TMU1_OFFSET<<2; - gc->dataList[curTriSize + 0].addr = (float *)&tmu1->W; - curTriSize += 1; - params += 1; - } -#if (GLIDE_NUM_TMU > 2) - error WRITE THIS CODE; -#endif - - /* if last write was not to chip 0 */ - if ( SST_CHIP_MASK & (FxU32)gc->dataList[curTriSize-1].addr ) { - /* flag write as a packer bug fix */ - gc->dataList[curTriSize].i = packMask; - gc->dataList[curTriSize].addr = (float *)_GlideRoot.packerFixAddress; - curTriSize++; - } - - - gc->dataList[curTriSize++].i = 0; /* terminate the list with 0,* */ - /* followed by the FtriangleCMD reg */ - gc->dataList[curTriSize].i = packMask;/* encode P6 flag here for asm code */ - gc->dataList[curTriSize].addr = (float *)&hw->FtriangleCMD; - - /* 6 X,Y values plus AREA = 7, plus parameters */ - _GlideRoot.curTriSize = (6 + curTriSize + (params<<1)) <<2; - - /* Need to know tri size without gradients for planar polygons */ - _GlideRoot.curTriSizeNoGradient = _GlideRoot.curTriSize - (params<<3); - -#ifdef GLIDE_DEBUG - GDBG_INFO((282, "DataList\n")); - for (i = 0; gc->dataList[i].i; i++) { - GDBG_INFO((282," dataList[%d] = %2d 0x%x [%s]\n", - i,gc->dataList[i].i>>2,gc->dataList[i].addr, - (gc->dataList[i].i & 1) ? "packer" : - p_str[gc->dataList[i].i>>2])); - } -#endif - -} /* _grRebuildDataList */ - -#endif - -#if GLIDE_MULTIPLATFORM -/* - _grInitializeGCFuncs - initialize the gcFuncs Structure for this - device. -*/ -GR_DDFUNC(_grInitializeGCFuncs, void, (GrGC *gc)) -{ - - gc->gcFuncs._grColorCombineDelta0Mode = (void *) - GR_DDNAME(_grColorCombineDelta0Mode); - gc->gcFuncs._grRebuildDataList = (void *) GR_DDNAME(_grRebuildDataList); - gc->gcFuncs._grTexDetailControl = (void *) GR_DDNAME(_grTexDetailControl); - gc->gcFuncs._grTexDownloadNccTable = (void *) - GR_DDNAME(_grTexDownloadNccTable); - gc->gcFuncs._grTexDownloadPalette = (void *) - GR_DDNAME(_grTexDownloadPalette); - gc->gcFuncs._gumpTexCombineFunction = (void *) - GR_DDNAME(_gumpTexCombineFunction); - gc->gcFuncs._grUpdateParamIndex = (void *) - GR_DDNAME(_grUpdateParamIndex); - gc->gcFuncs._trisetup = (void *) GR_DDNAME(_trisetup); - gc->gcFuncs._trisetup_nogradients = (void *) - GR_DDNAME(_trisetup_nogradients); - gc->gcFuncs.grAADrawLine = (void *) GR_DDNAME(grAADrawLine); - gc->gcFuncs.grAADrawPoint = (void *) GR_DDNAME(grAADrawPoint); - gc->gcFuncs.grAADrawPolygon = (void *) GR_DDNAME(grAADrawPolygon); - gc->gcFuncs.grAADrawPolygonVertexList = (void *) - GR_DDNAME(grAADrawPolygonVertexList); - gc->gcFuncs.grAADrawTriangle = (void *) GR_DDNAME(grAADrawTriangle); - gc->gcFuncs.grAlphaBlendFunction = (void *) - GR_DDNAME(grAlphaBlendFunction); - gc->gcFuncs.grAlphaCombine = (void *) GR_DDNAME(grAlphaCombine); - gc->gcFuncs.grAlphaControlsITRGBLighting = (void *) - GR_DDNAME(grAlphaControlsITRGBLighting); - gc->gcFuncs.grAlphaTestFunction = (void *) - GR_DDNAME(grAlphaTestFunction); - gc->gcFuncs.grAlphaTestReferenceValue = (void *) - GR_DDNAME(grAlphaTestReferenceValue); - gc->gcFuncs.grBufferClear = (void *) GR_DDNAME(grBufferClear); - gc->gcFuncs.grBufferNumPending = (void *) - GR_DDNAME(grBufferNumPending); - gc->gcFuncs.grBufferSwap = (void *) GR_DDNAME(grBufferSwap); - gc->gcFuncs.grChromakeyMode = (void *) GR_DDNAME(grChromakeyMode); - gc->gcFuncs.grChromakeyValue = (void *) GR_DDNAME(grChromakeyValue); - gc->gcFuncs.grClipWindow = (void *) GR_DDNAME(grClipWindow); - gc->gcFuncs.grColorCombine = (void *) GR_DDNAME(grColorCombine); - gc->gcFuncs.grColorMask = (void *) GR_DDNAME(grColorMask); - gc->gcFuncs.grConstantColorValue = (void *) - GR_DDNAME(grConstantColorValue); - gc->gcFuncs.grConstantColorValue4 = (void *) - GR_DDNAME(grConstantColorValue4); - gc->gcFuncs.grCullMode = (void *) GR_DDNAME(grCullMode); - gc->gcFuncs.grDepthBiasLevel = (void *) GR_DDNAME(grDepthBiasLevel); - gc->gcFuncs.grDepthBufferFunction = (void *) - GR_DDNAME(grDepthBufferFunction); - gc->gcFuncs.grDepthBufferMode = (void *) GR_DDNAME(grDepthBufferMode); - - gc->gcFuncs.grDepthMask = (void *) GR_DDNAME(grDepthMask); - gc->gcFuncs.grDisableAllEffects = (void *) - GR_DDNAME(grDisableAllEffects); - gc->gcFuncs.grDitherMode = (void *) GR_DDNAME(grDitherMode); - gc->gcFuncs.grDrawLine = (void *) GR_DDNAME(grDrawLine); - gc->gcFuncs.grDrawPlanarPolygon = (void *) - GR_DDNAME(grDrawPlanarPolygon); - gc->gcFuncs.grDrawPlanarPolygonVertexList = (void *) - GR_DDNAME(grDrawPlanarPolygonVertexList); - gc->gcFuncs.grDrawPoint = (void *) GR_DDNAME(grDrawPoint); - gc->gcFuncs.grDrawPolygon = (void *) GR_DDNAME(grDrawPolygon); - gc->gcFuncs.grDrawPolygonVertexList = (void *) - GR_DDNAME(grDrawPolygonVertexList); - gc->gcFuncs.grDrawTriangle = (void *) GR_DDNAME(grDrawTriangle); - gc->gcFuncs.grFogColorValue = (void *) GR_DDNAME(grFogColorValue); - gc->gcFuncs.grFogMode = (void *) GR_DDNAME(grFogMode); - gc->gcFuncs.grFogTable = (void *) GR_DDNAME(grFogTable); - gc->gcFuncs.grGammaCorrectionValue = (void *) - GR_DDNAME(grGammaCorrectionValue); - gc->gcFuncs.grGlideSetState = (void *) GR_DDNAME(grGlideSetState); - gc->gcFuncs.grGlideShutdown = (void *) GR_DDNAME(grGlideShutdown); - gc->gcFuncs.grLfbConstantAlpha = (void *) - GR_DDNAME(grLfbConstantAlpha); - gc->gcFuncs.grLfbConstantDepth = (void *) - GR_DDNAME(grLfbConstantDepth); - gc->gcFuncs.grLfbLock = (void *)GR_DDNAME(grLfbLock); - gc->gcFuncs.grLfbUnlock = (void*)GR_DDNAME(grLfbUnlock); - gc->gcFuncs.grLfbWriteColorFormat = (void *) - GR_DDNAME(grLfbWriteColorFormat); - gc->gcFuncs.grLfbWriteColorSwizzle = (void *) - GR_DDNAME(grLfbWriteColorSwizzle); - gc->gcFuncs.grRenderBuffer = (void *) GR_DDNAME(grRenderBuffer); - gc->gcFuncs.grSstConfigPipeline = (void *) - GR_DDNAME(grSstConfigPipeline); - gc->gcFuncs.grSstIdle = (void *) GR_DDNAME(grSstIdle); - gc->gcFuncs.grSstIsBusy = (void *) GR_DDNAME(grSstIsBusy); - gc->gcFuncs.grSstOpen = (void *) GR_DDNAME(grSstOpen); - gc->gcFuncs.grSstOrigin = (void *) GR_DDNAME(grSstOrigin); - gc->gcFuncs.grSstPassthruMode = (void *) GR_DDNAME(grSstPassthruMode); - - gc->gcFuncs.grSstPerfStats = (void *) GR_DDNAME(grSstPerfStats); - gc->gcFuncs.grSstResetPerfStats = (void *) GR_DDNAME(grSstResetPerfStats); - gc->gcFuncs.grSstStatus = (void *) GR_DDNAME(grSstStatus); - gc->gcFuncs.grSstVRetraceOn = (void *) GR_DDNAME(grSstVRetraceOn); - gc->gcFuncs.grSstVideoLine = (void *) GR_DDNAME(grSstVideoLine); - gc->gcFuncs.grTexClampMode = (void *) GR_DDNAME(grTexClampMode); - gc->gcFuncs.grTexCombine = (void *) GR_DDNAME(grTexCombine); - gc->gcFuncs.grTexDownloadMipMapLevelPartial = (void *) - GR_DDNAME(grTexDownloadMipMapLevelPartial); - gc->gcFuncs.grTexFilterMode = (void *) GR_DDNAME(grTexFilterMode); - gc->gcFuncs.grTexLodBiasValue = (void *) GR_DDNAME(grTexLodBiasValue); - gc->gcFuncs.grTexMipMapMode = (void *) GR_DDNAME(grTexMipMapMode); - gc->gcFuncs.grTexMultibase = (void *) GR_DDNAME(grTexMultibase); - gc->gcFuncs.grTexMultibaseAddress = (void *) - GR_DDNAME(grTexMultibaseAddress); - gc->gcFuncs.grTexNCCTable = (void *) GR_DDNAME(grTexNCCTable); - gc->gcFuncs.grTexSource = (void *) GR_DDNAME(grTexSource); - gc->gcFuncs.guMPDrawTriangle = (void *) GR_DDNAME(guMPDrawTriangle); - gc->gcFuncs.guTexSource = (void *) GR_DDNAME(guTexSource); - gc->gcFuncs.ConvertAndDownloadRle=(void *) GR_DDNAME(ConvertAndDownloadRle); - gc->gcFuncs.grCheckForRoom=(void *) GR_DDNAME(grCheckForRoom); -} /* _grInitializeGCFuncs */ -#endif diff --git a/glide2x/sst1/glide/src/glfb.c b/glide2x/sst1/glide/src/glfb.c deleted file mode 100644 index 8a51b7e..0000000 --- a/glide2x/sst1/glide/src/glfb.c +++ /dev/null @@ -1,1020 +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$ - * - * 23 6/30/97 10:51a Dow - * Changed size check in grLfbLock to warning - * - * 22 6/03/97 3:50p Pgj - * fix bugs 580 and 581 - * - * 21 5/05/97 2:25p Hanson - * Fixed unlock bug with grLfbUnlock. On Rush it would always return - * false. - * - * 20 5/02/97 9:43a Dow - * Changed indentation to match rest of file, made grLfbLock idle on Jr. - * - * 19 4/08/97 12:47p Jdt - * Bug in grLfbUnlock() - * - * 18 4/02/97 3:24a Hanson - * Fixed bug with locking read of Auxbuffer on SST1 - * - * 17 3/27/97 9:30p Hanson - * Fixed my mistake of masking out the no idle bit to late in the - * grLfbUnlock code. - * - * 16 3/26/97 5:04p Hanson - * - * 15 3/19/97 1:37a Jdt - * Added real stride computation. - * - * 14 3/18/97 9:07p Dow - * Got rid of #$#%#$ // comments - * - * 13 3/13/97 1:18a Jdt - * Re-wrote grLfbWriteRegion to be faster and also be nice to the fifo. - * Added grLfbReadRegion for sli boards. Need an sli setup on whihc to - * test. - * - * 12 3/12/97 2:54p Jdt - * Fixes for vg96 - * - * 11 3/12/97 11:11a Jdt - * Fixed format bug. Fixed yorigin problem. Fixed locking bug. - * - * 10 3/06/97 9:03p Jdt - * Removed Watcom Warning. - * - * 9 3/05/97 9:35p Jdt - * Added grLfbWriteRegion - * - * 8 3/04/97 9:08p Dow - * Neutered multiplatform multiheaded monster - * - * 7 2/26/97 11:56a Jdt - * changed lfb api - * - * 6 12/23/96 1:37p Dow - * chagnes for multiplatform glide -** -*/ -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -/*--------------------------------------------------------------------------- -** grLfbConstantAlpha -*/ -GR_ENTRY(grLfbConstantAlpha, void, ( GrAlpha_t alpha )) -{ - GR_BEGIN_NOFIFOCHECK("grLfbConstantAlpha",82); - GDBG_INFO_MORE((gc->myLevel,"(0x%x)\n",alpha)); - - gc->state.lfb_constant_alpha = alpha; - GR_END(); -} /* grLfbConstantAlpha */ - -/*--------------------------------------------------------------------------- -** grLfbConstantDepth -*/ -GR_ENTRY(grLfbConstantDepth, void, ( FxU16 depth )) -{ - GR_BEGIN_NOFIFOCHECK("grLfbConstantDepth",82); - GDBG_INFO_MORE((gc->myLevel,"(0x%x)\n",depth)); - - gc->state.lfb_constant_depth = depth; - GR_END(); -} /* grLfbConstantDepth */ - - -/*------------------------------------------------------------------- - Function: grLfbLock - Date: 2/19 - Implementor(s): jdt - Library: Glide - Description: - Secures a pointer to a requested frame buffer and guarantees ordered - access to that buffer. - - Arguments: - type - type of lock, one of: - GR_LOCK_WRITE_ONLY - GR_LOCK_READ_ONLY - buffer - which buffer to lock, one of: - GR_BUFFER_FRONTBUFFER - GR_BUFFER_BACKBUFFER - GR_BUFFER_AUXBUFFER - writeMode - desired destination color format - origin - desired lfb origin - pixelPipeline - flag whether to process through pixpipe - info - pointer to info structure - Return: - FXTRUE - lock is successful - FXFALSE - lock fails - -------------------------------------------------------------------*/ - -GR_ENTRY(grLfbLock, FxBool,( GrLock_t type, GrBuffer_t buffer, GrLfbWriteMode_t writeMode, GrOriginLocation_t origin, FxBool pixelPipeline, GrLfbInfo_t *info ) ) -{ - FxBool rv = FXTRUE; - FxU32 lockIdle; - - GR_BEGIN_NOFIFOCHECK("grLfbLock",82); - GDBG_INFO_MORE((gc->myLevel,"(%d,%d,0x%x)\n", type, buffer, info)); - - GR_CHECK_F( myName, !info, - "Null info structure passed." ); - - /* changed from GR_CHECK_F to match the docuementation */ - - GR_CHECK_W(myName, (info->size != sizeof( GrLfbInfo_t )), - "Invalid size sent to grLfbLock()"); - - lockIdle = !(type & GR_LFB_NOIDLE); - type = type & ~(GR_LFB_NOIDLE); - -#if ( GLIDE_PLATFORM & GLIDE_HW_SST1 ) - { - switch( type ) { - case GR_LFB_READ_ONLY: - { - FxU32 lfbMode; - - if ( gc->lockPtrs[type] != (FxU32)-1 ) { - GDBG_INFO(( 83, "Read lock failure due to existing lock" )); - rv = FXFALSE; - } else { - lfbMode = gc->state.fbi_config.lfbMode; - lfbMode &= ~( SST_LFB_READBUFSELECT | - SST_LFB_YORIGIN ); - - GR_SET_EXPECTED_SIZE( 4 ); - - /* You may not read-lock an SLI board */ - if ( (gc->scanline_interleaved == FXTRUE) && - (gc->lfbSliOk==1) ) { - GDBG_INFO((83, - "Read lock failure: read lock" - " disallowed for SLI, use " - "grLfbReadRegion()\n" )); - rv = FXFALSE; - } - - switch( buffer ) { - case GR_BUFFER_FRONTBUFFER: - lfbMode |= SST_LFB_READFRONTBUFFER; - break; - case GR_BUFFER_BACKBUFFER: - lfbMode |= SST_LFB_READBACKBUFFER; - break; - case GR_BUFFER_AUXBUFFER: - lfbMode |= SST_LFB_READAUXBUFFER; - break; - default: - GR_CHECK_F( myName, - 1, - "illegal buffer parameter passed" ); - rv = FXFALSE; - break; - } - - lfbMode |= ( origin )?SST_LFB_YORIGIN:0; - - GR_SET( hw->lfbMode, lfbMode ); - gc->state.fbi_config.lfbMode = lfbMode; - - info->lfbPtr = gc->lfb_ptr; - info->strideInBytes = gc->fbStride * 2; - info->origin = origin; - - if ( rv == FXTRUE ) - gc->lockPtrs[type] = buffer; - } - } - break; - case GR_LFB_WRITE_ONLY: - { - FxU32 lfbMode, zaColor, fbzMode; - - - if ( gc->lockPtrs[type] != (FxU32)-1 ) { - GDBG_INFO(( 83, "Write failure due to existing lock" )); - rv = FXFALSE; - } else { - GR_SET_EXPECTED_SIZE( 12 ); - - /* - ** Set up the constant depth register because it may have been - ** trashed by a call to grDepthBiasLevel (depthbiaslevel and - ** constant depth use the same register) - */ - zaColor = gc->state.fbi_config.zaColor; - zaColor = ((( FxU32 ) gc->state.lfb_constant_depth ) << SST_ZACOLOR_DEPTH_SHIFT ); - zaColor |= (gc->state.lfb_constant_alpha << SST_ZACOLOR_ALPHA_SHIFT); - GR_SET( hw->zaColor, zaColor ); - - /* - ** disable depth biasing - */ - fbzMode = gc->state.fbi_config.fbzMode; - fbzMode &= ~( SST_ENZBIAS ); - - lfbMode = gc->state.fbi_config.lfbMode; - lfbMode &= ~( SST_LFB_WRITEBUFSELECT | - SST_LFB_YORIGIN | - SST_LFB_FORMAT | - SST_LFB_ENPIXPIPE ); - - switch( writeMode ) { - case GR_LFBWRITEMODE_RESERVED1: - case GR_LFBWRITEMODE_RESERVED2: - case GR_LFBWRITEMODE_RESERVED3: - case GR_LFBWRITEMODE_RESERVED4: - case GR_LFBWRITEMODE_RESERVED5: - case GR_LFBWRITEMODE_RESERVED6: - case GR_LFBWRITEMODE_RESERVED7: - rv = FXFALSE; - } - - switch( buffer ) { - case GR_BUFFER_FRONTBUFFER: - if (writeMode == GR_LFBWRITEMODE_ANY) { - writeMode = GR_LFBWRITEMODE_565; - } else if ( writeMode == GR_LFBWRITEMODE_ZA16 ) { - rv = FXFALSE; - } - lfbMode |= SST_LFB_WRITEFRONTBUFFER; - break; - case GR_BUFFER_BACKBUFFER: - if (writeMode == GR_LFBWRITEMODE_ANY) { - writeMode = GR_LFBWRITEMODE_565; - } else if ( writeMode == GR_LFBWRITEMODE_ZA16 ) { - rv = FXFALSE; - } - lfbMode |= SST_LFB_WRITEBACKBUFFER; - break; - case GR_BUFFER_AUXBUFFER: - if (writeMode == GR_LFBWRITEMODE_ANY) { - writeMode = GR_LFBWRITEMODE_ZA16; - } else if ( writeMode != GR_LFBWRITEMODE_ZA16 ) { - rv = FXFALSE; - } - lfbMode |= SST_LFB_WRITEFRONTBUFFER; - break; - default: - GR_CHECK_F( myName, - 1, - "illegal buffer parameter passed" ); - break; - } /* end switch(buffer) */ - - lfbMode |= ( writeMode << SST_LFB_FORMAT_SHIFT ); - lfbMode |= ( origin )?SST_LFB_YORIGIN:0; - - if ( pixelPipeline ) { - lfbMode |= SST_LFB_ENPIXPIPE; - fbzMode &= ~SST_YORIGIN; - fbzMode |= (origin)?SST_YORIGIN:0; - } - - GR_SET( hw->lfbMode, lfbMode ); - gc->state.fbi_config.lfbMode = lfbMode; - - GR_SET( hw->fbzMode, fbzMode ); - P6FENCE; /* This is required to flush the write - buffers before the actual LFB writes */ - - /* GMT: very low-risk race condition is probable here - if a direct LFB read is done aftewards, the lfbMode register might - not have settled in yet, and the pixel may be read in the wrong - mode. However, the 2 write above help reduce the chance of this. - The proper thing to do is to call grSstIdle() here, but that's - too slow. - */ - - info->lfbPtr = gc->lfb_ptr; - info->origin = origin; - info->writeMode = writeMode; - - switch( lfbMode & SST_LFB_FORMAT ) { - case SST_LFB_565: - case SST_LFB_555: - case SST_LFB_1555: - case SST_LFB_ZZ: - info->strideInBytes = gc->fbStride * 2; - break; - case SST_LFB_888: - case SST_LFB_8888: - case SST_LFB_Z565: - case SST_LFB_Z555: - case SST_LFB_Z1555: - info->strideInBytes = gc->fbStride * 4; - break; - } - - if ( rv == FXTRUE ) - gc->lockPtrs[type] = buffer; - } - } - break; - default: - rv = FXFALSE; - GDBG_INFO((gc->myLevel, "Lock failed because of invalid lock type." )); - break; - } - } - -#elif ( GLIDE_PLATFORM & GLIDE_HW_SST96 ) - switch( type ) { - case GR_LFB_READ_ONLY: - if ( gc->lockPtrs[type]!= (FxU32)-1 ) { - GDBG_INFO(( 83, "Read lock failure due to existing lock" )); - rv = FXFALSE; - } else { - info->lfbPtr = initGetBufferPtr( buffer, &info->strideInBytes ); - if ( origin != GR_ORIGIN_UPPER_LEFT ) { - GDBG_INFO((gc->myLevel, - "Lock failed because of unsu" - "pported origin." )); - rv = FXFALSE; - } - info->origin = GR_ORIGIN_UPPER_LEFT; - if ( rv == FXTRUE ) - gc->lockPtrs[type] = buffer; - } - break; - case GR_LFB_WRITE_ONLY: - if ( gc->lockPtrs[type]!= (FxU32)-1 ) { - GDBG_INFO(( 83, "Read lock failure due to existing lock" )); - rv = FXFALSE; - } else { - info->lfbPtr = initGetBufferPtr( buffer, &info->strideInBytes ); - if ( !info->lfbPtr ) { - GDBG_INFO((gc->myLevel, - "Lock failed because buffer doesn't exist" )); - rv = FXFALSE; - } - if ( origin != GR_ORIGIN_UPPER_LEFT ) { - GDBG_INFO((gc->myLevel, - "Lock failed because of unsupported origin." )); - rv = FXFALSE; - } - - /* Voodoo Rush lfb writes don't go through the pixel pipeline */ - switch( buffer ) { - case GR_BUFFER_FRONTBUFFER: - if (writeMode == GR_LFBWRITEMODE_ANY) { - writeMode = GR_LFBWRITEMODE_565; - } else if ( writeMode != GR_LFBWRITEMODE_565 ) { - rv = FXFALSE; - } - break; - case GR_BUFFER_BACKBUFFER: - if (writeMode == GR_LFBWRITEMODE_ANY) { - writeMode = GR_LFBWRITEMODE_565; - } else if ( writeMode != GR_LFBWRITEMODE_565 ) { - rv = FXFALSE; - } - break; - case GR_BUFFER_AUXBUFFER: - if (writeMode == GR_LFBWRITEMODE_ANY) { - writeMode = GR_LFBWRITEMODE_ZA16; - } else if ( writeMode != GR_LFBWRITEMODE_ZA16 ) { - rv = FXFALSE; - } - break; - default: - GR_CHECK_F( myName, 1, "illegal buffer parameter passed" ); - break; - } /* end switch(buffer) */ - - if ( pixelPipeline ) { - GDBG_INFO((gc->myLevel, - "Lock failed because pixelpipeline is not available on VG96." )); - rv = FXFALSE; - } - info->writeMode = writeMode; - info->origin = GR_ORIGIN_UPPER_LEFT; - if ( rv == FXTRUE ) - gc->lockPtrs[type] = buffer; - GDBG_INFO(( gc->myLevel, - "Write Lock Successful: ptr=0x%.08x stride=%.04d\n", - info->lfbPtr, - info->strideInBytes )); - } - break; - } /* end switch(type) */ - -#else -# error "No lfb implementation for this platform" -#endif - GR_CHECK_SIZE(); - /* We HAVE to idle on Jr., as out-of-order LFBs are unacceptable */ - if ( - lockIdle || - ( - _GlideRoot.hwConfig.SSTs[_GlideRoot.current_sst].type == - GR_SSTTYPE_SST96 - ) - ) - grSstIdle(); - GR_RETURN( rv ); -} /* grLfbLock */ - -/*------------------------------------------------------------------- - Function: grLfbUnlock - Date: 2/21 - Implementor(s): jdt - Library: Glide - Description: - Unlock a previously locked buffer - Arguments: - type - type of lock ( read only/write only ) - buffer - which buffer to unlock - Return: - FXTRUE - success - FXFALSE - failure - -------------------------------------------------------------------*/ - -GR_ENTRY(grLfbUnlock, FxBool, ( GrLock_t type, GrBuffer_t buffer ) ) -{ - FxBool rval = FXFALSE; - - GR_BEGIN_NOFIFOCHECK("grLfbUnLock",83 ); - GDBG_INFO_MORE((gc->myLevel,"(%d, %d)\n", type, buffer )); - - type = type & ~(GR_LFB_NOIDLE); - - GR_CHECK_F( myName, - type != GR_LFB_WRITE_ONLY && - type != GR_LFB_READ_ONLY, - "Bad type" ); - - GR_CHECK_F( myName, - buffer != GR_BUFFER_FRONTBUFFER && - buffer != GR_BUFFER_BACKBUFFER && - buffer != GR_BUFFER_AUXBUFFER, - "Bad buffer" ); - -#if ( GLIDE_PLATFORM & GLIDE_HW_SST1 ) - if ( gc->lockPtrs[type] == (FxU32)buffer ) { - rval = FXTRUE; - - if ( gc->scanline_interleaved == FXTRUE ) { - GR_SET_EXPECTED_SIZE( 12 ); - } else { - GR_SET_EXPECTED_SIZE( 8 ); - } - - /* Restore depth bias level */ - GR_SET( hw->zaColor, gc->state.fbi_config.zaColor ); - - /* turn back on depth biasing */ - GR_SET( hw->fbzMode, gc->state.fbi_config.fbzMode ); - - if ( gc->scanline_interleaved == FXTRUE ) - GR_SET( hw->nopCMD, 0x0 ); - - gc->lockPtrs[type] = (FxU32)-1; - } else { - GDBG_INFO((gc->myLevel, "Unlock failed because there was no matching lock" )); - rval = FXFALSE; - } -#elif ( GLIDE_PLATFORM & GLIDE_HW_SST96 ) - if ( gc->lockPtrs[type] == (FxU32)buffer ) { - rval = FXTRUE; - - gc->lockPtrs[type] = (FxU32)-1; - } else { - GDBG_INFO((gc->myLevel, "Unlock failed because there was no matching lock" )); - rval = FXFALSE; - } -#endif - GR_RETURN( rval ); -} /* grLfbUnlock */ - - -/*--------------------------------------------------------------------------- -** grLfbWriteColorFormat -** -*/ - -GR_ENTRY(grLfbWriteColorFormat, void, (GrColorFormat_t colorFormat)) -{ -#if !(GLIDE_PLATFORM & GLIDE_HW_SST96) - FxU32 lfbMode; - - GR_BEGIN("grLfbWriteColorFormat",82,8); - GDBG_INFO_MORE((gc->myLevel,"(%d)\n",colorFormat)); - - GR_CHECK_F(myName, - colorFormat < 0 || colorFormat > 0x3, - "invalid color format"); - - lfbMode = gc->state.fbi_config.lfbMode; - lfbMode &= ~SST_LFB_RGBALANES; - lfbMode |= (colorFormat << SST_LFB_RGBALANES_SHIFT); - - GR_SET( hw->lfbMode, lfbMode ); - gc->state.fbi_config.lfbMode = lfbMode; - if ( gc->scanline_interleaved == FXTRUE ) - GR_SET( hw-> nopCMD, 0x0 ); - GR_END_SLOPPY(); -#else - return; -#endif -} /* grLfbWriteColorFormat */ - - -/*--------------------------------------------------------------------------- -** grLfbWriteColorSwizzle - set up SST for byte swizzling and word swapping -** -** Registers/Bits Affected: -** lfbMode: bit(11), bit(12) -** -** WARNING: GMT: SST_LFB_WRITE_SWAP16 changes pixel addressing!!! -*/ - -GR_ENTRY(grLfbWriteColorSwizzle, void, (FxBool swizzleBytes, FxBool swapWords)) -{ -#if !(GLIDE_PLATFORM & GLIDE_HW_SST96) - FxU32 lfbMode; - - GR_BEGIN("grLfbWriteColorSwizzle",82,8); - GDBG_INFO_MORE((gc->myLevel,"(%d,%d)\n",swizzleBytes,swapWords)); - - /* Clear out the bits we'll set back if appropriate */ - lfbMode = gc->state.fbi_config.lfbMode; - lfbMode &= ~(SST_LFB_WRITE_SWAP16 | SST_LFB_WRITE_BYTESWAP); - - if (swizzleBytes) - lfbMode |= SST_LFB_WRITE_BYTESWAP; - - if (swapWords) - lfbMode |= SST_LFB_WRITE_SWAP16; - - GR_SET( hw->lfbMode, lfbMode ); - gc->state.fbi_config.lfbMode = lfbMode; - if ( gc->scanline_interleaved == FXTRUE ) - GR_SET( hw-> nopCMD, 0x0 ); - GR_END_SLOPPY(); -#else - return; -#endif -} /* grLfbWriteColorSwizzle */ - -/*------------------------------------------------------------------- - Function: grLfbWriteRegion - Date: 3/5 - Implementor(s): jdt - Library: Glide - Description: - Write a pixel rectangle to the frame buffer as efficiently as possible - Arguments: - dst_buffer - buffer to which to copy data - dst_x,dst_y - destination image start coordinates - src_format - data format of source image - src_width, src_height - - dimensions of source image - src_stride - stride of source image in bytes, not meaningful - for RLE images - src_data - pointer to source data memory - Return: - FXTRUE succeed - FXFALSE fail - -------------------------------------------------------------------*/ -GR_ENTRY(grLfbWriteRegion, FxBool, ( GrBuffer_t dst_buffer, - FxU32 dst_x, FxU32 dst_y, - GrLfbSrcFmt_t src_format, - FxU32 src_width, FxU32 src_height, - FxI32 src_stride, void *src_data )) -{ - FxBool rv = FXTRUE; - GrLfbInfo_t info; - GrLfbWriteMode_t writeMode; - - GR_BEGIN_NOFIFOCHECK("grLfbWriteRegion",82); - GDBG_INFO_MORE((gc->myLevel, - "(0x%x,%d,%d,%d,%d,%d,%d,0x%x)\n", - dst_buffer, dst_x, dst_y, - src_format, src_width, src_height, - src_stride, src_data )); - -#if ( GLIDE_PLATFORM & GLIDE_HW_SST1 ) - if ( src_format == GR_LFB_SRC_FMT_RLE16 ) - writeMode = GR_LFBWRITEMODE_565; - else - writeMode = src_format; - - info.size = sizeof( info ); - - if ( grLfbLock( GR_LFB_WRITE_ONLY | GR_LFB_NOIDLE, - dst_buffer, - writeMode, - GR_ORIGIN_UPPER_LEFT, - FXFALSE, - &info ) ) { - FxU32 *srcData; /* Tracking Source Pointer */ - FxU32 *dstData; /* Tracking Destination Pointer */ - FxU32 *end; /* Demarks End of each Scanline */ - FxI32 srcJump; /* bytes to next scanline */ - FxU32 dstJump; /* bytes to next scanline */ - FxU32 length; /* bytes to copy in scanline */ - FxU32 scanline; /* scanline number */ - int aligned; /* word aligned? */ - - - srcData = ( FxU32 * ) src_data; - dstData = ( FxU32 * ) ( ((char*)info.lfbPtr)+ - (dst_y*info.strideInBytes) ); - scanline = src_height; - - switch( src_format ) { - /* 16-bit aligned */ - case GR_LFB_SRC_FMT_565: - case GR_LFB_SRC_FMT_555: - case GR_LFB_SRC_FMT_1555: - case GR_LFB_SRC_FMT_ZA16: - dstData = (FxU32*)(((FxU16*)dstData) + dst_x); - length = src_width * 2; - aligned = !((int)dstData&0x2); - srcJump = src_stride - length; - dstJump = info.strideInBytes - length; - if ( aligned ) { - while( scanline-- ) { - GR_SET_EXPECTED_SIZE(length); - end = (FxU32*)((char*)srcData + length - 2); - while( srcData < end ) { - GR_SET( dstData[0], srcData[0] ); - dstData++; - srcData++; - } - - if ( ((int)length) & 0x2 ) { - GR_SET16( (*(FxU16*)&(dstData[0])), - (*(FxU16*)&(srcData[0])) ); - dstData = (FxU32*)(((FxU16*)dstData) + 1 ); - srcData = (FxU32*)(((FxU16*)srcData) + 1 ); - } - - dstData = (FxU32*)(((char*)dstData)+dstJump); - srcData = (FxU32*)(((char*)srcData)+srcJump); - GR_CHECK_SIZE_SLOPPY(); - } - } else { - while( scanline-- ) { - GR_SET_EXPECTED_SIZE(length); - end = (FxU32*)((char*)srcData + length - 2); - - GR_SET16( (*(FxU16*)&(dstData[0])), - (*(FxU16*)&(srcData[0])) ); - dstData = (FxU32*)(((FxU16*)dstData) + 1 ); - srcData = (FxU32*)(((FxU16*)srcData) + 1 ); - - while( srcData < end ) { - GR_SET( dstData[0], srcData[0] ); - dstData++; - srcData++; - } - - if ( !(length & 0x2) ) { - GR_SET16( (*(FxU16*)&(dstData[0])), - (*(FxU16*)&(srcData[0])) ); - dstData = (FxU32*)(((FxU16*)dstData) + 1 ); - srcData = (FxU32*)(((FxU16*)srcData) + 1 ); - } - - dstData = (FxU32*)(((char*)dstData)+dstJump); - srcData = (FxU32*)(((char*)srcData)+srcJump); - GR_CHECK_SIZE_SLOPPY(); - } - } - break; - /* 32-bit aligned */ - case GR_LFB_SRC_FMT_888: - case GR_LFB_SRC_FMT_8888: - case GR_LFB_SRC_FMT_565_DEPTH: - case GR_LFB_SRC_FMT_555_DEPTH: - case GR_LFB_SRC_FMT_1555_DEPTH: - dstData = ((FxU32*)dstData) + dst_x; - length = src_width * 4; - srcJump = src_stride - length; - dstJump = info.strideInBytes - length; - while( scanline-- ) { - GR_SET_EXPECTED_SIZE(length); - end = (FxU32*)((char*)srcData + length); - while( srcData < end ) { - GR_SET( dstData[0], srcData[0] ); - dstData++; - srcData++; - } - dstData = (FxU32*)(((char*)dstData)+dstJump); - srcData = (FxU32*)(((char*)srcData)+srcJump); - GR_CHECK_SIZE_SLOPPY(); - } - break; - case GR_LFB_SRC_FMT_RLE16: - /* needs to be implemented */ - rv = FXFALSE; - break; - } - grLfbUnlock( GR_LFB_WRITE_ONLY, dst_buffer ); - } else { - rv = FXFALSE; - } -#elif ( GLIDE_PLATFORM & GLIDE_HW_SST96 ) - if ( src_format == GR_LFB_SRC_FMT_RLE16 ) { - rv = FXFALSE; - GR_RETURN( rv ); - } else - writeMode = src_format; - - info.size = sizeof( info ); - - if ( grLfbLock( GR_LFB_WRITE_ONLY, - dst_buffer, - writeMode, - GR_ORIGIN_UPPER_LEFT, - FXFALSE, - &info ) ) { - FxU32 *srcData; /* Tracking Source Pointer */ - FxU32 *dstData; /* Tracking Destination Pointer */ - FxU32 *end; /* Demarks End of each Scanline */ - FxI32 srcJump; /* bytes to next scanline */ - FxU32 dstJump; /* bytes to next scanline */ - FxU32 length; /* bytes to copy in scanline */ - FxU32 scanline; /* scanline number */ - int aligned; /* word aligned? */ - - - srcData = ( FxU32 * ) src_data; - dstData = ( FxU32 * ) ( ((char*)info.lfbPtr)+ - (dst_y*info.strideInBytes)+ - (dst_x<<1)); - scanline = src_height; - length = src_width * 2; - aligned = !((int)dstData&0x2); - srcJump = src_stride - length; - dstJump = info.strideInBytes - length; - if ( aligned ) { - while( scanline-- ) { - end = (FxU32*)((char*)srcData + length - 2); - while( srcData < end ) - *dstData++ = *srcData++; - - if ( ((int)length) & 0x2 ) { - *(FxU16*)dstData = *(FxU16*)srcData; - dstData = (FxU32*)(((FxU16*)dstData) + 1 ); - srcData = (FxU32*)(((FxU16*)srcData) + 1 ); - } - - dstData = (FxU32*)(((char*)dstData)+dstJump); - srcData = (FxU32*)(((char*)srcData)+srcJump); - } - } else { - while( scanline-- ) { - end = (FxU32*)((char*)srcData + length - 2); - - *(FxU16*)dstData = *(FxU16*)srcData; - dstData = (FxU32*)(((FxU16*)dstData) + 1 ); - srcData = (FxU32*)(((FxU16*)srcData) + 1 ); - - while( srcData < end ) - *dstData++ = *srcData++; - - if ( !(((int)length) & 0x2) ) { - *(FxU16*)dstData = *(FxU16*)srcData; - dstData = (FxU32*)(((FxU16*)dstData) + 1 ); - srcData = (FxU32*)(((FxU16*)srcData) + 1 ); - } - - dstData = (FxU32*)(((char*)dstData)+dstJump); - srcData = (FxU32*)(((char*)srcData)+srcJump); - } - } - grLfbUnlock( GR_LFB_WRITE_ONLY, dst_buffer ); - } else { - rv = FXFALSE; - } -#else -# error "No grLfbWriteRegion Implementation for this platform" -#endif - GR_RETURN( rv ); -} /* grLfbWriteRegion */ - - -/*------------------------------------------------------------------- - Function: grLfbReadRegion - Date: 3/12 - Implementor(s): jdt - Library: Glide - Description: - Grab a rectangle from the frame buffer into user supplied memory - Arguments: - src_buffer - buffer to read from - src_x - x coordinate of upper left corner rectangle to read - src_y - y coordinate of upper left corner of rectangle to read - src_width - width of rectangle to read - src_height - height of rectangle to read - dst_stride - distance between scanlines in destination buffer - dst_data - pointer to user memory in which to place image - Return: - FXTRUE - success - FXFALSE - failure - -------------------------------------------------------------------*/ -GR_ENTRY(grLfbReadRegion, FxBool, ( GrBuffer_t src_buffer, - FxU32 src_x, FxU32 src_y, - FxU32 src_width, FxU32 src_height, - FxU32 dst_stride, void *dst_data )) -{ - FxBool rv = FXTRUE; - GrLfbInfo_t info; - - GR_BEGIN_NOFIFOCHECK("grLfbReadRegion",82); - GDBG_INFO_MORE((gc->myLevel, - "(0x%x,%d,%d,%d,%d,%d,0x%x)\n", - src_buffer, src_x, src_y, - src_width, src_height, dst_stride, dst_data )); - -#if ( GLIDE_PLATFORM & GLIDE_HW_SST1 ) - gc->lfbSliOk = 1; - info.size = sizeof( info ); - if ( grLfbLock( GR_LFB_READ_ONLY, - src_buffer, - GR_LFBWRITEMODE_ANY, - GR_ORIGIN_UPPER_LEFT, - FXFALSE, - &info ) ) { - FxU32 *srcData; /* Tracking Source Pointer */ - FxU32 *dstData; /* Tracking Destination Pointer */ - FxU32 *end; /* Demarks End of each Scanline */ - FxU32 srcJump; /* bytes to next scanline */ - FxU32 dstJump; /* bytes to next scanline */ - FxU32 length; /* bytes to copy in scanline */ - FxU32 scanline; /* scanline number */ - int aligned; /* word aligned? */ - FxU32 odd; /* is src_y odd? ( for sli ) */ - - dstData = ( FxU32 * ) dst_data; - srcData = ( FxU32 * ) ( ((char*)info.lfbPtr)+ - (src_y*info.strideInBytes) + - (src_x<<1) ); - scanline = src_height; - length = src_width * 2; - dstJump = dst_stride - length; - srcJump = info.strideInBytes - length; - aligned = !((int)srcData&0x2); - odd = (src_y+src_height) & 0x1; - - if ( aligned ) { - while( scanline-- ) { - end = (FxU32*)((char*)srcData + length - 2); - - if(gc->scanline_interleaved == FXTRUE) { - if((scanline+odd) & 0x1) - sst1InitSliPciOwner(gc->base_ptr, SST_SLI_MASTER_OWNPCI); - else - sst1InitSliPciOwner(gc->base_ptr, SST_SLI_SLAVE_OWNPCI); - } - - while( srcData < end ) - *dstData++ = *srcData++; - - if ( ((int)length) & 0x2 ) { - (*(FxU16*)dstData) = (*(FxU16*)srcData); - dstData = (FxU32*)(((FxU16*)dstData) + 1 ); - srcData = (FxU32*)(((FxU16*)srcData) + 1 ); - } - - dstData = (FxU32*)(((char*)dstData)+dstJump); - srcData = (FxU32*)(((char*)srcData)+srcJump); - } - } else { - while( scanline-- ) { - end = (FxU32*)((char*)srcData + length - 2); - - if(gc->scanline_interleaved == FXTRUE) { - if((scanline+odd) & 0x1) - sst1InitSliPciOwner(gc->base_ptr, SST_SLI_MASTER_OWNPCI); - else - sst1InitSliPciOwner(gc->base_ptr, SST_SLI_SLAVE_OWNPCI); - } - - (*(FxU16*)dstData) = (*(FxU16*)srcData); - dstData = (FxU32*)(((FxU16*)dstData) + 1 ); - srcData = (FxU32*)(((FxU16*)srcData) + 1 ); - - while( srcData < end ) - *dstData++ = *srcData++; - - if ( !(((int)length) & 0x2) ) { - (*(FxU16*)dstData) = (*(FxU16*)srcData); - dstData = (FxU32*)(((FxU16*)dstData) + 1 ); - srcData = (FxU32*)(((FxU16*)srcData) + 1 ); - } - - dstData = (FxU32*)(((char*)dstData)+dstJump); - srcData = (FxU32*)(((char*)srcData)+srcJump); - } - } - grLfbUnlock( GR_LFB_READ_ONLY, src_buffer ); - if ( gc->scanline_interleaved ) - sst1InitSliPciOwner( gc->base_ptr, SST_SLI_MASTER_OWNPCI ); - } else { - rv = FXFALSE; - } -#elif ( GLIDE_PLATFORM & GLIDE_HW_SST96 ) - info.size = sizeof( info ); - if ( grLfbLock( GR_LFB_READ_ONLY, - src_buffer, - GR_LFBWRITEMODE_ANY, - GR_ORIGIN_UPPER_LEFT, - FXFALSE, - &info ) ) { - FxU32 *srcData; /* Tracking Source Pointer */ - FxU32 *dstData; /* Tracking Destination Pointer */ - FxU32 *end; /* Demarks End of each Scanline */ - FxU32 srcJump; /* bytes to next scanline */ - FxU32 dstJump; /* bytes to next scanline */ - FxU32 length; /* bytes to copy in scanline */ - FxU32 scanline; /* scanline number */ - int aligned; /* word aligned? */ - - dstData = ( FxU32 * ) dst_data; - srcData = ( FxU32 * ) ( ((char*)info.lfbPtr)+ - (src_y*info.strideInBytes) + - (src_x<<1) ); - scanline = src_height; - length = src_width * 2; - dstJump = dst_stride - length; - srcJump = info.strideInBytes - length; - aligned = !((int)srcData&0x2); - - if ( aligned ) { - while( scanline-- ) { - end = (FxU32*)((char*)srcData + length - 2); - - while( srcData < end ) - *dstData++ = *srcData++; - - if ( ((int)length) & 0x2 ) { - (*(FxU16*)dstData) = (*(FxU16*)srcData); - dstData = (FxU32*)(((FxU16*)dstData) + 1 ); - srcData = (FxU32*)(((FxU16*)srcData) + 1 ); - } - - dstData = (FxU32*)(((char*)dstData)+dstJump); - srcData = (FxU32*)(((char*)srcData)+srcJump); - } - } else { - while( scanline-- ) { - end = (FxU32*)((char*)srcData + length - 2); - - (*(FxU16*)dstData) = (*(FxU16*)srcData); - dstData = (FxU32*)(((FxU16*)dstData) + 1 ); - srcData = (FxU32*)(((FxU16*)srcData) + 1 ); - - while( srcData < end ) - *dstData++ = *srcData++; - - if ( !(((int)length) & 0x2) ) { - (*(FxU16*)dstData) = (*(FxU16*)srcData); - dstData = (FxU32*)(((FxU16*)dstData) + 1 ); - srcData = (FxU32*)(((FxU16*)srcData) + 1 ); - } - - dstData = (FxU32*)(((char*)dstData)+dstJump); - srcData = (FxU32*)(((char*)srcData)+srcJump); - } - } - grLfbUnlock( GR_LFB_READ_ONLY, src_buffer ); - } else { - rv = FXFALSE; - } -#else -# error "No grLfbReadRegion Implementation for this platform" -#endif - GR_RETURN( rv ); -}/* grLfbReadRegion */ - diff --git a/glide2x/sst1/glide/src/glide.h b/glide2x/sst1/glide/src/glide.h deleted file mode 100644 index f0ed986..0000000 --- a/glide2x/sst1/glide/src/glide.h +++ /dev/null @@ -1,1518 +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 -*/ - -/* -** GLIDE.H -** -** The following #defines are relevant when using Glide: -** -** One of the following "platform constants" must be defined during -** compilation: -** -** __DOS__ Defined for 32-bit DOS applications -** __WIN32__ Defined for 32-bit Windows applications -** __sparc__ Defined for Sun Solaris/SunOS -** __linux__ Defined for Linux applications -** __IRIX__ Defined for SGI Irix applications -** -*/ -#ifndef __GLIDE_H__ -#define __GLIDE_H__ - -#include <3dfx.h> -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* -** ----------------------------------------------------------------------- -** TYPE DEFINITIONS -** ----------------------------------------------------------------------- -*/ -typedef FxU32 GrColor_t; -typedef FxU8 GrAlpha_t; -typedef FxU32 GrMipMapId_t; -typedef FxU8 GrFog_t; -typedef void (FX_CALL *GrProc)(); - -/* -** ----------------------------------------------------------------------- -** CONSTANTS AND TYPES -** ----------------------------------------------------------------------- -*/ -#define MAX_NUM_SST 4 -#define MAX_MIPMAPS_PER_SST 1024 - -#ifndef GLIDE_LIB -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -#define GR_FOG_TABLE_SIZE 128 -#else /* !(defined(GLIDE3) && defined(GLIDE3_ALPHA)) */ -#define GR_FOG_TABLE_SIZE 64 -#endif /* !(defined(GLIDE3) && defined(GLIDE3_ALPHA)) */ -#endif /* GLIDE_LIB */ - -#define GR_NULL_MIPMAP_HANDLE ((GrMipMapId_t) -1) -#define GR_ZDEPTHVALUE_NEAREST 0xFFFF -#define GR_ZDEPTHVALUE_FARTHEST 0x0000 -#define GR_WDEPTHVALUE_NEAREST 0x0000 -#define GR_WDEPTHVALUE_FARTHEST 0xFFFF - -#define GR_MIPMAPLEVELMASK_EVEN FXBIT(0) -#define GR_MIPMAPLEVELMASK_ODD FXBIT(1) -#define GR_MIPMAPLEVELMASK_BOTH (GR_MIPMAPLEVELMASK_EVEN | GR_MIPMAPLEVELMASK_ODD ) - -#define GR_LODBIAS_BILINEAR 0.5 -#define GR_LODBIAS_TRILINEAR 0.0 - -typedef FxI32 GrChipID_t; -#define GR_TMU0 0x0 -#define GR_TMU1 0x1 -#define GR_TMU2 0x2 -#define GR_FBI 0x3 - -typedef FxI32 GrCombineFunction_t; -#define GR_COMBINE_FUNCTION_ZERO 0x0 -#define GR_COMBINE_FUNCTION_NONE GR_COMBINE_FUNCTION_ZERO -#define GR_COMBINE_FUNCTION_LOCAL 0x1 -#define GR_COMBINE_FUNCTION_LOCAL_ALPHA 0x2 -#define GR_COMBINE_FUNCTION_SCALE_OTHER 0x3 -#define GR_COMBINE_FUNCTION_BLEND_OTHER GR_COMBINE_FUNCTION_SCALE_OTHER -#define GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL 0x4 -#define GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA 0x5 -#define GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL 0x6 -#define GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL 0x7 -#define GR_COMBINE_FUNCTION_BLEND GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL -#define GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL_ALPHA 0x8 -#define GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL 0x9 -#define GR_COMBINE_FUNCTION_BLEND_LOCAL GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL -#define GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA 0x10 - -typedef FxI32 GrCombineFactor_t; -#define GR_COMBINE_FACTOR_ZERO 0x0 -#define GR_COMBINE_FACTOR_NONE GR_COMBINE_FACTOR_ZERO -#define GR_COMBINE_FACTOR_LOCAL 0x1 -#define GR_COMBINE_FACTOR_OTHER_ALPHA 0x2 -#define GR_COMBINE_FACTOR_LOCAL_ALPHA 0x3 -#define GR_COMBINE_FACTOR_TEXTURE_ALPHA 0x4 -#define GR_COMBINE_FACTOR_TEXTURE_RGB 0x5 -#define GR_COMBINE_FACTOR_DETAIL_FACTOR GR_COMBINE_FACTOR_TEXTURE_ALPHA -#define GR_COMBINE_FACTOR_LOD_FRACTION 0x5 -#define GR_COMBINE_FACTOR_ONE 0x8 -#define GR_COMBINE_FACTOR_ONE_MINUS_LOCAL 0x9 -#define GR_COMBINE_FACTOR_ONE_MINUS_OTHER_ALPHA 0xa -#define GR_COMBINE_FACTOR_ONE_MINUS_LOCAL_ALPHA 0xb -#define GR_COMBINE_FACTOR_ONE_MINUS_TEXTURE_ALPHA 0xc -#define GR_COMBINE_FACTOR_ONE_MINUS_DETAIL_FACTOR GR_COMBINE_FACTOR_ONE_MINUS_TEXTURE_ALPHA -#define GR_COMBINE_FACTOR_ONE_MINUS_LOD_FRACTION 0xd - - -typedef FxI32 GrCombineLocal_t; -#define GR_COMBINE_LOCAL_ITERATED 0x0 -#define GR_COMBINE_LOCAL_CONSTANT 0x1 -#define GR_COMBINE_LOCAL_NONE GR_COMBINE_LOCAL_CONSTANT -#define GR_COMBINE_LOCAL_DEPTH 0x2 - -typedef FxI32 GrCombineOther_t; -#define GR_COMBINE_OTHER_ITERATED 0x0 -#define GR_COMBINE_OTHER_TEXTURE 0x1 -#define GR_COMBINE_OTHER_CONSTANT 0x2 -#define GR_COMBINE_OTHER_NONE GR_COMBINE_OTHER_CONSTANT - - -typedef FxI32 GrAlphaSource_t; -#define GR_ALPHASOURCE_CC_ALPHA 0x0 -#define GR_ALPHASOURCE_ITERATED_ALPHA 0x1 -#define GR_ALPHASOURCE_TEXTURE_ALPHA 0x2 -#define GR_ALPHASOURCE_TEXTURE_ALPHA_TIMES_ITERATED_ALPHA 0x3 - - -typedef FxI32 GrColorCombineFnc_t; -#define GR_COLORCOMBINE_ZERO 0x0 -#define GR_COLORCOMBINE_CCRGB 0x1 -#define GR_COLORCOMBINE_ITRGB 0x2 -#define GR_COLORCOMBINE_ITRGB_DELTA0 0x3 -#define GR_COLORCOMBINE_DECAL_TEXTURE 0x4 -#define GR_COLORCOMBINE_TEXTURE_TIMES_CCRGB 0x5 -#define GR_COLORCOMBINE_TEXTURE_TIMES_ITRGB 0x6 -#define GR_COLORCOMBINE_TEXTURE_TIMES_ITRGB_DELTA0 0x7 -#define GR_COLORCOMBINE_TEXTURE_TIMES_ITRGB_ADD_ALPHA 0x8 -#define GR_COLORCOMBINE_TEXTURE_TIMES_ALPHA 0x9 -#define GR_COLORCOMBINE_TEXTURE_TIMES_ALPHA_ADD_ITRGB 0xa -#define GR_COLORCOMBINE_TEXTURE_ADD_ITRGB 0xb -#define GR_COLORCOMBINE_TEXTURE_SUB_ITRGB 0xc -#define GR_COLORCOMBINE_CCRGB_BLEND_ITRGB_ON_TEXALPHA 0xd -#define GR_COLORCOMBINE_DIFF_SPEC_A 0xe -#define GR_COLORCOMBINE_DIFF_SPEC_B 0xf -#define GR_COLORCOMBINE_ONE 0x10 - -typedef FxI32 GrAlphaBlendFnc_t; -#define GR_BLEND_ZERO 0x0 -#define GR_BLEND_SRC_ALPHA 0x1 -#define GR_BLEND_SRC_COLOR 0x2 -#define GR_BLEND_DST_COLOR GR_BLEND_SRC_COLOR -#define GR_BLEND_DST_ALPHA 0x3 -#define GR_BLEND_ONE 0x4 -#define GR_BLEND_ONE_MINUS_SRC_ALPHA 0x5 -#define GR_BLEND_ONE_MINUS_SRC_COLOR 0x6 -#define GR_BLEND_ONE_MINUS_DST_COLOR GR_BLEND_ONE_MINUS_SRC_COLOR -#define GR_BLEND_ONE_MINUS_DST_ALPHA 0x7 -#define GR_BLEND_RESERVED_8 0x8 -#define GR_BLEND_RESERVED_9 0x9 -#define GR_BLEND_RESERVED_A 0xa -#define GR_BLEND_RESERVED_B 0xb -#define GR_BLEND_RESERVED_C 0xc -#define GR_BLEND_RESERVED_D 0xd -#define GR_BLEND_RESERVED_E 0xe -#define GR_BLEND_ALPHA_SATURATE 0xf -#define GR_BLEND_PREFOG_COLOR GR_BLEND_ALPHA_SATURATE - -typedef FxI32 GrAspectRatio_t; -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -//#define GLIDE3_DEBUG -#ifdef GLIDE3_DEBUG -#define GR_ASPECT_8x1 0x0 /* 8W x 1H */ -#define GR_ASPECT_4x1 0x1 /* 4W x 1H */ -#define GR_ASPECT_2x1 0x2 /* 2W x 1H */ -#define GR_ASPECT_1x1 0x3 /* 1W x 1H */ -#define GR_ASPECT_1x2 0x4 /* 1W x 2H */ -#define GR_ASPECT_1x4 0x5 /* 1W x 4H */ -#define GR_ASPECT_1x8 0x6 /* 1W x 8H */ -#else -#define GR_ASPECT_8x1 3 /* 8W x 1H */ -#define GR_ASPECT_4x1 2 /* 4W x 1H */ -#define GR_ASPECT_2x1 1 /* 2W x 1H */ -#define GR_ASPECT_1x1 0 /* 1W x 1H */ -#define GR_ASPECT_1x2 -1 /* 1W x 2H */ -#define GR_ASPECT_1x4 -2 /* 1W x 4H */ -#define GR_ASPECT_1x8 -3 /* 1W x 8H */ -#endif /* GLIDE3_DEBUG */ -#else -#define GR_ASPECT_8x1 0x0 /* 8W x 1H */ -#define GR_ASPECT_4x1 0x1 /* 4W x 1H */ -#define GR_ASPECT_2x1 0x2 /* 2W x 1H */ -#define GR_ASPECT_1x1 0x3 /* 1W x 1H */ -#define GR_ASPECT_1x2 0x4 /* 1W x 2H */ -#define GR_ASPECT_1x4 0x5 /* 1W x 4H */ -#define GR_ASPECT_1x8 0x6 /* 1W x 8H */ -#endif - -typedef FxI32 GrBuffer_t; -#define GR_BUFFER_FRONTBUFFER 0x0 -#define GR_BUFFER_BACKBUFFER 0x1 -#define GR_BUFFER_AUXBUFFER 0x2 -#define GR_BUFFER_DEPTHBUFFER 0x3 -#define GR_BUFFER_ALPHABUFFER 0x4 -#define GR_BUFFER_TRIPLEBUFFER 0x5 - -typedef FxI32 GrChromakeyMode_t; -#define GR_CHROMAKEY_DISABLE 0x0 -#define GR_CHROMAKEY_ENABLE 0x1 - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -typedef FxI32 GrChromaRangeMode_t; -#define GR_CHROMARANGE_RGB_ANY 0x0 -#define GR_CHROMARANGE_RGb_ANY 0x1 -#define GR_CHROMARANGE_RgB_ANY 0x2 -#define GR_CHROMARANGE_Rgb_ANY 0x3 -#define GR_CHROMARANGE_rGB_ANY 0x4 -#define GR_CHROMARANGE_rGb_ANY 0x5 -#define GR_CHROMARANGE_rgB_ANY 0x6 -#define GR_CHROMARANGE_rgb_ANY 0x7 -#define GR_CHROMARANGE_RGB_ALL 0x8 -#define GR_CHROMARANGE_RGb_ALL 0x9 -#define GR_CHROMARANGE_RgB_ALL 0xa -#define GR_CHROMARANGE_Rgb_ALL 0xb -#define GR_CHROMARANGE_rGB_ALL 0xc -#define GR_CHROMARANGE_rGb_ALL 0xd -#define GR_CHROMARANGE_rgB_ALL 0xe -#define GR_CHROMARANGE_rgb_ALL 0xf -#endif - -typedef FxI32 GrCmpFnc_t; -#define GR_CMP_NEVER 0x0 -#define GR_CMP_LESS 0x1 -#define GR_CMP_EQUAL 0x2 -#define GR_CMP_LEQUAL 0x3 -#define GR_CMP_GREATER 0x4 -#define GR_CMP_NOTEQUAL 0x5 -#define GR_CMP_GEQUAL 0x6 -#define GR_CMP_ALWAYS 0x7 - -typedef FxI32 GrColorFormat_t; -#define GR_COLORFORMAT_ARGB 0x0 -#define GR_COLORFORMAT_ABGR 0x1 - -#define GR_COLORFORMAT_RGBA 0x2 -#define GR_COLORFORMAT_BGRA 0x3 - -typedef FxI32 GrCullMode_t; -#define GR_CULL_DISABLE 0x0 -#define GR_CULL_NEGATIVE 0x1 -#define GR_CULL_POSITIVE 0x2 - -typedef FxI32 GrDepthBufferMode_t; -#define GR_DEPTHBUFFER_DISABLE 0x0 -#define GR_DEPTHBUFFER_ZBUFFER 0x1 -#define GR_DEPTHBUFFER_WBUFFER 0x2 -#define GR_DEPTHBUFFER_ZBUFFER_COMPARE_TO_BIAS 0x3 -#define GR_DEPTHBUFFER_WBUFFER_COMPARE_TO_BIAS 0x4 - -typedef FxI32 GrDitherMode_t; -#define GR_DITHER_DISABLE 0x0 -#define GR_DITHER_2x2 0x1 -#define GR_DITHER_4x4 0x2 - -typedef FxI32 GrFogMode_t; -#define GR_FOG_DISABLE 0x0 -#define GR_FOG_WITH_ITERATED_ALPHA 0x1 -#define GR_FOG_WITH_TABLE 0x2 -#define GR_FOG_WITH_ITERATED_Z 0x3 /* Bug 735 */ -#define GR_FOG_MULT2 0x100 -#define GR_FOG_ADD2 0x200 - -typedef FxU32 GrLock_t; -#define GR_LFB_READ_ONLY 0x00 -#define GR_LFB_WRITE_ONLY 0x01 -#define GR_LFB_IDLE 0x00 -#define GR_LFB_NOIDLE 0x10 - -typedef FxI32 GrLfbBypassMode_t; -#define GR_LFBBYPASS_DISABLE 0x0 -#define GR_LFBBYPASS_ENABLE 0x1 - -typedef FxI32 GrLfbWriteMode_t; -#define GR_LFBWRITEMODE_565 0x0 /* RGB:RGB */ -#define GR_LFBWRITEMODE_555 0x1 /* RGB:RGB */ -#define GR_LFBWRITEMODE_1555 0x2 /* ARGB:ARGB */ -#define GR_LFBWRITEMODE_RESERVED1 0x3 -#define GR_LFBWRITEMODE_888 0x4 /* RGB */ -#define GR_LFBWRITEMODE_8888 0x5 /* ARGB */ -#define GR_LFBWRITEMODE_RESERVED2 0x6 -#define GR_LFBWRITEMODE_RESERVED3 0x7 -#define GR_LFBWRITEMODE_RESERVED4 0x8 -#define GR_LFBWRITEMODE_RESERVED5 0x9 -#define GR_LFBWRITEMODE_RESERVED6 0xa -#define GR_LFBWRITEMODE_RESERVED7 0xb -#define GR_LFBWRITEMODE_565_DEPTH 0xc /* RGB:DEPTH */ -#define GR_LFBWRITEMODE_555_DEPTH 0xd /* RGB:DEPTH */ -#define GR_LFBWRITEMODE_1555_DEPTH 0xe /* ARGB:DEPTH */ -#define GR_LFBWRITEMODE_ZA16 0xf /* DEPTH:DEPTH */ -#define GR_LFBWRITEMODE_ANY 0xFF - - -typedef FxI32 GrOriginLocation_t; -#define GR_ORIGIN_UPPER_LEFT 0x0 -#define GR_ORIGIN_LOWER_LEFT 0x1 -#define GR_ORIGIN_ANY 0xFF - -typedef struct { - int size; - void *lfbPtr; - FxU32 strideInBytes; - GrLfbWriteMode_t writeMode; - GrOriginLocation_t origin; -} GrLfbInfo_t; - -typedef FxI32 GrLOD_t; -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -#ifdef GLIDE3_DEBUG -#define GR_LOD_256 0x0 -#define GR_LOD_128 0x1 -#define GR_LOD_64 0x2 -#define GR_LOD_32 0x3 -#define GR_LOD_16 0x4 -#define GR_LOD_8 0x5 -#define GR_LOD_4 0x6 -#define GR_LOD_2 0x7 -#define GR_LOD_1 0x8 -#else -#define GR_LOD_256 0x8 -#define GR_LOD_128 0x7 -#define GR_LOD_64 0x6 -#define GR_LOD_32 0x5 -#define GR_LOD_16 0x4 -#define GR_LOD_8 0x3 -#define GR_LOD_4 0x2 -#define GR_LOD_2 0x1 -#define GR_LOD_1 0x0 -#endif /* GLIDE3_DEBUG */ -#else -#define GR_LOD_256 0x0 -#define GR_LOD_128 0x1 -#define GR_LOD_64 0x2 -#define GR_LOD_32 0x3 -#define GR_LOD_16 0x4 -#define GR_LOD_8 0x5 -#define GR_LOD_4 0x6 -#define GR_LOD_2 0x7 -#define GR_LOD_1 0x8 -#endif - -typedef FxI32 GrMipMapMode_t; -#define GR_MIPMAP_DISABLE 0x0 /* no mip mapping */ -#define GR_MIPMAP_NEAREST 0x1 /* use nearest mipmap */ -#define GR_MIPMAP_NEAREST_DITHER 0x2 /* GR_MIPMAP_NEAREST + LOD dith */ - - -typedef FxI32 GrSmoothingMode_t; -#define GR_SMOOTHING_DISABLE 0x0 -#define GR_SMOOTHING_ENABLE 0x1 - -typedef FxI32 GrTextureClampMode_t; -#define GR_TEXTURECLAMP_WRAP 0x0 -#define GR_TEXTURECLAMP_CLAMP 0x1 - -typedef FxI32 GrTextureCombineFnc_t; -#define GR_TEXTURECOMBINE_ZERO 0x0 /* texout = 0 */ -#define GR_TEXTURECOMBINE_DECAL 0x1 /* texout = texthis */ -#define GR_TEXTURECOMBINE_OTHER 0x2 /* this TMU in passthru mode */ -#define GR_TEXTURECOMBINE_ADD 0x3 /* tout = tthis + t(this+1) */ -#define GR_TEXTURECOMBINE_MULTIPLY 0x4 /* texout = tthis * t(this+1) */ -#define GR_TEXTURECOMBINE_SUBTRACT 0x5 /* Sutract from upstream TMU */ -#define GR_TEXTURECOMBINE_DETAIL 0x6 /* detail--detail on tthis */ -#define GR_TEXTURECOMBINE_DETAIL_OTHER 0x7 /* detail--detail on tthis+1 */ -#define GR_TEXTURECOMBINE_TRILINEAR_ODD 0x8 /* trilinear--odd levels tthis*/ -#define GR_TEXTURECOMBINE_TRILINEAR_EVEN 0x9 /*trilinear--even levels tthis*/ -#define GR_TEXTURECOMBINE_ONE 0xa /* texout = 0xFFFFFFFF */ - -typedef FxI32 GrTextureFilterMode_t; -#define GR_TEXTUREFILTER_POINT_SAMPLED 0x0 -#define GR_TEXTUREFILTER_BILINEAR 0x1 - -typedef FxI32 GrTextureFormat_t; -#define GR_TEXFMT_8BIT 0x0 -#define GR_TEXFMT_RGB_332 GR_TEXFMT_8BIT -#define GR_TEXFMT_YIQ_422 0x1 -#define GR_TEXFMT_ALPHA_8 0x2 /* (0..0xFF) alpha */ -#define GR_TEXFMT_INTENSITY_8 0x3 /* (0..0xFF) intensity */ -#define GR_TEXFMT_ALPHA_INTENSITY_44 0x4 -#define GR_TEXFMT_P_8 0x5 /* 8-bit palette */ -#define GR_TEXFMT_RSVD0 0x6 -#define GR_TEXFMT_RSVD1 0x7 -#define GR_TEXFMT_16BIT 0x8 -#define GR_TEXFMT_ARGB_8332 GR_TEXFMT_16BIT -#define GR_TEXFMT_AYIQ_8422 0x9 -#define GR_TEXFMT_RGB_565 0xa -#define GR_TEXFMT_ARGB_1555 0xb -#define GR_TEXFMT_ARGB_4444 0xc -#define GR_TEXFMT_ALPHA_INTENSITY_88 0xd -#define GR_TEXFMT_AP_88 0xe /* 8-bit alpha 8-bit palette */ -#define GR_TEXFMT_RSVD2 0xf - -typedef FxU32 GrTexTable_t; -#define GR_TEXTABLE_NCC0 0x0 -#define GR_TEXTABLE_NCC1 0x1 -#define GR_TEXTABLE_PALETTE 0x2 - -typedef FxU32 GrNCCTable_t; -#define GR_NCCTABLE_NCC0 0x0 -#define GR_NCCTABLE_NCC1 0x1 - -typedef FxU32 GrTexBaseRange_t; -#define GR_TEXBASE_256 0x0 -#define GR_TEXBASE_128 0x1 -#define GR_TEXBASE_64 0x2 -#define GR_TEXBASE_32_TO_1 0x3 - -#ifdef GLIDE3 - -#define GLIDE3_VERTEX_LAYOUT 1 - -typedef FxU32 GrEnableMode_t; -#define GR_MODE_DISABLE 0x0 -#define GR_MODE_ENABLE 0x1 - -#define GR_AA_ORDERED 0x01 -#define GR_ALLOW_MIPMAP_DITHER 0x02 -#define GR_SHAMELESS_PLUG 0x03 -#define GR_VIDEO_SMOOTHING 0x04 - -typedef FxU32 GrCoordinateSpaceMode_t; -#define GR_WINDOW_COORDS 0x00 -#define GR_CLIP_COORDS 0x01 - -#endif - -#ifdef GLIDE3 -#ifdef GLIDE3_ALPHA -#define GLIDE3_EXTRA_STATE 392 -#else -#define GLIDE3_EXTRA_STATE 216 -#endif -#else -#define GLIDE3_EXTRA_STATE 0 -#endif - -#define GLIDE_STATE_PAD_SIZE 312 + GLIDE3_EXTRA_STATE - -#ifdef GLIDE_LIB -typedef struct _GrState_s GrState; -#else -typedef struct _GrState_s { - char pad[GLIDE_STATE_PAD_SIZE]; -} GrState; -#endif - -#ifdef GLIDE3 -/* Types of data in strips */ -#define GR_FLOAT 0 -#define GR_U8 1 - -/* Parameters for strips */ -#define GR_PARAM_XY 0x01 -#define GR_PARAM_Z 0x02 -#define GR_PARAM_W 0x03 -#define GR_PARAM_Q 0x04 - -#define GR_PARAM_A 0x10 -#define GR_PARAM_A0 GR_PARAM_A -#define GR_PARAM_A1 GR_PARAM_A+1 -#define GR_PARAM_A2 GR_PARAM_A+2 -#define GR_PARAM_A3 GR_PARAM_A+3 -#define GR_PARAM_A4 GR_PARAM_A+4 -#define GR_PARAM_A5 GR_PARAM_A+5 -#define GR_PARAM_A6 GR_PARAM_A+6 -#define GR_PARAM_A7 GR_PARAM_A+7 - -#define GR_PARAM_RGB 0x20 -#define GR_PARAM_RGB0 GR_PARAM_RGB -#define GR_PARAM_RGB1 GR_PARAM_RGB+1 -#define GR_PARAM_RGB2 GR_PARAM_RGB+2 -#define GR_PARAM_RGB3 GR_PARAM_RGB+3 -#define GR_PARAM_RGB4 GR_PARAM_RGB+4 -#define GR_PARAM_RGB5 GR_PARAM_RGB+5 -#define GR_PARAM_RGB6 GR_PARAM_RGB+6 -#define GR_PARAM_RGB7 GR_PARAM_RGB+7 - -#define GR_PARAM_PARGB 0x30 -#define GR_PARAM_PARGB0 GR_PARAM_PARGB -#define GR_PARAM_PARGB1 GR_PARAM_PARGB+1 -#define GR_PARAM_PARGB2 GR_PARAM_PARGB+2 -#define GR_PARAM_PARGB3 GR_PARAM_PARGB+3 -#define GR_PARAM_PARGB4 GR_PARAM_PARGB+4 -#define GR_PARAM_PARGB5 GR_PARAM_PARGB+5 -#define GR_PARAM_PARGB6 GR_PARAM_PARGB+6 -#define GR_PARAM_PARGB7 GR_PARAM_PARGB+7 - -#define GR_PARAM_ST0 0x40 -#define GR_PARAM_ST1 GR_PARAM_ST0+1 -#define GR_PARAM_ST2 GR_PARAM_ST0+2 -#define GR_PARAM_ST3 GR_PARAM_ST0+3 -#define GR_PARAM_ST4 GR_PARAM_ST0+4 -#define GR_PARAM_ST5 GR_PARAM_ST0+5 -#define GR_PARAM_ST6 GR_PARAM_ST0+6 -#define GR_PARAM_ST7 GR_PARAM_ST0+7 - -#define GR_PARAM_Q0 0x50 -#define GR_PARAM_Q1 GR_PARAM_Q0+1 -#define GR_PARAM_Q2 GR_PARAM_Q0+2 -#define GR_PARAM_Q3 GR_PARAM_Q0+3 -#define GR_PARAM_Q4 GR_PARAM_Q0+4 -#define GR_PARAM_Q5 GR_PARAM_Q0+5 -#define GR_PARAM_Q6 GR_PARAM_Q0+6 -#define GR_PARAM_Q7 GR_PARAM_Q0+7 - -#define GR_PARAM_DISABLE 0x00 -#define GR_PARAM_ENABLE 0x01 - -/* Componenets for strips */ -/* vertex */ -#define GR_VERTEX_XYZ 3 -#define GR_VERTEX_XYZW 4 -/* Color */ -#define GR_COLOR_RGB 3 -#define GR_COLOR_RGBA 4 -/* Texture */ -#define GR_TEX_NONE 0 -#define GR_TEX_ST 2 -#define GR_TEX_STW 3 - -/* grDrawVertexArray primitive type */ -#define GR_POINTS 0 -#define GR_LINE_STRIP 1 -#define GR_LINES 2 -#define GR_POLYGON 3 -#define GR_TRIANGLE_STRIP 4 -#define GR_TRIANGLE_FAN 5 -#define GR_TRIANGLES 6 - - -/* Stuff for grGet/grReset */ -#define GR_BITS_DEPTH 0x01 -#define GR_BITS_RGBA 0x02 -#define GR_FIFO_FULLNESS 0x03 -#define GR_FOG_TABLE_ENTRIES 0x04 -#define GR_GAMMA_TABLE_ENTRIES 0x05 -#define GR_IS_BUSY 0x06 -#define GR_LFB_PIXEL_PIPE 0x07 -#define GR_MAX_TEXTURE_SIZE 0x08 -#define GR_MAX_TEXTURE_ASPECT_RATIO 0x09 -#define GR_MEMORY_FB 0x0a -#define GR_MEMORY_TMU 0x0b -#define GR_MEMORY_UMA 0x0c -#define GR_NUM_BOARDS 0x0d -#define GR_NUM_POWER_OF_TWO_TEXTURES 0x0e -#define GR_NUM_FB 0x0f -#define GR_NUM_TMU 0x10 -#define GR_PENDING_BUFFERSWAPS 0x11 -#define GR_REVISION_FB 0x12 -#define GR_REVISION_TMU 0x13 -#define GR_STATS_LINES 0x14 /* grSet/grReset */ -#define GR_STATS_PIXELS_AFUNC_FAIL 0x15 -#define GR_STATS_PIXELS_CHROMA_FAIL 0x16 -#define GR_STATS_PIXELS_DEPTHFUNC_FAIL 0x17 -#define GR_STATS_PIXELS_IN 0x18 -#define GR_STATS_PIXELS_OUT 0x19 -#define GR_STATS_PIXELS 0x1a /* grReset */ -#define GR_STATS_POINTS 0x1b /* grSet/grReset */ -#define GR_STATS_TRIANGLES_IN 0x1c -#define GR_STATS_TRIANGLES_OUT 0x1d -#define GR_STATS_TRIANGLES 0x1e /* grReset */ -#define GR_SWAP_HISTORY 0x1f -#define GR_TEXTURE_ALIGN 0x20 -#define GR_VIDEO_POSITION 0x21 -#define GR_VIEWPORT 0x22 -#define GR_WDEPTH_MIN_MAX 0x23 -#define GR_ZDEPTH_MIN_MAX 0x24 - -/* stuff for grGetString */ -#define GR_EXTENSION 0xa0 -#define GR_HARDWARE 0xa1 -#define GR_RENDERER 0xa2 -#define GR_VENDOR 0xa3 -#define GR_VERSION 0xa4 - -#endif - -/* -** ----------------------------------------------------------------------- -** STRUCTURES -** ----------------------------------------------------------------------- -*/ - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -#ifdef GLIDE3_DEBUG -typedef struct { - GrLOD_t smallLod; - GrLOD_t largeLod; - GrAspectRatio_t aspectRatio; - GrTextureFormat_t format; - void *data; -} GrTexInfo; -#else -typedef struct { - GrLOD_t smallLodLog2; - GrLOD_t largeLodLog2; - GrAspectRatio_t aspectRatioLog2; - GrTextureFormat_t format; - void *data; -} GrTexInfo; -#endif /* GLIDE3_DEBUG */ -#else -typedef struct { - GrLOD_t smallLod; - GrLOD_t largeLod; - GrAspectRatio_t aspectRatio; - GrTextureFormat_t format; - void *data; -} GrTexInfo; -#endif - -#ifndef 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; - -typedef struct -{ - int sst; /* SST where this texture map was stored */ - FxBool valid; /* set when this table entry is allocated*/ - int width, height; - GrAspectRatio_t aspect_ratio; /* aspect ratio of the mip map. */ - void *data; /* actual texture data */ - - GrTextureFormat_t format; /* format of the texture table */ - GrMipMapMode_t mipmap_mode; /* mip map mode for this texture */ - GrTextureFilterMode_t magfilter_mode; /* filtering to be used when magnified */ - GrTextureFilterMode_t minfilter_mode; /* filtering to be used with minified */ - GrTextureClampMode_t s_clamp_mode; /* how this texture should be clamped in s */ - GrTextureClampMode_t t_clamp_mode; /* how this texture should be clamped in t */ - FxU32 tLOD; /* Register value for tLOD register */ - FxU32 tTextureMode; /* Register value for tTextureMode register - not including non-texture specific bits */ - FxU32 lod_bias; /* LOD bias of the mip map in preshifted 4.2*/ - GrLOD_t lod_min, lod_max; /* largest and smallest levels of detail */ - int tmu; /* tmu on which this texture resides */ - FxU32 odd_even_mask; /* mask specifying levels on this tmu */ - FxU32 tmu_base_address; /* base addr (in TMU mem) of this texture */ - FxBool trilinear; /* should we blend by lod? */ - - GuNccTable ncc_table; /* NCC compression table (optional) */ -} GrMipMapInfo; -#endif - -typedef int GrSstType; -#define GR_SSTTYPE_VOODOO 0 -#define GR_SSTTYPE_SST96 1 -#define GR_SSTTYPE_AT3D 2 -#define GR_SSTTYPE_Voodoo2 3 - -typedef struct GrTMUConfig_St { - int tmuRev; /* Rev of Texelfx chip */ - int tmuRam; /* 1, 2, or 4 MB */ -} GrTMUConfig_t; - -typedef struct GrVoodooConfig_St { - int fbRam; /* 1, 2, or 4 MB */ - int fbiRev; /* Rev of Pixelfx chip */ - int nTexelfx; /* How many texelFX chips are there? */ - FxBool sliDetect; /* Is it a scan-line interleaved board? */ - GrTMUConfig_t tmuConfig[GLIDE_NUM_TMU]; /* Configuration of the Texelfx chips */ -} GrVoodooConfig_t; - -typedef struct GrSst96Config_St { - int fbRam; /* How much? */ - int nTexelfx; - GrTMUConfig_t tmuConfig; -} GrSst96Config_t; - -typedef GrVoodooConfig_t GrVoodoo2Config_t; - -typedef struct GrAT3DConfig_St { - int rev; -} GrAT3DConfig_t; - -typedef struct { - int num_sst; /* # of HW units in the system */ - struct { - GrSstType type; /* Which hardware is it? */ - union SstBoard_u { - GrVoodooConfig_t VoodooConfig; - GrSst96Config_t SST96Config; - GrAT3DConfig_t AT3DConfig; - GrVoodoo2Config_t Voodoo2Config; - } sstBoard; - } SSTs[MAX_NUM_SST]; /* configuration for each board */ -} GrHwConfiguration; - -typedef struct GrSstPerfStats_s { - FxU32 pixelsIn; /* # pixels processed (minus buffer clears) */ - FxU32 chromaFail; /* # pixels not drawn due to chroma key */ - FxU32 zFuncFail; /* # pixels not drawn due to Z comparison */ - FxU32 aFuncFail; /* # pixels not drawn due to alpha comparison */ - FxU32 pixelsOut; /* # pixels drawn (including buffer clears) */ -} GrSstPerfStats_t; - - -typedef struct { - float sow; /* s texture ordinate (s over w) */ - float tow; /* t texture ordinate (t over w) */ - float oow; /* 1/w (used mipmapping - really 0xfff/w) */ -} GrTmuVertex; - -/* -** GrVertex -** If these are changed the C & assembly language trisetup routines MUST -** be changed, for they will no longer work. -*/ -#if !GLIDE3_VERTEX_LAYOUT -typedef struct -{ - float x, y, z; /* X, Y, and Z of scrn space -- Z is ignored */ - float r, g, b; /* R, G, B, ([0..255.0]) */ - float ooz; /* 65535/Z (used for Z-buffering) */ - float a; /* Alpha [0..255.0] */ - float oow; /* 1/W (used for W-buffering, texturing) */ - GrTmuVertex tmuvtx[GLIDE_NUM_TMU]; -} GrVertex; - -#define GR_VERTEX_X_OFFSET 0 -#define GR_VERTEX_Y_OFFSET 1 -#define GR_VERTEX_Z_OFFSET 2 -#define GR_VERTEX_R_OFFSET 3 -#define GR_VERTEX_G_OFFSET 4 -#define GR_VERTEX_B_OFFSET 5 -#define GR_VERTEX_OOZ_OFFSET 6 -#define GR_VERTEX_A_OFFSET 7 -#define GR_VERTEX_OOW_OFFSET 8 - -#else /* GLIDE3_VERTEX_LAYOUT */ -typedef struct -{ - float x, y; /* X and Y in screen space */ - float ooz; /* 65535/Z (used for Z-buffering) */ - float oow; /* 1/W (used for W-buffering, texturing) */ - float r, g, b, a; /* R, G, B, A [0..255.0] */ - float z; /* Z is ignored */ - GrTmuVertex tmuvtx[GLIDE_NUM_TMU]; -} GrVertex; - -#define GR_VERTEX_X_OFFSET 0 -#define GR_VERTEX_Y_OFFSET 1 -#define GR_VERTEX_OOZ_OFFSET 2 -#define GR_VERTEX_OOW_OFFSET 3 -#define GR_VERTEX_R_OFFSET 4 -#define GR_VERTEX_G_OFFSET 5 -#define GR_VERTEX_B_OFFSET 6 -#define GR_VERTEX_A_OFFSET 7 -#define GR_VERTEX_Z_OFFSET 8 - -#endif /* GLIDE3_VERTEX_LAYOUT */ - -#define GR_VERTEX_SOW_TMU0_OFFSET 9 -#define GR_VERTEX_TOW_TMU0_OFFSET 10 -#define GR_VERTEX_OOW_TMU0_OFFSET 11 -#define GR_VERTEX_SOW_TMU1_OFFSET 12 -#define GR_VERTEX_TOW_TMU1_OFFSET 13 -#define GR_VERTEX_OOW_TMU1_OFFSET 14 - -#if (GLIDE_NUM_TMU > 2) -#define GR_VERTEX_SOW_TMU2_OFFSET 15 -#define GR_VERTEX_TOW_TMU2_OFFSET 16 -#define GR_VERTEX_OOW_TMU2_OFFSET 17 -#endif - -typedef FxU32 GrLfbSrcFmt_t; -#define GR_LFB_SRC_FMT_565 0x00 -#define GR_LFB_SRC_FMT_555 0x01 -#define GR_LFB_SRC_FMT_1555 0x02 -#define GR_LFB_SRC_FMT_888 0x04 -#define GR_LFB_SRC_FMT_8888 0x05 -#define GR_LFB_SRC_FMT_565_DEPTH 0x0c -#define GR_LFB_SRC_FMT_555_DEPTH 0x0d -#define GR_LFB_SRC_FMT_1555_DEPTH 0x0e -#define GR_LFB_SRC_FMT_ZA16 0x0f -#define GR_LFB_SRC_FMT_RLE16 0x80 - -typedef FxI32 GrPassthruMode_t; -#define GR_PASSTHRU_SHOW_VGA 0x0 -#define GR_PASSTHRU_SHOW_SST1 0x1 - -typedef FxU32 GrHint_t; -#define GR_HINTTYPE_MIN 0 -#define GR_HINT_STWHINT 0 -#define GR_HINT_FIFOCHECKHINT 1 -#define GR_HINT_FPUPRECISION 2 -#define GR_HINT_ALLOW_MIPMAP_DITHER 3 -#define GR_HINT_LFB_WRITE 4 -#define GR_HINT_LFB_PROTECT 5 -#define GR_HINT_LFB_RESET 6 -#define GR_HINTTYPE_MAX GR_HINT_LFB_RESET -#ifdef H3D -#define GR_HINT_H3DENABLE GR_HINTTYPE_MAX -#undef GR_HINTTYPE_MAX -#define GR_HINTTYPE_MAX GR_HIT_H3DENABLE -#endif - -typedef FxU32 GrSTWHint_t; -#define GR_STWHINT_W_DIFF_FBI FXBIT(0) -#define GR_STWHINT_W_DIFF_TMU0 FXBIT(1) -#define GR_STWHINT_ST_DIFF_TMU0 FXBIT(2) -#define GR_STWHINT_W_DIFF_TMU1 FXBIT(3) -#define GR_STWHINT_ST_DIFF_TMU1 FXBIT(4) -#define GR_STWHINT_W_DIFF_TMU2 FXBIT(5) -#define GR_STWHINT_ST_DIFF_TMU2 FXBIT(6) - -typedef FxU32 GrControl_t; -#define GR_CONTROL_ACTIVATE 0x1 -#define GR_CONTROL_DEACTIVATE 0x2 -#define GR_CONTROL_RESIZE 0x3 -#define GR_CONTROL_MOVE 0x4 - -#define GR_GENERATE_FIFOCHECK_HINT_MASK(swHWM, swLWM) \ - (((swHWM & 0xffff) << 16) | (swLWM & 0xffff)) - -/* -** ----------------------------------------------------------------------- -** FUNCTION PROTOTYPES -** ----------------------------------------------------------------------- -*/ -#ifndef FX_GLIDE_NO_FUNC_PROTO -/* -** rendering functions -*/ - -#ifndef GLIDE3_ALPHA - -FX_ENTRY void FX_CALL -grDrawPlanarPolygon( int nverts, const int ilist[], const GrVertex vlist[] ); - -FX_ENTRY void FX_CALL -grDrawPlanarPolygonVertexList( int nverts, const GrVertex vlist[] ); - -FX_ENTRY void FX_CALL -grDrawPolygon( int nverts, const int ilist[], const GrVertex vlist[] ); - -FX_ENTRY void FX_CALL -grDrawPolygonVertexList( int nverts, const GrVertex vlist[] ); - -#endif /* !GLIDE3_ALPHA */ - -#ifdef GLIDE3 -FX_ENTRY void FX_CALL -grDrawPoint( void *pt ); - -FX_ENTRY void FX_CALL -grDrawLine( void *v1, void *v2 ); - -FX_ENTRY void FX_CALL -grDrawTriangle( void *a, void *b, void *c ); - -#else -FX_ENTRY void FX_CALL -grDrawPoint( const GrVertex *pt ); - -FX_ENTRY void FX_CALL -grDrawLine( const GrVertex *v1, const GrVertex *v2 ); - -FX_ENTRY void FX_CALL -grDrawTriangle( const GrVertex *a, const GrVertex *b, const GrVertex *c ); -#endif - -/* -** buffer management -*/ -FX_ENTRY void FX_CALL -grBufferClear( GrColor_t color, GrAlpha_t alpha, FxU16 depth ); - -#ifndef GLIDE3_ALPHA -FX_ENTRY int FX_CALL -grBufferNumPending( void ); -#endif /* !GLIDE3_ALPHA */ - -FX_ENTRY void FX_CALL -grBufferSwap( int swap_interval ); - -FX_ENTRY void FX_CALL -grRenderBuffer( GrBuffer_t buffer ); - -/* -** error management -*/ -typedef void (*GrErrorCallbackFnc_t)( const char *string, FxBool fatal ); - -FX_ENTRY void FX_CALL -grErrorSetCallback( GrErrorCallbackFnc_t fnc ); - -/* -** SST routines -*/ -#ifdef GLIDE3 -FX_ENTRY void FX_CALL -grFinish(void); -#endif - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -FX_ENTRY void FX_CALL -grFlush(void); -#endif - -#ifndef GLIDE3_ALPHA -FX_ENTRY void FX_CALL -grSstIdle(void); - -FX_ENTRY FxU32 FX_CALL -grSstVideoLine( void ); - -FX_ENTRY FxBool FX_CALL -grSstVRetraceOn( void ); - -FX_ENTRY FxBool FX_CALL -grSstIsBusy( void ); -#endif /* !GLIDE3_ALPHA */ - -FX_ENTRY FxBool FX_CALL -grSstWinOpen( - FxU32 hWnd, - GrScreenResolution_t screen_resolution, - GrScreenRefresh_t refresh_rate, - GrColorFormat_t color_format, - GrOriginLocation_t origin_location, - int nColBuffers, - int nAuxBuffers); - -FX_ENTRY void FX_CALL -grSstWinClose( void ); - -FX_ENTRY FxBool FX_CALL -grSstControl( FxU32 code ); - -#ifndef GLIDE3_ALPHA -FX_ENTRY FxBool FX_CALL -grSstQueryHardware( GrHwConfiguration *hwconfig ); - -FX_ENTRY FxBool FX_CALL -grSstQueryBoards( GrHwConfiguration *hwconfig ); -#endif /* !GLIDE3_ALPHA */ - -FX_ENTRY void FX_CALL -grSstOrigin(GrOriginLocation_t origin); - -FX_ENTRY void FX_CALL -grSstSelect( int which_sst ); - -#ifndef GLIDE3_ALPHA -FX_ENTRY FxU32 FX_CALL -grSstScreenHeight( void ); - -FX_ENTRY FxU32 FX_CALL -grSstScreenWidth( void ); - -FX_ENTRY FxU32 FX_CALL -grSstStatus( void ); -#endif /* !GLIDE3_ALPHA */ - -/* -** Drawing Statistics -*/ -#ifndef GLIDE3_ALPHA -FX_ENTRY void FX_CALL -grSstPerfStats(GrSstPerfStats_t *pStats); - -FX_ENTRY void FX_CALL -grSstResetPerfStats(void); -#endif /* !GLIDE3_ALPHA */ - -FX_ENTRY void FX_CALL -grResetTriStats(); - -FX_ENTRY void FX_CALL -grTriStats(FxU32 *trisProcessed, FxU32 *trisDrawn); - -/* -** Glide configuration and special effect maintenance functions -*/ -FX_ENTRY void FX_CALL -grAlphaBlendFunction( - GrAlphaBlendFnc_t rgb_sf, GrAlphaBlendFnc_t rgb_df, - GrAlphaBlendFnc_t alpha_sf, GrAlphaBlendFnc_t alpha_df - ); - -FX_ENTRY void FX_CALL -grAlphaCombine( - GrCombineFunction_t function, GrCombineFactor_t factor, - GrCombineLocal_t local, GrCombineOther_t other, - FxBool invert - ); - -FX_ENTRY void FX_CALL -grAlphaControlsITRGBLighting( FxBool enable ); - -FX_ENTRY void FX_CALL -grAlphaTestFunction( GrCmpFnc_t function ); - -FX_ENTRY void FX_CALL -grAlphaTestReferenceValue( GrAlpha_t value ); - -FX_ENTRY void FX_CALL -grChromakeyMode( GrChromakeyMode_t mode ); - -FX_ENTRY void FX_CALL -grChromakeyValue( GrColor_t value ); - -FX_ENTRY void FX_CALL -grClipWindow( FxU32 minx, FxU32 miny, FxU32 maxx, FxU32 maxy ); - -FX_ENTRY void FX_CALL -grColorCombine( - GrCombineFunction_t function, GrCombineFactor_t factor, - GrCombineLocal_t local, GrCombineOther_t other, - FxBool invert ); - -FX_ENTRY void FX_CALL -grColorMask( FxBool rgb, FxBool a ); - -FX_ENTRY void FX_CALL -grCullMode( GrCullMode_t mode ); - -FX_ENTRY void FX_CALL -grConstantColorValue( GrColor_t value ); - -FX_ENTRY void FX_CALL -grConstantColorValue4( float a, float r, float g, float b ); - -FX_ENTRY void FX_CALL -grDepthBiasLevel( FxI16 level ); - -FX_ENTRY void FX_CALL -grDepthBufferFunction( GrCmpFnc_t function ); - -FX_ENTRY void FX_CALL -grDepthBufferMode( GrDepthBufferMode_t mode ); - -FX_ENTRY void FX_CALL -grDepthMask( FxBool mask ); - -FX_ENTRY void FX_CALL -grDisableAllEffects( void ); - -FX_ENTRY void FX_CALL -grDitherMode( GrDitherMode_t mode ); - -FX_ENTRY void FX_CALL -grFogColorValue( GrColor_t fogcolor ); - -FX_ENTRY void FX_CALL -grFogMode( GrFogMode_t mode ); - -FX_ENTRY void FX_CALL -grFogTable( const GrFog_t ft[] ); - -FX_ENTRY void FX_CALL -grGammaCorrectionValue( float value ); - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -FX_ENTRY void FX_CALL -grLoadGammaTable( FxU32 nentries, FxU32 *red, FxU32 *green, FxU32 *blue); -#endif - -FX_ENTRY void FX_CALL -grSplash(float x, float y, float width, float height, FxU32 frame); - -#ifdef GLIDE3 -FX_ENTRY FxBool FX_CALL -grGet( FxU32 pname, FxU32 plength, FxI32 *params ); - -FX_ENTRY const char * FX_CALL -grGetString( FxU32 pname ); - -FX_ENTRY FxBool FX_CALL -grReset( FxU32 what ); - -FX_ENTRY GrProc FX_CALL -grGetProcAddress( char *procName ); - -FX_ENTRY void FX_CALL -grEnable( GrEnableMode_t mode ); - -FX_ENTRY void FX_CALL -grDisable( GrEnableMode_t mode ); - -FX_ENTRY void FX_CALL -grCoordinateSpace( GrCoordinateSpaceMode_t mode ); - -FX_ENTRY void FX_CALL -grDepthRange( FxFloat n, FxFloat f ); - -FX_ENTRY void FX_CALL -grViewport( FxI32 x, FxI32 y, FxI32 width, FxI32 height ); - -#endif -/* -** texture mapping control functions -*/ -FX_ENTRY FxU32 FX_CALL -grTexCalcMemRequired( - GrLOD_t lodmin, GrLOD_t lodmax, - GrAspectRatio_t aspect, GrTextureFormat_t fmt); - -FX_ENTRY FxU32 FX_CALL -grTexTextureMemRequired( FxU32 evenOdd, - GrTexInfo *info ); - -FX_ENTRY FxU32 FX_CALL -grTexMinAddress( GrChipID_t tmu ); - - -FX_ENTRY FxU32 FX_CALL -grTexMaxAddress( GrChipID_t tmu ); - - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -FX_ENTRY void FX_CALL -grTexNCCTable( GrNCCTable_t table ); -#else -FX_ENTRY void FX_CALL -grTexNCCTable( GrChipID_t tmu, GrNCCTable_t table ); -#endif - -FX_ENTRY void FX_CALL -grTexSource( GrChipID_t tmu, - FxU32 startAddress, - FxU32 evenOdd, - GrTexInfo *info ); - -FX_ENTRY void FX_CALL -grTexClampMode( - GrChipID_t tmu, - GrTextureClampMode_t s_clampmode, - GrTextureClampMode_t t_clampmode - ); - -FX_ENTRY void FX_CALL -grTexCombine( - GrChipID_t tmu, - GrCombineFunction_t rgb_function, - GrCombineFactor_t rgb_factor, - GrCombineFunction_t alpha_function, - GrCombineFactor_t alpha_factor, - FxBool rgb_invert, - FxBool alpha_invert - ); - -#ifndef GLIDE3_ALPHA -FX_ENTRY void FX_CALL -grTexCombineFunction( - GrChipID_t tmu, - GrTextureCombineFnc_t fnc - ); -#endif - -FX_ENTRY void FX_CALL -grTexDetailControl( - GrChipID_t tmu, - int lod_bias, - FxU8 detail_scale, - float detail_max - ); - -FX_ENTRY void FX_CALL -grTexFilterMode( - GrChipID_t tmu, - GrTextureFilterMode_t minfilter_mode, - GrTextureFilterMode_t magfilter_mode - ); - - -FX_ENTRY void FX_CALL -grTexLodBiasValue(GrChipID_t tmu, float bias ); - -FX_ENTRY void FX_CALL -grTexDownloadMipMap( GrChipID_t tmu, - FxU32 startAddress, - FxU32 evenOdd, - GrTexInfo *info ); - -FX_ENTRY void FX_CALL -grTexDownloadMipMapLevel( GrChipID_t tmu, - FxU32 startAddress, - GrLOD_t thisLod, - GrLOD_t largeLod, - GrAspectRatio_t aspectRatio, - GrTextureFormat_t format, - FxU32 evenOdd, - void *data ); - -FX_ENTRY void FX_CALL -grTexDownloadMipMapLevelPartial( GrChipID_t tmu, - FxU32 startAddress, - GrLOD_t thisLod, - GrLOD_t largeLod, - GrAspectRatio_t aspectRatio, - GrTextureFormat_t format, - FxU32 evenOdd, - void *data, - int start, - int end ); - - -FX_ENTRY void FX_CALL -ConvertAndDownloadRle( 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); - -FX_ENTRY void FX_CALL -grCheckForRoom(FxI32 n); - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -FX_ENTRY void FX_CALL -grTexDownloadTable( GrTexTable_t type, - void *data ); - -FX_ENTRY void FX_CALL -grTexDownloadTablePartial( GrTexTable_t type, - void *data, - int start, - int end ); -#else -FX_ENTRY void FX_CALL -grTexDownloadTable( GrChipID_t tmu, - GrTexTable_t type, - void *data ); - -FX_ENTRY void FX_CALL -grTexDownloadTablePartial( GrChipID_t tmu, - GrTexTable_t type, - void *data, - int start, - int end ); -#endif - -FX_ENTRY void FX_CALL -grTexMipMapMode( GrChipID_t tmu, - GrMipMapMode_t mode, - FxBool lodBlend ); - -FX_ENTRY void FX_CALL -grTexMultibase( GrChipID_t tmu, - FxBool enable ); - -FX_ENTRY void FX_CALL -grTexMultibaseAddress( GrChipID_t tmu, - GrTexBaseRange_t range, - FxU32 startAddress, - FxU32 evenOdd, - GrTexInfo *info ); - -/* -** utility texture functions -*/ - -#ifndef GLIDE3_ALPHA -FX_ENTRY GrMipMapId_t FX_CALL -guTexAllocateMemory( - GrChipID_t tmu, - FxU8 odd_even_mask, - 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 minfilter_mode, - GrTextureFilterMode_t magfilter_mode, - float lod_bias, - FxBool trilinear - ); - -FX_ENTRY FxBool FX_CALL -guTexChangeAttributes( - 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 - ); - -FX_ENTRY void FX_CALL -guTexCombineFunction( - GrChipID_t tmu, - GrTextureCombineFnc_t fnc - ); - -FX_ENTRY GrMipMapId_t FX_CALL -guTexGetCurrentMipMap( GrChipID_t tmu ); - -FX_ENTRY GrMipMapInfo * FX_CALL -guTexGetMipMapInfo( GrMipMapId_t mmid ); - -FX_ENTRY FxU32 FX_CALL -guTexMemQueryAvail( GrChipID_t tmu ); - -FX_ENTRY void FX_CALL -guTexMemReset( void ); - -FX_ENTRY void FX_CALL -guTexDownloadMipMap( - GrMipMapId_t mmid, - const void *src, - const GuNccTable *table - ); - -FX_ENTRY void FX_CALL -guTexDownloadMipMapLevel( - GrMipMapId_t mmid, - GrLOD_t lod, - const void **src - ); -FX_ENTRY void FX_CALL -guTexSource( GrMipMapId_t id ); -#endif /* !GLIDE3_ALPHA */ - -/* -** linear frame buffer functions -*/ - -FX_ENTRY FxBool FX_CALL -grLfbLock( GrLock_t type, GrBuffer_t buffer, GrLfbWriteMode_t writeMode, - GrOriginLocation_t origin, FxBool pixelPipeline, - GrLfbInfo_t *info ); - -FX_ENTRY FxBool FX_CALL -grLfbUnlock( GrLock_t type, GrBuffer_t buffer ); - -FX_ENTRY void FX_CALL -grLfbConstantAlpha( GrAlpha_t alpha ); - -FX_ENTRY void FX_CALL -grLfbConstantDepth( FxU16 depth ); - -FX_ENTRY void FX_CALL -grLfbWriteColorSwizzle(FxBool swizzleBytes, FxBool swapWords); - -FX_ENTRY void FX_CALL -grLfbWriteColorFormat(GrColorFormat_t colorFormat); - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -FX_ENTRY FxBool FX_CALL -grLfbWriteRegion( GrBuffer_t dst_buffer, - FxU32 dst_x, FxU32 dst_y, - GrLfbSrcFmt_t src_format, - FxU32 src_width, FxU32 src_height, - FxBool pixelPipeline, - FxI32 src_stride, void *src_data ); -#else -FX_ENTRY FxBool FX_CALL -grLfbWriteRegion( GrBuffer_t dst_buffer, - FxU32 dst_x, FxU32 dst_y, - GrLfbSrcFmt_t src_format, - FxU32 src_width, FxU32 src_height, - FxI32 src_stride, void *src_data ); -#endif - -FX_ENTRY FxBool FX_CALL -grLfbReadRegion( GrBuffer_t src_buffer, - FxU32 src_x, FxU32 src_y, - FxU32 src_width, FxU32 src_height, - FxU32 dst_stride, void *dst_data ); - - -/* -** Antialiasing Functions -*/ - -#ifndef GLIDE3_ALPHA - -FX_ENTRY void FX_CALL -grAADrawLine(const GrVertex *v1, const GrVertex *v2); - -FX_ENTRY void FX_CALL -grAADrawPoint(const GrVertex *pt ); - -FX_ENTRY void FX_CALL -grAADrawPolygon(const int nverts, const int ilist[], const GrVertex vlist[]); - -FX_ENTRY void FX_CALL -grAADrawPolygonVertexList(const int nverts, const GrVertex vlist[]); -#endif /* !GLIDE3_ALPHA */ - -FX_ENTRY void FX_CALL -grAADrawTriangle( - const GrVertex *a, const GrVertex *b, const GrVertex *c, - FxBool ab_antialias, FxBool bc_antialias, FxBool ca_antialias - ); - -/* -** glide management functions -*/ -FX_ENTRY void FX_CALL -grGlideInit( void ); - -FX_ENTRY void FX_CALL -grGlideShutdown( void ); - -#ifndef GLIDE3_ALPHA -FX_ENTRY void FX_CALL -grGlideGetVersion( char version[80] ); -#endif /* !GLIDE3_ALPHA */ - -FX_ENTRY void FX_CALL -grGlideGetState( GrState *state ); - -FX_ENTRY void FX_CALL -grGlideSetState( const GrState *state ); - -#ifndef GLIDE3_ALPHA -FX_ENTRY void FX_CALL -grGlideShamelessPlug(const FxBool on); - -FX_ENTRY void FX_CALL -grHints(GrHint_t hintType, FxU32 hintMask); -#endif /* !GLIDE3_ALPHA */ - -#ifdef GLIDE3 -FX_ENTRY void FX_CALL -grVertexLayout(FxU32 param, FxI32 offset, FxU32 mode); - -FX_ENTRY void FX_CALL -grDrawVertexArray(FxU32 mode, FxU32 Count, void *pointers); - -FX_ENTRY void FX_CALL -grDrawVertexArrayLinear(FxU32 mode, FxU32 Count, void *pointers, FxU32 stride); - -FX_ENTRY void FX_CALL -grDrawVertexArrayLinear(FxU32 mode, FxU32 Count, void *pointers, FxU32 stride); - -#endif - -#endif /* FX_GLIDE_NO_FUNC_PROTO */ - -#ifdef __cplusplus -} -#endif - -#include - -#endif /* __GLIDE_H__ */ diff --git a/glide2x/sst1/glide/src/glide.rc b/glide2x/sst1/glide/src/glide.rc deleted file mode 100644 index dc75c5f..0000000 --- a/glide2x/sst1/glide/src/glide.rc +++ /dev/null @@ -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 -#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. 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 diff --git a/glide2x/sst1/glide/src/glidesys.h b/glide2x/sst1/glide/src/glidesys.h deleted file mode 100644 index 1a7f2e7..0000000 --- a/glide2x/sst1/glide/src/glidesys.h +++ /dev/null @@ -1,108 +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$ -*/ -#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_SYSTEM7 0x8 -#define GLIDE_OS_OS2 0x10 -#define GLIDE_OS_OTHER 0x20 /* For Proprietary Arcade HW */ - -#define GLIDE_SST_SHIFT 7 -#define GLIDE_SST_HW (0x2 << GLIDE_SST_SHIFT ) - -/* Hardware Type is stored in bits [9:12] */ -#define GLIDE_HW_SHIFT 9 -#define GLIDE_HW_SST1 (0x1 << GLIDE_HW_SHIFT) -#define GLIDE_HW_SST96 (0x2 << GLIDE_HW_SHIFT) -#define GLIDE_HW_SSTH3 (0x4 << 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 -#endif - -#define GLIDE_SST GLIDE_SST_HW - - -/* Check for type of hardware */ -#ifdef SST96 -# define GLIDE_HW GLIDE_HW_SST96 -#elif defined(SSTH3) -# define GLIDE_HW GLIDE_HW_SSTH3 -#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__ */ diff --git a/glide2x/sst1/glide/src/glideutl.h b/glide2x/sst1/glide/src/glideutl.h deleted file mode 100644 index e578740..0000000 --- a/glide2x/sst1/glide/src/glideutl.h +++ /dev/null @@ -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__ */ diff --git a/glide2x/sst1/glide/src/gmovie.c b/glide2x/sst1/glide/src/gmovie.c deleted file mode 100644 index 8b26494..0000000 --- a/glide2x/sst1/glide/src/gmovie.c +++ /dev/null @@ -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 -** -** $Header$ -** $Log$ - * - * 3 3/09/97 10:31a Dow - * Added GR_DIENTRY for di glide functions -** -*/ -#include - -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -GR_DIENTRY(guMovieStart, void, ( void )) -{ - GrErrorCallback( "guMovieStart: unsupported on SST hardware", FXFALSE ); -} - -GR_DIENTRY(guMovieStop, void, ( void )) -{ - GrErrorCallback( "guMovieStop: unsupported on SST hardware", FXFALSE ); -} - -GR_DIENTRY(guMovieSetName, void, ( const char *name )) -{ - GrErrorCallback( "guMovieSetName: unsupported on SST hardware", FXFALSE ); -} - diff --git a/glide2x/sst1/glide/src/gpci.c b/glide2x/sst1/glide/src/gpci.c deleted file mode 100644 index aab812c..0000000 --- a/glide2x/sst1/glide/src/gpci.c +++ /dev/null @@ -1,1030 +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$ - * - * 45 11/01/97 12:11p Pgj - * glide.dll ---> glide2x.dll - * - * 44 10/21/97 8:20p Atai - * initialize vid timing to NLLL - * - * 43 8/18/97 3:11p Atai - * fix vg96 fb ram configuration - * - * 42 7/18/97 5:30p Jdt - * Fixes for open/shutdown symmetry - * - * 41 7/12/97 4:58p Dow - * Added DllMain - * - * 40 7/07/97 8:33a Jdt - * New tracing macros. - * - * 39 6/19/97 7:35p Dow - * More P6 Stuff - * - * 38 5/27/97 2:03p Dow - * added new env variable - * - * 37 5/19/97 7:35p Pgj - * Print cogent error message if h/w not found - * - * 36 4/15/97 12:59p Dow - * Bandaid for SST96/P6 - * - * 35 4/13/97 8:11p Jdt - * Change in init.h - * - * 34 4/13/97 2:06p Pgj - * eliminate all anonymous unions (use hwDep) - * - * 33 3/24/97 7:37p Dow - * Now sets n tmus for hwConfig - * - * 32 3/18/97 9:08p Dow - * Added FX_GLIDE_NO_DITHER_SUB environment variable - * - * 31 3/17/97 6:27a Jdt - * Removed enumCB and pass 0 to enumHardware. - * - * 30 3/16/97 12:51a Jdt - * fix num_sst when detecting vg96 - * - * 29 3/16/97 12:39a Jdt - * Programmatic type-os - * - * 28 3/16/97 12:19a Jdt - * Completely re-wrote grSstDetectResources - * - * 27 3/06/97 4:54p Dow - * Fixed SLI - * - * 26 3/04/97 9:08p Dow - * Neutered multiplatform multiheaded monster - * - * 25 3/02/97 7:05p Dow - * Changes to support DOS DLLs - * - * 24 2/26/97 2:18p Dow - * moved all debug set macros to __cdecl - * - * 23 2/26/97 11:57a Jdt - * Fixed stack bug, fixed splash screen bug - * - * 22 2/19/97 4:42p Dow - * Fixed debug build for Watcom - * - * 21 2/18/97 10:39a Dow - * Added call to initRegisters for AT3D - * - * 20 2/18/97 9:51a Jdt - * Did some casting to remove warnings. - * - * 19 2/14/97 12:55p Dow - * moved vg96 fifo wrap into init code - * - * 18 2/12/97 8:15p Dow - * Fixed VG base_pointe - * - * 17 2/12/97 9:20a Dow - * Fixed Watcom error wrt GDBG_ERROR call - * - * 16 2/11/97 6:59p Dow - * Changes to support vid tiles and ser status - * - * 15 1/18/97 11:48p Dow - * Re-added error callback set - * Added support for GMT's register debugging - * - * 14 1/14/97 6:41p Dow - * - * 13 12/23/96 1:37p Dow - * chagnes for multiplatform glide -** -*/ - -#include -#include - -#include <3dfx.h> -#include - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -#include - -#include - -#if ( GLIDE_PLATFORM & GLIDE_OS_WIN32) -#define WIN32_LEAN_AND_MEAN -#include - -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(); - break; - case DLL_PROCESS_ATTACH: - GDBG_INFO((80, "DllMain: DLL_PROCESS_DETACH\n")); - break; - case DLL_THREAD_ATTACH: - GDBG_INFO((80, "DllMain: DLL_PROCESS_DETACH\n")); - break; - case DLL_THREAD_DETACH: - GDBG_INFO((80, "DllMain: DLL_PROCESS_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) -{ - InitDeviceInfo info; - int ctx, device; - FxBool rv = FXFALSE; - - GDBG_INFO((280,"_grSstDetectResources()\n")); - - initEnumHardware( 0 ); - - _GlideRoot.hwConfig.num_sst = 0; - for( ctx = 0, device = 0; - device < INIT_MAX_DEVICES; - device++ ) { - if ( initGetDeviceInfo( device, &info ) ) { -#if ( GLIDE_PLATFORM & GLIDE_HW_SST1 ) - if ( info.hwClass == INIT_VOODOO ) { - int tmu; - - _GlideRoot.hwConfig.SSTs[ctx].type = GR_SSTTYPE_VOODOO; - - _GlideRoot.GCs[ctx].base_ptr = (FxU32 *)info.hwDep.vgInfo.vgBaseAddr; - _GlideRoot.GCs[ctx].reg_ptr = (FxU32 *)info.hwDep.vgInfo.vgBaseAddr; - _GlideRoot.GCs[ctx].lfb_ptr = (FxU32 *)SST_LFB_ADDRESS(info.hwDep.vgInfo.vgBaseAddr); - _GlideRoot.GCs[ctx].tex_ptr = (FxU32 *)SST_TEX_ADDRESS(info.hwDep.vgInfo.vgBaseAddr); - _GlideRoot.GCs[ctx].slave_ptr = (FxU32 *)info.hwDep.vgInfo.slaveBaseAddr; - _GlideRoot.GCs[ctx].grSstRez = GR_RESOLUTION_NONE; - - _GlideRoot.GCs[ctx].scanline_interleaved = info.hwDep.vgInfo.sliDetect; - _GlideRoot.GCs[ctx].grSstRefresh = GR_REFRESH_NONE; - _GlideRoot.GCs[ctx].num_tmu = info.hwDep.vgInfo.nTFX; - _GlideRoot.GCs[ctx].fbuf_size = info.hwDep.vgInfo.pfxRam; - _GlideRoot.GCs[ctx].vidTimings = NULL; - - _GlideRoot.hwConfig.num_sst++; - _GlideRoot.hwConfig.SSTs[ctx].sstBoard.VoodooConfig.fbiRev = - info.hwDep.vgInfo.pfxRev; - _GlideRoot.hwConfig.SSTs[ctx].sstBoard.VoodooConfig.fbRam = - info.hwDep.vgInfo.pfxRam; - _GlideRoot.hwConfig.SSTs[ctx].sstBoard.VoodooConfig.sliDetect = - info.hwDep.vgInfo.sliDetect; - - _GlideRoot.hwConfig.SSTs[ctx].sstBoard.VoodooConfig.nTexelfx = - info.hwDep.vgInfo.nTFX; - - for (tmu = 0; tmu < _GlideRoot.GCs[ctx].num_tmu; tmu++) { - _GlideRoot.hwConfig.SSTs[ctx].sstBoard.VoodooConfig.tmuConfig[tmu].tmuRam = - info.hwDep.vgInfo.tfxRam; - _GlideRoot.hwConfig.SSTs[ctx].sstBoard.VoodooConfig.tmuConfig[tmu].tmuRev = - info.hwDep.vgInfo.tfxRev; - - memset(&_GlideRoot.GCs[ctx].tmu_state[tmu], 0, sizeof(_GlideRoot.GCs[ctx].tmu_state[tmu])); - _GlideRoot.GCs[ctx].tmu_state[tmu].ncc_mmids[0] = GR_NULL_MIPMAP_HANDLE; - _GlideRoot.GCs[ctx].tmu_state[tmu].ncc_mmids[1] = GR_NULL_MIPMAP_HANDLE; - _GlideRoot.GCs[ctx].tmu_state[tmu].total_mem = info.hwDep.vgInfo.tfxRam<<20; - } - rv = FXTRUE; - ctx++; - } -#elif ( GLIDE_PLATFORM & GLIDE_HW_SST96 ) - if ( info.hwClass == INIT_VG96 ) { - _GlideRoot.hwConfig.SSTs[ctx].type = GR_SSTTYPE_SST96; - - _GlideRoot.GCs[ctx].base_ptr = (FxU32 *)info.hwDep.vg96Info.vg96BaseAddr; - _GlideRoot.GCs[ctx].reg_ptr = (FxU32 *)SST96_REG_PTR(info.hwDep.vg96Info.vg96BaseAddr); - _GlideRoot.GCs[ctx].lfb_ptr = (FxU32 *)SST96_LFB_PTR(info.hwDep.vg96Info.vg96BaseAddr); - _GlideRoot.GCs[ctx].tex_ptr = (FxU32 *)SST96_TEX_PTR(info.hwDep.vg96Info.vg96BaseAddr); - _GlideRoot.GCs[ctx].slave_ptr = 0; - - _GlideRoot.GCs[ctx].grSstRez = GR_RESOLUTION_NONE; - _GlideRoot.GCs[ctx].grSstRefresh = GR_REFRESH_NONE; - - _GlideRoot.GCs[ctx].scanline_interleaved = FXFALSE; - _GlideRoot.GCs[ctx].num_tmu = info.hwDep.vg96Info.nTFX; - _GlideRoot.GCs[ctx].fbuf_size = info.hwDep.vg96Info.vg96Ram; - - _GlideRoot.hwConfig.num_sst++; - _GlideRoot.hwConfig.SSTs[ctx].sstBoard.SST96Config.nTexelfx = - info.hwDep.vg96Info.nTFX; - _GlideRoot.hwConfig.SSTs[ctx].sstBoard.SST96Config.fbRam = - info.hwDep.vg96Info.vg96Ram >> 20; - _GlideRoot.hwConfig.SSTs[ctx].sstBoard.SST96Config.tmuConfig.tmuRev = - info.hwDep.vg96Info.tfxRev; - _GlideRoot.hwConfig.SSTs[ctx].sstBoard.SST96Config.tmuConfig.tmuRam = - info.hwDep.vg96Info.tfxRam; - memset(&_GlideRoot.GCs[ctx].tmu_state[0], 0, sizeof(_GlideRoot.GCs[ctx].tmu_state[0])); - - _GlideRoot.GCs[ctx].tmu_state[0].ncc_mmids[0] = GR_NULL_MIPMAP_HANDLE; - _GlideRoot.GCs[ctx].tmu_state[0].ncc_mmids[1] = GR_NULL_MIPMAP_HANDLE; - _GlideRoot.GCs[ctx].tmu_state[0].total_mem = info.hwDep.vg96Info.tfxRam<<20; - - _GlideRoot.GCs[ctx].hwDep.sst96Dep.serialStatus = - (FxU32*)info.regs.hwDep.VG96RegDesc.serialStatus; - _GlideRoot.GCs[ctx].hwDep.sst96Dep.fifoApertureBase = - (FxU32*)info.regs.hwDep.VG96RegDesc.fifoApertureBase; - - initDeviceSelect( ctx ); - initSetWriteMethod( _grSst96Store32 ); - rv = FXTRUE; - ctx++; - } -#else -#error "Need to define detection parameters for this device" -#endif - } else { - break; - } - } - - return rv; -} /* _grSstDetectResources */ - - -static void -displayBoardInfo( int i, GrHwConfiguration *hwc ) -{ - if (hwc->SSTs[i].type == GR_SSTTYPE_VOODOO) { - int tmuNum; - - GDBG_INFO((80,"SST board %d: 3Dfx Voodoo Graphics\n", i)); - GDBG_INFO((80,"\tPixelfx rev %d 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 - )); - if (hwc->SSTs[i].sstBoard.VoodooConfig.sliDetect) - GDBG_INFO((80,"\tScanline Interleaved\n")); - for (tmuNum = 0; - tmuNum < hwc->SSTs[i].sstBoard.VoodooConfig.nTexelfx; - tmuNum++ ) - { - GDBG_INFO((80,"\t\tTexelfx %d: Rev %d, %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 */ - - -FxU32 -GR_CDECL - - -_cpu_detect_asm(void); - -#if defined(FX_DLL_ENABLE) && (GLIDE_PLATFORM & GLIDE_OS_WIN32) -#include -#endif - -void -_GlideInitEnvironment( void ) -{ - int i; - - if ( _GlideRoot.initialized ) /* only execute once */ - return; - GDBG_INIT(); /* init the GDEBUG libraray */ - GDBG_INFO((80,"_GlideInitEnvironment()\n")); - -#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 - - _GlideRoot.CPUType = _cpu_detect_asm(); - - if (getenv("FX_CPU")) _GlideRoot.CPUType = atoi(getenv("FX_CPU")); - _GlideRoot.environment.triBoundsCheck = - getenv("FX_GLIDE_BOUNDS_CHECK") != NULL; - _GlideRoot.environment.swapInterval = -1; - _GlideRoot.environment.swFifoLWM = -1; - _GlideRoot.environment.noSplash = - getenv("FX_GLIDE_NO_SPLASH") != NULL; - _GlideRoot.environment.shamelessPlug = - getenv("FX_GLIDE_SHAMELESS_PLUG") != NULL; - if (getenv("FX_GLIDE_LWM")) - _GlideRoot.environment.swFifoLWM = atoi(getenv("FX_GLIDE_LWM")); - if (getenv("FX_GLIDE_SWAPINTERVAL")) { - _GlideRoot.environment.swapInterval = - atoi(getenv("FX_GLIDE_SWAPINTERVAL")); - if (_GlideRoot.environment.swapInterval < 0) - _GlideRoot.environment.swapInterval = 0; - } - - if (getenv("FX_GLIDE_IGNORE_REOPEN")) - _GlideRoot.environment.ignoreReopen = FXTRUE; - - if (getenv("FX_GLIDE_NO_DITHER_SUB")) { - _GlideRoot.environment.disableDitherSub = FXTRUE; - } - - if (getenv("FX_SNAPSHOT")) - _GlideRoot.environment.snapshot = atoi(getenv("FX_SNAPSHOT")); - - 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," rsrchFlags: %d\n",_GlideRoot.environment.rsrchFlags)); - 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)); - /* GMT: BUG these are hardware dependent and really should come from the init code */ - _GlideRoot.stats.minMemFIFOFree = 0xffff; - _GlideRoot.stats.minPciFIFOFree = 0x3f; - - /* constant pool */ - _GlideRoot.pool.f0 = 0.0F; - _GlideRoot.pool.fHalf= 0.5F; - _GlideRoot.pool.f1 = 1.0F; - _GlideRoot.pool.f255 = 255.0F; - _GlideRoot.pool.f256 = 256.0F; - - _GlideRoot.current_sst = 0; /* make sure there's a valid GC */ - _GlideRoot.curGC = &_GlideRoot.GCs[0]; /* just for 'booting' the library */ - if (!_grSstDetectResources()) { - char s[128]; -#ifndef __linux__ - sprintf(s, - "_GlideInitEnvironment: glide2x.dll expected %s, none detected\n", - GLIDE_DRIVER_NAME); -#else - sprintf(s, - "_GlideInitEnvironment: libglide2x.so expected %s, none detected\n", - GLIDE_DRIVER_NAME); -#endif - GrErrorCallback(s, 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 = FXTRUE; /* save this for the end */ - -} /* _GlideInitEnvironment */ - - - - -#if defined(GLIDE_DEBUG) - -/* GMT: tracing utilities */ - -/* STOLEN FROM SST.C */ -/*---------------------------------------------------------------------- - An array of SST register info - ----------------------------------------------------------------------*/ -typedef struct { - char *name; -} regInfo; - -static regInfo regsInfo[] = { - "STATUS", - "reserved0", - "vA.x", - "vA.y", - "vB.x", - "vB.y", - "vC.x", - "vC.y", - - "R", - "G", - "B", - "Z", - "A", - "S", - "T", - "W", - - "DRDX", - "DGDX", - "DBDX", - "DZDX", - "DADX", - "DSDX", - "DTDX", - "DWDX", - - "DRDY", - "DGDY", - "DBDY", - "DZDY", - "DADY", - "DSDY", - "DTDY", - "DWDY", - - "triangleCMD", - "reserved1", - "FvA.x", - "FvA.y", - "FvB.x", - "FvB.y", - "FvC.x", - "FvC.y", - - "FR", - "FG", - "FB", - "FZ", - "FA", - "FS", - "FT", - "FW", - - "FDRDX", - "FDGDX", - "FDBDX", - "FDZDX", - "FDADX", - "FDSDX", - "FDTDX", - "FDWDX", - - "FDRDY", - "FDGDY", - "FDBDY", - "FDZDY", - "FDADY", - "FDSDY", - "FDTDY", - "FDWDY", - - "FtriangleCMD", - "FBZCOLORPATH", - "FOGMODE", - "ALPHAMODE", - "FBZMODE", - "LFBMODE", - "CLIPLEFTRIGHT", - "CLIPBOTTOMTOP", - - "nopCMD", - "fastfillCMD", - "swapbufCMD", - "FOGCOLOR", - "ZACOLOR", - "CHROMAKEY", - "reserved2", - "reserved3", - - "STIPPLE", - "C0", - "C1", - "pixelsIN", - "chromaFAIL", - "zfuncFAIL", - "afuncFAIL", - "pixelsOUT", - - "FOGTABLE[0]", - "FOGTABLE[1]", - "FOGTABLE[2]", - "FOGTABLE[3]", - "FOGTABLE[4]", - "FOGTABLE[5]", - "FOGTABLE[6]", - "FOGTABLE[7]", - "FOGTABLE[8]", - "FOGTABLE[9]", - "FOGTABLE[10]", - "FOGTABLE[11]", - "FOGTABLE[12]", - "FOGTABLE[13]", - "FOGTABLE[14]", - "FOGTABLE[15]", - "FOGTABLE[16]", - "FOGTABLE[17]", - "FOGTABLE[18]", - "FOGTABLE[19]", - "FOGTABLE[20]", - "FOGTABLE[21]", - "FOGTABLE[22]", - "FOGTABLE[23]", - "FOGTABLE[24]", - "FOGTABLE[25]", - "FOGTABLE[26]", - "FOGTABLE[27]", - "FOGTABLE[28]", - "FOGTABLE[29]", - "FOGTABLE[30]", - "FOGTABLE[31]", - - "reserved_0", - "reserved_1", - "reserved_2", - "reserved_3", - "reserved_4", - "reserved_5", - "reserved_6", - "reserved_7", - - "PCIINTERRUPT", - "VRETRACE", - "BACKPORCH", - "VIDEODIMENS", - "FBIINIT0", - "FBIINIT1", - "FBIINIT2", - "FBIINIT3", - - "HSYNC", - "VSYNC", - "CLUTDATA", - "DACDATA", - - "reserved", - "reserved", - "reserved", - "reserved", - - "reserved", - "reserved", - "reserved", - "reserved", - "reserved", - "reserved", - "reserved", - "reserved", - - "reserved", - "reserved", - "reserved", - "reserved", - "reserved", - "reserved", - "reserved", - "reserved", - - "reserved", - "reserved", - "reserved", - "reserved", - "reserved", - "reserved", - "reserved", - "reserved", - - "reserved", - "reserved", - "reserved", - "reserved", - "reserved", - "reserved", - "reserved", - "reserved", - - "CHROMARANGE", - "CLIPLEFTRIGHT1", - "CLIPTOPBOTTOM1", - "COLBUFSETUP", - "AUXBUFSETUP", - "TEXCHIPSEL", - "SWAPPENDCMD", - "reserved96", - - "reserved96", - "reserved96", - "reserved96", - "reserved96", - "reserved96", - "reserved96", - "reserved96", - "reserved96", - - - "TEXTUREMODE", - "TLOD", - "TDETAIL", - "TEXBASEADDR", - "TEXBASEADDR1", - "TEXBASEADDR2", - "TEXBASEADDR38", - "TREXINIT0", - - "TREXINIT1", - "NCCTABLE0[0]", - "NCCTABLE0[1]", - "NCCTABLE0[2]", - "NCCTABLE0[3]", - "NCCTABLE0[4]", - "NCCTABLE0[5]", - "NCCTABLE0[6]", - "NCCTABLE0[7]", - "NCCTABLE0[8]", - "NCCTABLE0[9]", - "NCCTABLE0[10]", - "NCCTABLE0[11]", - - "NCCTABLE1[0]", - "NCCTABLE1[1]", - "NCCTABLE1[2]", - "NCCTABLE1[3]", - "NCCTABLE1[4]", - "NCCTABLE1[5]", - "NCCTABLE1[6]", - "NCCTABLE1[7]", - "NCCTABLE1[8]", - "NCCTABLE1[9]", - "NCCTABLE1[10]", - "NCCTABLE1[11]", -}; - -#define MAXREGADDR sizeof(regsInfo)/sizeof(regInfo) - -static FxU32 last_addr = 0; /* TEX trace optimizer */ - -FxU32 GR_CDECL -_GR_GET(void *addr) -{ - GR_DCL_GC; - FxU32 chip, data, iaddr = (FxU32) addr; - - data = GET(*(FxU32 *)addr); - iaddr = iaddr - (FxU32)gc->base_ptr + 0x10000000; - chip = (iaddr >> 10) & 0xF; - if (iaddr < 0x10000000) { /* sanity check */ - GDBG_ERROR("GET","bad address(> 2) & 0xFF; /* get offset into SST */ - ri = regsInfo+reg; - if (reg < MAXREGADDR) { - GDBG_INFO((120," GET(0x%x,%11d(0x%08x)) %d\t%s\n", - iaddr,data,data, chip,ri->name)); - } - else - GDBG_ERROR("GET","bad register address=0x%x\n", reg<<2); - } - return data; -} /* _GR_GET */ - -void GR_CDECL -_GR_SET(void *addr, unsigned long data) -{ - GR_DCL_GC; - FxU32 chip, iaddr = (FxU32) addr; - - iaddr = iaddr - (FxU32)gc->base_ptr + 0x10000000; - if (iaddr < 0x10000000) { /* sanity check */ - GDBG_ERROR("SET","bad address(> 21) & 0x3; /* grab bits 22:21 */ - if (chip == 3) { - if (((iaddr>>17)&0x3F) == 0x31) { - GDBG_INFO((120," SET(0x%x,%11d(0x%08x)) %d\tPACKER\n", - iaddr,data,data,chip)); - } - } - else { - if (GDBG_GET_DEBUGLEVEL(195)) { /* optimized TEX data trace */ - if (iaddr == last_addr+4) - GDBG_PRINTF(("T+4 %x\n", data)); - else - GDBG_PRINTF(("TEX %x %x\n", iaddr,data)); - } - } - } - else if (iaddr & 0x400000) { /* are we in LFB territory? */ - GDBG_INFO((120," SET(0x%x,%11d(0x%08x)) 0\tLFB\n", - iaddr,data,data)); - } - else { - /* check for valid register read */ - int reg; - regInfo *ri; - - chip = (iaddr >> 10) & 0xF; - reg = (iaddr >> 2) & 0xFF; /* get offset into SST */ - ri = regsInfo+reg; - if (reg < MAXREGADDR) { - GDBG_INFO((120," SET(0x%x,%11d(0x%08x)) %d\t%s\n", - iaddr,data,data, chip,ri->name)); - } - else - GDBG_ERROR("SET","CHIP #%d bad register address=0x%x, data=%d(x%x)\n", - chip,reg<<2,data,data); - } - last_addr = iaddr; -} /* _GR_SET */ - -void GR_CDECL -_GR_SETF(void *addr, float data) -{ - _GR_SET(addr,*(unsigned long *)&data); -} /* _GR_SETF */ - -void GR_CDECL -_GR_SET16(void *addr, unsigned short data) -{ - GR_DCL_GC; - FxU32 iaddr = (FxU32)addr; - iaddr = iaddr - (FxU32)gc->base_ptr + 0x10000000; - GDBG_INFO((120," SET16(0x%x,%11d(0x%08x)) 0\tLFB16\n",iaddr,data,data)); - last_addr = 0; -} /* _GR_SET16 */ - -#endif /* defined(GLIDE_DEBUG) */ - -#if defined( GLIDE_DEBUG ) && ( GLIDE_PLATFORM & GLIDE_HW_SST96 ) - -extern char *regNames[]; - -static FxU32 thisMask; -static FxU32 thisWrite; -static FxU32 maxWrites; - -void GR_CDECL -_GR_SET_GW_CMD( volatile void *addr, unsigned long data ) { - GR_DCL_GC; - - /* validate pointer range */ - { - FxU32 min = (FxU32)gc->fifoData.hwDep.vg96FIFOData.fifoVirt; - FxU32 max = min + (FxU32)gc->fifoData.hwDep.vg96FIFOData.fifoMax; - if ( ((FxU32)addr) < min || ((FxU32)addr) > max ) { - GDBG_ERROR( "SET GW CMD", - "Fifo address 0x%x out of range(0x%x, 0x%x)\n", - addr, - gc->fifoData.hwDep.vg96FIFOData.fifoVirt, - gc->fifoData.hwDep.vg96FIFOData.fifoMax ); - } - - } - /* validate alignment */ - if ( ((FxU32)addr) & 0x7 ) { - GDBG_ERROR( "SET GW CMD", - "Fifo address 0x%x is not 8 byte aligned\n", - addr ); - } - /* validate enable bit */ - if ( ! (data&0x80000000) ) { - GDBG_ERROR( "SET GW CMD", - "Fifo command 0x%x missing flag bit\n", - data ); - } - /* validate reserved bits */ - if ( data&0x7fE00300 ) { - GDBG_ERROR( "SET GW CMD", - "Fifo command 0x%x reserved bits set!\n", - data ); - } - - GDBG_INFO((128, - "Writing Group Write Command: 0x%x\n", - data )); - GDBG_INFO((128, - " FIFO ADDR: 0x%.08x\n", addr )); - /* dump chip field */ - { - FxU32 field = ( (data<<2) & 0xf0000 ) >> 16; - GDBG_INFO((128, " Chip Field: 0x%x\n", field )); - } - /* dump wrap field */ - { - FxU32 field = ( (data<<2) & 0x0f000 ) >> 12; - GDBG_INFO((128, " Wrap Field: 0x%x\n", field )); - } - /* dump register */ - { - FxU32 reg = ( data & 0xff ); - GDBG_INFO((128, " Register: %s(0x%x)\n", regNames[reg], reg )); - } - *(FxU32*)addr = data; -} - -void GR_CDECL -_GR_SET_GW_HEADER( volatile void *addr, unsigned long data ) { - GR_DCL_GC; - - /* validate pointer range */ - { - FxU32 min = (FxU32)gc->fifoData.hwDep.vg96FIFOData.fifoVirt; - FxU32 max = min + (FxU32)gc->fifoData.hwDep.vg96FIFOData.fifoMax; - if ( ((FxU32)addr) < min || ((FxU32)addr) > max ) { - GDBG_ERROR( "SET GW CMD", - "Fifo address 0x%x out of range(0x%x, 0x%x)\n", - addr, - gc->fifoData.hwDep.vg96FIFOData.fifoVirt, - gc->fifoData.hwDep.vg96FIFOData.fifoMax ); - } - - } - /* validate alignment */ - if ( ((FxU32)addr) & 0x3 ) { - GDBG_ERROR( "SET GW HEADER", - "Fifo address 0x%x is not DWORD aligned\n", - addr ); - } - GDBG_INFO((128, - "Writing Group Write Header: 0x%x\n", - data )); - GDBG_INFO((128, - " FIFO ADDR: 0x%.08x\n", addr )); - /* validate bits - at least one must be set*/ - { - FxU32 val, bits, reg; - val = data; - bits = 0; - reg = 2; - while( val ) { - if ( val & 1 ) { - bits++; - GDBG_INFO((128, " Register: %s\n", regNames[reg] )); - } - val>>=1; - reg++; - } - GR_ASSERT( bits ); - GDBG_INFO((128, " --------------\n" )); - GDBG_INFO((128, " Total Bits: %d\n", bits )); - maxWrites = bits; - if ( maxWrites & 1 ) maxWrites++; - } - *(FxU32*)addr = data; - thisMask = data; - thisWrite = 0; -} - -void GR_CDECL -_GR_SET_GW_ENTRY( volatile void *addr, unsigned long data ) { - GR_DCL_GC; - /* validate pointer range */ - { - FxU32 min = (FxU32)gc->fifoData.hwDep.vg96FIFOData.fifoVirt; - FxU32 max = min + (FxU32)gc->fifoData.hwDep.vg96FIFOData.fifoMax; - if ( ((FxU32)addr) < min || ((FxU32)addr) > max ) { - GDBG_ERROR( "SET GW CMD", - "Fifo address 0x%x out of range(0x%x, 0x%x)\n", - addr, - gc->fifoData.hwDep.vg96FIFOData.fifoVirt, - gc->fifoData.hwDep.vg96FIFOData.fifoMax ); - } - - } - /* validate alignment */ - if ( ((FxU32)addr) & 0x3 ) { - GDBG_ERROR( "SET GW ENTRY", - "Fifo address 0x%x is not DWORD aligned\n", - addr ); - } - /* validate write within packet */ - if ( !thisMask || thisWrite > maxWrites ) { - GDBG_ERROR( "SET GW ENTRY", - "Group write entry attempted outside of a packet\n" ); - } - GDBG_INFO((128, - "Writing Group Write Entry\n" )); - GDBG_INFO((128, - " FIFO ADDR: 0x%.08x\n", addr )); - /* decode write */ - { - FxU32 reg, bit, write; - reg = 2; - bit = 1; - write = 0; - - while( bit ) { - if ( bit & thisMask ) { - if ( write == thisWrite ) break; - write++; - } - bit <<= 1; - reg++; - } - - if ( bit ) { - GDBG_INFO((128, - " REG: %s DATA: 0x%x(%f)\n", - regNames[reg], - data, - *(float*)&data )); - } else { - GDBG_INFO((128, - " PADDING\n" )); - } - } - *(FxU32*)addr = data; - thisWrite++; -} - -#endif /* defined( GLIDE_DEBUG) && ( GLIDE_PLATFORM & GLIDE_HW_SST96 ) */ - diff --git a/glide2x/sst1/glide/src/gsplash.c b/glide2x/sst1/glide/src/gsplash.c deleted file mode 100644 index a85c4c1..0000000 --- a/glide2x/sst1/glide/src/gsplash.c +++ /dev/null @@ -1,896 +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/19/97 8:09a Peter - * fog table propogation - * - * 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 <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include - -#include "fxglide.h" -#include "fxinline.h" - -#include - -/*----------------------------- - 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; - } - - return; -} - -static void createTextures( void ) { - Gu3dfInfo *info; - - /* - * Download the texture for the "3D" part of the model. - */ - info = ( Gu3dfInfo * )text_3dfinfo_raw; - info->data = ( void * )text_3dfinfo_image; - - downloadTexture( &textImage, info ); - - /* - * Download the texture for the specular highlight. - */ - info = ( Gu3dfInfo * )hilite_3dfinfo_raw; - info->data = ( void * )hilite_3dfinfo_image; - downloadTexture( &hiliteImage, info ); - - /* - * Download the texture for the shadow. - */ - info = ( Gu3dfInfo * )shadow_3dfinfo_raw; - info->data = ( void * )shadow_3dfinfo_image; - downloadTexture( &shadowImage, info ); - return; -} - -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; - } - return; -} - -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; - - 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->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)255) - - ((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)255) - - (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 ); - } - - /* - * Clean up after yourself! - */ - grGlideSetState(&oldState); - -} - - diff --git a/glide2x/sst1/glide/src/gsst.c b/glide2x/sst1/glide/src/gsst.c deleted file mode 100644 index 07645f8..0000000 --- a/glide2x/sst1/glide/src/gsst.c +++ /dev/null @@ -1,1423 +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$ -** -** 79 7/06/98 3:05p Peter -** grSstWinOpen fails triple buffering -** -** 78 6/04/98 12:13p Peter -** splash dll rename -** -** 77 3/16/98 3:20p Atai -** fixed glide in a window bug. OEM DLL code bails out if res can not be -** found -** -** 76 3/02/98 10:42a Atai -** remove oemvidtiming for DOS -** -** 75 2/24/98 10:59a Atai -** modify for oem dll -** -** 74 2/23/98 11:03a Peter -** -** 73 2/12/98 8:21p Pgj -** -** 72 2/12/98 6:48p Atai -** fix typo -** -** 71 2/12/98 4:01p Atai -** change refresh rate if oemdll updated for tv out - * - * 70 1/12/98 10:25p Dow - * H3D Stereo Support - * - * 69 1/06/98 3:44p Atai - * fixed tv out related stuff for dos build. - * - * 68 12/19/97 11:04a Atai - * oeminit dll stuff - * - * 67 12/19/97 10:23a Dow - * Splash Screen stuff - * - * 66 12/03/97 9:36a Dow - * Fixed bug in grSstIsBusy() - * - * 65 12/02/97 7:20p Dow - * Added code for new splash screen - * - * 64 10/21/97 8:20p Atai - * added parameter for vid timing - * - * 63 10/06/97 1:14p Atai - * fix bug 824. added sli resolution checking - * - * 62 9/19/97 1:24p Peter - * more test27 fun - * - * 61 9/11/97 1:33p Atai - * In grSstWinOpen(), checking (nColBuffers+nAuxBuffers) for - * GR_RESOLUTION_800x600 and GR_RESOLUTION_856x480 - * - * 60 9/10/97 10:13p Peter - * fifo logic from GaryT, non-normalized fp first cut - * - * 59 9/07/97 12:25p Pgj - * - * 58 9/07/97 12:14p Pgj - * fix bug 697 - * - * 57 8/19/97 8:55p Peter - * lots of stuff, hopefully no muckage - * - * 56 7/09/97 10:18a Dow - * Further Nudge Of Love adjustments - * - * 55 7/07/97 3:05p Dow - * Moved some state BEFORE splash screen - * - * 54 6/26/97 3:09p Dow - * removed warning - * - * 53 6/24/97 3:40p Dow - * Protected Nude of Love - * - * 52 6/22/97 10:19a Dow - * Set cpuType filed inf fifoInfo before calling initEnableTransport - * - * 51 6/21/97 1:05p Dow - * Made it use the NUDGE_OF_LOVE macro - * - * 50 6/21/97 12:15p Dow - * Moved 128 DWORD nudge of love into grSstStatus() - * - * 49 6/21/97 11:39a Dow - * Fixed debug assertion - * - * 48 6/19/97 7:35p Dow - * More P6 Stuff - * - * 47 6/11/97 5:30p Pgj - * fix bug 594 (grSstPerfStats() returns inaccurate data on SLI systems) - * - * 46 6/05/97 11:15p Pgj - * - * 45 5/30/97 8:53a Dow - * Protected int10Called set in grSstWinOpen - * - * 44 5/28/97 2:11p Dow - * int10h handler - * - * 43 5/27/97 2:03p Dow - * added check for new env variable - * - * 42 5/22/97 11:25a Dow - * Fixed bogus polling for idle. - * - * 41 5/21/97 9:52a Jdt - * Added grSstControl() implementation for SST-1. - * - * 40 5/05/97 2:22p Dow - * Protected previous checkin with SST96 to avoid errors when compiling - * SST1 - * - * 39 5/05/97 1:35p Dow - * Changed grSstControl to modify clip1 instead of clip0 - * - * 38 5/04/97 12:48p Dow - * made grSstControl change clipLeftRight and clipBottomTop via direct - * writes. - * - * 37 5/02/97 2:11p Pgj - * screen_width/height now FxU32 - * - * 36 4/15/97 12:59p Dow - * Fixed clipping problem - * - * 35 4/13/97 8:11p Jdt - * Change in init.h - * - * 34 4/13/97 2:06p Pgj - * eliminate all anonymous unions (use hwDep) - * - * 33 3/20/97 2:18a Dow - * added a fixme - * - * 32 3/19/97 10:43p Dow - * windowsInit stuff - * - * 31 3/19/97 1:37a Jdt - * Added some stride computation - * - * 30 3/18/97 9:55p Jdt - * Moved resolution guessing into init lib. - * - * 29 3/17/97 6:28a Jdt - * Rewrite of grSstWinOpen with new init code in mind. - * - * 28 3/16/97 12:39a Jdt - * Moved over to serialstatus stored in hwDep... - * - * 27 3/14/97 2:36a Murali - * Removed printfs(), and GDBG_INFO won't work at this stage. - * - * 26 3/13/97 11:02p Jdt - * Added new splash in. - * - * 25 3/13/97 5:54a Murali - * Second set of changes for WinGlide. - * - * 24 3/13/97 2:51a Jdt - * First step towards windowed splash - * - * 23 3/05/97 2:18p Murali - * Preliminary changes for Glide in a window. - * - * 22 3/04/97 9:08p Dow - * Neutered multiplatform multiheaded monster - * - * 21 2/26/97 11:58a Jdt - * Fixed grsstopen and grSstorigin - * - * 20 2/19/97 4:41p Dow - * Changed status read to use serial status on SST96 - * - * 19 2/14/97 12:55p Dow - * moved vg96 fifo wrap into init code - * - * 18 1/14/97 10:48a Dow - * Modified grSstStatus to work w/ VG96 - * Made grSstIdle work with either VG or VG96 (via Init HAL) - * - * 17 12/23/96 1:37p Dow - * chagnes for multiplatform glide - * - * 16 11/24/96 9:35a Tarolli - * it now calls sst1InitNumBoardsInSystem(); instead of doing the work - * itself - * - * 15 11/15/96 4:05p Jdt - * Dllable for vg96 -** -*/ - -#include -#include -#include <3dfx.h> - -#include -#include - -#if ( GLIDE_PLATFORM & GLIDE_HW_SST96 ) -#include -#endif - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) -#define WIN32_LEAN_AND_MEAN -#include "oeminit.h" /* NEVER used by DOS */ -#include -#endif - -#if (GLIDE_PLATFORM & GLIDE_OS_DOS32) && (GLIDE_PLATFORM & GLIDE_HW_SST96) && defined(GLIDE_DEBUG) -#include - /* int 10h interrupt handler */ -void __interrupt __far -_grInt10Handler() { -#define FN_NAME "_grInt10Handler" - GR_DCL_GC; - - gc->hwDep.sst96Dep.int10Called = FXTRUE; - -#undef FN_NAME -} /* _grInt10Handler */ -#endif - - -#ifdef H3D -#include -#define F_PATTERN 0 // flippy pattern (sst96) -#define T_PATTERN 1 // tippy pattern (sst1) - -typedef struct patColor_t { unsigned char r,g,b; } patColor; - -#define PAT_BLACK {0,0,0} -#define PAT_RED {255,0,0} -#define PAT_GREEN {0,255,0} -#define PAT_YELLOW {255,255,0} - -static h3dRez[]={240,300}; -#define H3DHEIGHT_FROM_REZ(r) (h3dRez[(r)-GR_RESOLUTION_AUTOFLIPPED_MIN]) - -static GrState defstate; // default winopen state - -static patColor sigPattern[] = { // signature color pattern - PAT_RED,PAT_RED,PAT_RED,PAT_RED,PAT_GREEN,PAT_YELLOW,PAT_YELLOW -}; - -static patColor disableColor[2] = {PAT_BLACK,PAT_BLACK}; // turn off adapter - -#if ( GLIDE_PLATFORM & GLIDE_HW_SST1 ) -static patColor enableColor[2] = {PAT_YELLOW,PAT_BLACK}; // use top and bottom mode 1 -#elif ( GLIDE_PLATFORM & GLIDE_HW_SST96 ) -static patColor enableColor[2] = {PAT_GREEN,PAT_BLACK}; // use pageflip mode -#endif -static patColor enableColor2[2] = {PAT_YELLOW,PAT_GREEN}; // use top and bottom mode 2 - -// TODO : get key value for tb mode 1/2 -static int getGetIntKeyValue(char * key) { -// RegCreateKeyEx(); - return 1; // use mode 1 -}; - -// TODO: should use _grSwizzleColor(...) -static unsigned long patColorToGR(patColor clr, GrColorFormat_t fmt) { - switch (fmt) { - case GR_COLORFORMAT_ARGB: - return ((unsigned long)(255<<24)|(unsigned long)(clr.r<<16)|((unsigned long)clr.g<<8)|(clr.b)); - case GR_COLORFORMAT_ABGR: - return ((unsigned long)(255<<24)|(unsigned long)(clr.b<<16)|((unsigned long)clr.g<<8)|(clr.r)); - case GR_COLORFORMAT_RGBA: - return ((unsigned long)(clr.r<<24)|(unsigned long)(clr.g<<16)|((unsigned long)clr.b<<8)|(255)); - case GR_COLORFORMAT_BGRA: - return ((unsigned long)(clr.b<<24)|(unsigned long)(clr.g<<16)|((unsigned long)clr.r<<8)|(255)); - } -} - -static void drawlinefb(GrVertex * lineLeft, GrVertex * lineRight) { - grRenderBuffer(GR_BUFFER_FRONTBUFFER); - grDrawLine(lineLeft, lineRight); - grRenderBuffer(GR_BUFFER_BACKBUFFER); - grDrawLine(lineLeft, lineRight); -} - -static void initState(void) { - grAlphaBlendFunction( GR_BLEND_ONE , GR_BLEND_ZERO, - GR_BLEND_ONE, GR_BLEND_ZERO ); - grAlphaTestFunction( GR_CMP_ALWAYS ); - grAlphaTestReferenceValue( 0 ); - grChromakeyMode( GR_CHROMAKEY_DISABLE ); - grConstantColorValue( ( FxU32 ) ~0 ); - _grColorCombineDelta0Mode( FXFALSE ); - grColorCombine(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_ITERATED, - FXFALSE); - grAlphaCombine(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_CONSTANT, - FXFALSE); - grColorMask( FXTRUE, FXFALSE ); - grCullMode( GR_CULL_DISABLE ); - grDepthBiasLevel( 0 ); - grDepthMask( FXFALSE ); - grDepthBufferMode( GR_DEPTHBUFFER_DISABLE ); - grDepthBufferFunction( GR_CMP_ALWAYS ); - grDepthBiasLevel( 0 ); - grDitherMode( GR_DITHER_4x4 ); - grFogMode( GR_FOG_DISABLE ); - grFogColorValue( 0x00000000 ); - grDisableAllEffects(); -} - -void setAutoflip(int enable) { - GrVertex lineLeft, lineRight; - GrState state; - int scrWidth = grSstScreenWidth(); - int line; - MSG msg; - GrColorFormat_t format; - static firstupdate = 1; - extern void initAT3DSetTiles(FxU32 PageFlipping, FxU32 nBuffers); - GR_DCL_GC; - - // wait for the window messages to flush - while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - - grGlideGetState(&state); // save the app. state - - initState(); - -#if ( GLIDE_PLATFORM & GLIDE_HW_SST96 ) - if (firstupdate) { - initAT3DSetTiles(0,gc->state.num_buffers); - firstupdate = 0; - } /* TODO:: setup regs for non-pageflipping seems to fix fb alignment... */ - if (enable) { - grSstIdle(); - initAT3DSetTiles(1,gc->state.num_buffers); - } /* setup regs for pageflipping */ -#endif - - grDepthBufferFunction( GR_CMP_ALWAYS ); - grDepthMask( FXFALSE ); - - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, GR_COMBINE_OTHER_NONE, - FXFALSE ); - - format = state.color_format; - lineLeft.x = 0.f; - lineRight.x = (float)scrWidth-1; - lineLeft.z = lineRight.z = 0.f; - lineLeft.ooz = lineRight.ooz = 65535.f; -#if ( GLIDE_PLATFORM & GLIDE_HW_SST1 ) - lineLeft.y = lineRight.y = 2.f; -#elif ( GLIDE_PLATFORM & GLIDE_HW_SST96 ) - lineLeft.y = lineRight.y = grSstScreenHeight() - H3DHEIGHT_FROM_REZ(gc->grSstRez) + 2.f; -#endif - - grColorMask(FXTRUE,0); - grDepthBufferFunction( GR_CMP_ALWAYS ); - grClipWindow(0,0,grSstScreenWidth(),grSstScreenHeight()); - grRenderBuffer(GR_BUFFER_FRONTBUFFER); - grBufferClear( 0x00, 0, GR_ZDEPTHVALUE_FARTHEST ); - - grRenderBuffer(GR_BUFFER_BACKBUFFER); - grBufferClear( 0x00, 0, GR_ZDEPTHVALUE_FARTHEST ); - - - grBufferSwap(1); - grBufferClear( 0x00, 0, GR_ZDEPTHVALUE_FARTHEST ); - grSstOrigin(GR_ORIGIN_UPPER_LEFT); - - for (line = 0; line < 7; line++) { - grConstantColorValue( patColorToGR(sigPattern[line],format) ); - drawlinefb(&lineLeft, &lineRight); - lineLeft.y = ++lineRight.y; - - grConstantColorValue( 0 ); - drawlinefb(&lineLeft, &lineRight); - lineLeft.y = ++lineRight.y; - } - - for (line = 0; line < 2; line++) { - grConstantColorValue( patColorToGR(enable?(getGetIntKeyValue("\\SOFTWARE\\H3D\\TBMODE")==1?enableColor[line]:enableColor2[line]):disableColor[line],format) ); - drawlinefb(&lineLeft, &lineRight); - lineLeft.y = ++lineRight.y; - - grConstantColorValue( 0 ); - drawlinefb(&lineLeft, &lineRight); - lineLeft.y = ++lineRight.y; - } - - // wait for adapter sync-up -#if ( GLIDE_PLATFORM & GLIDE_HW_SST1 ) - for(line = 40; line>0; line--) { -#elif ( GLIDE_PLATFORM & GLIDE_HW_SST96 ) - for(line = 20; line>0; line--) { -#endif - grBufferSwap(1); - } - -#if ( GLIDE_PLATFORM & GLIDE_HW_SST96 ) - if (!enable) { - // grSstIdle(); - initAT3DSetTiles(0,gc->state.num_buffers); - } // setup regs for non-pageflipping -#endif - - line = 50000; - while ((grBufferNumPending() > 2) && (--line)); - - grGlideSetState(&state); // restore app. state - - // restore -#if (GLIDE_PLATFORM & GLIDE_HW_SST1) - if (GR_RESOLUTION_IS_AUTOFLIPPED(gc->grSstRez)) { - if (enable==1) { - switch (gc->grSstRez) { - case GR_RESOLUTION_640x240_AUTOFLIPPED: - gc->state.screen_height = 502; - break; - case GR_RESOLUTION_800x300_AUTOFLIPPED: - gc->state.screen_height = 620; - break; - } - } else { - switch (gc->grSstRez) { - case GR_RESOLUTION_640x240_AUTOFLIPPED: - gc->state.screen_height = 480; - case GR_RESOLUTION_800x300_AUTOFLIPPED: - gc->state.screen_height = 600; - } - } - grClipWindow(0,0,grSstScreenWidth(),grSstScreenHeight()); - } -#endif -} - -#endif - -/*------------------------------------------------------------------- - Function: grSstWinOpen - Date: 3/16 - Implementor(s): dow, gmt, murali, jdt - Library: Glide - Description: - - Initialize the selected SST - - Initialization has 4 Steps - - Video Init - - In the full screen case this includes setting the requested - resolution/refresh state and allocating any necessary OS - resource for the GC. - - In the windowed case, this involves acquiring all necessary - surfaces for rendering, back buffer and memory fifo - - Also perform any work necessary to enable access to 3D - registers - - Command Transport Init: - Assuming video registers are in a reset state, initialize - the appropriate command transport mechanism. All writes - to hardware prior to this action are direct writes, - afterwards, most commands will go throught the command - transport - - GC Init - - Initialize the current GC based on the user requested - open parameters and command transport data reported - during initialization. - - 3D State Init - - Push an initial state onto all of the 3D state registers. - - Arguments: - hwnd - pointer to a window handle or null. If NULL, then - the application window handle will be inferred though - the GetActiveWindow() api. - resolution - either one of the pre-defined glide resolutions, - or GR_RESOLUTION_NONE, in which case the window - size is inferred from the size application window - refresh - requested fullscreen refresh rate, ignored in a window - format - requested ccolor format for glide packed color values - origin - location of coordinate origin either upper left or - lower right - nColBuffers - number of color buffers to attempt to allocate - 0 - meaningless - 1 - allocate a front buffer only - 2 - allocate a front and back buffer - 3 - allocate a front, back, aux buffer for tripple buffering - nAuxBuffers - number of aux buffers to attempt to allocate - 0 - no alpha or z buffers - 1 - allocate one aux buffer for alpha/depth buffering - 2 - allocate on depth and one alpha buffer ( unsup ) - Return: - FXTRUE - glide successfully acquired the necessary resources and a - is ready for rendering - FXFALSE - glide was unsuccessful in getting the necessary resources, - or the requested configuration is unavailble on the host - hardware - any calls to glide rendering routines will result - in undefined behavior. - -------------------------------------------------------------------*/ -GR_ENTRY(grSstWinOpen, FxBool, ( - FxU32 hWnd, - GrScreenResolution_t resolution, - GrScreenRefresh_t refresh, - GrColorFormat_t format, - GrOriginLocation_t origin, - int nColBuffers, - int nAuxBuffers)) -{ - FxBool rv = FXTRUE; - int tmu; - InitFIFOData fifoInfo; - int xres, yres, fbStride; -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) - FARPROC - oemInitMapBoard = NULL, - oemInitSetVideo = NULL, - oemInitVideoTiming = NULL; - OemInitInfo oemi; - sst1VideoTimingStruct *sstVideoRez = NULL, tvVidtiming; - FxBool oemvidtiming = FXFALSE; - FxU32 tvVidtiming_refreshRate = refresh; -#endif /* (GLIDE_PLATFORM & GLIDE_OS_WIN32) */ - - GR_BEGIN_NOFIFOCHECK("grSstWinOpen",80); - GDBG_INFO_MORE((gc->myLevel, - "(rez=%d,ref=%d,cformat=%d,origin=%s,#bufs=%d, #abufs=%d)\n", - resolution,refresh,format, - origin ? "LL" : "UL", - nColBuffers, nAuxBuffers)); - GR_CHECK_F("grSstWinOpen", !gc, "no SST selected as current (gc==NULL)"); - -#if (GLIDE_PLATFORM & GLIDE_HW_SST1) - /* The current init code does not do triple buffering, and we would - * have the same bug as v2 for lfb reads when triple buffering if - * we added this back. - */ - rv = (nColBuffers < 3); - if (!rv) { - GDBG_INFO(( gc->myLevel, - "grSstWinOpen failed because sst1 cannot really triple buffer\n")); - goto BAILOUT; - } -#endif /* (GLIDE_PLATFORM & GLIDE_HW_SST1) */ - - if (!_GlideRoot.environment.ignoreReopen) - GR_CHECK_F("grSstWinOpen", gc->open, "gc opened twice!" ); - - /* If we've been closed via grSstWinClose then we need to re-init - * the hw registers etc before init-ing video etc or bad ju-ju is - * in our future. - */ - if (gc->closedP) { - gc->closedP = FXFALSE; - if (!(pciOpen() && - (initMapBoard(_GlideRoot.current_sst) != NULL))) return FXFALSE; - } - -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) && (!defined(GLIDE_DEBUG) || (GLIDE_DEBUG == 0)) - /* - ** load fxoem2x.dll and map board - */ - oemi.version = OEMINIT_VERSION; - oemi.vendorID = sst1BoardInfo[_GlideRoot.current_sst].vendorID; - oemi.deviceID = sst1BoardInfo[_GlideRoot.current_sst].deviceID; - oemi.boardID = OEMINIT_INVALID_BOARD_ID; - oemi.subvendorID = OEMINIT_INVALID_BOARD_ID; - oemi.linearAddress = gc->base_ptr; - oemi.slaveAddress = NULL; - if (gc->oemInit = LoadLibrary("fxoem2x.dll")) { - if (oemInitMapBoard = GetProcAddress(gc->oemInit, "_fxoemInitMapBoard@4")) { - oemInitMapBoard(&oemi); - } - } -#if defined(FX_OEM_BUILD) && !defined(FX_STATIC_BUILD) - else { - GrErrorCallback("Missing fxoem2x.dll", FXTRUE); - grSstWinClose(); - exit(0); - } -#endif /* FX_STATIC_BUILD */ -#endif /* (GLIDE_PLATFORM & GLIDE_OS_WIN32) && (!defined(GLIDE_DEBUG) || (GLIDE_DEBUG == 0)) */ - - /*------------------------------------------------------ - Validate and Parse Arguments - ------------------------------------------------------*/ - /* - FIXME!! jdt - - There needs to be one large table of resolutions vs. - nColBuffers vs. nAuxBuffers that specifies required - ram and vald/invalid configurations - */ -#define SLI_DETECT _GlideRoot.hwConfig.SSTs[_GlideRoot.current_sst].sstBoard.VoodooConfig.sliDetect - - if ((!SLI_DETECT) && - ((gc->fbuf_size <= 2 && - resolution == GR_RESOLUTION_800x600 && - (nColBuffers+nAuxBuffers) >= 3 ) || - (gc->fbuf_size <= 2 && - resolution == GR_RESOLUTION_856x480 && - (nColBuffers+nAuxBuffers) >= 3 ) || - (gc->fbuf_size <= 2 && - resolution == GR_RESOLUTION_960x720 ) )) - { - GDBG_INFO(( gc->myLevel, "grSstWinOpen failed " - "for illegal screen resolution or " - "insufficient memory\n" )); - rv = FXFALSE; - goto BAILOUT; - } - -#ifdef H3D - if (!GR_RESOLUTION_IS_AUTOFLIPPED(resolution)) { -#endif - if ((resolution < GR_RESOLUTION_MIN) || - ((resolution > GR_RESOLUTION_MAX) && - (resolution != GR_RESOLUTION_NONE )) ) { - GDBG_INFO(( gc->myLevel, "grSstWinOpen failed " - "for illegal screen resolution\n" )); - rv = FXFALSE; - goto BAILOUT; - } -#ifdef H3D - } else { // is autoflipped resolution - if ((resolution < GR_RESOLUTION_AUTOFLIPPED_MIN) || - (resolution > GR_RESOLUTION_AUTOFLIPPED_MAX) ) { - GDBG_INFO(( gc->myLevel, "grSstWinOpen failed " - "for illegal autoflipped screen resolution\n" )); - rv = FXFALSE; - goto BAILOUT; - } - } -#endif - -#if ( 1 ) - /*------------------------------------------------------ - Video Init - ------------------------------------------------------*/ -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) - /* - ** initialize video timing data for oemdll - ** if tv out component exist, the oem dll need to modify the vidtiming - ** data in oemi. Glide will take the changes and pass it to - ** sst1InitVideoBuffers() - */ - { - if((sstVideoRez = sst1InitFindVideoTimingStruct(resolution,refresh))) { - tvVidtiming = *sstVideoRez; - oemi.vid.res = resolution; - oemi.vid.refresh = refresh; - oemi.vid.depth = 16; - oemi.vid.hSyncOn = tvVidtiming.hSyncOn; - oemi.vid.hSyncOff = tvVidtiming.hSyncOff; - oemi.vid.vSyncOn = tvVidtiming.vSyncOn; - oemi.vid.vSyncOff = tvVidtiming.vSyncOff; - oemi.vid.hBackPorch = tvVidtiming.hBackPorch; - oemi.vid.vBackPorch = tvVidtiming.vBackPorch; - oemi.vid.xDimension = tvVidtiming.xDimension; - oemi.vid.yDimension = tvVidtiming.yDimension; - oemi.vid.clkFreq16bpp = tvVidtiming.clkFreq16bpp; - oemi.vid.clkFreq24bpp = tvVidtiming.clkFreq24bpp; - - if (gc->oemInit) { - if ((oemInitVideoTiming = GetProcAddress(gc->oemInit, "_fxoemInitVideoTiming@4")) && - (oemInitMapBoard)) - oemvidtiming = oemInitVideoTiming(&oemi); - /* - ** video timing is updated by oem dll - */ - if (oemvidtiming) { - tvVidtiming.hSyncOn = oemi.vid.hSyncOn; - tvVidtiming.hSyncOff = oemi.vid.hSyncOff; - tvVidtiming.vSyncOn = oemi.vid.vSyncOn; - tvVidtiming.vSyncOff = oemi.vid.vSyncOff; - tvVidtiming.hBackPorch = oemi.vid.hBackPorch; - tvVidtiming.vBackPorch = oemi.vid.vBackPorch; - tvVidtiming.xDimension = oemi.vid.xDimension; - tvVidtiming.yDimension = oemi.vid.yDimension; - tvVidtiming.clkFreq16bpp = oemi.vid.clkFreq16bpp; - tvVidtiming.clkFreq24bpp = oemi.vid.clkFreq24bpp; - } - } - } - } -#endif - GDBG_INFO((gc->myLevel, " Video Init\n" )); -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) - if (oemvidtiming) - rv = initSetVideo( hWnd, resolution, - oemi.vid.refresh, format, origin, - nColBuffers, nAuxBuffers, - &xres, &yres, &fbStride, &tvVidtiming ); - else -#endif - rv = initSetVideo( hWnd, resolution, - refresh, format, origin, - nColBuffers, nAuxBuffers, - &xres, &yres, &fbStride, _GlideRoot.GCs[_GlideRoot.current_sst].vidTimings ); - if ( !rv ) goto BAILOUT; - GDBG_INFO((gc->myLevel, - " Video init succeeded. xRes = %.04d, yRes = %.04d\n", - xres, yres )); - -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) - if (gc->oemInit) { - if ((oemInitSetVideo = GetProcAddress(gc->oemInit, "_fxoemInitSetVideo@4")) && - (oemInitMapBoard)) - oemInitSetVideo(&oemi); - } -#endif - - /*------------------------------------------------------ - Command Transport Init - ------------------------------------------------------*/ - GDBG_INFO((gc->myLevel, " Command Transport Init\n" )); - - /* Set up FifoInfo with CPU Type so that init code knows if it needs - to advance the write pointer beyond the read pointer for P6 */ - - fifoInfo.cpuType = _GlideRoot.CPUType; - - rv = initEnableTransport( &fifoInfo ); - if ( !rv ) goto BAILOUT; - - gc->nopCMD = FXFALSE; - -# if ( GLIDE_PLATFORM & GLIDE_HW_SST1 ) - grHints( GR_HINT_FIFOCHECKHINT, - fifoInfo.hwDep.vgFIFOData.memFifoStatusLwm + 0x100 ); - _grReCacheFifo( 0 ); -# elif ( GLIDE_PLATFORM & GLIDE_HW_SST96 ) - gc->hwDep.sst96Dep.writesSinceFence = 0; -#if (GLIDE_PLATFORM & GLIDE_OS_DOS32) && ( GLIDE_PLATFORM & GLIDE_HW_SST96 ) && defined(GLIDE_DEBUG) - /* Set int 10h interrupt handler */ - gc->hwDep.sst96Dep.int10Called = FXFALSE; - gc->hwDep.sst96Dep.prevInt10 = NULL; - GDBG_INFO((80, "Storing old int 10h interrupt handler (0x%x)\n", gc->hwDep.sst96Dep.prevInt10)); - - GDBG_INFO((80, "Overriding int 10h interrupt handler\n")); - _dos_setvect(0x10, _grInt10Handler); -#endif - - gc->fifoData = fifoInfo; - - GDBG_INFO((120, "After Init: fifoPtr = 0x%x\n", - fifoInfo.hwDep.vg96FIFOData.fifoPtr )); - GDBG_INFO((120, "After Init: fifoSize = 0x%x\n", - fifoInfo.hwDep.vg96FIFOData.fifoSize )); - GDBG_INFO((120, "After Init: fifoVirt = 0x%x\n", - fifoInfo.hwDep.vg96FIFOData.fifoVirt )); - GDBG_INFO((120, "After Init: fifoPhys = 0x%x\n", - fifoInfo.hwDep.vg96FIFOData.fifoPhys )); - GDBG_INFO((120, "After Init: fifoMax = 0x%x\n", - fifoInfo.hwDep.vg96FIFOData.fifoMax )); - GDBG_INFO((120, "After Init: fifoCur = 0x%x\n", - fifoInfo.hwDep.vg96FIFOData.fifoCur )); - GDBG_INFO((120, "After Init: fifoLfb = 0x%x\n", - fifoInfo.hwDep.vg96FIFOData.fifoLfb )); -# else -# error "Need to write command transport init for glide for this hw" -# endif - -#endif - - /*------------------------------------------------------ - GC Init - ------------------------------------------------------*/ - GDBG_INFO((gc->myLevel, " GC Init\n" )); - gc->state.screen_width = xres; - gc->state.screen_height = yres; - gc->state.num_buffers = nColBuffers; - gc->state.color_format = format; - gc->grSstRez = resolution; - gc->grSstRefresh = refresh; - - gc->lockPtrs[GR_LFB_READ_ONLY] = (FxU32)-1; - gc->lockPtrs[GR_LFB_WRITE_ONLY] = (FxU32)-1; - gc->lfbSliOk = 0; - gc->fbStride = fbStride; - - /* Initialize the read/write registers to all 0 */ - gc->state.fbi_config.fbzColorPath = 0; - gc->state.fbi_config.fogMode = 0; - gc->state.fbi_config.alphaMode = 0; - gc->state.fbi_config.fbzMode = 0; - gc->state.fbi_config.lfbMode = 0; - gc->state.fbi_config.clipLeftRight = 0; - gc->state.fbi_config.clipBottomTop = 0; - gc->state.fbi_config.fogColor = 0; - gc->state.fbi_config.zaColor = 0; - gc->state.fbi_config.chromaKey = 0; - gc->state.fbi_config.stipple = 0; - gc->state.fbi_config.color0 = 0; - gc->state.fbi_config.color1 = 0; - for (tmu = 0; tmu < gc->num_tmu; tmu += 1) - { - FxU32 textureMode = (FxU32)SST_SEQ_8_DOWNLD; - if ( (_GlideRoot.hwConfig.SSTs[_GlideRoot.current_sst].type == - GR_SSTTYPE_VOODOO ) && - (_GlideRoot.hwConfig.SSTs[_GlideRoot.current_sst].sstBoard.VoodooConfig.tmuConfig[tmu].tmuRev == - 0 ) ) - { - textureMode = 0; - } - gc->state.tmu_config[tmu].textureMode = textureMode; - gc->state.tmu_config[tmu].tLOD = 0x00000000; - gc->state.tmu_config[tmu].tDetail = 0x00000000; - gc->state.tmu_config[tmu].texBaseAddr = 0x00000000; - gc->state.tmu_config[tmu].texBaseAddr_1 = 0x00000000; - gc->state.tmu_config[tmu].texBaseAddr_2 = 0x00000000; - gc->state.tmu_config[tmu].texBaseAddr_3_8 = 0x00000000; - gc->state.tmu_config[tmu].mmMode = GR_MIPMAP_NEAREST; - gc->state.tmu_config[tmu].smallLod = GR_LOD_1; - gc->state.tmu_config[tmu].largeLod = GR_LOD_1; - gc->state.tmu_config[tmu].evenOdd = GR_MIPMAPLEVELMASK_BOTH; - gc->state.tmu_config[tmu].nccTable = GR_NCCTABLE_NCC0; - } - - /*------------------------------------------------------ - 3D State Init - ------------------------------------------------------*/ - GDBG_INFO((gc->myLevel, " 3D State Init\n" )); - gc->state.fbi_config.fbzMode = - SST_ENRECTCLIP | - SST_ENZBIAS | - SST_DRAWBUFFER_BACK; - - grHints(GR_HINT_ALLOW_MIPMAP_DITHER, 0); - grSstOrigin( origin ); - grAlphaBlendFunction( GR_BLEND_ONE , GR_BLEND_ZERO, - GR_BLEND_ONE, GR_BLEND_ZERO ); - grAlphaTestFunction( GR_CMP_ALWAYS ); - grAlphaTestReferenceValue( 0 ); - grChromakeyMode( GR_CHROMAKEY_DISABLE ); - grConstantColorValue( ( FxU32 ) ~0 ); - grClipWindow( 0, 0, gc->state.screen_width, - gc->state.screen_height ); - _grColorCombineDelta0Mode( FXFALSE ); - grColorCombine(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_ITERATED, - FXFALSE); - grAlphaCombine(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_CONSTANT, - FXFALSE); - grColorMask( FXTRUE, FXFALSE ); - grCullMode( GR_CULL_DISABLE ); - grDepthBiasLevel( 0 ); - grDepthMask( FXFALSE ); - grDepthBufferMode( GR_DEPTHBUFFER_DISABLE ); - grDepthBufferFunction( GR_CMP_LESS ); - grDepthBiasLevel( 0 ); - grDitherMode( GR_DITHER_4x4 ); - grFogMode( GR_FOG_DISABLE ); - grFogColorValue( 0x00000000 ); - grGammaCorrectionValue( 1.7f ); - guTexMemReset(); - switch (gc->num_tmu) { - case 3: - grTexClampMode( GR_TMU2, GR_TEXTURECLAMP_CLAMP, GR_TEXTURECLAMP_CLAMP ); - grTexDetailControl( GR_TMU2, 0, 1, 1.0F ); - grTexFilterMode( GR_TMU2, GR_TEXTUREFILTER_POINT_SAMPLED, - GR_TEXTUREFILTER_POINT_SAMPLED ); - grTexLodBiasValue( GR_TMU2, 0.0F); - grTexMipMapMode( GR_TMU2, GR_MIPMAP_DISABLE, FXFALSE ); - grTexCombineFunction( GR_TMU2, GR_TEXTURECOMBINE_ZERO ); - grTexCombine( GR_TMU2, GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - case 2: - grTexClampMode( GR_TMU1, GR_TEXTURECLAMP_CLAMP, GR_TEXTURECLAMP_CLAMP ); - grTexDetailControl( GR_TMU1, 0, 1, 1.0F ); - grTexFilterMode( GR_TMU1, GR_TEXTUREFILTER_POINT_SAMPLED, - GR_TEXTUREFILTER_POINT_SAMPLED ); - grTexLodBiasValue( GR_TMU1, 0.0F); - grTexMipMapMode( GR_TMU1, GR_MIPMAP_DISABLE, FXFALSE ); - grTexCombine( GR_TMU1, GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - case 1: - grTexClampMode( GR_TMU0, GR_TEXTURECLAMP_CLAMP, GR_TEXTURECLAMP_CLAMP ); - grTexDetailControl( GR_TMU0, 0, 1, 1.0F ); - grTexFilterMode( GR_TMU0, GR_TEXTUREFILTER_POINT_SAMPLED, - GR_TEXTUREFILTER_POINT_SAMPLED ); - grTexLodBiasValue( GR_TMU0, 0.0F); - grTexMipMapMode( GR_TMU0, GR_MIPMAP_DISABLE, FXFALSE ); - grTexCombine( GR_TMU0, GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - } - grLfbConstantAlpha( 0xFF ); - grLfbConstantDepth( 0 ); - - gc->open = FXTRUE; - _GlideRoot.windowsInit = FXTRUE; /* to avoid race with grSstControl() */ - -#ifdef H3D - if (GR_RESOLUTION_IS_AUTOFLIPPED(resolution)) { - setAutoflip(1); - } else -#endif - - { - GrState - state; - - grGlideGetState(&state); - -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) - - grSstOrigin( GR_ORIGIN_LOWER_LEFT ); - - if (!_GlideRoot.environment.noSplash) { - HMODULE newSplash; - - if (newSplash = LoadLibrary("3dfxsplash2.dll")) { - FARPROC fxSplash; - - if (fxSplash = GetProcAddress(newSplash, "_fxSplash@16")) { - fxSplash(hWnd, gc->state.screen_width, - gc->state.screen_height, nAuxBuffers); - _GlideRoot.environment.noSplash = 1; - } - } - } -#endif /* (GLIDE_PLATFORM & GLIDE_OS_WIN32) */ - - /* If it's still 0, then do the old one */ - if (!_GlideRoot.environment.noSplash) { - grSplash(0.0f, 0.0f, - (float) gc->state.screen_width, - (float) gc->state.screen_height, - 0); - _GlideRoot.environment.noSplash = 1; - } - grGlideSetState(&state); - } - - BAILOUT: - GR_RETURN( rv ); -} /* grSstWinOpen */ - -/*------------------------------------------------------------------- - Function: grSstWinClose - Date: 3/16 - Implementor(s): jdt - Library: Glide - Description: - Shut down the selected SST - - Shutdown has 4 steps - - 3D Idle - the 3D engine must be idled to make sure that there are no - commands executing in the transport when the registers are - reset - - GC Reset - the GC is flagged as unitialized - ( nosup ) - - Command Transport Disable - the command transport to the 3D device is put in a state - of reset. No further commands may be issued throught the - command transport - - Video Restore - video is restored to its pre-open state. - - Arguments: - none - Return: - none - -------------------------------------------------------------------*/ -GR_ENTRY( grSstWinClose, void, ( void ) ) -{ -#define FN_NAME "grSstWinClose" - GR_BEGIN_NOFIFOCHECK("grSstWinClose",80); - GDBG_INFO_MORE((gc->myLevel,"()\n")); - - if ( (gc != NULL) && gc->open ) { -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) - FARPROC oemRestoreVideo = NULL; -#endif - /*-------------------------- - 3D Idle - --------------------------*/ - GDBG_INFO(( gc->myLevel, " 3D Idle\n" )); - initIdle(); - - /*-------------------------- - GC Reset - --------------------------*/ - GDBG_INFO(( gc->myLevel, " GC Reset\n" )); - gc->open = FXFALSE; - gc->closedP = FXTRUE; - - /*-------------------------- - Command Transport Disable - --------------------------*/ - GDBG_INFO(( gc->myLevel, " Command Transport Disable\n" )); - initDisableTransport(); - -#if (GLIDE_PLATFORM & GLIDE_OS_DOS32) && (GLIDE_PLATFORM & GLIDE_HW_SST96) && defined(GLIDE_DEBUG) - GDBG_INFO((80, "Restoring int 10h interrupt handler (0x%x)\n", gc->hwDep.sst96Dep.prevInt10)); - _dos_setvect(0x10, NULL); -#endif - - /*-------------------------- - Video Restore - --------------------------*/ - GDBG_INFO(( gc->myLevel, " Restore Video\n" )); - initRestoreVideo(); -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) - if (gc->oemInit) { - if (oemRestoreVideo = GetProcAddress(gc->oemInit, "_fxoemRestoreVideo@0")) - oemRestoreVideo(); - FreeLibrary(gc->oemInit); - } -#endif - } - - GR_END(); -#undef FN_NAME -} /* grSstWinClose */ - -GR_ENTRY(grSstControl, FxBool, ( GrControl_t code )) -{ -#define FN_NAME "grSstControl" - - GR_DCL_GC; - GDBG_INFO((41, "%s: code = 0x%x, windowsInit = %d\n", FN_NAME, - code, _GlideRoot.windowsInit)); - - if (_GlideRoot.windowsInit) { -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) - /* For VG96, windows haven't been created, so there's no point - * trying to control it. - */ - /* Believe it or not, the following code really should be bracketed - like this. The reason is that GR_BEGIN_NOFIFOCHECK seg faults - when grSstControl is called before the Glide window is truly - initialized. This is a real concern, as grSstControl is called - from event loops, which are asynchronous. - */ - FxU32 - status, - xRes, yRes, - clipLeftRight, clipBottomTop; - FxU32 nTries; - - GR_BEGIN_NOFIFOCHECK(FN_NAME,80); - - /* We're either cleaning up or closed so forget about this one. */ - if (gc->closedP) goto __done; - xRes = initControl(code); -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) - { - FARPROC oemControl = NULL; - if (gc->oemInit) { - if ((oemControl = GetProcAddress(gc->oemInit, "_fxoemControl@4"))) - oemControl(code); - } - } -#endif - - GDBG_INFO((80, "%s: initControl returned 0x%x\n", FN_NAME, xRes)); - - if (!xRes) return FXFALSE; - - yRes = xRes >> 16; - xRes = xRes & 0xffff; - - /* !! FIXME +++ this call should properly update the gc->fbStride, - this information is known only to the init layer and needs to be - exposed, it is only really necessary to lfblock right now, - and therefore is returned by initGetBufferPtr */ - - gc->state.screen_width = xRes; - gc->state.screen_height = yRes; - - /* Wait for Idle. */ - - nTries = 0; - do { - if (nTries++ > 999) { - GDBG_INFO((80, "%s: returning FALSE after %d checks for idle\n", - FN_NAME, nTries)); - return FXFALSE; - } - - status = GET(hw->status); - - } while (status & 0x1); - - /* Set ClipRect Via direct writes */ - _grClipNormalizeAndGenerateRegValues(0, 0, xRes, yRes, - &clipLeftRight, - &clipBottomTop); - SET_DIRECT(clipLeftRight1, clipLeftRight); - SET_DIRECT(clipBottomTop1, clipBottomTop); - - __done: - /* Do Nothing */; -#elif (GLIDE_PLATFORM&GLIDE_HW_SST1) - FxBool ctrlflag; - ctrlflag = initControl(code); -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) - { - FARPROC oemControl = NULL; - if (gc->oemInit) { - if ((oemControl = GetProcAddress(gc->oemInit, "_fxoemControl@4"))) - oemControl(code); - } - } -#endif - return ctrlflag; -#endif - - } - GDBG_INFO((41, "%s: Returning TRUE\n", FN_NAME)); - return FXTRUE; - -} /* grSstControl */ - -/*--------------------------------------------------------------------------- -** grSstPerfStats -*/ - -GR_ENTRY(grSstPerfStats, void, (GrSstPerfStats_t *pStats)) -{ -#if ( GLIDE_PLATFORM & GLIDE_HW_SST96 ) - FxU32 jr; -#endif - - GR_BEGIN_NOFIFOCHECK("grSstPerfStats",83); - GDBG_INFO_MORE((gc->myLevel,"(0x%x)\n",pStats)); - GR_CHECK_F(myName, !pStats, "NULL pointer"); - -#if ( GLIDE_PLATFORM & GLIDE_HW_SST96 ) -/* - * fixme! this is a fix for bug 697. The right thing to do is - * define GR_GET properly in fxglide.h, but this breaks lots of other - * things, and this is the only place in glide where we actually read - * sst-1 registers, and this pools is mature, so... Also, note that - * these reads are not synchronized with the FIFO, so results are - * approximate. I'm not going to change this behavior for fear of - * introducing performance degradation in existing apps that may - * be instrumented with this call. The read of jr is a sanity check. - */ -#undef GETINDEX -#undef GETREADADDR -#undef GR_GET -#define GR_GET(s) *(GETREADADDR(s)) -#define GETINDEX(a) ((((FxU32) &a) - (((FxU32) hw) + 0x400000)) >> 2) -#define GETREADADDR(s) ((FxU32 *) (((FxU32) hw) + (GETINDEX(s) <<12))) - jr = GR_GET(hw->fbijrVersion); -#endif /* SST96 */ - pStats->pixelsIn = GR_GET(hw->stats.fbiPixelsIn); - pStats->chromaFail = GR_GET(hw->stats.fbiChromaFail); - pStats->zFuncFail = GR_GET(hw->stats.fbiZfuncFail); - pStats->aFuncFail = GR_GET(hw->stats.fbiAfuncFail); - pStats->pixelsOut = GR_GET(hw->stats.fbiPixelsOut); - -#if ( GLIDE_PLATFORM & GLIDE_HW_SST1 ) - if (gc->scanline_interleaved == FXTRUE) { - sst1InitSliPciOwner(gc->base_ptr, SST_SLI_SLAVE_OWNPCI); - - pStats->pixelsIn += GR_GET(hw->stats.fbiPixelsIn); - pStats->chromaFail += GR_GET(hw->stats.fbiChromaFail); - pStats->zFuncFail += GR_GET(hw->stats.fbiZfuncFail); - pStats->aFuncFail += GR_GET(hw->stats.fbiAfuncFail); - pStats->pixelsOut += GR_GET(hw->stats.fbiPixelsOut); - - sst1InitSliPciOwner(gc->base_ptr, SST_SLI_MASTER_OWNPCI); - } -#endif - - GR_END(); -} /* grSstPerfStats */ - -/*--------------------------------------------------------------------------- -** grStatsResetPerfStats -*/ - -GR_ENTRY(grSstResetPerfStats, void, (void)) -{ - GR_BEGIN("grSstResetPerfStats",83,4); - GDBG_INFO_MORE((gc->myLevel,"()\n")); - P6FENCE_CMD( GR_SET(hw->nopCMD,1) ); - GR_END(); -} /* grSstResetPerfStats */ - - -/*--------------------------------------------------------------------------- -** grSstStatus - return contents of status register -*/ - -GR_ENTRY(grSstStatus, FxU32, (void)) -{ - FxU32 stat; - - GR_BEGIN_NOFIFOCHECK( "grSstStatus", 85 ); - -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) - P6_NUDGE_OF_LOVE; -#endif - - stat = initStatus(); - GDBG_INFO((84,"grSstStatus() => 0x%x\n", stat)); - GR_END(); - - return stat; -}/* grSstStatus */ - -/*--------------------------------------------------------------------------- -** grSstVideoLine - return current video line number -*/ - -GR_ENTRY(grSstVideoLine, FxU32, (void)) -{ - FxU32 vline = 1; -#if ( GLIDE_PLATFORM & GLIDE_HW_SST1 ) - GR_DCL_GC; - GR_DCL_HW; - - vline = GR_GET(hw->vRetrace); - GDBG_INFO((84,"grSstVideoLine() => 0x%x (%d)\n",vline,vline)); -#endif - return vline; - -}/* grSstVideoLine */ - -/*--------------------------------------------------------------------------- -** grSstVRetrace - return contents of SST_VRETRACE bit of status register; -*/ - -GR_ENTRY(grSstVRetraceOn, FxBool, (void)) -{ - if (grSstStatus() & SST_VRETRACE) - return FXFALSE; - else - return FXTRUE; -}/* grSstVRetrace */ - -/*--------------------------------------------------------------------------- -** grSstIsBusy - find out if the SST is busy or not -*/ - -GR_ENTRY(grSstIsBusy, FxBool, (void)) -{ - FxBool busy; - GR_BEGIN_NOFIFOCHECK( "grSstIsBusy", 85 ); - - if (gc->nopCMD == FXFALSE) { - GR_SET_EXPECTED_SIZE(sizeof(FxU32)); - P6FENCE_CMD( GR_SET(hw->nopCMD,1) ); - gc->nopCMD = FXTRUE; - } - if ((busy = initBusy()) == FXFALSE) - gc->nopCMD = FXFALSE; - - GDBG_INFO((84,"grSstIsBusy() => 0x%x\n",busy)); - - GR_RETURN( busy ); - -}/* grSstIsBusy */ - -/*--------------------------------------------------------------------------- -** grGammaCorrectionValue - set the gamma correction value -*/ - -GR_ENTRY(grGammaCorrectionValue, void, (float gam)) -{ - GR_BEGIN_NOFIFOCHECK("grGammaCorrectionValue",80); - GDBG_INFO_MORE((gc->myLevel,"(%g)\n",gam)); - initGamma( gam ); - GR_END(); -} /* grGammaCorrectionValue */ - - -/*--------------------------------------------------------------------------- -** grSstIdle -*/ - -GR_ENTRY(grSstIdle, void, (void)) -{ - GR_BEGIN_NOFIFOCHECK("grSstIdle",83); - GDBG_INFO_MORE((gc->myLevel,"()\n")); - -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) - P6_NUDGE_OF_LOVE; -#endif - - initIdle(); - - GR_END_SLOPPY(); -} /* grSstIdle */ - - -/*--------------------------------------------------------------------------- -** grSstOrigin - Set the orgin orientation of the screen. -** -** Returns: -** -** Notes: -** -*/ - -GR_ENTRY(grSstOrigin, void, (GrOriginLocation_t origin )) -{ - FxU32 fbzMode; - - GR_BEGIN_NOFIFOCHECK("grSstOrigin",83); - GDBG_INFO_MORE((gc->myLevel,"(%d)\n",origin)); - - /* Initialize FBZMODE register */ - fbzMode = gc->state.fbi_config.fbzMode; - if (origin == GR_ORIGIN_LOWER_LEFT) - fbzMode |= SST_YORIGIN; - else - fbzMode &= ~(SST_YORIGIN); - - initOrigin( origin ); - - GR_SET_EXPECTED_SIZE(sizeof(FxU32)); - { - GR_SET( hw->fbzMode, fbzMode ); - } - GR_CHECK_SIZE(); - - gc->state.fbi_config.fbzMode = fbzMode; - GR_END(); -} /* grSstOrigin */ - -/* GMT: do we really have users for this??? - CHD: No. - JDT: Huh? If you're talking about grSstOrigin, you're smoking crack. - if you are talking about SstConfigPipeline, it is evil and must - be destroyed. :) - */ - -#include "gsstdef.h" - -/*--------------------------------------------------------------------------- -** grSstConfigPipeline -*/ - -GR_ENTRY(grSstConfigPipeline, void, (GrChipID_t chip, GrSstRegister reg, FxU32 value)) -{ - GR_BEGIN("grSstConfigPipeline",83,4); - GDBG_INFO_MORE((gc->myLevel,"(%d,0x%x,0x%x)\n",chip,reg,value)); - PACKER_WORKAROUND; - - switch (chip) { - case GR_TMU0: - case GR_TMU1: - case GR_TMU2: - hw = SST_TMU(hw,chip); - /* FALL THRU */ - case GR_FBI: - GR_SET( ((FxU32 *)hw)[reg], value ); - break; -#ifdef GLIDE_DEBUG - default: - { - char outString[256]; - - sprintf(outString, "grSstConfigPipeline: invalid chip ID specified (%d)\n", chip); - GrErrorCallback(outString, FXTRUE); - } -#endif - break; - } - PACKER_WORKAROUND; - GR_END(); -} /* grSstConfigPipeline */ diff --git a/glide2x/sst1/glide/src/gsstdef.h b/glide2x/sst1/glide/src/gsstdef.h deleted file mode 100644 index 065d9ae..0000000 --- a/glide2x/sst1/glide/src/gsstdef.h +++ /dev/null @@ -1,231 +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$ -** -*/ -#ifndef __GSSTDEF_H__ -#define __GSSTDEF_H__ - -#include - -/*----------------- 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__ */ \ No newline at end of file diff --git a/glide2x/sst1/glide/src/gtex.c b/glide2x/sst1/glide/src/gtex.c deleted file mode 100644 index 1a7cfea..0000000 --- a/glide2x/sst1/glide/src/gtex.c +++ /dev/null @@ -1,752 +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$ - * - * 12 3/04/97 9:08p Dow - * Neutered multiplatform multiheaded monster - * - * 11 3/03/97 10:58a Jdt - * Fixe for 2-pass trilinear - * - * 10 12/23/96 1:37p Dow - * chagnes for multiplatform glide -** -*/ - -#include <3dfx.h> - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -extern const int _grMipMapHostWH[GR_ASPECT_1x8+1][GR_LOD_1+1][2]; -extern FxU32 _grMipMapHostSize[][16]; -extern FxU32 _gr_aspect_index_table[]; -extern FxU32 _gr_evenOdd_xlate_table[]; -extern FxU32 _gr_aspect_xlate_table[]; - -/*--------------------------------------------------------------------------- -** grTexClampMode -*/ - -GR_ENTRY(grTexClampMode, void, ( GrChipID_t tmu, GrTextureClampMode_t s_clamp_mode, GrTextureClampMode_t t_clamp_mode )) -{ - FxU32 texturemode; - FxU32 clampMode = ( - (s_clamp_mode == GR_TEXTURECLAMP_CLAMP ? SST_TCLAMPS : 0) | - (t_clamp_mode == GR_TEXTURECLAMP_CLAMP ? SST_TCLAMPT : 0) - ); - - GR_BEGIN("grTexClampMode",88,4+2*PACKER_WORKAROUND_SIZE); - GDBG_INFO_MORE((gc->myLevel,"(%d, %d,%d)\n",tmu,s_clamp_mode,t_clamp_mode)); - GR_CHECK_TMU(myName, tmu); - - texturemode = gc->state.tmu_config[tmu].textureMode; - texturemode &= ~( SST_TCLAMPS | SST_TCLAMPT ); - texturemode |= clampMode; - - PACKER_WORKAROUND; - GR_SET( SST_TMU(hw,tmu)->textureMode , texturemode ); - PACKER_WORKAROUND; - - gc->state.tmu_config[tmu].textureMode = texturemode; - GR_END(); -} /* grTexClampMode */ - -/*--------------------------------------------------------------------------- -** grTexCombine -*/ - -GR_ENTRY(grTexCombine, void, ( GrChipID_t tmu, GrCombineFunction_t rgb_function, GrCombineFactor_t rgb_factor, GrCombineFunction_t alpha_function, GrCombineFactor_t alpha_factor, FxBool rgb_invert, FxBool alpha_invert )) -{ - FxU32 texturemode; - FxU32 tLod; - FxU32 tmuMask; - - GR_BEGIN("grTexCombine",88,8+2*PACKER_WORKAROUND_SIZE); - GDBG_INFO_MORE((gc->myLevel,"(%d, %d,%d, %d,%d, %d,%d)\n", - tmu, rgb_function, rgb_factor, - alpha_function, alpha_factor, - rgb_invert, alpha_invert)); - GR_CHECK_TMU( myName, tmu ); - GR_CHECK_W( myName, - rgb_function < GR_COMBINE_FUNCTION_ZERO || - rgb_function > GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA, - "unsupported texture color combine function" ); - GR_CHECK_W( myName, - alpha_function < GR_COMBINE_FUNCTION_ZERO || - alpha_function > GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA, - "unsupported texture alpha combine function" ); - GR_CHECK_W( myName, - (rgb_factor & 0x7) < GR_COMBINE_FACTOR_ZERO || - (rgb_factor & 0x7) > GR_COMBINE_FACTOR_LOD_FRACTION || - rgb_factor > GR_COMBINE_FACTOR_ONE_MINUS_LOD_FRACTION, - "unsupported texture color combine scale factor" ); - GR_CHECK_W( myName, - (alpha_factor & 0x7) < GR_COMBINE_FACTOR_ZERO || - (alpha_factor & 0x7) > GR_COMBINE_FACTOR_LOD_FRACTION || - alpha_factor > GR_COMBINE_FACTOR_ONE_MINUS_LOD_FRACTION, - "unsupported texture alpha combine scale factor" ); - - /* tmuMask tells grColorCombineFunction what to turn off an on if - the ccFunc requires texture mapping */ - texturemode = gc->state.tmu_config[tmu].textureMode; - texturemode &= ~(SST_TCOMBINE | SST_TACOMBINE); - tLod = gc->state.tmu_config[tmu].tLOD; - tLod &= ~(SST_LOD_ODD); - - tmuMask = GR_TMUMASK_TMU0 << tmu; - gc->state.tmuMask &= ~tmuMask; - - /* setup scale factor bits */ - texturemode |= ( rgb_factor & 0x7 ) << SST_TC_MSELECT_SHIFT; - - if ( !( rgb_factor & 0x8 ) ) - texturemode |= SST_TC_REVERSE_BLEND; - - if ( ( ( rgb_factor & 0x7 ) == GR_COMBINE_FACTOR_LOCAL ) || - ( ( rgb_factor & 0x7 ) == GR_COMBINE_FACTOR_LOCAL_ALPHA ) ) - gc->state.tmuMask |= tmuMask; - - texturemode |= ( alpha_factor & 0x7 ) << SST_TCA_MSELECT_SHIFT; - - if ( !( alpha_factor & 0x8 ) ) - texturemode |= SST_TCA_REVERSE_BLEND; - - if ( ( ( alpha_factor & 0x7 ) == GR_COMBINE_FACTOR_LOCAL ) || - ( ( alpha_factor & 0x7 ) == GR_COMBINE_FACTOR_LOCAL_ALPHA ) ) - gc->state.tmuMask |= tmuMask; - - /* setup invert output bits */ - - if ( rgb_invert ) - texturemode |= SST_TC_INVERT_OUTPUT; - - if ( alpha_invert ) - texturemode |= SST_TCA_INVERT_OUTPUT; - - /* setup core color combine unit bits */ - - switch ( rgb_function ) - { - case GR_COMBINE_FUNCTION_ZERO: - texturemode |= SST_TC_ZERO_OTHER; - break; - - case GR_COMBINE_FUNCTION_LOCAL: - texturemode |= SST_TC_ZERO_OTHER | SST_TC_ADD_CLOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_LOCAL_ALPHA: - texturemode |= SST_TC_ZERO_OTHER | SST_TC_ADD_ALOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER: - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL: - texturemode |= SST_TC_ADD_CLOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA: - texturemode |= SST_TC_ADD_ALOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL: - texturemode |= SST_TC_SUB_CLOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL: - texturemode |= SST_TC_SUB_CLOCAL | SST_TC_ADD_CLOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL_ALPHA: - texturemode |= SST_TC_SUB_CLOCAL | SST_TC_ADD_ALOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL: - texturemode |= SST_TC_ZERO_OTHER | SST_TC_SUB_CLOCAL | SST_TC_ADD_CLOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA: - texturemode |= SST_TC_ZERO_OTHER | SST_TC_SUB_CLOCAL | SST_TC_ADD_ALOCAL; - gc->state.tmuMask |= tmuMask; - break; - } - - switch ( alpha_function ) - { - case GR_COMBINE_FUNCTION_ZERO: - texturemode |= SST_TCA_ZERO_OTHER; - break; - - case GR_COMBINE_FUNCTION_LOCAL: - texturemode |= SST_TCA_ZERO_OTHER | SST_TCA_ADD_CLOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_LOCAL_ALPHA: - texturemode |= SST_TCA_ZERO_OTHER | SST_TCA_ADD_ALOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER: - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL: - texturemode |= SST_TCA_ADD_CLOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA: - texturemode |= SST_TCA_ADD_ALOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL: - texturemode |= SST_TCA_SUB_CLOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL: - texturemode |= SST_TCA_SUB_CLOCAL | SST_TCA_ADD_CLOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL_ALPHA: - texturemode |= SST_TCA_SUB_CLOCAL | SST_TCA_ADD_ALOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL: - texturemode |= SST_TCA_ZERO_OTHER | SST_TCA_SUB_CLOCAL | SST_TCA_ADD_CLOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA: - texturemode |= SST_TCA_ZERO_OTHER | SST_TCA_SUB_CLOCAL | SST_TCA_ADD_ALOCAL; - gc->state.tmuMask |= tmuMask; - break; - } - - /* Hack to enable TWO-PASS Trilinear - - */ - if ( texturemode & SST_TRILINEAR ) { - if ( ( texturemode & SST_TC_ZERO_OTHER ) && - ( texturemode & SST_TC_BLEND_LODFRAC ) && - !( texturemode & SST_TC_REVERSE_BLEND ) ) { - tLod |= SST_LOD_ODD; - } - } - tLod |= _gr_evenOdd_xlate_table[gc->state.tmu_config[tmu].evenOdd]; - - /* update register */ - PACKER_WORKAROUND; - GR_SET( SST_TMU(hw,tmu)->textureMode , texturemode ); - GR_SET( SST_TMU(hw,tmu)->tLOD, tLod ); - PACKER_WORKAROUND; - gc->state.tmu_config[tmu].textureMode = texturemode; - gc->state.tmu_config[tmu].tLOD = tLod; - - /* update paramIndex */ - _grUpdateParamIndex(); - - GR_END(); -} /* grTexCombine */ - -/* -** _grTexDetailControl, NOTE: its up to caller to account for bytes -*/ -GR_DDFUNC(_grTexDetailControl, void, ( GrChipID_t tmu, FxU32 detail )) -{ - GR_BEGIN("_grTexDetailControl",88,4+2*PACKER_WORKAROUND_SIZE); - - GR_CHECK_TMU( "_grTexDetailControl", tmu ); - - PACKER_WORKAROUND; - GR_SET( SST_TMU(hw,tmu)->tDetail , detail ); - PACKER_WORKAROUND; - gc->state.tmu_config[tmu].tDetail = detail; - GR_END(); -} /* _grTexDetailControl */ - -/*--------------------------------------------------------------------------- -** grTexFilterMode -*/ - -GR_ENTRY(grTexFilterMode, void, ( GrChipID_t tmu, GrTextureFilterMode_t minfilter, GrTextureFilterMode_t magfilter )) -{ - FxU32 texMode; - - GR_BEGIN("grTexFilterMode",99,4+2*PACKER_WORKAROUND_SIZE); - GDBG_INFO_MORE((gc->myLevel,"(%d,%d,%d)\n",tmu,minfilter,magfilter)); - GR_CHECK_TMU( myName, tmu ); - - texMode = gc->state.tmu_config[tmu].textureMode; - texMode &= ~( SST_TMINFILTER | SST_TMAGFILTER ); - texMode |= (minfilter == GR_TEXTUREFILTER_BILINEAR ? SST_TMINFILTER : 0) | - (magfilter == GR_TEXTUREFILTER_BILINEAR ? SST_TMAGFILTER : 0); - - PACKER_WORKAROUND; - GR_SET( SST_TMU(hw,tmu)->textureMode , texMode ); - PACKER_WORKAROUND; - gc->state.tmu_config[tmu].textureMode = texMode; - GR_END(); -} /* grTexFilterMode */ - -/*--------------------------------------------------------------------------- -** grTexLodBiasValue -*/ - -GR_ENTRY(grTexLodBiasValue, void, ( GrChipID_t tmu, float fvalue )) -{ - FxU32 tLod; - - GR_BEGIN("grTexLodBiasValue",88,4+2*PACKER_WORKAROUND_SIZE); - GDBG_INFO_MORE((gc->myLevel,"(%d,%g)\n",tmu,fvalue)); - GR_CHECK_TMU(myName,tmu); - - tLod = gc->state.tmu_config[tmu].tLOD; - tLod &= ~( SST_LODBIAS ); - tLod |= _grTexFloatLODToFixedLOD( fvalue ) << SST_LODBIAS_SHIFT; - - PACKER_WORKAROUND; - GR_SET( SST_TMU(hw,tmu)->tLOD , tLod ); - PACKER_WORKAROUND; - - gc->state.tmu_config[tmu].tLOD = tLod; - GR_END(); -} /* grTexLodBiasValue */ - -/*------------------------------------------------------------------- - Function: grTexMipMapMode - Date: 6/2 - Implementor(s): GaryMcT, Jdt - Library: glide - Description: - Sets the mip map mode for the specified TMU - "Ex" because glide's grTexMipMapMode is inadequate for - low level texture memory management - Arguments: - tmu - tmu to update - mmMode - mipmap mode - One of: - GR_MIPMAP_DISABLE - GR_MIPMAP_NEAREST - GR_MIPMAP_NEAREST_DITHER - lodBlend - enable lodBlending - FXTRUE - enabled - FXFALSE - disabled - Return: - none - -------------------------------------------------------------------*/ - -GR_ENTRY(grTexMipMapMode, void, ( GrChipID_t tmu, GrMipMapMode_t mmMode, FxBool lodBlend )) -{ - FxU32 - tLod, - texMode; - - GR_BEGIN("grTexMipMapMode",88,8+2*PACKER_WORKAROUND_SIZE); - GDBG_INFO_MORE((gc->myLevel,"(%d,%d,%d)\n",tmu,mmMode,lodBlend)); - GR_CHECK_TMU(myName,tmu); - - /*-------------------------------------------------------------- - Get Current tLod and texMode register values - --------------------------------------------------------------*/ - tLod = gc->state.tmu_config[tmu].tLOD; - texMode = gc->state.tmu_config[tmu].textureMode; - - /*-------------------------------------------------------------- - Clear LODMIN, LODMAX and LODDITHER - --------------------------------------------------------------*/ - tLod &= ~(SST_LODMIN|SST_LODMAX|SST_LOD_ODD); - texMode &= ~(SST_TLODDITHER|SST_TRILINEAR); - - /*-------------------------------------------------------------- - Encode Mipmap Mode Bits - --------------------------------------------------------------*/ - switch ( mmMode ) { - case GR_MIPMAP_DISABLE: - /*---------------------------------------------------------- - To disable mipmapping set the min and max lods to the same - value - ----------------------------------------------------------*/ - tLod |= SST_TLOD_MINMAX_INT(gc->state.tmu_config[tmu].largeLod, - gc->state.tmu_config[tmu].largeLod); - break; - case GR_MIPMAP_NEAREST_DITHER: - if (gc->state.allowLODdither) - texMode |= SST_TLODDITHER; - /* intentional fall-through to set lodmin and lodmax values */ - case GR_MIPMAP_NEAREST: - /*---------------------------------------------------------- - Set LODMIN and LODMAX in the tLod register to the - actual min and max LODs of the current texture. - ----------------------------------------------------------*/ - tLod |= SST_TLOD_MINMAX_INT(gc->state.tmu_config[tmu].largeLod, - gc->state.tmu_config[tmu].smallLod); - break; - default: - GrErrorCallback( "grTexMipMapMode: invalid mode passed", FXFALSE ); - break; - } - gc->state.tmu_config[tmu].mmMode = mmMode; - - /*-------------------------------------------------------------- - Fix trilinear and evenOdd bits - - - This is a bit of a hack to make two pass trilinear work with - full textures. The assumption here is that the only reason - you would ever set up Multiply by LODFRAC w/o REVERSE BLEND - is for the ODD pass of trilinear. - --------------------------------------------------------------*/ - if ( lodBlend ) { - texMode |= SST_TRILINEAR; - if ( ( texMode & SST_TC_ZERO_OTHER ) && - ( texMode & SST_TC_BLEND_LODFRAC ) && - !( texMode & SST_TC_REVERSE_BLEND ) ) { - tLod |= SST_LOD_ODD; - } - } - tLod |= _gr_evenOdd_xlate_table[gc->state.tmu_config[tmu].evenOdd]; - - /*-------------------------------------------------------------- - Write State To Hardware and Update Glide Shadow State - --------------------------------------------------------------*/ - PACKER_WORKAROUND; - hw = SST_TMU(hw,tmu); - GR_SET( hw->tLOD , tLod ); - GR_SET( hw->textureMode , texMode ); - PACKER_WORKAROUND; - - gc->state.tmu_config[tmu].tLOD = tLod; - gc->state.tmu_config[tmu].textureMode = texMode; - GR_END(); -} /* grTexMipMapMode */ - -/*------------------------------------------------------------------- - Function: grTexMinAddress - Date: 6/2 - Implementor(s): GaryMcT, Jdt - Library: glide - Description: - Returns address of start of texture ram for a TMU - Arguments: - tmu - Return: - integer texture base address, this pointer is not to be dereferenced - by the application, it is on to be used by grTexDownload(), - and grTExDownloadLevel() - -------------------------------------------------------------------*/ -/*------------------------------------------------------------------- - Function: grTexNCCTable - Date: 6/3 - Implementor(s): jdt - Library: glide - Description: - select one of the two NCC tables - Arguments: - tmu - which tmu - table - which table to select - One of: - GR_TEXTABLE_NCC0 - GR_TEXTABLE_NCC1 - GR_TEXTABLE_PALETTE - Return: - none - -------------------------------------------------------------------*/ - -GR_ENTRY(grTexNCCTable, void, ( GrChipID_t tmu, GrNCCTable_t table )) -{ - FxU32 texMode; - - GR_BEGIN("grTexNCCTable",88,4+2*PACKER_WORKAROUND_SIZE); - GDBG_INFO_MORE((gc->myLevel,"(%d)\n",tmu)); - GR_CHECK_TMU(myName,tmu); - GR_CHECK_F(myName, table>0x1, "invalid ncc table specified"); - - /*------------------------------------------------------------------ - Update local state - ------------------------------------------------------------------*/ - gc->state.tmu_config[tmu].nccTable = table; - - /*------------------------------------------------------------------ - Grab shadow texMode, update TexMode, update shadow/real register - ------------------------------------------------------------------*/ - texMode = gc->state.tmu_config[tmu].textureMode; - texMode &= ~( SST_TNCCSELECT ); - if ( table ) - texMode |= SST_TNCCSELECT; - else - texMode &= ~(SST_TNCCSELECT); - - PACKER_WORKAROUND; - GR_SET( SST_TMU(hw,tmu)->textureMode , texMode ); - PACKER_WORKAROUND; - - gc->state.tmu_config[tmu].textureMode = texMode; - GR_END(); -} /* grTexNCCTable */ - - -/*------------------------------------------------------------------- - Function: grTexSource - Date: 6/2 - Implementor(s): GaryMcT, Jdt - Library: glide - Description: - Sets up the current texture for texture mapping on the specified - TMU. - Arguments: - tmu - which tmu - startAddress - texture start address - 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 containing - texture dimensions - Return: - none - -------------------------------------------------------------------*/ - -GR_ENTRY(grTexSource, void, ( GrChipID_t tmu, FxU32 startAddress, FxU32 evenOdd, GrTexInfo *info )) -{ - FxU32 baseAddress, texMode, tLod; - - GR_BEGIN("grTexSource",88,12+2*PACKER_WORKAROUND_SIZE); - GDBG_INFO_MORE((gc->myLevel,"(%d,0x%x,%d,0x%x)\n",tmu,startAddress,evenOdd,info)); - GR_CHECK_TMU( myName, tmu ); - GR_CHECK_F( myName, startAddress >= gc->tmu_state[tmu].total_mem, "invalid startAddress" ); - GR_CHECK_F( myName, - startAddress + grTexTextureMemRequired( evenOdd, info ) >= gc->tmu_state[tmu].total_mem, - "insufficient texture ram at startAddress" ); - GR_CHECK_F( myName, evenOdd > 0x3 || evenOdd == 0, "evenOdd mask invalid"); - GR_CHECK_F( myName, !info, "invalid info pointer" ); - - /*------------------------------------------------------------- - Update Texture Unit State - -------------------------------------------------------------*/ - gc->state.tmu_config[tmu].smallLod = info->smallLod; - gc->state.tmu_config[tmu].largeLod = info->largeLod; - gc->state.tmu_config[tmu].evenOdd = evenOdd; - - /*------------------------------------------------------------- - Calculate Base Address - -------------------------------------------------------------*/ - baseAddress = _grTexCalcBaseAddress( startAddress, - info->largeLod, - info->aspectRatio, - info->format, - evenOdd ) >> 3; - /*------------------------------------------------------------- - Update Texture Mode - -------------------------------------------------------------*/ - texMode = gc->state.tmu_config[tmu].textureMode; - texMode &= ~SST_TFORMAT; - texMode |= ( info->format << SST_TFORMAT_SHIFT ) | SST_TPERSP_ST | SST_TCLAMPW; - - /*------------------------------------------------------------- - Compute TLOD (keep LODBIAS in tact) - -------------------------------------------------------------*/ - tLod = gc->state.tmu_config[tmu].tLOD; - tLod &= ~(SST_LODMIN | SST_LODMAX | SST_LOD_ASPECT | - SST_LOD_TSPLIT | SST_LOD_ODD | SST_LOD_S_IS_WIDER); - tLod |= SST_TLOD_MINMAX_INT(info->largeLod, - gc->state.tmu_config[tmu].mmMode==GR_MIPMAP_DISABLE ? - info->largeLod : info->smallLod); - tLod |= _gr_evenOdd_xlate_table[evenOdd]; - tLod |= _gr_aspect_xlate_table[info->aspectRatio]; - - /* Write relevant registers out to hardware */ - PACKER_WORKAROUND; - hw = SST_TMU(hw,tmu); - GR_SET( hw->texBaseAddr , baseAddress ); - GR_SET( hw->textureMode , texMode ); - GR_SET( hw->tLOD , tLod ); - PACKER_WORKAROUND; - - /* 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(); -} /* grTexSource */ - - -/*------------------------------------------------------------------- - Function: grTexMultibase - Date: 11/4/96 - Implementor(s): gmt - Library: Glide - Description: - Enable multiple base addresses for texturing. - Arguments: - tmu - which tmu - enable - flag which enables/disables multibase - Return: - none - -------------------------------------------------------------------*/ - -GR_ENTRY(grTexMultibase, void, ( GrChipID_t tmu, FxBool enable )) -{ - FxU32 tLod; - - GR_BEGIN("grTexMultibase",88,4+PACKER_WORKAROUND_SIZE); - GDBG_INFO_MORE((gc->myLevel,"(%d,%d)\n",tmu,enable)); - GR_CHECK_TMU(myName,tmu); - - tLod = gc->state.tmu_config[tmu].tLOD; - if ( enable ) - tLod |= SST_TMULTIBASEADDR; - else - tLod &= ~SST_TMULTIBASEADDR; - /*-------------------------------------------------------------- - Write State To Hardware and Update Glide Shadow State - --------------------------------------------------------------*/ - PACKER_WORKAROUND; - GR_SET( SST_TMU(hw,tmu)->tLOD , tLod ); - PACKER_WORKAROUND; - - gc->state.tmu_config[tmu].tLOD = tLod; - GR_END(); -} /* grTexMultibase */ - -/*------------------------------------------------------------------- - Function: grTexMultibaseAddress - Date: 11/4/96 - Implementor(s): gmt - Library: Glide - Description: - Set the base address for a particular set of mipmaps - Arguments: - tmu - which tmu - range - range of lods that are based at this starting address - One of: - GR_TEXBASE_256 - GR_TEXBASE_128 - GR_TEXBASE_64 - GR_TEXBASE_32_TO_1 - startAddress - start address that data was downloaded to - hardware with using grTexDownload/Level - info - pointer to GrTexInfo structure containing - texture dimensions - Return: - none - -------------------------------------------------------------------*/ - -GR_ENTRY(grTexMultibaseAddress, void, ( GrChipID_t tmu, GrTexBaseRange_t range, FxU32 startAddress, FxU32 evenOdd, GrTexInfo *info )) -{ - FxU32 baseAddress; - - GR_BEGIN("grTexMultibaseAddress",88,4+PACKER_WORKAROUND_SIZE); - GDBG_INFO_MORE((gc->myLevel,"(%d,%d,0x%x)\n",tmu,range,startAddress)); - GR_CHECK_TMU( myName, tmu ); - GR_CHECK_F( myName, range > GR_TEXBASE_32_TO_1, "invalid range" ); - GR_CHECK_F( myName, startAddress >= gc->tmu_state[tmu].total_mem, "invalid startAddress" ); - GR_CHECK_F( myName, evenOdd > 0x3, "evenOdd mask invalid" ); - GR_CHECK_F( myName, info, "invalid info pointer" ); - - - /* Write relevant registers out to hardware and shadows */ - PACKER_WORKAROUND; - hw = SST_TMU(hw,tmu); - switch (range) { - case GR_TEXBASE_256: - baseAddress = _grTexCalcBaseAddress( startAddress, - GR_LOD_256, - info->aspectRatio, - info->format, - evenOdd ) >> 3; - GR_SET( hw->texBaseAddr , baseAddress ); - gc->state.tmu_config[tmu].texBaseAddr = baseAddress; - break; - case GR_TEXBASE_128: - baseAddress = _grTexCalcBaseAddress( startAddress, - GR_LOD_128, - info->aspectRatio, - info->format, - evenOdd ) >> 3; - GR_SET( hw->texBaseAddr1 , baseAddress ); - gc->state.tmu_config[tmu].texBaseAddr_1 = baseAddress; - break; - case GR_TEXBASE_64: - baseAddress = _grTexCalcBaseAddress( startAddress, - GR_LOD_64, - info->aspectRatio, - info->format, - evenOdd ) >> 3; - GR_SET( hw->texBaseAddr2 , baseAddress ); - gc->state.tmu_config[tmu].texBaseAddr_2 = baseAddress; - break; - case GR_TEXBASE_32_TO_1: - baseAddress = _grTexCalcBaseAddress( startAddress, - GR_LOD_32, - info->aspectRatio, - info->format, - evenOdd ) >> 3; - GR_SET( hw->texBaseAddr38 , baseAddress ); - gc->state.tmu_config[tmu].texBaseAddr_3_8 = baseAddress; - break; - } - PACKER_WORKAROUND; - GR_END(); -} /* grTexMultibaseAddress */ - -#if 0 -/* -** _grTexForceLod -** -** Forces tLOD to a specific LOD level. This is useful only for -** debugging purposes. GMT: obsolete, please remove -*/ -void -_grTexForceLod( GrChipID_t tmu, int value ) -{ - GR_DCL_GC; - GR_DCL_HW; - FxU32 tLod = gc->state.tmu_config[0].tLOD; - - GR_CHECK_TMU("_grTexForceLod",tmu); - - tLod &= ~(SST_LODMIN | SST_LODMAX); - tLod |= SST_TLOD_MINMAX_INT(value,value); - - PACKER_WORKAROUND; - GR_SET( SST_TMU(hw,tmu)->tLOD , tLod ); - PACKER_WORKAROUND; - gc->state.tmu_config[tmu].tLOD = tLod; -} /* _grTexForceLod */ -#endif diff --git a/glide2x/sst1/glide/src/gtexdl.c b/glide2x/sst1/glide/src/gtexdl.c deleted file mode 100644 index ac6355e..0000000 --- a/glide2x/sst1/glide/src/gtexdl.c +++ /dev/null @@ -1,725 +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$ - * - * 28 6/19/97 7:35p Dow - * More P6 Stuff - * - * 27 6/10/97 3:59p Garymct - * Fixed a bug in a sanity checking macro. - * - * 26 6/10/97 11:09a Pgj - * fix 8-bit & optimize - * - * 25 6/08/97 11:06p Pgj - * use Group Write for Texture Downloads - * - * 24 5/09/97 5:12p Jdt - * Removed redundant download of NCC Table - * - * 23 3/18/97 9:07p Dow - * Got rid of #$#%#$ // comments - * - * 22 3/15/97 8:08p Jdt - * Moved grTexDownloadTable into this file as it not precisely DI. - * - * 21 3/04/97 9:08p Dow - * Neutered multiplatform multiheaded monster - * - * 20 2/26/97 11:58a Jdt - * fixed a warning - * - * 19 2/19/97 4:25p Hanson - * Added Gary T's changes to the expected size value for texture downloads - * - * 18 2/18/97 9:52a Jdt - * Fixed some warnings. - * - * 17 2/12/97 2:09p Hanson - * Hopefully removed the rest of my muckage. - * - * 16 2/12/97 12:34p Dow - * Fixed Hanson muckage - * - * 15 2/12/97 12:03p Hanson - * Adjusted Convert and download code for Descent - * - * 14 2/12/97 11:30a Hanson - * Added ConvertRle function - * - * 13 1/27/97 2:29p Murali - * Changed texture download code to help compiler use registers optimally. - * - * 12 12/23/96 1:37p Dow - * chagnes for multiplatform glide - * - * 11 11/18/96 9:13a Sellers - * fixed bug in checking for crossing of 2 MByte texture boundry -** -*/ - -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include -#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 )) -{ - int i; - FxU32 *hwNCC; - - GR_BEGIN_NOFIFOCHECK("_grTexDownloadNccTable",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 == 0 ) - return; - _GlideRoot.stats.palDownloads++; - _GlideRoot.stats.palBytes += (end-start+1)<<2; - - if (gc->tmu_state[tmu].ncc_table[which] != table ) { - GR_SET_EXPECTED_SIZE(48+2*PACKER_WORKAROUND_SIZE); - PACKER_WORKAROUND; - hw = SST_TMU(hw,tmu); - hwNCC = which == 0 ? hw->nccTable0 : hw->nccTable1; - - for ( i = 0; i < 12; i++ ) - GR_SET(hwNCC[i], table->packed_data[i] ); - - gc->tmu_state[tmu].ncc_table[which] = table; - PACKER_WORKAROUND; - P6FENCE; - GR_CHECK_SIZE(); - } - GR_END(); -} /* _grTexDownloadNccTable */ - -/*------------------------------------------------------------------- - 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 )) -{ - GR_BEGIN_NOFIFOCHECK("grTexDownloadTable",89); - GDBG_INFO_MORE((gc->myLevel,"(%d,%d,0x%x)\n",tmu,type,data)); - GR_CHECK_TMU(myName,tmu); - GR_CHECK_F(myName, type > 0x2, "invalid table specified"); - GR_CHECK_F(myName, !data, "invalid data pointer"); -#if ( GLIDE_PLATFORM & GLIDE_HW_SST1 ) - GR_CHECK_F(myName, _GlideRoot.hwConfig.SSTs[_GlideRoot.current_sst].sstBoard.VoodooConfig.tmuConfig[0].tmuRev < 1, - "Texelfx rev 0 does not support paletted textures"); -#endif - - 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(); -} /* 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 FxU8 *src8 = ( const FxU8 * ) data; - const FxU16 *src16 = ( const FxU16 * ) data; - FxI32 sh, bytesPerTexel; - FxU32 max_s, s, width, tex_address, tmu_baseaddress; - FxU32 tLod, texMode, baseAddress,size; - - GR_BEGIN_NOFIFOCHECK("grTexDownloadMipMapLevelPartial",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)); - size = _grTexTextureMemRequired(thisLod, thisLod, aspectRatio, format, evenOdd); - GR_CHECK_TMU(myName, tmu); - GR_CHECK_F(myName, startAddress + size > gc->tmu_state[tmu].total_mem, - "insufficient texture ram at startAddress" ); - GR_CHECK_F(myName, startAddress & 0x7, "unaligned startAddress"); - GR_CHECK_F(myName, thisLod > GR_LOD_1, "thisLod invalid"); - GR_CHECK_F(myName, largeLod > GR_LOD_1, "largeLod invalid"); - GR_CHECK_F(myName, thisLod < largeLod, "thisLod may not be larger than largeLod"); - GR_CHECK_F(myName, aspectRatio > GR_ASPECT_1x8 || aspectRatio < GR_ASPECT_8x1, "aspectRatio invalid"); - GR_CHECK_F(myName, evenOdd > 0x3 || evenOdd == 0, "evenOdd mask invalid"); - GR_CHECK_F(myName, !data, "invalid data pointer"); - GR_CHECK_F(myName, 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; - - /*------------------------------------------------------------ - Determine max_s - ------------------------------------------------------------*/ - width = _grMipMapHostWH[aspectRatio][thisLod][0]; - if ( format < GR_TEXFMT_16BIT ) { /* 8-bit texture */ - bytesPerTexel = 1; - max_s = width >> 2; - if ( max_s <= 0 ) - max_s = 1; - } else { /* 16-bit texture */ - bytesPerTexel = 2; - max_s = width >> 1; - if ( max_s <= 0 ) - max_s = 1; - } - /* assume max_s is a power of two */ - GR_ASSERT(( (max_s) & (max_s -1) ) == 0); - - - /*------------------------------------------------------------ - Compute Base Address Given Start Address Offset - ------------------------------------------------------------*/ - baseAddress = _grTexCalcBaseAddress( startAddress, - largeLod, - aspectRatio, - format, - evenOdd ); - baseAddress >>= 3; - - /*------------------------------------------------------------ - 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; - - /* account for 3 register writes and for smallest 1xN and 2xN levels */ - /* and also 4xN level for 8-bit textures (or 4x32x8bpp) */ - /* Also note that each texture write requires 10 actual fifo entry bytes */ - /* but since we are counting bytes/2 we multiply by 5 */ - GR_SET_EXPECTED_SIZE(3*4 + 2*PACKER_WORKAROUND_SIZE + 32*5); - - /*------------------------------------------------------------ - Update TLOD, texMode, baseAddress - ------------------------------------------------------------*/ - PACKER_WORKAROUND; - hw = SST_TMU(hw,tmu); - GR_SET( hw->texBaseAddr , baseAddress ); - GR_SET( hw->textureMode , texMode ); - GR_SET( hw->tLOD , tLod ); - PACKER_WORKAROUND; - - /* Flush the write buffers before the texture downloads */ - P6FENCE; - _GlideRoot.stats.texBytes += max_s * (max_t-t+1) * 4; - -# define SET_TRAM(a,b) GR_SET( *((FxU32 *)(a)) , (b) ) - /*------------------------------------------------------------ - Handle 8-bit Textures - ------------------------------------------------------------*/ - if ( format < GR_TEXFMT_16BIT ) { /* 8 bit textures */ - switch( width ) { - /* Cases 1, 2 and 4 don't need inner loops for s */ - case 1: /* 1xN texture */ - tex_address = tmu_baseaddress + ( t << 9 ); - for ( ; t <= max_t; t++) { - SET_TRAM( tex_address, *(const FxU8*) src8); - src8 += 1; - tex_address += (1 << 9); - } - break; - - case 2: /* 2xN texture */ - tex_address = tmu_baseaddress + ( t << 9 ); - for ( ; t <= max_t; t++) { - SET_TRAM( tex_address, *(const FxU16*) src8); - src8 += 2; - tex_address += (1 << 9); - } - break; - - case 4: /* 4xN texture */ - tex_address = tmu_baseaddress + ( t << 9 ); - for ( ; t <= max_t; t++) { - SET_TRAM( tex_address, *(const FxU32*) src8); - src8 += 4; - tex_address += (1 << 9); - } - break; - - default: /* >4xN texture */ - if (sh == 3) { /* Old TMUs */ - /* Inner loop unrolled to process 2 dwords per iteration */ - for ( ; t <= max_t; t++) { - GR_CHECK_SIZE_SLOPPY(); - GR_SET_EXPECTED_SIZE(max_s*5); - tex_address = tmu_baseaddress + ( t << 9 ); - for ( s = 0; s < max_s; s+=2) { - FxU32 t0, t1; - - t0 = * (const FxU32 *) (src8 ); - t1 = * (const FxU32 *) (src8 + 4); - SET_TRAM( tex_address , t0); - SET_TRAM( tex_address + 8, t1); - tex_address += 16; - src8 += 8; - } - } - } else { /* New TMUs */ -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) - -#define DW_PER_GWP 32 -#define W_PER_GWP (DW_PER_GWP << 1) -#define BYTES_PER_GWP (DW_PER_GWP << 2) -#define MASK(n) ((1 << (n)) - 1) - - for ( ; t <= max_t; t++ ) { - FxU32 t0, t1; - FxU32 j; - - GR_CHECK_SIZE_SLOPPY(); - GR_SET_EXPECTED_SIZE((max_s + (max_s >> 4) + 2) << 2); - tex_address = tmu_baseaddress + ( t << 9 ); - if (max_s >= DW_PER_GWP) { /* can use maximum GWP(s) */ - for (s=0; s>1); j++) { - t0 = * (const FxU32 *) (src8 + (j << 3) ); - t1 = * (const FxU32 *) (src8 + (j << 3) + 4); - GR_SET_GW(t0); - GR_SET_GW(t1); - } - tex_address += (max_s << 2); - src8 += (max_s << 2); - } - } /* end for t */ - -#else /* SST-1 */ - for ( ; t <= max_t; t++) { - GR_CHECK_SIZE_SLOPPY(); - GR_SET_EXPECTED_SIZE(max_s*5); - tex_address = tmu_baseaddress + ( t << 9 ); - for ( s = 0; s < max_s; s+=2) { - FxU32 t0, t1; - - t0 = * (const FxU32 *) (src8 ); - t1 = * (const FxU32 *) (src8 + 4); - SET_TRAM( tex_address , t0); - SET_TRAM( tex_address + 4, t1); - tex_address += 8; - src8 += 8; - } - } -#endif - } - break; - } - } else { - - /*------------------------------------------------------------ - Handle 16-bit Textures - ------------------------------------------------------------*/ - - switch( width ) { - /* Cases 1, 2 don't need inner loops for s */ - case 1: /* 1xN texture */ - tex_address = tmu_baseaddress + ( t << 9 ); - for ( ; t <= max_t; t++) { - SET_TRAM( tex_address, *src16 ); - src16 += 1; - tex_address += (1 << 9); - } - break; - - case 2: /* 2xN texture */ - tex_address = tmu_baseaddress + ( t << 9 ); - for ( ; t <= max_t; t++) { - SET_TRAM( tex_address, *(const FxU32 *)src16 ); - src16 += 2; - tex_address += (1 << 9); - } - break; - - default: /* All other textures */ -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) - for ( ; t <= max_t; t++ ) { - FxU32 t0, t1; - FxU32 j; - - GR_CHECK_SIZE_SLOPPY(); - GR_SET_EXPECTED_SIZE((max_s + (max_s >> 4) + 2) << 2); - tex_address = tmu_baseaddress + ( t << 9 ); - if (max_s >= DW_PER_GWP) { /* can use maximum GWP(s) */ - for (s=0; s>1); j++) { - t0 = * (const FxU32 *) (src16 + (j << 2) ); - t1 = * (const FxU32 *) (src16 + (j << 2) + 2); - GR_SET_GW(t0); - GR_SET_GW(t1); - } - tex_address += (max_s << 2); - src16 += (max_s << 1); - } - } /* end for t */ -#else /* SST-1 */ - for ( ; t <= max_t; t++ ) { - GR_CHECK_SIZE_SLOPPY(); - GR_SET_EXPECTED_SIZE(max_s*5); - tex_address = tmu_baseaddress + ( t << 9 ); - /* Loop unrolled to process 2 dwords per iteration */ - for ( s = 0; s < max_s; s += 2 ) { - FxU32 t0, t1; - - t0 = * (const FxU32 *) (src16 ); - t1 = * (const FxU32 *) (src16 + 2); - SET_TRAM( tex_address , t0); - SET_TRAM( tex_address + 4, t1); - tex_address += 8; - src16 += 4; - } - } -#endif - break; - } - } /* end switch( width ) */ - - /* Flush the write buffers after the texture downloads */ - P6FENCE; - - /*------------------------------------------------------------ - Restore TLOD, texMode, baseAddress - ------------------------------------------------------------*/ - GR_CHECK_SIZE_SLOPPY(); - GR_SET_EXPECTED_SIZE(3*4 + 2*PACKER_WORKAROUND_SIZE); - PACKER_WORKAROUND; - GR_SET( hw->texBaseAddr , gc->state.tmu_config[tmu].texBaseAddr ); - GR_SET( hw->textureMode , gc->state.tmu_config[tmu].textureMode ); - GR_SET( hw->tLOD , gc->state.tmu_config[tmu].tLOD ); - PACKER_WORKAROUND; - -all_done: - _GlideRoot.stats.texDownloads++; - GR_END_SLOPPY(); -} /* grTexDownloadMipmapLevelPartial */ - - -/*------------------------------------------------------------------- - 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 )) -{ - GR_BEGIN("_grTexDownloadPalette",89, 4*(end-start+1) + 2*PACKER_WORKAROUND_SIZE); - GDBG_INFO_MORE((gc->myLevel,"(%d,0x%x, %d,%d)\n",tmu,pal,start,end)); - GR_CHECK_F( myName, !pal, "pal invalid" ); - GR_CHECK_F( myName, start<0, "invalid start index" ); - GR_CHECK_F( myName, end>255, "invalid end index" ); - - PACKER_WORKAROUND; - hw = SST_TMU(hw,tmu); - _GlideRoot.stats.palDownloads++; - _GlideRoot.stats.palBytes += (end-start+1)<<2; - - while (start <= end) { - GR_SET( hw->nccTable0[4+(start&0x7)], - 0x80000000 | ((start & 0xFE) << 23) | (pal->data[start] & 0xffffff) ); - start++; - if ((start&0x7)==0) P6FENCE; - } - - PACKER_WORKAROUND; - P6FENCE; - GR_END(); -} /* _grTexDownloadPalette */ - - -#ifndef __linux__ -/* - 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)) -{ - 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]; - extern FxU16 *rle_line_end; - - - GR_BEGIN_NOFIFOCHECK("grTexDownloadMipMapLevelPartial",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(myName, tmu); - GR_CHECK_F(myName, startAddress + size > gc->tmu_state[tmu].total_mem, - "insufficient texture ram at startAddress" ); - GR_CHECK_F(myName, startAddress & 0x7, "unaligned startAddress"); - GR_CHECK_F(myName, thisLod > GR_LOD_1, "thisLod invalid"); - GR_CHECK_F(myName, largeLod > GR_LOD_1, "largeLod invalid"); - GR_CHECK_F(myName, thisLod < largeLod, "thisLod may not be larger than largeLod"); - GR_CHECK_F(myName, aspectRatio > GR_ASPECT_1x8 || aspectRatio < GR_ASPECT_8x1, "aspectRatio invalid"); - GR_CHECK_F(myName, evenOdd > 0x3 || evenOdd == 0, "evenOdd mask invalid"); - GR_CHECK_F(myName, !bm_data, "invalid data pointer"); - - GR_CHECK_F(myName, (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; - - /*------------------------------------------------------------ - 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; - - /* account for 6 register writes and for smallest 1xN and 2xN levels*/ - GR_SET_EXPECTED_SIZE(3*4 + 2*PACKER_WORKAROUND_SIZE); - - /*------------------------------------------------------------ - Update TLOD, texMode, baseAddress - ------------------------------------------------------------*/ - PACKER_WORKAROUND; - hw = SST_TMU(hw,tmu); - GR_SET( hw->texBaseAddr , baseAddress ); - GR_SET( hw->textureMode , texMode ); - GR_SET( hw->tLOD , tLod ); - PACKER_WORKAROUND; - - /* Flush the write buffers before the texture downloads */ - P6FENCE; - _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>1; - expected_size=max_s*5; - - rle_line_end=rle_line+width+u0; - - for(t=0;theight) - { - GR_CHECK_SIZE_SLOPPY(); - GR_SET_EXPECTED_SIZE(expected_size); - tex_address = tmu_baseaddress + ( t << 9 ); - src=rle_line+u0; - for(s=0;stexBaseAddr , gc->state.tmu_config[tmu].texBaseAddr ); - GR_SET( hw->textureMode , gc->state.tmu_config[tmu].textureMode ); - GR_SET( hw->tLOD , gc->state.tmu_config[tmu].tLOD ); - PACKER_WORKAROUND; - -all_done: - _GlideRoot.stats.texDownloads++; - GR_END_SLOPPY(); -} -#endif diff --git a/glide2x/sst1/glide/src/gu.c b/glide2x/sst1/glide/src/gu.c deleted file mode 100644 index bfb21fa..0000000 --- a/glide2x/sst1/glide/src/gu.c +++ /dev/null @@ -1,432 +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$ - * - * 12 12/19/97 8:09a Peter - * fog table propogation - * - * 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 -#include - -#include "fxglide.h" -#include "fxinline.h" - -#if ( (GLIDE_PLATFORM & GLIDE_SST_HW) && (GLIDE_PLATFORM & GLIDE_HW_SST1) ) -#include -#endif - -/*--------------------------------------------------------------------------- -** 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[kInternalFogTableEntryCount], 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[kInternalFogTableEntryCount], 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; -} - diff --git a/glide2x/sst1/glide/src/guclip.c b/glide2x/sst1/glide/src/guclip.c deleted file mode 100644 index 40b861a..0000000 --- a/glide2x/sst1/glide/src/guclip.c +++ /dev/null @@ -1,423 +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/14/97 5:32p Pgj - * remove dead code per GMT - * - * 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 -#include -#include "fxglide.h" - -#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 */ - -/*--------------------------------------------------------------------------- -** 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 ) - ) - { - grDrawTriangle( a, b, c ); - 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__) - 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__ ) - 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__ ) - 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 */ diff --git a/glide2x/sst1/glide/src/gump.c b/glide2x/sst1/glide/src/gump.c deleted file mode 100644 index bbcb81a..0000000 --- a/glide2x/sst1/glide/src/gump.c +++ /dev/null @@ -1,90 +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$ - * - * 7 11/12/97 5:11p Pgj - * stubs for evil guFb{Read|Write}Region() - * - * 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 -#include -#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; -} - -/*--------------------------------------------------------------------------- -** 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)) -{ -} diff --git a/glide2x/sst1/glide/src/gump.h b/glide2x/sst1/glide/src/gump.h deleted file mode 100644 index b8f6404..0000000 --- a/glide2x/sst1/glide/src/gump.h +++ /dev/null @@ -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__ */ diff --git a/glide2x/sst1/glide/src/gutex.c b/glide2x/sst1/glide/src/gutex.c deleted file mode 100644 index 63c3ee8..0000000 --- a/glide2x/sst1/glide/src/gutex.c +++ /dev/null @@ -1,167 +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$ - * - * 7 3/04/97 9:08p Dow - * Neutered multiplatform multiheaded monster - * - * 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 -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include -#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 )) -{ - 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( myName, tmu ); - GR_CHECK_W( myName, mmid == gc->state.current_mm[tmu], "setting same state twice" ); - - 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 - */ - baseAddress = mminfo->tmu_base_address >> 3; - 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 */ - - GR_SET_EXPECTED_SIZE(12+2*PACKER_WORKAROUND_SIZE); - - /* Write relevant registers out to hardware */ - - PACKER_WORKAROUND; - hw = SST_TMU(hw,tmu); - GR_SET( hw->texBaseAddr , baseAddress ); - GR_SET( hw->textureMode , texMode ); - GR_SET( hw->tLOD , tLod ); - PACKER_WORKAROUND; - - /* 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(); -} /* guTexSource */ - diff --git a/glide2x/sst1/glide/src/gxdraw.c b/glide2x/sst1/glide/src/gxdraw.c deleted file mode 100644 index 179f8ca..0000000 --- a/glide2x/sst1/glide/src/gxdraw.c +++ /dev/null @@ -1,859 +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$ - * - * 36 9/19/97 12:38p Peter - * asm rush trisetup vs alt fifo - * - * 35 9/10/97 10:13p Peter - * fifo logic from GaryT, non-normalized fp first cut - * - * 34 8/19/97 8:55p Peter - * lots of stuff, hopefully no muckage - * - * 33 8/01/97 11:49a Dow - * Added conventional FIFO accounting - * - * 32 7/07/97 3:43p Jdt - * Fixes to trisetup_nogradients - * - * 31 7/07/97 2:14p Jdt - * Mods to drawtriangle for parity with asm - * - * 30 7/07/97 8:33a Jdt - * New tracing macros. - * - * 29 7/04/97 12:08p Dow - * Fixed chip field muckage - * - * 28 7/01/97 7:44a Jdt - * Separated SST-1 and SST-96 trisetup implementations. - * - * 27 6/30/97 3:30p Jdt - * Fixed Watcom Wart. - * - * 26 6/30/97 3:23p Jdt - * rollback - * - * 24 6/29/97 11:49p Jdt - * First pass at triangle setup optimization for SST96 - * - * 23 6/20/97 5:53p Dow - * Change for subtle chip field bug - * - * 22 6/18/97 5:54p Dow - * P6 adjustments - * - * 21 5/27/97 11:37p Pgj - * Fix for Bug report 545 - * - * 20 4/13/97 2:06p Pgj - * eliminate all anonymous unions (use hwDep) - * - * 19 3/21/97 12:42p Dow - * Made STWHints not send the Bend Over Baby Packet to FBI Jr. - * - * 18 3/04/97 9:45p Dow - * More neutering of the multiheaded... - * - * 17 3/04/97 9:08p Dow - * Neutered multiplatform multiheaded monster - * - * 16 2/14/97 12:55p Dow - * moved vg96 fifo wrap into init code - * - * 15 12/23/96 1:37p Dow - * chagnes for multiplatform glide -** -*/ - -#include <3dfx.h> -#include - -#define FX_DLL_DEFINITION -#include -#include -#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 - ** - ** 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. -** -*/ - -#if ( GLIDE_PLATFORM & GLIDE_HW_SST96 ) -GR_DDFUNC(_trisetup, FxI32, ( const GrVertex *va, const GrVertex *vb, const GrVertex *vc )) -{ - GR_DCL_GC; - GR_DCL_HW; - const float *fa = &va->x; - const float *fb = &vb->x; - const float *fc = &vc->x; - float ooa, dxAB, dxBC, dyAB, dyBC; - int i,j,culltest; - int ay, by, cy; - float *fp; - struct dataList_s *dlp; - volatile FxU32 *fifoPtr; - - culltest = gc->state.cull_mode; /* 1 if negative, 0 if positive */ - _GlideRoot.stats.trisProcessed++; - - /* - ** Sort the vertices. - ** Whenever the radial order is reversed (from counter-clockwise to - ** clockwise), we need to change the area of the triangle. Note - ** that we know the first two elements are X & Y by looking at the - ** grVertex structure. - */ - ay = *(int *)&va->y; - by = *(int *)&vb->y; - if (ay < 0) ay ^= 0x7FFFFFFF; - cy = *(int *)&vc->y; - if (by < 0) by ^= 0x7FFFFFFF; - if (cy < 0) cy ^= 0x7FFFFFFF; - if (ay < by) { - if (by > cy) { /* acb */ - if (ay < cy) { - fa = &va->x; - fb = &vc->x; - fc = &vb->x; - culltest ^= 1; - } else { /* cab */ - fa = &vc->x; - fb = &va->x; - fc = &vb->x; - } - /* else it's already sorted */ - } - } else { - if (by < cy) { /* bac */ - if (ay < cy) { - fa = &vb->x; - fb = &va->x; - fc = &vc->x; - culltest ^= 1; - } else { /* bca */ - fa = &vb->x; - fb = &vc->x; - fc = &va->x; - } - } else { /* cba */ - fa = &vc->x; - fb = &vb->x; - fc = &va->x; - culltest ^= 1; - } - } - - /* 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]; - - /* this is where we store the area */ - _GlideRoot.pool.ftemp1 = dxAB * dyBC - dxBC * dyAB; - - /* Zero-area triangles are BAD!! */ - j = *(long *)&_GlideRoot.pool.ftemp1; - if ((j & 0x7FFFFFFF) == 0) - return 0; - - /* Backface culling, use sign bit as test */ - if (gc->state.cull_mode != GR_CULL_DISABLE) { - if ((j ^ (culltest<<31)) >= 0) { - return -1; - } - } - - /* Fence On P6 If Necessary */ - if ( _GlideRoot.CPUType == 6 ) { - /* In the macro there is a slop of 4 DWORDS that I have removed */ - if ( (gc->hwDep.sst96Dep.writesSinceFence + ( _GlideRoot.curTriSize >> 2 )) > 128 ) { - P6FENCE; - gc->hwDep.sst96Dep.writesSinceFence = 0; - } - gc->hwDep.sst96Dep.writesSinceFence += - _GlideRoot.curTriSize>>2; - } - - /* Wrap Fifo now if triangle is going to incur a wrap */ - if (gc->fifoData.hwDep.vg96FIFOData.fifoSize < (FxU32) _GlideRoot.curTriSize ) { -#if SST96_ALT_FIFO_WRAP - gc->fifoData.hwDep.vg96FIFOData.blockSize = _GlideRoot.curTriSize; - initWrapFIFO(&gc->fifoData); -#else - _grSst96FifoMakeRoom(); -#endif - } - - GR_SET_EXPECTED_SIZE(_GlideRoot.curTriSize); - - /* Grab fifo pointer into a local */ - fifoPtr = gc->fifoData.hwDep.vg96FIFOData.fifoPtr; - - /* Settle Bookeeping */ - gc->fifoData.hwDep.vg96FIFOData.fifoSize -= _GlideRoot.curTriSize; - gc->fifoData.hwDep.vg96FIFOData.fifoPtr += _GlideRoot.curTriSize>>2; - - /* Start first group write packet */ - SET_GW_CMD( fifoPtr, 0, gc->hwDep.sst96Dep.gwCommand ); - SET_GW_HEADER( fifoPtr, 1, gc->hwDep.sst96Dep.gwHeaders[0] ); - - ooa = _GlideRoot.pool.f1 / _GlideRoot.pool.ftemp1; - /* GMT: note that we spread out our PCI writes */ - /* write out X & Y for vertex A */ - FSET_GW_ENTRY( fifoPtr, 2, fa[0] ); - FSET_GW_ENTRY( fifoPtr, 3, fa[1] ); - - dlp = gc->dataList; - i = dlp->i; - - /* write out X & Y for vertex B */ - FSET_GW_ENTRY( fifoPtr, 4, fb[0] ); - FSET_GW_ENTRY( fifoPtr, 5, fb[1] ); - - /* write out X & Y for vertex C */ - FSET_GW_ENTRY( fifoPtr, 6, fc[0] ); - FSET_GW_ENTRY( fifoPtr, 7, fc[1] ); - fifoPtr += 8; - - /* - ** Divide the deltas by the area for gradient calculation. - */ - dxBC *= ooa; - dyAB *= ooa; - dxAB *= ooa; - dyBC *= ooa; - -/* access a floating point array with a byte index */ -#define FARRAY(p,i) (*(float *)((i)+(int)(p))) - - while (i) { - fp = dlp->addr; - /* chip field change */ - if (i & 1) - goto secondary_packet; - else { - float dpAB, dpBC,dpdx, dpdy; - - dpBC = FARRAY(fb,i); - dpdx = FARRAY(fa,i); - FSET_GW_ENTRY( fifoPtr, 0, dpdx ); - dpAB = dpdx - dpBC; - dpBC = dpBC - FARRAY(fc,i); - dpdx = dpAB * dyBC - dpBC * dyAB; - FSET_GW_ENTRY( fifoPtr, 1, dpdx ); - dpdy = dpBC * dxAB - dpAB * dxBC; - dlp++; - i = dlp->i; - FSET_GW_ENTRY( fifoPtr, 2, dpdy ); - fifoPtr += 3; - } - } - - /* write triangle command */ -triangle_command: - FSET_GW_ENTRY( fifoPtr, 0, _GlideRoot.pool.ftemp1 ); - fifoPtr+=1; - - if (((FxU32)fifoPtr) & 0x7) { - FSET_GW_ENTRY( fifoPtr, 0, 0.0f ); - fifoPtr += 1; - } - - GR_ASSERT(fifoPtr == gc->fifoData.hwDep.vg96FIFOData.fifoPtr); - - GR_CHECK_SIZE(); - - _GlideRoot.stats.trisDrawn++; - - return 1; - -secondary_packet: - /* Round out last header */ - if (((FxU32) fifoPtr) & 0x7) { - FSET_GW_ENTRY( fifoPtr, 0, 0.0f ); - fifoPtr += 1; - } - /* Start new packet - note, there can only ever be two different packets - using gwHeaderNum++ would be more general, but this - reflects the actual implementation */ - SET_GW_CMD( fifoPtr, 0, (FxU32)fp ); - SET_GW_HEADER( fifoPtr, 1, gc->hwDep.sst96Dep.gwHeaders[1] ); - fifoPtr+=2; - dlp++; - i = dlp->i; - while( i ) { - float dpAB, dpBC,dpdx, dpdy; - - fp = dlp->addr; - dpBC = FARRAY(fb,i); - dpdx = FARRAY(fa,i); - FSET_GW_ENTRY( fifoPtr, 0, dpdx ); - dpAB = dpdx - dpBC; - dpBC = dpBC - FARRAY(fc,i); - dpdx = dpAB * dyBC - dpBC * dyAB; - FSET_GW_ENTRY( fifoPtr, 1, dpdx ); - dpdy = dpBC * dxAB - dpAB * dxBC; - dlp++; - i = dlp->i; - FSET_GW_ENTRY( fifoPtr, 2, dpdy ); - fifoPtr += 3; - } - if (((FxU32)fifoPtr) & 0x7) { - FSET_GW_ENTRY( fifoPtr, 0, 0.0f ); - fifoPtr += 1; - } - SET_GW_CMD( fifoPtr, 0, gc->hwDep.sst96Dep.gwCommand ); - SET_GW_HEADER( fifoPtr, 1, GW_TRICMD_MASK ); - fifoPtr += 2; - goto triangle_command; -} /* _trisetup */ -#elif ( GLIDE_PLATFORM & GLIDE_HW_SST1 ) -GR_DDFUNC(_trisetup, FxI32, ( const GrVertex *va, const GrVertex *vb, const GrVertex *vc )) -{ - GR_DCL_GC; - GR_DCL_HW; - const float *fa = &va->x; - const float *fb = &vb->x; - const float *fc = &vc->x; - float ooa, dxAB, dxBC, dyAB, dyBC; - int i,j,culltest; - int ay, by, cy; - float *fp; - struct dataList_s *dlp; - - culltest = gc->state.cull_mode; /* 1 if negative, 0 if positive */ - _GlideRoot.stats.trisProcessed++; - - /* - ** Sort the vertices. - ** Whenever the radial order is reversed (from counter-clockwise to - ** clockwise), we need to change the area of the triangle. Note - ** that we know the first two elements are X & Y by looking at the - ** grVertex structure. - */ - ay = *(int *)&va->y; - by = *(int *)&vb->y; - if (ay < 0) ay ^= 0x7FFFFFFF; - cy = *(int *)&vc->y; - if (by < 0) by ^= 0x7FFFFFFF; - if (cy < 0) cy ^= 0x7FFFFFFF; - if (ay < by) { - if (by > cy) { /* acb */ - if (ay < cy) { - fa = &va->x; - fb = &vc->x; - fc = &vb->x; - culltest ^= 1; - } else { /* cab */ - fa = &vc->x; - fb = &va->x; - fc = &vb->x; - } - /* else it's already sorted */ - } - } else { - if (by < cy) { /* bac */ - if (ay < cy) { - fa = &vb->x; - fb = &va->x; - fc = &vc->x; - culltest ^= 1; - } else { /* bca */ - fa = &vb->x; - fb = &vc->x; - fc = &va->x; - } - } else { /* cba */ - fa = &vc->x; - fb = &vb->x; - fc = &va->x; - culltest ^= 1; - } - } -#if (GLIDE_PLATFORM & GLIDE_HW_SST1) && defined(GLIDE_USE_ALT_REGMAP) - hw = SST_WRAP(hw,128); /* use alternate register mapping */ -#endif - /* 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]; - - /* this is where we store the area */ - _GlideRoot.pool.ftemp1 = dxAB * dyBC - dxBC * dyAB; - - /* Zero-area triangles are BAD!! */ - j = *(long *)&_GlideRoot.pool.ftemp1; - if ((j & 0x7FFFFFFF) == 0) - return 0; - - /* Backface culling, use sign bit as test */ - if (gc->state.cull_mode != GR_CULL_DISABLE) { - if ((j ^ (culltest<<31)) >= 0) { - return -1; - } - } - - GR_SET_EXPECTED_SIZE(_GlideRoot.curTriSize); - - ooa = _GlideRoot.pool.f1 / _GlideRoot.pool.ftemp1; - /* GMT: note that we spread out our PCI writes */ - /* write out X & Y for vertex A */ - GR_SETF( hw->FvA.x, fa[GR_VERTEX_X_OFFSET] ); - GR_SETF( hw->FvA.y, fa[GR_VERTEX_Y_OFFSET] ); - - dlp = gc->dataList; - i = dlp->i; - - /* write out X & Y for vertex B */ - GR_SETF( hw->FvB.x, fb[GR_VERTEX_X_OFFSET] ); - GR_SETF( hw->FvB.y, fb[GR_VERTEX_Y_OFFSET] ); - - /* write out X & Y for vertex C */ - GR_SETF( hw->FvC.x, fc[GR_VERTEX_X_OFFSET] ); - GR_SETF( hw->FvC.y, fc[GR_VERTEX_Y_OFFSET] ); - - /* - ** Divide the deltas by the area for gradient calculation. - */ - dxBC *= ooa; - dyAB *= ooa; - dxAB *= ooa; - dyBC *= ooa; - -/* access a floating point array with a byte index */ -#define FARRAY(p,i) (*(float *)((i)+(int)(p))) - - /* - ** The src vector contains offsets from fa, fb, and fc to for which - ** gradients need to be calculated, and is null-terminated. - */ - while (i) { - fp = dlp->addr; - if (i & 1) { /* packer bug check */ - if (i & 2) P6FENCE; - GR_SETF( fp[0], 0.0F ); - if (i & 2) P6FENCE; - dlp++; - i = dlp->i; - } - else { - float dpAB, dpBC,dpdx, dpdy; - - dpBC = FARRAY(fb,i); - dpdx = FARRAY(fa,i); - GR_SETF( fp[0], dpdx ); - - dpAB = dpdx - dpBC; - dpBC = dpBC - FARRAY(fc,i); - dpdx = dpAB * dyBC - dpBC * dyAB; - -GDBG_INFO((285,"p0,1x: %g %g dpdx: %g\n",dpAB * dyBC,dpBC * dyAB,dpdx)); - GR_SETF( fp[DPDX_OFFSET>>2] , dpdx ); - dpdy = dpBC * dxAB - dpAB * dxBC; - -GDBG_INFO((285,"p0,1y: %g %g dpdy: %g\n",dpBC * dxAB,dpAB * dxBC,dpdy)); - dlp++; - i = dlp->i; - GR_SETF( fp[DPDY_OFFSET>>2] , dpdy ); - } - } - - /* Draw the triangle by writing the area to the triangleCMD register */ - P6FENCE_CMD( GR_SETF( hw->FtriangleCMD, _GlideRoot.pool.ftemp1 ) ); - _GlideRoot.stats.trisDrawn++; - - GR_CHECK_SIZE(); - _GlideRoot.stats.trisDrawn++; - return 1; -} /* _trisetup */ -#else -#error "Need to implement trisetup for this platform" -#endif - -/* -** _trisetup_nogradients -** -** This routine does all the setup needed for drawing a triangle except -** that it assumes that the gradients are already in the chip. -** -** Also we assume we don't have to test for backface triangles - this is -** typically done outside this routine, as in grDrawPlanarPolygon -*/ - -#if ( GLIDE_PLATFORM & GLIDE_HW_SST96 ) -GR_DDFUNC(_trisetup_nogradients, FxI32, ( const GrVertex *va, const GrVertex *vb, const GrVertex *vc )) -{ - GR_DCL_GC; - GR_DCL_HW; - const float *fa = &va->x; - const float *fb = &vb->x; - const float *fc = &vc->x; - float dxAB, dxBC, dyAB, dyBC; - int i,j; - int ay, by, cy; - float *fp; - struct dataList_s *dlp; - volatile FxU32 *fifoPtr; - - /* - ** Sort the vertices. - ** Whenever the radial order is reversed (from counter-clockwise to - ** clockwise), we need to change the area of the triangle. Note - ** that we know the first two elements are X & Y by looking at the - ** grVertex structure. - */ - ay = *(int *)&va->y; - by = *(int *)&vb->y; - if (ay < 0) ay ^= 0x7FFFFFFF; - cy = *(int *)&vc->y; - if (by < 0) by ^= 0x7FFFFFFF; - if (cy < 0) cy ^= 0x7FFFFFFF; - if (ay < by) { - if (by > cy) { /* acb */ - if (ay < cy) { - fa = &va->x; - fb = &vc->x; - fc = &vb->x; - } else { /* cab */ - fa = &vc->x; - fb = &va->x; - fc = &vb->x; - } - /* else it's already sorted */ - } - } else { - if (by < cy) { /* bac */ - if (ay < cy) { - fa = &vb->x; - fb = &va->x; - fc = &vc->x; - } else { /* bca */ - fa = &vb->x; - fb = &vc->x; - fc = &va->x; - } - } else { /* cba */ - fa = &vc->x; - fb = &vb->x; - fc = &va->x; - } - } - - /* 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]; - - /* this is where we store the area */ - _GlideRoot.pool.ftemp1 = dxAB * dyBC - dxBC * dyAB; - _GlideRoot.stats.trisProcessed++; - - /* Zero-area triangles are BAD!! */ - j = *(long *)&_GlideRoot.pool.ftemp1; - if ((j & 0x7FFFFFFF) == 0) { - return 0; - } - - /* Fence On P6 If Necessary */ - if ( _GlideRoot.CPUType == 6 ) { - /* In the macro there is a slop of 4 DWORDS that I have removed */ - if ( (gc->hwDep.sst96Dep.writesSinceFence + - ( _GlideRoot.curTriSizeNoGradient >> 2 )) > 128 ) { - P6FENCE; - gc->hwDep.sst96Dep.writesSinceFence = 0; - } - gc->hwDep.sst96Dep.writesSinceFence += - _GlideRoot.curTriSizeNoGradient>>2; - } - - /* Wrap Fifo now if triangle is going to incur a wrap */ - if (gc->fifoData.hwDep.vg96FIFOData.fifoSize < (FxU32) _GlideRoot.curTriSizeNoGradient ) { -#if SST96_ALT_FIFO_WRAP - gc->fifoData.hwDep.vg96FIFOData.blockSize = _GlideRoot.curTriSizeNoGradient; - initWrapFIFO(&gc->fifoData); -#else - _grSst96FifoMakeRoom(); -#endif - } - - /* bookeeping */ - fifoPtr = gc->fifoData.hwDep.vg96FIFOData.fifoPtr; - gc->fifoData.hwDep.vg96FIFOData.fifoSize -= _GlideRoot.curTriSizeNoGradient; - gc->fifoData.hwDep.vg96FIFOData.fifoPtr += _GlideRoot.curTriSizeNoGradient>>2; - - /* packet header */ - SET_GW_CMD( fifoPtr, 0, gc->hwDep.sst96Dep.gwCommand ); - SET_GW_HEADER( fifoPtr, 1, (gc->hwDep.sst96Dep.gwHeaders[0] & ~GWH_DXY_BITS) ); - - FSET_GW_ENTRY( fifoPtr, 2, fa[0] ); - FSET_GW_ENTRY( fifoPtr, 3, fa[1] ); - - dlp = gc->dataList; - i = dlp->i; - - /* write out X & Y for vertex B */ - FSET_GW_ENTRY( fifoPtr, 4, fb[0] ); - FSET_GW_ENTRY( fifoPtr, 5, fb[1] ); - - /* write out X & Y for vertex C */ - FSET_GW_ENTRY( fifoPtr, 6, fc[0] ); - FSET_GW_ENTRY( fifoPtr, 7, fc[1] ); - fifoPtr += 8; - - dlp = gc->dataList; - i = dlp->i; - -/* access a floating point array with a byte index */ -#define FARRAY(p,i) (*(float *)((i)+(int)(p))) - - while (i) { - fp = dlp->addr; - if (i & 1) - goto secondary_packet; - else { - float dpdx; - dpdx = FARRAY(fa,i); - FSET_GW_ENTRY( fifoPtr, 0, dpdx ); - fifoPtr += 1; - dlp++; - i = dlp->i; - } - } - -triangle_command: - FSET_GW_ENTRY( fifoPtr, 0, _GlideRoot.pool.ftemp1 ); - fifoPtr += 1; - - if (((FxU32)fifoPtr) & 0x7) { - FSET_GW_ENTRY( fifoPtr, 0, 0.0f ); - fifoPtr += 1; - } - - GR_ASSERT(fifoPtr == gc->fifoData.hwDep.vg96FIFOData.fifoPtr); - - _GlideRoot.stats.trisDrawn++; - - return 1; - -secondary_packet: - /* Round out last packet */ - if (((FxU32) fifoPtr) & 0x7) { - FSET_GW_ENTRY( fifoPtr, 0, 0.0f ); - fifoPtr += 1; - } - - /* Start new packet - note, there can only ever be two different packets - using gwHeaderNum++ would be more general, but this - reflects the actual implementation */ - SET_GW_CMD( fifoPtr, 0, (FxU32)fp ); - SET_GW_HEADER( fifoPtr, 1, gc->hwDep.sst96Dep.gwHeaders[1] ); - fifoPtr+=2; - dlp++; - i = dlp->i; - while( i ) { - float dpdx; - dpdx = FARRAY(fa,i); - FSET_GW_ENTRY( fifoPtr, 0, dpdx ); - dlp++; - i = dlp->i; - fifoPtr += 1; - } - if (((FxU32)fifoPtr) & 0x7) { - FSET_GW_ENTRY( fifoPtr, 0, 0.0f ); - fifoPtr += 1; - } - SET_GW_CMD( fifoPtr, 0, gc->hwDep.sst96Dep.gwCommand ); - SET_GW_HEADER( fifoPtr, 1, GW_TRICMD_MASK ); - fifoPtr += 2; - goto triangle_command; -} /* _trisetup_nogradients */ - -#elif ( GLIDE_PLATFORM & GLIDE_HW_SST1 ) - -GR_DDFUNC(_trisetup_nogradients, FxI32, ( const GrVertex *va, const GrVertex *vb, const GrVertex *vc )) -{ - GR_DCL_GC; - GR_DCL_HW; - const float *fa = &va->x; - const float *fb = &vb->x; - const float *fc = &vc->x; - float dxAB, dxBC, dyAB, dyBC; - int i,j; - int ay, by, cy; - float *fp; - struct dataList_s *dlp; - - /* - ** Sort the vertices. - ** Whenever the radial order is reversed (from counter-clockwise to - ** clockwise), we need to change the area of the triangle. Note - ** that we know the first two elements are X & Y by looking at the - ** grVertex structure. - */ - ay = *(int *)&va->y; - by = *(int *)&vb->y; - if (ay < 0) ay ^= 0x7FFFFFFF; - cy = *(int *)&vc->y; - if (by < 0) by ^= 0x7FFFFFFF; - if (cy < 0) cy ^= 0x7FFFFFFF; - if (ay < by) { - if (by > cy) { /* acb */ - if (ay < cy) { - fa = &va->x; - fb = &vc->x; - fc = &vb->x; - } else { /* cab */ - fa = &vc->x; - fb = &va->x; - fc = &vb->x; - } - /* else it's already sorted */ - } - } else { - if (by < cy) { /* bac */ - if (ay < cy) { - fa = &vb->x; - fb = &va->x; - fc = &vc->x; - } else { /* bca */ - fa = &vb->x; - fb = &vc->x; - fc = &va->x; - } - } else { /* cba */ - fa = &vc->x; - fb = &vb->x; - fc = &va->x; - } - } -#if (GLIDE_PLATFORM & GLIDE_HW_SST1) && defined(GLIDE_USE_ALT_REGMAP) - hw = SST_WRAP(hw,128); /* use alternate register mapping */ -#endif - - GR_SET_EXPECTED_SIZE(_GlideRoot.curTriSizeNoGradient); - - /* GMT: note that we spread out our PCI writes */ - /* write out X & Y for vertex A */ - GR_SETF( hw->FvA.x, fa[GR_VERTEX_X_OFFSET] ); - GR_SETF( hw->FvA.y, fa[GR_VERTEX_Y_OFFSET] ); - - /* 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]; - - /* write out X & Y for vertex B */ - GR_SETF( hw->FvB.x, fb[GR_VERTEX_X_OFFSET] ); - GR_SETF( hw->FvB.y, fb[GR_VERTEX_Y_OFFSET] ); - - /* this is where we store the area */ - _GlideRoot.pool.ftemp1 = dxAB * dyBC - dxBC * dyAB; - _GlideRoot.stats.trisProcessed++; - - /* Zero-area triangles are BAD!! */ - j = *(long *)&_GlideRoot.pool.ftemp1; - if ((j & 0x7FFFFFFF) == 0) { - GR_CHECK_SIZE_SLOPPY(); - return 0; - } - - /* write out X & Y for vertex C */ - GR_SETF( hw->FvC.x, fc[GR_VERTEX_X_OFFSET] ); - GR_SETF( hw->FvC.y, fc[GR_VERTEX_Y_OFFSET] ); - - dlp = gc->dataList; - i = dlp->i; - -/* access a floating point array with a byte index */ -#define FARRAY(p,i) (*(float *)((i)+(int)(p))) - - /* - ** The src vector contains offsets from fa, fb, and fc to for which - ** gradients need to be calculated, and is null-terminated. - */ - while (i) { - fp = dlp->addr; - if (i & 1) { /* packer bug check */ - if (i & 2) P6FENCE; - GR_SETF( fp[0], 0.0F ); - if (i & 2) P6FENCE; - dlp++; - i = dlp->i; - } - else { - GR_SETF( fp[0], FARRAY(fa,i) ); - dlp++; - i = dlp->i; - } - } - - /* Draw the triangle by writing the area to the triangleCMD register */ - P6FENCE_CMD( GR_SETF( hw->FtriangleCMD, _GlideRoot.pool.ftemp1 ) ); - _GlideRoot.stats.trisDrawn++; - - GR_CHECK_SIZE(); - return 1; -} /* _trisetup_nogradients */ -#else -#error "Need Triangle Setup code for this hardware" -#endif - diff --git a/glide2x/sst1/glide/src/makefile.linux b/glide2x/sst1/glide/src/makefile.linux deleted file mode 100644 index b03f79c..0000000 --- a/glide2x/sst1/glide/src/makefile.linux +++ /dev/null @@ -1,199 +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 -# - -# local defines, options, includes - -# Stuff for debugging -ifneq ($(DEBUG),) -DBGOPTS = -DGLIDE_DEBUG -DGDBG_INFO_ON -GLIDE_SANITY_ALL = 1 -endif - -# Display Options (Hardware) -DSPOPTS = -DGLIDE_HARDWARE - -# Compile for specific hardware -ifeq ($(FX_GLIDE_HW),SST96) -HWSPEC = sst96.c -LCDEFS += -DSST96 -DGLIDE_USE_ALT_REGMAP - -ASMTRISETUP = xdraw96.S -# LIBOBJS = xdraw96.o - -FX_GLIDE_FIFO96 = 1 -FX_GLIDE_GROUP_WRITE=1 - -# Turn on the alternate fifo handling code -ifeq ($(FX_SST96_ALT_FIFO),1) -LCDEFS += -DSST96_ALT_FIFO_WRAP -endif - -else # Default to SST1 -LCDEFS += -DSST1 -LADEFS += /DSST1 -ASMTRISETUP = xdraw.S -# LIBOBJS = xdraw.o -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. -# - -# SST96 has no notion of alternate register mapping -ifneq ($(FX_GLIDE_HW),SST96) -# Turn on/off alt register set. (G lide R eg M ap OPTS) -ifeq ($(FX_GLIDE_REG_MAP),ORIG) -GRMOPTS = -DGLIDE_USE_ALT_REGMAP -ASM_REGMAP_DEFS = -DGLIDE_USE_ALT_REGMAP -else -endif -endif - -# Turn on/off assembly language trisetup code. -# (C on is Assembly off) (A ssembly T ri S etup OPTS) -ifeq ($(FX_GLIDE_CTRISETUP),1) -ASMTRISETUP = -ATSOPTS = -DGLIDE_USE_C_TRISETUP -LIBOBJS = -endif - -OPTOPTS = $(GRMOPTS) $(OTSOPTS) $(ATSOPTS) - -# local defines, begin with basics and then add on -LCDEFS += -DGLIDE_LIB - -# Turn Off/On compilation of shameless plug -ifneq ($(FX_GLIDE_NO_PLUG),1) -LCDEFS += -DGLIDE_PLUG -endif - -# Turn Off/On splash screen -ifneq ($(FX_GLIDE_NO_SPLASH),1) -LCDEFS += -DGLIDE_SPLASH -endif - -# Turn On group writes -ifneq ($(FX_GLIDE_GROUP_WRITE),) -LCDEFS += -DGROUP_WRITE -endif - -ifeq ($(FX_GLIDE_FIFO96),1) -LCDEFS += -DSST96_FIFO -endif - -ifdef GLIDE_SANITY_ALL -GLIDE_SANITY_SIZE = $(GLIDE_SANITY_ALL) -GLIDE_SANITY_ASSERT = $(GLIDE_SANITY_ALL) -endif - -ifdef GLIDE_SANITY_SIZE -LCDEFS += -DGLIDE_SANITY_SIZE -endif -ifdef GLIDE_SANITY_ASSERT -LCDEFS += -DGLIDE_SANITY_ASSERT -endif - -# Local Defs, Includes, and Options (C) -LCINCS = -I$(SST1INC) -LCOPTS = $(DBGOPTS) $(DSPOPTS) $(OPTOPTS) - -# Local Defs, Includes, and Options (ASM) -LADEFS += $(ASM_REGMAP_DEFS) -LAINCS = -I$(SST1INC) -LAOPTS = $(DBGOPTS) $(DSPOPTS) $(OPTOPTS) - -AFILES = $(ASMTRISETUP) - -# sources -HEADERS = glide.h gump.h glidesys.h glideutl.h -PRIVATE_HEADERS = fxglide.h gsstdef.h -INSTALL_DESTINATION = $(BUILD_ROOT_HW) - -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 gxdraw.c $(HWSPEC) \ - cpudetect.c - -OFILES = $(CFILES:.c=.o) - -OTHER_CFILES = fxgasm.c - -CODFILES = $(CFILES:.c=.cod) - -SST1INC = $(BUILD_ROOT_HW)/include -SWLIBSINC = $(BUILD_ROOT_SWLIBS)/include - -# sublibs for hardware -SUBLIBRARIES = \ - $(BUILD_ROOT_SWLIBS)/lib/libfxmisc.a \ - $(BUILD_ROOT_SWLIBS)/lib/libfxpci.a \ - $(BUILD_ROOT_HW)/lib/libinit.a \ - $(BUILD_ROOT_HW)/lib/libsst1.a \ - $(BUILD_ROOT_HW)/lib/libinit96.a - - -LINKLIBRARIES+=-lm -ifeq ($(FX_GLIDE_HW),SST96) -LINKLIBRARIES += -L$(XLOCATION)/lib -lX11 -lXext \ - -lXxf86rush -lXxf86dga -lXxf86vm -endif - -# targets -LDIRT = fxgasm.o fxgasm fxgasm.h - -LIBRARIES = libglide.a -SHARED_LIBRARY = libglide.so.2.46 - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak - -fxgasm : fxgasm.c $(HEADERS) $(PRIVATE_HEADERS) - $(CC) -o $@ fxgasm.c $(GCDEFS) $(LCDEFS) $(VCDEFS) $(LCOPTS) \ - -I$(BUILD_ROOT_HW)/include -I$(BUILD_ROOT_SWLIBS)/include $(LDFLAGS) - -fxgasm.h : fxgasm - ./fxgasm > fxgasm.h - -fxinline.h : fxgasm - ./fxgasm -inline > fxinline.h - -ASM_DEFINES = -DGLIDE_HARDWARE=1 -ifneq ($(DEBUG),) -ASM_DEFINES += -DGLIDE_DEBUG=1 -else -ASM_DEFINES += -DGLIDE_DEBUG=0 -endif - -xdraw.o : fxgasm.h xdraw.S -# $(CC) -c -o $@ xdraw.S $(ASM_OPTS) $(LAOPTS) - gasp xdraw.S $(ASM_DEFINES) | as -V -Qy -o xdraw.o - -xdraw96.o : fxgasm.h xdraw96. -# $(CC) -c -o $@ xdraw96.S $(ASM_OPTS) $(LAOPTS) - gasp xdraw96.S $(ASM_DEFINES) | as -V -Qy -o xdraw96.o - -gsplash.o : gsplash.c splshdat.c fxinline.h diff --git a/glide2x/sst1/glide/src/makefile.unix b/glide2x/sst1/glide/src/makefile.unix deleted file mode 100644 index 88d9539..0000000 --- a/glide2x/sst1/glide/src/makefile.unix +++ /dev/null @@ -1,197 +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 -# - -# local defines, options, includes - -# Stuff for debugging -ifneq ($(DEBUG),) -DBGOPTS = -DGLIDE_DEBUG -DGDBG_INFO_ON -GLIDE_SANITY_ALL = 1 -endif - -# Display Options (Hardware) -DSPOPTS = -DGLIDE_HARDWARE - -# Compile for specific hardware -ifeq ($(FX_GLIDE_HW),SST96) -HWSPEC = sst96.c -LCDEFS += -DSST96 -DGLIDE_USE_ALT_REGMAP - -ASMTRISETUP = xdraw96.s -LIBOBJS = xdraw96.o - -FX_GLIDE_FIFO96 = 1 -FX_GLIDE_GROUP_WRITE=1 - -# Turn on the alternate fifo handling code -ifeq ($(FX_SST96_ALT_FIFO),1) -LCDEFS += -DSST96_ALT_FIFO_WRAP -endif - -else # Default to SST1 -LCDEFS += -DSST1 -LADEFS += /DSST1 -ASMTRISETUP = xdraw.s -LIBOBJS = xdraw.o -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. -# - -# SST96 has no notion of alternate register mapping -ifneq ($(FX_GLIDE_HW),SST96) -# Turn on/off alt register set. (G lide R eg M ap OPTS) -ifeq ($(FX_GLIDE_REG_MAP),ORIG) -GRMOPTS = -DGLIDE_USE_ALT_REGMAP -ASM_REGMAP_DEFS = -DGLIDE_USE_ALT_REGMAP -else -endif -endif - -# Turn on/off assembly language trisetup code. -# (C on is Assembly off) (A ssembly T ri S etup OPTS) -ifeq ($(FX_GLIDE_CTRISETUP),1) -ASMTRISETUP = -ATSOPTS = -DGLIDE_USE_C_TRISETUP -LIBOBJS = -endif - -OPTOPTS = $(GRMOPTS) $(OTSOPTS) $(ATSOPTS) - -# local defines, begin with basics and then add on -LCDEFS += -DGLIDE_LIB - -# Turn Off/On compilation of shameless plug -ifneq ($(FX_GLIDE_NO_PLUG),1) -LCDEFS += -DGLIDE_PLUG -endif - -# Turn Off/On splash screen -ifneq ($(FX_GLIDE_NO_SPLASH),1) -LCDEFS += -DGLIDE_SPLASH -endif - -# Turn On group writes -ifneq ($(FX_GLIDE_GROUP_WRITE),) -LCDEFS += -DGROUP_WRITE -endif - -ifeq ($(FX_GLIDE_FIFO96),1) -LCDEFS += -DSST96_FIFO -endif - -ifdef GLIDE_SANITY_ALL -GLIDE_SANITY_SIZE = $(GLIDE_SANITY_ALL) -GLIDE_SANITY_ASSERT = $(GLIDE_SANITY_ALL) -endif - -ifdef GLIDE_SANITY_SIZE -LCDEFS += -DGLIDE_SANITY_SIZE -endif -ifdef GLIDE_SANITY_ASSERT -LCDEFS += -DGLIDE_SANITY_ASSERT -endif - -# Local Defs, Includes, and Options (C) -LCINCS = -I$(SST1INC) -LCOPTS = $(DBGOPTS) $(DSPOPTS) $(OPTOPTS) - -# Local Defs, Includes, and Options (ASM) -LADEFS += $(ASM_REGMAP_DEFS) -LAINCS = -I$(SST1INC) -LAOPTS = $(DBGOPTS) $(DSPOPTS) $(OPTOPTS) - -AFILES = $(ASMTRISETUP) - -# sources -HEADERS = glide.h gump.h glidesys.h glideutl.h -PRIVATE_HEADERS = fxglide.h gsstdef.h -INSTALL_DESTINATION = $(BUILD_ROOT_SST1) - -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 gxdraw.c $(HWSPEC) \ - cpudetect.c - -OFILES = $(CFILES:.c=.o) - -OTHER_CFILES = fxgasm.c - -CODFILES = $(CFILES:.c=.cod) - -SST1INC = $(BUILD_ROOT_SST1)/include -SWLIBSINC = $(BUILD_ROOT_SWLIBS)/include - -# sublibs for hardware -SUBLIBRARIES = \ - $(BUILD_ROOT_SWLIBS)/lib/libfxmisc.a \ - $(BUILD_ROOT_SWLIBS)/lib/libfxpci.a \ - $(BUILD_ROOT_SST1)/lib/libinit.a \ - $(BUILD_ROOT_SST1)/lib/libsst1.a \ - $(BUILD_ROOT_SST1)/lib/libinit96.a - - -LINKLIBRARIES+=-lm -ifeq ($(FX_GLIDE_HW),SST96) -LINKLIBRARIES += -L$(XLOCATION)/lib -lX11 -lXext \ - -lXxf86rush -lXxf86dga -lXxf86vm -endif - -# targets -LDIRT = fxgasm.o fxgasm fxgasm.h - -LIBRARIES = libglide2x.a -SHARED_LIBRARY = libglide2x.so - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak - -fxgasm : fxgasm.c $(HEADERS) $(PRIVATE_HEADERS) - $(CC) -o $@ fxgasm.c $(GCDEFS) $(LCDEFS) $(VCDEFS) $(LCOPTS) \ - -I$(BUILD_ROOT_SST1)/include -I$(BUILD_ROOT_SWLIBS)/include $(LDFLAGS) - -fxgasm.h : fxgasm - ./fxgasm > fxgasm.h - -fxinline.h : fxgasm - ./fxgasm -inline > fxinline.h - -ASM_DEFINES = -DGLIDE_HARDWARE=1 -ifneq ($(DEBUG),) -ASM_DEFINES += -DGLIDE_DEBUG=1 -else -ASM_DEFINES += -DGLIDE_DEBUG=0 -endif - -xdraw.o : fxgasm.h xdraw.s - gasp xdraw.s $(ASM_DEFINES) | as -V -Qy -o xdraw.o - -xdraw96.o : fxgasm.h xdraw96.s - gasp xdraw96.s $(ASM_DEFINES) | as -V -Qy -o xdraw96.o - -gsplash.o : gsplash.c splshdat.c fxinline.h diff --git a/glide2x/sst1/glide/src/rcver.h b/glide2x/sst1/glide/src/rcver.h deleted file mode 100644 index 04187ed..0000000 --- a/glide2x/sst1/glide/src/rcver.h +++ /dev/null @@ -1,60 +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 46 - -#ifndef GLIDE3 -#define VERSIONSTR "2.46\0" -#else -#define VERSIONSTR "3.0\0" -#endif - -#ifdef SST1 -# define HWSTR "Voodoo Graphics(tm)\0" -# ifdef NT_BUILD -# define PRODNAME "Glide(tm) for Voodoo Graphics\251 and Windows\256 NT\0" -# else -# define PRODNAME "Glide(tm) for Voodoo Graphics\251 and Windows\256 95/98\0" -# endif /* NT_BUILD */ -#elif defined(SST96) -# define HWSTR " Voodoo Rush(tm)\0" -# ifdef NT_BUILD -# define PRODNAME "Glide(tm) for Voodoo Rush\251 and Windows\256 NT\0" -# else -# define PRODNAME "Glide(tm) for Voodoo Rush\251 and Windows\256 95/98\0" -# endif /* NT_BUILD */ -#elif defined(CVG) || defined(VOODOO2) -# define HWSTR " Voodoo^2(tm)\0" -# 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 HWSTR "Unknown Chip\0" -#endif diff --git a/glide2x/sst1/glide/src/readme b/glide2x/sst1/glide/src/readme deleted file mode 100644 index 835083d..0000000 --- a/glide2x/sst1/glide/src/readme +++ /dev/null @@ -1,40 +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 diff --git a/glide2x/sst1/glide/src/splshdat.c b/glide2x/sst1/glide/src/splshdat.c deleted file mode 100644 index 25645b0..0000000 --- a/glide2x/sst1/glide/src/splshdat.c +++ /dev/null @@ -1,17359 +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$ -** -*/ - -static Vert vert_0[] = { -{ 273.149261f, -24.549585f, 271.420441f, 0.012590f, -0.999890f, 0.007876f, 189.411841f, 18.708570f }, -{ 262.776489f, -24.549574f, 143.489777f, 0.005015f, -0.999765f, 0.021108f, 187.071440f, 69.986058f }, -{ 484.061951f, -24.549578f, 188.438385f, 0.011169f, -0.999936f, -0.001735f, 236.999758f, 51.969644f }, -{ 383.791992f, -24.549570f, 84.710793f, 0.010803f, -0.999785f, 0.017720f, 214.376000f, 93.546010f }, -{ 563.586426f, -24.549566f, 46.677605f, 0.009678f, -0.999914f, -0.008881f, 254.942760f, 108.790640f }, -{ 432.198181f, -24.549561f, -5.186394f, 0.013545f, -0.999894f, 0.005335f, 225.297815f, 129.578823f }, -{ 542.840820f, -24.549555f, -77.795677f, 0.007103f, -0.999894f, -0.012739f, 250.261958f, 158.682259f }, -{ 407.995087f, -24.549522f, -95.083649f, 0.013879f, -0.999904f, -0.000529f, 219.836900f, 165.611674f }, -{ 494.434692f, -24.549543f, -205.726379f, 0.002522f, -0.999903f, -0.013725f, 239.340159f, 209.959770f }, -{ 300.809937f, -24.549547f, -171.150482f, 0.015764f, -0.999874f, -0.001621f, 195.652869f, 196.100972f }, -{ 331.928192f, -24.549507f, -274.878052f, 0.002234f, -0.999897f, -0.014178f, 202.674041f, 237.677320f }, -{ 155.591354f, -24.549513f, -202.268799f, 0.011551f, -0.999861f, -0.012043f, 162.887410f, 208.573894f }, -{ 138.303436f, -24.549505f, -288.708374f, -0.003900f, -0.999855f, -0.016564f, 158.986767f, 243.220826f }, -{ -10.372740f, -24.549486f, -178.065643f, 0.019735f, -0.999598f, -0.020336f, 125.441172f, 198.872725f }, -{ -76.066864f, -24.549473f, -316.369080f, -0.005668f, -0.999796f, -0.019403f, 110.618699f, 254.307860f }, -{ -148.676147f, -24.549513f, -212.641541f, 0.006169f, -0.999812f, -0.018392f, 94.235969f, 212.731524f }, -{ -235.115784f, -24.549473f, -316.369080f, -0.011969f, -0.999851f, -0.012476f, 74.732718f, 254.307860f }, -{ -276.606812f, -24.549515f, -191.895996f, 0.001960f, -0.999741f, -0.022663f, 65.371153f, 204.416240f }, -{ -394.164703f, -24.549477f, -267.962891f, -0.008901f, -0.999940f, -0.006464f, 38.846733f, 234.905569f }, -{ -352.673676f, -24.549488f, -136.574646f, -0.001484f, -0.999702f, -0.024356f, 48.208294f, 182.242196f }, -{ -490.977112f, -24.549486f, -167.692871f, -0.010745f, -0.999942f, -0.000498f, 17.003084f, 194.715083f }, -{ -404.537445f, -24.549494f, -81.253296f, -0.011367f, -0.999900f, -0.008360f, 36.506343f, 160.068151f }, -{ -563.586426f, -24.549498f, -29.389488f, -0.008846f, -0.999795f, 0.018188f, 0.620349f, 139.279968f }, -{ -421.825378f, -24.549501f, 8.643953f, -0.014278f, -0.999891f, -0.003750f, 32.605693f, 124.035300f }, -{ -522.095337f, -24.549541f, 105.456299f, -0.006669f, -0.999881f, 0.013889f, 9.981924f, 85.230734f }, -{ -363.046448f, -24.549541f, 112.371468f, -0.021114f, -0.999733f, -0.009357f, 45.867897f, 82.458980f }, -{ -446.028503f, -24.549519f, 205.726318f, 0.001853f, -0.999682f, 0.025132f, 27.144776f, 45.040260f }, -{ -304.267487f, -24.549698f, 160.777710f, -0.020407f, -0.999774f, 0.005967f, 59.130113f, 63.056674f }, -{ -325.013000f, -24.549555f, 267.962860f, 0.003703f, -0.999746f, 0.022221f, 54.449330f, 20.094447f }, -{ -203.997513f, -24.549549f, 198.811157f, -0.010313f, -0.999774f, 0.018587f, 81.753890f, 47.811998f }, -{ -138.303391f, -24.549589f, 316.369080f, 0.008523f, -0.999823f, 0.016755f, 96.576363f, 0.692140f }, -{ -44.948593f, -24.549578f, 178.065643f, -0.007338f, -0.999733f, 0.021901f, 117.639871f, 56.127275f }, -{ 79.524475f, -24.549589f, 302.538696f, 0.018197f, -0.999766f, 0.011712f, 145.724552f, 6.235663f }, -{ 107.185158f, -24.549576f, 164.235291f, 0.002913f, -0.999764f, 0.021512f, 151.965595f, 61.670797f }, -{ 257.177246f, -24.933891f, 247.388947f, -0.002196f, -0.999908f, 0.013383f, 189.411841f, 18.708570f }, -{ 248.097778f, -24.933882f, 127.560898f, 0.006178f, -0.999976f, 0.003207f, 187.071440f, 69.986058f }, -{ 449.640747f, -24.933884f, 170.658722f, 0.002530f, -0.999944f, 0.010309f, 236.999758f, 51.969644f }, -{ 357.436859f, -24.933876f, 80.888054f, 0.006209f, -0.999981f, -0.000250f, 214.376000f, 93.546010f }, -{ 521.126526f, -24.933874f, 43.160934f, 0.006734f, -0.999927f, 0.010037f, 254.942760f, 108.790640f }, -{ 404.311340f, -24.933870f, -2.458469f, 0.006431f, -0.999963f, -0.005670f, 225.297815f, 129.578823f }, -{ 501.943878f, -24.933863f, -69.597458f, 0.008351f, -0.999957f, 0.004028f, 250.261958f, 158.682259f }, -{ 380.763092f, -24.933832f, -86.167274f, 0.003817f, -0.999973f, -0.006297f, 219.836900f, 165.611674f }, -{ 459.521820f, -24.933853f, -187.305740f, 0.007558f, -0.999970f, -0.001392f, 239.340159f, 209.959770f }, -{ 277.039581f, -24.933857f, -148.476547f, 0.001550f, -0.999981f, -0.006005f, 195.652869f, 196.100972f }, -{ 310.612000f, -24.933817f, -250.478271f, 0.010282f, -0.999945f, -0.002099f, 202.674041f, 237.677320f }, -{ 143.869293f, -24.933823f, -182.877960f, 0.000385f, -0.999975f, -0.007022f, 162.887410f, 208.573894f }, -{ 126.038422f, -24.933817f, -261.421204f, 0.007580f, -0.999942f, -0.007664f, 158.986767f, 243.220826f }, -{ -12.511669f, -24.933794f, -160.756546f, 0.000504f, -0.999969f, -0.007865f, 125.441172f, 198.872725f }, -{ -76.663612f, -24.933783f, -297.401611f, 0.011523f, -0.999829f, -0.014451f, 110.618699f, 254.307860f }, -{ -148.031876f, -24.933823f, -192.176437f, -0.004257f, -0.999964f, -0.007337f, 94.235969f, 212.731524f }, -{ -229.626144f, -24.933783f, -288.089294f, 0.004915f, -0.999922f, -0.011510f, 74.732718f, 254.307860f }, -{ -271.880676f, -24.933825f, -170.771347f, -0.005194f, -0.999973f, -0.005174f, 65.371153f, 204.416240f }, -{ -371.136383f, -24.933788f, -242.218704f, 0.003027f, -0.999922f, -0.012100f, 38.846733f, 234.905569f }, -{ -331.104309f, -24.933798f, -120.729073f, -0.004534f, -0.999987f, -0.002245f, 48.208294f, 182.242196f }, -{ -457.056519f, -24.933796f, -151.361816f, -0.000889f, -0.999896f, -0.014400f, 17.003084f, 194.715083f }, -{ -375.726990f, -24.933802f, -71.798042f, -0.008099f, -0.999961f, 0.003607f, 36.506343f, 160.068151f }, -{ -521.126587f, -24.933805f, -27.175323f, -0.006509f, -0.999977f, 0.001914f, 0.620349f, 139.279968f }, -{ -393.095642f, -24.933809f, 1.511459f, -0.005247f, -0.999950f, 0.008552f, 32.605693f, 124.035300f }, -{ -489.623932f, -24.933847f, 94.842606f, -0.009209f, -0.999957f, -0.000960f, 9.981924f, 85.230734f }, -{ -339.383545f, -24.933847f, 99.110413f, -0.004875f, -0.999978f, 0.004578f, 45.867897f, 82.458980f }, -{ -420.171265f, -24.933825f, 190.964874f, -0.009048f, -0.999950f, 0.004143f, 27.144776f, 45.040260f }, -{ -291.672363f, -24.934004f, 144.238663f, -0.000427f, -0.999928f, 0.011948f, 59.130113f, 63.056674f }, -{ -309.379486f, -24.933861f, 249.619171f, -0.011270f, -0.999908f, 0.007562f, 54.449330f, 20.094447f }, -{ -195.040344f, -24.933855f, 180.815704f, 0.002731f, -0.999942f, 0.010459f, 81.753890f, 47.811998f }, -{ -136.935654f, -24.933895f, 293.288574f, -0.005146f, -0.999926f, 0.011049f, 96.576363f, 0.692140f }, -{ -48.893070f, -24.933884f, 161.229355f, 0.003108f, -0.999963f, 0.008062f, 117.639871f, 56.127275f }, -{ 72.555756f, -24.933893f, 275.836060f, -0.004433f, -0.999894f, 0.013872f, 145.724552f, 6.235663f }, -{ 102.042297f, -24.933882f, 146.974792f, 0.007025f, -0.999961f, 0.005404f, 151.965595f, 61.670797f } -}; - -static Face face_0[] = { -{ 61, 60, 59, 3, 0 }, -{ 55, 54, 53, 3, 0 }, -{ 57, 56, 55, 3, 0 }, -{ 39, 38, 37, 3, 0 }, -{ 37, 36, 35, 3, 0 }, -{ 53, 52, 51, 3, 0 }, -{ 41, 40, 39, 3, 0 }, -{ 43, 42, 41, 3, 0 }, -{ 59, 58, 57, 3, 0 }, -{ 63, 62, 61, 3, 0 }, -{ 45, 44, 43, 3, 0 }, -{ 35, 34, 67, 3, 0 }, -{ 67, 66, 65, 3, 0 }, -{ 51, 50, 49, 3, 0 }, -{ 49, 48, 47, 3, 0 }, -{ 65, 64, 63, 3, 0 }, -{ 47, 46, 45, 3, 0 }, -{ 41, 39, 37, 3, 0 }, -{ 43, 41, 37, 3, 0 }, -{ 43, 37, 35, 3, 0 }, -{ 45, 43, 35, 3, 0 }, -{ 45, 35, 67, 3, 0 }, -{ 47, 45, 67, 3, 0 }, -{ 47, 67, 65, 3, 0 }, -{ 49, 47, 65, 3, 0 }, -{ 49, 65, 63, 3, 0 }, -{ 51, 49, 63, 3, 0 }, -{ 51, 63, 61, 3, 0 }, -{ 53, 51, 61, 3, 0 }, -{ 53, 61, 59, 3, 0 }, -{ 53, 59, 57, 3, 0 }, -{ 53, 57, 55, 3, 0 }, -{ 61, 27, 26, 4, 2 }, -{ 26, 60, 61, 4, 0 }, -{ 60, 26, 25, 4, 2 }, -{ 25, 59, 60, 4, 0 }, -{ 55, 21, 20, 4, 2 }, -{ 20, 54, 55, 4, 0 }, -{ 54, 20, 19, 4, 2 }, -{ 19, 53, 54, 4, 0 }, -{ 57, 23, 22, 4, 2 }, -{ 22, 56, 57, 4, 0 }, -{ 56, 22, 21, 4, 2 }, -{ 21, 55, 56, 4, 0 }, -{ 39, 5, 4, 4, 2 }, -{ 4, 38, 39, 4, 0 }, -{ 38, 4, 3, 4, 2 }, -{ 3, 37, 38, 4, 0 }, -{ 37, 3, 2, 4, 2 }, -{ 2, 36, 37, 4, 0 }, -{ 36, 2, 1, 4, 2 }, -{ 1, 35, 36, 4, 0 }, -{ 53, 19, 18, 4, 2 }, -{ 18, 52, 53, 4, 0 }, -{ 52, 18, 17, 4, 2 }, -{ 17, 51, 52, 4, 0 }, -{ 41, 7, 6, 4, 2 }, -{ 6, 40, 41, 4, 0 }, -{ 40, 6, 5, 4, 2 }, -{ 5, 39, 40, 4, 0 }, -{ 43, 9, 8, 4, 2 }, -{ 8, 42, 43, 4, 0 }, -{ 42, 8, 7, 4, 2 }, -{ 7, 41, 42, 4, 0 }, -{ 59, 25, 24, 4, 2 }, -{ 24, 58, 59, 4, 0 }, -{ 58, 24, 23, 4, 2 }, -{ 23, 57, 58, 4, 0 }, -{ 63, 29, 28, 4, 2 }, -{ 28, 62, 63, 4, 0 }, -{ 62, 28, 27, 4, 2 }, -{ 27, 61, 62, 4, 0 }, -{ 45, 11, 10, 4, 2 }, -{ 10, 44, 45, 4, 0 }, -{ 44, 10, 9, 4, 2 }, -{ 9, 43, 44, 4, 0 }, -{ 35, 1, 0, 4, 2 }, -{ 0, 34, 35, 4, 0 }, -{ 34, 0, 33, 4, 2 }, -{ 33, 67, 34, 4, 0 }, -{ 67, 33, 32, 4, 2 }, -{ 32, 66, 67, 4, 0 }, -{ 66, 32, 31, 4, 2 }, -{ 31, 65, 66, 4, 0 }, -{ 51, 17, 16, 4, 2 }, -{ 16, 50, 51, 4, 0 }, -{ 50, 16, 15, 4, 2 }, -{ 15, 49, 50, 4, 0 }, -{ 49, 15, 14, 4, 2 }, -{ 14, 48, 49, 4, 0 }, -{ 48, 14, 13, 4, 2 }, -{ 13, 47, 48, 4, 0 }, -{ 65, 31, 30, 4, 2 }, -{ 30, 64, 65, 4, 0 }, -{ 64, 30, 29, 4, 2 }, -{ 29, 63, 64, 4, 0 }, -{ 47, 13, 12, 4, 2 }, -{ 12, 46, 47, 4, 0 }, -{ 46, 12, 11, 4, 2 }, -{ 11, 45, 46, 4, 0 } -}; - -static Vert vert_1[] = { -{ -227.530014f, -20.966743f, 18.889576f, -0.132901f, 0.000004f, -0.991129f, 11.312357f, 104.759467f }, -{ -227.530014f, -20.966749f, 49.094059f, -0.113407f, 0.000000f, 0.993549f, 24.483732f, 68.571409f }, -{ -220.271423f, -20.966749f, 49.922577f, -0.278891f, 0.000000f, 0.960323f, 33.541598f, 70.744057f }, -{ -214.348251f, -20.966755f, 52.198391f, -0.521000f, 0.000000f, 0.853557f, 41.630631f, 70.600333f }, -{ -209.753510f, -20.966747f, 55.606861f, -0.731747f, 0.000000f, 0.681577f, 48.621978f, 68.520264f }, -{ -206.480209f, -20.966747f, 59.833366f, -0.886449f, 0.000000f, 0.462826f, 54.386820f, 64.883859f }, -{ -204.521362f, -20.966749f, 64.563301f, -0.976238f, 0.000000f, 0.216703f, 58.796339f, 60.071098f }, -{ -203.869965f, -20.966747f, 69.481987f, -0.998414f, 0.000000f, -0.056296f, 61.721703f, 54.462037f }, -{ -204.699646f, -20.966759f, 74.975159f, -0.937504f, 0.000000f, -0.347976f, 63.123094f, 47.518821f }, -{ -207.067520f, -20.966751f, 79.783142f, -0.793604f, 0.000000f, -0.608435f, 62.382769f, 40.725774f }, -{ -210.791794f, -20.966751f, 83.766113f, -0.597880f, 0.000001f, -0.801586f, 59.657563f, 34.329668f }, -{ -215.690674f, -20.966751f, 86.784210f, -0.383174f, 0.000001f, -0.923676f, 55.104290f, 28.577385f }, -{ -221.582382f, -20.966751f, 88.697617f, -0.170028f, 0.000001f, -0.985439f, 48.879779f, 23.715683f }, -{ -228.285126f, -20.966751f, 89.366486f, -0.004631f, 0.000001f, -0.999989f, 41.140841f, 19.991411f }, -{ -233.272552f, -20.966751f, 89.153244f, 0.101449f, 0.000001f, -0.994841f, 35.072373f, 18.071997f }, -{ -238.232040f, -20.966751f, 88.499512f, 0.188036f, 0.000001f, -0.982162f, 28.845299f, 16.692535f }, -{ -243.261429f, -20.966751f, 87.384338f, 0.268237f, 0.000001f, -0.963353f, 22.333248f, 15.835422f }, -{ -248.458618f, -20.966747f, 85.786713f, 0.337432f, 0.000001f, -0.941350f, 15.409765f, 15.483181f }, -{ -253.921509f, -20.966747f, 83.685699f, 0.393673f, 0.000001f, -0.919251f, 7.948429f, 15.618211f }, -{ -259.747955f, -20.966747f, 81.060303f, 0.410820f, 0.000001f, -0.911717f, -0.177157f, 16.222941f }, -{ -259.747955f, -20.966751f, 111.264603f, -0.366219f, -0.000001f, 0.930529f, 12.994208f, -19.965071f }, -{ -253.885376f, -20.966755f, 113.571884f, -0.315937f, -0.000001f, 0.948780f, 21.024357f, -20.172935f }, -{ -247.666229f, -20.966757f, 115.459656f, -0.243578f, -0.000001f, 0.969881f, 29.298774f, -19.722674f }, -{ -241.153412f, -20.966763f, 116.927917f, -0.175846f, -0.000001f, 0.984418f, 37.742109f, -18.641708f }, -{ -234.409882f, -20.966763f, 117.976685f, -0.111723f, -0.000001f, 0.993739f, 46.278933f, -16.957548f }, -{ -227.498550f, -20.966763f, 118.605942f, -0.050166f, -0.000001f, 0.998741f, 54.833858f, -14.697611f }, -{ -220.482346f, -20.966763f, 118.815689f, 0.049994f, -0.000001f, 0.998749f, 63.331494f, -11.889319f }, -{ -205.143631f, -20.966763f, 117.432495f, 0.221684f, -0.000001f, 0.975119f, 81.105759f, -3.543264f }, -{ -191.825546f, -20.966755f, 113.455368f, 0.430806f, -0.000001f, 0.902444f, 95.327940f, 7.029456f }, -{ -180.870651f, -20.966755f, 107.142990f, 0.647042f, -0.000001f, 0.762454f, 105.700410f, 19.369521f }, -{ -172.621567f, -20.966755f, 98.754059f, 0.840384f, 0.000000f, 0.541992f, 111.925502f, 33.017599f }, -{ -167.420868f, -20.966753f, 88.547287f, 0.966795f, 0.000000f, 0.255554f, 113.705577f, 47.514307f }, -{ -165.611176f, -20.966751f, 76.781357f, 0.999957f, 0.000000f, -0.009295f, 110.742945f, 62.400328f }, -{ -166.340637f, -20.966751f, 68.696579f, 0.976852f, 0.000000f, -0.213918f, 106.343396f, 71.768664f }, -{ -168.510422f, -20.966749f, 61.101204f, 0.918400f, 0.000000f, -0.395654f, 100.431605f, 79.922555f }, -{ -172.092514f, -20.966755f, 54.065182f, 0.827210f, 0.000000f, -0.561892f, 93.071636f, 86.790413f }, -{ -177.058975f, -20.966747f, 47.658421f, 0.712639f, 0.000000f, -0.701531f, 84.327446f, 92.300650f }, -{ -183.381851f, -20.966743f, 41.950832f, 0.586577f, 0.000000f, -0.809893f, 74.263017f, 96.381707f }, -{ -191.033142f, -20.966743f, 37.012333f, 0.830953f, 0.000000f, 0.556343f, 62.942380f, 98.962027f }, -{ -181.454453f, -20.966751f, 32.298737f, 0.560396f, -0.000001f, 0.828225f, 72.363203f, 108.786445f }, -{ -173.805496f, -20.966743f, 26.319462f, 0.724928f, -0.000003f, 0.688825f, 78.920131f, 119.285616f }, -{ -168.002350f, -20.966745f, 19.235668f, 0.857930f, -0.000002f, 0.513767f, 82.783855f, 130.303376f }, -{ -163.961121f, -20.966740f, 11.208173f, 0.946024f, 0.000000f, 0.324095f, 84.125031f, 141.683643f }, -{ -161.597916f, -20.966740f, 2.397420f, 0.990004f, 0.000000f, 0.141040f, 83.114247f, 153.270415f }, -{ -160.828827f, -20.966740f, -7.035602f, 0.998047f, 0.000000f, -0.062465f, 79.922191f, 164.907572f }, -{ -162.772522f, -20.966736f, -21.426922f, 0.945614f, 0.000000f, -0.325292f, 71.317727f, 181.302331f }, -{ -168.407867f, -20.966743f, -33.734730f, 0.805843f, 0.000000f, -0.592129f, 59.198844f, 193.590982f }, -{ -177.441193f, -20.966736f, -43.721256f, 0.600640f, 0.000000f, -0.799519f, 44.021060f, 201.616710f }, -{ -189.578857f, -20.966732f, -51.148808f, 0.373832f, 0.000000f, -0.927496f, 26.239853f, 205.222777f }, -{ -204.527191f, -20.966740f, -55.779682f, 0.160102f, 0.000000f, -0.987101f, 6.310721f, 204.252461f }, -{ -221.992554f, -20.966740f, -57.376118f, 0.002576f, 0.000000f, -0.999997f, -15.310837f, 198.548949f }, -{ -229.371170f, -20.966740f, -57.068485f, -0.093624f, 0.000000f, -0.995608f, -24.017065f, 194.962735f }, -{ -236.805725f, -20.966740f, -56.173542f, -0.168365f, 0.000000f, -0.985725f, -32.534211f, 190.648469f }, -{ -244.142380f, -20.966740f, -54.733250f, -0.240737f, 0.000000f, -0.970590f, -40.696227f, 185.723508f }, -{ -251.227341f, -20.966732f, -52.789539f, -0.314259f, 0.000000f, -0.949337f, -48.337180f, 180.305151f }, -{ -257.906799f, -20.966732f, -50.384388f, -0.392630f, 0.000000f, -0.919696f, -55.291061f, 174.510773f }, -{ -264.026886f, -20.966732f, -47.559727f, -0.419059f, 0.000000f, -0.907959f, -61.391828f, 168.457698f }, -{ -264.026886f, -20.966738f, -14.334979f, 0.543306f, 0.000000f, 0.839534f, -46.903330f, 128.650867f }, -{ -257.339294f, -20.966736f, -18.662861f, 0.501817f, 0.000000f, 0.864974f, -40.778150f, 136.752428f }, -{ -251.050217f, -20.966736f, -22.109791f, 0.426524f, 0.000000f, 0.904476f, -34.746278f, 143.624739f }, -{ -245.054810f, -20.966736f, -24.717709f, 0.331870f, 0.000000f, 0.943325f, -28.700379f, 149.363753f }, -{ -239.248169f, -20.966736f, -26.528568f, 0.220540f, 0.000000f, 0.975378f, -22.533070f, 154.065492f }, -{ -233.525421f, -20.966736f, -27.584324f, 0.100336f, 0.000000f, 0.994954f, -16.136991f, 157.825952f }, -{ -227.781708f, -20.966736f, -27.926914f, -0.045215f, 0.000000f, 0.998977f, -9.404798f, 160.741110f }, -{ -220.280746f, -20.966736f, -27.192783f, -0.239464f, 0.000000f, 0.970905f, -0.097693f, 163.132527f }, -{ -213.751633f, -20.966736f, -25.074284f, -0.460291f, 0.000000f, 0.887768f, 8.648720f, 163.441519f }, -{ -208.369156f, -20.966736f, -21.697269f, -0.678343f, 0.000000f, 0.734745f, 16.570136f, 161.742661f }, -{ -204.308121f, -20.966736f, -17.187603f, -0.860689f, 0.000000f, 0.509130f, 23.402251f, 158.110511f }, -{ -201.743317f, -20.966747f, -11.671123f, -0.971980f, 0.000000f, 0.235065f, 28.880766f, 152.619616f }, -{ -200.849533f, -20.966740f, -5.273685f, -0.999103f, 0.000000f, -0.042355f, 32.741388f, 145.344557f }, -{ -201.724655f, -20.966740f, 1.288052f, -0.949258f, 0.000000f, -0.314499f, 34.554308f, 137.101264f }, -{ -204.242859f, -20.966745f, 7.031773f, -0.823833f, 0.000000f, -0.566833f, 34.041921f, 129.121540f }, -{ -208.243301f, -20.966740f, 11.810628f, -0.639055f, 0.000000f, -0.769161f, 31.332898f, 121.651460f }, -{ -213.565170f, -20.966740f, 15.477796f, -0.424211f, 0.000001f, -0.905563f, 26.555888f, 114.937053f }, -{ -220.047684f, -20.966743f, 17.886265f, -0.205822f, 0.000004f, -0.978589f, 19.839473f, 109.224409f }, -{ -148.686584f, -20.966757f, 116.550354f, 0.000000f, -0.000001f, 1.000000f, 148.362720f, 22.133174f }, -{ -72.924095f, -20.966761f, 116.550354f, 0.071640f, -0.000001f, 0.997431f, 239.134392f, 55.171337f }, -{ -44.133286f, -20.966759f, 113.442535f, 0.268782f, -0.000001f, 0.963201f, 272.273660f, 71.449816f }, -{ -20.467419f, -20.966759f, 104.692368f, 0.513694f, -0.000001f, 0.857974f, 296.812166f, 92.253563f }, -{ -1.975434f, -20.966759f, 91.159866f, 0.734379f, 0.000000f, 0.678739f, 313.066387f, 116.530870f }, -{ 11.293716f, -20.966763f, 73.704994f, 0.894190f, 0.000000f, 0.447688f, 321.352617f, 143.230046f }, -{ 19.291100f, -20.966763f, 53.187717f, 0.979694f, 0.000000f, 0.200499f, 321.987274f, 171.299429f }, -{ 21.967770f, -20.966759f, 30.467985f, 0.999373f, 0.000000f, -0.035418f, 315.286714f, 199.687265f }, -{ 19.338877f, -20.966749f, 6.999157f, 0.959992f, 0.000000f, -0.280027f, 301.902798f, 226.659149f }, -{ 11.340330f, -20.966751f, -13.645114f, 0.842717f, 0.000000f, -0.538357f, 283.317205f, 247.905254f }, -{ -2.195676f, -20.966743f, -30.821491f, 0.643022f, 0.000000f, -0.765848f, 259.609426f, 262.581684f }, -{ -21.436935f, -20.966740f, -43.886723f, 0.400098f, 0.000000f, -0.916472f, 230.858877f, 269.844599f }, -{ -46.551262f, -20.966736f, -52.197575f, 0.167743f, 0.000000f, -0.985831f, 197.145034f, 268.850158f }, -{ -77.706444f, -20.966743f, -55.110798f, 0.031064f, 0.000000f, -0.999517f, 158.547374f, 258.754495f }, -{ -148.686584f, -20.966743f, -55.110798f, 0.000000f, 0.000000f, -1.000000f, 73.505490f, 227.801797f }, -{ -105.897141f, -20.966753f, 85.087540f, 0.894427f, 0.000000f, -0.447214f, 185.908946f, 78.488452f }, -{ -105.897141f, -20.966742f, -23.647968f, 0.447214f, 0.000000f, 0.894427f, 138.492050f, 208.765350f }, -{ -77.958153f, -20.966742f, -23.647968f, -0.079186f, 0.000000f, 0.996860f, 171.965974f, 220.948864f }, -{ -58.874207f, -20.966740f, -21.368664f, -0.304705f, 0.000000f, 0.952447f, 195.824559f, 226.540055f }, -{ -44.341877f, -20.966745f, -15.146022f, -0.579111f, 0.000000f, 0.815249f, 215.949404f, 225.421851f }, -{ -33.878738f, -20.966743f, -5.902942f, -0.798828f, 0.000000f, 0.601559f, 232.516059f, 218.910357f }, -{ -27.002363f, -20.966749f, 5.437657f, -0.929901f, 0.000000f, 0.367810f, 245.700060f, 208.321713f }, -{ -23.230320f, -20.966747f, 17.952679f, -0.987642f, -0.000001f, 0.156725f, 255.676941f, 194.972086f }, -{ -22.080179f, -20.966755f, 30.719687f, -0.999434f, 0.000000f, -0.033649f, 262.622269f, 180.177463f }, -{ -23.442402f, -20.966751f, 44.972424f, -0.970480f, 0.000000f, -0.241182f, 267.205431f, 162.507202f }, -{ -27.692215f, -20.966751f, 57.903645f, -0.878100f, 0.000000f, -0.478477f, 267.752663f, 145.160958f }, -{ -35.074326f, -20.966751f, 68.947113f, -0.700409f, 0.000000f, -0.713742f, 263.723906f, 128.710531f }, -{ -45.833443f, -20.966755f, 77.536469f, -0.453361f, 0.000001f, -0.891327f, 254.578922f, 113.727776f }, -{ -60.214287f, -20.966755f, 83.105392f, -0.193834f, 0.000001f, -0.981034f, 239.777576f, 100.784454f }, -{ -78.461555f, -20.966755f, 85.087540f, -0.036044f, 0.000001f, -0.999350f, 218.779751f, 90.452444f }, -{ 53.459190f, 2.970489f, -63.834198f, 0.000000f, 0.000000f, -1.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 2.970482f, 19.696451f, 0.000000f, 0.000010f, -1.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 2.970485f, 19.696451f, 0.000000f, 0.000010f, -1.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 2.970482f, 37.767296f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 2.970482f, 37.767296f, -0.894427f, 0.000000f, 0.447214f, 0.000000f, 255.000000f }, -{ 53.459190f, 2.970471f, 52.887688f, -0.994427f, 0.000000f, 0.105425f, 0.000000f, 255.000000f }, -{ 54.761124f, 2.970478f, 61.040325f, -0.930341f, 0.000000f, 0.366696f, 0.000000f, 255.000000f }, -{ 58.744659f, 2.970474f, 68.629539f, -0.769108f, -0.000001f, 0.639119f, 0.000000f, 255.000000f }, -{ 65.526382f, 2.970473f, 75.245560f, -0.554146f, -0.000001f, 0.832420f, 0.000000f, 255.000000f }, -{ 75.222885f, 2.970474f, 80.478622f, -0.334245f, -0.000001f, 0.942486f, 0.000000f, 255.000000f }, -{ 87.950760f, 2.970474f, 83.918953f, -0.139337f, -0.000002f, 0.990245f, 0.000000f, 255.000000f }, -{ 103.826599f, 2.970474f, 85.156792f, -0.014576f, -0.000002f, 0.999894f, 0.000000f, 255.000000f }, -{ 107.486267f, 2.970474f, 85.094475f, 0.038307f, -0.000002f, 0.999266f, 0.000000f, 255.000000f }, -{ 111.371353f, 2.970474f, 84.904106f, 0.070572f, -0.000002f, 0.997507f, 0.000000f, 255.000000f }, -{ 115.334160f, 2.970474f, 84.580559f, 0.105682f, -0.000002f, 0.994400f, 0.000000f, 255.000000f }, -{ 119.227013f, 2.970474f, 84.118721f, 0.147635f, -0.000002f, 0.989042f, 0.000000f, 255.000000f }, -{ 122.902229f, 2.970474f, 83.513466f, 0.202285f, -0.000002f, 0.979327f, 0.000000f, 255.000000f }, -{ 126.212128f, 2.970474f, 82.759666f, 0.996088f, 0.000000f, -0.088370f, 0.000000f, 255.000000f }, -{ 114.179916f, 2.970478f, 65.426537f, 0.125438f, 0.000002f, -0.992102f, 0.000000f, 255.000000f }, -{ 112.235428f, 2.970474f, 65.933624f, -0.222749f, 0.000002f, -0.974876f, 0.000000f, 255.000000f }, -{ 110.283180f, 2.970474f, 66.348511f, -0.174788f, 0.000002f, -0.984606f, 0.000000f, 255.000000f }, -{ 108.268738f, 2.970474f, 66.671196f, -0.124447f, 0.000002f, -0.992226f, 0.000000f, 255.000000f }, -{ 106.137703f, 2.970474f, 66.901688f, -0.075842f, 0.000002f, -0.997120f, 0.000000f, 255.000000f }, -{ 103.835670f, 2.970474f, 67.039986f, -0.032153f, 0.000002f, -0.999483f, 0.000000f, 255.000000f }, -{ 101.308228f, 2.970474f, 67.086082f, 0.055747f, 0.000002f, -0.998445f, 0.000000f, 255.000000f }, -{ 95.838806f, 2.970474f, 66.577293f, 0.226773f, 0.000002f, -0.973948f, 0.000000f, 255.000000f }, -{ 91.224388f, 2.970478f, 65.167015f, 0.433606f, 0.000001f, -0.901103f, 0.000000f, 255.000000f }, -{ 87.527145f, 2.970478f, 63.029404f, 0.640544f, 0.000000f, -0.767921f, 0.000000f, 255.000000f }, -{ 84.809280f, 2.970478f, 60.338612f, 0.827378f, 0.000000f, -0.561646f, 0.000000f, 255.000000f }, -{ 83.132957f, 2.970478f, 57.268784f, 0.960620f, 0.000000f, -0.277867f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970479f, 53.994072f, 0.998339f, 0.000000f, -0.057605f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970478f, 37.767296f, 0.447214f, 0.000000f, 0.894427f, 0.000000f, 255.000000f }, -{ 111.661545f, 2.970478f, 37.767296f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 2.970482f, 19.696451f, 0.000000f, 0.000010f, -1.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970482f, 19.696451f, 0.000000f, 0.000010f, -1.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970489f, -63.834198f, 0.000000f, 0.000000f, -1.000000f, 0.000000f, 255.000000f }, -{ 109.261765f, 2.970490f, -33.040283f, -0.936759f, 0.000000f, 0.349975f, 0.000000f, 255.000000f }, -{ 158.509918f, 2.970482f, 10.661288f, -0.945897f, 0.000000f, -0.324468f, 0.000000f, 255.000000f }, -{ 110.660858f, 2.970478f, 56.206810f, -0.475466f, 0.000000f, 0.879734f, 0.000000f, 255.000000f }, -{ 147.037323f, 2.970478f, 56.206810f, 0.529090f, -0.000002f, 0.848566f, 0.000000f, 255.000000f }, -{ 175.299042f, 2.970477f, 25.597071f, -0.347260f, -0.000006f, 0.937769f, 0.000000f, 255.000000f }, -{ 203.001129f, 2.970478f, 56.206810f, -0.267475f, 0.000000f, 0.963565f, 0.000000f, 255.000000f }, -{ 237.139038f, 2.970478f, 56.206810f, 0.947348f, 0.000000f, -0.320206f, 0.000000f, 255.000000f }, -{ 189.569809f, 2.970482f, 11.767657f, 0.937358f, 0.000000f, 0.348368f, 0.000000f, 255.000000f }, -{ 239.097778f, 2.970486f, -33.040283f, 0.470435f, 0.000000f, -0.882435f, 0.000000f, 255.000000f }, -{ 202.161682f, 2.970486f, -33.040283f, -0.518991f, 0.000000f, -0.854780f, 0.000000f, 255.000000f }, -{ 173.620132f, 2.970482f, -3.168332f, 0.311085f, 0.000000f, -0.950382f, 0.000000f, 255.000000f }, -{ 143.679504f, 2.970490f, -33.040283f, 0.252382f, 0.000000f, -0.967628f, 0.000000f, 255.000000f }, -{ 246.695496f, 2.970477f, 44.635109f, -0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 246.695496f, 2.970479f, 54.095207f, -0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 243.335144f, 2.970479f, 54.095207f, -0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 243.335144f, 2.970478f, 56.104118f, -0.447214f, 0.000000f, 0.894427f, 0.000000f, 255.000000f }, -{ 252.174316f, 2.970478f, 56.104118f, 0.894427f, 0.000000f, 0.447214f, 0.000000f, 255.000000f }, -{ 252.174316f, 2.970475f, 54.095207f, 0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 248.813965f, 2.970479f, 54.095207f, 0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 248.813965f, 2.970477f, 44.635109f, 0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 253.836212f, 2.970477f, 44.635109f, -0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 253.836212f, 2.970478f, 56.341530f, 0.287199f, 0.000000f, 0.957871f, 0.000000f, 255.000000f }, -{ 258.931549f, 2.970471f, 51.191429f, -0.319282f, 0.000000f, 0.947660f, 0.000000f, 255.000000f }, -{ 264.026886f, 2.970478f, 56.341530f, 0.877850f, 0.000000f, 0.478935f, 0.000000f, 255.000000f }, -{ 264.026886f, 2.970477f, 44.635109f, 0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 261.908356f, 2.970477f, 44.635109f, -0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 261.908356f, 2.970467f, 51.721062f, 0.301814f, 0.000000f, -0.953367f, 0.000000f, 255.000000f }, -{ 258.931549f, 2.970471f, 48.634651f, -0.326641f, 0.000000f, -0.945149f, 0.000000f, 255.000000f }, -{ 255.954681f, 2.970471f, 51.721062f, 0.879074f, 0.000000f, -0.476685f, 0.000000f, 255.000000f }, -{ 255.954681f, 2.970477f, 44.635109f, 0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 53.398365f, 9.484123f, -118.046249f, -0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 53.398365f, 9.484118f, -89.641510f, -0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 58.399651f, 9.484118f, -89.641510f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 58.399651f, 9.484123f, -118.046249f, 0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 64.683319f, 9.484123f, -118.046249f, -0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 64.683319f, 9.484118f, -89.641510f, -0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 69.684608f, 9.484118f, -89.641510f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 69.684608f, 9.484118f, -92.719223f, -0.390384f, -0.000002f, 0.920652f, 0.000000f, 255.000000f }, -{ 71.361206f, 9.484118f, -90.693527f, -0.520918f, -0.000002f, 0.853607f, 0.000000f, 255.000000f }, -{ 75.070610f, 9.484118f, -89.192673f, 0.065749f, -0.000003f, 0.997836f, 0.000000f, 255.000000f }, -{ 78.221947f, 9.484118f, -90.116470f, 0.641452f, -0.000002f, 0.767163f, 0.000000f, 255.000000f }, -{ 80.447113f, 9.484106f, -92.906830f, 0.914903f, -0.000001f, 0.403674f, 0.000000f, 255.000000f }, -{ 81.069901f, 9.484118f, -95.010895f, 0.988384f, 0.000000f, 0.151978f, 0.000000f, 255.000000f }, -{ 81.290161f, 9.484118f, -97.592270f, 0.999598f, 0.000000f, 0.028362f, 0.000000f, 255.000000f }, -{ 81.290161f, 9.484123f, -118.046249f, 0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 76.288872f, 9.484123f, -118.046249f, -0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 76.288872f, 9.484118f, -97.720505f, -0.997195f, 0.000000f, -0.074851f, 0.000000f, 255.000000f }, -{ 76.046646f, 9.484118f, -95.573715f, -0.873911f, 0.000001f, -0.486087f, 0.000000f, 255.000000f }, -{ 74.507790f, 9.484118f, -93.751663f, -0.206069f, 0.000002f, -0.978537f, 0.000000f, 255.000000f }, -{ 72.154381f, 9.484118f, -93.999222f, 0.497835f, 0.000001f, -0.867272f, 0.000000f, 255.000000f }, -{ 70.869621f, 9.484118f, -95.136749f, 0.791861f, 0.000001f, -0.610702f, 0.000000f, 255.000000f }, -{ 69.684608f, 9.484118f, -97.015213f, 0.982874f, 0.000000f, -0.184277f, 0.000000f, 255.000000f }, -{ 69.684608f, 9.484123f, -118.046249f, 0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 116.042702f, 9.484123f, -111.377884f, 0.874270f, -0.000001f, 0.485440f, 0.000000f, 255.000000f }, -{ 116.042702f, 9.484123f, -116.315048f, 0.760144f, 0.000001f, -0.649755f, 0.000000f, 255.000000f }, -{ 112.247803f, 9.484123f, -118.552078f, 0.152177f, 0.000001f, -0.988353f, 0.000000f, 255.000000f }, -{ 107.574234f, 9.484123f, -118.394455f, -0.459333f, 0.000001f, -0.888264f, 0.000000f, 255.000000f }, -{ 103.539482f, 9.484123f, -115.040680f, -0.838627f, 0.000001f, -0.544706f, 0.000000f, 255.000000f }, -{ 102.209610f, 9.484123f, -112.118805f, -0.959193f, 0.000000f, -0.282751f, 0.000000f, 255.000000f }, -{ 101.385559f, 9.484118f, -108.374069f, -0.993577f, 0.000000f, -0.113155f, 0.000000f, 255.000000f }, -{ 101.102959f, 9.484118f, -103.811813f, -0.999878f, 0.000000f, 0.015607f, 0.000000f, 255.000000f }, -{ 101.339844f, 9.484118f, -99.454697f, -0.989803f, 0.000000f, 0.142441f, 0.000000f, 255.000000f }, -{ 102.036247f, 9.484118f, -95.777939f, -0.953092f, -0.000001f, 0.302681f, 0.000000f, 255.000000f }, -{ 103.170799f, 9.484106f, -92.831436f, -0.859240f, -0.000001f, 0.511573f, 0.000000f, 255.000000f }, -{ 104.722122f, 9.484118f, -90.665039f, -0.601898f, -0.000001f, 0.798573f, 0.000000f, 255.000000f }, -{ 107.933678f, 9.484118f, -88.927658f, -0.064729f, -0.000002f, 0.997903f, 0.000000f, 255.000000f }, -{ 111.632736f, 9.484118f, -89.470520f, 0.480740f, -0.000002f, 0.876863f, 0.000000f, 255.000000f }, -{ 113.549179f, 9.484118f, -91.009384f, 0.770417f, -0.000001f, 0.637540f, 0.000000f, 255.000000f }, -{ 114.952675f, 9.484106f, -93.103928f, 0.938897f, 0.000000f, 0.344197f, 0.000000f, 255.000000f }, -{ 116.387047f, 9.484118f, -99.154877f, 0.994578f, 0.000000f, 0.103992f, 0.000000f, 255.000000f }, -{ 116.619774f, 9.484118f, -104.965958f, 0.454185f, 0.000001f, -0.890908f, 0.000000f, 255.000000f }, -{ 106.104248f, 9.484118f, -104.965958f, 0.931736f, 0.000000f, -0.363137f, 0.000000f, 255.000000f }, -{ 106.676575f, 9.484123f, -110.009995f, 0.932112f, 0.000000f, 0.362171f, 0.000000f, 255.000000f }, -{ 108.374535f, 9.484123f, -113.130463f, 0.561654f, -0.000001f, 0.827372f, 0.000000f, 255.000000f }, -{ 111.169655f, 9.484123f, -114.199112f, -0.059665f, -0.000002f, 0.998218f, 0.000000f, 255.000000f }, -{ 113.774490f, 9.484123f, -113.485794f, -0.556104f, -0.000002f, 0.831112f, 0.000000f, 255.000000f }, -{ 106.040123f, 9.484118f, -101.247055f, 0.458115f, -0.000001f, 0.888893f, 0.000000f, 255.000000f }, -{ 111.618484f, 9.484118f, -101.247055f, -0.917639f, -0.000001f, 0.397415f, 0.000000f, 255.000000f }, -{ 111.312141f, 9.484118f, -96.746857f, -0.968412f, 0.000000f, -0.249357f, 0.000000f, 255.000000f }, -{ 110.364601f, 9.484118f, -94.098984f, -0.666434f, 0.000002f, -0.745564f, 0.000000f, 255.000000f }, -{ 108.733131f, 9.484106f, -93.232178f, 0.199195f, 0.000001f, -0.979960f, 0.000000f, 255.000000f }, -{ 107.208519f, 9.484118f, -94.113220f, 0.848531f, 0.000001f, -0.529146f, 0.000000f, 255.000000f }, -{ 106.325096f, 9.484118f, -96.775345f, 0.988917f, 0.000000f, -0.148471f, 0.000000f, 255.000000f }, -{ 122.262253f, 9.484123f, -118.046249f, -0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 122.262253f, 9.484118f, -89.641510f, -0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 127.263535f, 9.484118f, -89.641510f, 0.888400f, -0.000001f, 0.459070f, 0.000000f, 255.000000f }, -{ 127.391785f, 9.484118f, -97.335800f, -0.832354f, -0.000001f, 0.554244f, 0.000000f, 255.000000f }, -{ 128.306671f, 9.484118f, -94.372665f, -0.943875f, -0.000001f, 0.330303f, 0.000000f, 255.000000f }, -{ 129.111130f, 9.484118f, -92.203903f, -0.906859f, -0.000001f, 0.421435f, 0.000000f, 255.000000f }, -{ 129.876404f, 9.484118f, -90.715500f, -0.732608f, -0.000001f, 0.680651f, 0.000000f, 255.000000f }, -{ 131.574371f, 9.484118f, -89.323883f, -0.237380f, -0.000001f, 0.971417f, 0.000000f, 255.000000f }, -{ 133.556717f, 9.484118f, -89.280533f, 0.272164f, -0.000002f, 0.962251f, 0.000000f, 255.000000f }, -{ 135.214310f, 9.484118f, -90.026230f, 0.953239f, -0.000001f, 0.302219f, 0.000000f, 255.000000f }, -{ 134.829590f, 9.484118f, -95.155746f, 0.189441f, 0.000002f, -0.981892f, 0.000000f, 255.000000f }, -{ 132.649551f, 9.484118f, -94.450439f, 0.149986f, 0.000002f, -0.988688f, 0.000000f, 255.000000f }, -{ 130.914764f, 9.484118f, -95.135269f, 0.671985f, 0.000002f, -0.740564f, 0.000000f, 255.000000f }, -{ 129.543335f, 9.484118f, -96.915451f, 0.885876f, 0.000001f, -0.463921f, 0.000000f, 255.000000f }, -{ 128.513855f, 9.484118f, -99.379593f, 0.955085f, 0.000001f, -0.296334f, 0.000000f, 255.000000f }, -{ 127.804985f, 9.484118f, -102.116226f, 0.982240f, 0.000000f, -0.187627f, 0.000000f, 255.000000f }, -{ 127.395340f, 9.484118f, -104.713943f, 0.998278f, 0.000000f, -0.058653f, 0.000000f, 255.000000f }, -{ 127.263535f, 9.484123f, -118.046249f, 0.445434f, 0.000001f, -0.895315f, 0.000000f, 255.000000f }, -{ 155.668289f, 9.484123f, -112.788498f, 0.872224f, -0.000001f, 0.489107f, 0.000000f, 255.000000f }, -{ 155.668289f, 9.484123f, -116.571518f, 0.821354f, 0.000001f, -0.570419f, 0.000000f, 255.000000f }, -{ 154.127060f, 9.484123f, -117.804031f, 0.488794f, 0.000002f, -0.872399f, 0.000000f, 255.000000f }, -{ 152.305023f, 9.484123f, -118.637589f, 0.117071f, 0.000003f, -0.993124f, 0.000000f, 255.000000f }, -{ 150.903000f, 9.484123f, -118.586227f, -0.347726f, 0.000002f, -0.937596f, 0.000000f, 255.000000f }, -{ 149.472794f, 9.484123f, -117.781754f, -0.743957f, 0.000001f, -0.668227f, 0.000000f, 255.000000f }, -{ 148.448669f, 9.484123f, -116.186508f, -0.922915f, 0.000001f, -0.385003f, 0.000000f, 255.000000f }, -{ 148.102249f, 9.484123f, -115.096786f, 0.319982f, 0.000002f, -0.947424f, 0.000000f, 255.000000f }, -{ 146.276031f, 9.484123f, -117.172348f, 0.536214f, 0.000002f, -0.844082f, 0.000000f, 255.000000f }, -{ 142.652115f, 9.484123f, -118.815689f, -0.095167f, 0.000003f, -0.995461f, 0.000000f, 255.000000f }, -{ 139.866501f, 9.484123f, -117.808792f, -0.663668f, 0.000002f, -0.748027f, 0.000000f, 255.000000f }, -{ 137.850311f, 9.484123f, -115.206024f, -0.935434f, 0.000001f, -0.353502f, 0.000000f, 255.000000f }, -{ 137.073761f, 9.484123f, -111.634354f, -0.994825f, 0.000000f, 0.101602f, 0.000000f, 255.000000f }, -{ 138.144791f, 9.484118f, -107.571106f, -0.821232f, -0.000001f, 0.570594f, 0.000000f, 255.000000f }, -{ 141.623840f, 9.484118f, -104.049301f, -0.614743f, -0.000001f, 0.788728f, 0.000000f, 255.000000f }, -{ 144.391052f, 9.484118f, -102.166397f, -0.533800f, -0.000001f, 0.845611f, 0.000000f, 255.000000f }, -{ 147.909882f, 9.484118f, -100.028793f, -0.946986f, 0.000000f, 0.321275f, 0.000000f, 255.000000f }, -{ 147.909882f, 9.484118f, -97.335800f, -0.985542f, 0.000000f, -0.169429f, 0.000000f, 255.000000f }, -{ 147.180527f, 9.484118f, -94.538605f, -0.721135f, 0.000001f, -0.692794f, 0.000000f, 255.000000f }, -{ 145.869064f, 9.484118f, -93.718704f, -0.178468f, 0.000002f, -0.983946f, 0.000000f, 255.000000f }, -{ 143.898575f, 9.484118f, -93.732071f, 0.275751f, 0.000003f, -0.961229f, 0.000000f, 255.000000f }, -{ 141.682312f, 9.484118f, -94.706924f, 0.547231f, 0.000002f, -0.836982f, 0.000000f, 255.000000f }, -{ 137.779068f, 9.484118f, -98.297592f, -0.401856f, 0.000002f, -0.915703f, 0.000000f, 255.000000f }, -{ 137.779068f, 9.484118f, -92.526871f, -0.805424f, -0.000001f, 0.592699f, 0.000000f, 255.000000f }, -{ 141.658264f, 9.484118f, -89.665543f, -0.393509f, -0.000002f, 0.919321f, 0.000000f, 255.000000f }, -{ 144.054428f, 9.484118f, -88.951340f, -0.070072f, -0.000003f, 0.997542f, 0.000000f, 255.000000f }, -{ 147.152328f, 9.484118f, -89.072159f, 0.314714f, -0.000002f, 0.949187f, 0.000000f, 255.000000f }, -{ 150.474655f, 9.484118f, -90.715500f, 0.737681f, -0.000002f, 0.675150f, 0.000000f, 255.000000f }, -{ 152.600082f, 9.484118f, -94.111435f, 0.963322f, 0.000000f, 0.268347f, 0.000000f, 255.000000f }, -{ 152.911179f, 9.484118f, -96.502243f, 0.999034f, 0.000000f, 0.043950f, 0.000000f, 255.000000f }, -{ 152.932556f, 9.484123f, -113.100784f, 0.988647f, 0.000000f, 0.150259f, 0.000000f, 255.000000f }, -{ 153.103531f, 9.484123f, -113.846451f, 0.722615f, -0.000001f, 0.691251f, 0.000000f, 255.000000f }, -{ 153.680603f, 9.484123f, -114.199112f, -0.065774f, -0.000002f, 0.997835f, 0.000000f, 255.000000f }, -{ 154.124680f, 9.484123f, -114.032883f, -0.508023f, -0.000002f, 0.861344f, 0.000000f, 255.000000f }, -{ 154.796753f, 9.484123f, -113.553177f, -0.634043f, -0.000002f, 0.773298f, 0.000000f, 255.000000f }, -{ 147.909882f, 9.484123f, -110.800797f, -0.988652f, 0.000000f, 0.150224f, 0.000000f, 255.000000f }, -{ 147.909882f, 9.484118f, -103.491226f, 0.063729f, 0.000001f, -0.997967f, 0.000000f, 255.000000f }, -{ 146.048050f, 9.484118f, -104.727600f, 0.606494f, 0.000001f, -0.795088f, 0.000000f, 255.000000f }, -{ 144.556686f, 9.484118f, -105.944382f, 0.698230f, 0.000002f, -0.715873f, 0.000000f, 255.000000f }, -{ 143.421539f, 9.484118f, -107.154037f, 0.856732f, 0.006809f, -0.515717f, 0.000000f, 255.000000f }, -{ 142.162918f, 9.484122f, -109.601837f, 0.996222f, 0.008519f, -0.086430f, 0.000000f, 255.000000f }, -{ 142.329147f, 9.484123f, -112.551010f, 0.896470f, -0.000001f, 0.443104f, 0.000000f, 255.000000f }, -{ 143.188812f, 9.484123f, -113.667160f, 0.487260f, -0.000002f, 0.873257f, 0.000000f, 255.000000f }, -{ 144.447449f, 9.484123f, -114.070877f, -0.092078f, -0.000002f, 0.995752f, 0.000000f, 255.000000f }, -{ 145.715591f, 9.484123f, -113.693283f, -0.563378f, -0.000001f, 0.826199f, 0.000000f, 255.000000f }, -{ 146.898224f, 9.484123f, -112.589005f, -0.789808f, -0.000001f, 0.613355f, 0.000000f, 255.000000f }, -{ 147.430771f, 9.484123f, -111.777725f, -0.878742f, -0.000001f, 0.477296f, 0.000000f, 255.000000f }, -{ 173.749878f, 9.484123f, -112.467911f, 0.866044f, -0.000001f, 0.499968f, 0.000000f, 255.000000f }, -{ 173.749878f, 9.484123f, -117.276840f, 0.738938f, 0.000002f, -0.673773f, 0.000000f, 255.000000f }, -{ 172.085159f, 9.484123f, -118.160263f, 0.289883f, 0.000003f, -0.957062f, 0.000000f, 255.000000f }, -{ 168.812698f, 9.484123f, -118.815689f, -0.052447f, 0.000003f, -0.998624f, 0.000000f, 255.000000f }, -{ 166.009262f, 9.484123f, -118.315506f, -0.398492f, 0.000002f, -0.917172f, 0.000000f, 255.000000f }, -{ 163.547806f, 9.484123f, -116.887375f, -0.667370f, 0.000002f, -0.744726f, 0.000000f, 255.000000f }, -{ 161.503128f, 9.484123f, -114.639938f, -0.842882f, 0.000001f, -0.538099f, 0.000000f, 255.000000f }, -{ 159.950012f, 9.484123f, -111.681854f, -0.942324f, 0.000000f, -0.334701f, 0.000000f, 255.000000f }, -{ 158.963303f, 9.484118f, -108.121765f, -0.989253f, 0.000000f, -0.146212f, 0.000000f, 255.000000f }, -{ 158.617767f, 9.484118f, -104.068314f, -0.998414f, 0.000000f, 0.056296f, 0.000000f, 255.000000f }, -{ 159.531387f, 9.484118f, -96.903595f, -0.905095f, -0.000001f, 0.425210f, 0.000000f, 255.000000f }, -{ 163.822617f, 9.484118f, -90.542221f, -0.501771f, -0.000002f, 0.865000f, 0.000000f, 255.000000f }, -{ 169.115997f, 9.484118f, -88.872086f, 0.060412f, -0.000003f, 0.998173f, 0.000000f, 255.000000f }, -{ 173.301041f, 9.484118f, -89.897995f, 0.917345f, -0.000001f, 0.398092f, 0.000000f, 255.000000f }, -{ 173.301041f, 9.484118f, -95.027512f, 0.153606f, 0.000003f, -0.988132f, 0.000000f, 255.000000f }, -{ 169.582138f, 9.484118f, -93.616898f, 0.141905f, 0.000002f, -0.989880f, 0.000000f, 255.000000f }, -{ 166.473557f, 9.484118f, -94.882645f, 0.742680f, 0.000001f, -0.669646f, 0.000000f, 255.000000f }, -{ 164.462112f, 9.484118f, -98.442444f, 0.967176f, 0.000000f, -0.254107f, 0.000000f, 255.000000f }, -{ 163.747299f, 9.484118f, -103.940063f, 0.998594f, 0.000000f, 0.053008f, 0.000000f, 255.000000f }, -{ 164.523849f, 9.484122f, -109.302322f, 0.912953f, -0.000001f, 0.408064f, 0.000000f, 255.000000f }, -{ 166.711029f, 9.484123f, -112.812241f, 0.468894f, -0.000002f, 0.883254f, 0.000000f, 255.000000f }, -{ 171.313354f, 9.484123f, -113.911758f, -0.280562f, -0.000002f, 0.959836f, 0.000000f, 255.000000f }, -{ 188.369019f, 9.484123f, -113.301437f, 0.869996f, -0.000001f, 0.493059f, 0.000000f, 255.000000f }, -{ 188.369019f, 9.484123f, -117.725662f, 0.673699f, 0.000002f, -0.739006f, 0.000000f, 255.000000f }, -{ 186.637802f, 9.484123f, -118.378738f, 0.251252f, 0.000003f, -0.967922f, 0.000000f, 255.000000f }, -{ 184.602036f, 9.484123f, -118.792831f, 0.027993f, 0.000002f, -0.999608f, 0.000000f, 255.000000f }, -{ 182.419891f, 9.484123f, -118.666077f, -0.249737f, 0.000002f, -0.968314f, 0.000000f, 255.000000f }, -{ 181.128311f, 9.484123f, -118.195877f, -0.534105f, 0.000002f, -0.845418f, 0.000000f, 255.000000f }, -{ 180.089645f, 9.484123f, -117.373001f, -0.779634f, 0.000001f, -0.626236f, 0.000000f, 255.000000f }, -{ 179.323486f, 9.484123f, -116.165436f, -0.929593f, 0.000001f, -0.368587f, 0.000000f, 255.000000f }, -{ 178.849426f, 9.484123f, -114.541092f, -0.989265f, 0.000000f, -0.146131f, 0.000000f, 255.000000f }, -{ 178.687042f, 9.484123f, -112.467911f, -0.999661f, 0.000000f, -0.026047f, 0.000000f, 255.000000f }, -{ 178.687042f, 9.484118f, -94.001602f, -0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 175.416977f, 9.484118f, -94.001602f, -0.996832f, -0.000001f, 0.079535f, 0.000000f, 255.000000f }, -{ 178.200211f, 9.484118f, -89.945480f, -0.823749f, -0.000001f, 0.566955f, 0.000000f, 255.000000f }, -{ 180.755478f, 9.484117f, -86.238449f, -0.837145f, -0.000001f, 0.546981f, 0.000000f, 255.000000f }, -{ 183.239502f, 9.484117f, -82.331924f, -0.315664f, -0.000001f, 0.948871f, 0.000000f, 255.000000f }, -{ 183.688324f, 9.484117f, -82.331924f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 183.688324f, 9.484118f, -89.641510f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 188.369019f, 9.484118f, -89.641510f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 188.369019f, 9.484118f, -94.001602f, 0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 183.688324f, 9.484118f, -94.001602f, 0.896316f, -0.004678f, -0.443391f, 0.000000f, 255.000000f }, -{ 183.724243f, 9.484123f, -111.466034f, 0.997969f, -0.005230f, 0.063485f, 0.000000f, 255.000000f }, -{ 183.847443f, 9.484123f, -112.446518f, 0.909068f, 0.001063f, 0.416646f, 0.000000f, 255.000000f }, -{ 184.448257f, 9.484123f, -113.686172f, 0.726480f, -0.015559f, 0.687011f, 0.000000f, 255.000000f }, -{ 184.972198f, 9.484123f, -113.977371f, 0.170193f, -0.000003f, 0.985411f, 0.000000f, 255.000000f }, -{ 186.488205f, 9.484123f, -113.985397f, -0.229252f, -0.000002f, 0.973367f, 0.000000f, 255.000000f }, -{ 192.280289f, 9.484123f, -118.046249f, -0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 192.280289f, 9.484118f, -89.641510f, -0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 197.281570f, 9.484118f, -89.641510f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 197.281570f, 9.484123f, -118.046249f, 0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 209.400085f, 9.484123f, -118.687454f, -0.775277f, 0.000002f, -0.631621f, 0.000000f, 255.000000f }, -{ 200.872238f, 9.484118f, -89.641510f, -0.487542f, -0.000001f, 0.873100f, 0.000000f, 255.000000f }, -{ 205.873535f, 9.484118f, -89.641510f, 0.791121f, -0.000001f, 0.611659f, 0.000000f, 255.000000f }, -{ 210.041275f, 9.484118f, -105.863632f, 0.395561f, -0.000001f, 0.918440f, 0.000000f, 255.000000f }, -{ 210.169510f, 9.484118f, -105.863632f, -0.791121f, -0.000001f, 0.611659f, 0.000000f, 255.000000f }, -{ 214.337250f, 9.484118f, -89.641510f, -0.395561f, -0.000001f, 0.918440f, 0.000000f, 255.000000f }, -{ 219.338531f, 9.484118f, -89.641510f, 0.975084f, 0.000000f, 0.221838f, 0.000000f, 255.000000f }, -{ 210.810699f, 9.484123f, -118.687454f, 0.387639f, 0.000002f, -0.921811f, 0.000000f, 255.000000f }, -{ -227.530014f, 20.966755f, 18.889763f, -0.132902f, 0.000004f, -0.991129f, 11.312366f, 104.759421f }, -{ -227.530014f, 20.966747f, 49.094074f, -0.113407f, 0.000000f, 0.993549f, 24.483732f, 68.571394f }, -{ -220.271423f, 20.966747f, 49.922592f, -0.196555f, 0.000000f, 0.980493f, 33.541610f, 70.744042f }, -{ -214.348251f, 20.966747f, 52.198406f, -0.441307f, 0.000000f, 0.897356f, 41.630631f, 70.600318f }, -{ -209.753510f, 20.966751f, 55.606876f, -0.666260f, 0.000000f, 0.745720f, 48.621982f, 68.520264f }, -{ -206.480209f, 20.966751f, 59.833382f, -0.841668f, 0.000000f, 0.539995f, 54.386827f, 64.883844f }, -{ -204.521362f, 20.966751f, 64.563332f, -0.953587f, 0.000000f, 0.301119f, 58.796350f, 60.071068f }, -{ -203.869965f, 20.966747f, 69.482018f, -0.999275f, 0.000000f, 0.038078f, 61.721714f, 54.462006f }, -{ -204.699646f, 20.966745f, 74.975189f, -0.968387f, 0.000000f, -0.249452f, 63.123110f, 47.518791f }, -{ -207.067520f, 20.966745f, 79.783180f, -0.849701f, 0.000000f, -0.527265f, 62.382784f, 40.725728f }, -{ -210.791794f, 20.966745f, 83.766144f, -0.667060f, 0.000001f, -0.745004f, 59.657578f, 34.329638f }, -{ -215.690674f, 20.966745f, 86.784241f, -0.455510f, 0.000001f, -0.890230f, 55.104305f, 28.577339f }, -{ -221.582382f, 20.966745f, 88.697647f, -0.240248f, 0.000001f, -0.970712f, 48.879791f, 23.715652f }, -{ -228.285126f, 20.966745f, 89.366524f, -0.052076f, 0.000001f, -0.998643f, 41.140860f, 19.991366f }, -{ -233.272552f, 20.966745f, 89.153275f, 0.072102f, 0.000001f, -0.997397f, 35.072392f, 18.071967f }, -{ -238.232040f, 20.966745f, 88.499550f, 0.159415f, 0.000001f, -0.987212f, 28.845318f, 16.692474f }, -{ -243.261429f, 20.966745f, 87.384369f, 0.242432f, 0.000001f, -0.970168f, 22.333258f, 15.835392f }, -{ -248.458618f, 20.966745f, 85.786751f, 0.315709f, 0.000001f, -0.948856f, 15.409784f, 15.483151f }, -{ -253.921509f, 20.966745f, 83.685738f, 0.376381f, 0.000001f, -0.926465f, 7.948449f, 15.618150f }, -{ -259.747955f, 20.966745f, 81.060341f, 0.410820f, 0.000001f, -0.911717f, -0.177137f, 16.222895f }, -{ -259.747955f, 20.966743f, 111.264641f, -0.366218f, -0.000001f, 0.930529f, 12.994218f, -19.965132f }, -{ -253.885376f, 20.966743f, 113.571915f, -0.341209f, -0.000001f, 0.939987f, 21.024369f, -20.172966f }, -{ -247.666229f, 20.966742f, 115.459694f, -0.267103f, -0.000001f, 0.963668f, 29.298793f, -19.722705f }, -{ -241.153412f, 20.966742f, 116.927956f, -0.197940f, -0.000001f, 0.980214f, 37.742128f, -18.641769f }, -{ -234.409882f, 20.966742f, 117.976715f, -0.132733f, -0.000001f, 0.991152f, 46.278944f, -16.957608f }, -{ -227.498550f, 20.966742f, 118.605980f, -0.070438f, -0.000001f, 0.997516f, 54.833877f, -14.697672f }, -{ -220.482346f, 20.966742f, 118.815727f, 0.010033f, -0.000001f, 0.999950f, 63.331513f, -11.889380f }, -{ -205.143631f, 20.966742f, 117.432526f, 0.155949f, -0.000001f, 0.987765f, 81.105774f, -3.543295f }, -{ -191.825546f, 20.966743f, 113.455399f, 0.359337f, -0.000001f, 0.933208f, 95.327947f, 7.029410f }, -{ -180.870651f, 20.966740f, 107.143021f, 0.575202f, -0.000001f, 0.818011f, 105.700425f, 19.369491f }, -{ -172.621567f, 20.966740f, 98.754097f, 0.780436f, -0.000001f, 0.625235f, 111.925517f, 33.017553f }, -{ -167.420868f, 20.966738f, 88.547325f, 0.933968f, 0.000000f, 0.357358f, 113.705593f, 47.514262f }, -{ -165.611176f, 20.966738f, 76.781395f, 0.997415f, 0.000000f, 0.071862f, 110.742960f, 62.400282f }, -{ -166.340637f, 20.966747f, 68.696609f, 0.988370f, 0.000000f, -0.152067f, 106.343412f, 71.768634f }, -{ -168.510422f, 20.966751f, 61.101219f, 0.941956f, 0.000000f, -0.335737f, 100.431613f, 79.922540f }, -{ -172.092514f, 20.966747f, 54.065197f, 0.860949f, 0.000000f, -0.508692f, 93.071636f, 86.790398f }, -{ -177.058975f, 20.966749f, 47.658436f, 0.752871f, 0.000000f, -0.658168f, 84.327446f, 92.300634f }, -{ -183.381851f, 20.966749f, 41.950848f, 0.629290f, 0.000000f, -0.777170f, 74.263017f, 96.381691f }, -{ -191.033142f, 20.966749f, 37.012348f, 0.889699f, 0.000000f, -0.456548f, 62.942388f, 98.962011f }, -{ -181.454453f, 20.966749f, 32.298752f, 0.502007f, 0.000000f, 0.864864f, 72.363211f, 108.786445f }, -{ -173.805496f, 20.966751f, 26.319649f, 0.672072f, -0.000002f, 0.740485f, 78.920146f, 119.285570f }, -{ -168.002350f, 20.966755f, 19.235847f, 0.817837f, -0.000002f, 0.575450f, 82.783870f, 130.303345f }, -{ -163.961121f, 20.966755f, 11.208177f, 0.921693f, -0.000001f, 0.387921f, 84.125031f, 141.683643f }, -{ -161.597916f, 20.966753f, 2.397416f, 0.979689f, 0.000000f, 0.200522f, 83.114247f, 153.270422f }, -{ -160.828827f, 20.966753f, -7.035606f, 0.999954f, 0.000000f, 0.009609f, 79.922183f, 164.907587f }, -{ -162.772522f, 20.966755f, -21.426933f, 0.973138f, 0.000000f, -0.230221f, 71.317727f, 181.302347f }, -{ -168.407867f, 20.966755f, -33.734711f, 0.862300f, 0.000000f, -0.506399f, 59.198847f, 193.590963f }, -{ -177.441193f, 20.966757f, -43.721252f, 0.674528f, 0.000000f, -0.738249f, 44.021060f, 201.616710f }, -{ -189.578857f, 20.966757f, -51.148804f, 0.449703f, 0.000000f, -0.893178f, 26.239853f, 205.222777f }, -{ -204.527191f, 20.966757f, -55.779663f, 0.228732f, 0.000000f, -0.973489f, 6.310730f, 204.252446f }, -{ -221.992554f, 20.966764f, -57.376114f, 0.046891f, 0.000000f, -0.998900f, -15.310837f, 198.548949f }, -{ -229.371170f, 20.966764f, -57.068481f, -0.067655f, 0.000000f, -0.997709f, -24.017065f, 194.962735f }, -{ -236.805725f, 20.966764f, -56.173538f, -0.143976f, 0.000000f, -0.989581f, -32.534211f, 190.648469f }, -{ -244.142380f, 20.966764f, -54.733246f, -0.216746f, 0.000000f, -0.976228f, -40.696227f, 185.723508f }, -{ -251.227341f, 20.966764f, -52.789536f, -0.289503f, 0.000000f, -0.957177f, -48.337180f, 180.305151f }, -{ -257.906799f, 20.966764f, -50.384384f, -0.365851f, 0.000000f, -0.930674f, -55.291061f, 174.510773f }, -{ -264.026886f, 20.966764f, -47.559723f, -0.419059f, 0.000000f, -0.907959f, -61.391828f, 168.457698f }, -{ -264.026886f, 20.966753f, -14.334975f, 0.543307f, 0.000000f, 0.839534f, -46.903330f, 128.650867f }, -{ -257.339294f, 20.966755f, -18.662872f, 0.522722f, 0.000000f, 0.852503f, -40.778150f, 136.752450f }, -{ -251.050217f, 20.966759f, -22.109795f, 0.453797f, 0.000000f, 0.891105f, -34.746278f, 143.624746f }, -{ -245.054810f, 20.966759f, -24.717712f, 0.365635f, 0.000000f, 0.930758f, -28.700388f, 149.363761f }, -{ -239.248169f, 20.966759f, -26.528572f, 0.259367f, 0.000000f, 0.965779f, -22.533070f, 154.065507f }, -{ -233.525421f, 20.966759f, -27.584328f, 0.141032f, 0.000000f, 0.990005f, -16.136991f, 157.825968f }, -{ -227.781708f, 20.966759f, -27.926926f, 0.007245f, 0.000000f, 0.999974f, -9.404798f, 160.741125f }, -{ -220.280746f, 20.966759f, -27.192787f, -0.168689f, 0.000000f, 0.985669f, -0.097693f, 163.132535f }, -{ -213.751633f, 20.966759f, -25.074295f, -0.385508f, 0.000000f, 0.922705f, 8.648710f, 163.441542f }, -{ -208.369156f, 20.966755f, -21.697281f, -0.607191f, 0.000000f, 0.794556f, 16.570136f, 161.742676f }, -{ -204.308121f, 20.966755f, -17.187607f, -0.805587f, 0.000000f, 0.592477f, 23.402251f, 158.110519f }, -{ -201.743317f, 20.966753f, -11.671119f, -0.943840f, 0.000000f, 0.330403f, 28.880766f, 152.619616f }, -{ -200.849533f, 20.966753f, -5.273689f, -0.998820f, 0.000000f, 0.048575f, 32.741376f, 145.344564f }, -{ -201.724655f, 20.966753f, 1.288060f, -0.974605f, 0.000000f, -0.223930f, 34.554308f, 137.101256f }, -{ -204.242859f, 20.966751f, 7.031769f, -0.873964f, 0.000000f, -0.485991f, 34.041921f, 129.121548f }, -{ -208.243301f, 20.966755f, 11.810632f, -0.706060f, 0.000000f, -0.708152f, 31.332898f, 121.651460f }, -{ -213.565170f, 20.966755f, 15.477799f, -0.497756f, 0.000000f, -0.867317f, 26.555888f, 114.937053f }, -{ -220.047684f, 20.966755f, 17.886444f, -0.278017f, 0.000003f, -0.960576f, 19.839494f, 109.224379f }, -{ -148.686584f, 20.966726f, 116.550392f, 0.000000f, -0.000001f, 1.000000f, 148.362750f, 22.133128f }, -{ -72.924095f, 20.966726f, 116.550392f, 0.035820f, -0.000001f, 0.999358f, 239.134392f, 55.171292f }, -{ -44.133286f, 20.966728f, 113.442566f, 0.188416f, -0.000001f, 0.982089f, 272.273660f, 71.449770f }, -{ -20.467419f, 20.966740f, 104.692406f, 0.431738f, -0.000001f, 0.901999f, 296.812196f, 92.253517f }, -{ -1.975434f, 20.966738f, 91.159897f, 0.665230f, -0.000001f, 0.746638f, 313.066387f, 116.530840f }, -{ 11.293716f, 20.966730f, 73.705025f, 0.848586f, 0.000000f, 0.529057f, 321.352617f, 143.230008f }, -{ 19.291100f, 20.966740f, 53.187733f, 0.959076f, 0.000000f, 0.283149f, 321.987274f, 171.299414f }, -{ 21.967770f, 20.966734f, 30.467978f, 0.999154f, 0.000000f, 0.041134f, 315.286714f, 199.687280f }, -{ 19.338877f, 20.966743f, 6.999154f, 0.980586f, 0.000000f, -0.196088f, 301.902798f, 226.659158f }, -{ 11.340330f, 20.966745f, -13.645118f, 0.892215f, 0.000000f, -0.451610f, 283.317205f, 247.905264f }, -{ -2.195676f, 20.966759f, -30.821503f, 0.718364f, 0.000000f, -0.695667f, 259.609396f, 262.581703f }, -{ -21.436935f, 20.966757f, -43.886719f, 0.483336f, 0.000000f, -0.875435f, 230.858877f, 269.844599f }, -{ -46.551262f, 20.966757f, -52.197571f, 0.241852f, 0.000000f, -0.970313f, 197.145034f, 268.850158f }, -{ -77.706444f, 20.966757f, -55.110794f, 0.062127f, 0.000000f, -0.998068f, 158.547374f, 258.754495f }, -{ -148.686584f, 20.966757f, -55.110794f, 0.000000f, 0.000000f, -1.000000f, 73.505490f, 227.801797f }, -{ -105.897141f, 20.966738f, 85.087578f, 0.447214f, 0.000001f, -0.894427f, 185.908961f, 78.488406f }, -{ -105.897141f, 20.966759f, -23.647980f, 0.894427f, 0.000000f, 0.447214f, 138.492035f, 208.765369f }, -{ -77.958153f, 20.966759f, -23.647980f, -0.039593f, 0.000000f, 0.999216f, 171.965959f, 220.948887f }, -{ -58.874207f, 20.966755f, -21.368675f, -0.212191f, 0.000000f, 0.977228f, 195.824544f, 226.540074f }, -{ -44.341877f, 20.966753f, -15.146018f, -0.488613f, 0.000000f, 0.872501f, 215.949404f, 225.421851f }, -{ -33.878738f, 20.966745f, -5.902946f, -0.733828f, 0.000000f, 0.679335f, 232.516059f, 218.910365f }, -{ -27.002363f, 20.966743f, 5.437653f, -0.895536f, 0.000000f, 0.444989f, 245.700045f, 208.321724f }, -{ -23.230320f, 20.966747f, 17.952866f, -0.974747f, -0.000001f, 0.223313f, 255.676941f, 194.972041f }, -{ -22.080179f, 20.966734f, 30.719679f, -0.999602f, 0.000000f, 0.028209f, 262.622269f, 180.177478f }, -{ -23.442402f, 20.966742f, 44.972439f, -0.985715f, 0.000000f, -0.168424f, 267.205431f, 162.507187f }, -{ -27.692215f, 20.966743f, 57.903660f, -0.917976f, 0.000000f, -0.396636f, 267.752663f, 145.160943f }, -{ -35.074326f, 20.966740f, 68.947144f, -0.770297f, 0.000000f, -0.637685f, 263.723906f, 128.710501f }, -{ -45.833443f, 20.966738f, 77.536499f, -0.541864f, 0.000001f, -0.840466f, 254.578922f, 113.727730f }, -{ -60.214287f, 20.966738f, 83.105423f, -0.278852f, 0.000001f, -0.960334f, 239.777591f, 100.784424f }, -{ -78.461555f, 20.966738f, 85.087578f, -0.072088f, 0.000001f, -0.997398f, 218.779751f, 90.452398f }, -{ 53.459190f, 21.106728f, -63.834198f, 0.000000f, 0.000000f, -1.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 21.106720f, 19.696632f, 0.000000f, 0.000010f, -1.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 21.106720f, 19.696632f, 0.000000f, 0.000010f, -1.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 21.106718f, 37.767292f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 21.106718f, 37.767292f, -0.447214f, 0.000000f, 0.894427f, 0.000000f, 255.000000f }, -{ 53.459190f, 21.106716f, 52.887684f, -0.998610f, 0.000000f, 0.052712f, 0.000000f, 255.000000f }, -{ 54.761124f, 21.106716f, 61.040321f, -0.964760f, 0.000000f, 0.263130f, 0.000000f, 255.000000f }, -{ 58.744659f, 21.106709f, 68.629570f, -0.832175f, -0.000001f, 0.554513f, 0.000000f, 255.000000f }, -{ 65.526382f, 21.106707f, 75.245590f, -0.629247f, -0.000001f, 0.777205f, 0.000000f, 255.000000f }, -{ 75.222885f, 21.106714f, 80.478653f, -0.406003f, -0.000001f, 0.913872f, 0.000000f, 255.000000f }, -{ 87.950760f, 21.106714f, 83.918983f, -0.200640f, -0.000002f, 0.979665f, 0.000000f, 255.000000f }, -{ 103.826599f, 21.106714f, 85.156822f, -0.046194f, -0.000002f, 0.998932f, 0.000000f, 255.000000f }, -{ 107.486267f, 21.106707f, 85.094505f, 0.027667f, -0.000002f, 0.999617f, 0.000000f, 255.000000f }, -{ 111.371353f, 21.106707f, 84.904137f, 0.059760f, -0.000002f, 0.998213f, 0.000000f, 255.000000f }, -{ 115.334160f, 21.106707f, 84.580589f, 0.093534f, -0.000002f, 0.995616f, 0.000000f, 255.000000f }, -{ 119.227013f, 21.106707f, 84.118752f, 0.132736f, -0.000002f, 0.991151f, 0.000000f, 255.000000f }, -{ 122.902229f, 21.106707f, 83.513496f, 0.182424f, -0.000002f, 0.983220f, 0.000000f, 255.000000f }, -{ 126.212128f, 21.106707f, 82.759697f, 0.675942f, -0.000001f, 0.736955f, 0.000000f, 255.000000f }, -{ 114.179916f, 21.106716f, 65.426567f, 0.550632f, 0.000001f, -0.834748f, 0.000000f, 255.000000f }, -{ 112.235428f, 21.106709f, 65.933655f, -0.237575f, 0.000002f, -0.971369f, 0.000000f, 255.000000f }, -{ 110.283180f, 21.106709f, 66.348541f, -0.191361f, 0.000002f, -0.981520f, 0.000000f, 255.000000f }, -{ 108.268738f, 21.106709f, 66.671227f, -0.141331f, 0.000002f, -0.989962f, 0.000000f, 255.000000f }, -{ 106.137703f, 21.106709f, 66.901718f, -0.091701f, 0.000002f, -0.995787f, 0.000000f, 255.000000f }, -{ 103.835670f, 21.106709f, 67.040016f, -0.046066f, 0.000002f, -0.998938f, 0.000000f, 255.000000f }, -{ 101.308228f, 21.106709f, 67.086113f, 0.018743f, 0.000002f, -0.999824f, 0.000000f, 255.000000f }, -{ 95.838806f, 21.106709f, 66.577324f, 0.159913f, 0.000002f, -0.987131f, 0.000000f, 255.000000f }, -{ 91.224388f, 21.106716f, 65.167046f, 0.363788f, 0.000001f, -0.931482f, 0.000000f, 255.000000f }, -{ 87.527145f, 21.106716f, 63.029400f, 0.572373f, 0.000000f, -0.819993f, 0.000000f, 255.000000f }, -{ 84.809280f, 21.106716f, 60.338608f, 0.768792f, 0.000000f, -0.639499f, 0.000000f, 255.000000f }, -{ 83.132957f, 21.106716f, 57.268780f, 0.924396f, 0.000000f, -0.381433f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106716f, 53.994068f, 0.993341f, 0.000000f, -0.115210f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106718f, 37.767292f, 0.894427f, 0.000000f, 0.447214f, 0.000000f, 255.000000f }, -{ 111.661545f, 21.106718f, 37.767292f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 21.106720f, 19.696632f, 0.000000f, 0.000010f, -1.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106720f, 19.696632f, 0.000000f, 0.000010f, -1.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106728f, -63.834198f, 0.000000f, 0.000000f, -1.000000f, 0.000000f, 255.000000f }, -{ 109.261765f, 21.106724f, -33.040283f, -0.468379f, 0.000000f, -0.883527f, 0.000000f, 255.000000f }, -{ 158.509918f, 21.106720f, 10.661286f, -0.933984f, 0.000000f, 0.357316f, 0.000000f, 255.000000f }, -{ 110.660858f, 21.106716f, 56.206806f, -0.950931f, 0.000000f, -0.309402f, 0.000000f, 255.000000f }, -{ 147.037323f, 21.106716f, 56.206806f, 0.264544f, 0.000000f, 0.964374f, 0.000000f, 255.000000f }, -{ 175.299042f, 21.106712f, 25.597252f, 0.337904f, -0.000006f, 0.941181f, 0.000000f, 255.000000f }, -{ 203.001129f, 21.106716f, 56.206806f, -0.534949f, -0.000002f, 0.844884f, 0.000000f, 255.000000f }, -{ 237.139038f, 21.106712f, 56.206806f, 0.473674f, 0.000000f, 0.880700f, 0.000000f, 255.000000f }, -{ 189.569809f, 21.106720f, 11.767655f, 0.942807f, 0.000000f, -0.333339f, 0.000000f, 255.000000f }, -{ 239.097778f, 21.106724f, -33.040283f, 0.940870f, 0.000000f, 0.338768f, 0.000000f, 255.000000f }, -{ 202.161682f, 21.106724f, -33.040283f, -0.259495f, 0.000000f, -0.965744f, 0.000000f, 255.000000f }, -{ 173.620132f, 21.106722f, -3.168342f, -0.333727f, 0.000000f, -0.942670f, 0.000000f, 255.000000f }, -{ 143.679504f, 21.106724f, -33.040283f, 0.504764f, 0.000000f, -0.863257f, 0.000000f, 255.000000f }, -{ 246.695496f, 21.106710f, 44.635105f, -0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 246.695496f, 21.106709f, 54.095203f, -0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 243.335144f, 21.106709f, 54.095203f, -0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 243.335144f, 21.106712f, 56.104115f, -0.894427f, 0.000000f, 0.447214f, 0.000000f, 255.000000f }, -{ 252.174316f, 21.106712f, 56.104115f, 0.447214f, 0.000000f, 0.894427f, 0.000000f, 255.000000f }, -{ 252.174316f, 21.106709f, 54.095203f, 0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 248.813965f, 21.106709f, 54.095203f, 0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 248.813965f, 21.106710f, 44.635105f, 0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 253.836212f, 21.106710f, 44.635105f, -0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 253.836212f, 21.106712f, 56.341526f, -0.877850f, 0.000000f, 0.478935f, 0.000000f, 255.000000f }, -{ 258.931549f, 21.106709f, 51.191425f, 0.319282f, 0.000000f, 0.947660f, 0.000000f, 255.000000f }, -{ 264.026886f, 21.106712f, 56.341526f, -0.287199f, 0.000000f, 0.957871f, 0.000000f, 255.000000f }, -{ 264.026886f, 21.106710f, 44.635105f, 0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 261.908356f, 21.106710f, 44.635105f, -0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 261.908356f, 21.106709f, 51.721058f, -0.879075f, 0.000000f, -0.476683f, 0.000000f, 255.000000f }, -{ 258.931549f, 21.106709f, 48.634647f, 0.326650f, 0.000000f, -0.945145f, 0.000000f, 255.000000f }, -{ 255.954681f, 21.106709f, 51.721058f, -0.301802f, 0.000000f, -0.953371f, 0.000000f, 255.000000f }, -{ 255.954681f, 21.106710f, 44.635105f, 0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 53.398365f, 21.091320f, -118.046234f, -0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 53.398365f, 21.091311f, -89.641495f, -0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 58.399651f, 21.091311f, -89.641495f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 58.399651f, 21.091320f, -118.046234f, 0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 64.683319f, 21.091320f, -118.046234f, -0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 64.683319f, 21.091311f, -89.641495f, -0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 69.684608f, 21.091311f, -89.641495f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 69.684608f, 21.091311f, -92.719193f, 0.887750f, -0.000001f, 0.460327f, 0.000000f, 255.000000f }, -{ 71.361206f, 21.091311f, -90.693512f, -0.656342f, -0.000001f, 0.754463f, 0.000000f, 255.000000f }, -{ 75.070610f, 21.091311f, -89.192642f, -0.164366f, -0.000002f, 0.986400f, 0.000000f, 255.000000f }, -{ 78.221947f, 21.091311f, -90.116440f, 0.467430f, -0.000002f, 0.884030f, 0.000000f, 255.000000f }, -{ 80.447113f, 21.091311f, -92.906815f, 0.854905f, -0.000001f, 0.518785f, 0.000000f, 255.000000f }, -{ 81.069901f, 21.091311f, -95.010880f, 0.975826f, 0.000000f, 0.218549f, 0.000000f, 255.000000f }, -{ 81.290161f, 21.091311f, -97.592255f, 0.998390f, 0.000000f, 0.056724f, 0.000000f, 255.000000f }, -{ 81.290161f, 21.091320f, -118.046234f, 0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 76.288872f, 21.091320f, -118.046234f, -0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 76.288872f, 21.091311f, -97.720490f, -0.999299f, 0.000000f, -0.037426f, 0.000000f, 255.000000f }, -{ 76.046646f, 21.091311f, -95.573685f, -0.953521f, 0.000001f, -0.301328f, 0.000000f, 255.000000f }, -{ 74.507790f, 21.091311f, -93.751633f, -0.528723f, 0.000002f, -0.848795f, 0.000000f, 255.000000f }, -{ 72.154381f, 21.091311f, -93.999207f, 0.303533f, 0.000002f, -0.952821f, 0.000000f, 255.000000f }, -{ 70.869621f, 21.091311f, -95.136734f, 0.730358f, 0.000001f, -0.683065f, 0.000000f, 255.000000f }, -{ 69.684608f, 21.091311f, -97.015182f, 0.929606f, 0.000001f, -0.368555f, 0.000000f, 255.000000f }, -{ 69.684608f, 21.091320f, -118.046234f, 0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 116.042702f, 21.091320f, -111.377853f, -0.239564f, -0.000003f, 0.970881f, 0.000000f, 255.000000f }, -{ 116.042702f, 21.091320f, -116.315018f, 0.945756f, 0.000001f, -0.324877f, 0.000000f, 255.000000f }, -{ 112.247803f, 21.091320f, -118.552063f, 0.339296f, 0.000002f, -0.940680f, 0.000000f, 255.000000f }, -{ 107.574234f, 21.091320f, -118.394440f, -0.247366f, 0.000001f, -0.968922f, 0.000000f, 255.000000f }, -{ 103.539482f, 21.091320f, -115.040665f, -0.746247f, 0.000001f, -0.665669f, 0.000000f, 255.000000f }, -{ 102.209610f, 21.091320f, -112.118790f, -0.936927f, 0.000000f, -0.349526f, 0.000000f, 255.000000f }, -{ 101.385559f, 21.091312f, -108.374054f, -0.986407f, 0.000000f, -0.164321f, 0.000000f, 255.000000f }, -{ 101.102959f, 21.091311f, -103.811798f, -0.999732f, 0.000000f, -0.023155f, 0.000000f, 255.000000f }, -{ 101.339844f, 21.091307f, -99.454666f, -0.995145f, 0.000000f, 0.098417f, 0.000000f, 255.000000f }, -{ 102.036247f, 21.091311f, -95.777908f, -0.969592f, -0.000001f, 0.244727f, 0.000000f, 255.000000f }, -{ 103.170799f, 21.091311f, -92.831406f, -0.899584f, -0.000001f, 0.436747f, 0.000000f, 255.000000f }, -{ 104.722122f, 21.091311f, -90.665024f, -0.716919f, -0.000001f, 0.697157f, 0.000000f, 255.000000f }, -{ 107.933678f, 21.091311f, -88.927628f, -0.281539f, -0.000002f, 0.959550f, 0.000000f, 255.000000f }, -{ 111.632736f, 21.091311f, -89.470505f, 0.315299f, -0.000002f, 0.948992f, 0.000000f, 255.000000f }, -{ 113.549179f, 21.091311f, -91.009354f, 0.701500f, -0.000002f, 0.712669f, 0.000000f, 255.000000f }, -{ 114.952675f, 21.091311f, -93.103912f, 0.890786f, -0.000001f, 0.454424f, 0.000000f, 255.000000f }, -{ 116.387047f, 21.091307f, -99.154861f, 0.985821f, 0.000000f, 0.167802f, 0.000000f, 255.000000f }, -{ 116.619774f, 21.091309f, -104.965942f, 0.908369f, 0.000001f, -0.418169f, 0.000000f, 255.000000f }, -{ 106.104248f, 21.091312f, -104.965942f, 0.465868f, 0.000001f, -0.884854f, 0.000000f, 255.000000f }, -{ 106.676575f, 21.091320f, -110.009979f, 0.971167f, 0.000000f, 0.238399f, 0.000000f, 255.000000f }, -{ 108.374535f, 21.091320f, -113.130447f, 0.745484f, -0.000001f, 0.666523f, 0.000000f, 255.000000f }, -{ 111.169655f, 21.091320f, -114.199097f, 0.156933f, -0.000001f, 0.987609f, 0.000000f, 255.000000f }, -{ 113.774490f, 21.091320f, -113.485764f, -0.413582f, -0.000002f, 0.910467f, 0.000000f, 255.000000f }, -{ 106.040123f, 21.091307f, -101.247040f, 0.916229f, -0.000001f, 0.400654f, 0.000000f, 255.000000f }, -{ 111.618484f, 21.091307f, -101.247040f, -0.458820f, -0.000001f, 0.888529f, 0.000000f, 255.000000f }, -{ 111.312141f, 21.091311f, -96.746841f, -0.987291f, 0.000000f, -0.158925f, 0.000000f, 255.000000f }, -{ 110.364601f, 21.091311f, -94.098953f, -0.833881f, 0.000001f, -0.551945f, 0.000000f, 255.000000f }, -{ 108.733131f, 21.091311f, -93.232162f, -0.164167f, 0.000002f, -0.986433f, 0.000000f, 255.000000f }, -{ 107.208519f, 21.091311f, -94.113205f, 0.689773f, 0.000001f, -0.724025f, 0.000000f, 255.000000f }, -{ 106.325096f, 21.091311f, -96.775330f, 0.972507f, 0.000000f, -0.232875f, 0.000000f, 255.000000f }, -{ 122.262253f, 21.091320f, -118.046234f, -0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 122.262253f, 21.091311f, -89.641495f, -0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 127.263535f, 21.091311f, -89.641495f, 0.444200f, -0.000001f, 0.895928f, 0.000000f, 255.000000f }, -{ 127.391785f, 21.091311f, -97.335770f, 0.953952f, -0.000001f, 0.299959f, 0.000000f, 255.000000f }, -{ 128.306671f, 21.091311f, -94.372635f, -0.949849f, -0.000001f, 0.312709f, 0.000000f, 255.000000f }, -{ 129.111130f, 21.091311f, -92.203873f, -0.922966f, -0.000001f, 0.384882f, 0.000000f, 255.000000f }, -{ 129.876404f, 21.091311f, -90.715469f, -0.819365f, -0.000002f, 0.573272f, 0.000000f, 255.000000f }, -{ 131.574371f, 21.091311f, -89.323868f, -0.451781f, -0.000002f, 0.892129f, 0.000000f, 255.000000f }, -{ 133.556717f, 21.091311f, -89.280518f, 0.124905f, -0.000001f, 0.992169f, 0.000000f, 255.000000f }, -{ 135.214310f, 21.091311f, -90.026199f, 0.720568f, -0.000001f, 0.693384f, 0.000000f, 255.000000f }, -{ 134.829590f, 21.091311f, -95.155716f, 0.837365f, 0.000001f, -0.546645f, 0.000000f, 255.000000f }, -{ 132.649551f, 21.091311f, -94.450424f, -0.087364f, 0.000002f, -0.996176f, 0.000000f, 255.000000f }, -{ 130.914764f, 21.091311f, -95.135239f, 0.525644f, 0.000002f, -0.850705f, 0.000000f, 255.000000f }, -{ 129.543335f, 21.091311f, -96.915436f, 0.842037f, 0.000001f, -0.539420f, 0.000000f, 255.000000f }, -{ 128.513855f, 21.091307f, -99.379562f, 0.939937f, 0.000001f, -0.341349f, 0.000000f, 255.000000f }, -{ 127.804985f, 21.091307f, -102.116196f, 0.975653f, 0.000001f, -0.219322f, 0.000000f, 255.000000f }, -{ 127.395340f, 21.091309f, -104.713913f, 0.994216f, 0.000000f, -0.107397f, 0.000000f, 255.000000f }, -{ 127.263535f, 21.091320f, -118.046234f, 0.890868f, 0.000001f, -0.454263f, 0.000000f, 255.000000f }, -{ 155.668289f, 21.091312f, -112.788467f, -0.207596f, -0.000003f, 0.978215f, 0.000000f, 255.000000f }, -{ 155.668289f, 21.091312f, -116.571503f, 0.958465f, 0.000000f, -0.285210f, 0.000000f, 255.000000f }, -{ 154.127060f, 21.091320f, -117.804016f, 0.558773f, 0.000001f, -0.829321f, 0.000000f, 255.000000f }, -{ 152.305023f, 21.091320f, -118.637558f, 0.271646f, 0.000002f, -0.962397f, 0.000000f, 255.000000f }, -{ 150.903000f, 21.091320f, -118.586197f, -0.192636f, 0.000003f, -0.981270f, 0.000000f, 255.000000f }, -{ 149.472794f, 21.091320f, -117.781738f, -0.623712f, 0.000001f, -0.781654f, 0.000000f, 255.000000f }, -{ 148.448669f, 21.091320f, -116.186478f, -0.885465f, 0.000001f, -0.464706f, 0.000000f, 255.000000f }, -{ 148.102249f, 21.091320f, -115.096756f, -0.673915f, 0.000002f, -0.738809f, 0.000000f, 255.000000f }, -{ 146.276031f, 21.091320f, -117.172318f, 0.651081f, 0.000002f, -0.759008f, 0.000000f, 255.000000f }, -{ 142.652115f, 21.091320f, -118.815659f, 0.173318f, 0.000003f, -0.984866f, 0.000000f, 255.000000f }, -{ 139.866501f, 21.091320f, -117.808762f, -0.507992f, 0.000002f, -0.861362f, 0.000000f, 255.000000f }, -{ 137.850311f, 21.091320f, -115.206009f, -0.871837f, 0.000001f, -0.489796f, 0.000000f, 255.000000f }, -{ 137.073761f, 21.091320f, -111.634323f, -0.998311f, 0.000000f, -0.058104f, 0.000000f, 255.000000f }, -{ 138.144791f, 21.091309f, -107.571091f, -0.909053f, -0.000001f, 0.416680f, 0.000000f, 255.000000f }, -{ 141.623840f, 21.091307f, -104.049286f, -0.664570f, -0.000001f, 0.747226f, 0.000000f, 255.000000f }, -{ 144.391052f, 21.091307f, -102.166382f, -0.548261f, -0.000001f, 0.836307f, 0.000000f, 255.000000f }, -{ 147.909882f, 21.091307f, -100.028778f, -0.766243f, -0.000001f, 0.642551f, 0.000000f, 255.000000f }, -{ 147.909882f, 21.091311f, -97.335770f, -0.996405f, 0.000000f, -0.084715f, 0.000000f, 255.000000f }, -{ 147.180527f, 21.091311f, -94.538589f, -0.876729f, 0.000001f, -0.480984f, 0.000000f, 255.000000f }, -{ 145.869064f, 21.091311f, -93.718689f, -0.363965f, 0.000001f, -0.931413f, 0.000000f, 255.000000f }, -{ 143.898575f, 21.091311f, -93.732040f, 0.141328f, 0.000002f, -0.989963f, 0.000000f, 255.000000f }, -{ 141.682312f, 21.091311f, -94.706894f, 0.547231f, 0.000002f, -0.836982f, 0.000000f, 255.000000f }, -{ 137.779068f, 21.091307f, -98.297562f, -0.401856f, 0.000002f, -0.915703f, 0.000000f, 255.000000f }, -{ 137.779068f, 21.091311f, -92.526840f, -0.955079f, -0.000001f, 0.296350f, 0.000000f, 255.000000f }, -{ 141.658264f, 21.091311f, -89.665527f, -0.497538f, -0.000001f, 0.867442f, 0.000000f, 255.000000f }, -{ 144.054428f, 21.091311f, -88.951309f, -0.179589f, -0.000002f, 0.983742f, 0.000000f, 255.000000f }, -{ 147.152328f, 21.091311f, -89.072128f, 0.177231f, -0.000003f, 0.984169f, 0.000000f, 255.000000f }, -{ 150.474655f, 21.091311f, -90.715469f, 0.598228f, -0.000002f, 0.801326f, 0.000000f, 255.000000f }, -{ 152.600082f, 21.091311f, -94.111420f, 0.914330f, -0.000001f, 0.404969f, 0.000000f, 255.000000f }, -{ 152.911179f, 21.091311f, -96.502228f, 0.996242f, 0.000000f, 0.086610f, 0.000000f, 255.000000f }, -{ 152.932556f, 21.091312f, -113.100754f, 0.997125f, 0.000000f, 0.075777f, 0.000000f, 255.000000f }, -{ 153.103531f, 21.091312f, -113.846436f, 0.884948f, -0.000001f, 0.465690f, 0.000000f, 255.000000f }, -{ 153.680603f, 21.091312f, -114.199097f, 0.253386f, -0.000001f, 0.967365f, 0.000000f, 255.000000f }, -{ 154.124680f, 21.091312f, -114.032852f, -0.430647f, -0.000002f, 0.902520f, 0.000000f, 255.000000f }, -{ 154.796753f, 21.091312f, -113.553146f, -0.607827f, -0.000002f, 0.794070f, 0.000000f, 255.000000f }, -{ 147.909882f, 21.091312f, -110.800781f, -0.953798f, 0.000000f, 0.300449f, 0.000000f, 255.000000f }, -{ 147.909882f, 21.091307f, -103.491211f, -0.866611f, 0.000001f, -0.498984f, 0.000000f, 255.000000f }, -{ 146.048050f, 21.091309f, -104.727585f, 0.580141f, 0.000001f, -0.814516f, 0.000000f, 255.000000f }, -{ 144.556686f, 21.091309f, -105.944351f, 0.665820f, 0.000002f, -0.746113f, 0.000000f, 255.000000f }, -{ 143.421539f, 21.091309f, -107.154007f, 0.767879f, 0.000002f, -0.640594f, 0.000000f, 255.000000f }, -{ 142.628372f, 21.091309f, -108.369003f, 0.891623f, 0.013556f, -0.452576f, 0.000000f, 255.000000f }, -{ 142.162918f, 21.091312f, -109.601822f, 0.949579f, 0.009083f, -0.313397f, 0.000000f, 255.000000f }, -{ 142.010925f, 21.091312f, -110.864899f, 0.999304f, 0.016713f, 0.033337f, 0.000000f, 255.000000f }, -{ 142.329147f, 21.091312f, -112.550995f, 0.955846f, 0.011386f, 0.293649f, 0.000000f, 255.000000f }, -{ 143.188812f, 21.091320f, -113.667130f, 0.656317f, -0.000002f, 0.754485f, 0.000000f, 255.000000f }, -{ 144.447449f, 21.091320f, -114.070847f, 0.112970f, -0.000003f, 0.993598f, 0.000000f, 255.000000f }, -{ 145.715591f, 21.091312f, -113.693268f, -0.427813f, -0.000002f, 0.903867f, 0.000000f, 255.000000f }, -{ 146.898224f, 21.091312f, -112.588989f, -0.738315f, -0.000001f, 0.674456f, 0.000000f, 255.000000f }, -{ 147.430771f, 21.091312f, -111.777710f, -0.858087f, -0.000001f, 0.513505f, 0.000000f, 255.000000f }, -{ 173.749878f, 21.091312f, -112.467880f, -0.011390f, -0.000002f, 0.999935f, 0.000000f, 255.000000f }, -{ 173.749878f, 21.091312f, -117.276810f, 0.941545f, 0.000001f, -0.336887f, 0.000000f, 255.000000f }, -{ 172.085159f, 21.091312f, -118.160233f, 0.381529f, 0.000002f, -0.924357f, 0.000000f, 255.000000f }, -{ 168.812698f, 21.091312f, -118.815659f, 0.073515f, 0.000003f, -0.997294f, 0.000000f, 255.000000f }, -{ 166.009262f, 21.091312f, -118.315475f, -0.288270f, 0.000003f, -0.957549f, 0.000000f, 255.000000f }, -{ 163.547806f, 21.091312f, -116.887344f, -0.587254f, 0.000002f, -0.809402f, 0.000000f, 255.000000f }, -{ 161.503128f, 21.091312f, -114.639908f, -0.793964f, 0.000002f, -0.607965f, 0.000000f, 255.000000f }, -{ 159.950012f, 21.091312f, -111.681839f, -0.916096f, 0.000001f, -0.400960f, 0.000000f, 255.000000f }, -{ 158.963303f, 21.091309f, -108.121750f, -0.978307f, 0.000000f, -0.207162f, 0.000000f, 255.000000f }, -{ 158.617767f, 21.091307f, -104.068283f, -0.999894f, 0.000000f, -0.014533f, 0.000000f, 255.000000f }, -{ 159.531387f, 21.091311f, -96.903564f, -0.960752f, -0.000001f, 0.277410f, 0.000000f, 255.000000f }, -{ 163.822617f, 21.091311f, -90.542206f, -0.686978f, -0.000001f, 0.726678f, 0.000000f, 255.000000f }, -{ 169.115997f, 21.091311f, -88.872055f, -0.125351f, -0.000002f, 0.992112f, 0.000000f, 255.000000f }, -{ 173.301041f, 21.091311f, -89.897964f, 0.605053f, -0.000002f, 0.796185f, 0.000000f, 255.000000f }, -{ 173.301041f, 21.091311f, -95.027481f, 0.869424f, 0.000001f, -0.494066f, 0.000000f, 255.000000f }, -{ 169.582138f, 21.091311f, -93.616867f, -0.117972f, 0.000003f, -0.993017f, 0.000000f, 255.000000f }, -{ 166.473557f, 21.091311f, -94.882629f, 0.569661f, 0.000002f, -0.821880f, 0.000000f, 255.000000f }, -{ 164.462112f, 21.091307f, -98.442429f, 0.926161f, 0.000000f, -0.377127f, 0.000000f, 255.000000f }, -{ 163.747299f, 21.091307f, -103.940048f, 0.999259f, 0.000000f, -0.038502f, 0.000000f, 255.000000f }, -{ 164.523849f, 21.091312f, -109.302292f, 0.960848f, -0.000001f, 0.277074f, 0.000000f, 255.000000f }, -{ 166.711029f, 21.091312f, -112.812210f, 0.688926f, -0.000002f, 0.724832f, 0.000000f, 255.000000f }, -{ 171.313354f, 21.091312f, -113.911743f, -0.016062f, -0.000002f, 0.999871f, 0.000000f, 255.000000f }, -{ 188.369019f, 21.091312f, -113.301422f, 0.166049f, -0.000002f, 0.986117f, 0.000000f, 255.000000f }, -{ 188.369019f, 21.091312f, -117.725632f, 0.929230f, 0.000001f, -0.369503f, 0.000000f, 255.000000f }, -{ 186.637802f, 21.091312f, -118.378708f, 0.302607f, 0.000003f, -0.953115f, 0.000000f, 255.000000f }, -{ 184.602036f, 21.091312f, -118.792801f, 0.114406f, 0.000003f, -0.993434f, 0.000000f, 255.000000f }, -{ 182.419891f, 21.091312f, -118.666061f, -0.154137f, 0.000002f, -0.988049f, 0.000000f, 255.000000f }, -{ 181.128311f, 21.091312f, -118.195847f, -0.440071f, 0.000002f, -0.897963f, 0.000000f, 255.000000f }, -{ 180.089645f, 21.091312f, -117.372986f, -0.704223f, 0.000001f, -0.709979f, 0.000000f, 255.000000f }, -{ 179.323486f, 21.091312f, -116.165421f, -0.890730f, 0.000001f, -0.454533f, 0.000000f, 255.000000f }, -{ 178.849426f, 21.091312f, -114.541061f, -0.976876f, 0.000000f, -0.213806f, 0.000000f, 255.000000f }, -{ 178.687042f, 21.091312f, -112.467880f, -0.998642f, 0.000000f, -0.052093f, 0.000000f, 255.000000f }, -{ 178.687042f, 21.091311f, -94.001587f, -0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 175.416977f, 21.091311f, -94.001587f, -0.498416f, 0.000001f, -0.866938f, 0.000000f, 255.000000f }, -{ 178.200211f, 21.091311f, -89.945450f, -0.824150f, -0.000001f, 0.566372f, 0.000000f, 255.000000f }, -{ 180.755478f, 21.091311f, -86.238419f, -0.830310f, -0.000001f, 0.557302f, 0.000000f, 255.000000f }, -{ 183.239502f, 21.091309f, -82.331909f, -0.631328f, -0.000001f, 0.775516f, 0.000000f, 255.000000f }, -{ 183.688324f, 21.091309f, -82.331909f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 183.688324f, 21.091311f, -89.641495f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 188.369019f, 21.091311f, -89.641495f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 188.369019f, 21.091311f, -94.001587f, 0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 183.688324f, 21.091311f, -94.001587f, 0.448748f, 0.000001f, -0.893658f, 0.000000f, 255.000000f }, -{ 183.847443f, 21.091312f, -112.446503f, 0.993879f, -0.002630f, 0.110439f, 0.000000f, 255.000000f }, -{ 184.081055f, 21.091312f, -113.181198f, 0.839241f, 0.017509f, 0.543478f, 0.000000f, 255.000000f }, -{ 184.972198f, 21.091312f, -113.977341f, 0.558370f, 0.001114f, 0.829591f, 0.000000f, 255.000000f }, -{ 186.488205f, 21.091312f, -113.985367f, -0.111941f, -0.000003f, 0.993715f, 0.000000f, 255.000000f }, -{ 192.280289f, 21.091312f, -118.046234f, -0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 192.280289f, 21.091311f, -89.641495f, -0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 197.281570f, 21.091311f, -89.641495f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 197.281570f, 21.091312f, -118.046234f, 0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 209.400085f, 21.091312f, -118.687424f, -0.387639f, 0.000002f, -0.921811f, 0.000000f, 255.000000f }, -{ 200.872238f, 21.091311f, -89.641495f, -0.975084f, 0.000000f, 0.221837f, 0.000000f, 255.000000f }, -{ 205.873535f, 21.091311f, -89.641495f, 0.395561f, -0.000001f, 0.918440f, 0.000000f, 255.000000f }, -{ 210.041275f, 21.091309f, -105.863617f, 0.791121f, -0.000001f, 0.611659f, 0.000000f, 255.000000f }, -{ 210.169510f, 21.091309f, -105.863617f, -0.395561f, -0.000001f, 0.918440f, 0.000000f, 255.000000f }, -{ 214.337250f, 21.091311f, -89.641495f, -0.791121f, -0.000001f, 0.611659f, 0.000000f, 255.000000f }, -{ 219.338531f, 21.091311f, -89.641495f, 0.487542f, -0.000001f, 0.873100f, 0.000000f, 255.000000f }, -{ 210.810699f, 21.091312f, -118.687424f, 0.775278f, 0.000002f, -0.631621f, 0.000000f, 255.000000f }, -{ 196.095139f, 9.401914f, -83.842834f, 0.586264f, 0.000000f, -0.810120f, 0.000000f, 255.000000f }, -{ 197.530334f, 9.401917f, -82.099869f, 0.987392f, 0.000000f, -0.158291f, 0.000000f, 255.000000f }, -{ 197.312714f, 9.401917f, -79.852554f, 0.810120f, 0.000000f, 0.586264f, 0.000000f, 255.000000f }, -{ 195.569748f, 9.401917f, -78.417358f, 0.158291f, 0.000000f, 0.987392f, 0.000000f, 255.000000f }, -{ 193.322433f, 9.401917f, -78.634979f, -0.586264f, 0.000000f, 0.810120f, 0.000000f, 255.000000f }, -{ 191.887238f, 9.401917f, -80.377945f, -0.987392f, 0.000000f, 0.158291f, 0.000000f, 255.000000f }, -{ 192.104858f, 9.401917f, -82.625259f, -0.810120f, 0.000000f, -0.586264f, 0.000000f, 255.000000f }, -{ 193.847824f, 9.401914f, -84.060455f, -0.158291f, 0.000000f, -0.987392f, 0.000000f, 255.000000f }, -{ 196.095139f, 21.005835f, -83.842834f, 0.344805f, 0.000000f, -0.938674f, 0.000000f, 255.000000f }, -{ 197.530334f, 21.005833f, -82.099869f, 0.907558f, 0.000000f, -0.419928f, 0.000000f, 255.000000f }, -{ 197.312714f, 21.005833f, -79.852554f, 0.938674f, 0.000000f, 0.344805f, 0.000000f, 255.000000f }, -{ 195.569748f, 21.005836f, -78.417358f, 0.419928f, 0.000000f, 0.907558f, 0.000000f, 255.000000f }, -{ 193.322433f, 21.005836f, -78.634979f, -0.344805f, 0.000000f, 0.938674f, 0.000000f, 255.000000f }, -{ 191.887238f, 21.005833f, -80.377945f, -0.907558f, 0.000000f, 0.419928f, 0.000000f, 255.000000f }, -{ 192.104858f, 21.005835f, -82.625259f, -0.938674f, 0.000000f, -0.344805f, 0.000000f, 255.000000f }, -{ 193.847824f, 21.005835f, -84.060455f, -0.419928f, 0.000000f, -0.907558f, 0.000000f, 255.000000f }, -{ 57.212021f, 9.401914f, -83.842834f, 0.586264f, 0.000000f, -0.810120f, 0.000000f, 255.000000f }, -{ 58.647217f, 9.401917f, -82.099869f, 0.987392f, 0.000000f, -0.158291f, 0.000000f, 255.000000f }, -{ 58.429596f, 9.401917f, -79.852554f, 0.810120f, 0.000000f, 0.586264f, 0.000000f, 255.000000f }, -{ 56.686630f, 9.401917f, -78.417358f, 0.158291f, 0.000000f, 0.987392f, 0.000000f, 255.000000f }, -{ 54.439316f, 9.401917f, -78.634979f, -0.586264f, 0.000000f, 0.810120f, 0.000000f, 255.000000f }, -{ 53.004120f, 9.401917f, -80.377945f, -0.987392f, 0.000000f, 0.158291f, 0.000000f, 255.000000f }, -{ 53.221741f, 9.401917f, -82.625259f, -0.810120f, 0.000000f, -0.586264f, 0.000000f, 255.000000f }, -{ 54.964706f, 9.401914f, -84.060455f, -0.158291f, 0.000000f, -0.987392f, 0.000000f, 255.000000f }, -{ 57.212021f, 21.005835f, -83.842834f, 0.344805f, 0.000000f, -0.938674f, 0.000000f, 255.000000f }, -{ 58.647217f, 21.005833f, -82.099869f, 0.907558f, 0.000000f, -0.419928f, 0.000000f, 255.000000f }, -{ 58.429596f, 21.005833f, -79.852554f, 0.938674f, 0.000000f, 0.344805f, 0.000000f, 255.000000f }, -{ 56.686630f, 21.005836f, -78.417358f, 0.419928f, 0.000000f, 0.907558f, 0.000000f, 255.000000f }, -{ 54.439316f, 21.005836f, -78.634979f, -0.344805f, 0.000000f, 0.938674f, 0.000000f, 255.000000f }, -{ 53.004120f, 21.005833f, -80.377945f, -0.907558f, 0.000000f, 0.419928f, 0.000000f, 255.000000f }, -{ 53.221741f, 21.005835f, -82.625259f, -0.938674f, 0.000000f, -0.344805f, 0.000000f, 255.000000f }, -{ 54.964706f, 21.005835f, -84.060455f, -0.419928f, 0.000000f, -0.907558f, 0.000000f, 255.000000f }, -{ 98.582520f, 9.484123f, -113.301437f, 0.869996f, -0.000001f, 0.493059f, 0.000000f, 255.000000f }, -{ 98.582520f, 9.484123f, -117.725662f, 0.688899f, 0.000002f, -0.724858f, 0.000000f, 255.000000f }, -{ 95.979660f, 9.484123f, -118.792831f, 0.103299f, 0.000002f, -0.994650f, 0.000000f, 255.000000f }, -{ 92.633392f, 9.484123f, -118.666077f, -0.344449f, 0.000001f, -0.938805f, 0.000000f, 255.000000f }, -{ 90.303146f, 9.484123f, -117.373001f, -0.810154f, 0.000001f, -0.586217f, 0.000000f, 255.000000f }, -{ 89.062927f, 9.484123f, -114.541092f, -0.982148f, 0.000000f, -0.188111f, 0.000000f, 255.000000f }, -{ 88.900543f, 9.484123f, -112.467911f, -0.999661f, 0.000000f, -0.026047f, 0.000000f, 255.000000f }, -{ 88.900543f, 9.484118f, -94.001602f, -0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 85.630478f, 9.484118f, -94.001602f, -0.996832f, -0.000001f, 0.079535f, 0.000000f, 255.000000f }, -{ 88.413712f, 9.484118f, -89.945480f, -0.823749f, -0.000001f, 0.566955f, 0.000000f, 255.000000f }, -{ 90.968979f, 9.484117f, -86.238449f, -0.837145f, -0.000001f, 0.546981f, 0.000000f, 255.000000f }, -{ 93.453003f, 9.484117f, -82.331924f, -0.315664f, -0.000001f, 0.948871f, 0.000000f, 255.000000f }, -{ 93.901825f, 9.484117f, -82.331924f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 93.901825f, 9.484118f, -89.641510f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 98.582520f, 9.484118f, -89.641510f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 98.582520f, 9.484118f, -94.001602f, 0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 93.901825f, 9.484118f, -94.001602f, 0.897364f, 0.000532f, -0.441290f, 0.000000f, 255.000000f }, -{ 94.060944f, 9.484123f, -112.446518f, 0.908382f, 0.000909f, 0.418140f, 0.000000f, 255.000000f }, -{ 95.185699f, 9.484123f, -113.977371f, 0.300433f, -0.000003f, 0.953803f, 0.000000f, 255.000000f }, -{ 96.701706f, 9.484123f, -113.985397f, -0.229252f, -0.000002f, 0.973367f, 0.000000f, 255.000000f }, -{ 98.582520f, 21.091312f, -113.301422f, 0.166049f, -0.000002f, 0.986117f, 0.000000f, 255.000000f }, -{ 98.582520f, 21.091312f, -117.725632f, 0.932011f, 0.000001f, -0.362429f, 0.000000f, 255.000000f }, -{ 95.979660f, 21.091312f, -118.792801f, 0.245227f, 0.000003f, -0.969466f, 0.000000f, 255.000000f }, -{ 92.633392f, 21.091312f, -118.666061f, -0.191620f, 0.000002f, -0.981469f, 0.000000f, 255.000000f }, -{ 90.303146f, 21.091312f, -117.372986f, -0.659538f, 0.000001f, -0.751671f, 0.000000f, 255.000000f }, -{ 89.062927f, 21.091312f, -114.541061f, -0.954830f, 0.000001f, -0.297154f, 0.000000f, 255.000000f }, -{ 88.900543f, 21.091312f, -112.467880f, -0.998642f, 0.000000f, -0.052093f, 0.000000f, 255.000000f }, -{ 88.900543f, 21.091311f, -94.001587f, -0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 85.630478f, 21.091311f, -94.001587f, -0.498416f, 0.000001f, -0.866938f, 0.000000f, 255.000000f }, -{ 88.413712f, 21.091311f, -89.945450f, -0.824150f, -0.000001f, 0.566372f, 0.000000f, 255.000000f }, -{ 90.968979f, 21.091311f, -86.238419f, -0.830310f, -0.000001f, 0.557302f, 0.000000f, 255.000000f }, -{ 93.453003f, 21.091309f, -82.331909f, -0.631328f, -0.000001f, 0.775516f, 0.000000f, 255.000000f }, -{ 93.901825f, 21.091309f, -82.331909f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 93.901825f, 21.091311f, -89.641495f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 98.582520f, 21.091311f, -89.641495f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 98.582520f, 21.091311f, -94.001587f, 0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 93.901825f, 21.091311f, -94.001587f, 0.448616f, 0.000001f, -0.893725f, 0.000000f, 255.000000f }, -{ 94.047279f, 21.091312f, -112.455856f, 0.976683f, 0.000910f, 0.214684f, 0.000000f, 255.000000f }, -{ 95.185699f, 21.091312f, -113.977341f, 0.592555f, 0.000522f, 0.805530f, 0.000000f, 255.000000f }, -{ 96.701706f, 21.091312f, -113.985367f, -0.111941f, -0.000003f, 0.993715f, 0.000000f, 255.000000f }, -{ 236.900940f, 9.484123f, -111.377884f, 0.874270f, -0.000001f, 0.485440f, 0.000000f, 255.000000f }, -{ 236.900940f, 9.484123f, -116.315048f, 0.760144f, 0.000001f, -0.649754f, 0.000000f, 255.000000f }, -{ 233.106049f, 9.484123f, -118.552078f, 0.152177f, 0.000001f, -0.988353f, 0.000000f, 255.000000f }, -{ 228.432480f, 9.484123f, -118.394455f, -0.459334f, 0.000001f, -0.888264f, 0.000000f, 255.000000f }, -{ 224.397736f, 9.484123f, -115.040680f, -0.838627f, 0.000001f, -0.544707f, 0.000000f, 255.000000f }, -{ 223.067856f, 9.484123f, -112.118805f, -0.959193f, 0.000000f, -0.282752f, 0.000000f, 255.000000f }, -{ 222.243805f, 9.484118f, -108.374069f, -0.993577f, 0.000000f, -0.113154f, 0.000000f, 255.000000f }, -{ 221.961212f, 9.484118f, -103.811813f, -0.999878f, 0.000000f, 0.015606f, 0.000000f, 255.000000f }, -{ 222.198090f, 9.484118f, -99.454697f, -0.989803f, 0.000000f, 0.142441f, 0.000000f, 255.000000f }, -{ 222.894501f, 9.484118f, -95.777939f, -0.953092f, -0.000001f, 0.302682f, 0.000000f, 255.000000f }, -{ 224.029053f, 9.484106f, -92.831436f, -0.859240f, -0.000001f, 0.511572f, 0.000000f, 255.000000f }, -{ 225.580368f, 9.484118f, -90.665039f, -0.601898f, -0.000001f, 0.798573f, 0.000000f, 255.000000f }, -{ 228.791931f, 9.484118f, -88.927658f, -0.064729f, -0.000002f, 0.997903f, 0.000000f, 255.000000f }, -{ 232.490982f, 9.484118f, -89.470520f, 0.480740f, -0.000002f, 0.876863f, 0.000000f, 255.000000f }, -{ 234.407425f, 9.484118f, -91.009384f, 0.770418f, -0.000001f, 0.637539f, 0.000000f, 255.000000f }, -{ 235.810913f, 9.484106f, -93.103928f, 0.938897f, 0.000000f, 0.344198f, 0.000000f, 255.000000f }, -{ 237.245300f, 9.484118f, -99.154877f, 0.994578f, 0.000000f, 0.103993f, 0.000000f, 255.000000f }, -{ 237.478027f, 9.484118f, -104.965958f, 0.454185f, 0.000001f, -0.890908f, 0.000000f, 255.000000f }, -{ 226.962494f, 9.484118f, -104.965958f, 0.931736f, 0.000000f, -0.363137f, 0.000000f, 255.000000f }, -{ 227.534821f, 9.484123f, -110.009995f, 0.932111f, 0.000000f, 0.362173f, 0.000000f, 255.000000f }, -{ 229.232788f, 9.484123f, -113.130463f, 0.561655f, -0.000001f, 0.827372f, 0.000000f, 255.000000f }, -{ 232.027893f, 9.484123f, -114.199112f, -0.059664f, -0.000002f, 0.998219f, 0.000000f, 255.000000f }, -{ 234.632736f, 9.484123f, -113.485794f, -0.556105f, -0.000002f, 0.831112f, 0.000000f, 255.000000f }, -{ 226.898376f, 9.484118f, -101.247055f, 0.458115f, -0.000001f, 0.888893f, 0.000000f, 255.000000f }, -{ 232.476730f, 9.484118f, -101.247055f, -0.917640f, -0.000001f, 0.397413f, 0.000000f, 255.000000f }, -{ 232.170380f, 9.484118f, -96.746857f, -0.968412f, 0.000000f, -0.249358f, 0.000000f, 255.000000f }, -{ 231.222839f, 9.484118f, -94.098984f, -0.666434f, 0.000002f, -0.745564f, 0.000000f, 255.000000f }, -{ 229.591370f, 9.484106f, -93.232178f, 0.199198f, 0.000001f, -0.979959f, 0.000000f, 255.000000f }, -{ 228.066772f, 9.484118f, -94.113220f, 0.848531f, 0.000001f, -0.529145f, 0.000000f, 255.000000f }, -{ 227.183350f, 9.484118f, -96.775345f, 0.988917f, 0.000000f, -0.148471f, 0.000000f, 255.000000f }, -{ 236.900940f, 21.091320f, -111.377853f, -0.239566f, -0.000003f, 0.970880f, 0.000000f, 255.000000f }, -{ 236.900940f, 21.091320f, -116.315018f, 0.945756f, 0.000001f, -0.324877f, 0.000000f, 255.000000f }, -{ 233.106049f, 21.091320f, -118.552063f, 0.339296f, 0.000002f, -0.940680f, 0.000000f, 255.000000f }, -{ 228.432480f, 21.091320f, -118.394440f, -0.247366f, 0.000001f, -0.968922f, 0.000000f, 255.000000f }, -{ 224.397736f, 21.091320f, -115.040665f, -0.746247f, 0.000001f, -0.665669f, 0.000000f, 255.000000f }, -{ 223.067856f, 21.091320f, -112.118790f, -0.936926f, 0.000000f, -0.349528f, 0.000000f, 255.000000f }, -{ 222.243805f, 21.091312f, -108.374054f, -0.986407f, 0.000000f, -0.164320f, 0.000000f, 255.000000f }, -{ 221.961212f, 21.091311f, -103.811798f, -0.999732f, 0.000000f, -0.023155f, 0.000000f, 255.000000f }, -{ 222.198090f, 21.091307f, -99.454666f, -0.995145f, 0.000000f, 0.098417f, 0.000000f, 255.000000f }, -{ 222.894501f, 21.091311f, -95.777908f, -0.969592f, -0.000001f, 0.244728f, 0.000000f, 255.000000f }, -{ 224.029053f, 21.091311f, -92.831406f, -0.899585f, -0.000001f, 0.436746f, 0.000000f, 255.000000f }, -{ 225.580368f, 21.091311f, -90.665024f, -0.716920f, -0.000001f, 0.697156f, 0.000000f, 255.000000f }, -{ 228.791931f, 21.091311f, -88.927628f, -0.281538f, -0.000002f, 0.959550f, 0.000000f, 255.000000f }, -{ 232.490982f, 21.091311f, -89.470505f, 0.315299f, -0.000002f, 0.948992f, 0.000000f, 255.000000f }, -{ 234.407425f, 21.091311f, -91.009354f, 0.701501f, -0.000002f, 0.712669f, 0.000000f, 255.000000f }, -{ 235.810913f, 21.091311f, -93.103912f, 0.890786f, -0.000001f, 0.454423f, 0.000000f, 255.000000f }, -{ 237.245300f, 21.091307f, -99.154861f, 0.985820f, 0.000000f, 0.167804f, 0.000000f, 255.000000f }, -{ 237.478027f, 21.091309f, -104.965942f, 0.908369f, 0.000001f, -0.418169f, 0.000000f, 255.000000f }, -{ 226.962494f, 21.091312f, -104.965942f, 0.465868f, 0.000001f, -0.884854f, 0.000000f, 255.000000f }, -{ 227.534821f, 21.091320f, -110.009979f, 0.971167f, 0.000000f, 0.238399f, 0.000000f, 255.000000f }, -{ 229.232788f, 21.091320f, -113.130447f, 0.745484f, -0.000001f, 0.666524f, 0.000000f, 255.000000f }, -{ 232.027893f, 21.091320f, -114.199097f, 0.156935f, -0.000001f, 0.987609f, 0.000000f, 255.000000f }, -{ 234.632736f, 21.091320f, -113.485764f, -0.413582f, -0.000002f, 0.910467f, 0.000000f, 255.000000f }, -{ 226.898376f, 21.091307f, -101.247040f, 0.916229f, -0.000001f, 0.400654f, 0.000000f, 255.000000f }, -{ 232.476730f, 21.091307f, -101.247040f, -0.458820f, -0.000001f, 0.888529f, 0.000000f, 255.000000f }, -{ 232.170380f, 21.091311f, -96.746841f, -0.987291f, 0.000000f, -0.158926f, 0.000000f, 255.000000f }, -{ 231.222839f, 21.091311f, -94.098953f, -0.833881f, 0.000001f, -0.551945f, 0.000000f, 255.000000f }, -{ 229.591370f, 21.091311f, -93.232162f, -0.164166f, 0.000002f, -0.986433f, 0.000000f, 255.000000f }, -{ 228.066772f, 21.091311f, -94.113205f, 0.689776f, 0.000001f, -0.724023f, 0.000000f, 255.000000f }, -{ 227.183350f, 21.091311f, -96.775330f, 0.972507f, 0.000000f, -0.232875f, 0.000000f, 255.000000f }, -{ -227.530014f, -20.966743f, 18.889576f, -1.000000f, 0.000000f, 0.000000f, 11.312357f, 104.759467f }, -{ -227.530014f, -20.966749f, 49.094059f, -1.000000f, 0.000000f, 0.000000f, 24.483732f, 68.571409f }, -{ -259.747955f, -20.966747f, 81.060303f, -1.000000f, 0.000000f, 0.000000f, -0.177157f, 16.222941f }, -{ -259.747955f, -20.966751f, 111.264603f, -1.000000f, 0.000000f, 0.000000f, 12.994208f, -19.965071f }, -{ -264.026886f, -20.966732f, -47.559727f, -1.000000f, 0.000000f, 0.000000f, -61.391828f, 168.457698f }, -{ -264.026886f, -20.966738f, -14.334979f, -1.000000f, 0.000000f, 0.000000f, -46.903330f, 128.650867f }, -{ -148.686584f, -20.966757f, 116.550354f, -1.000000f, 0.000000f, 0.000000f, 148.362720f, 22.133174f }, -{ -148.686584f, -20.966743f, -55.110798f, -1.000000f, 0.000000f, 0.000000f, 73.505490f, 227.801797f }, -{ 53.459190f, 2.970489f, -63.834198f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 2.970482f, 19.696451f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 2.970485f, 19.696451f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 2.970482f, 37.767296f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 2.970478f, 37.767296f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 2.970482f, 19.696451f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970482f, 19.696451f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970489f, -63.834198f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ -227.530014f, 20.966755f, 18.889763f, -1.000000f, 0.000000f, 0.000000f, 11.312366f, 104.759421f }, -{ -227.530014f, 20.966747f, 49.094074f, -1.000000f, 0.000000f, 0.000000f, 24.483732f, 68.571394f }, -{ -259.747955f, 20.966745f, 81.060341f, -1.000000f, 0.000000f, 0.000000f, -0.177137f, 16.222895f }, -{ -259.747955f, 20.966743f, 111.264641f, -1.000000f, 0.000000f, 0.000000f, 12.994218f, -19.965132f }, -{ -264.026886f, 20.966764f, -47.559723f, -1.000000f, 0.000000f, 0.000000f, -61.391828f, 168.457698f }, -{ -264.026886f, 20.966753f, -14.334975f, -1.000000f, 0.000000f, 0.000000f, -46.903330f, 128.650867f }, -{ -148.686584f, 20.966726f, 116.550392f, -1.000000f, 0.000000f, 0.000000f, 148.362750f, 22.133128f }, -{ -148.686584f, 20.966757f, -55.110794f, -1.000000f, 0.000000f, 0.000000f, 73.505490f, 227.801797f }, -{ 53.459190f, 21.106728f, -63.834198f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 21.106720f, 19.696632f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 21.106720f, 19.696632f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 21.106718f, 37.767292f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 21.106718f, 37.767292f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 21.106720f, 19.696632f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106720f, 19.696632f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106728f, -63.834198f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ -227.530014f, -20.966743f, 18.889576f, 0.000000f, -1.000000f, 0.000000f, 11.312357f, 104.759467f }, -{ -227.530014f, -20.966749f, 49.094059f, 0.000000f, -1.000000f, 0.000000f, 24.483732f, 68.571409f }, -{ -220.271423f, -20.966749f, 49.922577f, 0.000000f, -1.000000f, 0.000000f, 33.541598f, 70.744057f }, -{ -214.348251f, -20.966755f, 52.198391f, 0.000000f, -1.000000f, 0.000000f, 41.630631f, 70.600333f }, -{ -209.753510f, -20.966747f, 55.606861f, 0.000001f, -1.000000f, 0.000000f, 48.621978f, 68.520264f }, -{ -206.480209f, -20.966747f, 59.833366f, 0.000000f, -1.000000f, 0.000000f, 54.386820f, 64.883859f }, -{ -204.521362f, -20.966749f, 64.563301f, 0.000000f, -1.000000f, 0.000000f, 58.796339f, 60.071098f }, -{ -203.869965f, -20.966747f, 69.481987f, 0.000000f, -1.000000f, 0.000000f, 61.721703f, 54.462037f }, -{ -204.699646f, -20.966759f, 74.975159f, 0.000000f, -1.000000f, 0.000000f, 63.123094f, 47.518821f }, -{ -207.067520f, -20.966751f, 79.783142f, 0.000000f, -1.000000f, 0.000000f, 62.382769f, 40.725774f }, -{ -210.791794f, -20.966751f, 83.766113f, 0.000000f, -1.000000f, 0.000000f, 59.657563f, 34.329668f }, -{ -215.690674f, -20.966751f, 86.784210f, 0.000000f, -1.000000f, 0.000000f, 55.104290f, 28.577385f }, -{ -221.582382f, -20.966751f, 88.697617f, 0.000000f, -1.000000f, 0.000000f, 48.879779f, 23.715683f }, -{ -228.285126f, -20.966751f, 89.366486f, 0.000000f, -1.000000f, 0.000000f, 41.140841f, 19.991411f }, -{ -233.272552f, -20.966751f, 89.153244f, 0.000000f, -1.000000f, 0.000000f, 35.072373f, 18.071997f }, -{ -238.232040f, -20.966751f, 88.499512f, 0.000000f, -1.000000f, 0.000000f, 28.845299f, 16.692535f }, -{ -243.261429f, -20.966751f, 87.384338f, 0.000000f, -1.000000f, 0.000000f, 22.333248f, 15.835422f }, -{ -248.458618f, -20.966747f, 85.786713f, 0.000000f, -1.000000f, 0.000000f, 15.409765f, 15.483181f }, -{ -253.921509f, -20.966747f, 83.685699f, 0.000000f, -1.000000f, 0.000000f, 7.948429f, 15.618211f }, -{ -259.747955f, -20.966747f, 81.060303f, 0.000000f, -1.000000f, 0.000000f, -0.177157f, 16.222941f }, -{ -259.747955f, -20.966751f, 111.264603f, 0.000000f, -1.000000f, 0.000000f, 12.994208f, -19.965071f }, -{ -253.885376f, -20.966755f, 113.571884f, 0.000000f, -1.000000f, 0.000000f, 21.024357f, -20.172935f }, -{ -247.666229f, -20.966757f, 115.459656f, 0.000000f, -1.000000f, 0.000000f, 29.298774f, -19.722674f }, -{ -241.153412f, -20.966763f, 116.927917f, 0.000000f, -1.000000f, 0.000000f, 37.742109f, -18.641708f }, -{ -234.409882f, -20.966763f, 117.976685f, 0.000000f, -1.000000f, 0.000000f, 46.278933f, -16.957548f }, -{ -227.498550f, -20.966763f, 118.605942f, 0.000000f, -1.000000f, 0.000000f, 54.833858f, -14.697611f }, -{ -220.482346f, -20.966763f, 118.815689f, 0.000000f, -1.000000f, 0.000000f, 63.331494f, -11.889319f }, -{ -205.143631f, -20.966763f, 117.432495f, 0.000000f, -1.000000f, 0.000000f, 81.105759f, -3.543264f }, -{ -191.825546f, -20.966755f, 113.455368f, 0.000000f, -1.000000f, 0.000000f, 95.327940f, 7.029456f }, -{ -180.870651f, -20.966755f, 107.142990f, 0.000000f, -1.000000f, 0.000000f, 105.700410f, 19.369521f }, -{ -172.621567f, -20.966755f, 98.754059f, 0.000000f, -1.000000f, 0.000000f, 111.925502f, 33.017599f }, -{ -167.420868f, -20.966753f, 88.547287f, 0.000000f, -1.000000f, 0.000000f, 113.705577f, 47.514307f }, -{ -165.611176f, -20.966751f, 76.781357f, 0.000000f, -1.000000f, 0.000000f, 110.742945f, 62.400328f }, -{ -166.340637f, -20.966751f, 68.696579f, 0.000000f, -1.000000f, -0.000001f, 106.343396f, 71.768664f }, -{ -168.510422f, -20.966749f, 61.101204f, 0.000000f, -1.000000f, 0.000000f, 100.431605f, 79.922555f }, -{ -172.092514f, -20.966755f, 54.065182f, 0.000000f, -1.000000f, 0.000000f, 93.071636f, 86.790413f }, -{ -177.058975f, -20.966747f, 47.658421f, 0.000000f, -1.000000f, -0.000001f, 84.327446f, 92.300650f }, -{ -183.381851f, -20.966743f, 41.950832f, 0.000000f, -1.000000f, 0.000000f, 74.263017f, 96.381707f }, -{ -191.033142f, -20.966743f, 37.012333f, 0.000000f, -1.000000f, 0.000000f, 62.942380f, 98.962027f }, -{ -181.454453f, -20.966751f, 32.298737f, 0.000000f, -1.000000f, 0.000000f, 72.363203f, 108.786445f }, -{ -173.805496f, -20.966743f, 26.319462f, 0.000000f, -1.000000f, 0.000000f, 78.920131f, 119.285616f }, -{ -168.002350f, -20.966745f, 19.235668f, 0.000000f, -1.000000f, 0.000000f, 82.783855f, 130.303376f }, -{ -163.961121f, -20.966740f, 11.208173f, 0.000000f, -1.000000f, 0.000000f, 84.125031f, 141.683643f }, -{ -161.597916f, -20.966740f, 2.397420f, 0.000000f, -1.000000f, 0.000000f, 83.114247f, 153.270415f }, -{ -160.828827f, -20.966740f, -7.035602f, 0.000000f, -1.000000f, 0.000000f, 79.922191f, 164.907572f }, -{ -162.772522f, -20.966736f, -21.426922f, 0.000000f, -1.000000f, 0.000000f, 71.317727f, 181.302331f }, -{ -168.407867f, -20.966743f, -33.734730f, 0.000000f, -1.000000f, 0.000000f, 59.198844f, 193.590982f }, -{ -177.441193f, -20.966736f, -43.721256f, 0.000000f, -1.000000f, 0.000000f, 44.021060f, 201.616710f }, -{ -189.578857f, -20.966732f, -51.148808f, 0.000000f, -1.000000f, 0.000000f, 26.239853f, 205.222777f }, -{ -204.527191f, -20.966740f, -55.779682f, 0.000000f, -1.000000f, 0.000000f, 6.310721f, 204.252461f }, -{ -221.992554f, -20.966740f, -57.376118f, 0.000000f, -1.000000f, 0.000000f, -15.310837f, 198.548949f }, -{ -229.371170f, -20.966740f, -57.068485f, 0.000000f, -1.000000f, 0.000000f, -24.017065f, 194.962735f }, -{ -236.805725f, -20.966740f, -56.173542f, 0.000000f, -1.000000f, 0.000000f, -32.534211f, 190.648469f }, -{ -244.142380f, -20.966740f, -54.733250f, 0.000000f, -1.000000f, 0.000000f, -40.696227f, 185.723508f }, -{ -251.227341f, -20.966732f, -52.789539f, 0.000000f, -1.000000f, 0.000000f, -48.337180f, 180.305151f }, -{ -257.906799f, -20.966732f, -50.384388f, 0.000000f, -1.000000f, 0.000000f, -55.291061f, 174.510773f }, -{ -264.026886f, -20.966732f, -47.559727f, 0.000000f, -1.000000f, 0.000000f, -61.391828f, 168.457698f }, -{ -264.026886f, -20.966738f, -14.334979f, 0.000000f, -1.000000f, 0.000000f, -46.903330f, 128.650867f }, -{ -257.339294f, -20.966736f, -18.662861f, 0.000000f, -1.000000f, 0.000000f, -40.778150f, 136.752428f }, -{ -251.050217f, -20.966736f, -22.109791f, 0.000000f, -1.000000f, 0.000000f, -34.746278f, 143.624739f }, -{ -245.054810f, -20.966736f, -24.717709f, 0.000000f, -1.000000f, 0.000000f, -28.700379f, 149.363753f }, -{ -239.248169f, -20.966736f, -26.528568f, 0.000000f, -1.000000f, 0.000000f, -22.533070f, 154.065492f }, -{ -233.525421f, -20.966736f, -27.584324f, 0.000000f, -1.000000f, 0.000000f, -16.136991f, 157.825952f }, -{ -227.781708f, -20.966736f, -27.926914f, 0.000000f, -1.000000f, 0.000000f, -9.404798f, 160.741110f }, -{ -220.280746f, -20.966736f, -27.192783f, 0.000000f, -1.000000f, 0.000000f, -0.097693f, 163.132527f }, -{ -213.751633f, -20.966736f, -25.074284f, 0.000000f, -1.000000f, 0.000000f, 8.648720f, 163.441519f }, -{ -208.369156f, -20.966736f, -21.697269f, 0.000000f, -1.000000f, 0.000000f, 16.570136f, 161.742661f }, -{ -204.308121f, -20.966736f, -17.187603f, 0.000000f, -1.000000f, -0.000001f, 23.402251f, 158.110511f }, -{ -201.743317f, -20.966747f, -11.671123f, 0.000000f, -1.000000f, 0.000000f, 28.880766f, 152.619616f }, -{ -200.849533f, -20.966740f, -5.273685f, 0.000000f, -1.000000f, 0.000000f, 32.741388f, 145.344557f }, -{ -201.724655f, -20.966740f, 1.288052f, 0.000000f, -1.000000f, 0.000000f, 34.554308f, 137.101264f }, -{ -204.242859f, -20.966745f, 7.031773f, 0.000000f, -1.000000f, 0.000000f, 34.041921f, 129.121540f }, -{ -208.243301f, -20.966740f, 11.810628f, 0.000000f, -1.000000f, 0.000000f, 31.332898f, 121.651460f }, -{ -213.565170f, -20.966740f, 15.477796f, 0.000001f, -1.000000f, 0.000000f, 26.555888f, 114.937053f }, -{ -220.047684f, -20.966743f, 17.886265f, 0.000000f, -1.000000f, 0.000000f, 19.839473f, 109.224409f }, -{ -148.686584f, -20.966757f, 116.550354f, 0.000000f, -1.000000f, 0.000000f, 148.362720f, 22.133174f }, -{ -72.924095f, -20.966761f, 116.550354f, 0.000000f, -1.000000f, 0.000000f, 239.134392f, 55.171337f }, -{ -44.133286f, -20.966759f, 113.442535f, 0.000000f, -1.000000f, 0.000000f, 272.273660f, 71.449816f }, -{ -20.467419f, -20.966759f, 104.692368f, 0.000000f, -1.000000f, 0.000000f, 296.812166f, 92.253563f }, -{ -1.975434f, -20.966759f, 91.159866f, 0.000000f, -1.000000f, 0.000000f, 313.066387f, 116.530870f }, -{ 11.293716f, -20.966763f, 73.704994f, 0.000000f, -1.000000f, 0.000000f, 321.352617f, 143.230046f }, -{ 19.291100f, -20.966763f, 53.187717f, 0.000000f, -1.000000f, 0.000000f, 321.987274f, 171.299429f }, -{ 21.967770f, -20.966759f, 30.467985f, 0.000000f, -1.000000f, 0.000000f, 315.286714f, 199.687265f }, -{ 19.338877f, -20.966749f, 6.999157f, 0.000000f, -1.000000f, 0.000000f, 301.902798f, 226.659149f }, -{ 11.340330f, -20.966751f, -13.645114f, 0.000000f, -1.000000f, 0.000000f, 283.317205f, 247.905254f }, -{ -2.195676f, -20.966743f, -30.821491f, 0.000000f, -1.000000f, 0.000000f, 259.609426f, 262.581684f }, -{ -21.436935f, -20.966740f, -43.886723f, 0.000000f, -1.000000f, 0.000000f, 230.858877f, 269.844599f }, -{ -46.551262f, -20.966736f, -52.197575f, 0.000000f, -1.000000f, 0.000000f, 197.145034f, 268.850158f }, -{ -77.706444f, -20.966743f, -55.110798f, 0.000000f, -1.000000f, 0.000000f, 158.547374f, 258.754495f }, -{ -148.686584f, -20.966743f, -55.110798f, 0.000000f, -1.000000f, 0.000000f, 73.505490f, 227.801797f }, -{ -105.897141f, -20.966753f, 85.087540f, 0.000000f, -1.000000f, 0.000000f, 185.908946f, 78.488452f }, -{ -105.897141f, -20.966742f, -23.647968f, 0.000000f, -1.000000f, 0.000000f, 138.492050f, 208.765350f }, -{ -77.958153f, -20.966742f, -23.647968f, 0.000000f, -1.000000f, 0.000000f, 171.965974f, 220.948864f }, -{ -58.874207f, -20.966740f, -21.368664f, 0.000000f, -1.000000f, 0.000000f, 195.824559f, 226.540055f }, -{ -44.341877f, -20.966745f, -15.146022f, 0.000000f, -1.000000f, 0.000000f, 215.949404f, 225.421851f }, -{ -33.878738f, -20.966743f, -5.902942f, 0.000000f, -1.000000f, 0.000000f, 232.516059f, 218.910357f }, -{ -27.002363f, -20.966749f, 5.437657f, 0.000000f, -1.000000f, 0.000000f, 245.700060f, 208.321713f }, -{ -23.230320f, -20.966747f, 17.952679f, 0.000000f, -1.000000f, 0.000000f, 255.676941f, 194.972086f }, -{ -22.080179f, -20.966755f, 30.719687f, 0.000000f, -1.000000f, 0.000000f, 262.622269f, 180.177463f }, -{ -23.442402f, -20.966751f, 44.972424f, 0.000000f, -1.000000f, 0.000000f, 267.205431f, 162.507202f }, -{ -27.692215f, -20.966751f, 57.903645f, 0.000000f, -1.000000f, 0.000000f, 267.752663f, 145.160958f }, -{ -35.074326f, -20.966751f, 68.947113f, 0.000000f, -1.000000f, 0.000000f, 263.723906f, 128.710531f }, -{ -45.833443f, -20.966755f, 77.536469f, 0.000000f, -1.000000f, 0.000000f, 254.578922f, 113.727776f }, -{ -60.214287f, -20.966755f, 83.105392f, 0.000000f, -1.000000f, 0.000000f, 239.777576f, 100.784454f }, -{ -78.461555f, -20.966755f, 85.087540f, 0.000000f, -1.000000f, 0.000000f, 218.779751f, 90.452444f }, -{ 53.459190f, 2.970489f, -63.834198f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 2.970482f, 19.696451f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 2.970485f, 19.696451f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 2.970482f, 37.767296f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 2.970482f, 37.767296f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 2.970471f, 52.887688f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 54.761124f, 2.970478f, 61.040325f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 58.744659f, 2.970474f, 68.629539f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 65.526382f, 2.970473f, 75.245560f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 75.222885f, 2.970474f, 80.478622f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 87.950760f, 2.970474f, 83.918953f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 103.826599f, 2.970474f, 85.156792f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 107.486267f, 2.970474f, 85.094475f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.371353f, 2.970474f, 84.904106f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 115.334160f, 2.970474f, 84.580559f, 0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 119.227013f, 2.970474f, 84.118721f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 122.902229f, 2.970474f, 83.513466f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 126.212128f, 2.970474f, 82.759666f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 114.179916f, 2.970478f, 65.426537f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 112.235428f, 2.970474f, 65.933624f, 0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 110.283180f, 2.970474f, 66.348511f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 108.268738f, 2.970474f, 66.671196f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 106.137703f, 2.970474f, 66.901688f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 103.835670f, 2.970474f, 67.039986f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 101.308228f, 2.970474f, 67.086082f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 95.838806f, 2.970474f, 66.577293f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 91.224388f, 2.970478f, 65.167015f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 87.527145f, 2.970478f, 63.029404f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 84.809280f, 2.970478f, 60.338612f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 83.132957f, 2.970478f, 57.268784f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970479f, 53.994072f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970478f, 37.767296f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 2.970478f, 37.767296f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 2.970482f, 19.696451f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970482f, 19.696451f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970489f, -63.834198f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 109.261765f, 2.970490f, -33.040283f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 158.509918f, 2.970482f, 10.661288f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 110.660858f, 2.970478f, 56.206810f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.037323f, 2.970478f, 56.206810f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 175.299042f, 2.970477f, 25.597071f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 203.001129f, 2.970478f, 56.206810f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 237.139038f, 2.970478f, 56.206810f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 189.569809f, 2.970482f, 11.767657f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 239.097778f, 2.970486f, -33.040283f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 202.161682f, 2.970486f, -33.040283f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.620132f, 2.970482f, -3.168332f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 143.679504f, 2.970490f, -33.040283f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 246.695496f, 2.970477f, 44.635109f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 246.695496f, 2.970479f, 54.095207f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 243.335144f, 2.970479f, 54.095207f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 243.335144f, 2.970478f, 56.104118f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 252.174316f, 2.970478f, 56.104118f, -0.000001f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 252.174316f, 2.970475f, 54.095207f, -0.000001f, -1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 248.813965f, 2.970479f, 54.095207f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 248.813965f, 2.970477f, 44.635109f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 253.836212f, 2.970477f, 44.635109f, -0.000002f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 253.836212f, 2.970478f, 56.341530f, -0.000001f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 258.931549f, 2.970471f, 51.191429f, -0.000001f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 264.026886f, 2.970478f, 56.341530f, 0.000002f, -1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 264.026886f, 2.970477f, 44.635109f, 0.000003f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 261.908356f, 2.970477f, 44.635109f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 261.908356f, 2.970467f, 51.721062f, 0.000000f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 258.931549f, 2.970471f, 48.634651f, -0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 255.954681f, 2.970471f, 51.721062f, -0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 255.954681f, 2.970477f, 44.635109f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 53.398365f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.398365f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 58.399651f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 58.399651f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 64.683319f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 64.683319f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 69.684608f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 69.684608f, 9.484118f, -92.719223f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 71.361206f, 9.484118f, -90.693527f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 75.070610f, 9.484118f, -89.192673f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 78.221947f, 9.484118f, -90.116470f, -0.000001f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 80.447113f, 9.484106f, -92.906830f, -0.000001f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 81.069901f, 9.484118f, -95.010895f, 0.000000f, -1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 81.290161f, 9.484118f, -97.592270f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 81.290161f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 76.288872f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 76.288872f, 9.484118f, -97.720505f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 76.046646f, 9.484118f, -95.573715f, 0.000000f, -1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 74.507790f, 9.484118f, -93.751663f, -0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 72.154381f, 9.484118f, -93.999222f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 70.869621f, 9.484118f, -95.136749f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 69.684608f, 9.484118f, -97.015213f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 69.684608f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 116.042702f, 9.484123f, -111.377884f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 116.042702f, 9.484123f, -116.315048f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 112.247803f, 9.484123f, -118.552078f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 107.574234f, 9.484123f, -118.394455f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 103.539482f, 9.484123f, -115.040680f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 102.209610f, 9.484123f, -112.118805f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 101.385559f, 9.484118f, -108.374069f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 101.102959f, 9.484118f, -103.811813f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 101.339844f, 9.484118f, -99.454697f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 102.036247f, 9.484118f, -95.777939f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 103.170799f, 9.484106f, -92.831436f, 0.000002f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 104.722122f, 9.484118f, -90.665039f, -0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 107.933678f, 9.484118f, -88.927658f, 0.000000f, -1.000000f, 0.000003f, 0.000000f, 255.000000f }, -{ 111.632736f, 9.484118f, -89.470520f, 0.000001f, -1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 113.549179f, 9.484118f, -91.009384f, 0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 114.952675f, 9.484106f, -93.103928f, -0.000002f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 116.387047f, 9.484118f, -99.154877f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 116.619774f, 9.484118f, -104.965958f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 106.104248f, 9.484118f, -104.965958f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 106.676575f, 9.484123f, -110.009995f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 108.374535f, 9.484123f, -113.130463f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.169655f, 9.484123f, -114.199112f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 113.774490f, 9.484123f, -113.485794f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 106.040123f, 9.484118f, -101.247055f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.618484f, 9.484118f, -101.247055f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.312141f, 9.484118f, -96.746857f, -0.000001f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 110.364601f, 9.484118f, -94.098984f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 108.733131f, 9.484106f, -93.232178f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 107.208519f, 9.484118f, -94.113220f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 106.325096f, 9.484118f, -96.775345f, 0.000001f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 122.262253f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 122.262253f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 127.263535f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 127.391785f, 9.484118f, -97.335800f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 128.306671f, 9.484118f, -94.372665f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 129.111130f, 9.484118f, -92.203903f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 129.876404f, 9.484118f, -90.715500f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 131.574371f, 9.484118f, -89.323883f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 133.556717f, 9.484118f, -89.280533f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 135.214310f, 9.484118f, -90.026230f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 134.829590f, 9.484118f, -95.155746f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 132.649551f, 9.484118f, -94.450439f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 130.914764f, 9.484118f, -95.135269f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 129.543335f, 9.484118f, -96.915451f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 128.513855f, 9.484118f, -99.379593f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 127.804985f, 9.484118f, -102.116226f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 127.395340f, 9.484118f, -104.713943f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 127.263535f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 155.668289f, 9.484123f, -112.788498f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 155.668289f, 9.484123f, -116.571518f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 154.127060f, 9.484123f, -117.804031f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 152.305023f, 9.484123f, -118.637589f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 150.903000f, 9.484123f, -118.586227f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 149.472794f, 9.484123f, -117.781754f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 148.448669f, 9.484123f, -116.186508f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 148.102249f, 9.484123f, -115.096786f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 146.276031f, 9.484123f, -117.172348f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 142.652115f, 9.484123f, -118.815689f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 139.866501f, 9.484123f, -117.808792f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 137.850311f, 9.484123f, -115.206024f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 137.073761f, 9.484123f, -111.634354f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 138.144791f, 9.484118f, -107.571106f, 0.000001f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 141.623840f, 9.484118f, -104.049301f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 144.391052f, 9.484118f, -102.166397f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.909882f, 9.484118f, -100.028793f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.909882f, 9.484118f, -97.335800f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.180527f, 9.484118f, -94.538605f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 145.869064f, 9.484118f, -93.718704f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 143.898575f, 9.484118f, -93.732071f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 141.682312f, 9.484118f, -94.706924f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 137.779068f, 9.484118f, -98.297592f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 137.779068f, 9.484118f, -92.526871f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 141.658264f, 9.484118f, -89.665543f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 144.054428f, 9.484118f, -88.951340f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.152328f, 9.484118f, -89.072159f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 150.474655f, 9.484118f, -90.715500f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 152.600082f, 9.484118f, -94.111435f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 152.911179f, 9.484118f, -96.502243f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 152.932556f, 9.484123f, -113.100784f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 153.103531f, 9.484123f, -113.846451f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 153.680603f, 9.484123f, -114.199112f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 154.124680f, 9.484123f, -114.032883f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 154.796753f, 9.484123f, -113.553177f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.909882f, 9.484123f, -110.800797f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.909882f, 9.484118f, -103.491226f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 146.048050f, 9.484118f, -104.727600f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 144.556686f, 9.484118f, -105.944382f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 143.421539f, 9.484118f, -107.154037f, -0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 142.162918f, 9.484122f, -109.601837f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 142.329147f, 9.484123f, -112.551010f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 143.188812f, 9.484123f, -113.667160f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 144.447449f, 9.484123f, -114.070877f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 145.715591f, 9.484123f, -113.693283f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 146.898224f, 9.484123f, -112.589005f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.430771f, 9.484123f, -111.777725f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.749878f, 9.484123f, -112.467911f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.749878f, 9.484123f, -117.276840f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 172.085159f, 9.484123f, -118.160263f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 168.812698f, 9.484123f, -118.815689f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 166.009262f, 9.484123f, -118.315506f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 163.547806f, 9.484123f, -116.887375f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 161.503128f, 9.484123f, -114.639938f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 159.950012f, 9.484123f, -111.681854f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 158.963303f, 9.484118f, -108.121765f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 158.617767f, 9.484118f, -104.068314f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 159.531387f, 9.484118f, -96.903595f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 163.822617f, 9.484118f, -90.542221f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 169.115997f, 9.484118f, -88.872086f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.301041f, 9.484118f, -89.897995f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.301041f, 9.484118f, -95.027512f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 169.582138f, 9.484118f, -93.616898f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 166.473557f, 9.484118f, -94.882645f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 164.462112f, 9.484118f, -98.442444f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 163.747299f, 9.484118f, -103.940063f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 164.523849f, 9.484122f, -109.302322f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 166.711029f, 9.484123f, -112.812241f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 171.313354f, 9.484123f, -113.911758f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 188.369019f, 9.484123f, -113.301437f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 188.369019f, 9.484123f, -117.725662f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 186.637802f, 9.484123f, -118.378738f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 184.602036f, 9.484123f, -118.792831f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 182.419891f, 9.484123f, -118.666077f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 181.128311f, 9.484123f, -118.195877f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 180.089645f, 9.484123f, -117.373001f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 179.323486f, 9.484123f, -116.165436f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 178.849426f, 9.484123f, -114.541092f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 178.687042f, 9.484123f, -112.467911f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 178.687042f, 9.484118f, -94.001602f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 175.416977f, 9.484118f, -94.001602f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 178.200211f, 9.484118f, -89.945480f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 180.755478f, 9.484117f, -86.238449f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.239502f, 9.484117f, -82.331924f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.688324f, 9.484117f, -82.331924f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.688324f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 188.369019f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 188.369019f, 9.484118f, -94.001602f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.688324f, 9.484118f, -94.001602f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.724243f, 9.484123f, -111.466034f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.847443f, 9.484123f, -112.446518f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 184.448257f, 9.484123f, -113.686172f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 184.972198f, 9.484123f, -113.977371f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 186.488205f, 9.484123f, -113.985397f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 192.280289f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 192.280289f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 197.281570f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 197.281570f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 209.400085f, 9.484123f, -118.687454f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 200.872238f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 205.873535f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 210.041275f, 9.484118f, -105.863632f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 210.169510f, 9.484118f, -105.863632f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 214.337250f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 219.338531f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 210.810699f, 9.484123f, -118.687454f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ -227.530014f, 20.966755f, 18.889763f, 0.000000f, 1.000000f, 0.000000f, 11.312366f, 104.759421f }, -{ -227.530014f, 20.966747f, 49.094074f, 0.000000f, 1.000000f, 0.000000f, 24.483732f, 68.571394f }, -{ -220.271423f, 20.966747f, 49.922592f, 0.000000f, 1.000000f, 0.000000f, 33.541610f, 70.744042f }, -{ -214.348251f, 20.966747f, 52.198406f, 0.000000f, 1.000000f, 0.000000f, 41.630631f, 70.600318f }, -{ -209.753510f, 20.966751f, 55.606876f, 0.000000f, 1.000000f, 0.000000f, 48.621982f, 68.520264f }, -{ -206.480209f, 20.966751f, 59.833382f, 0.000000f, 1.000000f, 0.000000f, 54.386827f, 64.883844f }, -{ -204.521362f, 20.966751f, 64.563332f, 0.000000f, 1.000000f, 0.000000f, 58.796350f, 60.071068f }, -{ -203.869965f, 20.966747f, 69.482018f, 0.000000f, 1.000000f, 0.000000f, 61.721714f, 54.462006f }, -{ -204.699646f, 20.966745f, 74.975189f, 0.000000f, 1.000000f, 0.000000f, 63.123110f, 47.518791f }, -{ -207.067520f, 20.966745f, 79.783180f, 0.000000f, 1.000000f, 0.000000f, 62.382784f, 40.725728f }, -{ -210.791794f, 20.966745f, 83.766144f, 0.000000f, 1.000000f, 0.000000f, 59.657578f, 34.329638f }, -{ -215.690674f, 20.966745f, 86.784241f, 0.000000f, 1.000000f, 0.000000f, 55.104305f, 28.577339f }, -{ -221.582382f, 20.966745f, 88.697647f, 0.000000f, 1.000000f, 0.000000f, 48.879791f, 23.715652f }, -{ -228.285126f, 20.966745f, 89.366524f, 0.000000f, 1.000000f, 0.000000f, 41.140860f, 19.991366f }, -{ -233.272552f, 20.966745f, 89.153275f, 0.000000f, 1.000000f, 0.000000f, 35.072392f, 18.071967f }, -{ -238.232040f, 20.966745f, 88.499550f, 0.000000f, 1.000000f, 0.000000f, 28.845318f, 16.692474f }, -{ -243.261429f, 20.966745f, 87.384369f, 0.000000f, 1.000000f, 0.000000f, 22.333258f, 15.835392f }, -{ -248.458618f, 20.966745f, 85.786751f, 0.000000f, 1.000000f, 0.000000f, 15.409784f, 15.483151f }, -{ -253.921509f, 20.966745f, 83.685738f, 0.000000f, 1.000000f, 0.000000f, 7.948449f, 15.618150f }, -{ -259.747955f, 20.966745f, 81.060341f, 0.000000f, 1.000000f, 0.000000f, -0.177137f, 16.222895f }, -{ -259.747955f, 20.966743f, 111.264641f, 0.000000f, 1.000000f, 0.000000f, 12.994218f, -19.965132f }, -{ -253.885376f, 20.966743f, 113.571915f, 0.000000f, 1.000000f, 0.000000f, 21.024369f, -20.172966f }, -{ -247.666229f, 20.966742f, 115.459694f, 0.000000f, 1.000000f, 0.000000f, 29.298793f, -19.722705f }, -{ -241.153412f, 20.966742f, 116.927956f, 0.000000f, 1.000000f, 0.000000f, 37.742128f, -18.641769f }, -{ -234.409882f, 20.966742f, 117.976715f, 0.000000f, 1.000000f, 0.000000f, 46.278944f, -16.957608f }, -{ -227.498550f, 20.966742f, 118.605980f, 0.000000f, 1.000000f, 0.000000f, 54.833877f, -14.697672f }, -{ -220.482346f, 20.966742f, 118.815727f, 0.000000f, 1.000000f, 0.000000f, 63.331513f, -11.889380f }, -{ -205.143631f, 20.966742f, 117.432526f, 0.000000f, 1.000000f, 0.000000f, 81.105774f, -3.543295f }, -{ -191.825546f, 20.966743f, 113.455399f, 0.000000f, 1.000000f, 0.000000f, 95.327947f, 7.029410f }, -{ -180.870651f, 20.966740f, 107.143021f, 0.000000f, 1.000000f, 0.000000f, 105.700425f, 19.369491f }, -{ -172.621567f, 20.966740f, 98.754097f, 0.000000f, 1.000000f, 0.000000f, 111.925517f, 33.017553f }, -{ -167.420868f, 20.966738f, 88.547325f, 0.000000f, 1.000000f, 0.000000f, 113.705593f, 47.514262f }, -{ -165.611176f, 20.966738f, 76.781395f, 0.000000f, 1.000000f, 0.000000f, 110.742960f, 62.400282f }, -{ -166.340637f, 20.966747f, 68.696609f, 0.000000f, 1.000000f, 0.000000f, 106.343412f, 71.768634f }, -{ -168.510422f, 20.966751f, 61.101219f, 0.000000f, 1.000000f, 0.000000f, 100.431613f, 79.922540f }, -{ -172.092514f, 20.966747f, 54.065197f, 0.000000f, 1.000000f, 0.000000f, 93.071636f, 86.790398f }, -{ -177.058975f, 20.966749f, 47.658436f, 0.000000f, 1.000000f, 0.000000f, 84.327446f, 92.300634f }, -{ -183.381851f, 20.966749f, 41.950848f, 0.000000f, 1.000000f, 0.000000f, 74.263017f, 96.381691f }, -{ -191.033142f, 20.966749f, 37.012348f, 0.000000f, 1.000000f, 0.000000f, 62.942388f, 98.962011f }, -{ -181.454453f, 20.966749f, 32.298752f, 0.000000f, 1.000000f, 0.000000f, 72.363211f, 108.786445f }, -{ -173.805496f, 20.966751f, 26.319649f, 0.000000f, 1.000000f, 0.000000f, 78.920146f, 119.285570f }, -{ -168.002350f, 20.966755f, 19.235847f, 0.000000f, 1.000000f, 0.000000f, 82.783870f, 130.303345f }, -{ -163.961121f, 20.966755f, 11.208177f, 0.000000f, 1.000000f, 0.000000f, 84.125031f, 141.683643f }, -{ -161.597916f, 20.966753f, 2.397416f, 0.000000f, 1.000000f, 0.000000f, 83.114247f, 153.270422f }, -{ -160.828827f, 20.966753f, -7.035606f, 0.000000f, 1.000000f, 0.000000f, 79.922183f, 164.907587f }, -{ -162.772522f, 20.966755f, -21.426933f, 0.000000f, 1.000000f, 0.000000f, 71.317727f, 181.302347f }, -{ -168.407867f, 20.966755f, -33.734711f, 0.000000f, 1.000000f, 0.000000f, 59.198847f, 193.590963f }, -{ -177.441193f, 20.966757f, -43.721252f, 0.000000f, 1.000000f, 0.000000f, 44.021060f, 201.616710f }, -{ -189.578857f, 20.966757f, -51.148804f, 0.000000f, 1.000000f, 0.000000f, 26.239853f, 205.222777f }, -{ -204.527191f, 20.966757f, -55.779663f, 0.000000f, 1.000000f, 0.000000f, 6.310730f, 204.252446f }, -{ -221.992554f, 20.966764f, -57.376114f, 0.000000f, 1.000000f, 0.000000f, -15.310837f, 198.548949f }, -{ -229.371170f, 20.966764f, -57.068481f, 0.000000f, 1.000000f, 0.000000f, -24.017065f, 194.962735f }, -{ -236.805725f, 20.966764f, -56.173538f, 0.000000f, 1.000000f, 0.000000f, -32.534211f, 190.648469f }, -{ -244.142380f, 20.966764f, -54.733246f, 0.000000f, 1.000000f, 0.000000f, -40.696227f, 185.723508f }, -{ -251.227341f, 20.966764f, -52.789536f, 0.000000f, 1.000000f, 0.000000f, -48.337180f, 180.305151f }, -{ -257.906799f, 20.966764f, -50.384384f, 0.000000f, 1.000000f, 0.000000f, -55.291061f, 174.510773f }, -{ -264.026886f, 20.966764f, -47.559723f, 0.000000f, 1.000000f, 0.000000f, -61.391828f, 168.457698f }, -{ -264.026886f, 20.966753f, -14.334975f, 0.000000f, 1.000000f, 0.000000f, -46.903330f, 128.650867f }, -{ -257.339294f, 20.966755f, -18.662872f, 0.000000f, 1.000000f, 0.000000f, -40.778150f, 136.752450f }, -{ -251.050217f, 20.966759f, -22.109795f, 0.000000f, 1.000000f, 0.000000f, -34.746278f, 143.624746f }, -{ -245.054810f, 20.966759f, -24.717712f, 0.000000f, 1.000000f, 0.000000f, -28.700388f, 149.363761f }, -{ -239.248169f, 20.966759f, -26.528572f, 0.000000f, 1.000000f, 0.000000f, -22.533070f, 154.065507f }, -{ -233.525421f, 20.966759f, -27.584328f, 0.000000f, 1.000000f, 0.000000f, -16.136991f, 157.825968f }, -{ -227.781708f, 20.966759f, -27.926926f, 0.000000f, 1.000000f, 0.000000f, -9.404798f, 160.741125f }, -{ -220.280746f, 20.966759f, -27.192787f, 0.000000f, 1.000000f, 0.000000f, -0.097693f, 163.132535f }, -{ -213.751633f, 20.966759f, -25.074295f, 0.000000f, 1.000000f, 0.000000f, 8.648710f, 163.441542f }, -{ -208.369156f, 20.966755f, -21.697281f, 0.000000f, 1.000000f, 0.000000f, 16.570136f, 161.742676f }, -{ -204.308121f, 20.966755f, -17.187607f, 0.000000f, 1.000000f, 0.000000f, 23.402251f, 158.110519f }, -{ -201.743317f, 20.966753f, -11.671119f, 0.000000f, 1.000000f, 0.000000f, 28.880766f, 152.619616f }, -{ -200.849533f, 20.966753f, -5.273689f, 0.000000f, 1.000000f, 0.000000f, 32.741376f, 145.344564f }, -{ -201.724655f, 20.966753f, 1.288060f, 0.000000f, 1.000000f, 0.000000f, 34.554308f, 137.101256f }, -{ -204.242859f, 20.966751f, 7.031769f, 0.000000f, 1.000000f, 0.000000f, 34.041921f, 129.121548f }, -{ -208.243301f, 20.966755f, 11.810632f, 0.000000f, 1.000000f, 0.000000f, 31.332898f, 121.651460f }, -{ -213.565170f, 20.966755f, 15.477799f, 0.000000f, 1.000000f, 0.000000f, 26.555888f, 114.937053f }, -{ -220.047684f, 20.966755f, 17.886444f, 0.000000f, 1.000000f, 0.000000f, 19.839494f, 109.224379f }, -{ -148.686584f, 20.966726f, 116.550392f, 0.000000f, 1.000000f, 0.000000f, 148.362750f, 22.133128f }, -{ -72.924095f, 20.966726f, 116.550392f, 0.000000f, 1.000000f, 0.000000f, 239.134392f, 55.171292f }, -{ -44.133286f, 20.966728f, 113.442566f, 0.000000f, 1.000000f, 0.000000f, 272.273660f, 71.449770f }, -{ -20.467419f, 20.966740f, 104.692406f, 0.000000f, 1.000000f, 0.000000f, 296.812196f, 92.253517f }, -{ -1.975434f, 20.966738f, 91.159897f, 0.000000f, 1.000000f, 0.000000f, 313.066387f, 116.530840f }, -{ 11.293716f, 20.966730f, 73.705025f, 0.000000f, 1.000000f, 0.000000f, 321.352617f, 143.230008f }, -{ 19.291100f, 20.966740f, 53.187733f, 0.000000f, 1.000000f, 0.000000f, 321.987274f, 171.299414f }, -{ 21.967770f, 20.966734f, 30.467978f, 0.000000f, 1.000000f, 0.000000f, 315.286714f, 199.687280f }, -{ 19.338877f, 20.966743f, 6.999154f, 0.000000f, 1.000000f, 0.000000f, 301.902798f, 226.659158f }, -{ 11.340330f, 20.966745f, -13.645118f, 0.000000f, 1.000000f, 0.000000f, 283.317205f, 247.905264f }, -{ -2.195676f, 20.966759f, -30.821503f, 0.000000f, 1.000000f, 0.000000f, 259.609396f, 262.581703f }, -{ -21.436935f, 20.966757f, -43.886719f, 0.000000f, 1.000000f, 0.000000f, 230.858877f, 269.844599f }, -{ -46.551262f, 20.966757f, -52.197571f, 0.000000f, 1.000000f, 0.000000f, 197.145034f, 268.850158f }, -{ -77.706444f, 20.966757f, -55.110794f, 0.000000f, 1.000000f, 0.000000f, 158.547374f, 258.754495f }, -{ -148.686584f, 20.966757f, -55.110794f, 0.000000f, 1.000000f, 0.000000f, 73.505490f, 227.801797f }, -{ -105.897141f, 20.966738f, 85.087578f, 0.000000f, 1.000000f, 0.000000f, 185.908961f, 78.488406f }, -{ -105.897141f, 20.966759f, -23.647980f, 0.000000f, 1.000000f, 0.000000f, 138.492035f, 208.765369f }, -{ -77.958153f, 20.966759f, -23.647980f, 0.000000f, 1.000000f, 0.000000f, 171.965959f, 220.948887f }, -{ -58.874207f, 20.966755f, -21.368675f, 0.000000f, 1.000000f, 0.000000f, 195.824544f, 226.540074f }, -{ -44.341877f, 20.966753f, -15.146018f, 0.000000f, 1.000000f, 0.000000f, 215.949404f, 225.421851f }, -{ -33.878738f, 20.966745f, -5.902946f, 0.000000f, 1.000000f, 0.000000f, 232.516059f, 218.910365f }, -{ -27.002363f, 20.966743f, 5.437653f, 0.000000f, 1.000000f, 0.000000f, 245.700045f, 208.321724f }, -{ -23.230320f, 20.966747f, 17.952866f, 0.000000f, 1.000000f, 0.000000f, 255.676941f, 194.972041f }, -{ -22.080179f, 20.966734f, 30.719679f, 0.000000f, 1.000000f, 0.000000f, 262.622269f, 180.177478f }, -{ -23.442402f, 20.966742f, 44.972439f, 0.000000f, 1.000000f, 0.000000f, 267.205431f, 162.507187f }, -{ -27.692215f, 20.966743f, 57.903660f, 0.000000f, 1.000000f, 0.000000f, 267.752663f, 145.160943f }, -{ -35.074326f, 20.966740f, 68.947144f, 0.000000f, 1.000000f, 0.000000f, 263.723906f, 128.710501f }, -{ -45.833443f, 20.966738f, 77.536499f, 0.000000f, 1.000000f, 0.000000f, 254.578922f, 113.727730f }, -{ -60.214287f, 20.966738f, 83.105423f, 0.000000f, 1.000000f, 0.000000f, 239.777591f, 100.784424f }, -{ -78.461555f, 20.966738f, 85.087578f, 0.000000f, 1.000000f, 0.000000f, 218.779751f, 90.452398f }, -{ 53.459190f, 21.106728f, -63.834198f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 21.106720f, 19.696632f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 21.106720f, 19.696632f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 21.106718f, 37.767292f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 21.106718f, 37.767292f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 21.106716f, 52.887684f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 54.761124f, 21.106716f, 61.040321f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 58.744659f, 21.106709f, 68.629570f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 65.526382f, 21.106707f, 75.245590f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 75.222885f, 21.106714f, 80.478653f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 87.950760f, 21.106714f, 83.918983f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 103.826599f, 21.106714f, 85.156822f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 107.486267f, 21.106707f, 85.094505f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.371353f, 21.106707f, 84.904137f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 115.334160f, 21.106707f, 84.580589f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 119.227013f, 21.106707f, 84.118752f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 122.902229f, 21.106707f, 83.513496f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 126.212128f, 21.106707f, 82.759697f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 114.179916f, 21.106716f, 65.426567f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 112.235428f, 21.106709f, 65.933655f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 110.283180f, 21.106709f, 66.348541f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 108.268738f, 21.106709f, 66.671227f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 106.137703f, 21.106709f, 66.901718f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 103.835670f, 21.106709f, 67.040016f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 101.308228f, 21.106709f, 67.086113f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 95.838806f, 21.106709f, 66.577324f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 91.224388f, 21.106716f, 65.167046f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 87.527145f, 21.106716f, 63.029400f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 84.809280f, 21.106716f, 60.338608f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 83.132957f, 21.106716f, 57.268780f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106716f, 53.994068f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106718f, 37.767292f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 21.106718f, 37.767292f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 21.106720f, 19.696632f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106720f, 19.696632f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106728f, -63.834198f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 109.261765f, 21.106724f, -33.040283f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 158.509918f, 21.106720f, 10.661286f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 110.660858f, 21.106716f, 56.206806f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.037323f, 21.106716f, 56.206806f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 175.299042f, 21.106712f, 25.597252f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 203.001129f, 21.106716f, 56.206806f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 237.139038f, 21.106712f, 56.206806f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 189.569809f, 21.106720f, 11.767655f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 239.097778f, 21.106724f, -33.040283f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 202.161682f, 21.106724f, -33.040283f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.620132f, 21.106722f, -3.168342f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 143.679504f, 21.106724f, -33.040283f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 246.695496f, 21.106710f, 44.635105f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 246.695496f, 21.106709f, 54.095203f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 243.335144f, 21.106709f, 54.095203f, 0.000000f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 243.335144f, 21.106712f, 56.104115f, 0.000000f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 252.174316f, 21.106712f, 56.104115f, 0.000000f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 252.174316f, 21.106709f, 54.095203f, 0.000000f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 248.813965f, 21.106709f, 54.095203f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 248.813965f, 21.106710f, 44.635105f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 253.836212f, 21.106710f, 44.635105f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 253.836212f, 21.106712f, 56.341526f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 258.931549f, 21.106709f, 51.191425f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 264.026886f, 21.106712f, 56.341526f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 264.026886f, 21.106710f, 44.635105f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 261.908356f, 21.106710f, 44.635105f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 261.908356f, 21.106709f, 51.721058f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 258.931549f, 21.106709f, 48.634647f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 255.954681f, 21.106709f, 51.721058f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 255.954681f, 21.106710f, 44.635105f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.398365f, 21.091320f, -118.046234f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.398365f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 58.399651f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 58.399651f, 21.091320f, -118.046234f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 64.683319f, 21.091320f, -118.046234f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 64.683319f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 69.684608f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 69.684608f, 21.091311f, -92.719193f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 71.361206f, 21.091311f, -90.693512f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 75.070610f, 21.091311f, -89.192642f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 78.221947f, 21.091311f, -90.116440f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 80.447113f, 21.091311f, -92.906815f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 81.069901f, 21.091311f, -95.010880f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 81.290161f, 21.091311f, -97.592255f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 81.290161f, 21.091320f, -118.046234f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 76.288872f, 21.091320f, -118.046234f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 76.288872f, 21.091311f, -97.720490f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 76.046646f, 21.091311f, -95.573685f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 74.507790f, 21.091311f, -93.751633f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 72.154381f, 21.091311f, -93.999207f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 70.869621f, 21.091311f, -95.136734f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 69.684608f, 21.091311f, -97.015182f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 69.684608f, 21.091320f, -118.046234f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 116.042702f, 21.091320f, -111.377853f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 116.042702f, 21.091320f, -116.315018f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 112.247803f, 21.091320f, -118.552063f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 107.574234f, 21.091320f, -118.394440f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 103.539482f, 21.091320f, -115.040665f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 102.209610f, 21.091320f, -112.118790f, -0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 101.385559f, 21.091312f, -108.374054f, -0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 101.102959f, 21.091311f, -103.811798f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 101.339844f, 21.091307f, -99.454666f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 102.036247f, 21.091311f, -95.777908f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 103.170799f, 21.091311f, -92.831406f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 104.722122f, 21.091311f, -90.665024f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 107.933678f, 21.091311f, -88.927628f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.632736f, 21.091311f, -89.470505f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 113.549179f, 21.091311f, -91.009354f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 114.952675f, 21.091311f, -93.103912f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 116.387047f, 21.091307f, -99.154861f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 116.619774f, 21.091309f, -104.965942f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 106.104248f, 21.091312f, -104.965942f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 106.676575f, 21.091320f, -110.009979f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 108.374535f, 21.091320f, -113.130447f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.169655f, 21.091320f, -114.199097f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 113.774490f, 21.091320f, -113.485764f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 106.040123f, 21.091307f, -101.247040f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.618484f, 21.091307f, -101.247040f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.312141f, 21.091311f, -96.746841f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 110.364601f, 21.091311f, -94.098953f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 108.733131f, 21.091311f, -93.232162f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 107.208519f, 21.091311f, -94.113205f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 106.325096f, 21.091311f, -96.775330f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 122.262253f, 21.091320f, -118.046234f, 0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 122.262253f, 21.091311f, -89.641495f, -0.000003f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 127.263535f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 127.391785f, 21.091311f, -97.335770f, -0.000004f, 1.000000f, -0.000003f, 0.000000f, 255.000000f }, -{ 128.306671f, 21.091311f, -94.372635f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 129.111130f, 21.091311f, -92.203873f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 129.876404f, 21.091311f, -90.715469f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 131.574371f, 21.091311f, -89.323868f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 133.556717f, 21.091311f, -89.280518f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 135.214310f, 21.091311f, -90.026199f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 134.829590f, 21.091311f, -95.155716f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 132.649551f, 21.091311f, -94.450424f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 130.914764f, 21.091311f, -95.135239f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 129.543335f, 21.091311f, -96.915436f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 128.513855f, 21.091307f, -99.379562f, -0.000005f, 1.000000f, -0.000004f, 0.000000f, 255.000000f }, -{ 127.804985f, 21.091307f, -102.116196f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 127.395340f, 21.091309f, -104.713913f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 127.263535f, 21.091320f, -118.046234f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 155.668289f, 21.091312f, -112.788467f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 155.668289f, 21.091312f, -116.571503f, 0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 154.127060f, 21.091320f, -117.804016f, 0.000001f, 1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 152.305023f, 21.091320f, -118.637558f, 0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 150.903000f, 21.091320f, -118.586197f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 149.472794f, 21.091320f, -117.781738f, 0.000003f, 1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 148.448669f, 21.091320f, -116.186478f, 0.000012f, 1.000000f, 0.000005f, 0.000000f, 255.000000f }, -{ 148.102249f, 21.091320f, -115.096756f, 0.000003f, 1.000000f, 0.000003f, 0.000000f, 255.000000f }, -{ 146.276031f, 21.091320f, -117.172318f, 0.000001f, 1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 142.652115f, 21.091320f, -118.815659f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 139.866501f, 21.091320f, -117.808762f, -0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 137.850311f, 21.091320f, -115.206009f, 0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 137.073761f, 21.091320f, -111.634323f, 0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 138.144791f, 21.091309f, -107.571091f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 141.623840f, 21.091307f, -104.049286f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 144.391052f, 21.091307f, -102.166382f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.909882f, 21.091307f, -100.028778f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.909882f, 21.091311f, -97.335770f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.180527f, 21.091311f, -94.538589f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 145.869064f, 21.091311f, -93.718689f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 143.898575f, 21.091311f, -93.732040f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 141.682312f, 21.091311f, -94.706894f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 137.779068f, 21.091307f, -98.297562f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 137.779068f, 21.091311f, -92.526840f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 141.658264f, 21.091311f, -89.665527f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 144.054428f, 21.091311f, -88.951309f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.152328f, 21.091311f, -89.072128f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 150.474655f, 21.091311f, -90.715469f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 152.600082f, 21.091311f, -94.111420f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 152.911179f, 21.091311f, -96.502228f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 152.932556f, 21.091312f, -113.100754f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 153.103531f, 21.091312f, -113.846436f, 0.000002f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 153.680603f, 21.091312f, -114.199097f, 0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 154.124680f, 21.091312f, -114.032852f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 154.796753f, 21.091312f, -113.553146f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.909882f, 21.091312f, -110.800781f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 147.909882f, 21.091307f, -103.491211f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 146.048050f, 21.091309f, -104.727585f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 144.556686f, 21.091309f, -105.944351f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 143.421539f, 21.091309f, -107.154007f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 142.628372f, 21.091309f, -108.369003f, 0.000003f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 142.162918f, 21.091312f, -109.601822f, 0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 142.010925f, 21.091312f, -110.864899f, 0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 142.329147f, 21.091312f, -112.550995f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 143.188812f, 21.091320f, -113.667130f, -0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 144.447449f, 21.091320f, -114.070847f, 0.000002f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 145.715591f, 21.091312f, -113.693268f, 0.000000f, 1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 146.898224f, 21.091312f, -112.588989f, -0.000002f, 1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 147.430771f, 21.091312f, -111.777710f, 0.000004f, 1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 173.749878f, 21.091312f, -112.467880f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.749878f, 21.091312f, -117.276810f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 172.085159f, 21.091312f, -118.160233f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 168.812698f, 21.091312f, -118.815659f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 166.009262f, 21.091312f, -118.315475f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 163.547806f, 21.091312f, -116.887344f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 161.503128f, 21.091312f, -114.639908f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 159.950012f, 21.091312f, -111.681839f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 158.963303f, 21.091309f, -108.121750f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 158.617767f, 21.091307f, -104.068283f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 159.531387f, 21.091311f, -96.903564f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 163.822617f, 21.091311f, -90.542206f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 169.115997f, 21.091311f, -88.872055f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.301041f, 21.091311f, -89.897964f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.301041f, 21.091311f, -95.027481f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 169.582138f, 21.091311f, -93.616867f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 166.473557f, 21.091311f, -94.882629f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 164.462112f, 21.091307f, -98.442429f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 163.747299f, 21.091307f, -103.940048f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 164.523849f, 21.091312f, -109.302292f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 166.711029f, 21.091312f, -112.812210f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 171.313354f, 21.091312f, -113.911743f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 188.369019f, 21.091312f, -113.301422f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 188.369019f, 21.091312f, -117.725632f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 186.637802f, 21.091312f, -118.378708f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 184.602036f, 21.091312f, -118.792801f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 182.419891f, 21.091312f, -118.666061f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 181.128311f, 21.091312f, -118.195847f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 180.089645f, 21.091312f, -117.372986f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 179.323486f, 21.091312f, -116.165421f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 178.849426f, 21.091312f, -114.541061f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 178.687042f, 21.091312f, -112.467880f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 178.687042f, 21.091311f, -94.001587f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 175.416977f, 21.091311f, -94.001587f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 178.200211f, 21.091311f, -89.945450f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 180.755478f, 21.091311f, -86.238419f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.239502f, 21.091309f, -82.331909f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.688324f, 21.091309f, -82.331909f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.688324f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 188.369019f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 188.369019f, 21.091311f, -94.001587f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.688324f, 21.091311f, -94.001587f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.847443f, 21.091312f, -112.446503f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 184.081055f, 21.091312f, -113.181198f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 184.972198f, 21.091312f, -113.977341f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 186.488205f, 21.091312f, -113.985367f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 192.280289f, 21.091312f, -118.046234f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 192.280289f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 197.281570f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 197.281570f, 21.091312f, -118.046234f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 209.400085f, 21.091312f, -118.687424f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 200.872238f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 205.873535f, 21.091311f, -89.641495f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 210.041275f, 21.091309f, -105.863617f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 210.169510f, 21.091309f, -105.863617f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 214.337250f, 21.091311f, -89.641495f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 219.338531f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 210.810699f, 21.091312f, -118.687424f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 196.095139f, 9.401914f, -83.842834f, 0.000000f, -1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 197.530334f, 9.401917f, -82.099869f, 0.000000f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 197.312714f, 9.401917f, -79.852554f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 195.569748f, 9.401917f, -78.417358f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 193.322433f, 9.401917f, -78.634979f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 191.887238f, 9.401917f, -80.377945f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 192.104858f, 9.401917f, -82.625259f, 0.000000f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 193.847824f, 9.401914f, -84.060455f, 0.000000f, -1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 196.095139f, 21.005835f, -83.842834f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 197.530334f, 21.005833f, -82.099869f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 197.312714f, 21.005833f, -79.852554f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 195.569748f, 21.005836f, -78.417358f, 0.000000f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 193.322433f, 21.005836f, -78.634979f, 0.000000f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 191.887238f, 21.005833f, -80.377945f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 192.104858f, 21.005835f, -82.625259f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 193.847824f, 21.005835f, -84.060455f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 194.708786f, 21.005833f, -81.238907f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 194.708786f, 9.401917f, -81.238907f, 0.000000f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 57.212021f, 9.401914f, -83.842834f, 0.000000f, -1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 58.647217f, 9.401917f, -82.099869f, 0.000000f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 58.429596f, 9.401917f, -79.852554f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 56.686630f, 9.401917f, -78.417358f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 54.439316f, 9.401917f, -78.634979f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.004120f, 9.401917f, -80.377945f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.221741f, 9.401917f, -82.625259f, 0.000000f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 54.964706f, 9.401914f, -84.060455f, 0.000000f, -1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 57.212021f, 21.005835f, -83.842834f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 58.647217f, 21.005833f, -82.099869f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 58.429596f, 21.005833f, -79.852554f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 56.686630f, 21.005836f, -78.417358f, 0.000000f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 54.439316f, 21.005836f, -78.634979f, 0.000000f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 53.004120f, 21.005833f, -80.377945f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 53.221741f, 21.005835f, -82.625259f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 54.964706f, 21.005835f, -84.060455f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 55.825668f, 21.005833f, -81.238907f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 55.825668f, 9.401917f, -81.238907f, 0.000000f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 98.582520f, 9.484123f, -113.301437f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 98.582520f, 9.484123f, -117.725662f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 95.979660f, 9.484123f, -118.792831f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 92.633392f, 9.484123f, -118.666077f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 90.303146f, 9.484123f, -117.373001f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 89.062927f, 9.484123f, -114.541092f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 88.900543f, 9.484123f, -112.467911f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 88.900543f, 9.484118f, -94.001602f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 85.630478f, 9.484118f, -94.001602f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 88.413712f, 9.484118f, -89.945480f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 90.968979f, 9.484117f, -86.238449f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 93.453003f, 9.484117f, -82.331924f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 93.901825f, 9.484117f, -82.331924f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 93.901825f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 98.582520f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 98.582520f, 9.484118f, -94.001602f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 93.901825f, 9.484118f, -94.001602f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 94.060944f, 9.484123f, -112.446518f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 95.185699f, 9.484123f, -113.977371f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 96.701706f, 9.484123f, -113.985397f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 98.582520f, 21.091312f, -113.301422f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 98.582520f, 21.091312f, -117.725632f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 95.979660f, 21.091312f, -118.792801f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 92.633392f, 21.091312f, -118.666061f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 90.303146f, 21.091312f, -117.372986f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 89.062927f, 21.091312f, -114.541061f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 88.900543f, 21.091312f, -112.467880f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 88.900543f, 21.091311f, -94.001587f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 85.630478f, 21.091311f, -94.001587f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 88.413712f, 21.091311f, -89.945450f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 90.968979f, 21.091311f, -86.238419f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 93.453003f, 21.091309f, -82.331909f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 93.901825f, 21.091309f, -82.331909f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 93.901825f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 98.582520f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 98.582520f, 21.091311f, -94.001587f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 93.901825f, 21.091311f, -94.001587f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 94.047279f, 21.091312f, -112.455856f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 95.185699f, 21.091312f, -113.977341f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 96.701706f, 21.091312f, -113.985367f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 236.900940f, 9.484123f, -111.377884f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 236.900940f, 9.484123f, -116.315048f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 233.106049f, 9.484123f, -118.552078f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 228.432480f, 9.484123f, -118.394455f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 224.397736f, 9.484123f, -115.040680f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 223.067856f, 9.484123f, -112.118805f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 222.243805f, 9.484118f, -108.374069f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 221.961212f, 9.484118f, -103.811813f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 222.198090f, 9.484118f, -99.454697f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 222.894501f, 9.484118f, -95.777939f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 224.029053f, 9.484106f, -92.831436f, 0.000002f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 225.580368f, 9.484118f, -90.665039f, -0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 228.791931f, 9.484118f, -88.927658f, 0.000000f, -1.000000f, 0.000003f, 0.000000f, 255.000000f }, -{ 232.490982f, 9.484118f, -89.470520f, 0.000001f, -1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 234.407425f, 9.484118f, -91.009384f, 0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 235.810913f, 9.484106f, -93.103928f, -0.000002f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 237.245300f, 9.484118f, -99.154877f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 237.478027f, 9.484118f, -104.965958f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 226.962494f, 9.484118f, -104.965958f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 227.534821f, 9.484123f, -110.009995f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 229.232788f, 9.484123f, -113.130463f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 232.027893f, 9.484123f, -114.199112f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 234.632736f, 9.484123f, -113.485794f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 226.898376f, 9.484118f, -101.247055f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 232.476730f, 9.484118f, -101.247055f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 232.170380f, 9.484118f, -96.746857f, -0.000001f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 231.222839f, 9.484118f, -94.098984f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 229.591370f, 9.484106f, -93.232178f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 228.066772f, 9.484118f, -94.113220f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 227.183350f, 9.484118f, -96.775345f, 0.000001f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 236.900940f, 21.091320f, -111.377853f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 236.900940f, 21.091320f, -116.315018f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 233.106049f, 21.091320f, -118.552063f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 228.432480f, 21.091320f, -118.394440f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 224.397736f, 21.091320f, -115.040665f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 223.067856f, 21.091320f, -112.118790f, -0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 222.243805f, 21.091312f, -108.374054f, -0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 221.961212f, 21.091311f, -103.811798f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 222.198090f, 21.091307f, -99.454666f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 222.894501f, 21.091311f, -95.777908f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 224.029053f, 21.091311f, -92.831406f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 225.580368f, 21.091311f, -90.665024f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 228.791931f, 21.091311f, -88.927628f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 232.490982f, 21.091311f, -89.470505f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 234.407425f, 21.091311f, -91.009354f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 235.810913f, 21.091311f, -93.103912f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 237.245300f, 21.091307f, -99.154861f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 237.478027f, 21.091309f, -104.965942f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 226.962494f, 21.091312f, -104.965942f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 227.534821f, 21.091320f, -110.009979f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 229.232788f, 21.091320f, -113.130447f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 232.027893f, 21.091320f, -114.199097f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 234.632736f, 21.091320f, -113.485764f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 226.898376f, 21.091307f, -101.247040f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 232.476730f, 21.091307f, -101.247040f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 232.170380f, 21.091311f, -96.746841f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 231.222839f, 21.091311f, -94.098953f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 229.591370f, 21.091311f, -93.232162f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 228.066772f, 21.091311f, -94.113205f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 227.183350f, 21.091311f, -96.775330f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f } -}; - -static Face face_1[] = { -{ 1, 2, 350, 0, 4 }, -{ 1, 350, 349, 0, 3 }, -{ 2, 3, 351, 0, 4 }, -{ 2, 351, 350, 0, 2 }, -{ 3, 4, 352, 0, 4 }, -{ 3, 352, 351, 0, 2 }, -{ 4, 5, 353, 0, 4 }, -{ 4, 353, 352, 0, 2 }, -{ 5, 6, 354, 0, 4 }, -{ 5, 354, 353, 0, 2 }, -{ 6, 7, 355, 0, 4 }, -{ 6, 355, 354, 0, 2 }, -{ 7, 8, 356, 0, 4 }, -{ 7, 356, 355, 0, 2 }, -{ 8, 9, 357, 0, 4 }, -{ 8, 357, 356, 0, 2 }, -{ 9, 10, 358, 0, 4 }, -{ 9, 358, 357, 0, 2 }, -{ 10, 11, 359, 0, 4 }, -{ 10, 359, 358, 0, 2 }, -{ 11, 12, 360, 0, 4 }, -{ 11, 360, 359, 0, 2 }, -{ 12, 13, 361, 0, 4 }, -{ 12, 361, 360, 0, 2 }, -{ 13, 14, 362, 0, 4 }, -{ 13, 362, 361, 0, 2 }, -{ 14, 15, 363, 0, 4 }, -{ 14, 363, 362, 0, 2 }, -{ 15, 16, 364, 0, 4 }, -{ 15, 364, 363, 0, 2 }, -{ 16, 17, 365, 0, 4 }, -{ 16, 365, 364, 0, 2 }, -{ 17, 18, 366, 0, 4 }, -{ 17, 366, 365, 0, 2 }, -{ 18, 19, 367, 0, 6 }, -{ 18, 367, 366, 0, 2 }, -{ 20, 21, 369, 0, 4 }, -{ 20, 369, 368, 0, 3 }, -{ 21, 22, 370, 0, 4 }, -{ 21, 370, 369, 0, 2 }, -{ 22, 23, 371, 0, 4 }, -{ 22, 371, 370, 0, 2 }, -{ 23, 24, 372, 0, 4 }, -{ 23, 372, 371, 0, 2 }, -{ 24, 25, 373, 0, 4 }, -{ 24, 373, 372, 0, 2 }, -{ 25, 26, 374, 0, 4 }, -{ 25, 374, 373, 0, 2 }, -{ 26, 27, 375, 0, 4 }, -{ 26, 375, 374, 0, 2 }, -{ 27, 28, 376, 0, 4 }, -{ 27, 376, 375, 0, 2 }, -{ 28, 29, 377, 0, 4 }, -{ 28, 377, 376, 0, 2 }, -{ 29, 30, 378, 0, 4 }, -{ 29, 378, 377, 0, 2 }, -{ 30, 31, 379, 0, 4 }, -{ 30, 379, 378, 0, 2 }, -{ 31, 32, 380, 0, 4 }, -{ 31, 380, 379, 0, 2 }, -{ 32, 33, 381, 0, 4 }, -{ 32, 381, 380, 0, 2 }, -{ 33, 34, 382, 0, 4 }, -{ 33, 382, 381, 0, 2 }, -{ 34, 35, 383, 0, 4 }, -{ 34, 383, 382, 0, 2 }, -{ 35, 36, 384, 0, 4 }, -{ 35, 384, 383, 0, 2 }, -{ 36, 37, 385, 0, 4 }, -{ 36, 385, 384, 0, 2 }, -{ 37, 38, 386, 0, 4 }, -{ 37, 386, 385, 0, 2 }, -{ 38, 39, 387, 0, 4 }, -{ 38, 387, 386, 0, 2 }, -{ 39, 40, 388, 0, 4 }, -{ 39, 388, 387, 0, 2 }, -{ 40, 41, 389, 0, 4 }, -{ 40, 389, 388, 0, 2 }, -{ 41, 42, 390, 0, 4 }, -{ 41, 390, 389, 0, 2 }, -{ 42, 43, 391, 0, 4 }, -{ 42, 391, 390, 0, 2 }, -{ 43, 44, 392, 0, 4 }, -{ 43, 392, 391, 0, 2 }, -{ 44, 45, 393, 0, 4 }, -{ 44, 393, 392, 0, 2 }, -{ 45, 46, 394, 0, 4 }, -{ 45, 394, 393, 0, 2 }, -{ 46, 47, 395, 0, 4 }, -{ 46, 395, 394, 0, 2 }, -{ 47, 48, 396, 0, 4 }, -{ 47, 396, 395, 0, 2 }, -{ 48, 49, 397, 0, 4 }, -{ 48, 397, 396, 0, 2 }, -{ 49, 50, 398, 0, 4 }, -{ 49, 398, 397, 0, 2 }, -{ 50, 51, 399, 0, 4 }, -{ 50, 399, 398, 0, 2 }, -{ 51, 52, 400, 0, 4 }, -{ 51, 400, 399, 0, 2 }, -{ 52, 53, 401, 0, 4 }, -{ 52, 401, 400, 0, 2 }, -{ 53, 54, 402, 0, 4 }, -{ 53, 402, 401, 0, 2 }, -{ 54, 55, 403, 0, 4 }, -{ 54, 403, 402, 0, 2 }, -{ 55, 56, 404, 0, 6 }, -{ 55, 404, 403, 0, 2 }, -{ 57, 58, 406, 0, 4 }, -{ 57, 406, 405, 0, 3 }, -{ 58, 59, 407, 0, 4 }, -{ 58, 407, 406, 0, 2 }, -{ 59, 60, 408, 0, 4 }, -{ 59, 408, 407, 0, 2 }, -{ 60, 61, 409, 0, 4 }, -{ 60, 409, 408, 0, 2 }, -{ 61, 62, 410, 0, 4 }, -{ 61, 410, 409, 0, 2 }, -{ 62, 63, 411, 0, 4 }, -{ 62, 411, 410, 0, 2 }, -{ 63, 64, 412, 0, 4 }, -{ 63, 412, 411, 0, 2 }, -{ 64, 65, 413, 0, 4 }, -{ 64, 413, 412, 0, 2 }, -{ 65, 66, 414, 0, 4 }, -{ 65, 414, 413, 0, 2 }, -{ 66, 67, 415, 0, 4 }, -{ 66, 415, 414, 0, 2 }, -{ 67, 68, 416, 0, 4 }, -{ 67, 416, 415, 0, 2 }, -{ 68, 69, 417, 0, 4 }, -{ 68, 417, 416, 0, 2 }, -{ 69, 70, 418, 0, 4 }, -{ 69, 418, 417, 0, 2 }, -{ 70, 71, 419, 0, 4 }, -{ 70, 419, 418, 0, 2 }, -{ 71, 72, 420, 0, 4 }, -{ 71, 420, 419, 0, 2 }, -{ 72, 73, 421, 0, 4 }, -{ 72, 421, 420, 0, 2 }, -{ 73, 74, 422, 0, 4 }, -{ 73, 422, 421, 0, 2 }, -{ 74, 0, 348, 0, 6 }, -{ 74, 348, 422, 0, 2 }, -{ 75, 76, 424, 0, 4 }, -{ 75, 424, 423, 0, 3 }, -{ 76, 77, 425, 0, 4 }, -{ 76, 425, 424, 0, 2 }, -{ 77, 78, 426, 0, 4 }, -{ 77, 426, 425, 0, 2 }, -{ 78, 79, 427, 0, 4 }, -{ 78, 427, 426, 0, 2 }, -{ 79, 80, 428, 0, 4 }, -{ 79, 428, 427, 0, 2 }, -{ 80, 81, 429, 0, 4 }, -{ 80, 429, 428, 0, 2 }, -{ 81, 82, 430, 0, 4 }, -{ 81, 430, 429, 0, 2 }, -{ 82, 83, 431, 0, 4 }, -{ 82, 431, 430, 0, 2 }, -{ 83, 84, 432, 0, 4 }, -{ 83, 432, 431, 0, 2 }, -{ 84, 85, 433, 0, 4 }, -{ 84, 433, 432, 0, 2 }, -{ 85, 86, 434, 0, 4 }, -{ 85, 434, 433, 0, 2 }, -{ 86, 87, 435, 0, 4 }, -{ 86, 435, 434, 0, 2 }, -{ 87, 88, 436, 0, 4 }, -{ 87, 436, 435, 0, 2 }, -{ 88, 89, 437, 0, 6 }, -{ 88, 437, 436, 0, 2 }, -{ 90, 91, 439, 0, 4 }, -{ 90, 439, 438, 0, 2 }, -{ 91, 92, 440, 0, 4 }, -{ 91, 440, 439, 0, 2 }, -{ 92, 93, 441, 0, 4 }, -{ 92, 441, 440, 0, 2 }, -{ 93, 94, 442, 0, 4 }, -{ 93, 442, 441, 0, 2 }, -{ 94, 95, 443, 0, 4 }, -{ 94, 443, 442, 0, 2 }, -{ 95, 96, 444, 0, 4 }, -{ 95, 444, 443, 0, 2 }, -{ 96, 97, 445, 0, 4 }, -{ 96, 445, 444, 0, 2 }, -{ 97, 98, 446, 0, 4 }, -{ 97, 446, 445, 0, 2 }, -{ 98, 99, 447, 0, 4 }, -{ 98, 447, 446, 0, 2 }, -{ 99, 100, 448, 0, 4 }, -{ 99, 448, 447, 0, 2 }, -{ 100, 101, 449, 0, 4 }, -{ 100, 449, 448, 0, 2 }, -{ 101, 102, 450, 0, 4 }, -{ 101, 450, 449, 0, 2 }, -{ 102, 103, 451, 0, 4 }, -{ 102, 451, 450, 0, 2 }, -{ 103, 104, 452, 0, 4 }, -{ 103, 452, 451, 0, 2 }, -{ 104, 90, 438, 0, 4 }, -{ 104, 438, 452, 0, 2 }, -{ 106, 107, 455, 1, 6 }, -{ 106, 455, 454, 1, 3 }, -{ 108, 109, 457, 1, 4 }, -{ 108, 457, 456, 1, 3 }, -{ 109, 110, 458, 1, 4 }, -{ 109, 458, 457, 1, 2 }, -{ 110, 111, 459, 1, 4 }, -{ 110, 459, 458, 1, 2 }, -{ 111, 112, 460, 1, 4 }, -{ 111, 460, 459, 1, 2 }, -{ 112, 113, 461, 1, 4 }, -{ 112, 461, 460, 1, 2 }, -{ 113, 114, 462, 1, 4 }, -{ 113, 462, 461, 1, 2 }, -{ 114, 115, 463, 1, 4 }, -{ 114, 463, 462, 1, 2 }, -{ 115, 116, 464, 1, 4 }, -{ 115, 464, 463, 1, 2 }, -{ 116, 117, 465, 1, 4 }, -{ 116, 465, 464, 1, 2 }, -{ 117, 118, 466, 1, 4 }, -{ 117, 466, 465, 1, 2 }, -{ 118, 119, 467, 1, 4 }, -{ 118, 467, 466, 1, 2 }, -{ 119, 120, 468, 1, 4 }, -{ 119, 468, 467, 1, 2 }, -{ 120, 121, 469, 1, 4 }, -{ 120, 469, 468, 1, 2 }, -{ 121, 122, 470, 1, 4 }, -{ 121, 470, 469, 1, 2 }, -{ 122, 123, 471, 1, 4 }, -{ 122, 471, 470, 1, 2 }, -{ 123, 124, 472, 1, 4 }, -{ 123, 472, 471, 1, 2 }, -{ 124, 125, 473, 1, 4 }, -{ 124, 473, 472, 1, 2 }, -{ 125, 126, 474, 1, 4 }, -{ 125, 474, 473, 1, 2 }, -{ 126, 127, 475, 1, 4 }, -{ 126, 475, 474, 1, 2 }, -{ 127, 128, 476, 1, 4 }, -{ 127, 476, 475, 1, 2 }, -{ 128, 129, 477, 1, 4 }, -{ 128, 477, 476, 1, 2 }, -{ 129, 130, 478, 1, 4 }, -{ 129, 478, 477, 1, 2 }, -{ 130, 131, 479, 1, 4 }, -{ 130, 479, 478, 1, 2 }, -{ 131, 132, 480, 1, 4 }, -{ 131, 480, 479, 1, 2 }, -{ 132, 133, 481, 1, 4 }, -{ 132, 481, 480, 1, 2 }, -{ 133, 134, 482, 1, 4 }, -{ 133, 482, 481, 1, 2 }, -{ 134, 135, 483, 1, 4 }, -{ 134, 483, 482, 1, 2 }, -{ 135, 136, 484, 1, 4 }, -{ 135, 484, 483, 1, 2 }, -{ 136, 137, 485, 1, 6 }, -{ 136, 485, 484, 1, 2 }, -{ 138, 139, 487, 1, 6 }, -{ 138, 487, 486, 1, 3 }, -{ 140, 105, 453, 1, 6 }, -{ 140, 453, 488, 1, 3 }, -{ 141, 142, 490, 1, 4 }, -{ 141, 490, 489, 1, 2 }, -{ 142, 143, 491, 1, 4 }, -{ 142, 491, 490, 1, 2 }, -{ 143, 144, 492, 1, 4 }, -{ 143, 492, 491, 1, 2 }, -{ 144, 145, 493, 1, 4 }, -{ 144, 493, 492, 1, 2 }, -{ 145, 146, 494, 1, 4 }, -{ 145, 494, 493, 1, 2 }, -{ 146, 147, 495, 1, 4 }, -{ 146, 495, 494, 1, 2 }, -{ 147, 148, 496, 1, 4 }, -{ 147, 496, 495, 1, 2 }, -{ 148, 149, 497, 1, 4 }, -{ 148, 497, 496, 1, 2 }, -{ 149, 150, 498, 1, 4 }, -{ 149, 498, 497, 1, 2 }, -{ 150, 151, 499, 1, 4 }, -{ 150, 499, 498, 1, 2 }, -{ 151, 152, 500, 1, 4 }, -{ 151, 500, 499, 1, 2 }, -{ 152, 141, 489, 1, 4 }, -{ 152, 489, 500, 1, 2 }, -{ 153, 154, 502, 1, 4 }, -{ 153, 502, 501, 1, 2 }, -{ 154, 155, 503, 1, 4 }, -{ 154, 503, 502, 1, 2 }, -{ 155, 156, 504, 1, 4 }, -{ 155, 504, 503, 1, 2 }, -{ 156, 157, 505, 1, 4 }, -{ 156, 505, 504, 1, 2 }, -{ 157, 158, 506, 1, 4 }, -{ 157, 506, 505, 1, 2 }, -{ 158, 159, 507, 1, 4 }, -{ 158, 507, 506, 1, 2 }, -{ 159, 160, 508, 1, 4 }, -{ 159, 508, 507, 1, 2 }, -{ 160, 153, 501, 1, 4 }, -{ 160, 501, 508, 1, 2 }, -{ 161, 162, 510, 1, 4 }, -{ 161, 510, 509, 1, 2 }, -{ 162, 163, 511, 1, 4 }, -{ 162, 511, 510, 1, 2 }, -{ 163, 164, 512, 1, 4 }, -{ 163, 512, 511, 1, 2 }, -{ 164, 165, 513, 1, 4 }, -{ 164, 513, 512, 1, 2 }, -{ 165, 166, 514, 1, 4 }, -{ 165, 514, 513, 1, 2 }, -{ 166, 167, 515, 1, 4 }, -{ 166, 515, 514, 1, 2 }, -{ 167, 168, 516, 1, 4 }, -{ 167, 516, 515, 1, 2 }, -{ 168, 169, 517, 1, 4 }, -{ 168, 517, 516, 1, 2 }, -{ 169, 170, 518, 1, 4 }, -{ 169, 518, 517, 1, 2 }, -{ 170, 161, 509, 1, 4 }, -{ 170, 509, 518, 1, 2 }, -{ 171, 172, 520, 1, 4 }, -{ 171, 520, 519, 1, 2 }, -{ 172, 173, 521, 1, 4 }, -{ 172, 521, 520, 1, 2 }, -{ 173, 174, 522, 1, 4 }, -{ 173, 522, 521, 1, 2 }, -{ 174, 171, 519, 1, 4 }, -{ 174, 519, 522, 1, 2 }, -{ 175, 176, 524, 1, 4 }, -{ 175, 524, 523, 1, 2 }, -{ 176, 177, 525, 1, 4 }, -{ 176, 525, 524, 1, 2 }, -{ 177, 178, 526, 1, 4 }, -{ 177, 526, 525, 1, 2 }, -{ 178, 179, 527, 1, 4 }, -{ 178, 527, 526, 1, 2 }, -{ 179, 180, 528, 1, 4 }, -{ 179, 528, 527, 1, 2 }, -{ 180, 181, 529, 1, 4 }, -{ 180, 529, 528, 1, 2 }, -{ 181, 182, 530, 1, 4 }, -{ 181, 530, 529, 1, 2 }, -{ 182, 183, 531, 1, 4 }, -{ 182, 531, 530, 1, 2 }, -{ 183, 184, 532, 1, 4 }, -{ 183, 532, 531, 1, 2 }, -{ 184, 185, 533, 1, 4 }, -{ 184, 533, 532, 1, 2 }, -{ 185, 186, 534, 1, 4 }, -{ 185, 534, 533, 1, 2 }, -{ 186, 187, 535, 1, 4 }, -{ 186, 535, 534, 1, 2 }, -{ 187, 188, 536, 1, 4 }, -{ 187, 536, 535, 1, 2 }, -{ 188, 189, 537, 1, 4 }, -{ 188, 537, 536, 1, 2 }, -{ 189, 190, 538, 1, 4 }, -{ 189, 538, 537, 1, 2 }, -{ 190, 191, 539, 1, 4 }, -{ 190, 539, 538, 1, 2 }, -{ 191, 192, 540, 1, 4 }, -{ 191, 540, 539, 1, 2 }, -{ 192, 193, 541, 1, 4 }, -{ 192, 541, 540, 1, 2 }, -{ 193, 175, 523, 1, 4 }, -{ 193, 523, 541, 1, 2 }, -{ 194, 195, 543, 1, 4 }, -{ 194, 543, 542, 1, 2 }, -{ 195, 196, 544, 1, 4 }, -{ 195, 544, 543, 1, 2 }, -{ 196, 197, 545, 1, 4 }, -{ 196, 545, 544, 1, 2 }, -{ 197, 198, 546, 1, 4 }, -{ 197, 546, 545, 1, 2 }, -{ 198, 199, 547, 1, 4 }, -{ 198, 547, 546, 1, 2 }, -{ 199, 200, 548, 1, 4 }, -{ 199, 548, 547, 1, 2 }, -{ 200, 201, 549, 1, 4 }, -{ 200, 549, 548, 1, 2 }, -{ 201, 202, 550, 1, 4 }, -{ 201, 550, 549, 1, 2 }, -{ 202, 203, 551, 1, 4 }, -{ 202, 551, 550, 1, 2 }, -{ 203, 204, 552, 1, 4 }, -{ 203, 552, 551, 1, 2 }, -{ 204, 205, 553, 1, 4 }, -{ 204, 553, 552, 1, 2 }, -{ 205, 206, 554, 1, 4 }, -{ 205, 554, 553, 1, 2 }, -{ 206, 207, 555, 1, 4 }, -{ 206, 555, 554, 1, 2 }, -{ 207, 208, 556, 1, 4 }, -{ 207, 556, 555, 1, 2 }, -{ 208, 209, 557, 1, 4 }, -{ 208, 557, 556, 1, 2 }, -{ 209, 210, 558, 1, 4 }, -{ 209, 558, 557, 1, 2 }, -{ 210, 211, 559, 1, 4 }, -{ 210, 559, 558, 1, 2 }, -{ 211, 212, 560, 1, 4 }, -{ 211, 560, 559, 1, 2 }, -{ 212, 213, 561, 1, 4 }, -{ 212, 561, 560, 1, 2 }, -{ 213, 214, 562, 1, 4 }, -{ 213, 562, 561, 1, 2 }, -{ 214, 215, 563, 1, 4 }, -{ 214, 563, 562, 1, 2 }, -{ 215, 216, 564, 1, 4 }, -{ 215, 564, 563, 1, 2 }, -{ 216, 194, 542, 1, 4 }, -{ 216, 542, 564, 1, 2 }, -{ 217, 218, 566, 1, 4 }, -{ 217, 566, 565, 1, 2 }, -{ 218, 219, 567, 1, 4 }, -{ 218, 567, 566, 1, 2 }, -{ 219, 220, 568, 1, 4 }, -{ 219, 568, 567, 1, 2 }, -{ 220, 221, 569, 1, 4 }, -{ 220, 569, 568, 1, 2 }, -{ 221, 222, 570, 1, 4 }, -{ 221, 570, 569, 1, 2 }, -{ 222, 223, 571, 1, 4 }, -{ 222, 571, 570, 1, 2 }, -{ 223, 217, 565, 1, 4 }, -{ 223, 565, 571, 1, 2 }, -{ 224, 225, 573, 1, 4 }, -{ 224, 573, 572, 1, 2 }, -{ 225, 226, 574, 1, 4 }, -{ 225, 574, 573, 1, 2 }, -{ 226, 227, 575, 1, 4 }, -{ 226, 575, 574, 1, 2 }, -{ 227, 228, 576, 1, 4 }, -{ 227, 576, 575, 1, 2 }, -{ 228, 229, 577, 1, 4 }, -{ 228, 577, 576, 1, 2 }, -{ 229, 230, 578, 1, 4 }, -{ 229, 578, 577, 1, 2 }, -{ 230, 231, 579, 1, 4 }, -{ 230, 579, 578, 1, 2 }, -{ 231, 232, 580, 1, 4 }, -{ 231, 580, 579, 1, 2 }, -{ 232, 233, 581, 1, 4 }, -{ 232, 581, 580, 1, 2 }, -{ 233, 234, 582, 1, 4 }, -{ 233, 582, 581, 1, 2 }, -{ 234, 235, 583, 1, 4 }, -{ 234, 583, 582, 1, 2 }, -{ 235, 236, 584, 1, 4 }, -{ 235, 584, 583, 1, 2 }, -{ 236, 237, 585, 1, 4 }, -{ 236, 585, 584, 1, 2 }, -{ 237, 238, 586, 1, 4 }, -{ 237, 586, 585, 1, 2 }, -{ 238, 239, 587, 1, 4 }, -{ 238, 587, 586, 1, 2 }, -{ 239, 240, 588, 1, 4 }, -{ 239, 588, 587, 1, 2 }, -{ 240, 241, 589, 1, 4 }, -{ 240, 589, 588, 1, 2 }, -{ 241, 224, 572, 1, 4 }, -{ 241, 572, 589, 1, 2 }, -{ 242, 243, 591, 1, 4 }, -{ 242, 591, 590, 1, 2 }, -{ 243, 244, 592, 1, 4 }, -{ 243, 592, 591, 1, 2 }, -{ 244, 245, 593, 1, 4 }, -{ 244, 593, 592, 1, 2 }, -{ 245, 246, 594, 1, 4 }, -{ 245, 594, 593, 1, 2 }, -{ 246, 247, 595, 1, 4 }, -{ 246, 595, 594, 1, 2 }, -{ 247, 248, 596, 1, 4 }, -{ 247, 596, 595, 1, 2 }, -{ 248, 249, 597, 1, 4 }, -{ 248, 597, 596, 1, 2 }, -{ 249, 250, 598, 1, 4 }, -{ 249, 598, 597, 1, 2 }, -{ 250, 251, 599, 1, 4 }, -{ 250, 599, 598, 1, 2 }, -{ 251, 252, 600, 1, 4 }, -{ 251, 600, 599, 1, 2 }, -{ 252, 253, 601, 1, 4 }, -{ 252, 601, 600, 1, 2 }, -{ 253, 254, 602, 1, 4 }, -{ 253, 602, 601, 1, 2 }, -{ 254, 255, 603, 1, 4 }, -{ 254, 603, 602, 1, 2 }, -{ 255, 256, 604, 1, 4 }, -{ 255, 604, 603, 1, 2 }, -{ 256, 257, 605, 1, 4 }, -{ 256, 605, 604, 1, 2 }, -{ 257, 258, 606, 1, 4 }, -{ 257, 606, 605, 1, 2 }, -{ 258, 259, 607, 1, 4 }, -{ 258, 607, 606, 1, 2 }, -{ 259, 260, 608, 1, 4 }, -{ 259, 608, 607, 1, 2 }, -{ 260, 261, 609, 1, 4 }, -{ 260, 609, 608, 1, 2 }, -{ 261, 262, 610, 1, 4 }, -{ 261, 610, 609, 1, 2 }, -{ 262, 263, 611, 1, 4 }, -{ 262, 611, 610, 1, 2 }, -{ 263, 264, 611, 1, 4 }, -{ 264, 612, 611, 1, 2 }, -{ 264, 265, 613, 1, 4 }, -{ 264, 613, 612, 1, 2 }, -{ 265, 266, 614, 1, 4 }, -{ 265, 614, 613, 1, 2 }, -{ 266, 267, 615, 1, 4 }, -{ 266, 615, 614, 1, 2 }, -{ 267, 268, 616, 1, 4 }, -{ 267, 616, 615, 1, 2 }, -{ 268, 269, 617, 1, 4 }, -{ 268, 617, 616, 1, 2 }, -{ 269, 270, 618, 1, 4 }, -{ 269, 618, 617, 1, 2 }, -{ 270, 271, 619, 1, 4 }, -{ 270, 619, 618, 1, 2 }, -{ 271, 272, 620, 1, 4 }, -{ 271, 620, 619, 1, 2 }, -{ 272, 273, 621, 1, 4 }, -{ 272, 621, 620, 1, 2 }, -{ 273, 274, 622, 1, 4 }, -{ 273, 622, 621, 1, 2 }, -{ 274, 275, 623, 1, 4 }, -{ 274, 623, 622, 1, 2 }, -{ 275, 276, 624, 1, 4 }, -{ 275, 624, 623, 1, 2 }, -{ 276, 242, 590, 1, 4 }, -{ 276, 590, 624, 1, 2 }, -{ 277, 278, 626, 1, 4 }, -{ 277, 626, 625, 1, 2 }, -{ 278, 279, 627, 1, 4 }, -{ 278, 627, 626, 1, 2 }, -{ 279, 280, 628, 1, 4 }, -{ 279, 628, 627, 1, 2 }, -{ 280, 281, 629, 1, 4 }, -{ 280, 629, 628, 1, 2 }, -{ 281, 630, 629, 1, 2 }, -{ 281, 282, 631, 1, 4 }, -{ 281, 631, 630, 1, 2 }, -{ 282, 632, 631, 1, 2 }, -{ 282, 283, 633, 1, 4 }, -{ 282, 633, 632, 1, 2 }, -{ 283, 284, 634, 1, 4 }, -{ 283, 634, 633, 1, 2 }, -{ 284, 285, 635, 1, 4 }, -{ 284, 635, 634, 1, 2 }, -{ 285, 286, 636, 1, 4 }, -{ 285, 636, 635, 1, 2 }, -{ 286, 287, 637, 1, 4 }, -{ 286, 637, 636, 1, 2 }, -{ 287, 288, 638, 1, 4 }, -{ 287, 638, 637, 1, 2 }, -{ 288, 277, 625, 1, 4 }, -{ 288, 625, 638, 1, 2 }, -{ 289, 290, 640, 1, 4 }, -{ 289, 640, 639, 1, 2 }, -{ 290, 291, 641, 1, 4 }, -{ 290, 641, 640, 1, 2 }, -{ 291, 292, 642, 1, 4 }, -{ 291, 642, 641, 1, 2 }, -{ 292, 293, 643, 1, 4 }, -{ 292, 643, 642, 1, 2 }, -{ 293, 294, 644, 1, 4 }, -{ 293, 644, 643, 1, 2 }, -{ 294, 295, 645, 1, 4 }, -{ 294, 645, 644, 1, 2 }, -{ 295, 296, 646, 1, 4 }, -{ 295, 646, 645, 1, 2 }, -{ 296, 297, 647, 1, 4 }, -{ 296, 647, 646, 1, 2 }, -{ 297, 298, 648, 1, 4 }, -{ 297, 648, 647, 1, 2 }, -{ 298, 299, 649, 1, 4 }, -{ 298, 649, 648, 1, 2 }, -{ 299, 300, 650, 1, 4 }, -{ 299, 650, 649, 1, 2 }, -{ 300, 301, 651, 1, 4 }, -{ 300, 651, 650, 1, 2 }, -{ 301, 302, 652, 1, 4 }, -{ 301, 652, 651, 1, 2 }, -{ 302, 303, 653, 1, 4 }, -{ 302, 653, 652, 1, 2 }, -{ 303, 304, 654, 1, 4 }, -{ 303, 654, 653, 1, 2 }, -{ 304, 305, 655, 1, 4 }, -{ 304, 655, 654, 1, 2 }, -{ 305, 306, 656, 1, 4 }, -{ 305, 656, 655, 1, 2 }, -{ 306, 307, 657, 1, 4 }, -{ 306, 657, 656, 1, 2 }, -{ 307, 308, 658, 1, 4 }, -{ 307, 658, 657, 1, 2 }, -{ 308, 309, 659, 1, 4 }, -{ 308, 659, 658, 1, 2 }, -{ 309, 310, 660, 1, 4 }, -{ 309, 660, 659, 1, 2 }, -{ 310, 289, 639, 1, 4 }, -{ 310, 639, 660, 1, 2 }, -{ 311, 312, 662, 1, 4 }, -{ 311, 662, 661, 1, 2 }, -{ 312, 313, 663, 1, 4 }, -{ 312, 663, 662, 1, 2 }, -{ 313, 314, 664, 1, 4 }, -{ 313, 664, 663, 1, 2 }, -{ 314, 315, 665, 1, 4 }, -{ 314, 665, 664, 1, 2 }, -{ 315, 316, 666, 1, 4 }, -{ 315, 666, 665, 1, 2 }, -{ 316, 317, 667, 1, 4 }, -{ 316, 667, 666, 1, 2 }, -{ 317, 318, 668, 1, 4 }, -{ 317, 668, 667, 1, 2 }, -{ 318, 319, 669, 1, 4 }, -{ 318, 669, 668, 1, 2 }, -{ 319, 320, 670, 1, 4 }, -{ 319, 670, 669, 1, 2 }, -{ 320, 321, 671, 1, 4 }, -{ 320, 671, 670, 1, 2 }, -{ 321, 322, 672, 1, 4 }, -{ 321, 672, 671, 1, 2 }, -{ 322, 323, 673, 1, 4 }, -{ 322, 673, 672, 1, 2 }, -{ 323, 324, 674, 1, 4 }, -{ 323, 674, 673, 1, 2 }, -{ 324, 325, 675, 1, 4 }, -{ 324, 675, 674, 1, 2 }, -{ 325, 326, 676, 1, 4 }, -{ 325, 676, 675, 1, 2 }, -{ 326, 327, 677, 1, 4 }, -{ 326, 677, 676, 1, 2 }, -{ 327, 328, 678, 1, 4 }, -{ 327, 678, 677, 1, 2 }, -{ 328, 329, 679, 1, 4 }, -{ 328, 679, 678, 1, 2 }, -{ 329, 330, 680, 1, 4 }, -{ 329, 680, 679, 1, 2 }, -{ 330, 331, 681, 1, 4 }, -{ 330, 681, 680, 1, 2 }, -{ 331, 332, 681, 1, 4 }, -{ 332, 682, 681, 1, 2 }, -{ 332, 333, 683, 1, 4 }, -{ 332, 683, 682, 1, 2 }, -{ 333, 334, 683, 1, 4 }, -{ 334, 335, 684, 1, 4 }, -{ 334, 684, 683, 1, 2 }, -{ 335, 311, 661, 1, 4 }, -{ 335, 661, 684, 1, 2 }, -{ 336, 337, 686, 1, 4 }, -{ 336, 686, 685, 1, 2 }, -{ 337, 338, 687, 1, 4 }, -{ 337, 687, 686, 1, 2 }, -{ 338, 339, 688, 1, 4 }, -{ 338, 688, 687, 1, 2 }, -{ 339, 336, 685, 1, 4 }, -{ 339, 685, 688, 1, 2 }, -{ 340, 341, 690, 1, 4 }, -{ 340, 690, 689, 1, 2 }, -{ 341, 342, 691, 1, 4 }, -{ 341, 691, 690, 1, 2 }, -{ 342, 343, 692, 1, 4 }, -{ 342, 692, 691, 1, 2 }, -{ 343, 344, 693, 1, 4 }, -{ 343, 693, 692, 1, 2 }, -{ 344, 345, 694, 1, 4 }, -{ 344, 694, 693, 1, 2 }, -{ 345, 346, 695, 1, 4 }, -{ 345, 695, 694, 1, 2 }, -{ 346, 347, 696, 1, 4 }, -{ 346, 696, 695, 1, 2 }, -{ 347, 340, 689, 1, 4 }, -{ 347, 689, 696, 1, 2 }, -{ 706, 698, 697, 1, 2 }, -{ 705, 706, 697, 1, 4 }, -{ 707, 699, 698, 1, 2 }, -{ 706, 707, 698, 1, 4 }, -{ 708, 700, 699, 1, 2 }, -{ 707, 708, 699, 1, 4 }, -{ 709, 701, 700, 1, 2 }, -{ 708, 709, 700, 1, 4 }, -{ 710, 702, 701, 1, 2 }, -{ 709, 710, 701, 1, 4 }, -{ 711, 703, 702, 1, 2 }, -{ 710, 711, 702, 1, 4 }, -{ 712, 704, 703, 1, 2 }, -{ 711, 712, 703, 1, 4 }, -{ 705, 697, 704, 1, 2 }, -{ 712, 705, 704, 1, 4 }, -{ 722, 714, 713, 1, 2 }, -{ 721, 722, 713, 1, 4 }, -{ 723, 715, 714, 1, 2 }, -{ 722, 723, 714, 1, 4 }, -{ 724, 716, 715, 1, 2 }, -{ 723, 724, 715, 1, 4 }, -{ 725, 717, 716, 1, 2 }, -{ 724, 725, 716, 1, 4 }, -{ 726, 718, 717, 1, 2 }, -{ 725, 726, 717, 1, 4 }, -{ 727, 719, 718, 1, 2 }, -{ 726, 727, 718, 1, 4 }, -{ 728, 720, 719, 1, 2 }, -{ 727, 728, 719, 1, 4 }, -{ 721, 713, 720, 1, 2 }, -{ 728, 721, 720, 1, 4 }, -{ 729, 730, 750, 1, 4 }, -{ 729, 750, 749, 1, 2 }, -{ 730, 731, 751, 1, 4 }, -{ 730, 751, 750, 1, 2 }, -{ 731, 732, 752, 1, 4 }, -{ 731, 752, 751, 1, 2 }, -{ 732, 733, 753, 1, 4 }, -{ 732, 753, 752, 1, 2 }, -{ 733, 734, 754, 1, 4 }, -{ 733, 754, 753, 1, 2 }, -{ 734, 735, 755, 1, 4 }, -{ 734, 755, 754, 1, 2 }, -{ 735, 736, 756, 1, 4 }, -{ 735, 756, 755, 1, 2 }, -{ 736, 737, 757, 1, 4 }, -{ 736, 757, 756, 1, 2 }, -{ 737, 738, 758, 1, 4 }, -{ 737, 758, 757, 1, 2 }, -{ 738, 739, 759, 1, 4 }, -{ 738, 759, 758, 1, 2 }, -{ 739, 740, 760, 1, 4 }, -{ 739, 760, 759, 1, 2 }, -{ 740, 741, 761, 1, 4 }, -{ 740, 761, 760, 1, 2 }, -{ 741, 742, 762, 1, 4 }, -{ 741, 762, 761, 1, 2 }, -{ 742, 743, 763, 1, 4 }, -{ 742, 763, 762, 1, 2 }, -{ 743, 744, 764, 1, 4 }, -{ 743, 764, 763, 1, 2 }, -{ 744, 745, 765, 1, 4 }, -{ 744, 765, 764, 1, 2 }, -{ 745, 746, 766, 1, 4 }, -{ 745, 766, 765, 1, 2 }, -{ 746, 747, 767, 1, 4 }, -{ 746, 767, 766, 1, 2 }, -{ 747, 748, 768, 1, 4 }, -{ 747, 768, 767, 1, 2 }, -{ 748, 729, 749, 1, 4 }, -{ 748, 749, 768, 1, 2 }, -{ 769, 770, 800, 1, 4 }, -{ 769, 800, 799, 1, 2 }, -{ 770, 771, 801, 1, 4 }, -{ 770, 801, 800, 1, 2 }, -{ 771, 772, 802, 1, 4 }, -{ 771, 802, 801, 1, 2 }, -{ 772, 773, 803, 1, 4 }, -{ 772, 803, 802, 1, 2 }, -{ 773, 774, 804, 1, 4 }, -{ 773, 804, 803, 1, 2 }, -{ 774, 775, 805, 1, 4 }, -{ 774, 805, 804, 1, 2 }, -{ 775, 776, 806, 1, 4 }, -{ 775, 806, 805, 1, 2 }, -{ 776, 777, 807, 1, 4 }, -{ 776, 807, 806, 1, 2 }, -{ 777, 778, 808, 1, 4 }, -{ 777, 808, 807, 1, 2 }, -{ 778, 779, 809, 1, 4 }, -{ 778, 809, 808, 1, 2 }, -{ 779, 780, 810, 1, 4 }, -{ 779, 810, 809, 1, 2 }, -{ 780, 781, 811, 1, 4 }, -{ 780, 811, 810, 1, 2 }, -{ 781, 782, 812, 1, 4 }, -{ 781, 812, 811, 1, 2 }, -{ 782, 783, 813, 1, 4 }, -{ 782, 813, 812, 1, 2 }, -{ 783, 784, 814, 1, 4 }, -{ 783, 814, 813, 1, 2 }, -{ 784, 785, 815, 1, 4 }, -{ 784, 815, 814, 1, 2 }, -{ 785, 786, 816, 1, 4 }, -{ 785, 816, 815, 1, 2 }, -{ 786, 787, 817, 1, 4 }, -{ 786, 817, 816, 1, 2 }, -{ 787, 788, 818, 1, 4 }, -{ 787, 818, 817, 1, 2 }, -{ 788, 789, 819, 1, 4 }, -{ 788, 819, 818, 1, 2 }, -{ 789, 790, 820, 1, 4 }, -{ 789, 820, 819, 1, 2 }, -{ 790, 791, 821, 1, 4 }, -{ 790, 821, 820, 1, 2 }, -{ 791, 769, 799, 1, 4 }, -{ 791, 799, 821, 1, 2 }, -{ 792, 793, 823, 1, 4 }, -{ 792, 823, 822, 1, 2 }, -{ 793, 794, 824, 1, 4 }, -{ 793, 824, 823, 1, 2 }, -{ 794, 795, 825, 1, 4 }, -{ 794, 825, 824, 1, 2 }, -{ 795, 796, 826, 1, 4 }, -{ 795, 826, 825, 1, 2 }, -{ 796, 797, 827, 1, 4 }, -{ 796, 827, 826, 1, 2 }, -{ 797, 798, 828, 1, 4 }, -{ 797, 828, 827, 1, 2 }, -{ 798, 792, 822, 1, 4 }, -{ 798, 822, 828, 1, 2 }, -{ 829, 830, 846, 0, 6 }, -{ 829, 846, 845, 0, 3 }, -{ 831, 832, 848, 0, 6 }, -{ 831, 848, 847, 0, 3 }, -{ 833, 834, 850, 0, 6 }, -{ 833, 850, 849, 0, 3 }, -{ 836, 835, 851, 0, 6 }, -{ 836, 851, 852, 0, 3 }, -{ 837, 838, 854, 1, 6 }, -{ 837, 854, 853, 1, 3 }, -{ 839, 840, 856, 1, 6 }, -{ 839, 856, 855, 1, 3 }, -{ 841, 842, 858, 1, 6 }, -{ 841, 858, 857, 1, 3 }, -{ 843, 844, 860, 1, 6 }, -{ 843, 860, 859, 1, 3 }, -{ 919, 918, 917, 0, 6 }, -{ 881, 880, 879, 0, 6 }, -{ 920, 919, 917, 0, 4 }, -{ 881, 879, 878, 0, 2 }, -{ 882, 881, 878, 0, 4 }, -{ 882, 878, 877, 0, 2 }, -{ 883, 882, 877, 0, 4 }, -{ 883, 877, 876, 0, 2 }, -{ 884, 883, 876, 0, 4 }, -{ 920, 917, 916, 0, 2 }, -{ 921, 920, 916, 0, 4 }, -{ 921, 916, 915, 0, 2 }, -{ 922, 921, 915, 0, 4 }, -{ 922, 915, 914, 0, 2 }, -{ 884, 876, 875, 0, 2 }, -{ 885, 884, 875, 0, 4 }, -{ 923, 922, 914, 0, 4 }, -{ 923, 914, 913, 0, 2 }, -{ 885, 875, 874, 0, 2 }, -{ 886, 885, 874, 0, 4 }, -{ 923, 913, 912, 0, 2 }, -{ 924, 923, 912, 0, 4 }, -{ 924, 912, 911, 0, 2 }, -{ 925, 924, 911, 0, 4 }, -{ 925, 911, 910, 0, 2 }, -{ 926, 925, 910, 0, 4 }, -{ 926, 910, 909, 0, 2 }, -{ 927, 926, 909, 0, 4 }, -{ 927, 909, 908, 0, 2 }, -{ 928, 927, 908, 0, 4 }, -{ 928, 908, 907, 0, 2 }, -{ 929, 928, 907, 0, 4 }, -{ 929, 907, 906, 0, 2 }, -{ 929, 906, 905, 0, 2 }, -{ 930, 929, 905, 0, 4 }, -{ 930, 905, 904, 0, 2 }, -{ 930, 904, 903, 0, 2 }, -{ 931, 930, 903, 0, 4 }, -{ 931, 903, 902, 0, 2 }, -{ 931, 902, 901, 0, 2 }, -{ 932, 931, 901, 0, 4 }, -{ 932, 901, 900, 0, 2 }, -{ 932, 900, 899, 0, 2 }, -{ 933, 932, 899, 0, 4 }, -{ 934, 933, 899, 0, 4 }, -{ 887, 886, 874, 0, 4 }, -{ 887, 874, 873, 0, 2 }, -{ 888, 887, 873, 0, 4 }, -{ 888, 873, 872, 0, 2 }, -{ 889, 888, 872, 0, 4 }, -{ 889, 872, 871, 0, 2 }, -{ 890, 889, 871, 0, 4 }, -{ 890, 871, 870, 0, 2 }, -{ 891, 890, 870, 0, 4 }, -{ 892, 891, 870, 0, 4 }, -{ 892, 870, 869, 0, 2 }, -{ 893, 892, 869, 0, 4 }, -{ 894, 893, 869, 0, 4 }, -{ 894, 869, 868, 0, 2 }, -{ 895, 894, 868, 0, 4 }, -{ 896, 895, 868, 0, 4 }, -{ 896, 868, 867, 0, 2 }, -{ 897, 896, 867, 0, 4 }, -{ 898, 897, 867, 0, 4 }, -{ 898, 867, 866, 0, 2 }, -{ 899, 898, 866, 0, 4 }, -{ 899, 866, 865, 0, 2 }, -{ 934, 899, 865, 0, 0 }, -{ 934, 865, 864, 0, 2 }, -{ 935, 934, 864, 0, 4 }, -{ 935, 864, 863, 0, 2 }, -{ 861, 935, 863, 0, 4 }, -{ 862, 861, 863, 0, 5 }, -{ 959, 943, 942, 0, 2 }, -{ 960, 959, 942, 0, 4 }, -{ 960, 942, 941, 0, 2 }, -{ 961, 960, 941, 0, 4 }, -{ 961, 941, 940, 0, 2 }, -{ 962, 961, 940, 0, 4 }, -{ 962, 940, 939, 0, 2 }, -{ 963, 962, 939, 0, 4 }, -{ 963, 939, 938, 0, 2 }, -{ 964, 963, 938, 0, 4 }, -{ 964, 938, 937, 0, 2 }, -{ 965, 964, 937, 0, 4 }, -{ 937, 936, 951, 0, 4 }, -{ 951, 965, 937, 0, 4 }, -{ 951, 936, 950, 0, 2 }, -{ 952, 951, 950, 0, 4 }, -{ 952, 950, 949, 0, 2 }, -{ 953, 952, 949, 0, 4 }, -{ 944, 943, 959, 0, 4 }, -{ 944, 959, 958, 0, 2 }, -{ 945, 944, 958, 0, 4 }, -{ 945, 958, 957, 0, 2 }, -{ 946, 945, 957, 0, 4 }, -{ 946, 957, 956, 0, 2 }, -{ 947, 946, 956, 0, 4 }, -{ 947, 956, 955, 0, 2 }, -{ 948, 947, 955, 0, 4 }, -{ 948, 955, 954, 0, 2 }, -{ 949, 948, 954, 0, 4 }, -{ 953, 949, 954, 0, 1 }, -{ 984, 983, 982, 1, 6 }, -{ 984, 982, 981, 1, 2 }, -{ 984, 981, 980, 1, 2 }, -{ 985, 984, 980, 1, 4 }, -{ 985, 980, 979, 1, 2 }, -{ 986, 985, 979, 1, 4 }, -{ 987, 986, 979, 1, 4 }, -{ 987, 979, 978, 1, 2 }, -{ 988, 987, 978, 1, 4 }, -{ 988, 978, 977, 1, 2 }, -{ 989, 988, 977, 1, 4 }, -{ 989, 977, 976, 1, 2 }, -{ 990, 989, 976, 1, 4 }, -{ 991, 990, 976, 1, 4 }, -{ 992, 991, 976, 1, 4 }, -{ 992, 976, 975, 1, 2 }, -{ 993, 992, 975, 1, 4 }, -{ 966, 1001, 1000, 1, 6 }, -{ 967, 966, 1000, 1, 4 }, -{ 1000, 999, 998, 1, 6 }, -{ 1000, 998, 997, 1, 2 }, -{ 967, 1000, 997, 1, 0 }, -{ 970, 969, 968, 1, 6 }, -{ 970, 968, 967, 1, 2 }, -{ 970, 967, 997, 1, 0 }, -{ 970, 997, 996, 1, 2 }, -{ 971, 970, 996, 1, 4 }, -{ 972, 971, 996, 1, 4 }, -{ 973, 972, 996, 1, 4 }, -{ 973, 996, 995, 1, 2 }, -{ 974, 973, 995, 1, 4 }, -{ 974, 995, 994, 1, 2 }, -{ 975, 974, 994, 1, 4 }, -{ 993, 975, 994, 1, 1 }, -{ 1003, 1002, 1013, 1, 6 }, -{ 1003, 1013, 1012, 1, 2 }, -{ 1011, 1010, 1009, 1, 6 }, -{ 1012, 1011, 1009, 1, 4 }, -{ 1009, 1008, 1007, 1, 6 }, -{ 1009, 1007, 1006, 1, 2 }, -{ 1005, 1004, 1003, 1, 6 }, -{ 1006, 1005, 1003, 1, 4 }, -{ 1006, 1003, 1012, 1, 0 }, -{ 1006, 1012, 1009, 1, 0 }, -{ 1014, 1021, 1020, 1, 6 }, -{ 1015, 1014, 1020, 1, 4 }, -{ 1020, 1019, 1018, 1, 6 }, -{ 1020, 1018, 1017, 1, 2 }, -{ 1015, 1020, 1017, 1, 0 }, -{ 1016, 1015, 1017, 1, 5 }, -{ 1022, 1031, 1030, 1, 6 }, -{ 1023, 1022, 1030, 1, 4 }, -{ 1024, 1023, 1030, 1, 4 }, -{ 1024, 1030, 1029, 1, 2 }, -{ 1024, 1029, 1028, 1, 2 }, -{ 1025, 1024, 1028, 1, 4 }, -{ 1026, 1025, 1028, 1, 4 }, -{ 1026, 1028, 1027, 1, 3 }, -{ 1032, 1035, 1034, 1, 6 }, -{ 1033, 1032, 1034, 1, 5 }, -{ 1036, 1054, 1053, 1, 6 }, -{ 1037, 1036, 1053, 1, 4 }, -{ 1053, 1052, 1039, 1, 4 }, -{ 1048, 1047, 1046, 1, 6 }, -{ 1048, 1046, 1045, 1, 2 }, -{ 1048, 1045, 1044, 1, 2 }, -{ 1049, 1048, 1044, 1, 4 }, -{ 1049, 1044, 1043, 1, 2 }, -{ 1050, 1049, 1043, 1, 4 }, -{ 1050, 1043, 1042, 1, 2 }, -{ 1050, 1042, 1041, 1, 2 }, -{ 1050, 1041, 1040, 1, 2 }, -{ 1051, 1050, 1040, 1, 4 }, -{ 1051, 1040, 1039, 1, 2 }, -{ 1039, 1038, 1037, 1, 6 }, -{ 1039, 1037, 1053, 1, 0 }, -{ 1051, 1039, 1052, 1, 1 }, -{ 1063, 1062, 1078, 1, 4 }, -{ 1064, 1063, 1078, 1, 4 }, -{ 1064, 1078, 1084, 1, 2 }, -{ 1056, 1055, 1077, 1, 6 }, -{ 1065, 1064, 1084, 1, 4 }, -{ 1065, 1084, 1083, 1, 2 }, -{ 1066, 1065, 1083, 1, 4 }, -{ 1066, 1083, 1082, 1, 2 }, -{ 1067, 1066, 1082, 1, 4 }, -{ 1068, 1067, 1082, 1, 4 }, -{ 1069, 1068, 1082, 1, 4 }, -{ 1069, 1082, 1081, 1, 2 }, -{ 1070, 1069, 1081, 1, 4 }, -{ 1070, 1081, 1080, 1, 2 }, -{ 1071, 1070, 1080, 1, 4 }, -{ 1071, 1080, 1079, 1, 2 }, -{ 1072, 1071, 1079, 1, 4 }, -{ 1073, 1072, 1079, 1, 4 }, -{ 1073, 1079, 1078, 1, 2 }, -{ 1073, 1078, 1062, 1, 0 }, -{ 1073, 1062, 1061, 1, 2 }, -{ 1073, 1061, 1060, 1, 2 }, -{ 1074, 1073, 1060, 1, 4 }, -{ 1074, 1060, 1059, 1, 2 }, -{ 1075, 1074, 1059, 1, 4 }, -{ 1075, 1059, 1058, 1, 2 }, -{ 1076, 1075, 1058, 1, 4 }, -{ 1076, 1058, 1057, 1, 2 }, -{ 1076, 1057, 1056, 1, 2 }, -{ 1077, 1076, 1056, 1, 4 }, -{ 1085, 1102, 1101, 1, 6 }, -{ 1086, 1085, 1101, 1, 4 }, -{ 1086, 1101, 1100, 1, 2 }, -{ 1100, 1099, 1088, 1, 4 }, -{ 1088, 1087, 1086, 1, 6 }, -{ 1088, 1086, 1100, 1, 0 }, -{ 1088, 1099, 1098, 1, 2 }, -{ 1089, 1088, 1098, 1, 4 }, -{ 1089, 1098, 1097, 1, 2 }, -{ 1090, 1089, 1097, 1, 4 }, -{ 1096, 1095, 1094, 1, 6 }, -{ 1090, 1097, 1096, 1, 2 }, -{ 1091, 1090, 1096, 1, 4 }, -{ 1096, 1094, 1093, 1, 2 }, -{ 1092, 1091, 1096, 1, 4 }, -{ 1093, 1092, 1096, 1, 4 }, -{ 1133, 1149, 1148, 1, 2 }, -{ 1107, 1106, 1133, 1, 4 }, -{ 1108, 1107, 1133, 1, 4 }, -{ 1109, 1108, 1133, 1, 4 }, -{ 1110, 1109, 1133, 1, 4 }, -{ 1148, 1110, 1133, 1, 0 }, -{ 1104, 1103, 1137, 1, 6 }, -{ 1104, 1137, 1136, 1, 2 }, -{ 1126, 1125, 1124, 1, 6 }, -{ 1127, 1126, 1124, 1, 4 }, -{ 1127, 1124, 1123, 1, 2 }, -{ 1128, 1127, 1123, 1, 4 }, -{ 1128, 1123, 1122, 1, 2 }, -{ 1129, 1128, 1122, 1, 4 }, -{ 1130, 1129, 1122, 1, 4 }, -{ 1130, 1122, 1121, 1, 2 }, -{ 1131, 1130, 1121, 1, 4 }, -{ 1132, 1131, 1121, 1, 4 }, -{ 1132, 1121, 1120, 1, 2 }, -{ 1132, 1120, 1119, 1, 2 }, -{ 1132, 1119, 1139, 1, 0 }, -{ 1104, 1136, 1135, 1, 2 }, -{ 1110, 1148, 1147, 1, 2 }, -{ 1111, 1110, 1147, 1, 4 }, -{ 1111, 1147, 1146, 1, 2 }, -{ 1105, 1104, 1135, 1, 4 }, -{ 1112, 1111, 1146, 1, 4 }, -{ 1112, 1146, 1145, 1, 2 }, -{ 1113, 1112, 1145, 1, 4 }, -{ 1113, 1145, 1144, 1, 2 }, -{ 1114, 1113, 1144, 1, 4 }, -{ 1115, 1114, 1144, 1, 4 }, -{ 1115, 1144, 1143, 1, 2 }, -{ 1116, 1115, 1143, 1, 4 }, -{ 1117, 1116, 1143, 1, 4 }, -{ 1117, 1143, 1142, 1, 2 }, -{ 1117, 1142, 1141, 1, 2 }, -{ 1118, 1117, 1141, 1, 4 }, -{ 1118, 1141, 1140, 1, 2 }, -{ 1119, 1118, 1140, 1, 4 }, -{ 1119, 1140, 1139, 1, 2 }, -{ 1132, 1139, 1138, 1, 2 }, -{ 1138, 1133, 1132, 1, 2 }, -{ 1133, 1138, 1149, 1, 2 }, -{ 1134, 1133, 1106, 1, 4 }, -{ 1135, 1134, 1106, 1, 4 }, -{ 1135, 1106, 1105, 1, 2 }, -{ 1163, 1165, 1164, 1, 3 }, -{ 1165, 1163, 1162, 1, 2 }, -{ 1151, 1150, 1171, 1, 6 }, -{ 1165, 1162, 1161, 1, 2 }, -{ 1166, 1165, 1161, 1, 4 }, -{ 1166, 1161, 1160, 1, 2 }, -{ 1167, 1166, 1160, 1, 4 }, -{ 1167, 1160, 1159, 1, 2 }, -{ 1168, 1167, 1159, 1, 4 }, -{ 1168, 1159, 1158, 1, 2 }, -{ 1169, 1168, 1158, 1, 4 }, -{ 1169, 1158, 1157, 1, 2 }, -{ 1170, 1169, 1157, 1, 4 }, -{ 1170, 1157, 1156, 1, 2 }, -{ 1170, 1156, 1155, 1, 2 }, -{ 1170, 1155, 1154, 1, 2 }, -{ 1170, 1154, 1153, 1, 2 }, -{ 1171, 1170, 1153, 1, 4 }, -{ 1171, 1153, 1152, 1, 2 }, -{ 1171, 1152, 1151, 1, 2 }, -{ 1191, 1190, 1189, 1, 6 }, -{ 1191, 1189, 1188, 1, 2 }, -{ 1188, 1187, 1186, 1, 6 }, -{ 1188, 1186, 1185, 1, 2 }, -{ 1184, 1183, 1182, 1, 6 }, -{ 1173, 1172, 1196, 1, 6 }, -{ 1174, 1173, 1196, 1, 4 }, -{ 1175, 1174, 1196, 1, 4 }, -{ 1175, 1196, 1195, 1, 2 }, -{ 1176, 1175, 1195, 1, 4 }, -{ 1176, 1195, 1194, 1, 2 }, -{ 1177, 1176, 1194, 1, 4 }, -{ 1178, 1177, 1194, 1, 4 }, -{ 1179, 1178, 1194, 1, 4 }, -{ 1179, 1194, 1193, 1, 2 }, -{ 1180, 1179, 1193, 1, 4 }, -{ 1181, 1180, 1193, 1, 4 }, -{ 1181, 1193, 1192, 1, 2 }, -{ 1182, 1181, 1192, 1, 4 }, -{ 1182, 1192, 1191, 1, 2 }, -{ 1182, 1191, 1188, 1, 0 }, -{ 1182, 1188, 1185, 1, 0 }, -{ 1182, 1185, 1184, 1, 2 }, -{ 1197, 1200, 1199, 1, 6 }, -{ 1198, 1197, 1199, 1, 5 }, -{ 1203, 1202, 1201, 1, 6 }, -{ 1204, 1203, 1201, 1, 4 }, -{ 1208, 1207, 1206, 1, 6 }, -{ 1208, 1206, 1205, 1, 2 }, -{ 1201, 1208, 1205, 1, 4 }, -{ 1204, 1201, 1205, 1, 1 }, -{ 1265, 1266, 1267, 0, 6 }, -{ 1227, 1228, 1229, 0, 6 }, -{ 1265, 1267, 1268, 0, 2 }, -{ 1226, 1227, 1229, 0, 4 }, -{ 1226, 1229, 1230, 0, 2 }, -{ 1225, 1226, 1230, 0, 4 }, -{ 1225, 1230, 1231, 0, 2 }, -{ 1224, 1225, 1231, 0, 4 }, -{ 1224, 1231, 1232, 0, 2 }, -{ 1264, 1265, 1268, 0, 4 }, -{ 1264, 1268, 1269, 0, 2 }, -{ 1263, 1264, 1269, 0, 4 }, -{ 1263, 1269, 1270, 0, 2 }, -{ 1262, 1263, 1270, 0, 4 }, -{ 1223, 1224, 1232, 0, 4 }, -{ 1223, 1232, 1233, 0, 2 }, -{ 1262, 1270, 1271, 0, 2 }, -{ 1261, 1262, 1271, 0, 4 }, -{ 1222, 1223, 1233, 0, 4 }, -{ 1222, 1233, 1234, 0, 2 }, -{ 1260, 1261, 1271, 0, 4 }, -{ 1260, 1271, 1272, 0, 2 }, -{ 1259, 1260, 1272, 0, 4 }, -{ 1259, 1272, 1273, 0, 2 }, -{ 1258, 1259, 1273, 0, 4 }, -{ 1258, 1273, 1274, 0, 2 }, -{ 1257, 1258, 1274, 0, 4 }, -{ 1257, 1274, 1275, 0, 2 }, -{ 1256, 1257, 1275, 0, 4 }, -{ 1256, 1275, 1276, 0, 2 }, -{ 1255, 1256, 1276, 0, 4 }, -{ 1255, 1276, 1277, 0, 2 }, -{ 1254, 1255, 1277, 0, 4 }, -{ 1253, 1254, 1277, 0, 4 }, -{ 1253, 1277, 1278, 0, 2 }, -{ 1252, 1253, 1278, 0, 4 }, -{ 1251, 1252, 1278, 0, 4 }, -{ 1251, 1278, 1279, 0, 2 }, -{ 1250, 1251, 1279, 0, 4 }, -{ 1249, 1250, 1279, 0, 4 }, -{ 1249, 1279, 1280, 0, 2 }, -{ 1248, 1249, 1280, 0, 4 }, -{ 1247, 1248, 1280, 0, 4 }, -{ 1247, 1280, 1281, 0, 2 }, -{ 1247, 1281, 1282, 0, 2 }, -{ 1222, 1234, 1235, 0, 2 }, -{ 1221, 1222, 1235, 0, 4 }, -{ 1221, 1235, 1236, 0, 2 }, -{ 1220, 1221, 1236, 0, 4 }, -{ 1220, 1236, 1237, 0, 2 }, -{ 1219, 1220, 1237, 0, 4 }, -{ 1219, 1237, 1238, 0, 2 }, -{ 1218, 1219, 1238, 0, 4 }, -{ 1218, 1238, 1239, 0, 2 }, -{ 1218, 1239, 1240, 0, 2 }, -{ 1217, 1218, 1240, 0, 4 }, -{ 1217, 1240, 1241, 0, 2 }, -{ 1217, 1241, 1242, 0, 2 }, -{ 1216, 1217, 1242, 0, 4 }, -{ 1216, 1242, 1243, 0, 2 }, -{ 1216, 1243, 1244, 0, 2 }, -{ 1215, 1216, 1244, 0, 4 }, -{ 1215, 1244, 1245, 0, 2 }, -{ 1215, 1245, 1246, 0, 2 }, -{ 1214, 1215, 1246, 0, 4 }, -{ 1214, 1246, 1247, 0, 2 }, -{ 1213, 1214, 1247, 0, 4 }, -{ 1213, 1247, 1282, 0, 0 }, -{ 1212, 1213, 1282, 0, 4 }, -{ 1212, 1282, 1283, 0, 2 }, -{ 1211, 1212, 1283, 0, 4 }, -{ 1211, 1283, 1209, 0, 2 }, -{ 1211, 1209, 1210, 0, 3 }, -{ 1290, 1291, 1307, 0, 4 }, -{ 1290, 1307, 1308, 0, 2 }, -{ 1289, 1290, 1308, 0, 4 }, -{ 1289, 1308, 1309, 0, 2 }, -{ 1288, 1289, 1309, 0, 4 }, -{ 1288, 1309, 1310, 0, 2 }, -{ 1287, 1288, 1310, 0, 4 }, -{ 1287, 1310, 1311, 0, 2 }, -{ 1286, 1287, 1311, 0, 4 }, -{ 1286, 1311, 1312, 0, 2 }, -{ 1285, 1286, 1312, 0, 4 }, -{ 1285, 1312, 1313, 0, 2 }, -{ 1284, 1285, 1313, 0, 4 }, -{ 1284, 1313, 1299, 0, 2 }, -{ 1298, 1284, 1299, 0, 4 }, -{ 1298, 1299, 1300, 0, 2 }, -{ 1297, 1298, 1300, 0, 4 }, -{ 1297, 1300, 1301, 0, 2 }, -{ 1307, 1291, 1292, 0, 2 }, -{ 1306, 1307, 1292, 0, 4 }, -{ 1306, 1292, 1293, 0, 2 }, -{ 1305, 1306, 1293, 0, 4 }, -{ 1305, 1293, 1294, 0, 2 }, -{ 1304, 1305, 1294, 0, 4 }, -{ 1304, 1294, 1295, 0, 2 }, -{ 1303, 1304, 1295, 0, 4 }, -{ 1303, 1295, 1296, 0, 2 }, -{ 1302, 1303, 1296, 0, 4 }, -{ 1302, 1296, 1297, 0, 2 }, -{ 1302, 1297, 1301, 0, 1 }, -{ 1330, 1331, 1332, 1, 6 }, -{ 1329, 1330, 1332, 1, 4 }, -{ 1328, 1329, 1332, 1, 4 }, -{ 1328, 1332, 1333, 1, 2 }, -{ 1327, 1328, 1333, 1, 4 }, -{ 1327, 1333, 1334, 1, 2 }, -{ 1327, 1334, 1335, 1, 2 }, -{ 1326, 1327, 1335, 1, 4 }, -{ 1326, 1335, 1336, 1, 2 }, -{ 1325, 1326, 1336, 1, 4 }, -{ 1325, 1336, 1337, 1, 2 }, -{ 1324, 1325, 1337, 1, 4 }, -{ 1324, 1337, 1338, 1, 2 }, -{ 1324, 1338, 1339, 1, 2 }, -{ 1324, 1339, 1340, 1, 2 }, -{ 1323, 1324, 1340, 1, 4 }, -{ 1323, 1340, 1341, 1, 2 }, -{ 1348, 1349, 1314, 1, 6 }, -{ 1348, 1314, 1315, 1, 2 }, -{ 1346, 1347, 1348, 1, 6 }, -{ 1345, 1346, 1348, 1, 4 }, -{ 1345, 1348, 1315, 1, 0 }, -{ 1316, 1317, 1318, 1, 6 }, -{ 1315, 1316, 1318, 1, 4 }, -{ 1345, 1315, 1318, 1, 0 }, -{ 1344, 1345, 1318, 1, 4 }, -{ 1344, 1318, 1319, 1, 2 }, -{ 1344, 1319, 1320, 1, 2 }, -{ 1344, 1320, 1321, 1, 2 }, -{ 1343, 1344, 1321, 1, 4 }, -{ 1343, 1321, 1322, 1, 2 }, -{ 1342, 1343, 1322, 1, 4 }, -{ 1342, 1322, 1323, 1, 2 }, -{ 1342, 1323, 1341, 1, 1 }, -{ 1361, 1350, 1351, 1, 6 }, -{ 1360, 1361, 1351, 1, 4 }, -{ 1357, 1358, 1359, 1, 6 }, -{ 1357, 1359, 1360, 1, 2 }, -{ 1355, 1356, 1357, 1, 6 }, -{ 1354, 1355, 1357, 1, 4 }, -{ 1351, 1352, 1353, 1, 6 }, -{ 1351, 1353, 1354, 1, 2 }, -{ 1360, 1351, 1354, 1, 0 }, -{ 1357, 1360, 1354, 1, 0 }, -{ 1368, 1369, 1362, 1, 6 }, -{ 1368, 1362, 1363, 1, 2 }, -{ 1366, 1367, 1368, 1, 6 }, -{ 1365, 1366, 1368, 1, 4 }, -{ 1365, 1368, 1363, 1, 0 }, -{ 1365, 1363, 1364, 1, 3 }, -{ 1378, 1379, 1370, 1, 6 }, -{ 1378, 1370, 1371, 1, 2 }, -{ 1378, 1371, 1372, 1, 2 }, -{ 1377, 1378, 1372, 1, 4 }, -{ 1376, 1377, 1372, 1, 4 }, -{ 1376, 1372, 1373, 1, 2 }, -{ 1376, 1373, 1374, 1, 2 }, -{ 1375, 1376, 1374, 1, 5 }, -{ 1382, 1383, 1380, 1, 6 }, -{ 1382, 1380, 1381, 1, 3 }, -{ 1401, 1402, 1384, 1, 6 }, -{ 1401, 1384, 1385, 1, 2 }, -{ 1400, 1401, 1385, 1, 4 }, -{ 1394, 1395, 1396, 1, 6 }, -{ 1393, 1394, 1396, 1, 4 }, -{ 1392, 1393, 1396, 1, 4 }, -{ 1392, 1396, 1397, 1, 2 }, -{ 1391, 1392, 1397, 1, 4 }, -{ 1391, 1397, 1398, 1, 2 }, -{ 1390, 1391, 1398, 1, 4 }, -{ 1389, 1390, 1398, 1, 4 }, -{ 1388, 1389, 1398, 1, 4 }, -{ 1388, 1398, 1399, 1, 2 }, -{ 1387, 1388, 1399, 1, 4 }, -{ 1385, 1386, 1387, 1, 6 }, -{ 1400, 1385, 1387, 1, 0 }, -{ 1400, 1387, 1399, 1, 1 }, -{ 1426, 1410, 1411, 1, 2 }, -{ 1426, 1411, 1412, 1, 2 }, -{ 1432, 1426, 1412, 1, 4 }, -{ 1425, 1403, 1404, 1, 6 }, -{ 1432, 1412, 1413, 1, 2 }, -{ 1431, 1432, 1413, 1, 4 }, -{ 1431, 1413, 1414, 1, 2 }, -{ 1430, 1431, 1414, 1, 4 }, -{ 1430, 1414, 1415, 1, 2 }, -{ 1430, 1415, 1416, 1, 2 }, -{ 1430, 1416, 1417, 1, 2 }, -{ 1429, 1430, 1417, 1, 4 }, -{ 1429, 1417, 1418, 1, 2 }, -{ 1428, 1429, 1418, 1, 4 }, -{ 1428, 1418, 1419, 1, 2 }, -{ 1427, 1428, 1419, 1, 4 }, -{ 1427, 1419, 1420, 1, 2 }, -{ 1427, 1420, 1421, 1, 2 }, -{ 1426, 1427, 1421, 1, 4 }, -{ 1410, 1426, 1421, 1, 0 }, -{ 1409, 1410, 1421, 1, 4 }, -{ 1408, 1409, 1421, 1, 4 }, -{ 1408, 1421, 1422, 1, 2 }, -{ 1407, 1408, 1422, 1, 4 }, -{ 1407, 1422, 1423, 1, 2 }, -{ 1406, 1407, 1423, 1, 4 }, -{ 1406, 1423, 1424, 1, 2 }, -{ 1405, 1406, 1424, 1, 4 }, -{ 1404, 1405, 1424, 1, 4 }, -{ 1404, 1424, 1425, 1, 2 }, -{ 1449, 1450, 1433, 1, 6 }, -{ 1449, 1433, 1434, 1, 2 }, -{ 1448, 1449, 1434, 1, 4 }, -{ 1447, 1448, 1434, 1, 4 }, -{ 1434, 1435, 1436, 1, 6 }, -{ 1447, 1434, 1436, 1, 0 }, -{ 1446, 1447, 1436, 1, 4 }, -{ 1446, 1436, 1437, 1, 2 }, -{ 1445, 1446, 1437, 1, 4 }, -{ 1445, 1437, 1438, 1, 2 }, -{ 1442, 1443, 1444, 1, 6 }, -{ 1444, 1445, 1438, 1, 4 }, -{ 1444, 1438, 1439, 1, 2 }, -{ 1441, 1442, 1444, 1, 4 }, -{ 1444, 1439, 1440, 1, 2 }, -{ 1444, 1440, 1441, 1, 2 }, -{ 1499, 1486, 1454, 1, 4 }, -{ 1499, 1454, 1455, 1, 2 }, -{ 1499, 1455, 1456, 1, 2 }, -{ 1499, 1456, 1457, 1, 2 }, -{ 1499, 1457, 1458, 1, 2 }, -{ 1498, 1499, 1458, 1, 4 }, -{ 1485, 1451, 1452, 1, 6 }, -{ 1472, 1473, 1474, 1, 6 }, -{ 1484, 1485, 1452, 1, 4 }, -{ 1472, 1474, 1475, 1, 2 }, -{ 1471, 1472, 1475, 1, 4 }, -{ 1471, 1475, 1476, 1, 2 }, -{ 1470, 1471, 1476, 1, 4 }, -{ 1470, 1476, 1477, 1, 2 }, -{ 1470, 1477, 1478, 1, 2 }, -{ 1469, 1470, 1478, 1, 4 }, -{ 1469, 1478, 1479, 1, 2 }, -{ 1469, 1479, 1480, 1, 2 }, -{ 1468, 1469, 1480, 1, 4 }, -{ 1468, 1480, 1481, 1, 2 }, -{ 1467, 1468, 1481, 1, 4 }, -{ 1483, 1484, 1452, 1, 4 }, -{ 1497, 1498, 1458, 1, 4 }, -{ 1497, 1458, 1459, 1, 2 }, -{ 1496, 1497, 1459, 1, 4 }, -{ 1483, 1452, 1453, 1, 2 }, -{ 1496, 1459, 1460, 1, 2 }, -{ 1495, 1496, 1460, 1, 4 }, -{ 1495, 1460, 1461, 1, 2 }, -{ 1494, 1495, 1461, 1, 4 }, -{ 1494, 1461, 1462, 1, 2 }, -{ 1494, 1462, 1463, 1, 2 }, -{ 1493, 1494, 1463, 1, 4 }, -{ 1493, 1463, 1464, 1, 2 }, -{ 1492, 1493, 1464, 1, 4 }, -{ 1492, 1464, 1465, 1, 2 }, -{ 1491, 1492, 1465, 1, 4 }, -{ 1490, 1491, 1465, 1, 4 }, -{ 1489, 1490, 1465, 1, 4 }, -{ 1489, 1465, 1466, 1, 2 }, -{ 1488, 1489, 1466, 1, 4 }, -{ 1488, 1466, 1467, 1, 2 }, -{ 1487, 1488, 1467, 1, 4 }, -{ 1487, 1467, 1481, 1, 0 }, -{ 1486, 1487, 1481, 1, 4 }, -{ 1454, 1486, 1481, 1, 0 }, -{ 1454, 1481, 1482, 1, 2 }, -{ 1454, 1482, 1483, 1, 2 }, -{ 1453, 1454, 1483, 1, 4 }, -{ 1513, 1514, 1515, 1, 6 }, -{ 1512, 1513, 1515, 1, 4 }, -{ 1521, 1500, 1501, 1, 6 }, -{ 1511, 1512, 1515, 1, 4 }, -{ 1511, 1515, 1516, 1, 2 }, -{ 1510, 1511, 1516, 1, 4 }, -{ 1510, 1516, 1517, 1, 2 }, -{ 1509, 1510, 1517, 1, 4 }, -{ 1509, 1517, 1518, 1, 2 }, -{ 1508, 1509, 1518, 1, 4 }, -{ 1508, 1518, 1519, 1, 2 }, -{ 1507, 1508, 1519, 1, 4 }, -{ 1507, 1519, 1520, 1, 2 }, -{ 1506, 1507, 1520, 1, 4 }, -{ 1505, 1506, 1520, 1, 4 }, -{ 1504, 1505, 1520, 1, 4 }, -{ 1503, 1504, 1520, 1, 4 }, -{ 1503, 1520, 1521, 1, 2 }, -{ 1502, 1503, 1521, 1, 4 }, -{ 1501, 1502, 1521, 1, 4 }, -{ 1539, 1540, 1541, 1, 6 }, -{ 1538, 1539, 1541, 1, 4 }, -{ 1536, 1537, 1538, 1, 6 }, -{ 1535, 1536, 1538, 1, 4 }, -{ 1532, 1533, 1534, 1, 6 }, -{ 1545, 1522, 1523, 1, 6 }, -{ 1545, 1523, 1524, 1, 2 }, -{ 1545, 1524, 1525, 1, 2 }, -{ 1544, 1545, 1525, 1, 4 }, -{ 1544, 1525, 1526, 1, 2 }, -{ 1544, 1526, 1527, 1, 2 }, -{ 1544, 1527, 1528, 1, 2 }, -{ 1544, 1528, 1529, 1, 2 }, -{ 1543, 1544, 1529, 1, 4 }, -{ 1543, 1529, 1530, 1, 2 }, -{ 1543, 1530, 1531, 1, 2 }, -{ 1542, 1543, 1531, 1, 4 }, -{ 1542, 1531, 1532, 1, 2 }, -{ 1541, 1542, 1532, 1, 4 }, -{ 1538, 1541, 1532, 1, 0 }, -{ 1535, 1538, 1532, 1, 0 }, -{ 1534, 1535, 1532, 1, 4 }, -{ 1548, 1549, 1546, 1, 6 }, -{ 1548, 1546, 1547, 1, 3 }, -{ 1550, 1551, 1552, 1, 6 }, -{ 1550, 1552, 1553, 1, 2 }, -{ 1555, 1556, 1557, 1, 6 }, -{ 1554, 1555, 1557, 1, 4 }, -{ 1554, 1557, 1550, 1, 2 }, -{ 1554, 1550, 1553, 1, 1 }, -{ 1575, 1558, 1559, 0, 2 }, -{ 1575, 1559, 1560, 0, 2 }, -{ 1575, 1560, 1561, 0, 2 }, -{ 1575, 1561, 1562, 0, 2 }, -{ 1575, 1562, 1563, 0, 2 }, -{ 1575, 1563, 1564, 0, 2 }, -{ 1575, 1564, 1565, 0, 2 }, -{ 1575, 1565, 1558, 0, 2 }, -{ 1574, 1567, 1566, 0, 2 }, -{ 1574, 1568, 1567, 0, 2 }, -{ 1574, 1569, 1568, 0, 2 }, -{ 1574, 1570, 1569, 0, 2 }, -{ 1574, 1571, 1570, 0, 2 }, -{ 1574, 1572, 1571, 0, 2 }, -{ 1574, 1573, 1572, 0, 2 }, -{ 1574, 1566, 1573, 0, 2 }, -{ 1593, 1576, 1577, 0, 2 }, -{ 1593, 1577, 1578, 0, 2 }, -{ 1593, 1578, 1579, 0, 2 }, -{ 1593, 1579, 1580, 0, 2 }, -{ 1593, 1580, 1581, 0, 2 }, -{ 1593, 1581, 1582, 0, 2 }, -{ 1593, 1582, 1583, 0, 2 }, -{ 1593, 1583, 1576, 0, 2 }, -{ 1592, 1585, 1584, 0, 2 }, -{ 1592, 1586, 1585, 0, 2 }, -{ 1592, 1587, 1586, 0, 2 }, -{ 1592, 1588, 1587, 0, 2 }, -{ 1592, 1589, 1588, 0, 2 }, -{ 1592, 1590, 1589, 0, 2 }, -{ 1592, 1591, 1590, 0, 2 }, -{ 1592, 1584, 1591, 0, 2 }, -{ 1610, 1609, 1608, 1, 6 }, -{ 1610, 1608, 1607, 1, 2 }, -{ 1607, 1606, 1605, 1, 6 }, -{ 1607, 1605, 1604, 1, 2 }, -{ 1603, 1602, 1601, 1, 6 }, -{ 1595, 1594, 1613, 1, 6 }, -{ 1596, 1595, 1613, 1, 4 }, -{ 1596, 1613, 1612, 1, 2 }, -{ 1597, 1596, 1612, 1, 4 }, -{ 1598, 1597, 1612, 1, 4 }, -{ 1599, 1598, 1612, 1, 4 }, -{ 1599, 1612, 1611, 1, 2 }, -{ 1600, 1599, 1611, 1, 4 }, -{ 1601, 1600, 1611, 1, 4 }, -{ 1601, 1611, 1610, 1, 2 }, -{ 1601, 1610, 1607, 1, 0 }, -{ 1601, 1607, 1604, 1, 0 }, -{ 1601, 1604, 1603, 1, 2 }, -{ 1628, 1629, 1630, 1, 6 }, -{ 1627, 1628, 1630, 1, 4 }, -{ 1625, 1626, 1627, 1, 6 }, -{ 1624, 1625, 1627, 1, 4 }, -{ 1621, 1622, 1623, 1, 6 }, -{ 1633, 1614, 1615, 1, 6 }, -{ 1633, 1615, 1616, 1, 2 }, -{ 1632, 1633, 1616, 1, 4 }, -{ 1632, 1616, 1617, 1, 2 }, -{ 1632, 1617, 1618, 1, 2 }, -{ 1632, 1618, 1619, 1, 2 }, -{ 1631, 1632, 1619, 1, 4 }, -{ 1631, 1619, 1620, 1, 2 }, -{ 1631, 1620, 1621, 1, 2 }, -{ 1630, 1631, 1621, 1, 4 }, -{ 1627, 1630, 1621, 1, 0 }, -{ 1624, 1627, 1621, 1, 0 }, -{ 1623, 1624, 1621, 1, 4 }, -{ 1642, 1641, 1657, 1, 4 }, -{ 1643, 1642, 1657, 1, 4 }, -{ 1643, 1657, 1663, 1, 2 }, -{ 1635, 1634, 1656, 1, 6 }, -{ 1644, 1643, 1663, 1, 4 }, -{ 1644, 1663, 1662, 1, 2 }, -{ 1645, 1644, 1662, 1, 4 }, -{ 1645, 1662, 1661, 1, 2 }, -{ 1646, 1645, 1661, 1, 4 }, -{ 1647, 1646, 1661, 1, 4 }, -{ 1648, 1647, 1661, 1, 4 }, -{ 1648, 1661, 1660, 1, 2 }, -{ 1649, 1648, 1660, 1, 4 }, -{ 1649, 1660, 1659, 1, 2 }, -{ 1650, 1649, 1659, 1, 4 }, -{ 1650, 1659, 1658, 1, 2 }, -{ 1651, 1650, 1658, 1, 4 }, -{ 1652, 1651, 1658, 1, 4 }, -{ 1652, 1658, 1657, 1, 2 }, -{ 1652, 1657, 1641, 1, 0 }, -{ 1652, 1641, 1640, 1, 2 }, -{ 1652, 1640, 1639, 1, 2 }, -{ 1653, 1652, 1639, 1, 4 }, -{ 1653, 1639, 1638, 1, 2 }, -{ 1654, 1653, 1638, 1, 4 }, -{ 1654, 1638, 1637, 1, 2 }, -{ 1655, 1654, 1637, 1, 4 }, -{ 1655, 1637, 1636, 1, 2 }, -{ 1655, 1636, 1635, 1, 2 }, -{ 1656, 1655, 1635, 1, 4 }, -{ 1687, 1671, 1672, 1, 2 }, -{ 1687, 1672, 1673, 1, 2 }, -{ 1693, 1687, 1673, 1, 4 }, -{ 1686, 1664, 1665, 1, 6 }, -{ 1693, 1673, 1674, 1, 2 }, -{ 1692, 1693, 1674, 1, 4 }, -{ 1692, 1674, 1675, 1, 2 }, -{ 1691, 1692, 1675, 1, 4 }, -{ 1691, 1675, 1676, 1, 2 }, -{ 1691, 1676, 1677, 1, 2 }, -{ 1691, 1677, 1678, 1, 2 }, -{ 1690, 1691, 1678, 1, 4 }, -{ 1690, 1678, 1679, 1, 2 }, -{ 1689, 1690, 1679, 1, 4 }, -{ 1689, 1679, 1680, 1, 2 }, -{ 1688, 1689, 1680, 1, 4 }, -{ 1688, 1680, 1681, 1, 2 }, -{ 1688, 1681, 1682, 1, 2 }, -{ 1687, 1688, 1682, 1, 4 }, -{ 1671, 1687, 1682, 1, 0 }, -{ 1670, 1671, 1682, 1, 4 }, -{ 1669, 1670, 1682, 1, 4 }, -{ 1669, 1682, 1683, 1, 2 }, -{ 1668, 1669, 1683, 1, 4 }, -{ 1668, 1683, 1684, 1, 2 }, -{ 1667, 1668, 1684, 1, 4 }, -{ 1667, 1684, 1685, 1, 2 }, -{ 1666, 1667, 1685, 1, 4 }, -{ 1665, 1666, 1685, 1, 4 }, -{ 1665, 1685, 1686, 1, 2 } -}; - -static Vert vert_2[] = { -{ 171.834137f, -24.549576f, 161.761139f, 0.000000f, -1.000000f, 0.000000f, 167.258984f, 73.910260f }, -{ 385.145508f, -24.549585f, 281.452515f, 0.000000f, -1.000000f, 0.000000f, 214.952915f, 32.905991f }, -{ 336.557922f, -24.549572f, 123.839111f, 0.000000f, -1.000000f, 0.000000f, 204.089298f, 86.901717f }, -{ 526.168030f, -24.549603f, 127.394318f, 0.000000f, -1.000000f, 0.000000f, 246.483912f, 85.683761f }, -{ 387.515625f, -24.549564f, 39.699638f, 0.000000f, -1.000000f, 0.000000f, 215.482850f, 115.726499f }, -{ 540.388733f, -24.549561f, -4.147684f, 0.000000f, -1.000000f, 0.000000f, 249.663506f, 130.747868f }, -{ 398.181213f, -24.549526f, -46.809975f, 0.000000f, -1.000000f, 0.000000f, 217.867557f, 145.363252f }, -{ 559.349792f, -24.549519f, -146.355286f, 0.000000f, -1.000000f, 0.000000f, 253.902968f, 179.465822f }, -{ 342.483246f, -24.549520f, -126.209206f, 0.000000f, -1.000000f, 0.000000f, 205.414135f, 172.564107f }, -{ 451.509033f, -24.549507f, -264.861603f, 0.000000f, -1.000000f, 0.000000f, 229.791028f, 220.064120f }, -{ 233.457428f, -24.549515f, -184.277298f, 0.000000f, -1.000000f, 0.000000f, 181.037242f, 192.457275f }, -{ 252.418427f, -24.549503f, -317.004364f, 0.000000f, -1.000000f, 0.000000f, 185.276690f, 237.927362f }, -{ 87.694656f, -24.549515f, -183.092224f, 0.000000f, -1.000000f, 0.000000f, 148.446376f, 192.051290f }, -{ 27.256439f, -24.549471f, -341.890686f, 0.000000f, -1.000000f, 0.000000f, 134.933100f, 246.453003f }, -{ -72.288864f, -24.549515f, -178.351990f, 0.000000f, -1.000000f, 0.000000f, 112.675931f, 190.427367f }, -{ -154.058212f, -24.549473f, -325.299805f, 0.000000f, -1.000000f, 0.000000f, 94.393258f, 240.769243f }, -{ -220.421753f, -24.549486f, -172.426666f, 0.000000f, -1.000000f, 0.000000f, 79.555146f, 188.397447f }, -{ -346.038452f, -24.549469f, -367.962097f, 0.000000f, -1.000000f, 0.000000f, 51.468713f, 255.384635f }, -{ -318.781982f, -24.549488f, -146.355286f, 0.000000f, -1.000000f, 0.000000f, 57.562944f, 179.465822f }, -{ -466.914886f, -24.549479f, -242.345398f, 0.000000f, -1.000000f, 0.000000f, 24.442152f, 212.350443f }, -{ -383.960480f, -24.549492f, -96.582626f, 0.000000f, -1.000000f, 0.000000f, 42.989791f, 162.414540f }, -{ -552.239441f, -24.549492f, -101.322876f, 0.000000f, -1.000000f, 0.000000f, 5.364584f, 164.038467f }, -{ -421.882477f, -24.549498f, -27.848965f, 0.000000f, -1.000000f, 0.000000f, 34.510873f, 138.867531f }, -{ -559.349792f, -24.549505f, 49.180138f, 0.000000f, -1.000000f, 0.000000f, 3.774793f, 112.478631f }, -{ -412.401978f, -24.549538f, 71.696342f, 0.000000f, -1.000000f, 0.000000f, 36.630604f, 104.764969f }, -{ -510.762207f, -24.549515f, 174.796814f, 0.000000f, -1.000000f, 0.000000f, 14.638404f, 69.444450f }, -{ -348.408569f, -24.549543f, 140.429993f, 0.000000f, -1.000000f, 0.000000f, 50.938782f, 81.217951f }, -{ -411.216919f, -24.549555f, 264.861633f, 0.000000f, -1.000000f, 0.000000f, 36.895568f, 38.589741f }, -{ -258.343781f, -24.549547f, 187.832520f, 0.000000f, -1.000000f, 0.000000f, 71.076220f, 64.978641f }, -{ -254.788574f, -24.549561f, 338.335541f, 0.000000f, -1.000000f, 0.000000f, 71.871129f, 13.418798f }, -{ -133.912140f, -24.549547f, 193.757843f, 0.000000f, -1.000000f, 0.000000f, 98.897688f, 62.948714f }, -{ -43.847347f, -24.549593f, 367.962097f, 0.000000f, -1.000000f, 0.000000f, 119.035126f, 3.269238f }, -{ 37.922009f, -24.549547f, 183.092255f, 0.000000f, -1.000000f, 0.000000f, 137.317792f, 66.602568f }, -{ 168.278946f, -24.549589f, 315.819336f, 0.000000f, -1.000000f, 0.000000f, 166.464082f, 21.132490f } -}; - -static Face face_2[] = { -{ 18, 17, 16, 2, 6 }, -{ 8, 7, 6, 2, 6 }, -{ 20, 19, 18, 2, 6 }, -{ 22, 21, 20, 2, 6 }, -{ 4, 3, 2, 2, 6 }, -{ 10, 9, 8, 2, 6 }, -{ 6, 5, 4, 2, 6 }, -{ 26, 25, 24, 2, 6 }, -{ 28, 27, 26, 2, 6 }, -{ 24, 23, 22, 2, 6 }, -{ 30, 29, 28, 2, 6 }, -{ 12, 11, 10, 2, 6 }, -{ 2, 1, 0, 2, 6 }, -{ 0, 33, 32, 2, 6 }, -{ 32, 31, 30, 2, 6 }, -{ 14, 13, 12, 2, 6 }, -{ 16, 15, 14, 2, 6 }, -{ 4, 2, 0, 2, 0 }, -{ 6, 4, 0, 2, 0 }, -{ 8, 6, 0, 2, 0 }, -{ 10, 8, 0, 2, 0 }, -{ 12, 10, 0, 2, 0 }, -{ 12, 0, 32, 2, 0 }, -{ 14, 12, 32, 2, 0 }, -{ 14, 32, 30, 2, 0 }, -{ 16, 14, 30, 2, 0 }, -{ 16, 30, 28, 2, 0 }, -{ 16, 28, 26, 2, 0 }, -{ 18, 16, 26, 2, 0 }, -{ 20, 18, 26, 2, 0 }, -{ 20, 26, 24, 2, 0 }, -{ 20, 24, 22, 2, 0 } -}; - - -static Vert *vert[] = { -vert_0, -vert_1, -vert_2 -}; - -static int num_verts[] = { -68, -1694, -34 -}; - -static Face *face[] = { -face_0, -face_1, -face_2 -}; - -static int num_faces[] = { -100, -1606, -32 -}; - -static int total_num_frames = 75; - -static Matrix mat[75][3] = { -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 22198.351563, 1.000000}, - {1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -32.104950, -4.568500, 21760.089844, 1.000000}, - {1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -36.722248, 9.404100, 22230.794922, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 21601.316406, 1.000000}, - {0.881000, 0.187100, 0.434500, 0.000000, - -0.178600, -0.718900, 0.671800, 0.000000, - -0.438000, 0.669500, 0.600000, 0.000000, - -40.679047, 57.105099, 21262.400391, 1.000000}, - {1.008900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.008900, 0.000000, - 0.000000, 1.008900, 0.000000, 0.000000, - -36.722248, 9.404100, 21633.759766, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 20863.496094, 1.000000}, - {0.759600, 0.187100, 0.622900, 0.000000, - -0.326300, -0.718900, 0.613800, 0.000000, - -0.562600, 0.669500, 0.485100, 0.000000, - -35.966850, 57.105099, 20524.212891, 1.000000}, - {1.017400, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.017400, 0.000000, - 0.000000, 1.017400, 0.000000, 0.000000, - -36.722248, 9.404100, 20895.939453, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 20000.533203, 1.000000}, - {0.598200, 0.187100, 0.779200, 0.000000, - -0.457200, -0.718900, 0.523600, 0.000000, - -0.658100, 0.669500, 0.344500, 0.000000, - -31.281849, 57.105099, 19661.962891, 1.000000}, - {1.025100, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.025100, 0.000000, - 0.000000, 1.025100, 0.000000, 0.000000, - -36.722248, 9.404100, 20032.976563, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 19028.070313, 1.000000}, - {0.406500, 0.187100, 0.894300, 0.000000, - -0.563800, -0.718900, 0.406600, 0.000000, - -0.719000, 0.669500, 0.186800, 0.000000, - -26.903849, 57.105099, 18691.248047, 1.000000}, - {1.031600, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.031600, 0.000000, - 0.000000, 1.031600, 0.000000, 0.000000, - -36.722248, 9.404100, 19060.513672, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 17961.750000, 1.000000}, - {0.196700, 0.187100, 0.962400, 0.000000, - -0.640300, -0.718900, 0.270600, 0.000000, - -0.742500, 0.669500, 0.021700, 0.000000, - -23.081848, 57.105099, 17627.578125, 1.000000}, - {1.036500, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.036500, 0.000000, - 0.000000, 1.036500, 0.000000, 0.000000, - -36.722248, 9.404100, 17994.193359, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 16817.216797, 1.000000}, - {-0.018200, 0.187100, 0.982200, 0.000000, - -0.683900, -0.718900, 0.124300, 0.000000, - -0.729300, 0.669500, -0.141000, 0.000000, - -20.007050, 57.105099, 16486.400391, 1.000000}, - {1.039500, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.039500, 0.000000, - 0.000000, 1.039500, 0.000000, 0.000000, - -36.722248, 9.404100, 16849.660156, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 15610.111328, 1.000000}, - {-0.225800, 0.187100, 0.956000, 0.000000, - -0.694700, -0.718900, -0.023400, 0.000000, - -0.682900, 0.669500, -0.292300, 0.000000, - -17.795149, 57.105099, 15283.111328, 1.000000}, - {1.040000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.040000, 0.000000, - 0.000000, 1.040000, 0.000000, 0.000000, - -36.722248, 9.404100, 15642.555664, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 14356.078125, 1.000000}, - {-0.414200, 0.187100, 0.890800, 0.000000, - -0.675700, -0.718900, -0.163200, 0.000000, - -0.609900, 0.669500, -0.424100, 0.000000, - -16.485548, 57.105099, 14033.073242, 1.000000}, - {1.037200, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.037200, 0.000000, - 0.000000, 1.037200, 0.000000, 0.000000, - -36.722248, 9.404100, 14388.522461, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 13070.758789, 1.000000}, - {-0.577800, 0.187100, 0.794500, 0.000000, - -0.631700, -0.718900, -0.290100, 0.000000, - -0.516900, 0.669500, -0.533500, 0.000000, - -16.012848, 57.105099, 12751.730469, 1.000000}, - {1.031000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.031000, 0.000000, - 0.000000, 1.031000, 0.000000, 0.000000, - -36.722248, 9.404100, 13103.203125, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 11769.795898, 1.000000}, - {-0.715900, 0.187100, 0.672600, 0.000000, - -0.566400, -0.718900, -0.402900, 0.000000, - -0.408200, 0.669500, -0.620600, 0.000000, - -16.293648, 57.105099, 11454.640625, 1.000000}, - {1.022700, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.022700, 0.000000, - 0.000000, 1.022700, 0.000000, 0.000000, - -36.722248, 9.404100, 11802.240234, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 10468.833984, 1.000000}, - {-0.827900, 0.187100, 0.528800, 0.000000, - -0.482200, -0.718900, -0.500600, 0.000000, - -0.286500, 0.669500, -0.685400, 0.000000, - -17.278248, 57.105099, 10157.392578, 1.000000}, - {1.013400, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.013400, 0.000000, - 0.000000, 1.013400, 0.000000, 0.000000, - -36.722248, 9.404100, 10501.278320, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 9183.513672, 1.000000}, - {-0.912000, 0.187100, 0.365100, 0.000000, - -0.380400, -0.718900, -0.581800, 0.000000, - -0.153600, 0.669500, -0.726800, 0.000000, - -18.951847, 57.105099, 8875.574219, 1.000000}, - {1.004100, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004100, 0.000000, - 0.000000, 1.004100, 0.000000, 0.000000, - -36.722248, 9.404100, 9215.958008, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 7929.480957, 1.000000}, - {-0.965100, 0.187100, 0.183100, 0.000000, - -0.261500, -0.718900, -0.644000, 0.000000, - -0.011100, 0.669500, -0.742800, 0.000000, - -21.328348, 57.105099, 7624.758301, 1.000000}, - {0.996000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.996000, 0.000000, - 0.000000, 0.996000, 0.000000, 0.000000, - -36.722248, 9.404100, 7961.925293, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 6722.375488, 1.000000}, - {-0.982200, 0.187100, -0.015200, 0.000000, - -0.126300, -0.718900, -0.683500, 0.000000, - 0.138800, 0.669500, -0.729800, 0.000000, - -24.438049, 57.105099, 6420.471191, 1.000000}, - {0.990300, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.990300, 0.000000, - 0.000000, 0.990300, 0.000000, 0.000000, - -36.722248, 9.404100, 6754.819824, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 5577.841309, 1.000000}, - {-0.956000, 0.187100, -0.225800, 0.000000, - 0.023400, -0.718900, -0.694700, 0.000000, - 0.292300, 0.669500, -0.682900, 0.000000, - -28.305548, 57.105099, 5278.185547, 1.000000}, - {0.988000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.988000, 0.000000, - 0.000000, 0.988000, 0.000000, 0.000000, - -36.722248, 9.404100, 5610.285645, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 4511.521484, 1.000000}, - {-0.878200, 0.187100, -0.440200, 0.000000, - 0.183000, -0.718900, -0.670600, 0.000000, - 0.441900, 0.669500, -0.597100, 0.000000, - -32.898449, 57.105099, 4213.296387, 1.000000}, - {0.991400, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.991400, 0.000000, - 0.000000, 0.991400, 0.000000, 0.000000, - -36.722248, 9.404100, 4543.965332, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 3539.058594, 1.000000}, - {-0.743400, 0.187100, -0.642200, 0.000000, - 0.341900, -0.718900, -0.605200, 0.000000, - 0.574900, 0.669500, -0.470500, 0.000000, - -38.008450, 57.105099, 3241.149658, 1.000000}, - {1.000100, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000100, 0.000000, - 0.000000, 1.000100, 0.000000, 0.000000, - -36.722248, 9.404100, 3571.502441, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 2676.096436, 1.000000}, - {-0.553100, 0.187100, -0.811800, 0.000000, - 0.486100, -0.718900, -0.496800, 0.000000, - 0.676600, 0.669500, -0.306700, 0.000000, - -43.285347, 57.105099, 2377.160400, 1.000000}, - {1.011600, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.011600, 0.000000, - 0.000000, 1.011600, 0.000000, 0.000000, - -36.722248, 9.404100, 2708.540283, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1938.275757, 1.000000}, - {-0.316400, 0.187100, -0.930000, 0.000000, - 0.601100, -0.718900, -0.349100, 0.000000, - 0.733900, 0.669500, -0.115000, 0.000000, - -48.290947, 57.105099, 1636.875488, 1.000000}, - {1.023400, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.023400, 0.000000, - 0.000000, 1.023400, 0.000000, 0.000000, - -36.722248, 9.404100, 1970.719727, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {-0.049500, 0.187100, -0.981100, 0.000000, - 0.673700, -0.718900, -0.171100, 0.000000, - 0.737300, 0.669500, 0.090500, 0.000000, - -52.555748, 57.105099, 1036.013794, 1.000000}, - {1.032800, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.032800, 0.000000, - 0.000000, 1.032800, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.225800, 0.187100, -0.956000, 0.000000, - 0.694700, -0.718900, 0.023400, 0.000000, - 0.682900, 0.669500, 0.292300, 0.000000, - -55.649448, 57.105099, 1031.074585, 1.000000}, - {1.037400, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.037400, 0.000000, - 0.000000, 1.037400, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.491100, 0.187100, -0.850800, 0.000000, - 0.658600, -0.718900, 0.222200, 0.000000, - 0.570100, 0.669500, 0.476300, 0.000000, - -57.270248, 57.105099, 1025.276733, 1.000000}, - {1.037900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.037900, 0.000000, - 0.000000, 1.037900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.723400, 0.187100, -0.664600, 0.000000, - 0.561800, -0.718900, 0.409300, 0.000000, - 0.401200, 0.669500, 0.625200, 0.000000, - -57.111149, 57.105099, 1019.001221, 1.000000}, - {1.036800, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.036800, 0.000000, - 0.000000, 1.036800, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.892600, 0.187100, -0.410300, 0.000000, - 0.409000, -0.718900, 0.562000, 0.000000, - 0.189800, 0.669500, 0.718200, 0.000000, - -55.002949, 57.105099, 1012.916504, 1.000000}, - {1.034500, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.034500, 0.000000, - 0.000000, 1.034500, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.975800, 0.187100, -0.113200, 0.000000, - 0.214500, -0.718900, 0.661200, 0.000000, - -0.042300, 0.669500, 0.741600, 0.000000, - -51.079346, 57.105099, 1007.726318, 1.000000}, - {1.031200, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.031200, 0.000000, - 0.000000, 1.031200, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.963000, 0.187100, 0.193800, 0.000000, - -0.000200, -0.718900, 0.695100, 0.000000, - -0.269300, 0.669500, 0.692300, 0.000000, - -45.765148, 57.105099, 1004.021790, 1.000000}, - {1.027000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.027000, 0.000000, - 0.000000, 1.027000, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.859000, 0.187100, 0.476600, 0.000000, - -0.210900, -0.718900, 0.662300, 0.000000, - -0.466500, 0.669500, 0.578100, 0.000000, - -39.690350, 57.105099, 1002.157410, 1.000000}, - {1.022400, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.022400, 0.000000, - 0.000000, 1.022400, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.681700, 0.187100, 0.707300, 0.000000, - -0.395700, -0.718900, 0.571500, 0.000000, - -0.615400, 0.669500, 0.416100, 0.000000, - -33.554749, 57.105099, 1002.187256, 1.000000}, - {1.017400, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.017400, 0.000000, - 0.000000, 1.017400, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.458000, 0.187100, 0.869100, 0.000000, - -0.539100, -0.718900, 0.438800, 0.000000, - -0.706900, 0.669500, 0.228400, 0.000000, - -27.984049, 57.105099, 1003.876953, 1.000000}, - {1.012300, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.012300, 0.000000, - 0.000000, 1.012300, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.217300, 0.187100, 0.958000, 0.000000, - -0.634300, -0.718900, 0.284200, 0.000000, - -0.741900, 0.669500, 0.037500, 0.000000, - -23.418049, 57.105099, 1006.781006, 1.000000}, - {1.007400, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.007400, 0.000000, - 0.000000, 1.007400, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {-0.011500, 0.187100, 0.982300, 0.000000, - -0.683000, -0.718900, 0.128900, 0.000000, - -0.730300, 0.669500, -0.136000, 0.000000, - -20.090649, 57.105099, 1010.310059, 1.000000}, - {1.001600, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.001600, 0.000000, - 0.000000, 1.001600, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {-0.214400, 0.187100, 0.958700, 0.000000, - -0.694900, -0.718900, -0.015100, 0.000000, - -0.686400, 0.669500, -0.284100, 0.000000, - -17.896347, 57.105099, 1014.017090, 1.000000}, - {0.994300, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.994300, 0.000000, - 0.000000, 0.994300, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {-0.391300, 0.187100, 0.901000, 0.000000, - -0.679600, -0.718900, -0.145900, 0.000000, - -0.620500, 0.669500, -0.408500, 0.000000, - -16.604847, 57.105099, 1017.721558, 1.000000}, - {0.986100, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.986100, 0.000000, - 0.000000, 0.986100, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {-0.545300, 0.187100, 0.817100, 0.000000, - -0.642900, -0.718900, -0.264400, 0.000000, - -0.538000, 0.669500, -0.512300, 0.000000, - -16.047749, 57.105099, 1021.376709, 1.000000}, - {0.977700, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.977700, 0.000000, - 0.000000, 0.977700, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {-0.679500, 0.187100, 0.709400, 0.000000, - -0.586800, -0.718900, -0.372600, 0.000000, - -0.440300, 0.669500, -0.598300, 0.000000, - -16.141548, 57.105099, 1025.005493, 1.000000}, - {0.969900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.969900, 0.000000, - 0.000000, 0.969900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {-0.795500, 0.187100, 0.576300, 0.000000, - -0.510700, -0.718900, -0.471600, 0.000000, - -0.326100, 0.669500, -0.667400, 0.000000, - -16.893848, 57.105099, 1028.650513, 1.000000}, - {0.963300, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.963300, 0.000000, - 0.000000, 0.963300, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {-0.890900, 0.187100, 0.413900, 0.000000, - -0.411300, -0.718900, -0.560400, 0.000000, - -0.192700, 0.669500, -0.717400, 0.000000, - -18.402348, 57.105099, 1032.325195, 1.000000}, - {0.958800, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.958800, 0.000000, - 0.000000, 0.958800, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {-0.958000, 0.187100, 0.217300, 0.000000, - -0.284200, -0.718900, -0.634300, 0.000000, - -0.037500, 0.669500, -0.741900, 0.000000, - -20.845448, 57.105099, 1035.962158, 1.000000}, - {0.957000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.957000, 0.000000, - 0.000000, 0.957000, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {-0.982300, 0.187100, -0.013000, 0.000000, - -0.127900, -0.718900, -0.683200, 0.000000, - 0.137100, 0.669500, -0.730100, 0.000000, - -24.399748, 57.105099, 1039.308228, 1.000000}, - {0.958800, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.958800, 0.000000, - 0.000000, 0.958800, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {-0.947100, 0.187100, -0.260700, 0.000000, - 0.048800, -0.718900, -0.693400, 0.000000, - 0.317100, 0.669500, -0.671800, 0.000000, - -29.005148, 57.105099, 1041.880859, 1.000000}, - {0.963900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.963900, 0.000000, - 0.000000, 0.963900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {-0.844400, 0.187100, -0.502000, 0.000000, - 0.230600, -0.718900, -0.655700, 0.000000, - 0.483600, 0.669500, -0.563900, 0.000000, - -34.367550, 57.105099, 1043.237793, 1.000000}, - {0.971800, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.971800, 0.000000, - 0.000000, 0.971800, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {-0.677300, 0.187100, -0.711500, 0.000000, - 0.399200, -0.718900, -0.569000, 0.000000, - 0.618000, 0.669500, -0.412200, 0.000000, - -40.015949, 57.105099, 1043.108643, 1.000000}, - {0.981700, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.981700, 0.000000, - 0.000000, 0.981700, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {-0.460700, 0.187100, -0.867600, 0.000000, - 0.537700, -0.718900, -0.440500, 0.000000, - 0.706200, 0.669500, -0.230600, 0.000000, - -45.402149, 57.105099, 1041.465820, 1.000000}, - {0.993000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.993000, 0.000000, - 0.000000, 0.993000, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {-0.217300, 0.187100, -0.958000, 0.000000, - 0.634300, -0.718900, -0.284200, 0.000000, - 0.741900, 0.669500, -0.037500, 0.000000, - -50.026550, 57.105099, 1038.534790, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.034900, 0.187100, -0.981700, 0.000000, - 0.685900, -0.718900, -0.112600, 0.000000, - 0.726800, 0.669500, 0.153400, 0.000000, - -53.643948, 57.105099, 1034.605103, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.284000, 0.187100, -0.940400, 0.000000, - 0.692000, -0.718900, 0.066000, 0.000000, - 0.663700, 0.669500, 0.333600, 0.000000, - -56.130249, 57.105099, 1029.897339, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.513800, 0.187100, -0.837300, 0.000000, - 0.652400, -0.718900, 0.239800, 0.000000, - 0.557100, 0.669500, 0.491400, 0.000000, - -57.333046, 57.105099, 1024.724487, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.709500, 0.187100, -0.679400, 0.000000, - 0.570200, -0.718900, 0.397500, 0.000000, - 0.414100, 0.669500, 0.616700, 0.000000, - -57.182648, 57.105099, 1019.425110, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.858600, 0.187100, -0.477300, 0.000000, - 0.450800, -0.718900, 0.529100, 0.000000, - 0.244200, 0.669500, 0.701600, 0.000000, - -55.694046, 57.105099, 1014.342407, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.951600, 0.187100, -0.244000, 0.000000, - 0.301900, -0.718900, 0.626100, 0.000000, - 0.058300, 0.669500, 0.740600, 0.000000, - -52.966049, 57.105099, 1009.804321, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.982300, 0.187100, 0.005300, 0.000000, - 0.133200, -0.718900, 0.682200, 0.000000, - -0.131400, 0.669500, 0.731100, 0.000000, - -49.174549, 57.105099, 1006.104492, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.948800, 0.187100, 0.254600, 0.000000, - -0.044400, -0.718900, 0.693700, 0.000000, - -0.312800, 0.669500, 0.673800, 0.000000, - -44.562447, 57.105099, 1003.484802, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.948800, 0.187100, 0.254600, 0.000000, - -0.044400, -0.718900, 0.693700, 0.000000, - -0.312800, 0.669500, 0.673800, 0.000000, - -44.562447, 57.105099, 1003.484802, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.948800, 0.187100, 0.254600, 0.000000, - -0.044400, -0.718900, 0.693700, 0.000000, - -0.312800, 0.669500, 0.673800, 0.000000, - -44.562447, 57.105099, 1003.484802, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.948800, 0.187100, 0.254600, 0.000000, - -0.044400, -0.718900, 0.693700, 0.000000, - -0.312800, 0.669500, 0.673800, 0.000000, - -44.562447, 57.105099, 1003.484802, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.948800, 0.187100, 0.254600, 0.000000, - -0.044400, -0.718900, 0.693700, 0.000000, - -0.312800, 0.669500, 0.673800, 0.000000, - -44.562447, 57.105099, 1003.484802, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.948800, 0.187100, 0.254600, 0.000000, - -0.044400, -0.718900, 0.693700, 0.000000, - -0.312800, 0.669500, 0.673800, 0.000000, - -44.562447, 57.105099, 1003.484802, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.948800, 0.187100, 0.254600, 0.000000, - -0.044400, -0.718900, 0.693700, 0.000000, - -0.312800, 0.669500, 0.673800, 0.000000, - -44.562447, 57.105099, 1003.484802, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.948800, 0.187100, 0.254600, 0.000000, - -0.044400, -0.718900, 0.693700, 0.000000, - -0.312800, 0.669500, 0.673800, 0.000000, - -44.562447, 57.105099, 1003.484802, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.948800, 0.187100, 0.254600, 0.000000, - -0.044400, -0.718900, 0.693700, 0.000000, - -0.312800, 0.669500, 0.673800, 0.000000, - -44.562447, 57.105099, 1003.484802, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.948800, 0.187100, 0.254600, 0.000000, - -0.044400, -0.718900, 0.693700, 0.000000, - -0.312800, 0.669500, 0.673800, 0.000000, - -44.562447, 57.105099, 1003.484802, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.948800, 0.187100, 0.254600, 0.000000, - -0.044400, -0.718900, 0.693700, 0.000000, - -0.312800, 0.669500, 0.673800, 0.000000, - -44.562447, 57.105099, 1003.484802, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.948800, 0.187100, 0.254600, 0.000000, - -0.044400, -0.718900, 0.693700, 0.000000, - -0.312800, 0.669500, 0.673800, 0.000000, - -44.562447, 57.105099, 1003.484802, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.948800, 0.187100, 0.254600, 0.000000, - -0.044400, -0.718900, 0.693700, 0.000000, - -0.312800, 0.669500, 0.673800, 0.000000, - -44.562447, 57.105099, 1003.484802, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.948800, 0.187100, 0.254600, 0.000000, - -0.044400, -0.718900, 0.693700, 0.000000, - -0.312800, 0.669500, 0.673800, 0.000000, - -44.562447, 57.105099, 1003.484802, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.948800, 0.187100, 0.254600, 0.000000, - -0.044400, -0.718900, 0.693700, 0.000000, - -0.312800, 0.669500, 0.673800, 0.000000, - -44.562447, 57.105099, 1003.484802, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.948800, 0.187100, 0.254600, 0.000000, - -0.044400, -0.718900, 0.693700, 0.000000, - -0.312800, 0.669500, 0.673800, 0.000000, - -44.562447, 57.105099, 1003.484802, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.948800, 0.187100, 0.254600, 0.000000, - -0.044400, -0.718900, 0.693700, 0.000000, - -0.312800, 0.669500, 0.673800, 0.000000, - -44.562447, 57.105099, 1003.484802, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.948800, 0.187100, 0.254600, 0.000000, - -0.044400, -0.718900, 0.693700, 0.000000, - -0.312800, 0.669500, 0.673800, 0.000000, - -44.562447, 57.105099, 1003.484802, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.948800, 0.187100, 0.254600, 0.000000, - -0.044400, -0.718900, 0.693700, 0.000000, - -0.312800, 0.669500, 0.673800, 0.000000, - -44.562447, 57.105099, 1003.484802, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.948800, 0.187100, 0.254600, 0.000000, - -0.044400, -0.718900, 0.693700, 0.000000, - -0.312800, 0.669500, 0.673800, 0.000000, - -44.562447, 57.105099, 1003.484802, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.948800, 0.187100, 0.254600, 0.000000, - -0.044400, -0.718900, 0.693700, 0.000000, - -0.312800, 0.669500, 0.673800, 0.000000, - -44.562447, 57.105099, 1003.484802, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.948800, 0.187100, 0.254600, 0.000000, - -0.044400, -0.718900, 0.693700, 0.000000, - -0.312800, 0.669500, 0.673800, 0.000000, - -44.562447, 57.105099, 1003.484802, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.948800, 0.187100, 0.254600, 0.000000, - -0.044400, -0.718900, 0.693700, 0.000000, - -0.312800, 0.669500, 0.673800, 0.000000, - -44.562447, 57.105099, 1003.484802, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.948800, 0.187100, 0.254600, 0.000000, - -0.044400, -0.718900, 0.693700, 0.000000, - -0.312800, 0.669500, 0.673800, 0.000000, - -44.562447, 57.105099, 1003.484802, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -} -}; -#define RAW_NAME text_3dfinfo_raw -#define IMAGE_NAME text_3dfinfo_image -unsigned char RAW_NAME[] = { -0x40, -0x0, -0x0, -0x0, -0x40, -0x0, -0x0, -0x0, -0x8, -0x0, -0x0, -0x0, -0x2, -0x0, -0x0, -0x0, -0x3, -0x0, -0x0, -0x0, -0x1, -0x0, -0x0, -0x0, -0x22, -0x22, -0x2b, -0x3c, -0x44, -0x44, -0x66, -0x77, -0x88, -0x99, -0xaa, -0xbb, -0xcc, -0xdd, -0xee, -0xff, -0xcf, -0x1, -0x27, -0x0, -0x23, -0x0, -0x1, -0x0, -0x0, -0x0, -0xef, -0x1, -0xe2, -0x1, -0xe, -0x0, -0x12, -0x0, -0xf4, -0x1, -0xff, -0x1, -0xfc, -0x1, -0xee, -0x1, -0x19, -0x0, -0x10, -0x0, -0xe5, -0x1, -0x11, -0x0, -0x6, -0x0, -0xe8, -0x1, -0x9, -0x0, -0x8, -0x0, -0xeb, -0x1, -0x1, -0x0, -0x4, -0x0, -0x22, -0x22, -0x2b, -0x3c, -0x44, -0x44, -0x66, -0x77, -0x88, -0x99, -0xaa, -0xbb, -0xcc, -0xdd, -0xee, -0xff, -0x23, -0x4e, -0x3c, -0x7, -0xef, -0x1, -0x4, -0x0, -0x12, -0x1c, -0x88, -0x7, -0xfc, -0xff, -0xd3, -0x7, -0x10, -0x32, -0xb8, -0x7, -0x6, -0x22, -0x94, -0x7, -0x8, -0x12, -0xa0, -0x7, -0x4, -0x2, -0xac, -0x7, -0x19, -0x0, -0x0, -0x0, -0x1c, -0x0, -0x0, -0x0, -0x1f, -0x0, -0x0, -0x0, -0x21, -0x0, -0x0, -0x0, -0x24, -0x0, -0x0, -0x0, -0x26, -0x0, -0x0, -0x0, -0x28, -0x0, -0x0, -0x0, -0x2a, -0x0, -0x0, -0x0, -0x2c, -0x0, -0x0, -0x0, -0x2e, -0x0, -0x0, -0x0, -0x30, -0x0, -0x0, -0x0, -0x32, -0x0, -0x0, -0x0, -0x34, -0x0, -0x0, -0x0, -0x36, -0x0, -0x0, -0x0, -0x37, -0x0, -0x0, -0x0, -0x39, -0x0, -0x0, -0x0, -0x3b, -0x0, -0x0, -0x0, -0x3c, -0x0, -0x0, -0x0, -0x3e, -0x0, -0x0, -0x0, -0x40, -0x0, -0x0, -0x0, -0x41, -0x0, -0x0, -0x0, -0x43, -0x0, -0x0, -0x0, -0x44, -0x0, -0x0, -0x0, -0x46, -0x0, -0x0, -0x0, -0x47, -0x0, -0x0, -0x0, -0x48, -0x0, -0x0, -0x0, -0x4a, -0x0, -0x0, -0x0, -0x4b, -0x0, -0x0, -0x0, -0x4d, -0x0, -0x0, -0x0, -0x4e, -0x0, -0x0, -0x0, -0x4f, -0x0, -0x0, -0x0, -0x51, -0x0, -0x0, -0x0, -0x52, -0x0, -0x0, -0x0, -0x53, -0x0, -0x0, -0x0, -0x54, -0x0, -0x0, -0x0, -0x56, -0x0, -0x0, -0x0, -0x57, -0x0, -0x0, -0x0, -0x58, -0x0, -0x0, -0x0, -0x59, -0x0, -0x0, -0x0, -0x5b, -0x0, -0x0, -0x0, -0x5c, -0x0, -0x0, -0x0, -0x5d, -0x0, -0x0, -0x0, -0x5e, -0x0, -0x0, -0x0, -0x5f, -0x0, -0x0, -0x0, -0x61, -0x0, -0x0, -0x0, -0x62, -0x0, -0x0, -0x0, -0x63, -0x0, -0x0, -0x0, -0x64, -0x0, -0x0, -0x0, -0x65, -0x0, -0x0, -0x0, -0x66, -0x0, -0x0, -0x0, -0x67, -0x0, -0x0, -0x0, -0x69, -0x0, -0x0, -0x0, -0x6a, -0x0, -0x0, -0x0, -0x6b, -0x0, -0x0, -0x0, -0x6c, -0x0, -0x0, -0x0, -0x6d, -0x0, -0x0, -0x0, -0x6e, -0x0, -0x0, -0x0, -0x6f, -0x0, -0x0, -0x0, -0x70, -0x0, -0x0, -0x0, -0x71, -0x0, -0x0, -0x0, -0x72, -0x0, -0x0, -0x0, -0x73, -0x0, -0x0, -0x0, -0x74, -0x0, -0x0, -0x0, -0x75, -0x0, -0x0, -0x0, -0x76, -0x0, -0x0, -0x0, -0x77, -0x0, -0x0, -0x0, -0x78, -0x0, -0x0, -0x0, -0x79, -0x0, -0x0, -0x0, -0x7a, -0x0, -0x0, -0x0, -0x7b, -0x0, -0x0, -0x0, -0x7c, -0x0, -0x0, -0x0, -0x7d, -0x0, -0x0, -0x0, -0x7e, -0x0, -0x0, -0x0, -0x7f, -0x0, -0x0, -0x0, -0x80, -0x0, -0x0, -0x0, -0x81, -0x0, -0x0, -0x0, -0x82, -0x0, -0x0, -0x0, -0x83, -0x0, -0x0, -0x0, -0x84, -0x0, -0x0, -0x0, -0x85, -0x0, -0x0, -0x0, -0x86, -0x0, -0x0, -0x0, -0x87, -0x0, -0x0, -0x0, -0x87, -0x0, -0x0, -0x0, -0x88, -0x0, -0x0, -0x0, -0x89, -0x0, -0x0, -0x0, -0x8a, -0x0, -0x0, -0x0, -0x8b, -0x0, -0x0, -0x0, -0x8c, -0x0, -0x0, -0x0, -0x8d, -0x0, -0x0, -0x0, -0x8e, -0x0, -0x0, -0x0, -0x8f, -0x0, -0x0, -0x0, -0x90, -0x0, -0x0, -0x0, -0x90, -0x0, -0x0, -0x0, -0x91, -0x0, -0x0, -0x0, -0x92, -0x0, -0x0, -0x0, -0x93, -0x0, -0x0, -0x0, -0x94, -0x0, -0x0, -0x0, -0x95, -0x0, -0x0, -0x0, -0x96, -0x0, -0x0, -0x0, -0x96, -0x0, -0x0, -0x0, -0x97, -0x0, -0x0, -0x0, -0x98, -0x0, -0x0, -0x0, -0x99, -0x0, -0x0, -0x0, -0x9a, -0x0, -0x0, -0x0, -0x9b, -0x0, -0x0, -0x0, -0x9c, -0x0, -0x0, -0x0, -0x9c, -0x0, -0x0, -0x0, -0x9d, -0x0, -0x0, -0x0, -0x9e, -0x0, -0x0, -0x0, -0x9f, -0x0, -0x0, -0x0, -0xa0, -0x0, -0x0, -0x0, -0xa0, -0x0, -0x0, -0x0, -0xa1, -0x0, -0x0, -0x0, -0xa2, -0x0, -0x0, -0x0, -0xa3, -0x0, -0x0, -0x0, -0xa4, -0x0, -0x0, -0x0, -0xa4, -0x0, -0x0, -0x0, -0xa5, -0x0, -0x0, -0x0, -0xa6, -0x0, -0x0, -0x0, -0xa7, -0x0, -0x0, -0x0, -0xa8, -0x0, -0x0, -0x0, -0xa8, -0x0, -0x0, -0x0, -0xa9, -0x0, -0x0, -0x0, -0xaa, -0x0, -0x0, -0x0, -0xab, -0x0, -0x0, -0x0, -0xac, -0x0, -0x0, -0x0, -0xac, -0x0, -0x0, -0x0, -0xad, -0x0, -0x0, -0x0, -0xae, -0x0, -0x0, -0x0, -0xaf, -0x0, -0x0, -0x0, -0xaf, -0x0, -0x0, -0x0, -0xb0, -0x0, -0x0, -0x0, -0xb1, -0x0, -0x0, -0x0, -0xb2, -0x0, -0x0, -0x0, -0xb2, -0x0, -0x0, -0x0, -0xb3, -0x0, -0x0, -0x0, -0xb4, -0x0, -0x0, -0x0, -0xb5, -0x0, -0x0, -0x0, -0xb5, -0x0, -0x0, -0x0, -0xb6, -0x0, -0x0, -0x0, -0xb7, -0x0, -0x0, -0x0, -0xb8, -0x0, -0x0, -0x0, -0xb8, -0x0, -0x0, -0x0, -0xb9, -0x0, -0x0, -0x0, -0xba, -0x0, -0x0, -0x0, -0xbb, -0x0, -0x0, -0x0, -0xbb, -0x0, -0x0, -0x0, -0xbc, -0x0, -0x0, -0x0, -0xbd, -0x0, -0x0, -0x0, -0xbe, -0x0, -0x0, -0x0, -0xbe, -0x0, -0x0, -0x0, -0xbf, -0x0, -0x0, -0x0, -0xc0, -0x0, -0x0, -0x0, -0xc0, -0x0, -0x0, -0x0, -0xc1, -0x0, -0x0, -0x0, -0xc2, -0x0, -0x0, -0x0, -0xc3, -0x0, -0x0, -0x0, -0xc3, -0x0, -0x0, -0x0, -0xc4, -0x0, -0x0, -0x0, -0xc5, -0x0, -0x0, -0x0, -0xc5, -0x0, -0x0, -0x0, -0xc6, -0x0, -0x0, -0x0, -0xc7, -0x0, -0x0, -0x0, -0xc7, -0x0, -0x0, -0x0, -0xc8, -0x0, -0x0, -0x0, -0xc9, -0x0, -0x0, -0x0, -0xca, -0x0, -0x0, -0x0, -0xca, -0x0, -0x0, -0x0, -0xcb, -0x0, -0x0, -0x0, -0xcc, -0x0, -0x0, -0x0, -0xcc, -0x0, -0x0, -0x0, -0xcd, -0x0, -0x0, -0x0, -0xce, -0x0, -0x0, -0x0, -0xce, -0x0, -0x0, -0x0, -0xcf, -0x0, -0x0, -0x0, -0xd0, -0x0, -0x0, -0x0, -0xd0, -0x0, -0x0, -0x0, -0xd1, -0x0, -0x0, -0x0, -0xd2, -0x0, -0x0, -0x0, -0xd2, -0x0, -0x0, -0x0, -0xe2, -0x13, -0xf7, -0xbf, -0x37, -0x1, -0x0, -0x0, -0xac, -0xf7, -0xf9, -0xbf, -0x0, -0x0, -0x0, -0x0, -0x80, -0x1, -0x7a, -0x0, -0x1, -0x0, -0x0, -0x0, -0xcc, -0xfa, -0x76, -0x0, -0x42, -0x52, -0x64, -0x81, -0x18, -0x52, -0x64, -0x81, -0x2, -0x0, -0x0, -0x0, -0xda, -0x0, -0x0, -0x0, -0x4, -0x0, -0x0, -0x0, -0x3, -0x0, -0x0, -0x0, -0x66, -0xc, -0xfa, -0xbf, -0x18, -0x52, -0x64, -0x81, -0x7a, -0xc, -0xfa, -0xbf, -0x42, -0x52, -0x64, -0x81, -0x80, -0x1, -0x7a, -0x0, -0x4, -0x0, -0x0, -0x0, -0xf8, -0xfa, -0x76, -0x0, -0xef, -0x5b, -0xf7, -0xbf, -0xf8, -0xfa, -0x76, -0x0, -0xe8, -0x5d, -0xf7, -0xbf, -0x0, -0x0, -0x0, -0x0, -0x80, -0x1, -0x7a, -0x0, -0x4, -0x0, -0x0, -0x0, -0x2, -0x0, -0x0, -0x0, -0x0, -0x0, -0xf7, -0xbf, -0x18, -0x52, -0x64, -0x81, -0x0, -0x0, -0x0, -0x0, -0x80, -0x1, -0x7a, -0x0, -0x8d, -0xea, -0x40, -0x0, -0x4, -0x0, -0x0, -0x0, -0x80, -0x1, -0x7a, -0x0, -0x1, -0x0, -0x0, -0x0, -0xab, -0xea, -0x40, -0x0, -0x2, -0x0, -0x0, -0x0, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x0, -0x0, -0x0, -0x38, -0x44, -0x41, -0x0, -0x28, -0xba, -0x40, -0x0, -0x2, -0x0, -0x0, -0x0, -0xb3, -0xba, -0x40, -0x0, -0x2, -0x0, -0x0, -0x0, -0x1, -0x0, -0x0, -0x0, -0xa, -0x31, -0x0, -0x0, -0x1, -0x0, -0x0, -0x0, -0x74, -0x1e, -0xa7, -0x0, -0x58, -0x15, -0x0, -0x0 -}; - -unsigned char IMAGE_NAME[] = { -0xc, -0xe, -0xe, -0xe, -0xc, -0x8, -0x3, -0x29, -0x9, -0x9, -0xa, -0xc, -0xb, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0x9, -0x8, -0x3, -0x9, -0x2e, -0xf, -0xe, -0xc, -0xa, -0x9, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x39, -0x0, -0x33, -0x32, -0x31, -0x30, -0x30, -0x40, -0x40, -0x40, -0x30, -0x30, -0x42, -0x32, -0x32, -0x21, -0x0, -0x22, -0x39, -0x22, -0x39, -0x39, -0x2, -0x2, -0x9, -0x9, -0xc, -0x2e, -0xe, -0xe, -0x2e, -0x9, -0x3, -0x29, -0x9, -0xa, -0x2e, -0x2e, -0xe, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0x9, -0x29, -0x3, -0x9, -0xd, -0xf, -0xe, -0x2e, -0xa, -0x9, -0x8, -0x3, -0x2, -0x2, -0x1, -0x22, -0x39, -0x22, -0x22, -0x22, -0x0, -0x21, -0x33, -0x32, -0x32, -0x31, -0x42, -0x42, -0x41, -0x42, -0x42, -0x31, -0x32, -0x31, -0x20, -0x20, -0x33, -0x21, -0x33, -0x21, -0x33, -0x0, -0x22, -0x1, -0x8, -0x29, -0x9, -0xc, -0xe, -0xe, -0xf, -0x2e, -0x8, -0x3, -0x8, -0x2d, -0x2e, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xc, -0x9, -0x8, -0x3, -0x9, -0xe, -0xf, -0xd, -0xb, -0xa, -0x9, -0x29, -0x2, -0x39, -0x22, -0x0, -0x21, -0x33, -0x21, -0x33, -0x21, -0x33, -0x33, -0x20, -0x20, -0x32, -0x20, -0x20, -0x20, -0x20, -0x32, -0x20, -0x32, -0x20, -0x32, -0x32, -0x20, -0x32, -0x32, -0x32, -0x31, -0x20, -0x33, -0x0, -0x2, -0x8, -0x9, -0x2e, -0xe, -0xe, -0xe, -0x9, -0x8, -0x3, -0x29, -0x9, -0xc, -0x2e, -0xd, -0xe, -0xe, -0xd, -0x2e, -0xc, -0x2b, -0x8, -0x29, -0x2a, -0x2e, -0xe, -0xe, -0x2e, -0xc, -0x9, -0x8, -0x2, -0x2, -0x39, -0x22, -0x0, -0x33, -0x21, -0x33, -0x0, -0x33, -0x0, -0x0, -0x33, -0x0, -0x0, -0x0, -0x0, -0x0, -0x22, -0x0, -0x0, -0x33, -0x20, -0x20, -0x32, -0x31, -0x32, -0x31, -0x42, -0x31, -0x32, -0x20, -0x0, -0x23, -0x9, -0x2e, -0xe, -0xe, -0x9, -0x29, -0x3, -0x29, -0x29, -0x9, -0x2a, -0x9, -0x9, -0x2a, -0x8, -0x9, -0x8, -0x29, -0x29, -0x8, -0x9, -0x2e, -0xe, -0xe, -0x2e, -0xa, -0x9, -0x8, -0x3, -0x23, -0x1, -0x22, -0x0, -0x0, -0x0, -0x33, -0x21, -0x21, -0x33, -0x0, -0x22, -0x39, -0x1, -0x2, -0x2, -0x3, -0x2, -0x29, -0x3, -0x2, -0x2, -0x39, -0x0, -0x33, -0x20, -0x31, -0x42, -0x41, -0x42, -0x42, -0x31, -0x20, -0x0, -0x2, -0xc, -0xe, -0xe, -0xa, -0x2, -0x29, -0x8, -0x9, -0x9, -0x9, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x29, -0x9, -0xc, -0xe, -0xf, -0xe, -0x2e, -0xc, -0x9, -0x29, -0x2, -0x2, -0x39, -0x22, -0x0, -0x0, -0x33, -0x0, -0x0, -0x0, -0x33, -0x0, -0x22, -0x39, -0x2, -0x2, -0x29, -0x8, -0x9, -0x9, -0x9, -0x9, -0x2a, -0x29, -0x2, -0x1, -0x0, -0x20, -0x32, -0x41, -0x42, -0x30, -0x42, -0x31, -0x20, -0x22, -0x2, -0x2e, -0xe, -0xe, -0xa, -0x8, -0x29, -0x29, -0x9, -0x9, -0x9, -0x9, -0x8, -0x29, -0x3, -0x29, -0x2, -0x2, -0x29, -0x3, -0x8, -0x9, -0x2e, -0xe, -0xe, -0xe, -0x2e, -0xc, -0x9, -0x8, -0x3, -0x2, -0x39, -0x22, -0x0, -0x0, -0x33, -0x21, -0x33, -0x0, -0x0, -0x22, -0x23, -0x2, -0x29, -0x29, -0x9, -0x9, -0x9, -0x9, -0x2a, -0x29, -0x2, -0x2, -0x39, -0x0, -0x33, -0x20, -0x20, -0x20, -0x33, -0x21, -0x22, -0x2, -0x29, -0x2e, -0xe, -0xe, -0xa, -0x29, -0x3, -0x29, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x29, -0x8, -0x2a, -0x8, -0x8, -0x29, -0x8, -0x3, -0x29, -0x29, -0x2d, -0x2e, -0xe, -0xe, -0x2e, -0xa, -0x9, -0x2, -0x1, -0x0, -0x33, -0x20, -0x32, -0x20, -0x20, -0x33, -0x0, -0x22, -0x23, -0x2, -0x29, -0x29, -0x8, -0x9, -0x2a, -0x29, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x39, -0x23, -0x1, -0x2, -0x2, -0x3, -0x8, -0xc, -0x2e, -0xe, -0xf, -0xc, -0x9, -0x2, -0x29, -0x8, -0x9, -0x9, -0x9, -0x9, -0xa, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x8, -0x3, -0x2, -0x8, -0xc, -0xe, -0xe, -0xe, -0xa, -0x9, -0x3, -0x1, -0x0, -0x33, -0x20, -0x32, -0x32, -0x20, -0x33, -0x0, -0x22, -0x39, -0x2, -0x2, -0x29, -0x29, -0x8, -0x8, -0x29, -0x29, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x29, -0x8, -0xc, -0xc, -0x2e, -0xe, -0xe, -0xe, -0x9, -0x29, -0x3, -0x29, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0xd, -0x2e, -0xe, -0x2e, -0xa, -0x9, -0x8, -0x29, -0x29, -0xa, -0xd, -0xe, -0xe, -0x2e, -0xa, -0x9, -0x3, -0x23, -0x0, -0x0, -0x32, -0x32, -0x31, -0x32, -0x32, -0x32, -0x20, -0x21, -0x0, -0x22, -0x22, -0x1, -0x23, -0x1, -0x23, -0x1, -0x23, -0x1, -0x1, -0x23, -0x1, -0x22, -0x1, -0x22, -0x1, -0x22, -0x2, -0x2, -0x3, -0x9, -0x9, -0xa, -0x2e, -0xe, -0xe, -0xe, -0xc, -0x8, -0x3, -0x9, -0xa, -0xd, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0x9, -0x2a, -0x8, -0x9, -0xe, -0xe, -0x2e, -0xc, -0x2b, -0x8, -0x29, -0x1, -0x22, -0x21, -0x20, -0x32, -0x31, -0x32, -0x31, -0x31, -0x32, -0x32, -0x20, -0x20, -0x33, -0x21, -0x33, -0x21, -0x21, -0x33, -0x21, -0x0, -0x33, -0x0, -0x0, -0x0, -0x0, -0x0, -0x22, -0x0, -0x22, -0x22, -0x39, -0x2, -0x29, -0x8, -0x9, -0xc, -0x2e, -0xe, -0xf, -0xd, -0x9, -0x3, -0x29, -0x9, -0xc, -0x2e, -0xe, -0xe, -0xe, -0xe, -0xe, -0xc, -0x9, -0x3, -0x8, -0x2e, -0xf, -0xe, -0x2e, -0xa, -0x9, -0x29, -0x2, -0x1, -0x0, -0x33, -0x20, -0x32, -0x31, -0x42, -0x31, -0x42, -0x31, -0x20, -0x20, -0x33, -0x21, -0x0, -0x0, -0x22, -0x22, -0x0, -0x22, -0x0, -0x0, -0x0, -0x33, -0x0, -0x33, -0x21, -0x20, -0x33, -0x20, -0x33, -0x0, -0x22, -0x2, -0x2, -0x29, -0x9, -0x2e, -0x2e, -0xe, -0xf, -0x2e, -0x9, -0x29, -0x3, -0x29, -0x9, -0x9, -0xa, -0xc, -0xa, -0x9, -0x29, -0x8, -0x29, -0xc, -0xe, -0xe, -0x2e, -0xc, -0x9, -0x8, -0x3, -0x1, -0x22, -0x21, -0x32, -0x31, -0x42, -0x42, -0x30, -0x30, -0x42, -0x31, -0x32, -0x33, -0x0, -0x39, -0x2, -0x2, -0x29, -0x3, -0x8, -0x2, -0x2, -0x39, -0x0, -0x33, -0x20, -0x31, -0x42, -0x42, -0x30, -0x42, -0x42, -0x31, -0x20, -0x22, -0x1, -0x3, -0x8, -0xc, -0xb, -0xe, -0xe, -0xf, -0x2e, -0x9, -0x8, -0x2, -0x29, -0x29, -0x29, -0x8, -0x8, -0x29, -0x2, -0x8, -0xc, -0xe, -0xf, -0xe, -0x2e, -0xa, -0x9, -0x29, -0x2, -0x1, -0x22, -0x33, -0x20, -0x31, -0x42, -0x30, -0x30, -0x30, -0x42, -0x31, -0x20, -0x0, -0x22, -0x2, -0x8, -0x29, -0x9, -0x9, -0x9, -0x8, -0x3, -0x1, -0x22, -0x33, -0x31, -0x42, -0x30, -0x30, -0x30, -0x30, -0x30, -0x42, -0x32, -0x21, -0x1, -0x2, -0x8, -0x9, -0xa, -0x2e, -0xe, -0xe, -0xe, -0x2e, -0x9, -0x3, -0x2, -0x29, -0x29, -0x29, -0x8, -0x3, -0x2, -0x9, -0xc, -0xe, -0xf, -0xd, -0x2e, -0xa, -0x9, -0x29, -0x2, -0x2, -0x39, -0x22, -0x21, -0x33, -0x33, -0x20, -0x20, -0x20, -0x33, -0x0, -0x22, -0x1, -0x2, -0x29, -0x2a, -0x9, -0x9, -0xa, -0x9, -0x9, -0x29, -0x2, -0x2, -0x22, -0x21, -0x32, -0x32, -0x31, -0x32, -0x31, -0x20, -0x20, -0x33, -0x0, -0x2, -0x2, -0x2, -0x29, -0x9, -0x9, -0xb, -0xd, -0xe, -0xe, -0x2e, -0x9, -0x3, -0x2, -0x29, -0x8, -0x3, -0x2, -0x29, -0x9, -0x2e, -0xf, -0xe, -0xe, -0xc, -0x2b, -0x9, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x8, -0x8, -0x29, -0x8, -0x9, -0x9, -0x9, -0xa, -0x2d, -0xa, -0xc, -0x9, -0x9, -0x8, -0x29, -0x2, -0x2, -0x1, -0x22, -0x22, -0x22, -0x39, -0x39, -0x39, -0x39, -0x39, -0x2, -0x2, -0x2, -0x29, -0x9, -0x9, -0x2e, -0xd, -0xe, -0xe, -0x2e, -0x9, -0x3, -0x2, -0x29, -0x29, -0x8, -0x2, -0x29, -0x9, -0x2e, -0xf, -0xe, -0xd, -0x2e, -0xa, -0x9, -0x8, -0x29, -0x3, -0x3, -0x2, -0x8, -0x8, -0x29, -0x29, -0x29, -0x29, -0x8, -0x29, -0x9, -0x2a, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x29, -0x3, -0x2, -0x2, -0x23, -0x1, -0x39, -0x1, -0x22, -0x23, -0x39, -0x23, -0x3, -0x29, -0x9, -0xa, -0x2e, -0xd, -0xe, -0xe, -0x2e, -0x9, -0x8, -0x3, -0x29, -0x8, -0x9, -0x8, -0x2a, -0x29, -0x3, -0x8, -0x9, -0x2e, -0xf, -0xe, -0x2e, -0xc, -0x2b, -0x9, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x23, -0x23, -0x1, -0x2, -0x1, -0x23, -0x1, -0x39, -0x1, -0x22, -0x22, -0x39, -0x22, -0x22, -0x22, -0x0, -0x22, -0x0, -0x0, -0x0, -0x33, -0x21, -0x33, -0x0, -0x0, -0x39, -0x23, -0x29, -0x9, -0x2e, -0xe, -0xe, -0xf, -0x2e, -0x9, -0x8, -0x2, -0x29, -0x29, -0x9, -0x9, -0x9, -0xa, -0x9, -0x9, -0x8, -0x2, -0x8, -0xa, -0xe, -0xf, -0xe, -0x2e, -0xc, -0x2b, -0x9, -0x29, -0x2, -0x2, -0x1, -0x22, -0x22, -0x0, -0x0, -0x0, -0x0, -0x33, -0x21, -0x20, -0x20, -0x32, -0x32, -0x31, -0x31, -0x42, -0x42, -0x31, -0x42, -0x31, -0x31, -0x43, -0x31, -0x32, -0x31, -0x32, -0x32, -0x32, -0x20, -0x33, -0x39, -0x2, -0x9, -0xc, -0x2e, -0xe, -0xf, -0x2e, -0x9, -0x8, -0x2, -0x3, -0x29, -0x8, -0x9, -0x9, -0x9, -0x9, -0x9, -0x2a, -0x29, -0x3, -0x2, -0x9, -0x2e, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0xa, -0x9, -0x29, -0x2, -0x2, -0x39, -0x39, -0x22, -0x0, -0x0, -0x33, -0x0, -0x21, -0x33, -0x20, -0x20, -0x32, -0x32, -0x32, -0x31, -0x31, -0x43, -0x31, -0x32, -0x32, -0x20, -0x20, -0x20, -0x33, -0x20, -0x33, -0x0, -0x0, -0x22, -0x2, -0x2, -0x2e, -0xe, -0xe, -0xe, -0x2e, -0x9, -0x8, -0x2, -0x2, -0x29, -0x3, -0x3, -0x3, -0x2, -0x29, -0x2, -0x29, -0x2, -0x8, -0x2, -0x2, -0x2, -0x29, -0x8, -0x9, -0x2e, -0xe, -0xe, -0xe, -0xb, -0x2d, -0x2a, -0x29, -0x2, -0x1, -0x22, -0x22, -0x22, -0x22, -0x22, -0x22, -0x22, -0x22, -0x22, -0x22, -0x22, -0x0, -0x22, -0x0, -0x22, -0x22, -0x39, -0x39, -0x1, -0x23, -0x2, -0x2, -0x2, -0x8, -0x2, -0x29, -0x29, -0x9, -0x9, -0xe, -0xe, -0xf, -0x2e, -0x9, -0x29, -0x2, -0x3, -0x2, -0x8, -0x2, -0x2, -0x2, -0x3, -0x29, -0x29, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x3, -0x2, -0x3, -0x8, -0xc, -0xe, -0xe, -0xe, -0x2e, -0xa, -0x8, -0x8, -0x2, -0x1, -0x22, -0x39, -0x39, -0x1, -0x23, -0x1, -0x23, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x29, -0x29, -0x29, -0x8, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0xc, -0x2e, -0xe, -0xe, -0xf, -0x2e, -0xa, -0x29, -0x2, -0x2, -0x2, -0x2, -0x29, -0x29, -0x29, -0x9, -0x9, -0xa, -0x9, -0x9, -0xa, -0x9, -0xc, -0x2b, -0xc, -0x2e, -0x2e, -0xe, -0xe, -0xe, -0x2e, -0xc, -0xa, -0x9, -0x8, -0x29, -0x29, -0x2, -0x2, -0x3, -0x2, -0x29, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x29, -0x29, -0x8, -0x9, -0x9, -0x9, -0xa, -0xa, -0x2d, -0xa, -0xc, -0x2e, -0x2e, -0xe, -0xe, -0xf, -0xe, -0x2e, -0x9, -0x8, -0x29, -0x29, -0x8, -0x9, -0xa, -0x2e, -0xd, -0xe, -0xe, -0xe, -0xe, -0xe, -0xf, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0xa, -0x9, -0x9, -0x29, -0x29, -0x29, -0x8, -0x8, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x29, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x29, -0x29, -0x2a, -0x9, -0xa, -0xc, -0xc, -0x2e, -0x2e, -0xb, -0x2e, -0x2e, -0x2e, -0xd, -0xd, -0xe, -0xe, -0xe, -0xe, -0x2e, -0xa, -0x9, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0xe, -0xe, -0xe, -0xe, -0xf, -0xf, -0xe, -0xe, -0xd, -0xb, -0xc, -0xa, -0x9, -0x29, -0x29, -0x3, -0x3, -0x29, -0x29, -0x8, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x2a, -0x29, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x3, -0x29, -0x8, -0x9, -0x9, -0xa, -0x2d, -0xa, -0xc, -0xa, -0xa, -0x2d, -0xa, -0xd, -0x8, -0x9, -0x9, -0x2e, -0x2e, -0xe, -0xe, -0xe, -0xe, -0x2e, -0xc, -0x2b, -0x9, -0x29, -0x29, -0x2a, -0x29, -0x9, -0x9, -0xa, -0xd, -0xe, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0x2d, -0x9, -0x9, -0x2a, -0x29, -0x29, -0x3, -0x3, -0x2, -0x2, -0x3, -0x2, -0x2, -0x3, -0x2, -0x2, -0x2, -0x2, -0x23, -0x23, -0x1, -0x22, -0x1, -0x22, -0x1, -0x22, -0x1, -0x39, -0x1, -0x23, -0x1, -0x23, -0x1, -0x39, -0x1, -0x23, -0x29, -0x22, -0x1, -0x2, -0x3, -0x8, -0x9, -0xc, -0x2e, -0xe, -0xf, -0xc, -0x9, -0x2, -0x29, -0x29, -0x2a, -0x29, -0x8, -0x29, -0x2, -0x3, -0x8, -0x9, -0x2e, -0xe, -0xf, -0xe, -0xe, -0x2e, -0xc, -0x9, -0x8, -0x3, -0x2, -0x39, -0x22, -0x0, -0x22, -0x0, -0x22, -0x22, -0x22, -0x22, -0x39, -0x39, -0x39, -0x39, -0x22, -0x0, -0x0, -0x0, -0x33, -0x20, -0x32, -0x32, -0x31, -0x31, -0x42, -0x31, -0x42, -0x31, -0x31, -0x32, -0x0, -0x22, -0x1, -0x2, -0x8, -0x8, -0x9, -0xa, -0x2e, -0xe, -0xe, -0xe, -0x2e, -0x9, -0x8, -0x8, -0x8, -0x8, -0x29, -0x29, -0x8, -0x2a, -0x9, -0xc, -0xb, -0xd, -0xf, -0xf, -0xe, -0xe, -0x2e, -0xc, -0x9, -0x9, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x23, -0x1, -0x39, -0x22, -0x0, -0x33, -0x20, -0x32, -0x31, -0x42, -0x42, -0x42, -0x42, -0x31, -0x32, -0x32, -0x20, -0x2, -0x2, -0x29, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0xd, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0x2e, -0xe, -0x2e, -0xe, -0xf, -0xf, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0x2e, -0xc, -0xc, -0xa, -0xc, -0xa, -0xc, -0xa, -0xc, -0xa, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x29, -0x2, -0x39, -0x0, -0x33, -0x20, -0x32, -0x31, -0x42, -0x31, -0x32, -0x20, -0x33, -0x0, -0x2, -0x29, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0x2e, -0x2e, -0xd, -0xe, -0xe, -0xf, -0xe, -0xf, -0xe, -0xe, -0xf, -0xf, -0xe, -0xf, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0x2e, -0xd, -0xb, -0x2e, -0x2e, -0xc, -0xc, -0xa, -0x9, -0x29, -0x2, -0x39, -0x0, -0x33, -0x20, -0x32, -0x31, -0x32, -0x32, -0x33, -0x21, -0x22, -0x2, -0x29, -0x9, -0xa, -0xc, -0xc, -0xb, -0x2e, -0xd, -0x2e, -0xe, -0x2e, -0xd, -0x2e, -0xe, -0x2e, -0xd, -0x2e, -0xe, -0xe, -0xd, -0xe, -0xe, -0xe, -0xd, -0xe, -0x2e, -0x2e, -0xd, -0x2e, -0xd, -0x2e, -0xe, -0xe, -0xe, -0xd, -0xe, -0xe, -0xe, -0x2e, -0xd, -0xb, -0x2e, -0xc, -0xa, -0x9, -0x9, -0x9, -0x9, -0x8, -0x3, -0x2, -0x1, -0x22, -0x0, -0x33, -0x32, -0x20, -0x32, -0x32, -0x20, -0x33, -0x0, -0x1, -0x3, -0x29, -0x9, -0xa, -0xc, -0xc, -0x2e, -0x2e, -0xe, -0xe, -0xe, -0xf, -0xf, -0xe, -0xe, -0xe, -0xf, -0xe, -0xf, -0xe, -0xd, -0xb, -0xc, -0x9, -0x9, -0x2a, -0x9, -0x2a, -0x9, -0x9, -0x9, -0xa, -0xc, -0xc, -0xb, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0x2b, -0x9, -0x8, -0x3, -0x2, -0x2, -0x1, -0x23, -0x39, -0x22, -0x0, -0x0, -0x33, -0x0, -0x20, -0x32, -0x32, -0x20, -0x20, -0x33, -0x21, -0x22, -0x1, -0x2, -0x29, -0x8, -0x9, -0x9, -0xa, -0xc, -0xc, -0xb, -0xd, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xd, -0x2e, -0xa, -0x9, -0x9, -0x29, -0x29, -0x8, -0x29, -0x8, -0x29, -0x9, -0x9, -0xa, -0xc, -0xc, -0xa, -0x2e, -0xc, -0xc, -0xa, -0x9, -0x9, -0x8, -0x8, -0x2, -0x2, -0x1, -0x22, -0x39, -0x22, -0x22, -0x0, -0x0, -0x0, -0x33, -0x21, -0x33, -0x21, -0x33, -0x0, -0x0, -0x0, -0x22, -0x2, -0x1, -0x23, -0x1, -0x1, -0x23, -0x2, -0x2, -0x2, -0x29, -0x29, -0x8, -0x8, -0x9, -0x8, -0x9, -0x9, -0x2a, -0x9, -0x9, -0x9, -0x9, -0x9, -0xa, -0x9, -0x2d, -0xa, -0xc, -0xa, -0x2d, -0xa, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x9, -0x8, -0x9, -0x2a, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x8, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x23, -0x0, -0x0, -0x20, -0x20, -0x32, -0x20, -0x20, -0x20, -0x20, -0x33, -0x20, -0x33, -0x21, -0x33, -0x0, -0x33, -0x0, -0x0, -0x39, -0x2, -0x29, -0x9, -0x9, -0x2e, -0x2e, -0xd, -0xe, -0x2e, -0x2e, -0xb, -0xc, -0x9, -0x9, -0x29, -0x2, -0x2, -0x2, -0x2, -0x2, -0x3, -0x29, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0x2e, -0xd, -0xb, -0x2e, -0xc, -0xa, -0x2d, -0x9, -0x9, -0x9, -0x9, -0x2a, -0x9, -0x2a, -0x29, -0x29, -0x2, -0x1, -0x22, -0x33, -0x20, -0x32, -0x32, -0x31, -0x32, -0x32, -0x32, -0x20, -0x32, -0x32, -0x20, -0x32, -0x32, -0x20, -0x32, -0x33, -0x0, -0x22, -0x23, -0x2, -0x8, -0x9, -0x9, -0xc, -0x2e, -0xc, -0xa, -0xc, -0xa, -0x9, -0x9, -0x2a, -0x29, -0x29, -0x29, -0x29, -0x29, -0x9, -0x9, -0x9, -0xc, -0x2e, -0xb, -0xd, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0xc, -0xa, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x29, -0x3, -0x1, -0x1, -0x22, -0x0, -0x0, -0x33, -0x20, -0x33, -0x20, -0x33, -0x20, -0x20, -0x20, -0x20, -0x32, -0x32, -0x20, -0x32, -0x20, -0x33, -0x21, -0x33, -0x0, -0x22, -0x22, -0x39, -0x23, -0x2, -0x2, -0x29, -0x8, -0x9, -0x9, -0xc, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xd, -0x2e, -0x2e, -0x2e, -0xc, -0xc, -0xa, -0x2d, -0x2b, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x29, -0x8, -0x2, -0x2, -0x39, -0x39, -0x0, -0x0, -0x0, -0x33, -0x21, -0x21, -0x33, -0x33, -0x20, -0x20, -0x32, -0x32, -0x20, -0x32, -0x32, -0x20, -0x32, -0x32, -0x20, -0x32, -0x32, -0x20, -0x20, -0x21, -0x0, -0x1, -0x2, -0x8, -0xc, -0x2e, -0xd, -0xe, -0xf, -0xf, -0xf, -0xf, -0xf, -0xe, -0xe, -0x2e, -0x2e, -0xc, -0x2b, -0x9, -0x2a, -0x29, -0x8, -0x8, -0x8, -0x8, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x2a, -0x8, -0x29, -0x3, -0x2, -0x2, -0x1, -0x1, -0x22, -0x22, -0x22, -0x0, -0x33, -0x21, -0x32, -0x32, -0x20, -0x32, -0x31, -0x32, -0x32, -0x32, -0x20, -0x20, -0x20, -0x33, -0x0, -0x0, -0x22, -0x39, -0x2, -0x2, -0x29, -0x9, -0x9, -0xa, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0xc, -0x9, -0x9, -0x9, -0x29, -0x29, -0x29, -0x8, -0x2a, -0x9, -0x9, -0x9, -0x9, -0xa, -0x9, -0xa, -0x9, -0x9, -0x9, -0x29, -0x9, -0x29, -0x8, -0x29, -0x8, -0x2, -0x2, -0x2, -0x39, -0x22, -0x21, -0x33, -0x32, -0x32, -0x31, -0x31, -0x32, -0x31, -0x20, -0x33, -0x0, -0x22, -0x1, -0x2, -0x3, -0x8, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x29, -0x29, -0x29, -0x29, -0x29, -0x8, -0x2a, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x2a, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0xa, -0xa, -0x9, -0xa, -0xa, -0x9, -0xa, -0x9, -0x8, -0x8, -0x29, -0x3, -0x3, -0x2, -0x2, -0x1, -0x22, -0x0, -0x33, -0x32, -0x31, -0x32, -0x42, -0x42, -0x31, -0x31, -0x32, -0x33, -0x0, -0x39, -0x2, -0x3, -0x8, -0x9, -0xa, -0xc, -0xa, -0xc, -0x2b, -0x9, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x8, -0x29, -0x29, -0x9, -0x9, -0x9, -0xa, -0xa, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x2a, -0x8, -0x8, -0x9, -0x0, -0x0, -0x33, -0x33, -0x20, -0x20, -0x32, -0x32, -0x31, -0x42, -0x30, -0x30, -0x30, -0x30, -0x40, -0x30, -0x30, -0x30, -0x42, -0x32, -0x33, -0x39, -0x2, -0x29, -0x9, -0x9, -0xc, -0xc, -0x2e, -0xc, -0xa, -0xc, -0x9, -0x9, -0x2a, -0x8, -0x8, -0x29, -0x8, -0x9, -0x9, -0x9, -0xc, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0x9, -0x8, -0x29, -0x2, -0x1, -0x22, -0x22, -0x22, -0x22, -0x21, -0x33, -0x0, -0x33, -0x1, -0x30, -0x30, -0x30, -0x30, -0x40, -0x30, -0x40, -0x40, -0x40, -0x40, -0x63, -0x40, -0x40, -0x40, -0x63, -0x40, -0x40, -0x40, -0x30, -0x42, -0x20, -0x0, -0x2, -0x29, -0x9, -0xa, -0xc, -0xb, -0x2e, -0x2e, -0xb, -0xc, -0xc, -0xa, -0xa, -0x9, -0x9, -0x9, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0xd, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0xc, -0x9, -0x29, -0x2, -0x22, -0x33, -0x20, -0x31, -0x42, -0x31, -0x42, -0x42, -0x42, -0x41, -0x31, -0x32, -0x31, -0x42, -0x42, -0x41, -0x30, -0x30, -0x30, -0x30, -0x40, -0x40, -0x40, -0x40, -0x40, -0x40, -0x40, -0x30, -0x30, -0x30, -0x32, -0x20, -0x0, -0x23, -0x29, -0x8, -0x9, -0xc, -0xc, -0x2e, -0x2e, -0xc, -0xc, -0xa, -0x2d, -0xa, -0x9, -0x9, -0xa, -0x9, -0xc, -0xc, -0x2e, -0x2e, -0xd, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0xc, -0xa, -0x8, -0x29, -0x23, -0x22, -0x21, -0x33, -0x33, -0x20, -0x33, -0x0, -0x33, -0x21, -0x32, -0x2, -0x2, -0x1, -0x22, -0x22, -0x22, -0x0, -0x0, -0x33, -0x20, -0x20, -0x32, -0x32, -0x31, -0x31, -0x42, -0x31, -0x32, -0x32, -0x20, -0x21, -0x0, -0x22, -0x2, -0x2, -0x29, -0x29, -0x9, -0x9, -0x9, -0x9, -0x9, -0xa, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0xa, -0xc, -0xc, -0x2e, -0xb, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0x9, -0x9, -0x9, -0x2a, -0x8, -0x9, -0x8, -0x29, -0x2a, -0x9, -0x8, -0x8, -0x29, -0x9, -0x2a, -0x8, -0x29, -0x29, -0x3, -0x2, -0x2, -0x2, -0x39, -0x22, -0x0, -0x0, -0x33, -0x0, -0x33, -0x0, -0x33, -0x21, -0x0, -0x0, -0x22, -0x39, -0x39, -0x2, -0x2, -0x3, -0x29, -0x8, -0x2a, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0xa, -0xc, -0xc, -0xc, -0xc, -0x2e, -0xc, -0xc, -0xa, -0x2d, -0xa, -0xa, -0x2d, -0xa, -0xc, -0xc, -0xa, -0xc, -0xc, -0xc, -0xa, -0xc, -0xa, -0x9, -0x3, -0x3, -0x2, -0x2, -0x2, -0x2, -0x23, -0x1, -0x39, -0x22, -0x0, -0x0, -0x0, -0x33, -0x21, -0x33, -0x21, -0x33, -0x0, -0x22, -0x39, -0x1, -0x2, -0x2, -0x29, -0x8, -0x9, -0x9, -0x9, -0xa, -0x2d, -0xa, -0xa, -0x2d, -0xa, -0x9, -0xa, -0x9, -0xa, -0xa, -0x9, -0xa, -0xc, -0x9, -0x9, -0x9, -0x9, -0x9, -0x29, -0x8, -0x29, -0x8, -0x8, -0x29, -0x8, -0x8, -0x8, -0x29, -0x29, -0x3, -0x29, -0x8, -0x29, -0x8, -0x22, -0x0, -0x22, -0x22, -0x0, -0x0, -0x0, -0x0, -0x33, -0x0, -0x33, -0x0, -0x33, -0x33, -0x21, -0x20, -0x33, -0x0, -0x0, -0x22, -0x2, -0x2, -0x29, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xc, -0xc, -0xc, -0xa, -0xa, -0x9, -0x9, -0x29, -0x3, -0x2, -0x2, -0x23, -0x1, -0x22, -0x22, -0x22, -0x22, -0x22, -0x0, -0x0, -0x0, -0x33, -0x21, -0x33, -0x0, -0x0, -0x0, -0x22, -0x33, -0x21, -0x33, -0x0, -0x33, -0x0, -0x33, -0x0, -0x21, -0x33, -0x21, -0x33, -0x0, -0x0, -0x33, -0x21, -0x0, -0x0, -0x22, -0x2, -0x3, -0x29, -0x9, -0xc, -0x2e, -0x2e, -0xd, -0xe, -0xe, -0x2e, -0xd, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xc, -0xc, -0xa, -0xa, -0x9, -0x9, -0x29, -0x3, -0x2, -0x2, -0x39, -0x39, -0x22, -0x0, -0x0, -0x33, -0x0, -0x33, -0x20, -0x20, -0x20, -0x32, -0x32, -0x32, -0x32, -0x20, -0x20, -0x33, -0x31, -0x32, -0x31, -0x32, -0x32, -0x32, -0x20, -0x20, -0x33, -0x0, -0x0, -0x0, -0x22, -0x22, -0x39, -0x39, -0x1, -0x23, -0x2, -0x29, -0x8, -0x9, -0xc, -0xb, -0xd, -0xe, -0xe, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0xc, -0xa, -0x2d, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x8, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x1, -0x22, -0x0, -0x0, -0x20, -0x32, -0x32, -0x31, -0x42, -0x31, -0x42, -0x42, -0x31, -0x42, -0x32, -0x30, -0x42, -0x41, -0x42, -0x31, -0x42, -0x31, -0x32, -0x20, -0x21, -0x0, -0x22, -0x23, -0x2, -0x2, -0x2, -0x8, -0x8, -0x29, -0x9, -0xa, -0xc, -0x2e, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0xa, -0x9, -0x9, -0x29, -0x8, -0x8, -0x8, -0x8, -0x8, -0x8, -0x8, -0x8, -0x8, -0x8, -0x8, -0x8, -0x29, -0x2, -0x2, -0x22, -0x21, -0x32, -0x32, -0x42, -0x30, -0x30, -0x30, -0x30, -0x30, -0x30, -0x30, -0x30, -0x30, -0x42, -0x42, -0x31, -0x42, -0x31, -0x32, -0x20, -0x21, -0x22, -0x1, -0x2, -0x3, -0x29, -0x8, -0x9, -0x2a, -0x9, -0x9, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0x9, -0x9, -0x9, -0x2a, -0x29, -0x9, -0x8, -0x8, -0x8, -0x8, -0x8, -0x29, -0x8, -0x8, -0x8, -0x29, -0x3, -0x2, -0x23, -0x22, -0x21, -0x20, -0x32, -0x42, -0x41, -0x30, -0x30, -0x30, -0x30, -0x30, -0x30, -0x42, -0x42, -0x31, -0x42, -0x31, -0x32, -0x31, -0x33, -0x21, -0x22, -0x2, -0x2, -0x8, -0x9, -0xa, -0xc, -0xa, -0xc, -0xa, -0xa, -0x9, -0x9, -0x9, -0x8, -0x8, -0x29, -0x8, -0x8, -0x29, -0x29, -0x29, -0x29, -0x9, -0x9, -0x9, -0xa, -0xc, -0xa, -0xc, -0xa, -0x2d, -0x9, -0x9, -0x9, -0x8, -0x29, -0x29, -0x3, -0x2, -0x2, -0x2, -0x39, -0x22, -0x0, -0x33, -0x32, -0x32, -0x31, -0x42, -0x42, -0x31, -0x42, -0x31, -0x42, -0x42, -0x32, -0x31, -0x32, -0x31, -0x20, -0x20, -0x0, -0x22, -0x2, -0x2, -0x8, -0xc, -0xa, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0x9, -0x29, -0x2, -0x2, -0x39, -0x22, -0x0, -0x22, -0x39, -0x23, -0x2, -0x29, -0x2a, -0x9, -0xc, -0xc, -0xb, -0x2e, -0xc, -0xc, -0xa, -0x9, -0x9, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x23, -0x1, -0x22, -0x0, -0x33, -0x20, -0x20, -0x32, -0x31, -0x32, -0x31, -0x32, -0x31, -0x32, -0x31, -0x33, -0x21, -0x33, -0x0, -0x22, -0x39, -0x2, -0x2, -0x29, -0x9, -0x9, -0xc, -0xc, -0xb, -0xd, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0x9, -0x9, -0x29, -0x3, -0x2, -0x1, -0x22, -0x39, -0x39, -0x39, -0x2, -0x2, -0x3, -0x29, -0x8, -0x9, -0x2a, -0x9, -0x8, -0x9, -0x9, -0x2a, -0x8, -0x8, -0x2a, -0x8, -0x8, -0x8, -0x29, -0x3, -0x2, -0x2, -0x1, -0x22, -0x0, -0x0, -0x33, -0x33, -0x20, -0x33, -0x21, -0x33, -0x33, -0x20, -0x23, -0x2, -0x2, -0x3, -0x29, -0x29, -0x9, -0x9, -0xa, -0x2d, -0xa, -0xc, -0xc, -0xc, -0x2e, -0xc, -0xc, -0xc, -0xc, -0xa, -0xa, -0x9, -0x9, -0x8, -0x8, -0x3, -0x2, -0x2, -0x23, -0x1, -0x22, -0x39, -0x39, -0x39, -0x1, -0x22, -0x39, -0x39, -0x1, -0x2, -0x2, -0x29, -0x8, -0x9, -0x9, -0xa, -0x2d, -0xa, -0x2d, -0x9, -0x9, -0x8, -0x29, -0x3, -0x2, -0x23, -0x1, -0x22, -0x22, -0x39, -0x1, -0x22, -0x1, -0x22, -0x3b, -0x3, -0x8, -0x29, -0x9, -0x9, -0xc, -0xc, -0xb, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0xa, -0x9, -0x9, -0x29, -0x3, -0x2, -0x2, -0x1, -0x22, -0x22, -0x22, -0x0, -0x0, -0x0, -0x0, -0x22, -0x39, -0x2, -0x2, -0x29, -0x9, -0x9, -0xa, -0xc, -0xc, -0xa, -0xa, -0x9, -0x9, -0x8, -0x3, -0x2, -0x2, -0x1, -0x22, -0x22, -0x22, -0x22, -0x39, -0x39, -0x2, -0x1, -0x2, -0x2, -0x29, -0x9, -0x9, -0xc, -0xb, -0xd, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xf, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xd, -0x2e, -0x2e, -0x2d, -0x9, -0x9, -0x29, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x3, -0x3, -0x3, -0x8, -0x8, -0x2a, -0x2a, -0x9, -0x2a, -0x9, -0x8, -0x8, -0x29, -0x2, -0x2, -0x22, -0x0, -0x0, -0x0, -0x33, -0x20, -0x20, -0x20, -0x20, -0x33, -0x39, -0x22, -0x1, -0x2, -0x29, -0x9, -0x9, -0xc, -0x2e, -0xe, -0xe, -0xf, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xd, -0xe, -0xe, -0xf, -0xe, -0xe, -0x2e, -0x2e, -0xc, -0xa, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x29, -0x29, -0x29, -0x3, -0x3, -0x2, -0x2, -0x3, -0x2, -0x23, -0x39, -0x0, -0x33, -0x32, -0x31, -0x42, -0x42, -0x42, -0x41, -0x42, -0x31, -0x32, -0x33, -0x1, -0x2, -0x8, -0x9, -0xc, -0xb, -0xd, -0xe, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0xc, -0xc, -0xa, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0xe, -0xe, -0xf, -0xe, -0xe, -0x2e, -0xc, -0xa, -0x9, -0x9, -0x9, -0x29, -0x2a, -0x29, -0x8, -0x8, -0x9, -0x29, -0x29, -0x8, -0x3, -0x2, -0x2, -0x2, -0x2, -0x1, -0x1, -0x23, -0x39, -0x22, -0x0, -0x33, -0x20, -0x32, -0x31, -0x42, -0x42, -0x30, -0x42, -0x31, -0x32, -0x20, -0x33, -0x8, -0x9, -0x2e, -0xe, -0xe, -0xe, -0x2e, -0xc, -0x9, -0x9, -0x9, -0xc, -0x25, -0x4, -0x4, -0x2b, -0x9, -0xc, -0x2e, -0xe, -0xf, -0xe, -0xe, -0x2e, -0xc, -0x9, -0x29, -0x3, -0x2, -0x2, -0x23, -0x1, -0x1, -0x23, -0x1, -0x1, -0x23, -0x1, -0x23, -0x1, -0x22, -0x22, -0x22, -0x0, -0x0, -0x0, -0x33, -0x0, -0x0, -0x33, -0x21, -0x20, -0x20, -0x32, -0x32, -0x32, -0x31, -0x32, -0x31, -0x32, -0x32, -0x21, -0x0, -0x39, -0x9, -0x2e, -0xe, -0xf, -0xc, -0x9, -0x8, -0x2, -0x2, -0x2, -0x3, -0x2, -0x29, -0x8, -0x9, -0x9, -0x9, -0xc, -0x2e, -0xe, -0xf, -0xe, -0xb, -0xc, -0x9, -0x3, -0x2, -0x39, -0x22, -0x0, -0x0, -0x33, -0x0, -0x0, -0x0, -0x22, -0x0, -0x22, -0x0, -0x0, -0x0, -0x33, -0x21, -0x32, -0x20, -0x32, -0x32, -0x32, -0x32, -0x20, -0x32, -0x32, -0x20, -0x32, -0x32, -0x20, -0x32, -0x32, -0x20, -0x20, -0x33, -0x0, -0x1, -0x3, -0xc, -0x2e, -0xe, -0xe, -0xa, -0x8, -0x2, -0x29, -0x29, -0x29, -0x29, -0x29, -0x29, -0x29, -0x29, -0x29, -0x3, -0x29, -0x8, -0xa, -0xd, -0xe, -0xe, -0x2e, -0xa, -0x9, -0x2, -0x2, -0x1, -0x22, -0x22, -0x22, -0x22, -0x22, -0x22, -0x39, -0x22, -0x39, -0x39, -0x22, -0x0, -0x33, -0x20, -0x32, -0x31, -0x42, -0x42, -0x42, -0x42, -0x42, -0x31, -0x32, -0x31, -0x20, -0x20, -0x20, -0x33, -0x0, -0x33, -0x0, -0x0, -0x39, -0x2, -0x8, -0xc, -0xe, -0xe, -0xe, -0xa, -0x29, -0x2, -0x8, -0x9, -0x9, -0x9, -0xa, -0xc, -0xa, -0xc, -0xa, -0xc, -0x9, -0x8, -0x8, -0x29, -0xc, -0xe, -0xe, -0x2e, -0xa, -0x9, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x39, -0x0, -0x33, -0x32, -0x31, -0x30, -0x30, -0x40, -0x40, -0x30, -0x30, -0x30, -0x42, -0x32, -0x32, -0x0, -0x0, -0x22, -0x22, -0x39, -0x39, -0x23, -0x2, -0x29, -0x9, -0xc, -0xe, -0xc, -0x8, -0x9, -0xc, -0x2e, -0xe, -0x2e, -0x9, -0x29, -0x2e, -0xe, -0x9, -0x8, -0x2, -0x2, -0x2, -0x1, -0x22, -0x21, -0x32, -0x30, -0x30, -0x30, -0x42, -0x32, -0x33, -0x0, -0x0, -0x22, -0x8, -0x9, -0x2e, -0xe, -0x9, -0x29, -0xa, -0xe, -0xe, -0xe, -0xc, -0x8, -0x9, -0xe, -0x2e, -0x9, -0x2, -0x39, -0x0, -0x33, -0x0, -0x33, -0x21, -0x33, -0x33, -0x20, -0x33, -0x20, -0x32, -0x31, -0x32, -0x20, -0x22, -0x2e, -0x2e, -0x8, -0x29, -0x9, -0x29, -0x8, -0x29, -0x29, -0x9, -0x2e, -0xe, -0xc, -0x8, -0x2, -0x22, -0x0, -0x0, -0x33, -0x0, -0x39, -0x2, -0x29, -0x8, -0x29, -0x2, -0x0, -0x32, -0x41, -0x42, -0x32, -0x1, -0xd, -0x2e, -0x3, -0x8, -0x9, -0x9, -0x29, -0x29, -0x29, -0x29, -0x9, -0xa, -0xd, -0xb, -0x9, -0x2, -0x22, -0x20, -0x20, -0x0, -0x22, -0x2, -0x29, -0x9, -0x2a, -0x29, -0x2, -0x22, -0x0, -0x0, -0x1, -0x8, -0x2e, -0xe, -0x9, -0x29, -0x9, -0xa, -0xc, -0xc, -0xa, -0x9, -0x8, -0x8, -0x2e, -0xe, -0xc, -0x3, -0x0, -0x20, -0x32, -0x32, -0x21, -0x22, -0x2, -0x2, -0x3, -0x2, -0x2, -0x2, -0x2, -0x23, -0x2, -0x9, -0x9, -0x2e, -0xe, -0xa, -0x29, -0xc, -0xe, -0xe, -0xe, -0xc, -0x8, -0xd, -0x2e, -0xa, -0x29, -0x22, -0x20, -0x32, -0x31, -0x31, -0x32, -0x33, -0x0, -0x0, -0x0, -0x0, -0x33, -0x0, -0x0, -0x33, -0x0, -0x2, -0x2, -0xa, -0xd, -0xe, -0x9, -0x29, -0x2a, -0x9, -0x2a, -0x29, -0xc, -0xe, -0x2e, -0x9, -0x23, -0x0, -0x32, -0x30, -0x30, -0x42, -0x33, -0x1, -0x3, -0x29, -0x29, -0x2, -0x21, -0x43, -0x30, -0x30, -0x42, -0x21, -0x2, -0x8, -0xa, -0xe, -0xe, -0x9, -0x3, -0x29, -0x3, -0x29, -0xe, -0xe, -0xa, -0x9, -0x2, -0x23, -0x39, -0x22, -0x22, -0x1, -0x2, -0x8, -0x9, -0xa, -0x9, -0x29, -0x2, -0x22, -0x20, -0x33, -0x0, -0x22, -0x2, -0x9, -0xc, -0xe, -0x2e, -0x9, -0x3, -0x29, -0x29, -0x8, -0x2e, -0xe, -0xc, -0x9, -0x3, -0x3, -0x2, -0x2, -0x8, -0x2, -0x29, -0x3, -0x8, -0x8, -0x2, -0x2, -0x23, -0x1, -0x22, -0x22, -0x22, -0x1, -0x9, -0xd, -0xe, -0x9, -0x3, -0x29, -0x9, -0x9, -0x9, -0x29, -0x2a, -0xe, -0xe, -0xc, -0x2a, -0x8, -0x1, -0x22, -0x0, -0x0, -0x33, -0x20, -0x32, -0x31, -0x31, -0x31, -0x32, -0x32, -0x20, -0x20, -0x0, -0x23, -0xe, -0xe, -0x9, -0x2, -0x8, -0x2, -0x3, -0x29, -0x2, -0x2, -0x2, -0x29, -0x9, -0xe, -0xd, -0xa, -0x8, -0x1, -0x22, -0x22, -0x39, -0x39, -0x1, -0x1, -0x23, -0x1, -0x2, -0x3, -0x29, -0x8, -0x9, -0x9, -0xe, -0xe, -0x9, -0x3, -0x3, -0x2a, -0x2d, -0xb, -0xd, -0xb, -0xd, -0xb, -0x2e, -0xc, -0xa, -0x9, -0x29, -0x8, -0x29, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x29, -0x9, -0x9, -0xc, -0xa, -0x2e, -0x2e, -0xc, -0x2e, -0xd, -0xb, -0x2e, -0xc, -0xa, -0xc, -0x2e, -0x2e, -0xe, -0x2e, -0xc, -0x9, -0x8, -0x8, -0x29, -0x8, -0x8, -0x29, -0x8, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x29, -0x8, -0x29, -0x29, -0x9, -0x22, -0x2, -0x9, -0x2e, -0xe, -0x2e, -0x29, -0x8, -0x8, -0x29, -0x29, -0xc, -0xe, -0xe, -0x2e, -0x9, -0x8, -0x1, -0x22, -0x1, -0x22, -0x23, -0x1, -0x22, -0x22, -0x0, -0x20, -0x32, -0x42, -0x31, -0x42, -0x20, -0x2, -0x9, -0xc, -0xb, -0xd, -0xe, -0x2e, -0x2e, -0xe, -0xe, -0xe, -0xe, -0xe, -0xf, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0x9, -0x29, -0x39, -0x33, -0x32, -0x31, -0x20, -0x0, -0x29, -0x9, -0x2e, -0x2e, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xd, -0xb, -0xc, -0xa, -0xc, -0x2e, -0x2e, -0x2e, -0xd, -0x2e, -0xc, -0x2b, -0x8, -0x29, -0x2, -0x1, -0x22, -0x33, -0x20, -0x32, -0x33, -0x1, -0x2, -0x3, -0x29, -0x2a, -0x9, -0xc, -0xa, -0xc, -0x2e, -0xc, -0xa, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x3, -0x3, -0x2, -0x2, -0x39, -0x22, -0x22, -0x39, -0x39, -0x1, -0x0, -0x32, -0x32, -0x20, -0x20, -0x20, -0x20, -0x20, -0x33, -0x39, -0x29, -0x9, -0x2e, -0x2e, -0x2e, -0xa, -0x8, -0x29, -0x2, -0x29, -0x9, -0xc, -0xb, -0xd, -0x2e, -0xa, -0xa, -0x9, -0x9, -0x9, -0x8, -0x2, -0x1, -0x0, -0x33, -0x21, -0x33, -0x20, -0x20, -0x32, -0x20, -0x20, -0x20, -0x33, -0x0, -0x39, -0x2, -0x9, -0x2e, -0xe, -0xe, -0xe, -0xd, -0xb, -0xc, -0x9, -0x9, -0x29, -0x9, -0x9, -0x9, -0x9, -0x9, -0x3, -0x29, -0x2, -0x2, -0x1, -0x0, -0x33, -0x32, -0x31, -0x32, -0x20, -0x33, -0x39, -0x2, -0x8, -0x29, -0x9, -0x9, -0xa, -0x9, -0x9, -0xa, -0x2d, -0x2b, -0x9, -0x2a, -0x2a, -0x9, -0x9, -0xa, -0x9, -0xa, -0x9, -0x2, -0x39, -0x22, -0x0, -0x20, -0x31, -0x42, -0x30, -0x30, -0x32, -0x0, -0x2, -0x9, -0xc, -0xa, -0x2d, -0x2a, -0x29, -0x3, -0x29, -0x2a, -0x2d, -0xa, -0xc, -0xa, -0x9, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x42, -0x30, -0x30, -0x40, -0x40, -0x40, -0x40, -0x40, -0x40, -0x42, -0x21, -0x2, -0x9, -0x2e, -0x2e, -0x2e, -0xa, -0xa, -0x9, -0xa, -0xc, -0x2e, -0xe, -0xd, -0xb, -0x9, -0x2, -0x33, -0x20, -0x32, -0x32, -0x32, -0x3, -0x2, -0x2, -0x39, -0x0, -0x33, -0x20, -0x32, -0x20, -0x33, -0x0, -0x39, -0x2, -0x8, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0xc, -0x2e, -0x2e, -0x2e, -0xa, -0x2d, -0x9, -0x9, -0x9, -0x9, -0x9, -0x2a, -0x23, -0x1, -0x22, -0x22, -0x0, -0x0, -0x33, -0x20, -0x0, -0x0, -0x2, -0x29, -0x9, -0xa, -0xc, -0xc, -0xa, -0xc, -0xa, -0xc, -0xa, -0x9, -0x8, -0x29, -0x2, -0x2, -0x2, -0x2, -0x23, -0x1, -0x23, -0x2, -0x20, -0x20, -0x20, -0x20, -0x33, -0x21, -0x0, -0x22, -0x22, -0x2, -0x8, -0xc, -0x2e, -0xe, -0xd, -0x2e, -0x2e, -0xc, -0xa, -0x9, -0x9, -0x29, -0x2, -0x23, -0x22, -0x0, -0x33, -0x20, -0x32, -0x31, -0x32, -0x32, -0x30, -0x42, -0x31, -0x32, -0x0, -0x22, -0x2, -0x29, -0x8, -0x9, -0xc, -0x2e, -0xe, -0xe, -0x2e, -0x2e, -0x9, -0x9, -0x29, -0x29, -0x8, -0x8, -0x8, -0x8, -0x2, -0x1, -0x33, -0x31, -0x30, -0x30, -0x30, -0x30, -0x31, -0x32, -0x32, -0x21, -0x23, -0x29, -0xc, -0x2e, -0xc, -0xa, -0x9, -0x3, -0x2, -0x23, -0x2, -0x29, -0x9, -0xc, -0xa, -0xc, -0x9, -0x2a, -0x29, -0x2, -0x2, -0x39, -0x33, -0x20, -0x31, -0x43, -0x31, -0x42, -0x22, -0x39, -0x2, -0x29, -0x9, -0xa, -0x2e, -0x2e, -0x2e, -0xc, -0x9, -0x8, -0x2, -0x23, -0x1, -0x23, -0x2, -0x2, -0x3, -0x8, -0x29, -0x8, -0x9, -0x9, -0x9, -0x3, -0x2, -0x22, -0x0, -0x0, -0x0, -0x0, -0x2, -0x29, -0x9, -0xc, -0x2e, -0xe, -0xd, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0xa, -0x9, -0x29, -0x2, -0x23, -0x1, -0x22, -0x2, -0x3, -0x8, -0x9, -0x9, -0x9, -0x8, -0x2, -0x1, -0x0, -0x0, -0x0, -0x22, -0x1, -0x29, -0xa, -0xd, -0xe, -0xe, -0x2e, -0x2e, -0xc, -0xb, -0xd, -0xe, -0xe, -0x2e, -0xa, -0x9, -0x9, -0x9, -0x8, -0x9, -0x29, -0x3, -0x2, -0x2, -0x2, -0x22, -0x33, -0x32, -0x41, -0x42, -0x31, -0x20, -0x9, -0xe, -0x2e, -0x9, -0x8, -0x8, -0x2c, -0x9, -0x2d, -0xe, -0xe, -0x2e, -0x9, -0x2, -0x1, -0x22, -0x22, -0x22, -0x22, -0x22, -0x0, -0x0, -0x33, -0x20, -0x20, -0x20, -0x32, -0x20, -0x32, -0x32, -0x33, -0x1, -0x2e, -0xe, -0x9, -0x3, -0x29, -0x9, -0x9, -0x2a, -0x9, -0x8, -0x2e, -0xe, -0xa, -0x29, -0x2, -0x39, -0x1, -0x1, -0x23, -0x22, -0x21, -0x32, -0x30, -0x30, -0x30, -0x42, -0x32, -0x21, -0x0, -0x0, -0x1, -0x3, -0x2e, -0xa, -0x9, -0xe, -0xc, -0x9, -0x2e, -0x29, -0x39, -0x0, -0x33, -0x31, -0x32, -0x20, -0x33, -0x39, -0x2e, -0x8, -0x9, -0x8, -0x8, -0x2e, -0xc, -0x2, -0x0, -0x33, -0x23, -0x8, -0x29, -0x0, -0x20, -0x22, -0x2e, -0xa, -0x9, -0xd, -0xc, -0x2a, -0x2e, -0x29, -0x20, -0x32, -0x21, -0x22, -0x39, -0x22, -0x22, -0x2, -0x29, -0x2e, -0x9, -0x8, -0x8, -0xd, -0x2b, -0x1, -0x33, -0x20, -0x1, -0x2a, -0x29, -0x0, -0x32, -0x20, -0x9, -0x2e, -0x9, -0x8, -0x8, -0x2e, -0xc, -0x3, -0x2, -0x39, -0x39, -0x0, -0x0, -0x0, -0x33, -0x39, -0xe, -0x8, -0x29, -0x9, -0x9, -0x9, -0xc, -0xa, -0x29, -0x2, -0x2, -0x2, -0x2, -0x8, -0x9, -0xa, -0x2a, -0xc, -0x2e, -0x9, -0x9, -0x2e, -0x2e, -0x9, -0x29, -0x2, -0x2, -0x23, -0x1, -0x22, -0x0, -0x39, -0x8, -0x2e, -0xe, -0xd, -0xe, -0xe, -0x2e, -0x2e, -0xd, -0xb, -0xc, -0x9, -0x29, -0x0, -0x32, -0x21, -0x22, -0x39, -0x2, -0x2, -0x29, -0x9, -0xa, -0x9, -0x9, -0x8, -0x9, -0x9, -0x2a, -0x29, -0x2, -0x2, -0x2, -0x22, -0x33, -0x32, -0x20, -0x0, -0x1, -0x2a, -0xc, -0x2e, -0xc, -0xa, -0x8, -0x9, -0x9, -0x2a, -0x33, -0x31, -0x42, -0x30, -0x42, -0x39, -0xa, -0xc, -0x9, -0x9, -0xa, -0x2e, -0x9, -0x2, -0x0, -0x0, -0x2, -0x39, -0x0, -0x20, -0x33, -0x1, -0x2a, -0xc, -0x2b, -0x2d, -0xa, -0x9, -0x8, -0x8, -0x29, -0x8, -0x31, -0x32, -0x0, -0x23, -0x29, -0xc, -0xe, -0x2e, -0xa, -0x9, -0x8, -0x8, -0x39, -0x20, -0x42, -0x42, -0x33, -0x1, -0x8, -0x2e, -0xc, -0x8, -0x2, -0x2, -0x29, -0x9, -0x9, -0x8, -0x2, -0x22, -0x20, -0x20, -0x2, -0xc, -0xe, -0x2e, -0x2e, -0xd, -0xa, -0x9, -0x2, -0x29, -0x8, -0x29, -0x2, -0x0, -0x20, -0x33, -0x2e, -0x9, -0x2a, -0x9, -0x9, -0xe, -0x29, -0x1, -0x22, -0x39, -0x33, -0x31, -0x32, -0x20, -0x33, -0x39, -0xa, -0x9, -0xc, -0x9, -0x0, -0x22, -0x0, -0x21, -0xa, -0x9, -0x2d, -0x2a, -0x20, -0x1, -0x1, -0x0, -0xc, -0x2a, -0x9, -0x9, -0x2, -0x39, -0x23, -0x2, -0x9, -0x2e, -0x2e, -0x2e, -0x9, -0x8, -0x39, -0x0, -0x39, -0x22, -0x1, -0x2a, -0x9, -0x9, -0x9, -0x29, -0x0, -0x32, -0x21, -0x2b, -0x9, -0xc, -0x8, -0x23, -0x20, -0x3, -0x9, -0x9, -0x9, -0x8, -0x22, -0x32, -0x9, -0xc, -0xb, -0x8, -0x2, -0x39, -0x0, -0x33, -0xa, -0x9, -0x0, -0x0, -0xa, -0xc, -0x3, -0x1, -0x0, -0x2, -0xa, -0x29, -0x29, -0x9, -0x3, -0x33, -0x9, -0x1, -0x2, -0x3, -0x3, -0x0, -0x0, -0x0 -}; - -#undef RAW_NAME -#undef IMAGE_NAME -#define RAW_NAME hilite_3dfinfo_raw -#define IMAGE_NAME hilite_3dfinfo_image -unsigned char RAW_NAME[] = { -0x20, -0x0, -0x0, -0x0, -0x20, -0x0, -0x0, -0x0, -0x8, -0x0, -0x0, -0x0, -0x3, -0x0, -0x0, -0x0, -0x3, -0x0, -0x0, -0x0, -0x3, -0x0, -0x0, -0x0, -0xff, -0x1, -0xfc, -0x1, -0xee, -0x1, -0x19, -0x0, -0x10, -0x0, -0xe5, -0x1, -0x11, -0x0, -0x6, -0x0, -0xe8, -0x1, -0x9, -0x0, -0x8, -0x0, -0xeb, -0x1, -0x1, -0x0, -0x4, -0x0, -0x22, -0x22, -0x2b, -0x3c, -0x44, -0x44, -0x66, -0x77, -0x88, -0x99, -0xaa, -0xbb, -0xcc, -0xdd, -0xee, -0xff, -0x23, -0x4e, -0x3c, -0x7, -0xef, -0x1, -0x4, -0x0, -0x12, -0x1c, -0x88, -0x7, -0xfc, -0xff, -0xd3, -0x7, -0x10, -0x32, -0xb8, -0x7, -0x6, -0x22, -0x94, -0x7, -0x8, -0x12, -0xa0, -0x7, -0x4, -0x2, -0xac, -0x7, -0x62, -0x0, -0x0, -0x0, -0x63, -0x0, -0x0, -0x0, -0x64, -0x0, -0x0, -0x0, -0x65, -0x0, -0x0, -0x0, -0x66, -0x0, -0x0, -0x0, -0x67, -0x0, -0x0, -0x0, -0x69, -0x0, -0x0, -0x0, -0x6a, -0x0, -0x0, -0x0, -0x6b, -0x0, -0x0, -0x0, -0x6c, -0x0, -0x0, -0x0, -0x6d, -0x0, -0x0, -0x0, -0x6e, -0x0, -0x0, -0x0, -0x6f, -0x0, -0x0, -0x0, -0x70, -0x0, -0x0, -0x0, -0x71, -0x0, -0x0, -0x0, -0x72, -0x0, -0x0, -0x0, -0x73, -0x0, -0x0, -0x0, -0x74, -0x0, -0x0, -0x0, -0x75, -0x0, -0x0, -0x0, -0x76, -0x0, -0x0, -0x0, -0x77, -0x0, -0x0, -0x0, -0x78, -0x0, -0x0, -0x0, -0x79, -0x0, -0x0, -0x0, -0x7a, -0x0, -0x0, -0x0, -0x7b, -0x0, -0x0, -0x0, -0x7c, -0x0, -0x0, -0x0, -0x7d, -0x0, -0x0, -0x0, -0x7e, -0x0, -0x0, -0x0, -0x7f, -0x0, -0x0, -0x0, -0x80, -0x0, -0x0, -0x0, -0x81, -0x0, -0x0, -0x0, -0x82, -0x0, -0x0, -0x0, -0x83, -0x0, -0x0, -0x0, -0x84, -0x0, -0x0, -0x0, -0x85, -0x0, -0x0, -0x0, -0x86, -0x0, -0x0, -0x0, -0x87, -0x0, -0x0, -0x0, -0x87, -0x0, -0x0, -0x0, -0x88, -0x0, -0x0, -0x0, -0x89, -0x0, -0x0, -0x0, -0x8a, -0x0, -0x0, -0x0, -0x8b, -0x0, -0x0, -0x0, -0x8c, -0x0, -0x0, -0x0, -0x8d, -0x0, -0x0, -0x0, -0x8e, -0x0, -0x0, -0x0, -0x8f, -0x0, -0x0, -0x0, -0x90, -0x0, -0x0, -0x0, -0x90, -0x0, -0x0, -0x0, -0x91, -0x0, -0x0, -0x0, -0x92, -0x0, -0x0, -0x0, -0x93, -0x0, -0x0, -0x0, -0x94, -0x0, -0x0, -0x0, -0x95, -0x0, -0x0, -0x0, -0x96, -0x0, -0x0, -0x0, -0x96, -0x0, -0x0, -0x0, -0x97, -0x0, -0x0, -0x0, -0xeb, -0xa5, -0x40, -0x0, -0x41, -0x0, -0x0, -0x0, -0xc0, -0x4f, -0x55, -0x0, -0xb8, -0xfc, -0x7b, -0x0, -0xd4, -0xfc, -0x7b, -0x0, -0xc, -0x0, -0x0, -0x0, -0xc0, -0x4f, -0x55, -0x0, -0x0, -0x0, -0x0, -0x0, -0x94, -0xa4, -0x40, -0x0, -0x12, -0x9f, -0x40, -0x0, -0x12, -0x9f, -0x40, -0x0, -0xa, -0x0, -0x0, -0x0, -0xc0, -0x4f, -0x55, -0x0, -0xbc, -0xfc, -0x7b, -0x0, -0xc0, -0x4f, -0x55, -0x0, -0x1, -0x0, -0x0, -0x0, -0x68, -0x82, -0xe2, -0x0, -0xa6, -0x0, -0x0, -0x0, -0xa7, -0x0, -0x0, -0x0, -0xa8, -0x0, -0x0, -0x0, -0xa8, -0x0, -0x0, -0x0, -0xa9, -0x0, -0x0, -0x0, -0xaa, -0x0, -0x0, -0x0, -0xab, -0x0, -0x0, -0x0, -0xac, -0x0, -0x0, -0x0, -0xac, -0x0, -0x0, -0x0, -0xad, -0x0, -0x0, -0x0, -0xae, -0x0, -0x0, -0x0, -0xaf, -0x0, -0x0, -0x0, -0xaf, -0x0, -0x0, -0x0, -0xb0, -0x0, -0x0, -0x0, -0xb1, -0x0, -0x0, -0x0, -0xb2, -0x0, -0x0, -0x0, -0xb2, -0x0, -0x0, -0x0, -0xb3, -0x0, -0x0, -0x0, -0xb4, -0x0, -0x0, -0x0, -0xb5, -0x0, -0x0, -0x0, -0xb5, -0x0, -0x0, -0x0, -0xb6, -0x0, -0x0, -0x0, -0xb7, -0x0, -0x0, -0x0, -0xb8, -0x0, -0x0, -0x0, -0xb8, -0x0, -0x0, -0x0, -0xb9, -0x0, -0x0, -0x0, -0xba, -0x0, -0x0, -0x0, -0xbb, -0x0, -0x0, -0x0, -0xbb, -0x0, -0x0, -0x0, -0xbc, -0x0, -0x0, -0x0, -0xbd, -0x0, -0x0, -0x0, -0xbe, -0x0, -0x0, -0x0, -0xbe, -0x0, -0x0, -0x0, -0xbf, -0x0, -0x0, -0x0, -0xc0, -0x0, -0x0, -0x0, -0xc0, -0x0, -0x0, -0x0, -0xc1, -0x0, -0x0, -0x0, -0xc2, -0x0, -0x0, -0x0, -0xc3, -0x0, -0x0, -0x0, -0xc3, -0x0, -0x0, -0x0, -0xc4, -0x0, -0x0, -0x0, -0xc5, -0x0, -0x0, -0x0, -0xc5, -0x0, -0x0, -0x0, -0xc6, -0x0, -0x0, -0x0, -0xc7, -0x0, -0x0, -0x0, -0xc7, -0x0, -0x0, -0x0, -0xc8, -0x0, -0x0, -0x0, -0xc9, -0x0, -0x0, -0x0, -0xca, -0x0, -0x0, -0x0, -0xca, -0x0, -0x0, -0x0, -0xcb, -0x0, -0x0, -0x0, -0xcc, -0x0, -0x0, -0x0, -0xcc, -0x0, -0x0, -0x0, -0xcd, -0x0, -0x0, -0x0, -0xce, -0x0, -0x0, -0x0, -0xce, -0x0, -0x0, -0x0, -0xcf, -0x0, -0x0, -0x0, -0xd0, -0x0, -0x0, -0x0, -0xd0, -0x0, -0x0, -0x0, -0xd1, -0x0, -0x0, -0x0, -0xd2, -0x0, -0x0, -0x0, -0xd2, -0x0, -0x0, -0x0, -0xd3, -0x0, -0x0, -0x0, -0xd4, -0x0, -0x0, -0x0, -0xd4, -0x0, -0x0, -0x0, -0xd5, -0x0, -0x0, -0x0, -0xd6, -0x0, -0x0, -0x0, -0xd6, -0x0, -0x0, -0x0, -0xd7, -0x0, -0x0, -0x0, -0xd8, -0x0, -0x0, -0x0, -0xd8, -0x0, -0x0, -0x0, -0xd9, -0x0, -0x0, -0x0, -0xda, -0x0, -0x0, -0x0, -0xda, -0x0, -0x0, -0x0, -0xdb, -0x0, -0x0, -0x0, -0xdc, -0x0, -0x0, -0x0, -0xdc, -0x0, -0x0, -0x0, -0xdd, -0x0, -0x0, -0x0, -0xde, -0x0, -0x0, -0x0, -0xde, -0x0, -0x0, -0x0, -0xdf, -0x0, -0x0, -0x0, -0xe0, -0x0, -0x0, -0x0, -0xe0, -0x0, -0x0, -0x0, -0xe1, -0x0, -0x0, -0x0, -0xe2, -0x0, -0x0, -0x0, -0xe2, -0x0, -0x0, -0x0, -0xe3, -0x0, -0x0, -0x0, -0xe3, -0x0, -0x0, -0x0, -0xe4, -0x0, -0x0, -0x0, -0xe5, -0x0, -0x0, -0x0, -0xe5, -0x0, -0x0, -0x0, -0xe6, -0x0, -0x0, -0x0, -0xe7, -0x0, -0x0, -0x0, -0xe7, -0x0, -0x0, -0x0, -0xe8, -0x0, -0x0, -0x0, -0xe9, -0x0, -0x0, -0x0, -0xe9, -0x0, -0x0, -0x0, -0xea, -0x0, -0x0, -0x0, -0xea, -0x0, -0x0, -0x0, -0xeb, -0x0, -0x0, -0x0, -0xec, -0x0, -0x0, -0x0, -0xec, -0x0, -0x0, -0x0, -0xed, -0x0, -0x0, -0x0, -0xee, -0x0, -0x0, -0x0, -0xee, -0x0, -0x0, -0x0, -0xef, -0x0, -0x0, -0x0, -0xef, -0x0, -0x0, -0x0, -0xf0, -0x0, -0x0, -0x0, -0xf1, -0x0, -0x0, -0x0, -0xf1, -0x0, -0x0, -0x0, -0xf2, -0x0, -0x0, -0x0, -0xf2, -0x0, -0x0, -0x0, -0xf3, -0x0, -0x0, -0x0, -0xf4, -0x0, -0x0, -0x0, -0xf4, -0x0, -0x0, -0x0, -0xf5, -0x0, -0x0, -0x0, -0xf5, -0x0, -0x0, -0x0, -0xf6, -0x0, -0x0, -0x0, -0xf7, -0x0, -0x0, -0x0, -0xf7, -0x0, -0x0, -0x0, -0xf8, -0x0, -0x0, -0x0, -0xf8, -0x0, -0x0, -0x0, -0xf9, -0x0, -0x0, -0x0, -0xfa, -0x0, -0x0, -0x0, -0xfa, -0x0, -0x0, -0x0, -0xfb, -0x0, -0x0, -0x0, -0xfb, -0x0, -0x0, -0x0, -0xfc, -0x0, -0x0, -0x0, -0xfd, -0x0, -0x0, -0x0, -0xfd, -0x0, -0x0, -0x0, -0xfe, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1b, -0x0, -0x0, -0x0, -0x1b, -0x0, -0x0, -0x0, -0x0, -0x0, -0x41, -0x0, -0x41, -0x95, -0x40, -0x0, -0x2, -0x0, -0x0, -0x0, -0x40, -0x69, -0xa0, -0x0, -0x1a, -0x0, -0x0, -0x0, -0xc0, -0x4f, -0x55, -0x0, -0xc0, -0x4f, -0x55, -0x0, -0x1a, -0x0, -0x0, -0x0, -0xd8, -0x9c, -0x40, -0x0, -0xc0, -0x4f, -0x55, -0x0, -0x1, -0x0, -0x0, -0x0, -0xfd, -0x90, -0x40, -0x0, -0x1, -0x0, -0x0, -0x0, -0xc0, -0x4f, -0x55, -0x0, -0x3c, -0x83, -0xe2, -0x0, -0x48, -0x8, -0x0, -0x0, -0x68, -0x82, -0xe2, -0x0, -0xf, -0x21, -0x40, -0x0, -0xc0, -0x4f, -0x55, -0x0, -0xec, -0x41, -0x55, -0x0, -0x38, -0xfe, -0x7b, -0x0, -0x74, -0xe4, -0x61, -0x81, -0x94, -0xdf, -0x61, -0x81, -0x0, -0x0, -0x6b, -0x0, -0xe0, -0xae, -0xa0, -0x0, -0x58, -0x5, -0x0, -0x0 -}; - -unsigned char IMAGE_NAME[] = { -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x3, -0x2, -0x2, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x2, -0x5, -0x7, -0xc, -0xb, -0xb, -0x7, -0x5, -0x2, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x2, -0x7, -0xb, -0xe, -0x11, -0x16, -0x16, -0x15, -0x11, -0xe, -0xa, -0x6, -0x2, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x3, -0x8, -0x10, -0x14, -0x17, -0x1a, -0x20, -0x21, -0x1e, -0x1a, -0x17, -0x14, -0xe, -0x8, -0x3, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x2, -0x8, -0x10, -0x16, -0x20, -0x22, -0x26, -0x2d, -0x2f, -0x2b, -0x26, -0x21, -0x1b, -0x16, -0x10, -0x8, -0x2, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x7, -0xf, -0x16, -0x1f, -0x28, -0x30, -0x35, -0x3d, -0x40, -0x3d, -0x36, -0x2d, -0x26, -0x1f, -0x16, -0xf, -0x7, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x4, -0xc, -0x15, -0x1c, -0x28, -0x31, -0x41, -0x46, -0x4f, -0x54, -0x50, -0x47, -0x3f, -0x31, -0x28, -0x1c, -0x15, -0xc, -0x4, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x7, -0x11, -0x1a, -0x25, -0x31, -0x3e, -0x4d, -0x60, -0x66, -0x79, -0x64, -0x5e, -0x4d, -0x3e, -0x31, -0x25, -0x1a, -0x11, -0x7, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x2, -0xb, -0x14, -0x1f, -0x2a, -0x39, -0x4a, -0x63, -0x76, -0x94, -0xa4, -0x8c, -0x76, -0x5a, -0x4a, -0x39, -0x2a, -0x1f, -0x14, -0xb, -0x2, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x4, -0xe, -0x16, -0x21, -0x2f, -0x40, -0x54, -0x6a, -0x91, -0xcf, -0xd9, -0xc5, -0x95, -0x76, -0x54, -0x40, -0x2f, -0x21, -0x16, -0xe, -0x4, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x6, -0x10, -0x1b, -0x27, -0x35, -0x47, -0x60, -0x81, -0xc1, -0xeb, -0xff, -0xe8, -0xb8, -0x73, -0x5d, -0x44, -0x31, -0x23, -0x17, -0xe, -0x4, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x4, -0xe, -0x17, -0x27, -0x38, -0x4e, -0x69, -0x95, -0xc7, -0xec, -0xff, -0xe6, -0xbe, -0x81, -0x5c, -0x45, -0x31, -0x23, -0x17, -0xe, -0x4, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x3, -0xb, -0x16, -0x1c, -0x2a, -0x3a, -0x4e, -0x5b, -0x73, -0x9a, -0xd1, -0xf9, -0xc0, -0x9d, -0x70, -0x5d, -0x4b, -0x32, -0x22, -0x16, -0xe, -0x4, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x6, -0x13, -0x1c, -0x21, -0x2a, -0x43, -0x53, -0x64, -0x7c, -0xa7, -0x97, -0x94, -0x7a, -0x64, -0x52, -0x3c, -0x2e, -0x1f, -0x14, -0xb, -0x2, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x7, -0x11, -0x1e, -0x2c, -0x33, -0x46, -0x55, -0x69, -0x72, -0x6d, -0x6c, -0x62, -0x54, -0x46, -0x33, -0x25, -0x1a, -0x11, -0x7, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x4, -0x11, -0x15, -0x1c, -0x28, -0x34, -0x47, -0x56, -0x55, -0x55, -0x54, -0x4b, -0x47, -0x34, -0x28, -0x1c, -0x15, -0xc, -0x4, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x2, -0x7, -0xf, -0x16, -0x1f, -0x2a, -0x34, -0x42, -0x3f, -0x3f, -0x3f, -0x3d, -0x30, -0x29, -0x1f, -0x16, -0xf, -0x7, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x2, -0x8, -0x10, -0x16, -0x1e, -0x25, -0x2e, -0x2c, -0x2c, -0x2c, -0x28, -0x21, -0x1b, -0x16, -0x10, -0x8, -0x2, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x3, -0x8, -0xe, -0x14, -0x19, -0x1c, -0x1c, -0x1c, -0x1c, -0x1a, -0x17, -0x14, -0xe, -0x8, -0x3, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x2, -0x6, -0xa, -0x11, -0x11, -0x13, -0x13, -0x13, -0x11, -0xe, -0xa, -0x6, -0x2, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x2, -0xa, -0x7, -0x8, -0x8, -0x8, -0x7, -0x5, -0x2, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x1, -0x1, -0x1, -0x1, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x59, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x2, -0x5, -0x6, -0x4, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x9, -0x11, -0x19, -0x1b, -0x14, -0xc, -0x3, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x8, -0x17, -0x27, -0x31, -0x35, -0x2b, -0x1e, -0xf, -0x3, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x3, -0x13, -0x26, -0x3f, -0x57, -0x60, -0x4c, -0x32, -0x1c, -0xa, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x8, -0x1a, -0x35, -0x5b, -0x9b, -0xb4, -0x77, -0x46, -0x26, -0x11, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0xa, -0x20, -0x41, -0x78, -0xd8, -0xf3, -0x9a, -0x51, -0x2a, -0x13, -0x2, -0x0, -0x0, -0x0, -0x0, -0x1, -0xe, -0x20, -0x3d, -0x62, -0xa4, -0xb9, -0x7b, -0x4e, -0x28, -0x11, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x3, -0x15, -0x29, -0x46, -0x62, -0x60, -0x52, -0x35, -0x1c, -0xa, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x8, -0x17, -0x28, -0x37, -0x35, -0x2e, -0x1e, -0xf, -0x3, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x8, -0x12, -0x17, -0x18, -0x14, -0xc, -0x3, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x3, -0x4, -0x5, -0x4, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x16, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x3, -0xd, -0xf, -0x4, -0x0, -0x0, -0x0, -0x1, -0x16, -0x3c, -0x44, -0x1f, -0x3, -0x0, -0x0, -0x4, -0x2c, -0x92, -0xae, -0x3a, -0xa, -0x0, -0x0, -0x4, -0x27, -0x6c, -0x7a, -0x32, -0x7, -0x0, -0x0, -0x0, -0xa, -0x22, -0x24, -0xf, -0x1, -0x0, -0x0, -0x0, -0x0, -0x2, -0x2, -0x0, -0x0, -0x0, -0x5, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x4, -0x5, -0x0, -0x1, -0x44, -0x53, -0x3, -0x1, -0x30, -0x38, -0x2, -0x1, -0x0, -0x0, -0x0, -0x12, -0x17, -0xd, -0xf, -0x11, -0x0, -0x0, -0x0 -}; - -#undef RAW_NAME -#undef IMAGE_NAME -#define RAW_NAME shadow_3dfinfo_raw -#define IMAGE_NAME shadow_3dfinfo_image -unsigned char RAW_NAME[] = { -0x40, -0x0, -0x0, -0x0, -0x20, -0x0, -0x0, -0x0, -0x8, -0x0, -0x0, -0x0, -0x2, -0x0, -0x0, -0x0, -0x2, -0x0, -0x0, -0x0, -0x3, -0x0, -0x0, -0x0, -0xff, -0x1, -0xfc, -0x1, -0xee, -0x1, -0x19, -0x0, -0x10, -0x0, -0xe5, -0x1, -0x11, -0x0, -0x6, -0x0, -0xe8, -0x1, -0x9, -0x0, -0x8, -0x0, -0xeb, -0x1, -0x1, -0x0, -0x4, -0x0, -0x22, -0x22, -0x2b, -0x3c, -0x44, -0x44, -0x66, -0x77, -0x88, -0x99, -0xaa, -0xbb, -0xcc, -0xdd, -0xee, -0xff, -0x23, -0x4e, -0x3c, -0x7, -0xef, -0x1, -0x4, -0x0, -0x12, -0x1c, -0x88, -0x7, -0xfc, -0xff, -0xd3, -0x7, -0x10, -0x32, -0xb8, -0x7, -0x6, -0x22, -0x94, -0x7, -0x8, -0x12, -0xa0, -0x7, -0x4, -0x2, -0xac, -0x7, -0x62, -0x0, -0x0, -0x0, -0x63, -0x0, -0x0, -0x0, -0x64, -0x0, -0x0, -0x0, -0x65, -0x0, -0x0, -0x0, -0x66, -0x0, -0x0, -0x0, -0x67, -0x0, -0x0, -0x0, -0x69, -0x0, -0x0, -0x0, -0x6a, -0x0, -0x0, -0x0, -0x6b, -0x0, -0x0, -0x0, -0x6c, -0x0, -0x0, -0x0, -0x6d, -0x0, -0x0, -0x0, -0x6e, -0x0, -0x0, -0x0, -0x6f, -0x0, -0x0, -0x0, -0x70, -0x0, -0x0, -0x0, -0x71, -0x0, -0x0, -0x0, -0x72, -0x0, -0x0, -0x0, -0x73, -0x0, -0x0, -0x0, -0x74, -0x0, -0x0, -0x0, -0x75, -0x0, -0x0, -0x0, -0x76, -0x0, -0x0, -0x0, -0x77, -0x0, -0x0, -0x0, -0x78, -0x0, -0x0, -0x0, -0x79, -0x0, -0x0, -0x0, -0x7a, -0x0, -0x0, -0x0, -0x7b, -0x0, -0x0, -0x0, -0x7c, -0x0, -0x0, -0x0, -0x7d, -0x0, -0x0, -0x0, -0x7e, -0x0, -0x0, -0x0, -0x7f, -0x0, -0x0, -0x0, -0x80, -0x0, -0x0, -0x0, -0x81, -0x0, -0x0, -0x0, -0x82, -0x0, -0x0, -0x0, -0x83, -0x0, -0x0, -0x0, -0x84, -0x0, -0x0, -0x0, -0x85, -0x0, -0x0, -0x0, -0x86, -0x0, -0x0, -0x0, -0x87, -0x0, -0x0, -0x0, -0x87, -0x0, -0x0, -0x0, -0x88, -0x0, -0x0, -0x0, -0x89, -0x0, -0x0, -0x0, -0x8a, -0x0, -0x0, -0x0, -0x8b, -0x0, -0x0, -0x0, -0x8c, -0x0, -0x0, -0x0, -0x8d, -0x0, -0x0, -0x0, -0x8e, -0x0, -0x0, -0x0, -0x8f, -0x0, -0x0, -0x0, -0x90, -0x0, -0x0, -0x0, -0x90, -0x0, -0x0, -0x0, -0x91, -0x0, -0x0, -0x0, -0x92, -0x0, -0x0, -0x0, -0x93, -0x0, -0x0, -0x0, -0x94, -0x0, -0x0, -0x0, -0x95, -0x0, -0x0, -0x0, -0x96, -0x0, -0x0, -0x0, -0x96, -0x0, -0x0, -0x0, -0x97, -0x0, -0x0, -0x0, -0xeb, -0xa5, -0x40, -0x0, -0x41, -0x0, -0x0, -0x0, -0xc0, -0x4f, -0x55, -0x0, -0xb8, -0xfc, -0x7b, -0x0, -0xd4, -0xfc, -0x7b, -0x0, -0xc, -0x0, -0x0, -0x0, -0xc0, -0x4f, -0x55, -0x0, -0x0, -0x0, -0x0, -0x0, -0x94, -0xa4, -0x40, -0x0, -0x12, -0x9f, -0x40, -0x0, -0x12, -0x9f, -0x40, -0x0, -0xa, -0x0, -0x0, -0x0, -0xc0, -0x4f, -0x55, -0x0, -0xbc, -0xfc, -0x7b, -0x0, -0xc0, -0x4f, -0x55, -0x0, -0x1, -0x0, -0x0, -0x0, -0x68, -0x82, -0xe2, -0x0, -0xa6, -0x0, -0x0, -0x0, -0xa7, -0x0, -0x0, -0x0, -0xa8, -0x0, -0x0, -0x0, -0xa8, -0x0, -0x0, -0x0, -0xa9, -0x0, -0x0, -0x0, -0xaa, -0x0, -0x0, -0x0, -0xab, -0x0, -0x0, -0x0, -0xac, -0x0, -0x0, -0x0, -0xac, -0x0, -0x0, -0x0, -0xad, -0x0, -0x0, -0x0, -0xae, -0x0, -0x0, -0x0, -0xaf, -0x0, -0x0, -0x0, -0xaf, -0x0, -0x0, -0x0, -0xb0, -0x0, -0x0, -0x0, -0xb1, -0x0, -0x0, -0x0, -0xb2, -0x0, -0x0, -0x0, -0xb2, -0x0, -0x0, -0x0, -0xb3, -0x0, -0x0, -0x0, -0xb4, -0x0, -0x0, -0x0, -0xb5, -0x0, -0x0, -0x0, -0xb5, -0x0, -0x0, -0x0, -0xb6, -0x0, -0x0, -0x0, -0xb7, -0x0, -0x0, -0x0, -0xb8, -0x0, -0x0, -0x0, -0xb8, -0x0, -0x0, -0x0, -0xb9, -0x0, -0x0, -0x0, -0xba, -0x0, -0x0, -0x0, -0xbb, -0x0, -0x0, -0x0, -0xbb, -0x0, -0x0, -0x0, -0xbc, -0x0, -0x0, -0x0, -0xbd, -0x0, -0x0, -0x0, -0xbe, -0x0, -0x0, -0x0, -0xbe, -0x0, -0x0, -0x0, -0xbf, -0x0, -0x0, -0x0, -0xc0, -0x0, -0x0, -0x0, -0xc0, -0x0, -0x0, -0x0, -0xc1, -0x0, -0x0, -0x0, -0xc2, -0x0, -0x0, -0x0, -0xc3, -0x0, -0x0, -0x0, -0xc3, -0x0, -0x0, -0x0, -0xc4, -0x0, -0x0, -0x0, -0xc5, -0x0, -0x0, -0x0, -0xc5, -0x0, -0x0, -0x0, -0xc6, -0x0, -0x0, -0x0, -0xc7, -0x0, -0x0, -0x0, -0xc7, -0x0, -0x0, -0x0, -0xc8, -0x0, -0x0, -0x0, -0xc9, -0x0, -0x0, -0x0, -0xca, -0x0, -0x0, -0x0, -0xca, -0x0, -0x0, -0x0, -0xcb, -0x0, -0x0, -0x0, -0xcc, -0x0, -0x0, -0x0, -0xcc, -0x0, -0x0, -0x0, -0xcd, -0x0, -0x0, -0x0, -0xce, -0x0, -0x0, -0x0, -0xce, -0x0, -0x0, -0x0, -0xcf, -0x0, -0x0, -0x0, -0xd0, -0x0, -0x0, -0x0, -0xd0, -0x0, -0x0, -0x0, -0xd1, -0x0, -0x0, -0x0, -0xd2, -0x0, -0x0, -0x0, -0xd2, -0x0, -0x0, -0x0, -0xd3, -0x0, -0x0, -0x0, -0xd4, -0x0, -0x0, -0x0, -0xd4, -0x0, -0x0, -0x0, -0xd5, -0x0, -0x0, -0x0, -0xd6, -0x0, -0x0, -0x0, -0xd6, -0x0, -0x0, -0x0, -0xd7, -0x0, -0x0, -0x0, -0xd8, -0x0, -0x0, -0x0, -0xd8, -0x0, -0x0, -0x0, -0xd9, -0x0, -0x0, -0x0, -0xda, -0x0, -0x0, -0x0, -0xda, -0x0, -0x0, -0x0, -0xdb, -0x0, -0x0, -0x0, -0xdc, -0x0, -0x0, -0x0, -0xdc, -0x0, -0x0, -0x0, -0xdd, -0x0, -0x0, -0x0, -0xde, -0x0, -0x0, -0x0, -0xde, -0x0, -0x0, -0x0, -0xdf, -0x0, -0x0, -0x0, -0xe0, -0x0, -0x0, -0x0, -0xe0, -0x0, -0x0, -0x0, -0xe1, -0x0, -0x0, -0x0, -0xe2, -0x0, -0x0, -0x0, -0xe2, -0x0, -0x0, -0x0, -0xe3, -0x0, -0x0, -0x0, -0xe3, -0x0, -0x0, -0x0, -0xe4, -0x0, -0x0, -0x0, -0xe5, -0x0, -0x0, -0x0, -0xe5, -0x0, -0x0, -0x0, -0xe6, -0x0, -0x0, -0x0, -0xe7, -0x0, -0x0, -0x0, -0xe7, -0x0, -0x0, -0x0, -0xe8, -0x0, -0x0, -0x0, -0xe9, -0x0, -0x0, -0x0, -0xe9, -0x0, -0x0, -0x0, -0xea, -0x0, -0x0, -0x0, -0xea, -0x0, -0x0, -0x0, -0xeb, -0x0, -0x0, -0x0, -0xec, -0x0, -0x0, -0x0, -0xec, -0x0, -0x0, -0x0, -0xed, -0x0, -0x0, -0x0, -0xee, -0x0, -0x0, -0x0, -0xee, -0x0, -0x0, -0x0, -0xef, -0x0, -0x0, -0x0, -0xef, -0x0, -0x0, -0x0, -0xf0, -0x0, -0x0, -0x0, -0xf1, -0x0, -0x0, -0x0, -0xf1, -0x0, -0x0, -0x0, -0xf2, -0x0, -0x0, -0x0, -0xf2, -0x0, -0x0, -0x0, -0xf3, -0x0, -0x0, -0x0, -0xf4, -0x0, -0x0, -0x0, -0xf4, -0x0, -0x0, -0x0, -0xf5, -0x0, -0x0, -0x0, -0xf5, -0x0, -0x0, -0x0, -0xf6, -0x0, -0x0, -0x0, -0xf7, -0x0, -0x0, -0x0, -0xf7, -0x0, -0x0, -0x0, -0xf8, -0x0, -0x0, -0x0, -0xf8, -0x0, -0x0, -0x0, -0xf9, -0x0, -0x0, -0x0, -0xfa, -0x0, -0x0, -0x0, -0xfa, -0x0, -0x0, -0x0, -0xfb, -0x0, -0x0, -0x0, -0xfb, -0x0, -0x0, -0x0, -0xfc, -0x0, -0x0, -0x0, -0xfd, -0x0, -0x0, -0x0, -0xfd, -0x0, -0x0, -0x0, -0xfe, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1b, -0x0, -0x0, -0x0, -0x1b, -0x0, -0x0, -0x0, -0x0, -0x0, -0x41, -0x0, -0x41, -0x95, -0x40, -0x0, -0x2, -0x0, -0x0, -0x0, -0x40, -0x69, -0xa0, -0x0, -0x1a, -0x0, -0x0, -0x0, -0xc0, -0x4f, -0x55, -0x0, -0xc0, -0x4f, -0x55, -0x0, -0x1a, -0x0, -0x0, -0x0, -0xd8, -0x9c, -0x40, -0x0, -0xc0, -0x4f, -0x55, -0x0, -0x1, -0x0, -0x0, -0x0, -0xfd, -0x90, -0x40, -0x0, -0x1, -0x0, -0x0, -0x0, -0xc0, -0x4f, -0x55, -0x0, -0x3c, -0x83, -0xe2, -0x0, -0x48, -0x8, -0x0, -0x0, -0x68, -0x82, -0xe2, -0x0, -0xf, -0x21, -0x40, -0x0, -0xc0, -0x4f, -0x55, -0x0, -0xec, -0x41, -0x55, -0x0, -0x38, -0xfe, -0x7b, -0x0, -0x74, -0xe4, -0x61, -0x81, -0x94, -0xdf, -0x61, -0x81, -0x0, -0x0, -0x6b, -0x0, -0x40, -0xc4, -0xa0, -0x0, -0xb0, -0xa, -0x0, -0x0 -}; - -unsigned char IMAGE_NAME[] = { -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xfb, -0xfa, -0xfa, -0xfb, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xfd, -0xfd, -0xfd, -0xfd, -0xfd, -0xfd, -0xfd, -0xfd, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xf4, -0xe4, -0xd7, -0xd0, -0xcf, -0xd6, -0xe2, -0xf2, -0xfc, -0xff, -0xff, -0xfb, -0xe8, -0xdf, -0xdf, -0xdf, -0xdf, -0xde, -0xdf, -0xe0, -0xe2, -0xe7, -0xee, -0xf5, -0xfa, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf1, -0xc0, -0x94, -0x80, -0x79, -0x78, -0x7f, -0x91, -0xb1, -0xda, -0xf8, -0xfd, -0xe7, -0xab, -0x8c, -0x89, -0x89, -0x89, -0x89, -0x89, -0x8b, -0x8e, -0x96, -0xa1, -0xb4, -0xcf, -0xe8, -0xf9, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xe3, -0x93, -0x60, -0x58, -0x58, -0x57, -0x55, -0x59, -0x6b, -0x96, -0xd4, -0xf7, -0xdc, -0x88, -0x5d, -0x59, -0x59, -0x5a, -0x5a, -0x5b, -0x5b, -0x5b, -0x5d, -0x60, -0x6a, -0x7e, -0xa0, -0xcc, -0xf0, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xe2, -0x96, -0x72, -0x7a, -0x7e, -0x74, -0x60, -0x53, -0x53, -0x66, -0xa3, -0xe8, -0xdb, -0x84, -0x57, -0x52, -0x54, -0x5d, -0x67, -0x69, -0x68, -0x65, -0x5f, -0x59, -0x56, -0x58, -0x64, -0x86, -0xbc, -0xed, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xfa, -0xf7, -0xf4, -0xf3, -0xf6, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xef, -0xc8, -0xc1, -0xd1, -0xd6, -0xc4, -0x95, -0x62, -0x52, -0x57, -0x84, -0xd7, -0xd9, -0x84, -0x57, -0x52, -0x5b, -0x82, -0xac, -0xb6, -0xb4, -0xac, -0x9c, -0x83, -0x68, -0x58, -0x55, -0x5d, -0x7f, -0xc0, -0xf3, -0xff, -0xff, -0xff, -0xff, -0xf9, -0xe5, -0xcc, -0xba, -0xb0, -0xaf, -0xc4, -0xeb, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xf7, -0xf8, -0xfb, -0xfc, -0xf5, -0xc9, -0x79, -0x55, -0x54, -0x7c, -0xd0, -0xd8, -0x85, -0x58, -0x52, -0x61, -0xa1, -0xe7, -0xf6, -0xf6, -0xf3, -0xe9, -0xd1, -0xa5, -0x72, -0x58, -0x54, -0x5f, -0x8d, -0xd6, -0xfb, -0xff, -0xff, -0xf8, -0xd2, -0x9f, -0x7e, -0x77, -0x7b, -0x81, -0xa8, -0xe5, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf9, -0xd0, -0x7d, -0x55, -0x57, -0x88, -0xda, -0xd9, -0x85, -0x58, -0x53, -0x61, -0xa7, -0xf2, -0xff, -0xff, -0xff, -0xfe, -0xf9, -0xe2, -0xa7, -0x6a, -0x55, -0x56, -0x6c, -0xb2, -0xf2, -0xff, -0xfd, -0xe2, -0x9a, -0x69, -0x6c, -0x95, -0xb3, -0xbd, -0xd0, -0xed, -0xf5, -0xf8, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xfa, -0xf7, -0xf6, -0xf9, -0xfe, -0xfe, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf6, -0xda, -0xa6, -0x69, -0x55, -0x69, -0xaa, -0xeb, -0xdc, -0x85, -0x58, -0x52, -0x61, -0xa7, -0xf1, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfa, -0xd4, -0x87, -0x5b, -0x55, -0x5d, -0x93, -0xe3, -0xfd, -0xfa, -0xcc, -0x7a, -0x5e, -0x85, -0xd1, -0xf3, -0xf0, -0xd8, -0xbf, -0xb7, -0xc4, -0xe5, -0xfc, -0xff, -0xff, -0xf4, -0xd2, -0xbb, -0xbc, -0xd6, -0xf1, -0xf2, -0xf0, -0xf8, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfa, -0xd1, -0x94, -0x6b, -0x57, -0x64, -0x97, -0xd9, -0xf8, -0xdc, -0x84, -0x57, -0x52, -0x61, -0xa7, -0xf1, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xec, -0xa1, -0x62, -0x54, -0x58, -0x80, -0xd4, -0xf8, -0xef, -0xbb, -0x70, -0x5f, -0x8e, -0xda, -0xf4, -0xf2, -0xd5, -0x9d, -0x77, -0x7a, -0xaa, -0xe4, -0xfc, -0xf4, -0xc8, -0x8c, -0x76, -0x93, -0xcc, -0xf2, -0xf2, -0xed, -0xf6, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf6, -0xb8, -0x6b, -0x53, -0x56, -0x75, -0xb9, -0xf1, -0xfc, -0xdb, -0x84, -0x57, -0x52, -0x61, -0xa7, -0xf1, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf5, -0xb0, -0x67, -0x55, -0x57, -0x77, -0xc7, -0xde, -0xba, -0x90, -0x65, -0x5b, -0x77, -0xa3, -0xb5, -0xcb, -0xe5, -0xc8, -0x8e, -0x68, -0x75, -0xaf, -0xdd, -0xcc, -0x8e, -0x6c, -0x85, -0xbe, -0xed, -0xfe, -0xfd, -0xfc, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf7, -0xba, -0x6e, -0x54, -0x53, -0x64, -0x93, -0xd0, -0xf5, -0xdc, -0x84, -0x57, -0x52, -0x61, -0xa7, -0xf1, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf6, -0xb4, -0x69, -0x56, -0x56, -0x74, -0xc0, -0xc7, -0x8f, -0x6e, -0x5b, -0x58, -0x64, -0x76, -0x80, -0xa6, -0xe7, -0xf2, -0xcc, -0x90, -0x6a, -0x77, -0x98, -0x8a, -0x70, -0x88, -0xc2, -0xef, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfb, -0xd8, -0xa0, -0x76, -0x59, -0x53, -0x63, -0x96, -0xdc, -0xd9, -0x84, -0x57, -0x52, -0x61, -0xa7, -0xf1, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf2, -0xab, -0x65, -0x55, -0x57, -0x79, -0xca, -0xdf, -0xbd, -0x91, -0x65, -0x5b, -0x78, -0xa6, -0xb8, -0xce, -0xf3, -0xff, -0xf5, -0xcd, -0x8d, -0x65, -0x64, -0x66, -0x83, -0xc4, -0xf2, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfa, -0xe5, -0xb9, -0x77, -0x55, -0x53, -0x70, -0xbb, -0xd2, -0x85, -0x57, -0x52, -0x61, -0xa7, -0xf1, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xe3, -0x95, -0x5e, -0x54, -0x59, -0x85, -0xd8, -0xf9, -0xf0, -0xba, -0x6f, -0x5f, -0x90, -0xdd, -0xf4, -0xf9, -0xff, -0xff, -0xfe, -0xe7, -0xa4, -0x6a, -0x5c, -0x63, -0x91, -0xd9, -0xfb, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xe5, -0x96, -0x5c, -0x51, -0x62, -0xa5, -0xca, -0x84, -0x57, -0x52, -0x61, -0xa7, -0xf1, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf3, -0xc0, -0x77, -0x58, -0x54, -0x61, -0x9c, -0xe8, -0xfe, -0xf8, -0xc2, -0x71, -0x60, -0x95, -0xe7, -0xfe, -0xff, -0xff, -0xfe, -0xed, -0xbf, -0x84, -0x6a, -0x70, -0x68, -0x74, -0xab, -0xe1, -0xfa, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfb, -0xf8, -0xfd, -0xff, -0xff, -0xfe, -0xe8, -0x99, -0x5d, -0x52, -0x60, -0xa1, -0xc9, -0x84, -0x57, -0x52, -0x61, -0xa6, -0xef, -0xfd, -0xfd, -0xfc, -0xf9, -0xee, -0xc9, -0x8b, -0x5f, -0x54, -0x57, -0x74, -0xbd, -0xf5, -0xff, -0xf8, -0xc2, -0x71, -0x60, -0x95, -0xe7, -0xfe, -0xff, -0xfc, -0xe8, -0xb8, -0x81, -0x6f, -0x91, -0xb2, -0x96, -0x6e, -0x73, -0xa4, -0xdb, -0xf9, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfb, -0xe0, -0xca, -0xdd, -0xef, -0xf5, -0xeb, -0xc3, -0x7d, -0x56, -0x52, -0x66, -0xad, -0xcd, -0x85, -0x57, -0x52, -0x5f, -0x97, -0xd3, -0xe1, -0xdf, -0xd9, -0xca, -0xad, -0x83, -0x61, -0x55, -0x55, -0x66, -0x9d, -0xe1, -0xfd, -0xff, -0xf8, -0xc2, -0x71, -0x60, -0x95, -0xe7, -0xfe, -0xfd, -0xe6, -0xb3, -0x7d, -0x6d, -0x93, -0xd0, -0xef, -0xd6, -0x98, -0x6c, -0x71, -0xa0, -0xd9, -0xf9, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf8, -0xc2, -0x85, -0x8c, -0xa4, -0xad, -0xa0, -0x7e, -0x5c, -0x51, -0x56, -0x7d, -0xc9, -0xd5, -0x84, -0x57, -0x52, -0x58, -0x6e, -0x87, -0x8c, -0x8a, -0x83, -0x77, -0x68, -0x5a, -0x54, -0x58, -0x68, -0x94, -0xd3, -0xf9, -0xff, -0xff, -0xf8, -0xc2, -0x71, -0x60, -0x95, -0xe7, -0xfd, -0xf5, -0xcd, -0x9b, -0x86, -0x9d, -0xd1, -0xf6, -0xff, -0xf8, -0xd4, -0x9e, -0x84, -0x91, -0xbd, -0xed, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf7, -0xbe, -0x6f, -0x5a, -0x5f, -0x63, -0x5f, -0x56, -0x53, -0x58, -0x71, -0xac, -0xe9, -0xdb, -0x84, -0x57, -0x53, -0x54, -0x57, -0x5b, -0x5b, -0x5b, -0x5a, -0x58, -0x57, -0x5a, -0x63, -0x79, -0xa3, -0xd5, -0xf7, -0xff, -0xff, -0xff, -0xf8, -0xc2, -0x71, -0x60, -0x95, -0xe7, -0xfd, -0xfa, -0xe6, -0xd6, -0xd5, -0xe4, -0xf8, -0xff, -0xff, -0xff, -0xf9, -0xe4, -0xd5, -0xd4, -0xe0, -0xf6, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfa, -0xd2, -0x8f, -0x6d, -0x61, -0x5e, -0x5d, -0x61, -0x6c, -0x85, -0xb2, -0xe3, -0xf9, -0xdf, -0x92, -0x6a, -0x66, -0x67, -0x67, -0x67, -0x67, -0x69, -0x6c, -0x70, -0x78, -0x89, -0xa4, -0xc5, -0xe6, -0xfa, -0xff, -0xff, -0xff, -0xff, -0xf8, -0xc1, -0x71, -0x60, -0x95, -0xe7, -0xfe, -0xff, -0xfc, -0xfb, -0xfb, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xfb, -0xfb, -0xfc, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf4, -0xd8, -0xbe, -0xaa, -0xa0, -0xa0, -0xa9, -0xbb, -0xd5, -0xef, -0xfd, -0xfe, -0xf0, -0xc8, -0xb4, -0xb2, -0xb2, -0xb3, -0xb3, -0xb3, -0xb6, -0xbb, -0xc3, -0xcd, -0xdc, -0xec, -0xf8, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf9, -0xc9, -0x83, -0x73, -0xa2, -0xea, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfc, -0xf7, -0xf2, -0xee, -0xee, -0xf1, -0xf7, -0xfb, -0xff, -0xff, -0xff, -0xfe, -0xf8, -0xf5, -0xf5, -0xf5, -0xf5, -0xf5, -0xf5, -0xf6, -0xf7, -0xf8, -0xfa, -0xfc, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xe7, -0xc5, -0xbd, -0xd4, -0xf6, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfa, -0xf6, -0xf6, -0xf9, -0xfd, -0xfe, -0xff, -0xff, -0xff, -0xfe, -0xfe, -0xff, -0xff, -0xfe, -0xfd, -0xfc, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xf4, -0xf1, -0xf2, -0xf3, -0xee, -0xf0, -0xf4, -0xf6, -0xf5, -0xf4, -0xf3, -0xf7, -0xf6, -0xf1, -0xea, -0xea, -0xf0, -0xf6, -0xf7, -0xf5, -0xfa, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfc, -0xe7, -0xd4, -0xce, -0xd0, -0xcb, -0xcd, -0xcd, -0xd3, -0xd4, -0xd9, -0xd3, -0xd7, -0xd8, -0xd6, -0xcc, -0xd0, -0xd4, -0xd5, -0xd3, -0xd0, -0xe7, -0xfc, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfb, -0xde, -0xc5, -0xc0, -0xc4, -0xc2, -0xc1, -0xbc, -0xc5, -0xcb, -0xd5, -0xc3, -0xbf, -0xcb, -0xd7, -0xcb, -0xca, -0xc7, -0xbf, -0xbf, -0xbe, -0xe0, -0xfb, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfb, -0xe3, -0xcf, -0xce, -0xd0, -0xcc, -0xc9, -0xc9, -0xd5, -0xda, -0xd9, -0xc2, -0xc2, -0xcd, -0xd8, -0xd0, -0xd2, -0xd7, -0xd2, -0xd3, -0xcf, -0xe9, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf6, -0xee, -0xee, -0xef, -0xeb, -0xe8, -0xe8, -0xef, -0xf2, -0xef, -0xe3, -0xe6, -0xe9, -0xeb, -0xe8, -0xec, -0xf4, -0xf4, -0xf3, -0xeb, -0xf6, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xfe, -0xfe, -0xfd, -0xfd, -0xfd, -0xfe, -0xfe, -0xfe, -0xfc, -0xfd, -0xfd, -0xfd, -0xfd, -0xfd, -0xff, -0xff, -0xff, -0xfd, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xfd, -0xff, -0xff, -0xff, -0xfe, -0xfe, -0xfe, -0xfe, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfb, -0xcb, -0xa8, -0xa7, -0xc6, -0xf3, -0xf8, -0xc0, -0xb4, -0xb4, -0xb5, -0xbb, -0xce, -0xec, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf0, -0x7f, -0x6a, -0x60, -0x5b, -0x9d, -0xe6, -0x70, -0x56, -0x5e, -0x62, -0x5f, -0x5e, -0x77, -0xc0, -0xfa, -0xff, -0xff, -0xff, -0xfc, -0xf9, -0xfc, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfb, -0xde, -0xe8, -0xc6, -0x61, -0x6b, -0xd6, -0x6e, -0x58, -0xae, -0xd6, -0xc9, -0x98, -0x5e, -0x64, -0xc6, -0xfe, -0xfd, -0xd4, -0x9f, -0x97, -0xcf, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xd2, -0x64, -0x7d, -0xdf, -0x6f, -0x5a, -0xcc, -0xff, -0xff, -0xf5, -0x9b, -0x57, -0x84, -0xf4, -0xe9, -0x77, -0x96, -0xd5, -0xd5, -0xda, -0xf7, -0xff, -0xf0, -0xd9, -0xf0, -0xf7, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xde, -0x6f, -0x62, -0xc7, -0xeb, -0x6e, -0x5a, -0xcc, -0xff, -0xff, -0xff, -0xcd, -0x5d, -0x6a, -0xdc, -0xbd, -0x64, -0xa1, -0xda, -0xc8, -0x7a, -0xad, -0xe6, -0x94, -0x93, -0xea, -0xf6, -0xfc, -0xff, -0xff, -0xff, -0xff, -0xe1, -0x76, -0x59, -0x97, -0xe2, -0x6e, -0x5a, -0xcc, -0xff, -0xff, -0xff, -0xd2, -0x5e, -0x67, -0xcc, -0x93, -0x5d, -0x7e, -0xab, -0xf3, -0xc8, -0x75, -0x7b, -0x90, -0xe9, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xe0, -0x70, -0x5e, -0xbf, -0x6e, -0x5a, -0xcc, -0xff, -0xff, -0xfc, -0xac, -0x58, -0x77, -0xee, -0xd9, -0x68, -0xba, -0xfb, -0xff, -0xe4, -0x7f, -0x66, -0xa2, -0xf5, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf5, -0xe7, -0xf9, -0xe5, -0x72, -0x5b, -0xb9, -0x6e, -0x59, -0xc0, -0xef, -0xe6, -0xba, -0x68, -0x5a, -0xac, -0xfc, -0xdd, -0x69, -0xbe, -0xfe, -0xdf, -0x89, -0x99, -0xc3, -0x79, -0xa4, -0xf3, -0xff, -0xff, -0xff, -0xff, -0xdc, -0x77, -0x85, -0x75, -0x56, -0x7c, -0xd9, -0x6e, -0x54, -0x6a, -0x73, -0x6b, -0x5d, -0x62, -0x9d, -0xf1, -0xff, -0xdd, -0x69, -0xbe, -0xfa, -0xc9, -0xb7, -0xf0, -0xfd, -0xd4, -0xb0, -0xe0, -0xff, -0xff, -0xff, -0xff, -0xf0, -0xa5, -0x82, -0x82, -0xa0, -0xe0, -0xf2, -0x9e, -0x8c, -0x8d, -0x8e, -0x97, -0xab, -0xd3, -0xf7, -0xff, -0xff, -0xdf, -0x72, -0xc2, -0xff, -0xfd, -0xfe, -0xff, -0xff, -0xff, -0xfd, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfc, -0xf8, -0xf7, -0xfc, -0xff, -0xff, -0xfb, -0xfa, -0xfa, -0xfa, -0xfb, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xf7, -0xdc, -0xf0, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf5, -0xe1, -0xdf, -0xe0, -0xe5, -0xe5, -0xe7, -0xdf, -0xe0, -0xe5, -0xea, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xee, -0xc9, -0xc9, -0xc4, -0xd0, -0xcd, -0xc6, -0xd3, -0xcf, -0xc9, -0xd6, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xf6, -0xf5, -0xf3, -0xf7, -0xf3, -0xf2, -0xf3, -0xf7, -0xf9, -0xf7, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xdc, -0xda, -0xfa, -0xdc, -0xd9, -0xe2, -0xfa, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfa, -0xac, -0x79, -0xb1, -0x63, -0x91, -0x88, -0x7e, -0xef, -0xf4, -0xcb, -0xf2, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf6, -0x82, -0xc4, -0x64, -0xe6, -0xfd, -0x87, -0xb0, -0xa0, -0xba, -0xbc, -0xe2, -0xbc, -0xf2, -0xfe, -0xff, -0xf7, -0x88, -0xa6, -0x64, -0xe6, -0xfe, -0x8d, -0xa6, -0x8c, -0xb8, -0xe8, -0x75, -0xc4, -0xff, -0xff, -0xf4, -0xb7, -0x89, -0x9a, -0x62, -0xa3, -0x9a, -0x70, -0xe6, -0xa3, -0xdd, -0xba, -0xd2, -0xa8, -0xf4, -0xff, -0xfb, -0xc7, -0xc5, -0xf4, -0xc8, -0xc4, -0xcf, -0xf2, -0xff, -0xc9, -0xec, -0xfe, -0xff, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xe3, -0xd3, -0xda, -0xd8, -0xd7, -0xef, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfc, -0xfa, -0xfa, -0xf9, -0xfc, -0xfd, -0xff, -0xe0, -0xc0, -0xaa, -0xb9, -0xf8, -0xef, -0xff, -0xff, -0xfb, -0x9d, -0xa5, -0xc4, -0xa1, -0xc6, -0xb6, -0xfc, -0xdb, -0xb7, -0xa4, -0xb3, -0xd4, -0xe0, -0xde, -0xfc, -0xff, -0xff, -0xff, -0xff, -0xf7, -0xe8, -0xe9, -0xfb, -0xce, -0xb3, -0xd4, -0xec, -0xe4, -0xd5, -0xe5, -0xf0, -0xcf, -0xe5, -0xda, -0x0, -0x0, -0x0, -0x0, -0x0 -}; - -#undef RAW_NAME -#undef IMAGE_NAME diff --git a/glide2x/sst1/glide/src/sst96.c b/glide2x/sst1/glide/src/sst96.c deleted file mode 100644 index 7516cdc..0000000 --- a/glide2x/sst1/glide/src/sst96.c +++ /dev/null @@ -1,743 +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 9/19/97 12:38p Peter - * asm rush trisetup vs alt fifo - * - * 19 9/12/97 12:56p Dow - * Protected JUJU code - * - * 18 9/11/97 2:22p Atai - * fixed muckage - * - * 17 9/10/97 10:15p Peter - * fifo logic from GaryT - * - * 16 8/19/97 8:55p Peter - * lots of stuff, hopefully no muckage - * - * 15 8/01/97 11:49a Dow - * Allowed for non4K fifo wraps - * - * 14 7/08/97 1:29p Jdt - * Fixed watcom muckage - * - * 13 7/04/97 12:08p Dow - * Modified GWP debugging - * - * 12 6/20/97 5:54p Dow - * Moved grDebugGroupWriteHeader in here. - * - * 11 6/18/97 5:54p Dow - * P6 adjustments - * - * 10 5/27/97 2:03p Dow - * added new assertion - * - * 9 5/04/97 12:49p Dow - * Moved texture downloads to level 195, like on SST1 - * - * 8 4/13/97 2:06p Pgj - * eliminate all anonymous unions (use hwDep) - * - * 7 3/16/97 12:39a Jdt - * initWrapFifo only neads fifodata... - * - * 6 3/04/97 9:12p Dow - * Neutered mutiplatform multiheaded monster. - * - * 5 2/18/97 9:53a Jdt - * Removed some unecessary declarations. - * - * 4 2/14/97 12:55p Dow - * moved vg96 fifo wrap into init code - * - * 3 2/11/97 6:59p Dow - * Changes to support vid tiles and ser status - * - * 2 1/14/97 10:49a Dow - * Changed all output to use GDBG_INFO - * Renabled some messages - * - * 1 12/23/96 1:39p Dow - * Changes for multiplatform -** -*/ -/* gsst96.c - transport stuff for SST 96 */ - -#include -#include -#include <3dfx.h> - -#include -#include - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) - -#define GEN_INDEX(a) ((((FxU32) a) - ((FxU32) gc->reg_ptr)) >> 2) - -char -*regNames[] = { - "status", /* 0x00 */ - "reserved001", /* 0x01 */ - "vAx", /* 0x02 */ - "vAy", /* 0x03 */ - "vBx", /* 0x04 */ - "vBy", /* 0x05 */ - "vCx", /* 0x06 */ - "vCy", /* 0x07 */ - "r", /* 0x08 */ - "drdx", /* 0x09 */ - "drdy", /* 0x0a */ - "g", /* 0x0b */ - "dgdx", /* 0x0c */ - "dgdy", /* 0x0d */ - "b", /* 0x0e */ - "dbdx", /* 0x0f */ - "dbdy", /* 0x10 */ - "z", /* 0x11 */ - "dzdx", /* 0x12 */ - "dzdy", /* 0x13 */ - "a", /* 0x14 */ - "dadx", /* 0x15 */ - "dady", /* 0x16 */ - "s", /* 0x17 */ - "dsdx", /* 0x18 */ - "dsdy", /* 0x19 */ - "t", /* 0x1a */ - "dtdx", /* 0x1b */ - "dtdy", /* 0x1c */ - "w", /* 0x1d */ - "dwdx", /* 0x1e */ - "dwdy", /* 0x1f */ - "triangleCMD", /* 0x20 */ - "reserved021", /* 0x21 */ - "FvAx", /* 0x22 */ - "FvAy", /* 0x23 */ - "FvBx", /* 0x24 */ - "FvBy", /* 0x25 */ - "FvCx", /* 0x26 */ - "FvCy", /* 0x27 */ - "Fr", /* 0x28 */ - "Fdrdx", /* 0x29 */ - "Fdrdy", /* 0x2a */ - "Fg", /* 0x2b */ - "Fdgdx", /* 0x2c */ - "Fdgdy", /* 0x2d */ - "Fb", /* 0x2e */ - "Fdbdx", /* 0x2f */ - "Fdbdy", /* 0x30 */ - "Fz", /* 0x31 */ - "Fdzdx", /* 0x32 */ - "Fdzdy", /* 0x33 */ - "Fa", /* 0x34 */ - "Fdadx", /* 0x35 */ - "Fdady", /* 0x36 */ - "Fs", /* 0x37 */ - "Fdsdx", /* 0x38 */ - "Fdsdy", /* 0x39 */ - "Ft", /* 0x3a */ - "Fdtdx", /* 0x3b */ - "Fdtdy", /* 0x3c */ - "Fw", /* 0x3d */ - "Fdwdx", /* 0x3e */ - "Fdwdy", /* 0x3f */ - "FtriangleCMD", /* 0x40 */ - "reserved041", /* 0x41 */ - "nopCMD", /* 0x42 */ - "reserved043", /* 0x43 */ - "fastfillCMD", /* 0x44 */ - "reserved045", /* 0x45 */ - "swapbufferCMD", /* 0x46 */ - "reserved047", /* 0x47 */ - "swappendCMD", /* 0x48 */ - "reserved049", /* 0x49 */ - "reserved04A", /* 0x4a */ - "reserved04B", /* 0x4b */ - "reserved04C", /* 0x4c */ - "reserved04D", /* 0x4d */ - "reserved04E", /* 0x4e */ - "reserved04F", /* 0x4f */ - "fbzColorPath", /* 0x50 */ - "fogMode", /* 0x51 */ - "alphaMode", /* 0x52 */ - "reserved053", /* 0x53 */ - "fbzMode", /* 0x54 */ - "stipple", /* 0x55 */ - "color0", /* 0x56 */ - "color1", /* 0x57 */ - "fogColor", /* 0x58 */ - "zaColor", /* 0x59 */ - "chromaKey", /* 0x5a */ - "chromaRange", /* 0x5b */ - "reserved05C", /* 0x5c */ - "reserved05D", /* 0x5d */ - "reserved05E", /* 0x5e */ - "reserved05F", /* 0x5f */ - "colBufferSetup", /* 0x60 */ - "auxBufferSetup", /* 0x61 */ - "clipLeftRight0", /* 0x62 */ - "clipTopBottom0", /* 0x63 */ - "clipLeftRight1", /* 0x64 */ - "clipTopBottom1", /* 0x65 */ - "reserved066", /* 0x66 */ - "reserved067", /* 0x67 */ - "reserved068", /* 0x68 */ - "reserved069", /* 0x69 */ - "reserved06A", /* 0x6a */ - "reserved06B", /* 0x6b */ - "reserved06C", /* 0x6c */ - "reserved06D", /* 0x6d */ - "reserved06E", /* 0x6e */ - "reserved06F", /* 0x6f */ - "fogTable0001", /* 0x70 */ - "fogTable0203", /* 0x71 */ - "fogTable0405", /* 0x72 */ - "fogTable0607", /* 0x73 */ - "fogTable0809", /* 0x74 */ - "fogTable0A0B", /* 0x75 */ - "fogTable0C0D", /* 0x76 */ - "fogTable0E0F", /* 0x77 */ - "fogTable1011", /* 0x78 */ - "fogTable1213", /* 0x79 */ - "fogTable1415", /* 0x7a */ - "fogTable1617", /* 0x7b */ - "fogTable1819", /* 0x7c */ - "fogTable1A1B", /* 0x7d */ - "fogTable1C1D", /* 0x7e */ - "fogTable1E1F", /* 0x7f */ - "fogTable2021", /* 0x80 */ - "fogTable2223", /* 0x81 */ - "fogTable2425", /* 0x82 */ - "fogTable2627", /* 0x83 */ - "fogTable2829", /* 0x84 */ - "fogTable2A2B", /* 0x85 */ - "fogTable2C2D", /* 0x86 */ - "fogTable2E2F", /* 0x87 */ - "fogTable3031", /* 0x88 */ - "fogTable3233", /* 0x89 */ - "fogTable3435", /* 0x8a */ - "fogTable3637", /* 0x8b */ - "fogTable3839", /* 0x8c */ - "fogTable3A3B", /* 0x8d */ - "fogTable3C3D", /* 0x8e */ - "fogTable3E3F", /* 0x8f */ - "fbijrInit0", /* 0x90 */ - "fbijrInit1", /* 0x91 */ - "fbijrInit2", /* 0x92 */ - "fbijrInit3", /* 0x93 */ - "fbijrInit4", /* 0x94 */ - "fbijrInit5", /* 0x95 */ - "reserved096", /* 0x96 */ - "reserved097", /* 0x97 */ - "reserved098", /* 0x98 */ - "reserved099", /* 0x99 */ - "reserved09A", /* 0x9a */ - "reserved09B", /* 0x9b */ - "reserved09C", /* 0x9c */ - "reserved09D", /* 0x9d */ - "reserved09E", /* 0x9e */ - "reserved09F", /* 0x9f */ - "fbijrVersion", /* 0xa0 */ - "fbiPixelsIn", /* 0xa1 */ - "fbiChromaFail", /* 0xa2 */ - "fbiZfuncFail", /* 0xa3 */ - "fbiAfuncFail", /* 0xa4 */ - "fbiPixelsOut", /* 0xa5 */ - "reserved0A6", /* 0xa6 */ - "reserved0A7", /* 0xa7 */ - "reserved0A8", /* 0xa8 */ - "reserved0A9", /* 0xa9 */ - "reserved0AA", /* 0xaa */ - "reserved0AB", /* 0xab */ - "reserved0AC", /* 0xac */ - "reserved0AD", /* 0xad */ - "reserved0AE", /* 0xae */ - "reserved0AF", /* 0xaf */ - "reserved0B0", /* 0xb0 */ - "reserved0B1", /* 0xb1 */ - "reserved0B2", /* 0xb2 */ - "reserved0B3", /* 0xb3 */ - "reserved0B4", /* 0xb4 */ - "reserved0B5", /* 0xb5 */ - "reserved0B6", /* 0xb6 */ - "reserved0B7", /* 0xb7 */ - "reserved0B8", /* 0xb8 */ - "reserved0B9", /* 0xb9 */ - "reserved0BA", /* 0xba */ - "reserved0BB", /* 0xbb */ - "reserved0BC", /* 0xbc */ - "reserved0BD", /* 0xbd */ - "reserved0BE", /* 0xbe */ - "texChipSel", /* 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 */ -}; - -/*--------------------------------------------------------------------------- -** _grDebugGroupWriteHeader -*/ -#if defined(GDBG_INFO_ON) && (GLIDE_PLATFORM & GLIDE_HW_SST96) -void -_grDebugGroupWriteHeader(FxU32 header, FxU32 address) -{ -#define FN_NAME "_grDebugGroupWriteHeader" - GR_DCL_GC; - FxU32 - offset, - /* laddress, - * chipField, */ - lheader = header; - int - index, - nBits = 0; - - GR_ASSERT(address & GWH_ENABLE_BIT); - - GDBG_INFO((128, "New Group Write Packet ======================\n")); - GDBG_INFO((128, "Address: 0x%x\n", address)); - GDBG_INFO((128, "Header: 0x%x\n", header)); - GDBG_INFO((128, "PCI Address: 0x%x\n", (address & 0xfffff) << 2)); - GDBG_INFO((128, "Chip Field: 0x%x\n", (address >> 14) & 0xf)); - - offset = (address & ~(0xf << 14)) & 0xfffff; - index = offset; - - if (offset < 0x100 ) { /* It's state or triangle */ - - GDBG_INFO((128, "Start: 0x%s (0x%x)\n", regNames[index], index)); - GDBG_INFO((128, "Mask: 0x%x\n", header)); - - while (lheader) { - if (lheader & 0x1) { - nBits++; - GDBG_INFO((128, "Includes:\t%s (0x%x)\n", - regNames[index], index)); - } - lheader >>= 1; - index++; - } - } else if (offset >= 0x10000) { /* It's texture */ - GDBG_INFO((128, "Mask: 0x%x\n", header)); - GDBG_INFO((128, "TEXTURE\n")); - do { - if (lheader & 0x1) - nBits++; - } while (lheader >>=1 ); - } else { /* WTF? */ - GDBG_INFO((128, "Group Write Header:\t????\n")); - nBits = 1; - } - - GDBG_INFO((128, "%s: %d bits of mask 0x%x were set\n", FN_NAME, - nBits, header)); - - GR_ASSERT(nBits); - -#undef FN_NAME -} /* _grDebugGroupWriteHeader */ -#endif /* (GDBG_INFO_ON & (GLIDE_PLATFORM & GLIDE_HW_SST96)) */ - -void -_grFifoWriteDebug(FxU32 addr, FxU32 val, FxU32 fifoPtr) -{ - GR_DCL_GC; - FxU32 - index = GEN_INDEX(addr); - char - *regName; - - regName = (index <= 0xff) ? regNames[index] : "TRAM"; - - if (index <= 0xff) { - GDBG_INFO((120, "Storing to FIFO:\n")); - GDBG_INFO((120, "\tReg Name: %s\n", regName)); - GDBG_INFO((120, "\tReg Num: 0x%x\n", index)); - GDBG_INFO((120, "\tValue: 0x%x\n", val)); - GDBG_INFO((120, "\tFIFO Ptr: 0x%x\n", fifoPtr)); - GDBG_INFO((120, "\tSince Fence: 0x%x\n", gc->hwDep.sst96Dep.writesSinceFence)); - GDBG_INFO((120, "\tFIFO Test: 0x%x\n", gc->fifoData.hwDep.vg96FIFOData.fifoSize)); - } -} /* _grFifoWriteDebug */ - -void -_grFifoFWriteDebug(FxU32 addr, float val, FxU32 fifoPtr) -{ - GR_DCL_GC; - FxU32 - index = GEN_INDEX(addr); - char - *regName; - - if (index <= 0xff) { - - regName = regNames[index]; - - GDBG_INFO((120, "Storing to FIFO:\n")); - GDBG_INFO((120, "\tReg Name: %s\n", regName)); - GDBG_INFO((120, "\tReg Num: 0x%x\n", index)); - GDBG_INFO((120, "\tValue: %4.2f\n", val)); - GDBG_INFO((120, "\tFIFO Ptr: 0x%x\n", fifoPtr)); - GDBG_INFO((120, "\tFIFO Test: 0x%x\n", gc->fifoData.hwDep.vg96FIFOData.fifoSize)); - } else { - GDBG_INFO((195, "Storing to FIFO:\n")); - GDBG_INFO((195, "\tTEX Addr: 0x%x\n", index)); - GDBG_INFO((195, "\tTexel: %4.2f\n", val)); - GDBG_INFO((195, "\tFIFO Ptr: 0x%x\n", fifoPtr)); - GDBG_INFO((120, "\tFIFO Test: 0x%x\n", gc->fifoData.hwDep.vg96FIFOData.fifoSize)); - } -} /* _grFifoFWriteDebug */ - - -/*-------------------------------------------------------------------------- -** _grSst96PCIFifoEmpty -*/ -FxBool -_grSst96PCIFifoEmpty() { - GR_DCL_GC; - GR_DCL_HW; - - int - count = 0; - -#define COUNT_PATIENCE_VALUE 100000000 -#define SST96_PCI_FIFO_EMPTY(a) ((((a->status) & 0x3f00) >> 8) == 0x3f) - for (;;) { - if (SST96_PCI_FIFO_EMPTY(hw)) - return FXTRUE; - - if (!(++count % COUNT_PATIENCE_VALUE)) { - GDBG_INFO((120, "Losing Patients after %d tries\n", COUNT_PATIENCE_VALUE)); - break; - } - } - return FXFALSE; -} /* _grSst96PCIFifoEmpty */ - - -FxU32 -*sstGlobal(void); - -void GR_CDECL -_grSst96FifoMakeRoom(void) -{ - GR_DCL_GC; -#ifdef SST96_ALT_FIFO_WRAP - /* NB: W/ the alternate fifo wrapping stuff on only the asm - * tri-setup uses this routine. - */ - gc->fifoData.hwDep.vg96FIFOData.blockSize = _GlideRoot.curTriSize; -#endif - - /* Wrap Fifo now if triangle is going to incur a wrap */ - initWrapFIFO(&gc->fifoData); -} /* _grSst96FifoMakeRoom */ - -/*-------------------------------------------------------------------------- -** _grSst96Load32 -*/ -FxU32 -_grSst96Load32(FxU32 *s) { - GR_DCL_GC; - FxU32 - index, /* index into reg name list */ - regVal; - char - *regName; - - regVal = *s; - - index = GEN_INDEX(s); - - if (index <= 0xff) { - regName = regNames[index]; - GDBG_INFO((120, "Direct Register Read:\n")); - GDBG_INFO((120, "\tReg Name: %s\n", regName)); - GDBG_INFO((120, "\tReg Num: 0x%x\n", index)); - GDBG_INFO((120, "\tReg Val: 0x%x\n", regVal)); - } - - return regVal; - -} /* _grSst96Load32 */ - - -/*--------------------------------------------------------------------------- -** _gr96SstStore32 -*/ -void -_grSst96Store32(FxU32 *d, FxU32 s) { - GR_DCL_GC; - -#ifdef SST96_FIFO - GLIDE_FIFO_CHECK(); - { - FxI32 fifoSize = gc->fifoData.hwDep.vg96FIFOData.fifoSize - 8; - if (fifoSize < 0) { -#if SST96_ALT_FIFO_WRAP - gc->fifoData.hwDep.vg96FIFOData.blockSize = (sizeof(FxU32) << 1); - initWrapFIFO(&gc->fifoData); -#else - _grSst96FifoMakeRoom(); -#endif - } - } - - SST96_STORE_FIFO( d, s ); - GLIDE_FIFO_CHECK(); -#else /* !SST96_FIFO */ - FxU32 - index; /* Index into reg name list */ - char - *regName; - - index = GEN_INDEX(d); - - if (index <= 0xff) { - regName = (index <= 0xff) ? regNames[index] : "TRAM"; - GDBG_INFO((120, "Direct Rester Write:\n")); - GDBG_INFO((120, "\tReg Name: %s\n", regName)); - GDBG_INFO((120, "\tReg Num: 0x%x\n", index)); - GDBG_INFO((120, "\tValue: 0x%x\n", s)); - } - - if (_grSst96PCIFifoEmpty() == FXFALSE) { - GDBG_INFO((120, "ERROR: Fifo didn't empty\n")); - } - - *d = s; -#endif /* !SST96_FIFO */ -} /* _gr96SstStore32 */ - -/*--------------------------------------------------------------------------- -** _grSst96Store32F -*/ -void -_grSst96Store32F(float *d, float s) { -#ifdef SST96_FIFO - GLIDE_FIFO_CHECK(); -#else - FxU32 - index; /* Offset into reg name array */ - char - *regName; /* Name of register */ - - index = GEN_INDEX(d); - - if (index <= 0xff) { - regName = regNames[index]; - GDBG_INFO((120, "Direct Register Write:\n")); - GDBG_INFO((120, "\tReg Name: %s\n", regName)); - GDBG_INFO((120, "\tReg Num: 0x%x\n", index)); - GDBG_INFO((120, "\tValue: %4.4f\n", s)); - } - *d = s; - - if (_grSst96PCIFifoEmpty() == FXFALSE) { - GDBG_INFO((120, "ERROR: Fifo didn't empty\n")); - } -#endif -} /* _grSst96Store32F */ - -/*--------------------------------------------------------------------------- -** _grSst96Store16 -*/ -void -_grSst96Store16(FxU16 *d, FxU16 s) { - FxU32 dummy; - - dummy = (FxU32) s; - _grSst96Store32((FxU32 *) d, dummy); -} /* _grSst96Store16 */ - -#undef GETINDEX -#undef GETREADADDR -#undef GR_GET -#define GR_GET(s) *(GETREADADDR(s)) -#define GETINDEX(a) ((((FxU32) &a) - (((FxU32) hw) + 0x400000)) >> 2) -#define GETREADADDR(s) ((FxU32 *) (((FxU32) hw) + (GETINDEX(s) <<12))) - -#define STATUS_MEMFIFOERR FXBIT(15) -#define STATUS_CMDFIFOERR FXBIT(14) - -#define FIFO_TOP_BYTES(a) ((((a) >> 11) & 0x3ff) << 12) -#define FIFO_BOT_BYTES(a) ((((a) >> 1) & 0x3ff) << 12) -#define FIFO_RD_BYTES(a) (((a) << 3) & 0x7ffff) - -/*--------------------------------------------------------------------------- -** _grSst96CheckFifoData -*/ -void -_grSst96CheckFifoData() -{ -#define FN_NAME "_grSst96CheckFifoData" - GR_DCL_GC; - GR_DCL_HW; - - FxU32 - /* Data for error checking */ - fifoStartGC, /* GC's idea of FIFO bottom */ - fifoStartHW, /* Jr's idea of FIFO bbottom */ - fifoWrPtrGC, /* GC's idea of write pointer */ - fifoRdPtrHW, /* Jr's idea of read pointer */ - fifoTopHW, /* Jr's idea of top of FIFO */ - /* Register contents */ - status, - fbiJrInit3, - fbiJrInit4, - fbiJrInit5; - - FxBool - error = FXFALSE; - - if (!gc->open) return; - - /* - ** Get the relavent data from the GC and from Jr. - */ - - /* Jr. */ - status = GR_GET(hw->status); - fbiJrInit3 = GR_GET(hw->fbijrInit3); - fbiJrInit4 = GR_GET(hw->fbijrInit4); - fbiJrInit5 = GR_GET(hw->fbijrInit5); - - /* GC */ - fifoStartGC = (FxU32) gc->fifoData.hwDep.vg96FIFOData.fifoVirt - (FxU32) gc->base_ptr; - fifoWrPtrGC = (FxU32) gc->fifoData.hwDep.vg96FIFOData.fifoPtr - (FxU32) gc->base_ptr; - - /* Deduce relevant data from registers */ - fifoStartHW = FIFO_BOT_BYTES(fbiJrInit3); - fifoTopHW = FIFO_TOP_BYTES(fbiJrInit3) + 0x1000; - fifoRdPtrHW = FIFO_RD_BYTES(fbiJrInit5); - - /* - ** Perform Error Checking - */ - - /* Check for errors indicated in status bits */ - if (status & STATUS_MEMFIFOERR) { - GDBG_PRINTF(("FIFO ERROR: Status 0x%x indicates MEMFIFO error!\n", status)); - error = FXTRUE; - } - - if (status & STATUS_CMDFIFOERR) { - GDBG_PRINTF(("FIFO ERROR: Status 0x%x indicates CMDFIFO error\n")); - error = FXTRUE; - } - - /* Check for proper concept of FIFO bottom */ - if (fifoStartGC != fifoStartHW) { - GDBG_PRINTF(("FIFO_ERROR: fbijrInit3 0x%x: FIFO Bottom 0x%x != 0x%x\n", - fbiJrInit3, fifoStartGC, fifoStartHW)); - error = FXTRUE; - } - - /* Check for write past end of FIFO */ - if (fifoWrPtrGC > fifoTopHW) { - GDBG_PRINTF(("FIFO ERROR: Top of FIFO: 0x%x, Write Ptr: 0x%x\n", - fifoTopHW, fifoWrPtrGC)); - error = FXTRUE; - } - - if ((fbiJrInit4 > (FxU32)gc->fifoData.hwDep.vg96FIFOData.fifoMax) || - (fbiJrInit4 >= 0x10000UL)) { - GDBG_PRINTF(("FIFO Error: Entry count overflow: 0x%X 0x%X\n", - fbiJrInit4, gc->fifoData.hwDep.vg96FIFOData.fifoMax)); - error = FXTRUE; - } - - if (error) { - GrErrorCallback("FATAL FIFO ERROR (See above)\n", FXTRUE); - } - -#undef FN_NAME -} /* _grSst96CheckFifoData */ - -#endif /* (GLIDE_PLATFORM & GLIDE_HW_SST96) */ diff --git a/glide2x/sst1/glide/src/xdraw.S b/glide2x/sst1/glide/src/xdraw.S deleted file mode 100644 index 8b87294..0000000 --- a/glide2x/sst1/glide/src/xdraw.S +++ /dev/null @@ -1,695 +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 1999/12/11 00:41:48 joseph -# Changed \(.data) to .section .data to fix build errors with binutils 2.9.5. -# -# Revision 1.1.1.1 1999/12/07 21:48:55 joseph -# Initial checkin into SourceForge. -# -# -# 15 3/04/97 9:10p Dow -# Neutered mutiplatform multiheaded monster. -# -# 14 2/26/97 11:58a Jdt -# Fixed stack bug -# -# 13 2/19/97 4:42p Dow -# Fixed debug build for Watcom -# -# 12 1/18/97 11:50p Dow -# Added support for GMT's register debugging -# -# 11 12/23/96 1:37p Dow -# chagnes for multiplatform glide -# -# 10 11/15/96 5:11p Jdt -# SST-96 exclusion -# -# - -# This used to be xdraw.s but I renamed it as a quick way to make it work -# with the shared 3dfx.mak - -# This is a GASP input file - -.file "xdraw.s" -# OPTION OLDSTRUCTS -# .586P - -# EXTRN _GlideRoot:DWORD -# EXTRN _grSpinFifo:NEAR - -# some useful floating load and store macros -# flds TEXTEQU -# fsubs TEXTEQU -# fmuls TEXTEQU - - .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 -P6FenceVar .DATA 0 -DBG .DATA 0 - -zArea .EQU One+04 -zdxAB .EQU One+8 -zdxBC .EQU One+12 -zdyAB .EQU One+16 -zdyBC .EQU One+20 -zculltest .EQU One+24 - -## Some useful SST-1 offsets -.INCLUDE "fxgasm.h" - -# enables/disables trisProcessed and trisDrawn counters -STATS .ASSIGNA 1 - -#-------------------------------------------------------------------------- -## Macro for P6 Fencing operation -## Note that this destroys eax, but if you do 2 fences eax will be -## restored -.AIF \&GLIDE_DEBUG EQ 1 -# EXTRN _grFence:NEAR - -.MACRO P6Fence - push %eax - push %ecx - push %edx - call _grFence - pop %edx - pop %ecx - pop %eax - xchgl %eax, P6FenceVar -.ENDM -.AELSE -.MACRO P6Fence - xchg %eax, P6FenceVar -.ENDM -.AENDI # GLIDE_DEBUG - -.AIF \&GLIDE_HARDWARE EQ 1 -.AIF \&GLIDE_DEBUG EQ 1 - -#EXTRN _GR_SET:NEAR -#EXTRN _GR_SETF:NEAR - -.AENDI # GLIDE_DEBUG - -.MACRO GR_SET hw offset value -.AIF \&GLIDE_DEBUG EQ 1 - push %eax - push %ecx - push %edx - - push \value - lea \offset (\hw),%eax - push %eax - call _GR_SET - add $8, %esp - - pop %edx - pop %ecx - pop %eax -.AENDI # GLIDE_DEBUG - movl \value, \offset (\hw) -.ENDM - -.MACRO GR_SETF_P hw offset -.AIF \&GLIDE_DEBUG EQ 1 - push %eax - push %ecx - push %edx - - fstl -4(%esp) - sub $4, %esp - lea \offset (\hw),%eax - push %eax - call _GR_SETF - add $8, %esp - - pop %edx - pop %ecx - pop %eax -.AENDI # GLIDE_DEBUG - fstps \offset (\hw) -.ENDM - -.AENDI # GLIDE_HARDWARE - -#-------------------------------------------------------------------------- -# Arguments (STKOFF = 16 from 4 pushes) -.AIF \&GLIDE_DEBUG EQ 1 -STKOFF .EQU 16 -.AELSE -STKOFF .EQU 16 -.AENDI -_va$ .EQU 4 + STKOFF -_vb$ .EQU 8 + STKOFF -_vc$ .EQU 12 + STKOFF - -X .EQU 0 -Y .EQU 4 - -fa .REG (%eax) # vtx a from caller -fb .REG (%ebx) # vtx b from caller -fc .REG (%ecx) # vtx c from caller - # edx is used as index, loading from *src -gc .REG (%esi) # points to graphics context -dlp .REG (%esi) # points to dataList structure -hw .REG (%edi) # points to the hardware - -tmpx .REG (%edx) # temp X storage -i .REG (%edx) # i = dlp->i -tmpy .REG (%ebp) # temp Y storage - -#-------------------------------------------------------------------------- -.text - .align 16 - -.AIF \&GLIDE_DEBUG EQ 0 -.globl grDrawTriangle - .type grDrawTriangle, @function -grDrawTriangle: -.AENDI -.globl grDrawTriangle_asm - .type grDrawTriangle_asm, @function -grDrawTriangle_asm: - -# FALL THRU to _trisetup - -#-------------------------------------------------------------------------- -# -# _trisetup_asm - do triangle setup & send down draw command -# -# USAGE: -# -# -.globl _trisetup_asm - .type _trisetup_asm, @function -_trisetup_asm: -# .code -# 28 - # save ebx, esi, edi, ebp - push %ebx - push %esi - - push %edi - push %ebp - -#vertex sorting is done as follows: -# 1. First, load the y values of vtx a, b, c into integer registers -# -# This is done in the segment vertex_load below. -# -# Note that this trashes the pointers, we will reload them later -# -# If any of the y values is negative, convert to a pseudo-2s complement -# form by xor'ing with 7fffffff. This lets us use 2's complement integer -# comparisons for floating point comparisons. -# -# 2. Compare a.y, b.y, c.y, and setup pointers fa, fb, fc so that -# a.y <= b.y <= c.y. -# -# Note that fa, fb, fc registers point once more to vertex structs, -# though not necessarily in the order that the application passes it to -# this routine. -# -# This is done in the segment vertex_y_sort below, with many many -# compare/branches. -# -# All the compare/branches converge to sst_load_xy_regs. -# -# 3. Load the (x,y) values into the floating point SST registers for Fa, Fb, -# and Fc. Done in the segment sst_load_xy_regs. -# -# 4. Restore fa, fb, fc to the user's order. Also save the vertex -# with lowest y value on the stack, this will be used later for -# loading parameter values into the SST regs. -# -####### - - -#-------------------------------------------------------------------------- - mov _va$(%esp), fa # 1 - mov _vb$(%esp), fb - mov _vc$(%esp), fc - movl (_GlideRoot+trisProcessed), tmpy # _GlideRoot.stats.trisProcessed++# -# 36-3 -vertex_y_load: - mov Y(fa), fa # 2 - mov Y(fb), fb - cmp $0, fa # 3 - jge a_positive - xor $0x7fffffff, fa -.align 4 -a_positive: - cmp $0, fb # 4 - jge b_positive - xor $0x7fffffff, fb -.align 4 -b_positive: - mov Y(fc), fc # 5 - movl (_GlideRoot+curGC), gc - cmp $0, fc # 6 - jge c_positive - xor $0x7fffffff, fc -c_positive: -# 42-3 -# 24-30 with direct fall-thru -# jmp ret_pop0f -#-------------------------------------------------------------------------- -vertex_y_sort: - - cmp fb, fa # if (ay < by) { - jge AgtB - cmp fc, fb # if (by > cy) { - jle abc - cmp fc, fa # if (ay < cy) { - jge cab - -acb: # acb - mov _va$(%esp), fa - mov cull_mode(gc), tmpx # culltest = gc->state.cull_mode - mov _vc$(%esp), fb - mov _vb$(%esp), fc - xor $1, tmpx # culltest ^= 1 - jmp Area_Computation - -.align 4 -cab: # cab - mov _vc$(%esp), fa # fa = &vc->x - mov cull_mode(gc), tmpx # culltest = gc->state.cull_mode - mov _va$(%esp), fb # fb = &va->x - mov _vb$(%esp), fc # fc = &vb->x - # HOLE - jmp Area_Computation - -.align 4 -abc: # abc - mov _va$(%esp), fa # fa = &va->x - mov _vb$(%esp), fb # fb = &vb->x - mov _vc$(%esp), fc # fc = &vc->x - mov cull_mode(gc), tmpx # culltest = gc->state.cull_mode - # HOLE - jmp Area_Computation - -.align 4 -AgtB: # } else { - cmp fc, fb # if (by < cy) - jge cba - cmp fc, fa # if (ay < cy) - jge bca -bac: # bac - mov _vb$(%esp), fa - mov cull_mode(gc), tmpx # culltest = gc->state.cull_mode - mov _va$(%esp), fb - mov _vc$(%esp), fc - xor $1, tmpx # culltest ^= 1 - jmp Area_Computation - -.align 4 -cba: # cba - mov _vc$(%esp), fa - mov cull_mode(gc), tmpx # culltest = gc->state.cull_mode - mov _vb$(%esp), fb - mov _va$(%esp), fc - xor $1, tmpx # culltest ^= 1 - jmp Area_Computation - -.align 4 -bca: # bca - mov _vb$(%esp), fa - mov _vc$(%esp), fb - mov _va$(%esp), fc - mov cull_mode(gc), tmpx # culltest = gc->state.cull_mode -#-------------------------------------------------------------------------- -.align 4 -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 - mov fifoFree(gc), hw # load gc->state.fifoFree -.AIF \&STATS EQ 1 - inc tmpy # _GlideRoot.stats.trisProcessed++# - mov tmpy, (_GlideRoot+trisProcessed) -.AENDI - mov (_GlideRoot+curTriSize), tmpy # load _GlideRoot.curTriSize -# 69-12 - # dxAB dxBC dyBC dyAB t0 t1 - fsubrp %st, %st(1) # | | | | area - - sub tmpy, hw # fifoFree = gc->fifoFree - gc->curTriSize# - jge nostall # if (fifoFree < 0) - push %eax - push %ecx - push %edx - push tmpy - call _grSpinFifo # fifoFree = grSpinFifo(gc->curTriSize)# - add $4, %esp - mov %eax, hw # fifoFree = ... - pop %edx - pop %ecx - pop %eax -nostall: -# 52 with direct fall thru -# jmp ret_pop5f #==============<<<<<<<================== - mov hw, fifoFree(gc) # gc->fifoFree = fifoFree# - fsts zArea # 2 clocks for fst - mov reg_ptr(gc), hw # hw = gc->reg_ptr - mov zArea, tmpy # j = *(long *)&area - add $0x00200000, hw # hw = SST_WRAP(hw,128) - and $0x7fffffff, tmpy # if ((j & 0x7FFFFFFF) == 0) - jz zero_area -# 76-13 zero area (gbench -tZ) -# 57 with directy fall thru - -#-------------------------------------------------------------------------- - fdivrs One # ooa = 1.0f / area# takes 20-38 clks -Cull_by_area_sign: - sal $31, tmpx # culltest<<31 - mov cull_mode(gc), tmpy # load gc->state.cull_mode - test tmpy, tmpy # if (gc->state.cull_mode #= GR_CULL_DISABLE) - je nocull1 - # culling ENABLED - mov zArea, tmpy # reload area - xor tmpx, tmpy # if (j ^ (culltest<<31)) - jge backfaced - -.align 4 -nocull1: # culling DISABLED - mov X(fa), tmpx # load fa[X] - mov Y(fa), tmpy # load fa[Y] - GR_SET hw,FVAX, tmpx - # GR_SETF( hw->FvA.x, fa[X] ) - GR_SET hw,FVAY, tmpy - # GR_SETF( hw->FvA.y, fa[Y] ) - mov X(fb), tmpx # load fb[X] - mov Y(fb), tmpy # load fb[Y] - GR_SET hw,FVBX,tmpx - # GR_SETF( hw->FvB.x, fb[X] ) - GR_SET hw,FVBY,tmpy - # GR_SETF( hw->FvB.y, fb[Y] ) - mov X(fc), tmpx # load fc[X] - mov Y(fc), tmpy # load fc[Y] - GR_SET hw,FVCX,tmpx - # GR_SETF( hw->FvC.x, fc[X] ) - GR_SET hw,FVCY,tmpy - # GR_SETF( hw->FvC.y, fc[Y] ) - - mov dataList(gc), i # i = gc->datalist[0]->i - add $ dataList, dlp # dlp = gc->dataList -# 96-13 - test i, i # while (i) early out test - je no_interpolation -# 99-13 flat shaded (gbench -t) -# jmp ret_pop5f #==============<<<<<<<================== - -# dxBC *= ooa# -# dyAB *= ooa# -# dxAB *= ooa# -# dyBC *= ooa# -merge1: # Stack looks like - # dxAB dxBC dyBC dyAB ooa - fmul %st, %st(4) # DXAB | | | | - fmul %st, %st(3) # | DXBC | | | - fmul %st, %st(2) # | | DYBC | | - fmulp %st, %st(1) # | | | DYAB - fxch %st(3) # DYAB | | DXAB -# 105-12 - fstps zdxAB # | | DYBC - fstps zdyBC # | DXBC - fstps zdxBC # DYAB - fstps zdyAB # -# 112-3 -# jmp ret_pop0f - -# NOTE: we know i>0 since we checked for that up above -# so we fall right into the parameter gradient compute loop -################################### -# -# dpdx = dpAB * dyBC - dpBC * dyAB -# dpdy = dpBC * dxAB - dpAB * dxBC -# -# dpAB.dyBC = p0x -# dpBC.dyAB = p1x -# dpBC.dxAB = p0y -# dpAB.dxBC = p1y -# -# This piece uses eax, ebx, ecx, edx, edi, esi, ebp, -# -.align 4 -next_parm: - mov dl_addr(dlp), hw # fp = dlp->addr - mov (fa, i), tmpy # tmpy = fa[i] -# IF 1 - test $1, i # if (i & 1) { - je no_packer_fix - test $2, i # if (i & 2) - je no_p6_1 - P6Fence - # if (i & 2) P6FENCE - -no_p6_1: - GR_SET hw,0,$0 - # GR_SETF( *fp, 0.0f )# - je no_p6_2 - P6Fence - # if (i & 2) P6FENCE -no_p6_2: - add $ SIZEOF_dataList, dlp # dlp++# - mov dl_i(dlp, SIZEOF_dataList), i # i = dlp[1]->i - test i,i # while (i) - jne next_parm - mov dl_i(dlp, SIZEOF_dataList), tmpy # tmpy = dlp[1]->i # preload next i - movl (_GlideRoot+trisDrawn), fa # _GlideRoot.stats.trisDrawn++ - jmp dotri -# ENDIF -.align 4 -no_packer_fix: # dpAB dpBC - flds (fa, i) # pa - fsubs (fb, i) # dpAB - flds (fb, i) # | pb - fsubs (fc, i) # dpAB dpBC - fld %st(1) # | | dpAB - fmuls zdyBC # | | p0x - fld %st(1) # | | | dpBC - fmuls zdyAB # | | | p1x - fxch %st(3) # p1x | | dpAB - GR_SET hw,0,tmpy - # | | | | - fmuls zdxBC # | | | p1y - fxch %st(2) # | p1y | dpBC - fmuls zdxAB # | | | p0y - fxch %st(3) # p0y | | p1x - fsubrp %st, %st(1) # | | dpdx - fxch %st(2) # dpdx | p0y - fsubp %st, %st(1) # | dpdy - fxch %st(1) # dpdy dpdx - add $ SIZEOF_dataList, dlp # dlp++ - mov dl_i(dlp, SIZEOF_dataList), i # i = dlp[1]->i - GR_SETF_P hw,FDPDX_OFFSET - # | - GR_SETF_P hw,FDPDY_OFFSET - - # empty - test i,i # while (i) - jne next_parm # - - mov dl_i(dlp, SIZEOF_dataList), tmpy # tmpy = dlp[1]->i - for the sake of a fall-thru - movl (_GlideRoot+trisDrawn), fa # _GlideRoot.stats.trisDrawn++ -.align 4 -# -# fell through - this means we're done with differentials -# note: i is preloaded with next token -# write area, pop fp stack, pop stack, return -dotri: - add $ SIZEOF_dataList, dlp # dlp++ - mov dl_addr(dlp), hw # fp = dlp->addr -# mov dl_addr(dlp, SIZEOF_dataList), hw # fp = dlp[1]->addr -.AIF \&STATS EQ 1 - inc fa # _GlideRoot.stats.trisDrawn++ - movl fa, (_GlideRoot+trisDrawn) -.AENDI - mov zArea, tmpx - - - test $2, tmpy # if (i & 2) - je no_p6_3 - P6Fence - # if (i & 2) P6FENCE - -no_p6_3: - GR_SET hw,0,tmpx - # GR_SET( hw->FtriangleCMD, area )# - je no_p6_4 - P6Fence - # if (i & 2) P6FENCE -no_p6_4: - - pop %ebp - pop %edi - pop %esi - pop %ebx - mov $1, %eax # return 1 (triangle drawn) - ret - -#----------------------------------------------------------------------------- -# We get here if there is no interpolation to be done. Just set area to -# draw the triangle. Unload fp stack, stack, return. -.align 4 -no_interpolation: - mov zArea, tmpx # reload area - mov dl_i(dlp, SIZEOF_dataList), tmpy # load up the CPU Type - and $2, tmpy # Check for P6 - je nofence1 - P6Fence - # Fence off the triangleCmd - nop -.align 4 -nofence1: - GR_SET hw,FTRIANGLECMD,tmpx - # hit the triangleCmd - je nofence2 - P6Fence - # Fence off the triangleCmd - nop -.align 4 -nofence2: - fstp %st(0) - fstp %st(0) - fstp %st(0) - fstp %st(0) - fstp %st(0) -.AIF \&STATS EQ 1 - movl (_GlideRoot+trisDrawn), fa # _GlideRoot.stats.trisDrawn++ -.AENDI - pop %ebp -.AIF \&STATS EQ 1 - inc fa # _GlideRoot.stats.trisDrawn++ - movl fa, (_GlideRoot+trisDrawn) -.AENDI - pop %edi - pop %esi - pop %ebx - mov $1, %eax # return 1 (triangles drawn) - ret - -# These labels should only be jumped to when we are trying to rigorously -# measure times. Screwing up the floating point stack costs many clocks, -# so we want to jump to the place where only the correct number of FSTPs are -# executed. - -.align 4 -backfaced: - fstp %st(0) - fstp %st(0) - fstp %st(0) - fstp %st(0) - fstp %st(0) - mov $0x0ffffffff, %eax # return -1 (backface culled) - pop %ebp - pop %edi - pop %esi - pop %ebx - ret - -ret_pop6f: - fstp %st(0) - -.align 4 -zero_area: -# If triangle area is zero, nothing to do... -# but unload fp stack and then pop the stack, and return. - -ret_pop5f: # dyBC dyAB dxBC dxAB area - fstp %st(0) -ret_pop4f: - fstp %st(0) -ret_pop3f: - fstp %st(0) -ret_pop2f: - fstp %st(0) -ret_pop1f: - fstp %st(0) -ret_pop0f: - mov $0, %eax # return 0 (triangles drawn) - pop %ebp - pop %edi - pop %esi - pop %ebx - ret -.L_end_tri_setup_asm: -.AIF \&GLIDE_DEBUG EQ 0 -.size grDrawTriangle,.L_end_tri_setup_asm-grDrawTriangle -.AENDI -.size grDrawTriangle_asm,.L_end_tri_setup_asm-grDrawTriangle_asm -.size _trisetup_asm,.L_end_tri_setup_asm-_trisetup_asm - -# [++++ from above] -# This comment was moved here to make the code in the loop more readable -# STALL HERE due to PCI write buffer being full on last instruction: -# The write to the packerHackAddress takes 3 bus clocks, during which -# we may not write to the PCI buffer without stalling. This causes -# the amount of clocks the workaround adds to the loop to vary in the -# following way++: -# -# CPU Bus/CPU Clock Total Bus Total Penalty -# Ratio* Clocks Since (add to later clocks) -#====================================================================== -# P55c-200/P5-180: 6/1 1.3 (3 - 1.3) * 6 + 6 = 17 -# P5-166/P5-150: 5/1 1.8 (3 - 1.8) * 5 + 6 = 12 -# P5-120: 4/1 2.25 (3 - 2.25) * 4 + 6 = 9 -# P5-100/P5-90: 3/1 3 (3 - 3) * 3 + 6 = 6 -# -# * P5-200 haa a 33MHz bus, P5-166 has a 33MHz bus, -# P5-150 has a 30MHz bus, P5-120 has a 30MHz bus, -# P5-100 has a 33MHz bus, P5-90 has a 30MHz bus -# -#++ These calculations also assume that we NEVER get to continue a burst -# from having the next parameter be consecutive from the current one. -# If we did get that, then we have to add two more bus clocks to the -# penalty for the next write (labeled loop clock 10), so that looks like -# CPU Total Penalty -# ============================================ -# P55c-200/P5-180:(2 * 6) + 17 = 29 clocks## -# P5-166/P5-150: (2 * 5) + 12 = 22 clocks# -# P5-120: (2 * 4) + 9 = 17 clocks# -# P5-100/P5-90 (2 * 3) + 6 = 12 clocks -# - -#_TEXT ENDS -.END diff --git a/glide2x/sst1/glide/src/xdraw.asm b/glide2x/sst1/glide/src/xdraw.asm deleted file mode 100644 index 4e8f654..0000000 --- a/glide2x/sst1/glide/src/xdraw.asm +++ /dev/null @@ -1,656 +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$ -; -; 15 3/04/97 9:10p Dow -; Neutered mutiplatform multiheaded monster. -; -; 14 2/26/97 11:58a Jdt -; Fixed stack bug -; -; 13 2/19/97 4:42p Dow -; Fixed debug build for Watcom -; -; 12 1/18/97 11:50p Dow -; Added support for GMT's register debugging -; -; 11 12/23/96 1:37p Dow -; chagnes for multiplatform glide -; -; 10 11/15/96 5:11p Jdt -; SST-96 exclusion -;; -;; - -TITLE xdraw.asm -OPTION OLDSTRUCTS -.586P - -.model FLAT,C ; Flat memory, mangle publics with leading '_' - -EXTRN _GlideRoot:DWORD -EXTRN _grSpinFifo:NEAR - -; some useful floating load and store macros -flds TEXTEQU -fsubs TEXTEQU -fmuls TEXTEQU - -_DATA SEGMENT - One DD 03f800000r - Area DD 0 - dxAB DD 0 - dxBC DD 0 - dyAB DD 0 - dyBC DD 0 - culltest DD 0 - P6FenceVar DD 0 -_DATA ENDS - -; Ugly, but seems to workaround the problem with locally defined -; data segment globals not getting relocated properly when using -; djgpp. - -zArea TEXTEQU -zdxAB TEXTEQU -zdxBC TEXTEQU -zdyAB TEXTEQU -zdyBC TEXTEQU -zculltest TEXTEQU - -;;; Some useful SST-1 offsets -INCLUDE fxgasm.h - -;; enables/disables trisProcessed and trisDrawn counters -STATS = 1 - -;-------------------------------------------------------------------------- -;;; Macro for P6 Fencing operation -;;; Note that this destroys eax, but if you do 2 fences eax will be restored -IFDEF GLIDE_DEBUG -EXTRN _grFence:NEAR - -P6Fence MACRO - pushd eax - push ecx - push edx - call _grFence - pop edx - pop ecx - pop eax - xchg eax, P6FenceVar -ENDM -ELSE -P6Fence MACRO - xchg eax, P6FenceVar -ENDM -ENDIF - -IFDEF GLIDE_HARDWARE -IFDEF GLIDE_DEBUG - -EXTRN _GR_SET:NEAR -EXTRN _GR_SETF:NEAR - -ENDIF - -GR_SET MACRO hw,offset,value -IFDEF GLIDE_DEBUG - push eax - push ecx - push edx - - push value - lea eax,[hw + offset] - push eax - call _GR_SET - add esp,8 - - pop edx - pop ecx - pop eax -ENDIF - mov DWORD PTR [hw + offset], value -ENDM - -GR_SETF_P MACRO hw,foffset -IFDEF GLIDE_DEBUG - push eax - push ecx - push edx - - fst DWORD PTR [esp-4] - sub esp,4 - lea eax,[hw + foffset] - push eax - call _GR_SETF - add esp,8 - - pop edx - pop ecx - pop eax -ENDIF - fstp DWORD PTR [hw + foffset] -ENDM - -ENDIF - -;-------------------------------------------------------------------------- -; Arguments (STKOFF = 16 from 4 pushes) -STKOFF = 16 -_va$ = 4 + STKOFF -_vb$ = 8 + STKOFF -_vc$ = 12 + STKOFF - -X = 0 -Y = 4 - -fa TEXTEQU ; vtx a from caller -fb TEXTEQU ; vtx b from caller -fc TEXTEQU ; vtx c from caller - ; edx is used as index, loading from *src -gc TEXTEQU ; points to graphics context -dlp TEXTEQU ; points to dataList structure -hw TEXTEQU ; points to the hardware - -tmpx TEXTEQU ; temp X storage -i TEXTEQU ; i = dlp->i -tmpy TEXTEQU ; temp Y storage - -_TEXT SEGMENT - -;-------------------------------------------------------------------------- - align 4 - PUBLIC grDrawTriangle_asm -grDrawTriangle_asm PROC NEAR - .code - -grDrawTriangle_asm ENDP - -; FALL THRU to _trisetup - -;-------------------------------------------------------------------------- -;; -;; _trisetup_asm - do triangle setup & send down draw command -;; -;; USAGE: -;; -;; - align 4 - PUBLIC _trisetup_asm@12 -_trisetup_asm@12 PROC NEAR - .code -; 28 - ; save ebx, esi, edi, ebp - push ebx - push esi - - push edi - push ebp - -;vertex sorting is done as follows: -; 1. First, load the y values of vtx a, b, c into integer registers -; -; This is done in the segment vertex_load below. -; -; Note that this trashes the pointers, we will reload them later -; -; If any of the y values is negative, convert to a pseudo-2's complement -; form by xor'ing with 7fffffff. This lets us use 2's complement integer -; comparisons for floating point comparisons. -; -; 2. Compare a.y, b.y, c.y, and setup pointers fa, fb, fc so that -; a.y <= b.y <= c.y. -; -; Note that fa, fb, fc registers point once more to vertex structs, -; though not necessarily in the order that the application passes it to -; this routine. -; -; This is done in the segment vertex_y_sort below, with many many -; compare/branches. -; -; All the compare/branches converge to sst_load_xy_regs. -; -; 3. Load the (x,y) values into the floating point SST registers for Fa, Fb, -; and Fc. Done in the segment sst_load_xy_regs. -; -; 4. Restore fa, fb, fc to the user's order. Also save the vertex -; with lowest y value on the stack, this will be used later for -; loading parameter values into the SST regs. -; -;;;;;;;;;;;;;; - - -;-------------------------------------------------------------------------- - mov fa, [esp + _va$] ; 1 - mov fb, [esp + _vb$] - mov fc, [esp + _vc$] - mov tmpy, [_GlideRoot + trisProcessed] ; _GlideRoot.stats.trisProcessed++; -; 36-3 -vertex_y_load: - mov fa, [fa + Y] ; 2 - mov fb, [fb + Y] - cmp fa, 0 ; 3 - jge a_positive - xor fa, 7fffffffh - align 4 -a_positive: - cmp fb, 0 ; 4 - jge b_positive - xor fb, 7fffffffh - align 4 -b_positive: - mov fc, [fc + Y] ; 5 - mov gc, [_GlideRoot + curGC] - cmp fc, 0 ; 6 - jge c_positive - xor fc, 7fffffffh -c_positive: -; 42-3 -; 24-30 with direct fall-thru -; jmp ret_pop0f -;-------------------------------------------------------------------------- -vertex_y_sort: - - cmp fa, fb ; if (ay < by) { - jge AgtB - cmp fb, fc ; if (by > cy) { - jle abc - cmp fa, fc ; if (ay < cy) { - jge cab - - acb: ; acb - mov fa, [esp + _va$] - mov tmpx, [gc + cull_mode] ; culltest = gc->state.cull_mode - mov fb, [esp + _vc$] - mov fc, [esp + _vb$] - xor tmpx, 1 ; culltest ^= 1 - jmp Area_Computation - - align 4 - cab: ; cab - mov fa, [esp + _vc$] ; fa = &vc->x - mov tmpx, [gc + cull_mode] ; culltest = gc->state.cull_mode - mov fb, [esp + _va$] ; fb = &va->x - mov fc, [esp + _vb$] ; fc = &vb->x - ; HOLE - jmp Area_Computation - - align 4 - abc: ; abc - mov fa, [esp + _va$] ; fa = &va->x - mov fb, [esp + _vb$] ; fb = &vb->x - mov fc, [esp + _vc$] ; fc = &vc->x - mov tmpx, [gc + cull_mode] ; culltest = gc->state.cull_mode - ; HOLE - jmp Area_Computation - - align 4 - AgtB: ; } else { - cmp fb, fc ; if (by < cy) - jge cba - cmp fa, fc ; if (ay < cy) - jge bca - bac: ; bac - mov fa, [esp + _vb$] - mov tmpx, [gc + cull_mode] ; culltest = gc->state.cull_mode - mov fb, [esp + _va$] - mov fc, [esp + _vc$] - xor tmpx, 1 ; culltest ^= 1 - jmp Area_Computation - - align 4 - cba: ; cba - mov fa, [esp + _vc$] - mov tmpx, [gc + cull_mode] ; culltest = gc->state.cull_mode - mov fb, [esp + _vb$] - mov fc, [esp + _va$] - xor tmpx, 1 ; culltest ^= 1 - jmp Area_Computation - - align 4 - bca: ; bca - mov fa, [esp + _vb$] - mov fb, [esp + _vc$] - mov fc, [esp + _va$] - mov tmpx, [gc + cull_mode] ; culltest = gc->state.cull_mode -;-------------------------------------------------------------------------- - align 4 -Area_Computation: -; 47-3 -; jmp ret_pop0f - flds [fa + X] ; xa - fsubs [fb + X] ; dxAB - flds [fb + X] ; | xb - fsubs [fc + X] ; | dxBC - flds [fb + Y] ; | | yb - fsubs [fc + Y] ; | | dyBC - flds [fa + Y] ; | | | ya - fsubs [fb + Y] ; | | | dyAB - fld st(3) ; | | | | dxAB - fmul st, st(2) ; | | | | t0 t0=dxAB*dyBC - fld st(3) ; | | | | | dxBC - fmul st, st(2) ; | | | | | t1 t1=dxBC*dyAB - mov hw, [gc + fifoFree] ; load gc->state.fifoFree -IFDEF STATS - inc tmpy ; _GlideRoot.stats.trisProcessed++; - mov [_GlideRoot + trisProcessed], tmpy -ENDIF - mov tmpy, [_GlideRoot + curTriSize] ; load _GlideRoot.curTriSize -; 69-12 - ; dxAB dxBC dyBC dyAB t0 t1 - fsubp st(1),st ; | | | | area - sub hw,tmpy ; fifoFree = gc->fifoFree - gc->curTriSize; - jge nostall ; if (fifoFree < 0) - push eax - push ecx - push edx - push tmpy - call _grSpinFifo ; fifoFree = grSpinFifo(gc->curTriSize); - add esp,4 - mov hw, eax ; fifoFree = ... - pop edx - pop ecx - pop eax -nostall: -; 52 with direct fall thru -; jmp ret_pop5f ;==============<<<<<<<================== - mov [gc + fifoFree],hw ; gc->fifoFree = fifoFree; - fst zArea ; 2 clocks for fst - mov hw, [gc + reg_ptr ] ; hw = gc->reg_ptr - mov tmpy, zArea ; j = *(long *)&area - add hw, 00200000H ; hw = SST_WRAP(hw,128) - and tmpy, 7fffffffh ; if ((j & 0x7FFFFFFF) == 0) - jz zero_area -; 76-13 zero area (gbench -tZ) -; 57 with directy fall thru - -;-------------------------------------------------------------------------- - fdivr One ; ooa = 1.0f / area; takes 20-38 clks -Cull_by_area_sign: - sal tmpx, 31 ; culltest<<31 - mov tmpy, [gc + cull_mode] ; load gc->state.cull_mode - test tmpy, tmpy ; if (gc->state.cull_mode != GR_CULL_DISABLE) - je nocull1 - ; culling ENABLED - mov tmpy, zArea ; reload area - xor tmpy,tmpx ; if (j ^ (culltest<<31)) - jge backfaced - - align 4 -nocull1: ; culling DISABLED - mov tmpx, [fa + X] ; load fa[X] - mov tmpy, [fa + Y] ; load fa[Y] - GR_SET hw,FVAX,tmpx ; GR_SETF( hw->FvA.x, fa[X] ) - GR_SET hw,FVAY,tmpy ; GR_SETF( hw->FvA.y, fa[Y] ) - mov tmpx, [fb + X] ; load fb[X] - mov tmpy, [fb + Y] ; load fb[Y] - GR_SET hw,FVBX,tmpx ; GR_SETF( hw->FvB.x, fb[X] ) - GR_SET hw,FVBY,tmpy ; GR_SETF( hw->FvB.y, fb[Y] ) - mov tmpx, [fc + X] ; load fc[X] - mov tmpy, [fc + Y] ; load fc[Y] - GR_SET hw,FVCX,tmpx ; GR_SETF( hw->FvC.x, fc[X] ) - GR_SET hw,FVCY,tmpy ; GR_SETF( hw->FvC.y, fc[Y] ) - - mov i, [gc+dataList] ; i = gc->datalist[0]->i - add dlp, dataList ; dlp = gc->dataList -; 96-13 - test i, i ; while (i) early out test - je no_interpolation -; 99-13 flat shaded (gbench -t) -; jmp ret_pop5f ;==============<<<<<<<================== - -; dxBC *= ooa; -; dyAB *= ooa; -; dxAB *= ooa; -; dyBC *= ooa; -merge1: ; Stack looks like - ; dxAB dxBC dyBC dyAB ooa - fmul st(4), st ; DXAB | | | | - fmul st(3), st ; | DXBC | | | - fmul st(2), st ; | | DYBC | | - fmulp st(1), st ; | | | DYAB - fxch st(3) ; DYAB | | DXAB -; 105-12 - fstp zdxAB ; | | DYBC - fstp zdyBC ; | DXBC - fstp zdxBC ; DYAB - fstp zdyAB ; -; 112-3 -; jmp ret_pop0f - -; NOTE: we know i>0 since we checked for that up above -; so we fall right into the parameter gradient compute loop -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; -; dpdx = dpAB * dyBC - dpBC * dyAB -; dpdy = dpBC * dxAB - dpAB * dxBC -; -; dpAB.dyBC = p0x -; dpBC.dyAB = p1x -; dpBC.dxAB = p0y -; dpAB.dxBC = p1y -;; -;; This piece uses eax, ebx, ecx, edx, edi, esi, ebp, -; - align 4 -next_parm: - mov hw, [dlp + dl_addr] ; fp = dlp->addr - mov tmpy, [fa + i] ; tmpy = fa[i] -IF 1 - test i,1 ; if (i & 1) { - je no_packer_fix - test i,2 ; if (i & 2) - je no_p6_1 - P6Fence ; if (i & 2) P6FENCE - - no_p6_1: - GR_SET hw,0,0 ; GR_SETF( *fp, 0.0f ); - je no_p6_2 - P6Fence ; if (i & 2) P6FENCE - no_p6_2: - mov i, [dlp + SIZEOF_dataList + dl_i] ; i = dlp[1]->i - add dlp, SIZEOF_dataList ; dlp++; - test i,i ; while (i) - jne next_parm - mov tmpy, [dlp + SIZEOF_dataList + dl_i] ; tmpy = dlp[1]->i ; preload next i - mov fa, [_GlideRoot + trisDrawn]; _GlideRoot.stats.trisDrawn++ - jmp dotri - - align 4 -no_packer_fix: ; dpAB dpBC -ENDIF - flds [fa + i] ; pa - fsubs [fb + i] ; dpAB - flds [fb + i] ; | pb - fsubs [fc + i] ; dpAB dpBC - - fld st(1) ; | | dpAB - fmuls zdyBC ; | | p0x - fld st(1) ; | | | dpBC - fmuls zdyAB ; | | | p1x - fxch st(3) ; p1x | | dpAB - GR_SET hw,0,tmpy ; | | | | - fmuls zdxBC ; | | | p1y - fxch st(2) ; | p1y | dpBC - fmuls zdxAB ; | | | p0y - fxch st(3) ; p0y | | p1x - fsubp st(1),st ; | | dpdx - fxch st(2) ; dpdx | p0y - fsubrp st(1),st ; | dpdy - fxch st(1) ; dpdy dpdx - mov i, [dlp + SIZEOF_dataList + dl_i] ; i = dlp[1]->i - add dlp, SIZEOF_dataList ; dlp++; - GR_SETF_P hw,FDPDX_OFFSET ; | - GR_SETF_P hw,FDPDY_OFFSET ; empty - test i,i ; while (i) - jne next_parm ; - - mov tmpy, [dlp + SIZEOF_dataList + dl_i] ; tmpy = dlp[1]->i - for the sake of a fall-thru - mov fa, [_GlideRoot + trisDrawn]; _GlideRoot.stats.trisDrawn++ - align 4 -; -; fell through - this means we're done with differentials -; note: i is preloaded with next token -; write area, pop fp stack, pop stack, return -dotri: - mov hw, [dlp + SIZEOF_dataList + dl_addr] ; fp = dlp[1]->addr -IFDEF STATS - inc fa ; _GlideRoot.stats.trisDrawn++ - mov [_GlideRoot + trisDrawn], fa -ENDIF - mov tmpx, zArea - - test tmpy,2 ; if (i & 2) - je no_p6_3 - P6Fence ; if (i & 2) P6FENCE - - no_p6_3: - GR_SET hw,0,tmpx ; GR_SET( hw->FtriangleCMD, area ); - je no_p6_4 - P6Fence ; if (i & 2) P6FENCE - no_p6_4: - - pop ebp - pop edi - pop esi - pop ebx - mov eax, 1h ; return 1 (triangle drawn) - ret 12 - -;----------------------------------------------------------------------------- -;; We get here if there is no interpolation to be done. Just set area to -;; draw the triangle. Unload fp stack, stack, return. - align 4 -no_interpolation: - mov tmpx, zArea ; reload area - mov tmpy, [dlp + SIZEOF_dataList + dl_i] ; load up the CPU Type - and tmpy, 2 ; Check for P6 - je nofence1 - P6Fence ; Fence off the triangleCmd - nop - align 4 -nofence1: - GR_SET hw,FTRIANGLECMD,tmpx ; hit the triangleCmd - je nofence2 - P6Fence ; Fence off the triangleCmd - nop - align 4 -nofence2: - fstp st(0) - fstp st(0) - fstp st(0) - fstp st(0) - fstp st(0) -IFDEF STATS - mov fa, [_GlideRoot + trisDrawn]; _GlideRoot.stats.trisDrawn++ -ENDIF - pop ebp -IFDEF STATS - inc fa ; _GlideRoot.stats.trisDrawn++ - mov [_GlideRoot + trisDrawn], fa -ENDIF - pop edi - pop esi - pop ebx - mov eax, 1h ; return 1 (triangles drawn) - ret 12 - -; These labels should only be jumped to when we are trying to rigorously -; measure times. Screwing up the floating point stack costs many clocks, -; so we want to jump to the place where only the correct number of FSTPs are -; executed. - - align 4 -backfaced: - fstp st(0) - fstp st(0) - fstp st(0) - fstp st(0) - fstp st(0) - mov eax, 0ffffffffh ; return -1 (backface culled) - pop ebp - pop edi - pop esi - pop ebx - ret 12 - -ret_pop6f: - fstp st(0) - - align 4 -zero_area: -; If triangle area is zero, nothing to do... -; but unload fp stack and then pop the stack, and return. - -ret_pop5f: ; dyBC dyAB dxBC dxAB area - fstp st(0) -ret_pop4f: - fstp st(0) -ret_pop3f: - fstp st(0) -ret_pop2f: - fstp st(0) -ret_pop1f: - fstp st(0) -ret_pop0f: - mov eax, 0h ; return 0 (triangles drawn) - pop ebp - pop edi - pop esi - pop ebx - ret 12 - -_trisetup_asm@12 ENDP - -; [++++ from above] -; This comment was moved here to make the code in the loop more readable -; STALL HERE due to PCI write buffer being full on last instruction: -; The write to the packerHackAddress takes 3 bus clocks, during which -; we may not write to the PCI buffer without stalling. This causes -; the amount of clocks the workaround adds to the loop to vary in the -; following way++: -; -; CPU Bus/CPU Clock Total Bus Total Penalty -; Ratio* Clocks Since (add to later clocks) -;====================================================================== -; P55c-200/P5-180: 6/1 1.3 (3 - 1.3) * 6 + 6 = 17 -; P5-166/P5-150: 5/1 1.8 (3 - 1.8) * 5 + 6 = 12 -; P5-120: 4/1 2.25 (3 - 2.25) * 4 + 6 = 9 -; P5-100/P5-90: 3/1 3 (3 - 3) * 3 + 6 = 6 -; -; * P5-200 haa a 33MHz bus, P5-166 has a 33MHz bus, -; P5-150 has a 30MHz bus, P5-120 has a 30MHz bus, -; P5-100 has a 33MHz bus, P5-90 has a 30MHz bus -; -;++ These calculations also assume that we NEVER get to continue a burst -; from having the next parameter be consecutive from the current one. -; If we did get that, then we have to add two more bus clocks to the -; penalty for the next write (labeled loop clock 10), so that looks like -; CPU Total Penalty -; ============================================ -; P55c-200/P5-180:(2 * 6) + 17 = 29 clocks!!! -; P5-166/P5-150: (2 * 5) + 12 = 22 clocks!! -; P5-120: (2 * 4) + 9 = 17 clocks! -; P5-100/P5-90 (2 * 3) + 6 = 12 clocks -; - -_TEXT ENDS -END diff --git a/glide2x/sst1/glide/src/xdraw96.S b/glide2x/sst1/glide/src/xdraw96.S deleted file mode 100644 index 42aa3f3..0000000 --- a/glide2x/sst1/glide/src/xdraw96.S +++ /dev/null @@ -1,713 +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 1999/12/07 21:48:55 joseph -## Initial checkin into SourceForge. -## -# -# 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. -## - -# This used to be xdraw96.s but I renamed it as a quick way to make it work -# with the shared 3dfx.mak - -.file "xdraw96.s" -#OPTION OLDSTRUCTS -#.586P - - - -#EXTRN _GlideRoot:DWORD -#EXTRN _grSpinFifo:NEAR -#EXTRN _grSst96FifoMakeRoom:NEAR - - -# some useful floating load and store macros -#flds TEXTEQU -#fsubs TEXTEQU -#fmuls TEXTEQU - -.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 -P6FenceVar .DATA 0 - -# 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 - -### Some useful SST-1 offsets -.INCLUDE "fxgasm.h" - -## enables/disables trisProcessed and trisDrawn counters -STATS .ASSIGNA 1 - -#-------------------------------------------------------------------------- -### Macro for P6 Fencing operation -### Note that this destroys eax, but if you do 2 fences eax will be restored -#.AIF \&GLIDE_DEBUG EQ 1 -#EXTRN _GR_SET_GW_CMD:NEAR -#EXTRN _GR_SET_GW_HEADER:NEAR -#EXTRN _GR_SET_GW_ENTRY:NEAR -#.AENDI - -.MACRO GR_SET_GW_CMD addr offset data -.AIF \&GLIDE_DEBUG EQ 1 - push %eax - push %ecx - push %edx - - push \data - lea \offset (\addr), %eax - push %eax - call _GR_SET_GW_CMD - add $8, %esp - pop %edx - pop %ecx - pop %eax -.AELSE - mov \data, \offset (\addr) -.AENDI -.ENDM - -.MACRO GR_SET_GW_HEADER addr offset data -.AIF \&GLIDE_DEBUG EQ 1 - push %eax - push %ecx - push %edx - push \data - lea \offset (\addr), %eax - push %eax - call _GR_SET_GW_HEADER - add $8, %esp - pop %edx - pop %ecx - pop %eax -.AELSE - mov \data, \offset (\addr) -.AENDI -.ENDM - -.MACRO GR_SET_GW_ENTRY addr offset data -.AIF \&GLIDE_DEBUG EQ 1 - push %eax - push %ecx - push %edx - push \data - lea \offset (\addr), %eax - push %eax - call _GR_SET_GW_ENTRY - add $8, %esp - pop %edx - pop %ecx - pop %eax -.AELSE - mov \data, \offset (\addr) -.AENDI -.ENDM - -.MACRO GR_FSET_GW_ENTRY addr offset -.AIF \&GLIDE_DEBUG EQ 1 - push %eax - push %ecx - push %edx - sub $4, %esp - fstps (%esp) - lea \offset (\addr), %eax - push %eax - call _GR_SET_GW_ENTRY - add $8, %esp - pop %edx - pop %ecx - pop %eax -.AELSE - fstps \offset (\addr) -.AENDI -.ENDM - -#-------------------------------------------------------------------------- -# Arguments (STKOFF = 16 from 4 pushes) -.AIF \&GLIDE_DEBUG EQ 1 -STKOFF .EQU 16 -.AELSE -STKOFF .EQU 16 -.AENDI -_va$ .EQU 4 + STKOFF -_vb$ .EQU 8 + STKOFF -_vc$ .EQU 12 + STKOFF - -X .EQU 0 -Y .EQU 4 - -fa .REG (%eax) # vtx a from caller -fb .REG (%ebx) # vtx b from caller -fc .REG (%ecx) # vtx c from caller - # edx is used as index, loading from *src -gc .REG (%esi) # points to graphics context -dlp .REG (%esi) # points to dataList structure -hw .REG (%edi) # points to the hardware -fifo .REG (%edi) # points to next entry in fifo - -tmpx .REG (%edx) # temp X storage -i .REG (%edx) # i = dlp->i -tmpy .REG (%ebp) # temp Y storage - -.text -.align 4 - -#-------------------------------------------------------------------------- - -.AIF \&GLIDE_DEBUG EQ 0 -.globl grDrawTriangle -.type grDrawTriangle, @function -grDrawTriangle: -.AENDI -.globl grDrawTriangle_asm -.type grDrawTriangle_asm, @function -grDrawTriangle_asm: -# FALL THRU to _trisetup - - - - -#-------------------------------------------------------------------------- -## -## _trisetup_asm - do triangle setup & send down draw command -## -## USAGE: -## -## -.globl _trisetup_asm -.type _trisetup_asm, @function -_trisetup_asm: -# 28 - - - # save ebx, esi, edi, ebp - push %ebx - push %esi - - push %edi - push %ebp - -#vertex sorting is done as follows: -# 1 First, load the y values of vtx a, b, c into integer registers -# -# This is done in the segment vertex_load below. -# -# Note that this trashes the pointers, we will reload them later -# -# If any of the y values is negative, convert to a pseudo-2s complement -# form by xor'ing with 7fffffff. This lets us use 2s complement integer -# comparisons for floating point comparisons. -# -# 2 Compare a.y, b.y, c.y, and setup pointers fa, fb, fc so that -# a.y <= b.y <= c.y. -# -# Note that fa, fb, fc registers point once more to vertex structs, -# though not necessarily in the order that the application passes it to -# this routine. -# -# This is done in the segment vertex_y_sort below, with many many -# compare/branches. -# -# All the compare/branches converge to sst_load_xy_regs. -# -# 3 Load the (x,y) values into the floating point SST registers for Fa, Fb, -# and Fc. Done in the segment sst_load_xy_regs. -# -# 4 Restore fa, fb, fc to the user's order. Also save the vertex -# with lowest y value on the stack, this will be used later for -# loading parameter values into the SST regs. -# -############## - - -#-------------------------------------------------------------------------- - - mov _va$(%esp), fa # 1 - mov _vb$(%esp), fb - mov _vc$(%esp), fc - movl (_GlideRoot+trisProcessed), tmpy # _GlideRoot.stats.trisProcessed++# -# 36-3 -.Lvertex_y_load: - mov Y(fa), fa # 2 - mov Y(fb), fb - cmp $0, fa # 3 - jge .La_positive - xor $0x7fffffff, fa -.align 4 -.La_positive: - cmp $0, fb # 4 - jge .Lb_positive - xor $0x7fffffff, fb -.align 4 -.Lb_positive: - mov Y(fc), fc # 5 - movl (_GlideRoot+curGC), gc - cmp $0, fc # 6 - jge .Lc_positive - xor $0x7fffffff, fc -.Lc_positive: -# 42-3 -# 24-30 with direct fall-thru -# jmp ret_pop0f -#-------------------------------------------------------------------------- -.Lvertex_y_sort: - - cmp fb, fa # if (ay < by) { - jge .LAgtB - cmp fc, fb # if (by > cy) { - jle .Labc - cmp fc, fa # if (ay < cy) { - jge .Lcab - -.Lacb: # acb - mov _va$(%esp), fa - mov cull_mode(gc), tmpx # culltest = gc->state.cull_mode - mov _vc$(%esp), fb - mov _vb$(%esp), fc - xor $1, tmpx # culltest ^= 1 - jmp .LArea_Computation - -.align 4 -.Lcab: # cab - mov _vc$(%esp), fa # fa = &vc->x - mov cull_mode(gc), tmpx # culltest = gc->state.cull_mode - mov _va$(%esp), fb # fb = &va->x - mov _vb$(%esp), fc # fc = &vb->x - # HOLE - jmp .LArea_Computation - -.align 4 -.Labc: # abc - mov _va$(%esp), fa # fa = &va->x - mov _vb$(%esp), fb # fb = &vb->x - mov _vc$(%esp), fc # fc = &vc->x - mov cull_mode(gc), tmpx # culltest = gc->state.cull_mode - # HOLE - jmp .LArea_Computation - -.align 4 -.LAgtB: # } else { - cmp fc, fb # if (by < cy) - jge .Lcba - cmp fc, fa # if (ay < cy) - jge .Lbca -.Lbac: # bac - mov _vb$(%esp), fa - mov cull_mode(gc), tmpx # culltest = gc->state.cull_mode - mov _va$(%esp), fb - mov _vc$(%esp), fc - xor $1, tmpx # culltest ^= 1 - jmp .LArea_Computation - -.align 4 -.Lcba: # cba - mov _vc$(%esp), fa - mov cull_mode(gc), tmpx # culltest = gc->state.cull_mode - mov _vb$(%esp), fb - mov _va$(%esp), fc - xor $1, tmpx # culltest ^= 1 - jmp .LArea_Computation - -.align 4 -.Lbca: # bca - mov _vb$(%esp), fa - mov _vc$(%esp), fb - mov _va$(%esp), fc - mov cull_mode(gc), tmpx # culltest = gc->state.cull_mode -#-------------------------------------------------------------------------- -.align 4 -.LArea_Computation: -# 47-3 -# jmp ret_pop0f - flds X(fa) # xa - fsubs X(fb) # dxAB - fsts dxAB - flds X(fb) # | xb - fsubs X(fc) # | dxBC - fsts dxBC - flds Y(fb) # | | yb - fsubs Y(fc) # | | dyBC - fsts dyBC - flds Y(fa) # | | | ya - fsubs Y(fb) # | | | dyAB - fsts dyAB - fld %st(3) # | | | | dxAB - fsts Area - fmul %st(2), %st # | | | | t0 t0=dxAB*dyBC - fsts Area - fld %st(3) # | | | | | dxBC - fsts Area - fmul %st(2), %st # | | | | | t1 t1=dxBC*dyAB - fsts Area - fsubrp %st,%st(1) # | | | | area - - fsts zArea # | | | | area - - # Zero Area Triangle Check - mov zArea, tmpy # j = *(long *)&area - and $0x7fffffff,tmpy # if ((j & 0x7FFFFFFF) == 0) - jz .Lzero_area - - # Cull Check - sal $31, tmpx # culltest<<31 - mov cull_mode (gc), tmpy # load gc->state.cull_mode - test tmpy, tmpy # if (gc->state.cull_mode != GR_CULL_DISABLE) - je .Lnocull1 - # culling ENABLED - mov zArea, tmpy # reload area - xor tmpx, tmpy # if (j ^ (culltest<<31)) - jge .Lbackfaced - -.Lnocull1: # culling disabled - # OOA Calculation - fdivrs One # | | | | ooa - - # Fetch Fifo Ptr - mov fifoPtr(gc), fifo - - # P6 Check - mov (_GlideRoot+CPUType), tmpx - cmp $6, tmpx - - je .Lfence - -.align 4 -.LfenceDone: - # Wrap Check - mov (_GlideRoot+curTriSize), tmpx - mov fifoSize(gc), tmpy - - sub tmpx, tmpy - jl .Lwrap - -.align 4 -.LwrapDone: - mov tmpy, fifoSize(gc) - # Adjust Fifo Ptr - mov fifo, tmpy - add tmpx, tmpy - mov tmpy, fifoPtr(gc) - - # Begin Tri Packet - mov gwCommand(gc), tmpx - mov gwHeaders(gc), tmpy - - GR_SET_GW_CMD fifo, 0, tmpx - GR_SET_GW_HEADER fifo, 4, tmpy - - # Download X, Y * 3 - mov X(fa), tmpx - mov Y(fa), tmpy - - GR_SET_GW_ENTRY fifo, 8, tmpx - GR_SET_GW_ENTRY fifo, 12, tmpy - - mov X(fb), tmpx - mov Y(fb), tmpy - - GR_SET_GW_ENTRY fifo, 16, tmpx - GR_SET_GW_ENTRY fifo, 20, tmpy - - mov X(fc), tmpx - mov Y(fc), tmpy - - GR_SET_GW_ENTRY fifo, 24, tmpx - GR_SET_GW_ENTRY fifo, 28, tmpy - - add $32, fifo - - mov dataList(gc), i # i = gc->datalist[0]->i - add $ dataList, dlp # dlp = gc->dataList - - # Early out for no interp - test i, i - je .Lno_interpolation - - # Setup for Parameter Calculator - # dxAB dxBC dyBC dyAB ooa - fmul %st, %st(4) # DXAB | | | | - fmul %st, %st(3) # | DXBC | | | - fmul %st, %st(2) # | | DYBC | | - fmulp %st, %st(1) # | | | DYAB - fxch %st(3) # DYAB | | DXAB - fstps zdxAB # | | DYBC - fstps zdyBC # | DXBC - fstps zdxBC # DYAB - fstps zdyAB # - - # Parameter Calculator -.align 4 -.Lnext_parm: - test $1, i - jnz .Lsecondary_packet - - mov (fa, i), tmpy # tmpy = fa[i] - flds (fa, i) # pa - fsubs (fb, i) # dpAB - flds (fb, i) # | pb - fsubs (fc, i) # dpAB dpBC - - fld %st(1) # | | dpAB - fmuls zdyBC # | | p0x - fld %st(1) # | | | dpBC - fmuls zdyAB # | | | p1x - fxch %st(3) # p1x | | dpAB - # | | | | - GR_SET_GW_ENTRY fifo, 0, tmpy - fmuls zdxBC # | | | p1y - fxch %st(2) # | p1y | dpBC - fmuls zdxAB # | | | p0y - fxch %st(3) # p0y | | p1x - fsubrp %st, %st(1) # | | dpdx - fxch %st(2) # dpdx | p0y - fsubp %st, %st(1) # | dpdy - fxch %st(1) # dpdy dpdx - mov dl_i + SIZEOF_dataList(dlp), i # i = dlp[1]->i - add $ SIZEOF_dataList, dlp # dlp++ - # | - GR_FSET_GW_ENTRY fifo, 4 - # empty - GR_FSET_GW_ENTRY fifo, 8 - add $12, fifo - test i,i # while (i) - jne .Lnext_parm # - -.align 4 -.Ltriangle_command: - # Write Triangle Command - mov zArea, tmpx - GR_SET_GW_ENTRY fifo, 0, tmpx - test $7, fifo - jnz .Lno_padding0 - GR_SET_GW_ENTRY fifo, 4, tmpx -.Lno_padding0: - # Cleanup - pop %ebp - pop %edi - pop %esi - pop %ebx - mov $1, %eax # return 1 (triangle drawn) - ret - - -.align 4 -.Lzero_area: -.Lbackfaced: - fstp %st(0) # 4 - fstp %st(0) # 3 - fstp %st(0) # 2 - fstp %st(0) # 1 - fstp %st(0) # 0 - pop %ebp - pop %edi - pop %esi - pop %ebx - xor %eax, %eax # return 0 (triangle drawn) - ret - -.align 4 -.Lwrap: - push %eax - push %ebx - push %ecx - push %edx - call _grSst96FifoMakeRoom - pop %edx - pop %ecx - pop %ebx - pop %eax - mov fifoPtr(gc), fifo - mov fifoSize(gc), tmpy - sub tmpx, tmpy - jmp .LwrapDone - -.align 4 -.Lfence: - mov writesSinceFence(gc), tmpx - mov (_GlideRoot+curTriSize), tmpy - - shr $2, tmpy - sub tmpy, tmpx - jl .Ldofence - - mov tmpx, writesSinceFence(gc) - jmp .LfenceDone - -.align 4 -.Ldofence: - push %eax - xchg %eax, P6FenceVar - pop %eax - jmp .LfenceDone - -.align 4 -.Lsecondary_packet: - test $7, fifo - jz .Lno_padding1 - GR_SET_GW_ENTRY fifo, 0, tmpx - add $4, fifo -.align 4 -.Lno_padding1: - push tmpx - push gc - - mov dl_addr(dlp), tmpx - mov (_GlideRoot+curGC), gc - - GR_SET_GW_CMD fifo, 0, tmpx - mov gwHeaders(gc, 4), tmpy - - GR_SET_GW_HEADER fifo, 4, tmpy - pop gc - - pop tmpx - add $8, fifo - - mov dl_i + SIZEOF_dataList(dlp), i - add $ SIZEOF_dataList, dlp -.align 4 -.Lnext_parm_1: - mov (fa, i), tmpx # tmpy = fa[i] - flds (fa, i) # pa - fsubs (fb, i) # dpAB - flds (fb, i) # | pb - fsubs (fc, i) # dpAB dpBC - - fld %st(1) # | | dpAB - fmuls zdyBC # | | p0x - fld %st(1) # | | | dpBC - fmuls zdyAB # | | | p1x - fxch %st(3) # p1x | | dpAB - # | | | | - GR_SET_GW_ENTRY fifo, 0, tmpy - fmuls zdxBC # | | | p1y - fxch %st(2) # | p1y | dpBC - fmuls zdxAB # | | | p0y - fxch %st(3) # p0y | | p1x - fsubrp %st,%st(1) # | | dpdx - fxch %st(2) # dpdx | p0y - fsubp %st,%st(1) # | dpdy - fxch %st(1) # dpdy dpdx - mov dl_i + SIZEOF_dataList(dlp), i # i = dlp[1]->i - add $ SIZEOF_dataList, dlp # dlp++ - # | - GR_FSET_GW_ENTRY fifo, 4 - # empty - GR_FSET_GW_ENTRY fifo, 8 - add $12, fifo - test i,i # while (i) - jne .Lnext_parm_1 - - test $7, fifo - jz .Ltriangle_command_packet - GR_SET_GW_ENTRY fifo, 0, tmpx - add $4, fifo -.align 4 -.Ltriangle_command_packet: - mov (_GlideRoot+curGC), gc - mov $0x40000000, tmpy - - mov gwCommand(gc), tmpx - mov zArea, fa - - GR_SET_GW_CMD fifo, 0, tmpx - GR_SET_GW_HEADER fifo, 4, tmpy - - GR_SET_GW_ENTRY fifo, 8, fa - GR_SET_GW_ENTRY fifo, 12, fa - - pop %ebp - pop %edi - pop %esi - pop %ebx - mov $1, %eax # return 1 (triangle drawn) - ret - -.align 4 -.Lno_interpolation: - fstp %st(0) # 4 - fstp %st(0) # 3 - fstp %st(0) # 2 - fstp %st(0) # 1 - fstp %st(0) # 0 - jmp .Ltriangle_command - -.L_end_tri_setup_asm: -.AIF \&GLIDE_DEBUG EQ 0 -.size grDrawTriangle,.L_end_tri_setup_asm-grDrawTriangle -.AENDI -.size grDrawTriangle_asm,.L_end_tri_setup_asm-grDrawTriangle_asm -.size _trisetup_asm,.L_end_tri_setup_asm-_trisetup_asm - -# [++++ from above] -# This comment was moved here to make the code in the loop more readable -# STALL HERE due to PCI write buffer being full on last instruction: -# The write to the packerHackAddress takes 3 bus clocks, during which -# we may not write to the PCI buffer without stalling. This causes -# the amount of clocks the workaround adds to the loop to vary in the -# following way++: -# -# CPU Bus/CPU Clock Total Bus Total Penalty -# Ratio* Clocks Since (add to later clocks) -#====================================================================== -# P55c-200/P5-180: 6/1 1.3 (3 - 1.3) * 6 + 6 = 17 -# P5-166/P5-150: 5/1 1.8 (3 - 1.8) * 5 + 6 = 12 -# P5-120: 4/1 2.25 (3 - 2.25) * 4 + 6 = 9 -# P5-100/P5-90: 3/1 3 (3 - 3) * 3 + 6 = 6 -# -# * P5-200 haa a 33MHz bus, P5-166 has a 33MHz bus, -# P5-150 has a 30MHz bus, P5-120 has a 30MHz bus, -# P5-100 has a 33MHz bus, P5-90 has a 30MHz bus -# -#++ These calculations also assume that we NEVER get to continue a burst -# from having the next parameter be consecutive from the current one. -# If we did get that, then we have to add two more bus clocks to the -# penalty for the next write (labeled loop clock 10), so that looks like -# CPU Total Penalty -# ============================================ -# P55c-200/P5-180:(2 * 6) + 17 = 29 clocks!!! -# P5-166/P5-150: (2 * 5) + 12 = 22 clocks!! -# P5-120: (2 * 4) + 9 = 17 clocks! -# P5-100/P5-90 (2 * 3) + 6 = 12 clocks -# - -#_TEXT ENDS -.END diff --git a/glide2x/sst1/glide/src/xdraw96.asm b/glide2x/sst1/glide/src/xdraw96.asm deleted file mode 100644 index 2cb5889..0000000 --- a/glide2x/sst1/glide/src/xdraw96.asm +++ /dev/null @@ -1,686 +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$ -; -; 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. -;; - -TITLE xdraw.asm -OPTION OLDSTRUCTS -.586P - -.model FLAT,C ; Flat memory, mangle publics with leading '_' - -EXTRN _GlideRoot:DWORD -EXTRN _grSpinFifo:NEAR -EXTRN _grSst96FifoMakeRoom:NEAR - - -; some useful floating load and store macros -flds TEXTEQU -fsubs TEXTEQU -fmuls TEXTEQU - -_DATA SEGMENT - One DD 03f800000r - Area DD 0 - dxAB DD 0 - dxBC DD 0 - dyAB DD 0 - dyBC DD 0 - culltest DD 0 - P6FenceVar DD 0 -_DATA ENDS - -; Ugly, but seems to workaround the problem with locally defined -; data segment globals not getting relocated properly when using -; djgpp. - -zArea TEXTEQU -zdxAB TEXTEQU -zdxBC TEXTEQU -zdyAB TEXTEQU -zdyBC TEXTEQU -zculltest TEXTEQU - -;;; Some useful SST-1 offsets -INCLUDE fxgasm.h - -;; enables/disables trisProcessed and trisDrawn counters -STATS = 1 - -;-------------------------------------------------------------------------- -;;; Macro for P6 Fencing operation -;;; Note that this destroys eax, but if you do 2 fences eax will be restored -IFDEF GLIDE_DEBUG -EXTRN _GR_SET_GW_CMD:NEAR -EXTRN _GR_SET_GW_HEADER:NEAR -EXTRN _GR_SET_GW_ENTRY:NEAR -ENDIF - -GR_SET_GW_CMD MACRO addr, offset, data -IFDEF GLIDE_DEBUG - push eax - push ecx - push edx - - push data - lea eax, [addr+offset] - push eax - call _GR_SET_GW_CMD - add esp, 8 - pop edx - pop ecx - pop eax -ELSE - mov [addr+offset], data -ENDIF -ENDM - -GR_SET_GW_HEADER MACRO addr, offset, data -IFDEF GLIDE_DEBUG - push eax - push ecx - push edx - push data - lea eax, [addr+offset] - push eax - call _GR_SET_GW_HEADER - add esp, 8 - pop edx - pop ecx - pop eax -ELSE - mov [addr+offset], data -ENDIF -ENDM - -GR_SET_GW_ENTRY MACRO addr, offset, data -IFDEF GLIDE_DEBUG - push eax - push ecx - push edx - push data - lea eax, [addr+offset] - push eax - call _GR_SET_GW_ENTRY - add esp, 8 - pop edx - pop ecx - pop eax -ELSE - mov [addr+offset], data -ENDIF -ENDM - -GR_FSET_GW_ENTRY MACRO addr, offset -IFDEF GLIDE_DEBUG - push eax - push ecx - push edx - sub esp, 4 - fstp DWORD PTR [esp] - lea eax, [addr+offset] - push eax - call _GR_SET_GW_ENTRY - add esp, 8 - pop edx - pop ecx - pop eax -ELSE - fstp DWORD PTR [addr+offset] -ENDIF -ENDM - -;-------------------------------------------------------------------------- -; Arguments (STKOFF = 16 from 4 pushes) -STKOFF = 16 - - - - -_va$ = 4 + STKOFF -_vb$ = 8 + STKOFF -_vc$ = 12 + STKOFF - -X = 0 -Y = 4 - -fa TEXTEQU ; vtx a from caller -fb TEXTEQU ; vtx b from caller -fc TEXTEQU ; vtx c from caller - ; edx is used as index, loading from *src -gc TEXTEQU ; points to graphics context -dlp TEXTEQU ; points to dataList structure -hw TEXTEQU ; points to the hardware -fifo TEXTEQU ; points to next entry in fifo - -tmpx TEXTEQU ; temp X storage -i TEXTEQU ; i = dlp->i -tmpy TEXTEQU ; temp Y storage - -_TEXT SEGMENT - -;-------------------------------------------------------------------------- - align 4 - PUBLIC grDrawTriangle_asm -grDrawTriangle_asm PROC NEAR - .code - -grDrawTriangle_asm ENDP - -; FALL THRU to _trisetup - -;-------------------------------------------------------------------------- -;; -;; _trisetup_asm - do triangle setup & send down draw command -;; -;; USAGE: -;; -;; - align 4 - PUBLIC _trisetup_asm@12 -_trisetup_asm@12 PROC NEAR - .code -; 28 - ; save ebx, esi, edi, ebp - push ebx - push esi - - push edi - push ebp - -;vertex sorting is done as follows: -; 1. First, load the y values of vtx a, b, c into integer registers -; -; This is done in the segment vertex_load below. -; -; Note that this trashes the pointers, we will reload them later -; -; If any of the y values is negative, convert to a pseudo-2's complement -; form by xor'ing with 7fffffff. This lets us use 2's complement integer -; comparisons for floating point comparisons. -; -; 2. Compare a.y, b.y, c.y, and setup pointers fa, fb, fc so that -; a.y <= b.y <= c.y. -; -; Note that fa, fb, fc registers point once more to vertex structs, -; though not necessarily in the order that the application passes it to -; this routine. -; -; This is done in the segment vertex_y_sort below, with many many -; compare/branches. -; -; All the compare/branches converge to sst_load_xy_regs. -; -; 3. Load the (x,y) values into the floating point SST registers for Fa, Fb, -; and Fc. Done in the segment sst_load_xy_regs. -; -; 4. Restore fa, fb, fc to the user's order. Also save the vertex -; with lowest y value on the stack, this will be used later for -; loading parameter values into the SST regs. -; -;;;;;;;;;;;;;; - - -;-------------------------------------------------------------------------- - - - mov fa, [esp + _va$] ; 1 - mov fb, [esp + _vb$] - mov fc, [esp + _vc$] - mov tmpy, [_GlideRoot + trisProcessed] ; _GlideRoot.stats.trisProcessed++; -; 36-3 -vertex_y_load: - mov fa, [fa + Y] ; 2 - mov fb, [fb + Y] - cmp fa, 0 ; 3 - jge a_positive - xor fa, 7fffffffh - align 4 -a_positive: - cmp fb, 0 ; 4 - jge b_positive - xor fb, 7fffffffh - align 4 -b_positive: - mov fc, [fc + Y] ; 5 - mov gc, [_GlideRoot + curGC] - cmp fc, 0 ; 6 - jge c_positive - xor fc, 7fffffffh -c_positive: -; 42-3 -; 24-30 with direct fall-thru -; jmp ret_pop0f -;-------------------------------------------------------------------------- -vertex_y_sort: - - cmp fa, fb ; if (ay < by) { - jge AgtB - cmp fb, fc ; if (by > cy) { - jle abc - cmp fa, fc ; if (ay < cy) { - jge cab - - acb: ; acb - mov fa, [esp + _va$] - mov tmpx, [gc + cull_mode] ; culltest = gc->state.cull_mode - mov fb, [esp + _vc$] - mov fc, [esp + _vb$] - xor tmpx, 1 ; culltest ^= 1 - jmp Area_Computation - - align 4 - cab: ; cab - mov fa, [esp + _vc$] ; fa = &vc->x - mov tmpx, [gc + cull_mode] ; culltest = gc->state.cull_mode - mov fb, [esp + _va$] ; fb = &va->x - mov fc, [esp + _vb$] ; fc = &vb->x - ; HOLE - jmp Area_Computation - - align 4 - abc: ; abc - mov fa, [esp + _va$] ; fa = &va->x - mov fb, [esp + _vb$] ; fb = &vb->x - mov fc, [esp + _vc$] ; fc = &vc->x - mov tmpx, [gc + cull_mode] ; culltest = gc->state.cull_mode - ; HOLE - jmp Area_Computation - - align 4 - AgtB: ; } else { - cmp fb, fc ; if (by < cy) - jge cba - cmp fa, fc ; if (ay < cy) - jge bca - bac: ; bac - mov fa, [esp + _vb$] - mov tmpx, [gc + cull_mode] ; culltest = gc->state.cull_mode - mov fb, [esp + _va$] - mov fc, [esp + _vc$] - xor tmpx, 1 ; culltest ^= 1 - jmp Area_Computation - - align 4 - cba: ; cba - mov fa, [esp + _vc$] - mov tmpx, [gc + cull_mode] ; culltest = gc->state.cull_mode - mov fb, [esp + _vb$] - mov fc, [esp + _va$] - xor tmpx, 1 ; culltest ^= 1 - jmp Area_Computation - - align 4 - bca: ; bca - mov fa, [esp + _vb$] - mov fb, [esp + _vc$] - mov fc, [esp + _va$] - mov tmpx, [gc + cull_mode] ; culltest = gc->state.cull_mode -;-------------------------------------------------------------------------- - align 4 -Area_Computation: -; 47-3 -; jmp ret_pop0f - flds [fa + X] ; xa - fsubs [fb + X] ; dxAB - flds [fb + X] ; | xb - fsubs [fc + X] ; | dxBC - flds [fb + Y] ; | | yb - fsubs [fc + Y] ; | | dyBC - flds [fa + Y] ; | | | ya - fsubs [fb + Y] ; | | | dyAB - fld st(3) ; | | | | dxAB - fmul st, st(2) ; | | | | t0 t0=dxAB*dyBC - fld st(3) ; | | | | | dxBC - fmul st, st(2) ; | | | | | t1 t1=dxBC*dyAB - fsubp st(1),st ; | | | | area - - fst zArea ; | | | | area - - ; Zero Area Triangle Check - mov tmpy, zArea ; j = *(long *)&area - and tmpy, 7fffffffh ; if ((j & 0x7FFFFFFF) == 0) - jz zero_area - - ; Cull Check - sal tmpx, 31 ; culltest<<31 - mov tmpy, [gc + cull_mode] ; load gc->state.cull_mode - test tmpy, tmpy ; if (gc->state.cull_mode != GR_CULL_DISABLE) - je nocull1 - ; culling ENABLED - mov tmpy, zArea ; reload area - xor tmpy,tmpx ; if (j ^ (culltest<<31)) - jge backfaced - -nocull1: ; culling disabled - ; OOA Calculation - fdivr One ; | | | | ooa - - ; Fetch Fifo Ptr - mov fifo, [gc + fifoPtr]; - - ; P6 Check - mov tmpx, [_GlideRoot + CPUType] - cmp tmpx, 6h - - je fence - - align 4 -fenceDone: - ; Wrap Check - mov tmpx, [_GlideRoot + curTriSize] - mov tmpy, [gc + fifoSize] - - sub tmpy, tmpx - jl wrap - - align 4 -wrapDone: - mov [gc + fifoSize], tmpy - ; Adjust Fifo Ptr - mov tmpy, fifo - add tmpy, tmpx - mov [gc + fifoPtr], tmpy - - ; Begin Tri Packet - mov tmpx, [gc + gwCommand] - mov tmpy, [gc + gwHeaders] - - GR_SET_GW_CMD fifo, 0, tmpx - GR_SET_GW_HEADER fifo, 4, tmpy - - ; Download X, Y * 3 - mov tmpx, [fa + X] - mov tmpy, [fa + Y] - - GR_SET_GW_ENTRY fifo, 8, tmpx - GR_SET_GW_ENTRY fifo, 12, tmpy - - mov tmpx, [fb + X] - mov tmpy, [fb + Y] - - GR_SET_GW_ENTRY fifo, 16, tmpx - GR_SET_GW_ENTRY fifo, 20, tmpy - - mov tmpx, [fc + X] - mov tmpy, [fc + Y] - - GR_SET_GW_ENTRY fifo, 24, tmpx - GR_SET_GW_ENTRY fifo, 28, tmpy - - add fifo, 32 - - mov i, [gc+dataList] ; i = gc->datalist[0]->i - add dlp, dataList ; dlp = gc->dataList - - ; Early out for no interp - test i, i - je no_interpolation - - ; Setup for Parameter Calculator - ; dxAB dxBC dyBC dyAB ooa - fmul st(4), st ; DXAB | | | | - fmul st(3), st ; | DXBC | | | - fmul st(2), st ; | | DYBC | | - fmulp st(1), st ; | | | DYAB - fxch st(3) ; DYAB | | DXAB - fstp zdxAB ; | | DYBC - fstp zdyBC ; | DXBC - fstp zdxBC ; DYAB - fstp zdyAB ; - - ; Parameter Calculator - align 4 -next_parm: - test i,1 - jnz secondary_packet - - mov tmpy, [fa + i] ; tmpy = fa[i] - flds [fa + i] ; pa - fsubs [fb + i] ; dpAB - flds [fb + i] ; | pb - fsubs [fc + i] ; dpAB dpBC - - fld st(1) ; | | dpAB - fmuls zdyBC ; | | p0x - fld st(1) ; | | | dpBC - fmuls zdyAB ; | | | p1x - fxch st(3) ; p1x | | dpAB - - GR_SET_GW_ENTRY fifo, 0, tmpy ; | | | | - fmuls zdxBC ; | | | p1y - fxch st(2) ; | p1y | dpBC - fmuls zdxAB ; | | | p0y - fxch st(3) ; p0y | | p1x - fsubp st(1),st ; | | dpdx - fxch st(2) ; dpdx | p0y - fsubrp st(1),st ; | dpdy - fxch st(1) ; dpdy dpdx - mov i, [dlp + SIZEOF_dataList + dl_i] ; i = dlp[1]->i - add dlp, SIZEOF_dataList ; dlp++; - - GR_FSET_GW_ENTRY fifo, 4 ; | - - GR_FSET_GW_ENTRY fifo, 8 ; empty - add fifo, 12 - test i,i ; while (i) - jne next_parm ; - - align 4 -triangle_command: - ; Write Triangle Command - mov tmpx, zArea - GR_SET_GW_ENTRY fifo, 0, tmpx - test fifo, 7h - jnz no_padding0 - GR_SET_GW_ENTRY fifo, 4, tmpx -no_padding0: - ; Cleanup - pop ebp - pop edi - pop esi - pop ebx - mov eax, 1h ; return 1 (triangle drawn) - ret 12 - - - align 4 -zero_area: -backfaced: - fstp st(0) ; 4 - fstp st(0) ; 3 - fstp st(0) ; 2 - fstp st(0) ; 1 - fstp st(0) ; 0 - pop ebp - pop edi - pop esi - pop ebx - xor eax, eax ; return 0 (triangle drawn) - ret 12 - - align 4 -wrap: - push eax - push ecx - push edx - call _grSst96FifoMakeRoom - pop edx - pop ecx - pop eax - mov fifo, [gc + fifoPtr] - mov tmpy, [gc + fifoSize] - sub tmpy, tmpx - jmp wrapDone - - align 4 -fence: - mov tmpx, [gc + writesSinceFence]; - mov tmpy, [_GlideRoot + curTriSize] - - shr tmpy, 2 - sub tmpx, tmpy - jl dofence - - mov [gc + writesSinceFence], tmpx - jmp fenceDone - - align 4 -dofence: - push eax - xchg eax, P6FenceVar - pop eax - jmp fenceDone - - align 4 -secondary_packet: - test fifo, 7h - jz no_padding1 - GR_SET_GW_ENTRY fifo, 0, tmpx - add fifo, 4 - align 4 -no_padding1: - push tmpx - push gc - - mov tmpx, [dlp + dl_addr] - mov gc, [_GlideRoot + curGC] - - GR_SET_GW_CMD fifo, 0, tmpx - mov tmpy, [gc + gwHeaders + 4] - - GR_SET_GW_HEADER fifo, 4, tmpy - pop gc - - pop tmpx - add fifo, 8 - - mov i, [dlp + SIZEOF_dataList + dl_i] - add dlp, SIZEOF_dataList - align 4 -next_parm_1: - mov tmpy, [fa + i] ; tmpy = fa[i] - flds [fa + i] ; pa - fsubs [fb + i] ; dpAB - flds [fb + i] ; | pb - fsubs [fc + i] ; dpAB dpBC - - fld st(1) ; | | dpAB - fmuls zdyBC ; | | p0x - fld st(1) ; | | | dpBC - fmuls zdyAB ; | | | p1x - fxch st(3) ; p1x | | dpAB - - GR_SET_GW_ENTRY fifo, 0, tmpy ; | | | | - fmuls zdxBC ; | | | p1y - fxch st(2) ; | p1y | dpBC - fmuls zdxAB ; | | | p0y - fxch st(3) ; p0y | | p1x - fsubp st(1),st ; | | dpdx - fxch st(2) ; dpdx | p0y - fsubrp st(1),st ; | dpdy - fxch st(1) ; dpdy dpdx - mov i, [dlp + SIZEOF_dataList + dl_i] ; i = dlp[1]->i - add dlp, SIZEOF_dataList ; dlp++; - - GR_FSET_GW_ENTRY fifo, 4 ; | - - GR_FSET_GW_ENTRY fifo, 8 ; empty - add fifo, 12 - test i,i ; while (i) - jne next_parm_1; - - test fifo, 7h - jz triangle_command_packet - GR_SET_GW_ENTRY fifo, 0, tmpx - add fifo, 4 - align 4 -triangle_command_packet: - mov gc, [_GlideRoot + curGC] - mov tmpy, 40000000h - - mov tmpx, [gc + gwCommand] - mov fa, zArea - - GR_SET_GW_CMD fifo, 0, tmpx - GR_SET_GW_HEADER fifo, 4, tmpy - - GR_SET_GW_ENTRY fifo, 8, fa - GR_SET_GW_ENTRY fifo, 12, fa - - pop ebp - pop edi - pop esi - pop ebx - mov eax, 1h ; return 1 (triangle drawn) - ret 12 - - align 4 -no_interpolation: - fstp st(0) ; 4 - fstp st(0) ; 3 - fstp st(0) ; 2 - fstp st(0) ; 1 - fstp st(0) ; 0 - jmp triangle_command - -_trisetup_asm@12 ENDP - -; [++++ from above] -; This comment was moved here to make the code in the loop more readable -; STALL HERE due to PCI write buffer being full on last instruction: -; The write to the packerHackAddress takes 3 bus clocks, during which -; we may not write to the PCI buffer without stalling. This causes -; the amount of clocks the workaround adds to the loop to vary in the -; following way++: -; -; CPU Bus/CPU Clock Total Bus Total Penalty -; Ratio* Clocks Since (add to later clocks) -;====================================================================== -; P55c-200/P5-180: 6/1 1.3 (3 - 1.3) * 6 + 6 = 17 -; P5-166/P5-150: 5/1 1.8 (3 - 1.8) * 5 + 6 = 12 -; P5-120: 4/1 2.25 (3 - 2.25) * 4 + 6 = 9 -; P5-100/P5-90: 3/1 3 (3 - 3) * 3 + 6 = 6 -; -; * P5-200 haa a 33MHz bus, P5-166 has a 33MHz bus, -; P5-150 has a 30MHz bus, P5-120 has a 30MHz bus, -; P5-100 has a 33MHz bus, P5-90 has a 30MHz bus -; -;++ These calculations also assume that we NEVER get to continue a burst -; from having the next parameter be consecutive from the current one. -; If we did get that, then we have to add two more bus clocks to the -; penalty for the next write (labeled loop clock 10), so that looks like -; CPU Total Penalty -; ============================================ -; P55c-200/P5-180:(2 * 6) + 17 = 29 clocks!!! -; P5-166/P5-150: (2 * 5) + 12 = 22 clocks!! -; P5-120: (2 * 4) + 9 = 17 clocks! -; P5-100/P5-90 (2 * 3) + 6 = 12 clocks -; - -_TEXT ENDS -END diff --git a/glide2x/sst1/glide/tests/alpha.3df b/glide2x/sst1/glide/tests/alpha.3df deleted file mode 100644 index e67fc8a..0000000 Binary files a/glide2x/sst1/glide/tests/alpha.3df and /dev/null differ diff --git a/glide2x/sst1/glide/tests/ap88.3df b/glide2x/sst1/glide/tests/ap88.3df deleted file mode 100644 index f465e2d..0000000 Binary files a/glide2x/sst1/glide/tests/ap88.3df and /dev/null differ diff --git a/glide2x/sst1/glide/tests/argb1555.3df b/glide2x/sst1/glide/tests/argb1555.3df deleted file mode 100644 index 98d7374..0000000 --- a/glide2x/sst1/glide/tests/argb1555.3df +++ /dev/null @@ -1,806 +0,0 @@ -3df v1.1 -argb1555 -lod range: 1 256 -aspect ratio: 1 1 -)K)K559m5m5n5m11111L1L)K)K) -) -)K)K1L1L5m5mA°=¯AÐ=¯5595AïAïJFIðEðAðAðIðEðAðAðAðAðIðEðAðAðAðAðAðAðIðEðAðAð1Œ1Œ-*1*1L1L)K)K1L1L-l-l1L1L1L1L)K)K5m5m)K)K1L1L)K)K)K)K)K)K) -) -) -) -)K)K1L1L115n5m115595111L1L11111L1L)K)K) -) -)K)K) -) -)K)K11551*-*) -) -)K)K1L1L11-l-l1L1L) -) -)K)K)K)K1L1L55IðIð5559AðAðAïAïJFAðAðAðAðAðAðAðAðAïAïIðEðAðAðAðAðIðEðAðAð551L1L)K)K-*1*-l-l-*1*-l-l-l-l1L1L)K)K5m5m1L1L)K)K)K)K)K)K) -) -) -) -)K)K)K)K5m5m-l-l11559555111L1L551111AïAï-*1*)K)K)K)K) -) -)K)K559m5m5n5m11111L1L)K)K) -) -)K)K1L1L5m5mA°=¯AÐ=¯5595AïAïJFIðEðAðAðIðEðAðAðAðAðIðEðAðAðAðAðAðAðIðEðAðAð1Œ1Œ-*1*1L1L)K)K1L1L-l-l1L1L1L1L)K)K5m5m)K)K1L1L)K)K)K)K)K)K) -) -) -) -)K)K1L1L115n5m115595111L1L11111L1L)K)K) -) -)K)K) -) -)K)K11551*-*) -) -)K)K1L1L11-l-l1L1L) -) -)K)K)K)K1L1L55IðIð5559AðAðAïAïJFAðAðAðAðAðAðAðAðAïAïIðEðAðAðAðAðIðEðAðAð551L1L)K)K-*1*-l-l-*1*-l-l-l-l1L1L)K)K5m5m1L1L)K)K)K)K)K)K) -) -) -) -)K)K)K)K5m5m-l-l11559555111L1L551111AïAï-*1*)K)K)K)K) -) -1111--115k5k=Ž=Ž,ç,ç § §(¥(¥ § § ç ç § § ¥ ¥ Æ Æ Æ Æ(¥(¥ ç ç$Æ$Æ(ç(ç(ç(ç$Ç$Ç(ç(ç(ç(ç$Æ$Æ § § ¥ ¥ ¥ ¥(ç(ç § § ¥ ¥ § § Æ Æ$Æ$Æ,ç,ç5J5J55955k5k95=Œ=Œ5m5m=Œ=Œ=Ž=Ž=Ž=Ž55955k5k9m5m5Ž5955k5k9I5I11--5J5J5k5k9I5I5k5k9k5k5k5k9k5k5k5k9k5k5k5k95,Æ,Æ,¥,¥,Æ,Æ4ç4ç951)1),Æ,Æ † †(ç(ç § § ç ç Æ Æ$¥$¥ § § Æ Æ(¥(¥ ç ç(ç(ç(ç(ç(ç(ç(ç(ç$Æ$Æ(ç(ç$Æ$Æ § § „ „ ç ç(ç(ç$¥$¥$¥$¥ § § ç ç,Æ,Æ11=¯A°1Œ1Œ5m5m=Œ=Œ5k5k955Ž5=Œ=Œ=Ž=Ž5595=Œ=Œ5m5m=Ž=ŽNSN3=Ž=Ž5I5I9)5)111)1)5J5J5k5k9k5k5I5I9k5k5J5J5k5k9k5k1L1L1111--115k5k=Ž=Ž,ç,ç § §(¥(¥ § § ç ç § § ¥ ¥ Æ Æ Æ Æ(¥(¥ ç ç$Æ$Æ(ç(ç(ç(ç$Ç$Ç(ç(ç(ç(ç$Æ$Æ § § ¥ ¥ ¥ ¥(ç(ç § § ¥ ¥ § § Æ Æ$Æ$Æ,ç,ç5J5J55955k5k95=Œ=Œ5m5m=Œ=Œ=Ž=Ž=Ž=Ž55955k5k9m5m5Ž5955k5k9I5I11--5J5J5k5k9I5I5k5k9k5k5k5k9k5k5k5k9k5k5k5k95,Æ,Æ,¥,¥,Æ,Æ4ç4ç951)1),Æ,Æ † †(ç(ç § § ç ç Æ Æ$¥$¥ § § Æ Æ(¥(¥ ç ç(ç(ç(ç(ç(ç(ç(ç(ç$Æ$Æ(ç(ç$Æ$Æ § § „ „ ç ç(ç(ç$¥$¥$¥$¥ § § ç ç,Æ,Æ11=¯A°1Œ1Œ5m5m=Œ=Œ5k5k955Ž5=Œ=Œ=Ž=Ž5595=Œ=Œ5m5m=Ž=ŽNSN3=Ž=Ž5I5I9)5)111)1)5J5J5k5k9k5k5I5I9k5k5J5J5k5k9k5k1L1L(¥(¥ e …$„$„$„$„,é,é55(¥(¥$d$„ d „dddddcdcdd$„$d ¥ ¥$d$„dd „ ddd„cdddddddd„cdd „ „$¥$¥ d „dddd … e$„$„1)1)=Ž=Ž0ç0ç(¥(¥(¥(¥(¥(¥(¥(¥ § §,¥,¥0ç0ç,Æ,Æ$Ç$Ç0ç0ç0ç0ç1L1L1Œ1Œ(¥(¥(¥(¥ e …(¥(¥$„$„$„$d,¥,¥,¥,¥,¤,¤,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,Æ,Æ,Æ,Æ,Æ,Æ5m5m11dd „ d „ ddcdcdddd „ d$„$d ¥ ¥cd d „dd „ ddddddddd„cdddd$¥$¥dddddcdd(¥(¥,¥,¥5595,¥,¥ † †(¥(¥(¥(¥(¥(¥,¥,¥$Ç$Ç0Æ0Æ0ç0ç$Ç$Ç,Æ,Æ5)5)AòAñ--(¥(¥ d „(¥(¥(¥(¥$„$„,¥,¥,¤,¤,¥,¥,¤,¤,¥,¥,¥,¥,¥,¥,¥,¥(¥(¥ e …$„$„$„$„,é,é55(¥(¥$d$„ d „dddddcdcdd$„$d ¥ ¥$d$„dd „ ddd„cdddddddd„cdd „ „$¥$¥ d „dddd … e$„$„1)1)=Ž=Ž0ç0ç(¥(¥(¥(¥(¥(¥(¥(¥ § §,¥,¥0ç0ç,Æ,Æ$Ç$Ç0ç0ç0ç0ç1L1L1Œ1Œ(¥(¥(¥(¥ e …(¥(¥$„$„$„$d,¥,¥,¥,¥,¤,¤,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,Æ,Æ,Æ,Æ,Æ,Æ5m5m11dd „ d „ ddcdcdddd „ d$„$d ¥ ¥cd d „dd „ ddddddddd„cdddd$¥$¥dddddcdd(¥(¥,¥,¥5595,¥,¥ † †(¥(¥(¥(¥(¥(¥,¥,¥$Ç$Ç0Æ0Æ0ç0ç$Ç$Ç,Æ,Æ5)5)AòAñ--(¥(¥ d „(¥(¥(¥(¥$„$„,¥,¥,¤,¤,¥,¥,¤,¤,¥,¥,¥,¥,¥,¥,¥,¥,Æ,Æ,¥,¥ † † … e0ç0ç5m5m(¥(¥ d „dddc„d„ddddddd ¥ ¥ d „dddcdddd„ddd„d„„dddd¥¥dddddd„cdd(¥(¥5595$Ç$Ç(¥(¥ † †,¥,¥$Ç$Ç,Æ,Æ$Ç$Ç,Æ,Æ$Ç$Ç0ç0ç$Ç$Ç0Æ0Æ=Ž=Ž1L1L,Æ,Æ(¥(¥ † †(¥(¥ † †(¥(¥(¥(¥(¥(¥$d$„,¥,¥0Æ0Æ,Æ,Æ,Æ,Æ$Ç$Ç,Æ,Æ$Ç$Ç,¥,¥,Æ,Æ,Æ,Æ1L1L) -) -$d$„ d „dc„d„d„ddd „ ddd … ecddddc„ddddddd„ddd „ „dd¥¥ d „dd „ „dd … e,Æ,Æ5511 § §(¥(¥ § §,¥,¥$Ç$Ç0ç0ç$Ç$Ç0ç0ç$Ç$Ç,Æ,Æ,é,é5)5)A¯=°$Ç$Ç,¥,¥ § §(¥(¥ † †(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥,Æ,Æ(¥(¥,Æ,Æ,Æ,Æ,¥,¥ † † … e0ç0ç5m5m(¥(¥ d „dddc„d„ddddddd ¥ ¥ d „dddcdddd„ddd„d„„dddd¥¥dddddd„cdd(¥(¥5595$Ç$Ç(¥(¥ † †,¥,¥$Ç$Ç,Æ,Æ$Ç$Ç,Æ,Æ$Ç$Ç0ç0ç$Ç$Ç0Æ0Æ=Ž=Ž1L1L,Æ,Æ(¥(¥ † †(¥(¥ † †(¥(¥(¥(¥(¥(¥$d$„,¥,¥0Æ0Æ,Æ,Æ,Æ,Æ$Ç$Ç,Æ,Æ$Ç$Ç,¥,¥,Æ,Æ,Æ,Æ1L1L) -) -$d$„ d „dc„d„d„ddd „ ddd … ecddddc„ddddddd„ddd „ „dd¥¥ d „dd „ „dd … e,Æ,Æ5511 § §(¥(¥ § §,¥,¥$Ç$Ç0ç0ç$Ç$Ç0ç0ç$Ç$Ç,Æ,Æ,é,é5)5)A¯=°$Ç$Ç,¥,¥ § §(¥(¥ † †(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥,Æ,Æ(¥(¥,Æ,Æ,Æ,Æ † † … e „ „,é,é1Œ1Œ,¥,¥dddd„ddddc„ddd „ „ … edddd „ „„ddd„ddddd„„dd„„ … e$¥$¥dddd„„dd$¥$¥--550ç0ç$Ç$Ç,¥,¥$Ç$Ç § §,Æ,Æ$Ç$Ç0ç0ç$Ç$Ç,Æ,Æ$Ç$Ç0ç0ç=Ž=Ž55(¥(¥(¥(¥ † †(¥(¥ † †$Æ$Æ † †$Ç$Ç(¥(¥ § §,¥,¥ § §0ç0ç,é,é0ç0ç,é,é0ç0ç,é,é$Ç$Ç5n5m95 d „dd„ddddddcdddd „ „ „ „dd „ „„ddddd„ddd„„dddd¥¥ e … ¥ ¥dddcdd$¥$¥(¥(¥551*-*,Æ,Æ,Æ,Æ,¥,¥$Ç$Ç § §$Ç$Ç,Æ,Æ$Ç$Ç0ç0ç$Ç$Ç,Æ,Æ5J5J=¯A°,è,é(¥(¥ † † … e(¥(¥ † † § § † †$Ç$Ç(¥(¥,é,é(¥(¥ § §,Æ,Æ,Æ,Æ † † … e „ „,é,é1Œ1Œ,¥,¥dddd„ddddc„ddd „ „ … edddd „ „„ddd„ddddd„„dd„„ … e$¥$¥dddd„„dd$¥$¥--550ç0ç$Ç$Ç,¥,¥$Ç$Ç § §,Æ,Æ$Ç$Ç0ç0ç$Ç$Ç,Æ,Æ$Ç$Ç0ç0ç=Ž=Ž55(¥(¥(¥(¥ † †(¥(¥ † †$Æ$Æ † †$Ç$Ç(¥(¥ § §,¥,¥ § §0ç0ç,é,é0ç0ç,é,é0ç0ç,é,é$Ç$Ç5n5m95 d „dd„ddddddcdddd „ „ „ „dd „ „„ddddd„ddd„„dddd¥¥ e … ¥ ¥dddcdd$¥$¥(¥(¥551*-*,Æ,Æ,Æ,Æ,¥,¥$Ç$Ç § §$Ç$Ç,Æ,Æ$Ç$Ç0ç0ç$Ç$Ç,Æ,Æ5J5J=¯A°,è,é(¥(¥ † † … e(¥(¥ † † § § † †$Ç$Ç(¥(¥,é,é(¥(¥ § §,Æ,Æ(ç(ç$Ç$Ç † † … e1111,¥,¥dddd„d„ddddc„ddd „ „dd „ „dd„ddd„d…e„„„ddddd¥¥ e … ¥ ¥dddcdd(¥(¥,é,é5k5k,é,é0ç0ç$Ç$Ç,¥,¥$Ç$Ç § §,Æ,Æ$Ç$Ç,é,é$Ç$Ç0ç0ç,é,é5k5k1L1L$¥$¥f†d„d„e…e…¥¥ † † † †,¥,¥$Ç$Ç0ç0ç$Ç$Ç,é,é,ç,ç,é,é(ç(ç,é,é,ç,ç5m5m1*-*$d$„dddddc„d„ddddddd „ „dddddd„ddd„d„„„ddd „ „dd¥¥ e …c„dddd¥¥(¥(¥5m5m11,é,é0ç0ç § §$Æ$Æ$Ç$Ç,¥,¥$Ç$Ç,é,é,¥,¥$Ç$Ç,é,é5)5)A¯=° ¦ §¥¥e…d„d„e…¥¥e… † † § §,ç,ç$Ç$Ç,¥,¥,é,é(ç(ç$Ç$Ç † † … e1111,¥,¥dddd„d„ddddc„ddd „ „dd „ „dd„ddd„d…e„„„ddddd¥¥ e … ¥ ¥dddcdd(¥(¥,é,é5k5k,é,é0ç0ç$Ç$Ç,¥,¥$Ç$Ç § §,Æ,Æ$Ç$Ç,é,é$Ç$Ç0ç0ç,é,é5k5k1L1L$¥$¥f†d„d„e…e…¥¥ † † † †,¥,¥$Ç$Ç0ç0ç$Ç$Ç,é,é,ç,ç,é,é(ç(ç,é,é,ç,ç5m5m1*-*$d$„dddddc„d„ddddddd „ „dddddd„ddd„d„„„ddd „ „dd¥¥ e …c„dddd¥¥(¥(¥5m5m11,é,é0ç0ç § §$Æ$Æ$Ç$Ç,¥,¥$Ç$Ç,é,é,¥,¥$Ç$Ç,é,é5)5)A¯=° ¦ §¥¥e…d„d„e…¥¥e… † † § §,ç,ç$Ç$Ç,¥,¥,é,é,ç,ç § § e …$„$„--55,¥,¥dddddd„d„ddcdddddd „ „dddcdddd„cdddd „ „dddcdd$¥$¥$d$„dd„c … e$„$d,ç,ç1Œ1Œ55,é,é0ç0ç § §$Ç$Ç$Ç$Ç,é,é0ç0ç$Ç$Ç0ç0ç$Ç$Ç0Æ0Æ-*1*-*1*d„e…ÆÆ dde…e…f†d„d„dd † † § §(ç(ç$Æ$Æ$Ç$Ç$¥$¥ § § § §,Æ,Æ11--$c$„ d „dddc„d„d „ ddcdd „ „dd„„dcdd„cdddd „ „dddddc$¥$¥ e …c„dd„c$„$„(¥(¥1L1L1)1)55$Ç$Ç0ç0ç$Ç$Ç$Ç$Ç$Ç$Ç,é,é0ç0ç$Ç$Ç,é,é,Æ,Æ5595¥¥e…f†e…e…e…e…e…d„dd ç çdd…e(ç(ç,ç,ç § § e …$„$„--55,¥,¥dddddd„d„ddcdddddd „ „dddcdddd„cdddd „ „dddcdd$¥$¥$d$„dd„c … e$„$d,ç,ç1Œ1Œ55,é,é0ç0ç § §$Ç$Ç$Ç$Ç,é,é0ç0ç$Ç$Ç0ç0ç$Ç$Ç0Æ0Æ-*1*-*1*d„e…ÆÆ dde…e…f†d„d„dd † † § §(ç(ç$Æ$Æ$Ç$Ç$¥$¥ § § § §,Æ,Æ11--$c$„ d „dddc„d„d „ ddcdd „ „dd„„dcdd„cdddd „ „dddddc$¥$¥ e …c„dd„c$„$„(¥(¥1L1L1)1)55$Ç$Ç0ç0ç$Ç$Ç$Ç$Ç$Ç$Ç,é,é0ç0ç$Ç$Ç,é,é,Æ,Æ5595¥¥e…f†e…e…e…e…e…d„dd ç çdd…e(ç(ç,Æ,Æ § §$Æ$Æ † †,é,é55,é,é § §¥¥e…dd„d…e„ddddc„ddcdddd„„dddd„„¥¥e…dd†f † †¥¥e… § § § §$Æ$Æ-*1*1L1L$Ç$Ç § §$Æ$Æ$Ç$Ç0ç0ç § §,Æ,Æ § §$Ç$Ç,¥,¥ † † § §=Œ=Œ55cd¥¥$Ç$Ç † † … e „ „¥¥ † † … e ¥ ¥,Æ,Æ$Ç$Ç † †$Æ$Æ † †$¥$¥ † †¥¥$Ç$Ç111L1L § §$¥$¥e…e…d„dd„d„ddddc„cdc„ddd„ddd„„†f¥¥d„e… † † … e†f § § § § § §,é,é-l-l,é,é § § § §(ç(ç$Ç$Ç,Æ,Æ$Ç$Ç,¥,¥$Ç$Ç § § § §(¥(¥11AòAñÆÆe…(ç(ç § § „ „¥¥ e …¥¥ e … ¥ ¥(¥(¥ † †¥¥ † †,Æ,Æ § §$Æ$Æ † †,é,é55,é,é § §¥¥e…dd„d…e„ddddc„ddcdddd„„dddd„„¥¥e…dd†f † †¥¥e… § § § §$Æ$Æ-*1*1L1L$Ç$Ç § §$Æ$Æ$Ç$Ç0ç0ç § §,Æ,Æ § §$Ç$Ç,¥,¥ † † § §=Œ=Œ55cd¥¥$Ç$Ç † † … e „ „¥¥ † † … e ¥ ¥,Æ,Æ$Ç$Ç † †$Æ$Æ † †$¥$¥ † †¥¥$Ç$Ç111L1L § §$¥$¥e…e…d„dd„d„ddddc„cdc„ddd„ddd„„†f¥¥d„e… † † … e†f § § § § § §,é,é-l-l,é,é § § § §(ç(ç$Ç$Ç,Æ,Æ$Ç$Ç,¥,¥$Ç$Ç § § § §(¥(¥11AòAñÆÆe…(ç(ç § § „ „¥¥ e …¥¥ e … ¥ ¥(¥(¥ † †¥¥ † †=Ž=Ž5k5k955k5k95=Ž=Ž551*-*1L1L1L1L-*1*) -) -1*-*)K)K-*1*1Œ1Œ-*1*)K)K-*1*)K)K-*1*-*1*)J)J1L1L-*1*1Œ1Œ1L1L5Œ5Œ95=Ž=Ž=Ž=Ž559Ž5551Œ1Œ551L1L1L1L%%,é,é-*1*) -) -)K)K,é,é)K)K1L1L)K)K1L1L=¯A°AðAð551L1L559k5k=Œ=Œ=Ž=Ž=Ž=Ž=¯A°=ÏA°9Œ=ŒAðAðIðEðAðAðAðAð=¯A°=Œ=Œ555955=Ž=Ž=Œ=Œ1L1L1L1L1L1L-*1*-)-))K)K-*1*-*1*1L1L-l-l-*1*-*1*-*1*)K)K-*1*)K)K5J5J-*1*1L1L-l-l5k5k95AðAð5Œ5Œ955Ž5951L1L=Ž=Ž551L1L-)-)%%) -) -1*-*1*-*) -) -) -) --l-l-*1*1L1L11AðAð=Ž=Ž1Œ1Œ1L1L=Ž=Ž5k5k=Ž=Ž=Ž=Ž=¯A°=ÏA°9Œ=Œ=¯A°EðIð=¯A°=Ï=°=Ž=Ž5k5k955k5k95=Ž=Ž551*-*1L1L1L1L-*1*) -) -1*-*)K)K-*1*1Œ1Œ-*1*)K)K-*1*)K)K-*1*-*1*)J)J1L1L-*1*1Œ1Œ1L1L5Œ5Œ95=Ž=Ž=Ž=Ž559Ž5551Œ1Œ551L1L1L1L%%,é,é-*1*) -) -)K)K,é,é)K)K1L1L)K)K1L1L=¯A°AðAð551L1L559k5k=Œ=Œ=Ž=Ž=Ž=Ž=¯A°=ÏA°9Œ=ŒAðAðIðEðAðAðAðAð=¯A°=Œ=Œ555955=Ž=Ž=Œ=Œ1L1L1L1L1L1L-*1*-)-))K)K-*1*-*1*1L1L-l-l-*1*-*1*-*1*)K)K-*1*)K)K5J5J-*1*1L1L-l-l5k5k95AðAð5Œ5Œ955Ž5951L1L=Ž=Ž551L1L-)-)%%) -) -1*-*1*-*) -) -) -) --l-l-*1*1L1L11AðAð=Ž=Ž1Œ1Œ1L1L=Ž=Ž5k5k=Ž=Ž=Ž=Ž=¯A°=ÏA°9Œ=Œ=¯A°EðIð=¯A°=Ï=°$¥$¥$¥$¥(¥(¥(¥(¥(¥(¥(¥(¥$„$„dd$¥$¥ ¥ ¥ ¥ ¥ e …$¥$¥(¥(¥11-*1* ç ç0Æ0Æ(¥(¥(¥(¥,¥,¥,Æ,Æ,¥,¥(¥(¥$¥$¥(¥(¥(¥(¥(ç(ç$ç$ç1L1L--(ç(ç(¥(¥,Æ,Æ § §(¥(¥(¥(¥ † †$Æ$Æ § § Æ Æ$Æ$Æ$Ç$Ç(ç(ç,ç,ç,é,é11(ç(ç,ç,ç,é,é))----,é,é,ç,ç-----*1*5J5J1111,ç,ç----,ç,ç,Æ,Æ,Æ,Æ,Æ,Æ(¥(¥(¥(¥(¥(¥dd ¥ ¥$„$„ † †$¥$¥ e …(¥(¥,Æ,Æ1L1L$ç$ç(ç(ç,¥,¥(¥(¥(¥(¥,Æ,Æ,¥,¥,Æ,Æ ¥ ¥$¥$¥(¥(¥(¥(¥(ç(ç)K)K1)1),ç,ç,Æ,Æ$Æ$Æ,Æ,Æ § §$¥$¥(¥(¥ § §(¥(¥ § § § §(ç(ç$Æ$Æ,é,é,ç,ç,é,é,ç,ç)),ç,ç,é,é-)-)-)-),ç,ç))----111L1L1111 § § „ „ Æ Æ$¥$¥$¥$¥(¥(¥(¥(¥(¥(¥(¥(¥$„$„dd$¥$¥ ¥ ¥ ¥ ¥ e …$¥$¥(¥(¥11-*1* ç ç0Æ0Æ(¥(¥(¥(¥,¥,¥,Æ,Æ,¥,¥(¥(¥$¥$¥(¥(¥(¥(¥(ç(ç$ç$ç1L1L--(ç(ç(¥(¥,Æ,Æ § §(¥(¥(¥(¥ † †$Æ$Æ § § Æ Æ$Æ$Æ$Ç$Ç(ç(ç,ç,ç,é,é11(ç(ç,ç,ç,é,é))----,é,é,ç,ç-----*1*5J5J1111,ç,ç----,ç,ç,Æ,Æ,Æ,Æ,Æ,Æ(¥(¥(¥(¥(¥(¥dd ¥ ¥$„$„ † †$¥$¥ e …(¥(¥,Æ,Æ1L1L$ç$ç(ç(ç,¥,¥(¥(¥(¥(¥,Æ,Æ,¥,¥,Æ,Æ ¥ ¥$¥$¥(¥(¥(¥(¥(ç(ç)K)K1)1),ç,ç,Æ,Æ$Æ$Æ,Æ,Æ § §$¥$¥(¥(¥ § §(¥(¥ § § § §(ç(ç$Æ$Æ,é,é,ç,ç,é,é,ç,ç)),ç,ç,é,é-)-)-)-),ç,ç))----111L1L1111 § § „ „ Æ Ædd…e … e † † … e … edd¥¥dd … e … e „ „$¥$¥ † †5511,Æ,Æ,¥,¥0Æ0Æ,¥,¥,Æ,Æ,Æ,Æ0ç0ç,Æ,Æ § §(ç(ç Æ Æ$¥$¥$Ç$Ç1Ž1-- § §(¥(¥ † †$¥$¥ e …¥¥ † † … e ¥ ¥dd † †$¥$¥ † †(¥(¥ † †(¥(¥ † † § § ¥ ¥ e … „ „dd † † § § § §,¥,¥,é,é--,¥,¥ † †,¥,¥ † †(¥(¥ † †(¥(¥ e … e …(¥(¥ e …dd¥¥dd … edd¥¥ † †(¥(¥,Æ,Æ55--,¥,¥,Æ,Æ,¥,¥0ç0ç,¥,¥$Ç$Ç,Æ,Æ(ç(ç,Æ,Æ$Æ$Æ § § § §1L1L-*1*$Æ$Æ † † § § e …(¥(¥ e …¥¥ † †dd¥¥ † † † † … e$¥$¥$¥$¥$¥$¥ † †$Æ$Æ † †$¥$¥e…dd … e † † § §(¥(¥,Æ,Æ11$Ç$Ç(¥(¥ d „dd…edd…e … e † † … e … edd¥¥dd … e … e „ „$¥$¥ † †5511,Æ,Æ,¥,¥0Æ0Æ,¥,¥,Æ,Æ,Æ,Æ0ç0ç,Æ,Æ § §(ç(ç Æ Æ$¥$¥$Ç$Ç1Ž1-- § §(¥(¥ † †$¥$¥ e …¥¥ † † … e ¥ ¥dd † †$¥$¥ † †(¥(¥ † †(¥(¥ † † § § ¥ ¥ e … „ „dd † † § § § §,¥,¥,é,é--,¥,¥ † †,¥,¥ † †(¥(¥ † †(¥(¥ e … e …(¥(¥ e …dd¥¥dd … edd¥¥ † †(¥(¥,Æ,Æ55--,¥,¥,Æ,Æ,¥,¥0ç0ç,¥,¥$Ç$Ç,Æ,Æ(ç(ç,Æ,Æ$Æ$Æ § § § §1L1L-*1*$Æ$Æ † † § § e …(¥(¥ e …¥¥ † †dd¥¥ † † † † … e$¥$¥$¥$¥$¥$¥ † †$Æ$Æ † †$¥$¥e…dd … e † † § §(¥(¥,Æ,Æ11$Ç$Ç(¥(¥ d „dd…edd „ „ … e „ „¥¥ e …„„…e¥¥dd¥¥ † † … e,Æ,Æ111L1L e …,¥,¥,Æ,Æ0ç0ç,Æ,Æ,Æ,Æ,Æ,Æ0ç0ç$Ç$Ç(ç(ç § §$Ç$Ç ç ç1L1L0ç0ç$Æ$Æ † †$¥$¥ † † … e … e$¥$¥ e …¥¥ e …¥¥ † †(¥(¥ † †(¥(¥ † † § §(¥(¥ † †$¥$¥f†¥¥ † †$¥$¥ † †(¥(¥0Æ0Æ,é,é § §,¥,¥$Ç$Ç † †,¥,¥ † †(¥(¥ e … e …„„ … edd…e¥¥dd¥¥ † † … e$¥$¥$Ç$Ç5n5m$Æ$Æ,¥,¥,Æ,Æ,Æ,Æ,Æ,Æ0Æ0Æ0Æ0Æ0ç0ç,Æ,Æ$Ç$Ç$Ç$Ç$Ç$ÇÆÆ-)-)5J5J$Ç$Ç † †(¥(¥ e …¥¥ † † … e ¥ ¥dd$¥$¥ e …¥¥(¥(¥ † †(¥(¥ † † § §(¥(¥ e … † † † †„„ † † † †$¥$¥ † †,Æ,Æ,é,é,¥,¥$Ç$Ç,¥,¥ † †dddd „ „ … e „ „¥¥ e …„„…e¥¥dd¥¥ † † … e,Æ,Æ111L1L e …,¥,¥,Æ,Æ0ç0ç,Æ,Æ,Æ,Æ,Æ,Æ0ç0ç$Ç$Ç(ç(ç § §$Ç$Ç ç ç1L1L0ç0ç$Æ$Æ † †$¥$¥ † † … e … e$¥$¥ e …¥¥ e …¥¥ † †(¥(¥ † †(¥(¥ † † § §(¥(¥ † †$¥$¥f†¥¥ † †$¥$¥ † †(¥(¥0Æ0Æ,é,é § §,¥,¥$Ç$Ç † †,¥,¥ † †(¥(¥ e … e …„„ … edd…e¥¥dd¥¥ † † … e$¥$¥$Ç$Ç5n5m$Æ$Æ,¥,¥,Æ,Æ,Æ,Æ,Æ,Æ0Æ0Æ0Æ0Æ0ç0ç,Æ,Æ$Ç$Ç$Ç$Ç$Ç$ÇÆÆ-)-)5J5J$Ç$Ç † †(¥(¥ e …¥¥ † † … e ¥ ¥dd$¥$¥ e …¥¥(¥(¥ † †(¥(¥ † † § §(¥(¥ e … † † † †„„ † † † †$¥$¥ † †,Æ,Æ,é,é,¥,¥$Ç$Ç,¥,¥ † †dddd†fdd¥¥dd…edd¥¥ e …e… „ „¥¥ e …$¥$¥) -) -1L1Lc„,Æ,Æ0Æ0Æ,Æ,Æ0Æ0Æ0Æ0Æ0ç0ç0Æ0Æ$Ç$Ç(ç(ç$Ç$Ç § §-)-)-*1*,é,é$¥$¥ † † † †$¥$¥ e …¥¥ e …¥¥ e …¥¥ † † † † § §$„$„ † †$¥$¥ † † § § e …¥¥dd¥¥ † † † †(¥(¥ § §0Æ0Æ11$Ç$Ç(¥(¥ § §(¥(¥ † † § §$„$„ … e…edd¥¥dd†f „ „…e … e „ „¥¥ † †,¥,¥5m5m † †(¥(¥,Æ,Æ,Æ,Æ0Æ0Æ0Æ0Æ0ç0ç0ç0ç0ç0ç § §,ç,ç Æ Æ † †)K)K11$Ç$Ç † † † † ¥ ¥ † †dd$¥$¥ e …¥¥ e …¥¥ † † § §(¥(¥ † † † †$¥$¥ † † † †¥¥ e …e… Æ Æ † †(¥(¥ † †,¥,¥-*1*$Ç$Ç,¥,¥ † †dd … edd†fdd¥¥dd…edd¥¥ e …e… „ „¥¥ e …$¥$¥) -) -1L1Lc„,Æ,Æ0Æ0Æ,Æ,Æ0Æ0Æ0Æ0Æ0ç0ç0Æ0Æ$Ç$Ç(ç(ç$Ç$Ç § §-)-)-*1*,é,é$¥$¥ † † † †$¥$¥ e …¥¥ e …¥¥ e …¥¥ † † † † § §$„$„ † †$¥$¥ † † § § e …¥¥dd¥¥ † † † †(¥(¥ § §0Æ0Æ11$Ç$Ç(¥(¥ § §(¥(¥ † † § §$„$„ … e…edd¥¥dd†f „ „…e … e „ „¥¥ † †,¥,¥5m5m † †(¥(¥,Æ,Æ,Æ,Æ0Æ0Æ0Æ0Æ0ç0ç0ç0ç0ç0ç § §,ç,ç Æ Æ † †)K)K11$Ç$Ç † † † † ¥ ¥ † †dd$¥$¥ e …¥¥ e …¥¥ † † § §(¥(¥ † † † †$¥$¥ † † † †¥¥ e …e… Æ Æ † †(¥(¥ † †,¥,¥-*1*$Ç$Ç,¥,¥ † †dd … edd„„dd†fdd „ „„d…e … e„„ … e¥¥e… † †,é,é-l-l,Æ,Æ0ç0ç0Æ0Æ4ç4ç======5595 § §$Æ$Æ Æ Æ,é,é1L1L(ç(ç$¥$¥ † †$¥$¥ † †…e … e¥¥e…$¥$¥ † †¥¥ † †(¥(¥ † †$¥$¥ † † † †$¥$¥ e …¥¥dd„d † †$¥$¥ † †,¥,¥,é,é) -) -,¥,¥ § §(¥(¥ † †(¥(¥ § §(¥(¥e…dd¥¥dddd„„…e¥¥ e …dd … e¥¥$Ç$Ç1L1L,é,é,Å,Å4ç4ç954ç4ç====0ç0ç4ç4ç(ç(ç § § § §$Ç$Ç1L1L,é,é$¥$¥ † †$¥$¥ e …¥¥e… e … e …¥¥ † † … e † †$¥$¥ † † † †$¥$¥ † † § § † †dd¥¥dd¥¥ † †(¥(¥(¥(¥,Æ,Æ-*1*,é,é(¥(¥ e …dd „ „dd„„dd†fdd „ „„d…e … e„„ … e¥¥e… † †,é,é-l-l,Æ,Æ0ç0ç0Æ0Æ4ç4ç======5595 § §$Æ$Æ Æ Æ,é,é1L1L(ç(ç$¥$¥ † †$¥$¥ † †…e … e¥¥e…$¥$¥ † †¥¥ † †(¥(¥ † †$¥$¥ † † † †$¥$¥ e …¥¥dd„d † †$¥$¥ † †,¥,¥,é,é) -) -,¥,¥ § §(¥(¥ † †(¥(¥ § §(¥(¥e…dd¥¥dddd„„…e¥¥ e …dd … e¥¥$Ç$Ç1L1L,é,é,Å,Å4ç4ç954ç4ç====0ç0ç4ç4ç(ç(ç § § § §$Ç$Ç1L1L,é,é$¥$¥ † †$¥$¥ e …¥¥e… e … e …¥¥ † † … e † †$¥$¥ † † † †$¥$¥ † † § § † †dd¥¥dd¥¥ † †(¥(¥(¥(¥,Æ,Æ-*1*,é,é(¥(¥ e …dd „ „dd „ „dddd „ „dddd„„„d … e„„ … e$¥$¥$¥$¥,é,é1L1L(ç(ç(ç(ç § §,é,é11==,é,é0Æ0Æ0ç0ç e …¥¥ † †)K)K-)-)$¥$¥ † †(¥(¥ † † … e „ „…e$¥$¥e… e …¥¥ † † … e(¥(¥ † †(¥(¥ † †$¥$¥ † † … e…e$¥$¥ e … † †$¥$¥ § §(¥(¥0Æ0Æ1L1L,¥,¥(¥(¥ § § † †(¥(¥ † † † †$„$d„cdd$¥$¥d„dddd…e „ „¥¥ † † † †,¥,¥-l-l,é,é(ç(ç$Ç$Ç,Æ,Æ,é,é559555,é,é § §ddÆÆ¥¥)K)K$Æ$Æ § §(¥(¥ e …¥¥ † †dd¥¥ † †dd¥¥$¥$¥ e …$¥$¥ † †(¥(¥ † †$¥$¥ † † … e „ „¥¥ † † … e$¥$¥ † †(¥(¥,¥,¥-*1*,é,é(¥(¥(¥(¥dddddd „ „dddd „ „dddd„„„d … e„„ … e$¥$¥$¥$¥,é,é1L1L(ç(ç(ç(ç § §,é,é11==,é,é0Æ0Æ0ç0ç e …¥¥ † †)K)K-)-)$¥$¥ † †(¥(¥ † † … e „ „…e$¥$¥e… e …¥¥ † † … e(¥(¥ † †(¥(¥ † †$¥$¥ † † … e…e$¥$¥ e … † †$¥$¥ § §(¥(¥0Æ0Æ1L1L,¥,¥(¥(¥ § § † †(¥(¥ † † † †$„$d„cdd$¥$¥d„dddd…e „ „¥¥ † † † †,¥,¥-l-l,é,é(ç(ç$Ç$Ç,Æ,Æ,é,é559555,é,é § §ddÆÆ¥¥)K)K$Æ$Æ § §(¥(¥ e …¥¥ † †dd¥¥ † †dd¥¥$¥$¥ e …$¥$¥ † †(¥(¥ † †$¥$¥ † † … e „ „¥¥ † † … e$¥$¥ † †(¥(¥,¥,¥-*1*,é,é(¥(¥(¥(¥dddd † † † †ÆÆ † †¥¥¥¥¥¥¥¥ Æ Æf† † † Æ Æ † † § §) -) -)K)Kd„d„dcd cdde…f†d„e…%%) -) - ç ç1L1L)K)K † ††f † ††fÆÆe…e…dd„d…e … e†f § §¥¥ † † † † † † † † … e ¥ ¥dddd¥¥ † † § §,Æ,Æ$Ç$Ç,é,é5m5m) -) -,é,é$Ç$Ç,é,é$Ç$Ç$Ç$Ç$Ç$Ç † † § § ç 祥 e …ÆÆd„dd¥¥ † † † † § §$Ç$Ç-l-l ç çddd„ C C„d„d†fddd„ § §!!!!%%5m5m § § † ††f Æ Æf†e… e …dddd†fdd†f § § † † † †¥¥ † † † †$„$„ … e…edddd Æ Æ § §$Ç$Ç § §$Ç$Ç1L1L1L1L$Ç$Ç,é,é$Ç$Ç$Ç$Ç † † † †ÆÆ † †¥¥¥¥¥¥¥¥ Æ Æf† † † Æ Æ † † § §) -) -)K)Kd„d„dcd cdde…f†d„e…%%) -) - ç ç1L1L)K)K † ††f † ††fÆÆe…e…dd„d…e … e†f § §¥¥ † † † † † † † † … e ¥ ¥dddd¥¥ † † § §,Æ,Æ$Ç$Ç,é,é5m5m) -) -,é,é$Ç$Ç,é,é$Ç$Ç$Ç$Ç$Ç$Ç † † § § ç 祥 e …ÆÆd„dd¥¥ † † † † § §$Ç$Ç-l-l ç çddd„ C C„d„d†fddd„ § §!!!!%%5m5m § § † ††f Æ Æf†e… e …dddd†fdd†f § § † † † †¥¥ † † † †$„$„ … e…edddd Æ Æ § §$Ç$Ç § §$Ç$Ç1L1L1L1L$Ç$Ç,é,é$Ç$Ç$Ç$Ç551Œ1Œ559k5k1L1LAðAð1Œ1Œ-*1*1Œ1Œ5J5J-*1*) -) -1L1L1L1L1Œ1Œ551*-*) -) -)K)K%%-*1*1L1L1Œ1Œ5m5mA°=¯AðAð5595=Ž=Ž=Ž=Ž5Œ5Œ=Ž=Ž559Œ5Œ55A¯=°591Œ1Œ5m5m1Œ1Œ1L1LIðEð5595559Ž5551L1L5k5k95AðAð5511=Ž=ŽAðAð55=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=¯A°=ÏA°9Ž=Ž=Œ=Œ1L1L5J5J5J5J1L1L5J5J$Ç$Ç) -) -)K)K-*1*-*1*1L1L-l-l551L1L) -) -)K)K%%) -) --l-l1L1L1155AðAð=¯A°=Ž=Ž=Ž=Ž=Ž=Ž5Œ5Œ=Ž=Ž5Œ5Œ9555=Ž=ŽAðAð-l-l1Œ1Œ111L1L=ï=ïAðAð1Œ1Œ559m5m5Ž59m5m1L1L55AðAðAðAð-l-l55A¯=°=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=¯A°=Ž=Ž=Ž=Ž=Ž=Ž=¯A°591Œ1Œ559k5k1L1LAðAð1Œ1Œ-*1*1Œ1Œ5J5J-*1*) -) -1L1L1L1L1Œ1Œ551*-*) -) -)K)K%%-*1*1L1L1Œ1Œ5m5mA°=¯AðAð5595=Ž=Ž=Ž=Ž5Œ5Œ=Ž=Ž559Œ5Œ55A¯=°591Œ1Œ5m5m1Œ1Œ1L1LIðEð5595559Ž5551L1L5k5k95AðAð5511=Ž=ŽAðAð55=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=¯A°=ÏA°9Ž=Ž=Œ=Œ1L1L5J5J5J5J1L1L5J5J$Ç$Ç) -) -)K)K-*1*-*1*1L1L-l-l551L1L) -) -)K)K%%) -) --l-l1L1L1155AðAð=¯A°=Ž=Ž=Ž=Ž=Ž=Ž5Œ5Œ=Ž=Ž5Œ5Œ9555=Ž=ŽAðAð-l-l1Œ1Œ111L1L=ï=ïAðAð1Œ1Œ559m5m5Ž59m5m1L1L55AðAðAðAð-l-l55A¯=°=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=¯A°=Ž=Ž=Ž=Ž=Ž=Ž=¯A°,Æ,Æ,Æ,Æ,Æ,Æ,Æ,Æ(ç(ç=¯A°1L1L e …$¥$¥$„$„ … e¥¥$¥$¥ § §(¥(¥ † †(ç(ç$Æ$Æ$Ç$Ç,Æ,Æ § §$Ç$Ç(ç(ç(ç(ç(ç(ç(ç(ç(¥(¥$¥$¥$¥$¥ Æ Æ$Æ$Æ(¥(¥(ç(ç0ç0ç(¥(¥5k5kIðIð11$Ç$Ç$Ç$Ç(ç(ç ç ç(¥(¥ ç ç(¥(¥ § §(ç(ç(¥(¥,ç,ç--AòAñ5k5k11--,ç,ç----,ç,ç,ç,ç(ç(ç$Æ$Æ$Ç$Ç,Æ,Æ,Æ,Æ$Ç$Ç,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥5k5k § §(¥(¥ † † … e ¥ ¥ e …(¥(¥$Æ$Æ(¥(¥ § §(ç(ç,Æ,Æ § §$Ç$Ç$Æ$Æ(ç(ç(ç(ç,ç,ç(ç(ç § §(¥(¥$¥$¥(¥(¥ § §(¥(¥(ç(ç,Æ,Æ,Æ,Æ--IðEð1Œ1Œ$Ç$Ç(ç(ç$Æ$Æ$Æ$Æ$Æ$Æ$Æ$Æ$Æ$Æ$Æ$Æ$Æ$Æ,Æ,Æ$Æ$Æ,ç,ç=Œ=Œ=¯A°1111,é,é1111,ç,ç55$Æ$Æ$Ç$Ç,Æ,Æ$Æ$Æ0ç0ç,Æ,Æ,Æ,Æ,Æ,Æ,Æ,Æ(ç(ç=¯A°1L1L e …$¥$¥$„$„ … e¥¥$¥$¥ § §(¥(¥ † †(ç(ç$Æ$Æ$Ç$Ç,Æ,Æ § §$Ç$Ç(ç(ç(ç(ç(ç(ç(ç(ç(¥(¥$¥$¥$¥$¥ Æ Æ$Æ$Æ(¥(¥(ç(ç0ç0ç(¥(¥5k5kIðIð11$Ç$Ç$Ç$Ç(ç(ç ç ç(¥(¥ ç ç(¥(¥ § §(ç(ç(¥(¥,ç,ç--AòAñ5k5k11--,ç,ç----,ç,ç,ç,ç(ç(ç$Æ$Æ$Ç$Ç,Æ,Æ,Æ,Æ$Ç$Ç,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥5k5k § §(¥(¥ † † … e ¥ ¥ e …(¥(¥$Æ$Æ(¥(¥ § §(ç(ç,Æ,Æ § §$Ç$Ç$Æ$Æ(ç(ç(ç(ç,ç,ç(ç(ç § §(¥(¥$¥$¥(¥(¥ § §(¥(¥(ç(ç,Æ,Æ,Æ,Æ--IðEð1Œ1Œ$Ç$Ç(ç(ç$Æ$Æ$Æ$Æ$Æ$Æ$Æ$Æ$Æ$Æ$Æ$Æ$Æ$Æ,Æ,Æ$Æ$Æ,ç,ç=Œ=Œ=¯A°1111,é,é1111,ç,ç55$Æ$Æ$Ç$Ç,Æ,Æ$Æ$Æ0ç0ç(¥(¥(¥(¥,Æ,Æ § §,¥,¥5511$¥$¥ † †$„$„(¥(¥ † †$„$„(¥(¥$¥$¥$¥$¥ † †(¥(¥$¥$¥ † †$Æ$Æ,¥,¥ § §(¥(¥,Æ,Æ § §(¥(¥ † †$¥$¥$„$„$¥$¥(¥(¥(¥(¥,Æ,Æ,¥,¥5k5kIðIð) -) -$¥$¥(¥(¥ e …(¥(¥(¥(¥ § §(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥,é,é=Ž=Ž(ç(ç(¥(¥(¥(¥,¥,¥ § §(¥(¥(¥(¥ § §(¥(¥ † † § §(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥0ç0ç,¥,¥,é,é § §$„$„ … e(¥(¥$„$„$¥$¥(¥(¥ † †(¥(¥ e …(¥(¥$¥$¥ † †(¥(¥$Æ$Æ,¥,¥ § §(¥(¥ § §$¥$¥(¥(¥ † † ¥ ¥$¥$¥$¥$¥(¥(¥,Å,Å,Æ,Æ11AðAð5m5m(¥(¥(¥(¥(¥(¥(¥(¥ † †(¥(¥ † †(¥(¥(¥(¥ † †,Æ,Æ,¥,¥5m5m1*-*(¥(¥ § §(¥(¥,¥,¥ † †,¥,¥ † †(¥(¥ † †$Æ$Æ(¥(¥ § §(¥(¥(¥(¥,Æ,Æ § §,¥,¥5511$¥$¥ † †$„$„(¥(¥ † †$„$„(¥(¥$¥$¥$¥$¥ † †(¥(¥$¥$¥ † †$Æ$Æ,¥,¥ § §(¥(¥,Æ,Æ § §(¥(¥ † †$¥$¥$„$„$¥$¥(¥(¥(¥(¥,Æ,Æ,¥,¥5k5kIðIð) -) -$¥$¥(¥(¥ e …(¥(¥(¥(¥ § §(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥,é,é=Ž=Ž(ç(ç(¥(¥(¥(¥,¥,¥ § §(¥(¥(¥(¥ § §(¥(¥ † † § §(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥0ç0ç,¥,¥,é,é § §$„$„ … e(¥(¥$„$„$¥$¥(¥(¥ † †(¥(¥ e …(¥(¥$¥$¥ † †(¥(¥$Æ$Æ,¥,¥ § §(¥(¥ § §$¥$¥(¥(¥ † † ¥ ¥$¥$¥$¥$¥(¥(¥,Å,Å,Æ,Æ11AðAð5m5m(¥(¥(¥(¥(¥(¥(¥(¥ † †(¥(¥ † †(¥(¥(¥(¥ † †,Æ,Æ,¥,¥5m5m1*-*(¥(¥ § §(¥(¥,¥,¥ † †,¥,¥ † †(¥(¥ † †$Æ$Æ(¥(¥ § §(¥(¥,Æ,Æ † †(¥(¥,¥,¥1L1L$Ç$Ç$¥$¥$„$„ † †$„$„$„$„ § §$„$„ † †(¥(¥$„$„(¥(¥ † †$¥$¥(¥(¥ † †(¥(¥(¥(¥,¥,¥ § §$¥$¥$„$„$¥$¥(¥(¥(¥(¥,Æ,Æ,Æ,Æ,Å,Å(¥(¥5J5J=ð=ð,é,é$¥$¥(¥(¥$¥$¥$¥$¥ † †(¥(¥$¥$¥ † † † †(¥(¥,¥,¥,ç,ç=¯A°$Ç$Ç,¥,¥,¥,¥$Ç$Ç(¥(¥,¥,¥ § §,¥,¥,Æ,Æ(¥(¥ † †$Æ$Æ § §(¥(¥ † †,Æ,Æ$Ç$Ç,é,é,Æ,Æ-*1* § §$d$„(¥(¥$„$„(¥(¥ † †$„$„(¥(¥ † †$¥$¥$¥$¥(¥(¥ † †$„$„ † †(¥(¥(¥(¥(¥(¥(¥(¥ † †$„$„$¥$¥(¥(¥(¥(¥(¥(¥,Æ,Æ,Æ,Æ(¥(¥0ç0çAðAð-*1*(¥(¥ § §(¥(¥ † †(¥(¥ † †(¥(¥(¥(¥ † †(¥(¥,¥,¥,¥,¥=Ž=Ž1L1L(¥(¥,¥,¥(¥(¥,¥,¥ § §,¥,¥,Æ,Æ § §(¥(¥ § §(¥(¥(¥(¥(¥(¥,Æ,Æ † †(¥(¥,¥,¥1L1L$Ç$Ç$¥$¥$„$„ † †$„$„$„$„ § §$„$„ † †(¥(¥$„$„(¥(¥ † †$¥$¥(¥(¥ † †(¥(¥(¥(¥,¥,¥ § §$¥$¥$„$„$¥$¥(¥(¥(¥(¥,Æ,Æ,Æ,Æ,Å,Å(¥(¥5J5J=ð=ð,é,é$¥$¥(¥(¥$¥$¥$¥$¥ † †(¥(¥$¥$¥ † † † †(¥(¥,¥,¥,ç,ç=¯A°$Ç$Ç,¥,¥,¥,¥$Ç$Ç(¥(¥,¥,¥ § §,¥,¥,Æ,Æ(¥(¥ † †$Æ$Æ § §(¥(¥ † †,Æ,Æ$Ç$Ç,é,é,Æ,Æ-*1* § §$d$„(¥(¥$„$„(¥(¥ † †$„$„(¥(¥ † †$¥$¥$¥$¥(¥(¥ † †$„$„ † †(¥(¥(¥(¥(¥(¥(¥(¥ † †$„$„$¥$¥(¥(¥(¥(¥(¥(¥,Æ,Æ,Æ,Æ(¥(¥0ç0çAðAð-*1*(¥(¥ § §(¥(¥ † †(¥(¥ † †(¥(¥(¥(¥ † †(¥(¥,¥,¥,¥,¥=Ž=Ž1L1L(¥(¥,¥,¥(¥(¥,¥,¥ § §,¥,¥,Æ,Æ § §(¥(¥ § §(¥(¥(¥(¥(¥(¥ † †(¥(¥ § §(¥(¥11) -) - e …$„$„$„$„(¥(¥(¥(¥$„$„(¥(¥(¥(¥(¥(¥(¥(¥ d „ † †$„$„(¥(¥(¥(¥$¥$¥(¥(¥,¥,¥(¥(¥(¥(¥(¥(¥,Æ,Æ,¥,¥,Æ,Æ,Æ,Æ,Æ,Æ(ç(ç,Å,Å5k5kAòAñ$Æ$Æ(¥(¥ † † † †(¥(¥ † †(¥(¥ † †$„$„ † †(¥(¥ § §4ç4çA¯=°--,¥,¥,¥,¥(¥(¥(¥(¥,¥,¥,¥,¥(¥(¥,¥,¥ † †$Æ$Æ § §(¥(¥(¥(¥ § § § §,Æ,Æ,é,é,é,é1)1)(¥(¥$„$„$„$„$„$„(¥(¥$„$„(¥(¥(¥(¥(¥(¥$„$„ … e$„$„(¥(¥ † †(¥(¥$¥$¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥,Æ,Æ,Æ,Æ,¥,¥0ç0ç,Å,Å--=ð=ð1L1L e …$¥$¥ † †$„$„ † †(¥(¥ † † † †$„$„ † †,Æ,Æ § §5k5k9m5m,¥,¥,¥,¥,¥,¥,¥,¥,Æ,Æ § §(¥(¥,¥,¥(¥(¥ § §(¥(¥(¥(¥(¥(¥ † †(¥(¥ § §(¥(¥11) -) - e …$„$„$„$„(¥(¥(¥(¥$„$„(¥(¥(¥(¥(¥(¥(¥(¥ d „ † †$„$„(¥(¥(¥(¥$¥$¥(¥(¥,¥,¥(¥(¥(¥(¥(¥(¥,Æ,Æ,¥,¥,Æ,Æ,Æ,Æ,Æ,Æ(ç(ç,Å,Å5k5kAòAñ$Æ$Æ(¥(¥ † † † †(¥(¥ † †(¥(¥ † †$„$„ † †(¥(¥ § §4ç4çA¯=°--,¥,¥,¥,¥(¥(¥(¥(¥,¥,¥,¥,¥(¥(¥,¥,¥ † †$Æ$Æ § §(¥(¥(¥(¥ § § § §,Æ,Æ,é,é,é,é1)1)(¥(¥$„$„$„$„$„$„(¥(¥$„$„(¥(¥(¥(¥(¥(¥$„$„ … e$„$„(¥(¥ † †(¥(¥$¥$¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥,Æ,Æ,Æ,Æ,¥,¥0ç0ç,Å,Å--=ð=ð1L1L e …$¥$¥ † †$„$„ † †(¥(¥ † † † †$„$„ † †,Æ,Æ § §5k5k9m5m,¥,¥,¥,¥,¥,¥,¥,¥,Æ,Æ § §(¥(¥,¥,¥(¥(¥ § §(¥(¥(¥(¥$¥$¥(¥(¥ † †(¥(¥ § §-*1*11 e …(¥(¥$c$„$„$„(¥(¥(¥(¥(¥(¥$d$„$d$„(¥(¥(¥(¥$„$„(¥(¥(¥(¥(¥(¥$d$„,Å,Å0ç0ç,¥,¥,Æ,Æ(¥(¥,Æ,Æ,¥,¥(¥(¥,Æ,Æ,Å,Å0ç0ç0Æ0Æ5J5J=¯A°)) † †(¥(¥ † †(¥(¥ e …¥¥(¥(¥ † †$¥$¥(¥(¥ § §,Æ,Æ558ç4ç,Æ,Æ,¥,¥,¥,¥,¥,¥,¥,¥ § §,¥,¥,Æ,Æ(¥(¥ † †$Æ$Æ § §(¥(¥ † †,Æ,Æ † †(ç(ç,ç,ç1L1L(¥(¥(¥(¥ d „$„$„(¥(¥(¥(¥(¥(¥(¥(¥$d$„$„$„(¥(¥(¥(¥(¥(¥$„$„(¥(¥(¥(¥,¥,¥,¥,¥,¥,¥,¥,¥$Æ$Æ,¥,¥,Æ,Æ(¥(¥,Æ,Æ,Æ,Æ,Æ,Æ,Å,Å11AðAð-*1*(¥(¥ † †(¥(¥$¥$¥ † † † † ¥ ¥$¥$¥ † †$¥$¥(¥(¥,¥,¥5k5k1L1L,¥,¥,Å,Å,¥,¥,¥,¥(¥(¥,¥,¥,¥,¥,Æ,Æ(¥(¥ § §(¥(¥ † †$¥$¥(¥(¥ † †(¥(¥ § §-*1*11 e …(¥(¥$c$„$„$„(¥(¥(¥(¥(¥(¥$d$„$d$„(¥(¥(¥(¥$„$„(¥(¥(¥(¥(¥(¥$d$„,Å,Å0ç0ç,¥,¥,Æ,Æ(¥(¥,Æ,Æ,¥,¥(¥(¥,Æ,Æ,Å,Å0ç0ç0Æ0Æ5J5J=¯A°)) † †(¥(¥ † †(¥(¥ e …¥¥(¥(¥ † †$¥$¥(¥(¥ § §,Æ,Æ558ç4ç,Æ,Æ,¥,¥,¥,¥,¥,¥,¥,¥ § §,¥,¥,Æ,Æ(¥(¥ † †$Æ$Æ § §(¥(¥ † †,Æ,Æ † †(ç(ç,ç,ç1L1L(¥(¥(¥(¥ d „$„$„(¥(¥(¥(¥(¥(¥(¥(¥$d$„$„$„(¥(¥(¥(¥(¥(¥$„$„(¥(¥(¥(¥,¥,¥,¥,¥,¥,¥,¥,¥$Æ$Æ,¥,¥,Æ,Æ(¥(¥,Æ,Æ,Æ,Æ,Æ,Æ,Å,Å11AðAð-*1*(¥(¥ † †(¥(¥$¥$¥ † † † † ¥ ¥$¥$¥ † †$¥$¥(¥(¥,¥,¥5k5k1L1L,¥,¥,Å,Å,¥,¥,¥,¥(¥(¥,¥,¥,¥,¥,Æ,Æ(¥(¥ § §(¥(¥ † † e …(¥(¥(¥(¥,¥,¥,Æ,Æ,é,é,é,é e …$d$„$„$„ † †$„$d(¥(¥(¥(¥(¥(¥(¥(¥ d „$„$„ † †(¥(¥(¥(¥(¥(¥,Æ,Æ,Å,Å0Æ0Æ(¥(¥(¥(¥,Æ,Æ,Æ,Æ,Æ,Æ,Å,Å,Æ,Æ0ç0ç(Å(Å(Å(Å--AðAð,é,é(¥(¥ † †$¥$¥ † † † †$„$„ † †$¥$¥ † † § §$„$„ § §55(ç(ç,Å,Å,Æ,Æ,¥,¥,Æ,Æ,¥,¥,¥,¥0ç0ç,¥,¥,¥,¥(¥(¥ § §(¥(¥(¥(¥$¥$¥ § §(¥(¥(¥(¥ † †-*1* § §$c$„ e …$„$„(¥(¥(¥(¥$d$„(¥(¥(¥(¥ † †$„$d$¥$¥$„$„,¥,¥,¥,¥,¥,¥,Æ,Æ,¥,¥,Æ,Æ(¥(¥,Æ,Æ,Æ,Æ,Æ,Æ(¥(¥,Å,Å0ç0ç,Å,Å,¥,¥,Æ,Æ5511 e …(¥(¥(¥(¥ e … § § ¥ ¥$„$„ † †(¥(¥ § §(¥(¥ e …-*1*1L1L,¥,¥,Å,Å0Æ0Æ,¥,¥,Æ,Æ(¥(¥0Æ0Æ,¥,¥,Æ,Æ(¥(¥ e …$¥$¥ … e(¥(¥(¥(¥,¥,¥,Æ,Æ,é,é,é,é e …$d$„$„$„ † †$„$d(¥(¥(¥(¥(¥(¥(¥(¥ d „$„$„ † †(¥(¥(¥(¥(¥(¥,Æ,Æ,Å,Å0Æ0Æ(¥(¥(¥(¥,Æ,Æ,Æ,Æ,Æ,Æ,Å,Å,Æ,Æ0ç0ç(Å(Å(Å(Å--AðAð,é,é(¥(¥ † †$¥$¥ † † † †$„$„ † †$¥$¥ † † § §$„$„ § §55(ç(ç,Å,Å,Æ,Æ,¥,¥,Æ,Æ,¥,¥,¥,¥0ç0ç,¥,¥,¥,¥(¥(¥ § §(¥(¥(¥(¥$¥$¥ § §(¥(¥(¥(¥ † †-*1* § §$c$„ e …$„$„(¥(¥(¥(¥$d$„(¥(¥(¥(¥ † †$„$d$¥$¥$„$„,¥,¥,¥,¥,¥,¥,Æ,Æ,¥,¥,Æ,Æ(¥(¥,Æ,Æ,Æ,Æ,Æ,Æ(¥(¥,Å,Å0ç0ç,Å,Å,¥,¥,Æ,Æ5511 e …(¥(¥(¥(¥ e … § § ¥ ¥$„$„ † †(¥(¥ § §(¥(¥ e …-*1*1L1L,¥,¥,Å,Å0Æ0Æ,¥,¥,Æ,Æ(¥(¥0Æ0Æ,¥,¥,Æ,Æ(¥(¥ e …$¥$¥ † † § §$Ç$Ç § §,é,é5m5m)K)K † †¥¥e…$¥$¥ † † † † § §$Ç$Ç § § § §$Ç$Ç$Ç$Ç § §$Ç$Ç$Ç$Ç,é,é § § § §$Æ$Æ § § § § § § § §,ç,ç)),é,é111L1L1L1L551*-*e… † † § § † † ç ç § § § § § § § §$Ç$Ç-*1*-l-l=Ž=Ž) -) -$Ç$Ç † † § § § §,é,é § §$Ç$Ç,é,é,é,é,é,é,é,é)) § § § §$Ç$Ç § §$Ç$Ç) -) --l-l$Ç$Çf†¥¥ e …f† † † § § § § § § § §$Ç$Ç$Ç$Ç § §!!$Ç$Ç$Ç$Ç$Ç$Ç § § § § § § § § § § § §(ç(ç,é,é,ç,ç) -) -5J5J5k5k1L1L5Œ5Œ † † § § § § Æ Æ § § § § § § ç ç § § § §!!1L1L551L1L$Æ$Æ$Ç$Ç § §$Ç$Ç$Æ$Æ$Ç$Ç$Ç$Ç$Ç$Ç,é,é$Ç$Ç$Ç$Ç$Ç$Ç † † § §$Ç$Ç § §,é,é5m5m)K)K † †¥¥e…$¥$¥ † † † † § §$Ç$Ç § § § §$Ç$Ç$Ç$Ç § §$Ç$Ç$Ç$Ç,é,é § § § §$Æ$Æ § § § § § § § §,ç,ç)),é,é111L1L1L1L551*-*e… † † § § † † ç ç § § § § § § § §$Ç$Ç-*1*-l-l=Ž=Ž) -) -$Ç$Ç † † § § § §,é,é § §$Ç$Ç,é,é,é,é,é,é,é,é)) § § § §$Ç$Ç § §$Ç$Ç) -) --l-l$Ç$Çf†¥¥ e …f† † † § § § § § § § §$Ç$Ç$Ç$Ç § §!!$Ç$Ç$Ç$Ç$Ç$Ç § § § § § § § § § § § §(ç(ç,é,é,ç,ç) -) -5J5J5k5k1L1L5Œ5Œ † † § § § § Æ Æ § § § § § § ç ç § § § §!!1L1L551L1L$Æ$Æ$Ç$Ç § §$Ç$Ç$Æ$Æ$Ç$Ç$Ç$Ç$Ç$Ç,é,é$Ç$Ç$Ç$Ç$Ç$Ç55AðAð=¯A°AðAðAðAð=¯A°=Ž=Ž=ï=ï55=Ž=Ž=¯A°555955595Ž5591L1L5Œ5Œ951Œ1Œ1L1L55=Ž=Ž559Œ5ŒAðAðAðAð55=ï=ï=¯A°AðAðIðEðAðAðJFNSN3=ï=ï=¯A°=Ž=ŽAðAðAðAðAðAð=¯A°AñAòAðAðAðAð=ð=ð=¯A°BBNSN3IïEïAðAð=¯A°=Ž=ŽAðAðAðAðAðAðAðAð=¯A°AðAðBBJSF3JSF3JSF3NSN3IðEðAðAð=ð=ð=ð=ðAòAñ=ï=ï=¯A°55=Ž=Ž=¯A°555955595Œ5Œ595k5k1Œ1Œ559m5m1L1L5595559Œ5Œ=¯A°AðAð=ï=ï=Ž=Ž=¯A°=ï=ïAðAðAïAïIðEðNSN3AïAï=ð=ð=Ž=ŽAðAð=¯A°AðAð=¯A°AðAðAðAðAòAñ=ð=ð55IðIðNSN3IðEðAïAïAòAñ=Ž=Ž=Ž=ŽAðAðAòAñAðAðAðAðAðAðAðAðJSF3JSF3JSF359AðAð=¯A°AðAðAðAð=¯A°=Ž=Ž=ï=ï55=Ž=Ž=¯A°555955595Ž5591L1L5Œ5Œ951Œ1Œ1L1L55=Ž=Ž559Œ5ŒAðAðAðAð55=ï=ï=¯A°AðAðIðEðAðAðJFNSN3=ï=ï=¯A°=Ž=ŽAðAðAðAðAðAð=¯A°AñAòAðAðAðAð=ð=ð=¯A°BBNSN3IïEïAðAð=¯A°=Ž=ŽAðAðAðAðAðAðAðAð=¯A°AðAðBBJSF3JSF3JSF3NSN3IðEðAðAð=ð=ð=ð=ðAòAñ=ï=ï=¯A°55=Ž=Ž=¯A°555955595Œ5Œ595k5k1Œ1Œ559m5m1L1L5595559Œ5Œ=¯A°AðAð=ï=ï=Ž=Ž=¯A°=ï=ïAðAðAïAïIðEðNSN3AïAï=ð=ð=Ž=ŽAðAð=¯A°AðAð=¯A°AðAðAðAðAòAñ=ð=ð55IðIðNSN3IðEðAïAïAòAñ=Ž=Ž=Ž=ŽAðAðAòAñAðAðAðAðAðAðAðAðJSF3JSF3JSF3(ç(ç Æ Æ(¥(¥ § §(ç(ç Æ Æ(¥(¥ ç ç(¥(¥ ç ç---*1*(ç(ç ¥ ¥(¥(¥$¥$¥$¥$¥(¥(¥$¥$¥$¥$¥$¥$¥$„$„$¥$¥,ç,ç,ç,ç%%$Ç$Ç$ç$ç-)-)(ç(ç § § Æ Æ$Ç$Ç ç ç(ç(ç,ç,ç,ç,ç-)-)$ç$ç--(ç(ç--(ç(ç--(ç(ç(ç(ç$Ç$Ç(ç(ç(ç(ç Æ Æ$Æ$Æ § §,ç,ç11-*1*-)-) ç ç$¥$¥ Æ Æ Æ Æ § § ç ç § §(ç(ç ç ç Æ Æ$Æ$Æ$Æ$Æ § §(ç(ç$¥$¥ § §$Æ$Æ(ç(ç(ç(ç-*1*%%$¥$¥(¥(¥(Å(Å$¥$¥$¥$¥$¥$¥$¥$¥(¥(¥ ¥ ¥$¥$¥(¥(¥--,é,é%%(ç(ç$ç$ç,é,é ç ç § §(ç(ç ç ç(ç(ç$Ç$Ç---)-),ç,ç$ç$ç,é,é,ç,ç$ç$ç-)-),ç,ç$ç$ç(ç(ç § §,ç,ç(ç(ç § §(ç(ç(ç(ç(ç(ç11-*1*-)-)¥¥ † † Æ Æ Æ Æ § § ç ç § §(ç(ç Æ Æ(¥(¥ § §(ç(ç Æ Æ(¥(¥ ç ç(¥(¥ ç ç---*1*(ç(ç ¥ ¥(¥(¥$¥$¥$¥$¥(¥(¥$¥$¥$¥$¥$¥$¥$„$„$¥$¥,ç,ç,ç,ç%%$Ç$Ç$ç$ç-)-)(ç(ç § § Æ Æ$Ç$Ç ç ç(ç(ç,ç,ç,ç,ç-)-)$ç$ç--(ç(ç--(ç(ç--(ç(ç(ç(ç$Ç$Ç(ç(ç(ç(ç Æ Æ$Æ$Æ § §,ç,ç11-*1*-)-) ç ç$¥$¥ Æ Æ Æ Æ § § ç ç § §(ç(ç ç ç Æ Æ$Æ$Æ$Æ$Æ § §(ç(ç$¥$¥ § §$Æ$Æ(ç(ç(ç(ç-*1*%%$¥$¥(¥(¥(Å(Å$¥$¥$¥$¥$¥$¥$¥$¥(¥(¥ ¥ ¥$¥$¥(¥(¥--,é,é%%(ç(ç$ç$ç,é,é ç ç § §(ç(ç ç ç(ç(ç$Ç$Ç---)-),ç,ç$ç$ç,é,é,ç,ç$ç$ç-)-),ç,ç$ç$ç(ç(ç § §,ç,ç(ç(ç § §(ç(ç(ç(ç(ç(ç11-*1*-)-)¥¥ † † Æ Æ Æ Æ § § ç ç § § d „dƒ e …$d$„dƒdddd$„$d„c … e,Æ,Æ)K)K$d$„$d$„$d$„ d ƒ d ƒ$d$„dƒ$d$„dƒdd … e$„$„(¥(¥1L1L † † ¥ ¥ d „ d „dcdd ¥ ¥ e …$d$„ ¥ ¥ e … e …(Å(Å(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥ † †$„$„ † †$„$„ † † … e$¥$¥ e …$¥$¥(¥(¥5m5m$Ç$Çdd … edd¥¥dd „ „dd „ „dd$¥$¥dd … e$„$d„cdd„c$„$d„c ¥ ¥-*1*$Æ$Æ$c$„$„$„ „ d$„$d „ c$„$d „ ddc$„$d„c … e$„$„55) -) -c„ ¥ ¥ d „dd„c … e … e ¥ ¥$d$„ e …$d$„$¥$¥(¥(¥$¥$¥(¥(¥(¥(¥$„$„(¥(¥ † †$„$„(¥(¥ † † … e ¥ ¥dd$¥$¥ e …5I5I1L1Ldddd¥¥dd$¥$¥dddd „ „ „ d„c … e$„$d„cdddd$„$d„c … e,Æ,Æ)K)K$d$„$d$„$d$„ d ƒ d ƒ$d$„dƒ$d$„dƒdd … e$„$„(¥(¥1L1L † † ¥ ¥ d „ d „dcdd ¥ ¥ e …$d$„ ¥ ¥ e … e …(Å(Å(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥ † †$„$„ † †$„$„ † † … e$¥$¥ e …$¥$¥(¥(¥5m5m$Ç$Çdd … edd¥¥dd „ „dd „ „dd$¥$¥dd … e$„$d„cdd„c$„$d„c ¥ ¥-*1*$Æ$Æ$c$„$„$„ „ d$„$d „ c$„$d „ ddc$„$d„c … e$„$„55) -) -c„ ¥ ¥ d „dd„c … e … e ¥ ¥$d$„ e …$d$„$¥$¥(¥(¥$¥$¥(¥(¥(¥(¥$„$„(¥(¥ † †$„$„(¥(¥ † † … e ¥ ¥dd$¥$¥ e …5I5I1L1Ldddd¥¥dd$¥$¥dddd „ „$d$„$d$„dƒ$d$„$„$„ƒdƒd$„$d„c$„$d$Æ$Æ-*1*$d$„ d ƒ$d$„ „ ƒ$„$c$„$„$„$d„c „ „„c$„$„dd$„$„-*1* Æ Æ$d$„dddd „ „dd ¥ ¥ e … ¥ ¥ e …$„$„$¥$¥(¥(¥ † †$„$d(¥(¥(¥(¥(¥(¥(¥(¥ † †(¥(¥ e … ¥ ¥ ¥ ¥dd$¥$¥ e …(¥(¥55)) e … „ „¥¥dd¥¥ e …¥¥ e …dd¥¥dd$„$d „ c$„$„cd$„$d„c$„$d$„$d1)1) § §$d$„$d$„$d$„ d ƒ$d$ƒ$„$„ƒd$„$d„c$„$d „ „ „ c--$ç$ç e … e …c„ „ „dd ¥ ¥c„ ¥ ¥ e …$¥$¥$¥$¥$¥$¥(¥(¥ † †(¥(¥(¥(¥(¥(¥(¥(¥ † †(¥(¥ † †$„$d ¥ ¥dd$¥$¥ e … Æ Æ5)5)1L1L † † … edd „ „ … e … eƒd … e$„$d$„$d„c$„$d$„$„ƒdƒd$„$d„c$„$d$Æ$Æ-*1*$d$„ d ƒ$d$„ „ ƒ$„$c$„$„$„$d„c „ „„c$„$„dd$„$„-*1* Æ Æ$d$„dddd „ „dd ¥ ¥ e … ¥ ¥ e …$„$„$¥$¥(¥(¥ † †$„$d(¥(¥(¥(¥(¥(¥(¥(¥ † †(¥(¥ e … ¥ ¥ ¥ ¥dd$¥$¥ e …(¥(¥55)) e … „ „¥¥dd¥¥ e …¥¥ e …dd¥¥dd$„$d „ c$„$„cd$„$d„c$„$d$„$d1)1) § §$d$„$d$„$d$„ d ƒ$d$ƒ$„$„ƒd$„$d„c$„$d „ „ „ c--$ç$ç e … e …c„ „ „dd ¥ ¥c„ ¥ ¥ e …$¥$¥$¥$¥$¥$¥(¥(¥ † †(¥(¥(¥(¥(¥(¥(¥(¥ † †(¥(¥ † †$„$d ¥ ¥dd$¥$¥ e … Æ Æ5)5)1L1L † † … edd „ „ … e … eƒd … e$d$„$d$„ „ ƒ„c$„$d„c$„$d„c$„$c$„$d,Å,Å)K)K$d$„$d$„ „ ƒ$„$d$„$„$„$„$„$d„c$„$d$„$„cd ¥ ¥$„$„5J5J e …dd „ „dd¥¥dddd ¥ ¥$d$„ ¥ ¥$¥$¥$„$„ † †$„$„(¥(¥(¥(¥(¥(¥ † †$„$„…e … e ¥ ¥$„$„ … edd¥¥(¥(¥ § §5k5k,é,édd „ „dd¥¥ e …dddd „ „dd…eƒd … e$„$d „ c$„$d„c „ c$„$d$„$„-*1* Æ Æ$d$„$d$„ „ ƒ$„$d$„$„ ƒ d$„$d „ „„c$„$d „ „$„$d--))dd „ „dd „ „dd„„ … e „ „ ¥ ¥$„$„(¥(¥ † † … e$¥$¥$d$„(¥(¥(¥(¥ † † … e$„$d „ „ „ „$¥$¥dd¥¥ † †$„$d1)1)1L1Lc„ ¥ ¥dd¥¥dd$„$„ƒddd$„$d$„$d „ ƒ„c$„$d„c$„$d„c$„$c$„$d,Å,Å)K)K$d$„$d$„ „ ƒ$„$d$„$„$„$„$„$d„c$„$d$„$„cd ¥ ¥$„$„5J5J e …dd „ „dd¥¥dddd ¥ ¥$d$„ ¥ ¥$¥$¥$„$„ † †$„$„(¥(¥(¥(¥(¥(¥ † †$„$„…e … e ¥ ¥$„$„ … edd¥¥(¥(¥ § §5k5k,é,édd „ „dd¥¥ e …dddd „ „dd…eƒd … e$„$d „ c$„$d„c „ c$„$d$„$„-*1* Æ Æ$d$„$d$„ „ ƒ$„$d$„$„ ƒ d$„$d „ „„c$„$d „ „$„$d--))dd „ „dd „ „dd„„ … e „ „ ¥ ¥$„$„(¥(¥ † † … e$¥$¥$d$„(¥(¥(¥(¥ † † … e$„$d „ „ „ „$¥$¥dd¥¥ † †$„$d1)1)1L1Lc„ ¥ ¥dd¥¥dd$„$„ƒddd$d$„dƒ d ƒ$d$„dƒ d ƒ$d$„ d ƒ d ƒ$„$„$Æ$Æ1L1L$d$„$„$„$„$d$„$„$„$„$„$„$„$„$„$„ƒd$„$„$„$d$„$„ … e,é,é„„dd „ „dddd„„dc … e$„$„ … e$¥$¥$„$„ † †$„$„ … e$„$„(¥(¥ e …(¥(¥dd$„$„ … e … e ¥ ¥$d$„ ¥ ¥$„$„,¥,¥5m5m ç çdddd„c … edddd¥¥dd¥¥dddd$„$„ ƒ d ƒ d ƒ „ ƒ d$ƒ$d$„$„$„$d)J)J$Ç$Ç$d$„$„$„$„$„$„$„$„$„$„$„$„$„ƒd$„$„ƒd$¥$¥ c „(ç(ç § §c„dd „ „„ddddc ¥ ¥dd$„$„ † †$„$„(¥(¥ † †$„$d(¥(¥$„$„(¥(¥ e … e …$„$„dd ¥ ¥ e … e …$„$„(¥(¥(¥(¥--1L1Ldddddc † †dddddd$„$d$„$d„c „ c$„$d„c „ c$„$d „ c „ c$„$„$Æ$Æ1L1L$d$„$„$„$„$d$„$„$„$„$„$„$„$„$„$„ƒd$„$„$„$d$„$„ … e,é,é„„dd „ „dddd„„dc … e$„$„ … e$¥$¥$„$„ † †$„$„ … e$„$„(¥(¥ e …(¥(¥dd$„$„ … e … e ¥ ¥$d$„ ¥ ¥$„$„,¥,¥5m5m ç çdddd„c … edddd¥¥dd¥¥dddd$„$„ ƒ d ƒ d ƒ „ ƒ d$ƒ$d$„$„$„$d)J)J$Ç$Ç$d$„$„$„$„$„$„$„$„$„$„$„$„$„ƒd$„$„ƒd$¥$¥ c „(ç(ç § §c„dd „ „„ddddc ¥ ¥dd$„$„ † †$„$„(¥(¥ † †$„$d(¥(¥$„$„(¥(¥ e … e …$„$„dd ¥ ¥ e … e …$„$„(¥(¥(¥(¥--1L1Ldddddc † †dddddd$„$d$d$„ d ƒ d ƒ d ƒ$d$ƒ d ƒ d ƒ d ƒ$d$ƒ$d$„(Å(Å5J5Jdd$„$d$„$„ ƒ d$„$„$„$„$„$d$„$„$„$d „ „$„$„ƒd$¥$¥(¥(¥¥¥c„dd „ „„c … e$„$„ ¥ ¥$„$„(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$„$„$„$„(¥(¥ † †$„$„ § §$d$„5J5J$Ç$Çdddddd„„dd„„„ddddddd „ „„c$„$d „ c „ c „ c$„$c$„$d$„$d5)5)%% c „$d$„ d ƒ$„$„$„$d$„$„$„$„$„$d$„$„$„$d$„$d$„$„ Æ Æ$¥$¥dddd$„$ddc ¥ ¥$d$„$d$„$¥$¥$„$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$d$„(¥(¥(¥(¥$„$„(¥(¥ e …$¥$¥(¥(¥(¥(¥,é,é-*1*dƒ e …cddd„„dd „ „„c$„$d „ c „ c „ c$„$c „ c „ c „ c$„$c$„$d(Å(Å5J5Jdd$„$d$„$„ ƒ d$„$„$„$„$„$d$„$„$„$d „ „$„$„ƒd$¥$¥(¥(¥¥¥c„dd „ „„c … e$„$„ ¥ ¥$„$„(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$„$„$„$„(¥(¥ † †$„$„ § §$d$„5J5J$Ç$Çdddddd„„dd„„„ddddddd „ „„c$„$d „ c „ c „ c$„$c$„$d$„$d5)5)%% c „$d$„ d ƒ$„$„$„$d$„$„$„$„$„$d$„$„$„$d$„$d$„$„ Æ Æ$¥$¥dddd$„$ddc ¥ ¥$d$„$d$„$¥$¥$„$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$d$„(¥(¥(¥(¥$„$„(¥(¥ e …$¥$¥(¥(¥(¥(¥,é,é-*1*dƒ e …cddd„„dd „ „„c † † † †$„$„ † †(¥(¥ † †dddd „ d„c § §1L1L%%(¥(¥ † †$„$„(¥(¥$Æ$Æ,Æ,Æ † † ¥ ¥$¥$¥$¥$¥$¥$¥ § §11$Ç$Ç$Ç$Ç § §dd„c … e ¥ ¥$„$„ † †$„$„$„$d … e † †(¥(¥ e … e …$d$„(¥(¥ e …$d$„(¥(¥ † † † † … e(¥(¥ † †(¥(¥$Ç$Ç551*-* † ††f„„ÆÆd„dde…e… § § ç ç § § § § § §(¥(¥e…dd „ ddd ¥ ¥-*1*) -) - § §$¥$¥$„$„$¥$¥$Æ$Æ,¥,¥ † †$¥$¥ ¥ ¥$¥$¥$¥$¥(¥(¥,é,é%% § §$Æ$Æ † †ƒd … e ¥ ¥$„$„ † †$„$„(¥(¥dd$„$d † †$„$d … e$„$d(¥(¥ † †$„$d$¥$¥$d$„ § § d „(¥(¥ † † † † † †-*1*)K)Kf†f†„„ Æ Æe…d„dd † † † † † †$„$„ † †(¥(¥ † †dddd „ d„c § §1L1L%%(¥(¥ † †$„$„(¥(¥$Æ$Æ,Æ,Æ † † ¥ ¥$¥$¥$¥$¥$¥$¥ § §11$Ç$Ç$Ç$Ç § §dd„c … e ¥ ¥$„$„ † †$„$„$„$d … e † †(¥(¥ e … e …$d$„(¥(¥ e …$d$„(¥(¥ † † † † … e(¥(¥ † †(¥(¥$Ç$Ç551*-* † ††f„„ÆÆd„dde…e… § § ç ç § § § § § §(¥(¥e…dd „ ddd ¥ ¥-*1*) -) - § §$¥$¥$„$„$¥$¥$Æ$Æ,¥,¥ † †$¥$¥ ¥ ¥$¥$¥$¥$¥(¥(¥,é,é%% § §$Æ$Æ † †ƒd … e ¥ ¥$„$„ † †$„$„(¥(¥dd$„$d † †$„$d … e$„$d(¥(¥ † †$„$d$¥$¥$d$„ § § d „(¥(¥ † † † † † †-*1*)K)Kf†f†„„ Æ Æe…d„dd † †1L1L11551L1L55951L1L-l-l-*1*)K)K1L1L11=ð=ð=Ž=Ž5595=°A¯EïIïEðIðAðAðAðAð=Ž=ŽAïAïIðEðAðAðAðAðAðAðAðAð5Œ5Œ95)J)J1L1L1L1L1L1L1L1L1Œ1Œ-l-l5m5m-l-l1L1L1L1L1L1L1L1L)K)K)K)K) -) -)K)K1L1L559555A¯=°59=ð=ðNSN3NSN3=¯A°=ï=ïAðAðAðAð551Œ1Œ55A¯=°=ð=ðAòAñIðEðAïAïAòAñ1Œ1Œ1L1L1L1L)K)K-*1*1L1L5m5m95AðAð5595=Ž=ŽIïEïIðEðAðAðAðAðAðAð=ï=ïAðAðAðAð=Ž=ŽAðAðIðEðAðAð551L1L-*1*1L1L1L1L1L1L-l-l1L1L5m5m9n5m5m5m-l-l1L1L1L1L)K)K)K)K) -) -1L1L1L1L115m5m95=¯A°55595559551155AðAð-*1*1L1L)K)K)K)K1L1L11551L1L55951L1L-l-l-*1*)K)K1L1L11=ð=ð=Ž=Ž5595=°A¯EïIïEðIðAðAðAðAð=Ž=ŽAïAïIðEðAðAðAðAðAðAðAðAð5Œ5Œ95)J)J1L1L1L1L1L1L1L1L1Œ1Œ-l-l5m5m-l-l1L1L1L1L1L1L1L1L)K)K)K)K) -) -)K)K1L1L559555A¯=°59=ð=ðNSN3NSN3=¯A°=ï=ïAðAðAðAð551Œ1Œ55A¯=°=ð=ðAòAñIðEðAïAïAòAñ1Œ1Œ1L1L1L1L)K)K-*1*1L1L5m5m95AðAð5595=Ž=ŽIïEïIðEðAðAðAðAðAðAð=ï=ïAðAðAðAð=Ž=ŽAðAðIðEðAðAð551L1L-*1*1L1L1L1L1L1L-l-l1L1L5m5m9n5m5m5m-l-l1L1L1L1L)K)K)K)K) -) -1L1L1L1L115m5m95=¯A°55595559551155AðAð-*1*1L1L)K)K)K)K11,Æ,Æ11115J5J=¯A°,Æ,Æ$¥$¥ † †(¥(¥ ç ç$¥$¥ e … Æ Æ ¥ ¥(¥(¥ Æ Æ § §$Æ$Æ(ç(ç(¥(¥ ç ç$Æ$Æ$Æ$Æ$¥$¥ e … „ „ ç ç$Æ$Æ(¥(¥$¥$¥ † † ç ç,¥,¥5J5J=¯A°5k5k5k9k5m5m5k9k555k9k55=Œ=Œ5m5m=Œ=Œ5m5m=Œ=Œ559Ž55J5J1)1)-*1*11111)1)5)5)5J5J5I5I5J5J5J5J5k5k9I5I5)5)9k5k5k5k9)5)11=Œ=Œ1L1L(¥(¥(¥(¥$¥$¥ † † § § Æ ÆÆÆ ¥ ¥ e …$¥$¥(¥(¥ Æ Æ ç ç$Æ$Æ(ç(ç$Æ$Æ$Æ$Æ,Æ,Æ$¥$¥ † † „ „ § §$Æ$Æ ¥ ¥ ¥ ¥ Æ Æ(¥(¥$Æ$Æ11=Ž=Ž555J5J1Œ1Œ5k5k955k5k=Ž=Ž5m5m=Ž=Ž=Œ=Œ5m5m9k5k=Ž=ŽJF=Ž=Ž5)5)1)1)--115I5I9I5I5J5J5k5k9I5I5J5J5k5k9)5)1L1L11,Æ,Æ11115J5J=¯A°,Æ,Æ$¥$¥ † †(¥(¥ ç ç$¥$¥ e … Æ Æ ¥ ¥(¥(¥ Æ Æ § §$Æ$Æ(ç(ç(¥(¥ ç ç$Æ$Æ$Æ$Æ$¥$¥ e … „ „ ç ç$Æ$Æ(¥(¥$¥$¥ † † ç ç,¥,¥5J5J=¯A°5k5k5k9k5m5m5k9k555k9k55=Œ=Œ5m5m=Œ=Œ5m5m=Œ=Œ559Ž55J5J1)1)-*1*11111)1)5)5)5J5J5I5I5J5J5J5J5k5k9I5I5)5)9k5k5k5k9)5)11=Œ=Œ1L1L(¥(¥(¥(¥$¥$¥ † † § § Æ ÆÆÆ ¥ ¥ e …$¥$¥(¥(¥ Æ Æ ç ç$Æ$Æ(ç(ç$Æ$Æ$Æ$Æ,Æ,Æ$¥$¥ † † „ „ § §$Æ$Æ ¥ ¥ ¥ ¥ Æ Æ(¥(¥$Æ$Æ11=Ž=Ž555J5J1Œ1Œ5k5k955k5k=Ž=Ž5m5m=Ž=Ž=Œ=Œ5m5m9k5k=Ž=ŽJF=Ž=Ž5)5)1)1)--115I5I9I5I5J5J5k5k9I5I5J5J5k5k9)5)1L1L(¥(¥ † †$„$d$„$d0ç0ç55(¥(¥ d „dddd„ddddddd$„$d ¥ ¥ d „dcdƒdddddddddddd„„dd „ „$¥$¥dddddc … e(¥(¥55950ç0ç(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥$Ç$Ç,¥,¥0ç0ç0ç0ç$Ç$Ç0Æ0Æ5m5m1L1L(¥(¥(¥(¥$„$„(¥(¥$d$„$d$„,¥,¥$d$„,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,Æ,Æ(¥(¥,¥,¥,¥,¥,¥,¥1L1L5J5J d „dd$„$ddcdddddddd „ c ¥ ¥ e …c„$d$„dd „ ddddddddddddc „ „$¥$¥dddddcdd(¥(¥,¥,¥551)1)(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥$Ç$Ç,Æ,Æ0ç0ç,¥,¥$Ç$Ç5)5)IðIð) -) -(¥(¥ e …$¥$¥$d$„(¥(¥,¤,¤,¥,¥$d$„,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥(¥(¥ † †$„$d$„$d0ç0ç55(¥(¥ d „dddd„ddddddd$„$d ¥ ¥ d „dcdƒdddddddddddd„„dd „ „$¥$¥dddddc … e(¥(¥55950ç0ç(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥$Ç$Ç,¥,¥0ç0ç0ç0ç$Ç$Ç0Æ0Æ5m5m1L1L(¥(¥(¥(¥$„$„(¥(¥$d$„$d$„,¥,¥$d$„,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,Æ,Æ(¥(¥,¥,¥,¥,¥,¥,¥1L1L5J5J d „dd$„$ddcdddddddd „ c ¥ ¥ e …c„$d$„dd „ ddddddddddddc „ „$¥$¥dddddcdd(¥(¥,¥,¥551)1)(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥$Ç$Ç,Æ,Æ0ç0ç,¥,¥$Ç$Ç5)5)IðIð) -) -(¥(¥ e …$¥$¥$d$„(¥(¥,¤,¤,¥,¥$d$„,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,Æ,Æ,¥,¥$¥$¥ e …--5m5m(¥(¥ d „dddc„d„ddddcdd ¥ ¥ d „dddcdd„ddd„ddd„„dddd¥¥ e …dddd„„dd$„$„1155$Ç$Ç(¥(¥ † †,¥,¥$Ç$Ç$Ç$Ç$Ç$Ç0ç0ç$Ç$Ç,Æ,Æ$Ç$Ç0ç0ç=Ž=Ž1L1L,Æ,Æ § §(¥(¥ † †(¥(¥(¥(¥ § §,¥,¥(¥(¥(¥(¥,¥,¥0Æ0Æ,Æ,Æ,¥,¥ § §0Æ0Æ,é,é,¥,¥1L1L1L1L$c$„dddd„ddc„ddcdcdd$¥$¥ d „dddcdddc„ddd„ddd„„dddd¥¥ d „dddd „ „ … e,Æ,Æ5511,¥,¥ § §(¥(¥$Ç$Ç$Ç$Ç0ç0ç$Ç$Ç0ç0ç$Ç$Ç,é,é,Æ,Æ5J5J=¯A°(æ(ç(¥(¥(¥(¥(¥(¥ † †(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥$Ç$Ç,¥,¥,¥,¥,Æ,Æ,¥,¥$¥$¥ e …--5m5m(¥(¥ d „dddc„d„ddddcdd ¥ ¥ d „dddcdd„ddd„ddd„„dddd¥¥ e …dddd„„dd$„$„1155$Ç$Ç(¥(¥ † †,¥,¥$Ç$Ç$Ç$Ç$Ç$Ç0ç0ç$Ç$Ç,Æ,Æ$Ç$Ç0ç0ç=Ž=Ž1L1L,Æ,Æ § §(¥(¥ † †(¥(¥(¥(¥ § §,¥,¥(¥(¥(¥(¥,¥,¥0Æ0Æ,Æ,Æ,¥,¥ § §0Æ0Æ,é,é,¥,¥1L1L1L1L$c$„dddd„ddc„ddcdcdd$¥$¥ d „dddcdddc„ddd„ddd„„dddd¥¥ d „dddd „ „ … e,Æ,Æ5511,¥,¥ § §(¥(¥$Ç$Ç$Ç$Ç0ç0ç$Ç$Ç0ç0ç$Ç$Ç,é,é,Æ,Æ5J5J=¯A°(æ(ç(¥(¥(¥(¥(¥(¥ † †(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥$Ç$Ç,¥,¥,¥,¥,Æ,Æ † † … edd--55(¥(¥ d „d„d„dddcdcdd … e „ „dddd „ „„ddd„ddd„„dddd„„ … e „ „dd„„dddd$¥$¥1155,ç,ç0ç0ç,¥,¥ § § § §,Æ,Æ$Ç$Ç0ç0ç$Ç$Ç,é,é,¥,¥,é,é=Œ=Œ55(¥(¥(¥(¥ † † ¥ ¥ † † § §(¥(¥$Æ$Æ,¥,¥ § §(¥(¥ § §0Æ0Æ,Æ,Æ,é,é,¥,¥,é,é4ç4ç1*-*1L1L$d$„dd„c„ddd„ddcdddd¥¥ d „dd … ecddd„ddd…edd„„dd¥¥ † †$„$ddd„ddd „ „,¥,¥551*-*,Æ,Æ$Ç$Ç,¥,¥$Ç$Ç § §,¥,¥$Ç$Ç0ç0ç$Ç$Ç$Ç$Ç,Æ,Æ5J5J=¯A°,è,é(¥(¥ † † … e Æ Æ(¥(¥ † †$Ç$Ç(¥(¥$Ç$Ç,Æ,Æ$Ç$Ç,¥,¥$Ç$Ç,Æ,Æ † † … edd--55(¥(¥ d „d„d„dddcdcdd … e „ „dddd „ „„ddd„ddd„„dddd„„ … e „ „dd„„dddd$¥$¥1155,ç,ç0ç0ç,¥,¥ § § § §,Æ,Æ$Ç$Ç0ç0ç$Ç$Ç,é,é,¥,¥,é,é=Œ=Œ55(¥(¥(¥(¥ † † ¥ ¥ † † § §(¥(¥$Æ$Æ,¥,¥ § §(¥(¥ § §0Æ0Æ,Æ,Æ,é,é,¥,¥,é,é4ç4ç1*-*1L1L$d$„dd„c„ddd„ddcdddd¥¥ d „dd … ecddd„ddd…edd„„dd¥¥ † †$„$ddd„ddd „ „,¥,¥551*-*,Æ,Æ$Ç$Ç,¥,¥$Ç$Ç § §,¥,¥$Ç$Ç0ç0ç$Ç$Ç$Ç$Ç,Æ,Æ5J5J=¯A°,è,é(¥(¥ † † … e Æ Æ(¥(¥ † †$Ç$Ç(¥(¥$Ç$Ç,Æ,Æ$Ç$Ç,¥,¥$Ç$Ç(ç(ç$Ç$Ç † † … e1111,¥,¥dddd„d„d„ddddcdddd„„dddd„ddd„d…edd„„…edd „ „¥¥ e …cddd¥¥(¥(¥,é,é1L1L11$Ç$Ç$Ç$Ç$Ç$Ç,¥,¥$Ç$Ç$Ç$Ç,¥,¥$Ç$Ç0ç0ç$Ç$Ç,é,é=Œ=Œ1L1L$¥$¥f†d„d„d„f†„„†f † †,Æ,Æ § §0Æ0Æ,é,é,é,é0ç0ç,é,é(ç(ç(ç(ç1L1L5k5k d „ d „dddd„d„ddc„ddddddd „ „dd„ddd„ddd„„„ddd „ „dd¥¥ e …c„dddd$¥$¥ § §5k5k95,é,é$Ç$Ç,¥,¥$Ç$Ç § §$Ç$Ç0ç0ç$Ç$Ç,Æ,Æ$Ç$Ç0ç0ç5)5)A¯=° ¦ §¥¥f†„„„d…e…e…e † † § §,é,é § § § §,ç,ç(ç(ç$Ç$Ç † † … e1111,¥,¥dddd„d„d„ddddcdddd„„dddd„ddd„d…edd„„…edd „ „¥¥ e …cddd¥¥(¥(¥,é,é1L1L11$Ç$Ç$Ç$Ç$Ç$Ç,¥,¥$Ç$Ç$Ç$Ç,¥,¥$Ç$Ç0ç0ç$Ç$Ç,é,é=Œ=Œ1L1L$¥$¥f†d„d„d„f†„„†f † †,Æ,Æ § §0Æ0Æ,é,é,é,é0ç0ç,é,é(ç(ç(ç(ç1L1L5k5k d „ d „dddd„d„ddc„ddddddd „ „dd„ddd„ddd„„„ddd „ „dd¥¥ e …c„dddd$¥$¥ § §5k5k95,é,é$Ç$Ç,¥,¥$Ç$Ç § §$Ç$Ç0ç0ç$Ç$Ç,Æ,Æ$Ç$Ç0ç0ç5)5)A¯=° ¦ §¥¥f†„„„d…e…e…e † † § §,é,é § § § §,ç,ç,ç,ç § § e …$„$„--55,¥,¥ d „ d „dc„ddddddd„c … ecd „ „dcdddd „ „„cdddd$„$ddd„c$¥$¥dd„c„c „ d „ d,é,é5k5k11550ç0ç$Ç$Ç$Ç$Ç$Ç$Ç0ç0ç,é,é$Ç$Ç,é,é$Ç$Ç0Æ0Æ=Œ=Œ1L1Ld„e…ÆÆ dde…e…e…d„d„dd § § ç ç,Æ,Æ$Ç$Ç,Æ,Æ § §(¥(¥$¥$¥1L1L1L1L d „dcdc„ddc„d„ddddc „ „dddc „ „dddd„cdddd ¥ ¥ d „dddcdd$¥$¥ d „dc„c$„$„(¥(¥1L1L-*1*4ç4ç,é,é$Ç$Ç,Æ,Æ$Ç$Ç0ç0ç$Ç$Ç,é,é0ç0ç$Ç$Ç,é,é11=¯A°…e…e†f…e…e…e†f„d„ddc(ç(çcddd(ç(ç,ç,ç § § e …$„$„--55,¥,¥ d „ d „dc„ddddddd„c … ecd „ „dcdddd „ „„cdddd$„$ddd„c$¥$¥dd„c„c „ d „ d,é,é5k5k11550ç0ç$Ç$Ç$Ç$Ç$Ç$Ç0ç0ç,é,é$Ç$Ç,é,é$Ç$Ç0Æ0Æ=Œ=Œ1L1Ld„e…ÆÆ dde…e…e…d„d„dd § § ç ç,Æ,Æ$Ç$Ç,Æ,Æ § §(¥(¥$¥$¥1L1L1L1L d „dcdc„ddc„d„ddddc „ „dddc „ „dddd„cdddd ¥ ¥ d „dddcdd$¥$¥ d „dc„c$„$„(¥(¥1L1L-*1*4ç4ç,é,é$Ç$Ç,Æ,Æ$Ç$Ç0ç0ç$Ç$Ç,é,é0ç0ç$Ç$Ç,é,é11=¯A°…e…e†f…e…e…e†f„d„ddc(ç(çcddd(ç(ç(ç(ç$Ç$Ç$Æ$Æ † †-*1*1111 § §f†e…e…e…dd…e„ddc„ddc„ddd„„„dddÆÆ † †ÆÆd„ † † † ††f § § § §$Ç$Ç § §-*1*1L1L$Ç$Ç § §$Æ$Æ$Ç$Ç$Ç$Ç,¥,¥ § § § §(ç(ç § §(¥(¥(¥(¥=Ž=Ž55cd † † § § § § ¥ ¥ † †$¥$¥$¥$¥ † † ¥ ¥(ç(ç--11-*1*11-*1*-*1*%%5595$Ç$ÇÆÆ § §f†e…f†dd„ddd„ddc„d„d„ddd„ddd¥¥f†e…e…¥¥ † ††f Æ Æ † †$Ç$Ç § §%%5m5m,é,é ç ç$Æ$Æ$Ç$Ç$Ç$Ç,Æ,Æ § § § §$Ç$Ç § §,¥,¥ † †11AòAñ § §¥¥ § §(ç(çdd Æ Æ † †$¥$¥¥¥ † †(¥(¥ § § Æ Æ † †(ç(ç$Ç$Ç$Æ$Æ † †-*1*1111 § §f†e…e…e…dd…e„ddc„ddc„ddd„„„dddÆÆ † †ÆÆd„ † † † ††f § § § §$Ç$Ç § §-*1*1L1L$Ç$Ç § §$Æ$Æ$Ç$Ç$Ç$Ç,¥,¥ § § § §(ç(ç § §(¥(¥(¥(¥=Ž=Ž55cd † † § § § § ¥ ¥ † †$¥$¥$¥$¥ † † ¥ ¥(ç(ç--11-*1*11-*1*-*1*%%5595$Ç$ÇÆÆ § §f†e…f†dd„ddd„ddc„d„d„ddd„ddd¥¥f†e…e…¥¥ † ††f Æ Æ † †$Ç$Ç § §%%5m5m,é,é ç ç$Æ$Æ$Ç$Ç$Ç$Ç,Æ,Æ § § § §$Ç$Ç § §,¥,¥ † †11AòAñ § §¥¥ § §(ç(çdd Æ Æ † †$¥$¥¥¥ † †(¥(¥ § § Æ Æ † †=Œ=Œ5m5m9k5k5m5m9k5k=Ž=Ž1L1L1L1L1L1L1L1L)J)J11)K)K-*1*1L1L1Œ1Œ1L1L)K)K-*1*)K)K5J5J-*1*-*1*1L1L) -) -1L1L1Œ1Œ5595=ï=ï=Œ=Œ1Œ1Œ559k5k1Œ1Œ551Œ1Œ-*1*) -) -) -) -) -) -)K)K-*1*-*1*-*1*1L1L)K)K1L1L=ï=ïAðAð551Œ1Œ55=Œ=Œ5k5k=Ž=Ž=¯A°=ÏA°=¯=¯=Œ=ŒIðEðIðEðJFIðEðAðAðAðAð=ï=ï=¯A°5k5k=Ž=Ž=Ž=Ž-*1*1L1L)J)J1L1L-)-)-)-)1L1L)K)K1Œ1Œ-l-l-*1*-*1*-*1*-*1*-*1*)K)K1L1L-*1*1Œ1Œ1L1L1Œ1Œ=Ž=Ž=ï=ï=Ž=Ž559Ž5559n5m5k5k95-l-l-*1*))) -) -) -) -)K)K-*1*-*1*-*1*-l-l-*1*55AïAï55951Œ1Œ=Œ=Œ5k5k=Ž=Ž=Œ=Œ=¯A°=ÏA°=¯=¯=Ž=ŽIïEïAðAð=Ž=Ž=Œ=Œ5m5m9k5k5m5m9k5k=Ž=Ž1L1L1L1L1L1L1L1L)J)J11)K)K-*1*1L1L1Œ1Œ1L1L)K)K-*1*)K)K5J5J-*1*-*1*1L1L) -) -1L1L1Œ1Œ5595=ï=ï=Œ=Œ1Œ1Œ559k5k1Œ1Œ551Œ1Œ-*1*) -) -) -) -) -) -)K)K-*1*-*1*-*1*1L1L)K)K1L1L=ï=ïAðAð551Œ1Œ55=Œ=Œ5k5k=Ž=Ž=¯A°=ÏA°=¯=¯=Œ=ŒIðEðIðEðJFIðEðAðAðAðAð=ï=ï=¯A°5k5k=Ž=Ž=Ž=Ž-*1*1L1L)J)J1L1L-)-)-)-)1L1L)K)K1Œ1Œ-l-l-*1*-*1*-*1*-*1*-*1*)K)K1L1L-*1*1Œ1Œ1L1L1Œ1Œ=Ž=Ž=ï=ï=Ž=Ž559Ž5559n5m5k5k95-l-l-*1*))) -) -) -) -)K)K-*1*-*1*-*1*-l-l-*1*55AïAï55951Œ1Œ=Œ=Œ5k5k=Ž=Ž=Œ=Œ=¯A°=ÏA°=¯=¯=Ž=ŽIïEïAðAð=Ž=Ž$¥$¥ e …(¥(¥$¥$¥(¥(¥(¥(¥(¥(¥ d „dd$¥$¥$¥$¥ e …$¥$¥(¥(¥11-*1* § §,Å,Å,¥,¥(¥(¥,¥,¥,Æ,Æ(¥(¥(¥(¥ ¥ ¥(Å(Å$¥$¥$¥$¥(ç(ç1L1L--,¥,¥ § §,Æ,Æ § §(¥(¥$¥$¥$¥$¥ † † Æ Æ$¥$¥ § §,Æ,Æ § §(ç(ç,ç,ç,é,é(ç(ç(ç(ç$Ç$Ç,ç,ç11$Ç$Ç,é,é,ç,ç--,ç,ç111L1L11(ç(ç--1)1),ç,ç,Æ,Æ,¥,¥(¥(¥$d$„,¥,¥(¥(¥(¥(¥dd … e$¥$¥ ¥ ¥ e …$¥$¥$„$„$Ç$Ç5k5k$Ç$Ç,Æ,Æ,Æ,Æ(¥(¥(¥(¥,Æ,Æ(¥(¥(¥(¥$¥$¥$¥$¥(Å(Å(¥(¥ § §-*1*1)1)(ç(ç § §,Æ,Æ § §(¥(¥$¥$¥ † †(¥(¥ † † § § § §$Æ$Æ,Æ,Æ § §--,ç,ç,é,é(ç(ç(ç(ç,é,é,ç,ç%%,é,é(ç(ç,é,é0ç0ç--1L1L11,Æ,Æ § § „ „¥¥$¥$¥ e …(¥(¥$¥$¥(¥(¥(¥(¥(¥(¥ d „dd$¥$¥$¥$¥ e …$¥$¥(¥(¥11-*1* § §,Å,Å,¥,¥(¥(¥,¥,¥,Æ,Æ(¥(¥(¥(¥ ¥ ¥(Å(Å$¥$¥$¥$¥(ç(ç1L1L--,¥,¥ § §,Æ,Æ § §(¥(¥$¥$¥$¥$¥ † † Æ Æ$¥$¥ § §,Æ,Æ § §(ç(ç,ç,ç,é,é(ç(ç(ç(ç$Ç$Ç,ç,ç11$Ç$Ç,é,é,ç,ç--,ç,ç111L1L11(ç(ç--1)1),ç,ç,Æ,Æ,¥,¥(¥(¥$d$„,¥,¥(¥(¥(¥(¥dd … e$¥$¥ ¥ ¥ e …$¥$¥$„$„$Ç$Ç5k5k$Ç$Ç,Æ,Æ,Æ,Æ(¥(¥(¥(¥,Æ,Æ(¥(¥(¥(¥$¥$¥$¥$¥(Å(Å(¥(¥ § §-*1*1)1)(ç(ç § §,Æ,Æ § §(¥(¥$¥$¥ † †(¥(¥ † † § § § §$Æ$Æ,Æ,Æ § §--,ç,ç,é,é(ç(ç(ç(ç,é,é,ç,ç%%,é,é(ç(ç,é,é0ç0ç--1L1L11,Æ,Æ § § „ „¥¥dd¥¥ e … e … † † … edd „ „…edd¥¥ e …(¥(¥(¥(¥1111,¥,¥,Æ,Æ,¥,¥,Æ,Æ,Æ,Æ,¥,¥0ç0ç,Æ,Æ$Æ$Æ § §(ç(ç$¥$¥$Ç$Ç1Œ1Œ,é,é § § § § † †$¥$¥ † † … e$¥$¥ e … e …¥¥ † † † †$¥$¥(¥(¥ † †(¥(¥ † † § §$„$„ † †…edd Æ Æ † † § §,¥,¥,é,é--(¥(¥(¥(¥ † †(¥(¥ e …(¥(¥ † †$„$„ † † … e … edd „ „dddd¥¥ d „ † †(¥(¥,¥,¥5m5m11,¥,¥,¥,¥,¥,¥,Æ,Æ,¥,¥0ç0ç,Æ,Æ,Æ,Æ$Æ$Æ$Æ$Æ$Æ$Æ § §1L1L-*1*,Æ,Æ † †$¥$¥ † † … e$¥$¥ e …¥¥ † †dd$¥$¥ † † † †(¥(¥ † †(¥(¥ † † § §(¥(¥ e …¥¥e… e … † †(¥(¥ § §0Æ0Æ11$Ç$Ç(¥(¥ † †dddddd¥¥ e … e … † † … edd „ „…edd¥¥ e …(¥(¥(¥(¥1111,¥,¥,Æ,Æ,¥,¥,Æ,Æ,Æ,Æ,¥,¥0ç0ç,Æ,Æ$Æ$Æ § §(ç(ç$¥$¥$Ç$Ç1Œ1Œ,é,é § § § § † †$¥$¥ † † … e$¥$¥ e … e …¥¥ † † † †$¥$¥(¥(¥ † †(¥(¥ † † § §$„$„ † †…edd Æ Æ † † § §,¥,¥,é,é--(¥(¥(¥(¥ † †(¥(¥ e …(¥(¥ † †$„$„ † † … e … edd „ „dddd¥¥ d „ † †(¥(¥,¥,¥5m5m11,¥,¥,¥,¥,¥,¥,Æ,Æ,¥,¥0ç0ç,Æ,Æ,Æ,Æ$Æ$Æ$Æ$Æ$Æ$Æ § §1L1L-*1*,Æ,Æ † †$¥$¥ † † … e$¥$¥ e …¥¥ † †dd$¥$¥ † † † †(¥(¥ † †(¥(¥ † † § §(¥(¥ e …¥¥e… e … † †(¥(¥ § §0Æ0Æ11$Ç$Ç(¥(¥ † †dddddddd¥¥ e …dd „ „…e„„¥¥ e … e … „ „¥¥ § §551L1L e …,¥,¥0ç0ç,¥,¥0ç0ç,Æ,Æ,Æ,Æ0ç0ç$Ç$Ç(ç(ç § §$Ç$Ç ç ç1L1L--,¥,¥ † †$¥$¥ e …¥¥ e … † †dd¥¥ † † † † … e$¥$¥ † †(¥(¥ † † § §(¥(¥ † † † †¥¥e… § §$¥$¥ † †(¥(¥0Æ0Æ,é,é § §,¥,¥$Ç$Ç(¥(¥ e … † †(¥(¥e… e … „ „¥¥dd¥¥e…¥¥dd$¥$¥ e … † †,é,é5m5m § §(¥(¥0Æ0Æ0ç0ç$Ç$Ç,¥,¥0Æ0Æ0ç0ç$Ç$Ç(ç(ç$Ç$Ç § § Æ Æ) -) -9)5) § §$Æ$Æ † †$¥$¥ e …¥¥ † † … e „ „¥¥ † † … e(¥(¥ † †(¥(¥¥¥ § §(¥(¥ e … Æ Æ e …e… § §$¥$¥ † †(¥(¥,¥,¥,é,é$Æ$Æ,Æ,Æ,¥,¥ † † … edddd¥¥ e …dd „ „…e„„¥¥ e … e … „ „¥¥ § §551L1L e …,¥,¥0ç0ç,¥,¥0ç0ç,Æ,Æ,Æ,Æ0ç0ç$Ç$Ç(ç(ç § §$Ç$Ç ç ç1L1L--,¥,¥ † †$¥$¥ e …¥¥ e … † †dd¥¥ † † † † … e$¥$¥ † †(¥(¥ † † § §(¥(¥ † † † †¥¥e… § §$¥$¥ † †(¥(¥0Æ0Æ,é,é § §,¥,¥$Ç$Ç(¥(¥ e … † †(¥(¥e… e … „ „¥¥dd¥¥e…¥¥dd$¥$¥ e … † †,é,é5m5m § §(¥(¥0Æ0Æ0ç0ç$Ç$Ç,¥,¥0Æ0Æ0ç0ç$Ç$Ç(ç(ç$Ç$Ç § § Æ Æ) -) -9)5) § §$Æ$Æ † †$¥$¥ e …¥¥ † † … e „ „¥¥ † † … e(¥(¥ † †(¥(¥¥¥ § §(¥(¥ e … Æ Æ e …e… § §$¥$¥ † †(¥(¥,¥,¥,é,é$Æ$Æ,Æ,Æ,¥,¥ † † … edd¥¥dd…e „ „…edd¥¥ e …e…„„ † † … e$¥$¥,é,é-l-ldd,¥,¥0ç0ç,Æ,Æ0Æ0Æ0ç0ç0ç0ç0ç0ç$Ç$Ç,Æ,Æ$Ç$Ç Æ Æ%%1L1L(ç(ç § §(¥(¥ † † … e$¥$¥e…$¥$¥ e …¥¥ e …¥¥ † †$Æ$Æ † †$¥$¥$¥$¥ † † † †$¥$¥e…dd¥¥ † † § §$„$„,¥,¥,é,é,é,é(¥(¥$Ç$Ç(¥(¥ † †(¥(¥e… † † … edddd¥¥dd…e … e¥¥ e …e…$¥$¥ e …$Æ$Æ55 § §(¥(¥,¥,¥0ç0ç,¥,¥4ç4ç,é,é0Æ0Æ0Æ0Æ$Ç$Ç(ç(ç § § Æ Æ) -) -11 § §$Æ$Æ † † … e¥¥ † †dd$¥$¥ e … e …¥¥ † † † †(¥(¥ † †$¥$¥ † † § § † † … e¥¥dd Æ Æ † †$¥$¥ † †,¥,¥-*1*$Ç$Ç,¥,¥ † † … edddd¥¥dd…e „ „…edd¥¥ e …e…„„ † † … e$¥$¥,é,é-l-ldd,¥,¥0ç0ç,Æ,Æ0Æ0Æ0ç0ç0ç0ç0ç0ç$Ç$Ç,Æ,Æ$Ç$Ç Æ Æ%%1L1L(ç(ç § §(¥(¥ † † … e$¥$¥e…$¥$¥ e …¥¥ e …¥¥ † †$Æ$Æ † †$¥$¥$¥$¥ † † † †$¥$¥e…dd¥¥ † † § §$„$„,¥,¥,é,é,é,é(¥(¥$Ç$Ç(¥(¥ † †(¥(¥e… † † … edddd¥¥dd…e … e¥¥ e …e…$¥$¥ e …$Æ$Æ55 § §(¥(¥,¥,¥0ç0ç,¥,¥4ç4ç,é,é0Æ0Æ0Æ0Æ$Ç$Ç(ç(ç § § Æ Æ) -) -11 § §$Æ$Æ † † … e¥¥ † †dd$¥$¥ e … e …¥¥ † † † †(¥(¥ † †$¥$¥ † † § § † † … e¥¥dd Æ Æ † †$¥$¥ † †,¥,¥-*1*$Ç$Ç,¥,¥ † † … edddd„d … edd¥¥dd„d…e…e „ „ … e¥¥dd¥¥11-l-l,ç,ç0Æ0Æ4ç4ç95======4ç4ç95 § §(ç(ç † †) -) -1*-*(ç(ç † † § § e …$¥$¥e… e …¥¥ e …¥¥ † †$¥$¥ e … † †(¥(¥ † † † † § §$¥$¥ e …¥¥dddd † †$¥$¥ † †,¥,¥,é,é11$Ç$Ç(¥(¥ † † † †(¥(¥ † †$„$„dd ¥ ¥dd … e„d „ „…e … e„„ … edd¥¥ § §1L1L11,Æ,Æ0ç0ç4ç4ç====4ç4ç==4ç4ç(ç(ç § §$Æ$Æ § §1L1L,é,é Æ Æ(¥(¥¥¥ † † † †dd¥¥e… e … † †¥¥$¥$¥ † †$¥$¥ † † † † § §(¥(¥ e …¥¥e…dd¥¥ † † † †,¥,¥,Æ,Æ-*1*0ç0ç † † † † „ ddddd„d … edd¥¥dd„d…e…e „ „ … e¥¥dd¥¥11-l-l,ç,ç0Æ0Æ4ç4ç95======4ç4ç95 § §(ç(ç † †) -) -1*-*(ç(ç † † § § e …$¥$¥e… e …¥¥ e …¥¥ † †$¥$¥ e … † †(¥(¥ † † † † § §$¥$¥ e …¥¥dddd † †$¥$¥ † †,¥,¥,é,é11$Ç$Ç(¥(¥ † † † †(¥(¥ † †$„$„dd ¥ ¥dd … e„d „ „…e … e„„ … edd¥¥ § §1L1L11,Æ,Æ0ç0ç4ç4ç====4ç4ç==4ç4ç(ç(ç § §$Æ$Æ § §1L1L,é,é Æ Æ(¥(¥¥¥ † † † †dd¥¥e… e … † †¥¥$¥$¥ † †$¥$¥ † † † † § §(¥(¥ e …¥¥e…dd¥¥ † † † †,¥,¥,Æ,Æ-*1*0ç0ç † † † † „ ddddddd„„dddd „ „dddddd¥¥dd¥¥ † †(¥(¥,é,é-l-l$Ç$Ç(ç(ç § §0ç0ç,é,é55,é,é0Æ0Æ$Ç$Ç † †dd ç ç$Ç$Ç) -) -(¥(¥$¥$¥ † † ¥ ¥ e …dd¥¥ e …dd¥¥ † †dd$¥$¥$¥$¥ † †(¥(¥ † †$¥$¥ e … e …¥¥ e …ÆÆ e …$¥$¥ † †,¥,¥,é,é-*1*,¥,¥ † †,¥,¥ § §$d$„(¥(¥ e … e …$d$„dc$¥$¥d„dddd¥¥dd¥¥$¥$¥ † †,Æ,Æ1L1L))$Ç$Ç$Æ$Æ$Ç$Ç,é,é1155,é,é,ç,ç § §dd Æ Æ † †)K)K(ç(ç † †(¥(¥ e …¥¥ e …dd … e¥¥dd¥¥ † † † † … e(¥(¥$¥$¥$¥$¥ † † † †dd¥¥ † † … e¥¥(¥(¥ † †(¥(¥,¥,¥-*1*,é,é(¥(¥(¥(¥dddddddd„„dddd „ „dddddd¥¥dd¥¥ † †(¥(¥,é,é-l-l$Ç$Ç(ç(ç § §0ç0ç,é,é55,é,é0Æ0Æ$Ç$Ç † †dd ç ç$Ç$Ç) -) -(¥(¥$¥$¥ † † ¥ ¥ e …dd¥¥ e …dd¥¥ † †dd$¥$¥$¥$¥ † †(¥(¥ † †$¥$¥ e … e …¥¥ e …ÆÆ e …$¥$¥ † †,¥,¥,é,é-*1*,¥,¥ † †,¥,¥ § §$d$„(¥(¥ e … e …$d$„dc$¥$¥d„dddd¥¥dd¥¥$¥$¥ † †,Æ,Æ1L1L))$Ç$Ç$Æ$Æ$Ç$Ç,é,é1155,é,é,ç,ç § §dd Æ Æ † †)K)K(ç(ç † †(¥(¥ e …¥¥ e …dd … e¥¥dd¥¥ † † † † … e(¥(¥$¥$¥$¥$¥ † † † †dd¥¥ † † … e¥¥(¥(¥ † †(¥(¥,¥,¥-*1*,é,é(¥(¥(¥(¥dddd § § Æ Æ § § Æ Æ¥¥¥¥¥¥ÆÆ § §ÆÆ † † † † § § § §-*1*)K)Kd„d„ dd CCdde…f† ddf†) -) -!!!!11-*1* § §f† Æ Æ † † § §e…e… e …f†dd¥¥ § § § § † † † † † † † † † † † †¥¥e…e… e … Æ Æ § §$Ç$Ç$Ç$Ç,é,é5m5m1*-*,é,é,é,é$Ç$Ç$Ç$Ç § § † †$¥$¥dd¥¥dd„d„d„d…e†f § § † † § §))11 ç çddd dd cdc ddf†d„e…$Ç$Ç!! ç ç) -) -11 § § † † § §f† § §f†¥¥e… e …ÆÆdd † † § § † † † † † † † † † † † †$¥$¥e…dd¥¥ † † § §$Ç$Ç$Ç$Ç,é,é5J5J1L1L,é,é,é,é,é,é$Ç$Ç § § Æ Æ § § Æ Æ¥¥¥¥¥¥ÆÆ § §ÆÆ † † † † § § § §-*1*)K)Kd„d„ dd CCdde…f† ddf†) -) -!!!!11-*1* § §f† Æ Æ † † § §e…e… e …f†dd¥¥ § § § § † † † † † † † † † † † †¥¥e…e… e … Æ Æ § §$Ç$Ç$Ç$Ç,é,é5m5m1*-*,é,é,é,é$Ç$Ç$Ç$Ç § § † †$¥$¥dd¥¥dd„d„d„d…e†f § § † † § §))11 ç çddd dd cdc ddf†d„e…$Ç$Ç!! ç ç) -) -11 § § † † § §f† § §f†¥¥e… e …ÆÆdd † † § § † † † † † † † † † † † †$¥$¥e…dd¥¥ † † § §$Ç$Ç$Ç$Ç,é,é5J5J1L1L,é,é,é,é,é,é$Ç$Ç559k5k559k5k1L1LAðAð551*-*1Œ1Œ11)K)K-*1*-*1*-l-l5k5k95-*1*-*1*-*1*%%-*1*1L1L1155=ï=ïAðAð=Ž=Ž=Ž=Ž=Ž=Ž=Œ=Œ5Œ5Œ955Œ5Œ951Œ1ŒAòAñ=Ž=Ž1Œ1Œ1Œ1Œ111L1LAðAð559Œ5Œ551Œ1Œ=Ž=Ž1Œ1Œ5m5m95AðAð=¯A°1Œ1Œ=¯A°=ÏA°=¯=¯=Ž=Ž=Ž=Ž=¯A°=Œ=Œ=Ž=Ž=Ž=Ž=Ž=Ž555k9k555k9k5m5m1L1L-*1*) -) -) -) -%%) -) --)-)1L1L)K)K)J)J5m5m9k5k-*1*)K)K-*1*) -) -1*-*1L1L1Œ1Œ55=Ž=ŽAðAð=¯A°5559Ž=Œ=Œ555Œ9Œ555Œ9Œ55=Ž=ŽAðAð551L1L55-l-l=¯A°=ÏA°1Ž1559Ž5559Ž51L1L55AðAðAòAñ1L1L=¯A°=ÏA°9Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=¯A°=Ž=Ž=Ž=Ž55=Ž=Ž595k5k595k5k1L1LAðAð551*-*1Œ1Œ11)K)K-*1*-*1*-l-l5k5k95-*1*-*1*-*1*%%-*1*1L1L1155=ï=ïAðAð=Ž=Ž=Ž=Ž=Ž=Ž=Œ=Œ5Œ5Œ955Œ5Œ951Œ1ŒAòAñ=Ž=Ž1Œ1Œ1Œ1Œ111L1LAðAð559Œ5Œ551Œ1Œ=Ž=Ž1Œ1Œ5m5m95AðAð=¯A°1Œ1Œ=¯A°=ÏA°=¯=¯=Ž=Ž=Ž=Ž=¯A°=Œ=Œ=Ž=Ž=Ž=Ž=Ž=Ž555k9k555k9k5m5m1L1L-*1*) -) -) -) -%%) -) --)-)1L1L)K)K)J)J5m5m9k5k-*1*)K)K-*1*) -) -1*-*1L1L1Œ1Œ55=Ž=ŽAðAð=¯A°5559Ž=Œ=Œ555Œ9Œ555Œ9Œ55=Ž=ŽAðAð551L1L55-l-l=¯A°=ÏA°1Ž1559Ž5559Ž51L1L55AðAðAòAñ1L1L=¯A°=ÏA°9Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=¯A°=Ž=Ž=Ž=Ž55=Ž=Ž,Æ,Æ,Æ,Æ,Æ,Æ § §,Æ,ÆAðAð5J5Jdd(¥(¥ † † … e ¥ ¥ ¥ ¥(¥(¥ † †(¥(¥ § §(ç(ç § §$Æ$Æ § §(ç(ç$Æ$Æ,Æ,Æ(ç(ç$Æ$Æ(¥(¥$¥$¥$¥$¥$¥$¥ † †(¥(¥(ç(ç,Å,Å,Æ,Æ5J5JIðEð) -) -(ç(ç(¥(¥$Æ$Æ$Æ$Æ § §$Æ$Æ § §(¥(¥$Æ$Æ,¥,¥,Æ,Æ,é,éAðAð5J5J11--(ç(ç,ç,ç,é,é,Æ,Æ,Æ,Æ$Ç$Ç$Æ$Æ § §(ç(ç,Æ,Æ,é,é,Æ,Æ,ç,ç=Œ=Œ1L1L$¥$¥ e …$„$„ ¥ ¥$„$„ † †ƒd(¥(¥(¥(¥ † † § §$Æ$Æ$Ç$Ç,Æ,Æ § § § §(ç(ç$Æ$Æ,Æ,Æ$Ç$Ç(ç(ç$¥$¥(¥(¥ † †$¥$¥$Æ$Æ(¥(¥(¥(¥,Æ,Æ,Æ,Æ--AïAï55,Æ,Æ$Æ$Æ$Æ$Æ$Æ$Æ † †$Æ$Æ$Æ$Æ(¥(¥ † †,Æ,Æ,Æ,Æ,Æ,Æ55=Ž=Ž11--(ç(ç,ç,ç,é,é,ç,ç0ç0ç$Æ$Æ § §,Æ,Æ$Æ$Æ,Æ,Æ,Æ,Æ,Æ,Æ,Æ,Æ § §,Æ,ÆAðAð5J5Jdd(¥(¥ † † … e ¥ ¥ ¥ ¥(¥(¥ † †(¥(¥ § §(ç(ç § §$Æ$Æ § §(ç(ç$Æ$Æ,Æ,Æ(ç(ç$Æ$Æ(¥(¥$¥$¥$¥$¥$¥$¥ † †(¥(¥(ç(ç,Å,Å,Æ,Æ5J5JIðEð) -) -(ç(ç(¥(¥$Æ$Æ$Æ$Æ § §$Æ$Æ § §(¥(¥$Æ$Æ,¥,¥,Æ,Æ,é,éAðAð5J5J11--(ç(ç,ç,ç,é,é,Æ,Æ,Æ,Æ$Ç$Ç$Æ$Æ § §(ç(ç,Æ,Æ,é,é,Æ,Æ,ç,ç=Œ=Œ1L1L$¥$¥ e …$„$„ ¥ ¥$„$„ † †ƒd(¥(¥(¥(¥ † † § §$Æ$Æ$Ç$Ç,Æ,Æ § § § §(ç(ç$Æ$Æ,Æ,Æ$Ç$Ç(ç(ç$¥$¥(¥(¥ † †$¥$¥$Æ$Æ(¥(¥(¥(¥,Æ,Æ,Æ,Æ--AïAï55,Æ,Æ$Æ$Æ$Æ$Æ$Æ$Æ † †$Æ$Æ$Æ$Æ(¥(¥ † †,Æ,Æ,Æ,Æ,Æ,Æ55=Ž=Ž11--(ç(ç,ç,ç,é,é,ç,ç0ç0ç$Æ$Æ § §,Æ,Æ$Æ$Æ,Æ,Æ(¥(¥(¥(¥,Æ,Æ § §,¥,¥55) -) -$¥$¥$„$„$„$„(¥(¥ e …(¥(¥(¥(¥ † †(¥(¥ † †(¥(¥$¥$¥ † †(¥(¥ § §(¥(¥ § §(¥(¥,¥,¥ † †$¥$¥ † †$¥$¥$¥$¥(¥(¥,¥,¥,Æ,Æ,¥,¥5k5k=ð=ð1)1)(¥(¥ † †(¥(¥(¥(¥ † †(¥(¥(¥(¥(¥(¥ † †,¥,¥ § §4ç4ç95$Æ$Æ,¥,¥ § §,¥,¥,¥,¥(¥(¥ § §(¥(¥ § §(¥(¥ † †$Æ$Æ § §$Æ$Æ,¥,¥,¥,¥-*1*1L1L$d$„$d$„$d$„dƒ e …(¥(¥$¥$¥ e …(¥(¥(¥(¥ † †$„$„(¥(¥ † †(¥(¥$¥$¥ § §(¥(¥ § §(¥(¥,Æ,Æ$¥$¥$¥$¥ † †$¥$¥$„$„$¥$¥(¥(¥,Æ,Æ,Æ,Æ11AðAð55$„$„ § §(¥(¥(¥(¥(¥(¥ † †(¥(¥ § §(¥(¥(¥(¥ § §,¥,¥=Œ=Œ-*1*(¥(¥(¥(¥,¥,¥$Ç$Ç(¥(¥(¥(¥ † †(¥(¥ § §(¥(¥(¥(¥ § §(¥(¥(¥(¥,Æ,Æ § §,¥,¥55) -) -$¥$¥$„$„$„$„(¥(¥ e …(¥(¥(¥(¥ † †(¥(¥ † †(¥(¥$¥$¥ † †(¥(¥ § §(¥(¥ § §(¥(¥,¥,¥ † †$¥$¥ † †$¥$¥$¥$¥(¥(¥,¥,¥,Æ,Æ,¥,¥5k5k=ð=ð1)1)(¥(¥ † †(¥(¥(¥(¥ † †(¥(¥(¥(¥(¥(¥ † †,¥,¥ § §4ç4ç95$Æ$Æ,¥,¥ § §,¥,¥,¥,¥(¥(¥ § §(¥(¥ § §(¥(¥ † †$Æ$Æ § §$Æ$Æ,¥,¥,¥,¥-*1*1L1L$d$„$d$„$d$„dƒ e …(¥(¥$¥$¥ e …(¥(¥(¥(¥ † †$„$„(¥(¥ † †(¥(¥$¥$¥ § §(¥(¥ § §(¥(¥,Æ,Æ$¥$¥$¥$¥ † †$¥$¥$„$„$¥$¥(¥(¥,Æ,Æ,Æ,Æ11AðAð55$„$„ § §(¥(¥(¥(¥(¥(¥ † †(¥(¥ § §(¥(¥(¥(¥ § §,¥,¥=Œ=Œ-*1*(¥(¥(¥(¥,¥,¥$Ç$Ç(¥(¥(¥(¥ † †(¥(¥ § §(¥(¥(¥(¥ § §(¥(¥,Æ,Æ † †(¥(¥,¥,¥-*1*)) e …(¥(¥ e …$„$„(¥(¥(¥(¥ † †$„$„(¥(¥ e …$¥$¥$„$„$¥$¥ † †$¥$¥(¥(¥(¥(¥,Æ,Æ(¥(¥(¥(¥ † †$¥$¥(¥(¥(¥(¥,¥,¥,Æ,Æ(ç(ç,¥,¥5J5JAòAñ$Ç$Ç(¥(¥ § §(¥(¥ † †(¥(¥ † †(¥(¥ † †(¥(¥ § §,¥,¥,ç,çAðAð$Ç$Ç,¥,¥,¥,¥,¥,¥ § §,¥,¥,¥,¥ § §,¥,¥$Æ$Æ § §(¥(¥ † †$Æ$Æ$Ç$Ç,¥,¥5k5k1*-*$„$„ … e$„$ddc „ „$¥$¥$„$„(¥(¥ e …$¥$¥$¥$¥$„$„(¥(¥$¥$¥ † †$¥$¥$„$„ § §(¥(¥(¥(¥(¥(¥(¥(¥ † †$¥$¥(¥(¥(¥(¥(¥(¥,Æ,Æ,Æ,Æ(¥(¥0ç0çAðAð-*1* § §(¥(¥(¥(¥ † † † †(¥(¥(¥(¥ † †(¥(¥$¥$¥,¥,¥,¥,¥5m5m1L1L,¥,¥,¥,¥,¥,¥ § §(¥(¥,¥,¥,¥,¥$Æ$Æ,¥,¥ † †$Æ$Æ(¥(¥(¥(¥,Æ,Æ † †(¥(¥,¥,¥-*1*)) e …(¥(¥ e …$„$„(¥(¥(¥(¥ † †$„$„(¥(¥ e …$¥$¥$„$„$¥$¥ † †$¥$¥(¥(¥(¥(¥,Æ,Æ(¥(¥(¥(¥ † †$¥$¥(¥(¥(¥(¥,¥,¥,Æ,Æ(ç(ç,¥,¥5J5JAòAñ$Ç$Ç(¥(¥ § §(¥(¥ † †(¥(¥ † †(¥(¥ † †(¥(¥ § §,¥,¥,ç,çAðAð$Ç$Ç,¥,¥,¥,¥,¥,¥ § §,¥,¥,¥,¥ § §,¥,¥$Æ$Æ § §(¥(¥ † †$Æ$Æ$Ç$Ç,¥,¥5k5k1*-*$„$„ … e$„$ddc „ „$¥$¥$„$„(¥(¥ e …$¥$¥$¥$¥$„$„(¥(¥$¥$¥ † †$¥$¥$„$„ § §(¥(¥(¥(¥(¥(¥(¥(¥ † †$¥$¥(¥(¥(¥(¥(¥(¥,Æ,Æ,Æ,Æ(¥(¥0ç0çAðAð-*1* § §(¥(¥(¥(¥ † † † †(¥(¥(¥(¥ † †(¥(¥$¥$¥,¥,¥,¥,¥5m5m1L1L,¥,¥,¥,¥,¥,¥ § §(¥(¥,¥,¥,¥,¥$Æ$Æ,¥,¥ † †$Æ$Æ(¥(¥(¥(¥ † †(¥(¥ † †,¥,¥) -) -,é,é e …$„$„$„$„(¥(¥$„$„(¥(¥$„$„ † †$„$d(¥(¥$„$„ † †$„$„(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥,Æ,Æ(¥(¥(¥(¥(¥(¥,¥,¥,Æ,Æ,Æ,Æ,Æ,Æ,Å,Å,Å,Å5k5kAðAð$Ç$Ç † †$„$„ † †$„$„ † †(¥(¥ † † ¥ ¥ † †$¥$¥(¥(¥0Æ0Æ=¯A°11,¥,¥,¥,¥,Æ,Æ(¥(¥,¥,¥ § §,¥,¥,¥,¥(¥(¥ § §$¥$¥ † † § §(ç(ç551*-*1L1L$„$„ „ d … eƒd$„$„$„$„(¥(¥ † †(¥(¥$d$„(¥(¥(¥(¥ e …$„$„ † †$„$„(¥(¥(¥(¥(¥(¥,¥,¥,Æ,Æ(¥(¥(¥(¥(¥(¥,¥,¥,Æ,Æ,Æ,Æ,Æ,Æ,Æ,Æ,Å,Å1)1)AðAð-*1* ¥ ¥(¥(¥e…(¥(¥ † †(¥(¥ e …$¥$¥ † † † †(¥(¥,¥,¥=Œ=Œ1L1L,¥,¥,Æ,Æ,¥,¥(¥(¥,¥,¥ § §(¥(¥,¥,¥ § §(¥(¥ † †(¥(¥(¥(¥ † †(¥(¥ † †,¥,¥) -) -,é,é e …$„$„$„$„(¥(¥$„$„(¥(¥$„$„ † †$„$d(¥(¥$„$„ † †$„$„(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥,Æ,Æ(¥(¥(¥(¥(¥(¥,¥,¥,Æ,Æ,Æ,Æ,Æ,Æ,Å,Å,Å,Å5k5kAðAð$Ç$Ç † †$„$„ † †$„$„ † †(¥(¥ † † ¥ ¥ † †$¥$¥(¥(¥0Æ0Æ=¯A°11,¥,¥,¥,¥,Æ,Æ(¥(¥,¥,¥ § §,¥,¥,¥,¥(¥(¥ § §$¥$¥ † † § §(ç(ç551*-*1L1L$„$„ „ d … eƒd$„$„$„$„(¥(¥ † †(¥(¥$d$„(¥(¥(¥(¥ e …$„$„ † †$„$„(¥(¥(¥(¥(¥(¥,¥,¥,Æ,Æ(¥(¥(¥(¥(¥(¥,¥,¥,Æ,Æ,Æ,Æ,Æ,Æ,Æ,Æ,Å,Å1)1)AðAð-*1* ¥ ¥(¥(¥e…(¥(¥ † †(¥(¥ e …$¥$¥ † † † †(¥(¥,¥,¥=Œ=Œ1L1L,¥,¥,Æ,Æ,¥,¥(¥(¥,¥,¥ § §(¥(¥,¥,¥ § §(¥(¥ † †(¥(¥$¥$¥(¥(¥ † †(¥(¥$Ç$Ç551*-*$d$„$¥$¥$c$„$d$„(¥(¥(¥(¥(¥(¥(¥(¥$d$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥,Æ,Æ,Æ,Æ(¥(¥,Æ,Æ(¥(¥,Æ,Æ,¥,¥0ç0ç,Å,Å0ç0ç,Æ,Æ1L1L=ï=ï,é,é$¥$¥$¥$¥ † †(¥(¥ † † … e(¥(¥$¥$¥ † †(¥(¥(¥(¥0ç0ç5m5m--0Æ0Æ,¥,¥,¥,¥,¥,¥,¥,¥(¥(¥,¥,¥,Æ,Æ(¥(¥ † †(¥(¥ § §$¥$¥,Æ,Æ$Ç$Ç5n5m1L1L$„$„ „ d … eƒd … e$¥$¥$„$„(¥(¥(¥(¥(¥(¥$d$„(¥(¥$¥$¥$d$„(¥(¥(¥(¥(¥(¥$d$„,¥,¥0Æ0Æ,Å,Å,Æ,Æ(¥(¥,¥,¥,Æ,Æ(¥(¥,Æ,Æ0ç0ç,Å,Å0Æ0Æ11551Œ1Œ$„$„ † † § §$„$„ † † † † ¥ ¥(¥(¥ † †$¥$¥(¥(¥,¥,¥1L1L1L1L,Å,Å,¥,¥,¥,¥,¥,¥,¥,¥(¥(¥,¥,¥,Æ,Æ,¥,¥ § §(¥(¥ † †$¥$¥(¥(¥ † †(¥(¥$Ç$Ç551*-*$d$„$¥$¥$c$„$d$„(¥(¥(¥(¥(¥(¥(¥(¥$d$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥,Æ,Æ,Æ,Æ(¥(¥,Æ,Æ(¥(¥,Æ,Æ,¥,¥0ç0ç,Å,Å0ç0ç,Æ,Æ1L1L=ï=ï,é,é$¥$¥$¥$¥ † †(¥(¥ † † … e(¥(¥$¥$¥ † †(¥(¥(¥(¥0ç0ç5m5m--0Æ0Æ,¥,¥,¥,¥,¥,¥,¥,¥(¥(¥,¥,¥,Æ,Æ(¥(¥ † †(¥(¥ § §$¥$¥,Æ,Æ$Ç$Ç5n5m1L1L$„$„ „ d … eƒd … e$¥$¥$„$„(¥(¥(¥(¥(¥(¥$d$„(¥(¥$¥$¥$d$„(¥(¥(¥(¥(¥(¥$d$„,¥,¥0Æ0Æ,Å,Å,Æ,Æ(¥(¥,¥,¥,Æ,Æ(¥(¥,Æ,Æ0ç0ç,Å,Å0Æ0Æ11551Œ1Œ$„$„ † † § §$„$„ † † † † ¥ ¥(¥(¥ † †$¥$¥(¥(¥,¥,¥1L1L1L1L,Å,Å,¥,¥,¥,¥,¥,¥,¥,¥(¥(¥,¥,¥,Æ,Æ,¥,¥ § §(¥(¥ † † e …(¥(¥(¥(¥,¥,¥$Ç$Ç11%%$„$„ „ d$„$„ † †(¥(¥$„$„(¥(¥$„$„(¥(¥$„$„ … e$¥$¥$„$„(¥(¥,¥,¥,¥,¥,¥,¥0ç0ç(¥(¥(¥(¥,¥,¥,Æ,Æ,Æ,Æ,Å,Å,Å,Å(ç(ç,¥,¥(Å(Å11AðAð)) † †(¥(¥ † † † †(¥(¥ e …$¥$¥$¥$¥ † † § §$„$„ † †110ç0ç,¥,¥,Æ,Æ,¥,¥,Æ,Æ,¥,¥,¥,¥,Æ,Æ,¥,¥(¥(¥(¥(¥(¥(¥$¥$¥$¥$¥$¥$¥ e …1L1L1L1L c „$d$„dc d „dcdƒ$„$„(¥(¥(¥(¥$„$„(¥(¥$„$„$„$„(¥(¥$„$„(¥(¥(¥(¥,Æ,Æ,Å,Å,Å,Å,Æ,Æ$¥$¥,¥,¥,Æ,Æ,Æ,Æ,Å,Å,Å,Å,Æ,Æ,Å,Å(¥(¥,Æ,Æ5595$d$„,¥,¥ † †$¥$¥ † †$„$„ † †$¥$¥ † †(¥(¥ † † † †1)1)1L1L,¥,¥,Å,Å,¥,¥,Æ,Æ,Æ,Æ,¥,¥,Æ,Æ,Å,Å,¥,¥(¥(¥ † †$„$d … e(¥(¥(¥(¥,¥,¥$Ç$Ç11%%$„$„ „ d$„$„ † †(¥(¥$„$„(¥(¥$„$„(¥(¥$„$„ … e$¥$¥$„$„(¥(¥,¥,¥,¥,¥,¥,¥0ç0ç(¥(¥(¥(¥,¥,¥,Æ,Æ,Æ,Æ,Å,Å,Å,Å(ç(ç,¥,¥(Å(Å11AðAð)) † †(¥(¥ † † † †(¥(¥ e …$¥$¥$¥$¥ † † § §$„$„ † †110ç0ç,¥,¥,Æ,Æ,¥,¥,Æ,Æ,¥,¥,¥,¥,Æ,Æ,¥,¥(¥(¥(¥(¥(¥(¥$¥$¥$¥$¥$¥$¥ e …1L1L1L1L c „$d$„dc d „dcdƒ$„$„(¥(¥(¥(¥$„$„(¥(¥$„$„$„$„(¥(¥$„$„(¥(¥(¥(¥,Æ,Æ,Å,Å,Å,Å,Æ,Æ$¥$¥,¥,¥,Æ,Æ,Æ,Æ,Å,Å,Å,Å,Æ,Æ,Å,Å(¥(¥,Æ,Æ5595$d$„,¥,¥ † †$¥$¥ † †$„$„ † †$¥$¥ † †(¥(¥ † † † †1)1)1L1L,¥,¥,Å,Å,¥,¥,Æ,Æ,Æ,Æ,¥,¥,Æ,Æ,Å,Å,¥,¥(¥(¥ † †$„$d † † § §$Ç$Ç § §-*1*1L1L1L1L § §f† † † † † † † § § § §%%$Ç$Ç § §)) § §$Ç$Ç$Ç$Ç$Ç$Ç,é,é ç ç$Ç$Ç § § § § ç ç$Ç$Ç § §,é,é))11-*1*5k5k9m5m1Œ1Œ-*1* † † § § § § † †$Ç$Ç!! § §!! § §$Ç$Ç)K)K5m5m=Ž=Ž) -) - § §$Ç$Ç § §$Ç$Ç$Ç$Ç%%$Ç$Ç,é,é,é,é%%) -) -$Ç$Ç%%$Ç$Ç) -) -AðAðAðAð11%% § § § §¥¥ † † § § † † § §$Ç$Ç § §$Ç$Ç!!$Ç$Ç$Ç$Ç$Ç$Ç%%$Ç$Ç,é,é § §$Ç$Ç § § ç ç § § § §,é,é)),é,é-*1*5J5J551Œ1Œ5m5m † † § § § § § § § §%% § §$Ç$Ç § §!!) -) -1L1L551L1L$Ç$Ç$Ç$Ç § §$Ç$Ç$Ç$Ç$Ç$Ç$Ç$Ç,é,é%%,é,é!!$Ç$Ç † † § §$Ç$Ç § §-*1*1L1L1L1L § §f† † † † † † † § § § §%%$Ç$Ç § §)) § §$Ç$Ç$Ç$Ç$Ç$Ç,é,é ç ç$Ç$Ç § § § § ç ç$Ç$Ç § §,é,é))11-*1*5k5k9m5m1Œ1Œ-*1* † † § § § § † †$Ç$Ç!! § §!! § §$Ç$Ç)K)K5m5m=Ž=Ž) -) - § §$Ç$Ç § §$Ç$Ç$Ç$Ç%%$Ç$Ç,é,é,é,é%%) -) -$Ç$Ç%%$Ç$Ç) -) -AðAðAðAð11%% § § § §¥¥ † † § § † † § §$Ç$Ç § §$Ç$Ç!!$Ç$Ç$Ç$Ç$Ç$Ç%%$Ç$Ç,é,é § §$Ç$Ç § § ç ç § § § §,é,é)),é,é-*1*5J5J551Œ1Œ5m5m † † § § § § § § § §%% § §$Ç$Ç § §!!) -) -1L1L551L1L$Ç$Ç$Ç$Ç § §$Ç$Ç$Ç$Ç$Ç$Ç$Ç$Ç,é,é%%,é,é!!$Ç$Ç55AðAðAðAðAðAðAðAð=¯A°=Ž=Ž=¯A°11AðAð55=ï=ï1155=Ž=Ž1L1L551L1L5Œ5Œ95111L1L55=Ž=Ž1155=Ž=ŽAðAð=¯A°55=ï=ïAðAðAïAïAðAðIðEðJFAðAð=Ž=Ž=Ž=ŽAðAðAðAðAðAð=¯A°AðAðAðAð=ð=ð=ð=ð=¯A°EðIðFJEðIðEðIð=¯A°9ï=ï55IðIðAòAñ=ð=ð=ð=ðIðEðAòAñJSF3JSF3NSN3NSN3NSN3JSF3NSN3JSF3AðAðAðAð5595=Ž=ŽAðAð55955Œ5Œ9555951L1L1Œ1Œ551L1L551L1L55955Œ5Œ95AòAñAðAð=Ž=Ž=ï=ï=¯A°AðAðAïAïIðEðJFIðEðAðAð55=ï=ïAðAðAðAðAðAð=ð=ðAòAñAðAð=ð=ð55AðAðJFIïEïIðEðAðAð55AðAðAðAð=ð=ðIðEð=ð=ðAðAðAòAñJSF3NSN3AòAñ59AðAðAðAðAðAðAðAð=¯A°=Ž=Ž=¯A°11AðAð55=ï=ï1155=Ž=Ž1L1L551L1L5Œ5Œ95111L1L55=Ž=Ž1155=Ž=ŽAðAð=¯A°55=ï=ïAðAðAïAïAðAðIðEðJFAðAð=Ž=Ž=Ž=ŽAðAðAðAðAðAð=¯A°AðAðAðAð=ð=ð=ð=ð=¯A°EðIðFJEðIðEðIð=¯A°9ï=ï55IðIðAòAñ=ð=ð=ð=ðIðEðAòAñJSF3JSF3NSN3NSN3NSN3JSF3NSN3JSF3AðAðAðAð5595=Ž=ŽAðAð55955Œ5Œ9555951L1L1Œ1Œ551L1L551L1L55955Œ5Œ95AòAñAðAð=Ž=Ž=ï=ï=¯A°AðAðAïAïIðEðJFIðEðAðAð55=ï=ïAðAðAðAðAðAð=ð=ðAòAñAðAð=ð=ð55AðAðJFIïEïIðEðAðAð55AðAðAðAð=ð=ðIðEð=ð=ðAðAðAòAñJSF3NSN3AòAñ Æ Æ(¥(¥ † † § § Æ Æ$¥$¥ § § Æ Æ$¥$¥ § §,ç,ç)J)J(¥(¥$¥$¥$¥$¥(¥(¥$„$„$¥$¥$¥$¥$¥$¥$„$„ ¥ ¥ ¥ ¥,Æ,Æ,Æ,Æ) -) -$ç$ç(ç(ç ç ç(ç(ç Æ Æ$¥$¥ § §(ç(ç § §,ç,ç,ç,ç)),ç,ç$ç$ç,ç,ç,ç,ç$ç$ç,é,é(ç(ç$Æ$Æ$Æ$Æ$Æ$Æ$Ç$Ç$Æ$Æ$Æ$Æ$Æ$Æ$Ç$Ç,Æ,Æ1L1L-)-) ç ç „ „¥¥ † † Æ Æ Æ Æ † † ç ç$¥$¥ § § ¥ ¥ Æ Æ Æ Æ(¥(¥¥¥$Æ$Æ § §(¥(¥ ç ç5J5J$Ç$Ç$¥$¥$¥$¥(¥(¥$¥$¥$d$„$¥$¥$¥$¥$¥$¥ e …$„$„$Æ$Æ0ç0ç)))) ç ç(ç(ç(ç(ç † † § § ç ç(¥(¥ ç ç(ç(ç(ç(ç,ç,ç))(ç(ç(ç(ç,ç,ç(ç(ç(ç(ç(ç(ç § §(ç(ç(¥(¥$Ç$Ç(ç(ç Æ Æ$Æ$Æ(ç(ç,Æ,Æ---*1*))¥¥¥¥$¥$¥ † † ç ç † † Æ Æ Æ Æ(¥(¥ † † § § Æ Æ$¥$¥ § § Æ Æ$¥$¥ § §,ç,ç)J)J(¥(¥$¥$¥$¥$¥(¥(¥$„$„$¥$¥$¥$¥$¥$¥$„$„ ¥ ¥ ¥ ¥,Æ,Æ,Æ,Æ) -) -$ç$ç(ç(ç ç ç(ç(ç Æ Æ$¥$¥ § §(ç(ç § §,ç,ç,ç,ç)),ç,ç$ç$ç,ç,ç,ç,ç$ç$ç,é,é(ç(ç$Æ$Æ$Æ$Æ$Æ$Æ$Ç$Ç$Æ$Æ$Æ$Æ$Æ$Æ$Ç$Ç,Æ,Æ1L1L-)-) ç ç „ „¥¥ † † Æ Æ Æ Æ † † ç ç$¥$¥ § § ¥ ¥ Æ Æ Æ Æ(¥(¥¥¥$Æ$Æ § §(¥(¥ ç ç5J5J$Ç$Ç$¥$¥$¥$¥(¥(¥$¥$¥$d$„$¥$¥$¥$¥$¥$¥ e …$„$„$Æ$Æ0ç0ç)))) ç ç(ç(ç(ç(ç † † § § ç ç(¥(¥ ç ç(ç(ç(ç(ç,ç,ç))(ç(ç(ç(ç,ç,ç(ç(ç(ç(ç(ç(ç § §(ç(ç(¥(¥$Ç$Ç(ç(ç Æ Æ$Æ$Æ(ç(ç,Æ,Æ---*1*))¥¥¥¥$¥$¥ † † ç ç † † Æ Æ e …$d$„dƒ e …$d$„dƒdƒ$d$„dƒ e …,Å,Å-*1* e …$d$„$d$„ d ƒ$d$„ d ƒ$d$„dc„c$„$d„c$„$„(¥(¥5J5J † † ¥ ¥ e … d „dd … e „ „dd ¥ ¥ e …$d$„ ¥ ¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$„$„ † †$¥$¥(¥(¥(¥(¥ e …$¥$¥ e …¥¥ † †(¥(¥=Œ=Œ § § e … „ „ … e¥¥ e …dd¥¥ d „dd$„$ddd$„$d„c … eƒd … eƒd$„$d ¥ ¥1)1) § §$d$„$d$„ d ƒ d ƒ$d$„ d ƒ$d$„dƒ$d$„dƒ$„$„ … e11) -) -c„ e …dd „ „dc ¥ ¥ e … e … ¥ ¥$„$„ † †$„$„ § §$d$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥ † †$¥$¥$„$„ … e¥¥ e … † †$¥$¥1)1)-*1*dd$¥$¥e…dd¥¥dddd ¥ ¥ … e$„$d„c … e$„$d„c„c$„$d„c … e,Å,Å-*1* e …$d$„$d$„ d ƒ$d$„ d ƒ$d$„dc„c$„$d„c$„$„(¥(¥5J5J † † ¥ ¥ e … d „dd … e „ „dd ¥ ¥ e …$d$„ ¥ ¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$„$„ † †$¥$¥(¥(¥(¥(¥ e …$¥$¥ e …¥¥ † †(¥(¥=Œ=Œ § § e … „ „ … e¥¥ e …dd¥¥ d „dd$„$ddd$„$d„c … eƒd … eƒd$„$d ¥ ¥1)1) § §$d$„$d$„ d ƒ d ƒ$d$„ d ƒ$d$„dƒ$d$„dƒ$„$„ … e11) -) -c„ e …dd „ „dc ¥ ¥ e … e … ¥ ¥$„$„ † †$„$„ § §$d$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥ † †$¥$¥$„$„ … e¥¥ e … † †$¥$¥1)1)-*1*dd$¥$¥e…dd¥¥dddd ¥ ¥$d$„dƒ$„$„ƒd … e$„$d„c„c „ c$„$d(ç(ç) -) -$„$„ƒd$„$„$„$„ƒd$„$„$„$„ƒddd$„$„dd$„$„ ¥ ¥-*1*$¥$¥dddd „ „dd „ „dd$¥$¥dd(¥(¥ ¥ ¥$„$„ † †(¥(¥ † †$„$d,¥,¥ § §$¥$¥$„$„ † † … e$¥$¥ e …dd¥¥ † †,¥,¥55,é,é „ „dd¥¥dd¥¥ e …dddd ¥ ¥ c „$d$„$d$„$d$„dƒ$d$„dƒ d ƒdƒ$„$„-*1* † †$„$d$„$„$„$d „ ƒ$„$c$„$„ƒdƒd ¥ ¥ d „dƒ$d$„11$ç$ç e … ¥ ¥c„ e …dd ¥ ¥dd ¥ ¥$„$„ † †$„$„(¥(¥ † †(¥(¥(¥(¥,¥,¥ † †(¥(¥ † †$„$„ † †$„$„ † †dd$¥$¥ e …$¥$¥1)1)5m5mdd$¥$¥e…dd$¥$¥ d „$d$„ d „$„$d„c$„$„ƒd … e$„$d„c„c „ c$„$d(ç(ç) -) -$„$„ƒd$„$„$„$„ƒd$„$„$„$„ƒddd$„$„dd$„$„ ¥ ¥-*1*$¥$¥dddd „ „dd „ „dd$¥$¥dd(¥(¥ ¥ ¥$„$„ † †(¥(¥ † †$„$d,¥,¥ § §$¥$¥$„$„ † † … e$¥$¥ e …dd¥¥ † †,¥,¥55,é,é „ „dd¥¥dd¥¥ e …dddd ¥ ¥ c „$d$„$d$„$d$„dƒ$d$„dƒ d ƒdƒ$„$„-*1* † †$„$d$„$„$„$d „ ƒ$„$c$„$„ƒdƒd ¥ ¥ d „dƒ$d$„11$ç$ç e … ¥ ¥c„ e …dd ¥ ¥dd ¥ ¥$„$„ † †$„$„(¥(¥ † †(¥(¥(¥(¥,¥,¥ † †(¥(¥ † †$„$„ † †$„$„ † †dd$¥$¥ e …$¥$¥1)1)5m5mdd$¥$¥e…dd$¥$¥ d „$d$„ d „$d$„$d$„dƒ$d$„ d ƒdƒ d ƒ$d$ƒ$d$„ d ƒ,Å,Å)K)Kc„$„$„ … e$„$d$„$„$„$„ƒd … e ƒ „$„$d „ „„c(¥(¥-*1*dd ¥ ¥dddd „ „dd „ „ „ „¥¥ e …$¥$¥(¥(¥ e …$„$„(¥(¥(¥(¥(¥(¥ † †$„$„ … e … e ¥ ¥ e … ¥ ¥c„$¥$¥(¥(¥(¥(¥5m5m$Ç$Çdd „ „dd¥¥ e …dd¥¥dd$„$ddd„c$„$d$„$d„c „ c$„$d „ c$„$d$„$„-*1* § §$„$„$„$„$„$d „ ƒ$„$„$„$d$„$d „ „ „ c$„$d „ „ „ c11))dddddd „ „dddd „ „dd$¥$¥ e …(¥(¥ † †$„$„(¥(¥ d „(¥(¥(¥(¥$d$„ † † … e … e ¥ ¥ e … „ „dd$¥$¥(¥(¥11-l-ldd † †ƒd … edddd„c … e$„$d$„$d„c$„$d „ c„c „ c$„$c$„$d „ c,Å,Å)K)Kc„$„$„ … e$„$d$„$„$„$„ƒd … e ƒ „$„$d „ „„c(¥(¥-*1*dd ¥ ¥dddd „ „dd „ „ „ „¥¥ e …$¥$¥(¥(¥ e …$„$„(¥(¥(¥(¥(¥(¥ † †$„$„ … e … e ¥ ¥ e … ¥ ¥c„$¥$¥(¥(¥(¥(¥5m5m$Ç$Çdd „ „dd¥¥ e …dd¥¥dd$„$ddd„c$„$d$„$d„c „ c$„$d „ c$„$d$„$„-*1* § §$„$„$„$„$„$d „ ƒ$„$„$„$d$„$d „ „ „ c$„$d „ „ „ c11))dddddd „ „dddd „ „dd$¥$¥ e …(¥(¥ † †$„$„(¥(¥ d „(¥(¥(¥(¥$d$„ † † … e … e ¥ ¥ e … „ „dd$¥$¥(¥(¥11-l-ldd † †ƒd … edddd„c … e$d$„dƒ d ƒ d ƒ$„$„ ƒ d$„$d„c „ c$„$„(¥(¥1L1L e …$„$„ ƒ „$„$d$„$„$„$„$„$„$„$„$„$d „ ƒ$„$d$„$„ … e))dddd$„$„dddc„„dddd$¥$¥ e …$¥$¥$„$„(¥(¥ † †$„$d$„$„(¥(¥ † †$„$„ … e$„$d$„$d ¥ ¥$d$„dd(¥(¥ † †(¥(¥5k5k$Ç$Çdddd „ „dddd„„dddd$„$d„c$„$d„c$„$„ƒd ƒ d ƒ d ƒ d$„$d$„$„5J5J ç ç$c$„ e …$„$„$„$„$„$d$„$„$„$„$„$d „ ƒ„c$„$„$„$d$ç$ç § §c„ „ „dddd„„dc ¥ ¥ e …$¥$¥$„$„ † †$„$d(¥(¥ e …(¥(¥$d$„(¥(¥ † †$„$d$„$d$„$„dd$¥$¥ e … ¥ ¥$„$„(¥(¥111L1Lcddddd„„…e „ „„c$„$d$„$d„c „ c „ c$„$„ ƒ d$„$d„c „ c$„$„(¥(¥1L1L e …$„$„ ƒ „$„$d$„$„$„$„$„$„$„$„$„$d „ ƒ$„$d$„$„ … e))dddd$„$„dddc„„dddd$¥$¥ e …$¥$¥$„$„(¥(¥ † †$„$d$„$„(¥(¥ † †$„$„ … e$„$d$„$d ¥ ¥$d$„dd(¥(¥ † †(¥(¥5k5k$Ç$Çdddd „ „dddd„„dddd$„$d„c$„$d„c$„$„ƒd ƒ d ƒ d ƒ d$„$d$„$„5J5J ç ç$c$„ e …$„$„$„$„$„$d$„$„$„$„$„$d „ ƒ„c$„$„$„$d$ç$ç § §c„ „ „dddd„„dc ¥ ¥ e …$¥$¥$„$„ † †$„$d(¥(¥ e …(¥(¥$d$„(¥(¥ † †$„$d$„$d$„$„dd$¥$¥ e … ¥ ¥$„$„(¥(¥111L1Lcddddd„„…e „ „„c$„$d$d$„ d ƒ d ƒ$d$ƒ d ƒ d ƒ d ƒ d ƒ$d$ƒ$d$„$¥$¥1L1L$d$„ d ƒ$„$„$„$„$ƒ$d$„$„$„$„$„$d$„$„$„$d$„$„ƒd$„$„$Ç$Ç „ „„cdd „ „„c … e ¥ ¥$„$„(¥(¥$„$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$„$„$„$„(¥(¥ † †$¥$¥(¥(¥$d$„1L1L$Ç$Çdƒ „ „„ddd„„dd„„ … e$„$d „ c$„$d$„$d „ c$„$c$„$d„c$„$c$„$c$„$d-+1*$Ç$Ç$d$„ d ƒ$„$„$ƒ$d$„$„$„$„$„$„ƒd$„$d$„$„$„$d$„$„(¥(¥ÆÆ d „dƒdd „ „„c ¥ ¥$d$„$¥$¥$d$„,¥,¥(¥(¥(¥(¥,¥,¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$d$„(¥(¥$¥$¥$d$„$¥$¥(¥(¥(¥(¥(¥(¥,é,é-*1*dddddd„ddddddd$„$d$„$d „ c „ c$„$c „ c „ c „ c „ c$„$c$„$d$¥$¥1L1L$d$„ d ƒ$„$„$„$„$ƒ$d$„$„$„$„$„$d$„$„$„$d$„$„ƒd$„$„$Ç$Ç „ „„cdd „ „„c … e ¥ ¥$„$„(¥(¥$„$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$„$„$„$„(¥(¥ † †$¥$¥(¥(¥$d$„1L1L$Ç$Çdƒ „ „„ddd„„dd„„ … e$„$d „ c$„$d$„$d „ c$„$c$„$d„c$„$c$„$c$„$d-+1*$Ç$Ç$d$„ d ƒ$„$„$ƒ$d$„$„$„$„$„$„ƒd$„$d$„$„$„$d$„$„(¥(¥ÆÆ d „dƒdd „ „„c ¥ ¥$d$„$¥$¥$d$„,¥,¥(¥(¥(¥(¥,¥,¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$d$„(¥(¥$¥$¥$d$„$¥$¥(¥(¥(¥(¥(¥(¥,é,é-*1*dddddd„ddddddd$„$d † †$¥$¥ † † † †(¥(¥ † † … edd „ ddd ç ç1L1L,é,é § §$¥$¥$¥$¥(¥(¥(ç(ç,Æ,Æ$¥$¥$¥$¥$¥$¥ † †(ç(ç(¥(¥-*1*))$Ç$Ç § §$¥$¥dd „ „ † †$„$„ † †$„$„$„$d … e † † † †$„$d … e … e(¥(¥ e …$d$„(¥(¥ † † † † † †(¥(¥ † † † †$Ç$Ç-*1*%%dddcdddc„ddddd „ c„c „ c „ c$„$c$„$d$„$d„c „ c$„$d$„$d$„$„)J)J1L1L † †(¥(¥$¥$¥ § §,Å,Å(ç(ç(¥(¥ † †(¥(¥ § §(¥(¥ § §-)-),é,é$Ç$Ç$Ç$Ç$¥$¥dddd(¥(¥ † †$„$d$¥$¥$„$„ … e … e$¥$¥ e … e … e …$„$„ † †$„$„(¥(¥ † †(¥(¥ e … † † § § † † † †) -) -)K)Kf†f†¥¥ § §e…d„d„f† † †$¥$¥ † † † †(¥(¥ † † … edd „ ddd ç ç1L1L,é,é § §$¥$¥$¥$¥(¥(¥(ç(ç,Æ,Æ$¥$¥$¥$¥$¥$¥ † †(ç(ç(¥(¥-*1*))$Ç$Ç § §$¥$¥dd „ „ † †$„$„ † †$„$„$„$d … e † † † †$„$d … e … e(¥(¥ e …$d$„(¥(¥ † † † † † †(¥(¥ † † † †$Ç$Ç-*1*%%dddcdddc„ddddd „ c„c „ c „ c$„$c$„$d$„$d„c „ c$„$d$„$d$„$„)J)J1L1L † †(¥(¥$¥$¥ § §,Å,Å(ç(ç(¥(¥ † †(¥(¥ § §(¥(¥ § §-)-),é,é$Ç$Ç$Ç$Ç$¥$¥dddd(¥(¥ † †$„$d$¥$¥$„$„ … e … e$¥$¥ e … e … e …$„$„ † †$„$„(¥(¥ † †(¥(¥ e … † † § § † † † †) -) -)K)Kf†f†¥¥ § §e…d„d„f†-l-l55955m5m=Ž=Ž559m5m)K)K) -) -1L1L-l-l11AðAð=Ž=Ž5Œ5Œ=Ž=ŽAðAðAðAðAðAðAðAðAðAð=ï=ïAðAðAðAðAðAð=Ž=Ž=ï=ïIðEð=Ž=Ž1Œ1Œ1L1L1L1L1L1L1L1L1Œ1Œ5m5m9n5m115n5m115m5m1L1L1L1L1L1L1L1L)K)K1L1L5m5m11=Ž=Ž=¯A°=ÏA°5Ž5595559551L1L-l-l) -) -11551L1L1L1L1L1L5J5J-*1*1L1L=Œ=Œ=Ž=Ž5k5k5J5J-*1*)K)K5J5J11=Ž=ŽAðAð5Œ5Œ95=Ž=ŽAïAïIðEðAðAðAïAïAðAð=ï=ïAïAïAïAïAðAð55AïAïAðAð5Œ5Œ-l-l1L1L1L1L1L1L-l-l551L1L111Œ1Œ115m5m-l-l1L1L1L1L1L1L)K)K)K)K1L1L1155A¯=°AÏ=°=¯A¯555955=ð=ð5595IðEð-l-l)K)K-l-l-l-l-l-l55955m5m=Ž=Ž559m5m)K)K) -) -1L1L-l-l11AðAð=Ž=Ž5Œ5Œ=Ž=ŽAðAðAðAðAðAðAðAðAðAð=ï=ïAðAðAðAðAðAð=Ž=Ž=ï=ïIðEð=Ž=Ž1Œ1Œ1L1L1L1L1L1L1L1L1Œ1Œ5m5m9n5m115n5m115m5m1L1L1L1L1L1L1L1L)K)K1L1L5m5m11=Ž=Ž=¯A°=ÏA°5Ž5595559551L1L-l-l) -) -11551L1L1L1L1L1L5J5J-*1*1L1L=Œ=Œ=Ž=Ž5k5k5J5J-*1*)K)K5J5J11=Ž=ŽAðAð5Œ5Œ95=Ž=ŽAïAïIðEðAðAðAïAïAðAð=ï=ïAïAïAïAïAðAð55AïAïAðAð5Œ5Œ-l-l1L1L1L1L1L1L-l-l551L1L111Œ1Œ115m5m-l-l1L1L1L1L1L1L)K)K)K)K1L1L1155A¯=°AÏ=°=¯A¯555955=ð=ð5595IðEð-l-l)K)K-l-l-l-l11(¥(¥0ç0ç,ç,ç5)5)A¯=°$Æ$Æ(¥(¥$¥$¥¥¥ § § ¥ ¥$d$„ „ „¥¥(¥(¥¥¥$¥$¥ § §(¥(¥ § §(¥(¥ Æ Æ(¥(¥ e … „ „¥¥$Æ$Æ § § ¥ ¥ e … ¥ ¥ ¥ ¥(¥(¥5J5J559k5k1L1L5J5J5k5k9k5k5m5m9k5k559k5k5m5m9k5k5k5k1Œ1Œ559)5)11-)-)(ç(ç115I5I9)5)5I5I9)5)5k5k9k5k5k5k5J5J=Œ=Œ5k5k9)5)5)5)5J5J=Œ=Œ-*1*$¥$¥ e …$¥$¥ Æ Æ$¥$¥$¥$¥ „ „ … e „ „ Æ Æ$¥$¥$¥$¥ § § Æ Æ$Æ$Æ § §$¥$¥$Æ$Æ † † ¥ ¥$d$„ÆÆ(¥(¥$¥$¥dd Æ Æ ¥ ¥(¥(¥11=Ž=Ž559I5I5k5k9k5k5k5k9m5m5k5k=Ž=Ž5k5k9m5m5k5k9k5k=Ž=ŽJF=Œ=Œ1)1)----115)5)1)1)5)5)9I5I5)5)5J5J5J5J5J5J5)5)11(¥(¥0ç0ç,ç,ç5)5)A¯=°$Æ$Æ(¥(¥$¥$¥¥¥ § § ¥ ¥$d$„ „ „¥¥(¥(¥¥¥$¥$¥ § §(¥(¥ § §(¥(¥ Æ Æ(¥(¥ e … „ „¥¥$Æ$Æ § § ¥ ¥ e … ¥ ¥ ¥ ¥(¥(¥5J5J559k5k1L1L5J5J5k5k9k5k5m5m9k5k559k5k5m5m9k5k5k5k1Œ1Œ559)5)11-)-)(ç(ç115I5I9)5)5I5I9)5)5k5k9k5k5k5k5J5J=Œ=Œ5k5k9)5)5)5)5J5J=Œ=Œ-*1*$¥$¥ e …$¥$¥ Æ Æ$¥$¥$¥$¥ „ „ … e „ „ Æ Æ$¥$¥$¥$¥ § § Æ Æ$Æ$Æ § §$¥$¥$Æ$Æ † † ¥ ¥$d$„ÆÆ(¥(¥$¥$¥dd Æ Æ ¥ ¥(¥(¥11=Ž=Ž559I5I5k5k9k5k5k5k9m5m5k5k=Ž=Ž5k5k9m5m5k5k9k5k=Ž=ŽJF=Œ=Œ1)1)----115)5)1)1)5)5)9I5I5)5)5J5J5J5J5J5J5)5),Æ,Æ e …$¥$¥$d$„1155(¥(¥ e …dddddddddddc … e$¥$¥ d „dd$„$ddcdddd„ddddddd„c … e ¥ ¥$d$„dddc ¥ ¥$d$„5)5)95,ç,ç(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$Ç$Ç,Æ,Æ0ç0ç,Æ,Æ$Ç$Ç0Æ0Æ5m5m1L1L,Æ,Æ † †$„$„(¥(¥$d$„(¥(¥,¥,¥,¥,¥(¥(¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥55 § §dddddddddcdd„ddd„c … e ¥ ¥c„ d „ d „dd „ ddcdddddd„cdd$¥$¥ e …dddddd(¥(¥,¥,¥5511,¥,¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥$Ç$Ç,Æ,Æ0ç0ç$Ç$Ç0Æ0Æ5)5)AòAñ,é,é$d$„$„$„(¥(¥(¥(¥$d$„$d$„,¥,¥$d$„,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,Æ,Æ e …$¥$¥$d$„1155(¥(¥ e …dddddddddddc … e$¥$¥ d „dd$„$ddcdddd„ddddddd„c … e ¥ ¥$d$„dddc ¥ ¥$d$„5)5)95,ç,ç(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$Ç$Ç,Æ,Æ0ç0ç,Æ,Æ$Ç$Ç0Æ0Æ5m5m1L1L,Æ,Æ † †$„$„(¥(¥$d$„(¥(¥,¥,¥,¥,¥(¥(¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥55 § §dddddddddcdd„ddd„c … e ¥ ¥c„ d „ d „dd „ ddcdddddd„cdd$¥$¥ e …dddddd(¥(¥,¥,¥5511,¥,¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥$Ç$Ç,Æ,Æ0ç0ç$Ç$Ç0Æ0Æ5)5)AòAñ,é,é$d$„$„$„(¥(¥(¥(¥$d$„$d$„,¥,¥$d$„,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,Æ,Æ § §$„$„ † †4ç4ç9m5m § §$d$„dddcdc„ddd „ d„c … eƒdƒddd„ddd„ddddd„„dd„„ … e „ „dddddddd(¥(¥5595$Ç$Ç(¥(¥(¥(¥ § §,¥,¥$Ç$Ç0ç0ç$Ç$Ç0ç0ç$Ç$Ç0ç0ç,é,é=Œ=Œ1L1L,Æ,Æ § §(¥(¥ † †(¥(¥(¥(¥ e …(¥(¥(¥(¥,¥,¥,¥,¥,Æ,Æ0Æ0Æ,Æ,Æ,Æ,Æ,é,é0Æ0Æ,é,é11$Ç$Ç e …$„$„dddd„„dc„ddddd$¥$¥dddd„c„ddddddd„ddddd„„¥¥dd … ecd„„dd … e,Æ,Æ5511 § § § §(¥(¥$Ç$Ç,¥,¥$Ç$Ç0ç0ç$Ç$Ç0ç0ç$Ç$Ç0ç0ç5J5J=Ž=Ž,é,é(¥(¥ § §(¥(¥ † †(¥(¥(¥(¥,¥,¥ § §,¥,¥,¥,¥$Ç$Ç,¥,¥,Æ,Æ,Æ,Æ § §$„$„ † †4ç4ç9m5m § §$d$„dddcdc„ddd „ d„c … eƒdƒddd„ddd„ddddd„„dd„„ … e „ „dddddddd(¥(¥5595$Ç$Ç(¥(¥(¥(¥ § §,¥,¥$Ç$Ç0ç0ç$Ç$Ç0ç0ç$Ç$Ç0ç0ç,é,é=Œ=Œ1L1L,Æ,Æ § §(¥(¥ † †(¥(¥(¥(¥ e …(¥(¥(¥(¥,¥,¥,¥,¥,Æ,Æ0Æ0Æ,Æ,Æ,Æ,Æ,é,é0Æ0Æ,é,é11$Ç$Ç e …$„$„dddd„„dc„ddddd$¥$¥dddd„c„ddddddd„ddddd„„¥¥dd … ecd„„dd … e,Æ,Æ5511 § § § §(¥(¥$Ç$Ç,¥,¥$Ç$Ç0ç0ç$Ç$Ç0ç0ç$Ç$Ç0ç0ç5J5J=Ž=Ž,é,é(¥(¥ § §(¥(¥ † †(¥(¥(¥(¥,¥,¥ § §,¥,¥,¥,¥$Ç$Ç,¥,¥,Æ,Æ,Æ,Æ † † … edd--1L1L,Æ,Ædddddc„ddc„ddddd$¥$¥dd „ „dd„ddddd„d„„dd„„dd¥¥ † †ƒddddd„„ … e--=Ž=Ž,ç,ç0ç0ç$Ç$Ç,¥,¥$Ç$Ç$Ç$Ç,¥,¥$Ç$Ç0ç0ç$Ç$Ç$Ç$Ç0Æ0Æ=Ž=Ž55(¥(¥(¥(¥ † † ¥ ¥ † † § §(¥(¥$Ç$Ç † †$Ç$Ç(¥(¥ § §0ç0ç,é,é0ç0ç,é,é,é,é,é,é55$Ç$Ç e …dd„„dddc„ddddddd¥¥ e …c„ e …cddd„ddd…e„„dddd … e¥¥ e …c„dd„„ … e(¥(¥551*-*0Æ0Æ,Æ,Æ$Ç$Ç † †$Ç$Ç$Ç$Ç0ç0ç$Ç$Ç0ç0ç$Ç$Ç,Æ,Æ5J5J=¯A°$Ç$Ç(¥(¥(¥(¥ e …¥¥ § § § § § §(¥(¥,Æ,Æ$Ç$Ç,¥,¥$Ç$Ç0ç0ç,Æ,Æ † † … edd--1L1L,Æ,Ædddddc„ddc„ddddd$¥$¥dd „ „dd„ddddd„d„„dd„„dd¥¥ † †ƒddddd„„ … e--=Ž=Ž,ç,ç0ç0ç$Ç$Ç,¥,¥$Ç$Ç$Ç$Ç,¥,¥$Ç$Ç0ç0ç$Ç$Ç$Ç$Ç0Æ0Æ=Ž=Ž55(¥(¥(¥(¥ † † ¥ ¥ † † § §(¥(¥$Ç$Ç † †$Ç$Ç(¥(¥ § §0ç0ç,é,é0ç0ç,é,é,é,é,é,é55$Ç$Ç e …dd„„dddc„ddddddd¥¥ e …c„ e …cddd„ddd…e„„dddd … e¥¥ e …c„dd„„ … e(¥(¥551*-*0Æ0Æ,Æ,Æ$Ç$Ç † †$Ç$Ç$Ç$Ç0ç0ç$Ç$Ç0ç0ç$Ç$Ç,Æ,Æ5J5J=¯A°$Ç$Ç(¥(¥(¥(¥ e …¥¥ § § § § § §(¥(¥,Æ,Æ$Ç$Ç,¥,¥$Ç$Ç0ç0ç(ç(ç$Ç$Ç † † … e1155,Æ,Æ d „dddc„d„ddd„ddddddd„„dd„ddd„d…edd„ddd „ „dd$¥$¥dddd„d … e$¥$¥,ç,ç55,ç,ç,é,é,¥,¥$Ç$Ç † †$Ç$Ç$Ç$Ç0ç0ç$Ç$Ç$Ç$Ç0ç0ç,é,é5k5k1L1L „ „†f„d„d„d†f„d¥¥ † †,¥,¥ § §0Æ0Æ,é,é,é,é,é,é--,é,é(ç(ç-*1*,é,é$d$„dc„ddddd„ddc„ddddd … eƒddddd„ddd„ddd„d „ „dd„„¥¥ e …dddd„d$¥$¥(¥(¥5m5m11,é,é,Æ,Æ$Ç$Ç,¥,¥$Ç$Ç,¥,¥$Ç$Ç$Ç$Ç$Ç$Ç,Æ,Æ,é,é5)5)A¯=° ¦ §¥¥f†„„„d…edd¥¥ † † § §,ç,ç § § † †--(ç(ç$Ç$Ç † † … e1155,Æ,Æ d „dddc„d„ddd„ddddddd„„dd„ddd„d…edd„ddd „ „dd$¥$¥dddd„d … e$¥$¥,ç,ç55,ç,ç,é,é,¥,¥$Ç$Ç † †$Ç$Ç$Ç$Ç0ç0ç$Ç$Ç$Ç$Ç0ç0ç,é,é5k5k1L1L „ „†f„d„d„d†f„d¥¥ † †,¥,¥ § §0Æ0Æ,é,é,é,é,é,é--,é,é(ç(ç-*1*,é,é$d$„dc„ddddd„ddc„ddddd … eƒddddd„ddd„ddd„d „ „dd„„¥¥ e …dddd„d$¥$¥(¥(¥5m5m11,é,é,Æ,Æ$Ç$Ç,¥,¥$Ç$Ç,¥,¥$Ç$Ç$Ç$Ç$Ç$Ç,Æ,Æ,é,é5)5)A¯=° ¦ §¥¥f†„„„d…edd¥¥ † † § §,ç,ç § § † †--,ç,ç § §$„$„ … e--55(¥(¥$d$„dddddc„ddddd„c … eƒdcddddd„cdd „ „dddd „ „dcdd „ „dddd„c$„$d$„$d,ç,ç1Œ1Œ55,é,é,ç,ç$Ç$Ç0ç0ç$Ç$Ç$Ç$Ç,é,é0ç0ç$Ç$Ç0ç0ç0ç0ç-*1*-*1*d„¥¥f†e…e…„„…e„d„ddd † † § §11,ç,ç,é,é,ç,ç,é,é,ç,ç-*1*)) d „dƒdddc„ddc„d „ ddd„c$„$ddd „ „dc„cdd„cdd „ „dddcdc … e$„$„cdƒd … e$„$d$¥$¥1L1L1)1)4ç4ç,é,é$Ç$Ç$Ç$Ç$Ç$Ç$Ç$Ç,é,é0ç0ç,é,é$Ç$Ç0ç0ç1155¥¥e…f†e…e…e…e…e…„„dd Æ Ædddd ç ç,ç,ç § §$„$„ … e--55(¥(¥$d$„dddddc„ddddd„c … eƒdcddddd„cdd „ „dddd „ „dcdd „ „dddd„c$„$d$„$d,ç,ç1Œ1Œ55,é,é,ç,ç$Ç$Ç0ç0ç$Ç$Ç$Ç$Ç,é,é0ç0ç$Ç$Ç0ç0ç0ç0ç-*1*-*1*d„¥¥f†e…e…„„…e„d„ddd † † § §11,ç,ç,é,é,ç,ç,é,é,ç,ç-*1*)) d „dƒdddc„ddc„d „ ddd„c$„$ddd „ „dc„cdd„cdd „ „dddcdc … e$„$„cdƒd … e$„$d$¥$¥1L1L1)1)4ç4ç,é,é$Ç$Ç$Ç$Ç$Ç$Ç$Ç$Ç,é,é0ç0ç,é,é$Ç$Ç0ç0ç1155¥¥e…f†e…e…e…e…e…„„dd Æ Ædddd ç ç(ç(ç$Ç$Ç § §$Æ$Æ-*1*55) -) - § § § §¥¥f†f†„„…e„ddc„d„dddÆÆd„dd†f¥¥ Æ Æf†f† § § § § Æ Æ § § ç ç$Ç$Ç$Ç$Ç)K)K1L1L$Ç$Ç § § § §(ç(ç § §$Ç$Ç,Æ,Æ$Ç$Ç § § § § † †(¥(¥=Ž=Ž55d„$¥$¥ ç ç † † † † § §(¥(¥ † †$Æ$Æ$¥$¥,é,é,ç,ç%%-*1*11-*1*1)1)) -) -=Ž=Ž1L1L ç ç$Ç$Ç § §f† † †ÆÆd„e…dd„ddd„„dc†f„„†f„d¥¥ † † † ††fÆÆ § § § § § § § §$Ç$Ç$Ç$Ç) -) --l-l) -) -$Ç$Ç § §(ç(ç,Æ,Æ § §$Ç$Ç,Æ,Æ § § § §(¥(¥ † †11AòAñ § §¥¥ § §$Ç$Ç$¥$¥ † † § § Æ Æ(¥(¥$¥$¥ § §$Ç$Ç ç ç$Æ$Æ(ç(ç$Ç$Ç § §$Æ$Æ-*1*55) -) - § § § §¥¥f†f†„„…e„ddc„d„dddÆÆd„dd†f¥¥ Æ Æf†f† § § § § Æ Æ § § ç ç$Ç$Ç$Ç$Ç)K)K1L1L$Ç$Ç § § § §(ç(ç § §$Ç$Ç,Æ,Æ$Ç$Ç § § § § † †(¥(¥=Ž=Ž55d„$¥$¥ ç ç † † † † § §(¥(¥ † †$Æ$Æ$¥$¥,é,é,ç,ç%%-*1*11-*1*1)1)) -) -=Ž=Ž1L1L ç ç$Ç$Ç § §f† † †ÆÆd„e…dd„ddd„„dc†f„„†f„d¥¥ † † † ††fÆÆ § § § § § § § §$Ç$Ç$Ç$Ç) -) --l-l) -) -$Ç$Ç § §(ç(ç,Æ,Æ § §$Ç$Ç,Æ,Æ § § § §(¥(¥ † †11AòAñ § §¥¥ § §$Ç$Ç$¥$¥ † † § § Æ Æ(¥(¥$¥$¥ § §$Ç$Ç ç ç$Æ$Æ=Œ=Œ=Œ=Œ5m5m9k5k5k5k=Ž=Ž5k5k1*-*1L1L5J5J-*1*) -) -1*-*-)-)-l-l551*-*1L1L-)-)-*1*-*1*1L1L-)-)1L1L)K)K1L1L5k5k1Œ1Œ55=Ž=Ž5Œ5Œ955m5m1Œ1Œ5k5k955n5m)J)J11) -) -)K)K-*1*-*1*) -) -1L1L1L1L-*1*-l-lAðAð=Ž=Ž=ï=ï11=Œ=Œ=Ž=Ž5k5kA¯=°=Ž=ŽAðAð=¯A°=ÏA°=¯=¯AðAð=¯A°AðAð=¯A°=Ž=Ž=Ž=Ž=Œ=Œ=Œ=Œ=Œ=Œ551*-*1Œ1Œ5J5J-*1*) -) -11)K)K-*1*111L1L-*1*)K)K11-*1*1L1L-*1*)J)J1L1L)J)J551L1L5Œ5ŒAðAð551Œ1Œ551Œ1Œ5k5k955k5k1L1L-)-)) -) -) -) -)K)K-*1*) -) -)K)K1L1L-*1*1L1L55AðAð=¯A°551Œ1Œ=Œ=Œ5m5m=Œ=Œ=¯A°=ÏA°=¯=¯AÐ=¯A°=¯IïEï=Ž=Ž=¯A°=Œ=Œ=Œ=Œ5m5m9k5k5k5k=Ž=Ž5k5k1*-*1L1L5J5J-*1*) -) -1*-*-)-)-l-l551*-*1L1L-)-)-*1*-*1*1L1L-)-)1L1L)K)K1L1L5k5k1Œ1Œ55=Ž=Ž5Œ5Œ955m5m1Œ1Œ5k5k955n5m)J)J11) -) -)K)K-*1*-*1*) -) -1L1L1L1L-*1*-l-lAðAð=Ž=Ž=ï=ï11=Œ=Œ=Ž=Ž5k5kA¯=°=Ž=ŽAðAð=¯A°=ÏA°=¯=¯AðAð=¯A°AðAð=¯A°=Ž=Ž=Ž=Ž=Œ=Œ=Œ=Œ=Œ=Œ551*-*1Œ1Œ5J5J-*1*) -) -11)K)K-*1*111L1L-*1*)K)K11-*1*1L1L-*1*)J)J1L1L)J)J551L1L5Œ5ŒAðAð551Œ1Œ551Œ1Œ5k5k955k5k1L1L-)-)) -) -) -) -)K)K-*1*) -) -)K)K1L1L-*1*1L1L55AðAð=¯A°551Œ1Œ=Œ=Œ5m5m=Œ=Œ=¯A°=ÏA°=¯=¯AÐ=¯A°=¯IïEï=Ž=Ž=¯A° e …¥¥$„$„(¥(¥(¥(¥(¥(¥ d „ e …$d$„ „ „¥¥ e …$¥$¥(¥(¥11-*1* Æ Æ,¥,¥,¥,¥(¥(¥(¥(¥,¥,¥(¥(¥(¥(¥$¥$¥(¥(¥$¥$¥(¥(¥ ç ç1L1L--,Æ,Æ § §(¥(¥ § §$„$„ † †(¥(¥ † †$¥$¥¥¥ § § § §(¥(¥(ç(ç(ç(ç,ç,ç$Ç$Ç(ç(ç$Ç$Ç(ç(ç(ç(ç$Ç$Ç(ç(ç,é,é(ç(ç,ç,ç11-*1*,Æ,Æ,Æ,Æ,ç,ç,¥,¥ § §$¥$¥$„$„(¥(¥ e …¥¥$„$„ † †$„$d„c † † ¥ ¥ e … ¥ ¥(¥(¥,Æ,Æ1L1L$Ç$Ç(Å(Å,¥,¥(¥(¥(¥(¥,¥,¥(¥(¥,¥,¥$¥$¥$¥$¥(Å(Å$¥$¥(¥(¥)K)K11(ç(ç § §,¥,¥ † †(¥(¥$¥$¥$¥$¥$¥$¥¥¥$¥$¥ † †$Æ$Æ § §,Æ,Æ(ç(ç(ç(ç,é,é(ç(ç$Æ$Æ(ç(ç(ç(ç,é,é$Ç$Ç,ç,ç(ç(ç,ç,ç,é,é5J5J11(¥(¥ § §cd¥¥ … e¥¥$„$„(¥(¥(¥(¥(¥(¥ d „ e …$d$„ „ „¥¥ e …$¥$¥(¥(¥11-*1* Æ Æ,¥,¥,¥,¥(¥(¥(¥(¥,¥,¥(¥(¥(¥(¥$¥$¥(¥(¥$¥$¥(¥(¥ ç ç1L1L--,Æ,Æ § §(¥(¥ § §$„$„ † †(¥(¥ † †$¥$¥¥¥ § § § §(¥(¥(ç(ç(ç(ç,ç,ç$Ç$Ç(ç(ç$Ç$Ç(ç(ç(ç(ç$Ç$Ç(ç(ç,é,é(ç(ç,ç,ç11-*1*,Æ,Æ,Æ,Æ,ç,ç,¥,¥ § §$¥$¥$„$„(¥(¥ e …¥¥$„$„ † †$„$d„c † † ¥ ¥ e … ¥ ¥(¥(¥,Æ,Æ1L1L$Ç$Ç(Å(Å,¥,¥(¥(¥(¥(¥,¥,¥(¥(¥,¥,¥$¥$¥$¥$¥(Å(Å$¥$¥(¥(¥)K)K11(ç(ç § §,¥,¥ † †(¥(¥$¥$¥$¥$¥$¥$¥¥¥$¥$¥ † †$Æ$Æ § §,Æ,Æ(ç(ç(ç(ç,é,é(ç(ç$Æ$Æ(ç(ç(ç(ç,é,é$Ç$Ç,ç,ç(ç(ç,ç,ç,é,é5J5J11(¥(¥ § §cd¥¥dd … e¥¥ e … † † „ d … edd„„…e † †dd(¥(¥(¥(¥1111,Æ,Æ,¥,¥0Æ0Æ,¥,¥0ç0ç,¥,¥,ç,ç,Æ,Æ,Æ,Æ$Æ$Æ § § § §$ç$ç55,é,é(¥(¥ † † † †(¥(¥ † † † † … e ¥ ¥ e …¥¥ † †$„$„ † †(¥(¥ † †(¥(¥ † † § § ¥ ¥ † †dd…e † †(¥(¥ § §,¥,¥,é,é--,¥,¥$Ç$Ç(¥(¥ † †(¥(¥(¥(¥ † † … e ¥ ¥ e … e … „ „dd¥¥dd … e „ „ … e(¥(¥$Ç$Ç=Œ=Œ--,Æ,Æ,¥,¥,Æ,Æ,¥,¥0ç0ç,Æ,Æ,ç,ç,Æ,Æ$Æ$Æ § §(ç(ç † †1L1L-*1*$Ç$Ç(¥(¥ † † † †$¥$¥ e … † † … e¥¥ e …¥¥ † †(¥(¥ † †(¥(¥ † †(¥(¥ † †(¥(¥ † †…e…e¥¥ † † § §,¥,¥,¥,¥11$Ç$Ç,¥,¥ e …e…dddd … e¥¥ e … † † „ d … edd„„…e † †dd(¥(¥(¥(¥1111,Æ,Æ,¥,¥0Æ0Æ,¥,¥0ç0ç,¥,¥,ç,ç,Æ,Æ,Æ,Æ$Æ$Æ § § § §$ç$ç55,é,é(¥(¥ † † † †(¥(¥ † † † † … e ¥ ¥ e …¥¥ † †$„$„ † †(¥(¥ † †(¥(¥ † † § § ¥ ¥ † †dd…e † †(¥(¥ § §,¥,¥,é,é--,¥,¥$Ç$Ç(¥(¥ † †(¥(¥(¥(¥ † † … e ¥ ¥ e … e … „ „dd¥¥dd … e „ „ … e(¥(¥$Ç$Ç=Œ=Œ--,Æ,Æ,¥,¥,Æ,Æ,¥,¥0ç0ç,Æ,Æ,ç,ç,Æ,Æ$Æ$Æ § §(ç(ç † †1L1L-*1*$Ç$Ç(¥(¥ † † † †$¥$¥ e … † † … e¥¥ e …¥¥ † †(¥(¥ † †(¥(¥ † †(¥(¥ † †(¥(¥ † †…e…e¥¥ † † § §,¥,¥,¥,¥11$Ç$Ç,¥,¥ e …e…dddd¥¥dd … e … e¥¥d„ e …¥¥dd¥¥ † † … e$Æ$Æ-*1*1L1L$d$„,¥,¥,ç,ç,Æ,Æ,Æ,Æ,Æ,Æ,Æ,Æ0ç0ç$Ç$Ç(ç(ç$Ç$Ç ç ç § §1L1L11$¥$¥ † †$¥$¥ † †dd$¥$¥¥¥ e … e …¥¥ † †$¥$¥ † † § §(¥(¥ † † § §(¥(¥ † † † † … e¥¥ † † † †(¥(¥ § §0Æ0Æ,é,é § §,¥,¥ § §(¥(¥ e … † †(¥(¥ e … e … „ „¥¥dd¥¥e… e …„„¥¥ e … † †,ç,ç5m5m † †,¥,¥,Æ,Æ0ç0ç,Æ,Æ,¥,¥0Æ0Æ0ç0ç$Ç$Ç,Æ,Æ$Ç$Ç$Ç$ÇÆÆ-*1*11 § § § §$¥$¥ † † † †dd$¥$¥ e …¥¥ † † † † † † … e(¥(¥ † †(¥(¥ † †$Æ$Æ † † † †¥¥ e … † † † †(¥(¥ § §,¥,¥11$Ç$Ç,¥,¥$Ç$Ç e … „ „dd¥¥dd … e … e¥¥d„ e …¥¥dd¥¥ † † … e$Æ$Æ-*1*1L1L$d$„,¥,¥,ç,ç,Æ,Æ,Æ,Æ,Æ,Æ,Æ,Æ0ç0ç$Ç$Ç(ç(ç$Ç$Ç ç ç § §1L1L11$¥$¥ † †$¥$¥ † †dd$¥$¥¥¥ e … e …¥¥ † †$¥$¥ † † § §(¥(¥ † † § §(¥(¥ † † † † … e¥¥ † † † †(¥(¥ § §0Æ0Æ,é,é § §,¥,¥ § §(¥(¥ e … † †(¥(¥ e … e … „ „¥¥dd¥¥e… e …„„¥¥ e … † †,ç,ç5m5m † †,¥,¥,Æ,Æ0ç0ç,Æ,Æ,¥,¥0Æ0Æ0ç0ç$Ç$Ç,Æ,Æ$Ç$Ç$Ç$ÇÆÆ-*1*11 § § § §$¥$¥ † † † †dd$¥$¥ e …¥¥ † † † † † † … e(¥(¥ † †(¥(¥ † †$Æ$Æ † † † †¥¥ e … † † † †(¥(¥ § §,¥,¥11$Ç$Ç,¥,¥$Ç$Ç e … „ „dd„d … e¥¥dddd„d¥¥e… e …¥¥ e …¥¥ † †11-*1*$¥$¥(¥(¥0Æ0Æ,Æ,Æ0Æ0Æ0ç0ç0ç0ç0Æ0Æ0ç0ç § §$Ç$Ç Æ Æ ç ç-*1*,é,é$¥$¥ † †$¥$¥ e … † †¥¥e… † †dd$¥$¥ † † † †$¥$¥ † †$¥$¥ † †(¥(¥ † † † †¥¥dd¥¥ † †$¥$¥ † †,¥,¥0ç0ç,é,é,¥,¥$Ç$Ç † †,¥,¥ § §(¥(¥e… † †dddd…edd„d$¥$¥e… e …¥¥ e …¥¥$Ç$Ç5n5m § §(Å(Å,¥,¥0ç0ç,Æ,Æ0ç0ç0ç0ç0Æ0Æ0ç0ç$Ç$Ç$Ç$Ç § §„„)K)K11 § §(¥(¥$¥$¥ e …¥¥ e …¥¥ e …¥¥ e …¥¥ † †(¥(¥ † †$¥$¥ † † † †$Æ$Æ † † … e … e„„ † † § § ¥ ¥(¥(¥$Ç$Ç55$Ç$Ç$Ç$Ç$„$„…edddd„d … e¥¥dddd„d¥¥e… e …¥¥ e …¥¥ † †11-*1*$¥$¥(¥(¥0Æ0Æ,Æ,Æ0Æ0Æ0ç0ç0ç0ç0Æ0Æ0ç0ç § §$Ç$Ç Æ Æ ç ç-*1*,é,é$¥$¥ † †$¥$¥ e … † †¥¥e… † †dd$¥$¥ † † † †$¥$¥ † †$¥$¥ † †(¥(¥ † † † †¥¥dd¥¥ † †$¥$¥ † †,¥,¥0ç0ç,é,é,¥,¥$Ç$Ç † †,¥,¥ § §(¥(¥e… † †dddd…edd„d$¥$¥e… e …¥¥ e …¥¥$Ç$Ç5n5m § §(Å(Å,¥,¥0ç0ç,Æ,Æ0ç0ç0ç0ç0Æ0Æ0ç0ç$Ç$Ç$Ç$Ç § §„„)K)K11 § §(¥(¥$¥$¥ e …¥¥ e …¥¥ e …¥¥ e …¥¥ † †(¥(¥ † †$¥$¥ † † † †$Æ$Æ † † … e … e„„ † † § § ¥ ¥(¥(¥$Ç$Ç55$Ç$Ç$Ç$Ç$„$„…edddd„„…edd…e¥¥dd…e … edd¥¥ e …dd$¥$¥,é,é-l-l,Æ,Æ,ç,ç4ç4ç95========,é,é,Æ,Æ § §ÆÆ ç ç-*1*$Ç$Ç(¥(¥ † † † †¥¥ e … e …¥¥ e …¥¥ e … Æ Æ e … † †$¥$¥ † † † † § §$¥$¥ e …e…dd„„ † † † †(¥(¥ † †0Æ0Æ-*1*$Ç$Ç(¥(¥ † † † † § §(¥(¥ † † … e „ „dd¥¥dd…e…e „ „…e † †dd$¥$¥ § §1L1L11,Æ,Æ4ç4ç0Æ0Æ========4ç4ç$Ç$Ç(ç(ç § §$Ç$Ç1L1L$ç$ç § § § § † †$¥$¥ e …¥¥ e … e …¥¥ † † † † † † † †(¥(¥ e … § §$¥$¥ † † … e¥¥e…dd¥¥ † †(¥(¥ † †,¥,¥-*1*,é,é(¥(¥e… d „dddd„„…edd…e¥¥dd…e … edd¥¥ e …dd$¥$¥,é,é-l-l,Æ,Æ,ç,ç4ç4ç95========,é,é,Æ,Æ § §ÆÆ ç ç-*1*$Ç$Ç(¥(¥ † † † †¥¥ e … e …¥¥ e …¥¥ e … Æ Æ e … † †$¥$¥ † † † † § §$¥$¥ e …e…dd„„ † † † †(¥(¥ † †0Æ0Æ-*1*$Ç$Ç(¥(¥ † † † † § §(¥(¥ † † … e „ „dd¥¥dd…e…e „ „…e † †dd$¥$¥ § §1L1L11,Æ,Æ4ç4ç0Æ0Æ========4ç4ç$Ç$Ç(ç(ç § §$Ç$Ç1L1L$ç$ç § § § § † †$¥$¥ e …¥¥ e … e …¥¥ † † † † † † † †(¥(¥ e … § §$¥$¥ † † … e¥¥e…dd¥¥ † †(¥(¥ † †,¥,¥-*1*,é,é(¥(¥e… d „dddddddd„„dddddcdddd¥¥dd¥¥ † †(¥(¥,é,é1L1L ç ç$Ç$Ç § §,Æ,Æ,é,é55,é,é,Æ,Æ,Æ,Æe…¥¥ e …) -) -) -) -(¥(¥ † †$¥$¥ e …¥¥ e …dd¥¥dd¥¥ † †dd$¥$¥$¥$¥ † †(¥(¥ † †$¥$¥dd¥¥ e … „ „¥¥ † † † †(¥(¥,¥,¥,é,é1L1L(¥(¥(¥(¥ † †,¥,¥ † † † †(¥(¥ d „dddd ¥ ¥dddddd¥¥dd „ „¥¥(¥(¥$Ç$Ç-*1*) -) -(ç(ç § §(ç(ç$Ç$Ç55,é,é0ç0ç$Ç$Ç(¥(¥e…¥¥$Ç$Ç)K)K,Æ,Æ$¥$¥ † † … e „ „ … e…e¥¥dd … e¥¥ e … ¥ ¥ e …$¥$¥(¥(¥$¥$¥ e … † †¥¥ e … ¥ ¥dd † †$¥$¥(¥(¥ † †0Æ0Æ-*1*,é,é(¥(¥(¥(¥dd … edddddd„„dddddcdddd¥¥dd¥¥ † †(¥(¥,é,é1L1L ç ç$Ç$Ç § §,Æ,Æ,é,é55,é,é,Æ,Æ,Æ,Æe…¥¥ e …) -) -) -) -(¥(¥ † †$¥$¥ e …¥¥ e …dd¥¥dd¥¥ † †dd$¥$¥$¥$¥ † †(¥(¥ † †$¥$¥dd¥¥ e … „ „¥¥ † † † †(¥(¥,¥,¥,é,é1L1L(¥(¥(¥(¥ † †,¥,¥ † † † †(¥(¥ d „dddd ¥ ¥dddddd¥¥dd „ „¥¥(¥(¥$Ç$Ç-*1*) -) -(ç(ç § §(ç(ç$Ç$Ç55,é,é0ç0ç$Ç$Ç(¥(¥e…¥¥$Ç$Ç)K)K,Æ,Æ$¥$¥ † † … e „ „ … e…e¥¥dd … e¥¥ e … ¥ ¥ e …$¥$¥(¥(¥$¥$¥ e … † †¥¥ e … ¥ ¥dd † †$¥$¥(¥(¥ † †0Æ0Æ-*1*,é,é(¥(¥(¥(¥dd … e § § § § ç ç ç 祥 † † ç ç Æ Æ ç ç § §f† § § § § § §)K)K-*1*e…dd„d C C ddf†f†„„ § §!!)K)K) -) -11)K)K § § § §ÆÆ § § § §f†f†¥¥ e …f†f† ç ç § § § § § § † † † † § § § § e …$¥$¥e…f† § §$Ç$Ç,é,é$Ç$Ç,é,é5m5m1*-*,é,é11) -) -$Ç$Ç$Ç$Ç † ††f¥¥f†d„d„d„d„ † ††f § § Æ Æ § §$Ç$Ç1Ž1 ç çddd„d„dde…f†e…f†%%)K)K!!!!1L1L § § § § § § § §ÆÆ § §e… e …¥¥f†e… § § § § § § § § † † § § † † § §$¥$¥e…¥¥ e … Æ Æ § §$Ç$Ç,é,é,Æ,Æ1L1L1L1L,é,é,é,é,é,é%% § § § § ç ç ç 祥 † † ç ç Æ Æ ç ç § §f† § § § § § §)K)K-*1*e…dd„d C C ddf†f†„„ § §!!)K)K) -) -11)K)K § § § §ÆÆ § § § §f†f†¥¥ e …f†f† ç ç § § § § § § † † † † § § § § e …$¥$¥e…f† § §$Ç$Ç,é,é$Ç$Ç,é,é5m5m1*-*,é,é11) -) -$Ç$Ç$Ç$Ç † ††f¥¥f†d„d„d„d„ † ††f § § Æ Æ § §$Ç$Ç1Ž1 ç çddd„d„dde…f†e…f†%%)K)K!!!!1L1L § § § § § § § §ÆÆ § §e… e …¥¥f†e… § § § § § § § § † † § § † † § §$¥$¥e…¥¥ e … Æ Æ § §$Ç$Ç,é,é,Æ,Æ1L1L1L1L,é,é,é,é,é,é%%559k5k559k5k1L1LAðAð551)1)1L1L-)-))K)K-*1*-*1*1Œ1Œ1L1L5k5k1*-*)K)K-*1*-*1*)K)K1L1L551Œ1Œ=¯A°=ÏA°5559Ž=Œ=Œ=Œ=Œ555Ž955595k5kIðEðA¯=°1Œ1Œ111Œ1Œ55AðAð55955n5m95559k5k1Œ1Œ=Ž=ŽAòAñ=ð=ð55=Ž=Ž=¯A°=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž55=Ž=Ž551L1L5m5m11-*1*) -) -1*-*)K)K) -) -1L1L1Œ1Œ-*1*-*1*-l-l1L1L5k5k1L1L-*1*)K)K1L1L1)1)-l-l559n5m5Œ5ŒAðAð=Ž=Ž=Œ=Œ=Ž=Ž=Ž=Ž559Ž5559Ž55595AòAñ5Œ5Œ11551L1L=ï=ïAðAð1Œ1Œ55955Ž5951L1L55AðAðAòAñ55=Ž=ŽAðAð=¯A°=Ž=Ž=Ž=Ž=Ž=Ž=¯A°9Œ=Œ=Ž=Ž55=Ž=Ž595k5k595k5k1L1LAðAð551)1)1L1L-)-))K)K-*1*-*1*1Œ1Œ1L1L5k5k1*-*)K)K-*1*-*1*)K)K1L1L551Œ1Œ=¯A°=ÏA°5559Ž=Œ=Œ=Œ=Œ555Ž955595k5kIðEðA¯=°1Œ1Œ111Œ1Œ55AðAð55955n5m95559k5k1Œ1Œ=Ž=ŽAòAñ=ð=ð55=Ž=Ž=¯A°=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž=Ž55=Ž=Ž551L1L5m5m11-*1*) -) -1*-*)K)K) -) -1L1L1Œ1Œ-*1*-*1*-l-l1L1L5k5k1L1L-*1*)K)K1L1L1)1)-l-l559n5m5Œ5ŒAðAð=Ž=Ž=Œ=Œ=Ž=Ž=Ž=Ž559Ž5559Ž55595AòAñ5Œ5Œ11551L1L=ï=ïAðAð1Œ1Œ55955Ž5951L1L55AðAðAòAñ55=Ž=ŽAðAð=¯A°=Ž=Ž=Ž=Ž=Ž=Ž=¯A°9Œ=Œ=Ž=Ž55=Ž=Ž(ç(ç(¥(¥,Æ,Æ,¥,¥,Æ,ÆAðAð)J)J e …$¥$¥$„$„ † † … e ¥ ¥$¥$¥$¥$¥(¥(¥$Æ$Æ § §$Æ$Æ § §(¥(¥$Æ$Æ$Æ$Æ$Ç$Ç,Æ,Æ$Æ$Æ(¥(¥ † †$¥$¥(¥(¥$¥$¥$¥$¥(¥(¥,Æ,Æ(¥(¥5k5kIðIð) -) -(¥(¥ § §(¥(¥ § § ¥ ¥(¥(¥$¥$¥$¥$¥$Æ$Æ(¥(¥,¥,¥,é,éAðAð5)5)11,ç,ç(ç(ç,ç,ç,ç,ç,Æ,Æ(ç(ç(¥(¥ § §(ç(ç(¥(¥$Ç$Ç(ç(ç(¥(¥55=Ž=Ž(¥(¥ † †$¥$¥(¥(¥(¥(¥ † †$¥$¥ e … ¥ ¥(¥(¥(¥(¥ † †(¥(¥ § §,Æ,Æ § §(¥(¥ § §(¥(¥(ç(ç(ç(ç$Æ$Æ(¥(¥ † †(¥(¥ † †$¥$¥$¥$¥(¥(¥,¥,¥(ç(ç0ç0çAïAï1L1L,Æ,Æ § §(¥(¥ § § ¥ ¥(¥(¥$¥$¥$¥$¥ † †(¥(¥,Æ,Æ,Æ,Æ5m5m=Ž=Ž11(ç(ç$Ç$Ç,Æ,Æ11,Æ,Æ$Ç$Ç(¥(¥$Æ$Æ$Æ$Æ(¥(¥,Æ,Æ(ç(ç(¥(¥,Æ,Æ,¥,¥,Æ,ÆAðAð)J)J e …$¥$¥$„$„ † † … e ¥ ¥$¥$¥$¥$¥(¥(¥$Æ$Æ § §$Æ$Æ § §(¥(¥$Æ$Æ$Æ$Æ$Ç$Ç,Æ,Æ$Æ$Æ(¥(¥ † †$¥$¥(¥(¥$¥$¥$¥$¥(¥(¥,Æ,Æ(¥(¥5k5kIðIð) -) -(¥(¥ § §(¥(¥ § § ¥ ¥(¥(¥$¥$¥$¥$¥$Æ$Æ(¥(¥,¥,¥,é,éAðAð5)5)11,ç,ç(ç(ç,ç,ç,ç,ç,Æ,Æ(ç(ç(¥(¥ § §(ç(ç(¥(¥$Ç$Ç(ç(ç(¥(¥55=Ž=Ž(¥(¥ † †$¥$¥(¥(¥(¥(¥ † †$¥$¥ e … ¥ ¥(¥(¥(¥(¥ † †(¥(¥ § §,Æ,Æ § §(¥(¥ § §(¥(¥(ç(ç(ç(ç$Æ$Æ(¥(¥ † †(¥(¥ † †$¥$¥$¥$¥(¥(¥,¥,¥(ç(ç0ç0çAïAï1L1L,Æ,Æ § §(¥(¥ § § ¥ ¥(¥(¥$¥$¥$¥$¥ † †(¥(¥,Æ,Æ,Æ,Æ5m5m=Ž=Ž11(ç(ç$Ç$Ç,Æ,Æ11,Æ,Æ$Ç$Ç(¥(¥$Æ$Æ$Æ$Æ(¥(¥,Æ,Æ(¥(¥(¥(¥,¥,¥ § §,Æ,Æ5m5m11$¥$¥ † †$„$„$„$„$¥$¥(¥(¥(¥(¥ † †$„$„ † †(¥(¥(¥(¥ † †$Æ$Æ,¥,¥$Ç$Ç(¥(¥ § §(¥(¥ † †(¥(¥ e … ¥ ¥$„$„ § §,¥,¥,Æ,Æ,Æ,Æ5J5JAðAð11 § §$¥$¥(¥(¥(¥(¥$¥$¥ § §(¥(¥(¥(¥ † †,¥,¥$Ç$Ç4ç4ç95$Ç$Ç(¥(¥(¥(¥,Æ,Æ † †(¥(¥,Æ,Æ † †$Æ$Æ(¥(¥ † † § § Æ Æ(¥(¥(¥(¥559m5m † †$„$d$„$„ † †$„$„(¥(¥$„$„ † †$„$„(¥(¥ † †(¥(¥ † †$¥$¥(¥(¥$¥$¥ † †$Æ$Æ,¥,¥ † †,Æ,Æ § §(¥(¥$¥$¥ † †$¥$¥$„$„$¥$¥(¥(¥,Æ,Æ,Æ,Æ0ç0çAðAð55(¥(¥ § §$„$„ § §(¥(¥(¥(¥ § §$„$„ § §(¥(¥,¥,¥,¥,¥551*-*$¥$¥,¥,¥(¥(¥,¥,¥ † †,Æ,Æ(¥(¥ † †$Æ$Æ § §(¥(¥,¥,¥(¥(¥(¥(¥,¥,¥ § §,Æ,Æ5m5m11$¥$¥ † †$„$„$„$„$¥$¥(¥(¥(¥(¥ † †$„$„ † †(¥(¥(¥(¥ † †$Æ$Æ,¥,¥$Ç$Ç(¥(¥ § §(¥(¥ † †(¥(¥ e … ¥ ¥$„$„ § §,¥,¥,Æ,Æ,Æ,Æ5J5JAðAð11 § §$¥$¥(¥(¥(¥(¥$¥$¥ § §(¥(¥(¥(¥ † †,¥,¥$Ç$Ç4ç4ç95$Ç$Ç(¥(¥(¥(¥,Æ,Æ † †(¥(¥,Æ,Æ † †$Æ$Æ(¥(¥ † † § § Æ Æ(¥(¥(¥(¥559m5m † †$„$d$„$„ † †$„$„(¥(¥$„$„ † †$„$„(¥(¥ † †(¥(¥ † †$¥$¥(¥(¥$¥$¥ † †$Æ$Æ,¥,¥ † †,Æ,Æ § §(¥(¥$¥$¥ † †$¥$¥$„$„$¥$¥(¥(¥,Æ,Æ,Æ,Æ0ç0çAðAð55(¥(¥ § §$„$„ § §(¥(¥(¥(¥ § §$„$„ § §(¥(¥,¥,¥,¥,¥551*-*$¥$¥,¥,¥(¥(¥,¥,¥ † †,Æ,Æ(¥(¥ † †$Æ$Æ § §(¥(¥,¥,¥(¥(¥,Æ,Æ † †(¥(¥,¥,¥-*1*%%$„$„(¥(¥ d „(¥(¥$d$„(¥(¥ † †$„$„(¥(¥(¥(¥ † †$„$„(¥(¥ † †(¥(¥(¥(¥(¥(¥(¥(¥,Æ,Æ(¥(¥ † †$¥$¥(¥(¥(¥(¥,¥,¥0ç0ç,Å,Å(¥(¥5k5kA¯=°$Ç$Ç(¥(¥ § §$„$„ † †(¥(¥ † †(¥(¥ † †(¥(¥ § §$d$„0ç0çAòAñ(ç(ç,¥,¥(¥(¥,¥,¥ § §(¥(¥,¥,¥,Æ,Æ § §(¥(¥ † †$Æ$Æ(¥(¥ † †,¥,¥-*1*-l-l(¥(¥$d$„ e …$„$„ † †$ƒ$d(¥(¥(¥(¥$„$„ † †$„$„(¥(¥$„$„$¥$¥ † †$„$„$¥$¥ † †(¥(¥,¥,¥$Æ$Æ,¥,¥(¥(¥$¥$¥ † †(¥(¥(¥(¥(¥(¥,Æ,Æ,Å,Å(¥(¥11AðAð-*1*(¥(¥ § §(¥(¥ † †$¥$¥(¥(¥ † †(¥(¥ † †(¥(¥ § §,¥,¥=Œ=Œ1L1L,¥,¥,¥,¥,Æ,Æ § §(¥(¥,¥,¥$Æ$Æ(¥(¥,¥,¥ § §(¥(¥ § §(¥(¥,Æ,Æ † †(¥(¥,¥,¥-*1*%%$„$„(¥(¥ d „(¥(¥$d$„(¥(¥ † †$„$„(¥(¥(¥(¥ † †$„$„(¥(¥ † †(¥(¥(¥(¥(¥(¥(¥(¥,Æ,Æ(¥(¥ † †$¥$¥(¥(¥(¥(¥,¥,¥0ç0ç,Å,Å(¥(¥5k5kA¯=°$Ç$Ç(¥(¥ § §$„$„ † †(¥(¥ † †(¥(¥ † †(¥(¥ § §$d$„0ç0çAòAñ(ç(ç,¥,¥(¥(¥,¥,¥ § §(¥(¥,¥,¥,Æ,Æ § §(¥(¥ † †$Æ$Æ(¥(¥ † †,¥,¥-*1*-l-l(¥(¥$d$„ e …$„$„ † †$ƒ$d(¥(¥(¥(¥$„$„ † †$„$„(¥(¥$„$„$¥$¥ † †$„$„$¥$¥ † †(¥(¥,¥,¥$Æ$Æ,¥,¥(¥(¥$¥$¥ † †(¥(¥(¥(¥(¥(¥,Æ,Æ,Å,Å(¥(¥11AðAð-*1*(¥(¥ § §(¥(¥ † †$¥$¥(¥(¥ † †(¥(¥ † †(¥(¥ § §,¥,¥=Œ=Œ1L1L,¥,¥,¥,¥,Æ,Æ § §(¥(¥,¥,¥$Æ$Æ(¥(¥,¥,¥ § §(¥(¥ § §(¥(¥$¥$¥ § §(¥(¥ † †-*1*,é,é † †$„$„$„$„$„$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥ e …$¥$¥$„$„ † †$„$„(¥(¥(¥(¥(¥(¥,Æ,Æ(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥,Å,Å0ç0ç,Å,Å,Æ,Æ,Å,Å55A°=¯$Ç$Ç(¥(¥ † †$¥$¥ † †(¥(¥ † † ¥ ¥$„$„ † †(¥(¥(¥(¥,ç,ç=¯A°,è,é,¥,¥,¥,¥(¥(¥,¥,¥,Æ,Æ,¥,¥(¥(¥,¥,¥ § §(¥(¥ † †$Æ$Æ § § § §--5m5m(¥(¥ d „ d „$d$„$¥$¥$„$„$„$d(¥(¥(¥(¥(¥(¥(¥(¥ † †$„$„(¥(¥ e …(¥(¥ † †(¥(¥(¥(¥(¥(¥,¥,¥,Æ,Æ(¥(¥(¥(¥(¥(¥(¥(¥,Å,Å0ç0ç,¥,¥0ç0ç,Å,Å11=ð=ð-*1*$¥$¥$¥$¥ † †$„$„ † †(¥(¥ † †$¥$¥ † †$¥$¥(¥(¥(¥(¥=Œ=Œ1L1L,¥,¥,¥,¥(¥(¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥ § §(¥(¥ † †(¥(¥(¥(¥$¥$¥ § §(¥(¥ † †-*1*,é,é † †$„$„$„$„$„$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥ e …$¥$¥$„$„ † †$„$„(¥(¥(¥(¥(¥(¥,Æ,Æ(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥,Å,Å0ç0ç,Å,Å,Æ,Æ,Å,Å55A°=¯$Ç$Ç(¥(¥ † †$¥$¥ † †(¥(¥ † † ¥ ¥$„$„ † †(¥(¥(¥(¥,ç,ç=¯A°,è,é,¥,¥,¥,¥(¥(¥,¥,¥,Æ,Æ,¥,¥(¥(¥,¥,¥ § §(¥(¥ † †$Æ$Æ § § § §--5m5m(¥(¥ d „ d „$d$„$¥$¥$„$„$„$d(¥(¥(¥(¥(¥(¥(¥(¥ † †$„$„(¥(¥ e …(¥(¥ † †(¥(¥(¥(¥(¥(¥,¥,¥,Æ,Æ(¥(¥(¥(¥(¥(¥(¥(¥,Å,Å0ç0ç,¥,¥0ç0ç,Å,Å11=ð=ð-*1*$¥$¥$¥$¥ † †$„$„ † †(¥(¥ † †$¥$¥ † †$¥$¥(¥(¥(¥(¥=Œ=Œ1L1L,¥,¥,¥,¥(¥(¥,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥ § §(¥(¥ † †(¥(¥$¥$¥(¥(¥ † †(¥(¥,¥,¥) -) -11$„$„$„$d$„$„(¥(¥(¥(¥$d$„(¥(¥(¥(¥$d$„$„$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥,Æ,Æ,Æ,Æ(¥(¥,Æ,Æ,¥,¥,Æ,Æ,¥,¥,Æ,Æ,Æ,Æ0ç0ç,Å,Å5J5J=ð=ð,é,é$¥$¥$¥$¥ † †(¥(¥ e …$¥$¥ † †$¥$¥ † †(¥(¥ § §0Æ0Æ550ç0ç,Å,Å0Æ0Æ,¥,¥(¥(¥(¥(¥,¥,¥,Æ,Æ(¥(¥(¥(¥ † †$Æ$Æ,¥,¥ § §(¥(¥-*1*55$„$„ „ d „ d$„$d$„$„$„$d$„$d(¥(¥(¥(¥(¥(¥$d$„(¥(¥$„$„(¥(¥$„$„(¥(¥(¥(¥(¥(¥$d$„,¥,¥0Æ0Æ,Å,Å,Æ,Æ(¥(¥,Æ,Æ,¥,¥,Æ,Æ,¥,¥0ç0ç,Å,Å,Æ,Æ11551Œ1Œ(¥(¥ † †(¥(¥ † †$¥$¥ e …$¥$¥ † †$¥$¥ † †(¥(¥(¥(¥5k5k1L1L,¥,¥,Å,Å,¥,¥,¥,¥,Æ,Æ(¥(¥,¥,¥,Æ,Æ(¥(¥ § §(¥(¥ † †$¥$¥(¥(¥ † †(¥(¥,¥,¥) -) -11$„$„$„$d$„$„(¥(¥(¥(¥$d$„(¥(¥(¥(¥$d$„$„$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥,Æ,Æ,Æ,Æ(¥(¥,Æ,Æ,¥,¥,Æ,Æ,¥,¥,Æ,Æ,Æ,Æ0ç0ç,Å,Å5J5J=ð=ð,é,é$¥$¥$¥$¥ † †(¥(¥ e …$¥$¥ † †$¥$¥ † †(¥(¥ § §0Æ0Æ550ç0ç,Å,Å0Æ0Æ,¥,¥(¥(¥(¥(¥,¥,¥,Æ,Æ(¥(¥(¥(¥ † †$Æ$Æ,¥,¥ § §(¥(¥-*1*55$„$„ „ d „ d$„$d$„$„$„$d$„$d(¥(¥(¥(¥(¥(¥$d$„(¥(¥$„$„(¥(¥$„$„(¥(¥(¥(¥(¥(¥$d$„,¥,¥0Æ0Æ,Å,Å,Æ,Æ(¥(¥,Æ,Æ,¥,¥,Æ,Æ,¥,¥0ç0ç,Å,Å,Æ,Æ11551Œ1Œ(¥(¥ † †(¥(¥ † †$¥$¥ e …$¥$¥ † †$¥$¥ † †(¥(¥(¥(¥5k5k1L1L,¥,¥,Å,Å,¥,¥,¥,¥,Æ,Æ(¥(¥,¥,¥,Æ,Æ(¥(¥ § §(¥(¥ † † † †$„$„(¥(¥(¥(¥,é,é55%% e … e … e …$d$„$¥$¥(¥(¥$„$„(¥(¥(¥(¥ e … e …$¥$¥$d$„(¥(¥(¥(¥,¥,¥,¥,¥0Æ0Æ(¥(¥(¥(¥,Æ,Æ(¥(¥,Æ,Æ(¥(¥0ç0ç(Å(Å(¥(¥,¥,¥-)-)AðAð)) † †(¥(¥ † † … e$¥$¥ † † … e(¥(¥$¥$¥ † †(¥(¥$¥$¥1L1L,é,é,¥,¥,¥,¥,¥,¥,Æ,Æ,¥,¥,¥,¥,Æ,Æ0Æ0Æ(¥(¥(¥(¥(¥(¥ † †(¥(¥ e …--55(¥(¥ c d d „ d „$d$„$„$„ ¥ ¥$„$„(¥(¥(¥(¥$„$„(¥(¥ d „$„$„ † †$„$„(¥(¥(¥(¥,¥,¥,¥,¥,Å,Å,Å,Å(¥(¥(¥(¥,Æ,Æ(¥(¥,Æ,Æ,Å,Å,Æ,Æ,Å,Å(¥(¥(ç(ç559n5m$d$„ § §$„$„ † †$¥$¥ † † † † ¥ ¥$„$„ § §(¥(¥ e …-*1*-*1*,¥,¥,¥,¥,Æ,Æ,¥,¥,¥,¥,¥,¥,Æ,Æ,¥,¥,Æ,Æ$¥$¥ e …$d$„ † †$„$„(¥(¥(¥(¥,é,é55%% e … e … e …$d$„$¥$¥(¥(¥$„$„(¥(¥(¥(¥ e … e …$¥$¥$d$„(¥(¥(¥(¥,¥,¥,¥,¥0Æ0Æ(¥(¥(¥(¥,Æ,Æ(¥(¥,Æ,Æ(¥(¥0ç0ç(Å(Å(¥(¥,¥,¥-)-)AðAð)) † †(¥(¥ † † … e$¥$¥ † † … e(¥(¥$¥$¥ † †(¥(¥$¥$¥1L1L,é,é,¥,¥,¥,¥,¥,¥,Æ,Æ,¥,¥,¥,¥,Æ,Æ0Æ0Æ(¥(¥(¥(¥(¥(¥ † †(¥(¥ e …--55(¥(¥ c d d „ d „$d$„$„$„ ¥ ¥$„$„(¥(¥(¥(¥$„$„(¥(¥ d „$„$„ † †$„$„(¥(¥(¥(¥,¥,¥,¥,¥,Å,Å,Å,Å(¥(¥(¥(¥,Æ,Æ(¥(¥,Æ,Æ,Å,Å,Æ,Æ,Å,Å(¥(¥(ç(ç559n5m$d$„ § §$„$„ † †$¥$¥ † † † † ¥ ¥$„$„ § §(¥(¥ e …-*1*-*1*,¥,¥,¥,¥,Æ,Æ,¥,¥,¥,¥,¥,¥,Æ,Æ,¥,¥,Æ,Æ$¥$¥ e …$d$„ † †$Ç$Ç$Ç$Ç$Ç$Ç-*1*1L1L1L1L § § § § † † § § † † § § § §%%$Ç$Ç$Ç$Ç))$Ç$Ç%%,é,é$Ç$Ç,é,é)) § §)) § §$Ç$Ç$Ç$Ç$Ç$Ç,é,é-)-)-*1*5J5J5m5m9n5m1Œ1Œ-*1* † † § § § §$Ç$Ç!!!!$Ç$Ç!!$Ç$Ç!!1L1L5m5m95-*1*$Ç$Ç$Ç$Ç$Ç$Ç$Ç$Ç%%$Ç$Ç,é,é%%) -) -) -) -1*-*) -) -1*-*1*-*9Ž5AòAñ11,é,é,é,é%% § § § § † † § § § § § §$Ç$Ç!!$Ç$Ç$Ç$Ç%%$Ç$Ç,é,é%%,é,é,é,é ç ç$Ç$Ç § §$Ç$Ç$Ç$Ç$Ç$Ç)),é,é) -) -1*-*9k5k=Ž=Ž1Œ1Œ5m5m § § § §$Ç$Ç § § ç ç!! § §$Ç$Ç!!$Ç$Ç) -) -9m5m5595$Ç$Ç$Ç$Ç$Ç$Ç$Ç$Ç$Ç$Ç) -) -$Ç$Ç) -) -,é,é) -) -) -) -%% † †$Ç$Ç$Ç$Ç$Ç$Ç-*1*1L1L1L1L § § § § † † § § † † § § § §%%$Ç$Ç$Ç$Ç))$Ç$Ç%%,é,é$Ç$Ç,é,é)) § §)) § §$Ç$Ç$Ç$Ç$Ç$Ç,é,é-)-)-*1*5J5J5m5m9n5m1Œ1Œ-*1* † † § § § §$Ç$Ç!!!!$Ç$Ç!!$Ç$Ç!!1L1L5m5m95-*1*$Ç$Ç$Ç$Ç$Ç$Ç$Ç$Ç%%$Ç$Ç,é,é%%) -) -) -) -1*-*) -) -1*-*1*-*9Ž5AòAñ11,é,é,é,é%% § § § § † † § § § § § §$Ç$Ç!!$Ç$Ç$Ç$Ç%%$Ç$Ç,é,é%%,é,é,é,é ç ç$Ç$Ç § §$Ç$Ç$Ç$Ç$Ç$Ç)),é,é) -) -1*-*9k5k=Ž=Ž1Œ1Œ5m5m § § § §$Ç$Ç § § ç ç!! § §$Ç$Ç!!$Ç$Ç) -) -9m5m5595$Ç$Ç$Ç$Ç$Ç$Ç$Ç$Ç$Ç$Ç) -) -$Ç$Ç) -) -,é,é) -) -) -) -%%55AðAð=ð=ð=¯A°=ÏA°AðAð=Ž=Ž5595=ï=ï55=ï=ï5595559n5m1L1L551L1L551Œ1Œ1L1L5595551Œ1Œ=¯A°=ð=ðAðAð55=ï=ï=ï=ïAðAð=¯A°FJEïIïAðAð=Ž=ŽAðAðAðAðAðAðAðAð=¯A°AñAòAñAòAðAð=¯A°=Ž=ŽEðIðNSN3AðAð=¯A°=ï=ï=Ž=ŽAðAðAðAðAòAñAðAð=ï=ïAòAñAðAðJSF3NSN3JSF3IðEðNSN3NSN3NSN3AïAïAðAð55=ï=ï5595=ï=ï55955Œ5Œ955m5m1Œ1Œ5m5m1L1L551Œ1Œ1L1L1L1L5Œ5Œ9555=ï=ïAðAð=¯A°=ÏA°9î=ï55AïAïAïAïIðEðJFIðEðAðAð55=ï=ïAðAðAðAð=¯A°AñAòIðEðAòAñAòAñ55AïAïJFIðEðAïAïAðAð55AðAðAðAðAðAð=ð=ðAðAðAðAð=ï=ïJSF3NSN3AðAð59AðAð=ð=ð=¯A°=ÏA°AðAð=Ž=Ž5595=ï=ï55=ï=ï5595559n5m1L1L551L1L551Œ1Œ1L1L5595551Œ1Œ=¯A°=ð=ðAðAð55=ï=ï=ï=ïAðAð=¯A°FJEïIïAðAð=Ž=ŽAðAðAðAðAðAðAðAð=¯A°AñAòAñAòAðAð=¯A°=Ž=ŽEðIðNSN3AðAð=¯A°=ï=ï=Ž=ŽAðAðAðAðAòAñAðAð=ï=ïAòAñAðAðJSF3NSN3JSF3IðEðNSN3NSN3NSN3AïAïAðAð55=ï=ï5595=ï=ï55955Œ5Œ955m5m1Œ1Œ5m5m1L1L551Œ1Œ1L1L1L1L5Œ5Œ9555=ï=ïAðAð=¯A°=ÏA°9î=ï55AïAïAïAïIðEðJFIðEðAðAð55=ï=ïAðAðAðAð=¯A°AñAòIðEðAòAñAòAñ55AïAïJFIðEðAïAïAðAð55AðAðAðAðAðAð=ð=ðAðAðAðAð=ï=ïJSF3NSN3AðAð$¥$¥ ¥ ¥$¥$¥$¥$¥ † †$¥$¥¥¥(¥(¥¥¥$Æ$Æ(ç(ç1L1L ¥ ¥$d$„$„$„$¥$¥$„$„ ¥ ¥$d$„$¥$¥ e …$„$„ ¥ ¥,Å,Å(ç(ç,é,é ç ç$Æ$Æ$Ç$Ç § § Æ Æ$¥$¥ § § Æ Æ(¥(¥$Ç$Ç,ç,ç$ç$ç(ç(ç$Æ$Æ(ç(ç,Æ,Æ$Ç$Ç(ç(ç(¥(¥$Æ$Æ § §(¥(¥$Æ$Æ † † Æ Æ$Æ$Æ,Æ,Æ,Æ,Æ-*1*) -) - Æ Æ„„¥¥¥¥ † † Æ Ædd Æ Æ ¥ ¥ ¥ ¥ ¥ ¥(¥(¥ § §$¥$¥¥¥(¥(¥$¥$¥$¥$¥ § §1)1))) e …$„$„$¥$¥$¥$¥$d$„$¥$¥$d$„$¥$¥$d$„ ¥ ¥(¥(¥11$Ç$Ç)) § § ç ç § § Æ Æ Æ Æ § § Æ Æ(¥(¥$Ç$Ç(ç(ç(ç(ç(ç(ç(ç(ç$Æ$Æ(ç(ç,Æ,Æ$Ç$Ç(ç(ç(¥(¥ § §(¥(¥(ç(ç † † Æ Æ(¥(¥ § §(ç(ç11-*1* ç ç e …¥¥¥¥¥¥ † †¥¥$¥$¥$¥$¥ ¥ ¥$¥$¥$¥$¥ † †$¥$¥¥¥(¥(¥¥¥$Æ$Æ(ç(ç1L1L ¥ ¥$d$„$„$„$¥$¥$„$„ ¥ ¥$d$„$¥$¥ e …$„$„ ¥ ¥,Å,Å(ç(ç,é,é ç ç$Æ$Æ$Ç$Ç § § Æ Æ$¥$¥ § § Æ Æ(¥(¥$Ç$Ç,ç,ç$ç$ç(ç(ç$Æ$Æ(ç(ç,Æ,Æ$Ç$Ç(ç(ç(¥(¥$Æ$Æ § §(¥(¥$Æ$Æ † † Æ Æ$Æ$Æ,Æ,Æ,Æ,Æ-*1*) -) - Æ Æ„„¥¥¥¥ † † Æ Ædd Æ Æ ¥ ¥ ¥ ¥ ¥ ¥(¥(¥ § §$¥$¥¥¥(¥(¥$¥$¥$¥$¥ § §1)1))) e …$„$„$¥$¥$¥$¥$d$„$¥$¥$d$„$¥$¥$d$„ ¥ ¥(¥(¥11$Ç$Ç)) § § ç ç § § Æ Æ Æ Æ § § Æ Æ(¥(¥$Ç$Ç(ç(ç(ç(ç(ç(ç(ç(ç$Æ$Æ(ç(ç,Æ,Æ$Ç$Ç(ç(ç(¥(¥ § §(¥(¥(ç(ç † † Æ Æ(¥(¥ § §(ç(ç11-*1* ç ç e …¥¥¥¥¥¥ † †¥¥$¥$¥ e …$d$„dƒ e …c„ e …c„ e …$d$„dƒ,Æ,Æ-*1*$d$„$d$„$„$„ƒd$„$d „ c$„$d„c„c$„$d„c ¥ ¥,¤,¤5J5J † † † †ƒddddddd ¥ ¥ e … ¥ ¥ e …$d$„ ¥ ¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$d$„(¥(¥$¥$¥(¥(¥ † †$„$„ … e¥¥ † † † †(¥(¥55$Ç$Çdd$¥$¥e…dd$¥$¥e… ¥ ¥$c$„$d$„ d „ d „ d „ d „dƒdd„cdd … e$¥$¥11 § §$„$„$„$d$„$d„c$„$d „ c$„$ddc$„$d„c$„$d$„$„--) -) -c„ ¥ ¥ d „dd„c … e ¥ ¥ e …$„$„dd(¥(¥ † †(¥(¥(¥(¥(¥(¥(¥(¥$d$„(¥(¥ † †$¥$¥$¥$¥ e … ¥ ¥ e … ¥ ¥$¥$¥ e …5I5I1*-* e … „ „ … edd¥¥ d „ e …dd … e$„$d„c … eƒd … eƒd … e$„$d„c,Æ,Æ-*1*$d$„$d$„$„$„ƒd$„$d „ c$„$d„c„c$„$d„c ¥ ¥,¤,¤5J5J † † † †ƒddddddd ¥ ¥ e … ¥ ¥ e …$d$„ ¥ ¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$d$„(¥(¥$¥$¥(¥(¥ † †$„$„ … e¥¥ † † † †(¥(¥55$Ç$Çdd$¥$¥e…dd$¥$¥e… ¥ ¥$c$„$d$„ d „ d „ d „ d „dƒdd„cdd … e$¥$¥11 § §$„$„$„$d$„$d„c$„$d „ c$„$ddc$„$d„c$„$d$„$„--) -) -c„ ¥ ¥ d „dd„c … e ¥ ¥ e …$„$„dd(¥(¥ † †(¥(¥(¥(¥(¥(¥(¥(¥$d$„(¥(¥ † †$¥$¥$¥$¥ e … ¥ ¥ e … ¥ ¥$¥$¥ e …5I5I1*-* e … „ „ … edd¥¥ d „ e …dd$d$„dƒ e …$d$„$d$„dƒ$d$„dƒ d ƒ$d$„$Æ$Æ11dd$„$„$„$d$„$„$„$d „ ƒ$„$d„c$„$„ƒd … e ƒ d$„$„-*1*$¥$¥dd ¥ ¥dd ¥ ¥dd ¥ ¥ e …$d$„ ¥ ¥$¥$¥$„$„ † †$„$„ † †,¥,¥(¥(¥(¥(¥$¥$¥ † † † † … e(¥(¥¥¥dd$¥$¥ e …(¥(¥55,é,édd ¥ ¥dd¥¥dd † †$„$d „ d „ d„c „ d$„$d$„$d„c$„$d„c$„$d„c$„$„-*1* § § c „$„$„$„$d „ c$„$„$„$„ƒd „ „„c$„$„cd$„$„--))dd … eƒd$¥$¥dddd ¥ ¥ e … ¥ ¥$¥$¥$„$„ † †$„$„ † †(¥(¥,¥,¥,¥,¥$¥$¥ † †$„$„$¥$¥ † † ¥ ¥dd$¥$¥e…(¥(¥1)1)1L1L$¥$¥ e …dd¥¥ † †$„$d „ d„c$„$d„c … e$„$d$„$d„c$„$d„c „ c$„$d$Æ$Æ11dd$„$„$„$d$„$„$„$d „ ƒ$„$d„c$„$„ƒd … e ƒ d$„$„-*1*$¥$¥dd ¥ ¥dd ¥ ¥dd ¥ ¥ e …$d$„ ¥ ¥$¥$¥$„$„ † †$„$„ † †,¥,¥(¥(¥(¥(¥$¥$¥ † † † † … e(¥(¥¥¥dd$¥$¥ e …(¥(¥55,é,édd ¥ ¥dd¥¥dd † †$„$d „ d „ d„c „ d$„$d$„$d„c$„$d„c$„$d„c$„$„-*1* § § c „$„$„$„$d „ c$„$„$„$„ƒd „ „„c$„$„cd$„$„--))dd … eƒd$¥$¥dddd ¥ ¥ e … ¥ ¥$¥$¥$„$„ † †$„$„ † †(¥(¥,¥,¥,¥,¥$¥$¥ † †$„$„$¥$¥ † † ¥ ¥dd$¥$¥e…(¥(¥1)1)1L1L$¥$¥ e …dd¥¥ † †$„$d „ d„c$d$„$d$„dƒ d ƒ d ƒ d ƒdƒ$d$ƒ d ƒ$d$„(ç(ç-*1*dd$„$„$„$„ƒd$„$„$„$„$„$d „ „„c$„$d „ „$„$d$„$„-*1*¥¥dd „ „dddddd „ „dd ¥ ¥$d$„ ¥ ¥(¥(¥ † †$„$„(¥(¥$d$„(¥(¥ † †(¥(¥dd … e$„$„ „ „ … edd$¥$¥$¥$¥(¥(¥5m5m$ç$çdddd „ „ … e … edddd„c„c$„$d „ d„c$„$d„c „ c$„$d „ c$„$d$„$„-*1* § §$„$„$„$d$„$„$„$„$„$d „ ƒ$„$d„c$„$d„c ¥ ¥$d$„11$Ç$Çdd „ „dddd„„dd „ „dd ¥ ¥$„$„ § §$„$„ † †$„$d(¥(¥$„$„ † †(¥(¥ e …dd$¥$¥ d „ e … „ „dd(¥(¥(¥(¥11-l-ldddd „ „ … edd„c„c … e$„$d$„$d„c „ c „ c „ c„c$„$c „ c$„$d(ç(ç-*1*dd$„$„$„$„ƒd$„$„$„$„$„$d „ „„c$„$d „ „$„$d$„$„-*1*¥¥dd „ „dddddd „ „dd ¥ ¥$d$„ ¥ ¥(¥(¥ † †$„$„(¥(¥$d$„(¥(¥ † †(¥(¥dd … e$„$„ „ „ … edd$¥$¥$¥$¥(¥(¥5m5m$ç$çdddd „ „ … e … edddd„c„c$„$d „ d„c$„$d„c „ c$„$d „ c$„$d$„$„-*1* § §$„$„$„$d$„$„$„$„$„$d „ ƒ$„$d„c$„$d„c ¥ ¥$d$„11$Ç$Çdd „ „dddd„„dd „ „dd ¥ ¥$„$„ § §$„$„ † †$„$d(¥(¥$„$„ † †(¥(¥ e …dd$¥$¥ d „ e … „ „dd(¥(¥(¥(¥11-l-ldddd „ „ … edd„c„c … e$d$„dƒ d ƒ$d$ƒ$„$„ƒd$ƒ$d$„$d „ c$„$„(¥(¥1L1L$„$„ ¥ ¥$d$„$d$„$„$„$„$„$„$„$„$„ƒd ¥ ¥ c „$d$„$„$„)) e …dd „ „dc„„dd„„dd ¥ ¥$„$„(¥(¥ † †$„$„(¥(¥ e …$„$„(¥(¥ e …$„$„ … e$„$„ „ „ † † ¥ ¥$d$„ ¥ ¥(¥(¥(¥(¥5k5k$Ç$Çdd„ddd¥¥dd „ „dd ¥ ¥$d$„dƒ$d$„$d$„ d ƒ d ƒ d ƒ d ƒ d ƒ$d$„$„$„5J5J ç ç$d$„$„$„ƒd$„$„$„$„$„$„$„$„ ¥ ¥$d$„$„$„$„$d$„$d(ç(ç Æ Ædddd „ „dddc „ „dd ¥ ¥$„$„(¥(¥ † †$„$d(¥(¥(¥(¥ d „(¥(¥(¥(¥ d „(¥(¥ e …$d$„ ¥ ¥$„$„dd$¥$¥$¥$¥(¥(¥,é,é1L1Ldddddd„„„„…e$„$d„c$„$d„c „ c$„$c$„$„ƒd$ƒ$d$„$d „ c$„$„(¥(¥1L1L$„$„ ¥ ¥$d$„$d$„$„$„$„$„$„$„$„$„ƒd ¥ ¥ c „$d$„$„$„)) e …dd „ „dc„„dd„„dd ¥ ¥$„$„(¥(¥ † †$„$„(¥(¥ e …$„$„(¥(¥ e …$„$„ … e$„$„ „ „ † † ¥ ¥$d$„ ¥ ¥(¥(¥(¥(¥5k5k$Ç$Çdd„ddd¥¥dd „ „dd ¥ ¥$d$„dƒ$d$„$d$„ d ƒ d ƒ d ƒ d ƒ d ƒ$d$„$„$„5J5J ç ç$d$„$„$„ƒd$„$„$„$„$„$„$„$„ ¥ ¥$d$„$„$„$„$d$„$d(ç(ç Æ Ædddd „ „dddc „ „dd ¥ ¥$„$„(¥(¥ † †$„$d(¥(¥(¥(¥ d „(¥(¥(¥(¥ d „(¥(¥ e …$d$„ ¥ ¥$„$„dd$¥$¥$¥$¥(¥(¥,é,é1L1Ldddddd„„„„…e$„$d„c$d$„ d ƒ d ƒ d ƒ d ƒ$d$ƒdƒ d ƒ$d$ƒ d ƒ$¥$¥5J5Jdd$„$d$„$„$„$„ ƒ d$„$„$„$„$„$„$„$d$„$„$„$d$„$„$„$„ ç çdd „ „„cdd„c ¥ ¥$d$„$¥$¥$„$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥(¥(¥(¥(¥(¥(¥$d$„$¥$¥$„$„(¥(¥(¥(¥ † †$„$d1L1L ç ç d „dd„cdddd„„„c$„$d„c$„$c „ c$„$c „ c$„$c „ c „ c „ c$„$c „ c5J5J$Ç$Ç d „$d$„$„$„ ƒ d$„$„$„$„$„$„$„$d$„$d$„$„ „ „ „ ƒ(¥(¥ † †dd „ „„cdd$„$„dd$¥$¥$„$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$d$„(¥(¥$d$„$¥$¥$„$„(¥(¥(¥(¥ † †,ç,ç-*1* d „dcdd„ddddc„c$„$d$„$d „ c „ c „ c „ c$„$c„c „ c$„$c „ c$¥$¥5J5Jdd$„$d$„$„$„$„ ƒ d$„$„$„$„$„$„$„$d$„$„$„$d$„$„$„$„ ç çdd „ „„cdd„c ¥ ¥$d$„$¥$¥$„$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥(¥(¥(¥(¥(¥(¥$d$„$¥$¥$„$„(¥(¥(¥(¥ † †$„$d1L1L ç ç d „dd„cdddd„„„c$„$d„c$„$c „ c$„$c „ c$„$c „ c „ c „ c$„$c „ c5J5J$Ç$Ç d „$d$„$„$„ ƒ d$„$„$„$„$„$„$„$d$„$d$„$„ „ „ „ ƒ(¥(¥ † †dd „ „„cdd$„$„dd$¥$¥$„$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$d$„(¥(¥$d$„$¥$¥$„$„(¥(¥(¥(¥ † †,ç,ç-*1* d „dcdd„ddddc„c$„$d § § § §,Æ,Æ$Ç$Ç$Ç$Ç § § § § † † † † † †,é,é11) -) -(¥(¥$¥$¥ † †$¥$¥(¥(¥ † † § § e … ¥ ¥dd$¥$¥ † †-*1*)) § § § §$Æ$Æ e … e …$¥$¥ e …$¥$¥$„$„ † †$„$d † † † † … e † †$„$d † †(¥(¥ † †(¥(¥$Ç$Ç$Ç$Ç † †$Ç$Ç$Ç$Ç § §,é,é-l-l) -) - § § § § § § § §ÆÆ § § § §$Ç$Ç § § § §,¥,¥ § §$Ç$Ç,é,é † † † † † † † †$Æ$Æ1L1L1L1L$Æ$Æ † †$¥$¥(¥(¥ † †(¥(¥ † †$¥$¥dd¥¥ † †$„$„,é,é)K)K Æ Æ § §$Æ$Æ † †dd(¥(¥$¥$¥ † †$„$„ … e(¥(¥f† † † … e … e † †$„$d § §(¥(¥ † †,¥,¥$Ç$Ç § §$Ç$Ç$Ç$Ç § §$Ç$Ç1L1L1L1L § §ÆÆ § § § §ÆÆf† § § § § § § § §,Æ,Æ$Ç$Ç$Ç$Ç § § § § † † † † † †,é,é11) -) -(¥(¥$¥$¥ † †$¥$¥(¥(¥ † † § § e … ¥ ¥dd$¥$¥ † †-*1*)) § § § §$Æ$Æ e … e …$¥$¥ e …$¥$¥$„$„ † †$„$d † † † † … e † †$„$d † †(¥(¥ † †(¥(¥$Ç$Ç$Ç$Ç † †$Ç$Ç$Ç$Ç § §,é,é-l-l) -) - § § § § § § § §ÆÆ § § § §$Ç$Ç § § § §,¥,¥ § §$Ç$Ç,é,é † † † † † † † †$Æ$Æ1L1L1L1L$Æ$Æ † †$¥$¥(¥(¥ † †(¥(¥ † †$¥$¥dd¥¥ † †$„$„,é,é)K)K Æ Æ § §$Æ$Æ † †dd(¥(¥$¥$¥ † †$„$„ … e(¥(¥f† † † … e … e † †$„$d § §(¥(¥ † †,¥,¥$Ç$Ç § §$Ç$Ç$Ç$Ç § §$Ç$Ç1L1L1L1L § §ÆÆ § § § §ÆÆf† § § § §1Œ1Œ=¯A°55=Ž=Ž=¯A°=ÏA°1Ž11L1L-*1*-l-l55=Ž=Ž=ï=ï55955k5k=Ž=ŽAðAð=ï=ï=¯A°=ÏA°9­=­=ÐA¯=¯A°9ï=ï=Ž=Ž=Ž=ŽAïAï=Ž=Ž551*-*1Œ1Œ1L1L1L1L559n5m55955m5m955m5m9n5m111L1L1L1L1L1L1L1L11=¯A°=ÏA°=¯=¯AÐ=¯A°=¯=ÏA°=¯A°=Ï=¯=ð=ð55AðAðAòAñAòAñAòAñAòAñ=ð=ð=¯A°1155955m5m1L1L111L1L-*1*-l-l5m5m95=¯A°=Ž=Ž55595Ž5A¯=°=ï=ï=¯A°=Ž=ŽAðAð=Ž=Ž=¯A°=ï=ï=Ž=Ž=Ž=Ž=¯A°=Ï=°=Ž=Ž5J5J-l-l1L1L1L1L1L1L55951155955m5m9n5m5m5m111L1L1L1L1L1L1155A¯=°AÏ=°=¯A¯AòAò5Ž5A¯=°59AñAò=ð=ð55AòAñ551111111Œ1Œ=¯A°55=Ž=Ž=¯A°=ÏA°1Ž11L1L-*1*-l-l55=Ž=Ž=ï=ï55955k5k=Ž=ŽAðAð=ï=ï=¯A°=ÏA°9­=­=ÐA¯=¯A°9ï=ï=Ž=Ž=Ž=ŽAïAï=Ž=Ž551*-*1Œ1Œ1L1L1L1L559n5m55955m5m955m5m9n5m111L1L1L1L1L1L1L1L11=¯A°=ÏA°=¯=¯AÐ=¯A°=¯=ÏA°=¯A°=Ï=¯=ð=ð55AðAðAòAñAòAñAòAñAòAñ=ð=ð=¯A°1155955m5m1L1L111L1L-*1*-l-l5m5m95=¯A°=Ž=Ž55595Ž5A¯=°=ï=ï=¯A°=Ž=ŽAðAð=Ž=Ž=¯A°=ï=ï=Ž=Ž=Ž=Ž=¯A°=Ï=°=Ž=Ž5J5J-l-l1L1L1L1L1L1L55951155955m5m9n5m5m5m111L1L1L1L1L1L1155A¯=°AÏ=°=¯A¯AòAò5Ž5A¯=°59AñAò=ð=ð55AòAñ55111111,ç,ç,¥,¥0ç0ç0ç0ç-*1*=Ž=Ž(¥(¥$„$„$¥$¥dd$¥$¥dd „ „dd ¥ ¥(¥(¥dd Æ Æ$¥$¥$¥$¥(¥(¥$¥$¥$¥$¥$¥$¥dd ¥ ¥c„$Æ$Æ(¥(¥dd¥¥ † † ¥ ¥(¥(¥5J5J=Ž=Ž1L1L5I5I5J5J1L1L5J5J5k5k9m5m5k5k9m5m5k5k1L1L5k5k9m5m1L1L5J5J--,é,é1111--1)1)5)5)1)1)5)5)1)1)5)5)1)1)1)1)551*-*951L1L-- e …$¥$¥$d$„(¥(¥(¥(¥ e … „ „ „ „dd ¥ ¥ ¥ ¥$„$„ „ „$¥$¥(¥(¥ Æ Æ(¥(¥$¥$¥$¥$¥ † † … eƒd Æ Æ$¥$¥ ¥ ¥$d$„ „ „¥¥(¥(¥,ç,ç=¯A°1L1L5I5I5J5J5J5J5k5k1L1L5k5k9k5k5m5m9k5k5k5k9k5k5m5mJJ9Ž=Ž11,ç,ç,ç,ç,é,é11115I5I9)5)115I5I1)1)5)5)9)5),ç,ç,¥,¥0ç0ç0ç0ç-*1*=Ž=Ž(¥(¥$„$„$¥$¥dd$¥$¥dd „ „dd ¥ ¥(¥(¥dd Æ Æ$¥$¥$¥$¥(¥(¥$¥$¥$¥$¥$¥$¥dd ¥ ¥c„$Æ$Æ(¥(¥dd¥¥ † † ¥ ¥(¥(¥5J5J=Ž=Ž1L1L5I5I5J5J1L1L5J5J5k5k9m5m5k5k9m5m5k5k1L1L5k5k9m5m1L1L5J5J--,é,é1111--1)1)5)5)1)1)5)5)1)1)5)5)1)1)1)1)551*-*951L1L-- e …$¥$¥$d$„(¥(¥(¥(¥ e … „ „ „ „dd ¥ ¥ ¥ ¥$„$„ „ „$¥$¥(¥(¥ Æ Æ(¥(¥$¥$¥$¥$¥ † † … eƒd Æ Æ$¥$¥ ¥ ¥$d$„ „ „¥¥(¥(¥,ç,ç=¯A°1L1L5I5I5J5J5J5J5k5k1L1L5k5k9k5k5m5m9k5k5k5k9k5k5m5mJJ9Ž=Ž11,ç,ç,ç,ç,é,é11115I5I9)5)115I5I1)1)5)5)9)5),Æ,Æ † † „ d$„$„,é,é5m5m(¥(¥ d „ d „dd„ddd„d„c … e$¥$¥$d$„dd$„$ddddcdddddd „ „dddd¥¥ † †ƒddddd … e(¥(¥11=Ž=Ž,Æ,Æ(¥(¥ † †(¥(¥(¥(¥,¥,¥$Ç$Ç,Æ,Æ0ç0ç$Ç$Ç,Æ,Æ0Æ0Æ=Ž=Ž1Œ1Œ † †(¥(¥$d$„(¥(¥$d$„(¥(¥,¤,¤(¥(¥$d$„,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥$Ç$Ç,¥,¥,¥,¥$Ç$Ç,é,é$„$„(¥(¥ † †$„$ddddc„ddddd„c … e ¥ ¥ d „dddddddd„ddd„cdd„cdd(¥(¥dddddddd(¥(¥,¥,¥551)1)(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$Ç$Ç,¥,¥0ç0ç$Ç$Ç,Æ,Æ,Æ,Æ5J5J=¯A°11(¥(¥ e …(¥(¥$„$„$„$„(¥(¥,¥,¥$d$„,¥,¥,¥,¥,¥,¥,¥,¥(¥(¥,Æ,Æ † † „ d$„$„,é,é5m5m(¥(¥ d „ d „dd„ddd„d„c … e$¥$¥$d$„dd$„$ddddcdddddd „ „dddd¥¥ † †ƒddddd … e(¥(¥11=Ž=Ž,Æ,Æ(¥(¥ † †(¥(¥(¥(¥,¥,¥$Ç$Ç,Æ,Æ0ç0ç$Ç$Ç,Æ,Æ0Æ0Æ=Ž=Ž1Œ1Œ † †(¥(¥$d$„(¥(¥$d$„(¥(¥,¤,¤(¥(¥$d$„,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥$Ç$Ç,¥,¥,¥,¥$Ç$Ç,é,é$„$„(¥(¥ † †$„$ddddc„ddddd„c … e ¥ ¥ d „dddddddd„ddd„cdd„cdd(¥(¥dddddddd(¥(¥,¥,¥551)1)(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$Ç$Ç,¥,¥0ç0ç$Ç$Ç,Æ,Æ,Æ,Æ5J5J=¯A°11(¥(¥ e …(¥(¥$„$„$„$„(¥(¥,¥,¥$d$„,¥,¥,¥,¥,¥,¥,¥,¥(¥(¥,Æ,Æ § §$„$„ … e111L1L,Æ,Ædddddc„d„ddddddd ¥ ¥dd„cdd„ddddd„d…edddc „ „…e ¥ ¥$d$„dc„„dd$„$„5595(ç(ç,¥,¥ § §(¥(¥$Ç$Ç0ç0ç § §,Æ,Æ,é,é,Æ,Æ,é,é0ç0ç=Œ=Œ5m5m § §(¥(¥(¥(¥ † †(¥(¥(¥(¥ e …(¥(¥,¥,¥(¥(¥(¥(¥,¥,¥$Ç$Ç,¥,¥0Æ0Æ,Æ,Æ(¥(¥ § §--$d$„(¥(¥$„$„$„$„„ddddc„d„ddd$¥$¥dddcdddd„ddd„ddddd„„dd„„¥¥ d „dd„„dd … e,Æ,Æ5511,¥,¥ § § † †,¥,¥$Ç$Ç0ç0ç$Ç$Ç0ç0ç$Ç$Ç,Æ,Æ,é,é5)5)A¯=°$Ç$Ç,¥,¥ † †(¥(¥ † † § §(¥(¥(¥(¥(¥(¥,¥,¥$Ç$Ç,¥,¥,¥,¥$Ç$Ç,Æ,Æ § §$„$„ … e111L1L,Æ,Ædddddc„d„ddddddd ¥ ¥dd„cdd„ddddd„d…edddc „ „…e ¥ ¥$d$„dc„„dd$„$„5595(ç(ç,¥,¥ § §(¥(¥$Ç$Ç0ç0ç § §,Æ,Æ,é,é,Æ,Æ,é,é0ç0ç=Œ=Œ5m5m § §(¥(¥(¥(¥ † †(¥(¥(¥(¥ e …(¥(¥,¥,¥(¥(¥(¥(¥,¥,¥$Ç$Ç,¥,¥0Æ0Æ,Æ,Æ(¥(¥ § §--$d$„(¥(¥$„$„$„$„„ddddc„d„ddd$¥$¥dddcdddd„ddd„ddddd„„dd„„¥¥ d „dd„„dd … e,Æ,Æ5511,¥,¥ § § † †,¥,¥$Ç$Ç0ç0ç$Ç$Ç0ç0ç$Ç$Ç,Æ,Æ,é,é5)5)A¯=°$Ç$Ç,¥,¥ † †(¥(¥ † † § §(¥(¥(¥(¥(¥(¥,¥,¥$Ç$Ç,¥,¥,¥,¥$Ç$Ç,Æ,Æ † † … edd--55,¥,¥dddd„d„ddc„ddddd$¥$¥dddddddd„ddd„d„„dd„„dd¥¥ e …$d$„d„dddd$¥$¥1111,é,é,Æ,Æ$Ç$Ç,¥,¥$Ç$Ç § §,Æ,Æ0ç0ç$Ç$Ç0ç0ç$Ç$Ç0ç0ç=Ž=Ž5m5m(¥(¥(¥(¥ e …¥¥ † † § § § § § §(¥(¥(¥(¥ § §(¥(¥$Ç$Ç,é,é,Æ,Æ,é,é,¥,¥,é,é11 d „(¥(¥$d$„dd„ddd„ddcdddd † †ƒd … e „ „dddd„dddÆÆcddd„„…e$¥$¥dddd„ddd$¥$¥(¥(¥551*-*,Æ,Æ$Ç$Ç,¥,¥ § §$Ç$Ç,¥,¥$Ç$Ç0ç0ç$Ç$Ç,é,é,¥,¥5J5JAòAñ$Ç$Ç,¥,¥ † †$¥$¥¥¥ § §(¥(¥ † †$Ç$Ç,¥,¥$Ç$Ç$Ç$Ç,¥,¥$Ç$Ç,Æ,Æ † † … edd--55,¥,¥dddd„d„ddc„ddddd$¥$¥dddddddd„ddd„d„„dd„„dd¥¥ e …$d$„d„dddd$¥$¥1111,é,é,Æ,Æ$Ç$Ç,¥,¥$Ç$Ç § §,Æ,Æ0ç0ç$Ç$Ç0ç0ç$Ç$Ç0ç0ç=Ž=Ž5m5m(¥(¥(¥(¥ e …¥¥ † † § § § § § §(¥(¥(¥(¥ § §(¥(¥$Ç$Ç,é,é,Æ,Æ,é,é,¥,¥,é,é11 d „(¥(¥$d$„dd„ddd„ddcdddd † †ƒd … e „ „dddd„dddÆÆcddd„„…e$¥$¥dddd„ddd$¥$¥(¥(¥551*-*,Æ,Æ$Ç$Ç,¥,¥ § §$Ç$Ç,¥,¥$Ç$Ç0ç0ç$Ç$Ç,é,é,¥,¥5J5JAòAñ$Ç$Ç,¥,¥ † †$¥$¥¥¥ § §(¥(¥ † †$Ç$Ç,¥,¥$Ç$Ç$Ç$Ç,¥,¥$Ç$Ç(ç(ç,Æ,Æ e …¥¥5511,¥,¥dddd„d„d„ddddcdddd„„dd„„„ddd„ddd„„dd…edd „ „$¥$¥dddddd „ „ † †,ç,ç5m5m8ç4ç$Ç$Ç0ç0ç$Ç$Ç § §,¥,¥$Ç$Ç$Ç$Ç0ç0ç$Ç$Ç$Ç$Ç0Æ0Æ5m5m1L1L „ „†f„„„d…e†f„„…e † † § §,¥,¥ § §,¥,¥$Ç$Ç,é,é$Ç$Ç § §---*1*$d$„$„$„ … e „ ddc„d„d„ddd„d … eƒddddddd„ddcdd„ddddddddd$¥$¥dd „ „dddd¥¥(¥(¥5m5m1155$Ç$Ç$Ç$Ç,¥,¥$Ç$Ç § §0ç0ç$Ç$Ç$Ç$Ç,Æ,Æ,é,é55A¯=° ¦ §¥¥e…e…d„e…f†¥¥e… § §11 † † § §--(ç(ç,Æ,Æ e …¥¥5511,¥,¥dddd„d„d„ddddcdddd„„dd„„„ddd„ddd„„dd…edd „ „$¥$¥dddddd „ „ † †,ç,ç5m5m8ç4ç$Ç$Ç0ç0ç$Ç$Ç § §,¥,¥$Ç$Ç$Ç$Ç0ç0ç$Ç$Ç$Ç$Ç0Æ0Æ5m5m1L1L „ „†f„„„d…e†f„„…e † † § §,¥,¥ § §,¥,¥$Ç$Ç,é,é$Ç$Ç § §---*1*$d$„$„$„ … e „ ddc„d„d„ddd„d … eƒddddddd„ddcdd„ddddddddd$¥$¥dd „ „dddd¥¥(¥(¥5m5m1155$Ç$Ç$Ç$Ç,¥,¥$Ç$Ç § §0ç0ç$Ç$Ç$Ç$Ç,Æ,Æ,é,é55A¯=° ¦ §¥¥e…e…d„e…f†¥¥e… § §11 † † § §--(ç(ç$Ç$Ç † †$ƒ$d1111,¥,¥ d „ d „dc„ddcdddd„c … ecdƒddd„cdd„cdddd „ „„cdd„c … e$„$ddc„c„c$„$„,é,é1L1L0ç0ç11$Ç$Ç$Ç$Ç0ç0ç$Ç$Ç$Ç$Ç,é,é0ç0ç$Ç$Ç,é,é,Æ,Æ5J5J) -) -d„¥¥f†e…e…„„…e„„„ddd † † Æ Æ § §,Æ,Æ$Æ$Æ$Ç$Ç,ç,ç11) -) -dd$„$ddcdƒdcdcdddc d „dd„c$„$d„„„cdcdd„cdd„c … e „ „dcdc … e$„$„cdcdƒd$„$„(¥(¥1L1L1)1),é,é4ç4ç$Ç$Ç$Ç$Ç$Ç$Ç,é,é$Ç$Ç0ç0ç$Ç$Ç,é,é0ç0ç11=¯A°†f…e†f…e…e…e„„…e„ddd Æ Ædddd § §(ç(ç$Ç$Ç † †$ƒ$d1111,¥,¥ d „ d „dc„ddcdddd„c … ecdƒddd„cdd„cdddd „ „„cdd„c … e$„$ddc„c„c$„$„,é,é1L1L0ç0ç11$Ç$Ç$Ç$Ç0ç0ç$Ç$Ç$Ç$Ç,é,é0ç0ç$Ç$Ç,é,é,Æ,Æ5J5J) -) -d„¥¥f†e…e…„„…e„„„ddd † † Æ Æ § §,Æ,Æ$Æ$Æ$Ç$Ç,ç,ç11) -) -dd$„$ddcdƒdcdcdddc d „dd„c$„$d„„„cdcdd„cdd„c … e „ „dcdc … e$„$„cdcdƒd$„$„(¥(¥1L1L1)1),é,é4ç4ç$Ç$Ç$Ç$Ç$Ç$Ç,é,é$Ç$Ç0ç0ç$Ç$Ç,é,é0ç0ç11=¯A°†f…e†f…e…e…e„„…e„ddd Æ Ædddd § §(ç(ç$Ç$Ç § §$Ç$Ç-*1*11-*1*$Ç$Ç § § § §f†¥¥f†¥¥d„dd„d„dÆÆe…¥¥f†„„ÆÆ § §f†f†$Ç$Ç § § ç ç § §$Ç$Ç%%$Ç$Ç1L1L1L1L%%$Ç$Ç$Æ$Æ$Ç$Ç § §(ç(ç § § § § § §$Æ$Æ † † § §=¯A°=Ž=Žf†ÆÆ § §$Æ$Æ § § § § § § § §(¥(¥$Æ$Æ--11$Ç$Ç) -) -1*-*11-*1*55A¯=°) -) -%%!!$Ç$Çf† § §f†f†¥¥e…dd„d„d„d¥¥e…e…¥¥f† § § Æ Æf†ÆÆ § § § § ç ç § §) -) -$Ç$Ç) -) --l-l) -) - § § § §(ç(ç$Ç$Ç$Ç$Ç,¥,¥$Ç$Ç$Ç$Ç$Ç$Ç † † † †11AòAñ ç 祥 ç ç$Ç$Ç § §(¥(¥ † † § §,Æ,Æ § §$Æ$Æ$Ç$Ç ç ç$Ç$Ç(ç(ç$Ç$Ç § §$Ç$Ç-*1*11-*1*$Ç$Ç § § § §f†¥¥f†¥¥d„dd„d„dÆÆe…¥¥f†„„ÆÆ § §f†f†$Ç$Ç § § ç ç § §$Ç$Ç%%$Ç$Ç1L1L1L1L%%$Ç$Ç$Æ$Æ$Ç$Ç § §(ç(ç § § § § § §$Æ$Æ † † § §=¯A°=Ž=Žf†ÆÆ § §$Æ$Æ § § § § § § § §(¥(¥$Æ$Æ--11$Ç$Ç) -) -1*-*11-*1*55A¯=°) -) -%%!!$Ç$Çf† § §f†f†¥¥e…dd„d„d„d¥¥e…e…¥¥f† § § Æ Æf†ÆÆ § § § § ç ç § §) -) -$Ç$Ç) -) --l-l) -) - § § § §(ç(ç$Ç$Ç$Ç$Ç,¥,¥$Ç$Ç$Ç$Ç$Ç$Ç † † † †11AòAñ ç 祥 ç ç$Ç$Ç § §(¥(¥ † † § §,Æ,Æ § §$Æ$Æ$Ç$Ç ç ç$Ç$Ç=Œ=Œ=Œ=Œ5m5m5J5J5m5m=Œ=Œ1L1L11-l-l-*1*-*1*) -) --)-)-*1*-*1*55-l-l-*1*-*1*11-*1*)J)J1L1L5J5J-*1*1L1L1Œ1Œ5k5k95=¯A°551Œ1Œ5m5m1L1L1Œ1Œ5k5k1Œ1Œ-*1*-*1*))-*1*-*1*-*1*)K)K1L1L1L1L1L1L5k5k=Ž=Ž=ï=ï=Ž=Ž=Ž=Ž=Ž=Ž=Œ=Œ=Œ=Œ=Œ=Œ=¯A°EïIï=¯A°=Ï=¯A°=¯IðEðAðAð55A°=¯=Œ=Œ5m5m=Œ=Œ=Œ=Œ=Ž=Ž5m5m) -) -1*-*1L1L)J)J1)1)-)-))K)K-*1*5Ž5-l-l1L1L-*1*111L1L-*1*-*1*)J)J5J5J-*1*-l-l559Ž555A¯=°1Œ1Œ1L1L551L1L5k5k955J5J)K)K,é,é) -) -)K)K-*1*-*1*-*1*-*1*-l-l1L1L55A¯=°=ï=ï=Ž=Ž55=Œ=Œ5k5k=Ž=Ž=¯A°=ÏA°=¯=¯AÐ=¯A°=¯IïEï=¯A°=Ž=Ž=Œ=Œ=Œ=Œ5m5m5J5J5m5m=Œ=Œ1L1L11-l-l-*1*-*1*) -) --)-)-*1*-*1*55-l-l-*1*-*1*11-*1*)J)J1L1L5J5J-*1*1L1L1Œ1Œ5k5k95=¯A°551Œ1Œ5m5m1L1L1Œ1Œ5k5k1Œ1Œ-*1*-*1*))-*1*-*1*-*1*)K)K1L1L1L1L1L1L5k5k=Ž=Ž=ï=ï=Ž=Ž=Ž=Ž=Ž=Ž=Œ=Œ=Œ=Œ=Œ=Œ=¯A°EïIï=¯A°=Ï=¯A°=¯IðEðAðAð55A°=¯=Œ=Œ5m5m=Œ=Œ=Œ=Œ=Ž=Ž5m5m) -) -1*-*1L1L)J)J1)1)-)-))K)K-*1*5Ž5-l-l1L1L-*1*111L1L-*1*-*1*)J)J5J5J-*1*-l-l559Ž555A¯=°1Œ1Œ1L1L551L1L5k5k955J5J)K)K,é,é) -) -)K)K-*1*-*1*-*1*-*1*-l-l1L1L55A¯=°=ï=ï=Ž=Ž55=Œ=Œ5k5k=Ž=Ž=¯A°=ÏA°=¯=¯AÐ=¯A°=¯IïEï=¯A°=Ž=Ždd † †$„$d(¥(¥$d$„(¥(¥ e …dd ¥ ¥ e … ¥ ¥$d$„ ¥ ¥(¥(¥11)K)K(¥(¥,Æ,Æ(¥(¥,¥,¥,¥,¥(¥(¥(¥(¥(¥(¥ ¥ ¥$¥$¥(¥(¥ ¥ ¥$Ç$Ç1L1L11 § §(¥(¥$Æ$Æ § §$„$„ † †$„$„ † †$¥$¥ e … Æ Æ § §(¥(¥,Æ,Æ$Ç$Ç(ç(ç,Æ,Æ$Ç$Ç(ç(ç$Æ$Æ,ç,ç$Ç$Ç$Ç$Ç(ç(ç,ç,ç0ç0ç,é,é-*1*(ç(ç,¥,¥(ç(ç(¥(¥ § §(¥(¥$d$„,¥,¥$„$„(¥(¥(¥(¥ † †$„$ddd ¥ ¥ e … ¥ ¥ e …(¥(¥,Æ,Æ1L1L(ç(ç$¥$¥,¥,¥(¥(¥(¥(¥,¥,¥(¥(¥,¥,¥$¥$¥$¥$¥$¥$¥$¥$¥(¥(¥)K)K1)1)$Ç$Ç,¥,¥$Æ$Æ § §$„$„ † †(¥(¥ † † ¥ ¥ ¥ ¥$¥$¥ † †$Æ$Æ § §(ç(ç,Æ,Æ(ç(ç$Ç$Ç$Æ$Æ,Æ,Æ$Ç$Ç$Ç$Ç$Ç$Ç(ç(ç,ç,ç0ç0ç$Ç$Ç1L1L0ç0ç(¥(¥$¥$¥dd„„dd † †$„$d(¥(¥$d$„(¥(¥ e …dd ¥ ¥ e … ¥ ¥$d$„ ¥ ¥(¥(¥11)K)K(¥(¥,Æ,Æ(¥(¥,¥,¥,¥,¥(¥(¥(¥(¥(¥(¥ ¥ ¥$¥$¥(¥(¥ ¥ ¥$Ç$Ç1L1L11 § §(¥(¥$Æ$Æ § §$„$„ † †$„$„ † †$¥$¥ e … Æ Æ § §(¥(¥,Æ,Æ$Ç$Ç(ç(ç,Æ,Æ$Ç$Ç(ç(ç$Æ$Æ,ç,ç$Ç$Ç$Ç$Ç(ç(ç,ç,ç0ç0ç,é,é-*1*(ç(ç,¥,¥(ç(ç(¥(¥ § §(¥(¥$d$„,¥,¥$„$„(¥(¥(¥(¥ † †$„$ddd ¥ ¥ e … ¥ ¥ e …(¥(¥,Æ,Æ1L1L(ç(ç$¥$¥,¥,¥(¥(¥(¥(¥,¥,¥(¥(¥,¥,¥$¥$¥$¥$¥$¥$¥$¥$¥(¥(¥)K)K1)1)$Ç$Ç,¥,¥$Æ$Æ § §$„$„ † †(¥(¥ † † ¥ ¥ ¥ ¥$¥$¥ † †$Æ$Æ § §(ç(ç,Æ,Æ(ç(ç$Ç$Ç$Æ$Æ,Æ,Æ$Ç$Ç$Ç$Ç$Ç$Ç(ç(ç,ç,ç0ç0ç$Ç$Ç1L1L0ç0ç(¥(¥$¥$¥dd„„dd¥¥ † † … e ¥ ¥ e …dd ¥ ¥dddd¥¥dd(¥(¥ † †559m5m$Ç$Ç,¥,¥,¥,¥,Æ,Æ$Ç$Ç,¥,¥0Æ0Æ,ç,ç$Æ$Æ$Ç$Ç,Æ,Æ § § ç ç55,ç,ç § § § § e …(¥(¥ e …$¥$¥ † † … e¥¥ e … † †$¥$¥$¥$¥ † †(¥(¥ † † § §(¥(¥ e … † †¥¥$¥$¥ † † † † § §,¥,¥0ç0ç,é,é(¥(¥,Æ,Æ † † § §(¥(¥(¥(¥(¥(¥ e … e … † † „ ddd … e„„…edd$¥$¥dd$Æ$Æ,Æ,Æ5m5m--,¥,¥0Æ0Æ,¥,¥,Æ,Æ,Æ,Æ,Æ,Æ,ç,ç,Æ,Æ § §(ç(ç$Æ$Æ † †-l-l5)5)$Ç$Ç § § e …$¥$¥ † † † † … e ¥ ¥ e …dd$¥$¥ † † † †(¥(¥ † †(¥(¥ † † § §(¥(¥ † †…edd¥¥ † † † †,¥,¥,Æ,Æ11$Ç$Ç,¥,¥ e …e…dddd¥¥ † † … e ¥ ¥ e …dd ¥ ¥dddd¥¥dd(¥(¥ † †559m5m$Ç$Ç,¥,¥,¥,¥,Æ,Æ$Ç$Ç,¥,¥0Æ0Æ,ç,ç$Æ$Æ$Ç$Ç,Æ,Æ § § ç ç55,ç,ç § § § § e …(¥(¥ e …$¥$¥ † † … e¥¥ e … † †$¥$¥$¥$¥ † †(¥(¥ † † § §(¥(¥ e … † †¥¥$¥$¥ † † † † § §,¥,¥0ç0ç,é,é(¥(¥,Æ,Æ † † § §(¥(¥(¥(¥(¥(¥ e … e … † † „ ddd … e„„…edd$¥$¥dd$Æ$Æ,Æ,Æ5m5m--,¥,¥0Æ0Æ,¥,¥,Æ,Æ,Æ,Æ,Æ,Æ,ç,ç,Æ,Æ § §(ç(ç$Æ$Æ † †-l-l5)5)$Ç$Ç § § e …$¥$¥ † † † † … e ¥ ¥ e …dd$¥$¥ † † † †(¥(¥ † †(¥(¥ † † § §(¥(¥ † †…edd¥¥ † † † †,¥,¥,Æ,Æ11$Ç$Ç,¥,¥ e …e…dddddd „ „ … e„„ … e„d¥¥ e …dd¥¥ † † † †(¥(¥-*1*-*1* ¥ ¥,¥,¥0Æ0Æ,Æ,Æ0Æ0Æ0Æ0Æ0ç0ç0ç0ç$Ç$Ç,Æ,Æ ç ç § § ç ç1L1L--(¥(¥ † †$¥$¥ e …¥¥ e …¥¥ e …¥¥ † †¥¥ † †(¥(¥ † †$¥$¥ † † § §(¥(¥ e … Æ Æ † † † † † †$¥$¥ † †,¥,¥,é,é$Ç$Ç,Æ,Æ,¥,¥$Ç$Ç(¥(¥ § §(¥(¥ † † † †dddd$¥$¥d„e…$¥$¥dd¥¥ e …$¥$¥ † †0ç0ç1L1L § §(¥(¥0Æ0Æ,Æ,Æ,Æ,Æ0Æ0Æ0Æ0Æ0ç0ç$Ç$Ç(ç(ç$Æ$Æ$Ç$Ç Æ Æ-*1*-*1* § §(¥(¥ † †$¥$¥ e … „ „¥¥ † †dd † †¥¥ † †(¥(¥ † †(¥(¥ † †(¥(¥ † †$¥$¥ † † † †„„ † † † †(¥(¥ § §,¥,¥11$Ç$Ç,¥,¥ § §$¥$¥ e …dddd „ „ … e„„ … e„d¥¥ e …dd¥¥ † † † †(¥(¥-*1*-*1* ¥ ¥,¥,¥0Æ0Æ,Æ,Æ0Æ0Æ0Æ0Æ0ç0ç0ç0ç$Ç$Ç,Æ,Æ ç ç § § ç ç1L1L--(¥(¥ † †$¥$¥ e …¥¥ e …¥¥ e …¥¥ † †¥¥ † †(¥(¥ † †$¥$¥ † † § §(¥(¥ e … Æ Æ † † † † † †$¥$¥ † †,¥,¥,é,é$Ç$Ç,Æ,Æ,¥,¥$Ç$Ç(¥(¥ § §(¥(¥ † † † †dddd$¥$¥d„e…$¥$¥dd¥¥ e …$¥$¥ † †0ç0ç1L1L § §(¥(¥0Æ0Æ,Æ,Æ,Æ,Æ0Æ0Æ0Æ0Æ0ç0ç$Ç$Ç(ç(ç$Æ$Æ$Ç$Ç Æ Æ-*1*-*1* § §(¥(¥ † †$¥$¥ e … „ „¥¥ † †dd † †¥¥ † †(¥(¥ † †(¥(¥ † †(¥(¥ † †$¥$¥ † † † †„„ † † † †(¥(¥ § §,¥,¥11$Ç$Ç,¥,¥ § §$¥$¥ e …dd„„†fdd¥¥dddd¥¥e…¥¥e… e …dd$¥$¥11-l-l e …,Å,Å0Æ0Æ,Æ,Æ0Æ0Æ0ç0ç0Æ0Æ0ç0ç0ç0ç § §$Ç$ÇÆÆ,é,é1L1L(ç(ç § §(¥(¥ e … † †¥¥ e … e …¥¥ † †dd$¥$¥ † † † †$¥$¥ † †$¥$¥ † † § § † †dd § § ¥ ¥ † † † †(¥(¥ † †0Æ0Æ-*1* § §(¥(¥ † †(¥(¥ § § † †(¥(¥e… † †dd…edddd¥¥ e …e…¥¥ e … e … § §55 § §(Å(Å0Æ0Æ,¥,¥0ç0ç0Æ0Æ0ç0ç0ç0ç0Æ0Æ$Ç$Ç(ç(ç † † ç ç1L1L11 § § † † † † † † ¥ ¥ e … e …¥¥ e …¥¥ † † † †(¥(¥ † †$¥$¥ † † † †$Æ$Æ † † … e¥¥d„ † † § § † †(¥(¥,¥,¥) -) -$Ç$Ç,¥,¥ † †dddddd„„†fdd¥¥dddd¥¥e…¥¥e… e …dd$¥$¥11-l-l e …,Å,Å0Æ0Æ,Æ,Æ0Æ0Æ0ç0ç0Æ0Æ0ç0ç0ç0ç § §$Ç$ÇÆÆ,é,é1L1L(ç(ç § §(¥(¥ e … † †¥¥ e … e …¥¥ † †dd$¥$¥ † † † †$¥$¥ † †$¥$¥ † † § § † †dd § § ¥ ¥ † † † †(¥(¥ † †0Æ0Æ-*1* § §(¥(¥ † †(¥(¥ § § † †(¥(¥e… † †dd…edddd¥¥ e …e…¥¥ e … e … § §55 § §(Å(Å0Æ0Æ,¥,¥0ç0ç0Æ0Æ0ç0ç0ç0ç0Æ0Æ$Ç$Ç(ç(ç † † ç ç1L1L11 § § † † † † † † ¥ ¥ e … e …¥¥ e …¥¥ † † † †(¥(¥ † †$¥$¥ † † † †$Æ$Æ † † … e¥¥d„ † † § § † †(¥(¥,¥,¥) -) -$Ç$Ç,¥,¥ † †dddddd„d „ „…edd¥¥dddd…e … e¥¥dd$¥$¥ † †%%1L1L,ç,ç0Æ0Æ5595========55 § §(ç(ç † †%%-*1* § §(¥(¥ † †¥¥$¥$¥e… e …¥¥e… † †$¥$¥ e …¥¥ † †(¥(¥ † † † † § § e … ¥ ¥$¥$¥ e …¥¥ e …$¥$¥ † †,¥,¥0ç0ç) -) -,¥,¥$Ç$Ç † †(¥(¥ § §(¥(¥ e … d „dddd¥¥dd¥¥e…dd¥¥e…dd$¥$¥ § §1L1L--0ç0ç4ç4ç95========55$Ç$Ç § §$Æ$Æ § §1L1L$Ç$Ç$Æ$Æ § §$¥$¥ e … e …¥¥e… † †dd$¥$¥¥¥ † † † †$¥$¥ † †$¥$¥ † † † †$¥$¥e… e …dd¥¥ † †(¥(¥ † †0Æ0Æ-*1*,é,é(¥(¥ e …dd „ „dd„d „ „…edd¥¥dddd…e … e¥¥dd$¥$¥ † †%%1L1L,ç,ç0Æ0Æ5595========55 § §(ç(ç † †%%-*1* § §(¥(¥ † †¥¥$¥$¥e… e …¥¥e… † †$¥$¥ e …¥¥ † †(¥(¥ † † † † § § e … ¥ ¥$¥$¥ e …¥¥ e …$¥$¥ † †,¥,¥0ç0ç) -) -,¥,¥$Ç$Ç † †(¥(¥ § §(¥(¥ e … d „dddd¥¥dd¥¥e…dd¥¥e…dd$¥$¥ § §1L1L--0ç0ç4ç4ç95========55$Ç$Ç § §$Æ$Æ § §1L1L$Ç$Ç$Æ$Æ § §$¥$¥ e … e …¥¥e… † †dd$¥$¥¥¥ † † † †$¥$¥ † †$¥$¥ † † † †$¥$¥e… e …dd¥¥ † †(¥(¥ † †0Æ0Æ-*1*,é,é(¥(¥ e …dd „ „dd „ „dddd „ „dddd„„dddd „ „¥¥ † †(¥(¥,é,é1L1L ç ç,Æ,Æ † † § §,é,é55$Ç$Ç,Æ,Æ$Ç$Çdd†f¥¥%%) -) -(¥(¥ † †$¥$¥ e … e …¥¥e… e …dd „ „…e$¥$¥ † †$„$„ † †(¥(¥ † †$¥$¥ † †dd$¥$¥ e …e…$¥$¥ † †(¥(¥(¥(¥,é,é5k5k § §(¥(¥(¥(¥ † †(¥(¥ † †(¥(¥ † † … eƒd ¥ ¥dddddc¥¥dd † † ¥ ¥(¥(¥ § §1L1L,é,é ç ç(¥(¥ † †,é,é,é,é,é,é,Æ,Æ$Ç$Ç(¥(¥d„¥¥ § §)K)K$Æ$Æ † †(¥(¥dd$¥$¥e…dd … e „ „¥¥ e … e …¥¥$„$„ † †(¥(¥ † †(¥(¥ † †dd … e „ „¥¥ † †$¥$¥ † †(¥(¥,¥,¥-*1*,é,é(¥(¥(¥(¥dddddd „ „dddd „ „dddd„„dddd „ „¥¥ † †(¥(¥,é,é1L1L ç ç,Æ,Æ † † § §,é,é55$Ç$Ç,Æ,Æ$Ç$Çdd†f¥¥%%) -) -(¥(¥ † †$¥$¥ e … e …¥¥e… e …dd „ „…e$¥$¥ † †$„$„ † †(¥(¥ † †$¥$¥ † †dd$¥$¥ e …e…$¥$¥ † †(¥(¥(¥(¥,é,é5k5k § §(¥(¥(¥(¥ † †(¥(¥ † †(¥(¥ † † … eƒd ¥ ¥dddddc¥¥dd † † ¥ ¥(¥(¥ § §1L1L,é,é ç ç(¥(¥ † †,é,é,é,é,é,é,Æ,Æ$Ç$Ç(¥(¥d„¥¥ § §)K)K$Æ$Æ † †(¥(¥dd$¥$¥e…dd … e „ „¥¥ e … e …¥¥$„$„ † †(¥(¥ † †(¥(¥ † †dd … e „ „¥¥ † †$¥$¥ † †(¥(¥,¥,¥-*1*,é,é(¥(¥(¥(¥dddd ç ç § §$Ç$Ç!!f† ç ç § § ç ç ç ç ç ç § § § § § §$Ç$Ç)K)K-*1*e…e…„„ddd df† § §e… § §)K)K) -) -) -) -)K)K1L1L ç ç § § § § ç ç § § § §f†¥¥f†f† § § ç ç § § § § § § § § § § † †$Æ$Æ † † § § † † † † § §$Ç$Ç,é,é$Ç$Ç5595-*1*,é,é) -) -,é,é,é,é,é,é,é,é$Ç$Ç † † † ††fÆÆ¥¥ † ††f § § Æ Æ § § § §-*1*55%%d„d dd„d dd„f†f†ÆÆ!!1L1L) -) -) -) -95!!$Ç$Ç § § § § § § § §ÆÆf†f†f† Æ Æ § § § § § § § § § § § § † † § § † † † † Æ Æf† Æ Æ$Ç$Ç,é,é$Ç$Ç,é,é5k5k9m5m) -) -,é,é) -) -,é,é ç ç § §$Ç$Ç!!f† ç ç § § ç ç ç ç ç ç § § § § § §$Ç$Ç)K)K-*1*e…e…„„ddd df† § §e… § §)K)K) -) -) -) -)K)K1L1L ç ç § § § § ç ç § § § §f†¥¥f†f† § § ç ç § § § § § § § § § § † †$Æ$Æ † † § § † † † † § §$Ç$Ç,é,é$Ç$Ç5595-*1*,é,é) -) -,é,é,é,é,é,é,é,é$Ç$Ç † † † ††fÆÆ¥¥ † ††f § § Æ Æ § § § §-*1*55%%d„d dd„d dd„f†f†ÆÆ!!1L1L) -) -) -) -95!!$Ç$Ç § § § § § § § §ÆÆf†f†f† Æ Æ § § § § § § § § § § § § † † § § † † † † Æ Æf† Æ Æ$Ç$Ç,é,é$Ç$Ç,é,é5k5k9m5m) -) -,é,é) -) -,é,é559k5k559k5k1L1LAïAï551)1)1L1L-)-)) -) -)K)K-*1*)J)J5m5m9k5k-*1*-*1*-*1*) -) -1*-*1Œ1Œ1L1L11=Ž=Ž=ï=ï559k5k=Ž=Ž5k5k95559Ž5551Œ1Œ=¯A°=ð=ð551Œ1Œ551Œ1Œ=¯A°55595559Ž551Œ1Œ5m5m=Ž=ŽIðEð=ð=ð55A¯=°AÏ=°=Ž=Ž=¯A°=Ž=Ž=Ž=Ž=Œ=Œ=Ž=Ž=Ž=Ž=Ž=Ž=Œ=Œ5m5m=Ž=Ž5m5m=Œ=Œ=ð=ð5J5J,é,é-*1*-)-))K)K11)K)K-*1*-*1*1Œ1Œ5J5J1L1L111L1L) -) -)K)K1L1L5k5k9555A°=¯=Œ=Œ5m5m9Ž55k5k=Œ=Œ55955Ž59555AòAñ5Œ5Œ95=Œ=Œ-l-l55=ð=ð55955Ž5955Ž51L1L5Œ5ŒIðIðAòAñ5595AðAð=Ž=Ž=¯A°=Ž=Ž=Ž=Ž=Œ=Œ=Ž=Ž=Œ=Œ55=Œ=Œ595k5k595k5k1L1LAïAï551)1)1L1L-)-)) -) -)K)K-*1*)J)J5m5m9k5k-*1*-*1*-*1*) -) -1*-*1Œ1Œ1L1L11=Ž=Ž=ï=ï559k5k=Ž=Ž5k5k95559Ž5551Œ1Œ=¯A°=ð=ð551Œ1Œ551Œ1Œ=¯A°55595559Ž551Œ1Œ5m5m=Ž=ŽIðEð=ð=ð55A¯=°AÏ=°=Ž=Ž=¯A°=Ž=Ž=Ž=Ž=Œ=Œ=Ž=Ž=Ž=Ž=Ž=Ž=Œ=Œ5m5m=Ž=Ž5m5m=Œ=Œ=ð=ð5J5J,é,é-*1*-)-))K)K11)K)K-*1*-*1*1Œ1Œ5J5J1L1L111L1L) -) -)K)K1L1L5k5k9555A°=¯=Œ=Œ5m5m9Ž55k5k=Œ=Œ55955Ž59555AòAñ5Œ5Œ95=Œ=Œ-l-l55=ð=ð55955Ž5955Ž51L1L5Œ5ŒIðIðAòAñ5595AðAð=Ž=Ž=¯A°=Ž=Ž=Ž=Ž=Œ=Œ=Ž=Ž=Œ=Œ55=Œ=Œ(¥(¥,Æ,Æ(¥(¥,¥,¥,Æ,ÆAðAð)J)J e …$¥$¥$„$„ … e … e ¥ ¥(¥(¥(¥(¥$¥$¥ † † § §$Æ$Æ$Æ$Æ § §$Æ$Æ § §(¥(¥(ç(ç(¥(¥ † †$„$„$¥$¥$¥$¥$¥$¥ ¥ ¥(¥(¥,¥,¥(¥(¥5k5kAòAñ,é,é(¥(¥ Æ Æ(¥(¥$¥$¥$¥$¥$¥$¥$¥$¥ † †(¥(¥(¥(¥(¥(¥,ç,ç=¯A°5J5J(ç(ç(ç(ç,Æ,Æ(ç(ç$Ç$Ç,Æ,Æ,Æ,Æ † †$Æ$Æ § §,¥,¥,ç,ç,Æ,Æ,¥,¥,Æ,Æ0Æ0Æ55--$„$„ † †$„$„(¥(¥ e … e … ¥ ¥(¥(¥ † †(¥(¥$¥$¥ § §$Æ$Æ § §(¥(¥ † †(ç(ç(¥(¥(ç(ç § §$¥$¥$„$„ † †$¥$¥(¥(¥ † †(¥(¥,¥,¥(¥(¥11AðAð1L1L(¥(¥ § §(¥(¥ Æ Æ(¥(¥$¥$¥ † † ¥ ¥(¥(¥$¥$¥(¥(¥,Æ,Æ5m5m9Œ5Œ--,ç,ç$Ç$Ç,Æ,Æ$Ç$Ç,Æ,Æ,Æ,Æ § §(¥(¥ § §(¥(¥,Æ,Æ(¥(¥,Æ,Æ(¥(¥,¥,¥,Æ,ÆAðAð)J)J e …$¥$¥$„$„ … e … e ¥ ¥(¥(¥(¥(¥$¥$¥ † † § §$Æ$Æ$Æ$Æ § §$Æ$Æ § §(¥(¥(ç(ç(¥(¥ † †$„$„$¥$¥$¥$¥$¥$¥ ¥ ¥(¥(¥,¥,¥(¥(¥5k5kAòAñ,é,é(¥(¥ Æ Æ(¥(¥$¥$¥$¥$¥$¥$¥$¥$¥ † †(¥(¥(¥(¥(¥(¥,ç,ç=¯A°5J5J(ç(ç(ç(ç,Æ,Æ(ç(ç$Ç$Ç,Æ,Æ,Æ,Æ † †$Æ$Æ § §,¥,¥,ç,ç,Æ,Æ,¥,¥,Æ,Æ0Æ0Æ55--$„$„ † †$„$„(¥(¥ e … e … ¥ ¥(¥(¥ † †(¥(¥$¥$¥ § §$Æ$Æ § §(¥(¥ † †(ç(ç(¥(¥(ç(ç § §$¥$¥$„$„ † †$¥$¥(¥(¥ † †(¥(¥,¥,¥(¥(¥11AðAð1L1L(¥(¥ § §(¥(¥ Æ Æ(¥(¥$¥$¥ † † ¥ ¥(¥(¥$¥$¥(¥(¥,Æ,Æ5m5m9Œ5Œ--,ç,ç$Ç$Ç,Æ,Æ$Ç$Ç,Æ,Æ,Æ,Æ § §(¥(¥ § §(¥(¥,Æ,Æ(¥(¥,Æ,Æ § §$Æ$Æ,¥,¥5m5m,é,é$¥$¥$„$„ † †$¥$¥$d$„$¥$¥(¥(¥ † †$„$„ † †(¥(¥(¥(¥ † †(¥(¥ § §(¥(¥(¥(¥,Æ,Æ § §(¥(¥$¥$¥ † †(¥(¥ e …(¥(¥,Å,Å,Æ,Æ,Æ,Æ5J5JIðEð--(¥(¥ § §$„$„ § §(¥(¥ † †(¥(¥(¥(¥ † †(¥(¥,¥,¥5595 § §,Æ,Æ(¥(¥,¥,¥ § §(¥(¥,¥,¥ † †$Æ$Æ § §(¥(¥ † †,¥,¥,¥,¥,Æ,Æ,Æ,Æ,Æ,Æ1L1L11 † †$„$d(¥(¥ † †$„$„(¥(¥ e …(¥(¥ † †$¥$¥(¥(¥$¥$¥$¥$¥(¥(¥ † †,Æ,Æ § §(¥(¥ § §,¥,¥(¥(¥ † †$¥$¥$¥$¥ e …$¥$¥,¥,¥,Æ,Æ,Å,Å11AðAð5k5k(¥(¥$Æ$Æ(¥(¥(¥(¥ † †(¥(¥ § §$d$„(¥(¥ § §,¥,¥,¥,¥=Ž=Ž-*1*(¥(¥(¥(¥,¥,¥ § §(¥(¥,¥,¥ § §(¥(¥ † †$Æ$Æ(¥(¥,¥,¥(¥(¥,Æ,Æ § §$Æ$Æ,¥,¥5m5m,é,é$¥$¥$„$„ † †$¥$¥$d$„$¥$¥(¥(¥ † †$„$„ † †(¥(¥(¥(¥ † †(¥(¥ § §(¥(¥(¥(¥,Æ,Æ § §(¥(¥$¥$¥ † †(¥(¥ e …(¥(¥,Å,Å,Æ,Æ,Æ,Æ5J5JIðEð--(¥(¥ § §$„$„ § §(¥(¥ † †(¥(¥(¥(¥ † †(¥(¥,¥,¥5595 § §,Æ,Æ(¥(¥,¥,¥ § §(¥(¥,¥,¥ † †$Æ$Æ § §(¥(¥ † †,¥,¥,¥,¥,Æ,Æ,Æ,Æ,Æ,Æ1L1L11 † †$„$d(¥(¥ † †$„$„(¥(¥ e …(¥(¥ † †$¥$¥(¥(¥$¥$¥$¥$¥(¥(¥ † †,Æ,Æ § §(¥(¥ § §,¥,¥(¥(¥ † †$¥$¥$¥$¥ e …$¥$¥,¥,¥,Æ,Æ,Å,Å11AðAð5k5k(¥(¥$Æ$Æ(¥(¥(¥(¥ † †(¥(¥ § §$d$„(¥(¥ § §,¥,¥,¥,¥=Ž=Ž-*1*(¥(¥(¥(¥,¥,¥ § §(¥(¥,¥,¥ § §(¥(¥ † †$Æ$Æ(¥(¥,¥,¥(¥(¥$Æ$Æ(¥(¥ † †,¥,¥-*1*,é,é e …$¥$¥$d$„$„$„(¥(¥$¥$¥$„$„ † †$„$d(¥(¥(¥(¥ † †$¥$¥$„$„(¥(¥ § §(¥(¥(¥(¥(¥(¥(¥(¥$¥$¥$¥$¥(¥(¥(¥(¥,Æ,Æ,Æ,Æ,Å,Å,¥,¥5k5kA¯=°$Ç$Ç$Æ$Æ(¥(¥ † †(¥(¥ † †(¥(¥ † † † †(¥(¥ § §(¥(¥,é,é=¯A°,æ,ç,¥,¥,¥,¥,¥,¥ § §(¥(¥,¥,¥,Æ,Æ,¥,¥ § §(¥(¥ † †$Æ$Æ$Ç$Ç,¥,¥,é,é0ç0ç1L1L-*1*$d$„(¥(¥$„$„$„$„ † †$„$„(¥(¥$„$„ † †$„$„(¥(¥ † †$„$„ † †$„$„$¥$¥(¥(¥(¥(¥(¥(¥,Æ,Æ$¥$¥$¥$¥ ¥ ¥(¥(¥(¥(¥,¥,¥,Æ,Æ,Å,Å,Å,Å11=¯A°-*1*(¥(¥ § §(¥(¥ † †(¥(¥ † †(¥(¥(¥(¥ † †(¥(¥(¥(¥,¥,¥5m5m1L1L,¥,¥,¥,¥,¥,¥,¥,¥ § §,Æ,Æ(¥(¥(¥(¥,Æ,Æ † † § §(¥(¥(¥(¥$Æ$Æ(¥(¥ † †,¥,¥-*1*,é,é e …$¥$¥$d$„$„$„(¥(¥$¥$¥$„$„ † †$„$d(¥(¥(¥(¥ † †$¥$¥$„$„(¥(¥ § §(¥(¥(¥(¥(¥(¥(¥(¥$¥$¥$¥$¥(¥(¥(¥(¥,Æ,Æ,Æ,Æ,Å,Å,¥,¥5k5kA¯=°$Ç$Ç$Æ$Æ(¥(¥ † †(¥(¥ † †(¥(¥ † † † †(¥(¥ § §(¥(¥,é,é=¯A°,æ,ç,¥,¥,¥,¥,¥,¥ § §(¥(¥,¥,¥,Æ,Æ,¥,¥ § §(¥(¥ † †$Æ$Æ$Ç$Ç,¥,¥,é,é0ç0ç1L1L-*1*$d$„(¥(¥$„$„$„$„ † †$„$„(¥(¥$„$„ † †$„$„(¥(¥ † †$„$„ † †$„$„$¥$¥(¥(¥(¥(¥(¥(¥,Æ,Æ$¥$¥$¥$¥ ¥ ¥(¥(¥(¥(¥,¥,¥,Æ,Æ,Å,Å,Å,Å11=¯A°-*1*(¥(¥ § §(¥(¥ † †(¥(¥ † †(¥(¥(¥(¥ † †(¥(¥(¥(¥,¥,¥5m5m1L1L,¥,¥,¥,¥,¥,¥,¥,¥ § §,Æ,Æ(¥(¥(¥(¥,Æ,Æ † † § §(¥(¥(¥(¥ † †(¥(¥(¥(¥ § §55) -) -$„$„$„$„$„$„(¥(¥$„$„(¥(¥(¥(¥(¥(¥(¥(¥$„$„ † †$„$d$¥$¥$¥$¥(¥(¥(¥(¥,¥,¥,¥,¥(¥(¥(¥(¥(¥(¥(¥(¥,Æ,Æ,¥,¥,Æ,Æ,Æ,Æ,Æ,Æ,Å,Å55A°=¯$Ç$Ç(¥(¥ † † † †$„$„ † †(¥(¥$¥$¥ † †(¥(¥$¥$¥(¥(¥0ç0ç=Ž=Ž11,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥ § §(¥(¥,Æ,Æ(¥(¥ † † § § § §(¥(¥$Ç$Ç$Ç$Ç,é,é5k5k) -) -$d$„$„$„(¥(¥$d$„$d$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$d$„(¥(¥ e …(¥(¥ † †(¥(¥$d$„,¥,¥,¥,¥(ç(ç(¥(¥(¥(¥(¥(¥,¥,¥,¥,¥0ç0ç,Å,Å,Æ,Æ,Å,Å1)1)AðAð)K)K(¥(¥ † † † †$„$„ † †(¥(¥ † †$¥$¥ † †(¥(¥ § §(¥(¥=Œ=Œ5k5k,¥,¥,¥,¥,¥,¥,Æ,Æ(¥(¥(¥(¥,¥,¥,Æ,Æ(¥(¥ † †(¥(¥(¥(¥(¥(¥ † †(¥(¥(¥(¥ § §55) -) -$„$„$„$„$„$„(¥(¥$„$„(¥(¥(¥(¥(¥(¥(¥(¥$„$„ † †$„$d$¥$¥$¥$¥(¥(¥(¥(¥,¥,¥,¥,¥(¥(¥(¥(¥(¥(¥(¥(¥,Æ,Æ,¥,¥,Æ,Æ,Æ,Æ,Æ,Æ,Å,Å55A°=¯$Ç$Ç(¥(¥ † † † †$„$„ † †(¥(¥$¥$¥ † †(¥(¥$¥$¥(¥(¥0ç0ç=Ž=Ž11,¥,¥,¥,¥,¥,¥,¥,¥,¥,¥ § §(¥(¥,Æ,Æ(¥(¥ † † § § § §(¥(¥$Ç$Ç$Ç$Ç,é,é5k5k) -) -$d$„$„$„(¥(¥$d$„$d$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$d$„(¥(¥ e …(¥(¥ † †(¥(¥$d$„,¥,¥,¥,¥(ç(ç(¥(¥(¥(¥(¥(¥,¥,¥,¥,¥0ç0ç,Å,Å,Æ,Æ,Å,Å1)1)AðAð)K)K(¥(¥ † † † †$„$„ † †(¥(¥ † †$¥$¥ † †(¥(¥ § §(¥(¥=Œ=Œ5k5k,¥,¥,¥,¥,¥,¥,Æ,Æ(¥(¥(¥(¥,¥,¥,Æ,Æ(¥(¥ † †(¥(¥(¥(¥$¥$¥(¥(¥ † †(¥(¥$Ç$Ç55) -) - e …$„$„$„$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$„$„ † †(¥(¥$¥$¥$d$„,¥,¥(¥(¥(¥(¥,Å,Å0ç0ç,¥,¥,Æ,Æ,Æ,Æ(¥(¥,Æ,Æ(¥(¥0ç0ç,Å,Å0ç0ç,Æ,Æ5J5JAðAð)) † †(¥(¥ † †(¥(¥ † † † † … e$¥$¥$¥$¥ † †(¥(¥0ç0ç5m5m--,¥,¥0ç0ç(¥(¥,¥,¥,¥,¥,¥,¥,Æ,Æ(¥(¥(¥(¥ † †$Æ$Æ § §(¥(¥ § §,Æ,Æ$Ç$Ç=Ž=Ž1)1)$d$„(¥(¥$d$„$„$„$„$d(¥(¥(¥(¥(¥(¥(¥(¥$„$„(¥(¥ e …(¥(¥(¥(¥$„$„(¥(¥(¥(¥,¥,¥0ç0ç,¥,¥(¥(¥,Æ,Æ,¥,¥,Æ,Æ,Å,Å,Æ,Æ,Æ,Æ0ç0ç,Å,Å--=¯A°-*1* § §(¥(¥ † †(¥(¥ † † … e ¥ ¥$¥$¥ † †$¥$¥(¥(¥(¥(¥5k5k1L1L,¥,¥0Æ0Æ,¥,¥,¥,¥,¥,¥ § §,¥,¥,¥,¥,Æ,Æ † †$Æ$Æ † †$¥$¥(¥(¥ † †(¥(¥$Ç$Ç55) -) - e …$„$„$„$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$„$„ † †(¥(¥$¥$¥$d$„,¥,¥(¥(¥(¥(¥,Å,Å0ç0ç,¥,¥,Æ,Æ,Æ,Æ(¥(¥,Æ,Æ(¥(¥0ç0ç,Å,Å0ç0ç,Æ,Æ5J5JAðAð)) † †(¥(¥ † †(¥(¥ † † † † … e$¥$¥$¥$¥ † †(¥(¥0ç0ç5m5m--,¥,¥0ç0ç(¥(¥,¥,¥,¥,¥,¥,¥,Æ,Æ(¥(¥(¥(¥ † †$Æ$Æ § §(¥(¥ § §,Æ,Æ$Ç$Ç=Ž=Ž1)1)$d$„(¥(¥$d$„$„$„$„$d(¥(¥(¥(¥(¥(¥(¥(¥$„$„(¥(¥ e …(¥(¥(¥(¥$„$„(¥(¥(¥(¥,¥,¥0ç0ç,¥,¥(¥(¥,Æ,Æ,¥,¥,Æ,Æ,Å,Å,Æ,Æ,Æ,Æ0ç0ç,Å,Å--=¯A°-*1* § §(¥(¥ † †(¥(¥ † † … e ¥ ¥$¥$¥ † †$¥$¥(¥(¥(¥(¥5k5k1L1L,¥,¥0Æ0Æ,¥,¥,¥,¥,¥,¥ § §,¥,¥,¥,¥,Æ,Æ † †$Æ$Æ † †$„$„ † †(¥(¥(¥(¥,Æ,Æ,é,é,é,éc„ e …$d$„$d$„ ¥ ¥$„$„$„$d(¥(¥ e …$„$„$„$„(¥(¥$¥$¥(¥(¥,¥,¥,¥,¥,¥,¥,¥,¥(¥(¥$¥$¥(¥(¥,¥,¥,Æ,Æ(¥(¥,Å,Å,Æ,Æ(¥(¥,¥,¥-)-)=Ž=Ž) -) - ¥ ¥(¥(¥ † † … e$¥$¥ † † ¥ ¥(¥(¥ † †(¥(¥ † †(¥(¥5m5m,é,é,¥,¥,¥,¥,¥,¥,Æ,Æ,¥,¥,¥,¥(¥(¥,Æ,Æ,¥,¥(¥(¥ † †(¥(¥ † †,Æ,Æ † †(ç(ç1L1L11 e …$d$„$„$„ … e$„$„ … e$¥$¥$„$„$„$d(¥(¥ d „$„$„ † †$„$„(¥(¥,¥,¥(¥(¥,¥,¥,¥,¥,¥,¥$¥$¥(¥(¥,Æ,Æ,¥,¥,Æ,Æ(¥(¥,Å,Å,Å,Å(¥(¥,ç,ç559Ž5$d$„(¥(¥ † † … e Æ Æ$„$„ … e$¥$¥$¥$¥ † † § § d „-*1*-*1*,¥,¥,¥,¥,Æ,Æ,¥,¥,Æ,Æ(¥(¥,¥,¥,Å,Å,¥,¥(¥(¥ e …$d$„$„$„ † †(¥(¥(¥(¥,Æ,Æ,é,é,é,éc„ e …$d$„$d$„ ¥ ¥$„$„$„$d(¥(¥ e …$„$„$„$„(¥(¥$¥$¥(¥(¥,¥,¥,¥,¥,¥,¥,¥,¥(¥(¥$¥$¥(¥(¥,¥,¥,Æ,Æ(¥(¥,Å,Å,Æ,Æ(¥(¥,¥,¥-)-)=Ž=Ž) -) - ¥ ¥(¥(¥ † † … e$¥$¥ † † ¥ ¥(¥(¥ † †(¥(¥ † †(¥(¥5m5m,é,é,¥,¥,¥,¥,¥,¥,Æ,Æ,¥,¥,¥,¥(¥(¥,Æ,Æ,¥,¥(¥(¥ † †(¥(¥ † †,Æ,Æ † †(ç(ç1L1L11 e …$d$„$„$„ … e$„$„ … e$¥$¥$„$„$„$d(¥(¥ d „$„$„ † †$„$„(¥(¥,¥,¥(¥(¥,¥,¥,¥,¥,¥,¥$¥$¥(¥(¥,Æ,Æ,¥,¥,Æ,Æ(¥(¥,Å,Å,Å,Å(¥(¥,ç,ç559Ž5$d$„(¥(¥ † † … e Æ Æ$„$„ … e$¥$¥$¥$¥ † † § § d „-*1*-*1*,¥,¥,¥,¥,Æ,Æ,¥,¥,Æ,Æ(¥(¥,¥,¥,Å,Å,¥,¥(¥(¥ e …$d$„ § §$Ç$Ç$Ç$Ç,é,é1L1L5m5m-l-l$Ç$Ç § § ç ç § § § § § §%%) -) -$Ç$Ç%%$Ç$Ç) -) -$Ç$Ç1*-*$Ç$Ç,é,é%%$Ç$Ç%%$Ç$Ç%%$Ç$Ç)),é,é)K)K-*1*5k5k=Œ=Œ5595-*1* † †$Ç$Ç$Ç$Ç ç ç%%!!$Ç$Ç) -) -!!!!1L1L55A¯=°1L1L551)1),é,é4ç4ç1111) -) -951L1L-*1*-*1*,é,é$Ç$Ç-*1*)K)K,é,é1Œ1Œ1L1L,ç,ç--,é,é † † ç ç § § § §$Ç$Ç) -) -!!,é,é%%,é,é%%) -) -,é,é%%11!!$Ç$Ç$Ç$Ç%%$Ç$Ç$Ç$Ç) -) -) -) -1*-*1L1L=Œ=Œ559n5m1Œ1Œ § § § §)) § §!!) -) -!!) -) -$Ç$Ç!!-*1*5n5mA¯=°11,è,é$Ç$Ç$Ç$Ç!!,é,é%%) -) -11) -) -) -) -) -) -) -) - § §$Ç$Ç$Ç$Ç,é,é1L1L5m5m-l-l$Ç$Ç § § ç ç § § § § § §%%) -) -$Ç$Ç%%$Ç$Ç) -) -$Ç$Ç1*-*$Ç$Ç,é,é%%$Ç$Ç%%$Ç$Ç%%$Ç$Ç)),é,é)K)K-*1*5k5k=Œ=Œ5595-*1* † †$Ç$Ç$Ç$Ç ç ç%%!!$Ç$Ç) -) -!!!!1L1L55A¯=°1L1L551)1),é,é4ç4ç1111) -) -951L1L-*1*-*1*,é,é$Ç$Ç-*1*)K)K,é,é1Œ1Œ1L1L,ç,ç--,é,é † † ç ç § § § §$Ç$Ç) -) -!!,é,é%%,é,é%%) -) -,é,é%%11!!$Ç$Ç$Ç$Ç%%$Ç$Ç$Ç$Ç) -) -) -) -1*-*1L1L=Œ=Œ559n5m1Œ1Œ § § § §)) § §!!) -) -!!) -) -$Ç$Ç!!-*1*5n5mA¯=°11,è,é$Ç$Ç$Ç$Ç!!,é,é%%) -) -11) -) -) -) -) -) -) -) -55AðAð=¯A°55AðAð=Ž=Ž=Ž=Ž=ï=ï1Œ1Œ=¯A°55A¯=°55115k5k951L1L1Œ1Œ1L1L551L1L1L1L1Œ1Œ559Œ5Œ11=Ž=ŽAòAñAðAð55=Ž=Ž=ï=ïAðAð=¯A°EïIïEðIðAðAð=ï=ï=Ž=ŽAðAð=ð=ðAòAñ=¯A°EðIð=ð=ðAòAñ=Ž=Ž=Ž=ŽIðEðIðEðAðAð=¯A°=ï=ï=Œ=ŒAðAð=ð=ðAòAñ=Ž=ŽAðAðAðAðAðAðJFNSN3=ð=ðIðEðAòAñJFAðAð1Œ1Œ=Ž=Ž=Ž=Ž=Ž=Ž5Œ5ŒA¯=°=Ž=ŽAðAð5511559k5k1L1L1L1L1L1L551L1L1L1L1Œ1Œ5m5m955595AðAðAðAð55=ï=ï=Ž=ŽAïAï=ï=ï=¯A°FJEðIð=Ž=ŽAðAð55IðIðAðAðAðAðAðAð=¯A°=ð=ð=¯A°9Ž=ŽAðAðIðEðAïAïAðAð=Ž=Ž=ï=ï=¯A°=ÏA°9ð=ð=¯A°=ÏA°9ð=ð=ð=ðJFNSN3AðAð59AðAð=¯A°55AðAð=Ž=Ž=Ž=Ž=ï=ï1Œ1Œ=¯A°55A¯=°55115k5k951L1L1Œ1Œ1L1L551L1L1L1L1Œ1Œ559Œ5Œ11=Ž=ŽAòAñAðAð55=Ž=Ž=ï=ïAðAð=¯A°EïIïEðIðAðAð=ï=ï=Ž=ŽAðAð=ð=ðAòAñ=¯A°EðIð=ð=ðAòAñ=Ž=Ž=Ž=ŽIðEðIðEðAðAð=¯A°=ï=ï=Œ=ŒAðAð=ð=ðAòAñ=Ž=ŽAðAðAðAðAðAðJFNSN3=ð=ðIðEðAòAñJFAðAð1Œ1Œ=Ž=Ž=Ž=Ž=Ž=Ž5Œ5ŒA¯=°=Ž=ŽAðAð5511559k5k1L1L1L1L1L1L551L1L1L1L1Œ1Œ5m5m955595AðAðAðAð55=ï=ï=Ž=ŽAïAï=ï=ï=¯A°FJEðIð=Ž=ŽAðAð55IðIðAðAðAðAðAðAð=¯A°=ð=ð=¯A°9Ž=ŽAðAðIðEðAïAïAðAð=Ž=Ž=ï=ï=¯A°=ÏA°9ð=ð=¯A°=ÏA°9ð=ð=ð=ðJFNSN3AðAð ¥ ¥ e … ¥ ¥ ¥ ¥$¥$¥dd Æ Æ$„$„ … e § §(ç(ç)K)K$¥$¥$c$„$„$„$„$„ ¥ ¥$d$„$„$„ ¥ ¥$d$„$„$„ „ „,Å,Å(ç(ç,é,é ç ç(¥(¥ ç ç(¥(¥¥¥$¥$¥$¥$¥¥¥ § §,Å,Å(ç(ç$Æ$Æ$Ç$Ç(ç(ç(¥(¥(ç(ç$Æ$Æ,Æ,Æ$Æ$Æ § §$¥$¥(¥(¥$Æ$Æ$¥$¥$¥$¥ † †(ç(ç(¥(¥1L1L))$¥$¥dd¥¥dd¥¥ † † „ „ … eÆÆ$¥$¥ e …¥¥$¥$¥ † † ¥ ¥ ¥ ¥ e … Æ Æ(¥(¥-*1* ç ç$d$„$„$„$¥$¥$d$„$¥$¥$„$„$„$d$„$„ „ „dd(¥(¥,ç,ç,ç,ç%%$¥$¥ § § ç ç ¥ ¥ ¥ ¥$¥$¥ † †(¥(¥ § §,Å,Å$Ç$Ç(ç(ç(ç(ç Æ Æ,Æ,Æ$Æ$Æ,Æ,Æ$Æ$Æ § §(¥(¥ † †$Æ$Æ(¥(¥¥¥ § §(¥(¥$Æ$Æ55) -) - ç ç † †dd „ „¥¥ † †¥¥ e … ¥ ¥ e … ¥ ¥ ¥ ¥$¥$¥dd Æ Æ$„$„ … e § §(ç(ç)K)K$¥$¥$c$„$„$„$„$„ ¥ ¥$d$„$„$„ ¥ ¥$d$„$„$„ „ „,Å,Å(ç(ç,é,é ç ç(¥(¥ ç ç(¥(¥¥¥$¥$¥$¥$¥¥¥ § §,Å,Å(ç(ç$Æ$Æ$Ç$Ç(ç(ç(¥(¥(ç(ç$Æ$Æ,Æ,Æ$Æ$Æ § §$¥$¥(¥(¥$Æ$Æ$¥$¥$¥$¥ † †(ç(ç(¥(¥1L1L))$¥$¥dd¥¥dd¥¥ † † „ „ … eÆÆ$¥$¥ e …¥¥$¥$¥ † † ¥ ¥ ¥ ¥ e … Æ Æ(¥(¥-*1* ç ç$d$„$„$„$¥$¥$d$„$¥$¥$„$„$„$d$„$„ „ „dd(¥(¥,ç,ç,ç,ç%%$¥$¥ § § ç ç ¥ ¥ ¥ ¥$¥$¥ † †(¥(¥ § §,Å,Å$Ç$Ç(ç(ç(ç(ç Æ Æ,Æ,Æ$Æ$Æ,Æ,Æ$Æ$Æ § §(¥(¥ † †$Æ$Æ(¥(¥¥¥ § §(¥(¥$Æ$Æ55) -) - ç ç † †dd „ „¥¥ † †¥¥ e … e …$d$„dƒ$„$„dd … eƒdƒd … e$„$d$Æ$Æ5J5J d „ e …$d$„$d$„ d ƒ$d$„$d$„dƒdƒdƒ e …$„$„$¥$¥5J5J † †$¥$¥dd … edddd¥¥(¥(¥dd † †$„$d$¥$¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥ † †$„$„(¥(¥ † † … e$¥$¥ e …¥¥ † †(¥(¥=Œ=Œ$Ç$Ç e …¥¥dd$¥$¥ e …¥¥dd¥¥ d „ e …$d$„$d$„dƒ e …c„c„$d$„dƒ$¥$¥-*1* § §$d$„$d$„$d$„dƒ$d$ƒ$d$„„„dc$„$d „ „„c$„$„11,é,é „ „ … edddddd ¥ ¥dd$¥$¥ e … ¥ ¥ e …$¥$¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥ † †$¥$¥$¥$¥$„$„ † † … e „ „¥¥(¥(¥-*1*1L1L$d$„dd¥¥ e … e …dd … e „ „ … e$„$d„c$„$„dd … eƒdƒd … e$„$d$Æ$Æ5J5J d „ e …$d$„$d$„ d ƒ$d$„$d$„dƒdƒdƒ e …$„$„$¥$¥5J5J † †$¥$¥dd … edddd¥¥(¥(¥dd † †$„$d$¥$¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥ † †$„$„(¥(¥ † † … e$¥$¥ e …¥¥ † †(¥(¥=Œ=Œ$Ç$Ç e …¥¥dd$¥$¥ e …¥¥dd¥¥ d „ e …$d$„$d$„dƒ e …c„c„$d$„dƒ$¥$¥-*1* § §$d$„$d$„$d$„dƒ$d$ƒ$d$„„„dc$„$d „ „„c$„$„11,é,é „ „ … edddddd ¥ ¥dd$¥$¥ e … ¥ ¥ e …$¥$¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥ † †$¥$¥$¥$¥$„$„ † † … e „ „¥¥(¥(¥-*1*1L1L$d$„dd¥¥ e … e …dd … e „ „$d$„$„$„ƒd … e$„$d„c$„$d„c „ c$„$d$Æ$Æ11dd$„$„$„$d „ ƒ$„$c$„$„ƒd$„$d„c ¥ ¥$d$„dƒ$„$„-*1*$¥$¥ e …dd „ „¥¥dd … edd ¥ ¥$„$„$¥$¥ † †$„$„ † †(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥ † † † †$„$„ † † … e „ „ … e¥¥,¥,¥5m5m,é,édd ¥ ¥dd … e„„ … e¥¥ † †dd$„$ddc$¥$¥$d$„ d ƒdƒ$d$„dƒ$d$„$d$„1)1) § § c „$„$„ ƒ d$ƒ$d$„$„$„$„ƒd$„$d„c„c … e$„$„11%%dd „ „dd¥¥dd … e ¥ ¥ e … ¥ ¥$d$„$¥$¥$¥$¥$„$„ † †(¥(¥(¥(¥(¥(¥(¥(¥ † †$„$„ † † … e$¥$¥dd¥¥ † †(¥(¥55-l-l † † … edd „ „¥¥$d$„dƒ$d$„$„$d$„$„ƒd … e$„$d„c$„$d„c „ c$„$d$Æ$Æ11dd$„$„$„$d „ ƒ$„$c$„$„ƒd$„$d„c ¥ ¥$d$„dƒ$„$„-*1*$¥$¥ e …dd „ „¥¥dd … edd ¥ ¥$„$„$¥$¥ † †$„$„ † †(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥ † † † †$„$„ † † … e „ „ … e¥¥,¥,¥5m5m,é,édd ¥ ¥dd … e„„ … e¥¥ † †dd$„$ddc$¥$¥$d$„ d ƒdƒ$d$„dƒ$d$„$d$„1)1) § § c „$„$„ ƒ d$ƒ$d$„$„$„$„ƒd$„$d„c„c … e$„$„11%%dd „ „dd¥¥dd … e ¥ ¥ e … ¥ ¥$d$„$¥$¥$¥$¥$„$„ † †(¥(¥(¥(¥(¥(¥(¥(¥ † †$„$„ † † … e$¥$¥dd¥¥ † †(¥(¥55-l-l † † … edd „ „¥¥$d$„dƒ$d$„$d$„dƒ$d$„dƒ$d$ƒdƒ d ƒ$d$„ d ƒ$„$„(ç(ç-*1* e …$„$„$„$„$„$d$„$„$„$„$„$d „ „„c$„$d „ „$„$d$„$„-*1*¥¥dd „ „dddd„„dd „ „¥¥ † †$„$„(¥(¥ † †$„$„ † †$„$d(¥(¥(¥(¥e… e … e … ¥ ¥$d$„ „ „dd$¥$¥$¥$¥(¥(¥5m5m$ç$çdddd „ „¥¥dd¥¥ d „dd … e$„$d„c$„$d$„$d„c „ c „ c$„$c$„$d$„$„-*1* § §$„$„$„$d$„$„$„$„$„$„$„$d „ „„c$„$„dd$„$„$„$d-)-) ç çdd „ „dddd „ „dd „ „dd ¥ ¥$¥$¥$„$„(¥(¥ † †$„$„(¥(¥$d$„ † †(¥(¥dd † †$„$d „ „$¥$¥dd † †$„$„(¥(¥) -) -1L1L d „dƒ „ „…e … eƒdƒd … e$„$d„c$„$d„c$„$c„c „ c$„$d „ c$„$„(ç(ç-*1* e …$„$„$„$„$„$d$„$„$„$„$„$d „ „„c$„$d „ „$„$d$„$„-*1*¥¥dd „ „dddd„„dd „ „¥¥ † †$„$„(¥(¥ † †$„$„ † †$„$d(¥(¥(¥(¥e… e … e … ¥ ¥$d$„ „ „dd$¥$¥$¥$¥(¥(¥5m5m$ç$çdddd „ „¥¥dd¥¥ d „dd … e$„$d„c$„$d$„$d„c „ c „ c$„$c$„$d$„$„-*1* § §$„$„$„$d$„$„$„$„$„$„$„$d „ „„c$„$„dd$„$„$„$d-)-) ç çdd „ „dddd „ „dd „ „dd ¥ ¥$¥$¥$„$„(¥(¥ † †$„$„(¥(¥$d$„ † †(¥(¥dd † †$„$d „ „$¥$¥dd † †$„$„(¥(¥) -) -1L1L d „dƒ „ „…e … eƒdƒd … e$d$„ d ƒdƒ$d$„ d ƒ$d$ƒ d ƒ d ƒ d ƒ$„$„(¥(¥1L1L$d$„$„$„ƒd$„$„$„$„$¥$¥$c$„$„$„$„$d „ ƒ$„$d$„$„$„$„%%dddd „ „dd„„dc „ „dd$¥$¥$„$„ † †$„$„ † †(¥(¥$d$„(¥(¥$d$„ † †$„$„ … e$„$d$„$„ … e ¥ ¥dd$¥$¥(¥(¥(¥(¥5k5k$Ç$Çd„dddddd … edddd ¥ ¥$d$„dƒ$d$„dƒ$d$„ d ƒ d ƒ d ƒ d ƒ$d$„$„$„-*1*$Ç$Ç d ƒ$„$„$„$„ƒd$¥$¥$„$„$„$d$„$„$„$d$„$„ „ „$„$d(ç(ç † †dddd „ „dddc „ „dd ¥ ¥$„$„(¥(¥ † †$„$„(¥(¥ e …(¥(¥(¥(¥$d$„(¥(¥ d „ e …$„$„ … e ¥ ¥ e … ¥ ¥$„$„(¥(¥111L1Lcddddd„„dd¥¥ d „$d$„$„$d „ c„c$„$d „ c$„$c „ c „ c „ c$„$„(¥(¥1L1L$d$„$„$„ƒd$„$„$„$„$¥$¥$c$„$„$„$„$d „ ƒ$„$d$„$„$„$„%%dddd „ „dd„„dc „ „dd$¥$¥$„$„ † †$„$„ † †(¥(¥$d$„(¥(¥$d$„ † †$„$„ … e$„$d$„$„ … e ¥ ¥dd$¥$¥(¥(¥(¥(¥5k5k$Ç$Çd„dddddd … edddd ¥ ¥$d$„dƒ$d$„dƒ$d$„ d ƒ d ƒ d ƒ d ƒ$d$„$„$„-*1*$Ç$Ç d ƒ$„$„$„$„ƒd$¥$¥$„$„$„$d$„$„$„$d$„$„ „ „$„$d(ç(ç † †dddd „ „dddc „ „dd ¥ ¥$„$„(¥(¥ † †$„$„(¥(¥ e …(¥(¥(¥(¥$d$„(¥(¥ d „ e …$„$„ … e ¥ ¥ e … ¥ ¥$„$„(¥(¥111L1Lcddddd„„dd¥¥ d „$d$„$d$„ d ƒ$d$ƒ d ƒ$d$ƒ d ƒ$d$„ d ƒ$d$ƒ$d$„$¥$¥1Œ1Œ$d$„dƒ$„$„$„$d$„$c$„$„$„$„$„$d „ c$„$„$„$„ƒd$¥$¥ § § „ „ „ „„c„cdd ¥ ¥$„$„(¥(¥$„$„(¥(¥(¥(¥(¥(¥,¥,¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥(¥(¥(¥(¥(¥(¥$d$„(¥(¥$„$„(¥(¥(¥(¥ † †(¥(¥1L1L § § e … „ „dc„„„d¥¥dd … e ƒ d ƒ d$„$d$„$c$„$c „ c „ c „ c$„$c$„$c$„$d5J5J ç ç$d$„$d$„$„$„ ƒ d$„$„$„$„$ƒ$d$„$d „ c$„$„$„$d „ ƒ(¥(¥ Æ Æc„ e …c„ „ „„c ¥ ¥$„$„(¥(¥$d$„(¥(¥,¥,¥(¥(¥ § §,¥,¥$d$„,¥,¥ † †,¥,¥(¥(¥,¥,¥(¥(¥$d$„$¥$¥$d$„(¥(¥,¥,¥ † †,é,é-*1*dƒdd„„„ddddddc$„$d$„$d „ c$„$c „ c$„$c „ c$„$d „ c$„$c$„$d$¥$¥1Œ1Œ$d$„dƒ$„$„$„$d$„$c$„$„$„$„$„$d „ c$„$„$„$„ƒd$¥$¥ § § „ „ „ „„c„cdd ¥ ¥$„$„(¥(¥$„$„(¥(¥(¥(¥(¥(¥,¥,¥(¥(¥(¥(¥(¥(¥(¥(¥,¥,¥(¥(¥(¥(¥(¥(¥$d$„(¥(¥$„$„(¥(¥(¥(¥ † †(¥(¥1L1L § § e … „ „dc„„„d¥¥dd … e ƒ d ƒ d$„$d$„$c$„$c „ c „ c „ c$„$c$„$c$„$d5J5J ç ç$d$„$d$„$„$„ ƒ d$„$„$„$„$ƒ$d$„$d „ c$„$„$„$d „ ƒ(¥(¥ Æ Æc„ e …c„ „ „„c ¥ ¥$„$„(¥(¥$d$„(¥(¥,¥,¥(¥(¥ § §,¥,¥$d$„,¥,¥ † †,¥,¥(¥(¥,¥,¥(¥(¥$d$„$¥$¥$d$„(¥(¥,¥,¥ † †,é,é-*1*dƒdd„„„ddddddc$„$d † † † † † †$¥$¥ § § † †…edddddd § §1L1L%% § §(¥(¥ † †,Æ,Æ(ç(ç$Ç$Ç$Æ$Æ § § Æ Æ § §$Æ$Æ,Æ,Æ) -) -) -) -(ç(ç § § † †dd$„$ddd † † „ d$„$„ … edd … e † †…e „ d … e † †$„$„ „ d(¥(¥$¥$¥ † † … e § § † † † † § §)K)K § §cd„ddddcdcdcdd$„$d ¥ ¥ † †(¥(¥ † † † †$Ç$Çe…e… d „dc † †-*1*)K)K$Ç$Ç † † … e(¥(¥,ç,ç(ç(ç § §$Æ$Æ § § Æ Æ$Æ$Æ § §11) -) -,é,é ç ç † †dddd … e … e … e$¥$¥ d „dd … e … e † † „ d † †$„$„ † †$„$ddd(¥(¥ † † … e † † § § † † † †-*1*) -) -f†f†ÆÆ$Ç$Çe…d„e…f† † † † † † †$¥$¥ § § † †…edddddd § §1L1L%% § §(¥(¥ † †,Æ,Æ(ç(ç$Ç$Ç$Æ$Æ § § Æ Æ § §$Æ$Æ,Æ,Æ) -) -) -) -(ç(ç § § † †dd$„$ddd † † „ d$„$„ … edd … e † †…e „ d … e † †$„$„ „ d(¥(¥$¥$¥ † † … e § § † † † † § §)K)K § §cd„ddddcdcdcdd$„$d ¥ ¥ † †(¥(¥ † † † †$Ç$Çe…e… d „dc † †-*1*)K)K$Ç$Ç † † … e(¥(¥,ç,ç(ç(ç § §$Æ$Æ § § Æ Æ$Æ$Æ § §11) -) -,é,é ç ç † †dddd … e … e … e$¥$¥ d „dd … e … e † † „ d † †$„$„ † †$„$ddd(¥(¥ † † … e † † § § † † † †-*1*) -) -f†f†ÆÆ$Ç$Çe…d„e…f†)K55m9m111L)K) -)K1L5mA°=¯55AïJEðAðIðAðAðIðAðAðAðIðAð1Œ-*1L)K1L-l1L1L)K5m)K1L)K)K)K) -) -)K1L15m15511L111L)K) -)K) -)K151*) -)K1L1-l1L) -)K)K1L5Ið55AðAïJAðAðAðAðAïIðAðAðIðAð51L)K-*-l-*-l-l1L)K5m1L)K)K)K) -) -)K)K5m-l155911L511Aï-*)K)K) -11-15k=Ž,ç §(¥ § ç § ¥ Æ Æ(¥ ç$Æ(ç(ç$Ç(ç(ç$Æ § ¥ ¥(ç § ¥ § Æ$Æ,ç5J559k5=Œ5m=Œ=Ž=Ž559k5m559k5I1-5J5k5I9k5k5k5k9k5k5k5,Æ,¥,Æ4ç51),Æ †(ç § ç Æ$¥ § Æ(¥ ç(ç(ç(ç(ç$Æ(ç$Æ § „ ç(ç$¥$¥ § ç,Æ1=¯1Œ5m=Œ5k59=Œ=Ž55=Œ5m=ŽNS=Ž5I5)11)5J5k5k9I5k5J5k5k1L(¥ e$„$„,é5(¥$d „dddcd$„ ¥$dd „dddddd„d „$¥ ddd …$„1)=Ž0ç(¥(¥(¥(¥ §,¥0ç,Æ$Ç0ç0ç1L1Œ(¥(¥ e(¥$„$„,¥,¥,¤,¥,¥,¥,¥,¥,¥,¥,Æ,Æ,Æ5m1d d „dcdd „$d ¥d dd „dddd„dd$¥dddd(¥,¥55,¥ †(¥(¥(¥,¥$Ç0Æ0ç$Ç,Æ5)Aò-(¥ d(¥(¥$„,¥,¤,¥,¤,¥,¥,¥,¥,Æ,¥ † e0ç5m(¥ ddd„dddd ¥ „dddd„dd„dd¥ddd„d(¥55$Ç(¥ †,¥$Ç,Æ$Ç,Æ$Ç0ç$Ç0Æ=Ž1L,Æ(¥ †(¥ †(¥(¥(¥$d,¥0Æ,Æ,Æ$Ç,Æ$Ç,¥,Æ,Æ1L) -$d „dd„dd „d ecdd„ddd„d „d¥ dd „d …,Æ51 §(¥ §,¥$Ç0ç$Ç0ç$Ç,Æ,é5)A¯$Ç,¥ §(¥ †(¥(¥(¥(¥(¥(¥,Æ(¥,Æ,Æ † e „,é1Œ,¥dd„dd„d „ …dd „„dddd„d„ …$¥dd„d$¥-50ç$Ç,¥$Ç §,Æ$Ç0ç$Ç,Æ$Ç0ç=Ž5(¥(¥ †(¥ †$Æ †$Ç(¥ §,¥ §0ç,é0ç,é0ç,é$Ç5m5 dd„ddddd „ „d „„dd„d„dd¥ e ¥dcd$¥(¥51*,Æ,Æ,¥$Ç §$Ç,Æ$Ç0ç$Ç,Æ5J=¯,é(¥ † e(¥ † § †$Ç(¥,é(¥ §,Æ(ç$Ç † e11,¥dd„ddd„d „d „d„dd…„ddd¥ … ¥dcd(¥,é5k,é0ç$Ç,¥$Ç §,Æ$Ç,é$Ç0ç,é5k1L$¥f„d…e¥ † †,¥$Ç0ç$Ç,é,ç,é(ç,é,ç5m1* dddd„dddd „ddd„dd„„d „d¥ eƒdd¥(¥5m1,é0ç §$Æ$Ç,¥$Ç,é,¥$Ç,é5)A¯ §¥e„d…¥e † §,ç$Ç,¥,é,ç § e$„-5,¥ddd„ddddd „dddd„dd „ddd$¥$dd„ e$„,ç1Œ5,é0ç §$Ç$Ç,é0ç$Ç0ç$Ç0Æ-*1*d…Æ de…f„dd † §(ç$Æ$Ç$¥ § §,Æ1-$c „dd„d „dd „d„ddƒdd „ddd$¥ eƒdd$„(¥1L1)5$Ç0ç$Ç$Ç$Ç,é0ç$Ç,é,Æ55¥e†e…e…e„d çde(ç,Æ §$Æ †,é5,é §¥ed„e„dd„cdd„dd„¥ed† †¥e § §$Æ-*1L$Ç §$Æ$Ç0ç §,Æ §$Ç,¥ † §=Œ5c¥$Ç † e „¥ † … ¥,Æ$Ç †$Æ †$¥ †¥$Ç11L §$¥e…dd„dddƒddd„d„†¥d… † e† § § §,é-l,é § §(ç$Ç,Æ$Ç,¥$Ç § §(¥1AòÅe(ç § „¥ e¥ … ¥(¥ †¥ †=Ž5k59k5=Ž51*1L1L-*) -1*)K-*1Œ1*)K-*)K-*1*)J1L-*1Œ1L5Œ5=Ž=Ž559Ž1Œ51L1L%,é-*) -)K,é)K1L)K1L=¯Að51L55k=Œ=Ž=Ž=¯A°=ŒAðIðAðAð=¯=Œ559=Ž=Œ1L1L1L-*-))K-*1*1L-l-*1*-*)K-*)K5J-*1L-l5k5Að5Œ595Ž1L=Ž51L-)%) -1*-*) -) --l-*1L1Að=Ž1Œ1L=Ž5k=Ž=Ž=¯A°=Œ=¯Ið=¯A°$¥$¥(¥(¥(¥(¥$„d$¥ ¥ ¥ e$¥(¥1-* ç0Æ(¥(¥,¥,Æ,¥(¥$¥(¥(¥(ç$ç1L-(ç(¥,Æ §(¥(¥ †$Æ § Æ$Æ$Ç(ç,ç,é1(ç,ç,é)--,é,ç---*5J11,ç--,ç,Æ,Æ,Æ(¥(¥(¥d ¥$„ †$¥ e(¥,Æ1L$ç(ç,¥(¥(¥,Æ,¥,Æ ¥$¥(¥(¥(ç)K1),ç,Æ$Æ,Æ §$¥(¥ §(¥ § §(ç$Æ,é,ç,é,ç),ç,é-)-),ç)--11L11 § „ Æde … † e …d¥d e … „$¥ †51,Æ,¥0Æ,¥,Æ,Æ0ç,Æ §(ç Æ$¥$Ç1- §(¥ †$¥ e¥ † … ¥d †$¥ †(¥ †(¥ † § ¥ e „d † § §,¥,é-,¥ †,¥ †(¥ †(¥ e …(¥ ed¥d …d¥ †(¥,Æ5-,¥,Æ,¥0ç,¥$Ç,Æ(ç,Æ$Æ § §1L-*$Æ † § e(¥ …¥ †d¥ † † …$¥$¥$¥ †$Æ †$¥ed … † §(¥,Æ1$Ç(¥ dd…d „ … „¥ e„…¥d¥ † e,Æ11L e,¥,Æ0ç,Æ,Æ,Æ0ç$Ç(ç §$Ç ç1L0ç$Æ †$¥ † e …$¥ e¥ …¥ †(¥ †(¥ † §(¥ †$¥f¥ †$¥ †(¥0Æ,é §,¥$Ç †,¥ †(¥ e …„ ed…¥d¥ † e$¥$Ç5m$Æ,¥,Æ,Æ,Æ0Æ0Æ0ç,Æ$Ç$Ç$ÇÆ-)5J$Ç †(¥ e¥ † … ¥d$¥ e¥(¥ †(¥ † §(¥ e † †„ † †$¥ †,Æ,é,¥$Ç,¥ †dd†d¥ded¥ …e „¥ …$¥) -1Lc,Æ0Æ,Æ0Æ0Æ0ç0Æ$Ç(ç$Ç §-)-*,é$¥ † †$¥ e¥ …¥ e¥ † † §$„ †$¥ † § e¥d¥ † †(¥ §0Æ1$Ç(¥ §(¥ † §$„ e…d¥df „… e „¥ †,¥5m †(¥,Æ,Æ0Æ0Æ0ç0ç0ç §,ç Æ †)K1$Ç † † ¥ †d$¥ e¥ …¥ † §(¥ † †$¥ † †¥ e… Æ †(¥ †,¥-*$Ç,¥ †d …d„d†d „„e …„ e¥… †,é-l,Æ0ç0Æ4ç===55 §$Æ Æ,é1L(ç$¥ †$¥ †e …¥e$¥ †¥ †(¥ †$¥ † †$¥ e¥d„ †$¥ †,¥,é) -,¥ §(¥ †(¥ §(¥ed¥dd„…¥ ed …¥$Ç1L,é,Å4ç58ç==0ç4ç(ç § §$Ç1L,é$¥ †$¥ e¥… e …¥ † e †$¥ † †$¥ † § †d¥d¥ †(¥(¥,Æ-*,é(¥ ed „d „dd „dd„„ e„ …$¥$¥,é1L(ç(ç §,é1=,é0Æ0ç e¥ †)K-)$¥ †(¥ † e „…$¥e …¥ † e(¥ †(¥ †$¥ † …e$¥ … †$¥ §(¥0Æ1L,¥(¥ § †(¥ † †$„cd$¥„dd… „¥ † †,¥-l,é(ç$Ç,Æ,é559,é §dÆ¥)K$Æ §(¥ e¥ †d¥ †d¥$¥ e$¥ †(¥ †$¥ † … „¥ † e$¥ †(¥,¥-*,é(¥(¥dd † †Æ †¥¥¥¥ Æf † Æ † §) -)Kd„dcde†d…%) - ç1L)K †f ††Æe…dd… e† §¥ † † † † … ¥dd¥ † §,Æ$Ç,é5m) -,é$Ç,é$Ç$Ç$Ç † § ç¥ eÆdd¥ † † §$Ç-l çdd C„d†dd §!!%5m § †f Æf… edd†df § † †¥ † †$„ …edd Æ §$Ç §$Ç1L1L$Ç,é$Ç$Ç51Œ55k1LAð1Œ-*1Œ5J-*) -1L1L1Œ51*) -)K%-*1L1Œ5mA°Að55=Ž=Ž5Œ=Ž55Œ9=¯51Œ5m1Œ1LIð55595Ž1L5k5Að51=ŽAð5=Ž=Ž=Ž=Ž=Ž=Ž=Ž=¯A°=Ž=Œ1L5J5J1L5J$Ç) -)K-*1*1L-l51L) -)K%) --l1L15Að=¯=Ž=Ž=Ž5Œ=Ž5Œ59=ŽAð-l1Œ11L=ïAð1Œ55m95n1L5AðAð-l5A¯9Ž=Ž=Ž=Ž=¯=Ž=Ž=Ž=¯,Æ,Æ,Æ,Æ(ç=¯1L e$¥$„ …¥$¥ §(¥ †(ç$Æ$Ç,Æ §$Ç(ç(ç(ç(ç(¥$¥$¥ Æ$Æ(¥(ç0ç(¥5kIð1$Ç$Ç(ç ç(¥ ç(¥ §(ç(¥,ç-Aò5k1-,ç--,ç,ç(ç$Æ$Ç,Æ,Æ$Ç,¥,¥,¥,¥,¥5k §(¥ † e ¥ …(¥$Æ(¥ §(ç,Æ §$Ç$Æ(ç(ç,ç(ç §(¥$¥(¥ §(¥(ç,Æ,Æ-Ið1Œ$Ç(ç$Æ$Æ$Æ$Æ$Æ$Æ$Æ,Æ$Æ,ç=Œ=¯11,é11,ç5$Æ$Ç,Æ$Æ0ç(¥(¥,Æ §,¥51$¥ †$„(¥ †$„(¥$¥$¥ †(¥$¥ †$Æ,¥ §(¥,Æ §(¥ †$¥$„$¥(¥(¥,Æ,¥5kIð) -$¥(¥ e(¥(¥ §(¥(¥(¥(¥,¥,é=Ž(ç(¥(¥,¥ §(¥(¥ §(¥ † §(¥(¥(¥(¥(¥,¥0ç,¥,é §$„ e(¥$„$¥(¥ †(¥ e(¥$¥ †(¥$Æ,¥ §(¥ §$¥(¥ † ¥$¥$¥(¥,Å,Æ1Að5m(¥(¥(¥(¥ †(¥ †(¥(¥ †,Æ,¥5m1*(¥ §(¥,¥ †,¥ †(¥ †$Æ(¥ §(¥,Æ †(¥,¥1L$Ç$¥$„ †$„$„ §$„ †(¥$„(¥ †$¥(¥ †(¥(¥,¥ §$¥$„$¥(¥(¥,Æ,Æ,Å(¥5J=ð,é$¥(¥$¥$¥ †(¥$¥ † †(¥,¥,ç=¯$Ç,¥,¥$Ç(¥,¥ §,¥,Æ(¥ †$Æ §(¥ †,Æ$Ç,é,Æ-* §$d(¥$„(¥ †$„(¥ †$¥$¥(¥ †$„ †(¥(¥(¥(¥ †$„$¥(¥(¥(¥,Æ,Æ(¥0çAð-*(¥ §(¥ †(¥ †(¥(¥ †(¥,¥,¥=Ž1L(¥,¥(¥,¥ §,¥,Æ §(¥ §(¥(¥(¥ †(¥ §(¥1) - e$„$„(¥(¥$„(¥(¥(¥(¥ d †$„(¥(¥$¥(¥,¥(¥(¥(¥,Æ,¥,Æ,Æ,Æ(ç,Å5kAò$Å(¥ † †(¥ †(¥ †$„ †(¥ §4çA¯-,¥,¥(¥(¥,¥,¥(¥,¥ †$Æ §(¥(¥ § §,Æ,é,é1)(¥$„$„$„(¥$„(¥(¥(¥$„ e$„(¥ †(¥$¥(¥(¥(¥(¥(¥(¥,¥,Æ,Æ,¥0ç,Å-=ð1L e$¥ †$„ †(¥ † †$„ †,Æ §5k5m,¥,¥,¥,¥,Æ §(¥,¥(¥ §(¥(¥$¥(¥ †(¥ §-*1 e(¥$ƒ$„(¥(¥(¥$d$„(¥(¥$„(¥(¥(¥$d,Å0ç,¥,Æ(¥,Æ,¥(¥,Æ,Å0ç0Æ5J=¯) †(¥ †(¥ e¥(¥ †$¥(¥ §,Æ54ç,Æ,¥,¥,¥,¥ §,¥,Æ(¥ †$Æ §(¥ †,Æ †(ç,ç1L(¥(¥ d$„(¥(¥(¥(¥$d$„(¥(¥(¥$„(¥(¥,¥,¥,¥,¥$Æ,¥,Æ(¥,Æ,Æ,Æ,Å1Að-*(¥ †(¥$¥ † † ¥$¥ †$¥(¥,¥5k1L,¥,Å,¥,¥(¥,¥,¥,Æ(¥ §(¥ † e(¥(¥,¥,Æ,é,é e$„$„ †$„(¥(¥(¥(¥ d$„ †(¥(¥(¥,Æ,Å0Æ(¥(¥,Æ,Æ,Æ,Å,Æ0ç(Å(Å-Að,é(¥ †$¥ † †$„ †$¥ † §$„ §5(ç,Å,Æ,¥,Æ,¥,¥0ç,¥,¥(¥ §(¥(¥$¥ §(¥(¥ †-* §$c …$„(¥(¥$d(¥(¥ †$„$¥$„,¥,¥,¥,Æ,¥,Æ(¥,Æ,Æ,Æ(¥,Å0ç,Å,¥,Æ51 e(¥(¥ e § ¥$„ †(¥ §(¥ e-*1L,¥,Å0Æ,¥,Æ(¥0Æ,¥,Æ(¥ e$¥ † §$Ç §,é5m)K †¥e$¥ † † §$Ç § §$Ç$Ç §$Ç$Ç,é § §$Æ § § § §,ç),é11L1L51*e † § † ç § § § §$Ç-*-l=Ž) -$Ç † § §,é §$Ç,é,é,é,é) § §$Ç §$Ç) --l$Çf¥ …f † § § § §$Ç$Ç §!$Ç$Ç$Ç § § § § § §(ç,é,ç) -5J5k1L5Œ † § § Æ § § § ç § §!1L51L$Æ$Ç §$Ç$Æ$Ç$Ç$Ç,é$Ç$Ç$Ç5Að=¯AðAð=¯=Ž=ï5=Ž=¯9Ž555951L5Œ51Œ1L5=Ž55ŒAðAð5=ï=¯AðIðAðJNS=Ï=Ï=ŽAðAðAð=¯AòAðAð=ð=¯BNSIÏAð=¯=ŽAðAðAðAð=¯AðBJSF3JSN3IðAð=ð=ðAò=î=°9=Ž=¯5Ž9555Œ95k1Œ55m1L5955ŒA¯Að=ï=Ž=¯=ïAðAïIðNSAÏ=ð=ŽAð=¯Að=¯AðAðAò=ð5IðNSIÐAïAò=Ž=ŽAðAòAðAðAðAðJSF3JS(ç Æ(¥ §(ç Æ(¥ ç(¥ ç--*(ç ¥(¥$¥$¥(¥$¥$¥$¥$„$¥,ç,ç%$Ç$ç-)(ç § Æ$Ç ç(ç,ç,ç-)$ç-(ç-(ç-(ç(ç$Ç(ç(ç Æ$Æ §,ç1-*-) ç$¥ Æ Æ § ç §(ç ç Æ$Æ$Æ §(ç$¥ §$Æ(ç(ç-*%$¥(¥(Å$¥$¥$¥$¥(¥ ¥$¥(¥-,é%(ç$ç,é ç §(ç ç(ç$Ç--),ç$ç,é,ç$ç-),ç$ç(ç §,ç(ç §(ç(ç(ç1-*-)¥ † Æ Æ § ç § dƒ e$„ddd$„d …,Æ)K$d$„$d „ c$„d$„cd …$„(¥1L † ¥ d „dd ¥ e$„ ¥ e …(Å(¥(¥(¥(¥(¥ †$„ †$„ † …$¥ e$¥(¥5m$Çd ed¥d „d „d$¥d …$d„dc$„d ¥-*$Æ$c$„ „$d „$d „d$dƒ e$„5) -c ¥ „dd … e ¥$„ e$„$¥(¥$¥(¥(¥$„(¥ †$„(¥ † … ¥d$¥ e5I1Ldd¥d$¥dd „$„$d„$d$„ƒd$„c$„$Æ-*$d „$d ƒ$„$„$dƒ „d$„d$„-* Æ$ddd „d ¥ … ¥ e$„$¥(¥ †$„(¥(¥(¥(¥ †(¥ e ¥ ¥d$¥ e(¥5) e „¥d¥ e¥ …d¥d$d „$„c$„d$„$d1) §$d$„$d „$c$„ƒ$d„$d „ „-$ç e …c „d ¥„ ¥ e$¥$¥$¥(¥ †(¥(¥(¥(¥ †(¥ †$d ¥d$¥ e Æ5)1L † ed „ … eƒ e$d$„ „c$„d$„c$„$d,Å)K$d$„ „$d$„$„$„c$„$„c ¥$„5J ed „d¥dd ¥$d ¥$¥$„ †$„(¥(¥(¥ †$„… e ¥$„ …d¥(¥ §5k,éd „d¥ edd „d…c …$d „$dƒ d$„$„-* Æ$d$„ „$d$„ ƒ$d „„$d „$„-)d „d „d„ … „ ¥$„(¥ † e$¥$„(¥(¥ † e$„ „ „$¥d¥ †$„1)1Lc ¥d¥d$„ƒd$„d ƒ$d„ c$„ d ƒ$„$Æ1L$d$„$„$„$„$„$„$„ƒ$„$d$„ …,é„d „dd„d …$„ e$¥$„ †$„ …$„(¥ e(¥d$„ … e ¥$„ ¥$„,¥5m çdd„ edd¥d¥dd$„ ƒ d ƒ „$c$„$„)J$Ç$d$„$„$„$„$„$„ƒ$„c$¥ „(ç §cd „„dd ¥d$„ †$„(¥ †$„(¥$„(¥ e …$„d ¥ e …$„(¥(¥-1Lddd †ddd$„$d „ c „$c „ c „$c$„(Å5Jd$d$„ ƒ$„$„$„$„$d „$„ƒ$¥(¥¥cd „„ e$„ ¥$„(¥(¥(¥(¥,¥(¥(¥(¥(¥(¥(¥(¥$„$„(¥ †$„ §$d5J$Çddd„d„„ddd „„$d ƒ d ƒ$d$„$d5)% c$„ d$„$„$„$„$„$„$d$„$„ Æ$¥dd$„d ¥$d$„$¥$„(¥(¥(¥(¥(¥(¥(¥(¥(¥$d(¥(¥$„(¥ e$¥(¥(¥,é-*c …dd„d „„ † †$„ †(¥ †dd „d §1L%(¥ †$„(¥$Æ,Æ † ¥$¥$¥$¥ §1$Ç$Ç §dc … ¥$„ †$„$„ e †(¥ … e$„(¥ e$„(¥ † † …(¥ †(¥$Ç51*†f„Ædd…e § ç § § §(¥ed „d ¥-*) - §$¥$„$¥$Æ,¥ †$¥ ¥$¥$¥(¥,é% §$Æ †c … ¥$„ †$„(¥d$„ †$d …$d(¥ †$„$¥$d § „(¥ † † †-*)Kf†„ Æe„d †1L151L551L-l-*)K1L1=ð=Ž55A°EîIðAðAð=ŽAïIðAðAðAðAð5Œ5)J1L1L1L1L1Œ-l5m-l1L1L1L1L)K)K) -)K1L559=¯5=ðNSN3=¯=ïAðAð51Œ5A¯9ðAòIðAïAò1Œ1L1L)K-*1L5m9Að55=ŽIïEðAðAðAð=ïAðAð=ŽAðIðAð51L-*1L1L1L-l1L5m5m9n-l1L1L)K)K) -1L1L15m5A¯5559515Að-*1L)K)K1,Æ115J=¯,Æ$¥ †(¥ ç$¥ e Æ ¥(¥ Æ §$Æ(ç(¥ ç$Æ$Æ$¥ e „ ç$Æ(¥$¥ † ç,¥5J=¯9k5k5m5k95k5=Œ5m=Œ5m=Œ555J1)-*111)5)5J5I5J5J5k5I9)5k5k5)1=Œ1L(¥(¥$¥ † § ÆÆ ¥ e$¥(¥ Æ ç$Æ(ç$Æ$Æ,Æ$¥ † „ §$Æ ¥ ¥ Æ(¥$Æ1=Ž55J1Œ5k59k=Ž5m=Ž=Œ5m5k=ŽJ9Ž9)1)-15I5I5J5k5I5J5k5)1L(¥ †$d$„0ç5(¥ ddd„ddd$„ ¥ ddƒdddddd„d „$¥ddd …(¥550ç(¥(¥(¥(¥,¥$Ç,¥0ç0ç$Ç0Æ5m1L(¥(¥$„(¥$d$„,¥$d,¥,¥,¥,¥,¥,Æ(¥,¥,¥,¥1L5J dd$„ddddd „ ¥ eƒ$dd „dddddd „$¥dddd(¥,¥51)(¥(¥(¥(¥(¥,¥$Ç,Æ0ç,¥$Ç5)Ið) -(¥ e$¥$„(¥,¤,¥$d,¥,¥,¥,¥,¥,Æ,¥$¥ e-5m(¥ ddd„dddd ¥ „ddd„ddd„dd¥ …dd„d$„15$Ç(¥ †,¥$Ç$Ç$Ç0ç$Ç,Æ$Ç0ç=Ž1L,Æ §(¥ †(¥(¥ §,¥(¥(¥,¥0Æ,Æ,¥ §0Æ,é,¥1L1L$cdd„ddcdd$¥ „dddc„ddd„dd¥ „dd „ …,Æ51,¥ §(¥$Ç$Ç0ç$Ç0ç$Ç,é,Æ5J=¯(ç(¥(¥(¥ †(¥(¥(¥(¥(¥,¥$Ç,¥,¥,Æ † ed-5(¥ d„dddcd … „dd „„ddd„dd„ … „d„dd$¥15,ç0ç,¥ § §,Æ$Ç0ç$Ç,é,¥,é=Œ5(¥(¥ † ¥ † §(¥$Æ,¥ §(¥ §0Æ,Æ,é,¥,é4ç1*1L$dd„dd„ddd¥ dd …cd„ded„d¥ †$„ddd „,¥51*,Æ$Ç,¥$Ç §,¥$Ç0ç$Ç$Ç,Æ5J=¯,é(¥ † e Æ(¥ †$Ç(¥$Ç,Æ$Ç,¥$Ç(ç$Ç † e11,¥dd„d„dddd„dd„dd…d„…d „¥ ecd¥(¥,é1L1$Ç$Ç$Ç,¥$Ç$Ç,¥$Ç0ç$Ç,é=Œ1L$¥f„d„f„† †,Æ §0Æ,é,é0ç,é(ç(ç1L5k d „dd„dd„ddd „d„ddd„„d „d¥ eƒdd$¥ §5k5,é$Ç,¥$Ç §$Ç0ç$Ç,Æ$Ç0ç5)A¯ §¥f„„e…e † §,é § §,ç,ç § e$„-5,¥ d „ddddd„ ec „ddd „„dd$„dd$¥dƒd „ d,é5k150ç$Ç$Ç$Ç0ç,é$Ç,é$Ç0Æ=Œ1Ld…Æ de…e„dd § ç,Æ$Ç,Æ §(¥$¥1L1L dcd„cd„dd „dd „dd„dd ¥ dddd$¥ dc„$„(¥1L-*8ç,é$Ç,Æ$Ç0ç$Ç,é0ç$Ç,é1=¯e…f…e…f„dd(çcd(ç(ç$Ç$Æ †-*11 §f…e…de„cdd„d„„dÆ †Æd † †† § §$Ç §-*1L$Ç §$Æ$Ç$Ç,¥ § §(ç §(¥(¥=Ž5c † § § ¥ †$¥$¥ † ¥(ç-1-*11*-*%55$ÇÆ §f…fd„ddd„d„ddd¥†e…¥ †f Æ †$Ç §%5m,é ç$Æ$Ç$Ç,Æ § §$Ç §,¥ †1Aò ¦¥ §(çd Æ †$¥¥ †(¥ § Æ †=Œ5m5k9m5k=Ž1L1L1L1L)J1)K-*1L1Œ1L)K-*)K5J-*1*1L) -1L1Œ55=ï=Œ1Œ55k1Œ51Œ1*) -) -) -)K-*1*-*1L)K1L=ïAð51Œ5=Œ5k=Ž=¯A°=Ï=ŒIðEðJEðAðAð=ï=¯9k=Ž=Ž-*1L)J1L-)-)1L)K1Œ-l-*1*-*1*-*)K1L-*1Œ1L1Œ=Ž=ï=Ž559Ž5m5k5-l-*)) -) -)K-*1*-*-l-*9Aï551Œ=Œ5k=Ž=Œ=¯A°=Ï=ŽIïAð=Ž$¥ e(¥$¥(¥(¥(¥ dd$¥$¥ e$¥(¥1-* §,Å,¥(¥,¥,Æ(¥(¥ ¥(Å$¥$¥(ç1L-,¥ §,Æ §(¥$¥$¥ † Æ$¥ §,Æ §(ç,ç,é(ç(ç$Ç,ç1$Ç,é,ç-,ç11L1(ç-1),ç,Æ,¥(¥$d,¥(¥(¥d e$¥ ¥ e$¥$„$Ç5k$Ç,Æ,Æ(¥(¥,Æ(¥(¥$¥$¥(Å(¥ §-*1)(ç §,Æ §(¥$¥ †(¥ † § §$Æ,Æ §-,ç,é(ç(ç,é,ç%,é(ç,é0ç-1L1,Æ § „¥d¥ e … † ed „…d¥ e(¥(¥11,¥,Æ,¥,Æ,Æ,¥0ç,Æ$Æ §(ç$¥$Ç1Œ,é § § †$¥ † e$¥ … e¥ † †$¥(¥ †(¥ † §$„ †…d Æ † §,¥,é-(¥(¥ †(¥ e(¥ †$„ † … ed „dd¥ „ †(¥,¥5m1,¥,¥,¥,Æ,¥0ç,Æ,Æ$Æ$Æ$Æ §1L-*,Æ †$¥ † e$¥ …¥ †d$¥ † †(¥ †(¥ † §(¥ e¥… e †(¥ §0Æ1$Ç(¥ †dddd¥ ed „…„¥ e … „¥ §51L e,¥0ç,¥0ç,Æ,Æ0ç$Ç(ç §$Ç ç1L-,¥ †$¥ e¥ … †d¥ † † …$¥ †(¥ † §(¥ † †¥e §$¥ †(¥0Æ,é §,¥$Ç(¥ e †(¥… e „¥d¥e¥d$¥ e †,é5m §(¥0Æ0ç$Ç,¥0Æ0ç$Ç(ç$Ç § Æ) -5) §$Æ †$¥ e¥ † … „¥ † e(¥ †(¥¥ §(¥ e Æ e… §$¥ †(¥,¥,é$Æ,Æ,¥ † ed¥d… „ed¥ …e„ † …$¥,é-ld,¥0ç,Æ0Æ0ç0ç0ç$Ç,Æ$Ç Æ%1L(ç §(¥ † e$¥…$¥ e¥ …¥ †$Æ †$¥$¥ † †$¥ed¥ † §$„,¥,é,é(¥$Ç(¥ †(¥e † …dd¥d… e¥ …e$¥ …$Æ5 §(¥,¥0ç,¥4ç,é0Æ0Æ$Ç(ç § Æ) -1 §$Æ † e¥ †d$¥ e …¥ † †(¥ †$¥ † § † …¥d Æ †$¥ †,¥-*$Ç,¥ † edd„ ed¥d„e… „ e¥d¥1-l,ç0Æ4ç5===4ç5 §(ç †) -1*(ç † § e$¥… e¥ …¥ †$¥ e †(¥ † † §$¥ e¥dd †$¥ †,¥,é1$Ç(¥ † †(¥ †$„d ¥d …d „… e„ …d¥ §1L1,Æ0ç4ç==4ç=4ç(ç §$Æ §1L,é Æ(¥¥ † †d¥e … †¥$¥ †$¥ † † §(¥ e¥…d¥ † †,¥,Æ-*0ç † † „ddd„dd „ddd¥d¥ †(¥,é-l$Ç(ç §0ç,é5,é0Æ$Ç †d ç$Ç) -(¥$¥ † ¥ ed¥ …d¥ †d$¥$¥ †(¥ †$¥ e …¥ eÆ e$¥ †,¥,é-*,¥ †,¥ §$d(¥ … e$„c$¥ddd¥d¥$¥ †,Æ1L)$Ç$Æ$Ç,é15,é,ç §d Æ †)K(ç †(¥ e¥ …d e¥d¥ † † …(¥$¥$¥ † †d¥ † …¥(¥ †(¥,¥-*,é(¥(¥dd § Æ § Æ¥¥¥Æ §Æ † † § §-*)Kd„ dCde† df) -!!1-* §f Æ † §e… e†d¥ § § † † † † † †¥e… e Æ §$Ç$Ç,é5m1*,é,é$Ç$Ç § †$¥d¥dd„d…f § † §)1 çd ddc df„e$Ç! ç) -1 § † §f §†¥e …Æd † § † † † † † †$¥ed¥ † §$Ç$Ç,é5J1L,é,é,é$Ç55k95k1LAð51*1Œ1)K-*1*-l5k51*-*1*%-*1L15=ïAð=Ž=Ž=Ž=Œ5Œ59Œ51ŒAò=Ž1Œ1Œ11LAð55Œ91Œ=Ž1Œ5m5Að=¯1ŒA°=¯=Ï=Ž=Ž=¯=Œ=Ž=Ž=Ž55k95k5m1L-*) -) -%) --)1L)K)J5m5k1*)K-*) -1*1L1Œ5=ŽAð=¯9Ž5=Œ55Œ95Œ5=ŽAð51L5-l=¯A°15595Ž1L5AðAò1L=¯A°=Ž=Ž=Ž=Ž=¯=Ž=Ž5=Ž,Æ,Æ,Æ §,ÆAð5Jd(¥ † e ¥ ¥(¥ †(¥ §(ç §$Æ §(ç$Æ,Æ(ç$Æ(¥$¥$¥$¥ †(¥(ç,Å,Æ5JIð) -(ç(¥$Æ$Æ §$Æ §(¥$Æ,¥,Æ,éAð5J1-(ç,ç,é,Æ,Æ$Ç$Æ §(ç,Æ,é,Æ,ç=Œ1L$¥ e$„ ¥$„ †ƒ(¥(¥ † §$Æ$Ç,Æ § §(ç$Æ,Æ$Ç(ç$¥(¥ †$¥$Æ(¥(¥,Æ,Æ-Aï5,Æ$Æ$Æ$Æ †$Æ$Æ(¥ †,Æ,Æ,Æ5=Ž1-(ç,ç,é,ç0ç$Æ §,Æ$Æ,Æ(¥(¥,Æ §,¥5) -$¥$„$„(¥ e(¥(¥ †(¥ †(¥$¥ †(¥ §(¥ §(¥,¥ †$¥ †$¥$¥(¥,¥,Æ,¥5k=ð1)(¥ †(¥(¥ †(¥(¥(¥ †,¥ §4ç5$Æ,¥ §,¥,¥(¥ §(¥ §(¥ †$Æ §$Æ,¥,¥-*1L$d$„$d„ e(¥$¥ e(¥(¥ †$„(¥ †(¥$¥ §(¥ §(¥,Æ$¥$¥ †$¥$„$¥(¥,Æ,Æ1Að5$„ §(¥(¥(¥ †(¥ §(¥(¥ §,¥=Œ-*(¥(¥,¥$Ç(¥(¥ †(¥ §(¥(¥ §(¥,Æ †(¥,¥-*) e(¥ …$„(¥(¥ †$„(¥ e$¥$„$¥ †$¥(¥(¥,Æ(¥(¥ †$¥(¥(¥,¥,Æ(ç,¥5JAò$Ç(¥ §(¥ †(¥ †(¥ †(¥ §,¥,çAð$Ç,¥,¥,¥ §,¥,¥ §,¥$Æ §(¥ †$Æ$Ç,¥5k1*$„ e$„c „$¥$„(¥ e$¥$¥$„(¥$¥ †$¥$„ §(¥(¥(¥(¥ †$¥(¥(¥(¥,Æ,Æ(¥0çAð-* §(¥(¥ † †(¥(¥ †(¥$¥,¥,¥5m1L,¥,¥,¥ §(¥,¥,¥$Æ,¥ †$Æ(¥(¥ †(¥ †,¥) -,é e$„$„(¥$„(¥$„ †$„(¥$„ †$„(¥(¥(¥(¥,¥,Æ(¥(¥(¥,¥,Æ,Æ,Æ,Å,Å5kAð$Ç †$„ †$„ †(¥ † ¥ †$¥(¥0Æ=¯1,¥,¥,Æ(¥,¥ §,¥,¥(¥ §$¥ † §(ç51*1L$„ d …c$„$„(¥ †(¥$d(¥(¥ e$„ †$„(¥(¥(¥,¥,Æ(¥(¥(¥,¥,Æ,Æ,Æ,Æ,Å1)Að-* ¥(¥e(¥ †(¥ e$¥ † †(¥,¥=Œ1L,¥,Æ,¥(¥,¥ §(¥,¥ §(¥ †(¥$¥(¥ †(¥$Ç51* d$¥$ƒ$d(¥(¥(¥(¥$d(¥(¥(¥(¥(¥(¥(¥,¥,Æ,Æ(¥,Æ(¥,Æ,¥0ç,Å0ç,Æ1L=ï,é$¥$¥ †(¥ † e(¥$¥ †(¥(¥0ç5m-0Æ,¥,¥,¥,¥(¥,¥,Æ(¥ †(¥ §$¥,Æ$Ç5m1L$„ d …c …$¥$„(¥(¥(¥$d(¥$¥$d(¥(¥(¥$d,¥0Æ,Å,Æ(¥,¥,Æ(¥,Æ0ç,Å0Æ151Œ$„ † §$„ † † ¥(¥ †$¥(¥,¥1L1L,Å,¥,¥,¥,¥(¥,¥,Æ,¥ §(¥ † e(¥(¥,¥$Ç1%$„ d$„ †(¥$„(¥$„(¥$„ …$¥$„(¥,¥,¥,¥0ç(¥(¥,¥,Æ,Æ,Å,Å(ç,¥(Å1Að) †(¥ † †(¥ e$¥$¥ † §$„ †10ç,¥,Æ,¥,Æ,¥,¥,Æ,¥(¥(¥(¥$¥$¥$¥ e1L1L c$„d dc„$„(¥(¥$„(¥$„$„(¥$„(¥(¥,Æ,Å,Å,Æ$¥,¥,Æ,Æ,Å,Å,Æ,Å(¥,Æ55$d,¥ †$¥ †$„ †$¥ †(¥ † †1)1L,¥,Å,¥,Æ,Æ,¥,Æ,Å,¥(¥ †$d † §$Ç §-*1L1L §f † † † § §%$Ç §) §$Ç$Ç$Ç,é ç$Ç § § ç$Ç §,é)1-*9k5m1Œ-* † § § †$Ç! §! §$Ç)K5m=Ž) - §$Ç §$Ç$Ç%$Ç,é,é%) -$Ç%$Ç) -AðAð1% § §¥ † § † §$Ç §$Ç!$Ç$Ç$Ç%$Ç,é §$Ç § ç § §,é),é-*5J51Œ5m † § § § §% §$Ç §!) -1L51L$Ç$Ç §$Ç$Ç$Ç$Ç,é%,é!$Ç5AðAðAðAð=¯=Ž=°1Að5=ï15=Ž1L51L5Œ511L5=Ž15=ŽAð=¯9=ïAðAïAðIðFAð=Ž=ŽAðAðAð=¯AðAð=ð=ð=¯IðJEðIð=¯=ï5IðAò=ð=ðIðAòJSF3NSN3NSJ3NSJ3AðAð55=ŽAð559Œ5551L1Œ51L51L559Œ5AòAð=Ž=ï=¯AðAïIðFIðAð5=ïAðAðAð=ðAòAð=ð5AðJEîIðAð5AðAð=ðIð9ðAðAòJSN3Aò Æ(¥ † § Æ$¥ § Æ$¥ §,ç)J(¥$¥$¥(¥$„$¥$¥$¥$„ ¥ ¥,Æ,Æ) -$ç(ç ç(ç Æ$¥ §(ç §,ç,ç),ç$ç,ç,ç$ç,é(ç$Æ$Æ$Æ$Ç$Æ$Æ$Æ$Ç,Æ1L-) ç „¥ † Æ Æ † ç$¥ § ¥ Æ Æ(¥¥$Æ §(¥ ç5J$Ç$¥$¥(¥$¥$d$¥$¥$¥ e$„$Æ0ç)) ç(ç(ç † § ç(¥ ç(ç(ç,ç)(ç(ç,ç(ç(ç(ç §(ç(¥$Ç(ç Æ$Æ(ç,Æ--*)¥¥$¥ † ç † Æ e$„c …$d„c$„d …,Å-* e$„$d „$d ƒ$ddƒ$d„$„(¥5J † ¥ e „d e „d ¥ …$d ¥(¥(¥(¥(¥(¥$„ †$¥(¥(¥ e$¥ …¥ †(¥=Œ § e „ …¥ ed¥ „d$dd$„d …c …d$„ ¥1) §$d$„ d ƒ$d „$dƒ$d„$„ e1) -c …d „d ¥ e … ¥$„ †$„ §$d(¥(¥(¥(¥(¥ †$¥$„ e¥ … †$¥1)-*d$¥ed¥dd ¥$„c$„ƒ e$„dƒ d$„(ç) -$„c$„$„ƒ$„$„ƒd$„d$„ ¥-*$¥dd „d „d$¥d(¥ ¥$„ †(¥ †$„,¥ §$¥$„ † …$¥ ed¥ †,¥5,é „d¥d¥ edd ¥ ƒ$d$„$d„$dƒ dƒ$„-* †$d$„$„ ƒ$d$„ƒd ¥ „c$„1$ç e ¥ƒ ed ¥d ¥$„ †$„(¥ †(¥(¥,¥ †(¥ †$„ †$„ †d$¥ e$¥1)5md$¥ed$¥ „$d „$d$„d$„ c„ c$„$d ƒ,Å)Kc$„ …$d$„$„ƒ e „$„ „d(¥-*d ¥dd „d „ „¥ e$¥(¥ e$„(¥(¥(¥ †$„ … e ¥ … ¥c$¥(¥(¥5m$Çd „d¥ ed¥d$„dd$„$d„ c$„ d$„$„-* §$„$„$„ ƒ$„$„$d „ „$d „ „1)ddd „dd „d$¥ e(¥ †$„(¥ d(¥(¥$d † … e ¥ … „d$¥(¥1-ld †ƒ edd„ e$„d ƒ d$„ ƒ$d„ c$„(¥1L e$„ ƒ$„$„$„$„$„$„ ƒ$d$„ …)dd$„dc„dd$¥ e$¥$„(¥ †$„$„(¥ †$„ …$d$„ ¥$dd(¥ †(¥5k$Çdd „dd„dd$„d$„c$„ƒ d ƒ d$„$„5J ç$c …$„$„$„$„$„$„ ƒd$„$„$ç §c „dd„d ¥ …$¥$„ †$„(¥ e(¥$„(¥ †$d$„$„d$¥ e ¥$„(¥11Lcdd„… „d$„$d „ c$„ c „ c „$c$„$¥1L$d „$„$„$ƒ$„$„$„$„$d$„ƒ$„$Ç „dd „„ e ¥$„(¥$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$„$„(¥ †$¥(¥$d1L$Çc „„d„d„ …$d „$d$„ d$ƒ$d„$c$„$d-*$Ç$d „$„$c$„$„$„ƒ$d$„$„$„(¥Æ dƒd „„ ¥$d$¥$„,¥(¥(¥,¥(¥(¥(¥(¥(¥(¥$d(¥$¥$d$¥(¥(¥(¥,é-*ddd„ddd$„ †$¥ † †(¥ † …d dd ç1L,é §$¥$¥(¥(ç,Æ$¥$¥$¥ †(ç(¥-*)$Ç §$¥d „ †$„ †$„$„ e † †$„ e …(¥ e$„(¥ † † †(¥ † †$Ç-*%dcdd„dd „c „ c$„$d$„d ƒ$d$„$„)J1L †(¥$¥ §,Å(ç(¥ †(¥ §(¥ §-),é$Ç$Ç$¥dd(¥ †$„$¥$„ e …$¥ e … e$„ †$„(¥ †(¥ e † § † †) -)Kf†¥ §e„d†-l559m=Ž55m)K) -1L-l1Að=Ž5Œ=ŽAðAðAðAðAð=ïAðAðAð=Ž=ïIð9Ž1Œ1L1L1L1L1Œ5m5m1Ž5m15m1L1L1L1L)K1L5m1=Ž=¯A°555951L-l) -151L1L1L5J-*1L=Œ=Ž5k5J-*)K5J1=ŽAð5Œ5=ŽAïIðAðAïAð=ïAïAïAð5AïAð5Œ-l1L1L1L-l51L11Œ15m-l1L1L1L)K)K1L15A¯=°=Ï955=ð55Ið-l)K-l-l1(¥0ç,ç5)A¯ Æ(¥$¥¥ § ¥$d „¥(¥¥$¥ §(¥ §(¥ Æ(¥ e „¥$Æ § ¥ e ¥ ¥(¥5J55k1L5J5k5k9m5k55k9m5k5k1Œ55)1-)(ç15I5)9I5)5k5k9k5J=Œ5k5)5)5J=Œ-*$¥ e$¥ Æ$¥$¥ „ e „ Æ$¥$¥ § Æ$Æ §$¥$Æ † ¥$dÆ(¥$¥d Æ ¥(¥1=Ž55I9k5k5k5m9k=Ž5k5m5k9k=ŽF=Œ1)--15)1)5)5I9)5J5J5J5),Æ e$¥$„15(¥ edddddd …$¥ dd$„ddd„ddd„ e ¥$„dd ¥$d5)5,ç(¥(¥(¥(¥(¥$Ç,Æ0ç,Æ$Ç0Æ5m1L,Æ †$„(¥$d(¥,¥,¥(¥,¥,¥,¥,¥,¥,¥,¥,¥,¥5 §dddddd„dd … ¥c „ dd „dddd„d$¥ eddd(¥,¥51,¥(¥(¥(¥(¥,¥$Ç,Æ0ç$Ç0Æ5)Aò,è$d$„(¥(¥$d$„,¥$d,¥,¥,¥,¥,¥,Æ §$„ †4ç5m §$dddc„d d„ eƒdd„dddd„d„ … „dddd(¥55$Ç(¥(¥ §,¥$Ç0ç$Ç0ç$Ç0ç,é=Œ1L,Æ §(¥ †(¥(¥ e(¥(¥,¥,¥,Æ0Æ,Æ,Æ,é0Æ,é1$Ç e$„dd„d„dd$¥dd„dddd„dd„¥d …c„d …,Æ51 § §(¥$Ç,¥$Ç0ç$Ç0ç$Ç0ç5J=Ž,é(¥ §(¥ †(¥(¥,¥ §,¥,¥$Ç,¥,Æ,Æ † ed-1L,Æddd„cddd$¥d „d„dd„„d„d¥ †ƒdd„ …-=Ž,ç0ç$Ç,¥$Ç$Ç,¥$Ç0ç$Ç$Ç0Æ=Ž5(¥(¥ † ¥ † §(¥$Ç †$Ç(¥ §0ç,é0ç,é,é,é5$Ç ed„dd„ddd¥ eƒ edd„de„dd …¥ eƒd„ …(¥51*0Æ,Æ$Ç †$Ç$Ç0ç$Ç0ç$Ç,Æ5J=¯$Ç(¥(¥ e¥ § § §(¥,Æ$Ç,¥$Ç0ç(ç$Ç † e15,Æ ddd„dd„ddd„d„dd…ddd „d$¥dd„ e$¥,ç5,ç,é,¥$Ç †$Ç$Ç0ç$Ç$Ç0ç,é5k1L „f„d„f„¥ †,¥ §0Æ,é,é,é-,é(ç-*,é$dc„dd„dddd …cdd„ddd„ „d„¥ edd„$¥(¥5m1,é,Æ$Ç,¥$Ç,¥$Ç$Ç$Ç,Æ,é5)A¯ §¥f„„ed¥ † §,ç § †-,ç §$„ e-5(¥$dddd„dd„ eƒddd„d „dd „dd „dd„$d$„,ç1Œ5,é,ç$Ç0ç$Ç$Ç,é0ç$Ç0ç0ç-*1*d¥†e…„e„dd † §1,ç,é,ç,é,ç-*) dƒdd„cd „dd$„d „dƒddd „ddc …$„c„ e$„$¥1L1)4ç,é$Ç$Ç$Ç$Ç,é0ç,é$Ç0ç15¥e†e…e…e„d Ædd ç(ç$Ç §$Æ-*9) - § §¥f†„e„cd„dÆdd†¥ Æf† § § Æ § ç$Ç$Ç)K1L$Ç § §(ç §$Ç,Æ$Ç § § †(¥=Ž5d$¥ ç † † §(¥ †$Æ$¥,é,ç%-*11*1)) -=Ž1L ç$Ç §f †Æd…ddd„d†„f„¥ † ††Æ § § § §$Ç$Ç) --l) -$Ç §(ç,Æ §$Ç,Æ § §(¥ †1Aò ¦¥ §$Ç$¥ † § Æ(¥$¥ §$Ç ç$Æ=Œ=Œ5m5k9k=Ž5k-*1L5J-*) -1*-)-l51*1L-)-*1*1L-)1L)K1L5k1Œ5=Ž5Œ59m1Œ5k59m)J1) -)K-*1*) -1L1L-*-lAð=Ž=ï1=Œ=Ž5kA¯9ŽAð=¯A°=ÏAð=¯Að=¯=Ž=Ž=Œ=Œ=Œ51*1Œ5J-*) -1)K-*11L-*)K1-*1L1*)J1L)J51L5ŒAð51Œ51Œ5k59k1L-)) -) -)K-*) -)K1L-*1L5Að=¯91Œ=Œ5m=Œ=¯A°=ÏA°=¯Iï9ŽA¯ e¥$„(¥(¥(¥ d …$d „¥ …$¥(¥1-* Æ,¥,¥(¥(¥,¥(¥(¥$¥(¥$¥(¥ ç1L-,Æ §(¥ §$„ †(¥ †$¥¥ § §(¥(ç(ç,ç$Ç(ç$Ç(ç(ç$Ç(ç,é(ç,ç1-*,Æ,Æ,ç,¥ §$¥$„(¥ e¥$„ †$„c † ¥ … ¥(¥,Æ1L$Ç(Å,¥(¥(¥,¥(¥,¥$¥$¥(Å$¥(¥)K1(ç §,¥ †(¥$¥$¥$¥¥$¥ †$Æ §,Æ(ç(ç,é(ç$Æ(ç(ç,é$Ç,ç(ç,ç,é5J1(¥ §c¥d …¥ e † „ ed„… †d(¥(¥11,Æ,¥0Æ,¥0ç,¥,ç,Æ,Æ$Æ § §$ç5,é(¥ † †(¥ † † … ¥ e¥ †$„ †(¥ †(¥ † § ¥ †d… †(¥ §,¥,é-,¥$Ç(¥ †(¥(¥ † e ¥ … e „d¥d … „ e(¥$Ç=Œ-,Æ,¥,Æ,¥0ç,Æ,ç,Æ$Æ §(ç †1L-*$Ç(¥ † †$¥ e † …¥ e¥ †(¥ †(¥ †(¥ †(¥ †…e¥ † §,¥,¥1$Ç,¥ e…dd¥d … e¥„ e¥d¥ † …$Æ-*1L$d,¥,ç,Æ,Æ,Æ,Æ0ç$Ç(ç$Ç ç §1L1$¥ †$¥ †d$¥¥ e …¥ †$¥ † §(¥ † §(¥ † † …¥ † †(¥ §0Æ,é §,¥ §(¥ e †(¥ … e „¥d¥e …„¥ e †,ç5m †,¥,Æ0ç,Æ,¥0Æ0ç$Ç,Æ$Ç$ÇÆ-*1 § §$¥ † †d$¥ e¥ † † † …(¥ †(¥ †$Æ † †¥ e † †(¥ §,¥1$Ç,¥$Ç e „d„ e¥dd„¥e …¥ e¥ †1-*$¥(¥0Æ,Æ0Æ0ç0ç0Æ0ç §$Ç Æ ç-*,é$¥ †$¥ e †¥… †d$¥ † †$¥ †$¥ †(¥ † †¥d¥ †$¥ †,¥0ç,é,¥$Ç †,¥ §(¥e †dd…dd$¥… e¥ …¥$Ç5m §(Å,¥0ç,Æ0ç0ç0Æ0ç$Ç$Ç §„)K1 §(¥$¥ e¥ …¥ e¥ …¥ †(¥ †$¥ † †$Æ † e …„ † § ¥(¥$Ç5$Ç$Ç$„edd„…de¥d… ed¥ …d$¥,é-l,Æ,ç4ç5====,é,Æ §Æ ç-*$Ç(¥ † †¥ e …¥ e¥ … Æ e †$¥ † † §$¥ e…d„ † †(¥ †0Æ-*$Ç(¥ † † §(¥ † e „d¥d…e „… †d$¥ §1L1,Æ4ç0Æ====4ç$Ç(ç §$Ç1L$ç § § †$¥ e¥ … e¥ † † † †(¥ e §$¥ † …¥ed¥ †(¥ †,¥-*,é(¥e „dddd„ddddd¥d¥ †(¥,é1L ç$Ç §,Æ,é5,é,Æ,Æe¥ …) -) -(¥ †$¥ e¥ …d¥d¥ †d$¥$¥ †(¥ †$¥d¥ e „¥ † †(¥,¥,é1L(¥(¥ †,¥ † †(¥ ddd ¥ddd¥d „¥(¥$Ç-*) -(ç §(ç$Ç5,é0ç$Ç(¥e¥$Ç)K,Æ$¥ † e „ …e¥d …¥ e ¥ …$¥(¥$¥ e †¥ … ¥d †$¥(¥ †0Æ-*,é(¥(¥d e § § ç ç¥ † ç Æ ç §f § § §)K-*ed„ C df†„ §!)K) -1)K § §Æ § §f†¥ e†f ç § § § † † § § e$¥…f §$Ç,é$Ç,é5m1*,é1) -$Ç$Ç †f¥†d„d„ †f § Æ §$Ç1 çdd„de†e†%)K!!1L § § § §Æ §e …¥f… § § § § † § † §$¥e¥ … Æ §$Ç,é,Æ1L1L,é,é,é%55k95k1LAð51)1L-))K-*1*1Œ1L5k1*)K-*1*)K1L51Œ=¯A°55=Œ=Œ559Ž55kIð=¯1Œ11Œ5Að559m5Ž55k1Œ=ŽAò=ð5=Ž=¯=Ž=Ž=Ž=Ž=Ž=Ž=Ž5=Ž51L5m1-*) -1*)K) -1L1Œ-*1*-l1L5k1L-*)K1L1)-l55m9ŒAð=Ž=Œ=Ž=Ž559Ž555Aò5Œ151L=ïAð1Œ5595Ž1L5AðAò5Ž=ŽAð=¯=Ž=Ž=Ž=¯=Œ=Ž5=Ž(ç(¥,Æ,¥,ÆAð)J e$¥$„ † … ¥$¥$¥(¥$Æ §$Æ §(¥$Æ$Æ$Ç,Æ$Æ(¥ †$¥(¥$¥$¥(¥,Æ(¥5kIð) -(¥ §(¥ § ¥(¥$¥$¥$Æ(¥,¥,éAð5)1,ç(ç,ç,ç,Æ(ç(¥ §(ç(¥$Ç(ç(¥5=Ž(¥ †$¥(¥(¥ †$¥ e ¥(¥(¥ †(¥ §,Æ §(¥ §(¥(ç(ç$Æ(¥ †(¥ †$¥$¥(¥,¥(ç0çAï1L,Æ §(¥ § ¥(¥$¥$¥ †(¥,Æ,Æ5m=Ž1(ç$Ç,Æ1,Æ$Ç(¥$Æ$Æ(¥,Æ(¥(¥,¥ §,Æ5m1$¥ †$„$„$¥(¥(¥ †$„ †(¥(¥ †$Æ,¥$Ç(¥ §(¥ †(¥ e ¥$„ §,¥,Æ,Æ5JAð1 §$¥(¥(¥$¥ §(¥(¥ †,¥$Ç4ç5$Ç(¥(¥,Æ †(¥,Æ †$Æ(¥ † § Æ(¥(¥55m †$d$„ †$„(¥$„ †$„(¥ †(¥ †$¥(¥$¥ †$Æ,¥ †,Æ §(¥$¥ †$¥$„$¥(¥,Æ,Æ0çAð5(¥ §$„ §(¥(¥ §$„ §(¥,¥,¥51* ¥,¥(¥,¥ †,Æ(¥ †$Æ §(¥,¥(¥,Æ †(¥,¥-*%$„(¥ d(¥$„(¥ †$„(¥(¥ †$„(¥ †(¥(¥(¥(¥,Æ(¥ †$¥(¥(¥,¥0ç,Å(¥5kA¯$Ç(¥ §$„ †(¥ †(¥ †(¥ §$d0çAò(æ,¥(¥,¥ §(¥,¥,Æ §(¥ †$Æ(¥ †,¥-*-l(¥$d …$„ †$ƒ(¥(¥$„ †$„(¥$„$¥ †$„$¥ †(¥,¥$Æ,¥(¥$¥ †(¥(¥(¥,Æ,Å(¥1Að-*(¥ §(¥ †$¥(¥ †(¥ †(¥ §,¥=Œ1L,¥,¥,Æ §(¥,¥$Æ(¥,¥ §(¥ §(¥$¥ §(¥ †-*,é †$„$„$„(¥(¥(¥(¥(¥ e$¥$„ †$„(¥(¥(¥,Æ(¥(¥(¥(¥,¥,Å0ç,Å,Æ,Å5A°$Ç(¥ †$¥ †(¥ † ¥$„ †(¥(¥,ç=¯,é,¥,¥(¥,¥,Æ,¥(¥,¥ §(¥ †$Æ § §-5m(¥ d „$d$¥$„$„(¥(¥(¥(¥ †$„(¥ e(¥ †(¥(¥(¥,¥,Æ(¥(¥(¥(¥,Å0ç,¥0ç,Å1=ð-*$¥$¥ †$„ †(¥ †$¥ †$¥(¥(¥=Œ1L,¥,¥(¥,¥,¥,¥,¥,¥ §(¥ †(¥$¥(¥ †(¥,¥) -1$„$d$„(¥(¥$d(¥(¥$d$„(¥(¥(¥(¥(¥(¥,¥,Æ,Æ(¥,Æ,¥,Æ,¥,Æ,Æ0ç,Å5J=ð,é$¥$¥ †(¥ e$¥ †$¥ †(¥ §0Æ50ç,Å0Æ,¥(¥(¥,¥,Æ(¥(¥ †$Æ,¥ §(¥-*9$„ d „$d$„$„$d(¥(¥(¥$d(¥$„(¥$„(¥(¥(¥$d,¥0Æ,Å,Æ(¥,Æ,¥,Æ,¥0ç,Å,Æ151Œ(¥ †(¥ †$¥ e$¥ †$¥ †(¥(¥5k1L,¥,Å,¥,¥,Æ(¥,¥,Æ(¥ §(¥ † †$„(¥(¥,é5% e … e$„$¥(¥$„(¥(¥ e …$¥$d(¥(¥,¥,¥0Æ(¥(¥,Æ(¥,Æ(¥0ç(Å(¥,¥-)Að) †(¥ † e$¥ † …(¥$¥ †(¥$¥1L,é,¥,¥,¥,Æ,¥,¥,Æ0Æ(¥(¥(¥ †(¥ e-5(¥ c d „$d$„ ¥$„(¥(¥$„(¥ d$„ †$„(¥(¥,¥,¥,Å,Å(¥(¥,Æ(¥,Æ,Å,Æ,Å(¥(ç55m$d §$„ †$¥ † † ¥$„ §(¥ e-*1*,¥,¥,Æ,¥,¥,¥,Æ,¥,Æ$¥ e$„ †$Ç$Ç$Ç-*1L1L § § † § † § §%$Ç$Ç)$Ç%,é$Ç,é) §) §$Ç$Ç$Ç,é-)-*5J5m5m1Œ1*† § §$Ç!!$Ç!$Ç!1L5m51*$Ç$Ç$Ç$Ç%$Ç,é%) -) -1*) -1*-*9ŽAñ1,é,é% § § † § § §$Ç!$Ç$Ç%$Ç,é%,é,é ç$Ç §$Ç$Ç$Ç),é) -1*5k=Ž1Œ5m § §$Ç § ç! §$Ç!$Ç) -5m95$Ç$Ç$Ç$Ç$Ç) -$Ç) -,é) -) -%5Að=ð=¯A°Að=Ž55=ï5=ï5595m1L51L51Œ1L5591Œ=¯=ðAð5=ï=ïAð=¯JIïAð=ŽAðAðAðAð=¯AòAòAð=¯=ŽIðNSAÐ=Ï=ï=ŽAðAðAòAð=ïAòAðJSN3JSEÐNSNSN3AïAð5=ï55=ï559Œ55m1Œ5m1L51Œ1L1L5Œ59=ïAð=¯A°=ï5AïAïIðFIðAð5=ïAðAð=¯AòIðAòAñ5AïJEðAïAð5AðAðAð=ðAðAð=ïJSN3Að$¥ ¥$¥$¥ †$¥¥(¥¥$Æ(ç1L ¥$d$„$¥$„ ¥$d$¥ …$„ ¥,Å(ç,é ç$Æ$Ç § Æ$¥ § Æ(¥$Ç,ç$ç(ç$Æ(ç,Æ$Ç(ç(¥$Æ §(¥$Æ † Æ$Æ,Æ,Æ-*) - Æ„¥¥ † Æd Æ ¥ ¥ ¥(¥ §$¥¥(¥$¥$¥ §1)) e$„$¥$¥$d$¥$„$¥$d ¥(¥1$Ç) § ç § Æ Æ § Æ(¥$Ç(ç(ç(ç(ç$Æ(ç,Æ$Ç(ç(¥ §(¥(ç † Æ(¥ §(ç1-* ç e¥¥¥ †¥$¥ e$„c …d …c …$d„,Æ-*$d$„$„c$„ d$„c„$dƒ ¥,¤5J † †ƒddd ¥ e ¥ …$d ¥(¥(¥(¥(¥(¥$d(¥$¥(¥ †$„ …¥ † †(¥5$Çd$¥ed$¥… ¥$c$„ d „ d „ddƒd e$¥1 §$„$d$„d$„ c$„d$dƒ$d$„-) -c ¥ „dd … ¥ e$„d(¥ †(¥(¥(¥(¥$d(¥ †$¥$¥ e ¥ … ¥$¥ e5I1*e „ …d¥ d …d$„c …$d$„d$„c „$d$Æ1d$„$„$„$d ƒ$„d$„ƒ e „$„-*$¥d ¥d ¥d ¥ e$„ ¥$¥$„ †$„ †,¥(¥(¥$¥ † † …(¥¥d$¥ e(¥5,éd ¥d¥d †$„ d „d „$d$„d$„c$„d$„-* § c$„$„ d$„$„ƒ „d$„c$„-)d eƒ$¥dd ¥ e ¥$¥$„ †$„ †(¥,¥,¥$¥ †$„$¥ † ¥d$¥e(¥1)1L$¥ ed¥ †$„ d„$d$„d ƒ d ƒd$ƒ d$„(ç-*d$„$„ƒ$„$„$„ „d$„ „$d$„-*¥d „ddd „d ¥$d ¥(¥ †$„(¥$d(¥ †(¥d …$„ „ …d$¥$¥(¥5m$çdd „ … edd„c$„ d„$dƒ d$„ c$„$„-* §$„$d$„$„$„ ƒ$d„$dƒ ¥$d1$Çd „dd„d „d ¥$„ §$„ †$„(¥$„ †(¥ ed$¥ „ e „d(¥(¥1-ldd „ …ddƒ e$„d ƒ$d$„ƒ$d$„ c$„(¥1L$„ ¥$d$„$„$„$„$„ƒ ¥ d$„$„) ed „d„d„d ¥$„(¥ †$„(¥ e$„(¥ …$„ e$„ „ † ¥$„ ¥(¥(¥5k$Çddd¥d „d ¥$d„$d$„ d ƒ d ƒ d$„$„5J ç$d$„ƒ$„$„$„$„ ¥$d$„$„$d(ç Ædd „dd „d ¥$„(¥ †$„(¥(¥ d(¥(¥ d(¥ …$d ¥$„d$¥$¥(¥,é1Lddd„„…$d„$d „ c „ c$„c „$c „$¥5Jd$d$„$„ ƒ$„$„$„$„$„$d$„$„ çd „„dc ¥$„$¥$„(¥(¥(¥(¥(¥(¥(¥(¥,¥(¥(¥(¥$d$¥$„(¥(¥ †$d1L ç dd„dd„„$dƒ$d ƒ$d ƒ$d ƒ d ƒ$d ƒ5J$Ç d$„$„ c$„$„$„$„$d$„ „ ƒ(¥ †d „„d$„d$¥$„(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥$d(¥$„$¥$„(¥(¥ †,ç-* ddd„ddƒ$d § §,Æ$Ç$Ç § § † † †,é1) -(¥$¥ †$¥(¥ † § e ¥d$¥ †-*) § §$Æ e …$¥ e$¥$„ †$„ † † … †$d †(¥ †(¥$Ç$Ç †$Ç$Ç §,é-l) - § § § §Æ § §$Ç § §,¥ §$Ç,é † † † †$Æ1L1L$Æ †$¥(¥ †(¥ †$¥d¥ †$„,é)K Æ §$Æ †d(¥$¥ †$„ …(¥f † … e †$„ §(¥ †,¥$Ç §$Ç$Ç §$Ç1L1L §Æ § §Æf § §1Œ=¯9=Ž=¯A°11L-*-l5=Ž=ï559k=ŽAð=ï=¯A°=Í=¯A°9ï=Ž=ŽAï=Ž51*1Œ1L1L55m955m59m5m11L1L1L1L1=¯A°=ÏA°=¯=¯AÐ=¯=ð5AðAòAñAòAñ=ð=¯1595m1L11L-*-l5m5A¯=Ž555A°=ï=¯=ŽAð=Ž=¯=ï=Ž=Ž=¯A°=Ž5J-l1L1L1L551595m5m5n11L1L1L15A¯=°=ÏAò5A¯5Aò=ð5Aò5Ž111,ç,¥0ç0ç-*=Ž(¥$„$¥d$¥d „d ¥(¥d Æ$¥$¥(¥$¥$¥$¥d ¥c$Æ(¥d¥ † ¥(¥5J=Ž1L5I5J1L5J5k5m9k5m5k1L5k5m1L5J-,é11-1)5)1)5)1)5)1)1)51*51L- e$¥$„(¥(¥ e „ „d ¥ ¥$„ „$¥(¥ Æ(¥$¥$¥ † eƒ Æ$¥ ¥$d „¥(¥,ç=¯1L5I5J5J5k1L5k5k9m5k5k5k9mF=Ž1,ç,ç,é115I5)15I1)5)9),Æ † d$„,é5m(¥ d „ddd„d …$¥$dd$„ddddd „dd¥ †ƒdd …(¥1=Ž,Æ(¥ †(¥(¥,¥$Ç,Æ0ç$Ç,Æ0Æ=Ž1Œ †(¥$d(¥$„(¥,¤(¥$d,¥,¥,¥,¥,¥$Ç,¥,¥$Ç,é$„(¥ †$ddd„dd„ e ¥ „dddd„dddƒd(¥dddd(¥,¥51)(¥(¥(¥(¥(¥$Ç,¥0ç$Ç,Æ,Æ5J=¯1(¥ e(¥$„$„(¥,¥$d,¥,¥,¥,¥(¥,Æ §$„ e11L,Æddd„dddd ¥d„dddd„edd „… ¥$dc„d$„55(ç,¥ §(¥$Ç0ç §,Æ,é,Æ,é0ç=Œ5m §(¥(¥ †(¥(¥ e(¥,¥(¥(¥,¥$Ç,¥0Æ,Æ(¥ §-$d(¥$„$„„dd„dd$¥dddd„dddd„d„¥ „d„d …,Æ51,¥ § †,¥$Ç0ç$Ç0ç$Ç,Æ,é5)A¯$Ç,¥ †(¥ † §(¥(¥(¥,¥$Ç,¥,¥$Ç,Æ † ed-5,¥dd„dd„dd$¥dddd„dd„d„d¥ …$d„dd$¥11,é,Æ$Ç,¥$Ç §,Æ0ç$Ç0ç$Ç0ç=Ž5m(¥(¥ e¥ † § § §(¥(¥ §(¥$Ç,é,Æ,é,¥,é1 d(¥$„ddd„ddd †ƒ e „dd„dÆcd„…$¥dd„d$¥(¥51*,Æ$Ç,¥ §$Ç,¥$Ç0ç$Ç,é,¥5JAò$Ç,¥ †$¥¥ §(¥ †$Ç,¥$Ç$Ç,¥$Ç(ç,Æ e¥51,¥dd„d„dddd„d„„ddd„d…d „$¥ddd „ †,ç5m4ç$Ç0ç$Ç §,¥$Ç$Ç0ç$Ç$Ç0Æ5m1L „f„„e†„e † §,¥ §,¥$Ç,é$Ç §--*$d$„ … dc„d„dd …dddd„dd„dddd$¥d „dd¥(¥5m15$Ç$Ç,¥$Ç §0ç$Ç$Ç,Æ,é5A¯ §¥e…d…f¥… §1 † §-(ç$Ç †$c11,¥ d „ddcdd„ ec„dcd„dd „„dc …$ddƒd$„,é1L0ç1$Ç$Ç0ç$Ç$Ç,é0ç$Ç,é,Æ5J) -d¥†e…„e„„d † Æ §,Æ$Æ$Ç,ç1) -d$ddƒdcdd dd„$d„„cd„dc … „dc …$„cdƒ$„(¥1L1),é4ç$Ç$Ç$Ç,é$Ç0ç$Ç,é0ç1=¯f…f…e…„e„d Ædd §(ç$Ç §$Ç-*11*$Ç § §f¥†¥dd„dÆe¥†„Æ §f†$Ç § ç §$Ç%$Ç1L1L%$Ç$Æ$Ç §(ç § § §$Æ † §=¯=ŽfÆ §$Æ § § § §(¥$Æ-1$Ç) -1*1-*9=¯) -%!$Çf §†f¥…dd„d¥…e¥† § ÆfÆ § § ç §) -$Ç) --l) - § §(ç$Ç$Ç,¥$Ç$Ç$Ç † †1Aò æ¥ ç$Ç §(¥ † §,Æ §$Æ$Ç ç$Ç=Œ=Œ5m5J5m=Œ1L1-l-*1*) --)-*1*5-l-*1*1-*)J1L5J-*1L1Œ5k5A¯5Ž1Œ5m1L1Œ5k1Œ-*1*)-*1*-*)K1L1L1L5k=Ž=ï=Ž=Ž=Ž=Œ=Œ=Œ=¯Iï=¯A°=ÏIðAð5A°9Œ9m=Œ=Œ=Ž5m) -1*1L)J1)-))K-*9-l1L-*11L-*1*)J5J-*-l559=¯1Œ1L51L5k55J)K,é) -)K-*1*-*1*-l1L5A¯9ï=Ž5=Œ5k=Ž=¯A°=ÏA°=¯Iï=¯=Žd †$„(¥$d(¥ …d ¥ e ¥$„ ¥(¥1)K(¥,Æ(¥,¥,¥(¥(¥(¥ ¥$¥(¥ ¥$Ç1L1 §(¥$Æ §$„ †$„ †$¥ e Æ §(¥,Æ$Ç(ç,Æ$Ç(ç$Æ,ç$Ç$Ç(ç,ç0ç,é-*(ç,¥(ç(¥ §(¥$d,¥$„(¥(¥ †$dd ¥ … ¥ e(¥,Æ1L(ç$¥,¥(¥(¥,¥(¥,¥$¥$¥$¥$¥(¥)K1)$Ç,¥$Æ §$„ †(¥ † ¥ ¥$¥ †$Æ §(ç,Æ(ç$Ç$Æ,Æ$Ç$Ç$Ç(ç,ç0ç$Ç1L0ç(¥$¥d„d¥ † … ¥ ed ¥dd¥d(¥ †55m$Ç,¥,¥,Æ$Ç,¥0Æ,ç$Æ$Ç,Æ § ç5,ç § § e(¥ …$¥ † e¥ … †$¥$¥ †(¥ † §(¥ e †¥$¥ † † §,¥0ç,é(¥,Æ † §(¥(¥(¥ e … † dd …„ed$¥d$Æ,Æ5m-,¥0Æ,¥,Æ,Æ,Æ,ç,Æ §(ç$Æ †-l5)$Ç § e$¥ † † … ¥ ed$¥ † †(¥ †(¥ † §(¥ †ed¥ † †,¥,Æ1$Ç,¥ e…ddd „ …„ e„¥ ed¥ † †(¥-*1* ¥,¥0Æ,Æ0Æ0Æ0ç0ç$Ç,Æ ç § ç1L-(¥ †$¥ e¥ …¥ e¥ †¥ †(¥ †$¥ † §(¥ e Æ † † †$¥ †,¥,é$Ç,Æ,¥$Ç(¥ §(¥ † †dd$¥d…$¥d¥ e$¥ †0ç1L §(¥0Æ,Æ,Æ0Æ0Æ0ç$Ç(ç$Æ$Ç Æ-*1* §(¥ †$¥ e „¥ †d †¥ †(¥ †(¥ †(¥ †$¥ † †„ † †(¥ §,¥1$Ç,¥ §$¥ ed„†d¥dd¥e¥… ed$¥1-l e,Å0Æ,Æ0Æ0ç0Æ0ç0ç §$ÇÆ,é1L(ç §(¥ e †¥ … e¥ †d$¥ † †$¥ †$¥ † § †d § ¥ † †(¥ †0Æ-* §(¥ †(¥ § †(¥e †d…dd¥ e…¥ e … §5 §(Å0Æ,¥0ç0Æ0ç0ç0Æ$Ç(ç † ç1L1 § † † † ¥ e …¥ e¥ † †(¥ †$¥ † †$Æ † e¥„ † § †(¥,¥) -$Ç,¥ †ddd„ „ed¥dd… e¥d$¥ †%1L,ç0Æ55====5 §(ç †%-* §(¥ †¥$¥e …¥e †$¥ …¥ †(¥ † † § e ¥$¥ e¥ …$¥ †,¥0ç) -,¥$Ç †(¥ §(¥ e „dd¥d¥ed¥…d$¥ §1L-0ç4ç5====5$Ç §$Æ §1L$Ç$Æ §$¥ e …¥e †d$¥¥ † †$¥ †$¥ † †$¥e …d¥ †(¥ †0Æ-*,é(¥ ed „d „dd „dd„dd „¥ †(¥,é1L ç,Æ † §,é5$Ç,Æ$Çdf¥%) -(¥ †$¥ e …¥e …d „…$¥ †$„ †(¥ †$¥ †d$¥ e…$¥ †(¥(¥,é5k §(¥(¥ †(¥ †(¥ † eƒ ¥ddd¥d † ¥(¥ §1L,é ç(¥ †,é,é,é,Æ$Ç(¥d¥ §)K$Æ †(¥d$¥ed … „¥ e …¥$„ †(¥ †(¥ †d … „¥ †$¥ †(¥,¥-*,é(¥(¥dd ç §$Ç!f ç § ç ç ç § § §$Ç)K-*e…„ddf §… §)K) -) -)K1L ç § § ç § §f¥†f § ç § § § § § †$Æ † § † † §$Ç,é$Ç551*,é) -,é,é,é,é$Ç † ††Æ¥ †f § Æ § §-*9!dd„ dd†fÆ!1L) -) -9$Ç § § § §Æf†f Æ § § § § § § † § † † Æf Æ$Ç,é$Ç,é5k5m) -,é) -,é55k95k1LAï51)1L-)) -)K-*)J5m5k1*-*1*) -1*1Œ1L1=Ž=ï55k=Ž5k5955Ž1Œ=¯=ð51Œ51Œ=¯95559Ž1Œ5m=ŽIð9ð9=¯A°9ŽA¯=Ž=Ž=Œ=Ž=Ž=Ž=Œ5m=Ž5m=Œ=ð5J,é-*-))K1)K-*1*1Œ5J1L11L) -)K1L5k59=°=Œ5m59k=Œ5559Ž5Añ5Œ5=Œ-l5=ð5595Ž51L5ŒIðAò55Að=Ž=¯=Ž=Ž=Œ=Ž=Œ5=Œ(¥,Æ(¥,¥,ÆAð)J e$¥$„ … e ¥(¥(¥$¥ † §$Æ$Æ §$Æ §(¥(ç(¥ †$„$¥$¥$¥ ¥(¥,¥(¥5kAò,è(¥ Æ(¥$¥$¥$¥$¥ †(¥(¥(¥,ç=¯5J(ç(ç,Æ(ç$Ç,Æ,Æ †$Æ §,¥,ç,Æ,¥,Æ0Æ5-$„ †$„(¥ e … ¥(¥ †(¥$¥ §$Æ §(¥ †(ç(¥(ç §$¥$„ †$¥(¥ †(¥,¥(¥1Að1L(¥ §(¥ Æ(¥$¥ † ¥(¥$¥(¥,Æ5m5Œ-,ç$Ç,Æ$Ç,Æ,Æ §(¥ §(¥,Æ(¥,Æ §$Æ,¥5m,é$¥$„ †$¥$d$¥(¥ †$„ †(¥(¥ †(¥ §(¥(¥,Æ §(¥$¥ †(¥ e(¥,Å,Æ,Æ5JIð-(¥ §$„ §(¥ †(¥(¥ †(¥,¥55 §,Æ(¥,¥ §(¥,¥ †$Æ §(¥ †,¥,¥,Æ,Æ,Æ1L1 †$d(¥ †$„(¥ e(¥ †$¥(¥$¥$¥(¥ †,Æ §(¥ §,¥(¥ †$¥$¥ e$¥,¥,Æ,Å1Að5k(¥$Æ(¥(¥ †(¥ §$d(¥ §,¥,¥=Ž-*(¥(¥,¥ §(¥,¥ §(¥ †$Æ(¥,¥(¥$Æ(¥ †,¥-*,é e$¥$„$„(¥$¥$„ †$„(¥(¥ †$¥$„(¥ §(¥(¥(¥(¥$¥$¥(¥(¥,Æ,Æ,Å,¥5kA¯$Ç$Æ(¥ †(¥ †(¥ † †(¥ §(¥,é=¯,ç,¥,¥,¥ §(¥,¥,Æ,¥ §(¥ †$Æ$Ç,¥,é0ç1L-*$d(¥$„$„ †$„(¥$„ †$„(¥ †$„ †$„$¥(¥(¥(¥,Æ$¥$¥ ¥(¥(¥,¥,Æ,Å,Å1=¯1*(¥ §(¥ †(¥ †(¥(¥ †(¥(¥,¥5m1L,¥,¥,¥,¥ §,Æ(¥(¥,Æ † §(¥(¥ †(¥(¥ §5) -$„$„$„(¥$„(¥(¥(¥(¥$„ †$„$¥$¥(¥(¥,¥,¥(¥(¥(¥(¥,Æ,¥,Æ,Æ,Æ,Å5A°$Ç(¥ † †$„ †(¥$¥ †(¥$¥(¥0ç=Ž1,¥,¥,¥,¥,¥ §(¥,Æ(¥ † § §(¥$Ç$Ç,é5k) -$d$„(¥$„$d(¥(¥(¥(¥(¥$d(¥ …(¥ †(¥$d,¥,¥(ç(¥(¥(¥,¥,¥0ç,Å,Æ,Å1)Að)K(¥ † †$„ †(¥ †$¥ †(¥ §(¥=Œ5k,¥,¥,¥,Æ(¥(¥,¥,Æ(¥ †(¥(¥$¥(¥ †(¥$Ç5) - e$„$„(¥(¥(¥(¥(¥$„ †(¥$¥$d,¥(¥(¥,Å0ç,¥,Æ,Æ(¥,Æ(¥0ç,Å0ç,Æ5JAð) †(¥ †(¥ † † …$¥$¥ †(¥0ç5m-,¥0ç(¥,¥,¥,¥,Æ(¥(¥ †$Æ §(¥ §,Æ$Ç=Ž1)$d(¥$„$„$d(¥(¥(¥(¥$„(¥ e(¥(¥$„(¥(¥,¥0ç,¥(¥,Æ,¥,Æ,Å,Æ,Æ0ç,Å-=¯1* §(¥ †(¥ † e ¥$¥ †$¥(¥(¥5k1L,¥0Æ,¥,¥,¥ §,¥,¥,Æ †$Æ †$„ †(¥(¥,Æ,é,éc …$d$„ ¥$„$d(¥ …$„$„(¥$¥(¥,¥,¥,¥,¥(¥$¥(¥,¥,Æ(¥,Å,Æ(¥,¥-)=Ž) - ¥(¥ † e$¥ † ¥(¥ †(¥ †(¥5m,é,¥,¥,¥,Æ,¥,¥(¥,Æ,¥(¥ †(¥ †,Æ †(ç1L1 e$„$„ e$„ …$¥$„$d(¥ „$„ †$„(¥,¥(¥,¥,¥,¥$¥(¥,Æ,¥,Æ(¥,Å,Å(¥,ç55$d(¥ † … Æ$„ e$¥$¥ † § d-*1*,¥,¥,Æ,¥,Æ(¥,¥,Å,¥(¥ e$„ §$Ç$Ç,é1L5m-l$Ç § ç § § §%) -$Ç%$Ç) -$Ç1*$Ç,é%$Ç%$Ç%$Ç),é)K-*9k=Œ551*†$Ç$Ç ç%!$Ç) -!!1L5A¯1L51),é4ç11) -51L1*-*,é$Ç-*)K,é1Œ1L,ç-,é † ç § §$Ç) -!,é%,é%) -,é%1!$Ç$Ç%$Ç$Ç) -) -1*1L=Œ55m1Œ § §) §!) -!) -$Ç!-*9m=°1,è$Ç$Ç!,é%) -1) -) -) -) -5Að=¯9Að=Ž=Ž=ï1Œ=¯9=¯5Ž15k91L1Œ1L51L1L1Œ55Œ1=ŽAòAð5=Ž=ïAð=¯IïIðAð=ï=ŽAð=ðAò=¯Ið=ðAò=Ž=ŽIðEðAð=¯=ï=ŒAð=ðAò=ŽAðAðAðJNS=ÐIðAòJAð1Œ=Ž=Ž=Ž5ŒA¯9ŽAð5155k1L1L1L51L1L1Œ5m595AðAð5=ï=ŽAï=ï=¯JIð9ŽAð5IðAðAðAð=¯=ð=¯=ŽAðIðAïAð=Ž=ï=¯A°=ð=¯A°9ð=ðJNSAÐ ¥ e ¥ ¥$¥d Æ$„ e §(ç)K$¥$c$„$„ ¥$„$„ ¥$d$„ „,Å(ç,é ç(¥ ç(¥¥$¥$¥¥ §,Å(ç$Æ$Ç(ç(¥(ç$Æ,Æ$Æ §$¥(¥$Æ$¥$¥ †(ç(¥1L)$¥d¥d¥ † „ …Æ$¥ e¥$¥ † ¥ ¥ e Æ(¥-* ç$d$„$¥$„$¥$„$d$„ „d(¥,ç,ç%$¥ § ç ¥ ¥$¥ †(¥ §,Å$Ç(ç(ç Æ,Æ$Æ,Æ$Æ §(¥ †$Æ(¥¥ §(¥$Æ5) - ç †d „¥ †¥ e e$„c$„d …c„ e$„$Æ5J d …$d$„ d$„$d„c„ e$„$¥5J †$¥d edd¥(¥d †$„$¥(¥(¥(¥(¥(¥(¥ †$„(¥ † …$¥ e¥ †(¥=Œ$Ç e¥d$¥ e¥d¥ d …$d$„d …c„$dƒ$¥-* §$d$„$d„$c$„„d$„ „d$„1,é „ eddd ¥d$¥ e ¥ …$¥(¥(¥(¥(¥(¥(¥ †$¥$¥$„ † … „¥(¥-*1L$dd¥ … ed … „$„$„c …$d„$dƒ d$„$Æ1d$„$„ ƒ$d$„ƒ$d„ ¥$dƒ$„-*$¥ ed „¥d …d ¥$„$¥ †$„ †(¥(¥(¥(¥(¥ † †$„ † … „ e¥,¥5m,éd ¥d e„ …¥ †d$„d$¥$d ƒd$„c$„$d1) § c$„ ƒ$d$„$„ƒ$d„c …$„1%d „d¥d … ¥ e ¥$„$¥$¥$„ †(¥(¥(¥(¥ †$„ † …$¥d¥ †(¥5-l † ed „¥$„d$„$d„$dƒ$dƒ d$„ c$„(ç-* e$„$„$„$„$„$„ „d$„ „$d$„-*¥d „dd„d „¥ †$„(¥ †$„ †$„(¥(¥e … e ¥$„ „d$¥$¥(¥5m$çdd „¥d¥ dd …$d„$d$„d ƒ d$ƒ$d$„-* §$„$d$„$„$„$„ „d$„d$„$„-) çd „dd „d „d ¥$¥$„(¥ †$„(¥$d †(¥d †$„ „$¥d †$„(¥) -1L dƒ „e …c„ e$„ dƒ$d „$c „ c „$„(¥1L$d$„ƒ$„$„$¥$c$„$„ „$d$„$„%dd „d„d „d$¥$„ †$„ †(¥$d(¥$„ †$„ …$d$„ … ¥d$¥(¥(¥5k$Çdddd …dd ¥$d„$dƒ$d „ c „ c$„$„-*$Ç d$„$„ƒ$¥$„$d$„$„$„ „$„(ç †dd „dd „d ¥$„(¥ †$„(¥ e(¥(¥$d(¥ „ e$„ … ¥ e ¥$„(¥11Lcdd„d¥ d$„$d „$c „$c „$d ƒ$d$„$¥1Œ$dƒ$„$d$„$„$„$„ c$„$„ƒ$¥ § „ „„cd ¥$„(¥$„(¥(¥(¥,¥(¥(¥(¥(¥,¥(¥(¥(¥$d(¥$„(¥(¥ †(¥1L § e „c„„¥d e ƒ d$„$c$„ c „ c$„$c$„5J ç$d$„$„ c$„$„$ƒ$d „$„$d ƒ(¥ Æc …d „ƒ ¥$„(¥$d(¥,¥(¥ §,¥$d,¥ †,¥(¥,¥(¥$d$¥$„(¥,¥ †,é-*cd„„ddd$„ † † †$¥ § †eddd §1L% §(¥ †,Æ(ç$Ç$Æ § Æ §$Æ,Æ) -) -(ç § †d$„d † „$„ ed … †e „ e †$„ „(¥$¥ † e § † † §)K §cdddcdd$„ ¥ †(¥ † †$Çe… dc †-*)K$Ç † e(¥,ç(ç §$Æ § Æ$Æ §1) -,é ç †dd … e …$¥ dd … e † „ †$„ †$„d(¥ † e † § † †-*) -f†Æ$Çe„e†1*1+5Ž) (è) -1*-*1k9k5L5k1K5K-*(é) 1l1l5l1l1m1L1L5Ž5l1K5l5l1J1K1l1 -(è5L-*(è% 1*-*1K5l5k5K1K1K1K(é) 5K1m5l1l1l1L1l9¯9m5K1L59Œ1J-+(¥ …5*$…ddd „dd„d„…„d$…5K(Æ(¥$¦,Æ(Ç0Æ5m(¥$¥$…(¥,„,Æ,¦(Æ,¥1 -$Æddd „dd„dd„…d „1*,Ç$¥(¦(Æ0Ç(Ç=(Æ$…$¥(¥,¥,¥,¥$Æ …1K$„dd„ …d„d…d… …d „1K,Ç(Æ$§(Ç(Ç,ç5m$¥…… ¦$¦(¦,è,è,è1 -(Æddd„„dd„d……d„1 -,è,Æ$§(Æ,Ç(Ç9m$¦………$¦(Ç(Ç(§ ¥1K$¦…ddd„dd„…d ¥… …1*(È(Æ(Ç(Ç,Ç$¦5L„¦………$¦$Æ ¦ ¦-+(Ç…ddd„d„d…d …… …- -,è(Ç(Ç(Ç(Ç(¦9l…¦……„ ¦¥- 11*(è(è$È(è1*)(è,è,è)- 1L1J1*- (é$Ç(è(è-*- 5l1*1*5J5L9k9l5l5J1*1 - (è(ç(è1 -) ,è(è-(è-1l1J1*- -- $Ç(è(è- - -1K1K1*1J5K9l5K1*d ……„……$¥1+(¥0Æ,Æ,Æ$Ç$Æ)*(Ç ¥ … ………$¥$† ¦ ¥ …… ¦,¦(Ç(¦$¥$† … …„…… ¥1*(Æ,¥,Æ,Æ(Ç$Ç$è- † ……… … ¥$¥ † ¥ †… †(¥,ç$¦e……d……… …-+(¥0Æ4ç4ç(Ç Æ1 -$Æ †…… …¥ † ¥ … †„… ¦,¦,è$¦$…$¦e„……d¥1 -(¦0æ4Ç4ç,Ç$Æ(é(Ç ¦… ……… ¦ … ¦ †……$¥(¦,é$¥d……„…… ¥ ¦- -¦…$Æ ¦ ¦ Ç-K… †……e… ¦ … ¦ ………$¦,Ç1 -$Ç(§ ¦ …¥…d¥ †) Ç… ¦$Æ §Æ) ¦ †……e… ¥ † ¥ ………$¦$¦1+(¦ ¦1*1)5m- --$Ç(é-)(è(è(é-*5k- -1*-)1*5k9- -1J-*- --)1*=¯1K5K5K1*1*5*5+10è1*$Ç$è(è- (é$è) -*1K1*1 --)1*1*9®-*-*-J-*1*-)AÏ1J5L5K5K1*5+(¥$¦1 (Æ …$„$¥$¥$… ¥$¦$¥(¦$¥$¥(¥,Å15m$¥$…$¥$¥$¥,Ç1+(¥(¦(¥(¦ ¦$¥$¥(¦,Æ(È$…$¤$…$¥$… ¦$¥(¥$¦$… ¥$¥,¥,æ9Ž$¥$¥$†$¥$¥,¥5M(¥(¥(¦$¦ ¦(¥$¥$¦(Ç(Ç$„(¥(¥$„$¥$…(¥$¥,¥(¥,Æ,¥,æ11L$¥$† ¥ …$¥(§5K,¥(¥(¥,¥ ¦$¦$¥$¦,è,è$„$¤(¥$…$„(¥$¥(¥(¥(¥,¥,Æ,Æ,æ9Ž …$¥ … ¦ …(¥5l,¥,¥(¥,¥$¦$¥ †(¦- $Ç … …$¦$¦$¥$¦$¦(Ç(¦$¦(Æ,Æ,ç- 5l … ¦ ¦ ¦ ¦(é1K(¦$¦(Æ,Ç,Ç(Ç$¦$¦$Ç(é… …$…$¦ ¦$¦(Æ(¦$¦$¦(Æ(Ç,ç15m ¥ ¦ ¦ ¦$¦$È1L(Æ(¦(Æ(¦(Ç$¦1K1+1K1J-*5L-*-)- - )1*1J1L1k1K5K9Œ5k5K5l5l5k1L5l5K5K91K1K1l55l1K1L1J1+1K-+1)- -)- - 1K1k1K1K1k9l5Œ5K5L5l5l-K=l5K5K5l5l1K1l5 d „d „d)$d „ „ d„ „,è …„d … … …$¥(¥(¥ …$… ¥ …$…-* …„…„… d „d „(Ç ¥$„ d „d „(Æ ¦ „d… … …$¥$¥(¥$…$¥ …„ …5Ke„ …d „ „d „ „-$„ „$„$„ „ „(Çd„…„ …$„ …$¥$… „ … …„(¥-*d„e„… d „ „ „(Ç ¥$„$„$„„ „$¦ ¥„d… „$¥ …$…(¥ … „ …„$…1*„…dd … „ „d „,è ¥$„$¥$… ¤ …(Æ ¦…d$¤$…$…$¥$…$¥$…$¥$… …$¦1*e¥d…… ¥ …d „(Ç$Ç „$¥$„$¥$„$¦ ¦ …„ „$…$¥$…$…$¥$…$…$¥ …$¥- -……d…1*1*9Ž- (è) --*-*1K5K1J5K1J1K-)(è- 5l5l1l5l1l1L1l9Ž5l5lA®9Œ=5l9l9®=l9- $è- -+- 1J5K5k1K1*1K1*(è- 1K5l5m1l5m1L5l9¯95K5L5l91K-+(¥ …5+$„ddd …dddd„…„d$…5K(¦(¥(¦(Ç,Æ,Ç5m(¥$¥$…(¥(¥,¥,¥(¦,Æ1Kdddd „dd„dd„…d „1*,Ç$¥(Æ(Ç,Æ,Ç=Œ(Ç$…$¥(¥(…(¥,¥$Æ e1K$…d„dd„d„e„…„d ¥1+,ç$¦(Æ(Ç,Ç(È9 ……†¥(¦$¦,Ç,Ç,ç1Ldd„d„d„d…d„ …d …- 0è(Æ$§(Æ,Ç(Ç9l$¦……†$¦(Ç(¦(Ç …1L(¦„ed„dd„„……… … †1*,ç(Ç(§(Ç$Ç(¦9d¦………$Ç,è,è(Ç5m¥…ed„d„d„…e…… ¥- -,è$Ç(Ç$§(Ç(Ç9l…¦………$¥ ¦- -1 (è(é$Ç(è1J(é,è,è,è(è-)1l1)1 --*)$È$è,è- - -1k1J1*1*9K9l9l=l5K1*1 ,è$è(è(ç-J- ,è,è(è)-1L5K-*- ) (Ç$È),é-)1K1+1J1*5K9m5*-*d… …„……$¥1+(¥,¦,Æ0Æ$Ç$¦)*(Ç † ¥ ……… ¥$† ¦$…†¥ †,Æ(Ç$¦$…$¥ ……„… „ †1 -(Æ0¥(Æ0Æ(Ç$Æ$é,è ¥ … …… … …$¦ ¥$†¥… †(¥(è(¥e„e„…………1*(¥0ç8ç4ç(Ç$Æ- -$Æ † ……… ¥ † ¥ † ¥……$…,Ç(Ç$¦$¥ ……„e………- (Æ0Ç4ç4ç,Ç$Æ$é(Ç ¥†… …… ¦ … ¦ ……… ¥(¦,é ¥e…¥……¥… ¦-+¥… § ¦ § Ç-* † ¥…………$¦ … ¦……¥$¦(È1 -(Ç$¦ † „…d…… †-* Æ… ¦$§ ¦Æ) - ¦ †………… † ¥ † ………$¦(Ç1*(Ç$¦1)- -9l-*(è$è(è- (è$è,é-*1k1 1)- 1*5k9-*-*-*- -1)1+=®5K5K5+5*-*1*1*5K- -$Ç$Æ$è(è- (è(è) -)5K1*- -)1)1+=Î- -*-*-*- -1)=¯5K5K5+5J1*1*(¥$¦1$Ç$„$…$¥$¥ …$¥ ¥(¦(¥$¥$¥(¥,Æ15l$¦$¥$…$¥$¦,Æ1K(¥(¦(¥$¦$¦ ¦(¦1(È „d$¥$…$¥$„$¦$¥$¦(¥$¥$¥$¥,¥,ç9®$¥$¥$†$¥$¥(¦5L(¥(¦(¥$¥$¦$¥$¥$†,ç(§$„$¥(¥$…(¥$…(¥(¥,Å(¥(¥,Æ,Æ15L ¥$… … ¥$†,Å5K,¥,¥(¦,¥$¦ ¥(¦1*,è d„$…$¥$…$¥$…(¥(…,Å(¥,¥,Æ,Æ0ç5 …$¥ … ¥ †(¥5L,Å,¥(¥,¥$¦$… †(¦- (è … …$¦$Æ$¦$¦(¦(Æ(§$Æ(¦,ç,ç1)1l † ¦ ¦ Æ §(è1L(¦(Æ(Æ(Ç(Æ$Ç$Æ-+1* ¥… …$¥$¦$¦$¦$Æ,Ç(¦$Æ$¦,ç,ç1 5$… ¦ ¦$¦ ¦$é5L(¦(Æ(¦(Ç(Æ ¦1*1K1K-*-*1l- - - - ) 1)1+1K1K1J1K9l5K5K5k5L1k1K5k5K5K5m1K-K1l5m9l5Œ5l-*1*1l-*- -- - ) - 1J1L5K-+5K5k9l1K5k5l1L1J5l5K1K9l1k-K1l5l d„ d„ d,è „$„ „d „ „(ç ……d… … „$¥$…(¥ ¥$… ……$¥1*………„ „ d„ d„(ç …$„ „ „„ „(¦ Æ…d… ¥$…$¥$…(¥$¥ …$…… ¥1* …d … „ „ d ƒ d „,è „ „$„ „ „ „(Ç„d„„ …$¥ …(„$¦ „ … … „$¥- -d„e„d „ „ d „,ç ¥$„$„$„ „ „$¥ ¦d„„ … …$…$…$¥ … „ …„(¥1*d„e„ … … „d d) $¦$„$¥(¥$„ ¥(Ç ¦ …„ …$¤$…$¥$…$¥$…$¥ …$¥$†) dd„d „ d$„d$„(Ç$Ç$„$¥(¥ „$…$Æ$§ …„ …$„$¥$…$…$¥$…$¥$… ¥$†- -e…d…-*5*9) (è) -1*- 1J1K1K5K-*1J- -(è) 5l5m5l5l5l1L5l5Ž9l1K5L5K1J5m5k5K1*9l,è%- -*- 1*1K1K1J1J-*1)$é-5l5l5l5l5m1L1k9¯=5K5L5l=l-K1K$¦$…5* …ddd …d„dd„… „d …9K(Æ$¥(¦(Ç,Æ,Ç5m$¦$¥(…(¥(¥,¥,¥,Æ,¦,çed„d„„dddd„ …d „1*,Ç$¥(¦(Æ,Ç,Ç9Œ(§$¥$…(¥(…(¦,¥$Æ e1K$…d„d„„dd…d„ …d …1J,ç(¦$Ç(Æ(Ç,Ç5m ¥…† ¥$¦$¦,è,è,è,èd„dd…dd„e„d…d…1 ,è(Ç$¦,Ç(Ç(Ç9l$¦……¦$¦(¦(Ç(Ç …1L$¦…e„dd„d………… ¥$¦-J(È(Ç(Ç(Ç$§,Æ5L…¦………(Ç-,è-1+¥……d„d„e„…… ……$¦) -,è(Ç$Ç(Ç(Ç(¦5l…¦…†„ ¦ Æ--1 (ç(è$Ç(ç1L(è,ç,è,è(è-1L1J- - (è(Ç$è(è- - 1K1K1*1*9K5L5K5K1*1 -(è)$Ç(ç1+(é,ç,è(ç(è- 1k1J- - -$Ç$è(è- - 1K1K1*1*5L9l5*-*………d……$¥1+(¥,Æ,Æ,Æ(Ç Ç- -(Æ ¦ … … …… ¥$¦ † ¥ …†$¥(§(Ç(¦$¥$… ……„…„ …1*(Æ,Æ,¥0ç(Æ$Ç$è(è$¥ † ……… †$¥$† ¥†… ¦(¥,è(¥ed…„…e… …-*(¥4ç4ç8ç(Ç ¦) (¦ ¦……… … † ¥ † ………$¥,¦,è ¦$¦ … …„e………- -(Æ0Æ4ç4ç,Ç$Ç$é$Ç$¥ ……… … ¦ … ¦ ……… ¥$¦,è$¥e…¦…¥¦… ¦-+¦…$¦ ¦ §$è-+ ¦ ¦………† ¦ ¦ †… …¦(§(Ç1*(Ç$Ç$¦……d…… ¦- Ç¥ ¦ §$¦ç) -$¦ ¦………… ¦ ¥ † ¥……$¦(Ç1+(Ç$¦1)1 9m-)(è$È)-$è(è) -*5K- 1)- 1*5K9) -1*-*- - 1*=¯5K5K5*1*1*1*- 5m(Ç(è(è(è),è(é) (è1*1J1 1*- 1)1*9®-*-*1)- --)1 =°1J5K5+1*1*1*(¥$¦0é$Æ$…$¤$¥$…$¥$…$¥(¦(¥$¦ …(¥,Å15L$¦$¥ ¥$¥$¦,Æ1L(¥$¦,¥$¦$¥ ¦(¥1+$… „$…$¥$„$¥ …$¥ ¥(¥(¦$¥ ¥(¥,¥,æ9®$¦$…$¥$¥$¦(¥5m(¥(¥(¦$¥$¦(¦$¥$¥(È(Æ$„(¥$…(¥$…$¥(¥(¥,¥(¥,¥,Æ,Æ15L ¥$… ¥ …$¦(¦5K,¥(¥,¥(¥$¦$¥ §1K$„ d$„$…(¥$¥$„$¥$¥(…,Å(¥(¥,Æ0Æ,æ5Ž$¥ …$¥ † ¥(¥5l,¥,¥,¥,¥$¦$¥ †(Æ1 -$È … ¦$¥$Æ$¦$¦(Ç,Æ(Ç$¦(Æ,ç,è1*1k † ¦ Ç ¦ Æ- 1,(¦(Æ(Æ,Ç(è(È(è5(¦$¦ ¥ †$¦$Æ$¥$¦(Ç,Ç(Æ$¦(Æ,Ç,è1)5m ¦$¦ Æ ¦ Æ(é5L(Æ(¦(Ç(Ç(Ç$Ç1*1J1+-*-*1l- -- -,é)-*1*1K1K-J1K5K5K5k5K5L1K1*5l1K5J5m1K-J1l5l5K9l1K-*- -1K-*- - ,é)- 1+1k1K-J1K5K9k1K5K5K5L1+5K5J1K9m-K1J-K5k d „d „ d,ç „ „ „ d „„,ç …„e … … ¤$…(¥$¥$¥ … …¥$…1+„…… „ d „d„ d(ç …$„ „ „d „(Æ ¦ …„… …$„ ¥$¥(… ¥$¥ … … …1* …„ …d „ c „ d „,è „ „$„$„„ „(Æ…„d„ …$¥$…$„$¥ … „ … „$¥- -d…„„ d „ d „ d,ç ¥$„$„$„ „ „(¦¥„d„ …$¥$…$„$¥$… „ …„(¥-*d…d „ …$¥ … … …- $¦$„$¥ … „ „$Ç ¦… „ …$¤$…$¦$…$¥$¥(¥$¦$¦$¦)*† …… ¦ …$…$¦ … …(è$Ç$… „$¥ „ …$¥ Ç …„$…$¥$…$¥$…$…$¥$¥$¦$¦$¦1*…†… …1*5J9Ž- $è- - ---*1*1*1*-*-)- (è) 9m5l5m5l5m5L1l9Ž9l5L9l5l=995L5l- -(é-) - -- -)1*1J1*-*-*1*(ç(é5l5m5l5l5m5L5l=¯95K5L9Œ9l5l5L$¦$„1+$…d„d …d„dd„… „d …9K(¥$¦(Æ(¦,ç,Ç9$¥$…$¥(…(¥,¥(¥,Æ$¦(Æ$…„dd„„ddd„d …d …1*,Æ$¦(¥(Ç,Ç,Æ9m(Æ$… ¥(¥(…(¥(¦(Æ…5K$…ddd„d„d„e„ …d …1K,Ç(Æ$§,Ç,Ç,Ç5m …„†¦$¥$¦(Ç,È(Ç(Æ$…ddd…dd„…dd …„…1 0è(Ç$¦(Ç(Ç,Ç9m$¦…… ¦ ¦(Ç(Ç$Ç$¦1L(Ç………dd„…„…… ¦…$¦1+(ç$Ç(Ç$§$Ç(§5l…¦†¦ …(Ç(Ç(è1*) - ¦……„d„„e„ †… …¥$¦- -(è(Ç$Ç(Ç(Ç(§9l¥¦†…… ¦ ¦-,è1 $Ç(è$Ç(ç1+-,Ç(ç-(è-1L1*- -(è$ç(è(è- - 1K1*1*1)9l5L5K1*1 1 1)(È$è$ç(ç1+) ,Ç,è,ç(è- 1K1K- ,è- $Ç$è(è(è- 1+1J1*1*5K9m5*- d ……„e…$¥1+(¥,Æ,¦0æ$Ç$¦)*(Æ † … ¥……$¥ † ¦$…¦ … ¦,Æ(Ç(¦$¦$¥e …d…… ¥1 -(Æ,¥,Æ0Æ$Ç$Æ$é,è ¥ …… …… ¥$†$¥ ¦…… †(¥,è$……„e„……… …-*(¥4ç4ç8ç(Ç Æ- -$¦ ¥… …… …†$¥ † ¥ ……$¦,¦(è$¦$¦$……„e…… …) -(Æ4Ç4ç8ç,Ç Æ) -(Ç † ………¥ † ¥ † ¥……$†(¥(é$¥d ¥¦…¦¥ ¦$¦-+¥… § ¦$Ç È)* ¦ ¦ ¦…e¦$¦ ¦ † ¥ †¥(§,Ç1+(Ç(Ç(Ç †………¦$¦-+ Ç… ¦ § Æ$È)* Ç † ¦…… † ¥ ¦ † † ¥†$Ç(¦1K(Ç$§1 1 9l-)(è$È(ç- (è(è) ) -1J-- -)1 5k9Ž-)-*- --)- 1*=®1K5*5+1)1*5*1 5)5l(Ç(ç$Ç(è-(è(é(è1)1+-- - 1)1*9¯1 -))1*) --)1 =¯1K5K5+1*1 1*(¥ ¦1$§$…$¤$¥ …$¥$…$¥$¦(¥$¥$¥$¥,Æ15L$¥$¥$†$¥$¦,Æ1+,¥$¦,¥$¥$¦$¦(¦,Ç1*$…$¤$…$¥ …$¥$…$¥$¥(¦$¥$¥$…,Å,æ9Ž$¥$¥$†$¥$¦,¥5L(¥(¥(¦$¥$¦(¥$¥$¥,Ç$Ç$„(¥(¥(¥ …$„(¥(¥,Å(¦,Å,¦,Æ1(5L$¥ … ¦ …$¥,Æ5K,¥,¥(¥(¦$¥ §$¦(Ç5K$„$„$…(¥(¥$…$¥$…(¥,Æ(¥,¥,Æ,Æ,æ5Ž$¥ … † ¥$…$¦9k,¥,¥(¦,¥$¦$¥ ¦(¦1*$è ¦ †$¥$Ç$¦$Ç,Ç(Æ(Æ$Æ(Ç(ç0è1J5L ¦ ¦ Ç$Ç Æ- -5L0Ç,Æ0Ç,ç,è(Ç(Ç$è1K(¦$¦ ¥$¦$Ç$¦$Æ(Ç,Æ(Æ$Æ(§(ç,è1)5$† ¦$Ç Ç Æ(é5m(¦(Ç(Ç,ç(Ç$Ç-*-*1*-*-*1L- -(è- (è- 1J1K1K-*1*9K1k1K5K5K1K1 -5K1+1J5-*1*1K1K1K1J- -*-*5K)*-,è,é(è- 1+1K-K-*1J5K5K1K5K5K1K1*5K1K1*9l-K-*1K1K$„„ d„ d- d „$„ d„ „(ç ……d … … ¥$…(¥(¥ …$¥ ……$¥1*…„…… d „ d„ d(ç …$„ „ „d„,Æ ¦„e… … …$¥$¥(¥$… ¥ …„$¥1+ …„… „ d „ c „ „,è$„ „$„$„ „ „(Æ…„„„ …$¥ …$…$¥ … „ … „$¥- -d„…„ d „ d ƒ d,ç …$„ „$„ „ „(¦¥„d„ …$¥$…$¥$… „ … ……(¤1+d„… d … „ …dd- ¥$…(¥$¥ … ¥$Ç$Æ…„ …$„ …$…$…$¥$„$¥$…$¥ †) d„d„ …$„ …d „(Ç$è …$¥$¥ …$¥$¦$Ç…„ …$…$„ †$…$¥$…$¥ …$… ¦- -e¥ed,è- §$Ç(è(è(è$Ç- - - 1 1K,è-1,ç- - ¦$Ç(è$è(ç$Ç- - - - 5l,è1 -$¦(èd„d„……(è(Ç(Ç(Ç(é… ¥(Ç(Ç,éd„d„……$Ç,Ç(Ç(Ç- ……$¦$Ç$Ç ¦- (Ç,ç(ç-*(Ç$Ç$Ç(Ç(è(è1 1 (è$Ç$¦(é,ç,ç(ç-*(Ç$Ç$Ç(Ç(è(è1 (è…„…(è$¦,Æ$Ç(è…… † ¥… †,è$¦ †……$Ç$Æ,Ç$Æ$è …… … ¦… …(è$…,ç- -$Æ(Ç$Ç(ç,è(ç1 1*(è(ç1+1,è,è,ç,è$¦(Ç$Ç(ç,è(ç11K(ç(è5*-,è,è$¦(È$„$¥$¦(¥(¦(Æ0ç) ¥$¦- (¦,¦$Æ$¦(è$„$¥$¥(¦(¥(Æ,ç- ¦ ¦- ,¥(Æ$¦(Ç(è)(Ç$Æ(Ç- $è-,è-,è)1*$è)(è(ç(è(ç$Ç$Ç-$è,è--,è-1*(è(è „ d$Æ$„$… „$¦„ …$…$¥ … …,è„e… „$¥$¥$„ „$¦„ …$…$¥ … …(è„e,è- Ç$Ç(ç$È(ç$Ç- - 1 - 5K1 1 1 5)- §$Ç(ç$è(Ç$Ç- 1 - 1 5l,è1 -$¦,èd„d„……(è(Ç(Ç(Ç) … …(ç,Ç(é„d„d……$Ç,ç(Ç(Ç- …†$¦$Ç$Ç ¦- (Ç,ç(ç-*(Ç$Ç$Ç(Ç(è(è1 1 (è$Ç ¦,è,ç,Ç(è-*(Ç$Ç$§(ç(è(è1 (è………(è$¦,Ç$Ç(è …… ¥ †… ¥,è$¦ …„…$È$Æ,Ç$Æ$è †…… ¦ … ¥,è$†,ç- -(Æ(Ç$Æ(È,è(ç1 1*(è(ç5+-,è(è1(Ç ¦(Ç$Ç(ç,è(ç0è1K(è(ç5+,è,è,è$¦(è$…$¥$¥(¦(Æ(Æ0è) ¦$¦1 (¦(Æ$¦,è(Ç „$¦$¥(¦(Æ(Æ0ç- ¦ ¦- ,¦(Æ$¦(Ç(ç) (Ç$Æ(Ç)(è(è,è-(è,è1*$è(è-(è(è(Ç$Æ$Ç-$è(è--,è(è1*$è(è „ „$¦$…$¤ „$¦„ …$…$¥$… …(çd„ d „$¥$¥$… „$¦„ …$…$…$… ¥(çe„(è1 §$Ç$ç$È$ç$Ç- - 1 1 1K,è,è1 1,è ¦$Ç$ç$ç$Ç$Ç- - 1 - 9l,è1 -$¦,è…d„e……(è(Ç(Ç(Ç(é… ¥(È,è$Ç…d„d……(Ç,è(Ç(Ç- … ¦$¦$Æ$§ Æ- ,Æ,ç(è- -$Ç$Æ$Ç(Ç(è(è1 ,è(Ç$Ç Æ(è,ç,Ç(ç-*(Ç$Æ$§(Ç(è(è1 (ç………(è$¦,Ç$Ç(è…… ¦ †… ¦,è$¦ ………$Ç$Æ,Ç$Ç$è …… † ¥† ¥,è ¦,ç- $Æ(Ç$Ç(ç,è(ç11*(è(Ç5K,è,è(è1 $Æ$Ç(Æ$Ç(Ç,è(ç,è1K(ç(È5K,è,è,è$¦(è$…$¥$¦(¦(Æ,Æ1(é ¦$¦1 (¦(Æ(Æ- -$¥$…$¥$¥(¦(Æ(Æ0ç- - ¦ ¦1 (¦,Æ$¦(Ç$Ç- (Ç$Æ$Æ- $ç(è,è-(è(è1*$è(è,è$ç(è(Ç$Æ$Æ- $ç(è,è-,è(è1*$è(è „ …$Ç$…$„ „ ¦„ …$¥$…$¥ ¥(è…… „ …$¦$¥$„ „$¦„ …$…$¥$… ¥,è…„,è- §$Ç$Ç$Ç$ç$Æ- 1 - 1 -5K,è1 1 1 (Ç Æ$Ç$Ç$Ç$Ç$Ç- - 1 1*9L,è1 - $¦,é„e„„……(è(Ç(Ç(Ç) … ¦(Ç,è$Çd…d„……(Ç(è(Ç(Ç- … ¦$¦$Æ$§ ¦- ,Æ,ç(ç-*$Ç$Æ$Ç(Ç(è(è1 ,è(Ç$Ç ¦(è,ç,Ç(ç-*(Ç$Æ$§(Ç(è(è1 (Ç………(è$¦,Ç$Ç(è ¥… † ¦ … ¦,è$¦$¦……(È$Æ,Ç$Ç$è †… ¥ †¥ ¦,è$¦(ç1 $¦$Ç$Ç(Ç(ç(ç1 1*(ç(È5J,è,è,è0è- $¦(Æ$Ç(Ç,ç(Ç11K(ç(È5*,è,è,ç$¦(è$…$¥$¦(Æ(Æ(Æ1,é ¦$¦1*,Æ,Æ$Ç(Ç,è$¥$¥$¦(¦(Æ(Æ0ç- - ¦$¦-*,¦(Æ(¦(Ç$Ç-$Æ$Æ$Ç-$Ç(è,è-(è(è1)$È(è(ç$Ç,è(Ç$Æ$¦-$È(è,è-(è(è1 $è(è „ d$Æ$…$¤ …$¦„ …$…$…$„ ¥(È„d … „$¥$¦$„ …$Æ„ …$…$…$… …(ç…d(è… ¦ ¦,è,è(è(ç,è… ¦ ¦(è,è)(Ç ¦$Ç(Æ(è ¦$¦$Ç,è ¦$Ç(Ç(è ¦$¦$Ç(Ç(ç$¦(Æ(Ç1 $Æ- ,Ç(ç$¦(¦(Ç1 $Æ- ,Ç$¦$Æ$¦$Ç(Æ(Ç(è ¦$Æ$Ç$¥$Ç$Æ(Ç(è ¦(è… ¦ ¦,è,è) ,ç- … ¦ ¦,è,è) (Ç ¦$Ç(Æ(è ¦$¦$Ç,è ¦$Ç(Ç(è ¦$¦$Ç(Ç(ç$¦(Æ(Ç1 $Ç-(Ç,è$¥(Æ(Ç1 $Ç,è,Ç$¦$Æ$¦$Æ$Ç(Æ(è ¦$¦$Æ$¦$Æ$Ç(Æ(è ¦(è… ¦ ¦-,è(é(ç,è¥ ¦ ¦,è,è) (Ç ¦$Ç(Æ(è ¦$¦$Ç,è ¦$Ç(Ç(è ¦$¦$Ç(Ç(ç$¦(Æ(Ç1 $Ç0è(ç(è$¦(Æ(Ç1 $Æ0é(ç$¦$Ç$¥$Ç$Æ(Ç(è ¦$Æ(Ç$¥$Ç$Æ(Ç(è ¦(è ¥ ¦ ¦,è,è(é(ç,è… ¦ ¦,è,è) (Ç ¦$Ç(Æ(è ¦$§$Ç,è ¦$Ç(Ç(è ¦$¦$Ç(Ç(ç$¦(Æ(Ç1 $Ç1(Ç,è$¦(Æ(Ç1 $Ç1(Ç$¦$Æ$¦$Æ$Ç(Æ(è ¦$¦$Æ$¥$Ç$Æ(Ç(Ç ¦$¦$Ç$Ç(è$Ç$Ç$Ç(ç$Ç(Æ(Ç(è$Æ(Æ(Ç(è$Æ$Ç(Ç(è$Ç$Æ$Ç(è$Ç(Æ(Ç(ç$Ç(Æ(Ç(ç$¦$Ç(Ç(è$Æ$Ç(Ç(è$Ç(Æ(Ç(ç$Ç(Æ(Ç(ç$Æ$Ç(Ç(è$¦$Ç(Ç(è$Æ(Ç(Ç(ç(Ç$Æ(Ç(ç$Æ(È$Æ(È$Ç(Ç$Ç(Ç$Æ(Ç$Ç(Ç$Æ(È$Æ(Ç(Ç(Ç(Ç$Ç(Ç \ No newline at end of file diff --git a/glide2x/sst1/glide/tests/argb4444.3df b/glide2x/sst1/glide/tests/argb4444.3df deleted file mode 100644 index 1f3da27..0000000 --- a/glide2x/sst1/glide/tests/argb4444.3df +++ /dev/null @@ -1,5 +0,0 @@ -3df v1.1 -argb4444 -lod range: 1 256 -aspect ratio: 1 1 -UEggWVWVggggVFUU5EUEVVVWwhwhfgggww‰ ˆx xxxx xxxxxx xxxxxxxx xxxffEEVVEUVFfVVFVVEUWVUUFVUEUUEUE5DEEUVFfgVWggggggggVFggggVFUU5EUEEEEUggggEEEDFUVFggVVVV5DVEUUFVggx xggfgxxww‰ ˆxxxxxxxxwwx xxxxxx xxxggVFUUEEVVEEVVVVVVEUWVVVEUUEUU5ED5UUEUWVVVggggggggggVFggggggwwEEUUEUE5UEggWVWVggggVFUU5EUEVVVWwhwhfgggww‰ ˆx xxxx xxxxxx xxxxxxxx xxxffEEVVEUVFfVVFVVEUWVUUFVUEUUEUE5DEEUVFfgVWggggggggVFggggVFUU5EUEEEEUggggEEEDFUVFggVVVV5DVEUUFVggx xggfgxxww‰ ˆxxxxxxxxwwx xxxxxx xxxggVFUUEEVVEEVVVVVVEUWVVVEUUEUU5ED5UUEUWVVVggggggggggVFggggggwwEEUUEUE54DC4DC4DUUgg33#3"#3#33#3"#3333""3333333343333333##2#"233#3#"3#333333UUggfgUUgfffVWffggggggfgUUWVgfggUUTT4DC4UTVUTTUUUUUUUUUUUUUUDD"3""3333ggDD33##33#33333""3#33""3333333333333333##""3333"3""3#3333D3xgffVWffUUgfgfffggggfgffVWgg ™ ‰ggTDDDDDDDUUUUUUTTUUUUUUUUVVDC4DC4DCVUgg33#3"#3#33#3"#3333""3333333343333333##2#"233#3#"3#333333UUggfgUUgfffVWffggggggfgUUWVgfggUUTT4DC4UTVUTTUUUUUUUUUUUUUUDD"3""3333ggDD33##33#33333""3#33""3333333333333333##""3333"3""3#3333D3xgffVWffUUgfgfffggggfgffVWgg ™ ‰ggTDDDDDDDUUUUUUTTUUUUUUUUVV""#""""44gf"""""""!!"""""""""""""""""""""""""DDgg33"3""3""3##2#3333343333VVff""3""2""""2"#2""2"#2"#2"#2"#2"333333VWCD"""""""""""""""""""""""2""!""#2"ggD42"##""3""3""4333333433DDyxDD"""2#"2""""2""3""2"#2"#2""2"""""44gf"""""""!!"""""""""""""""""""""""""DDgg33"3""3""3##2#3333343333VVff""3""2""""2"#2""2"#2"#2"#2"#2"333333VWCD"""""""""""""""""""""""2""!""#2"ggD42"##""3""3""4333333433DDyxDD"""2#"2""""2""3""2"#2"#2"33""##"33gV"#""!""""""2""!"""""""""""""""""3C4gg34""##"24333343334333433ggVF23""##"2##""3""3"""333333343334""3333VFED""!"""""""""""""""""""""""""""33ggD33##2##2#34333433343344DDxg34""3##2##""3""3""3""333""3333""##"33gV"#""!""""""2""!"""""""""""""""""3C4gg34""##"24333343334333433ggVF23""##"2##""3""3"""333333343334""3333VFED""!"""""""""""""""""""""""""""33ggD33##2##2#34333433343344DDxg34""3##2##""3""3""3""333""3333##"""44ff"""""""""""""""""""""""""""#""""""""DDgg3334""43##33343334333433gggg""3"##""##33##34""3##2##33443344334443WVDD""""""""""""""""""""""""""#2#"!""2#"ggEE3333""43##433334333433UDxg44"3##"#"###3##34""442##33333##"""44ff"""""""""""""""""""""""""""#""""""""DDgg3334""43##33343334333433gggg""3"##""##33##34""3##2##33443344334443WVDD""""""""""""""""""""""""""#2#"!""2#"ggEE3333""43##433334333433UDxg44"3##"#"###3##34""442##3333334##"D4gg""""""""""""""""""""""""""2""#"!""244UU443343"#34##333444343344UUVV""#""""""#####""433343443344334433WVEE"""!""""""""""""""""""""""#"!""""3"WVDD4433#33334""4344"33444DDxg##2#"""""#""###33343"#443343##"D4gg""""""""""""""""""""""""""2""#"!""244UU443343"#34##333444343344UUVV""#""""""#####""433343443344334433WVEE"""!""""""""""""""""""""""#"!""""3"WVDD4433#33334""4344"33444DDxg##2#"""""#""###33343"#4433#3#""D3gg"#"""""!"""""""""!"""""!""#""!"""33ffD344333#4343443343334333EEEE""33"#"#"""####333334""3##333ggD3""""""""!""""""!"!""""""!#""!"""""""VVDDDD#3334343434433434433D3gg"#"##""""#"""33""3333#3#""D3gg"#"""""!"""""""""!"""""!""#""!"""33ffD344333#4343443343334333EEEE""33"#"#"""####333334""3##333ggD3""""""""!""""""!"!""""""!#""!"""""""VVDDDD#3334343434433434433D3gg"#"##""""#"""33""3333##33##44gg44#3"#"""""""!"!""""""""""#"###"2"##3#33EEVV#4##333433#333##34""###3ffgg"""43##""""###"3"3334##33##""##"243ggVF3#"3""""""""""""""""#2"""##"#3##3##44fV44#3##33433334""43##3#"3D3yx33"33#3"""#"3""2"#2##""##33##33##44gg44#3"#"""""""!"!""""""""""#"###"2"##3#33EEVV#4##333433#333##34""###3ffgg"""43##""""###"3"3334##33##""##"243ggVF3#"3""""""""""""""""#2"""##"#3##3##44fV44#3##33433334""43##3#"3D3yx33"33#3"""#"3""2"#2##""##ggUUgfUUgfggfgEEVVFVEEEDEEUUEEffEEUUEEUUEEEEUTFVEEffVFffggggggfgfgfgfffgVFVV3D44EEEDFU44UUFVUEVVgxxxggVFfgUUffgggggxgxffxxx xxxxxgxffggggfgggffFVVFVVEEDDUUEEEEVVVVEEEEEEUUEEUUEUEEVVVVUUggxxfffgfgfgVFggfgVFDDDD4EEEEEED5EVVEEVVggxxggffVFggUUgggggxgxffgxx xgxgxggUUgfUUgfggfgEEVVFVEEEDEEUUEEffEEUUEEUUEEEEUTFVEEffVFffggggggfgfgfgfffgVFVV3D44EEEDFU44UUFVUEVVgxxxggVFfgUUffgggggxgxffxxx xxxxxgxffggggfgggffFVVFVVEEDDUUEEEEVVVVEEEEEEUUEEUUEUEEVVVVUUggxxfffgfgfgVFggfgVFDDDD4EEEEEED5EVVEEVVggxxggffVFggUUgggggxgxffgxx xgxgx""3""3""3""3"""""3""3"#"2#DCEE3333""3""333""3""3""3"3333VV4C33#233##2#"2##33##333334333344DD333344DD3DD34433DD3DEEUT4DC433DD3D33333333""3""3"""""##""#2#33VF33332#"2#"33""33""3""3""33VUDD33333333##2#"2##3"#3##333344334433DD3344DDDD33DD3DD3DDFVC4DC##""33"2#"2#"2#"2#"""""3""3"#"2#DCEE3333""3""333""3""3""3"3333VV4C33#233##2#"2##33##333334333344DD333344DD3DD34433DD3DEEUT4DC433DD3D33333333""3""3"""""##""#2#33VF33332#"2#"33""33""3""3""33VUDD33333333##2#"2##3"#3##333344334433DD3344DDDD33DD3DD3DDFVC4DC##""33"""##"#""2"#""""###CDgg#3""33""33333333##3333""43gfD43#"3##""#2###"3""##""##"2##""###3"#""""####3#"344DD""##"2##""##"2"#""#""2"#"""##"233gg4C#"33""333"4333333333##3#VVEE33####"2"#2###"""####"3""3""##33##""#""###3"#33C434"""""""###"#""2"#""""###CDgg#3""33""33333333##3333""43gfD43#"3##""#2###"3""##""##"2##""###3"#""""####3#"344DD""##"2##""##"2"#""#""2"#"""##"233gg4C#"33""333"4333333333##3#VVEE33####"2"#2###"""####"3""3""##33##""#""###3"#33C434""""""""""""#""""2"""3##"33D3VV"#"3333333333333433#34333VV3333##""##"#2#"3""2"##""##"2####2###""#2"##""##"23344#3"#34##""##"2"#"""""2"""3##"#"34VW23""3333333333333334343433DDUU#3##""#2###"3"""2""#2"##""###3"#"####""####""##3344"334""##""""""""#""""2"""3##"33D3VV"#"3333333333333433#34333VV3333##""##"#2#"3""2"##""##"2####2###""#2"##""##"23344#3"#34##""##"2"#"""""2"""3##"#"34VW23""3333333333333334343433DDUU#3##""#2###"3"""2""#2"##""###3"#"####""####""##3344"334""##""#"""""""2"#""""#2#EDFV"33333333333333343334##DDEE44"3####""#2#"3""2"######""##""###3#""""3####""3#33D343"#3#"3####"""#""2"#"""#"""2##""gV##""33333333333333#33333##UEDD#3####""##"""#2#"3"####2#####""####""#"#33##""##"2EE34""##"""#""2"#"""#"#""""#2#EDFV"33333333333333343334##DDEE44"3####""#2#"3""2"######""##""###3#""""3####""3#33D343"#3#"3####"""#""2"#"""#"""2##""gV##""33333333333333#33333##UEDD#3####""##"""#2#"3"####2#####""####""#"#33##""##"2EE34""##""""""#"""""#"""3""##44VV33333333DD3DD3DD3D##333344VV33"3##""##"#2#"3"##""##"2##""####""#2#""##"2##""44EE""3##2##""3##2#""""""""3""""3"43VF442333DD33DD3D333333#3##43VF442###""#2#"#"#""##"##"2####""###3##"""""3##""3"33EE44"3""""""""#"""""#"""3""##44VV33333333DD3DD3DD3D##333344VV33"3##""##"#2#"3"##""##"2##""####""#2#""##"2##""44EE""3##2##""3##2#""""""""3""""3"43VF442333DD33DD3D333333#3##43VF442###""#2#"#"#""##"##"2####""###3##"""""3##""3"33EE44"3""""""""""""""""""""2"#244VV3333#344DD3D443333"2"##UUDD"###"2##"""#""#"#""##"3"##""##"2##"""#"##"2##3"33VF2"#2####"2####""""""""""""3####""fV4433433344DD3DD3443#"33""VU33##2#"3"##"""##"""3""2"##""##"2##""""###"3"##""3"EE44"3""""""""""""""""""""2"#244VV3333#344DD3D443333"2"##UUDD"###"2##"""#""#"#""##"3"##""##"2##"""#"##"2##3"33VF2"#2####"2####""""""""""""3####""fV4433433344DD3DD3443#"33""VU33##2#"3"##"""##"""3""2"##""##"2##""""###"3"##""3"EE44"3""""####33##""3""3""33###33####EEUE"""!"##""DD5D33VVEU######33"""""##3#"3########"#""""2####333444WVEE443444343434####332#"33""""######34VV33""""##"3#DD3DD3gV#####33#"#""#"#3#####""####"""#""33##34##34VFVV#4443434####33##""3""3""33###33####EEUE"""!"##""DD5D33VVEU######33"""""##3#"3########"#""""2####333444WVEE443444343434####332#"33""""######34VV33""""##"3#DD3DD3gV#####33#"#""#"#3#####""####"""#""33##34##34VFVV#4443434ggffggUUVVxxffEEffUDEEEEFVVFfffgEEEDFUD3EEVVffVWwhxxggggggggffggggffgggxggffVWffVFx xggggfgfgfgVFeUggxxggggggxxgggggggggggggggggxgxggffFVTEUTFVUD43E5UUEEEEVVVVfgVFDEEUD4DEVVVVggggxxgxggggggffggffggfgggxxVVffggVFwwxxffggVWfgVWVVfgxxxxVVgggxgggggggggxgggggggxggffggUUVVxxffEEffUDEEEEFVVFfffgEEEDFUD3EEVVffVWwhxxggggggggffggggffgggxggffVWffVFx xggggfgfgfgVFeUggxxggggggxxgggggggggggggggggxgxggffFVTEUTFVUD43E5UUEEEEVVVVfgVFDEEUD4DEVVVVggggxxgxggggggffggffggfgggxxVVffggVFwwxxffggVWfgVWVVfgxxxxVVgggxgggggggggxgggggggx3333333333xgVV"#""""3""3##2###33333433##3433333333"3""3"3333""33333"UU xxCD#4343333"333"3##332#33DDxyUUDD3D33DD3D3333333334333334""3""3""3"UU#3"###"3""2"33""3#3333##343333333333#3"#2"#2##2#333333D3 xxff333333333333333333333333ffgx3DD344DD3D33DD"3343333333333333333xgVV"#""""3""3##2###33333433##3433333333"3""3"3333""33333"UU xxCD#4343333"333"3##332#33DDxyUUDD3D33DD3D3333333334333334""3""3""3"UU#3"###"3""2"33""3#3333##343333333333#3"#2"#2##2#333333D3 xxff333333333333333333333333ffgx3DD344DD3D33DD"334333333""3"33##2#fgC42"##""""##""""3""3##""3"##33""3##233##2###"""""2#"2#33""fU xxD52"#2#""3"#3"#2"#2"#2"44gg33"3""3"#3"#2"#3#"###3"#2"#2"#2"#233"344#3"""#""""2#"##"2""#2"##""33""3##2##2#"2##""3""3""3233D3xxVW"2"#2"#2##""##"2#"##33""gVEE"2##3""3##""##"2##33""3#"3""33##2#fgC42"##""""##""""3""3##""3"##33""3##233##2###"""""2#"2#33""fU xxD52"#2#""3"#3"#2"#2"#2"44gg33"3""3"#3"#2"#3#"###3"#2"#2"#2"#233"344#3"""#""""2#"##"2""#2"##""33""3##2##2#"2##""3""3""3233D3xxVW"2"#2"#2##""##"2#"##33""gVEE"2##3""3##""##"2##33""3#"333##""3"VV#4""""##""""##""##"""""2##""3"##""3""3##2#""""3""3333322#"UUxx44"2#"2#"2##""3"####""3"33xg34""3"43"#2"#3#"33""##33##2###33344433EE#3""""""2##""""##"2#"2###""##""3""3""##""""3""3""3333""33ˆxEE""3##2##""##"2#"##"2#"2#ggVF2"#2"#2"#3#"33##2##3"#2""333##""3"VV#4""""##""""##""##"""""2##""3"##""3""3##2#""""3""3333322#"UUxx44"2#"2#"2##""3"####""3"33xg34""3"43"#2"#3#"33""##33##2###33344433EE#3""""""2##""""##"2#"2###""##""3""3""##""""3""3""3333""33ˆxEE""3##2##""##"2#"##"2#"2#ggVF2"#2"#2"#3#"33##2##3"#2""3##""3##2D4DE"""""""3"""""3""3"""##""""3""3""3""3""3"33""3333333323UUyx33""####""##"2##""##""3#33xgDD""3""3""3""3""3"##33##2#"2##3#334444DD"3"""""""""""2#"2#""""""2##""3""3""3""3""3""33333""3332D4xxVV"#"##""##""####""##33##eUWV"3""3""333##2#"2#"3#"3"""3##""3##2D4DE"""""""3"""""3""3"""##""""3""3""3""3""3"33""3333333323UUyx33""####""##"2##""##""3#33xgDD""3""3""3""3""3"##33##2#"2##3#334444DD"3"""""""""""2#"2#""""""2##""3""3""3""3""3""33333""3332D4xxVV"#"##""##""####""##33##eUWV"3""3""333##2#"2#"3#"3"""3""##"2##EEDC""#!"""2#"2#""2"#2""""3""3"2233#233""33""3"33223333UDxgDD"#""##"2""#2"##""3"#333gg3333""3""3""3##233""##33##2###33##3333VV""3"""""2#"2#"2"""""3""3""""3""3""3""333""33""33333322D4xxEE"2##""3"####""3"##""3""3UUVV""32"#2"#2"#2"33""3##2##"3""##"2##EEDC""#!"""2#"2#""2"#2""""3""3"2233#233""33""3"33223333UDxgDD"#""##"2""#2"##""3"#333gg3333""3""3""3##233""##33##2###33##3333VV""3"""""2#"2#"2"""""3""3""""3""3""3""333""33""33333322D4xxEE"2##""3"####""3"##""3""3UUVV""32"#2"#2"#2"33""3##2##"2"#2"#334444""""##"2"#2"#2""""##""3""3332233""3"3333332233332322D4xx44"2##""####""##""###3""##gf332333""33""3"33"3""3"#3"#2"#2##2#"2##EE#3!"""""3""2"#2##""""""2#"2#33""33""333333""323323""33ggfg"#"2#"3##2""##""3##2#EEVV""3233""33""33""33""#2##""3""3334444""""##"2"#2"#2""""##""3""3332233""3"3333332233332322D4xx44"2##""####""##""###3""##gf332333""33""3"33"3""3"#3"#2"#2##2#"2##EE#3!"""""3""2"#2##""""""2#"2#33""33""333333""323323""33ggfg"#"2#"3##2""##""3##2#EEVV""3233""33""33""33""#2#####34##44gVUU##""#2#######34##3#4343##434344#3##33##3##3##33DD44DDFVVFfgEE"###3##33#3##3##343EEVVggD534####3#44#34344444444DD##3#43##43E5fV33#""#######3##3##4343##DD334343##3##3##3##3334433EEDUUUVVff####3#33##3##333#3##DDFVggVF3334##343334343444343434####34##44gVUU##""#2#######34##3#4343##434344#3##33##3##3##33DD44DDFVVFfgEE"###3##33#3##3##343EEVVggD534####3#44#34344444444DD##3#43##43E5fV33#""#######3##3##4343##DD334343##3##3##3##3334433EEDUUUVVff####3#33##3##333#3##DDFVggVF3334##343334343444343434ggxxgxxxxxgxggwwgggggxfgggggfgfgfgFVffggffVFfgggggffxxxxggwwgxxxx xxxˆ ˆ ‰ ™wwhwggxxxxxxgxxyxxxxxxgxˆˆ ‰ ™ wwxxgxggxxxxxxxxgxxxˆˆ‰ ™‰ ™‰ ™ ‰ ™ xxxxxxxxxywwgxgggggxfgggggggffggUUffggVWVVggfgggffgxxxwwgggxwwxxwwx x ™ ‰wwxxggxxgxxxgxxxxxxyxxggx x ™ ‰ xxwwyxggggxxxyxxxxxxxx™ ‰™ ‰™ ‰ggxxgxxxxxgxggwwgggggxfgggggfgfgfgFVffggffVFfgggggffxxxxggwwgxxxx xxxˆ ˆ ‰ ™wwhwggxxxxxxgxxyxxxxxxgxˆˆ ‰ ™ wwxxgxggxxxxxxxxgxxxˆˆ‰ ™‰ ™‰ ™ ‰ ™ xxxxxxxxxywwgxgggggxfgggggggffggUUffggVWVVggfgggffgxxxwwgggxwwxxwwx x ™ ‰wwxxggxxgxxxgxxxxxxyxxggx x ™ ‰ xxwwyxggggxxxyxxxxxxxx™ ‰™ ‰™ ‰3333""3#3333""333"33DDEE33"3""3""3""3""3"""""23333DD#433DD33#3333433333333DD33DD33DD33DD33334333333333##33DDEEDD33"33333##333#3333333333##332##3333333EEDC#"2#22#"2#"2#"2#"2#"2#CD44DD33334433#333333343D4DD3333443333DD333333#33333#3333333DDEEDD"3##3333##333#3333""3#3333""333"33DDEE33"3""3""3""3""3"""""23333DD#433DD33#3333433333333DD33DD33DD33DD33334333333333##33DDEEDD33"33333##333#3333333333##332##3333333EEDC#"2#22#"2#"2#"2#"2#"2#CD44DD33334433#333333343D4DD3333443333DD333333#33333#3333333DDEEDD"3##3333##333#""#""!"""!#33UE""""!!""""!"#""""VV##"""""!""#""""#"#"23""3""3""3"##""##""##"3""2"#2WV34""""#""""""""""""!"""""3"EE33"""""!"""""!#""DC5E""""""#"#""""#"""3""3""3"""""##""""##"3"""2"TTFV""""""3"""""""""!"""!#33UE""""!!""""!"#""""VV##"""""!""#""""#"#"23""3""3""3"##""##""##"3""2"#2WV34""""#""""""""""""!"""""3"EE33"""""!"""""!#""DC5E""""""#"#""""#"""3""3""3"""""##""""##"3"""2"TTFV""""""3""""""!"""""!""!"33EE"!""!"!"""!""!"""""EE33""""""""#2#""""2#"##"2"#2"#2"##""#2#"2""#"3"gfD4""""3"""#2#"""3""""""""""TD##""""!"""!"!""""!DD33"""!""""""3""2"#2"#2"##""3""3""##"2##"""""3"33DDVV##"""""""#""!"""!!""!"33EE"!""!"!"""!""!"""""EE33""""""""#2#""""2#"##"2"#2"#2"##""#2#"2""#"3"gfD4""""3"""#2#"""3""""""""""TD##""""!"""!"!""""!DD33"""!""""""3""2"#2"#2"##""3""3""##"2##"""""3"33DDVV##"""""""#""!""""!"!""23UE"""!""""""!"""""""""UT""""""""""2""#2"""##""""3""3##"""""#"""""3""3#VU44""""""#""""""!#""!"!""""EE33""!""""!"""!""""DD3D"""""""""""""#"""2##"#""2"#2##""""""""""3##"DDVV"""""3"""""""!""""!"!""23UE"""!""""""!"""""""""UT""""""""""2""#2"""##""""3""3##"""""#"""""3""3#VU44""""""#""""""!#""!"!""""EE33""!""""!"""!""""DD3D"""""""""""""#"""2##"#""2"#2##""""""""""3##"DDVV"""""3""""""!"!"!"""!!""33VF""""""""""""""!""""""44"""""""""!""""#"""##""""""2""#""""#2#"2"""""gV33"""#"""2""#""""!!"!"""""UT43""""""""""""""""!2""433#"""""""#2"""##""""##"2"""""#"#"""""#"#""""3"DDFV"""##"""""""""!!"""""33VF""""""""""""""!""""""44"""""""""!""""#"""##""""""2""#""""#2#"2"""""gV33"""#"""2""#""""!!"!"""""UT43""""""""""""""""!2""433#"""""""#2"""##""""##"2"""""#"#"""""#"#""""3"DDFV"""##"""""!"!!"!!"!!"23UD""""!""""""""""""!2"#2"#!"""!""""2""""3""3""3""3""3""3""3""3""""""##""##"UU33""""""""""""""!""""""""DDDD"""""""""""""""""33""""""#2"""""""2#"2#"2#"2#"2#"2#"2"#2""""#2#"2#"44EE!""""""""!""""""""""""23UD""""!""""""""""""!2"#2"#!"""!""""2""""3""3""3""3""3""3""3""3""""""##""##"UU33""""""""""""""!""""""""DDDD"""""""""""""""""33""""""#2"""""""2#"2#"2#"2#"2#"2#"2"#2""""#2#"2#"44EE!""""""""!####""##""##""""##VV4C#"##""""3333##""3""3""3#DD#434##""#2#""##""""##"2"#"2"#"2"####"3"##""43ggEE###""33""#"##333##3##2#"""""2EEEE##2#""""33""##"2#"2#"2#"44DD##33##""#"""##""""""##"""""###"2""3#"2"######EEUU##""33""######""##""##""""##VV4C#"##""""3333##""3""3""3#DD#434##""#2#""##""""##"2"#"2"#"2"####"3"##""43ggEE###""33""#"##333##3##2#"""""2EEEE##2#""""33""##"2#"2#"2#"44DD##33##""#"""##""""""##"""""###"2""3#"2"######EEUU##""33""##VVggggFVggggVFfVEEUUFVggxxggggfggxw wx xxxxxggwwx xxxxxxxxxffggUDVVFVVFVVffVVVWVVVVFVVFVVEUUEEEEUVFgggggggxggxx ™ ‰ ™ ‰hwwwxxxxggffgggxxxxyx xwwyxffVFVVEUEEVVVWggxxggfggg ww xxxxxxxxwwxxxxggxxx xxxfgVFEEVVFVVFfVVFfWVWVWVVVVFVUEUU5EVFVVggVWgggxggggggggggggggxxEEVVEUUEVFggggVFggggVFfVEEUUFVggxxggggfggxw wx xxxxxggwwx xxxxxxxxxffggUDVVFVVFVVffVVVWVVVVFVVFVVEUUEEEEUVFgggggggxggxx ™ ‰ ™ ‰hwwwxxxxggffgggxxxxyx xwwyxffVFVVEUEEVVVWggxxggfggg ww xxxxxxxxwwxxxxggxxx xxxfgVFEEVVFVVFfVVFfWVWVWVVVVFVUEUU5EVFVVggVWgggxggggggggggggggxxEEVVEUUE4C33D3DDDUgx"3""##"233#2#33""3"33##3333"3333333""#""3333""3"##33"3UDxgUUUUWVUUgfUUggffVWffVWfffgfgTEDDEEDC4DDDDDUUDTUETUUUTTDDUUUUDDDDffFV""3""3####3333""#2#"233333333333333""##""##33""3"33""33D3ggfgTEffUUgfUUggVWggffVWUUgg ˆˆggDDDDDD3DTDTTEUUUTTEUUUDDVVCD#3DC4DTEwh23""##"233#2#33""3"33##3333"3333333""#""3333""3"##33"3UDxgUUUUWVUUgfUUggffVWffVWfffgfgTEDDEEDC4DDDDDUUDTUETUUUTTDDUUUUDDDDffFV""3""3####3333""#2#"233333333333333""##""##33""3"33""33D3ggfgTEffUUgfUUggVWggffVWUUgg ˆˆggDDDDDD3DTDTTEUUUTTEUUUDDVV"###""C3gg""""""""""2""""""""""""""""""""#2#DCgg33"3""3""3""43"#33334333VWVV""3"""""""""""2#"2#"2#"233""3""3""VVUD"""""""""3""!"""""""""""""""""""3""ggDD"3""3""3""3"343333"334DDx xDE""#2#"2""2"#"2"#2"#2"#2"3##""33gg""""""""""2""""""""""""""""""""#2#DCgg33"3""3""3""43"#33334333VWVV""3"""""""""""2#"2#"2#"233""3""3""VVUD"""""""""3""!"""""""""""""""""""3""ggDD"3""3""3""3"343333"334DDx xDE""#2#"2""2"#"2"#2"#2"#233""3""DCWV"3""""""""""""""""""""""""#"""""""D3gg34""##"24343433343333433ggVF33##2###""3"#3"#2"#2"#3333""3#3344"3VFVV""""""!!""#""!"!""""""""""""""""33ggD33"#3"#3434333433344433UDxg33"3""3"##""3""3""3""334""3"33""3""DCWV"3""""""""""""""""""""""""#"""""""D3gg34""##"24343433343333433ggVF33##2###""3"#3"#2"#2"#3333""3#3344"3VFVV""""""!!""#""!"!""""""""""""""""33ggD33"#3"#3434333433344433UDxg33"3""3"##""3""3""3""334""3"33##""D4gg"""""""!!"#""""""""""""""""""""""""""DDgg3333"3##3#3334333444"344ffgg""3"##""###3"#33""3##2##333344"34433EEVV"""""""""""""""""""""""""##""""""""hgEE3334""43##2#3433343433UDxg44"3##"33""##34""433334""4333##""D4gg"""""""!!"#""""""""""""""""""""""""""DDgg3333"3##3#3334333444"344ffgg""3"##""###3"#33""3##2##333344"34433EEVV"""""""""""""""""""""""""##""""""""hgEE3334""43##2#3433343433UDxg44"3##"33""##34""433334""433334##"D4gg"""""""""!"""""""""""""""""""#"""3""44VV4C434343"#3434""43334344ffVF2"#""""#""###33##33444433443333VVUU"""""""""""""""""""""""""""#"!""""3#VUDC4443"#34##343334333433DDxg##2##""""#"#####443##3333343##"D4gg"""""""""!"""""""""""""""""""#"""3""44VV4C434343"#3434""43334344ffVF2"#""""#""###33##33444433443333VVUU"""""""""""""""""""""""""""#"!""""3#VUDC4443"#34##343334333433DDxg##2##""""#"#####443##33333#3#""D3gg"#"""""""!""""!""""!""""!#"""""""44UUDD3D33343434334434443433ffVF""33"#"#"""#333333433##2#"2VFVV"!"""""""""!""""!""""""!""#"!!"""2VFEE3344343334333444334344DDgx"##"#"##""!33""3333#3#""D3gg"#"""""""!""""!""""!""""!#"""""""44UUDD3D33343434334434443433ffVF""33"#"#"""#333333433##2#"2VFVV"!"""""""""!""""!""""""!""#"!!"""2VFEE3344343334333444334344DDgx"##"#"##""!33""33334333##EEggD33##"#"#"""!"!""""""33##33"#######3#43##EEVV#4##333434""3##333#3#"2#gggg"####3#"3##""3"##""33DD3DEEDCEEEEDCgggg#433###""#""""""""""""2#"#2####33##34##DDVW443333343433##3#43##2###DCyx##2##333"33##""3"##""3#33##334333##EEggD33##"#"#"""!"!""""""33##33"#######3#43##EEVV#4##333434""3##333#3#"2#gggg"####3#"3##""3"##""33DD3DEEDCEEEEDCgggg#433###""#""""""""""""2#"#2####33##34##DDVW443333343433##3#43##2###DCyx##2##333"33##""3"##""3#33##ffVWUUWVUUggVFVVFVVFUT4DUEEEVVffFVUEEEUUEUEEEEVV5DVFfffgggwwffffggUUffggffEEED5ED5UUEEEEEEVVEUVFwwxxggfffgffUUgggxgxgxff xx xx ˆ‰ xxxxxxwwgxUUggggEEVVETVFDDDDVVEUffVVEEEEEEEEEEUUFVEEffVFffggwwggfgfgfgVWUUgfVVEEDC5ED5UUEEEEEEVVEEggwwggggffffUUggffgxgxgxgg wwxxggffVWUUWVUUggVFVVFVVFUT4DUEEEVVffFVUEEEUUEUEEEEVV5DVFfffgggwwffffggUUffggffEEED5ED5UUEEEEEEVVEUVFwwxxggfffgffUUgggxgxgxff xx xx ˆ‰ xxxxxxwwgxUUggggEEVVETVFDDDDVVEUffVVEEEEEEEEEEUUFVEEffVFffggwwggfgfgfgVWUUgfVVEEDC5ED5UUEEEEEEVVEEggwwggggffffUUggffgxgxgxgg wwxxgg""#2#"2#"2#"2""""3""2"#2D4EE#323""3""333""3""322#"2#33VV4C#"3#33##2#"2#"##33""3#33##33334433334333DD#34433DD33DDFVC433DDDD3333""3""2"#2"#""3""3"#"""34UU343333""3"33""3""3""32"#3#EEDD33#333##2#"2##""###3##3333##DD334433334433DD44334433DDFVC433##"""2"3"#"2#"2#"2#"""2#""2"#2D4EE#323""3""333""3""322#"2#33VV4C#"3#33##2#"2#"##33""3#33##33334433334333DD#34433DD33DDFVC433DDDD3333""3""2"#2"#""3""3"#"""34UU343333""3"33""3""3""32"#3#EEDD33#333##2#"2##""###3##3333##DD334433334433DD44334433DDFVC433##"""2"""#"###"""""""#"3""3C4gg""33""3333""333333##332#34ff44#3####"2##"#""""#"####""3"##""###3""##""33####2#44DD""3"##""#2###""##"#""""""""##"2#"gVD42"#2"#33""333333333333##VVEE33##""##"3""2"##"""####""##"2####2#"3"""##"2##33D343"###""""2"###"""""""3"#"2#CDgg""33""3333""333333##332#34ff44#3####"2##"#""""#"####""3"##""###3""##""33####2#44DD""3"##""#2###""##"#""""""""##"2#"gVD42"#2"#33""333333333333##VVEE33##""##"3""2"##"""####""##"2####2#"3"""##"2##33D343"###""""""#"""""""3""""""3#DDFV"#"332#333333333433#34333VV4C#"##"2""#"##"""####"3"##""###3"#####""#3#"3##""3344#3"#34""###"2"#""""""3"#"""2"##44WV#3"#333334""3333343334##33E4DD#333##""#2###""""3##"#"##"2#"3#"3"33""##2###""3"443333""##"""""#"""""""3""""""3#DDFV"#"332#333333333433#34333VV4C#"##"2""#"##"""####"3"##""###3"#####""#3#"3##""3344#3"#34""###"2"#""""""3"#"""2"##44WV#3"#333334""3333343334##33E4DD#333##""#2###""""3##"#"##"2#"3#"3"33""##2###""3"443333""##"""""""""""3""""##"3"44VV""233333333333343333433C4VV33#3"###"3""2"#2#"3"##33##""3"####""#""2####"""24444"334""##"2"##""""""""3"""3""33fg##2"#233"3334433333433#3335DD43#33##"#"##"""#"#""####""##"2######"3""33##""##"2EE34""##""""2"#"""""#"#"""##"#"44fV"""33333333333343333433C4VV33#3"###"3""2"#2#"3"##33##""3"####""#""2####"""24444"334""##"2"##""""""""3"""3""33fg##2"#233"3334433333433#3335DD43#33##"#"##"""#"#""####""##"2######"3""33##""##"2EE34""##"""""""#"""#""""#"""2D4fV333333DD3DD3DD33DD##33##EDEE33####"2"#"2"#2###""###"2######2#"3"""##""##"244DD#3#"####""##"""""""""""#"""""3##VV4C333333DD3D33DD3333#333##VV4433""3"####"""#"###""3"##""######2#"3""""2####""33EE33####"""""""#"""#""""#"""2D4fV333333DD3DD3DD33DD##33##EDEE33####"2"#"2"#2###""###"2######2#"3"""##""##"244DD#3#"####""##"""""""""""#"""""3##VV4C333333DD3D33DD3333#333##VV4433""3"####"""#"###""3"##""######2#"3""""2####""33EE33####"""""""""""""""""3##""44fV3433#33344DD443334##"3334E43""3##""#""2""""##"""3"##""##"2"#""#33"#"##"244EE"2##""3#"2#"#""!#"""""2""#2"##33VFDC$3333444DD3D4433#3"33##UE33##"2""#"""2"""3####"#"2#"2####"""##"3""3##""3"EE44"3"""""""""""""""""""3##""44fV3433#33344DD443334##"3334E43""3##""#""2""""##"""3"##""##"2"#""#33"#"##"244EE"2##""3#"2#"#""!#"""""2""#2"##33VFDC$3333444DD3D4433#3"33##UE33##"2""#"""2"""3####"#"2#"2####"""##"3""3##""3"EE44"3""""##33##33""3""333##33######3#EEUU"""###EDD4CDggEE###33####""""#"""3##3############""#"#"33##343444WVEE44443434####"2""#""""""######34Dfg33"!"#"""43D433EEgg#####3####2"#"33"################""#""2####343444UUFV44444434#333##33""3""333##33######3#EEUU"""###EDD4CDggEE###33####""""#"""3##3############""#"#"33##343444WVEE44443434####"2""#""""""######34Dfg33"!"#"""43D433EEgg#####3####2"#"33"################""#""2####343444UUFV44444434ggUUggUUVVxxggEEffD3VUEEEEVVUUgfEEEEEEDCEEVVggfgwwxxggggggffffggffggffyxggffffggVFxxggffggffggffVWggxxgxffgxgxgxgggggxffggggggggUUgfUUWVVVEEED5EC4EDDDVVEUUEfWUUEEUUEEEDEEVVfffgggxxgxfgfgfffgffggffggggxxfgVFfgVVwhwhggfgfgfgfgVFfgxxxyVFwhwhgggggggggxggggfgggggUUggUUVVxxggEEffD3VUEEEEVVUUgfEEEEEEDCEEVVggfgwwxxggggggffffggffggffyxggffffggVFxxggffggffggffVWggxxgxffgxgxgxgggggxffggggggggUUgfUUWVVVEEED5EC4EDDDVVEUUEfWUUEEUUEEEDEEVVfffgggxxgxfgfgfffgffggffggggxxfgVFfgVVwhwhggfgfgfgfgVFfgxxxyVFwhwhgggggggggxggggfggg333333##33xxTE""2##"#"2#"2##""3#33#333##3333333333""3""3""##"2333233UD xxDE33"33333##33##2#33""3344xxTU4CD433334433333433##3333443333ffVF2"#"""2""##"""3"####333433##3#3333333433"3""##"233""3"3333D3wwgf33333333##3333""##333333fgggC4DC333344333333##333333333333##33xxTE""2##"#"2#"2##""3#33#333##3333333333""3""3""##"2333233UD xxDE33"33333##33##2#33""3344xxTU4CD433334433333433##3333443333ffVF2"#"""2""##"""3"####333433##3#3333333433"3""##"233""3"3333D3wwgf33333333##3333""##333333fgggC4DC333344333333##333333""3"33##2#fgD52"""""""#2#"2##""##"2#"##"2##3"#3"#2"##""##"2#"2#"233""fUxxDD"2##""3"##""3""3##""3#33hg33""3##2"#2"#3#"3#"3##33##33""3"EEVV"""!"3""3"#"2###""""##"2#"3#"3##2#33""3"##"""""2#"3333D3xxfg!"##2#"2#"##"2##3""3##2#ffEE"2#"2#34""3"##""3##2"#3#"3""33##2#fgD52"""""""#2#"2##""##"2#"##"2##3"#3"#2"##""##"2#"2#"233""fUxxDD"2##""3"##""3""3##""3#33hg33""3##2"#2"#3#"3#"3##33##33""3"EEVV"""!"3""3"#"2###""""##"2#"3#"3##2#33""3"##"""""2#"3333D3xxfg!"##2#"2#"##"2##3""3##2#ffEE"2#"2#34""3"##""3##2"#3#"333##""3"EEDC""#""""2#"##""""#2#""""##"2#"2#33""3"##""3""3""3333"3UDyx34""3##2##""##"2##""3##233xx33#"2#"2##3""3##2#33##2###3334""fUEE""""""""#"""2""#2"""""3"##""""#3"#2"#2"###"2#"2#"23333""33xxEE#3"#2"####""3"##""3""3""gVVV""3""3##2#"2#"33""##33"""333##""3"EEDC""#""""2#"##""""#2#""""##"2#"2#33""3"##""3""3""3333"3UDyx34""3##2##""##"2##""3##233xx33#"2#"2##3""3##2#33##2###3334""fUEE""""""""#"""2""#2"""""3"##""""#3"#2"#2"###"2#"2#"23333""33xxEE#3"#2"####""3"##""3""3""gVVV""3""3##2#"2#"33""##33"""3##""##"25E44""""""""""2""##"""""##""""3""3""3"33""3""3""3333332232UUxx33##""##""##""##"2##""3"33gx3D""3"33""3"#3"#2"#2##2#####33DDEEVV"""""""""""##"2""#2"#""##""""3""3""33""3""3""3333333322DDxxEE"2#""2"##""#2#####""3"ffVF2"33""3""3##2#"2##3"##"""3##""##"25E44""""""""""2""##"""""##""""3""3""3"33""3""3""3333332232UUxx33##""##""##""##"2##""3"33gx3D""3"33""3"#3"#2"#2##2#####33DDEEVV"""""""""""##"2""#2"#""##""""3""3""33""3""3""3333333322DDxxEE"2#""2"##""#2#####""3"ffVF2"33""3""3##2#"2##3"##"""3""##"2434DEE"2"""2#"2#"2#"2"#2"#2"#2"#2"#23333""33""33""33323333VFww44"3""##"2##"#"2###""3"33WVDD"3""3""3""3""333""##"2##3"3334VWVV!""""#2#""""3""3"""3""2"#2"#"2"332233""3"33""33332333C4ggff""####""####""3"##""3""3VFVV"2#"2#"2#"2#"233""3##2##"3""##"2434DEE"2"""2#"2#"2#"2"#2"#2"#2"#2"#23333""33""33""33323333VFww44"3""##"2##"#"2###""3"33WVDD"3""3""3""3""333""##"2##3"3334VWVV!""""#2#""""3""3"""3""2"#2"#"2"332233""3"33""33332333C4ggff""####""####""3"##""3""3VFVV"2#"2#"2#"2#"233""3##2##"2"#2"#34C4DC"""""##"""""2"""""""3"""""3""3""333""3""3333223233"3224DxxC4##"2####""#2#"2####""##gg33"333""33""3"33""3""3""3""3""#VVVF!"!""""""2#""""2"""""""""2#"33223233""3"333322323322#"33ggfg"""##"2##""##""##"2####DDVV""32"#3333""3322#"2###"#""3""334C4DC"""""##"""""2"""""""3"""""3""3""333""3""3333223233"3224DxxC4##"2####""#2#"2####""##gg33"333""33""3"33""3""3""3""3""#VVVF!"!""""""2#""""2"""""""""2#"33223233""3"333322323322#"33ggfg"""##"2##""##""##"2####DDVV""32"#3333""3322#"2###"####34##EEVVFV###########3#DD#3##DD##343434443343##3#3343##44DD3DEEUUWVffEE####3###34C43#DD##34UEgVggE43#43##4343D4334444DD4E34C434E4xxxxCD4C##3##2#######334##34D3434343D43344#343##333##344DD44EEUTgfffVW"###3##3##DD##34##DD4EVVggFV3434##3434343444DD44DD#3####34##EEVVFV###########3#DD#3##DD##343434443343##3#3343##44DD3DEEUUWVffEE####3###34C43#DD##34UEgVggE43#43##4343D4334444DD4E34C434E4xxxxCD4C##3##2#######334##34D3434343D43344#343##333##344DD44EEUTgfffVW"###3##3##DD##34##DD4EVVggFV3434##3434343444DD44DD#3ggxxxxxxxxgxgggxfgxxggwwggfgggVFggVFffggggVFfgggggfgggxxgxggwwxxwwxxx xˆ ‰xxggggxxxxxxgxxxxxxxxxgxx xˆ ˆx xx xgxwwggx xxyxxxx xxxy™ ‰™ ‰ ™ ‰ ™ ‰ ™ ‰ ™‰ ™ ‰ ™‰xxxxggggggxxggggffggggfgVFffggVFfgVFggggffggyxxxggwwgxxxwwx xˆ ˆx xxxggwwxxxxxxxxxyxxxxggxxˆ ‰w wx xxxggxxxxxx xxxxxxxy™ ‰ ™ ‰yxggxxxxxxxxgxgggxfgxxggwwggfgggVFggVFffggggVFfgggggfgggxxgxggwwxxwwxxx xˆ ‰xxggggxxxxxxgxxxxxxxxxgxx xˆ ˆx xx xgxwwggx xxyxxxx xxxy™ ‰™ ‰ ™ ‰ ™ ‰ ™ ‰ ™‰ ™ ‰ ™‰xxxxggggggxxggggffggggfgVFffggVFfgVFggggffggyxxxggwwgxxxwwx xˆ ˆx xxxggwwxxxxxxxxxyxxxxggxxˆ ‰w wx xxxggxxxxxx xxxxxxxy™ ‰ ™ ‰yx33""###333""3#33""3#33UU""3""3"""""2#"2#""""3"3333E43333333333""3#33#33333DD33333333334433333333343333333433VFDD33""""##3333##33"3##2#3333""3"33##2#33UU#3#"2#"2#""2"#2"#"""3333DD3D333333####332#33333333DD333333333333#333"3343333333333D3EEDC#"2#"2##33##3333""###333""3#33""3#33UU""3""3"""""2#"2#""""3"3333E43333333333""3#33#33333DD33333333334433333333343333333433VFDD33""""##3333##33"3##2#3333""3"33##2#33UU#3#"2#"2#""2"#2"#"""3333DD3D333333####332#33333333DD333333333333#333"3343333333333D3EEDC#"2#"2##33##33"""#""!!""#"23EE""""!"""""""!""""UU##""#"""""""""#""""3""3""3""3""##""3""3"#""2"##""ff##""""3""""2"""""!#"#"!""#DD#3""""""!""""!"""D4ED!""""!#""""#"""##""##"2"#2"#2"#2##"""""3""##"2DDEE"""#""2""""""!"""""""!"23EE""""!"""""""!""""UU##""#"""""""""#""""3""3""3""3""##""3""3"#""2"##""ff##""""3""""2"""""!#"#"!""#DD#3""""""!""""!"""D4ED!""""!#""""#"""##""##"2"#2"#2"#2##"""""3""##"2DDEE"""#""2"""""!""!"""!!""C3E5!""""""!""""!""""""""EE"2""""""""""""3""""##""##"2"#3#"""##"3""""2##""gf44"""""""3"""""""""""""!!"""EE##""""!"!""!!2"""""D433"2""#""2""#""##""""##"2#"2###""##""##""##"""#2#DDWV""2""""""""""""!"""!!""C3E5!""""""!""""!""""""""EE"2""""""""""""3""""##""##"2"#3#"""##"3""""2##""gf44"""""""3"""""""""""""!!"""EE##""""!"!""!!2"""""D433"2""#""2""#""##""""##"2#"2###""##""##""##"""#2#DDWV""2""""""""""!""!!"!"!"22VE!""""""""!""!""""3"EE""2"""""""""""#2#"2"""""3""3##"""""#"3""3""3""gV43""""""#""2"""!""""!"!"""EE#3"""""!"""""""!"""!DD3D""""""""""""#2###"""""2#"2"##"#2#""""""3"DDVV"##""""!"""!""!""!"""22VE!""""""""!""!""""3"EE""2"""""""""""#2#"2"""""3""3##"""""#"3""3""3""gV43""""""#""2"""!""""!"!"""EE#3"""""!"""""""!"""!DD3D""""""""""""#2###"""""2#"2"##"#2#""""""3"DDVV"##""""!"""""""!"!"!""""VV"""!"""""""""""!"""""DD""""""""""""#2#""""##""""2##"""""2""""2##""fU34"""""""""""""!""!!"!!"""UT33"#""""""""""!"!"""333#"""""""!#""2"""##"2"#2#"2"##"""""""#2#""""DDVF!""""""""""!"!!""""!"!""""VV"""!"""""""""""!"""""DD""""""""""""#2#""""##""""2##"""""2""""2##""fU34"""""""""""""!""!!"!!"""UT33"#""""""""""!"!"""333#"""""""!#""2"""##"2"#2#"2"##"""""""#2#""""DDVF!""""""""""""""""""""""#VV""""""!""""""""""!""34""""""""#""""2""""3""3""3""3""3""3""3"""""""##"2#""VV34""""""""""""""""!!"""!""EE34""""!""""""!"""""""233"""""""""2#"2"#2"#2"#2"#2"#2"#2""2#"2""#2"#2"#44EE"""""""""!"!!"!!"!!""#VV""""""!""""""""""!""34""""""""#""""2""""3""3""3""3""3""3""3"""""""##"2#""VV34""""""""""""""""!!"""!""EE34""""!""""""!"""""""233"""""""""2#"2"#2"#2"#2"#2"#2"#2""2#"2""#2"#2"#44EE""""""""##""####""##""""33VV44#3"#2"#23333""3""3##33"3EEDC$3##2#"""##""##""""####""#""#""""#######""####34EEDC!"!"""!!"!!""""""""""UTFV##""3"#32333"3##""3##2##DD444343"#"""2##""""""#2#"#"#""##""""##"2"########EDFU##""3##"""###""####""##""""33VV44#3"#2"#23333""3""3##33"3EEDC$3##2#"""##""##""""####""#""#""""#######""####34EEDC!"!"""!!"!!""""""""""UTFV##""3"#32333"3##""3##2##DD444343"#"""2##""""""#2#"#"#""##""""##"2"########EDFU##""3##"""#VVggggVWggggVWUU5EVFfVggxxggffggxxxxxxxxxxwwxxxxxxggww xxggffVFVVFVVFffVWVWfgVWggVWVVFVVFVVEUVFfWgggggxgxggggggggggFVVVEDgggfFVVFVVETEEVVffggUUUUEEUUEUggggxxffggggwwx xxxwwxxwwwwwwxxggwwxxffVVVVFVVFfVfgVFggffggVWVVVVFVVFUUEUVFgggggxgxgxggggggxxggggx xVVUUVVVVVVggggVWggggVWUU5EVFfVggxxggffggxxxxxxxxxxwwxxxxxxggww xxggffVFVVFVVFffVWVWfgVWggVWVVFVVFVVEUVFfWgggggxgxggggggggggFVVVEDgggfFVVFVVETEEVVffggUUUUEEUUEUggggxxffggggwwx xxxwwxxwwwwwwxxggwwxxffVVVVFVVFfVfgVFggffggVWVVVVFVVFUUEUVFgggggxgxgxggggggxxggggx xVVUUVVVVDC#"3333DDxg33""3""3##2#""""2#"2#"2##3"#3"#33""#"""233##2#"3""3""UUggUUVVETVUUUWVUUgfUUWVUUUUffggDDDDDD33DDDTDDTTDDUUUUUUUUffUUDDDDUUffEE""#2#33""3""""""33""3"#33333##2#33##"""33""3""33""3"DDggfgDTUUUUUUWVUUggUUWVUUUUgg ˆ‰ffDDDD3DD3DDDDDDTTDDUUDUUDDDC42"3333DDxg33""3""3##2#""""2#"2#"2##3"#3"#33""#"""233##2#"3""3""UUggUUVVETVUUUWVUUgfUUWVUUUUffggDDDDDD33DDDTDDTTDDUUUUUUUUffUUDDDDUUffEE""#2#33""3""""""33""3"#33333##2#33##"""33""3""33""3"DDggfgDTUUUUUUWVUUggUUWVUUUUgg ˆ‰ffDDDD3DD3DDDDDDTTDDUUDUUDDD33"#""DDfg""""""""!"3""""""""""""#2#""!"2"DDgg33"3""3""3""433333333433VWVV"3##"""""2#"2#"2#"2#"2#"2#"2#"2#"2#CD##"""""""""#2#!"""""""""!""#"""""2#"ggD42"#2"#2"#2"#3433333433DDyx44""""2#"""2""2#"2#"2#"233"#""DDfg""""""""!"3""""""""""""#2#""!"2"DDgg33"3""3""3""433333333433VWVV"3##"""""2#"2#"2#"2#"2#"2#"2#"2#"2#CD##"""""""""#2#!"""""""""!""#"""""2#"ggD42"#2"#2"#2"#3433333433DDyx44""""2#"""2""2#"2#"2#"233##""##33WV#3""!!"""!#""!""""""""""""""""""""DDgg34""3"#3"#34333433343344ffVF33##2###""3""2"#2"#2"33333333443344DD#3#""""""""""""""""""""""""""""!""""33ggD33##3#"34""433343334333UUgg44"2##3"##""3""3##2#"243"#3333##""##33WV#3""!!"""!#""!""""""""""""""""""""DDgg34""3"#3"#34333433343344ffVF33##2###""3""2"#2"#2"33333333443344DD#3#""""""""""""""""""""""""""""!""""33ggD33##3#"34""433343334333UUgg44"2##3"##""3""3##2#"243"#3333##""D4VV"3""!"!"""""""""""""""""""""##!"""""DDgg333343"#3434""4333434333gggg""3"##""###3"#34##34""3#334433444444DD#3#""""!""""""#"!"!"""""""""#""!"""""#"ggEE333334##34343334333433UDxg34""3""2"#3##3##23334""433333##""D4VV"3""!"!"""""""""""""""""""""##!"""""DDgg333343"#3434""4333434333gggg""3"##""###3"#34##34""3#334433444444DD#3#""""!""""""#"!"!"""""""""#""!"""""#"ggEE333334##34343334333433UDxg34""3""2"#3##3##23334""43333334##"D4gg33"""""""""""""""""""""""""""""3"33gf3344"334##34343334343344UUVV""#"""##"""##"2##33444444DD4433EE44""""""""""""""""""""""""""#"""2"#2WVDD443334""43"#3434343344DDxg##2##""""""3####333###DC3343##"D4gg33"""""""""""""""""""""""""""""3"33gf3344"334##34343334343344UUVV""#"""##"""##"2##33444444DD4433EE44""""""""""""""""""""""""""#"""2"#2WVDD443334""43"#3434343344DDxg##2##""""""3####333###DC33#3"""D4gg""""""""""#"!!""!"""""""!"""""!""33ffD34433433343434433433333EEEE"2"#"#"""""""####DD3344334433EEDC"!"!"!"""!""""!!"!""""!!"""""""2#VVDD3344434343434433444333DDgg""##"""#"#"""33""3333#3"""D4gg""""""""""#"!!""!"""""""!"""""!""33ffD34433433343434433433333EEEE"2"#"#"""""""####DD3344334433EEDC"!"!"!"""!""""!!"!""""!!"""""""2#VVDD3344434343434433444333DDgg""##"""#"#"""33""333343##33EEggE43##3#"##""""""""33""#""33####3#33##334343UEVV#4##3#33#3433334##3###""gggg"""33######2###33""4433DDEEDCEEDDEEggFV3334#####33"""""""!#""#"2"#####33##3##3##4343E5fVD534##3333##3433##3#"3##D3yx#3"#3#34""###333""3"#34333333343##33EEggE43##3#"##""""""""33""#""33####3#33##334343UEVV#4##3#33#3433334##3###""gggg"""33######2###33""4433DDEEDCEEDDEEggFV3334#####33"""""""!#""#"2"#####33##3##3##4343E5fVD534##3333##3433##3#"3##D3yx#3"#3#34""###333""3"#3433333ffffVWUUUUggUUEEVVETEEEEEEDDVVggEEVVDDEEEEVVDDVVEUVFeUffggggffggVWffUUgfWVUU3DE4VUEEEEEDFVVFEEVVxxggwwggffggUUxgggxxgxgxgxxxgxxxgxggggfffffffgEEffUDEEEE3DUEEEggVFEEUU4DEEVVEEUTFVUDgfVFffxxfgfffgffUUgfUUVVDDEE4EUEEEEDFUVFEEVVggxxgxggffffVWffgxgxgxgxgxw wgggxffffVWUUUUggUUEEVVETEEEEEEDDVVggEEVVDDEEEEVVDDVVEUVFeUffggggffggVWffUUgfWVUU3DE4VUEEEEEDFVVFEEVVxxggwwggffggUUxgggxxgxgxgxxxgxxxgxggggfffffffgEEffUDEEEE3DUEEEggVFEEUU4DEEVVEEUTFVUDgfVFffxxfgfffgffUUgfUUVVDDEE4EUEEEEDFUVFEEVVggxxgxggffffVWffgxgxgxgxgxw wgggx"#""""2#"2#""""""""#2#"2D4EE33""3""3""3""3""3""3""3"33VV4C33##2##3""##""##"2#"3##3"#33333343334333334333443333DDEE333333"3##2#""""#2#""##"!##"2""#2"33VF3422#"2#"2#"2#"2#"2#22#"2#UU4D33#3"###"2#"2#"2#"2###33##3333334433333333444333333344UU3D""3#"#2"2"""""3""3""""""2""#2"DDEE33""3""3""3""3""3""3""3"33VV4C33##2##3""##""##"2#"3##3"#33333343334333334333443333DDEE333333"3##2#""""#2#""##"!##"2""#2"33VF3422#"2#"2#"2#"2#"2#22#"2#UU4D33#3"###"2#"2#"2#"2###33##3333334433333333444333333344UU3D""3#"#2""#""##""""""##"""3"DDgg#3""33""333"33333333##3#33gf44"3####""####"3""2"##""##""##"2####2###""##""3##244DD""43"###"2#"##"3"""""""""""""3"43ffD333""33""3333333333##33##VVEE34""####""###"3""2"##""##"2##""##"2##"""####3"#2"DD#3#"""""""#""##""""""##"""3"DDgg#3""33""333"33333333##3#33gf44"3####""####"3""2"##""##""##"2####2###""##""3##244DD""43"###"2#"##"3"""""""""""""3"43ffD333""33""3333333333##33##VVEE34""####""###"3""2"##""##"2##""##"2##"""####3"#2"DD#3#"""""""""""3"""3"""2##"33EEVV"""33333333333334333433#3VFDC#"##"2##"""3"""3"##""###3"####3"#####"3"####""3#3344#3"#3#"3"##""#"#""""""3""""""###33WV##""333333""33333433343433EEDC##3##2####"""#2#######"3"##""##33####""#####""3##2D433#"43#""""2"#"#""""#"""2##"33EEVV"""33333333333334333433#3VFDC#"##"2##"""3"""3"##""###3"####3"#####"3"####""3#3344#3"#3#"3"##""#"#""""""3""""""###33WV##""333333""33333433343433EEDC##3##2####"""#2#######"3"##""##33####""#####""3##2D433#"43#"""""#""""2"#"2"#2###DCEE""3"33333333333333#3433333EE44"3##""###"2"##"""####""##"2##""####""""3##""##"23344"334##""3##2###"""""""#"#""#2#34VW#322#"3333333333333434##""UU4D##2#"2""#"3""2"#2###""##"2####33##""""####2#"243D43343"""""""#""""2"#"2"#2###DCEE""3"33333333333333#3433333EE44"3##""###"2"##"""####""##"2##""####""""3##""##"23344"334##""3##2###"""""""#"#""#2#34VW#322#"3333333333333434##""UU4D##2#"2""#"3""2"#2###""##"2####33##""""####2#"243D43343"""""""""#"""""""3"""#44fV333333DD3DD3DD3D4433##3333EE34""####""#"#""#2#"33"##""######2#"#"""####""##33EE34""######2###""""""""""""##"""3#VV4C333333D3DD3DD3334333#343VF333##3##""#2#"#2#########""#3#"3##"#""""2##""##"2EE44"3"""""""""2""""""3"""#44fV333333DD3DD3DD3D4433##3333EE34""####""#"#""#2#"33"##""######2#"#"""####""##33EE34""######2###""""""""""""##"""3#VV4C333333D3DD3DD3334333#343VF333##3##""#2#"#2#########""#3#"3##"#""""2##""##"2EE44"3"""""""""""""""""3##""44VV3334##3344DD443333"#""EDE52"##""#2#"""3"""##"""3"##""##"2""#""""3####""3"44VV""3"##""####""""""2""""""""""3"43EEED33#33343D4443343"#"3"43UE33""##"""""3"""3""2"#2#"2#""##"2""#"##""3"##33EE44"3""""""""""""""""""3##""44VV3334##3344DD443333"#""EDE52"##""#2#"""3"""##"""3"##""##"2""#""""3####""3"44VV""3"##""####""""""2""""""""""3"43EEED33#33343D4443343"#"3"43UE33""##"""""3"""3""2"#2#"2#""##"2""#"##""3"##33EE44"3""""#3##33332###333333#3###3##3UEEE""""##""##DDUEEEggEU##3#33##3###2"####33#3##3#######3#"2"##3#34443444WVEE44DD4E3434###""#"""""###3#33##34fg33""""##"#DCFUD3DDFV##3##3##33##"""#"#""##3##3#####3####2#"3""33##344433VFVV444444DD#3##33332###333333#3###3##3UEEE""""##""##DDUEEEggEU##3#33##3###2"####33#3##3#######3#"2"##3#34443444WVEE44DD4E3434###""#"""""###3#33##34fg33""""##"#DCFUD3DDFV##3##3##33##"""#"#""##3##3#####3####2#"3""33##344433VFVV444444DDggUUggUUVVxxggDDVVDDUUEEEEffVFeUEEUUEEEEUUFVfgffgxgxfgfgfffffgfgfgggUUx xwhffggfffgxxggfgVWfgggUUffggxyxxgggggxggggggggggggggfgggfgFVVWggEEEDEEUU5EVFffEEEEVVVVUUVVEEUUFVDDVVfgVWffxxggffggggfgfgfgfgfgggyxffggfgVFwwxxffggfgfgfgVFfgxxxyggggxxgxgggggggxffggggggggUUggUUVVxxggDDVVDDUUEEEEffVFeUEEUUEEEEUUFVfgffgxgxfgfgfffffgfgfgggUUx xwhffggfffgxxggfgVWfgggUUffggxyxxgggggxggggggggggggggfgggfgFVVWggEEEDEEUU5EVFffEEEEVVVVUUVVEEUUFVDDVVfgVWffxxggffggggfgfgfgfgfgggyxffggfgVFwwxxffggfgfgfgVFfgxxxyggggxxgxgggggggxffgggggg33"333""33xxTE"3"""##"3""3""3"33##33##2#3333343333""##"2#"2#"2#"33""fUx xD52"#3#"3#"3""3""333""3"44xxDDDD333333333333"3##332#3433"33Dgg""##"2#"2###""#2#"2#"##"2##33##2##3"#333333""##"2##""3""3""3333ˆwVF33##2##3"#2"#2"###"23333VWggC4333433D33334""3333""3333"333""33xxTE"3"""##"3""3""3"33##33##2#3333343333""##"2#"2#"2#"33""fUx xD52"#3#"3#"3""3""333""3"44xxDDDD333333333333"3##332#3433"33Dgg""##"2#"2###""#2#"2#"##"2##33##2##3"#333333""##"2##""3""3""3333ˆwVF33##2##3"#2"#2"###"23333VWggC4333433D33334""3333""33""3""3##33VWCD""##""""""3""3##""##""3"##33""43"#3#"3##""#2#""##2#3333UDxxCD##2#"2#"2##3"#2"##""4333gg34""3"33##""33##33""###333""3"DDVW"#"""##""""""##""""##"2##""3""3##33""##33##2#"2##"""""2#"333333xxfg""3#""##2#"2##""#3"#2"#2ggEE""3""3""##33""##33##2#"2"3""3"#333VWCD""##""""""3""3##""##""3"##33""43"#3#"3##""#2#""##2#3333UDxxCD##2#"2#"2##3"#2"##""4333gg34""3"33##""33##33""###333""3"DDVW"#"""##""""""##""""##"2##""3""3##33""##33##2#"2##"""""2#"333333xxfg""3#""##2#"2##""#3"#2"#2ggEE""3""3""##33""##33##2#"2"333##""3"EEDC"""""2#"2"##""""3"##""""##"2#"2#"233""##"2#"2#"23332"#eUhw#4""3#""##""##"2##""3#"33‰x33"3""3"#3"#2"33##2###33""##"2EEVV"2"#""##!2"#2""##"""""""2##""""##"2#"33""3""3##""3""33322#"DDxxEE"2##3"##""3"##""##"2##3"ffVF2"#233##2#"233""3"#3"#3#"333##""3"EEDC"""""2#"2"##""""3"##""""##"2#"2#"233""##"2#"2#"23332"#eUhw#4""3#""##""##"2##""3#"33‰x33"3""3"#3"#2"33##2###33""##"2EEVV"2"#""##!2"#2""##"""""""2##""""##"2#"33""3""3##""3""33322#"DDxxEE"2##3"##""3"##""##"2##3"ffVF2"#233##2#"233""3"#3"#3#"3""3##2##EE44##""""""""3""3""3""2"""##""""3""333""3""3""3"2333233322gfhw#4""##"2##""##"2""##""3"33xg44"3""3""333""3""3##2###33##3#DDVW"2"""2""""2"#2"#2"##""""#2###""3""3""33""3""3""3233"33323C4xxEE"2#"##""##""##"2##""3""3ffVF2"#2"#2"#2"#2"#2##2###"""3""3##2##EE44##""""""""3""3""3""2"""##""""3""333""3""3""3"2333233322gfhw#4""##"2##""##"2""##""3"33xg44"3""3""333""3""3##2###33##3#DDVW"2"""2""""2"#2"#2"##""""#2###""3""3""33""3""3""3233"33323C4xxEE"2#"##""##""##"2##""3""3ffVF2"#2"#2"#2"#2"#2##2###"""3""##"2#"EE3D"""""""3""2"#2"""""3""3""3""3""3333""33""33""33333323UDxx44"2#"##"2""###"2##""3#33gg332333""3""3""33""3"##33""3##2EEgg"""""""""2"#2"#"2""""""""2#"2#"2"332233""33""33""333233D3ggff""##"2##""#2###""##"2#"eUVF2"32"#2"33""3"33""3##2##"3""##"2#"EE3D"""""""3""2"#2"""""3""3""3""3""3333""33""33""33333323UDxx44"2#"##"2""###"2##""3#33gg332333""3""3""33""3"##33""3##2EEgg"""""""""2"#2"#"2""""""""2#"2#"2"332233""33""33""333233D3ggff""##"2##""#2###""##"2#"eUVF2"32"#2"33""3"33""3##2####""""3"44DD3D""""2"#2""""3"""3""2"#2"#2"33""3"33""33""3332"#2"DDxxCD##""##"3"##"3""3##""3"VV44"3""3"33""3"3333""3""3##""#DDgg""""""""""""""2#""""2"""##""""3""3""3223""3"33""33223322#"33gfWV"3#""##""####""""#3"#"EEEE"2#"33""3""333""33""#""##""""3"44DD3D""""2"#2""""3"""3""2"#2"#2"33""3"33""33""3332"#2"DDxxCD##""##"3"##"3""3##""3"VV44"3""3"33""3"3333""3""3##""#DDgg""""""""""""""2#""""2"""##""""3""3""3223""3"33""33223322#"33gfWV"3#""##""####""""#3"#"EEEE"2#"33""3""333""33""#""##343434EEVVFV##3########3##DD#343D433D4443444DD##DD##34343444DDEEUTWVWVffEE####3#43D4CD#4CD#4CDFVVWggEE34343434C43444DD4EE4EEEEEEEEfgxyC44444DD##3#####3##343D43343D43344DD44443343##434343D444EEEEUUggffVW#3##43##33DD##34D343E5fWgggg3434343434E443E544EE4ED3##343434EEVVFV##3########3##DD#343D433D4443444DD##DD##34343444DDEEUTWVWVffEE####3#43D4CD#4CD#4CDFVVWggEE34343434C43444DD4EE4EEEEEEEEfgxyC44444DD##3#####3##343D43343D43344DD44443343##434343D444EEEEUUggffVW#3##43##33DD##34D343E5fWgggg3434343434E443E544EE4ED3ggxxxxgxgxxxggggggwwggwwggggfgVWVVfgFVfgffVFfgggggffgxxxxxggwwwwxxgxˆ ˆw wxxggxxxxxxxxgxxyxyxxgxgg xx ™ ‰xxgxwwggxxxxxyxxwwyxxx™ ‰ ™ ‰ ™‰ xx ™ ‰ ™ ‰ ™ ‰wwxxggwwggggwwggggffggVWffVWVVggffFVVFffggggwwxxgxgxwwggwwwwx xˆ ˆx xxxggwwxxxxgxxyx xxyxyggwwˆ ˆx xwwxxggxxxxxxxxxxxxww ™‰ ™ ‰xxggxxxxgxgxxxggggggwwggwwggggfgVWVVfgFVfgffVFfgggggffgxxxxxggwwwwxxgxˆ ˆw wxxggxxxxxxxxgxxyxyxxgxgg xx ™ ‰xxgxwwggxxxxxyxxwwyxxx™ ‰ ™ ‰ ™‰ xx ™ ‰ ™ ‰ ™ ‰wwxxggwwggggwwggggffggVWffVWVVggffFVVFffggggwwxxgxgxwwggwwwwx xˆ ˆx xxxggwwxxxxgxxyx xxyxyggwwˆ ˆx xwwxxggxxxxxxxxxxxxww ™‰ ™ ‰xx""3""3""##"2#"2#"23333VV""""""2"""""2#""""2323344333334##33""3#33""433333333333333433"333##2#33##33333333EEED#3""""3"##33"33""3""3""3##2"#2"#2"#3#DDDD"""""3""2""2#"2"#2D433D43#33#33333##33""43333333333333333433"3##2#33##33""3#33DDEE33"2"#2"###"2#""3""3""3##""3""3""3333VV""""""2"""""2#""""2323344333334##33""3#33""433333333333333433"333##2#33##33333333EEED#3""""3"##33"33""3""3""3##2"#2"#2"#3#DDDD"""""3""2""2#"2"#2D433D43#33#33333##33""43333333333333333433"3##2#33##33""3#33DDEE33"2"#2"###"2#"""!""!#"#""!33EE""""!"!""!"""!#"2"UU"###""""""#2#""2#"2#"2#"2#""2"#2"###"""3"####""gf43"""#""2""#!""""""!""!"#""DD##""""!"""""""""""D3EE""""""#2#""""""##"2#"2#"2""###"2#""2"#2#"2"TTEE""""""2"#"#"!""!"!#""!33EE""""!"!""!"""!#"2"UU"###""""""#2#""2#"2#"2#"2#""2"#2"###"""3"####""gf43"""#""2""#!""""""!""!"#""DD##""""!"""""""""""D3EE""""""#2#""""""##"2#"2#"2""###"2#""2"#2#"2"TTEE""""""2"#"""#""""""!!"33D3"""""""!""!""!""!""EE"2""#""2""#""""#2"""##""##""3""3""####"3""3"""#2#fg44"""""3"##"""!""""!""!"!""EE#3!"""!""""!""!"""""D3DD""!#""""2""#2"""##""##""3""3""##""""##"2""#"3"DDVV""#""2##""!"!#"""!"""""33D3"""""""!""!""!""!""EE"2""#""2""#""""#2"""##""##""3""3""####"3""3"""#2#fg44"""""3"##"""!""""!""!"!""EE#3!"""!""""!""!"""""D3DD""!#""""2""#2"""##""##""3""3""##""""##"2""#"3"DDVV""#""2##""!""!"!!"!!"!"33EE"""""!"""""""!""""""EE"2""""""""""""2#"2##"""""2###"""""""""""3""3"WV33"""""#"""""""!"""!"!"""EE#3""""""""!""!""!#""DD33"""""""""""""""#3""##"""""##""#""2"#"""""3"DDVV""""""!!#""!""!""!"""33EE"""""""""""""!""""""EE"2""""""""""""2#"2##"""""2###"""""""""""3""3"WV33"""""#"""""""!"""!"!"""EE#3""""""""!""!""!#""DD33"""""""""""""""#3""##"""""##""#""2"#"""""3"DDVV""""""!!#"!"!!"""!""!""""VV"""""""""""""""""""""""D3#"""!"""""""""""2##""""#"""2""""""""##"""2#"2#"eU43"""""""""""""!"""""""""""UT33"""!"""""""""""""""C333""""""""""""""2##"""3""2"#2"""#"""""""""3""344VV""""""""""""""""!!""!""""VV"""""""""""""""""""""""D3#"""!"""""""""""2##""""#"""2""""""""##"""2#"2#"eU43"""""""""""""!"""""""""""UT33"""!"""""""""""""""C333""""""""""""""2##"""3""2"#2"""#"""""""""3""344VV"""""""""""!"!!"!!"!!"""UU"""""""""""""""""""""33""""""3""2"""""3""3""3""3""3""3""3""3""""""2#"##"VV33""""""""""!!"!!"!!"!!"!UE34""""!""""""""""""!"""##"""""""""""""2#"2#"2#"2#"2#"2#"2#""2""2#""""3"##33EE"!"""!""""""""""""""""UU"""""""""""""""""""""33""""""3""2"""""3""3""3""3""3""3""3""3""""""2#"##"VV33""""""""""!!"!!"!!"!!"!UE34""""!""""""""""""!"""##"""""""""""""2#"2#"2#"2#"2#"2#"2#""2""2#""""3"##33EE"!"""!""#3##333434##3#######44ggE52"#2##""3"####"2"""3##EEDC##3#33"""#"3"""##"####"##"##"2##""4343##3434##44fVE43##3##3#33##3#43##3#"3##3444########33VFVV#3##""3"##""##"2""###""44UU#3##33##"""3"##"""3"###"###"3#"3##""43##4343##43VFVV##33##3#33###3##3##333434##3#######44ggE52"#2##""3"####"2"""3##EEDC##3#33"""#"3"""##"####"##"##"2##""4343##3434##44fVE43##3##3#33##3#43##3#"3##3444########33VFVV#3##""3"##""##"2""###""44UU#3##33##"""3"##"""3"###"###"3#"3##""43##4343##43VFVV##33##3#33###3#ffgxgggggxgxggFVEEVVggggwwggfgUUggxxwwgxgxfwgxgxwwggggwwggfgEEffVFVVfgVWggggVWggVWVWggVFVVFVVFgggxgxgxgxgxgxgxgxxxggxxxyxyxyxyxxgxggggggVWVVggFVEEVVVWgggxggggfgfggxwwgxggxxgggxwwgggggxgxggDUVVVVFVVFggggggggggVWVWVWggVFVVFVgggggxgxgxxygggxggyxxxggyxggggggggffgxgggggxgxggFVEEVVggggwwggfgUUggxxwwgxgxfwgxgxwwggggwwggfgEEffVFVVfgVWggggVWggVWVWggVFVVFVVFgggxgxgxgxgxgxgxgxxxggxxxyxyxyxyxxgxggggggVWVVggFVEEVVVWgggxggggfgfggxwwgxggxxgggxwwgggggxgxggDUVVVVFVVFggggggggggVWVWVWggVFVVFVgggggxgxgxxygggxggyxxxggyxgggggggg33"33333EEgg"""""2""#""""""3""33""3""3""3""3""""33""""3##""3"UUggFVTDUUFVTEeUWVUUWVUUVVUUWVVVETD444DD3DD3DDDDDDDDDDDDDDDDDDEEDCFVD3#2#"2"#2#"""""""3"""""""3"33""3""3##"!33""3"""""2#"33xgVVDTUETUUUVVUUUUWVUUUUUUWV‰ ˆgg3D333344DD3DTDDDDDDTDDDDDD33"33333EEgg"""""2""#""""""3""33""3""3""3""3""""33""""3##""3"UUggFVTDUUFVTEeUWVUUWVUUVVUUWVVVETD444DD3DD3DDDDDDDDDDDDDDDDDDEEDCFVD3#2#"2"#2#"""""""3"""""""3"33""3""3##"!33""3"""""2#"33xgVVDTUETUUUVVUUUUWVUUUUUUWV‰ ˆgg3D333344DD3DTDDDDDDTDDDDDD33##"""44WV"2""""""!#2#""""!"""""""""##!"""3"DDgg"3""##"2#"2#343333343333ggff"#"""2#"2""2"#"2"#2"#2"#243"#2"4344""""##""!"""!"3"""""""""""""3""""""3"ggDD"3""3""3""43"#33343333UDxgDD""#2#""""""3""2"#2"#2"#233##"""44WV"2""""""!#2#""""!"""""""""##!"""3"DDgg"3""##"2#"2#343333343333ggff"#"""2#"2""2"#"2"#2"#2"#243"#2"4344""""##""!"""!"3"""""""""""""3""""""3"ggDD"3""3""3""43"#33343333UDxgDD""#2#""""""3""2"#2"#2"#233##"""DDVF33"""""""""""""""""""""""2""""""""D3gg33"3##2#3433#33344334433ffVW#3"#2"##""3""2"#2"#2"#243"#3333""3#DD"""""""""!""""2"!""""""""""""""""""""33ggD33"#3##""43334333433344DDxg34""##"2####2#"2#"2#34""3"3433##"""DDVF33"""""""""""""""""""""""2""""""""D3gg33"3##2#3433#33344334433ffVW#3"#2"##""3""2"#2"#2"#243"#3333""3#DD"""""""""!""""2"!""""""""""""""""""""33ggD33"#3##""43334333433344DDxg34""##"2####2#"2#"2#34""3"3433##""D4gg"""""""""""2"""""""""""""""#"""""""DDgg443334""43##333334333433ggVW"2"#"3"####3##3"#2"#3#"43443344"344DD"""""""""""##!"""""""33"""""#""""""2#"ggEE3334""3#43"#34333444"3UDyx34""##"2#"3#"3##34""4343"#3433##""D4gg"""""""""""2"""""""""""""""#"""""""DDgg443334""43##333334333433ggVW"2"#"3"####3##3"#2"#3#"43443344"344DD"""""""""""##!"""""""33"""""#""""""2#"ggEE3334""3#43"#34333444"3UDyx34""##"2#"3#"3##34""4343"#343333"#"DDgg"""""""""!"""""""""""""""""""""""""##33WV33433343##2#343433343433VWVV""#""""#"""###3"#3#"3344434##DDEE""""""""""""""""""""""""""2"""""""3"WVDD3D3434""43##3343433344DDgx##"2"#""##""#3#DD"###DD3333"#"DDgg"""""""""!"""""""""""""""""""""""""##33WV33433343##2#343433343433VWVV""#""""#"""###3"#3#"3344434##DDEE""""""""""""""""""""""""""2"""""""3"WVDD3D3434""43##3343433344DDgx##"2"#""##""#3#DD"###DD3343##"D3hg"""""!""""#"""""""""""""#""!!"""44VV33DD#3433343434433434433UDEE"""#""""""""""##33##33333433DD4E""!"""""""""""""""#""!!"""""!""""VVDD4433434343444333434433DDgx#"#"#"#"""""33""##3343##"D3hg"""""!""""#"""""""""""""#""!!"""44VV33DD#3433343434433434433UDEE"""#""""""""""##33##33333433DD4E""!"""""""""""""""#""!!"""""!""""VVDD4433434343444333434433DDgx#"#"#"#"""""33""##3343##43EEggEE34##3##2"#2"""""33"#"#""33#####34##333#43D433VFVV4C433334##333##3##33####xggg#33##33##3##3##2#33D3DD#3EEEEDCEEgghw5EC4DC$3#3###2"#"""""""#"#""#3#33#33##3#33#3E533E5fVE43##3334343"#343434####C4yx33"33334##2#####33##333433343343##43EEggEE34##3##2"#2"""""33"#"#""33#####34##333#43D433VFVV4C433334##333##3##33####xggg#33##33##3##3##2#33D3DD#3EEEEDCEEgghw5EC4DC$3#3###2"#"""""""#"#""#3#33#33##3#33#3E533E5fVE43##3334343"#343434####C4yx33"33334##2#####33##33343334ffffVWTUVWffVFCDVVEEEEEDDDEEEEggVVEEEEDCEEUUFVTEEEVVffUUgghwgfffVWVVffUUffEEEEDCEEEEEEUUFVVFVVUUggwwggggggffffffgxw wgxgxgxx xxxfggxffVWffffggVWDEEEVVETDDDDUUEEfgVVVVEEDCFVEEEEUTEUEEVVfgfggggxffFVfgVFeUgfUEUU44EEEUEEEEEEEEVVVVgggxwwggggffUUgggxgxgxgxgxw wgxggffffVWTUVWffVFCDVVEEEEEDDDEEEEggVVEEEEDCEEUUFVTEEEVVffUUgghwgfffVWVVffUUffEEEEDCEEEEEEUUFVVFVVUUggwwggggggffffffgxw wgxgxgxx xxxfggxffVWffffggVWDEEEVVETDDDDUUEEfgVVVVEEDCFVEEEEUTEUEEVVfgfggggxffFVfgVFeUgfUEUU44EEEUEEEEEEEEVVVVgggxwwggggffUUgggxgxgxgxgxw wgxgg"##""""2#"""3"#""2"#2D4UU"#33""3""3""3""3""3""3""43VFDC##3"33##""##""##""#33##2#3334333334333333343433333344EE33"333"3##2#"2"""""3"##"""2""#"3"33VF332#"2#"2#"2#"2#"2#"2#"2#"UUDD43"#33##""##""##"2#"2###33##33333334333334343433333343VF332#"2""""##""""2#"""3"#""2"#2D4UU"#33""3""3""3""3""3""3""43VFDC##3"33##""##""##""#33##2#3334333334333333343433333344EE33"333"3##2#"2"""""3"##"""2""#"3"33VF332#"2#"2#"2#"2#"2#"2#"2#"UUDD43"#33##""##""##"2#"2###33##33333334333334343433333343VF332#"2""""""##"3""""2""""""3##C4fW33#"2#3334""3333333433##33gf33#3##"2"#2###"3""##"2#"##"2####2#"##"2#"######2#3344"333####2#"2#""""##"""""#""""3333VWCD""33""3333333333##3333##VVDD34##"2"####"3""""2####""##"2####2###"""3####""33D343"#"#""""2##"#""""2""""""3##C4fW33#"2#3334""3333333433##33gf33#3##"2"#2###"3""##"2#"##"2####2#"##"2#"######2#3344"333####2#"2#""""##"""""#""""3333VWCD""33""3333333333##3333##VVDD34##"2"####"3""""2####""##"2####2###"""3####""33D343"#"#"""""""""#"2"#""2####""EEEE"2#"333333333333433333#333VV4C#"##"2""#"3""2"##""##"2##""###3"#"33######""##"2444333""43"#3#"3####""""""#""""3"#"##33VV##2#3333333333333433333433EEEE#3"###"2"""""##"##""##"2##""##"2##""####""####""3##2D433#"3#"3""""""""#"2"#""2####""EEEE"2#"333333333333433333#333VV4C#"##"2""#"3""2"##""##"2##""###3"#"33######""##"2444333""43"#3#"3####""""""#""""3"#"##33VV##2#3333333333333433333433EEEE#3"###"2"""""##"##""##"2##""##"2##""####""####""3##2D433#"3#"3""""#""""""2""#"#""""DDVV"3233333333333333#3433344VV33#3"#"##"2"#""##"""####""##"2######"##2#####""##33EE#3"###"2####"2"##""""""#"#""#"###gf##2333""33333333333433##33VV4C########""#"#""#2#####""##"2####33##"#""###3##""3"EE#3#"##"""""#""2""""#2#"#""2D4fV"3233333333333333#3433344VV33#3"#"##"2"#""##"""####""##"2######"##2#####""##33EE#3"###"2####"2"##""""""#"#""#"###gf##2333""33333333333433##33VV4C########""#"#""#2#####""##"2####33##"#""###3##""3"EE#3#"##"""""""""#"""#2#""2##D3VV3333D3DD3DD3DD3DD33#33##DCEE##2###""3"""3""##"2""###"2######"2"#2#""#2###""33EE""43##""3##2#"""""""3"""#"""3##VV4C3333DD3DD3DD3DD343##33##VV3433##2#"#2#"##"""3"####""##"2####""#"#"""##"2##33EE44"3"""""""""""#"""#2#""2##D3VV3333D3DD3DD3DD3DD33#33##DCEE##2###""3"""3""##"2""###"2######"2"#2#""#2###""33EE""43##""3##2#"""""""3"""#"""3##VV4C3333DD3DD3DD3DD343##33##VV3433##2#"#2#"##"""3"####""##"2####""#"#"""##"2##33EE44"3"""""""""""""""""""""##"244VV3333####44DD333334"#""DD5D#"##"2"#""#"#""""#"##""##""##"2##"""#"#""##"2#"44eU##2#"2##""##"2##"!#""""#2"##""3"#3VF44332###4444443334"""2##3UE33##""""3""#""""#"#""""##""##"2##"""""###"2##""3"EE44"3"""""""""""""""""""""##"244VV3333####44DD333334"#""DD5D#"##"2"#""#"#""""#"##""##""##"2##"""#"#""##"2#"44eU##2#"2##""##"2##"!#""""#2"##""3"#3VF44332###4444443334"""2##3UE33##""""3""#""""#"#""""##""##"2##"""""###"2##""3"EE44"3""""33#3434D#33#3333333#3##3#43UEEE"#"""#3#"3#UU5ED5UUFV33#3##333##3#""#####333##3##3##3##33##########344434D3ggEE44EE4444444434#####33""###3#33##3#EEggD3"""""###33D3VV5DE5fgC434##3##3##33###33##3##3##3##3########33#3334443444UUWVEE44EE4433#343D4"333#333333#3##3#43UEEE"#"""#3#"3#UU5ED5UUFV33#3##333##3#""#####333##3##3##3##33##########344434D3ggEE44EE4444444434#####33""###3#33##3#EEggD3"""""###33D3VV5DE5fgC434##3##3##33###33##3##3##3##3########33#3334443444UUWVEE44EE44ggUUggUUVVwwggDDVVDDEEEUEEUTWVUUEEEEEEEDEEffVFggggwwfgUUggUUgggfgfgfffgxxxfgffggffgxggggfgfgfgffVWgg xxxxgggxgxgggxggggffggggggffVWggVWffxxTE44EEDDUU4DUEEEEEffUDVV4CVFEDFUVFeUgggfhwffVWfgUUffggfgfgfgggyxffggffVVggxxggfgfgfgfgVFffx xxyfgggxxgggxggggffggffggffggUUggUUVVwwggDDVVDDEEEUEEUTWVUUEEEEEEEDEEffVFggggwwfgUUggUUgggfgfgfffgxxxfgffggffgxggggfgfgfgffVWgg xxxxgggxgxgggxggggffggggggffVWggVWffxxTE44EEDDUU4DUEEEEEffUDVV4CVFEDFUVFeUgggfhwffVWfgUUffggfgfgfgggyxffggffVVggxxggfgfgfgfgVFffx xxyfgggxxgggxggggffggffggff""33""3"33xxTE"3""""#2#"2#"2#####3333##33##2#33"3##""""3""3""3""3""fUyx44"333""3""3""3"##""3""333xgUU33333333343333##33##2#3333""3333ggD3""##""""#"#""3"##""3"#333##2###33"333#3"#""##""3"##""3""3D3xxVV""3##233""3"##""3""3""33VWffC4333433343333##2##3"#33"333""3"33xxTE"3""""#2#"2#"2#####3333##33##2#33"3##""""3""3""3""3""fUyx44"333""3""3""3"##""3""333xgUU33333333343333##33##2#3333""3333ggD3""##""""#"#""3"##""3"#333##2###33"333#3"#""##""3"##""3""3D3xxVV""3##233""3"##""3""3""33VWffC4333433343333##2##3"#33"333##33""gV44"3""##"""2#"2##""##""3"##""3##2"#33##2#"2##""#2#223333UD xxCD""3#""##2###""3"##""3"DDgg##33""3"#3"#2"##33##2###""3"333333VFDC##"""##""""#2###""3""3""3"##33##2##3"#2"##""3""2"#23322D4xxUU"233""3"##""3#"2##3"#2"ggEE"2#"2##3"#2"#3#"##33""3""333##33""gV44"3""##"""2#"2##""##""3"##""3##2"#33##2#"2##""#2#223333UD xxCD""3#""##2###""3"##""3"DDgg##33""3"#3"#2"##33##2###""3"333333VFDC##"""##""""#2###""3""3""3"##33##2##3"#2"##""3""2"#23322D4xxUU"233""3"##""3#"2##3"#2"ggEE"2#"2##3"#2"#3#"##33""3""333""##"2EE44"2"""""2#"""##"2"#2##"""""2##3""3""3""3""3""3333322#"eUhw#433""##"2##""####""3##244xg33"3""3"#3"#2"33""3##2##3334""4433VVEE"2"""""##""""""##""""##""##""""3""3""33""3""3""3""3332232D4whEE"2##3"##""##"2#"##"2#"2#VWVV""3""3""3#33""3"33####2#"333""##"2EE44"2"""""2#"""##"2"#2##"""""2##3""3""3""3""3""3333322#"eUhw#433""##"2##""####""3##244xg33"3""3"#3"#2"33""3##2##3334""4433VVEE"2"""""##""""""##""""##""##""""3""3""33""3""3""3""3332232D4whEE"2##3"##""##"2#"##"2#"2#VWVV""3""3""3#33""3"33####2#"3##""3"#3D4DE"""""""""""2#"2#"2""##"""3""3""3""3""3""3""33""33333322gfhw#4""####""##""3"##""3""333ggC42"#2"#2"#2##2#33""###3##2#343444UUEE""""""""""3""3""3""2"#2###"""2#"233#2"#2"#2"#33233322DDxxUU"#####""##""##"2##""3##2ffUU"3""3"33""3""333""##"2#""3##""3"#3D4DE"""""""""""2#"2#"2""##"""3""3""3""3""3""3""33""33333322gfhw#4""####""##""3"##""3""333ggC42"#2"#2"#2##2#33""###3##2#343444UUEE""""""""""3""3""3""2"#2###"""2#"233#2"#2"#2"#33233322DDxxUU"#####""##""##"2##""3##2ffUU"3""3"33""3""333""##"2#""3""##"2434DD5"""""""3""3""3"""##""3""2"#2"#2233#23333""33""33323333UDxxCD##""##"2####"#"2###""33gVD42"33#2"#2"#233""3"##33##2##33334ggDD"2"""""2"#2"#2"""""#2#"2""""3""333"3""33""332233333323C4xgEE#3"###"2##"#"2###""3""3UUVV""33""3""3##2#"233##33##"3""##"2434DD5"""""""3""3""3"""##""3""2"#2"#2233#23333""33""33323333UDxxCD##""##"2####"#"2###""33gVD42"33#2"#2"#233""3"##33##2##33334ggDD"2"""""2"#2"#2"""""#2#"2""""3""333"3""33""332233333323C4xgEE#3"###"2##"#"2###""3""3UUVV""33""3""3##2#"233##33##""##""3"334444"#""""""""2"#""""""3""3""3""3""3""3""3"33""3233""3"DDggE43""3##"#"##"2#"##"2##""gV44"3""3"33""3""333""3"##""##33##33VV4C""""""""3""""2""""##""""3""3""3""3""3"33""33""3223""33gfgf"""##"33"""#"2#####"UEEE"2#"33""33""3"23""3"""""##""3"334444"#""""""""2"#""""""3""3""3""3""3""3""3"33""3233""3"DDggE43""3##"#"##"2#"##"2##""gV44"3""3"33""3""333""3"##""##33##33VV4C""""""""3""""2""""##""""3""3""3""3""3"33""33""3223""33gfgf"""##"33"""#"2#####"UEEE"2#"33""33""3"23""3"""##343444VVVWVV33##333##3##DD5D43D433E534EE3444DD#3DD#4CD#4CD44UUEEUUffggfgEE##343433DD3D34E4DD3DVFgggxFVC4DD4433DD3DE4DDFVEEEE4434EEUU44ffVF33DD44##33#3##43E5CD44DD44DD4E44DD3DD34343D43343E5DEEEVVfffgVWff##3#DD##DD4ED3EE#3DDEEVWwhgg443434C444DD4ED3EE4EE4EE#3434344VVVWVV33##333##3##DD5D43D433E534EE3444DD#3DD#4CD#4CD44UUEEUUffggfgEE##343433DD3D34E4DD3DVFgggxFVC4DD4433DD3DE4DDFVEEEE4434EEUU44ffVF33DD44##33#3##43E5CD44DD44DD4E44DD3DD34343D43343E5DEEEVVfffgVWff##3#DD##DD4ED3EE#3DDEEVWwhgg443434C444DD4ED3EE4EE4EEggxxgxggxxggggwwffgxgggxfgggUUggVFffVFfgVFVVffggffggggxyxxggggwwxxgxw wx xxxwwggxxxxxygxx xxxxygggg xx xxxxgxwwffxxxxxyggxxxxxxˆ ˆ ‰ ™xx xxxyˆ ˆxxffggggggffgxggxxfgggfgUUVVFVVFfgVFVVffVWggggggxxxxggwwggwwwwgxˆ ˆx xggxxggx xxxxxxxgxxxgxggxxx xwwxxggwwgxgxxxgxgxxxxx ˆ‰ ‰ ™xxggxxgxggxxggggwwffgxgggxfgggUUggVFffVFfgVFVVffggffggggxyxxggggwwxxgxw wx xxxwwggxxxxxygxx xxxxygggg xx xxxxgxwwffxxxxxyggxxxxxxˆ ˆ ‰ ™xx xxxyˆ ˆxxffggggggffgxggxxfgggfgUUVVFVVFfgVFVVffVWggggggxxxxggwwggwwwwgxˆ ˆx xggxxggx xxxxxxxgxxxgxggxxx xwwxxggwwgxgxxxgxgxxxxx ˆ‰ ‰ ™xx""#2#"2#""33"""##33VU"""""""""""""2"""""22334433"333"3""3""3""3#3233333433"333333333##2#"233""3"##33"3VFCD""""3"""##"""33""#2#"2##""3""33""EE33""""2""#""""""""""3333DD""3#33#2"#2"##""3#324333333333333333##2###33""3"#3"#33D3EE33##"""""##"2""3"#"2#"2"33"""##33VU"""""""""""""2"""""22334433"333"3""3""3""3#3233333433"333333333##2#"233""3"##33"3VFCD""""3"""##"""33""#2#"2##""3""33""EE33""""2""#""""""""""3333DD""3#33#2"#2"##""3#324333333333333333##2###33""3"#3"#33D3EE33##"""""##"2"""!"""""!""""33UD""""""""!"!!#"""2UE##"2"#""""3""##"2"#2"#2"#2"#2"##""""##"3""2"##""ff34"#"""2""#""2"#""!""!""!"""EE#3"""""!"""!"""!""DC44"""""""2""#"3""2"#2"#2"#2"#2"##""3"""##""""3""EEVV""""#"#""""#"!""""!""""33UD""""""""!"!!#"""2UE##"2"#""""3""##"2"#2"#2"#2"#2"##""""##"3""2"##""ff34"#"""2""#""2"#""!""!""!"""EE#3"""""!"""!"""!""DC44"""""""2""#"3""2"#2"#2"#2"#2"##""3"""##""""3""EEVV""""#"#"""""""!"""!"""""33D3""""!"!""!"!"""""!""EE"2""""""""""2""""##""##""3""3""3"####""##""""2"#2WV44""2"#"""#"##"""""""!!"""""DD#3!"""!""""!"!"!"""DC4D""""""""2"#2#"2"#2""##""3""3""##""##"3"""2##""DDVV##""""""""!""""""""!"!""33D3""""!"!""!"!"""""!""EE"2""""""""""2""""##""##""3""3""3"####""##""""2"#2WV44""2"#"""#"##"""""""!!"""""DD#3!"""!""""!"!"!"""DC4D""""""""2"#2#"2"#2""##""3""3""##""##"3"""2##""DDVV##""""""""!""!""!!"!"""""33EE"""""""""""""!""""""EE"2""""""""""""##""""##""##"2"#2#"#2#""""""3""3VW33""""""""3""""""""!!"!""""EE#3""""""""""""!""""""DD33"""""""""""""3"""""##"""""##"2"##""""""##""""EEVF"!"""#"!!""""""!"""!""33EE"""""""""""""!""""""EE"2""""""""""""##""""##""##"2"#2#"#2#""""""3""3VW33""""""""3""""""""!!"!""""EE#3""""""""""""!""""""DD33"""""""""""""3"""""##"""""##"2"##""""""##""""EEVF"!"""#"!!""!"!"!""!""""""VV""""""""""""""!""""""DC"""""""!"""""""##""##"""2#"##"""""""3"""2#"2#UU34"""""""""""!"!"""!"""""EE34"""""""""""""""""""33##""""""""""""""2##""""#2#"2""#""""""#""2"""""DDVF!"""""""""""""""!!"!!"""2VF"""!""""""""""!""""""DC"""""""!"""""""##""##"""2#"##"""""""3"""2#"2#UU34"""""""""""!"!"""!"""""EE34"""""""""""""""""""33##""""""""""""""2##""""#2#"2""#""""""#""2"""""DDVF!"""""""""""!"!!"!"!"!""#ff"""""!"""""!""""!2"#3""""!!""#"""2""""3""3""3""3""3""3""3""3""""""2#"##"2VF3#"""""""""""!!""!""!""!""UU33""""!""""!"!""""!"""33""""""3""""""2#"2#"3#"3"""##"2#"2#"2""#"2"#2##44EE!""""""!"""""""""!""""#ff"""""!"""""!""""!2"#3""""!!""#"""2""""3""3""3""3""3""3""3""3""""""2#"##"2VF3#"""""""""""!!""!""!""!""UU33""""!""""!"!""""!"""33""""""3""""""2#"2#"3#"3"""##"2#"2#"2""#"2"#2##44EE!""""""!"######""3###""""#3VFDC##3"##33333433##33##3333E4EE33#3##"""##"""""###"""##"""2"#2##"########UU##""""""""""##"2####34""""##EEUU#4##"3"3333#333##3333##DD4E4433##"""""2""""###"##""##"""2##"########EEED##3334"""#######""3###""""#3VFDC##3"##33333433##33##3333E4EE33#3##"""##"""""###"""##"""2"#2##"########UU##""""""""""##"2####34""""##EEUU#4##"3"3333#333##3333##DD4E4433##"""""2""""###"##""##"""2##"########EEED##3334"""#UgWVggVEEUFfhwggw ‰wxxxxxxxxxxfEVUFfFVUWUVEUU5EUFfWggggVggFUEEEUggEEEVgVVEEUVgxgfxw‰wxxxwxxxxxgVEEVEVVVUWVUEUE5UUWVgggggVgggwEUU54CD4eg3#"33##33"33334333#"23##3333UgfUgfVfgggfUWfgUTD4TVTUUUUUUUD3"33gD3#3#33"#3"33333333#"33"3#33DgfVfUgffggffVg ™WTDDDUUUTUUUUV""""4g"""""2""""!"""""Dg3"2#"3"33333Vf""#"""""2"#2"#2"333VD"!""2"""""""""2hC"#""3"43333DyC"""#""2""2#"23"#"3W"""""""""""""""""Dg3"#"43333343gV"3#"#"2#""333333"33V5"!""""!""""""""3gD#"3"4333434Dx#2###"2#"2#3"33#"4f"""""""""""""""""2Dg33#3#3334333gg""#"#3#3"#3#3434344VD""!"""""""""""#"""#gE33"4#333343Ug4"#""###3"4#3333#Dg""""""""""""""#"""4V433#3#334434UV"#""###"433434343WE""""""""""""""""2WD43#33"44"44Dx#"""3##33#43#""Dg""""""!"""!""""3fD43#43434333EE"3"#"##333"#33gD"""!"""!""""""""VDD3343443343Dg"""#""3"33#3#4g4#"#"""!""""""##""##3EV3#333#3#3###fg#3#"""#""33#3#"#"4gV#"""""""""#""#"3##4f4##3433"4##2Dy233""#""#"#"#gUgUfgfEVVEEEUEfEUEUEEUVEfVfgggfgfffFVD4EEU4UVEVgxgVfUfgggxfxxxxgfggfgfVFVEDUEEVVEEEUEUUEVVUgxffgfVgfFDDEEEEDVEVgxgfVgUgggxfgxwh""3""3""2#""#DE33""33""3""33VD3"3#"3#3#333334D334DD343DDEU3D3DD3333""3""#""#3V33"3"3"3""3"3UD3333#"2##3#334343D34DD3DD3DV4C#"3"#""""#""#Dg3"3"3333#33"4fD#"#""##"""#"#"#"##2""###24D"#"#"#""2"""""#"3gD"3"3"43333##VE3##""#"#2##2#"#3#"""##"3D3"""""""#"2"#"3DF""33333333#43V33#"#"322#"#"##2#"#"#"#"34#24#"#"""""#""#""4V3"33333333433DU3#""##""""#""#"##2##"##"#34"4"#""""""#""#"EV3333333334#DE4"##""#""#"###"#"##"#""##"#3D3"#3##"""""""""#"g"#3333333#33#UD###"#"""#""##2##"##""3#"#"E3##""#""""3#4V3333DD3DD#334V3"#"#"32#"#"#"##""#"#"#"4E"#2#"#2""""""#""4V423D3DD333#34V4"#""#"#"#"#"##"###""""#"23E4""""""""""3"4V33#4DD433""#UD"#"#""3"##""#"#"#"3#"3"3V""3#"##"""""""##"f43334DD3433"U3#"#"#2#"22#"#"#"""#""#"2E4"3"##3#""3"3#3##EU""#"DE3VU###3""#3"####""""##334WD444343##3"#3""###3V3""#"#DD3g###3""#####"##"""3#3#4VV#443gfgUVxfEfUEEFVffEEU4EVfVxxggggfggfgggfVfV xggfgfVUgxgggxgggggggggxgfFTUFU3EEEEVVfV5UD5fFggxggggfgfgfgxVfgVwxfgVgVVfxxVggggggggggg33333xF"""""#3"#3333#33333#2"33"33"fxC$333"33#3"3DyUDC3D433333333"#2"#e#"#""#"3"#33#333333#2#"3"333D xf333333333333fgDD4D33D33333""3#"gC##""#"""3#""#3"#23#"#"""2#3"U xE""#""3#"2#"4g3"2##2"#3##"2#"2#3"43"2""##""#"#"3"#2##2#""3"23DxV"#2"#"#"2#3"WE"3"##"#"#3"#"3#""V3#"#""#"#"""#"2#""3#"""2#332"Ux4""3"#"2##""3x3"#3"#3"3"#3#"#3343E#""""#""#"2##"#""3"#"""3"33"3xE"3"#"#"2#""3gV""3"#23#"3#""#"3"DE"""2""#2""#"""3""3""3"33332Uy2###"#"#"#"#3xC#"2#"2#"#3#"2##344D"""""""2#""""#"2#"2#"2#33"32DxV2#"#"##"#3#UW"2"#3#"2##2""3#"#ED2""2#"2"""3""23"3"3""3233UgD#"#""#"#"2#3g33""3"#23"#3#"#3#33V""""""3"""""3"""3""33"3"3332DxE"#"2##""#"2#UV"2#"2#"3"#2#"#"2344""#"""3"""#""3323""33323323Cx4"#"##"#"##"#g323"3""33""3#"2##2#E#"""22##""""2#3"3"333"233"3gf3""##"#"3"#EV"23"3"3"3""###3#4WU#""####3##43#434##3##3#3D4DVFfE"###3#3##4EVgE3###4344444D##3#4EV32####3#43#D343##3##3343EUUVf###3##33##DVgV#3#433434434gxgxxwgwggggggfgfVfgfFfggfxxgwgxxx ˆ ™wggxxxgyxxxwˆ ‰ wxwgxxxxgxˆ™ ‰™ ‰ xxxxxwhgggggggfgUfgVVgfgfgxwggwxwx ™wxgxgxwxxxxg x ™ xwyfgxxxxxx™ ‰™33"#33"3"3DE3"2#"2#"2""33D33D3#333333D3D3D3D3333333#3DED3"33#3#33333#3"3333ED""3""3""3""D4D3343#3334CD33433D333#333333DED"#33#3#!#!""3U""!"!"""V#"""""2"2#"2#"#"#"#""#""g#""""""2""!""E3"""""""DE3"#2"2#"2#""#""#""""#TF"""""""!""""3E""""""!""E3""23""2#2"#2#""#"""#"gC""""#""""""""T#""!""!""D3"""""""#"2##"2#"#"#""""#3DV#"""""!""!"2U"""""""2"U"""""""#"#"""3#""#"""3#U4""""""""""""E3"!"""""""D4"""""""""#""""##""""""#"DV3"""""""!""3V""""""""""4"""""""2"#""""#"""#""""g3"#""""""!!"""U#"""""""""""3#"""!#""#""#"""""""""""2DF"!#""!"!!""2U""""""""!#"2""#""""2#"2#"2#"2#"""#"#"U#""""""""!!""DD""""""""3"""""2"""3""3""32"""#""34E!!"""##"#"#"!$VC##""33#""3"#D34#""""#""#"""""2##2#"4gE##"3""#3#3##"""EE#"""3"#"2#"24D#3##""#"""#"""#"""#""###EU#"3"#VggVggFfEUFgxggfh wxxxgwxxxxxfgUFVVFfVVVVVFVUEEUFgggggx ™ ‰hwxxgfggxywwyfVFUEVVgxgfg wxxxxwxxgxxxfVEVFVVVVWVVVVEUEFVgVghgggggggxEVUED"DDUg3"#"323""3#33"333"""33""#3"UgUUWUfUgfVfVffgTDEDDDDUTEUUTDUUDDfV""3##33""#"3333333"#"#3""3"3DgfUfUgUgVgfVUg ˆgDDDDDTUUTUUDV"#"3g"""""2"""""""""2Dg3"#2"#3"3343VV"""""22#"2#3""3"VU"!""2""""""""""2hD""3""3333"4DxE""#"""22#"2#3""#DV""""!""""""""""""Dg3"#"43433333gV#3"#"2##2"#33"#34"VV"""""""!""""""""3gD"#243343343Ug3"3"#"2#"2#3"#3#"Dg""""""""""""""""""Dg33"3#33344"4fg""#"##23"#2#334"43EV""""""""""""#""""gE33"4#"43343Ug4"#"3"#3"433"433#Dg""""""""""""""""""4VD343"43"4334fV"#"#"##3#3443433VU""""""""""""2"""#e443#3#433333Dx#"#""###4#333#""Dg"""""#"""""""""!"4UDD3343344433fV"3"#"33333#"3VF""!"""!""""""""!""VE34333344334Dg"#"#"!3"3333#EgD##"""""""3#3#####3#EV3#334"#33#"3gg##3"#""#"3DDEDEEDgg33###""""""#"###3#3#DV433343##3###Dx#"333#""#"33#fVUWUgVVFVU3VEVfVEEUUEEVEFffgwffgUfgfEED5UEEEVUFwxgfffUggxgf xx ˆxxxwgUggEVUFDDVUfVEEEEEUVEfVfgwgfgfWUfVEDD5UEEEVEgwggffUgfgxgg wxg""#"2#""2"#""DE#2"#23""32"#3VD"#3#"3"#3"#3#3343343D343D3DV43DD33""""#2"#""#"3U433""3""3"2##ED3#3#"3#"##333#D343343D4343DV42#""2##""""#""Dg"3"33"333#3"4f4###"#""#2##""#"##"#"3##"4D""#""##"#""""""#""g42"#3"333333#VE3#"#""#"#2##"#"##22##"#3D3"#""""""""#""3DF""3#333333#43VD"#""#"#"##""#"##2##""###"34#24""#""""""#""""#4W#2333#33334#3ED#3#""##"""#""#"2##"3"###"2433"#"""""""#"#""4V""3333334333DF33"#""#""#""#3#""##"""##""4424"#""#"""#""23g#"23#343333#3E333#2#""2##"#"###"""3#"#"E3##"""""""""""DV333DD3D3D#3#EE3##""#22#""#"###""#"#"#"4D3"##"#"2""""""3V4333DD3D33#3#V43""##2##""#"###23""##"3E3##"""""""""#"4f#3334D433#33E""#""2""#2"#"#""23""#"4E"#"32""""""""##3V34334DD43#"3#U3#""#""#""##""#2##"#""##"2E4"3"#3#3""33#3####EU"""EC4gE##3##"#""#3######"""3#344WE4434##""""""####Df3"#"4C3Eg######""3########"""##344UV4443gUgUVxgEfDEEEVUgEEEDEVgfwxgggffgfgfyfffgVxgfgfgfVgxgfhwhfggfggggUgUVVEED4EDVUEfUEUEEEVffgxggffffgfggxfVfVhwgfgfgFfxyUhwgggggggfg333#3xT"#""#2#"#333#33333""3"#"323U xD3#33#3#"3"34xUC43343333#33433fV"""""#!#"##333##33333"##"3""33Dwf3333#33"#333fgD3334333#333""3#"gE"""""#"#"#"2#"#2##2#"#"2#"3"UxD"#"2#""3#"#3g3"#2#"3"#3#3#3""EV"!#""#""#""#"2##3"3""#"""233Dxf"#"2##"3"#3"fE""33"##"3"#3"3#""ED2""2#"""#""#"2#3""#"2#"33"Uy3"#2#"#"#"3"3x3"#2#"3#"3#"#33"VE""""""""#"""2#""#2#"2#""3"33"3xE#2"##""#"2#"gF2"#3""33"#3""#"#"E4"""""""#"""#"""3""3""3"33322Vx3#"#"#"#"#"23hC"#3""3#"2####3DEV"""""#"""#""#"""3"3""3"33332DxE"22#""###""fV"3""3#"2###""3#"4CE2"""3"""#2"#2"#33"3"3"3233Vw4""#"#""##"23WD2#"2#"23"#"3"33WV""""""3""""""#22323""3"3323Dgf"##"##""#"2#VV"2#"2#"3"#2#"#"24D3"""#""""""""""3""33""33223#2DxC#"##""#"##"#g3"3"3""3""3""3""VF!"!""2"""""""23223""332232"3gg2#"#"#"#"##DV"2#33"32"##"##3#EVV#######D3#D#343434##34#4DDEUWfE####3D#D#3VVgE#3#43D#44DE343ExxC43#"####3#4D334434#4#3#34D4EUffV###3#D#3#DEFgV34#34344D4D3gxxxxggggxgwgfgVgFfggVfggfgxggwxwxx ˆxggxxxgxxxxw xˆ xxgwg xywx xx ™‰ ™ ‰ ™ ‰ ™ ‰xxgggxggfggfVfgFfVggfgywgwgxwx ˆxxgwxxxxxxxgx ˆw xxgxxx xxxx™ ‰y3"##3"#3"#3U""3"""2#"""33E33333"#3333D3333343333333333VD3""#33#3"#233""3#"3U3"#2"""#2"33DD333##323333D333333#32433333DED""3#3#3"""!""2E"""!""""U#""""""#2"#2"#"#"2#""#"#"f#""3""""""""2D#""""!"""D5!""#"3"#"#"""3""#""""##"DE""""""""!""!3E"""!""""""E""""""""#"#"#""#2"#2""#"g4"2"#""""!"!"E#""!""""""D3""""""""#""#"2##"#"#"#23DW2""""""""""2U""""!!""2E2""""""#""""#2#""#"""""3V4"2"""""!"!"E#"""!"""""!D4"""""""##""""#"#"#"""2DV#!"!"""!"""V"""""""!""D""!""""#""#"""#""""""#"e$"""""!""!!""U3!"""""!""33"""32"#232#""23""DV"""""!"!!"""V!"""""""!"3"""#"""""2#"2#"2#"2"""#"2V3"""""""!"""E3""!"""""""3"""222#"2#"2#"22#"""3"4E""""#"##"#""3V4#"3"33""3#3"ED3#"""#"#""##""#"2###"##3ED""""""""""UV"#"323##"3"#D443"""#""""3""#""#""####EU#"#""#VggVggVUEFfgxgfgxxxxxwxxxgw xgfVFVVfVWfWgVVVFVUFfgggxgggggFf5gfVFVUEVfgUUEUUggxfggwxxwxwwwxgwxfVVVFffFgfgVVVVFUUFgggxggggxgg xVUVVD"33Dx"3""3#""""3"#2##3""""3#"#""3UgUVUUUWUfUWUUfgDDD3DTDTDUUUUfUDDUfE""#3"""""3""333#"3#""3"""3""DgfTUUUWUgUWUUg ‰eDD4CDDDTDUUDD32Df"#""!2"""""#"""""Dg3"#2"#333333VV3#""""#2"#2"#2"#2"D#""""!2""!""""""2hC"#2"#243333Dy4"""""22#"2#3#"#3W#"!""#"""""""""""Dg3"#3"4333434fV#3"#"22"#23333434D3"""""""""""""""""3gD##24"433343Ug4"#2#""3#"24"33#"DF3"""""""""""""#!""Dg333#34"33433gg""#"##24#3"#343444D3""""""""""""""#""3gE333#3433343Ug3#""##3#"33#3333#Dg3""""""""""""""23g34"4#3433434UV"""#2#"#3444D43E4"""!"""""""""""2"WD433"4"43434Dx#"#""2##3##D3#""Dg"""""#""""""""""Cf443334343433EE""#""""##D34343ED!"!"""""!""#""""VD34434343443Dg"""#"""3"333#3EgE##2#""""3"23###3#334UF3##33433###"gg23###"#3"43DEDEDEgV33###3"""#"""###3##3#43EVE3#33#33##2#Dy#"34"##3""3433ffVUUgUEVUEEEDVgEVDEEVDVUFefggfgVfUgVUD4VEEEVFEVxgwgfgUxgxgxgxwxgggffffEfUEE3VEgVEU4EVEUVDgVfxffffUgUVDEEEEEUFEVgxggffVfhwhwhwgg2""#2""""#"DE3""3""3""3""3VD3#"3"#"#"2##33334333343433DE333"#2""#""#"#""#"3V32#"2#"2#"2#"UD3#"#"2#"2##3#33343333443334UD"#""""##"""#"2Dg#23"3"3333##3g4"##"##""#"#"#"#"##2#"#"#24D"4"#"2#2""2""33fD#23"33333#3#VE3"##""#22#"#"#"#"#"3##"2D#2""""#""2"#"3EV23333333343#VD"#"#2"#2#"##2##"##""##"#34#2##"#""""""#"""#3W"#333"3333343ED##2##""####""#"#3##""##"#2D#24""2"2#""##DE""3333333#333E4"#""#""#"##"#"#"##"""#"#"3424#"#2#"""""233W#2"33333334#"UD#"22322#"#"##3#""##"33D#4"""""#""2""4V333DD3DD43#33E3"##""233"#"###""""##"#3E3"###"#""""#"#""#VD333D3DD333#4V3###""#"3####""###""#"#"#"E42""""""""#"4V33#34D4332ED##""#""""#2"#"#"""#""##""4V""#"##"""""""""""4EE3#34C434""#3U3"#""#""223""##""#"#""#3E4"2"#333"#333####3UE"#"#DU5gU##3###2#C##3####"#"33444VE4DE#3##"#""###3#3g3""##DU4DV##3#3#"2"##3#####233#343VF444DgUgUVxgDVDUEEfVUEUEEUVffhwfgfffgfgU xgfgffxgfWfgUfgxxggggggggggfgfVVgEEEUEFfEEVVUVEUVDVfWfxgfggfgfgfgyfgfVwxfgfgfVfxyggxgggggfggg3"3"3xU2"#2#"23#3#"33333"#"2#"23"U xE"#2##2"#3""4ˆDD333333"33#33"Dg"#"2##""#"2#"#3#"3#333"#"#"2#"33‡F3#"3"#2"#"33VgD333D#3"33"3""3#3VD"#""""3#"#""#3"4"#2#""#"#233UxC#"3""3#"#"43g3#"3#"3#3"##3""DV#""#"""#""#"#"2##3"#3#"2#"""2333xf"#"#2##"#2"#gE"2#"#3"#3#"2"3#""ED""""""#"""#""#"2#"3"#"2#"32#Ux#2#"#"#"#"33‰3""3#"23#"#3"#"EV"""#!#""#""""#""#"23""3#""332"DxE"#2#""#"#"3"fV""3#"33""3##"3#"#E4#"""""3""#""#"""33""3""33232gg3##"#"#""#"23x4""3"3""3#"#3##DV""""""""3"#"""##"2#"3""3"23#32DxE""#"#"#"#"2#fV""3""3""3##""3#""ED"""22#""""3""3"33"3"3"3332Ux4""#""##"#"33g323""3"3""#3"#2Eg""""2"#""""""2#""323"3"3"323Dgf"#"#""##"#"2VV"2#"3""3"#2##"""4DD""""""3"#"""3"3""3"3"32#"DxD"##""#""##"2V4"#23""33""3#""Dg"""""""2""""#"""3"23""3"3232"3gV"#"#"##""#2EE"23""33"3""#343EVV######3D#4C4D434D#D#3434DEUVWfE###3DD#D3DFfgE3434C$4DE4EEEEfyC44D####3#4C43434D4434#343D4EEUgfV##4#3D#3D35fgg#4343E#E4EE3gxxgxxgggwgwggfWVfVffFfggfgxxgwwxg ˆwxgxxxxgyxxwg x ™xgwgxxxxwywš ‰ ™x ‰ ™ ‰wxgwggwggfgVfVVgfVFfggwxgxwgwwx ˆxxgwxxgy xxygw ˆxwxgxxxxxxw ™ ‰x""3"#"2#"33V""""""""#""234333#3"#3"433333333"3#"3#3333EE2""##33""3"#2#"2##DD""2222#D3D#3#33#3"4333333333"#33#3"#3DE3""#2#""""""""3E""!"!"!#"U"#""""#"2#"2#""""3#"2##"g3""22"""!"""D#""!"""""D4""""2"""#"2#"""#"223""TE"""""""""""3D"""!""!!"E"""""""#2""#"#""3"##""#"""#f42""#"!"""!""E#""!""""""DD"2"""#""#"#""3"#""#"""#"DV"""#"""""!""3E""!"""!"""E"""""22##""""#""""""3"W3"""""""""!""E#""""!""3D3""""2"#"#"""#"""""""#CV"""!!""!"""V"""""""!#!"D""""""""#"""""#"""#"""#2U4""""""""""""U3""""""""""33""!""""#"""""#"""2""2#4V"""""""!""!#U""""""""""3"""32"""3""3""3""32"""#"V3"""!""!""!"U3""""""""!##"!"2"""3""3""3""""""""3#3E"""!##334#####4gE""#"2##"#""#ED##3"32"###"##"#"43#34#4VE##3#3##4##2#44####3VF3#""#"#"""#"4U3#3#2"#"""##"#3"#"4#34#3VV#3##3###fggggxgFEVggwgfUgxwgxfxgwggwgfEfVFfWggVgWVgVFVVggxgxgxgxxgxxyxyxggggWVgVEVVghggfggwxgxggwgggxgDfFVVgggggVWVgVVFgggxgygggyxgygggg3"33Eg""""""""23""3""3""3"""#"2UgFTUFUUVUWUVUWVT44DD3DDDDDDDDDEDV3#""""#""2"""""3""3#"3"""""#3xVDUTVVUUWUUUW ˆgD334DDDDDTDDD3#"4W"""""2"""""""#!"3Cg#2#""3333333gf#""""""22#"2#3"#34""#"!""2""""!""""2hD""3""4"3433UgD""#""""""#2"#3#""DF3""""""""""""""""Dg3"#243#34343fV#"3#""#""3""4"33"#D2"""""""""""""""""3gD"##"4333434Dx#2#"##2#"24""43#"Dg""""""""""""2"""Dg433"4#333343gV"#""##3#"3#"4434"4D2""""##"""3""3""""hE24"#4"3344"Uy3"#"2###3"43"4332Dg""""""""""""""""#3W3334#"433433VV"""#"##2##344#DE""""""""""""""""""g4C43"4#33434Dg#2""#""#D##D33#Dg"""!""!"!"""#!!"4V3D3433443343U5""#""""#3#3333DE""""!""""#"""""""VD43434433443Dg##"#""3"#33#4EgE3###"#"""3""#"3##3#3#4C4VFD333#3#3#3##xg3#3##3#"3DD#EEDEggED34###2""2#"##33#33#E3EVE##343"434##Cy3"34#"##3#3334ffVUVfV4fEEEDEEgVEEDEUVDEVfUghffVVfUfEEDEEEUVFVUgwgggfffgwxgxxxfhfVffgVEEVUDDUEfVVEDVEEUTEVfgggfVfVUgTE4EUEEEEVVggwggfUggxgxg wxg#""""#""#"""DU"3""3""3""3"4V33#3#"#"#""3#"33333333343334E3"33#"""""2#"""#""3V3""3""3""3""3UD3#3#"#"#"2##3#3333333433334V3""""2#2""""""#DV4""33#33333#3g3#332#2#"2#"##2#"2###"3423##"2#"#""""""33VD"3"33333#33#VD3##"##""#"##"#"##2#""##"3D3"#"""""2""##"EE"2333333333#3VD"#""#""#"#"#"#"##23###"#"443"3##2##"""3""##3V#"33333333333EE#2#""""##"#"#"#"#"##"##"#2D#2##""""""""#"""DV"23333333#434V3#"##""2#"##"#"###"#"##"#3E#"#"3#""#""""2##g#23"3333333#3VD####""23##"#"##3#2###"2E#2#"""""""2"#DV33D3DD3DD#3#DE#"#"2""##""##"###""#""#"#"3E"4#"#2"""""#""2#VD33DD3DD34#3#V33#"#2#"""##"#"##""""#"#3E4"""""""""""#"4V33##4D333#"DE"#""2#"""#"#"#"#"""2#""4f#"2#"#"#"2"""#""3V43"#44433"""#V2#"""#"""#2"#"#"#"""#"#"2E4"3"3#3D33333#3#4UE""##"#UE5UV3##33##"#33##3###3#####344ChE4E44443##3"###3##EgD""#3DV4EfD#3##33#3#3##3#####333444UWD4E4gUgUVwgDVDEUEUVUEEEEEfVggwfUgUggfgfgxffgfggggfgfVg xxggxggggfgggfVgVfxU4EDUDEEEfUV3VEEVUgggfVgUfgfgfgyfgfVgxgfgfgVf xxggxggggfgfgf"3""3xU2""#"2###33#3#"32#"""3""3"Uy4"3""3""#"2#3xD3333333#3#"33"33gD!#"""2"#"2#3#"#3"33#"#""#"2#DxV"#23""#"2#"3VfD333333#"3"3"3#3"W4""#"""##"#""#"3"#3#"2#""#233U xC"#"#2#""#"2Dg#3""3#"#3#"#"2333V4"""#"""##"2#"2#3#"3"##"22"32DxU"3""#"32##2gE""3#"2###3"""3"#"E4"#"""""#"""#"""3"#2"#2"#332"Vw#3"#"#"##"3"4x3""3#"23"#2#33"43VE""""#"""#""#"#"""3"3""3""3322DhE"3"#"#"2#""3VV""3"#3""3##""#"2#DE""""""2#""#"""3""3""3"3"3332gg3###"#""#"2#3gD""3""3#3"##3"434UE"""2"#2"""#"#"""#32"#2"3332DxU"##"#"#"#"3"fU"3"3""33"#"2"3#"4C5"""""3"""#"22#"23#33"3"3233UxC#"#"##""##"3g333""3"3""#3#"333gD""""2"#2"""#"""2#3"23"323332DgE#2#"#""##"2#UV"3""3#"23#3#"#""344""2"2"""2#"2#"2#"23"23""DgE""#""#"2#"#"g4""33""33""#"#3#3VD""""""""""#"""3""3""3"3"23"3gf2#3"""###"EE"23"3""3""##344VVV3#3#3#DE#D3E#E34D3D#D3D4UEUfgfE#343DD#ED3VghVCD43DD4DVEE43EU4fV3D4#3#345C4D4DE4D3D34C$3EEEVffWf##D#DE3E3DEVxg434D4D4DE4EEgxggxggwfgghfgUgVfFfVVfgfggxxggwxg wxxwgxxxh xxxgg xxxgwfxxxgxxxˆ ‰x xxˆxfgggfggxfggUVVFfVVfVgggxxgwgwwg ˆxgxg xxxxgxwgxxwxgwgxxgxxx ˆ ‰x""#"23"33U"""""""""""2343"33""3"#23333#3333#"23""#3"VD"2"#""3""#"#"23"E3""""""""""33D"#32#"#"3243333333#"#3""3#3D43#"""#""""""!"3U"""""#""U#""""3#"""3""3"#""#""#"#"f33""#""""""!""E#""""""""D4""""""#""#"2#"2##"2"#""3EV""""""!""""3D""!"!""""E"""""""""#"#""3""##"#""3"W4"""""##"3!"!"D#"""""""#"D3""""322#"#""3"#"#""""#"DV#""""""""!""3E""""""""""E"""""""#""#"#"""#"#"""2#V3"""""""""!!""E#""""""!"""D3"""""""""#"""#""#"""#""EV!"#""!""""""V"!"""""!"""D"""""""#"#""""#"""2"3"U4""""""!""!"E3""!#""""""3#""!""""#"""#""""""#""""DV""2"""!"!""f!"""""""!##"""""""""2#"2#"2#"2#""""2#"V#"""""""""""""U3""!"""""!#3#!"2""""#2#"""#"2#"""""##4E!""""###"##""#VD#"#3333#3#33E433#"#"""#""#"2"#"####U#""""2#"##3#!#EU3#233#3#33#DE43#""2""##"#""#"####EE#33"#EUg4DEEEUVUVUUEDDVVVVfFVfVUVVUUVD4VE4DEEUVUUVUU4DVVVVfFVgfVUVfUE""E"""""""""V"3#333V"#"""3#2#D3"""""""E3#2333V3"#"2#23"U"""""""""U4#3334V"#"##3443E3""""""""E43#334V3""##33#"V#"""""""#U33433#V"#"""#3##U4"""""""#"E43343#V"#"""#"DDE4D34UD44DDDVUDE43D4EDVEUUVUVfEUD4D43ED4D4DDVUEDD444DEUUEUUVUE"#"""#E"3333#E3#"#""#"##"##33#"#""""#"E3"333#D4#"#""#"#"#"#"4""""""#"E333343E3"#""##"#""#"34#"#""""#D#3333353#""#"##"#""#"E"""#"""#"E3"#3#3U#"#"#"##""##3E#3##"""##D3##3#3D##"""#"#""##3E3#EDVED35DD4DEUEEDUUfEEUEDEwEVUEUEED3U#44DD4DEUEEDEUgEUEEDEwUVEUEU"3D3"""#"#"3#""3"DV""#2#3E2##2##2#34"""#"#"3"#"2#3g"#"3"#V"3"#3""#34""""""#2#2#23DV"#"#"3V""3"#3"#4D""""""#"2#2#33g""#"#2V"2#2#"#344""#3"#33#3#33EV"##3#4U#3#334"335""####33#3#33Df#"#3#3V3#333#UEUUEVEDDEDEUUVUVfUUVVUVVUUfUUVfVUVEUUEDEDDEUVUUUVfUVVUVVUUVVUVf"""D""""4"""""#""#"#""U""""""3#"""3#"""""#"2#"""#U""""""D"""""3"""""""#""""#E"""""""3#""""""#"""""#""#""""E"""""""D""""""3#"""""#""#""##U""#"""34"""""3#"""""#"""#""#E"""EUg4DEEDUVUUEUE4DVVVVfUVgVVgffVffVfD4EEDUUVUEUED4VVfVVVVgfVUVfUE""U"""""""""V"3#333W"""#"3"3#U""""""""E3#3333f3"#""3"3V"""""""""U4#3343V#"#"#3343V""""""""E43#333V3"###333#V#""""""#"#E33343#f3""#3443g"""""""#"#D433#43V"#"#"#"DDD443DED4D4DDVDEED444DEUUEUUVVfUED4D43UD44DDDVUEDD44D4EUEUEUVUE""""#"U#2333#E3#"#"#"##"#"#33#"#"""""#E3"333#D4"#""#"#"#"#"#33""""#"E"3D333E3#""#"#"#""#"34#"#""""#D33343343#"#""#"##""#"D#"#""#"#U#"##33E#"#""#"##""##3E3##"""##E3"#3#3E#"#""##"#"#"#3E3#EDVED34DD4DEUEDEDVfEEEDEEwUUEUEEEUE334D4D4DEUEDDEUgDEEDEDxEUEUEE"343""#"#"#2#"#23DV"#"3"3V"#2##3#D3"2"#"#"3"#2"33g"#"#2#V"3"#2#"#34"""""#"2#2#32DV"#"#"3U"3"3"#3E4"""""#"""3"3"33g""#"#"V2#"3#"#3D4"#"3##33#3#3DDV"#33#DF3#33333EE"#"##2#33#3#34Df##3#34V#3#33#UEUEEeEDDEDEUUEUUVUUVVUUVUUVUUVfVfUEEVDEDDDEEVUEUVUUVUVUVUUVUUVV"""4"""""3#""""#"#""#"#U""""""3""""""#3""""#""3"""#E"""""!""4""""""3"""""#""""""#E"""""32""""""#""""""#""""""E"""""""D#"""""3#"""""#"""#"#"E"""""34"""""3#"""""#""#""#"E#"EEfD4EDEUUUUEUD4DVVVVVVVgUVUVEfUUEf4DDEDEUUUUEDD4VfVVVVUhfUVVfUU#"U""""""""V#2#333V#""#2#2#33"""""""""E3#2333V3#""#2#3U"""""""""U33#343V"#"##3444D""""""""E43#334V3"###333#V#""""""#"#"#U4334#3V"#"#"3D4DE#""""""""#"#E43343#V"##""#3DDD4343V43D4DDVEDD4444DEUUEUUVUEEDD4D34ED34D4DUUDDD344DEUUEEUVUE""""#"V"3333#E3#"#"#"##"#"#33#"#"""""#E33"33344#"#"#"#"#"##"D"""""#"E234333D##""#"#"##""#34##""""#"E33333443#""#"#"##""##D""#""###U#"#3#4U##"#"####""#34E33#"""#"E3##3#3E##"#"##"##""#3E3#EDVE34DD4D4UEDDEDUgDEEDDEwEUEUEEDV444D4D4D4EUDEDEUgEEDEDEgUUEUEE"#D3""""#"#2#"#"3DV"#"3"3V"#2##3"U"""#"""#"3#2#"33g"#"#2#V"3"#3""343"""""#"2#2#23DV"#""#3U#"3"#2#V""""#"""#2#2333g""#"#"V2"3"#"#3E4"#"3#3#33#33DEU##3334V#333443g#3"##3"3333#334Dg##3#34V3#334#EUEEUVDDD4DEUUEUUUUVUVUEVUUVUUVVUVUEEUEDD5DDEVUUUUVUUVUEUUUVUUUV"""3"""""3#""""#""3""#"E""""""3"""""3#"""""#""#""#"E"""!""D""""""3"""""""#"""""E""""""3#"""""#""""#""""""""E""""#"""E#"""""3#""""#"#"#2#3#E"#"#""#""43"""""#3""""#"#"#"#3#E"#"#EUg4DDEDEUEEDUD4DVfVVVVVgVVUVffVVVD5DDEDEUEEEDED4VVfVVVVwWUVfVVU3"E"""""""""U#2#333g"#"""#2#3#""""""""""E3#2343V3"#""3"#"V"""""""""U43#333W""##"#3433""""""""ED#3#34V3"#"#333#V3""#""""#"#"3E433$33V"###"344ED#"#""""#"#"3E43343#f##"#"#3D4D3443U43D4DDVEDD434D4DUEUDVVUEDDE4434UD34D3EUUD4D444DDEUEEUVUD"""#"U#2#333E3#"#"#"##"#"#33##2#"""#D3#33334D"#""#"#"##"#"D"#""""#"E243333E#"#"#"#"##"#"34##""""#"E333433E3#""#"#"##""#"E""#"#2##E#"3#43E#3#"3###"##33E433#""###E3"##34E3##"#"####"#3#U3#EDVD443D44DEUDDEDUgDEEDDEgUEUEEDEDV3434D44DDEDDEDEgEDEEDDgUUEEDE"343"""#"#"3"#2#2DV"#"#"3V"#2##2#3U""""#""#2#"3"33f#"#"3"V"#2#3"#"43"""2#""2#2#23DV"#"#"3U#"3"#3#3U"""""#"""3"3233g"#"#"#e#2#2#"#3E4#"3#33333334DEV"3333EV33334434U##2#3#33333#4DDg"#3334V333343EEETEVDD4D4DUUEUEUUUVUVDUEUfEEUUVUDEEUED4D4DEUVDUUEUVUUEUUEVUEUV"""C""""3#"""#""3"#""#E"""#"""3#"!""3#""""#""#"#""#U""""""4""""""3"""""#""""""#D"""""!"3#"""""#"""""#"""""#"E"""""""D#""3""43"""""#""""#"#D""""""43""#""33#""""#""#""#"E3"4D#4D343EDDEU4DD3E#3D434DDEDV4DD"D""""43334#"335""""4333E"##33#D343E33344DDD43#D343E333444D4""#4#334"#"#"#4#"#"43334"#"#"#4"4D33344CDE43U4D43D#33443DU43U4D4"4""#2#33D##D#3#34""#2#33E"#D#3#43D333D4D4DD4EC4D44333D4DD4D4ED4"3"""#"""""#4"""#"""#"""""#3"4D343433EDDEUDDDED#43433DEDEV4DD#D""""4333E"#344"""""4333E"##33#D334D433444DD43#D343E333444D4""#4#334"#"#"#43"""43334"#"#"#4"4D333443DE4CED44D3#33443DU43U4D4"4"#"3#3D4#3D#3#D3"#"3#33E"#E2#343D333D44DD4DE4D43D333D44DD4DE3D""#"""3""#""4""""#""3"""#"4"4D#34343DEDEU4DD4D#34343DDEDV4DD#D""""43344"#343"""""4334D#"33#3D334E333444DD43#D334D43#4D4D4""#4"344"#"#"#43"#33334#"#"#"4#4D333443DE34U4D4D3#33434DU43U4D4"4"#2#33D4#3D#33E""#"3#33E#3D#3#43D333D44D4D4E3D43D33#D44D4D4D4D""3"""#"""#"#4""""#"""#"""#""4""4D#34333EDEDV4DDE3#33433DEDEV4DD#D"""""4333E"#343"""""4334D#"33#34334E333444DD3#34334E33#344D4""#43334#"##"#D##""43334#"##"#434D#33434DE34U4D34D#33343DU43ED43"4"3"333D43#E33334"3#3333E#3E"3343D#33D34D4D4D4433433#D34D4D4D44"3"""#"""#""4"""#"""3"""#""4"4"3#D4D34#3#D4D3"4343#3433343#344333D3D34#33D3D3#3"33343#3"333434"3#D4D4D"#34D43"4343#34#3343#344333D3D34#33D343#3#33343#3"333434"3#D4D34#3#D4D3#3343#34#3343#343333D3443333D343#3"33343#3"333434"3#D4D43##34D43#3343#3433343#343333D3D44233D3D3#3"3334#33"3334##33433343334333433343334#3343334333433343334333433433343#334333433343334#334333433333 \ No newline at end of file diff --git a/glide2x/sst1/glide/tests/argb8332.3df b/glide2x/sst1/glide/tests/argb8332.3df deleted file mode 100644 index 7db16f7..0000000 Binary files a/glide2x/sst1/glide/tests/argb8332.3df and /dev/null differ diff --git a/glide2x/sst1/glide/tests/argb8888.3df b/glide2x/sst1/glide/tests/argb8888.3df deleted file mode 100644 index a6a47df..0000000 Binary files a/glide2x/sst1/glide/tests/argb8888.3df and /dev/null differ diff --git a/glide2x/sst1/glide/tests/ayiq.3df b/glide2x/sst1/glide/tests/ayiq.3df deleted file mode 100644 index a6aac0d..0000000 Binary files a/glide2x/sst1/glide/tests/ayiq.3df and /dev/null differ diff --git a/glide2x/sst1/glide/tests/cmp.bat b/glide2x/sst1/glide/tests/cmp.bat deleted file mode 100644 index 7b481d9..0000000 --- a/glide2x/sst1/glide/tests/cmp.bat +++ /dev/null @@ -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 diff --git a/glide2x/sst1/glide/tests/decal1.3df b/glide2x/sst1/glide/tests/decal1.3df deleted file mode 100644 index f999d3f..0000000 Binary files a/glide2x/sst1/glide/tests/decal1.3df and /dev/null differ diff --git a/glide2x/sst1/glide/tests/display.c b/glide2x/sst1/glide/tests/display.c deleted file mode 100644 index 89a08e3..0000000 --- a/glide2x/sst1/glide/tests/display.c +++ /dev/null @@ -1,446 +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 -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#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 -r -s srcimage -t testimage"; - -static const char *renderBufferString[] = { - "GR_BUFFER_FRONTBUFFER", - "GR_BUFFER_BACKBUFFER " -}; - -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 " -}; - - -void 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; - FxU32 bpp; - - GrLfbSrcFmt_t sourceFormat; - - static FxU32 imageWidth; - static FxU32 imageHeight; - - static void imageConvert( void *dst, - void *src, - GrLfbSrcFmt_t format, - FxU32 *bpp ); - - 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() ); - return; - } - 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"); - return; - } - 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"); - return; - } - 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 ) ) - return; - - 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); - return; -} - - -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; -} - - - diff --git a/glide2x/sst1/glide/tests/h3dtst01.c b/glide2x/sst1/glide/tests/h3dtst01.c deleted file mode 100644 index 50b2435..0000000 --- a/glide2x/sst1/glide/tests/h3dtst01.c +++ /dev/null @@ -1,201 +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 -#endif - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include - -#include -#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); -} - -void main( int argc, char **argv) { - int keepworking = 1; - GrScreenResolution_t resolution; - int frames = -1; - 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(); - return; -} - diff --git a/glide2x/sst1/glide/tests/h3dtst02.c b/glide2x/sst1/glide/tests/h3dtst02.c deleted file mode 100644 index 6bc84e7..0000000 --- a/glide2x/sst1/glide/tests/h3dtst02.c +++ /dev/null @@ -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 -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#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 -r "; - -static int rRandom(int s, int e); -static unsigned int iRandom (unsigned int maxr); - -typedef enum { NORMAL, ANTIALIASED } Mode; - -void 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() ); - return; - } - 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(); - return; -} - -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); -} - - - - diff --git a/glide2x/sst1/glide/tests/lava.3df b/glide2x/sst1/glide/tests/lava.3df deleted file mode 100644 index f6aef2e..0000000 Binary files a/glide2x/sst1/glide/tests/lava.3df and /dev/null differ diff --git a/glide2x/sst1/glide/tests/light.3df b/glide2x/sst1/glide/tests/light.3df deleted file mode 100644 index aef8c8b..0000000 --- a/glide2x/sst1/glide/tests/light.3df +++ /dev/null @@ -1,5 +0,0 @@ -3df v1.1 -rgb565 -lod range: 1 64 -aspect ratio: 1 1 -9çAèB(B(JIJiJiJiJiZËZËRªRŠJIB(B9çBBB9Ç9Ç1¦1¦9ÇB9ç9Ç9çJIRŠRªZËZËZËRªJIBB(B9Ç1¦9Ç9ç9ç9Ç9ç9Ç9çBJIJiRŠRªZËRªRªZËc [ ZËRªJiJiAèB(B(JIJIJiJiRjJiRªRŠRªRªRŠRŠRŠJiJiJIB(J)9ç9Ç9ÇBB(BB(JiZëk-kmkmc,ZëZËRŠJiJIB9Ç1Æ9§9Ç9Ç9Ç:Aè9çB(JIJiJiRjRŠRŠRŠRŠRŠRŠRŠRŠJiJiBB(B(B(B(B(JIJIJIJiJiRjJiRŠJiRŠRŠJIBBBB9ç9çAèB(JIJiZËc,kms®s®kMc c ZËRŠJIB9Ç1¦1¦1†1†1¦9§1¦AèBBBBB(B(J)B(B(BB(JIB(J)JIBB9çB9Ç9Ç9çBB(B(J)BBJIJIJIB(Aè1Æ9§9ç1¦9Ç9Ç9çJIJiZËc kMkm{Ï{ïsŽkmkMc,ZËJiB9Ç1¦1f)…1f)E)e)e1†9Ç1¦1†1¦Aè9çAè9Ç1¦1†9Ç9çAè:B1¦9Ç9Ç9Ç1¦1†1¦1¦9çBB9Ç1¦AèB9ç9§)e)E)e1f)e)e1†9çJiZ«Zëc c,km{Ï{ïsŽsŽsŽkMZëRªB(9§)e1f!$!$!!$)%)E)E!$!)%1¦9ç9§1†!$)%)E1¦9Ç1¦1¦1†1†1†1†1†)e)E)E1†9Ç9Ç1†)…1†1†)e)E!$!$)%)E!$)E1†BRŠZËZëc c,sŽ„„s®sŽsŽkMZëRŠB(9§)e!$!$!!!!$!$!!!!)e1¦1†)E!!!$1†1†1†)e1†)E)E)E)E)E!$!)E)e1f)e1f)E!D!$!!$)%)E)E!$)e1†B(RŠZëk-kmkm„œÓ”’{ïsŽs®s®c,RŠJI9Ç)e!!!$!!$)%!$!!!!)E)e)E!!!!$1f)e1f)e!$!$!!$!!ã!!!!$)%!$!$!!ã!!$)E)e)E)E1†BRªc,sns®{ÏŒq¥4¥4Œq{ï„0„0s®ZëJI9ç)e!$!!!!!$)%!!!!!!$!ã ä!)E)e)E)e)E!ã!!ã äãã äã äã äãã äãã!!$)E)E!$1†JIZëkmsŽkm{Ï”’¥¥4”’„0ŒQ”’ŒQs®ZËB)e!$ äã ä!!$! ä äã äã äãã ä!$)%)E)E!$ã äãã äãã äãã äãã äãã äãã!!!!1¦Jic kmsŽsŽ{­u­U”ÒŒ1„0Œq”²ŒqkmJI1†!ãã äã!ã äãã äãã äãã äã!!$!$!ã äãã äãã äãã äãã äãã äãã äãã!9§ZËkmsŽs®„”²µ–ƾ­uŒq„„0œÓœÓ{ÏJi1f!ãã äã äãã äãã äãã äãã äã!!!ã äãã äãã äãã äãã äãã äãã äãã!9Çc,ƒð{Ï„0¥µÖÆ8ÎYÎy½×œÓ„0„0”²”’sŽJI1†!ãã äã äã äãã äãã äãã äãã!ã äã äãã äãã äãã äãã äãã äãã äãã!$J)sŽ„0ŒQ¥½÷Æ8Æ8ÎyÎYÆ8µv”²ŒQŒqŒQs®Ji1†)Eã äã!!ã äãã äãã äãã äã äã äãã äãã äãã äãã äãã äãã äãã äãã)EJIc s®ŒQ­uÆÆ8½÷½÷Æ8ÎyÎYµ–”²Œq”’{ïRª9§)Eã ä!!$!ãã äãã äãã äãã äã!ã äã äãã äãã äãã äãã äãã äãã äãã)%9ÇJic „0­uÆÆµ¶­u½×ÎYÎyÆ”²œ³„0ZË9Ç!$!!!!$!ãã äã äãã äãã äãã äããã äãã äãã äãã äãã äãã äãã äãã!9ÇJIc „¥4½÷ƾ½·µÖÆÎY¾­U¥4­UŒ‘c 9Ç)E!ã ä!!ã äã!!!ã äãã äãã äããã äãã äãã äãã äãã äãã äãã äãã!9çZË{ÏŒq­U¾ÎYÎyÖšÆXƽ÷½×µ¶½×µÖœÓc,B)eã äãã äã äãã äã!$!ã äãã äãã äã äãã äãã äãã äãã äãã äãã äãã!BkM”’¥T½÷Æ8ÎYÖšÖÚÖºÆ8µ¶µ¶½×½÷½×œósŽJI1†ãã äãã äãã äãã!!ã äãã äãã äã äãã äãã äãã äãã äãã äãã äãã)%BkM”’µ–ÆÆXÎYΙֺֺÆ8µ¶µ–µ–µ¶­UŒ‘s®RŠ1†ãã äãã äã äãã ä!! äãã äã äã äãã äãã äãã äãã äãã äãã äãã!$9ÇZëŒ1¥T½÷ÆÎYΙֺÎy½÷½×µ¶­uœó”²„0kmRŠ)e!!!!!!$!)%!$!$!$!$!$!$!!$!$!!$!$)%ã äãã äãã äãã äãã äãã äãã äãã!1¦RŠ„¥µ–µÖ½÷ÎYÎyÎY½÷½÷Æ­•”²ŒQ|s®bì9Ç)E)E)e1¦1†1†1†1¦1¦1†1¦9§1†)…1†1¦1†1†1†)e1f ä!!!!!)E!$!!!!$)%!$)E)E)e)%!!$)E1†1†1¦ZëŒQ­U­•­uµ¶Æ8֚ΙÎYÎYÆXµ¶œó”’”’”²„0ZëB9çB(J)BBBJiRŠRªZËZËRªJIB(BB(B9ç9ç9Ç!$)E)e)E1†9ÇB(B(Aè9Ç1¦J)B(JIJiRªRŠB9Ç9çJIRŠRªc s®œó½×µ¶¥4­uÎyÖºÞÛÖºÖšÆX½÷½×µ–µ–­u¥4„0c c kmkmZëZËZËc,s®ŒQ”’ŒQ„s®sŽkMc RªRªZ«ZË9çBB(JIRŠZëc,kMkMc c s®„s®kms®{Ï{ïs®s®{¯„ŒQ„0œÓµ–½÷µ¶­U½×ΙÞÛÞûÞÛÖºÆ8Æ8ÎYÎyÆ8µ¶¥ŒQ{ïŒqœó”’{ïsŽs®„0¥­uµ¶­Uœó”²œÓ”²Œq„0s®{Ï{ÏRŠZëc,kMs®{Ï{Ï{Ï„|ŒQœÓœÓŒQ{Ï„0œÓ¥4¥4œÓ”’œÓœó¥4µ¶Æ½÷µ¶½×Æ8ÖºÞÛÞÛÖÚÖºÎyÎyÖšÖºÎyµ¶”²Œq¥µ¶½×¥4”’ŒqŒq¥µ¶Æ½÷½×¥T¥¥4­u­u¥4”²ŒQŒQc,sŽ{ï„0ŒQŒqŒQ„0”’”Ò¥¥4¥4œóœÓœÓ¥4µ–µ–¥4”’”’¥µ¶ÆÆ8½÷½÷ÎYÖšÖÚÞÛÞÛÖÚÖºÞÛÖºÖºÖšÎy½÷­U­uÆ8ÎyÆ­u¥4­U¥4­u½÷½÷½÷½÷µ–¥4­U­•½×µ–¥T”²”’sŽ„„0ŒQ”²œÓœÓœó¥4­u­u­uµ–µ¶µ¶µ¶µ¶µ–­u¥”²œóµ–ÆÆ8½÷½×ÎYÖÚÞÛÞÛÞÛÖÚÞÛÞÛÞûÞÛÖºÎyÎyÖšÎYÎYΙ֚ÆX½×½÷ƽ÷½×ƽ÷ÆÆ8Æ8½÷µ¶µ¶µ¶µ–­•¥4œÓ{ï”r”’”’”²¥4­uµ¶½×µÖ½×½÷Æ8½÷½×½÷ƽ÷­Uœóœóµ–ÆXÎyÆ8½×½÷ÎyÞÛÞÛÞÛÞÛÖÚÞÛÞûÞÛÞÛΙÎYÖšÖÚÖºÖzΙֺÎyÎYÎyÖšÎyÎYÎYÆ8Æ8ÖºÖºÖzÆ8Ƶ¶µ–µ–­•­UŒQ”²œÓœÓœóµ–½÷Æ8Æ8ÆÎYÎyÎY½÷µ–½÷ÎYÎY½÷¥T­UÆΙ֚Æ8½÷Æ8ÎyÖºÞÛÞÛÖÚÞÛÞÛÞÛÞÛÖÚ֚Ιֺֺ֚Îyֺֺֺֺ֚֚֚ΙÎYÆÆ8ÖºÞÛÖºÎyÎyÆ8µ¶µ–µ–­•œóœó¥4­uµ¶ÆÎyÎyÎyÖšÖºÖºÖš½÷­uµ¶ÎYÖºÖšÆ8½÷ÎYÖšÖºÖšÖšÖºÖºÖšÞÛÞûÞÛÞûÞÛÞÛÖÚÞÛÖÚÞ»ÖÚÖºÎyÆ8ÎyÞÛֺֺ֚ΙÎyÎyÎyÎYÆ8ÖšÖÚÞÛÖºÖºÖš½÷µ–­•½×­U­Uµ–½÷Æ8֚֚Ιֺ֚֚ÞÛÖºÎYµ¶½×ÎyÞÛÖÚÖºÖºÖºÞÛÞÛÖÚÞÛÞûÞÛÖºÞÛÞûÞûÞûÞûÞÛÖºÞÛÞûÞÛÞÛÖÚÖºÎyÎyÞÛÞÛÖºÎYÆ8Æ8ÖšÖºÖºÎYÆXÖšÖºÞÛÞÛÖº¾µ–µ¶½÷¥4­u½×¾ÎY֚ΙÎyÎyÎYÖºÞÛÖÚÎy½×½×ÎyÖºÞÛÞÛÞÛÖÚÞÛÞÛÞÛÞûÞûÞÛÖºÞÛÞûÞûÞûÞÛÞÛÖÚÞ»ÞûÞûÞûÞÛÞÛÖšÎyÞÛÖÚÖºÎyÆ8Î9ΙÞÛÖºÎY½÷ÆÎyÖºÖºÖš½×­•½×Æœó­u½×µÖ½÷ÎYÎyÎY¾Æ8ÖšÖÚ޻Ι½÷½×Æ8ÎyÖšÖºÖºÖºÖºÖºÞ»ÞÛÞûÞÛÖÚÖºÞÛÞÛÞûÞÛÞûÞÛÖÚÞÛÞûÞûÞûÞÛÎyÎyֺֺ֚ΙÎyֺ֚֚ΙÎyƵ–µÖÎYÎyÎYµÖ­Uµ¶½÷œÓ­uµ¶µ¶­u½×ÆXÆ½×Æ8Îy֚ΙÎY½÷µ¶½×ÆÆ¾Æ8Æ8Æ8Æ8ÎyÖºÞÛÞûÞÛÖºÖºÞÛÞÛÞÛÞÛÖÚÞÛÖÚÞûÞûÞÛÖšÆÆ8ÎyÎYÆXÎyÖšÖºÖšÎYÎYÆXÆ­u­U½÷ÎyÎY½×¥T­U­u”’¥­U­U­Uµ¶½×½×Æ8Æ8Æ8Æ8Æ8½×µ–µ¶½×½×½÷Æ8½×µ¶½÷ÎYÖšÖÚÞÛÞÛÖºÖšÖºÖÚÞ»ÖÚÞÛÖÚÖºÞÛÞÛÖºÆX½×½÷Æ8½÷½÷Æ8ÎYÎYÆXÆ8½÷½÷½÷­Uœóµ–Æ8ÎY½÷­u¥”²„0”²œóœóœó¥­Uµ¶½÷ƽ÷½×¾ÆµÖµ¶½÷½×½×¾Æµ¶­U­•Æ8Özֺֺֺ֚Ιֺֺֺֺֺֺ֚֚֚ÆX½×µ–½÷¾µ¶­uµ–µ¶µ¶½÷½÷µ¶­u­u¥4”²œóµ¶ÆµÖ¥4œÓŒq{Ï„P”’œÓ¥4­uµ¶½÷µ¶µ–½×¾½÷½×µ¶½÷½×½÷½÷µ¶¥”²¥4ÆΙ֚ÎyÆXÎyÖºÞÛÖÚÖšÎyÖšÖºÖºÖºÎy½÷­U¥µ–½÷µ–œó”²¥¥4­uµ¶µ–¥4œó”²ŒQ”’¥¥T¥”²”²ŒqkMkm{ÏŒQœÓ¥¥4­u­U¥4µ¶½×µÖµ¶µ–µ–µ–µÖ­uœÓ„PŒQ¥4ÆΙ֚Æ8ÆΙÞÛÞûÞÛÖºÎyÎyÖºÞÛÖºÎyµ¶œÓŒqœó­u­U”²ŒQŒ‘Œq”’¥¥TœóŒQ{Ï{Ï„0”²ŒQs®{Ï„0„RªZËc kM„”’”²”’„„Œq¥¥œó¥œÓ”’”²œÓ”’|{ï„”²­uÆÆ8½×½÷ÖšÞÛÞûÞÛÖšÆ8ÆXÖzΙÎy½÷­u”’s®{ÏŒq”’„s®sŽc,c sŽ„0ŒQkmZëc sŽ{Ïc,RŠZËZëc BB(JIRŠc s®„s®c,c,s®„{ÏksŽkmkMc c c cL{¯s®sŽŒQ¥4­U­Uµ¶ÎyÞÛÞÛÖÚÎy½÷½÷½÷½÷µ–¥œÓ„c JiZëkMc RªJIB9Ç:RjRŠJIB(JIRŠRŠB9Ç9Ç9Ç9ç1†1¦9Ç9Ç9çJiZëZ«BBJIRŠRŠJIBB9çAè9ç9çJIRªRªJic „”’œÓ­uÆXÖºÞÛÖšÆXÆ8ƽ׭UœóŒq{ïkmB(1†9Ç9ç9ç1†)e)E)E)E)e)e)e)e9§1¦1†)e)E)e)e)e!$!$)E)E)E)E)e)e)%!$!$)E)e)%!$!$)E1†)e)E)E1†)e1†B(kmŒ1”²­uÆ8ÖšÖºÎyÎYÎyÎyÆ¥4”²„0{Ïc 9ç!$!!$)E!$!!!!!!!!$!$!$!!$!!$!$!ã äãã äãã äãã äãã äãã ä!!$!!!!)eJIkMŒQ”Òµ¶ÎYΙֺ֚֚֚Ι½÷µ–¥T”²„0kmB!$ã äãã äãã äãã äãã äãã äãã äã äãã äãã äãã äãã äãã äãã äãã ä)eRŠ{Ï”’œÓµ¶ÎyÖšÖºÖºÖºÖšÎy½÷½÷½×­U”²sŽB!$ã äãã äãã äãã äãã äãã äãã äã äãã äãã äãã äãã äãã äãã äãã ä)ERŠŒQœóœó­uÆ8ÖºÞ»ÖÚÖºÎyÆ8½÷ƽ÷µ–œós®B(!ã äãã äãã äãã äãã äãã äãã äã äãã äãã äãã äãã äãã äãã äãã ä)EJi„0œó¤ô¥TÆ8ÖšÞÛÖºÖšÆ8½÷½×µÖµ¶­U”²s®B(!$ã äãã äãã äãã äãã äãã äãã äã äãã äãã äãã äãã äãã äãã äãã ä)EJI{œó­uÆ8ÖšÖºÖšÎyÎyÆ8µ¶­u¥”²Œq{ÏRŠ)Eãã äãã äãã äãã äãã äãã äããã äãã äãã äãã äãã äãã äãã äãã ä)EJiƒðœÓœÓ¥4½×ÎY֚ΙÎyÖšÎyƵ–œÓ„0{Ïs®ZË)Eãã äãã äãã äãã äãã äãã äããã äãã äãã äãã äãã äãã äãã äãã ä)ERŠ{œÓœó­UÆÎYÎyÎYÆXÎyÎyÆ¥4{ïkMZëB!$ã äãã äãã äãã äãã äãã äãã äã äãã äãã äãã äãã äãã äãã äãã ä)ERª„0”²¥­•µ¶½÷ÎYÎY½÷µ¶½÷ÎYÆX½×Œ‘kmJi1†!$ äãã äãã äãã äãã äãã äãã äãã äãã äãã äãã äãã äãã äãã äãã ä)EZË„0œÓ­uÆÆ8ÎYΙ֚Æ­u­u½÷Æ8½÷¥4sŽJI1†!$ã äãã äãã äãã äãã äãã äãã äã äãã äãã äãã äãã äãã äãã äãã ä)ERª{­u½÷Æ8ÎYÖšÎy¾µ–µ–µ¶½×µ¶œÓkmJI1†)Eãã äãã äãã äãã äãã äãã äããã äãã äãã äãã äãã äãã äãã äãã ä)eJIc,{ïŒq¥4µ¶½÷½÷½×µ–­•µ–­Uœó”²{ïc B(1†!$ã äãã äãã äãã äãã äãã äã!ãã äãã äãã äãã äãã äãã äãã äãã ä!1ÆRjZës®”’¥¥”Ҝӥ¥T­U”²„0{ÏkMJ‰9Ç)E!ãã äãã äãã äãã äãã äãã!!$!$ äã äãã äãã äãã äãã äãã äãã äãã!1†JIc {ÏŒq”’ŒqŒ1Œqœóµ–­u”²„kbìJI1¦)E!ãã äãã äãã äãã äãã äã!!$)E!$!ã äãã äãã äãã äãã äãã äãã äãã!1†JIkM{ï”r”’”’Œ‘”’¥µ–­•”²„kmZËB(1¦)E!ãã äãã äãã äãã äãã ä!)E)E)E!$ã äãã äãã äãã äãã äãã äãã äãã ä!1†JIc sŽ{Ï„0”’œÓœóœÓœóœÓ„0{ÏsŽZëJI9ç1f!ãã äãã äãã äãã äãã ä!!$)E!$)% äã äãã äãã äãã äãã äã äãã äãã ä!)e9çJIRŠZëkM„œÓœóŒq„0„s®sŽkmRªJ)9ç)e äãã ä!$!ã äãã äã!ã!ã!!$)%)E!$ã!ã!ã äãã! äãã äã!!!ãã äã!ã ä!$1†9Ç9ÇBRªsŽ„0ŒQs®snkmc ZËRªJ)9ç1†!$ ä!!!$)e1f)E!$ äã!!!!!$!$!$)%)E)E)E!!!$!!!!$!$!!ãã äã!!!$!!ã!!!ã!$)E1†1¦9ÇJIZëkMc,RªZ«RªRŠB(B(B9Ç1†!$!$!!$)E1†1†1†)E!$)E!$)%)E)e)e)e1f)e)e1f)e!!!$!!$!!$!$)%!$!!!!!!$!$)E!$)%!$!!$!!!$1†1†9ÇBJiRŠJiJ)JIB(B(BB9ç9§)e)e)E)E!$)e1†1¦1†)e)e1†)e)e)E)e1†1†1†)e1†1†1†ã!!!!$!$!$)%!$)E!$)%!$!$)%!D)%!$)%!D)%!$!!!!$)E1f1¦AèBJIJIJIB(BB9ç9ç9Ç1†1†1†1†1†1†1†1¦9Ç1¦1¦1†1¦1¦1†1†1†1¦1†1†1†1†1†1† ä!!!!$!$!$!$!$)%!$!$!!$)%!$!$)%!$)%)E!$)%!$!!$)%)E)e1¦9çBJ)B(B(B9Ç9Ç1¦1†1†1†1†1¦1†1¦1¦1¦1¦1¦1†1¦1¦9§1¦1¦1¦9§1¦9§1¦1¦1¦1¦ãã äã!!!$!$!$!$)%ã äã!!!$!$)%!!!!! äã ä!!$1†1¦9Ç9Ç9Ç1¦1†)e)E)e)E)E)E)e1†)e1f)e1f)e1†1†1¦1¦1¦1†1¦9§1Æ9§9Ç9Ç9Ç9ÇBB(JiJiRŠRªRŠJIB(B(Aè1¦B9çJibìc ZËJIB(9Ç9Ç9Ç9çBJIRŠRªRªZËRªJiBB9çB(JIJIJIJiJI9ç9ç9ÇBRŠc sŽs®c,ZËB(9Ç1†1†1†9Ç9ç9çBAè9çBB(1¦1¦1†1f9Ç9Ç1¦9§)e)E)E)eJIZËc,s®{ÏsŽc,Ji1†!$!$!$)%!)E1¦)E!$1¦1†)E!$!$!)%)E)E!$!)E)E)eJIc,sŽ”²”’{Ïs®RŠ1¦!!!$!$!!$)Eã!$1f)eã äã äã äãã ä!!$)eZ«km{¯œóœóŒQŒqsŽ9Ç!ã! äã äã äã)%!$ã äãã äãã äãã ä)ekM{Ïœóƽ÷ŒQŒq„09ç!ã äã äãã äã äã äãã äãã äãã ä9Çs®œÓÆÆÆXµ–Œq„0B!$ ä!ã äãã äã äãã äãã äãã äãã ä)eZ«œÓ¾µ¶ÆÆ8¥”²Ji!$!!ã äã äã äããã äãã äãã äãã ä1†sŽ­UÆ8ÖšÎYµÖ½×­URÊ)%ãã äã ä!ã äããã äãã äãã äãã ä1†{ϵ¶ÎYÖšÎYµ¶­u”²c )Eã!!!!!!!!! äã!!!!!!!$!!$1fk­Uµ¶ÎyÎYÆ8¥4ŒQ{ÏB1¦9ç9ÇBB(B(9ç9ç9Ç1¦1†9ÇB(Z«RŠRªc c c ZËc,sŽœÓµÖ­uÖšÞÛÎyƽ÷­u{ï{ïs®k-|¤ô”²„0{ïkMkMc s®„„ŒQœÓœÓŒq¥4¥4”²¥4½÷½÷Æ8ÞÛÞÛֺ֚Ι­u­U¾¥œÓµ–½÷µ¶¥4µ–¥4Œq„ŒqœÓ¥4µ–µ¶½×½×½×¥4¥ÆÆÆ8ÞÛÞÛÖÚÞûÖºÎy֚ΙÖzÆ8Æ8Æ8Æ8Îyƽ׭•¥4”²¥µ–ÆXÎYΙÆ8µ¶Îy½÷½÷ÖšÎYÎyÞÛÞÛÞÛÖÚÖºÖºÖºÎyÖºÖºÖšÎyÆ8ÖºÖºÎyµ¶µ–­U½×ÎyÖšÎyÞÛΙ½×ÖšÖÚÞÛÖÚÞÛÞûÖºÞûÞûÞÛÞÛÞûÖÚÖzÖÚÖšÆ8ÖºÖzÆ8ÖºÖº½×½÷¥4µ¶½÷ÎY¾֚Ι½×Æ8ÎYÎyÎyÖºÞûÞ»ÖÚÞûÞÛÞÛÞûÖÚÎYΙÎy֚ΙÎy½×µÖÎyµ–µ–”’¥4¥µ¶Æ½÷Æ8µ¶½×½÷½÷µ–ÎyÞ»ÖºÖšÖºÖºÖºÖºÎYµÖ½÷½×¾ÆµÖ­u¥Æµ–”Òs®ŒQ¥­u­uµ–½÷µ¶µ¶½×œóœÓÎYÎyÎYÞÛÖºÎyÖºÖš­u¥µ–”’œÓ¥4¥4Œq„0œÓŒQŒQJiZË{ÏŒQsŽŒQŒQ„0{ï{Ïs®„­Uµ¶Æ8ÞÛÖºÆÆ8½×”²kM{ÏkmZËRªkmRªZëZëJIJi)e1†9§B(1¦9Ç9ç1†1¦1¦AèBc,”’½×ÖºÎyÎYµ–Œ‘sŽ1¦1†)e)E!$)%!D1f)E)E)Eã äãã äãã äã!ã)%c ”’ÆΙֺ֚½×¥T{ï1†ã äãã äãã äããã äãã äãã äãã ä!kmœó½×ÖºÖºÆ8½÷µ¶ŒQ1¦ãã äãã äãã äãã äãã äãã äãã ä!c,œÓµ¶ÖšÎ™ÎYµ¶”²{ïAèãã äãã äãã äãã äãã äãã äãã ä!kMœÓ­UÆ8ÎY¾ÎYœÓ[ 1†ãã äãã äãã äãã äãã äãã äãã ä!km¥Æ8ÎyÎY­u½÷­uZë)eã äãã äãã äããã äãã äãã äãã ä!Ji{¯¥4­u­U­uœÓ{ïJi!$ äãã äãã äã ä! äãã äãã äãã äã ä9çsŽ”’Œq”²µ–Œqc,9ç)%ãã äãã äã ä!$)Eã äãã äãã äãã ä!9ÇZËsŽ”’œÓŒq{Ïc,B!$ äã!ãã äã!!$)E!!!!!ã ä!!ã!ã)E9ÇB(sŽkmc RªJI1¦!$!)E1†!$!!$)E)E)E)e!!!$!$)%!$!!$)%!$!$!!$1f9çJIJIB(B9ç1†1f)e1†1¦1†1†)e1†1†1†1†ã!!!$!$!!!$!$!$)%!!!)E9ÇB9ç1¦1†)e1f1†1†1†1†1¦1¦9§1¦9Ç1¦BB(RjJiB(9ÇB(c c,Ji1¦9ÇBJIJIJI)e)E1†)e)E)eRª{Ï{ïZë)e!$!)e!$1†ã äãã ä!$kMœóœó„0)e äã äã!ã äãã ä)E{ïÅø¾”’1¦!ã äã äã äãã ä!$”’ÎyÆ¥TBã ä!ã!)E9§9ÇBBJIœÓÆÎy­u{ÏZËZËsŽZëRŠ{Ï”’¥¥4­U­U¾ÖºÞÛÖš½÷½÷µ¶Æµ¶¥¥4Æ8Öš¾ÎyÖšÖºÞÛÞÛÖÚÖšÖºÎyÎyÖº½·¥4µ¶Æ8ƾÆÖºÖºÞÛÖÚÎYÆ8ÎY½×½×­ukM”²”²¥œÓŒq½÷ÖšÎyÎY”’ŒQ{Ï{ï{¯kM!$)e)E)E)E1†{ÏÎYÎy­URª!$!!!$!ã äãã ä!„Æ8Îy­uZëã äãã äã äãã ä!„0ƾµ–B(ã äãã ä äãã äã äZëœó­U„1¦ã äã ä!$ã!ã ä ä9çsn{ïbì1†!!$!!$)E!!$!$!)%!$!$9ÇB9Ç)e1†1†1†1¦1¦9Ç9ç9§Zëc 1†1¦9Çãã!”’œó)Eã ä)%)e1¦µvµÖJiB9ǜ󵶽÷ÖšÖÚÎYÆ8½×”²µ–­UÎyÖš­Uœó”’!!$)%¥½÷9ç!!ã äã”’­U)eã ä!!!BRª)e)E)e)eRŠRª)EkMœó­U{ïc,”’œóZëãJ)Rª!$c kMRªbìc \ No newline at end of file diff --git a/glide2x/sst1/glide/tests/makefile b/glide2x/sst1/glide/tests/makefile deleted file mode 100644 index c2297a3..0000000 --- a/glide2x/sst1/glide/tests/makefile +++ /dev/null @@ -1,145 +0,0 @@ -# -# Copyright (c) 1995, 3Dfx Interactive, Inc. -# All Rights Reserved. -# -# This is UNPUBLISHED PROPRIETARY SOURCE CODE of 3Dfx Interactive, Inc.; -# the contents of this file may not be disclosed to third parties, copied or -# duplicated in any form, in whole or in part, without the prior written -# permission of 3Dfx Interactive, Inc. -# -# RESTRICTED RIGHTS LEGEND: -# 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. -# - - -LDIRT= *.exe *.map *.sys *.obj *.lib - -!ifdef FX_NO_GLIDE_SWDIAGS -!include $(BUILD_ROOT_SWLIBS)/include/nmake/3dfx.mak -!else -!if "$(FX_GLIDE_DSP_TARGET)"=="SIM" -LCDEFS = $(LCDEFS) -DGLIDE_SIMULATOR -LLDLIBS = $(LLDLIBS) $(BUILD_ROOT_SWLIBS)\lib\wing32.lib -!endif - -LCINCS = $(LCINCS) -I$(BUILD_ROOT_SST1)\include - -!if "$(FX_COMPILER)"=="WATCOM" -LIBOBJS = tlib.lib plib.lib -!else -LIBOBJS = tlib.obj plib.obj -!endif - -!if "$(FX_TARGET)"=="WIN32" -FX_TARGET_MINOR=WIN95 -!endif - -LLDLIBS = $(LLDLIBS) $(BUILD_ROOT_SST1)\lib\glide2x.lib $(LIBOBJS) - -PRIVATE_HEADERS = tlib.h tlib.c plib.h plib.c tldata.inc - -CFILES = display.c \ - test00.c \ - test01.c \ - test02.c \ - test03.c \ - test04.c \ - test05.c \ - test06.c \ - test07.c \ - test08.c \ - test09.c \ - test10.c \ - test11.c \ - test12.c \ - test13.c \ - test14.c \ - test15.c \ - test16.c \ - test17.c \ - test18.c \ - test19.c \ - test20.c \ - test21.c \ - test22.c \ - test23.c \ - test24.c \ - test25.c \ - test26.c \ - test27.c \ - test28.c \ - test29.c \ - qatest00.c \ - qatest01.c \ - h3dtst01.c \ - h3dtst02.c - -PROGRAMS = $(CFILES:.c=.exe) - -DATAFILES = alpha.3df decal1.3df lava.3df light.3df matt1.3df miro.3df \ - argb1555.3df argb4444.3df argb8332.3df argb8888.3df \ - ayiq.3df yiq.3df p8.3df ap88.3df rgb332.3df rgb565.3df - -!include $(BUILD_ROOT_SWLIBS)/include/nmake/3dfx.mak - -$(PROGRAMS): $(LLDLIBS) - -!if "$(FX_COMPILER)"=="WATCOM" -!if "$(FX_TARGET)"=="DOS" -tlib.lib: tlib.obj - wlib -b -c -n -q -p=512 tlib tlib.obj -plib.lib: plib.obj - wlib -b -c -n -q -p=512 plib plib.obj -!else -tlib.lib: tlib.obj - wlib -b -c -n -q -p=512 tlib tlib.obj -plib.lib: plib.obj - wlib -b -c -n -q -p=512 plib plib.obj -!endif -!endif - -test00: test00.exe -test01: test01.exe -test02: test02.exe -test03: test03.exe -test04: test04.exe -test05: test05.exe -test06: test06.exe -test07: test07.exe -test08: test08.exe -test09: test09.exe -test10: test10.exe -test11: test11.exe -test12: test12.exe -test13: test13.exe -test14: test14.exe -test15: test15.exe -test16: test16.exe -test17: test17.exe -test18: test18.exe -test19: test19.exe -test20: test20.exe -test21: test21.exe -test22: test22.exe -test23: test23.exe -test24: test24.exe -test25: test25.exe -test26: test26.exe -test27: test27.exe -test28: test28.exe -test29: test29.exe -test30: test30.exe -test31: test31.exe -qatest00: qatest00.exe -qatest01: qatest01.exe -h3dtst01: h3dtst01.exe -h3dtst02: h3dtst02.exe - -foo: foo.exe -display:display.exe - -!endif diff --git a/glide2x/sst1/glide/tests/makefile.distrib b/glide2x/sst1/glide/tests/makefile.distrib deleted file mode 100644 index 2358223..0000000 --- a/glide2x/sst1/glide/tests/makefile.distrib +++ /dev/null @@ -1,15 +0,0 @@ - -CFLAGS = -I. -I/usr/include/glide - -SRCS = $(wildcard test*.c) -OBJS = $(SRCS:.c=.o) -EXECS = $(basename $(SRCS)) -LIB_OBJS = tlib.o - -all: $(EXECS) - -clean: - rm $(EXECS) *.o - -$(EXECS): $(OBJS) $(LIB_OBJS) - $(CC) -o $@ $@.o $(LIB_OBJS) -lglide -lm diff --git a/glide2x/sst1/glide/tests/makefile.linux b/glide2x/sst1/glide/tests/makefile.linux deleted file mode 100644 index 7ae7cfe..0000000 --- a/glide2x/sst1/glide/tests/makefile.linux +++ /dev/null @@ -1,76 +0,0 @@ -# -# Copyright (c) 1995, 3Dfx Interactive, Inc. -# All Rights Reserved. -# -# This is UNPUBLISHED PROPRIETARY SOURCE CODE of 3Dfx Interactive, Inc.; -# the contents of this file may not be disclosed to third parties, copied or -# duplicated in any form, in whole or in part, without the prior written -# permission of 3Dfx Interactive, Inc. -# -# RESTRICTED RIGHTS LEGEND: -# 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. -# - - -LDIRT= $(PROGRAMS) - -GLIDE_ROOT = $(BUILD_ROOT)/$(FX_GLIDE_HW) - -LIBOBJS = tlib.o plib.o - -GLIDELIB = -L$(GLIDE_ROOT)/lib -lglide - -LLDLIBS = $(LIBOBJS) $(GLIDELIB) - -PRIVATE_HEADERS = tlib.h tlib.c plib.h plib.c tldata.inc - -CFILES = display.c \ - test00.c \ - test01.c \ - test02.c \ - test03.c \ - test04.c \ - test05.c \ - test06.c \ - test07.c \ - test08.c \ - test09.c \ - test10.c \ - test11.c \ - test12.c \ - test13.c \ - test14.c \ - test15.c \ - test16.c \ - test17.c \ - test18.c \ - test19.c \ - test20.c \ - test21.c \ - test22.c \ - test23.c \ - test24.c \ - test25.c \ - test26.c \ - test27.c \ - test28.c \ - test29.c \ - qatest00.c \ - qatest01.c \ - h3dtst01.c \ - h3dtst02.c - -PROGRAMS = $(CFILES:.c=) - -DATAFILES = alpha.3df decal1.3df lava.3df light.3df matt1.3df miro.3df \ - argb1555.3df argb4444.3df argb8332.3df argb8888.3df \ - ayiq.3df yiq.3df p8.3df ap88.3df rgb332.3df rgb565.3df - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak - - -$(PROGRAMS): $(LIBOBJS) diff --git a/glide2x/sst1/glide/tests/makefile.unix b/glide2x/sst1/glide/tests/makefile.unix deleted file mode 100644 index df8d684..0000000 --- a/glide2x/sst1/glide/tests/makefile.unix +++ /dev/null @@ -1,71 +0,0 @@ -# -# Copyright (c) 1995, 3Dfx Interactive, Inc. -# All Rights Reserved. -# -# This is UNPUBLISHED PROPRIETARY SOURCE CODE of 3Dfx Interactive, Inc.; -# the contents of this file may not be disclosed to third parties, copied or -# duplicated in any form, in whole or in part, without the prior written -# permission of 3Dfx Interactive, Inc. -# -# RESTRICTED RIGHTS LEGEND: -# 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. -# - - -LDIRT= $(PROGRAMS) - -LIBOBJS = tlib.o plib.o - -LLDLIBS = $(LIBOBJS) -lglide2x - -PRIVATE_HEADERS = tlib.h tlib.c plib.h plib.c tldata.inc - -CFILES = display.c \ - test00.c \ - test01.c \ - test02.c \ - test03.c \ - test04.c \ - test05.c \ - test06.c \ - test07.c \ - test08.c \ - test09.c \ - test10.c \ - test11.c \ - test12.c \ - test13.c \ - test14.c \ - test15.c \ - test16.c \ - test17.c \ - test18.c \ - test19.c \ - test20.c \ - test21.c \ - test22.c \ - test23.c \ - test24.c \ - test25.c \ - test26.c \ - test27.c \ - test28.c \ - test29.c \ - qatest00.c \ - qatest01.c \ - h3dtst01.c \ - h3dtst02.c - -PROGRAMS = $(CFILES:.c=) - -DATAFILES = alpha.3df decal1.3df lava.3df light.3df matt1.3df miro.3df \ - argb1555.3df argb4444.3df argb8332.3df argb8888.3df \ - ayiq.3df yiq.3df p8.3df ap88.3df rgb332.3df rgb565.3df - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak - - diff --git a/glide2x/sst1/glide/tests/matt1.3df b/glide2x/sst1/glide/tests/matt1.3df deleted file mode 100644 index c02118d..0000000 Binary files a/glide2x/sst1/glide/tests/matt1.3df and /dev/null differ diff --git a/glide2x/sst1/glide/tests/miro.3df b/glide2x/sst1/glide/tests/miro.3df deleted file mode 100644 index 313b674..0000000 Binary files a/glide2x/sst1/glide/tests/miro.3df and /dev/null differ diff --git a/glide2x/sst1/glide/tests/p8.3df b/glide2x/sst1/glide/tests/p8.3df deleted file mode 100644 index 391f60b..0000000 Binary files a/glide2x/sst1/glide/tests/p8.3df and /dev/null differ diff --git a/glide2x/sst1/glide/tests/plib.c b/glide2x/sst1/glide/tests/plib.c deleted file mode 100644 index 481f15e..0000000 --- a/glide2x/sst1/glide/tests/plib.c +++ /dev/null @@ -1,1384 +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 -#include -#ifndef __linux__ -#include -#endif -#include -#include -#include -#include -#include - -#include -#include "tlib.h" -#include "plib.h" - -#define MAX_HANDLES 32 - -//the following may need to go onto the heap... currently need 10K, not bad -static tlTxMnTexture_t tlTxMnMngr[MAX_HANDLES]; -static hTexId_t hFstOpnTexId = H_FSTTEXID; //0 is the NULL handle -static GrChipID_t currTMU = GR_TMU0; -static FxBool bMultiRevOrder; -static FxBool bMultiOffsetFix; - - - -/*------------------------------------------------------------------- - Function: plTxMnLoadTxMngr - Date: 6/26/97 - Implementor(s): psw - Library: - Description: - Arguments: - Return: - -------------------------------------------------------------------*/ -hTexId_t -plTxMnLoadTxMngr( TlTexture* lpTexture ) -{ - /* assumptions */ - assert( lpTexture ); - - /* code */ - tlTxMnMngr[ hFstOpnTexId ].lpTlTextureInfo = lpTexture; - tlTxMnMngr[ hFstOpnTexId ].origLargeLod = lpTexture->info.largeLod; - tlTxMnMngr[ hFstOpnTexId ].origSmallLod = lpTexture->info.smallLod; - SET_DOWNLOADABLE( tlTxMnMngr[hFstOpnTexId], FXFALSE); - SET_MULTIBASE( tlTxMnMngr[hFstOpnTexId], FXFALSE); - SET_TRILINEAR( tlTxMnMngr[hFstOpnTexId], FXFALSE); - SET_BEENPOPD( tlTxMnMngr[hFstOpnTexId], FXFALSE); - SET_DIRTY( tlTxMnMngr[hFstOpnTexId], FXFALSE); - - return (hFstOpnTexId++); -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnSetDownload - Date: 6/26/97 - Implementor(s): psw - Library: - Description: - Arguments: - Return: - -------------------------------------------------------------------*/ -static void -prTxMnSetBeenPopd( hTexId_t deTexId, FxBool bBeenPopd ) -{ - SET_BEENPOPD( tlTxMnMngr[deTexId], bBeenPopd ); - SET_DIRTY( tlTxMnMngr[deTexId], FXTRUE ); /* just for messing with it */ -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnSetDownload - Date: 6/26/97 - Implementor(s): psw - Library: - Description: - Arguments: - Return: - -------------------------------------------------------------------*/ -void -plTxMnSetDownload( hTexId_t deTexId, FxBool bDownLoad ) -{ - /* assumptions */ - assert( deTexId < hFstOpnTexId ); - - /* code */ - SET_DOWNLOADABLE( tlTxMnMngr[deTexId], bDownLoad ); - SET_DIRTY( tlTxMnMngr[deTexId], FXTRUE ); /* just for messing with it */ -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnSetMultibase - Date: 6/26/97 - Implementor(s): psw - Library: - Description: - Arguments: - Return: - -------------------------------------------------------------------*/ -void -plTxMnSetMultibase( hTexId_t deTexId, FxBool bMultibase ) -{ - /* assumptions */ - assert( deTexId < hFstOpnTexId ); - - /* code */ - SET_MULTIBASE( tlTxMnMngr[deTexId], bMultibase ); - SET_DIRTY( tlTxMnMngr[deTexId], FXTRUE ); /* just for messing with it */ -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnGetMultibase - Date: 6/26/97 - Implementor(s): psw - Library: - Description: - Arguments: - Return: - -------------------------------------------------------------------*/ -FxBool -plTxMnGetMultibase( hTexId_t deTexId ) -{ - assert( deTexId < hFstOpnTexId ); - return (IS_MULTIBASE(tlTxMnMngr[deTexId]) ); -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnSetMultiRevOrder - Date: 7/6/97 - Implementor(s): psw - Library: - Description: - Sets the global bMultiRevOrder which is used by plTxMnDownloadAll - to determine the order of the multibase segments in tmu mem - Arguments: - FxBool bOrder - Return: - void - -------------------------------------------------------------------*/ -void -plTxMnSetMultiRevOrder( FxBool bOrder ) -{ - bMultiRevOrder = bOrder; -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnGetMultiRevOrder - Date: 7/6/97 - Implementor(s): psw - Library: - Description: - Returns the current status of the bMultiRevOrder static global - Arguments: - none - Return: - FxBool - -------------------------------------------------------------------*/ -FxBool -plTxMnGetMultiRevOrder( ) -{ - return ( bMultiRevOrder ); -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnSetMultiOffsetFix - Date: 7/16/97 - Implementor(s): psw - Library: - Description: - Sets the global bMultiOffsetFix which is used by plTxMnTextureSource - to determine to use the Multibase offset fix - Arguments: - FxBool bOrder - Return: - void - -------------------------------------------------------------------*/ -void -plTxMnSetMultiOffsetFix( FxBool bOffsetFix ) -{ - bMultiOffsetFix = bOffsetFix; -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnGetMultiOffsetFix - Date: 7/16/97 - Implementor(s): psw - Library: - Description: - Returns the current status of the bMultiOffsetFix static global - Arguments: - none - Return: - FxBool - -------------------------------------------------------------------*/ -FxBool -plTxMnGetMultiOffsetFix( ) -{ - return ( bMultiOffsetFix ); -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnSetTrilinear - Date: 6/26/97 - Implementor(s): psw - Library: - Description: - Arguments: - Return: - -------------------------------------------------------------------*/ -void -plTxMnSetTrilinear( hTexId_t deTexId, FxBool bTrilinear ) -{ - /* assumptions */ - assert( deTexId < hFstOpnTexId ); - - /* trilinear && <2-lods are mutex */ - if ( (tlTxMnMngr[ deTexId ].lpTlTextureInfo->info.smallLod - - tlTxMnMngr[ deTexId ].lpTlTextureInfo->info.largeLod) >= 1) - { - SET_TRILINEAR( tlTxMnMngr[deTexId], bTrilinear ); - SET_DIRTY( tlTxMnMngr[deTexId], FXTRUE ); /* just for messing with it */ - } -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnGetTrilinear - Date: 6/26/97 - Implementor(s): psw - Library: - Description: - Arguments: - Return: - -------------------------------------------------------------------*/ -FxBool -plTxMnGetTrilinear( hTexId_t deTexId ) -{ - assert( deTexId < hFstOpnTexId ); - return (IS_TRILINEAR(tlTxMnMngr[deTexId]) ); -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnReset - Date: 6/26/97 - Implementor(s): psw - Library: - Description: - Resets the respective texture back to its base state - Arguments: - hTexId_t deTexId - the id of the tlTxMnMngr texture to reset - Return: - void - -------------------------------------------------------------------*/ -void -plTxMnReset( hTexId_t deTexId ) -{ - /* initializations */ - tlTxMnTexture_t *lpThisTxMnTexture; - GrTexInfo *lpThisTexInfo; - - /* assumptions */ - assert( deTexId < hFstOpnTexId ); - - /* initializations */ - lpThisTxMnTexture = &tlTxMnMngr[deTexId]; - lpThisTexInfo = &lpThisTxMnTexture->lpTlTextureInfo->info; - - /* code */ - SET_MULTIBASE( tlTxMnMngr[deTexId], FXFALSE ); - SET_TRILINEAR( tlTxMnMngr[deTexId], FXFALSE ); - bMultiRevOrder = FXFALSE; - /* SET_DIRTY( tlTxMnMngr[deTexId], FXFALSE ); */ - - while ( lpThisTexInfo->largeLod > lpThisTxMnTexture->origLargeLod ) - prPushLod( lpThisTexInfo, topOfMipMap );/* reset d'm data ptrs */ - - while ( lpThisTexInfo->smallLod < lpThisTxMnTexture->origSmallLod ) - prPushLod (lpThisTexInfo, btmOfMipMap );/* reset d'm data ptrs */ -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnDownloadAll - Date: 6/27/97 - Implementor(s): psw - Library: - Description: - Downloads all the textures be held by tlTexManMngr[] - Will determine if the textures are to be downloaded - in (linear || multibase) && (BOTH || EVEN/ODD) mode based upon - their flags and do the right thang - Arguments: - None - Return: - void - -------------------------------------------------------------------*/ -void -plTxMnDownloadAll( ) -{ - /* definitions */ - hTexId_t hCurrTexId; - FxU32 currTexMemReq; - FxU32 currStartAdd; - tlTxMnTexture_t *lpThisTxMnTexture; - GrTexInfo *lpThisTexInfo; - TlTexture *lpThisTlTex; - - /* assumptions */ - assert(hFstOpnTexId != 0); - - /* initializations */ - currStartAdd = grTexMinAddress(currTMU); - - /* code */ - for ( hCurrTexId = H_FSTTEXID; hCurrTexId < hFstOpnTexId; ++hCurrTexId ) - { /* here we go */ - if (IS_DOWNLOADABLE(tlTxMnMngr[hCurrTexId])) - { /* download it */ - lpThisTxMnTexture = &tlTxMnMngr[hCurrTexId]; - lpThisTlTex = lpThisTxMnTexture->lpTlTextureInfo; - lpThisTexInfo = &lpThisTlTex->info; - if (!IS_MULTIBASE(*lpThisTxMnTexture)) - { /* not multibased */ - if (!IS_TRILINEAR(*lpThisTxMnTexture)) - { /* not trilinear mip'd */ - currTexMemReq = grTexTextureMemRequired(GR_MIPMAPLEVELMASK_BOTH, lpThisTexInfo); - assert( currStartAdd + currTexMemReq < grTexMaxAddress(currTMU) ); - grTexDownloadMipMap( currTMU, currStartAdd, - GR_MIPMAPLEVELMASK_BOTH, lpThisTexInfo ); - lpThisTxMnTexture->u0.bothAdd = currStartAdd; - currStartAdd += currTexMemReq; - } /* if !IS_TRILINEAR && !IS_MULTIBASE */ - else - { /* else it is being rendered as trilinear mip'd */ - /* first do the even segment */ - currTexMemReq = grTexTextureMemRequired(GR_MIPMAPLEVELMASK_EVEN, lpThisTexInfo); - assert( currStartAdd + currTexMemReq < grTexMaxAddress(currTMU) ); - grTexDownloadMipMap( currTMU, currStartAdd, - GR_MIPMAPLEVELMASK_EVEN, lpThisTexInfo ); - lpThisTxMnTexture->u0.evenAdd = currStartAdd; - currStartAdd += currTexMemReq; - /* next do the odd segment */ - currTexMemReq = grTexTextureMemRequired(GR_MIPMAPLEVELMASK_ODD, lpThisTexInfo); - assert( currStartAdd + currTexMemReq < grTexMaxAddress(currTMU) ); - grTexDownloadMipMap( currTMU, currStartAdd, - GR_MIPMAPLEVELMASK_ODD, lpThisTexInfo ); - lpThisTxMnTexture->u1.oddAdd = currStartAdd; - currStartAdd += currTexMemReq; - } /* else !IS_MULTIBASE && IS_TRILINEAR */ - } /* if !IS_MULTIBASE */ - else /* else it is multibased */ - { - /* stack frame definitions */ - FxU32 *lpxAdd; - GrTexBaseRange_t tTxBse; - - grTexMultibase(currTMU, FXTRUE); /* turn on multibase */ - if (!IS_TRILINEAR(*lpThisTxMnTexture)) - { /* non trilinear mip'd multibase texture - ** if bMultiRevOrder is True, get the addresses for the Multibase segs - ** in reverse order, 32_TO_1 to 256, else get them in 256 to 32_TO_1 */ - - for ( tTxBse = bMultiRevOrder ? GR_TEXBASE_32_TO_1 : GR_TEXBASE_256, - lpxAdd = bMultiRevOrder ? &lpThisTxMnTexture->u3.multiR3Add : - &lpThisTxMnTexture->u0.multiR0Add; - bMultiRevOrder ? lpxAdd >= &lpThisTxMnTexture->u0.multiR0Add : - lpxAdd <= &lpThisTxMnTexture->u3.multiR3Add; - (bMultiRevOrder ? --tTxBse : ++tTxBse), - (bMultiRevOrder ? --lpxAdd : ++lpxAdd) ) - { /* this loop just gets the texture addresses - the multibase - ** segments will be in reverse order, but in the same linear block */ - currTexMemReq = prTexMultiMemRequired( GR_MIPMAPLEVELMASK_BOTH, - tTxBse, lpThisTexInfo); - if (currTexMemReq != 0) /* if the LOD(s) !missing, ie. pop'd */ - { - assert( currStartAdd + currTexMemReq < grTexMaxAddress(currTMU) ); - *lpxAdd = currStartAdd; - currStartAdd += currTexMemReq; /* bump the current TMU address */ - } - } /* for */ - for ( tTxBse = GR_TEXBASE_256, lpxAdd = &lpThisTxMnTexture->u0.multiR0Add; - lpxAdd <= &lpThisTxMnTexture->u3.multiR3Add; - ++tTxBse, ++lpxAdd ) - { /* this loop actually does the downloading - in the proper order... - ** GR_TEXBASE_256 to GR_TEXBASE_32_TO_1 */ - - /* stack frame definitions */ - GrTexInfo tmpInfo; - GrTexInfo *lpTmpInfo = &tmpInfo; - - /* initializations */ - /* multibase requires that I munge the data for downloading */ - *lpTmpInfo = *lpThisTexInfo; - if ((lpThisTexInfo->largeLod <= (FxI32) tTxBse ) && - (lpThisTexInfo->smallLod >= (FxI32) tTxBse )) - { /* if the TexBase exists in the lod range */ - while ( lpTmpInfo->largeLod < (FxI32) tTxBse ) - prPopLod( lpTmpInfo, topOfMipMap ); /* munge the top */ - - if ( tTxBse != GR_TEXBASE_32_TO_1 ) - lpTmpInfo->smallLod = lpTmpInfo->largeLod; /* munge the btm */ - - grTexDownloadMipMap(currTMU, *lpxAdd, /* download mung'd data */ - GR_MIPMAPLEVELMASK_BOTH, lpTmpInfo ); - } /* if */ - } /* for */ - } /* if !IS_TRILINEAR && IS_MULTIBASE */ - else - { /* else it is a multibased trilinear mipmap, aka motherfucker - ** if bMultiRevOrder is True, get the addresses for the Multibase segs - ** in reverse order, 32_TO_1 to 256, else get them in 256 to 32_TO_1 */ - for (tTxBse = bMultiRevOrder ? GR_TEXBASE_32_TO_1+1 : GR_TEXBASE_256, - lpxAdd = bMultiRevOrder ? &lpThisTxMnTexture->u4.multiR3EvenAdd : - &lpThisTxMnTexture->u0.multiR0EvenAdd; - bMultiRevOrder ? lpxAdd >= &lpThisTxMnTexture->u0.multiR0EvenAdd : - lpxAdd <= &lpThisTxMnTexture->u4.multiR3EvenAdd; - (bMultiRevOrder ? --tTxBse : ++tTxBse), - (bMultiRevOrder ? --lpxAdd : ++lpxAdd) ) - { /* this loop just gets the texture addresses */ - if ( tTxBse % 2 ) /* is it odd? */ - currTexMemReq = prTexMultiMemRequired(GR_MIPMAPLEVELMASK_ODD, - tTxBse, lpThisTexInfo); /* 1,3 */ - else /* even */ - currTexMemReq = prTexMultiMemRequired(GR_MIPMAPLEVELMASK_EVEN, - (tTxBse>3?3:tTxBse), - lpThisTexInfo);/* 0,2,3 */ - /* prTexMulti.. only knows about 0-3 */ - if (currTexMemReq != 0) /* if the LOD(s) !missing, ie. pop'd */ - { - assert( currStartAdd + currTexMemReq < grTexMaxAddress(currTMU) ); - *lpxAdd = currStartAdd; - currStartAdd += currTexMemReq;/* bump the current TMU address */ - } - } /* for */ - for (tTxBse = GR_TEXBASE_256, - lpxAdd = &lpThisTxMnTexture->u0.multiR0EvenAdd; - lpxAdd <= &lpThisTxMnTexture->u4.multiR3EvenAdd; - ++tTxBse, ++lpxAdd ) /* tTxBse will actually overrun... - ** overrun = GR_TEXBASE_32_TO_1 + 1 - ** (tTxBse>3?3:tTxBse) will fix this - ** required for 32to1_ODD and 32to1_EVEN */ - /* actually (tTxBse>GR_TEXBASE_32_TO_1:GR_TEXBASE_32_TO_1?tTxBse) */ - { /* this loop actually does the downloading - in the proper order... - ** GR_TEXBASE_256 to GR_TEXBASE_32_TO_1 */ - - /* stack frame definitions */ - GrTexInfo tmpInfo; - GrTexInfo *lpTmpInfo = &tmpInfo; - - /* initializations */ - /* multibase requires that I munge the data, hence the data copies */ - *lpTmpInfo = *lpThisTexInfo; - - if ((lpThisTexInfo->largeLod <= (FxI32) (tTxBse>3?3:tTxBse)) && - (lpThisTexInfo->smallLod >= (FxI32) (tTxBse>3?3:tTxBse))) - { /* if an lod actually exits in the range */ - while ( lpTmpInfo->largeLod < (FxI32)(tTxBse>3?3:tTxBse) ) - prPopLod( lpTmpInfo, topOfMipMap ); /* munge the top */ - - if ( (tTxBse>3?3:tTxBse) != GR_TEXBASE_32_TO_1 ) - lpTmpInfo->smallLod = lpTmpInfo->largeLod; /* munge the btm */ - - if ( tTxBse % 2 ) /* is it odd? */ - grTexDownloadMipMap(currTMU, *lpxAdd, /* download mung'd odd data */ - GR_MIPMAPLEVELMASK_ODD, lpTmpInfo ); - else - grTexDownloadMipMap(currTMU, *lpxAdd, /* download mung'd even data */ - GR_MIPMAPLEVELMASK_EVEN, lpTmpInfo ); - } /* if */ - } /* for */ - } /* else IS_TRILINEAR && IS_MULTIBASE */ - grTexMultibase(currTMU, FXFALSE); /* turn off multibase */ - } /* else IS_MULTIBASE */ - if ( lpThisTlTex->tableType != NO_TABLE ) - grTexDownloadTable(currTMU, lpThisTlTex->tableType, - &lpThisTlTex->tableData ); - } /* if IS_DOWNLOADABLE */ - } /* for ( i = 0; i < fstOpnTexId; ++i ) */ -} /* plTxMnDownloadAll */ -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnTexSource - Date: 6/28/97 - Implementor(s): psw - Library: - Description: - Renders the texture associated with hTexId. Will setup the rendering - modes based upon the tlTxMnMngr[deTexId].flags fields, i.e., - (linear || multibase) && (BOTH || EVEN/ODD) modes. Also uses - the addresses saved by previous call to tlTxMnDownloadAll - Arguments: - hTexId_t deTexId - handle to the texture - FxU32 deMipMask - mipmap mask - Return: - void - -------------------------------------------------------------------*/ -void -plTxMnTexSource( hTexId_t deTexId, FxU32 deMipMask ) -{ - /* definitions */ - tlTxMnTexture_t *lpThisTxMnTexture; - GrTexInfo thisTexInfo, - *lpThisTexInfo; - TlTexture *lpThisTlTex; - FxU32 *lpxAdd, - xAdd; - GrTexBaseRange_t tTexBase; - - /* assumptions */ - assert( deTexId < hFstOpnTexId ); - assert((deMipMask >= GR_TEXBASE_256) && - (deMipMask <= GR_TEXBASE_32_TO_1)); - - /* initializations */ - lpThisTxMnTexture = &tlTxMnMngr[deTexId]; - lpThisTlTex = lpThisTxMnTexture->lpTlTextureInfo; - lpThisTexInfo = &thisTexInfo; - *lpThisTexInfo = lpThisTxMnTexture->lpTlTextureInfo->info; - -/* - if ((lpThisTlTex->tableType == GR_NCCTABLE_NCC0) || - (lpThisTlTex->tableType == GR_NCCTABLE_NCC1)) - grTexNCCTable( currTMU, lpThisTlTex->tableType ); -*/ - if (!IS_MULTIBASE(*lpThisTxMnTexture)) - { /* not multibased */ - if (!IS_TRILINEAR(*lpThisTxMnTexture)) - grTexSource( currTMU, lpThisTxMnTexture->u0.bothAdd, deMipMask, lpThisTexInfo ); - else /* IS_TRILINEAR */ - if ( deMipMask == GR_MIPMAPLEVELMASK_EVEN ) /* first do the even segment */ - grTexSource( currTMU, lpThisTxMnTexture->u0.evenAdd, deMipMask, lpThisTexInfo ); - else /* next do the odd segment */ - grTexSource( currTMU, lpThisTxMnTexture->u1.oddAdd, deMipMask, lpThisTexInfo ); - }/* if !IS_MULTIBASE */ - else - { /* else it is multibased */ - grTexMultibase(currTMU, FXTRUE); /* turn on multibase */ - if (!IS_TRILINEAR(*lpThisTxMnTexture)) - { /* really dependant on the unions being in the proper order */ - lpxAdd = &lpThisTxMnTexture->u0.multiR0Add; - for (tTexBase = GR_TEXBASE_256; tTexBase <= GR_TEXBASE_32_TO_1; - ++tTexBase, ++lpxAdd) - /* next i check that the current TexBase is in the lod range */ - if ((lpThisTexInfo->largeLod <= (FxI32) tTexBase) && - (lpThisTexInfo->smallLod >= (FxI32) tTexBase)) - { - xAdd = *lpxAdd; - if (bMultiOffsetFix) - xAdd -= prGetMultiMemBump(lpThisTexInfo, tTexBase, deMipMask); - grTexMultibaseAddress(currTMU, tTexBase, xAdd, deMipMask, - lpThisTexInfo ); - } - } /* if !IS_TRILINEAR */ - else - { /* else it is a multibased trilinear mipmap */ - if ( deMipMask == GR_MIPMAPLEVELMASK_EVEN ) /* do the even segments */ - { - lpxAdd = &lpThisTxMnTexture->u0.multiR0EvenAdd;/* set lpxAdd to 1st add */ - for (tTexBase = GR_TEXBASE_256; tTexBase <= GR_TEXBASE_32_TO_1; - tTexBase = ( tTexBase + 2 == GR_TEXBASE_32_TO_1 + 1 ) ? /* 32t1 is both even & odd */ - GR_TEXBASE_32_TO_1 : tTexBase + 2, lpxAdd += 2 ) /* even segs r at even indices */ - /* next i check that the current TexBase is in the lod range */ - if ((lpThisTexInfo->largeLod <= (FxI32) tTexBase) && - (lpThisTexInfo->smallLod >= (FxI32) tTexBase)) - { - xAdd = *lpxAdd; - if (bMultiOffsetFix) - xAdd -= prGetMultiMemBump(lpThisTexInfo, tTexBase, deMipMask); - grTexMultibaseAddress(currTMU, tTexBase, xAdd, deMipMask, - lpThisTexInfo); - } - } /* if - even */ - else /* else do the odd segments */ - { - lpxAdd = &lpThisTxMnTexture->u1.multiR1OddAdd; - for (tTexBase = GR_TEXBASE_128; tTexBase <= GR_TEXBASE_32_TO_1; - tTexBase+=2, lpxAdd+=2 ) /* odd segs r at odd indices */ - /* next i check that the current TexBase is in the lod range */ - if ((lpThisTexInfo->largeLod <= (FxI32) tTexBase) && - (lpThisTexInfo->smallLod >= (FxI32) tTexBase)) - { - xAdd = *lpxAdd; - if (bMultiOffsetFix) - xAdd -= prGetMultiMemBump(lpThisTexInfo, tTexBase, deMipMask); - grTexMultibaseAddress( currTMU, tTexBase, xAdd, deMipMask, - lpThisTexInfo ); - } - } /* else - odd */ - } /* else IS_TRILINEAR && IS_MULTIBASE */ - grTexMultibase(currTMU, FXFALSE); /* turn off multibase */ - } /* else IS_MULTIBASE */ -} /* plTxMnRender */ -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnGetInfo - Date: 6/27/97 - Implementor(s): psw - Library: - Description: - simply fills in GrTexInfo struct with info about Texture - Arguments: - hTexId_t deTexHndl - the texture that you want to know about - GrTexInfo *deGrTexInfo - the info struct you want filled - Return: - void - -------------------------------------------------------------------*/ -void -plTxMnGetInfo( hTexId_t deTexHndl, GrTexInfo *deGrTexInfo ) -{ - - /* assumptions */ - assert (deGrTexInfo); - assert ( deTexHndl < hFstOpnTexId ); - - *deGrTexInfo = tlTxMnMngr[deTexHndl].lpTlTextureInfo->info; -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plPopLod - Date: 6/17/97 - Implementor(s): psw - Library: - Description: - Basically a wrapper for prPopLod - Arguments: - hTexId_t thisTexId - mipMapEnd_t deMipMapEnd - Return: - none - -------------------------------------------------------------------*/ -void -plPopLod( hTexId_t hCurrTexture, mipMapEnd_t deMipMapEnd ) -{ - /* definitions */ - GrTexInfo *lpThisTexInfo; - tlTxMnTexture_t *lpThisTxMnTexture; - - /* assumptions */ - assert( hCurrTexture < hFstOpnTexId ); - - - /* initializations */ - lpThisTxMnTexture = &tlTxMnMngr[hCurrTexture]; - lpThisTexInfo = &lpThisTxMnTexture->lpTlTextureInfo->info; - - /* code */ - if ( lpThisTexInfo->smallLod == lpThisTexInfo->largeLod ) - return; /* no reason to go on, nothing to do */ - - if ((IS_TRILINEAR(*lpThisTxMnTexture)) && - ((lpThisTexInfo->smallLod - lpThisTexInfo->largeLod) == 2 ) ) - return; /* trilinear && <2-lods are mutex */ - - prPopLod( lpThisTexInfo, deMipMapEnd ); -} /* plPopLod */ -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plPushLod - Date: 6/17/97 - Implementor(s): psw - Library: - Description: - Basically a wrapper for prPushLod - Arguments: - hTexId_t thisTexId - mipMapEnd_t deMipMapEnd - Return: - none - -------------------------------------------------------------------*/ -void -plPushLod( hTexId_t hCurrTexture, mipMapEnd_t deMipMapEnd ) -{ - /* definitions */ - GrTexInfo *lpThisTexInfo;/* info struct associated with curr tlTxMnMnger obj */ - tlTxMnTexture_t *lpThisTxMnTexture; - - /* assumptions */ - assert( hCurrTexture < hFstOpnTexId ); - - /* initializations */ - lpThisTxMnTexture = &tlTxMnMngr[hCurrTexture]; - lpThisTexInfo = &lpThisTxMnTexture->lpTlTextureInfo->info; - - /* code */ - if ((deMipMapEnd == topOfMipMap) && - (lpThisTexInfo->largeLod == lpThisTxMnTexture->origLargeLod)) - return; /* already at the top of the stack */ - - if ((deMipMapEnd == btmOfMipMap) && - (lpThisTexInfo->smallLod == lpThisTxMnTexture->origSmallLod)) - return; /* already at the bottom of the stack */ - - prPushLod( lpThisTexInfo, deMipMapEnd); -} /* plPushLod */ -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plCreateTlTexture - Date: 6/20/97 - Implementor(s): psw - Library: - Description: - creates a TlTexture - Arguments: - GrTexInfo* - FxU16 [] - Return: - void - -------------------------------------------------------------------*/ -void -plCreateTlTexture( TlTexture *deTlTexture, FxU16 daColors[] ) -{ - /* definitions */ - GrLOD_t tCurrLod; /* the current LOD */ - int nBytePerPixel; /* number of bytes per pixel */ - FxU8 *spLilTex; /* 8bit LOD data ptr */ - FxU16 *mpBigTex; /* 16bit LOD data ptr */ - void *lpvCurrLod; /* curr LOD data ptr */ - FxU32 xLodNumBytes; /* number of bytes to write in curr LOD */ - GrTexInfo *lpThisTexInfo; /* ptr to GrTexInfo in TlTexture struct */ - - /* assumptions */ - assert( deTlTexture ); - assert( deTlTexture->info.data ); - assert( deTlTexture->info.smallLod > deTlTexture->info.largeLod ); - - /* no palettized */ - assert( (deTlTexture->info.format != GR_TEXFMT_YIQ_422) || - (deTlTexture->info.format != GR_TEXFMT_P_8) || - (deTlTexture->info.format != GR_TEXFMT_AYIQ_8422) || - (deTlTexture->info.format != GR_TEXFMT_AP_88) ); - - /* initializations */ - lpThisTexInfo = &deTlTexture->info; - - /* code */ - if ((lpThisTexInfo->format == GR_TEXFMT_RGB_332) || - (lpThisTexInfo->format == GR_TEXFMT_YIQ_422) || - (lpThisTexInfo->format == GR_TEXFMT_ALPHA_8) || - (lpThisTexInfo->format == GR_TEXFMT_INTENSITY_8) || - (lpThisTexInfo->format == GR_TEXFMT_P_8)) - nBytePerPixel = 1; /* 8-bit formats */ - else - nBytePerPixel = 2; /* 16-bit formats */ - - lpvCurrLod = lpThisTexInfo->data; - - if ((deTlTexture->info.format != GR_TEXFMT_YIQ_422) || - (deTlTexture->info.format != GR_TEXFMT_P_8) || - (deTlTexture->info.format != GR_TEXFMT_AYIQ_8422) || - (deTlTexture->info.format != GR_TEXFMT_AP_88) ) - deTlTexture->tableType = NO_TABLE; /* fuck me */ - - for ( tCurrLod = lpThisTexInfo->largeLod; - tCurrLod <= (lpThisTexInfo->smallLod); ++tCurrLod ) - { - if ( nBytePerPixel == 1 ) - { - xLodNumBytes = prGetLodSize( lpThisTexInfo, tCurrLod ); - for (spLilTex = (FxU8*) lpvCurrLod; - spLilTex < (FxU8*) ((FxU32)lpvCurrLod + xLodNumBytes); - ++spLilTex ) - *spLilTex = (FxU8) daColors[tCurrLod]; - - lpvCurrLod = (void*) spLilTex; - } - else - { - xLodNumBytes = prGetLodSize( lpThisTexInfo, tCurrLod ); - for (mpBigTex = (FxU16*) lpvCurrLod; - mpBigTex < (FxU16*) ((FxU32)lpvCurrLod + xLodNumBytes); - ++mpBigTex ) - *mpBigTex = daColors[tCurrLod]; - - lpvCurrLod = (void*) mpBigTex; - } - } -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnDwnldMipMapLod - Date: 7/7/97 - Implementor(s): psw - Library: - Description: - downloads a mipmap lod, deLod, from a src TxMnTexture to a dst - TxMnTexture. - ***multibase not yet supported, not clearly defined - Arguments: - hTexId_t dstTexId - destination TxMnTexture id - hTexId_t srcTexId - source TxMnTexture id - GrLOD_t deLod - the lod to download in srcTexId - Return: - void - -------------------------------------------------------------------*/ -void -plTxMnDwnldMipMapLod( hTexId_t dstTexId, hTexId_t srcTexId, GrLOD_t deLod ) -{ - /* definitions */ - GrTexInfo *lpDstTexInfo, - *lpSrcTexInfo; - tlTxMnTexture_t *lpDstTxMnTexture, - *lpSrcTxMnTexture; - void *lpvData; - FxU32 thisAdd; - GrLOD_t thisLgLod; - FxU32 thisMask; - - /* assumptions */ - assert( dstTexId < hFstOpnTexId ); - assert( srcTexId < hFstOpnTexId ); - assert( IS_DOWNLOADABLE(tlTxMnMngr[dstTexId]) ); - - /* initializations */ - lpDstTxMnTexture = &tlTxMnMngr[dstTexId]; - lpSrcTxMnTexture = &tlTxMnMngr[srcTexId]; - lpDstTexInfo = &lpDstTxMnTexture->lpTlTextureInfo->info; - lpSrcTexInfo = &lpSrcTxMnTexture->lpTlTextureInfo->info; - - /* just some error checking */ - if ( ((lpDstTexInfo->format) != (lpSrcTexInfo->format)) || - ((lpDstTexInfo->aspectRatio) != (lpSrcTexInfo->aspectRatio)) || - ((lpSrcTxMnTexture->origLargeLod) > deLod) || - ((lpSrcTxMnTexture->origSmallLod) < deLod) || - ((lpDstTxMnTexture->origLargeLod) > deLod) || - ((lpDstTxMnTexture->origSmallLod) < deLod) ) - return; /* nonfatal error, just return */ - - /* code */ - /* get the data */ - lpvData = malloc(prGetLodSize(lpSrcTexInfo, deLod)); - assert(lpvData); - prGetLod(lpSrcTexInfo, deLod, lpvData); - /* now i have an lod to download */ - - /* get the address */ - thisAdd = prGetTxMnAdd( dstTexId, deLod ); - /* get the mask */ - if (!IS_TRILINEAR(*lpDstTxMnTexture)) - thisMask = GR_MIPMAPLEVELMASK_BOTH; - else /* it is trilinear */ - thisMask = deLod%2 ? GR_MIPMAPLEVELMASK_ODD : GR_MIPMAPLEVELMASK_EVEN; - - /* get the largeLod, SPECIAL case for multibase */ - if (!IS_MULTIBASE(*lpDstTxMnTexture)) - thisLgLod = lpDstTexInfo->largeLod; - else /* is is multibase */ - thisLgLod = deLod < GR_LOD_32 ? deLod : - lpDstTexInfo->largeLod > GR_LOD_32 ? - lpDstTexInfo->largeLod : GR_LOD_32; - - grTexDownloadMipMapLevel( currTMU, thisAdd, deLod, thisLgLod, - lpDstTexInfo->aspectRatio, lpDstTexInfo->format, - thisMask, lpvData ); - free(lpvData); -} /* plTxMnDwnldMipMapLod */ -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnDwnldMipMapLod - Date: 7/7/97 - Implementor(s): psw - Library: - Description: - downloads a mipmap lod, deLod, from a src TxMnTexture to a dst - TxMnTexture. - Arguments: - hTexId_t dstTexId - destination TxMnTexture id - hTexId_t srcTexId - source TxMnTexture id - GrLOD_t deLod - the lod to download in srcTexId - Return: - void - -------------------------------------------------------------------*/ -void -plTxMnDwnldMipMapLodPrtl( hTexId_t dstTexId, hTexId_t srcTexId, GrLOD_t deLod, - int nFstRow, int nLstRow ) -{ - /* definitions */ - GrTexInfo *lpDstTexInfo, - *lpSrcTexInfo; - tlTxMnTexture_t *lpDstTxMnTexture, - *lpSrcTxMnTexture; - void *lpvData; - FxU32 thisAdd; - GrLOD_t thisLgLod; - FxU32 thisMask; - - /* assumptions */ - assert( dstTexId < hFstOpnTexId ); - assert( srcTexId < hFstOpnTexId ); - assert( IS_DOWNLOADABLE(tlTxMnMngr[dstTexId]) ); - assert( nFstRow <= nLstRow ); - - /* initializations */ - lpDstTxMnTexture = &tlTxMnMngr[dstTexId]; - lpSrcTxMnTexture = &tlTxMnMngr[srcTexId]; - lpDstTexInfo = &lpDstTxMnTexture->lpTlTextureInfo->info; - lpSrcTexInfo = &lpSrcTxMnTexture->lpTlTextureInfo->info; - - /* code */ - /* just some error checking */ - if ( ((lpDstTexInfo->format) != (lpSrcTexInfo->format)) || - ((lpDstTexInfo->aspectRatio) != (lpSrcTexInfo->aspectRatio)) || - ((lpSrcTxMnTexture->origLargeLod) > deLod) || - ((lpSrcTxMnTexture->origSmallLod) < deLod) || - ((lpDstTxMnTexture->origLargeLod) > deLod) || - ((lpDstTxMnTexture->origSmallLod) < deLod) || - (nFstRow > prGetLodHeight( deLod, lpDstTexInfo->aspectRatio)) ) - return; /* nonfatal error, just return */ - - /* because i'm a nice guy */ -// if (nLstRow >= prGetLodHeight( deLod, lpDstTexInfo->aspectRatio)) -// nLstRow = (-1) + prGetLodHeight( deLod, lpDstTexInfo->aspectRatio); - /* not so nice */ - - /* get the data */ - lpvData = malloc(prGetLodSize(lpSrcTexInfo, deLod)); - assert(lpvData); - prGetLod(lpSrcTexInfo, deLod, lpvData); - /* now i have an lod to download */ - - /* get the address */ - thisAdd = prGetTxMnAdd( dstTexId, deLod ); - - /* get the mask */ - if (!IS_TRILINEAR(*lpDstTxMnTexture)) - thisMask = GR_MIPMAPLEVELMASK_BOTH; - else /* it is trilinear */ - thisMask = deLod%2 ? GR_MIPMAPLEVELMASK_ODD : GR_MIPMAPLEVELMASK_EVEN; - - /* get the largeLod, SPECIAL case for multibase */ - if (!IS_MULTIBASE(*lpDstTxMnTexture)) - thisLgLod = lpDstTexInfo->largeLod; - else /* is is multibase */ - thisLgLod = deLod < GR_LOD_32 ? deLod : - lpDstTexInfo->largeLod > GR_LOD_32 ? - lpDstTexInfo->largeLod : GR_LOD_32; - - grTexDownloadMipMapLevelPartial( currTMU, thisAdd, deLod, thisLgLod, - lpDstTexInfo->aspectRatio, lpDstTexInfo->format, - thisMask, lpvData, nFstRow, nLstRow ); - free(lpvData); -} -/*-------------------------------------------------------------------*/ - - - -/* static helpers */ - -/*------------------------------------------------------------------- - Function: prGetTxMnAdd - Date: 7/14/97 - Implementor(s): psw - Library: - Description: - returns the address of the texture seg in linear memory that contains - the LOD being sought based on TxMn id - Arguments: - hTexId_t deTexId - destination TxMnTexture id - GrLOD_t deLod - the lod to locate the seg in - Return: - FxU32 - address of the seg containing deLod - -------------------------------------------------------------------*/ -static FxU32 -prGetTxMnAdd( hTexId_t deTexId, GrLOD_t deLod ) -{ - /* definitions */ - tlTxMnTexture_t *lpThisTxMnTxtre; - FxU32 xAdd; - - /* initializations */ - lpThisTxMnTxtre = &tlTxMnMngr[deTexId]; - - /* code */ - if (!IS_MULTIBASE(*lpThisTxMnTxtre)) - { /* not multibased */ - if (!IS_TRILINEAR(*lpThisTxMnTxtre)) - xAdd = lpThisTxMnTxtre->u0.bothAdd; - else /* IS_TRILINEAR */ - xAdd = (deLod%2) ? lpThisTxMnTxtre->u1.oddAdd : - lpThisTxMnTxtre->u0.evenAdd ; - } /* if !IS_MULTIBASE */ - else /* this is going to be fucking ugly! */ - { /* else it is multibased */ - if (!IS_TRILINEAR(*lpThisTxMnTxtre)) - { - switch ( deLod ) - { /* some things are better done with a switch... */ - case GR_LOD_256: - xAdd = (FxU32) &lpThisTxMnTxtre->u0.multiR0Add; - break; - - case GR_LOD_128: - xAdd = (FxU32) &lpThisTxMnTxtre->u1.multiR1Add; - break; - - case GR_LOD_64: - xAdd = (FxU32) &lpThisTxMnTxtre->u2.multiR2Add; - break; - - default: - xAdd = (FxU32) &lpThisTxMnTxtre->u3.multiR3Add; - break; - } - } /* if !IS_TRILINEAR */ - else - { - switch ( deLod ) - { /* some things are better done with a switch... */ - case GR_LOD_256: - xAdd = (FxU32) &lpThisTxMnTxtre->u0.multiR0EvenAdd; - break; - - case GR_LOD_128: - xAdd = (FxU32) &lpThisTxMnTxtre->u1.multiR1OddAdd; - break; - - case GR_LOD_64: - xAdd = (FxU32) &lpThisTxMnTxtre->u2.multiR2EvenAdd; - break; - - default: /* deLod <= 32_TO_1, key is could be < */ - xAdd = (deLod % 2) ? (FxU32) &lpThisTxMnTxtre->u3.multiR3OddAdd : - (FxU32) &lpThisTxMnTxtre->u4.multiR3EvenAdd; - break; - } - } /* else IS_TRILINEAR */ - } /* else IS_MULTIBASE */ - - return (xAdd); -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: prGetLod - Date: 7/7/97 - Implementor(s): psw - Library: - Description: - gets the lod specific data out of a GrTexInfo designated by - lpTexInfo, used primarily by plTxMnDwnldMipMapLod - Arguments: - GrTexInfo *lpTexInfo - destination TxMnTexture id - GrLOD_t deLod - the lod get in deTexId - void *lpvData - pointer to data to propagate - Return: - void - -------------------------------------------------------------------*/ -static void -prGetLod( GrTexInfo *lpTexInfo, GrLOD_t deLod, void *lpvData ) -{ - /* definitions */ - GrTexInfo thisTexInfo, - *lpThisTexInfo; - GrLOD_t lod; - FxU32 i, xNumBytes; - FxU8 *lpSrc, - *lpDst; - - /* initializations */ - lpThisTexInfo = &thisTexInfo; - *lpThisTexInfo = *lpTexInfo; /* munge a copy */ - - /* code */ - /* mod copy to get deLod at the top */ - for ( lod = lpThisTexInfo->largeLod; lod < deLod; ++lod ) - prPopLod( lpThisTexInfo, topOfMipMap ); - - /* get the size of top lod */ - xNumBytes = prGetLodSize( lpThisTexInfo, lpThisTexInfo->largeLod ); - - /* read the top lod data into *lpvData */ - lpSrc = (FxU8*) lpThisTexInfo->data; - lpDst = (FxU8*) lpvData; - - for ( i = 0; i < xNumBytes; ++i ) - *lpDst++ = *lpSrc++; -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: prPushLod - Date: 7/7/97 - Implementor(s): psw - Library: - Description: - This routine actually modifies the GrTexInfo struct data to push - data BACK on the top or bottom of the mipmap. pushes a single lod - Arguments: - GrTexInfo *lpDeTexInfo - mipMapEnd_t deMipMapEnd - Return: - none - -------------------------------------------------------------------*/ -static void -prPushLod( GrTexInfo *lpDeTexInfo, mipMapEnd_t deMipMapEnd ) -{ - if (deMipMapEnd == topOfMipMap) - lpDeTexInfo->data = (void*)( (FxU32) lpDeTexInfo->data - - prGetLodSize(lpDeTexInfo, --lpDeTexInfo->largeLod)); - else - ++lpDeTexInfo->smallLod; -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: prPopLod - Date: 7/7/97 - Implementor(s): psw - Library: - Description: - This routine actually modifies the GrTexInfo struct data to pop - data off the top or bottom of the mipmap. pops off a single lod - Arguments: - GrTexInfo *lpDeTexInfo - mipMapEnd_t deMipMapEnd - Return: - none - -------------------------------------------------------------------*/ -static void -prPopLod( GrTexInfo *lpDeTexInfo, mipMapEnd_t deMipMapEnd ) -{ - if (deMipMapEnd == topOfMipMap) - lpDeTexInfo->data = (void*)( (FxU32) lpDeTexInfo->data + - prGetLodSize(lpDeTexInfo, lpDeTexInfo->largeLod++)); - else - --lpDeTexInfo->smallLod; -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: prGetLodSize - Date: 6/18/97 - Implementor(s): psw - Library: - Description: - returns the size, in number of bytes, of an LOD based upon format, - LOD level and aspect ratio. this routine is meant to be used on - the void* in the GrTexInfo struct. - Arguments: - GrTexInfo *const disTexInfo - pointer to the Texture Info - GrLOD_t disLOD - the lod to get the size of - Return: - FxU32 - -------------------------------------------------------------------*/ -static FxU32 -prGetLodSize( GrTexInfo *const deTexInfo, GrLOD_t deLod ) -{ - /* definitions */ - int nPxlFctr; - int yAspctDvdr[] = {3, 2, 1, 0, 1, 2, 3}; /* ie. GR_ASPECT_1x8 = 2^3 */ - int yLodFctr[] = {8, 7, 6, 5, 4, 3, 2, 1, 0}; /* ie. GR_LOD_256 = 2^8 */ - FxU32 xNumBytes; - GrAspectRatio_t thisAR; - GrLOD_t thisLod; - - /* code */ - if ((deTexInfo->format == GR_TEXFMT_RGB_332) || - (deTexInfo->format == GR_TEXFMT_YIQ_422) || - (deTexInfo->format == GR_TEXFMT_ALPHA_8) || - (deTexInfo->format == GR_TEXFMT_INTENSITY_8) || - (deTexInfo->format == GR_TEXFMT_P_8)) - nPxlFctr = 1; /* 8-bit formats */ - else - nPxlFctr = 2; /* all else are 16-bit formats */ - - thisAR = deTexInfo->aspectRatio; /* thisAspectRatio */ - thisLod = deLod; /* thisLod */ - - /* the general formula is xNumBytes=nBytesPerPixel*nPixels - ** nPixels=maxPixels/aspectRatio - ** maxPixels for GR_LOD_256=256*256 or 2^8*2^8, hence the following formula...*/ - if ( yAspctDvdr[thisAR] < yLodFctr[thisLod] ) - xNumBytes = nPxlFctr << yLodFctr[thisLod] << yLodFctr[thisLod] >> - yAspctDvdr[thisAR]; - else - xNumBytes = nPxlFctr << yLodFctr[thisLod]; - - return xNumBytes; -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: prTexMultiMemRequired - Date: 6/27/97 - Implementor(s): psw - Library: - Description: - calculates and returns the amount of memory required for the - individual multibase texture segments in BOTH, EVEN or ODD modes - traps cases for missing LODs - Arguments: - FxU32 deMipMask (GR_MIPMAPLEVELMASK) - GrTexBaseRange_t deRange - GrAspectRatio_t deRatio - GrTextureFormat_t deFormat - Return: - FxU32 - memory required - -------------------------------------------------------------------*/ -static -FxU32 prTexMultiMemRequired( FxU32 deMipMask, GrTexBaseRange_t deMultiSeg, - GrTexInfo* deTexInfo ) -{ - /* definitions */ - GrTexInfo tmpTexInfo, - *lpTmpTexInfo; /* create a copy of the GrTexInfo */ - FxU32 thisSegMemReq = 0x0; - GrLOD_t lod; - - /* initializations */ - lpTmpTexInfo = &tmpTexInfo; - *lpTmpTexInfo = *deTexInfo; /* copy passed data, then prepare to munge */ - - /* code */ - if ((lpTmpTexInfo->largeLod > (FxI32) deMultiSeg) || - (lpTmpTexInfo->smallLod < (FxI32) deMultiSeg)) - return 0; /* the deMultiSeg !exist in the lod range of info */ - - /* else it does */ - for (lod = lpTmpTexInfo->largeLod; lod < (FxI32) deMultiSeg; ++lod) - prPopLod( lpTmpTexInfo, topOfMipMap ); /* munge the top */ - - if ( deMultiSeg != GR_TEXBASE_32_TO_1) - lpTmpTexInfo->smallLod = lpTmpTexInfo->largeLod; /* munge the btm */ - - thisSegMemReq = grTexTextureMemRequired( deMipMask, lpTmpTexInfo ); - - return thisSegMemReq; -} /* prTexMultiMemRequired */ -/*-------------------------------------------------------------------*/ - - - -/*-------------------------------------------------------------------*/ -static int -prGetLodWidth( GrLOD_t lod, GrAspectRatio_t aspect ) -{ - int yAspctWdvdr[] = {0, 0, 0, 0, 1, 2, 3}; - int yLodFctr[] = {8, 7, 6, 5, 4, 3, 2, 1, 0}; - int val; - - val = yLodFctr[lod] > yAspctWdvdr[aspect] ? - 1 << yLodFctr[lod] >> yAspctWdvdr[aspect] : 1; - - return( val ); -} -/*-------------------------------------------------------------------*/ - - - -/*-------------------------------------------------------------------*/ -static int -prGetLodHeight( GrLOD_t lod, GrAspectRatio_t aspect ) -{ - int yAspctHdvdr[] = {3, 2, 1, 0, 0, 0, 0}; - int yLodFctr[] = {8, 7, 6, 5, 4, 3, 2, 1, 0}; - int val; - - val = yLodFctr[lod] > yAspctHdvdr[aspect] ? - 1 << yLodFctr[lod] >> yAspctHdvdr[aspect] : 1; - - return( val ); -} -/*-------------------------------------------------------------------*/ - - - -/*-------------------------------------------------------------------*/ -static FxU32 -prGetMultiMemBump( const GrTexInfo *const deTexInfo, - GrTexBaseRange_t deTexBase, - FxU32 deMipMask ) -{ /* this fixes some multibase fuckage */ - /* definitions */ - FxU32 xMemBump, - xAllMemReq, - xSegMemReq; - GrTexInfo tmpTexInfo, - *lpTmpTexInfo; - - /* initializations */ - lpTmpTexInfo = &tmpTexInfo; - *lpTmpTexInfo = *deTexInfo; - - /* code */ - lpTmpTexInfo->largeLod = GR_LOD_256; - xAllMemReq = grTexTextureMemRequired( deMipMask, lpTmpTexInfo ); - - lpTmpTexInfo->largeLod = deTexBase != GR_TEXBASE_32_TO_1 ? deTexBase : - lpTmpTexInfo->largeLod > (FxI32) deTexBase ? - lpTmpTexInfo->largeLod : GR_LOD_32; - xSegMemReq = grTexTextureMemRequired( deMipMask, lpTmpTexInfo ); - - xMemBump = xAllMemReq - xSegMemReq; - return (xMemBump); -} diff --git a/glide2x/sst1/glide/tests/plib.h b/glide2x/sst1/glide/tests/plib.h deleted file mode 100644 index 0a296a8..0000000 --- a/glide2x/sst1/glide/tests/plib.h +++ /dev/null @@ -1,143 +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$ -** -*/ - - -#ifndef _PLIB_H_ -#define _PLIB_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum { topOfMipMap, btmOfMipMap } mipMapEnd_t; - -typedef FxU8 hTexId_t; -#define H_NULL 0x0 -#define H_FSTTEXID 0x1 - -typedef struct { - unsigned int isDownloadable : 1; /* should tex be downloaded? */ - unsigned int isMultibase : 1; /* downloaded as multibase? */ - unsigned int isTrilinear : 1; /* downloaded as EVEN/ODD? */ - unsigned int isBeenPopd : 1; /* has it been pop'd? - not used */ - unsigned int isDirty : 1; /* has it been touched? - not used */ -} tlTxMnFlags_t; - -typedef struct { - TlTexture* lpTlTextureInfo; - GrLOD_t origLargeLod; /* for pop 'n' push */ - GrLOD_t origSmallLod; /* for pop 'n' push */ - /* I need a min of 5 start addresses worst case - Trilinear Multibase - ** The unions contain start addresses that are mutually exclusive - ** ps, if the order of these unions ever change, some shit will seriously - ** break, especially in plTxMnTexSource() */ - union u0_u { /* can you believe softice doesn't understand unnamed unions? */ - FxU32 bothAdd; /* BOTH linear start */ - FxU32 evenAdd; /* EVEN linear start */ - FxU32 multiR0Add; /* BOTH multi 1st range start */ - FxU32 multiR0EvenAdd; /* EVEN multi 1st range start */ - } u0; - union u1_u { - FxU32 oddAdd; /* ODD linear start */ - FxU32 multiR1Add; /* BOTH multi 2nd range start */ - FxU32 multiR1OddAdd; /* ODD multi 2nd range start */ - } u1; - union u2_u { - FxU32 multiR2Add; /* BOTH multi 3rd range start */ - FxU32 multiR2EvenAdd; /* EVEN multi 3rd range start */ - } u2; - union u3_u { - FxU32 multiR3Add; /* BOTH multi 4th range start */ - FxU32 multiR3OddAdd; /* EVEN multi 4th range start */ - } u3; - union u4_u { - FxU32 multiR3EvenAdd; /* ODD multi 4th range start */ - } u4; /* just for consistency */ - tlTxMnFlags_t flags; -} tlTxMnTexture_t; - -/* exposed function prototypes for TxMn */ -hTexId_t plTxMnLoadTxMngr( TlTexture* lpTexture ); -void plTxMnDownloadAll( ); -void plTxMnTexSource( hTexId_t deTexId, FxU32 deMipMask ); -void plTxMnReset( hTexId_t deTexId ); -void plTxMnSetDownload( hTexId_t theTexId, FxBool bDownLoad ); -FxBool plTxMnGetMultibase( hTexId_t deTexId ); -void plTxMnSetMultibase( hTexId_t deTexId, FxBool bMultibase ); -FxBool plTxMnGetTrilinear( hTexId_t deTexId ); -void plTxMnSetTrilinear( hTexId_t theTexId, FxBool bTrilinear ); -FxBool plTxMnGetMultiRevOrder( ); -void plTxMnSetMultiOffsetFix( FxBool bOffsetFix ); -FxBool plTxMnGetMultiOffsetFix( ); -void plTxMnSetMultiRevOrder( FxBool bOrder ); -void plTxMnGetInfo( hTexId_t deTexHndl, GrTexInfo *deGrTexInfo ); -void plTxMnDwnldMipMapLod( hTexId_t dstTexId, hTexId_t srcTexId, GrLOD_t deLod ); -void plTxMnDwnldMipMapLodPrtl( hTexId_t dstTexId, hTexId_t srcTexId, GrLOD_t deLod, - int nFstRow, int nLstRow ); - -/* public helper function prototypes */ -void plPopLod( hTexId_t hCurrTexture, mipMapEnd_t mipMapEnd ); -void plPushLod( hTexId_t hCurrTexture, mipMapEnd_t mipMapEnd ); -void plCreateTlTexture( TlTexture *disTlTexture, FxU16 daColors[] ); - -/* static helper prototypes */ -static void prSetBeenPopd( hTexId_t deTexId, FxBool bBeenPopd ); -static FxU32 prGetLodSize( GrTexInfo *const disTexInfo, GrLOD_t disLOD ); -static FxU32 prTexMultiMemRequired( FxU32 deMipMask, GrTexBaseRange_t deRange, - GrTexInfo* deTexInfo ); -static void prGetLod( GrTexInfo *lpTexInfo, GrLOD_t deLod, void *data ); -static void prPopLod( GrTexInfo *lpDeTexInfo, mipMapEnd_t deMipMapEnd ); -static void prPushLod( GrTexInfo *lpDeTexInfo, mipMapEnd_t deMipMapEnd ); -static FxU32 prGetTxMnAdd( hTexId_t deTexId, GrLOD_t deLod ); -static int prGetLodWidth( GrLOD_t lod, GrAspectRatio_t aspect ); -static int prGetLodHeight( GrLOD_t lod, GrAspectRatio_t aspect ); -static FxU32 prGetMultiMemBump( const GrTexInfo *const deTexInfo, - GrTexBaseRange_t deTexBase, - FxU32 deMipMask ); - - - - -/* some macros to play with the bit fields */ -#define IS_DOWNLOADABLE( tex ) (tex).flags.isDownloadable ? FXTRUE : FXFALSE -#define IS_MULTIBASE( tex ) (tex).flags.isMultibase ? FXTRUE : FXFALSE -#define IS_BEENPOPD( tex ) (tex).flags.isBeenPopd ? FXTRUE : FXFALSE -#define IS_TRILINEAR( tex ) (tex).flags.isTrilinear ? FXTRUE : FXFALSE -#define IS_DIRTY( tex ) (tex).flags.isDirty ? FXTRUE : FXFALSE -#define SET_DOWNLOADABLE( tex, b ) (tex).flags.isDownloadable = b -#define SET_MULTIBASE( tex, b ) (tex).flags.isMultibase = b -#define SET_TRILINEAR( tex, b ) (tex).flags.isTrilinear = b -#define SET_BEENPOPD( tex, b ) (tex).flags.isBeenPopd = b -#define SET_DIRTY( tex, b ) (tex).flags.isDirty = b - - -#ifdef NDEBUG -#undef NDEBUG -#endif - -#ifdef __cplusplus -} -#endif -#endif diff --git a/glide2x/sst1/glide/tests/qatest00.c b/glide2x/sst1/glide/tests/qatest00.c deleted file mode 100644 index 57d9f44..0000000 --- a/glide2x/sst1/glide/tests/qatest00.c +++ /dev/null @@ -1,1240 +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 -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" -#include "plib.h" -#include "qatest00.h" - -/* 1BgFile+8FgFile+3Algo+8DwnlodAlgo=21*/ -#define NUMTEXTURES 21 -myTexture_t theTextures[NUMTEXTURES]; - -TexCoordFactors aspctToTxtreCrdFctrs[7] = { - { 256.0f, 256.0f / 8.0f }, /* GR_ASPECT_8x1 */ - { 256.0f, 256.0f / 4.0f }, /* GR_ASPECT_4x1 */ - { 256.0f, 256.0f / 2.0f }, /* GR_ASPECT_2x1 */ - { 256.0f, 256.0f }, /* GR_ASPECT_1x1 */ - { 256.0f / 2.0f, 256.0f }, /* GR_ASPECT_1x2 */ - { 256.0f / 4.0f, 256.0f }, /* GR_ASPECT_1x4 */ - { 256.0f / 8.0f, 256.0f } /* GR_ASPECT_1x8 */ -}; - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "QATEST00"; -static const char purpose[] = "Texture Download"; -static const char usage[] = "-n -r "; - -static float scrWidth = 640.0f; -static float scrHeight = 480.0f; - -/* some global shit for mipmap lod && partial lod downloads */ -static FxBool g_bDoLodDwnld = FXFALSE; -static FxI32 g_nLodToDwnld; -static FxBool g_bDoLodPrtlDwnld = FXFALSE; -static FxI32 g_nLodPrtlFstRow; -static FxI32 g_nLodPrtlLstRow; - -void main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - /* definitions */ - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - int frames = -1; - - /* some texture stuff */ - /* disk based textures */ - const char *lpzBgTxtrFile = "miro.3df"; - const int nNumFgTxtrFiles = 8; - const char *lpzFgTxtrFiles[] = { "rgb332.3df", "rgb565.3df", - "argb4444.3df", "argb1555.3df", - "p8.3df", "ap88.3df", - "yiq.3df", "ayiq.3df" }; - /* color stuff for algorithmic textures */ - const int nAlgFgTxtres = 4; - FxU16 yAlgFgClrs[][9] = - {{ RED_565, GRN_565, RED_565, GRN_565, RED_565, GRN_565, RED_565, GRN_565, RED_565 }, - { RED_565, GRN_565, RED_565, GRN_565, RED_565, GRN_565, RED_565, GRN_565, RED_565 }, - { RED_565, GRN_565, RED_565, GRN_565, RED_565, GRN_565, RED_565, GRN_565, RED_565 }, - { RED_565, GRN_565, RED_565, GRN_565, RED_565, GRN_565, RED_565, GRN_565, RED_565 }}; - - /* templates for all algorithmic textures */ - GrTexInfo yAlgTxtreTmplts[][9] = - {{ GR_LOD_1, GR_LOD_256, GR_ASPECT_8x1, GR_TEXFMT_RGB_565, NULL }, - { GR_LOD_1, GR_LOD_256, GR_ASPECT_4x1, GR_TEXFMT_RGB_565, NULL }, - { GR_LOD_1, GR_LOD_256, GR_ASPECT_2x1, GR_TEXFMT_RGB_565, NULL }, - { GR_LOD_1, GR_LOD_256, GR_ASPECT_1x1, GR_TEXFMT_RGB_565, NULL }}; - - const int nDwnLodTxtres = 8; - FxU16 yDwnLodClrs[][9] = - {{ BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565 }, - { BLU_332, BLU_332, BLU_332, BLU_332, BLU_332, BLU_332, BLU_332, BLU_332, BLU_332 }, - { BLU_1555, BLU_1555, BLU_1555, BLU_1555, BLU_1555, BLU_1555, BLU_1555, BLU_1555, BLU_1555 }, - { BLU_4444, BLU_4444, BLU_4444, BLU_4444, BLU_4444, BLU_4444, BLU_4444, BLU_4444, BLU_4444 }, - { BLU_8332, BLU_8332, BLU_8332, BLU_8332, BLU_8332, BLU_8332, BLU_8332, BLU_8332, BLU_8332 }, - { BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565 }, - { BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565 }, - { BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565 }}; - - GrTexInfo yDwnTxtreTmplts[][9] = - {{ GR_LOD_1, GR_LOD_256, GR_ASPECT_1x1, GR_TEXFMT_RGB_565, NULL }, - { GR_LOD_1, GR_LOD_256, GR_ASPECT_1x1, GR_TEXFMT_RGB_332, NULL }, - { GR_LOD_1, GR_LOD_256, GR_ASPECT_1x1, GR_TEXFMT_ARGB_1555, NULL }, - { GR_LOD_1, GR_LOD_256, GR_ASPECT_1x1, GR_TEXFMT_ARGB_4444, NULL }, - { GR_LOD_1, GR_LOD_256, GR_ASPECT_1x1, GR_TEXFMT_RGB_565, NULL }, - { GR_LOD_1, GR_LOD_256, GR_ASPECT_8x1, GR_TEXFMT_RGB_565, NULL }, - { GR_LOD_1, GR_LOD_256, GR_ASPECT_4x1, GR_TEXFMT_RGB_565, NULL }, - { GR_LOD_1, GR_LOD_256, GR_ASPECT_2x1, GR_TEXFMT_RGB_565, NULL }}; - - /* texture handles */ - hTexId_t hCurrFgTxtre, /* current fg texture */ - hFstFgTxtre, /* first fg texture */ - hLstFgTxtre, /* last fg texture */ - hFstAlgFgTxtre, /* first algo texture */ - hLstAlgFgTxtre, /* last algo texture */ - hFstDwnlTxtre, /* first lod download texture */ - hLstDwnlTxtre, /* last lod download texture */ - hDwlnSrcTxtre, - hTmpTxtre; - hTexId_t hBgTxtre; /* bg texture */ - - GrVertex bgVerts[4]; - GrVertex fgVerts[4]; - - const float alpha = 192.0f; /* Alpha for ,blending tringle over background */ - FxU32 fxColorValue; - int i; - - /*---- - 0-1 - |/| - 3-2 - -----*/ - bgVerts[0].x = 0.f, bgVerts[0].y = 0.f; - bgVerts[0].a = 255.f, bgVerts[0].oow = 1.f; - bgVerts[0].tmuvtx[0].sow = 0.f * bgVerts[0].oow; - bgVerts[0].tmuvtx[0].tow = 0.f * bgVerts[0].oow; - - bgVerts[1].x = scrWidth, bgVerts[1].y = 0.f; - bgVerts[1].a = 255.f,bgVerts[1].oow = 1.f; - bgVerts[1].tmuvtx[0].sow = 255.f * bgVerts[1].oow; - bgVerts[1].tmuvtx[0].tow = 0.f * bgVerts[1].oow; - - bgVerts[2].x = scrWidth, bgVerts[2].y = scrHeight; - bgVerts[2].a = 255.f, bgVerts[2].oow = 1.f; - bgVerts[2].tmuvtx[0].sow = 255.f * bgVerts[2].oow; - bgVerts[2].tmuvtx[0].tow = 255.f * bgVerts[2].oow; - - bgVerts[3].x = 0.f, bgVerts[3].y = scrHeight; - bgVerts[3].a = 255.f, bgVerts[3].oow = 1.f; - bgVerts[3].tmuvtx[0].sow = 0.f * bgVerts[3].oow; - bgVerts[3].tmuvtx[0].tow = 255.f * bgVerts[3].oow; - - fgVerts[0].x = 0.f, fgVerts[0].y = 0.f; - fgVerts[0].a = 255.f, fgVerts[0].oow = 1.f; - fgVerts[0].tmuvtx[0].sow = 0.f; - fgVerts[0].tmuvtx[0].tow = 0.f; - - fgVerts[1].x = 0.f, fgVerts[1].y = 0.f; - fgVerts[1].a = 255.f, fgVerts[1].oow = 1.f; - fgVerts[1].tmuvtx[0].sow = 0.f; - fgVerts[1].tmuvtx[0].tow = 0.f; - - fgVerts[2].x = 0.f, fgVerts[2].y = 0.f; - fgVerts[2].a = 255.f, fgVerts[2].oow = 1.f; - fgVerts[2].tmuvtx[0].sow = 0.f; - fgVerts[2].tmuvtx[0].tow = 0.f; - - fgVerts[3].x = 0.f, fgVerts[3].y = 0.f; - fgVerts[3].a = 255.f, fgVerts[3].oow = 1.f; - fgVerts[3].tmuvtx[0].sow = 0.f; - fgVerts[3].tmuvtx[0].tow = 0.f; - - /* 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() ); - return; - } - - switch( match ) - { - case 'n': - frames = atoi( remArgs[0] ); - break; - - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], &scrWidth, &scrHeight ); - break; - } - } /* while */ - - 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, 40, 0xffffff ); - /* done initialize Glide */ - - /* Texure stuff */ - /* do the disk based texture stuff */ - for ( i = 0; i < nNumFgTxtrFiles; ++i ) - if ( i==0 ) - hFstFgTxtre = doLoadTexture( lpzFgTxtrFiles[i], NULL, NULL, FXTRUE ); - else - hLstFgTxtre = doLoadTexture( lpzFgTxtrFiles[i], NULL, NULL, FXTRUE ); - /* do the algorithmic fg texture stuff */ - for ( i = 0; i < nAlgFgTxtres; ++i ) - if ( i==0 ) - hFstAlgFgTxtre = doLoadTexture( NULL, &yAlgTxtreTmplts[i][0], &yAlgFgClrs[i][0], FXTRUE ); - else - hLstAlgFgTxtre = doLoadTexture( NULL, &yAlgTxtreTmplts[i][0], &yAlgFgClrs[i][0], FXTRUE ); - - hLstFgTxtre = hLstAlgFgTxtre; - /* do the algorithmic download lod texture stuff, these are not downloadable */ - for ( i = 0; i < nDwnLodTxtres; ++i ) - if ( i==0 ) - hFstDwnlTxtre = doLoadTexture( NULL, &yDwnTxtreTmplts[i][0], &yDwnLodClrs[i][0], FXFALSE ); - else - hLstDwnlTxtre = doLoadTexture( NULL, &yDwnTxtreTmplts[i][0], &yDwnLodClrs[i][0], FXFALSE ); - - hCurrFgTxtre = hFstFgTxtre; /* init hCurrFgTxtre */ - hBgTxtre = doLoadTexture( lpzBgTxtrFile, NULL, NULL, FXTRUE ); - plTxMnDownloadAll(); /* make plTxMn download everything */ - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - /* done loading plTxMn */ - -// grTexFilterMode( GR_TMU0, GR_TEXTUREFILTER_BILINEAR, GR_TEXTUREFILTER_BILINEAR ); - - fxColorValue = (0x00FFFFFF | ( ((int) alpha) << 24 ) ); - grConstantColorValue(fxColorValue); - - /* Main processing loop */ - while( frames-- ) - { - /* definitions */ - static ScaleAmt_t tCurrScle = SCALE_1; - static MipMapMode_t mipMapMode = DISABLE; - static FilterMode_t filterMode = BOTH_BILNEAR; - static float fBiasLevel = 0.0f; - static float fBiasInc = 0.25f; - static FxBool bVerboseMode = FXTRUE; - static FxBool bBgImage = FXTRUE; - - float fXsize, fYsize, fULsow, fLRsow, fULtow, fLRtow; - GrTexInfo tmpTexInfo; - FxBool isTrilinear, isMultibase; - - /* code */ - grBufferClear( 0x00404040, 0, GR_ZDEPTHVALUE_FARTHEST ); - - /* Output the diagnostic stuff */ - if (bVerboseMode) - { - tlConClear(); - plTxMnGetInfo( hCurrFgTxtre, &tmpTexInfo ); - isTrilinear = plTxMnGetTrilinear( hCurrFgTxtre ); - isMultibase = plTxMnGetMultibase( hCurrFgTxtre ); - tlConOutput("txt %d, fmt %#x, lgLod %#x, smLod %#x, aspct %#x, T:%d, M:%d\n", - hCurrFgTxtre, tmpTexInfo.format, tmpTexInfo.largeLod, - tmpTexInfo.smallLod, tmpTexInfo.aspectRatio, - isTrilinear, isMultibase ); - fXsize = fgVerts[1].x - fgVerts[0].x; - fYsize = fgVerts[3].y - fgVerts[0].y; - fULsow = fgVerts[0].tmuvtx[0].sow; - fULtow = fgVerts[0].tmuvtx[0].tow; - fLRsow = fgVerts[2].tmuvtx[0].sow; - fLRtow = fgVerts[2].tmuvtx[0].tow; - tlConOutput("Size %f by %f:\nUL s,t %f, %f: LR s,t %f, %f\n", - fXsize, fYsize, fULsow, fULtow, fLRsow, fLRtow ); - switch (tCurrScle) - { - case SCALE_1: - tlConOutput("Curr Scale is 1 LOD; "); - break; - - case SCALE_2: - tlConOutput("Curr Scale is 1/2 LOD; "); - break; - - case SCALE_4: - tlConOutput("Curr Scale is 1/4 LOD; "); - break; - - case SCALE_8: - tlConOutput("Curr Scale is 1/8 LOD; "); - break; - - case SCALE_16: - tlConOutput("Curr Scale is 1/16 LOD; "); - break; - - case SCALE_32: - tlConOutput("Curr Scale is 1/32 LOD; "); - break; - } - tlConOutput("LOD Bias is %f\n", fBiasLevel); - } /* done with the Con output stuff */ - - /* do the Bg texture */ - if (bBgImage) - { - /* Setup the system for the Bg Texture */ - grTexLodBiasValue( GR_TMU0, 0.0f ); - grHints(GR_HINT_ALLOW_MIPMAP_DITHER, FXFALSE); - grTexMipMapMode(GR_TMU0, GR_MIPMAP_DISABLE, FXFALSE); - grTexFilterMode( GR_TMU0, GR_TEXTUREFILTER_BILINEAR, GR_TEXTUREFILTER_BILINEAR ); - grTexCombine( GR_TMU0, GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_NONE, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ZERO, GR_BLEND_ZERO, GR_BLEND_ZERO ); - - /* set bgTexture as source of next rendering operations */ - plTxMnTexSource( hBgTxtre, GR_MIPMAPLEVELMASK_BOTH ); - - grDrawTriangle( &bgVerts[0], &bgVerts[1], &bgVerts[3] ); - grDrawTriangle( &bgVerts[1], &bgVerts[2], &bgVerts[3] ); - } /* done with Bg txtre */ - - /* Setup the system for the Fg Texture */ - switch( mipMapMode ) - { - case DISABLE: - grHints (GR_HINT_ALLOW_MIPMAP_DITHER, FXFALSE ); - grTexMipMapMode( GR_TMU0, GR_MIPMAP_DISABLE, FXFALSE ); - if (bVerboseMode) - tlConOutput( "MipMapMode: DISABLE " ); - break; - - case NEAREST: - grHints (GR_HINT_ALLOW_MIPMAP_DITHER, FXFALSE ); - grTexMipMapMode( GR_TMU0, GR_MIPMAP_NEAREST, FXFALSE ); - if (bVerboseMode) - tlConOutput( "MipMapMode: NEAREST " ); - break; - - case TRILINEAR: - grHints (GR_HINT_ALLOW_MIPMAP_DITHER, FXFALSE ); - grTexMipMapMode( GR_TMU0, GR_MIPMAP_NEAREST, FXTRUE ); - if (bVerboseMode) - tlConOutput( "MipMapMode: TRILINEAR " ); - break; - - case DITHRD_NREST: - grHints (GR_HINT_ALLOW_MIPMAP_DITHER, FXTRUE ); - grTexMipMapMode( GR_TMU0, GR_MIPMAP_NEAREST_DITHER, FXFALSE ); - if (bVerboseMode) - tlConOutput( "MipMapMode: NEAR_DITHRD " ); - break; - - case DITHRD_TRILIN: - grHints (GR_HINT_ALLOW_MIPMAP_DITHER, FXTRUE ); - grTexMipMapMode( GR_TMU0, GR_MIPMAP_NEAREST_DITHER, FXTRUE ); - if (bVerboseMode) - tlConOutput( "MipMapMode: NEAR_TRILNR " ); - break; - } /* switch( mipMapMode ) */ - - - switch( filterMode ) - { - case BOTH_POINT: - grTexFilterMode( GR_TMU0, GR_TEXTUREFILTER_POINT_SAMPLED, GR_TEXTUREFILTER_POINT_SAMPLED ); - if (bVerboseMode) - tlConOutput( "FltrMode: Point Samp\n" ); - break; - - case MIN_BILNEAR: - grTexFilterMode( GR_TMU0, GR_TEXTUREFILTER_BILINEAR, GR_TEXTUREFILTER_POINT_SAMPLED ); - if (bVerboseMode) - tlConOutput( "FltrMode: MinBilnr\n" ); - break; - - case MAG_BILNEAR: - grTexFilterMode( GR_TMU0, GR_TEXTUREFILTER_POINT_SAMPLED, GR_TEXTUREFILTER_BILINEAR ); - if (bVerboseMode) - tlConOutput( "FltrMode: MagBilnr\n" ); - break; - - case BOTH_BILNEAR: - grTexFilterMode( GR_TMU0, GR_TEXTUREFILTER_BILINEAR, GR_TEXTUREFILTER_BILINEAR ); - if (bVerboseMode) - tlConOutput( "FltrMode: BothBilnr\n" ); - break; - } /* switch( filterMode ) */ - - - /* do the Fg texturing stuff */ - if ((mipMapMode != TRILINEAR) && (mipMapMode != DITHRD_TRILIN)) - { - /* setup the Fg texture states */ - grTexLodBiasValue( GR_TMU0, fBiasLevel ); - grTexCombine( GR_TMU0, GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_BLEND_OTHER, GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_CONSTANT, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_SRC_ALPHA, GR_BLEND_ONE_MINUS_SRC_ALPHA, - GR_BLEND_ONE, GR_BLEND_ZERO ); - - /* set the Fg texture */ - plTxMnTexSource( hCurrFgTxtre, GR_MIPMAPLEVELMASK_BOTH ); - grDrawTriangle( &fgVerts[0], &fgVerts[1], &fgVerts[3] ); - grDrawTriangle( &fgVerts[1], &fgVerts[2], &fgVerts[3] ); - } /* if */ - else - { - /* setup system for the Even MipMaps */ - grTexLodBiasValue( GR_TMU0, fBiasLevel ); - grTexCombine( GR_TMU0, GR_COMBINE_FUNCTION_BLEND_LOCAL, GR_COMBINE_FACTOR_LOD_FRACTION, - GR_COMBINE_FUNCTION_BLEND_LOCAL,GR_COMBINE_FACTOR_LOD_FRACTION, - FXFALSE, FXFALSE ); - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_BLEND_OTHER, GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_CONSTANT, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_SRC_ALPHA, GR_BLEND_ONE_MINUS_SRC_ALPHA, - GR_BLEND_ONE, GR_BLEND_ZERO ); - - /* render with the Even MipMaps */ - plTxMnTexSource( hCurrFgTxtre, GR_MIPMAPLEVELMASK_EVEN ); - grDrawTriangle( &fgVerts[0], &fgVerts[1], &fgVerts[3] ); - grDrawTriangle( &fgVerts[1], &fgVerts[2], &fgVerts[3] ); - - /* setup system for the Odd MipMaps */ - grTexCombine( GR_TMU0, GR_COMBINE_FUNCTION_BLEND_LOCAL, GR_COMBINE_FACTOR_LOD_FRACTION, - GR_COMBINE_FUNCTION_BLEND_LOCAL,GR_COMBINE_FACTOR_LOD_FRACTION, - FXFALSE, FXFALSE ); - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_BLEND_OTHER, GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_CONSTANT, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ONE, GR_BLEND_ZERO, GR_BLEND_ZERO ); - - /* render with the Odd MipMaps */ - plTxMnTexSource( hCurrFgTxtre, GR_MIPMAPLEVELMASK_ODD ); - grDrawTriangle( &fgVerts[0], &fgVerts[1], &fgVerts[3] ); - grDrawTriangle( &fgVerts[1], &fgVerts[2], &fgVerts[3] ); - } /* else */ - - /* do the swap */ - tlConRender(); - grBufferSwap( 1 ); - - /* dynamic resizing */ - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - /* handle any keyboard input */ - while( tlKbHit() ) - { - switch( tlGetCH() ) - { - static int nCurrAlpha = -1; - GrTexInfo tFgTexInfo; - - case '+': - doScaleScreenSurf( hCurrFgTxtre, SCALE_OUT, tCurrScle ); - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case '-': - doScaleScreenSurf( hCurrFgTxtre, SCALE_IN, tCurrScle ); - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case 'a': - tlConClear(); - bVerboseMode = FXFALSE; - tlConOutput("Verbose mode Off\n"); - nCurrAlpha = (nCurrAlpha == 0) ? 0 : - (nCurrAlpha < 0) ? (int) alpha-1: --nCurrAlpha; - fxColorValue = ( 0x00FFFFFF | (nCurrAlpha << 24) ); - grConstantColorValue(fxColorValue); - tlConOutput("Current fxColorValue is %-#8x\n", fxColorValue); - break; - - case 'A': - tlConClear(); - bVerboseMode = FXFALSE; - tlConOutput("Verbose mode Off\n"); - nCurrAlpha = (nCurrAlpha == 255) ? 255 : - (nCurrAlpha < 0) ? (int) alpha+1: ++nCurrAlpha; - fxColorValue = ( 0x00FFFFFF | (nCurrAlpha << 24) ); - grConstantColorValue(fxColorValue); - tlConOutput("Current fxColorValue is %-#8x\n", fxColorValue); - break; - - case 'b': - mipMapMode++; - mipMapMode%=5; - /* set or unset the trilinear bit on all the fg textures */ - if ((mipMapMode == TRILINEAR) || (mipMapMode == DITHRD_TRILIN)) - for (hTmpTxtre = hFstFgTxtre; hTmpTxtre <= hLstFgTxtre; ++hTmpTxtre ) - plTxMnSetTrilinear( hTmpTxtre, FXTRUE ); - else - for (hTmpTxtre = hFstFgTxtre; hTmpTxtre <= hLstFgTxtre; ++hTmpTxtre ) - plTxMnSetTrilinear( hTmpTxtre, FXFALSE ); - - plTxMnDownloadAll(); /* remember to reset the TMU mem */ - break; - - case 'B': - filterMode++; - filterMode%=4; - break; - - case 'c': - case 'C': - tlConClear(); - break; - - case 'd': - tlConClear(); - bVerboseMode = FXFALSE; - tlConOutput("Verbose mode Off\n"); - plTxMnSetMultiOffsetFix( plTxMnGetMultiOffsetFix() ? FXFALSE : FXTRUE ); - tlConOutput( plTxMnGetMultiOffsetFix() ? "Multibase offset fix in\n" : - "Multibase offset fix NOT\n"); - plTxMnDownloadAll(); /* reset the tmu mem */ - break; - - case 'D': - tlConClear(); - bVerboseMode = FXFALSE; - tlConOutput("Verbose mode Off\n"); - plTxMnSetMultiRevOrder( plTxMnGetMultiRevOrder() ? FXFALSE : FXTRUE ); - tlConOutput( plTxMnGetMultiRevOrder() ? "Multibase in rev order\n" : - "Multibase in linear order\n"); - plTxMnDownloadAll(); /* reset the tmu mem */ - break; - - case 'e': - if (fBiasLevel > -8.00f) - fBiasLevel -= fBiasInc; - - grTexLodBiasValue( GR_TMU0, fBiasLevel ); - break; - - case 'E': - if (fBiasLevel < 7.750f) - fBiasLevel += fBiasInc; - - grTexLodBiasValue( GR_TMU0, fBiasLevel ); - break; - - case 'h': - case 'H': - doHelp(); - break; - - case 'l': - case 'L': - getLodToDwnld(); - if (g_bDoLodDwnld) - { - hDwlnSrcTxtre = H_NULL; - plTxMnGetInfo( hCurrFgTxtre, &tFgTexInfo ); - - for ( hTmpTxtre = hFstDwnlTxtre; hTmpTxtre <= hLstDwnlTxtre; ++hTmpTxtre) - { - plTxMnGetInfo( hTmpTxtre, &tmpTexInfo ); - if ((tFgTexInfo.format == tmpTexInfo.format) && - (tFgTexInfo.aspectRatio == tmpTexInfo.aspectRatio)) - { /* if they are compatible */ - hDwlnSrcTxtre = hTmpTxtre; - hTmpTxtre = hLstDwnlTxtre; /* get first occurence, short circut */ - } - } - - if (hDwlnSrcTxtre) - plTxMnDwnldMipMapLod( hCurrFgTxtre, hDwlnSrcTxtre, g_nLodToDwnld ); - else /* else still H_NULL */ - tlConOutput("No cmptble txtre format avlable\n"); - } - break; - - case 'm': - if ( plTxMnGetMultibase(hCurrFgTxtre) ) - plTxMnSetMultibase( hCurrFgTxtre, FXFALSE ); - else - plTxMnSetMultibase( hCurrFgTxtre, FXTRUE ); - - plTxMnDownloadAll(); /* reset the tmu mem */ - break; - - case 'M': - bBgImage = bBgImage ? FXFALSE : FXTRUE; - break; - - case 'o': - plPopLod( hCurrFgTxtre, btmOfMipMap ); - plTxMnDownloadAll(); /* reset the tmu mem */ - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case 'O': - plPopLod( hCurrFgTxtre, topOfMipMap ); - plTxMnDownloadAll(); /* reset the tmu mem */ - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case 'p': - case 'P': - getLodPrtlToDwnld(); - if (g_bDoLodPrtlDwnld) - { - hDwlnSrcTxtre = H_NULL; - plTxMnGetInfo( hCurrFgTxtre, &tFgTexInfo ); - - for ( hTmpTxtre = hFstDwnlTxtre; hTmpTxtre <= hLstDwnlTxtre; ++hTmpTxtre) - { - plTxMnGetInfo( hTmpTxtre, &tmpTexInfo ); - if ((tFgTexInfo.format == tmpTexInfo.format) && - (tFgTexInfo.aspectRatio == tmpTexInfo.aspectRatio)) - { /* if they are compatible */ - hDwlnSrcTxtre = hTmpTxtre; - hTmpTxtre = hLstDwnlTxtre; /* get first occurence, short circut */ - } - } - - if (hDwlnSrcTxtre) - plTxMnDwnldMipMapLodPrtl( hCurrFgTxtre, hDwlnSrcTxtre, g_nLodToDwnld, - g_nLodPrtlFstRow, g_nLodPrtlLstRow ); - else /* else still H_NULL */ - tlConOutput("No cmptble txtre format avlable\n"); - } - break; - - case 'r': - case 'R': - for (hTmpTxtre = hFstFgTxtre; hTmpTxtre <= hLstFgTxtre; ++hTmpTxtre ) - { - plTxMnReset( hTmpTxtre ); - doResetFgVerts( hTmpTxtre ); - } /* reset d'em puppies */ - - mipMapMode = DISABLE; - plTxMnDownloadAll(); /* reset the tmu mem */ - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case 't': - if (hCurrFgTxtre == hFstFgTxtre) - hCurrFgTxtre = hLstFgTxtre; - else - --hCurrFgTxtre; - - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case 'T': - if (hCurrFgTxtre == hLstFgTxtre) - hCurrFgTxtre = hFstFgTxtre; - else - ++hCurrFgTxtre; - - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case 'u': - plPushLod( hCurrFgTxtre, btmOfMipMap ); - plTxMnDownloadAll(); /* reset the tmu mem */ - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case 'U': - plPushLod( hCurrFgTxtre, topOfMipMap ); - plTxMnDownloadAll(); /* reset the tmu mem */ - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case 'v': - case 'V': - bVerboseMode = bVerboseMode ? FXFALSE : FXTRUE; - break; - - case 'w': - if (tCurrScle != SCALE_1) - --tCurrScle; - break; - - case 'W': - if (tCurrScle != SCALE_32) - ++tCurrScle; - break; - - default: - frames = 0; - break; - } /* switch( tlGetCH() ) */ - } /* while( tlKbHit() ) */ - } /* while (frames--) */ - - /* get the funk out */ - doUnloadTextures(); - grGlideShutdown(); - - - return; -} /* main */ - - - -static void -doHelp( void ) -{ - grBufferClear( 0, 0, 0 ); - tlConClear(); - tlConOutput("Keymap: (case sensitive - second letter lower case)\n"); - tlConOutput(" b (lc): cycles mipmap modes\n"); - tlConOutput(" B (uc): cycles filter modes\n"); - tlConOutput(" T xor t: cycles through fg texture formats\n"); - tlConOutput(" m (lc): toggles multibase for fg texture\n"); - tlConOutput(" M (uc): toggles the bg image\n"); - tlConOutput(" d (lc): toggles the mltbse offset fix\n"); - tlConOutput(" D (uc): toggles the order of the mltbse segs\n"); - tlConOutput(" L or l: LOD download menu\n"); - tlConOutput(" P or p: partial LOD download menu\n"); - tlConOutput(" R or r: resets all fg textures states\n"); - tlConOutput(" O xor o: pop lod off TOP or btm of stack\n"); - tlConOutput(" U xor u: push lod back on TOP or btm of stack\n"); - tlConOutput(" V or v: toggle verbose mode\n"); - tlConOutput(" + xor -: change size of fg obj by LOD frac\n"); - tlConOutput(" W xor w: change LOD frac\n"); - tlConOutput(" E xor e: INC or dec LOD Bias\n"); - tlConOutput(" A xor a: INC or dec alpha const\n"); - tlConOutput(" C or c: clears console\n"); - tlConOutput(" H or h: Help\n"); - tlConOutput(" Q or q: Quit\n"); - tlConOutput("Press a key to continue...\n"); - tlConRender(); - grBufferSwap( 1 ); - tlGetCH(); - - tlConClear(); -} - - - -static hTexId_t -doLoadTexture( const char *lpzFileName, GrTexInfo *tEtTexInfo, - FxU16 *yColors, FxBool isDwnldble ) -{ - /* definitions */ - static FxU8 lstTexIndx = 0; /* last available texture index */ - GrTexInfo *lpTmpTexInfo; - surfInfo_t *lpSurfInfo; - myTexture_t *lpTmpMyTxtre; /* for ease of read */ - double dNonFrac, ret; - - /* assumptions */ - assert( lpzFileName || tEtTexInfo ); - assert( lstTexIndx < NUMTEXTURES ); - - /* initializations */ - lpTmpMyTxtre = &theTextures[lstTexIndx]; - lpTmpMyTxtre->lpzTexFileName = lpzFileName; - - - /* code */ - lpTmpMyTxtre->lpTlTexture = (TlTexture*) malloc(sizeof(TlTexture)); - assert( lpTmpMyTxtre->lpTlTexture ); - lpTmpTexInfo = &lpTmpMyTxtre->lpTlTexture->info; - - if (lpzFileName != NULL) - { /* load from disk */ - assert(tlLoadTexture( lpTmpMyTxtre->lpzTexFileName, - &lpTmpMyTxtre->lpTlTexture->info, - &lpTmpMyTxtre->lpTlTexture->tableType, - &lpTmpMyTxtre->lpTlTexture->tableData)); - lpTmpTexInfo = &lpTmpMyTxtre->lpTlTexture->info; - } - else - { /* else create in RAM from template && lod color array */ - *lpTmpTexInfo = *tEtTexInfo; - lpTmpTexInfo->data = malloc(grTexCalcMemRequired(lpTmpTexInfo->smallLod, - lpTmpTexInfo->largeLod, - lpTmpTexInfo->aspectRatio, - lpTmpTexInfo->format)); - assert(lpTmpTexInfo->data); - plCreateTlTexture(lpTmpMyTxtre->lpTlTexture, yColors); - } - - /* save off the starting surface screen coords for this texture */ - lpSurfInfo = &lpTmpMyTxtre->surfInfo; - lpSurfInfo->currLod = lpTmpTexInfo->largeLod; - - - lpSurfInfo->fStartX = - ((scrWidth - (float) getLodWidth(lpSurfInfo->currLod, - lpTmpTexInfo->aspectRatio) )/2.f); - ret = modf((double) lpSurfInfo->fStartX, &dNonFrac); - lpSurfInfo->rStartX = (float) dNonFrac; - - lpSurfInfo->fEndX = - (lpSurfInfo->fStartX + (float) getLodWidth(lpSurfInfo->currLod, - lpTmpTexInfo->aspectRatio)); - ret = modf((double) lpSurfInfo->fEndX, &dNonFrac); - lpSurfInfo->rEndX = (float) dNonFrac; - - lpSurfInfo->fStartY = - ((scrHeight - (float) getLodHeight(lpSurfInfo->currLod, - lpTmpTexInfo->aspectRatio) )/2.f); - ret = modf((double) lpSurfInfo->fStartY, &dNonFrac); - lpSurfInfo->rStartY = (float) dNonFrac; - - lpSurfInfo->fEndY = - (lpSurfInfo->fStartY + (float) getLodHeight(lpSurfInfo->currLod, - lpTmpTexInfo->aspectRatio)); - ret = modf((double) lpSurfInfo->fEndY, &dNonFrac); - lpSurfInfo->rEndY = (float) dNonFrac; - /* done with surface coords */ - - /* give it to plTxMn */ - lpTmpMyTxtre->hTexture = plTxMnLoadTxMngr( lpTmpMyTxtre->lpTlTexture ); - plTxMnSetDownload( lpTmpMyTxtre->hTexture, isDwnldble ); - - ++lstTexIndx; - - return( lpTmpMyTxtre->hTexture ); -} - - - -static void -getFgVerts( hTexId_t deTexId, GrVertex *deFgVerts ) -{ - /* definitions */ - surfInfo_t *lpSurfInfo; - int i; - GrTexInfo tTexInfo; - float fSmulti, fTmulti; - - /* assumptions */ - assert( deTexId < NUMTEXTURES ); - assert( deFgVerts ); - - /* parse the texture array for the right one */ - for ( i = 0; (i < NUMTEXTURES) && (theTextures[i].hTexture != deTexId) ; ++i ); - if (i == NUMTEXTURES) - return; /* texture not found */ - - /* initializations */ - lpSurfInfo = &theTextures[i].surfInfo; - tTexInfo = theTextures[i].lpTlTexture->info; - fSmulti = aspctToTxtreCrdFctrs[tTexInfo.aspectRatio].sMult; - fTmulti = aspctToTxtreCrdFctrs[tTexInfo.aspectRatio].tMult; - - /*---- - 0-1 - |/| - 3-2 - -----*/ - - deFgVerts[0].x = lpSurfInfo->rStartX+0.5f; - deFgVerts[0].y = lpSurfInfo->rStartY+0.5f; - deFgVerts[0].tmuvtx[0].sow = 0.f * (fSmulti) * deFgVerts[0].oow; - deFgVerts[0].tmuvtx[0].tow = 0.f * (fTmulti) * deFgVerts[0].oow; - - deFgVerts[1].x = lpSurfInfo->rEndX+0.5f; - deFgVerts[1].y = lpSurfInfo->rStartY+0.5f; - deFgVerts[1].tmuvtx[0].sow = 1.f * (fSmulti) * deFgVerts[1].oow; - deFgVerts[1].tmuvtx[0].tow = 0.f * (fTmulti) * deFgVerts[1].oow; - - deFgVerts[2].x = lpSurfInfo->rEndX+0.5f; - deFgVerts[2].y = lpSurfInfo->rEndY+0.5f; - deFgVerts[2].tmuvtx[0].sow = 1.f * (fSmulti) * deFgVerts[2].oow; - deFgVerts[2].tmuvtx[0].tow = 1.f * (fTmulti) * deFgVerts[2].oow; - - deFgVerts[3].x = lpSurfInfo->rStartX+0.5f; - deFgVerts[3].y = lpSurfInfo->rEndY+0.5f; - deFgVerts[3].tmuvtx[0].sow = 0.f * (fSmulti) * deFgVerts[3].oow; - deFgVerts[3].tmuvtx[0].tow = 1.f * (fTmulti) * deFgVerts[3].oow; -} - - - -static void -doScaleScreenSurf( hTexId_t deTexId, ScaleDir_t deScleDir, ScaleAmt_t deScleAmt ) -{ - /* definitions */ - myTexture_t *lpTmpMyTxtre; - surfInfo_t *lpSurfInfo; - GrTexInfo *lpTexInfo; - int i; - int nNumScles; - float fScleAmt; - GrLOD_t tLodToScle; - GrAspectRatio_t tCurrAspct; - double dNonFrac, ret; - const float fScleLCD = 32.f; //least common scale denominator - - /* assumptions */ - assert( deTexId < NUMTEXTURES ); - - /* parse the texture array for the right one */ - for ( i = 0; (i < NUMTEXTURES) && (theTextures[i].hTexture != deTexId) ; ++i ); - if (i == NUMTEXTURES) - return; - - /* initializations */ - lpTmpMyTxtre = &theTextures[i]; - lpSurfInfo = &lpTmpMyTxtre->surfInfo; - lpTexInfo = &lpTmpMyTxtre->lpTlTexture->info; - - if ((lpSurfInfo->currLod == GR_LOD_1) && (deScleDir == SCALE_IN)) - return; - - if ((lpSurfInfo->currLod >= GR_LOD_32) && (deScleAmt > SCALE_8)) - deScleAmt = SCALE_8; - - /* do everything as multiples of (1/8)LOD jmps, (1)LOD jmp becomes 8*1/8 */ - nNumScles = ( (int) fScleLCD) >> deScleAmt; - - /* scale by a frac of the next LOD your are scaling to */ - tLodToScle = lpSurfInfo->currLod +1; - - tCurrAspct = lpTexInfo->aspectRatio; /* ease of read */ - fScleAmt = 0.0f; /* init then go */ - for ( i = 0; i < nNumScles; ++i) - { - /* check to see if i am in another LOD, scale change */ - if (deScleDir == SCALE_IN) - { - if ( (lpSurfInfo->rEndX - lpSurfInfo->rStartX == - (float) getLodWidth(tLodToScle, tCurrAspct)) && - (lpSurfInfo->rEndY - lpSurfInfo->rStartY == - (float) getLodHeight(tLodToScle, tCurrAspct)) ) - { - ++lpSurfInfo->currLod; - tLodToScle = lpSurfInfo->currLod +1; - } - } - else - { - if ( (lpSurfInfo->rEndX - lpSurfInfo->rStartX == - (float) getLodWidth(lpSurfInfo->currLod, tCurrAspct)) && - (lpSurfInfo->rEndY - lpSurfInfo->rStartY == - (float) getLodHeight(lpSurfInfo->currLod, tCurrAspct)) ) - { - if (lpSurfInfo->currLod != GR_LOD_256) - --lpSurfInfo->currLod; - tLodToScle = lpSurfInfo->currLod +1;// == GR_LOD_256 ? GR_LOD_128 : lpSurfInfo->currLod; - } - } - - - if ( !((deScleDir == SCALE_OUT) && /* is there somtin' to do */ - (getLodWidth(tLodToScle, tCurrAspct) == getLodWidth(tLodToScle -1, tCurrAspct)))) - { - fScleAmt = ((float) getLodWidth(tLodToScle, tCurrAspct)) / fScleLCD / 2.f; - lpSurfInfo->fStartX += deScleDir * fScleAmt; - ret = modf((double) lpSurfInfo->fStartX, &dNonFrac); - lpSurfInfo->rStartX = (float) dNonFrac + - (ret > 0.5f ? 1.0f : ret == 0.0f ? 0.0f : 0.5f); - - lpSurfInfo->fEndX -= deScleDir * fScleAmt; - if ((lpSurfInfo->fStartX) == (lpSurfInfo->fEndX)) - lpSurfInfo->fEndX += 1.0f; - ret = modf((double) lpSurfInfo->fEndX, &dNonFrac); - lpSurfInfo->rEndX = (float) dNonFrac + - (ret > 0.5f ? 1.0f : ret == 0.0f ? 0.0f : 0.5f); - } - - - - if ( !((deScleDir == SCALE_OUT) && /* is there somtin' to do */ - (getLodHeight(tLodToScle, tCurrAspct) == getLodHeight(tLodToScle -1, tCurrAspct)))) - { - fScleAmt = ((float) getLodHeight(tLodToScle, tCurrAspct)) / fScleLCD / 2.f; - - lpSurfInfo->fStartY += deScleDir * fScleAmt; - ret = modf((double) lpSurfInfo->fStartY, &dNonFrac); - lpSurfInfo->rStartY = (float) dNonFrac + - (ret > 0.5f ? 1.0f : ret == 0.0f ? 0.0f : 0.5f); - - lpSurfInfo->fEndY -= deScleDir * fScleAmt; - if ((lpSurfInfo->fStartY) == (lpSurfInfo->fEndY)) - lpSurfInfo->fEndY += 1.0f; - ret = modf((double) lpSurfInfo->fEndY, &dNonFrac); - lpSurfInfo->rEndY = (float) dNonFrac + - (ret > 0.5f ? 1.0f : ret == 0.0f ? 0.0f : 0.5f); - } - } -} /* doScaleScreenSurf */ - - - -static int -getLodWidth( GrLOD_t lod, GrAspectRatio_t aspect ) -{ - int yAspctWdvdr[] = {0, 0, 0, 0, 1, 2, 3}; - int yLodFctr[] = {8, 7, 6, 5, 4, 3, 2, 1, 0}; - int val; - - val = yLodFctr[lod] > yAspctWdvdr[aspect] ? - 1 << yLodFctr[lod] >> yAspctWdvdr[aspect] : 1; - - return( val ); -} - - - -static int -getLodHeight( GrLOD_t lod, GrAspectRatio_t aspect ) -{ - int yAspctHdvdr[] = {3, 2, 1, 0, 0, 0, 0}; - int yLodFctr[] = {8, 7, 6, 5, 4, 3, 2, 1, 0}; - int val; - - val = yLodFctr[lod] > yAspctHdvdr[aspect] ? - 1 << yLodFctr[lod] >> yAspctHdvdr[aspect] : 1; - - return( val ); -} - - - -static void -doUnloadTextures( ) -{ - int i; - - for ( i = 0; i < NUMTEXTURES; ++i ) - { /* free the textures, if they love you they'll come back */ - free(theTextures[i].lpTlTexture->info.data); - free(theTextures[i].lpTlTexture); - } -} - - - -static void -getLodToDwnld( ) -{ - /* definitions */ - char ch; - - /* initializations */ - g_bDoLodDwnld = FXFALSE; - - /* code */ - tlConClear(); - grBufferClear( 0, 0, 0 ); - grBufferSwap( 1 ); - grBufferClear( 0, 0, 0 ); - tlConOutput("LOD Download menu\n"); - tlConOutput("Choose LOD 0-8 "); - tlConRender(); - grBufferSwap( 1 ); - ch = tlGetCH(); - g_nLodToDwnld = atoi(&ch); - - if ((g_nLodToDwnld >= GR_LOD_256) && (g_nLodToDwnld <= GR_LOD_1)) - { - tlConOutput("%d\n", g_nLodToDwnld); - tlConRender(); - grBufferSwap( 1 ); - g_bDoLodDwnld = FXTRUE; - } - else - tlConOutput("invalid LOD\n"); - - tlConRender(); - grBufferSwap( 1 ); -} - - - -static void -getLodPrtlToDwnld( ) -{ - /* definitions */ - char ch; - int i; - - /* initializations */ - g_nLodToDwnld = 0x0; - g_bDoLodPrtlDwnld = FXFALSE; - g_nLodPrtlFstRow = 0x0; - g_nLodPrtlLstRow = 0x0; - - /* code */ - tlConClear(); - grBufferClear( 0, 0, 0 ); - grBufferSwap( 1 ); - grBufferClear( 0, 0, 0 ); - tlConOutput("LOD Prtl Dwnld menu\n"); - tlConOutput("Choose LOD 0-8 "); - tlConRender(); - grBufferSwap( 1 ); - ch = tlGetCH(); - g_nLodToDwnld = atoi(&ch); - - if ((g_nLodToDwnld >= GR_LOD_256) && (g_nLodToDwnld <= GR_LOD_1)) - { - tlConOutput("%d\n", g_nLodToDwnld); - tlConRender(); - grBufferSwap( 1 ); - - tlConOutput("Entr Fst Row 000-255 "); - tlConRender(); - grBufferSwap( 1 ); - for ( i = 0; i < 3; ++i ) - { - ch = tlGetCH(); - tlConOutput("%c", ch); - tlConRender(); - grBufferSwap( 1 ); - g_nLodPrtlFstRow = (g_nLodPrtlFstRow * 0xA) + atoi(&ch); - } - tlConOutput(" %d\n", g_nLodPrtlFstRow); - tlConRender(); - grBufferSwap( 1 ); - - tlConOutput("Entr Lst Row 000-255 "); - tlConRender(); - grBufferSwap( 1 ); - for ( i = 0; i < 3; ++i ) - { - ch = tlGetCH(); - tlConOutput("%c", ch); - tlConRender(); - grBufferSwap( 1 ); - g_nLodPrtlLstRow = (g_nLodPrtlLstRow * 0xA) + atoi(&ch); - } - tlConOutput(" %d\n", g_nLodPrtlLstRow); - tlConRender(); - grBufferSwap( 1 ); - - if (((g_nLodPrtlFstRow >= 0x0) && (g_nLodPrtlFstRow < 0x100)) && - ((g_nLodPrtlLstRow >= 0x0) && (g_nLodPrtlLstRow < 0x100))) - g_bDoLodPrtlDwnld = FXTRUE; - else - tlConOutput("invalid Row(s)\n"); - } - else - tlConOutput("invalid LOD\n"); - - tlConRender(); - grBufferSwap( 1 ); -} - - - -static void -doResetFgVerts( hTexId_t deTexId ) -{ - /* definitions */ - surfInfo_t *lpSurfInfo; - GrTexInfo *lpTexInfo; - int i; - double ret, dNonFrac; - - /* code */ - - /* parse the texture array for the right one */ - for ( i = 0; (i < NUMTEXTURES) && (theTextures[i].hTexture != deTexId) ; ++i ); - if (i == NUMTEXTURES) - return; - - /* initializations */ - lpSurfInfo = &theTextures[i].surfInfo; - lpSurfInfo->currLod = theTextures[i].lpTlTexture->info.largeLod; - lpTexInfo = &theTextures[i].lpTlTexture->info; - - /* reset the surf info */ - lpSurfInfo->fStartX = - ((scrWidth - (float) getLodWidth(lpSurfInfo->currLod, - lpTexInfo->aspectRatio) )/2.f); - ret = modf((double) lpSurfInfo->fStartX, &dNonFrac); - lpSurfInfo->rStartX = (float) dNonFrac; - - lpSurfInfo->fEndX = - (lpSurfInfo->fStartX + (float) getLodWidth(lpSurfInfo->currLod, - lpTexInfo->aspectRatio)); - ret = modf((double) lpSurfInfo->fEndX, &dNonFrac); - lpSurfInfo->rEndX = (float) dNonFrac; - - lpSurfInfo->fStartY = - ((scrHeight - (float) getLodHeight(lpSurfInfo->currLod, - lpTexInfo->aspectRatio) )/2.f); - ret = modf((double) lpSurfInfo->fStartY, &dNonFrac); - lpSurfInfo->rStartY = (float) dNonFrac; - - lpSurfInfo->fEndY = - (lpSurfInfo->fStartY + (float) getLodHeight(lpSurfInfo->currLod, - lpTexInfo->aspectRatio)); - ret = modf((double) lpSurfInfo->fEndY, &dNonFrac); - lpSurfInfo->rEndY = (float) dNonFrac; - /* done with surface coords */ -} - diff --git a/glide2x/sst1/glide/tests/qatest00.h b/glide2x/sst1/glide/tests/qatest00.h deleted file mode 100644 index 45822c8..0000000 --- a/glide2x/sst1/glide/tests/qatest00.h +++ /dev/null @@ -1,94 +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 _QATEST00_H_ -#define _QATEST00_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#define RED_565 0xF800 -#define GRN_565 0x07E0 -#define BLU_565 0x001F -#define RED_1555 0x7C00 -#define GRN_1555 0x03E0 -#define BLU_1555 0x001F -#define RED_4444 0x0F00 -#define GRN_4444 0x00F0 -#define BLU_4444 0x000F -#define RED_332 0x00E0 -#define GRN_332 0x001C -#define BLU_332 0x0003 -#define RED_8332 0x00E0 -#define GRN_8332 0x001C -#define BLU_8332 0x0003 - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - -typedef enum { DISABLE, NEAREST, TRILINEAR, DITHRD_NREST, DITHRD_TRILIN } MipMapMode_t; -typedef enum { SCALE_IN=1, SCALE_OUT=-1 } ScaleDir_t; //sign -typedef enum { SCALE_1=0, SCALE_2, SCALE_4, SCALE_8, SCALE_16, SCALE_32 } ScaleAmt_t;//bitwise shift factor -typedef enum { BOTH_POINT, MIN_BILNEAR, MAG_BILNEAR, BOTH_BILNEAR } FilterMode_t; - -typedef struct { - float fStartX, fEndX; - float rStartX, rEndX; - float fStartY, fEndY; - float rStartY, rEndY; - GrLOD_t currLod; -} surfInfo_t; - -typedef struct { - const char *lpzTexFileName; - TlTexture *lpTlTexture; - hTexId_t hTexture; - surfInfo_t surfInfo; -} myTexture_t; - -typedef struct -{ - float sMult; - float tMult; -} TexCoordFactors; - - -static void doHelp( void ); -static hTexId_t doLoadTexture( const char *lpzFileName, GrTexInfo *tEtTexInfo, - FxU16 *yColors, FxBool isDwnldble ); -static void doUnloadTextures( ); -static void doScaleScreenSurf( hTexId_t deTexId, ScaleDir_t deDir, ScaleAmt_t deAmt ); -static void getFgVerts( hTexId_t deTexId, GrVertex *deFgVerts ); -static int getLodWidth( GrLOD_t lod, GrAspectRatio_t aspect ); -static int getLodHeight( GrLOD_t lod, GrAspectRatio_t aspect ); -static void getLodToDwnld( ); -static void getLodPrtlToDwnld( ); -static void doResetFgVerts( hTexId_t deTexId ); - -#ifdef NDEBUG -#undef NDEBUG -#endif - -#ifdef __cplusplus -} -#endif -#endif diff --git a/glide2x/sst1/glide/tests/qatest01.c b/glide2x/sst1/glide/tests/qatest01.c deleted file mode 100644 index 7bb7848..0000000 --- a/glide2x/sst1/glide/tests/qatest01.c +++ /dev/null @@ -1,172 +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 -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - -#define RED_565 0xF800 -#define GRN_565 0x07E0 -#define BLU_565 0x001F -#define INVBLU_565 0xFFE0 -#define INVGRN_565 0xF81F -#define INVRED_565 0x07FF -#define WHT_565 0xFFFF -#define BLK_565 0x0000 - -#define NUM_X_BLCKS 7 -#define NUM_Y_BLCKS 7 - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "QATEST01"; -static const char purpose[] = "Buffer Swap Alliance bug"; -static const char usage[] = "-n -r -d "; - - -void -main( int argc, char **argv) -{ - /* Definitions */ - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - - GrLfbInfo_t myLfbInfo; - int nBlckWdth; - int nBlckHght; - - FxU16 yBlckClrs[NUM_Y_BLCKS][NUM_X_BLCKS] = - {{RED_565, GRN_565, BLU_565, INVRED_565, INVGRN_565, INVBLU_565, WHT_565}, - {RED_565, GRN_565, BLU_565, INVRED_565, INVGRN_565, INVBLU_565, WHT_565}, - {RED_565, GRN_565, BLU_565, INVRED_565, INVGRN_565, INVBLU_565, WHT_565}, - {RED_565, GRN_565, BLU_565, INVRED_565, INVGRN_565, INVBLU_565, WHT_565}, - {RED_565, GRN_565, BLU_565, INVRED_565, INVGRN_565, INVBLU_565, WHT_565}, - {RED_565, GRN_565, BLU_565, INVRED_565, INVGRN_565, INVBLU_565, WHT_565}, - {BLK_565, BLK_565, BLK_565, BLK_565, BLK_565, BLK_565, BLK_565}}; - - - /* Initializations */ - nBlckWdth = ((int) scrWidth / NUM_X_BLCKS); - nBlckHght = ((int) scrHeight / NUM_Y_BLCKS); - - /* Code */ - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs ) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - return; - } - 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_UPPER_LEFT, 2, 1 ) ); - - myLfbInfo.size = sizeof(GrLfbInfo_t); - if ( !grLfbLock(GR_LFB_WRITE_ONLY, GR_BUFFER_BACKBUFFER, GR_LFBWRITEMODE_565, - GR_ORIGIN_UPPER_LEFT, FXFALSE, &myLfbInfo)) - frames=0; - - while ( frames-- ) - { - int i, j, k, l; - FxU16 *lpPxl; - FxU32 stride = myLfbInfo.strideInBytes; - void *tmpLfb; - - tmpLfb = (void*) ((FxU16*)myLfbInfo.lfbPtr + 1 + 2*stride/2); - grBufferClear( 0xffffff, 0, GR_WDEPTHVALUE_FARTHEST ); - - for (i=0; i < NUM_Y_BLCKS; ++i) { - for (j=0; j < NUM_X_BLCKS; ++j) { - lpPxl = ((FxU16 *) tmpLfb + j*nBlckWdth) + - (i*nBlckHght*stride/2); - for(k=0; k < nBlckHght; ++k) { - for (l=0; l < nBlckWdth; ++l) { - *lpPxl = yBlckClrs[i][j]; - ++lpPxl; - } - lpPxl += (stride/2 - nBlckWdth); /* inc in pixel space */ - } - } - } - - grBufferSwap( 1 ); - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - if ( tlKbHit() ) frames = 0; - } - grLfbUnlock( GR_LFB_WRITE_ONLY, GR_BUFFER_BACKBUFFER ); - grGlideShutdown(); - return; -} diff --git a/glide2x/sst1/glide/tests/rgb332.3df b/glide2x/sst1/glide/tests/rgb332.3df deleted file mode 100644 index f06219a..0000000 Binary files a/glide2x/sst1/glide/tests/rgb332.3df and /dev/null differ diff --git a/glide2x/sst1/glide/tests/rgb565.3df b/glide2x/sst1/glide/tests/rgb565.3df deleted file mode 100644 index e5fbeda..0000000 --- a/glide2x/sst1/glide/tests/rgb565.3df +++ /dev/null @@ -1,748 +0,0 @@ -3df v1.1 -rgb565 -lod range: 1 256 -aspect ratio: 1 1 -R‹R‹k/k/rÍjÍjÎjÍc/c/c/c/bŒbŒR‹R‹R -R -R‹R‹bŒbŒjÍj̓p{oƒp{ok-k-s/k/ƒÏƒÏ”2Œ1“ЋЃЃГЋЃЃЃЃГЋЃЃЃЃЃЃГЋЃЃÐc,c,ZJbJbŒbŒR‹R‹bŒbŒZÌZÌbŒbŒbŒbŒR‹R‹jÍjÍR‹R‹bŒbŒR‹R‹R‹R‹R‹R‹R -R -R -R -R‹R‹bŒbŒc-c-jÎjÍc/c/k/k/s/k/c/c/bŒbŒc/c/c/c/bŒbŒR‹R‹R -R -R‹R‹R -R -R‹R‹c/c/k/k/bJZJR -R -R‹R‹bŒbŒc/c/ZÌZÌbŒbŒR -R -R‹R‹R‹R‹bŒbŒk/k/“ГÐk/k/k-s-ƒÐƒÐƒÏƒÏ”2Œ1ƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÏƒÏ“ЋЃЃЃЃГЋЃЃÐk/k/bŒbŒR‹R‹ZJbJZÌZÌZJbJZÌZÌZÌZÌbŒbŒR‹R‹jÍjÍbŒbŒR‹R‹R‹R‹R‹R‹R -R -R -R -R‹R‹R‹R‹jÍjÍZÌZÌc/c/k/k/s/k/k/k/c/c/bŒbŒk/k/c/c/c/c/ƒÏƒÏZJbJR‹R‹R‹R‹R -R -R‹R‹k/k/rÍjÍjÎjÍc/c/c/c/bŒbŒR‹R‹R -R -R‹R‹bŒbŒjÍj̓p{oƒp{ok-k-s/k/ƒÏƒÏ”2Œ1“ЋЃЃГЋЃЃЃЃГЋЃЃЃЃЃЃГЋЃЃÐc,c,ZJbJbŒbŒR‹R‹bŒbŒZÌZÌbŒbŒbŒbŒR‹R‹jÍjÍR‹R‹bŒbŒR‹R‹R‹R‹R‹R‹R -R -R -R -R‹R‹bŒbŒc-c-jÎjÍc/c/k/k/s/k/c/c/bŒbŒc/c/c/c/bŒbŒR‹R‹R -R -R‹R‹R -R -R‹R‹c/c/k/k/bJZJR -R -R‹R‹bŒbŒc/c/ZÌZÌbŒbŒR -R -R‹R‹R‹R‹bŒbŒk/k/“ГÐk/k/k-s-ƒÐƒÐƒÏƒÏ”2Œ1ƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÏƒÏ“ЋЃЃЃЃГЋЃЃÐk/k/bŒbŒR‹R‹ZJbJZÌZÌZJbJZÌZÌZÌZÌbŒbŒR‹R‹jÍjÍbŒbŒR‹R‹R‹R‹R‹R‹R -R -R -R -R‹R‹R‹R‹jÍjÍZÌZÌc/c/k/k/s/k/k/k/c/c/bŒbŒk/k/c/c/c/c/ƒÏƒÏZJbJR‹R‹R‹R‹R -R -bbbbZZbbjËjË{.{.YÇYÇAGAGQEQEAGAGAÇAÇAGAGAEAEA†A†A†A†QEQEAÇAÇI†I†QÇQÇQÇQÇI‡I‡QÇQÇQÇQÇI†I†AGAGAEAEAEAEQÇQÇAGAGAEAEAGAGA†A†I†I†YÇYÇjŠjŠk/k/s-k-jËjËs-k-{,{,jÍjÍ{,{,{.{.{.{.k/k/s-k-jËjËrÍjÍk.k-s/k/jËjËr‰j‰bbZZjŠjŠjËjËr‰j‰jËjËrËjËjËjËrËjËjËjËrËjËjËjËrjY†Y†YEYEY†Y†iÇiÇs/k/bIbIY†Y†A&A&QÇQÇAGAGAÇAÇA†A†IEIEAGAGA†A†QEQEAÇAÇQÇQÇQÇQÇQÇQÇQÇQÇI†I†QÇQÇI†I†AGAGA$A$AÇAÇQÇQÇIEIEIEIEAGAGAÇAÇY†Y†bb{oƒpc,c,jÍjÍ{,{,jËjËs-k-k.k-{,{,{.{.k/k/s-k-{,{,jÍjÍ{.{.œ“œ“{.{.j‰j‰rIjIbbbIbIjŠjŠjËjËrËjËj‰j‰rËjËjŠjŠjËjËrËjËbŒbŒbbbbZZbbjËjË{.{.YÇYÇAGAGQEQEAGAGAÇAÇAGAGAEAEA†A†A†A†QEQEAÇAÇI†I†QÇQÇQÇQÇI‡I‡QÇQÇQÇQÇI†I†AGAGAEAEAEAEQÇQÇAGAGAEAEAGAGA†A†I†I†YÇYÇjŠjŠk/k/s-k-jËjËs-k-{,{,jÍjÍ{,{,{.{.{.{.k/k/s-k-jËjËrÍjÍk.k-s/k/jËjËr‰j‰bbZZjŠjŠjËjËr‰j‰jËjËrËjËjËjËrËjËjËjËrËjËjËjËrjY†Y†YEYEY†Y†iÇiÇs/k/bIbIY†Y†A&A&QÇQÇAGAGAÇAÇA†A†IEIEAGAGA†A†QEQEAÇAÇQÇQÇQÇQÇQÇQÇQÇQÇI†I†QÇQÇI†I†AGAGA$A$AÇAÇQÇQÇIEIEIEIEAGAGAÇAÇY†Y†bb{oƒpc,c,jÍjÍ{,{,jËjËs-k-k.k-{,{,{.{.k/k/s-k-{,{,jÍjÍ{.{.œ“œ“{.{.j‰j‰rIjIbbbIbIjŠjŠjËjËrËjËj‰j‰rËjËjŠjŠjËjËrËjËbŒbŒQEQE@å@åI$I$I$I$YÉYÉk-k-QEQEHäHä@ä@ä0Ä0ä0Ä0ä0Ä0ã0Ä0ã8Ä8äHäHäAEAEHäHä0Ä0ä@ä@ä0Ä0ä8ä8ã8Ä8ä8Ä8ä8Ä8ä8Ä8ä8ä8ã8Ä8äA$A$IEIE@ä@ä0Ä0ä0Ä0ä@å@åI$I$bIbI{.{.aÇaÇQEQEQEQEQEQEQEQEAGAGYEYEaÇaÇY†Y†I‡I‡aÇaÇaÇaÇbŒbŒc,c,QEQEQEQE@å@åQEQEI$I$HäHäYEYEYEYEYDYDYEYEYEYEYEYEYEYEYEYEYEYEYEYEY†Y†Y†Y†Y†Y†jÍjÍbb8Ä8ä@ä@ä@ä@ä0Ä0ã0Ä0ã8Ä8ä0Ä0ä@ä@äHäHäAEAE8Ã8Ä@ä@ä0Ä0ä@ä@ä0Ä0ä0Ä0ä8Ä8ä8Ä8ä8ä8ã8Ä8ä8Ä8äIEIE8Ä8ä8Ä8ä0Ä0ã8Ä8äQEQEYEYEk/k/rjYEYEA&A&QEQEQEQEQEQEYEYEI‡I‡a†a†aÇaÇI‡I‡Y†Y†jIjIƒÒƒÑZZQEQE@ä@äQEQEQEQEI$I$YEYEYDYDYEYEYDYDYEYEYEYEYEYEYEYEQEQE@å@åI$I$I$I$YÉYÉk-k-QEQEHäHä@ä@ä0Ä0ä0Ä0ä0Ä0ã0Ä0ã8Ä8äHäHäAEAEHäHä0Ä0ä@ä@ä0Ä0ä8ä8ã8Ä8ä8Ä8ä8Ä8ä8Ä8ä8ä8ã8Ä8äA$A$IEIE@ä@ä0Ä0ä0Ä0ä@å@åI$I$bIbI{.{.aÇaÇQEQEQEQEQEQEQEQEAGAGYEYEaÇaÇY†Y†I‡I‡aÇaÇaÇaÇbŒbŒc,c,QEQEQEQE@å@åQEQEI$I$HäHäYEYEYEYEYDYDYEYEYEYEYEYEYEYEYEYEYEYEYEYEY†Y†Y†Y†Y†Y†jÍjÍbb8Ä8ä@ä@ä@ä@ä0Ä0ã0Ä0ã8Ä8ä0Ä0ä@ä@äHäHäAEAE8Ã8Ä@ä@ä0Ä0ä@ä@ä0Ä0ä0Ä0ä8Ä8ä8Ä8ä8ä8ã8Ä8ä8Ä8äIEIE8Ä8ä8Ä8ä0Ä0ã8Ä8äQEQEYEYEk/k/rjYEYEA&A&QEQEQEQEQEQEYEYEI‡I‡a†a†aÇaÇI‡I‡Y†Y†jIjIƒÒƒÑZZQEQE@ä@äQEQEQEQEI$I$YEYEYDYDYEYEYDYDYEYEYEYEYEYEYEYEY†Y†YEYEA&A&@å@åaÇaÇjÍjÍQEQE@ä@ä8Ä8ä0Ä0ã(ä(ä(ä(ä8Ä8ä0Ä0ä8Ä8äAEAE@ä@ä0Ä0ä0Ä0ã8Ä8ä0Ä0ä(ä(ä8Ä8ä(ä(ä9$9$8Ä8ä8Ä8ä9E9E8Ä8ä8Ä8ä8Ä8ä8ä8ã8Ä8äQEQEjjs/k/I‡I‡QEQEA&A&YEYEI‡I‡Y†Y†I‡I‡Y†Y†I‡I‡aÇaÇI‡I‡a†a†{.{.bŒbŒY†Y†QEQEA&A&QEQEA&A&QEQEQEQEQEQEHäHäYEYEa†a†Y†Y†Y†Y†I‡I‡Y†Y†I‡I‡YEYEY†Y†Y†Y†bŒbŒR -R -HäHä@ä@ä0Ä0ã(ä(ä(ä(ä(ä(ä0Ä0ä@ä@ä8Ä8ä@å@å0Ã0ä8Ä8ä0Ä0ã(ä(ä0Ä0ä8Ä8ä8Ä8ä(ä(ä8Ä8äA$A$8Ä8ä9E9E@ä@ä8Ä8äA$A$8Ä8ä@å@åY†Y†k/k/bbAGAGQEQEAGAGYEYEI‡I‡aÇaÇI‡I‡aÇaÇI‡I‡Y†Y†YÉYÉjIjIƒo{pI‡I‡YEYEAGAGQEQEA&A&QEQEQEQEQEQEQEQEQEQEQEQEY†Y†QEQEY†Y†Y†Y†YEYEA&A&@å@åaÇaÇjÍjÍQEQE@ä@ä8Ä8ä0Ä0ã(ä(ä(ä(ä8Ä8ä0Ä0ä8Ä8äAEAE@ä@ä0Ä0ä0Ä0ã8Ä8ä0Ä0ä(ä(ä8Ä8ä(ä(ä9$9$8Ä8ä8Ä8ä9E9E8Ä8ä8Ä8ä8Ä8ä8ä8ã8Ä8äQEQEjjs/k/I‡I‡QEQEA&A&YEYEI‡I‡Y†Y†I‡I‡Y†Y†I‡I‡aÇaÇI‡I‡a†a†{.{.bŒbŒY†Y†QEQEA&A&QEQEA&A&QEQEQEQEQEQEHäHäYEYEa†a†Y†Y†Y†Y†I‡I‡Y†Y†I‡I‡YEYEY†Y†Y†Y†bŒbŒR -R -HäHä@ä@ä0Ä0ã(ä(ä(ä(ä(ä(ä0Ä0ä@ä@ä8Ä8ä@å@å0Ã0ä8Ä8ä0Ä0ã(ä(ä0Ä0ä8Ä8ä8Ä8ä(ä(ä8Ä8äA$A$8Ä8ä9E9E@ä@ä8Ä8äA$A$8Ä8ä@å@åY†Y†k/k/bbAGAGQEQEAGAGYEYEI‡I‡aÇaÇI‡I‡aÇaÇI‡I‡Y†Y†YÉYÉjIjIƒo{pI‡I‡YEYEAGAGQEQEA&A&QEQEQEQEQEQEQEQEQEQEQEQEY†Y†QEQEY†Y†Y†Y†A&A&@å@åA$A$YÉYÉc,c,YEYE8Ä8ä8Ä8ä ä ä0Ä0ä0Ä0ã(ä(ä8Ä8äA$A$@å@å8Ä8ä8Ä8äA$A$(ä(ä8Ä8ä(ä(ä8Ä8ä8Ä8ä9$9$8Ä8ä9$9$@å@åIEIE8Ä8ä8Ä8ä9$9$8Ä8äIEIEZZk/k/aÇaÇI‡I‡YEYEI‡I‡AGAGY†Y†I‡I‡aÇaÇI‡I‡Y†Y†I‡I‡aÇaÇ{.{.k/k/QEQEQEQEA&A&QEQEA&A&I†I†A&A&I‡I‡QEQEAGAGYEYEAGAGaÇaÇYÉYÉaÇaÇYÉYÉaÇaÇYÉYÉI‡I‡jÎjÍrj@ä@ä8Ä8ä ä ä0Ä0ä0Ä0ä0Ä0ã8Ä8ä8Ä8äA$A$A$A$8Ä8äA$A$(ä(ä8Ä8ä8Ä8ä(ä(ä8Ä8ä9$9$8Ä8ä8Ä8ä9E9E@å@åAEAE0Ä0ä0Ä0ã8Ä8äIEIEQEQEk/k/bJZJY†Y†Y†Y†YEYEI‡I‡AGAGI‡I‡Y†Y†I‡I‡aÇaÇI‡I‡Y†Y†jŠjŠ{oƒpYÈYÉQEQEA&A&@å@åQEQEA&A&AGAGA&A&I‡I‡QEQEYÉYÉQEQEAGAGY†Y†Y†Y†A&A&@å@åA$A$YÉYÉc,c,YEYE8Ä8ä8Ä8ä ä ä0Ä0ä0Ä0ã(ä(ä8Ä8äA$A$@å@å8Ä8ä8Ä8äA$A$(ä(ä8Ä8ä(ä(ä8Ä8ä8Ä8ä9$9$8Ä8ä9$9$@å@åIEIE8Ä8ä8Ä8ä9$9$8Ä8äIEIEZZk/k/aÇaÇI‡I‡YEYEI‡I‡AGAGY†Y†I‡I‡aÇaÇI‡I‡Y†Y†I‡I‡aÇaÇ{.{.k/k/QEQEQEQEA&A&QEQEA&A&I†I†A&A&I‡I‡QEQEAGAGYEYEAGAGaÇaÇYÉYÉaÇaÇYÉYÉaÇaÇYÉYÉI‡I‡jÎjÍrj@ä@ä8Ä8ä ä ä0Ä0ä0Ä0ä0Ä0ã8Ä8ä8Ä8äA$A$A$A$8Ä8äA$A$(ä(ä8Ä8ä8Ä8ä(ä(ä8Ä8ä9$9$8Ä8ä8Ä8ä9E9E@å@åAEAE0Ä0ä0Ä0ã8Ä8äIEIEQEQEk/k/bJZJY†Y†Y†Y†YEYEI‡I‡AGAGI‡I‡Y†Y†I‡I‡aÇaÇI‡I‡Y†Y†jŠjŠ{oƒpYÈYÉQEQEA&A&@å@åQEQEA&A&AGAGA&A&I‡I‡QEQEYÉYÉQEQEAGAGY†Y†QÇQÇI‡I‡A&A&@å@åbbc/c/YEYE8Ä8ä8Ä8ä(ä(ä(ä(ä8Ä8ä0Ä0ã(ä(ä8Ä8äA$A$8Ä8äA$A$8Ä8ä(ä(ä8Ä8ä(ä(ä0å0å9$9$(ä(ä8Ä8ä8Ä8ä9E9E@å@åAEAE0Ä0ä0Ä0ã8Ä8äQEQEYÉYÉjËjËYÉYÉaÇaÇI‡I‡YEYEI‡I‡AGAGY†Y†I‡I‡YÉYÉI‡I‡aÇaÇYÉYÉjËjËbŒbŒIEIE0æ0æ(ä(ä(ä(ä å å0å0å9E9EA&A&A&A&YEYEI‡I‡aÇaÇI‡I‡YÉYÉYÇYÇYÉYÉQÇQÇYÉYÉYÇYÇjÍjÍbJZJHäHä0Ä0ä0Ä0ä0Ä0ã(ä(ä(ä(ä0Ä0ä8Ä8ä8Ä8äA$A$8Ä8ä8Ä8ä8Ä8ä(ä(ä8Ä8ä(ä(ä9$9$(ä(ä8Ä8äA$A$8Ä8ä9E9E@å@å8ã8ä8Ä8ä8Ä8ä9E9EQEQEjÍjÍbbYÉYÉaÇaÇAGAGI†I†I‡I‡YEYEI‡I‡YÉYÉYEYEI‡I‡YÉYÉjIjIƒo{pAFAG9E9E0å0å(ä(ä(ä(ä(å(å9E9E0å0åA&A&AGAGYÇYÇI‡I‡YEYEYÉYÉQÇQÇI‡I‡A&A&@å@åbbc/c/YEYE8Ä8ä8Ä8ä(ä(ä(ä(ä8Ä8ä0Ä0ã(ä(ä8Ä8äA$A$8Ä8äA$A$8Ä8ä(ä(ä8Ä8ä(ä(ä0å0å9$9$(ä(ä8Ä8ä8Ä8ä9E9E@å@åAEAE0Ä0ä0Ä0ã8Ä8äQEQEYÉYÉjËjËYÉYÉaÇaÇI‡I‡YEYEI‡I‡AGAGY†Y†I‡I‡YÉYÉI‡I‡aÇaÇYÉYÉjËjËbŒbŒIEIE0æ0æ(ä(ä(ä(ä å å0å0å9E9EA&A&A&A&YEYEI‡I‡aÇaÇI‡I‡YÉYÉYÇYÇYÉYÉQÇQÇYÉYÉYÇYÇjÍjÍbJZJHäHä0Ä0ä0Ä0ä0Ä0ã(ä(ä(ä(ä0Ä0ä8Ä8ä8Ä8äA$A$8Ä8ä8Ä8ä8Ä8ä(ä(ä8Ä8ä(ä(ä9$9$(ä(ä8Ä8äA$A$8Ä8ä9E9E@å@å8ã8ä8Ä8ä8Ä8ä9E9EQEQEjÍjÍbbYÉYÉaÇaÇAGAGI†I†I‡I‡YEYEI‡I‡YÉYÉYEYEI‡I‡YÉYÉjIjIƒo{pAFAG9E9E0å0å(ä(ä(ä(ä(å(å9E9E0å0åA&A&AGAGYÇYÇI‡I‡YEYEYÉYÉYÇYÇAGAG@å@åI$I$ZZk/k/YEYE8Ä8ä8Ä8ä8Ä8ä(ä(ä(ä(ä0Ä0ã8Ä8ä8Ä8ä8Ä8äA$A$0Ä0ä0Ä0ã8Ä8ä8Ä8ä8ä8ã8Ä8ä8Ä8äA$A$8Ä8ä0Ä0ã8Ä8äIEIEHäHä0Ä0ä8ä8ã@å@åHäHäYÇYÇc,c,jjYÉYÉaÇaÇAGAGI‡I‡I‡I‡YÉYÉaÇaÇI‡I‡aÇaÇI‡I‡a†a†ZJbJZJbJ(ä(ä0å0å1†1†Ä Ä å å å å0æ0æ ä ä ä ä8Ä8äA&A&AGAGQÇQÇI†I†I‡I‡IEIEAGAGAGAGY†Y†c/c/ZZHãHä@ä@ä0Ä0ä0Ä0ã(ä(ä(ä(ä@ä@ä0Ä0ã8Ä8äA$A$8Ä8ä9$9$0Ä0ã8Ä8ä8ä8ã8Ä8ä8Ä8äA$A$8Ä8ä8Ä8ä0Ä0ãIEIE@å@å8ã8ä8Ä8ä8ä8ãI$I$QEQEbŒbŒbIbIjjI‡I‡aÇaÇI‡I‡I‡I‡I‡I‡YÉYÉaÇaÇI‡I‡YÉYÉY†Y†jjs/k/9E9E0å0å0æ0æ å å å å(å(å å å å å(ä(ä8Ä8äAÇAÇ8Ä8ä0å0åQÇQÇYÇYÇAGAG@å@åI$I$ZZk/k/YEYE8Ä8ä8Ä8ä8Ä8ä(ä(ä(ä(ä0Ä0ã8Ä8ä8Ä8ä8Ä8äA$A$0Ä0ä0Ä0ã8Ä8ä8Ä8ä8ä8ã8Ä8ä8Ä8äA$A$8Ä8ä0Ä0ã8Ä8äIEIEHäHä0Ä0ä8ä8ã@å@åHäHäYÇYÇc,c,jjYÉYÉaÇaÇAGAGI‡I‡I‡I‡YÉYÉaÇaÇI‡I‡aÇaÇI‡I‡a†a†ZJbJZJbJ(ä(ä0å0å1†1†Ä Ä å å å å0æ0æ ä ä ä ä8Ä8äA&A&AGAGQÇQÇI†I†I‡I‡IEIEAGAGAGAGY†Y†c/c/ZZHãHä@ä@ä0Ä0ä0Ä0ã(ä(ä(ä(ä@ä@ä0Ä0ã8Ä8äA$A$8Ä8ä9$9$0Ä0ã8Ä8ä8ä8ã8Ä8ä8Ä8äA$A$8Ä8ä8Ä8ä0Ä0ãIEIE@å@å8ã8ä8Ä8ä8ä8ãI$I$QEQEbŒbŒbIbIjjI‡I‡aÇaÇI‡I‡I‡I‡I‡I‡YÉYÉaÇaÇI‡I‡YÉYÉY†Y†jjs/k/9E9E0å0å0æ0æ å å å å(å(å å å å å(ä(ä8Ä8äAÇAÇ8Ä8ä0å0åQÇQÇY†Y†AGAGI†I†A&A&YÉYÉk/k/YÉYÉAGAG9E9E0å0å8Ä8ä(ä(ä0å0å(ä(ä0Ä0ä0Ä0ã ä ä0Ä0ã0Ä0ä0Ä0ä1$1$0Ä0ä0Ä0ä9$9$9E9E0å0å8Ä8ä0æ0æA&A&9E9E0å0åAGAGAGAGI†I†ZJbJbŒbŒI‡I‡AGAGI†I†I‡I‡aÇaÇAGAGY†Y†AGAGI‡I‡YEYEA&A&AGAG{,{,k/k/0Ã0ä9E9EI‡I‡A&A&@å@åA$A$9E9EA&A&@å@åAEAEY†Y†I‡I‡A&A&I†I†A&A&IEIEA&A&9E9EI‡I‡c/c/bŒbŒAGAGIEIE0å0å0å0å(ä(ä8Ä8ä(ä(ä(ä(ä0Ä0ä0Ä0ã ä ã0Ä0ã(ä(ä8Ä8ä(ä(ä8Ä8ä1$1$0æ0æ9E9E(ä(ä0å0åA&A&@å@å0æ0æAGAGAGAGAGAGYÉYÉZÌZÌYÉYÉAGAGAGAGQÇQÇI‡I‡Y†Y†I‡I‡YEYEI‡I‡AGAGAGAGQEQEbbƒÒƒÑ9†9†0å0åQÇQÇAGAGA$A$9E9E@å@å9E9E@å@åAEAEQEQEA&A&9E9EA&A&Y†Y†AGAGI†I†A&A&YÉYÉk/k/YÉYÉAGAG9E9E0å0å8Ä8ä(ä(ä0å0å(ä(ä0Ä0ä0Ä0ã ä ä0Ä0ã0Ä0ä0Ä0ä1$1$0Ä0ä0Ä0ä9$9$9E9E0å0å8Ä8ä0æ0æA&A&9E9E0å0åAGAGAGAGI†I†ZJbJbŒbŒI‡I‡AGAGI†I†I‡I‡aÇaÇAGAGY†Y†AGAGI‡I‡YEYEA&A&AGAG{,{,k/k/0Ã0ä9E9EI‡I‡A&A&@å@åA$A$9E9EA&A&@å@åAEAEY†Y†I‡I‡A&A&I†I†A&A&IEIEA&A&9E9EI‡I‡c/c/bŒbŒAGAGIEIE0å0å0å0å(ä(ä8Ä8ä(ä(ä(ä(ä0Ä0ä0Ä0ã ä ã0Ä0ã(ä(ä8Ä8ä(ä(ä8Ä8ä1$1$0æ0æ9E9E(ä(ä0å0åA&A&@å@å0æ0æAGAGAGAGAGAGYÉYÉZÌZÌYÉYÉAGAGAGAGQÇQÇI‡I‡Y†Y†I‡I‡YEYEI‡I‡AGAGAGAGQEQEbbƒÒƒÑ9†9†0å0åQÇQÇAGAGA$A$9E9E@å@å9E9E@å@åAEAEQEQEA&A&9E9EA&A&{.{.jËjËs-k-jËjËs-k-{.{.k-k-bJZJbŒbŒbŒbŒZJbJR -R -bJZJR‹R‹ZJbJc,c,ZJbJR‹R‹ZJbJR‹R‹ZJbJZJbJRŠRŠbŒbŒZJbJc,c,bŒbŒk,k,s/k/{.{.{.{.k-k-s.k-k-k-c,c,k-k-bŒbŒbŒbŒJJYÉYÉZJbJR -R -R‹R‹YÉYÉR‹R‹bŒbŒR‹R‹bŒbŒ{oƒpƒÐƒÐk/k/bŒbŒk-k-rËjË{,{,{.{.{.{.{oƒp{oƒps,{,ƒÐƒÐ“ЋЃЃЃЃÐ{oƒp{,{,k/k/k/s/k-k-{.{.{,{,bŒbŒbŒbŒbŒbŒZJbJZIZIR‹R‹ZJbJZJbJbŒbŒZÌZÌZJbJZJbJZJbJR‹R‹ZJbJR‹R‹jŠjŠZJbJbŒbŒZÌZÌjËjËs/k/ƒÐƒÐk,k,s-k-k.k-s-k-bŒbŒ{.{.k-k-bŒbŒZIZIJJR -R -bJZJbJZJR -R -R -R -ZÌZÌZJbJbŒbŒc/c/ƒÐƒÐ{.{.c,c,bŒbŒ{.{.jËjË{.{.{.{.{oƒp{oƒps,{,{oƒp‹Ð“Ð{oƒp{o{p{.{.jËjËs-k-jËjËs-k-{.{.k-k-bJZJbŒbŒbŒbŒZJbJR -R -bJZJR‹R‹ZJbJc,c,ZJbJR‹R‹ZJbJR‹R‹ZJbJZJbJRŠRŠbŒbŒZJbJc,c,bŒbŒk,k,s/k/{.{.{.{.k-k-s.k-k-k-c,c,k-k-bŒbŒbŒbŒJJYÉYÉZJbJR -R -R‹R‹YÉYÉR‹R‹bŒbŒR‹R‹bŒbŒ{oƒpƒÐƒÐk/k/bŒbŒk-k-rËjË{,{,{.{.{.{.{oƒp{oƒps,{,ƒÐƒÐ“ЋЃЃЃЃÐ{oƒp{,{,k/k/k/s/k-k-{.{.{,{,bŒbŒbŒbŒbŒbŒZJbJZIZIR‹R‹ZJbJZJbJbŒbŒZÌZÌZJbJZJbJZJbJR‹R‹ZJbJR‹R‹jŠjŠZJbJbŒbŒZÌZÌjËjËs/k/ƒÐƒÐk,k,s-k-k.k-s-k-bŒbŒ{.{.k-k-bŒbŒZIZIJJR -R -bJZJbJZJR -R -R -R -ZÌZÌZJbJbŒbŒc/c/ƒÐƒÐ{.{.c,c,bŒbŒ{.{.jËjË{.{.{.{.{oƒp{oƒps,{,{oƒp‹Ð“Ð{oƒp{o{pIEIEIEIEQEQEQEQEQEQEQEQEI$I$8Ä8äIEIEAEAEAEAE@å@åIEIEQEQEbbZJbJAÇAÇa†a†QEQEQEQEYEYEY†Y†YEYEQEQEIEIEQEQEQEQEQÇQÇIÇIÇbŒbŒZZQÇQÇQEQEY†Y†AGAGQEQEQEQEA&A&I†I†AGAGA†A†I†I†I‡I‡QÇQÇYÇYÇYÉYÉbbQÇQÇYÇYÇYÉYÉRRZZZZYÉYÉYÇYÇZZZZZJbJjŠjŠbbbbYÇYÇZZZZYÇYÇY†Y†Y†Y†Y†Y†QEQEQEQEQEQE8Ä8äAEAEI$I$A&A&IEIE@å@åQEQEY†Y†bŒbŒIÇIÇQÇQÇYEYEQEQEQEQEY†Y†YEYEY†Y†AEAEIEIEQEQEQEQEQÇQÇR‹R‹bIbIYÇYÇY†Y†I†I†Y†Y†AGAGIEIEQEQEAGAGQEQEAGAGAGAGQÇQÇI†I†YÉYÉYÇYÇYÉYÉYÇYÇRRYÇYÇYÉYÉZIZIZIZIYÇYÇRRZZZZbbbŒbŒbbbbAGAGA$A$A†A†IEIEIEIEQEQEQEQEQEQEQEQEI$I$8Ä8äIEIEAEAEAEAE@å@åIEIEQEQEbbZJbJAÇAÇa†a†QEQEQEQEYEYEY†Y†YEYEQEQEIEIEQEQEQEQEQÇQÇIÇIÇbŒbŒZZQÇQÇQEQEY†Y†AGAGQEQEQEQEA&A&I†I†AGAGA†A†I†I†I‡I‡QÇQÇYÇYÇYÉYÉbbQÇQÇYÇYÇYÉYÉRRZZZZYÉYÉYÇYÇZZZZZJbJjŠjŠbbbbYÇYÇZZZZYÇYÇY†Y†Y†Y†Y†Y†QEQEQEQEQEQE8Ä8äAEAEI$I$A&A&IEIE@å@åQEQEY†Y†bŒbŒIÇIÇQÇQÇYEYEQEQEQEQEY†Y†YEYEY†Y†AEAEIEIEQEQEQEQEQÇQÇR‹R‹bIbIYÇYÇY†Y†I†I†Y†Y†AGAGIEIEQEQEAGAGQEQEAGAGAGAGQÇQÇI†I†YÉYÉYÇYÇYÉYÉYÇYÇRRYÇYÇYÉYÉZIZIZIZIYÇYÇRRZZZZbbbŒbŒbbbbAGAGA$A$A†A†8Ä8ä0å0å@å@åA&A&@å@å@å@å8Ä8ä9E9E8Ä8ä@å@å@å@åA$A$IEIEA&A&jjc/c/Y†Y†YEYEa†a†YEYEY†Y†Y†Y†aÇaÇY†Y†AGAGQÇQÇA†A†IEIEI‡I‡c.c-ZZAGAGQEQEA&A&IEIE@å@å9E9EA&A&@å@åAEAE8Ä8äA&A&IEIEA&A&QEQEA&A&QEQEA&A&AGAGAEAE@å@åA$A$8Ä8äA&A&AGAGAGAGYEYEYÉYÉZZYEYEA&A&YEYEA&A&QEQEA&A&QEQE@å@å@å@åQEQE@å@å8Ä8ä9E9E8Ä8ä@å@å8Ä8ä9E9EA&A&QEQEY†Y†k/k/ZZYEYEY†Y†YEYEaÇaÇYEYEI‡I‡Y†Y†QÇQÇY†Y†I†I†AGAGAGAGbŒbŒZJbJI†I†A&A&AGAG@å@åQEQE@å@å9E9EA&A&8Ä8ä9E9EA&A&A&A&@å@åIEIEIEIEIEIEA&A&I†I†A&A&IEIE0å0å8Ä8ä@å@åA&A&AGAGQEQEY†Y†bbI‡I‡QEQE@ä@ä8Ä8ä0å0å8ä8Ä0å0å@å@åA&A&@å@å@å@å8Ä8ä9E9E8Ä8ä@å@å@å@åA$A$IEIEA&A&jjc/c/Y†Y†YEYEa†a†YEYEY†Y†Y†Y†aÇaÇY†Y†AGAGQÇQÇA†A†IEIEI‡I‡c.c-ZZAGAGQEQEA&A&IEIE@å@å9E9EA&A&@å@åAEAE8Ä8äA&A&IEIEA&A&QEQEA&A&QEQEA&A&AGAGAEAE@å@åA$A$8Ä8äA&A&AGAGAGAGYEYEYÉYÉZZYEYEA&A&YEYEA&A&QEQEA&A&QEQE@å@å@å@åQEQE@å@å8Ä8ä9E9E8Ä8ä@å@å8Ä8ä9E9EA&A&QEQEY†Y†k/k/ZZYEYEY†Y†YEYEaÇaÇYEYEI‡I‡Y†Y†QÇQÇY†Y†I†I†AGAGAGAGbŒbŒZJbJI†I†A&A&AGAG@å@åQEQE@å@å9E9EA&A&8Ä8ä9E9EA&A&A&A&@å@åIEIEIEIEIEIEA&A&I†I†A&A&IEIE0å0å8Ä8ä@å@åA&A&AGAGQEQEY†Y†bbI‡I‡QEQE@ä@ä8Ä8ä0å0å8Ä8äA$A$@å@åA$A$9E9E@å@å9$9$0å0å9E9E8Ä8ä9E9EA&A&@å@åY†Y†bbbŒbŒ@å@åYEYEY†Y†aÇaÇY†Y†Y†Y†Y†Y†aÇaÇI‡I‡QÇQÇAGAGI‡I‡AÇAÇbŒbŒaÇaÇI†I†A&A&IEIEA&A&@å@å@å@åIEIE@å@å9E9E@å@å9E9EA&A&QEQEA&A&QEQEA&A&AGAGQEQEA&A&IEIE0æ0æ9E9EA&A&IEIEA&A&QEQEa†a†YÉYÉAGAGYEYEI‡I‡A&A&YEYEA&A&QEQE@å@å@å@å9$9$@å@å8Ä8ä0å0å9E9E8Ä8ä9E9EA&A&@å@åIEIEI‡I‡jÎjÍI†I†YEYEY†Y†Y†Y†Y†Y†a†a†a†a†aÇaÇY†Y†I‡I‡I‡I‡I‡I‡9†9†ZIZIjŠjŠI‡I‡A&A&QEQE@å@å9E9EA&A&@å@åAEAE8Ä8äIEIE@å@å9E9EQEQEA&A&QEQEA&A&AGAGQEQE@å@åA&A&A&A&9$9$A&A&A&A&IEIEA&A&Y†Y†YÉYÉYEYEI‡I‡YEYEA&A&8Ä8ä8ä8ÄA$A$@å@åA$A$9E9E@å@å9$9$0å0å9E9E8Ä8ä9E9EA&A&@å@åY†Y†bbbŒbŒ@å@åYEYEY†Y†aÇaÇY†Y†Y†Y†Y†Y†aÇaÇI‡I‡QÇQÇAGAGI‡I‡AÇAÇbŒbŒaÇaÇI†I†A&A&IEIEA&A&@å@å@å@åIEIE@å@å9E9E@å@å9E9EA&A&QEQEA&A&QEQEA&A&AGAGQEQEA&A&IEIE0æ0æ9E9EA&A&IEIEA&A&QEQEa†a†YÉYÉAGAGYEYEI‡I‡A&A&YEYEA&A&QEQE@å@å@å@å9$9$@å@å8Ä8ä0å0å9E9E8Ä8ä9E9EA&A&@å@åIEIEI‡I‡jÎjÍI†I†YEYEY†Y†Y†Y†Y†Y†a†a†a†a†aÇaÇY†Y†I‡I‡I‡I‡I‡I‡9†9†ZIZIjŠjŠI‡I‡A&A&QEQE@å@å9E9EA&A&@å@åAEAE8Ä8äIEIE@å@å9E9EQEQEA&A&QEQEA&A&AGAGQEQE@å@åA&A&A&A&9$9$A&A&A&A&IEIEA&A&Y†Y†YÉYÉYEYEI‡I‡YEYEA&A&8Ä8ä8Ä8ä0æ0æ8Ä8ä9E9E8Ä8ä0å0å8Ä8ä9E9E@å@å0å0åA$A$9E9E@å@åIEIER -R -bŒbŒ8ã8äY†Y†a†a†Y†Y†a†a†a†a†aÇaÇa†a†I‡I‡QÇQÇI‡I‡AGAGZIZIZJbJYÉYÉIEIEA&A&A&A&IEIE@å@å9E9E@å@å9E9E@å@å9E9EA&A&A&A&AGAGI$I$A&A&IEIEA&A&AGAG@å@å9E9E8Ä8ä9E9EA&A&A&A&QEQEAGAGa†a†bbI‡I‡QEQEAGAGQEQEA&A&AGAGI$I$@å@å0å0å8Ä8ä9E9E8Ä8ä0æ0æA$A$0å0å@å@åA$A$9E9EA&A&YEYEjÍjÍA&A&QEQEY†Y†Y†Y†a†a†a†a†aÇaÇaÇaÇaÇaÇAGAGYÇYÇA†A†A&A&R‹R‹bbI‡I‡A&A&A&A&AEAEA&A&8Ä8äIEIE@å@å9E9E@å@å9E9EA&A&AGAGQEQEA&A&A&A&IEIEA&A&A&A&9E9E@å@å0å0åA†A†A&A&QEQEA&A&YEYEZJbJI‡I‡YEYEA&A&8Ä8ä@å@å8ä8Ä0æ0æ8ä8Ä9E9E8ä8Ä0å0å8ä8Ä9E9E@å@å0å0åA$A$9E9E@å@åIEIER -R -bŒbŒ8ã8äY†Y†a†a†Y†Y†a†a†a†a†aÇaÇa†a†I‡I‡QÇQÇI‡I‡AGAGZIZIZJbJYÉYÉIEIEA&A&A&A&IEIE@å@å9E9E@å@å9E9E@å@å9E9EA&A&A&A&AGAGI$I$A&A&IEIEA&A&AGAG@å@å9E9E8Ä8ä9E9EA&A&A&A&QEQEAGAGa†a†bbI‡I‡QEQEAGAGQEQEA&A&AGAGI$I$@å@å0å0å8Ä8ä9E9E8Ä8ä0æ0æA$A$0å0å@å@åA$A$9E9EA&A&YEYEjÍjÍA&A&QEQEY†Y†Y†Y†a†a†a†a†aÇaÇaÇaÇaÇaÇAGAGYÇYÇA†A†A&A&R‹R‹bbI‡I‡A&A&A&A&AEAEA&A&8Ä8äIEIE@å@å9E9E@å@å9E9EA&A&AGAGQEQEA&A&A&A&IEIEA&A&A&A&9E9E@å@å0å0åA†A†A&A&QEQEA&A&YEYEZJbJI‡I‡YEYEA&A&8Ä8ä@å@å8Ä8ä1$1$8Ä8ä0æ0æ8Ä8äA$A$(ä(ä0å0å@å@å9$9$@å@å9E9E8å8åA&A&YÉYÉZÌZÌY†Y†aÇaÇa†a†iÇiÇzzzzzzjjrjAGAGI†I†A†A†YÉYÉbŒbŒQÇQÇIEIEA&A&IEIEA&A&0å0å@å@å9E9E8å8åIEIEA&A&9E9EA&A&QEQEA&A&IEIEA&A&A&A&IEIE@å@å9E9E8Ä8ä(ä(äA&A&IEIEA&A&YEYEYÉYÉR -R -YEYEAGAGQEQEA&A&QEQEAGAGQEQE8å8å8Ä8ä9E9E8Ä8ä8Ä8ä9$9$0å0å9E9E@å@å8Ä8ä@å@å9E9EI‡I‡bŒbŒYÉYÉY…Y…iÇiÇrjiÇiÇzzzzaÇaÇiÇiÇQÇQÇAGAGAGAGI‡I‡bŒbŒYÉYÉIEIEA&A&IEIE@å@å9E9E8å8å@å@å@å@å9E9EA&A&@å@åA&A&IEIEA&A&A&A&IEIEA&A&AGAGA&A&8Ä8ä9E9E8Ä8ä9E9EA&A&QEQEQEQEY†Y†ZJbJYÉYÉQEQE@å@å8Ä8äA$A$8ä8Ä1$1$8Ä8ä0æ0æ8Ä8äA$A$(ä(ä0å0å@å@å9$9$@å@å9E9E8å8åA&A&YÉYÉZÌZÌY†Y†aÇaÇa†a†iÇiÇzzzzzzjjrjAGAGI†I†A†A†YÉYÉbŒbŒQÇQÇIEIEA&A&IEIEA&A&0å0å@å@å9E9E8å8åIEIEA&A&9E9EA&A&QEQEA&A&IEIEA&A&A&A&IEIE@å@å9E9E8Ä8ä(ä(äA&A&IEIEA&A&YEYEYÉYÉR -R -YEYEAGAGQEQEA&A&QEQEAGAGQEQE8å8å8Ä8ä9E9E8Ä8ä8Ä8ä9$9$0å0å9E9E@å@å8Ä8ä@å@å9E9EI‡I‡bŒbŒYÉYÉY…Y…iÇiÇrjiÇiÇzzzzaÇaÇiÇiÇQÇQÇAGAGAGAGI‡I‡bŒbŒYÉYÉIEIEA&A&IEIE@å@å9E9E8å8å@å@å@å@å9E9EA&A&@å@åA&A&IEIEA&A&A&A&IEIEA&A&AGAGA&A&8Ä8ä9E9E8Ä8ä9E9EA&A&QEQEQEQEY†Y†ZJbJYÉYÉQEQE@å@å8Ä8äA$A$8Ä8äA$A$8Ä8ä8Ä8äA$A$8Ä8ä8Ä8ä9$9$(ä(ä@å@å9$9$@å@åIEIEIEIEYÉYÉbŒbŒQÇQÇQÇQÇAGAGYÉYÉbbzzYÉYÉa†a†aÇaÇ@å@å9E9EA&A&R‹R‹ZIZIIEIEA&A&QEQEA&A&@å@åA$A$0å0åIEIE8å8å@å@å9E9EA&A&@å@åQEQEA&A&QEQEA&A&IEIEA&A&@å@å0å0åIEIE@å@åA&A&IEIEAGAGQEQEa†a†bŒbŒYEYEQEQEAGAGA&A&QEQEA&A&A&A&HäHä8ä8ã8Ä8äIEIE(ä(ä8Ä8ä8Ä8ä0å0åA$A$9E9EA&A&A&A&YEYEZÌZÌYÉYÉQÇQÇI‡I‡Y†Y†YÉYÉjjrjjjYÉYÉAGAG8Ä8ä9†9†9E9ER‹R‹I†I†AGAGQEQE@å@å9E9EA&A&8Ä8ä9E9EA&A&8Ä8ä9E9EIEIE@å@åIEIEA&A&QEQEA&A&IEIEA&A&@å@åA$A$9E9EA&A&@å@åIEIEA&A&QEQEYEYEZJbJYÉYÉQEQEQEQE8Ä8ä8Ä8ä8ä8ÄA$A$8Ä8ä8Ä8äA$A$8Ä8ä8Ä8ä9$9$(ä(ä@å@å9$9$@å@åIEIEIEIEYÉYÉbŒbŒQÇQÇQÇQÇAGAGYÉYÉbbzzYÉYÉa†a†aÇaÇ@å@å9E9EA&A&R‹R‹ZIZIIEIEA&A&QEQEA&A&@å@åA$A$0å0åIEIE8å8å@å@å9E9EA&A&@å@åQEQEA&A&QEQEA&A&IEIEA&A&@å@å0å0åIEIE@å@åA&A&IEIEAGAGQEQEa†a†bŒbŒYEYEQEQEAGAGA&A&QEQEA&A&A&A&HäHä8ä8ã8Ä8äIEIE(ä(ä8Ä8ä8Ä8ä0å0åA$A$9E9EA&A&A&A&YEYEZÌZÌYÉYÉQÇQÇI‡I‡Y†Y†YÉYÉjjrjjjYÉYÉAGAG8Ä8ä9†9†9E9ER‹R‹I†I†AGAGQEQE@å@å9E9EA&A&8Ä8ä9E9EA&A&8Ä8ä9E9EIEIE@å@åIEIEA&A&QEQEA&A&IEIEA&A&@å@åA$A$9E9EA&A&@å@åIEIEA&A&QEQEYEYEZJbJYÉYÉQEQEQEQE8Ä8ä8Ä8äA&A&A&A&9†9†A&A&9E9E9E9E9E9E9E9EA†A†0æ0æA&A&A†A†A&A&AGAGR -R -R‹R‹(ä(ä ä ä Ä Ã ÄÃ Ä Ä(å(å0æ0æ ä ä å åJJR -R -AÇAÇbŒbŒR‹R‹A&A&0æ0æA&A&0æ0æ9†9†0å0å0å0å8Ä8ä(ä(ä0å0å@å@å0æ0æAGAG9E9EA&A&A&A&A&A&A&A&@å@åAEAE8Ä8ä8Ä8ä9E9EA&A&AGAGY†Y†I‡I‡YÉYÉjÍjÍR -R -YÉYÉI‡I‡YÉYÉI‡I‡I‡I‡I‡I‡A&A&AGAGAÇAÇ9E9E@å@å1†1† ä ä8Ä8ä9E9EA&A&A&A&AGAGI‡I‡ZÌZÌAÇAÇ Ä Ä ä 䣣 ä ä(ä(ä0æ0æ Ä Ä(ä(äAGAGBBBBJJjÍjÍAGAGA&A&0æ0æA†A†8æ8æ0å0å@å@å8Ä8ä8Ä8ä0æ0æ8Ä8ä0æ0æAGAGA&A&A&A&9E9EA&A&A&A&I$I$@å@å0å0å8Ä8ä8Ä8äA†A†AGAGI‡I‡AGAGI‡I‡bŒbŒbŒbŒI‡I‡YÉYÉI‡I‡I‡I‡A&A&A&A&9†9†A&A&9E9E9E9E9E9E9E9EA†A†0æ0æA&A&A†A†A&A&AGAGR -R -R‹R‹(ä(ä ä ä Ä Ã ÄÃ Ä Ä(å(å0æ0æ ä ä å åJJR -R -AÇAÇbŒbŒR‹R‹A&A&0æ0æA&A&0æ0æ9†9†0å0å0å0å8Ä8ä(ä(ä0å0å@å@å0æ0æAGAG9E9EA&A&A&A&A&A&A&A&@å@åAEAE8Ä8ä8Ä8ä9E9EA&A&AGAGY†Y†I‡I‡YÉYÉjÍjÍR -R -YÉYÉI‡I‡YÉYÉI‡I‡I‡I‡I‡I‡A&A&AGAGAÇAÇ9E9E@å@å1†1† ä ä8Ä8ä9E9EA&A&A&A&AGAGI‡I‡ZÌZÌAÇAÇ Ä Ä ä 䣣 ä ä(ä(ä0æ0æ Ä Ä(ä(äAGAGBBBBJJjÍjÍAGAGA&A&0æ0æA†A†8æ8æ0å0å@å@å8Ä8ä8Ä8ä0æ0æ8Ä8ä0æ0æAGAGA&A&A&A&9E9EA&A&A&A&I$I$@å@å0å0å8Ä8ä8Ä8äA†A†AGAGI‡I‡AGAGI‡I‡bŒbŒbŒbŒI‡I‡YÉYÉI‡I‡I‡I‡k/k/c,c,k/k/rËjËbŒbŒƒÐƒÐc,c,ZJbJc,c,jŠjŠZJbJR -R -bŒbŒbŒbŒc,c,k-k-bJZJR -R -R‹R‹JJZJbJbŒbŒc,c,jÍj̓p{oƒÐƒÐk/k/s/k/{.{.{.{.k,k,{.{.k/k/s,k,k/k/ƒo{pk/s/c,c,jÍjÍc,c,bŒbŒ“ЋÐk/k/s/k/k-k-s.k-k-k-bŒbŒjËjËs/k/ƒÐƒÐk/k/c/c/{.{.ƒÐƒÐk/k/{.{.{.{.{.{.{.{.{.{.{.{.{.{.{oƒp{oƒps.{.{,{,bŒbŒjŠjŠjŠjŠbŒbŒjŠjŠI‡I‡R -R -R‹R‹ZJbJZJbJbŒbŒZÌZÌk-k-bŒbŒR -R -R‹R‹JJR -R -ZÌZÌbŒbŒc/c/k/k/ƒÐƒÐ{oƒp{.{.{.{.{.{.k,k,{.{.k,k,s/k/k-k-{.{.ƒÐƒÐZÌZÌc,c,c/c/bŒbŒ{Ï{σЃÐc,c,k/k/rÍjÍk.k-rÍjÍbŒbŒk-k-ƒÐƒÐƒÐƒÐZÌZÌk/k/ƒo{p{.{.{.{.{.{.{.{.{oƒp{.{.{.{.{.{.{oƒpk/s/c,c,k/k/rËjËbŒbŒƒÐƒÐc,c,ZJbJc,c,jŠjŠZJbJR -R -bŒbŒbŒbŒc,c,k-k-bJZJR -R -R‹R‹JJZJbJbŒbŒc,c,jÍj̓p{oƒÐƒÐk/k/s/k/{.{.{.{.k,k,{.{.k/k/s,k,k/k/ƒo{pk/s/c,c,jÍjÍc,c,bŒbŒ“ЋÐk/k/s/k/k-k-s.k-k-k-bŒbŒjËjËs/k/ƒÐƒÐk/k/c/c/{.{.ƒÐƒÐk/k/{.{.{.{.{.{.{.{.{.{.{.{.{.{.{oƒp{oƒps.{.{,{,bŒbŒjŠjŠjŠjŠbŒbŒjŠjŠI‡I‡R -R -R‹R‹ZJbJZJbJbŒbŒZÌZÌk-k-bŒbŒR -R -R‹R‹JJR -R -ZÌZÌbŒbŒc/c/k/k/ƒÐƒÐ{oƒp{.{.{.{.{.{.k,k,{.{.k,k,s/k/k-k-{.{.ƒÐƒÐZÌZÌc,c,c/c/bŒbŒ{Ï{σЃÐc,c,k/k/rÍjÍk.k-rÍjÍbŒbŒk-k-ƒÐƒÐƒÐƒÐZÌZÌk/k/ƒo{p{.{.{.{.{.{.{.{.{oƒp{.{.{.{.{.{.{oƒpY†Y†Y†Y†Y†Y†Y†Y†QÇQÇ{oƒpbŒbŒ@å@åIEIEI$I$@å@å9E9EIEIEAGAGQEQEA&A&QÇQÇI†I†I‡I‡Y†Y†AGAGI‡I‡QÇQÇQÇQÇQÇQÇQÇQÇQEQEIEIEIEIEA†A†I†I†QEQEQÇQÇaÇaÇQEQEjËj˓ГÐbbI‡I‡I‡I‡QÇQÇAÇAÇQEQEAÇAÇQEQEAGAGQÇQÇQEQEYÇYÇZZƒÒƒÑjËjËbbZZYÇYÇZZZZYÇYÇYÇYÇQÇQÇI†I†I‡I‡Y†Y†Y†Y†I‡I‡YEYEYEYEYEYEYEYEYEYEjËjËAGAGQEQEA&A&@å@åAEAE@å@åQEQEI†I†QEQEAGAGQÇQÇY†Y†AGAGI‡I‡I†I†QÇQÇQÇQÇYÇYÇQÇQÇAGAGQEQEIEIEQEQEAGAGQEQEQÇQÇY†Y†Y†Y†ZZ“ЋÐc,c,I‡I‡QÇQÇI†I†I†I†I†I†I†I†I†I†I†I†I†I†Y†Y†I†I†YÇYÇ{,{,{oƒpbbbbYÉYÉbbbbYÇYÇjjI†I†I‡I‡Y†Y†I†I†aÇaÇY†Y†Y†Y†Y†Y†Y†Y†QÇQÇ{oƒpbŒbŒ@å@åIEIEI$I$@å@å9E9EIEIEAGAGQEQEA&A&QÇQÇI†I†I‡I‡Y†Y†AGAGI‡I‡QÇQÇQÇQÇQÇQÇQÇQÇQEQEIEIEIEIEA†A†I†I†QEQEQÇQÇaÇaÇQEQEjËj˓ГÐbbI‡I‡I‡I‡QÇQÇAÇAÇQEQEAÇAÇQEQEAGAGQÇQÇQEQEYÇYÇZZƒÒƒÑjËjËbbZZYÇYÇZZZZYÇYÇYÇYÇQÇQÇI†I†I‡I‡Y†Y†Y†Y†I‡I‡YEYEYEYEYEYEYEYEYEYEjËjËAGAGQEQEA&A&@å@åAEAE@å@åQEQEI†I†QEQEAGAGQÇQÇY†Y†AGAGI‡I‡I†I†QÇQÇQÇQÇYÇYÇQÇQÇAGAGQEQEIEIEQEQEAGAGQEQEQÇQÇY†Y†Y†Y†ZZ“ЋÐc,c,I‡I‡QÇQÇI†I†I†I†I†I†I†I†I†I†I†I†I†I†Y†Y†I†I†YÇYÇ{,{,{oƒpbbbbYÉYÉbbbbYÇYÇjjI†I†I‡I‡Y†Y†I†I†aÇaÇQEQEQEQEY†Y†AGAGYEYEk-k-bbIEIEA&A&I$I$QEQEA&A&I$I$QEQEIEIEIEIEA&A&QEQEIEIEA&A&I†I†YEYEAGAGQEQEY†Y†AGAGQEQEA&A&IEIEI$I$IEIEQEQEQEQEY†Y†YEYEjËj˓ГÐR -R -IEIEQEQE@å@åQEQEQEQEAGAGQEQEQEQEQEQEQEQEYEYEYÉYÉ{.{.QÇQÇQEQEQEQEYEYEAGAGQEQEQEQEAGAGQEQEA&A&AGAGQEQEQEQEQEQEQEQEQEQEYEYEaÇaÇYEYEYÉYÉAGAGI$I$@å@åQEQEI$I$IEIEQEQEA&A&QEQE@å@åQEQEIEIEA&A&QEQEI†I†YEYEAGAGQEQEAGAGIEIEQEQEA&A&AEAEIEIEIEIEQEQEY…Y…Y†Y†bbƒÐƒÐjÍjÍQEQEQEQEQEQEQEQEA&A&QEQEA&A&QEQEQEQEA&A&Y†Y†YEYEjÍjÍbJZJQEQEAGAGQEQEYEYEA&A&YEYEA&A&QEQEA&A&I†I†QEQEAGAGQEQEQEQEY†Y†AGAGYEYEk-k-bbIEIEA&A&I$I$QEQEA&A&I$I$QEQEIEIEIEIEA&A&QEQEIEIEA&A&I†I†YEYEAGAGQEQEY†Y†AGAGQEQEA&A&IEIEI$I$IEIEQEQEQEQEY†Y†YEYEjËj˓ГÐR -R -IEIEQEQE@å@åQEQEQEQEAGAGQEQEQEQEQEQEQEQEYEYEYÉYÉ{.{.QÇQÇQEQEQEQEYEYEAGAGQEQEQEQEAGAGQEQEA&A&AGAGQEQEQEQEQEQEQEQEQEQEYEYEaÇaÇYEYEYÉYÉAGAGI$I$@å@åQEQEI$I$IEIEQEQEA&A&QEQE@å@åQEQEIEIEA&A&QEQEI†I†YEYEAGAGQEQEAGAGIEIEQEQEA&A&AEAEIEIEIEIEQEQEY…Y…Y†Y†bbƒÐƒÐjÍjÍQEQEQEQEQEQEQEQEA&A&QEQEA&A&QEQEQEQEA&A&Y†Y†YEYEjÍjÍbJZJQEQEAGAGQEQEYEYEA&A&YEYEA&A&QEQEA&A&I†I†QEQEAGAGQEQEY†Y†A&A&QEQEYEYEbŒbŒI‡I‡IEIEI$I$A&A&I$I$I$I$AGAGI$I$A&A&QEQEI$I$QEQEA&A&IEIEQEQEA&A&QEQEQEQEYEYEAGAGIEIEI$I$IEIEQEQEQEQEY†Y†Y†Y†Y…Y…QEQEjŠjŠ{Ð{ÐYÉYÉIEIEQEQEIEIEIEIEA&A&QEQEIEIEA&A&A&A&QEQEYEYEYÇYÇ{oƒpI‡I‡YEYEYEYEI‡I‡QEQEYEYEAGAGYEYEY†Y†QEQEA&A&I†I†AGAGQEQEA&A&Y†Y†I‡I‡YÉYÉY†Y†ZJbJAGAGHäHäQEQEI$I$QEQEA&A&I$I$QEQEA&A&IEIEIEIEQEQEA&A&I$I$A&A&QEQEQEQEQEQEQEQEA&A&I$I$IEIEQEQEQEQEQEQEY†Y†Y†Y†QEQEaÇaǃЃÐZJbJQEQEAGAGQEQEA&A&QEQEA&A&QEQEQEQEA&A&QEQEYEYEYEYE{.{.bŒbŒQEQEYEYEQEQEYEYEAGAGYEYEY†Y†AGAGQEQEAGAGQEQEQEQEQEQEY†Y†A&A&QEQEYEYEbŒbŒI‡I‡IEIEI$I$A&A&I$I$I$I$AGAGI$I$A&A&QEQEI$I$QEQEA&A&IEIEQEQEA&A&QEQEQEQEYEYEAGAGIEIEI$I$IEIEQEQEQEQEY†Y†Y†Y†Y…Y…QEQEjŠjŠ{Ð{ÐYÉYÉIEIEQEQEIEIEIEIEA&A&QEQEIEIEA&A&A&A&QEQEYEYEYÇYÇ{oƒpI‡I‡YEYEYEYEI‡I‡QEQEYEYEAGAGYEYEY†Y†QEQEA&A&I†I†AGAGQEQEA&A&Y†Y†I‡I‡YÉYÉY†Y†ZJbJAGAGHäHäQEQEI$I$QEQEA&A&I$I$QEQEA&A&IEIEIEIEQEQEA&A&I$I$A&A&QEQEQEQEQEQEQEQEA&A&I$I$IEIEQEQEQEQEQEQEY†Y†Y†Y†QEQEaÇaǃЃÐZJbJQEQEAGAGQEQEA&A&QEQEA&A&QEQEQEQEA&A&QEQEYEYEYEYE{.{.bŒbŒQEQEYEYEQEQEYEYEAGAGYEYEY†Y†AGAGQEQEAGAGQEQEQEQEQEQEA&A&QEQEAGAGQEQEbbR -R -@å@åI$I$I$I$QEQEQEQEI$I$QEQEQEQEQEQEQEQE@ä@äA&A&I$I$QEQEQEQEIEIEQEQEYEYEQEQEQEQEQEQEY†Y†YEYEY†Y†Y†Y†Y†Y†QÇQÇY…Y…jËj˃҃ÑI†I†QEQEA&A&A&A&QEQEA&A&QEQEA&A&I$I$A&A&QEQEAGAGiÇiǃo{pZZYEYEYEYEQEQEQEQEYEYEYEYEQEQEYEYEA&A&I†I†AGAGQEQEQEQEAGAGAGAGY†Y†YÉYÉYÉYÉbIbIQEQEI$I$I$I$I$I$QEQEI$I$QEQEQEQEQEQEI$I$@å@åI$I$QEQEA&A&QEQEIEIEQEQEQEQEQEQEQEQEQEQEQEQEYEYEY†Y†Y†Y†YEYEaÇaÇY…Y…ZZ{Ð{ÐbŒbŒ@å@åIEIEA&A&I$I$A&A&QEQEA&A&A&A&I$I$A&A&Y†Y†AGAGjËjËrÍjÍYEYEYEYEYEYEYEYEY†Y†AGAGQEQEYEYEQEQEAGAGQEQEQEQEQEQEA&A&QEQEAGAGQEQEbbR -R -@å@åI$I$I$I$QEQEQEQEI$I$QEQEQEQEQEQEQEQE@ä@äA&A&I$I$QEQEQEQEIEIEQEQEYEYEQEQEQEQEQEQEY†Y†YEYEY†Y†Y†Y†Y†Y†QÇQÇY…Y…jËj˃҃ÑI†I†QEQEA&A&A&A&QEQEA&A&QEQEA&A&I$I$A&A&QEQEAGAGiÇiǃo{pZZYEYEYEYEQEQEQEQEYEYEYEYEQEQEYEYEA&A&I†I†AGAGQEQEQEQEAGAGAGAGY†Y†YÉYÉYÉYÉbIbIQEQEI$I$I$I$I$I$QEQEI$I$QEQEQEQEQEQEI$I$@å@åI$I$QEQEA&A&QEQEIEIEQEQEQEQEQEQEQEQEQEQEQEQEYEYEY†Y†Y†Y†YEYEaÇaÇY…Y…ZZ{Ð{ÐbŒbŒ@å@åIEIEA&A&I$I$A&A&QEQEA&A&A&A&I$I$A&A&Y†Y†AGAGjËjËrÍjÍYEYEYEYEYEYEYEYEY†Y†AGAGQEQEYEYEQEQEAGAGQEQEQEQEIEIEQEQEA&A&QEQEAGAGZJbJbb@å@åQEQEHãHäI$I$QEQEQEQEQEQEHäHäHäHäQEQEQEQEI$I$QEQEQEQEQEQEHäHäY…Y…aÇaÇYEYEY†Y†QEQEY†Y†YEYEQEQEY†Y†Y…Y…aÇaÇa†a†jŠjŠ{oƒpRRA&A&QEQEA&A&QEQE@å@å9E9EQEQEA&A&IEIEQEQEAGAGY†Y†k/k/qÇiÇY†Y†YEYEYEYEYEYEYEYEAGAGYEYEY†Y†QEQEA&A&I†I†AGAGQEQEA&A&Y†Y†A&A&QÇQÇYÇYÇbŒbŒQEQEQEQE@ä@äI$I$QEQEQEQEQEQEQEQEHäHäI$I$QEQEQEQEQEQEI$I$QEQEQEQEYEYEYEYEYEYEYEYEI†I†YEYEY†Y†QEQEY†Y†Y†Y†Y†Y†Y…Y…bbƒÐƒÐZJbJQEQEA&A&QEQEIEIEA&A&A&A&AEAEIEIEA&A&IEIEQEQEYEYEjËjËbŒbŒYEYEY…Y…YEYEYEYEQEQEYEYEYEYEY†Y†QEQEAGAGQEQEA&A&IEIEQEQEA&A&QEQEAGAGZJbJbb@å@åQEQEHãHäI$I$QEQEQEQEQEQEHäHäHäHäQEQEQEQEI$I$QEQEQEQEQEQEHäHäY…Y…aÇaÇYEYEY†Y†QEQEY†Y†YEYEQEQEY†Y†Y…Y…aÇaÇa†a†jŠjŠ{oƒpRRA&A&QEQEA&A&QEQE@å@å9E9EQEQEA&A&IEIEQEQEAGAGY†Y†k/k/qÇiÇY†Y†YEYEYEYEYEYEYEYEAGAGYEYEY†Y†QEQEA&A&I†I†AGAGQEQEA&A&Y†Y†A&A&QÇQÇYÇYÇbŒbŒQEQEQEQE@ä@äI$I$QEQEQEQEQEQEQEQEHäHäI$I$QEQEQEQEQEQEI$I$QEQEQEQEYEYEYEYEYEYEYEYEI†I†YEYEY†Y†QEQEY†Y†Y†Y†Y†Y†Y…Y…bbƒÐƒÐZJbJQEQEA&A&QEQEIEIEA&A&A&A&AEAEIEIEA&A&IEIEQEQEYEYEjËjËbŒbŒYEYEY…Y…YEYEYEYEQEQEYEYEYEYEY†Y†QEQEAGAGQEQEA&A&@å@åQEQEQEQEYEYEY†Y†YÉYÉYÉYÉ@å@åHäHäI$I$A&A&HäHäQEQEQEQEQEQEQEQE@ä@äI$I$A&A&QEQEQEQEQEQEY†Y†Y…Y…a†a†QEQEQEQEY†Y†Y†Y†Y†Y†Y…Y…Y†Y†aÇaÇQ…Q…Q…Q…ZZƒÐƒÐYÉYÉQEQEA&A&IEIEA&A&A&A&I$I$A&A&IEIEA&A&AGAGI$I$AGAGk-k-QÇQÇY…Y…Y†Y†YEYEY†Y†YEYEYEYEaÇaÇYEYEYEYEQEQEAGAGQEQEQEQEIEIEAGAGQEQEQEQEA&A&ZJbJAGAGHãHä@å@åI$I$QEQEQEQEHäHäQEQEQEQEA&A&HäHäIEIEI$I$YEYEYEYEYEYEY†Y†YEYEY†Y†QEQEY†Y†Y†Y†Y†Y†QEQEY…Y…aÇaÇY…Y…YEYEY†Y†k/k/c-c-@å@åQEQEQEQE@å@åAGAGAEAEI$I$A&A&QEQEAGAGQEQE@å@åZJbJbŒbŒYEYEY…Y…a†a†YEYEY†Y†QEQEa†a†YEYEY†Y†QEQE@å@åIEIE@å@åQEQEQEQEYEYEY†Y†YÉYÉYÉYÉ@å@åHäHäI$I$A&A&HäHäQEQEQEQEQEQEQEQE@ä@äI$I$A&A&QEQEQEQEQEQEY†Y†Y…Y…a†a†QEQEQEQEY†Y†Y†Y†Y†Y†Y…Y…Y†Y†aÇaÇQ…Q…Q…Q…ZZƒÐƒÐYÉYÉQEQEA&A&IEIEA&A&A&A&I$I$A&A&IEIEA&A&AGAGI$I$AGAGk-k-QÇQÇY…Y…Y†Y†YEYEY†Y†YEYEYEYEaÇaÇYEYEYEYEQEQEAGAGQEQEQEQEIEIEAGAGQEQEQEQEA&A&ZJbJAGAGHãHä@å@åI$I$QEQEQEQEHäHäQEQEQEQEA&A&HäHäIEIEI$I$YEYEYEYEYEYEY†Y†YEYEY†Y†QEQEY†Y†Y†Y†Y†Y†QEQEY…Y…aÇaÇY…Y…YEYEY†Y†k/k/c-c-@å@åQEQEQEQE@å@åAGAGAEAEI$I$A&A&QEQEAGAGQEQE@å@åZJbJbŒbŒYEYEY…Y…a†a†YEYEY†Y†QEQEa†a†YEYEY†Y†QEQE@å@åIEIEA&A&AGAGI‡I‡AGAGYÉYÉjÍjÍR‹R‹A&A&9E9E0å0åIEIEA&A&A&A&AGAGI‡I‡AGAGAGAGI‡I‡I‡I‡AGAGI‡I‡I‡I‡YÉYÉAGAGAGAGI†I†AGAGAGAGAGAGAGAGYÇYÇRRYÉYÉbbbŒbŒbŒbŒk-k-bJZJ0å0åA&A&AGAGA&A&AÇAÇAGAGAGAGAGAGAGAGI‡I‡ZJbJZÌZÌ{.{.R -R -I‡I‡A&A&AGAGAGAGYÉYÉAGAGI‡I‡YÉYÉYÉYÉYÉYÉYÉYÉRRAGAGAGAGI‡I‡AGAGI‡I‡R -R -ZÌZÌI‡I‡8æ8æ9E9E@å@å8æ8æA&A&AGAGAGAGAGAGAGAGI‡I‡I‡I‡AGAGBBI‡I‡I‡I‡I‡I‡AGAGAGAGAGAGAGAGAGAGAGAGQÇQÇYÉYÉYÇYÇR -R -jŠjŠjËjËbŒbŒk,k,A&A&AGAGAGAGA†A†AGAGAGAGAGAGAÇAÇAGAGAGAGBBbŒbŒk/k/bŒbŒI†I†I‡I‡AGAGI‡I‡I†I†I‡I‡I‡I‡I‡I‡YÉYÉI‡I‡I‡I‡I‡I‡A&A&AGAGI‡I‡AGAGYÉYÉjÍjÍR‹R‹A&A&9E9E0å0åIEIEA&A&A&A&AGAGI‡I‡AGAGAGAGI‡I‡I‡I‡AGAGI‡I‡I‡I‡YÉYÉAGAGAGAGI†I†AGAGAGAGAGAGAGAGYÇYÇRRYÉYÉbbbŒbŒbŒbŒk-k-bJZJ0å0åA&A&AGAGA&A&AÇAÇAGAGAGAGAGAGAGAGI‡I‡ZJbJZÌZÌ{.{.R -R -I‡I‡A&A&AGAGAGAGYÉYÉAGAGI‡I‡YÉYÉYÉYÉYÉYÉYÉYÉRRAGAGAGAGI‡I‡AGAGI‡I‡R -R -ZÌZÌI‡I‡8æ8æ9E9E@å@å8æ8æA&A&AGAGAGAGAGAGAGAGI‡I‡I‡I‡AGAGBBI‡I‡I‡I‡I‡I‡AGAGAGAGAGAGAGAGAGAGAGAGQÇQÇYÉYÉYÇYÇR -R -jŠjŠjËjËbŒbŒk,k,A&A&AGAGAGAGA†A†AGAGAGAGAGAGAÇAÇAGAGAGAGBBbŒbŒk/k/bŒbŒI†I†I‡I‡AGAGI‡I‡I†I†I‡I‡I‡I‡I‡I‡YÉYÉI‡I‡I‡I‡I‡I‡k/k/ƒÐƒÐ{oƒpƒÐƒÐƒÐƒÐ{oƒp{.{.{Ï{Ïk/k/{.{.{oƒpk-k-k/s/k/k/k-s-k.k-k-s-bŒbŒk,k,s/k/c,c,bŒbŒk-k-{.{.k/k/s,k,ƒÐƒÐƒÐƒÐk/k/{Ï{Ï{oƒpƒÐƒÐ“ЋЃЃД0Œ0œ“œ“{Ï{Ï{oƒp{.{.ƒÐƒÐƒÐƒÐƒÐƒÐ{oƒpƒÑƒÒƒÐƒÐƒÐƒÐ{Ð{Ð{oƒp„0„0œ“œ““ϋσЃÐ{oƒp{.{.ƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÐ{oƒpƒÐƒÐ„0„0”“Œ“”“Œ“”“Œ“œ“œ““ЋЃЃÐ{Ð{Ð{Ð{Ѓ҃Ñ{Ï{Ï{oƒpk/k/{.{.{oƒpk-k-k/s/k/k/k/s/k,k,k/s/jËjËc,c,k/k/rÍjÍbŒbŒk/k/s-k-k/k/s,k,{oƒpƒÐƒÐ{Ï{Ï{.{.{oƒp{Ï{σЃЃσϓЋМ“œ“ƒÏƒÏ{Ð{Ð{.{.ƒÐƒÐ{oƒpƒÐƒÐ{oƒpƒÐƒÐƒÐƒÐƒÒƒÑ{Ð{Ðk/k/“ГМ“œ““ЋЃσσ҃Ñ{.{.{.{.ƒÐƒÐƒÒƒÑƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÐ”“Œ“”“Œ“”“Œ“k/s/ƒÐƒÐ{oƒpƒÐƒÐƒÐƒÐ{oƒp{.{.{Ï{Ïk/k/{.{.{oƒpk-k-k/s/k/k/k-s-k.k-k-s-bŒbŒk,k,s/k/c,c,bŒbŒk-k-{.{.k/k/s,k,ƒÐƒÐƒÐƒÐk/k/{Ï{Ï{oƒpƒÐƒÐ“ЋЃЃД0Œ0œ“œ“{Ï{Ï{oƒp{.{.ƒÐƒÐƒÐƒÐƒÐƒÐ{oƒpƒÑƒÒƒÐƒÐƒÐƒÐ{Ð{Ð{oƒp„0„0œ“œ““ϋσЃÐ{oƒp{.{.ƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÐ{oƒpƒÐƒÐ„0„0”“Œ“”“Œ“”“Œ“œ“œ““ЋЃЃÐ{Ð{Ð{Ð{Ѓ҃Ñ{Ï{Ï{oƒpk/k/{.{.{oƒpk-k-k/s/k/k/k/s/k,k,k/s/jËjËc,c,k/k/rÍjÍbŒbŒk/k/s-k-k/k/s,k,{oƒpƒÐƒÐ{Ï{Ï{.{.{oƒp{Ï{σЃЃσϓЋМ“œ“ƒÏƒÏ{Ð{Ð{.{.ƒÐƒÐ{oƒpƒÐƒÐ{oƒpƒÐƒÐƒÐƒÐƒÒƒÑ{Ð{Ðk/k/“ГМ“œ““ЋЃσσ҃Ñ{.{.{.{.ƒÐƒÐƒÒƒÑƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÐ”“Œ“”“Œ“”“Œ“QÇQÇA†A†QEQEAGAGQÇQÇA†A†QEQEAÇAÇQEQEAÇAÇZZZJbJQÇQÇAEAEQEQEIEIEIEIEQEQEIEIEIEIEIEIEI$I$IEIEYÇYÇYÇYÇJJI‡I‡IÇIÇZIZIQÇQÇAGAGA†A†I‡I‡AÇAÇQÇQÇYÇYÇYÇYÇZIZIIÇIÇZZQÇQÇZZQÇQÇZZQÇQÇQÇQÇI‡I‡QÇQÇQÇQÇA†A†I†I†AGAGYÇYÇbbZJbJZIZIAÇAÇIEIEA†A†A†A†AGAGAÇAÇAGAGQÇQÇAÇAÇA†A†I†I†I†I†AGAGQÇQÇIEIEAGAGI†I†QÇQÇQÇQÇZJbJJJIEIEQEQEQ…Q…IEIEIEIEIEIEIEIEQEQEAEAEIEIEQEQEZZYÉYÉJJQÇQÇIÇIÇYÉYÉAÇAÇAGAGQÇQÇAÇAÇQÇQÇI‡I‡ZZZIZIYÇYÇIÇIÇYÉYÉYÇYÇIÇIÇZIZIYÇYÇIÇIÇQÇQÇAGAGYÇYÇQÇQÇAGAGQÇQÇQÇQÇQÇQÇbbZJbJZIZI9E9EA&A&A†A†A†A†AGAGAÇAÇAGAGQÇQÇA†A†QEQEAGAGQÇQÇA†A†QEQEAÇAÇQEQEAÇAÇZZZJbJQÇQÇAEAEQEQEIEIEIEIEQEQEIEIEIEIEIEIEI$I$IEIEYÇYÇYÇYÇJJI‡I‡IÇIÇZIZIQÇQÇAGAGA†A†I‡I‡AÇAÇQÇQÇYÇYÇYÇYÇZIZIIÇIÇZZQÇQÇZZQÇQÇZZQÇQÇQÇQÇI‡I‡QÇQÇQÇQÇA†A†I†I†AGAGYÇYÇbbZJbJZIZIAÇAÇIEIEA†A†A†A†AGAGAÇAÇAGAGQÇQÇAÇAÇA†A†I†I†I†I†AGAGQÇQÇIEIEAGAGI†I†QÇQÇQÇQÇZJbJJJIEIEQEQEQ…Q…IEIEIEIEIEIEIEIEQEQEAEAEIEIEQEQEZZYÉYÉJJQÇQÇIÇIÇYÉYÉAÇAÇAGAGQÇQÇAÇAÇQÇQÇI‡I‡ZZZIZIYÇYÇIÇIÇYÉYÉYÇYÇIÇIÇZIZIYÇYÇIÇIÇQÇQÇAGAGYÇYÇQÇQÇAGAGQÇQÇQÇQÇQÇQÇbbZJbJZIZI9E9EA&A&A†A†A†A†AGAGAÇAÇAGAG@ä@ä8ä8ã@å@åHäHä8ä8ã8Ä8ä8Ä8äHäHä8ä8ã@å@åY†Y†R‹R‹HäHäHäHäHäHä@ä@ã@ä@ãHäHä8ä8ãHäHä8ä8ã8Ä8ä@å@åI$I$QEQEbŒbŒA&A&AEAE@ä@ä@ä@ä0Ä0ã8Ä8äAEAE@å@åHäHäAEAE@å@å@å@åQ…Q…QEQEQEQEQEQEQEQEQEQEA&A&I$I$A&A&I$I$A&A&@å@åIEIE@å@åIEIEQEQEjÍjÍI‡I‡8Ä8ä@å@å8Ä8ä9E9E8Ä8äA$A$8Ä8äA$A$8Ä8äIEIE8Ä8ä@å@åHäHä8ä8ã8Ä8ä8ä8ãHäHä8ä8ãAEAEZJbJI†I†HãHäI$I$@ä@äHäHä@ä@ãHäHä@ä@ä0Ä0ãHäHä8ä8ã@å@åI$I$jjR -R -8ã8äAEAE@ä@ä0Ä0ä8ä8ã@å@å@å@åAEAEHäHä@å@åHäHäIEIEQEQEIEIEQEQEQEQEI$I$QEQEA&A&I$I$QEQEA&A&@å@åAEAE8Ä8äIEIE@å@åj‰j‰bŒbŒ8Ä8ä8Ä8ä9E9E8Ä8äIEIE8Ä8ä8Ä8äA$A$@ä@ä8ä8ã@å@åHäHä8ä8ã8Ä8ä8Ä8äHäHä8ä8ã@å@åY†Y†R‹R‹HäHäHäHäHäHä@ä@ã@ä@ãHäHä8ä8ãHäHä8ä8ã8Ä8ä@å@åI$I$QEQEbŒbŒA&A&AEAE@ä@ä@ä@ä0Ä0ã8Ä8äAEAE@å@åHäHäAEAE@å@å@å@åQ…Q…QEQEQEQEQEQEQEQEQEQEA&A&I$I$A&A&I$I$A&A&@å@åIEIE@å@åIEIEQEQEjÍjÍI‡I‡8Ä8ä@å@å8Ä8ä9E9E8Ä8äA$A$8Ä8äA$A$8Ä8äIEIE8Ä8ä@å@åHäHä8ä8ã8Ä8ä8ä8ãHäHä8ä8ãAEAEZJbJI†I†HãHäI$I$@ä@äHäHä@ä@ãHäHä@ä@ä0Ä0ãHäHä8ä8ã@å@åI$I$jjR -R -8ã8äAEAE@ä@ä0Ä0ä8ä8ã@å@å@å@åAEAEHäHä@å@åHäHäIEIEQEQEIEIEQEQEQEQEI$I$QEQEA&A&I$I$QEQEA&A&@å@åAEAE8Ä8äIEIE@å@åj‰j‰bŒbŒ8Ä8ä8Ä8ä9E9E8Ä8äIEIE8Ä8ä8Ä8äA$A$HäHäHäHä8ä8ãHäHäI$I$8ã8ä8ã8äHäHä8ä8ãHäHäI†I†ZJbJHäHä@ä@ãHäHäA$A#HäHãI$I$HäHä8ä8ãA$A$8ä8ãI$I$8Ä8äI$I$ZJbJA†A†HäHä8Ä8ä8Ä8äA$A$8Ä8äAEAE@å@åAEAE@å@åI$I$IEIEQEQEA&A&HäHäQEQEQEQEQEQEQEQEA&A&QEQE@å@åAEAEAEAE8Ä8äIEIE@å@åQEQEk-k-RR@å@åA$A$9E9E8Ä8ä9E9E@å@å9E9E@å@å8Ä8ä9E9E8Ä8äHäHä@ä@ãI$I$0Ã0äHäHä8ä8ãHäHäHäHäbIbIAGAGHäHäHäHäHäHä@ä@ãHäHãI$I$8ã8äHäHä8ä8ãHäHäA$A$@ä@ãZZIÇIÇ@å@å@å@å8ã8äA$A$8Ä8äAEAE8ã8äAEAE@å@åIEIEIEIEIEIEQEQEA&A&QEQEQEQEQEQEQEQEA&A&QEQEA&A&HäHäAEAE8Ä8äIEIE@å@åA†A†jIjIbŒbŒA&A&@å@å8Ä8äA$A$@å@å@å@å8ã8ä@å@åHäHäHäHä8ä8ãHäHäI$I$8ã8ä8ã8äHäHä8ä8ãHäHäI†I†ZJbJHäHä@ä@ãHäHäA$A#HäHãI$I$HäHä8ä8ãA$A$8ä8ãI$I$8Ä8äI$I$ZJbJA†A†HäHä8Ä8ä8Ä8äA$A$8Ä8äAEAE@å@åAEAE@å@åI$I$IEIEQEQEA&A&HäHäQEQEQEQEQEQEQEQEA&A&QEQE@å@åAEAEAEAE8Ä8äIEIE@å@åQEQEk-k-RR@å@åA$A$9E9E8Ä8ä9E9E@å@å9E9E@å@å8Ä8ä9E9E8Ä8äHäHä@ä@ãI$I$0Ã0äHäHä8ä8ãHäHäHäHäbIbIAGAGHäHäHäHäHäHä@ä@ãHäHãI$I$8ã8äHäHä8ä8ãHäHäA$A$@ä@ãZZIÇIÇ@å@å@å@å8ã8äA$A$8Ä8äAEAE8ã8äAEAE@å@åIEIEIEIEIEIEQEQEA&A&QEQEQEQEQEQEQEQEA&A&QEQEA&A&HäHäAEAE8Ä8äIEIE@å@åA†A†jIjIbŒbŒA&A&@å@å8Ä8äA$A$@å@å@å@å8ã8ä@å@åHäHäHäHäA$A#8ä8ãHäHä8ä8ãHäHä8ä8ãHäHãHäHäY…Y…R‹R‹HäHäHäHäA$A#HäHäI$I$I$I$HäHä8ä8ãHäHäI$I$0Ã0äAEAEI$I$jŠjŠ@å@å8Ä8äA$A$8Ä8ä9E9E8Ä8ä8Ä8äAEAEHäHäAEAEIEIEI$I$A&A&I$I$QEQEQEQEQEQEA&A&I$I$8å8å@å@åAEAEI$I$@å@å8Ä8ä9E9EQEQEAGAGjËjËYÉYÉ8Ä8äA$A$8Ä8ä9E9E@å@å8Ä8ä8Ä8äA$A$8Ä8ä0å0å8ã8ä@å@åHäHä@ä@ãHäHä8ä8ã@ä@ãHäHäI$I$ZJbJA†A†HäHäHäHäA$A#HäHäI$I$@ã@äHäHäA$A$8ä8ãHäHäA$A$HäHäZZRR8Ä8äA$A$8Ä8äA$A$8Ä8ä9$9$@å@åA$A$AEAEI$I$QEQEA&A&@å@åIEIEHäHäQEQEQEQEA&A&@å@åHäHäA$A$A$A$IEIE8Ä8ä9E9EA&A&HäHäbIbIbŒbŒ8ã8äAEAE8Ä8ä9E9E8Ä8äI$I$8ã8ä8Ä8äHäHäHäHäA$A#8ä8ãHäHä8ä8ãHäHä8ä8ãHäHãHäHäY…Y…R‹R‹HäHäHäHäA$A#HäHäI$I$I$I$HäHä8ä8ãHäHäI$I$0Ã0äAEAEI$I$jŠjŠ@å@å8Ä8äA$A$8Ä8ä9E9E8Ä8ä8Ä8äAEAEHäHäAEAEIEIEI$I$A&A&I$I$QEQEQEQEQEQEA&A&I$I$8å8å@å@åAEAEI$I$@å@å8Ä8ä9E9EQEQEAGAGjËjËYÉYÉ8Ä8äA$A$8Ä8ä9E9E@å@å8Ä8ä8Ä8äA$A$8Ä8ä0å0å8ã8ä@å@åHäHä@ä@ãHäHä8ä8ã@ä@ãHäHäI$I$ZJbJA†A†HäHäHäHäA$A#HäHäI$I$@ã@äHäHäA$A$8ä8ãHäHäA$A$HäHäZZRR8Ä8äA$A$8Ä8äA$A$8Ä8ä9$9$@å@åA$A$AEAEI$I$QEQEA&A&@å@åIEIEHäHäQEQEQEQEA&A&@å@åHäHäA$A$A$A$IEIE8Ä8ä9E9EA&A&HäHäbIbIbŒbŒ8ã8äAEAE8Ä8ä9E9E8Ä8äI$I$8ã8ä8Ä8äHäHä8ä8ã@ä@ãHäHä8ä8ã@ä@ãHäHä@ä@ã@ä@ãI$I$I†I†bŒbŒHäHäI$I$HäHäI$I$I$I$I$I$I$I$I$I$8ã8äI$I$HäHäI$I$@å@åYÉYÉ9$9$8Ä8äA$A$8Ä8ä0Ä0ä9$9$0Ä0ã@å@åI$I$@å@åIEIEI$I$A&A&I$I$@å@åI$I$QEQE@å@åQEQE8Ä8äI$I$@å@å@å@åAEAEHäHäAEAEI$I$YEYEjÍjÍAÇAÇ0Ä0ä0Ä0ä8ä8ã@å@å8Ä8ä8Ä8ä9E9E8Ä8ä9E9E8Ä8ä8Ä8äI$I$@ã@ä@ã@äA#A$@ã@äHãHäI$I$HäHäRŠRŠI‡I‡HäHäI$I$I$I$I$I$I$I$I$I$I$I$8ã8äI$I$8ã8äIEIE@ã@äQÇQÇAGAG8ã8ä8Ä8äA$A$(ä(ä8Ä8ä0Ä0ãAEAE8Ä8äI$I$A&A&I$I$QEQEA&A&HäHäQEQEI$I$QEQE@å@å@å@åI$I$8Ä8äAEAE@å@å@å@åI$I$QEQEQEQEZZbŒbŒ0Ä0ä0Ä0ä0Ä0ãA&A&8Ä8ä8Ä8ä8Ä8äHäHäHäHä8ä8ã@ä@ãHäHä8ä8ã@ä@ãHäHä@ä@ã@ä@ãI$I$I†I†bŒbŒHäHäI$I$HäHäI$I$I$I$I$I$I$I$I$I$8ã8äI$I$HäHäI$I$@å@åYÉYÉ9$9$8Ä8äA$A$8Ä8ä0Ä0ä9$9$0Ä0ã@å@åI$I$@å@åIEIEI$I$A&A&I$I$@å@åI$I$QEQE@å@åQEQE8Ä8äI$I$@å@å@å@åAEAEHäHäAEAEI$I$YEYEjÍjÍAÇAÇ0Ä0ä0Ä0ä8ä8ã@å@å8Ä8ä8Ä8ä9E9E8Ä8ä9E9E8Ä8ä8Ä8äI$I$@ã@ä@ã@äA#A$@ã@äHãHäI$I$HäHäRŠRŠI‡I‡HäHäI$I$I$I$I$I$I$I$I$I$I$I$8ã8äI$I$8ã8äIEIE@ã@äQÇQÇAGAG8ã8ä8Ä8äA$A$(ä(ä8Ä8ä0Ä0ãAEAE8Ä8äI$I$A&A&I$I$QEQEA&A&HäHäQEQEI$I$QEQE@å@å@å@åI$I$8Ä8äAEAE@å@å@å@åI$I$QEQEQEQEZZbŒbŒ0Ä0ä0Ä0ä0Ä0ãA&A&8Ä8ä8Ä8ä8Ä8äHäHäHäHä@ä@ã@ä@ã@ä@ãHäHã@ä@ã@ä@ã@ä@ãHäHãHäHäQ…Q…jŠjŠ8Ä8äHäHäI$I$@ã@äI$I$I$I$HäHäI$I$HäHäA$A$I$I$8ã8äIEIEQEQE9E9E8ã8ä8Ä8äA$A$8ä8ã@å@åI$I$AEAEI$I$QEQEQEQEQEQEQEQEYEYEQEQEQEQEQEQEQEQEQEQEQEQEQEQEI$I$I$I$QEQEA&A&I$I$AGAGHäHäjŠjŠI‡I‡8Ä8ä8Ä8ä8Ä8ä9$9$8Ä8ä9$9$(ä(ä8Ä8ä8Ä8ä0Ä0äA$A$8ä8ãHäHä@ä@ã@ä@ã@ä@ãHäHãHäHäHäHäjIjIJJ@ã@äHäHä@ä@ãI$I$HäHäI$I$I$I$HäHäI$I$HäHäHäHäI$I$A†A†IEIE8Ä8ä8Ä8äHäHä0Ä0ãAEAEHäHäHäHäIEIEI$I$QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEHäHäQEQEQEQEI$I$QEQE@å@åIEIEQEQEQEQEYÉYÉZJbJ8ä8ã@å@å0Ã0ä8Ä8ä9$9$8Ä8äA$A$8ä8ãHäHä@ä@ã@ä@ã@ä@ãHäHã@ä@ã@ä@ã@ä@ãHäHãHäHäQ…Q…jŠjŠ8Ä8äHäHäI$I$@ã@äI$I$I$I$HäHäI$I$HäHäA$A$I$I$8ã8äIEIEQEQE9E9E8ã8ä8Ä8äA$A$8ä8ã@å@åI$I$AEAEI$I$QEQEQEQEQEQEQEQEYEYEQEQEQEQEQEQEQEQEQEQEQEQEQEQEI$I$I$I$QEQEA&A&I$I$AGAGHäHäjŠjŠI‡I‡8Ä8ä8Ä8ä8Ä8ä9$9$8Ä8ä9$9$(ä(ä8Ä8ä8Ä8ä0Ä0äA$A$8ä8ãHäHä@ä@ã@ä@ã@ä@ãHäHãHäHäHäHäjIjIJJ@ã@äHäHä@ä@ãI$I$HäHäI$I$I$I$HäHäI$I$HäHäHäHäI$I$A†A†IEIE8Ä8ä8Ä8äHäHä0Ä0ãAEAEHäHäHäHäIEIEI$I$QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEHäHäQEQEQEQEI$I$QEQE@å@åIEIEQEQEQEQEYÉYÉZJbJ8ä8ã@å@å0Ã0ä8Ä8ä9$9$8Ä8äA$A$8ä8ãA&A&A&A&I$I$A&A&QEQEA&A&8Ä8ä8Ä8ä@ä@ä8ä8ãAGAGbŒbŒJJQEQEA&A&I$I$QEQEI†I†Y†Y†A&A&AEAEIEIEIEIEIEIEAGAGbbI‡I‡I‡I‡AGAG8Ä8ä8ä8ã@å@åAEAEI$I$A&A&I$I$HäHä@å@åA&A&QEQE@å@å@å@åHäHäQEQE@å@åHäHäQEQEA&A&A&A&@å@åQEQEA&A&QEQEI‡I‡k/k/bJZJA&A&0æ0æ9$9$1†1†(ä(ä(Ä(Ä0å0å0å0åAGAGAÇAÇAGAGAGAGAGAGQEQE8å8å8Ä8ä@ä@ä0Ä0äAEAEZJbJR -R -AGAGIEIEI$I$IEIEI†I†YEYEA&A&IEIEAEAEIEIEIEIEQEQEYÉYÉJJAGAGI†I†A&A&8ã8ä@å@åAEAEI$I$A&A&I$I$QEQE8Ä8äHäHäA&A&HäHä@å@åHäHäQEQEA&A&HäHäIEIEHäHäAGAG@ä@äQEQEA&A&A&A&A&A&ZJbJR‹R‹8æ8æ0æ0æ9$9$A†A†(å(å ä ä(Ä(ÄA&A&A&A&A&A&I$I$A&A&QEQEA&A&8Ä8ä8Ä8ä@ä@ä8ä8ãAGAGbŒbŒJJQEQEA&A&I$I$QEQEI†I†Y†Y†A&A&AEAEIEIEIEIEIEIEAGAGbbI‡I‡I‡I‡AGAG8Ä8ä8ä8ã@å@åAEAEI$I$A&A&I$I$HäHä@å@åA&A&QEQE@å@å@å@åHäHäQEQE@å@åHäHäQEQEA&A&A&A&@å@åQEQEA&A&QEQEI‡I‡k/k/bJZJA&A&0æ0æ9$9$1†1†(ä(ä(Ä(Ä0å0å0å0åAGAGAÇAÇAGAGAGAGAGAGQEQE8å8å8Ä8ä@ä@ä0Ä0äAEAEZJbJR -R -AGAGIEIEI$I$IEIEI†I†YEYEA&A&IEIEAEAEIEIEIEIEQEQEYÉYÉJJAGAGI†I†A&A&8ã8ä@å@åAEAEI$I$A&A&I$I$QEQE8Ä8äHäHäA&A&HäHä@å@åHäHäQEQEA&A&HäHäIEIEHäHäAGAG@ä@äQEQEA&A&A&A&A&A&ZJbJR‹R‹8æ8æ0æ0æ9$9$A†A†(å(å ä ä(Ä(ÄA&A&bŒbŒc/c/k/k/bŒbŒk/k/s/k/bŒbŒZÌZÌZJbJR‹R‹bŒbŒc/c/{Ð{Ð{.{.k/k/s-k-{pƒo‹Ï“ϋГЃЃЃЃÐ{.{.ƒÏƒÏ“ЋЃЃЃЃЃЃЃЃÐk,k,s/k/RŠRŠbŒbŒbŒbŒbŒbŒbŒbŒc,c,ZÌZÌjÍjÍZÌZÌbŒbŒbŒbŒbŒbŒbŒbŒR‹R‹R‹R‹R -R -R‹R‹bŒbŒk/k/s/k/k/k/ƒo{pk/s/{Ð{М“œ“œ“œ“{oƒp{Ï{σЃЃЃÐk/k/c,c,k/k/ƒo{p{Ð{Ѓ҃ѓЋЃσσ҃Ñc,c,bŒbŒbŒbŒR‹R‹ZJbJbŒbŒjÍjÍs/k/ƒÐƒÐk/k/s-k-{.{.“ϋϓЋЃЃЃЃЃЃÐ{Ï{σЃЃЃÐ{.{.ƒÐƒÐ“ЋЃЃÐk-k-bŒbŒZJbJbŒbŒbŒbŒbŒbŒZÌZÌbŒbŒjÍjÍrÎjÍjÍjÍZÌZÌbŒbŒbŒbŒR‹R‹R‹R‹R -R -bŒbŒbŒbŒc/c/jÍjÍs/k/{oƒpk/k/k/s/k/k/k/s/k/k/c/c/k/k/ƒÐƒÐZJbJbŒbŒR‹R‹R‹R‹bŒbŒc/c/k/k/bŒbŒk/k/s/k/bŒbŒZÌZÌZJbJR‹R‹bŒbŒc/c/{Ð{Ð{.{.k/k/s-k-{pƒo‹Ï“ϋГЃЃЃЃÐ{.{.ƒÏƒÏ“ЋЃЃЃЃЃЃЃЃÐk,k,s/k/RŠRŠbŒbŒbŒbŒbŒbŒbŒbŒc,c,ZÌZÌjÍjÍZÌZÌbŒbŒbŒbŒbŒbŒbŒbŒR‹R‹R‹R‹R -R -R‹R‹bŒbŒk/k/s/k/k/k/ƒo{pk/s/{Ð{М“œ“œ“œ“{oƒp{Ï{σЃЃЃÐk/k/c,c,k/k/ƒo{p{Ð{Ѓ҃ѓЋЃσσ҃Ñc,c,bŒbŒbŒbŒR‹R‹ZJbJbŒbŒjÍjÍs/k/ƒÐƒÐk/k/s-k-{.{.“ϋϓЋЃЃЃЃЃЃÐ{Ï{σЃЃЃÐ{.{.ƒÐƒÐ“ЋЃЃÐk-k-bŒbŒZJbJbŒbŒbŒbŒbŒbŒZÌZÌbŒbŒjÍjÍrÎjÍjÍjÍZÌZÌbŒbŒbŒbŒR‹R‹R‹R‹R -R -bŒbŒbŒbŒc/c/jÍjÍs/k/{oƒpk/k/k/s/k/k/k/s/k/k/c/c/k/k/ƒÐƒÐZJbJbŒbŒR‹R‹R‹R‹bbY†Y†bbbbjŠjŠ{oƒpY†Y†IEIEA&A&QEQEAÇAÇIEIE@å@åA†A†AEAEQEQEA†A†AGAGI†I†QÇQÇQEQEAÇAÇI†I†I†I†IEIE@å@åA$A$AÇAÇI†I†QEQEIEIEA&A&AÇAÇYEYEjŠjŠ{oƒpjËjËjËrËjÍjÍjËrËk-k-jËrËk/k/{,{,jÍjÍ{,{,jÍjÍ{,{,k-k-s.k-jŠjŠbIbIZJbJbbbbbIbIjIjIjŠjŠj‰j‰jŠjŠjŠjŠjËjËr‰j‰jIjIrËjËjËjËrIjIbb{,{,bŒbŒQEQEQEQEIEIEA&A&AGAGA†A†9†9†AEAE@å@åIEIEQEQEA†A†AÇAÇI†I†QÇQÇI†I†I†I†Y†Y†IEIEA&A&A$A$AGAGI†I†AEAEAEAEA†A†QEQEI†I†bb{.{.k-k-jŠjŠc,c,jËjËs-k-jËjË{.{.jÍjÍ{.{.{,{,jÍjÍrËjË{.{.”0Œ0{.{.jIjIbIbIZZbbj‰j‰r‰j‰jŠjŠjËjËr‰j‰jŠjŠjËjËrIjIbŒbŒbbY†Y†bbbbjŠjŠ{oƒpY†Y†IEIEA&A&QEQEAÇAÇIEIE@å@åA†A†AEAEQEQEA†A†AGAGI†I†QÇQÇQEQEAÇAÇI†I†I†I†IEIE@å@åA$A$AÇAÇI†I†QEQEIEIEA&A&AÇAÇYEYEjŠjŠ{oƒpjËjËjËrËjÍjÍjËrËk-k-jËrËk/k/{,{,jÍjÍ{,{,jÍjÍ{,{,k-k-s.k-jŠjŠbIbIZJbJbbbbbIbIjIjIjŠjŠj‰j‰jŠjŠjŠjŠjËjËr‰j‰jIjIrËjËjËjËrIjIbb{,{,bŒbŒQEQEQEQEIEIEA&A&AGAGA†A†9†9†AEAE@å@åIEIEQEQEA†A†AÇAÇI†I†QÇQÇI†I†I†I†Y†Y†IEIEA&A&A$A$AGAGI†I†AEAEAEAEA†A†QEQEI†I†bb{.{.k-k-jŠjŠc,c,jËjËs-k-jËjË{.{.jÍjÍ{.{.{,{,jÍjÍrËjË{.{.”0Œ0{.{.jIjIbIbIZZbbj‰j‰r‰j‰jŠjŠjËjËr‰j‰jŠjŠjËjËrIjIbŒbŒQEQEA&A&HäHäHäHäaÇaÇk/k/QEQE@ä@ä8Ä8ä8Ä8ä(ä(ä0Ä0ä8Ä8ä0Ä0äHäHäAEAE@ä@ä8Ä8Ã8ä8ã8Ä8ä8Ä8ä8Ä8ä8Ä8ä8Ä8ä8Ä8ä9$9$8Ä8äA$A$IEIE8Ä8ä0Ä0ä0Ä0ã@å@åQEQEjjs/k/aÇaÇQEQEQEQEQEQEQEQEYEYEI‡I‡YEYEaÇaÇaÇaÇI‡I‡a†a†jÍjÍbŒbŒQEQEQEQEI$I$QEQEHäHäHäHäYEYEHäHäYEYEYEYEYEYEYEYEYEYEY†Y†QEQEYEYEYEYEYEYEbŒbŒjŠjŠ@ä@ä8Ä8äHäHä0Ä0ã8Ä8ä0Ä0ä0Ä0ä0Ä0ä@ä@ãAEAE@å@å8ã8äHäHä0Ä0ä@ä@ä0Ä0ä0Ä0ä8Ä8ä8Ä8ä8Ä8ä0Ä0ãA$A$IEIE8Ä8ä8Ä8ä0Ä0ã8Ä8äQEQEYEYEk/k/bIbIQEQEQEQEQEQEQEQEQEQEYEYEI‡I‡Y†Y†aÇaÇYEYEI‡I‡jIjI“ГÐR -R -QEQE@å@åIEIEHäHäQEQEYDYDYEYEHäHäYEYEYEYEYEYEYEYEYEYEQEQEA&A&HäHäHäHäaÇaÇk/k/QEQE@ä@ä8Ä8ä8Ä8ä(ä(ä0Ä0ä8Ä8ä0Ä0äHäHäAEAE@ä@ä8Ä8Ã8ä8ã8Ä8ä8Ä8ä8Ä8ä8Ä8ä8Ä8ä8Ä8ä9$9$8Ä8äA$A$IEIE8Ä8ä0Ä0ä0Ä0ã@å@åQEQEjjs/k/aÇaÇQEQEQEQEQEQEQEQEYEYEI‡I‡YEYEaÇaÇaÇaÇI‡I‡a†a†jÍjÍbŒbŒQEQEQEQEI$I$QEQEHäHäHäHäYEYEHäHäYEYEYEYEYEYEYEYEYEYEY†Y†QEQEYEYEYEYEYEYEbŒbŒjŠjŠ@ä@ä8Ä8äHäHä0Ä0ã8Ä8ä0Ä0ä0Ä0ä0Ä0ä@ä@ãAEAE@å@å8ã8äHäHä0Ä0ä@ä@ä0Ä0ä0Ä0ä8Ä8ä8Ä8ä8Ä8ä0Ä0ãA$A$IEIE8Ä8ä8Ä8ä0Ä0ã8Ä8äQEQEYEYEk/k/bIbIQEQEQEQEQEQEQEQEQEQEYEYEI‡I‡Y†Y†aÇaÇYEYEI‡I‡jIjI“ГÐR -R -QEQE@å@åIEIEHäHäQEQEYDYDYEYEHäHäYEYEYEYEYEYEYEYEYEYEY†Y†YEYEIEIE@å@åZZjÍjÍQEQE@ä@ä8Ä8ä0Ä0ã(ä(ä(ä(ä8Ä8ä0Ä0ã8Ä8äAEAE@ä@ä0Ä0ä0Ä0ã8Ä8ä(ä(ä8Ä8ä(ä(ä8Ä8ä9$9$8Ä8ä8Ä8ä9E9E@å@å8Ä8ä8Ä8ä9$9$8Ä8äI$I$bbk/k/I‡I‡QEQEA&A&YEYEI‡I‡I‡I‡I‡I‡aÇaÇI‡I‡Y†Y†I‡I‡aÇaÇ{.{.bŒbŒY†Y†AGAGQEQEA&A&QEQEQEQEAGAGYEYEQEQEQEQEYEYEa†a†Y†Y†YEYEAGAGa†a†YÉYÉYEYEbŒbŒbŒbŒHãHä8Ä8ä8Ä8ä(ä(ä0Ä0ã(ä(ä0Ä0ã0Ä0ã8Ä8äIEIE@ä@ä0Ä0ä0Ä0ã8Ä8ä0Ä0ã(ä(ä8Ä8ä(ä(ä8Ä8ä9$9$8Ä8ä8Ä8ä9E9E@ä@ä8Ä8ä8Ä8äA$A$@å@åY†Y†k/k/bbYEYEAGAGQEQEI‡I‡I‡I‡aÇaÇI‡I‡aÇaÇI‡I‡YÉYÉY†Y†jŠjŠ{oƒpQÆQÇQEQEQEQEQEQEA&A&QEQEQEQEQEQEQEQEQEQEYEYEI‡I‡YEYEYEYEY†Y†YEYEIEIE@å@åZZjÍjÍQEQE@ä@ä8Ä8ä0Ä0ã(ä(ä(ä(ä8Ä8ä0Ä0ã8Ä8äAEAE@ä@ä0Ä0ä0Ä0ã8Ä8ä(ä(ä8Ä8ä(ä(ä8Ä8ä9$9$8Ä8ä8Ä8ä9E9E@å@å8Ä8ä8Ä8ä9$9$8Ä8äI$I$bbk/k/I‡I‡QEQEA&A&YEYEI‡I‡I‡I‡I‡I‡aÇaÇI‡I‡Y†Y†I‡I‡aÇaÇ{.{.bŒbŒY†Y†AGAGQEQEA&A&QEQEQEQEAGAGYEYEQEQEQEQEYEYEa†a†Y†Y†YEYEAGAGa†a†YÉYÉYEYEbŒbŒbŒbŒHãHä8Ä8ä8Ä8ä(ä(ä0Ä0ã(ä(ä0Ä0ã0Ä0ã8Ä8äIEIE@ä@ä0Ä0ä0Ä0ã8Ä8ä0Ä0ã(ä(ä8Ä8ä(ä(ä8Ä8ä9$9$8Ä8ä8Ä8ä9E9E@ä@ä8Ä8ä8Ä8äA$A$@å@åY†Y†k/k/bbYEYEAGAGQEQEI‡I‡I‡I‡aÇaÇI‡I‡aÇaÇI‡I‡YÉYÉY†Y†jŠjŠ{oƒpQÆQÇQEQEQEQEQEQEA&A&QEQEQEQEQEQEQEQEQEQEYEYEI‡I‡YEYEYEYEY†Y†A&A&@å@å8Ä8äZZk/k/QEQE@ä@ä(ä(ä(ä(ä0Ä0ä0Ä0ã0Ä0ã8Ä8ä@å@åA$A$8Ä8ä8Ä8äA$A$(ä(ä8Ä8ä(ä(ä8Ä8ä1$1$8Ä8ä8Ä8ä9$9$@å@åA$A$8Ä8ä9$9$8Ä8ä8Ä8äIEIEbbk/k/YÇYÇaÇaÇYEYEAGAGAGAGY†Y†I‡I‡aÇaÇI‡I‡YÉYÉYEYEYÉYÉ{,{,k/k/QEQEQEQEA&A&AEAEA&A&AGAGQEQEI†I†YEYEAGAGQEQEAGAGa†a†Y†Y†YÉYÉYEYEYÉYÉiÇiÇbJZJbŒbŒHäHä0Ä0ä8ä8ã(ä(ä8Ä8ä(ä(ä0Ä0ã8Ä8ä8Ä8ä9E9E@ä@ä8Ä8ä@å@å0Ã0ä8Ä8ä(ä(ä8Ä8ä0å0å8Ä8ä9$9$8Ä8ä9E9EA&A&HäHä8Ä8ä(ä(ä8Ä8äA$A$YEYEk/k/bJZJY†Y†I‡I‡YEYEI‡I‡AGAGYEYEI‡I‡aÇaÇI‡I‡I‡I‡Y†Y†jŠjŠ{oƒpYÈYÉQEQEA&A&@å@åA†A†QEQEA&A&I‡I‡QEQEI‡I‡Y†Y†I‡I‡YEYEI‡I‡Y†Y†A&A&@å@å8Ä8äZZk/k/QEQE@ä@ä(ä(ä(ä(ä0Ä0ä0Ä0ã0Ä0ã8Ä8ä@å@åA$A$8Ä8ä8Ä8äA$A$(ä(ä8Ä8ä(ä(ä8Ä8ä1$1$8Ä8ä8Ä8ä9$9$@å@åA$A$8Ä8ä9$9$8Ä8ä8Ä8äIEIEbbk/k/YÇYÇaÇaÇYEYEAGAGAGAGY†Y†I‡I‡aÇaÇI‡I‡YÉYÉYEYEYÉYÉ{,{,k/k/QEQEQEQEA&A&AEAEA&A&AGAGQEQEI†I†YEYEAGAGQEQEAGAGa†a†Y†Y†YÉYÉYEYEYÉYÉiÇiÇbJZJbŒbŒHäHä0Ä0ä8ä8ã(ä(ä8Ä8ä(ä(ä0Ä0ã8Ä8ä8Ä8ä9E9E@ä@ä8Ä8ä@å@å0Ã0ä8Ä8ä(ä(ä8Ä8ä0å0å8Ä8ä9$9$8Ä8ä9E9EA&A&HäHä8Ä8ä(ä(ä8Ä8äA$A$YEYEk/k/bJZJY†Y†I‡I‡YEYEI‡I‡AGAGYEYEI‡I‡aÇaÇI‡I‡I‡I‡Y†Y†jŠjŠ{oƒpYÈYÉQEQEA&A&@å@åA†A†QEQEA&A&I‡I‡QEQEI‡I‡Y†Y†I‡I‡YEYEI‡I‡QÇQÇI‡I‡A&A&@å@åbbc/c/YEYE8Ä8ä8Ä8ä(ä(ä(ä(ä(ä(ä8Ä8ä0Ä0ã8Ä8ä8Ä8ä9$9$8Ä8ä8Ä8ä(ä(ä8Ä8ä(ä(ä0å0å8Ä8ä1$1$0å0å8Ä8äA$A$9E9E@å@å0Ã0ä8Ä8ä9E9EQEQEYÉYÉbŒbŒbbI‡I‡I‡I‡I‡I‡YEYEI‡I‡I‡I‡YEYEI‡I‡aÇaÇI‡I‡YÉYÉ{,{,bŒbŒIEIE0æ0æ(ä(ä(ä(ä(ä(ä0æ0æ1$1$0æ0æA&A&Y†Y†AGAGa†a†YÉYÉYÉYÉaÇaÇYÉYÉQÇQÇQÇQÇbŒbŒjËjË@ä@ä@ä@ä8Ä8ä8Ä8ä(ä(ä(ä(ä0Ä0ã(ä(ä8Ä8ä8Ä8ä8Ä8äA$A$8Ä8ä(ä(ä8Ä8ä(ä(ä8Ä8ä1$1$(ä(ä8Ä8äA$A$8Ä8ä9E9E@å@å8ã8ä8Ä8ä8Ä8äIEIEAGAGjËjËrjYÉYÉI‡I‡YEYEI‡I‡AGAGI‡I‡aÇaÇI‡I‡Y†Y†I‡I‡aÇaÇjIjIƒo{pAFAG9E9E0æ0æ!$!$(ä(ä(å(å0å0å0å0åA&A&AGAGYÉYÉAGAGAGAGYÇYÇQÇQÇI‡I‡A&A&@å@åbbc/c/YEYE8Ä8ä8Ä8ä(ä(ä(ä(ä(ä(ä8Ä8ä0Ä0ã8Ä8ä8Ä8ä9$9$8Ä8ä8Ä8ä(ä(ä8Ä8ä(ä(ä0å0å8Ä8ä1$1$0å0å8Ä8äA$A$9E9E@å@å0Ã0ä8Ä8ä9E9EQEQEYÉYÉbŒbŒbbI‡I‡I‡I‡I‡I‡YEYEI‡I‡I‡I‡YEYEI‡I‡aÇaÇI‡I‡YÉYÉ{,{,bŒbŒIEIE0æ0æ(ä(ä(ä(ä(ä(ä0æ0æ1$1$0æ0æA&A&Y†Y†AGAGa†a†YÉYÉYÉYÉaÇaÇYÉYÉQÇQÇQÇQÇbŒbŒjËjË@ä@ä@ä@ä8Ä8ä8Ä8ä(ä(ä(ä(ä0Ä0ã(ä(ä8Ä8ä8Ä8ä8Ä8äA$A$8Ä8ä(ä(ä8Ä8ä(ä(ä8Ä8ä1$1$(ä(ä8Ä8äA$A$8Ä8ä9E9E@å@å8ã8ä8Ä8ä8Ä8äIEIEAGAGjËjËrjYÉYÉI‡I‡YEYEI‡I‡AGAGI‡I‡aÇaÇI‡I‡Y†Y†I‡I‡aÇaÇjIjIƒo{pAFAG9E9E0æ0æ!$!$(ä(ä(å(å0å0å0å0åA&A&AGAGYÉYÉAGAGAGAGYÇYÇYÇYÇAGAG@å@åI$I$ZZk/k/YEYE@ä@ä@ä@ä0Ä0ã(ä(ä(Ä(Ä0Ä0ä0Ä0ä8ä8ã@å@å0Ã0äA$A$0Ä0ã8Ä8ä8Ä8äA$A$8ä8ã8Ä8ä8Ä8äHäHä0Ä0ä8ä8ãIEIE8Ä8ä8ä8ã8ä8ã@ä@ä@ä@äYÉYÉjËjËbbjjaÇaÇI‡I‡I‡I‡I‡I‡aÇaÇYÉYÉI‡I‡YÉYÉI‡I‡a†a†{,{,bŒbŒ(ä(ä0å0å1†1†Ä Ä å å å å å å(ä(ä(ä(ä8Ä8äAGAGAÇAÇY†Y†I‡I‡Y†Y†AGAGQEQEIEIEbŒbŒbŒbŒ@ä@ä(Ä(Ã0Ä0ã(ä(ä0Ä0ã(ä(ä(ä(ä8Ä8ä0Ä0ãA$A$8Ä8ä0Ä0ãA$A$8Ä8ä8Ä8ä8ä8ã8Ä8ä8Ä8äAEAE@ä@ä0Ä0ä8Ä8Ã8Ä8äIEIE@ä@ä0Ä0ã8ä8ãI$I$QEQEbŒbŒZJbJiÇiÇYÉYÉI‡I‡Y†Y†I‡I‡aÇaÇI‡I‡YÉYÉaÇaÇI‡I‡YÉYÉbb{oƒp0å0å0å0å0æ0æ å å å å å å0æ0æ(ä(ä(ä(ä0Ä0ãQÇQÇ0Ã0ä8Ä8äQÇQÇYÇYÇAGAG@å@åI$I$ZZk/k/YEYE@ä@ä@ä@ä0Ä0ã(ä(ä(Ä(Ä0Ä0ä0Ä0ä8ä8ã@å@å0Ã0äA$A$0Ä0ã8Ä8ä8Ä8äA$A$8ä8ã8Ä8ä8Ä8äHäHä0Ä0ä8ä8ãIEIE8Ä8ä8ä8ã8ä8ã@ä@ä@ä@äYÉYÉjËjËbbjjaÇaÇI‡I‡I‡I‡I‡I‡aÇaÇYÉYÉI‡I‡YÉYÉI‡I‡a†a†{,{,bŒbŒ(ä(ä0å0å1†1†Ä Ä å å å å å å(ä(ä(ä(ä8Ä8äAGAGAÇAÇY†Y†I‡I‡Y†Y†AGAGQEQEIEIEbŒbŒbŒbŒ@ä@ä(Ä(Ã0Ä0ã(ä(ä0Ä0ã(ä(ä(ä(ä8Ä8ä0Ä0ãA$A$8Ä8ä0Ä0ãA$A$8Ä8ä8Ä8ä8ä8ã8Ä8ä8Ä8äAEAE@ä@ä0Ä0ä8Ä8Ã8Ä8äIEIE@ä@ä0Ä0ã8ä8ãI$I$QEQEbŒbŒZJbJiÇiÇYÉYÉI‡I‡Y†Y†I‡I‡aÇaÇI‡I‡YÉYÉaÇaÇI‡I‡YÉYÉbb{oƒp0å0å0å0å0æ0æ å å å å å å0æ0æ(ä(ä(ä(ä0Ä0ãQÇQÇ0Ã0ä8Ä8äQÇQÇQÇQÇI‡I‡I†I†A&A&ZJbJc/c/bbAGAG8æ8æ0å0å0å0å0å0å8Ä8ä0å0å(ä(ä0Ä0ã(ä(ä0Ä0ã(ä(ä8Ä8ä1$1$(ä(ä8Ä8ä9†9†A&A&1†1†(ä(äA&A&A&A&0æ0æAGAGAGAGI‡I‡AGAGZJbJbŒbŒI‡I‡AGAGI†I†I‡I‡I‡I‡YEYEAGAGAGAGQÇQÇAGAGQEQEQEQE{.{.k/k/0Ã0äA&A&AGAGAGAGAEAEA&A&IEIEIEIEA&A&AEAEQÇQÇZZbbZJbJbbZJbJZJbJJJk/k/s/k/I‡I‡9†9†AGAG0æ0æ0å0å0æ0æ8Ä8ä(ä(ä8Ä8ä(ä(ä0Ä0ã ä ä(ä(ä(ä(ä8Ä8ä(ä(ä8Ä8ä9E9E8æ8æ0å0å0å0å9E9EA&A&0æ0æA†A†A&A&I‡I‡AGAGJJjÍjÍYÉYÉAÇAÇI†I†I‡I‡I‡I‡Y†Y†AGAGAGAGI‡I‡AGAGYEYEA&A&bbƒÒƒÑAGAG9E9EAGAGQÇQÇ8Ä8äA†A†A&A&IEIE9E9EA&A&QEQEAGAGA†A†A&A&QÇQÇI‡I‡I†I†A&A&ZJbJc/c/bbAGAG8æ8æ0å0å0å0å0å0å8Ä8ä0å0å(ä(ä0Ä0ã(ä(ä0Ä0ã(ä(ä8Ä8ä1$1$(ä(ä8Ä8ä9†9†A&A&1†1†(ä(äA&A&A&A&0æ0æAGAGAGAGI‡I‡AGAGZJbJbŒbŒI‡I‡AGAGI†I†I‡I‡I‡I‡YEYEAGAGAGAGQÇQÇAGAGQEQEQEQE{.{.k/k/0Ã0äA&A&AGAGAGAGAEAEA&A&IEIEIEIEA&A&AEAEQÇQÇZZbbZJbJbbZJbJZJbJJJk/k/s/k/I‡I‡9†9†AGAG0æ0æ0å0å0æ0æ8Ä8ä(ä(ä8Ä8ä(ä(ä0Ä0ã ä ä(ä(ä(ä(ä8Ä8ä(ä(ä8Ä8ä9E9E8æ8æ0å0å0å0å9E9EA&A&0æ0æA†A†A&A&I‡I‡AGAGJJjÍjÍYÉYÉAÇAÇI†I†I‡I‡I‡I‡Y†Y†AGAGAGAGI‡I‡AGAGYEYEA&A&bbƒÒƒÑAGAG9E9EAGAGQÇQÇ8Ä8äA†A†A&A&IEIE9E9EA&A&QEQEAGAGA†A†A&A&{,{,jÍjÍrËjËjÍjÍrËjË{.{.bŒbŒbŒbŒbŒbŒbŒbŒRŠRŠbbR‹R‹ZJbJbŒbŒc,c,bŒbŒR‹R‹ZJbJR‹R‹jŠjŠZJbJZJbJbŒbŒR -R -bŒbŒc,c,k-k-s/k/{Ï{Ï{,{,c,c,k/k/rËjËc,c,k/k/c,c,ZJbJR -R -R -R -R -R -R‹R‹ZJbJZJbJZJbJbŒbŒR‹R‹bŒbŒ{Ï{σЃÐk/k/c,c,k-k-{,{,jËjË{.{.{oƒp{oƒp{o{o{,{,“ЋГЋД2Œ1“ЋЃЃЃЃÐ{Ï{Ï{oƒpjËjË{.{.{.{.ZJbJbŒbŒRŠRŠbŒbŒZIZIZIZIbŒbŒR‹R‹c,c,ZÌZÌZJbJZJbJZJbJZJbJZJbJR‹R‹bŒbŒZJbJc,c,bŒbŒc,c,{.{.{Ï{Ï{.{.k-k-s.k-k-k-rÎjÍjËjËs-k-ZÌZÌZJbJRRR -R -R -R -R‹R‹ZJbJZJbJZJbJZÌZÌZJbJk/k/ƒÏƒÏk/k/s/k/c,c,{,{,jËjË{.{.{,{,{oƒp{oƒp{o{o{.{.“ϋσЃÐ{.{.{,{,jÍjÍrËjËjÍjÍrËjË{.{.bŒbŒbŒbŒbŒbŒbŒbŒRŠRŠbbR‹R‹ZJbJbŒbŒc,c,bŒbŒR‹R‹ZJbJR‹R‹jŠjŠZJbJZJbJbŒbŒR -R -bŒbŒc,c,k-k-s/k/{Ï{Ï{,{,c,c,k/k/rËjËc,c,k/k/c,c,ZJbJR -R -R -R -R -R -R‹R‹ZJbJZJbJZJbJbŒbŒR‹R‹bŒbŒ{Ï{σЃÐk/k/c,c,k-k-{,{,jËjË{.{.{oƒp{oƒp{o{o{,{,“ЋГЋД2Œ1“ЋЃЃЃЃÐ{Ï{Ï{oƒpjËjË{.{.{.{.ZJbJbŒbŒRŠRŠbŒbŒZIZIZIZIbŒbŒR‹R‹c,c,ZÌZÌZJbJZJbJZJbJZJbJZJbJR‹R‹bŒbŒZJbJc,c,bŒbŒc,c,{.{.{Ï{Ï{.{.k-k-s.k-k-k-rÎjÍjËjËs-k-ZÌZÌZJbJRRR -R -R -R -R‹R‹ZJbJZJbJZJbJZÌZÌZJbJk/k/ƒÏƒÏk/k/s/k/c,c,{,{,jËjË{.{.{,{,{oƒp{oƒp{o{o{.{.“ϋσЃÐ{.{.IEIE@å@åQEQEIEIEQEQEQEQEQEQE@ä@ä8Ä8äIEIEIEIE@å@åIEIEQEQEbbZJbJAGAGY…Y…YEYEQEQEYEYEY†Y†QEQEQEQEAEAEQ…Q…IEIEIEIEQÇQÇbŒbŒZZYEYEAGAGY†Y†AGAGQEQEIEIEIEIEA&A&A†A†IEIEAGAGY†Y†AGAGQÇQÇYÇYÇYÉYÉQÇQÇQÇQÇI‡I‡YÇYÇbbI‡I‡YÉYÉYÇYÇZZYÇYÇbbbŒbŒbbQÇQÇZZbIbIYÇYÇY†Y†YEYEQEQEHäHäYEYEQEQEQEQE8Ä8ä@å@åIEIEAEAE@å@åIEIEI$I$I‡I‡jËjËI‡I‡Y†Y†Y†Y†QEQEQEQEY†Y†QEQEQEQEIEIEIEIEQ…Q…QEQEAGAGZJbJbIbIQÇQÇAGAGY†Y†AGAGQEQEIEIEA&A&QEQEA&A&AGAGAGAGI†I†Y†Y†AGAGZZYÇYÇYÉYÉQÇQÇQÇQÇYÉYÉYÇYÇJJYÉYÉQÇQÇYÉYÉaÇaÇZZbŒbŒbbY†Y†AGAGA$A$9E9EIEIE@å@åQEQEIEIEQEQEQEQEQEQE@ä@ä8Ä8äIEIEIEIE@å@åIEIEQEQEbbZJbJAGAGY…Y…YEYEQEQEYEYEY†Y†QEQEQEQEAEAEQ…Q…IEIEIEIEQÇQÇbŒbŒZZYEYEAGAGY†Y†AGAGQEQEIEIEIEIEA&A&A†A†IEIEAGAGY†Y†AGAGQÇQÇYÇYÇYÉYÉQÇQÇQÇQÇI‡I‡YÇYÇbbI‡I‡YÉYÉYÇYÇZZYÇYÇbbbŒbŒbbQÇQÇZZbIbIYÇYÇY†Y†YEYEQEQEHäHäYEYEQEQEQEQE8Ä8ä@å@åIEIEAEAE@å@åIEIEI$I$I‡I‡jËjËI‡I‡Y†Y†Y†Y†QEQEQEQEY†Y†QEQEQEQEIEIEIEIEQ…Q…QEQEAGAGZJbJbIbIQÇQÇAGAGY†Y†AGAGQEQEIEIEA&A&QEQEA&A&AGAGAGAGI†I†Y†Y†AGAGZZYÇYÇYÉYÉQÇQÇQÇQÇYÉYÉYÇYÇJJYÉYÉQÇQÇYÉYÉaÇaÇZZbŒbŒbbY†Y†AGAGA$A$9E9E8Ä8ä9E9E@å@å@å@åA&A&@å@å8Ä8äA$A$0å0å8Ä8ä9E9E@å@åQEQEQEQEbbc/c/YEYEY†Y†YEYEY†Y†Y†Y†YEYEaÇaÇY†Y†I†I†AGAGQÇQÇIEIEI‡I‡c,c,YÉYÉAGAGAGAGA&A&IEIEA&A&@å@åIEIE@å@å@å@å9E9EA&A&A&A&IEIEQEQEA&A&QEQEA&A&AGAGI$I$A&A&0å0å8Ä8äA†A†A&A&AGAGYEYEYÉYÉZZQEQEQEQEA&A&QEQE@å@åQEQEA&A&I$I$A&A&@å@å@å@å8Ä8äA$A$8Ä8ä8Ä8ä9E9E@ä@äA&A&QEQEYEYEjÍjÍbbYEYEYEYEYEYEY†Y†YEYEaÇaÇY†Y†Y†Y†I†I†I†I†I†I†AGAGbŒbŒZJbJY†Y†A&A&IEIEA&A&@å@åIEIE@å@å9E9EA&A&8Ä8äIEIEA&A&A&A&QEQEA&A&QEQEA&A&AGAGQEQE@å@å9E9E0å0å@å@åA&A&QEQEAGAGa†a†bbI‡I‡QEQEA&A&8Ä8ä8Ä8ä8ä8Ä9E9E@å@å@å@åA&A&@å@å8Ä8äA$A$0å0å8Ä8ä9E9E@å@åQEQEQEQEbbc/c/YEYEY†Y†YEYEY†Y†Y†Y†YEYEaÇaÇY†Y†I†I†AGAGQÇQÇIEIEI‡I‡c,c,YÉYÉAGAGAGAGA&A&IEIEA&A&@å@åIEIE@å@å@å@å9E9EA&A&A&A&IEIEQEQEA&A&QEQEA&A&AGAGI$I$A&A&0å0å8Ä8äA†A†A&A&AGAGYEYEYÉYÉZZQEQEQEQEA&A&QEQE@å@åQEQEA&A&I$I$A&A&@å@å@å@å8Ä8äA$A$8Ä8ä8Ä8ä9E9E@ä@äA&A&QEQEYEYEjÍjÍbbYEYEYEYEYEYEY†Y†YEYEaÇaÇY†Y†Y†Y†I†I†I†I†I†I†AGAGbŒbŒZJbJY†Y†A&A&IEIEA&A&@å@åIEIE@å@å9E9EA&A&8Ä8äIEIEA&A&A&A&QEQEA&A&QEQEA&A&AGAGQEQE@å@å9E9E0å0å@å@åA&A&QEQEAGAGa†a†bbI‡I‡QEQEA&A&8Ä8ä8Ä8ä8Ä8ä8Ä8ä9E9E@å@å8Ä8äA$A$0å0å9$9$9E9E@å@å@å@åA$A$9E9EAGAGjjbŒbŒ@å@åYEYEaÇaÇYEYEaÇaÇY†Y†Y†Y†aÇaÇI‡I‡QÇQÇAGAGI‡I‡AÇAÇbŒbŒZZYEYEA&A&IEIE@å@å9E9E@å@åA&A&8Ä8ä9E9EA&A&A&A&@å@åIEIEA&A&QEQEA&A&AGAGQEQEA&A&A&A&9E9E0å0åAGAGIEIEA&A&QEQEa†a†YÉYÉAGAGYEYEI‡I‡QEQE@å@åA&A&QEQE8å8å@å@åA$A$9E9E8Ä8ä9E9E0å0å9E9E8Ä8äIEIE@å@åA&A&YÉYÉjÍjÍAGAGQEQEa†a†aÇaÇI‡I‡YEYEa†a†aÇaÇI‡I‡QÇQÇI‡I‡AGAGA†A†R -R -rIjIAGAGI†I†A&A&IEIE@å@å9E9EA&A&@å@åA$A$9E9EA&A&@å@åQEQEA&A&QEQE9E9EAGAGQEQE@å@åA†A†@å@å0å0åAGAGIEIEA&A&QEQEYEYEYÉYÉI†I†Y†Y†YEYEA&A&@å@å8ä8Ä8ä8Ä9E9E@å@å8ä8ÄA$A$0å0å9$9$9E9E@å@å@å@åA$A$9E9EAGAGjjbŒbŒ@å@åYEYEaÇaÇYEYEaÇaÇY†Y†Y†Y†aÇaÇI‡I‡QÇQÇAGAGI‡I‡AÇAÇbŒbŒZZYEYEA&A&IEIE@å@å9E9E@å@åA&A&8Ä8ä9E9EA&A&A&A&@å@åIEIEA&A&QEQEA&A&AGAGQEQEA&A&A&A&9E9E0å0åAGAGIEIEA&A&QEQEa†a†YÉYÉAGAGYEYEI‡I‡QEQE@å@åA&A&QEQE8å8å@å@åA$A$9E9E8Ä8ä9E9E0å0å9E9E8Ä8äIEIE@å@åA&A&YÉYÉjÍjÍAGAGQEQEa†a†aÇaÇI‡I‡YEYEa†a†aÇaÇI‡I‡QÇQÇI‡I‡AGAGA†A†R -R -rIjIAGAGI†I†A&A&IEIE@å@å9E9EA&A&@å@åA$A$9E9EA&A&@å@åQEQEA&A&QEQE9E9EAGAGQEQE@å@åA†A†@å@å0å0åAGAGIEIEA&A&QEQEYEYEYÉYÉI†I†Y†Y†YEYEA&A&@å@å8Ä8ä9E9E8Ä8ä0å0åA$A$0å0å8Ä8ä9E9E@å@å0å0å9$9$A&A&@å@åIEIEYÉYÉZÌZÌ8Ä8äYEYEaÇaÇY†Y†a†a†aÇaÇaÇaÇaÇaÇI‡I‡Y†Y†I‡I‡A†A†JJbŒbŒQÇQÇAGAGQEQEA&A&@å@åIEIE0å0åIEIE@å@å9E9E@å@å9E9EA&A&I†I†A&A&IEIEIEIEA&A&A&A&IEIE0å0å8Ä8ä9E9EA&A&AGAGI$I$YEYEYÉYÉYÉYÉQEQEI‡I‡QEQEA&A&QEQE8å8åA&A&@å@å8Ä8ä8Ä8ä9E9E8Ä8ä0å0å@å@å9E9E@å@å0å0åIEIE@å@åI†I†k-k-AGAGQEQEYEYEaÇaÇYEYEiÇiÇYÉYÉa†a†a†a†I‡I‡QÇQÇAGAGA†A†R -R -bbAGAGI†I†A&A&@å@å9E9EA&A&8Ä8äIEIE@å@å@å@å9E9EA&A&A&A&QEQEA&A&IEIEA&A&AGAGA&A&@å@å9E9E8Ä8äA†A†A&A&IEIEA&A&YEYEZJbJI‡I‡YEYEA&A&@å@å8Ä8ä8ä8Ä9E9E8ä8Ä0å0åA$A$0å0å8Ä8ä9E9E@å@å0å0å9$9$A&A&@å@åIEIEYÉYÉZÌZÌ8Ä8äYEYEaÇaÇY†Y†a†a†aÇaÇaÇaÇaÇaÇI‡I‡Y†Y†I‡I‡A†A†JJbŒbŒQÇQÇAGAGQEQEA&A&@å@åIEIE0å0åIEIE@å@å9E9E@å@å9E9EA&A&I†I†A&A&IEIEIEIEA&A&A&A&IEIE0å0å8Ä8ä9E9EA&A&AGAGI$I$YEYEYÉYÉYÉYÉQEQEI‡I‡QEQEA&A&QEQE8å8åA&A&@å@å8Ä8ä8Ä8ä9E9E8Ä8ä0å0å@å@å9E9E@å@å0å0åIEIE@å@åI†I†k-k-AGAGQEQEYEYEaÇaÇYEYEiÇiÇYÉYÉa†a†a†a†I‡I‡QÇQÇAGAGA†A†R -R -bbAGAGI†I†A&A&@å@å9E9EA&A&8Ä8äIEIE@å@å@å@å9E9EA&A&A&A&QEQEA&A&IEIEA&A&AGAGA&A&@å@å9E9E8Ä8äA†A†A&A&IEIEA&A&YEYEZJbJI‡I‡YEYEA&A&@å@å8Ä8ä8Ä8ä(ä(ä@å@å8Ä8ä9E9E8Ä8ä(ä(ä0å0å0å0åA$A$@å@å9E9E8Ä8ä9E9EbbZÌZÌYÇYÇa†a†iÇiÇrjzzzzzziÇiÇrjAGAGQÇQÇA&A&R -R -bJZJQÇQÇA&A&AGAG@å@åIEIE0å0å@å@å9E9E@å@å9E9EA&A&IEIE@å@åA&A&QEQEA&A&A&A&AGAGIEIE@å@å9E9E8Ä8ä8Ä8äA&A&IEIEA&A&YEYEYÉYÉbbI‡I‡QEQEA&A&A&A&QEQEA&A&I$I$8Ä8äAEAE8Ä8ä@å@å(ä(äA$A$0å0å@å@å9$9$@å@å8Ä8ä9E9EAGAGbŒbŒbbY†Y†aÇaÇiÇiÇzzzziÇiÇzziÇiÇQÇQÇAGAGI†I†AGAGbŒbŒYÉYÉA†A†QEQE9E9EA&A&A&A&8Ä8ä9E9E8å8å@å@åA&A&9E9EIEIEA&A&IEIEA&A&A&A&AGAGQEQE@å@å9E9E0å0å8Ä8ä9E9EA&A&A&A&YEYEY†Y†ZJbJaÇaÇA&A&A&A&@ä@ä8Ä8ä8ä8Ä(ä(ä@å@å8ä8Ä9E9E8ä8Ä(ä(ä0å0å0å0åA$A$@å@å9E9E8Ä8ä9E9EbbZÌZÌYÇYÇa†a†iÇiÇrjzzzzzziÇiÇrjAGAGQÇQÇA&A&R -R -bJZJQÇQÇA&A&AGAG@å@åIEIE0å0å@å@å9E9E@å@å9E9EA&A&IEIE@å@åA&A&QEQEA&A&A&A&AGAGIEIE@å@å9E9E8Ä8ä8Ä8äA&A&IEIEA&A&YEYEYÉYÉbbI‡I‡QEQEA&A&A&A&QEQEA&A&I$I$8Ä8äAEAE8Ä8ä@å@å(ä(äA$A$0å0å@å@å9$9$@å@å8Ä8ä9E9EAGAGbŒbŒbbY†Y†aÇaÇiÇiÇzzzziÇiÇzziÇiÇQÇQÇAGAGI†I†AGAGbŒbŒYÉYÉA†A†QEQE9E9EA&A&A&A&8Ä8ä9E9E8å8å@å@åA&A&9E9EIEIEA&A&IEIEA&A&A&A&AGAGQEQE@å@å9E9E0å0å8Ä8ä9E9EA&A&A&A&YEYEY†Y†ZJbJaÇaÇA&A&A&A&@ä@ä8Ä8ä8Ä8ä8Ä8ä9$9$8Ä8ä8Ä8äA$A$8Ä8ä8Ä8ä8Ä8ä9E9E8Ä8ä9E9EA&A&QEQEYÉYÉZÌZÌI‡I‡QÇQÇAGAGaÇaÇYÉYÉjjYÉYÉa†a†I‡I‡A&A&8Ä8äAÇAÇI‡I‡R -R -QEQEIEIEA&A&AEAE@å@å8Ä8ä9E9E@å@å8Ä8ä9E9EA&A&8Ä8äIEIEIEIEA&A&QEQEA&A&IEIE@å@å@å@å9E9E@å@å9†9†@å@åIEIEA&A&YEYEYÉYÉZJbJYEYEA&A&YEYEAGAGHäHäQEQE@å@å@å@åHäHä0Ä0ãIEIE(ä(ä8Ä8ä8Ä8ä9E9E8Ä8ä9E9EIEIEA&A&Y†Y†bŒbŒRRI‡I‡I†I†I‡I‡YÉYÉbbjjYÉYÉYÇYÇAGAG8Ä8äA†A†A&A&R‹R‹QÇQÇA&A&QEQE@å@å9E9E@å@å8Ä8ä@å@å9E9E8Ä8ä9E9EA&A&A&A&@å@åQEQEIEIEIEIEA&A&A&A&8Ä8ä9E9EA&A&@å@å9E9EQEQEA&A&QEQEYEYEZJbJYÉYÉQEQEQEQE8Ä8ä8Ä8ä8ä8Ä8ä8Ä9$9$8Ä8ä8Ä8äA$A$8Ä8ä8Ä8ä8Ä8ä9E9E8Ä8ä9E9EA&A&QEQEYÉYÉZÌZÌI‡I‡QÇQÇAGAGaÇaÇYÉYÉjjYÉYÉa†a†I‡I‡A&A&8Ä8äAÇAÇI‡I‡R -R -QEQEIEIEA&A&AEAE@å@å8Ä8ä9E9E@å@å8Ä8ä9E9EA&A&8Ä8äIEIEIEIEA&A&QEQEA&A&IEIE@å@å@å@å9E9E@å@å9†9†@å@åIEIEA&A&YEYEYÉYÉZJbJYEYEA&A&YEYEAGAGHäHäQEQE@å@å@å@åHäHä0Ä0ãIEIE(ä(ä8Ä8ä8Ä8ä9E9E8Ä8ä9E9EIEIEA&A&Y†Y†bŒbŒRRI‡I‡I†I†I‡I‡YÉYÉbbjjYÉYÉYÇYÇAGAG8Ä8äA†A†A&A&R‹R‹QÇQÇA&A&QEQE@å@å9E9E@å@å8Ä8ä@å@å9E9E8Ä8ä9E9EA&A&A&A&@å@åQEQEIEIEIEIEA&A&A&A&8Ä8ä9E9EA&A&@å@å9E9EQEQEA&A&QEQEYEYEZJbJYÉYÉQEQEQEQE8Ä8ä8Ä8äAGAGA†A†AGAGA†A†9E9E9E9E9E9E9†9†AGAG9†9†A&A&A&A&AGAGAGAGZJbJR‹R‹(ä(ä(ä(äÄ Ä£ £ Ä Ä(å(å0æ0æÄ Ä0æ0æR -R -BBBBc/c/ZJbJAGAG0æ0æA†A†A&A&AGAG0å0å0å0å@å@å0æ0æ8Ä8ä9E9EAGAGAGAGA&A&A&A&A&A&A&A&A&A&A&A&9E9E8å8å0å0å@å@åA†A†AGAGI‡I‡I‡I‡YÉYÉjÍjÍbJZJYÉYÉYÉYÉI‡I‡I‡I‡AGAGA&A&IEIE8Ä8ä9E9E8Ä8ä(ä(ä(ä(ä(ä(ä0å0å0æ0æAGAGA&A&AGAGRRc-c-AÇAÇ Ä Ä ÄÄ ÄÃ(Ä(ÃÄ Ä0æ0æ(ä(ä å åI‡I‡BBAÇAÇR -R -c/c/AGAGA&A&AGAG0æ0æAGAG0æ0æ9E9E0å0å@å@å1†1†8Ä8äA&A&AGAGA&A&A&A&A&A&A&A&A&A&A&A&IEIE8å8å8Ä8ä9E9EA&A&AGAGI‡I‡I‡I‡YÉYÉjŠjŠbŒbŒYÉYÉYÉYÉYÉYÉI‡I‡AGAGA†A†AGAGA†A†9E9E9E9E9E9E9†9†AGAG9†9†A&A&A&A&AGAGAGAGZJbJR‹R‹(ä(ä(ä(äÄ Ä£ £ Ä Ä(å(å0æ0æÄ Ä0æ0æR -R -BBBBc/c/ZJbJAGAG0æ0æA†A†A&A&AGAG0å0å0å0å@å@å0æ0æ8Ä8ä9E9EAGAGAGAGA&A&A&A&A&A&A&A&A&A&A&A&9E9E8å8å0å0å@å@åA†A†AGAGI‡I‡I‡I‡YÉYÉjÍjÍbJZJYÉYÉYÉYÉI‡I‡I‡I‡AGAGA&A&IEIE8Ä8ä9E9E8Ä8ä(ä(ä(ä(ä(ä(ä0å0å0æ0æAGAGA&A&AGAGRRc-c-AÇAÇ Ä Ä ÄÄ ÄÃ(Ä(ÃÄ Ä0æ0æ(ä(ä å åI‡I‡BBAÇAÇR -R -c/c/AGAGA&A&AGAG0æ0æAGAG0æ0æ9E9E0å0å@å@å1†1†8Ä8äA&A&AGAGA&A&A&A&A&A&A&A&A&A&A&A&IEIE8å8å8Ä8ä9E9EA&A&AGAGI‡I‡I‡I‡YÉYÉjŠjŠbŒbŒYÉYÉYÉYÉYÉYÉI‡I‡k/k/rËjËk/k/rËjËbŒbŒƒÐƒÐk/k/bJZJc,c,bbR‹R‹ZJbJZJbJZÌZÌjËjËs-k-ZJbJZJbJZJbJJJZJbJbŒbŒc/c/k-k-{Ï{σЃÐ{.{.{.{.{.{.{,{,k,k,s/k/k,k,s/k/c,c,ƒÒƒÑ{.{.c,c,c,c,c/c/bŒbŒƒÐƒÐk/k/s,k,k/k/c,c,{.{.c,c,jÍjÍs/k/ƒÐƒÐ{oƒpc,c,{oƒp{oƒp{o{o{.{.{.{.{oƒp{,{,{.{.{.{.{.{.k/k/jËrËk-k-jËrËjÍjÍbŒbŒZJbJR -R -R -R -JJR -R -ZIZIbŒbŒR‹R‹RŠRŠjÍjÍrËjËZJbJR‹R‹ZJbJR -R -bJZJbŒbŒc,c,k-k-{.{.ƒÐƒÐ{oƒpk-k-k-s.{,{,k-k-k,s,k/k/k,s,k/k/{.{.ƒÐƒÐk-k-bŒbŒk-k-ZÌZÌ{oƒp{oƒpc.c/k-k-s.k-k-k-s.k-bŒbŒk-k-ƒÐƒÐƒÒƒÑbŒbŒ{oƒp{oƒps.{.{.{.{.{.{.{.{oƒp{.{.{.{.k-k-{.{.k/s/jËjËk/s/jËjËbŒbŒƒÐƒÐk/k/bJZJc,c,bbR‹R‹ZJbJZJbJZÌZÌjËjËs-k-ZJbJZJbJZJbJJJZJbJbŒbŒc/c/k-k-{Ï{σЃÐ{.{.{.{.{.{.{,{,k,k,s/k/k,k,s/k/c,c,ƒÒƒÑ{.{.c,c,c,c,c/c/bŒbŒƒÐƒÐk/k/s,k,k/k/c,c,{.{.c,c,jÍjÍs/k/ƒÐƒÐ{oƒpc,c,{oƒp{oƒp{o{o{.{.{.{.{oƒp{,{,{.{.{.{.{.{.k/k/jËrËk-k-jËrËjÍjÍbŒbŒZJbJR -R -R -R -JJR -R -ZIZIbŒbŒR‹R‹RŠRŠjÍjÍrËjËZJbJR‹R‹ZJbJR -R -bJZJbŒbŒc,c,k-k-{.{.ƒÐƒÐ{oƒpk-k-k-s.{,{,k-k-k,s,k/k/k,s,k/k/{.{.ƒÐƒÐk-k-bŒbŒk-k-ZÌZÌ{oƒp{oƒpc.c/k-k-s.k-k-k-s.k-bŒbŒk-k-ƒÐƒÐƒÒƒÑbŒbŒ{oƒp{oƒps.{.{.{.{.{.{.{.{oƒp{.{.{.{.k-k-{.{.Y†Y†Y†Y†Y†Y†AGAGY†Y†ƒÐƒÐjŠjŠ8Ä8äQEQEA&A&@å@åAEAEAEAEQEQEA&A&QEQEAGAGQÇQÇAGAGI†I†AGAGQÇQÇI†I†Y†Y†QÇQÇI†I†QEQEIEIEIEIEIEIEA&A&QEQEQÇQÇY…Y…Y†Y†jŠjŠ“Ð‹ÐR -R -QÇQÇQEQEI†I†I†I†AGAGI†I†AGAGQEQEI†I†YEYEY†Y†YÉYɃЃÐjŠjŠbbZZQÇQÇYÇYÇYÉYÉY†Y†Y†Y†I‡I‡I†I†AGAGQÇQÇY†Y†YÉYÉY†Y†YÇYÇ{,{,bŒbŒIEIE@å@åI$I$AEAEI$I$A&A&8ã8äQEQEQEQEA&A&AGAGI†I†I‡I‡Y†Y†AGAGAGAGQÇQÇI†I†Y†Y†I‡I‡QÇQÇIEIEQEQEA&A&IEIEI†I†QEQEQEQEY†Y†Y†Y†ZZƒÏƒÏk-k-Y†Y†I†I†I†I†I†I†A&A&I†I†I†I†QEQEA&A&Y†Y†Y†Y†Y†Y†k-k-{.{.bbZZQÇQÇYÇYÇYÉYÉYÇYÇaÇaÇI†I†AGAGY†Y†I†I†Y†Y†Y†Y†Y†Y†Y†Y†AGAGY†Y†ƒÐƒÐjŠjŠ8Ä8äQEQEA&A&@å@åAEAEAEAEQEQEA&A&QEQEAGAGQÇQÇAGAGI†I†AGAGQÇQÇI†I†Y†Y†QÇQÇI†I†QEQEIEIEIEIEIEIEA&A&QEQEQÇQÇY…Y…Y†Y†jŠjŠ“Ð‹ÐR -R -QÇQÇQEQEI†I†I†I†AGAGI†I†AGAGQEQEI†I†YEYEY†Y†YÉYɃЃÐjŠjŠbbZZQÇQÇYÇYÇYÉYÉY†Y†Y†Y†I‡I‡I†I†AGAGQÇQÇY†Y†YÉYÉY†Y†YÇYÇ{,{,bŒbŒIEIE@å@åI$I$AEAEI$I$A&A&8ã8äQEQEQEQEA&A&AGAGI†I†I‡I‡Y†Y†AGAGAGAGQÇQÇI†I†Y†Y†I‡I‡QÇQÇIEIEQEQEA&A&IEIEI†I†QEQEQEQEY†Y†Y†Y†ZZƒÏƒÏk-k-Y†Y†I†I†I†I†I†I†A&A&I†I†I†I†QEQEA&A&Y†Y†Y†Y†Y†Y†k-k-{.{.bbZZQÇQÇYÇYÇYÉYÉYÇYÇaÇaÇI†I†AGAGY†Y†I†I†Y†Y†QEQEQEQEY†Y†AGAGYEYEk-k-R -R -IEIEI$I$I$I$QEQE@å@åQEQEQEQEA&A&QEQEA&A&QEQEIEIEA&A&QEQEAGAGQEQEAGAGQEQEYEYEA&A&IEIEA&A&IEIEIEIEQEQEYEYEY†Y†YEYEjËjË{Ð{ÐbIbIQEQEA&A&QEQEQEQEA&A&QEQEQEQEQEQEA&A&YEYEAGAGiÇiÇs/k/I†I†YEYEAGAGYEYEYEYEQEQEAGAGQEQEAGAGQEQEA&A&I†I†AGAGI†I†YEYEYEYEZJbJbŒbŒHäHäHäHäHäHä8ä8ã@å@åQEQEIEIE@å@åQEQEQEQEA&A&I$I$QEQEA&A&QEQEIEIEAGAGQEQEAGAGQEQEY†Y†IEIEIEIEA&A&IEIEI$I$IEIEQEQEY†Y†Y†Y†bbƒÐƒÐk-k-I$I$AGAGQEQEQEQEQEQEA&A&QEQEAGAGQEQEQEQEAGAGYEYE{,{,ZJbJQEQEQEQEYEYEI‡I‡QEQEQEQEA&A&QEQEAGAGQEQEQEQEAGAGQEQEQEQEY†Y†AGAGYEYEk-k-R -R -IEIEI$I$I$I$QEQE@å@åQEQEQEQEA&A&QEQEA&A&QEQEIEIEA&A&QEQEAGAGQEQEAGAGQEQEYEYEA&A&IEIEA&A&IEIEIEIEQEQEYEYEY†Y†YEYEjËjË{Ð{ÐbIbIQEQEA&A&QEQEQEQEA&A&QEQEQEQEQEQEA&A&YEYEAGAGiÇiÇs/k/I†I†YEYEAGAGYEYEYEYEQEQEAGAGQEQEAGAGQEQEA&A&I†I†AGAGI†I†YEYEYEYEZJbJbŒbŒHäHäHäHäHäHä8ä8ã@å@åQEQEIEIE@å@åQEQEQEQEA&A&I$I$QEQEA&A&QEQEIEIEAGAGQEQEAGAGQEQEY†Y†IEIEIEIEA&A&IEIEI$I$IEIEQEQEY†Y†Y†Y†bbƒÐƒÐk-k-I$I$AGAGQEQEQEQEQEQEA&A&QEQEAGAGQEQEQEQEAGAGYEYE{,{,ZJbJQEQEQEQEYEYEI‡I‡QEQEQEQEA&A&QEQEAGAGQEQEQEQEAGAGQEQEY†Y†A&A&QEQEYEYEZJbJRR@å@åQEQE@å@åI$I$QEQEQEQEA&A&I$I$QEQE@å@åIEIEI$I$IEIEA&A&IEIEQEQEQEQEY†Y†QEQEQEQEA&A&IEIEQEQEQEQEYEYEY†Y†QÇQÇYEYEjŠjŠƒÒƒÑI‡I‡QEQEAGAGQEQEA&A&QEQEA&A&QEQEA&A&QEQEAGAGYEYEYÇYǃЃÐI‡I‡YEYEYEYEYEYEAGAGYEYEYEYEAGAGYEYEI†I†AGAGQEQEA&A&I†I†I‡I‡YEYEjËjËbJZJI$I$@å@åHäHä0Ä0ãA$A$IEIEI$I$QEQE@å@åIEIEIEIEI$I$QEQEIEIEA&A&IEIEI$I$AGAGQEQEQEQEQEQEQEQEA&A&IEIEQEQEQEQEQEQEY†Y†Y†Y†QEQEaÇaǃЃÐZJbJAGAGQEQEQEQEA&A&A&A&QEQEQEQEA&A&QEQEIEIEYEYEYEYEjÍjÍbŒbŒYEYEYEYEYEYEAGAGQEQEYEYEYEYEI†I†YEYEA&A&I†I†QEQEQEQEY†Y†A&A&QEQEYEYEZJbJRR@å@åQEQE@å@åI$I$QEQEQEQEA&A&I$I$QEQE@å@åIEIEI$I$IEIEA&A&IEIEQEQEQEQEY†Y†QEQEQEQEA&A&IEIEQEQEQEQEYEYEY†Y†QÇQÇYEYEjŠjŠƒÒƒÑI‡I‡QEQEAGAGQEQEA&A&QEQEA&A&QEQEA&A&QEQEAGAGYEYEYÇYǃЃÐI‡I‡YEYEYEYEYEYEAGAGYEYEYEYEAGAGYEYEI†I†AGAGQEQEA&A&I†I†I‡I‡YEYEjËjËbJZJI$I$@å@åHäHä0Ä0ãA$A$IEIEI$I$QEQE@å@åIEIEIEIEI$I$QEQEIEIEA&A&IEIEI$I$AGAGQEQEQEQEQEQEQEQEA&A&IEIEQEQEQEQEQEQEY†Y†Y†Y†QEQEaÇaǃЃÐZJbJAGAGQEQEQEQEA&A&A&A&QEQEQEQEA&A&QEQEIEIEYEYEYEYEjÍjÍbŒbŒYEYEYEYEYEYEAGAGQEQEYEYEYEYEI†I†YEYEA&A&I†I†QEQEQEQEA&A&QEQEA&A&YEYER -R -YÉYÉ@å@åI$I$I$I$QEQEI$I$QEQEI$I$A&A&HäHäQEQEI$I$A&A&I$I$QEQEQEQEQEQEQEQEYEYEY†Y†QEQEQEQEQEQEYEYEY†Y†Y†Y†Y†Y†Y…Y…Y…Y…jËj˃ЃÐI‡I‡A&A&I$I$A&A&I$I$A&A&QEQEA&A&AEAEA&A&IEIEQEQEa†a†{oƒpbbYEYEYEYEY†Y†QEQEYEYEAGAGYEYEYEYEQEQEAGAGIEIEA&A&AGAGQÇQÇjjbJZJbŒbŒI$I$@ä@ä@å@å8ã8äI$I$I$I$QEQEA&A&QEQEHäHäQEQEQEQE@å@åI$I$A&A&I$I$QEQEQEQEQEQEYEYEY†Y†QEQEQEQEQEQEYEYEY†Y†Y†Y†Y†Y†Y†Y†Y…Y…bIbIƒÐƒÐZJbJAEAEQEQE8å8åQEQEA&A&QEQE@å@åIEIEA&A&A&A&QEQEYEYE{,{,bŒbŒYEYEY†Y†YEYEQEQEYEYEAGAGQEQEYEYEAGAGQEQEA&A&QEQEQEQEA&A&QEQEA&A&YEYER -R -YÉYÉ@å@åI$I$I$I$QEQEI$I$QEQEI$I$A&A&HäHäQEQEI$I$A&A&I$I$QEQEQEQEQEQEQEQEYEYEY†Y†QEQEQEQEQEQEYEYEY†Y†Y†Y†Y†Y†Y…Y…Y…Y…jËj˃ЃÐI‡I‡A&A&I$I$A&A&I$I$A&A&QEQEA&A&AEAEA&A&IEIEQEQEa†a†{oƒpbbYEYEYEYEY†Y†QEQEYEYEAGAGYEYEYEYEQEQEAGAGIEIEA&A&AGAGQÇQÇjjbJZJbŒbŒI$I$@ä@ä@å@å8ã8äI$I$I$I$QEQEA&A&QEQEHäHäQEQEQEQE@å@åI$I$A&A&I$I$QEQEQEQEQEQEYEYEY†Y†QEQEQEQEQEQEYEYEY†Y†Y†Y†Y†Y†Y†Y†Y…Y…bIbIƒÐƒÐZJbJAEAEQEQE8å8åQEQEA&A&QEQE@å@åIEIEA&A&A&A&QEQEYEYE{,{,bŒbŒYEYEY†Y†YEYEQEQEYEYEAGAGQEQEYEYEAGAGQEQEA&A&QEQEIEIEQEQEA&A&QEQEI‡I‡jjbJZJHäHäIEIEHãHäHäHäQEQEQEQEQEQEQEQEHäHäQEQEQEQEQEQEQEQEQEQEQEQEQEQEYEYEY†Y†Y†Y†QEQEY†Y†QEQEY†Y†YEYEaÇaÇY…Y…aÇaÇY†Y†bŒbŒ{Ï{ÏYÉYÉIEIEIEIEA&A&QEQEA&A&@å@åQEQEIEIEA&A&QEQEQEQEaÇaÇjÍjÍZZa†a†YEYEYEYEYEYEYEYEQEQEYEYEY†Y†QEQEA&A&QEQEAGAGIEIEY†Y†I‡I‡jÎjÍbŒbŒI$I$@ä@ä@å@å8ã8ä@å@åIEIEI$I$QEQEQEQEQEQEHäHäQEQEIEIEHäHäQEQEQEQEQEQEHäHäYEYEa†a†Y…Y…Y†Y†QEQEYEYEY†Y†QEQEY†Y†aÇaÇY…Y…a†a†bbk/k/c,c,I$I$A&A&AGAGI$I$A&A&A&A&AEAEQEQEA&A&IEIEQEQEYEYEbŒbŒbŒbŒY…Y…YEYEYEYEYEYEYEYEQEQEYEYEY†Y†YEYEAGAGQEQEA&A&IEIEQEQEA&A&QEQEI‡I‡jjbJZJHäHäIEIEHãHäHäHäQEQEQEQEQEQEQEQEHäHäQEQEQEQEQEQEQEQEQEQEQEQEQEQEYEYEY†Y†Y†Y†QEQEY†Y†QEQEY†Y†YEYEaÇaÇY…Y…aÇaÇY†Y†bŒbŒ{Ï{ÏYÉYÉIEIEIEIEA&A&QEQEA&A&@å@åQEQEIEIEA&A&QEQEQEQEaÇaÇjÍjÍZZa†a†YEYEYEYEYEYEYEYEQEQEYEYEY†Y†QEQEA&A&QEQEAGAGIEIEY†Y†I‡I‡jÎjÍbŒbŒI$I$@ä@ä@å@å8ã8ä@å@åIEIEI$I$QEQEQEQEQEQEHäHäQEQEIEIEHäHäQEQEQEQEQEQEHäHäYEYEa†a†Y…Y…Y†Y†QEQEYEYEY†Y†QEQEY†Y†aÇaÇY…Y…a†a†bbk/k/c,c,I$I$A&A&AGAGI$I$A&A&A&A&AEAEQEQEA&A&IEIEQEQEYEYEbŒbŒbŒbŒY…Y…YEYEYEYEYEYEYEYEQEQEYEYEY†Y†YEYEAGAGQEQEA&A&@å@åQEQEQEQEYEYEI‡I‡bbJJI$I$@ä@äI$I$A&A&QEQEI$I$QEQEI$I$QEQEI$I$@å@åIEIEI$I$QEQEYEYEYEYEYEYEaÇaÇQEQEQEQEYEYEY†Y†Y†Y†Y…Y…Y…Y…QÇQÇYEYEQ…Q…bbƒÐƒÐRRA&A&QEQEA&A&A&A&QEQE@å@åIEIEIEIEA&A&AGAGI$I$A&A&c/c/aÇaÇYEYEY†Y†YEYEY†Y†YEYEYEYEY†Y†YEYEQEQEQEQEQEQEIEIEIEIEIEIE@å@åbŒbŒbŒbŒ@ã@äHäHä8Ä8Ã@ä@ä8Ä8Ã8ä8ãI$I$QEQEQEQEI$I$QEQEI$I$I$I$QEQEI$I$QEQEQEQEY†Y†Y…Y…Y…Y…Y†Y†IEIEYEYEY†Y†Y†Y†Y…Y…Y…Y…Y†Y†Y…Y…QEQEY†Y†k/k/s-k-HäHäYEYEA&A&IEIEA&A&I$I$A&A&IEIEA&A&QEQEA&A&A&A&bIbIbŒbŒYEYEY…Y…YEYEY†Y†Y†Y†YEYEY†Y†Y…Y…YEYEQEQEA&A&HäHä@å@åQEQEQEQEYEYEI‡I‡bbJJI$I$@ä@äI$I$A&A&QEQEI$I$QEQEI$I$QEQEI$I$@å@åIEIEI$I$QEQEYEYEYEYEYEYEaÇaÇQEQEQEQEYEYEY†Y†Y†Y†Y…Y…Y…Y…QÇQÇYEYEQ…Q…bbƒÐƒÐRRA&A&QEQEA&A&A&A&QEQE@å@åIEIEIEIEA&A&AGAGI$I$A&A&c/c/aÇaÇYEYEY†Y†YEYEY†Y†YEYEYEYEY†Y†YEYEQEQEQEQEQEQEIEIEIEIEIEIE@å@åbŒbŒbŒbŒ@ã@äHäHä8Ä8Ã@ä@ä8Ä8Ã8ä8ãI$I$QEQEQEQEI$I$QEQEI$I$I$I$QEQEI$I$QEQEQEQEY†Y†Y…Y…Y…Y…Y†Y†IEIEYEYEY†Y†Y†Y†Y…Y…Y…Y…Y†Y†Y…Y…QEQEY†Y†k/k/s-k-HäHäYEYEA&A&IEIEA&A&I$I$A&A&IEIEA&A&QEQEA&A&A&A&bIbIbŒbŒYEYEY…Y…YEYEY†Y†Y†Y†YEYEY†Y†Y…Y…YEYEQEQEA&A&HäHäA&A&AGAGI‡I‡AGAGZJbJbŒbŒbŒbŒAGAG8æ8æA&A&A&A&A&A&AGAGAGAGJJI‡I‡AGAGRRAGAGI‡I‡I‡I‡I‡I‡YÉYÉAÇAÇI‡I‡AGAGAGAGAÇAÇI‡I‡AGAGYÉYÉRRbbZJbJjËjËrÍjÍc,c,ZJbJA&A&AGAGAGAGA&A&I‡I‡BBAGAGBBAGAGI‡I‡R‹R‹jÍjÍ{.{.R -R -AGAGI‡I‡AGAGI‡I‡I‡I‡JJI‡I‡YÉYÉYÉYÉJJR -R -I‡I‡JJI‡I‡R -R -ƒÐƒÐƒÐƒÐbbJJAGAGAGAG9E9EA&A&AGAGA&A&AGAGI‡I‡AGAGI‡I‡BBI‡I‡I‡I‡I‡I‡JJI‡I‡YÉYÉAGAGI‡I‡AGAGAÇAÇAGAGAGAGYÉYÉRRYÉYÉZJbJjŠjŠk-k-c,c,jÍjÍA&A&AGAGAGAGAGAGAGAGJJAGAGI‡I‡AGAGBBR -R -bŒbŒk/k/bŒbŒI‡I‡I‡I‡AGAGI‡I‡I‡I‡I‡I‡I‡I‡YÉYÉJJYÉYÉBBI‡I‡A&A&AGAGI‡I‡AGAGZJbJbŒbŒbŒbŒAGAG8æ8æA&A&A&A&A&A&AGAGAGAGJJI‡I‡AGAGRRAGAGI‡I‡I‡I‡I‡I‡YÉYÉAÇAÇI‡I‡AGAGAGAGAÇAÇI‡I‡AGAGYÉYÉRRbbZJbJjËjËrÍjÍc,c,ZJbJA&A&AGAGAGAGA&A&I‡I‡BBAGAGBBAGAGI‡I‡R‹R‹jÍjÍ{.{.R -R -AGAGI‡I‡AGAGI‡I‡I‡I‡JJI‡I‡YÉYÉYÉYÉJJR -R -I‡I‡JJI‡I‡R -R -ƒÐƒÐƒÐƒÐbbJJAGAGAGAG9E9EA&A&AGAGA&A&AGAGI‡I‡AGAGI‡I‡BBI‡I‡I‡I‡I‡I‡JJI‡I‡YÉYÉAGAGI‡I‡AGAGAÇAÇAGAGAGAGYÉYÉRRYÉYÉZJbJjŠjŠk-k-c,c,jÍjÍA&A&AGAGAGAGAGAGAGAGJJAGAGI‡I‡AGAGBBR -R -bŒbŒk/k/bŒbŒI‡I‡I‡I‡AGAGI‡I‡I‡I‡I‡I‡I‡I‡YÉYÉJJYÉYÉBBI‡I‡k/k/ƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÐ{oƒp{.{.{oƒpc-c-ƒÐƒÐk/k/{Ï{Ïc/c/k-k-{.{.bŒbŒk/k/bŒbŒk,k,s/k/c/c/bŒbŒk-k-{.{.c/c/k-k-{.{.ƒÐƒÐ{oƒpk/k/{Ï{σЃЃσσЃГЋД2Œ1ƒÐƒÐ{.{.{.{.ƒÐƒÐƒÐƒÐƒÐƒÐ{oƒpƒÐƒÐƒÐƒÐ{Ð{Ð{Ð{Ð{oƒp‹Ð“ÐŒ0”0‹Ð“ЋГÐ{oƒpsÏ{Ïk/k/“ГЃ҃Ñ{Ð{Ð{Ð{ГЋЃ҃є“Œ“”“Œ“œ“œ“œ“œ“œ“œ“”“Œ“œ“œ“”“Œ“ƒÐƒÐƒÐƒÐk/k/s/k/{.{.ƒÐƒÐk/k/s/k/k,k,s/k/k/k/s-k-bŒbŒc,c,k/k/bŒbŒk-k-bŒbŒk/k/s/k/k,k,s/k/ƒÒƒÑƒÐƒÐ{.{.{Ï{Ï{oƒpƒÐƒÐƒÏƒÏ“ЋД0Œ0“ЋЃЃÐk/k/{Ï{σЃЃЃЃЃÐ{Ð{Ѓ҃уЃÐ{Ð{Ðk/k/ƒÐƒÐ”2Œ1“ϋϓЋЃЃÐk/k/ƒÐƒÐƒÐƒÐ{Ð{ГЋÐ{Ð{ЃЃЃ҃є“Œ“œ“œ“ƒÒƒÑk/s/ƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÐ{oƒp{.{.{oƒpc-c-ƒÐƒÐk/k/{Ï{Ïc/c/k-k-{.{.bŒbŒk/k/bŒbŒk,k,s/k/c/c/bŒbŒk-k-{.{.c/c/k-k-{.{.ƒÐƒÐ{oƒpk/k/{Ï{σЃЃσσЃГЋД2Œ1ƒÐƒÐ{.{.{.{.ƒÐƒÐƒÐƒÐƒÐƒÐ{oƒpƒÐƒÐƒÐƒÐ{Ð{Ð{Ð{Ð{oƒp‹Ð“ÐŒ0”0‹Ð“ЋГÐ{oƒpsÏ{Ïk/k/“ГЃ҃Ñ{Ð{Ð{Ð{ГЋЃ҃є“Œ“”“Œ“œ“œ“œ“œ“œ“œ“”“Œ“œ“œ“”“Œ“ƒÐƒÐƒÐƒÐk/k/s/k/{.{.ƒÐƒÐk/k/s/k/k,k,s/k/k/k/s-k-bŒbŒc,c,k/k/bŒbŒk-k-bŒbŒk/k/s/k/k,k,s/k/ƒÒƒÑƒÐƒÐ{.{.{Ï{Ï{oƒpƒÐƒÐƒÏƒÏ“ЋД0Œ0“ЋЃЃÐk/k/{Ï{σЃЃЃЃЃÐ{Ð{Ѓ҃уЃÐ{Ð{Ðk/k/ƒÐƒÐ”2Œ1“ϋϓЋЃЃÐk/k/ƒÐƒÐƒÐƒÐ{Ð{ГЋÐ{Ð{ЃЃЃ҃є“Œ“œ“œ“ƒÒƒÑA†A†QEQEA&A&AGAGA†A†IEIEAGAGA†A†IEIEAGAGYÇYÇRŠRŠQEQEIEIEIEIEQEQEI$I$IEIEIEIEIEIEI$I$AEAEAEAEY†Y†Y†Y†R -R -IÇIÇQÇQÇAÇAÇQÇQÇA†A†IEIEAGAGQÇQÇAGAGYÇYÇYÇYÇRRYÇYÇIÇIÇYÇYÇYÇYÇIÇIÇYÉYÉQÇQÇI†I†I†I†I†I†I‡I‡I†I†I†I†I†I†I‡I‡Y†Y†bŒbŒZIZIAÇAÇA$A$9E9EA&A&A†A†A†A†A&A&AÇAÇIEIEAGAGAEAEA†A†A†A†QEQE9E9EI†I†AGAGQEQEAÇAÇjŠjŠI‡I‡IEIEIEIEQEQEIEIEHäHäIEIEIEIEIEIE@å@åI$I$I†I†aÇaÇRRRRAÇAÇQÇQÇQÇQÇA&A&AGAGAÇAÇQEQEAÇAÇQÇQÇQÇQÇYÇYÇRRQÇQÇQÇQÇYÇYÇQÇQÇQÇQÇQÇQÇAGAGQÇQÇQEQEI‡I‡QÇQÇA†A†I†I†QÇQÇY†Y†ZZZJbJRR9E9E9E9EIEIEA&A&AÇAÇA&A&A†A†A†A†QEQEA&A&AGAGA†A†IEIEAGAGA†A†IEIEAGAGYÇYÇRŠRŠQEQEIEIEIEIEQEQEI$I$IEIEIEIEIEIEI$I$AEAEAEAEY†Y†Y†Y†R -R -IÇIÇQÇQÇAÇAÇQÇQÇA†A†IEIEAGAGQÇQÇAGAGYÇYÇYÇYÇRRYÇYÇIÇIÇYÇYÇYÇYÇIÇIÇYÉYÉQÇQÇI†I†I†I†I†I†I‡I‡I†I†I†I†I†I†I‡I‡Y†Y†bŒbŒZIZIAÇAÇA$A$9E9EA&A&A†A†A†A†A&A&AÇAÇIEIEAGAGAEAEA†A†A†A†QEQE9E9EI†I†AGAGQEQEAÇAÇjŠjŠI‡I‡IEIEIEIEQEQEIEIEHäHäIEIEIEIEIEIE@å@åI$I$I†I†aÇaÇRRRRAÇAÇQÇQÇQÇQÇA&A&AGAGAÇAÇQEQEAÇAÇQÇQÇQÇQÇYÇYÇRRQÇQÇQÇQÇYÇYÇQÇQÇQÇQÇQÇQÇAGAGQÇQÇQEQEI‡I‡QÇQÇA†A†I†I†QÇQÇY†Y†ZZZJbJRR9E9E9E9EIEIEA&A&AÇAÇA&A&A†A†@å@åHäHä8ä8ã@å@åHäHä8ä8ã8ä8ãHäHä8ä8ã@å@åY…Y…ZJbJ@å@åHäHäHäHä@ä@ãHäHä@ä@ãHäHä0Ä0ã8ä8ãHäHä8ä8ãI$I$QEQEjŠjŠA&A&AEAE@å@å@ä@ä0Ä0ä@å@åA$A$8Ä8äAEAE@å@åHäHäAEAEQEQEQEQEQEQEQEQEQEQEI$I$A&A&IEIEQEQEQEQE@å@åIEIE@å@å9E9EA&A&QEQE{,{,AGAG@å@åA$A$@å@å9E9E@å@å8Ä8ä9E9E@ä@ä8Ä8äHäHä8Ä8äHäHä8ä8ã@å@å8ã8ä@å@å8ã8äHäHäAEAEbIbIAGAGHäHäHäHä@ä@ã@ä@ãHäHä@ä@ãHäHä8ä8ãHäHä8ä8ãI$I$@å@åbbR -R -8ã8ä@å@å8Ä8äA$A$0Ä0ãAEAE@å@å@å@åAEAEI$I$A&A&I$I$AGAGHäHäQEQEQEQEQEQEQEQEQEQEA&A&IEIEI$I$@å@å9E9E@å@åA&A&IEIEbIbIZJbJ8Ä8äIEIE8å8å8Ä8ä9E9E8Ä8ä8Ä8äAEAE@å@åHäHä8ä8ã@å@åHäHä8ä8ã8ä8ãHäHä8ä8ã@å@åY…Y…ZJbJ@å@åHäHäHäHä@ä@ãHäHä@ä@ãHäHä0Ä0ã8ä8ãHäHä8ä8ãI$I$QEQEjŠjŠA&A&AEAE@å@å@ä@ä0Ä0ä@å@åA$A$8Ä8äAEAE@å@åHäHäAEAEQEQEQEQEQEQEQEQEQEQEI$I$A&A&IEIEQEQEQEQE@å@åIEIE@å@å9E9EA&A&QEQE{,{,AGAG@å@åA$A$@å@å9E9E@å@å8Ä8ä9E9E@ä@ä8Ä8äHäHä8Ä8äHäHä8ä8ã@å@å8ã8ä@å@å8ã8äHäHäAEAEbIbIAGAGHäHäHäHä@ä@ã@ä@ãHäHä@ä@ãHäHä8ä8ãHäHä8ä8ãI$I$@å@åbbR -R -8ã8ä@å@å8Ä8äA$A$0Ä0ãAEAE@å@å@å@åAEAEI$I$A&A&I$I$AGAGHäHäQEQEQEQEQEQEQEQEQEQEA&A&IEIEI$I$@å@å9E9E@å@åA&A&IEIEbIbIZJbJ8Ä8äIEIE8å8å8Ä8ä9E9E8Ä8ä8Ä8äAEAEHäHä8ä8ãI$I$8ã8ä@å@åHäHä8ä8ã8ä8ã@ä@ãHäHäQÇQÇR -R -I$I$8ã8äI$I$I$I$8ã8äI$I$I$I$8ã8ä8Ä8äI$I$8Ä8äI$I$AEAEZJbJIEIE8Ä8ä8Ä8äA$A$8Ä8äA$A$8Ä8äIEIE8Ä8äQEQEAEAEI$I$A&A&QEQEA&A&HäHäYEYEAGAGIEIEI$I$A&A&@å@åIEIE@å@å8Ä8ä9E9EA&A&YEYEk-k-YÉYÉA$A$8Ä8ä9E9E8Ä8ä9E9E@å@å8Ä8ä8Ä8äAEAE@ã@äHäHäHäHäHäHä8ä8ãHäHä8ä8ã@ä@ã8ä8ãI$I$ZJbJA&A&HäHäI$I$HäHäA$A#HäHãI$I$8ã8ä8ã8äAEAE@ä@ä8ä8ãHäHäbbIÇIÇ@å@åAEAE8ã8ä@å@å8Ä8äAEAE8Ä8äAEAEI$I$A&A&I$I$QEQEA&A&QEQEQEQEYEYEA&A&QEQEA&A&I$I$A&A&I$I$A&A&8Ä8äIEIE@å@åIEIEbIbIjÍjÍ8Ä8äIEIE0å0å8Ä8äIEIE@ä@äHäHä@ä@äHäHä8ä8ãI$I$8ã8ä@å@åHäHä8ä8ã8ä8ã@ä@ãHäHäQÇQÇR -R -I$I$8ã8äI$I$I$I$8ã8äI$I$I$I$8ã8ä8Ä8äI$I$8Ä8äI$I$AEAEZJbJIEIE8Ä8ä8Ä8äA$A$8Ä8äA$A$8Ä8äIEIE8Ä8äQEQEAEAEI$I$A&A&QEQEA&A&HäHäYEYEAGAGIEIEI$I$A&A&@å@åIEIE@å@å8Ä8ä9E9EA&A&YEYEk-k-YÉYÉA$A$8Ä8ä9E9E8Ä8ä9E9E@å@å8Ä8ä8Ä8äAEAE@ã@äHäHäHäHäHäHä8ä8ãHäHä8ä8ã@ä@ã8ä8ãI$I$ZJbJA&A&HäHäI$I$HäHäA$A#HäHãI$I$8ã8ä8ã8äAEAE@ä@ä8ä8ãHäHäbbIÇIÇ@å@åAEAE8ã8ä@å@å8Ä8äAEAE8Ä8äAEAEI$I$A&A&I$I$QEQEA&A&QEQEQEQEYEYEA&A&QEQEA&A&I$I$A&A&I$I$A&A&8Ä8äIEIE@å@åIEIEbIbIjÍjÍ8Ä8äIEIE0å0å8Ä8äIEIE@ä@äHäHä@ä@äHäHäHäHä8ä8ãHäHä@ä@ã8ä8ã@ä@ãHäHãHäHä@ä@ãY…Y…R‹R‹8ã8äI$I$@å@åHäHäI$I$I$I$8ã8ä@å@åA#A$HäHäA$A$8ä8ãQEQEZJbJ8Ä8äAEAE8Ä8ä8Ä8äA$A$8Ä8äA$A$A$A$9E9E@å@åIEIEQEQE@å@åI$I$QEQEQEQEQEQEA&A&I$I$@å@å@å@åAEAE@å@åAEAE8ã8äIEIEQEQEQEQEjÍjÍI‡I‡8Ä8äA$A$8Ä8ä9E9E@å@å8Ä8ä9E9E8Ä8äHäHä0Ä0ä8ä8ãHäHäHäHä8ä8ã@ä@ãHäHä@ä@ãHäHäI$I$ZJbJAGAGI$I$I$I$HäHäA$A#I$I$HäHäHäHäA$A$@ä@ãHäHäA$A$@ä@ãbbRR8Ä8ä8Ä8ä8Ä8äA$A$8Ä8ä8Ä8äA$A$8Ä8äIEIE@å@åQEQEA&A&I$I$QEQE@ä@äQEQEQEQEHäHäA&A&@å@å@å@åAEAE@å@åA$A$8Ä8äIEIEQEQEbbZÌZÌ8Ä8äA&A&8ã8ä@å@å8Ä8ä8Ä8ä8ä8ã@å@åHäHäHäHä8ä8ãHäHä@ä@ã8ä8ã@ä@ãHäHãHäHä@ä@ãY…Y…R‹R‹8ã8äI$I$@å@åHäHäI$I$I$I$8ã8ä@å@åA#A$HäHäA$A$8ä8ãQEQEZJbJ8Ä8äAEAE8Ä8ä8Ä8äA$A$8Ä8äA$A$A$A$9E9E@å@åIEIEQEQE@å@åI$I$QEQEQEQEQEQEA&A&I$I$@å@å@å@åAEAE@å@åAEAE8ã8äIEIEQEQEQEQEjÍjÍI‡I‡8Ä8äA$A$8Ä8ä9E9E@å@å8Ä8ä9E9E8Ä8äHäHä0Ä0ä8ä8ãHäHäHäHä8ä8ã@ä@ãHäHä@ä@ãHäHäI$I$ZJbJAGAGI$I$I$I$HäHäA$A#I$I$HäHäHäHäA$A$@ä@ãHäHäA$A$@ä@ãbbRR8Ä8ä8Ä8ä8Ä8äA$A$8Ä8ä8Ä8äA$A$8Ä8äIEIE@å@åQEQEA&A&I$I$QEQE@ä@äQEQEQEQEHäHäA&A&@å@å@å@åAEAE@å@åA$A$8Ä8äIEIEQEQEbbZÌZÌ8Ä8äA&A&8ã8ä@å@å8Ä8ä8Ä8ä8ä8ã@å@åHäHä8ä8ã@ä@ã@ä@ãI$I$@ã@äHäHä8ä8ã@ä@ãI$I$QEQEbŒbŒ@å@åI$I$A#A$HäHäI$I$I$I$I$I$I$I$HäHäA$A#HäHäI$I$@å@åRR8Ä8ä8Ä8äI$I$0Ä0ä0Ä0ã9$9$8Ä8ä8Ä8äIEIE@å@åIEIEI$I$QEQEA&A&HäHäI$I$QEQEA&A&I$I$@å@åHäHäHäHäAEAEHäHä8Ä8äQEQEA&A&QEQEjËjËI‡I‡0Ä0ä0Ä0äA$A$8Ä8ä8Ä8ä9$9$8Ä8ä8Ä8äHäHä8ä8ãHäHä8ä8ãI$I$8ã8ä@ã@ä@ã@ä@ã@äHäHäI$I$jŠjŠAÇAÇHãHä@å@åI$I$I$I$HäHäI$I$I$I$HäHäA$A#8ä8ãI$I$HäHäIÇIÇAGAG8ã8äA$A$8Ä8ä0Ä0ä9$9$0Ä0ãAEAE@å@åIEIEI$I$A&A&HäHäQEQE@å@åQEQEHäHäQEQEA&A&HäHäHäHäI$I$8Ä8äIEIE@å@åAEAEI$I$QEQEbbbŒbŒ0Ã0ä8Ä8ä8Ä8ä9$9$0å0åA$A$8ä8ãHäHäHäHä8ä8ã@ä@ã@ä@ãI$I$@ã@äHäHä8ä8ã@ä@ãI$I$QEQEbŒbŒ@å@åI$I$A#A$HäHäI$I$I$I$I$I$I$I$HäHäA$A#HäHäI$I$@å@åRR8Ä8ä8Ä8äI$I$0Ä0ä0Ä0ã9$9$8Ä8ä8Ä8äIEIE@å@åIEIEI$I$QEQEA&A&HäHäI$I$QEQEA&A&I$I$@å@åHäHäHäHäAEAEHäHä8Ä8äQEQEA&A&QEQEjËjËI‡I‡0Ä0ä0Ä0äA$A$8Ä8ä8Ä8ä9$9$8Ä8ä8Ä8äHäHä8ä8ãHäHä8ä8ãI$I$8ã8ä@ã@ä@ã@ä@ã@äHäHäI$I$jŠjŠAÇAÇHãHä@å@åI$I$I$I$HäHäI$I$I$I$HäHäA$A#8ä8ãI$I$HäHäIÇIÇAGAG8ã8äA$A$8Ä8ä0Ä0ä9$9$0Ä0ãAEAE@å@åIEIEI$I$A&A&HäHäQEQE@å@åQEQEHäHäQEQEA&A&HäHäHäHäI$I$8Ä8äIEIE@å@åAEAEI$I$QEQEbbbŒbŒ0Ã0ä8Ä8ä8Ä8ä9$9$0å0åA$A$8ä8ãHäHäHäHä@ä@ã@ä@ãHäHã@ä@ã@ä@ã@ä@ã@ä@ãHäHãHäHäIEIEbŒbŒHäHä@ä@ãI$I$I$I$HãHäI$I$I$I$HäHäI$I$HäHäI$I$8ã8äI$I$I‡I‡A$A$8ä8ã8Ä8äA$A$8ä8ã@å@åAEAEI$I$QEQEI$I$QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEI$I$I$I$QEQEA&A&IEIEQEQEHäHäbŒbŒI‡I‡8ä8ãA$A$(ä(ä8Ä8ä9$9$8Ä8ä9$9$@å@åHäHä@ä@ãHäHäHäHä@ä@ãHäHãHäHä8ä8ãHäHãHäHãHäHäZKbJI‡I‡HäHä@ä@ãI$I$HãHäI$I$I$I$I$I$8ã8äHäHäI$I$HäHäI$I$QEQE9†9†@ä@ä8ä8ã8Ä8äA$A$8ä8ãAEAEHäHäIEIEHäHäYEYEQEQEQEQEYEYEQEQEQEQEQEQEQEQEQEQEQEQEHäHäQEQEIEIEHäHäIEIEQEQEQEQEQEQEYÉYÉZJbJ8Ä8ä8Ä8ä8Ä8ä(ä(ä8Ä8ä8Ä8ä8Ä8äHäHäHäHä@ä@ã@ä@ãHäHã@ä@ã@ä@ã@ä@ã@ä@ãHäHãHäHäIEIEbŒbŒHäHä@ä@ãI$I$I$I$HãHäI$I$I$I$HäHäI$I$HäHäI$I$8ã8äI$I$I‡I‡A$A$8ä8ã8Ä8äA$A$8ä8ã@å@åAEAEI$I$QEQEI$I$QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEI$I$I$I$QEQEA&A&IEIEQEQEHäHäbŒbŒI‡I‡8ä8ãA$A$(ä(ä8Ä8ä9$9$8Ä8ä9$9$@å@åHäHä@ä@ãHäHäHäHä@ä@ãHäHãHäHä8ä8ãHäHãHäHãHäHäZKbJI‡I‡HäHä@ä@ãI$I$HãHäI$I$I$I$I$I$8ã8äHäHäI$I$HäHäI$I$QEQE9†9†@ä@ä8ä8ã8Ä8äA$A$8ä8ãAEAEHäHäIEIEHäHäYEYEQEQEQEQEYEYEQEQEQEQEQEQEQEQEQEQEQEQEHäHäQEQEIEIEHäHäIEIEQEQEQEQEQEQEYÉYÉZJbJ8Ä8ä8Ä8ä8Ä8ä(ä(ä8Ä8ä8Ä8ä8Ä8äHäHäA&A&IEIEA&A&A&A&QEQEA&A&@å@å8Ä8ä@ä@ä8Ä8äAÇAÇbŒbŒYÉYÉAGAGIEIEIEIEQEQEQÇQÇY†Y†IEIEIEIEIEIEA&A&QÇQÇQEQEZJbJRRI‡I‡AGAGIEIE8Ä8äA$A$A&A&I$I$A&A&I$I$HäHä@å@åA&A&A&A&HäHä@å@å@å@åQEQE@å@åHäHäQEQEA&A&A&A&A&A&QEQEA&A&A&A&I‡I‡ZJbJJJ(Ä(Ä(Ä(Ã8Ä8ä0Ä0ã(ä(ä8Ä8ä8Ä8ä@ä@ã8ä8ã@ä@ã@ä@ãHäHãHäHäHäHä8ä8ã@ä@ãHäHäHäHäI$I$RŠRŠbŒbŒA&A&QEQEIEIEAGAGY…Y…QÇQÇQEQEA&A&QEQEAGAGQEQEAGAGZIZIYÉYÉI‡I‡I‡I‡IEIE8Ä8ä8Ä8äQEQEA&A&HäHäIEIEI$I$@å@å@å@åIEIE@å@å@å@å@å@åI$I$A&A&I$I$QEQEA&A&QEQE@å@åA&A&AGAGA&A&A&A&R -R -R‹R‹8æ8æ0æ0æ9E9EAGAG(å(å(ä(ä(ä(ä0æ0æA&A&IEIEA&A&A&A&QEQEA&A&@å@å8Ä8ä@ä@ä8Ä8äAÇAÇbŒbŒYÉYÉAGAGIEIEIEIEQEQEQÇQÇY†Y†IEIEIEIEIEIEA&A&QÇQÇQEQEZJbJRRI‡I‡AGAGIEIE8Ä8äA$A$A&A&I$I$A&A&I$I$HäHä@å@åA&A&A&A&HäHä@å@å@å@åQEQE@å@åHäHäQEQEA&A&A&A&A&A&QEQEA&A&A&A&I‡I‡ZJbJJJ(Ä(Ä(Ä(Ã8Ä8ä0Ä0ã(ä(ä8Ä8ä8Ä8ä@ä@ã8ä8ã@ä@ã@ä@ãHäHãHäHäHäHä8ä8ã@ä@ãHäHäHäHäI$I$RŠRŠbŒbŒA&A&QEQEIEIEAGAGY…Y…QÇQÇQEQEA&A&QEQEAGAGQEQEAGAGZIZIYÉYÉI‡I‡I‡I‡IEIE8Ä8ä8Ä8äQEQEA&A&HäHäIEIEI$I$@å@å@å@åIEIE@å@å@å@å@å@åI$I$A&A&I$I$QEQEA&A&QEQE@å@åA&A&AGAGA&A&A&A&R -R -R‹R‹8æ8æ0æ0æ9E9EAGAG(å(å(ä(ä(ä(ä0æ0æZÌZÌk/k/s/k/jÍjÍ{.{.k/k/rÍjÍR‹R‹R -R -bŒbŒZÌZÌc/c/ƒÐƒÐ{.{.k,k,{.{.ƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÐ{Ï{σЃЃЃЃЃÐ{.{.{Ï{ϓЋÐ{.{.c,c,bŒbŒbŒbŒbŒbŒbŒbŒc,c,jÍjÍrÎjÍc-c-jÎjÍc/c/jÍjÍbŒbŒbŒbŒbŒbŒbŒbŒR‹R‹bŒbŒjÍjÍc/c/{.{.{oƒp{oƒpk.k/k/s/k/k/k/s/k/k/bŒbŒZÌZÌR -R -c/c/k-k-bŒbŒbŒbŒbŒbŒjŠjŠZJbJbŒbŒ{,{,{.{.jËjËjŠjŠZJbJR‹R‹jŠjŠc/c/{.{.ƒÐƒÐk,k,s/k/{.{.ƒÏƒÏ“ЋЃЃЃσσЃÐ{Ï{σσσσσЃÐk/k/ƒÏƒÏƒÐƒÐk,k,ZÌZÌbŒbŒbŒbŒbŒbŒZÌZÌk-k-bŒbŒc/c/c,c,c/c/jÍjÍZÌZÌbŒbŒbŒbŒbŒbŒR‹R‹R‹R‹bŒbŒc/c/k/k/ƒo{pƒo{p{oƒok/k/k/s/k/k/{Ð{Ðk/k/s/k/“ЋÐZÌZÌR‹R‹ZÌZÌZÌZÌZÌZÌk/k/s/k/jÍjÍ{.{.k/k/rÍjÍR‹R‹R -R -bŒbŒZÌZÌc/c/ƒÐƒÐ{.{.k,k,{.{.ƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÐ{Ï{σЃЃЃЃЃÐ{.{.{Ï{ϓЋÐ{.{.c,c,bŒbŒbŒbŒbŒbŒbŒbŒc,c,jÍjÍrÎjÍc-c-jÎjÍc/c/jÍjÍbŒbŒbŒbŒbŒbŒbŒbŒR‹R‹bŒbŒjÍjÍc/c/{.{.{oƒp{oƒpk.k/k/s/k/k/k/s/k/k/bŒbŒZÌZÌR -R -c/c/k-k-bŒbŒbŒbŒbŒbŒjŠjŠZJbJbŒbŒ{,{,{.{.jËjËjŠjŠZJbJR‹R‹jŠjŠc/c/{.{.ƒÐƒÐk,k,s/k/{.{.ƒÏƒÏ“ЋЃЃЃσσЃÐ{Ï{σσσσσЃÐk/k/ƒÏƒÏƒÐƒÐk,k,ZÌZÌbŒbŒbŒbŒbŒbŒZÌZÌk-k-bŒbŒc/c/c,c,c/c/jÍjÍZÌZÌbŒbŒbŒbŒbŒbŒR‹R‹R‹R‹bŒbŒc/c/k/k/ƒo{pƒo{p{oƒok/k/k/s/k/k/{Ð{Ðk/k/s/k/“ЋÐZÌZÌR‹R‹ZÌZÌZÌZÌbbQEQEaÇaÇYÇYÇjIjIƒo{pI†I†QEQEIEIE9E9EAGAGAEAEHäHäA$A$9E9EQEQE9E9EIEIEAGAGQEQEAGAGQEQEA†A†QEQE@å@åA$A$9E9EI†I†AGAGAEAE@å@åAEAEAEAEQEQEjŠjŠk/k/rËjËbŒbŒjŠjŠjËjËrËjËjÍjÍrËjËk-k-rËjËjÍjÍrËjËjËjËc,c,k/k/rIjIbbZIZIQÇQÇbbj‰j‰rIjIj‰j‰rIjIjËjËrËjËjËjËjŠjŠ{,{,jËjËrIjIjIjIjŠjŠ{,{,ZJbJIEIE@å@åIEIEA†A†IEIEIEIEA$A$@å@åA$A$A†A†IEIEIEIEAGAGA†A†I†I†AGAGIEIEI†I†A&A&AEAEHäHä9†9†QEQEIEIE8Ä8äA†A†AEAEQEQEbb{.{.k-k-r‰j‰jËjËrËjËjËjËrÍjÍjËjË{.{.jËjËrÍjÍjËjËrËjË{.{.”2Œ1{,{,bIbIZZZZbbjIjIbIbIjIjIr‰j‰jIjIjŠjŠjŠjŠjŠjŠjIjIbbQEQEaÇaÇYÇYÇjIjIƒo{pI†I†QEQEIEIE9E9EAGAGAEAEHäHäA$A$9E9EQEQE9E9EIEIEAGAGQEQEAGAGQEQEA†A†QEQE@å@åA$A$9E9EI†I†AGAGAEAE@å@åAEAEAEAEQEQEjŠjŠk/k/rËjËbŒbŒjŠjŠjËjËrËjËjÍjÍrËjËk-k-rËjËjÍjÍrËjËjËjËc,c,k/k/rIjIbbZIZIQÇQÇbbj‰j‰rIjIj‰j‰rIjIjËjËrËjËjËjËjŠjŠ{,{,jËjËrIjIjIjIjŠjŠ{,{,ZJbJIEIE@å@åIEIEA†A†IEIEIEIEA$A$@å@åA$A$A†A†IEIEIEIEAGAGA†A†I†I†AGAGIEIEI†I†A&A&AEAEHäHä9†9†QEQEIEIE8Ä8äA†A†AEAEQEQEbb{.{.k-k-r‰j‰jËjËrËjËjËjËrÍjÍjËjË{.{.jËjËrÍjÍjËjËrËjË{.{.”2Œ1{,{,bIbIZZZZbbjIjIbIbIjIjIr‰j‰jIjIjŠjŠjŠjŠjŠjŠjIjIY†Y†@å@åIEIEHäHäbbk-k-QEQE@å@å8Ä8ä8Ä8ä0Ä0ä0Ä0ä0Ä0ä0Ä0ã@å@åIEIE@ä@ä0Ä0äHäHä0Ä0ã8Ä8ä8Ä8ä(ä(ä8Ä8ä8Ä8ä8Ä8ä8ä8ã@å@åAEAEHäHä0Ä0ä0Ä0ãAEAEHäHäjIjIs/k/YÇYÇQEQEQEQEQEQEQEQEQEQEI‡I‡Y†Y†aÇaÇY†Y†I‡I‡a†a†jÍjÍbŒbŒY†Y†A&A&I$I$QEQEHäHäQEQEYEYEYEYEQEQEYEYEYEYEYEYEYEYEYEYEYEYEYEYEYEYEYEYEjjAGAG8Ä8ä8Ä8ä8Ä8ä8Ä8ä0Ä0ã8Ä8ä(ä(ä8Ä8ä8ä8ã@å@åAEAE8ã8ä@ä@ä@ä@ä0Ä0ä@ä@ä0Ä0ã8Ä8ä8Ä8ä8Ä8ä8ä8ã8Ä8äIEIE@å@å8Ä8ä8Ä8ä8Ä8äQEQEYEYEk/k/bbYEYEQEQEQEQEQEQEQEQEYEYEI‡I‡Y†Y†aÇaÇI‡I‡a†a†jIjIƒÒƒÑYÉYÉHäHäI$I$QEQEQEQEHäHäHäHäYEYEHäHäYEYEYEYEYEYEYEYEYEYEY†Y†@å@åIEIEHäHäbbk-k-QEQE@å@å8Ä8ä8Ä8ä0Ä0ä0Ä0ä0Ä0ä0Ä0ã@å@åIEIE@ä@ä0Ä0äHäHä0Ä0ã8Ä8ä8Ä8ä(ä(ä8Ä8ä8Ä8ä8Ä8ä8ä8ã@å@åAEAEHäHä0Ä0ä0Ä0ãAEAEHäHäjIjIs/k/YÇYÇQEQEQEQEQEQEQEQEQEQEI‡I‡Y†Y†aÇaÇY†Y†I‡I‡a†a†jÍjÍbŒbŒY†Y†A&A&I$I$QEQEHäHäQEQEYEYEYEYEQEQEYEYEYEYEYEYEYEYEYEYEYEYEYEYEYEYEYEYEjjAGAG8Ä8ä8Ä8ä8Ä8ä8Ä8ä0Ä0ã8Ä8ä(ä(ä8Ä8ä8ä8ã@å@åAEAE8ã8ä@ä@ä@ä@ä0Ä0ä@ä@ä0Ä0ã8Ä8ä8Ä8ä8Ä8ä8ä8ã8Ä8äIEIE@å@å8Ä8ä8Ä8ä8Ä8äQEQEYEYEk/k/bbYEYEQEQEQEQEQEQEQEQEYEYEI‡I‡Y†Y†aÇaÇI‡I‡a†a†jIjIƒÒƒÑYÉYÉHäHäI$I$QEQEQEQEHäHäHäHäYEYEHäHäYEYEYEYEYEYEYEYEYEYEY†Y†AGAGI$I$A&A&iÇiÇrÍjÍAGAGHäHä0Ä0ä0Ä0ã0Ä0ã(ä(ä0Ä0ä@ä@ä8ä8ã@å@å8ã8ä8ã8ä8Ä8ä(ä(ä8Ä8ä(ä(ä8Ä8ä8Ä8ä1$1$8Ä8ä9$9$@å@åA$A$8Ä8ä8Ä8ä8Ä8ä8Ä8äQEQEjjs/k/I‡I‡QEQEQEQEAGAGYEYEI‡I‡aÇaÇI‡I‡aÇaÇI‡I‡aÇaÇYÉYÉ{,{,bŒbŒY†Y†AGAGQEQEA&A&QEQEQEQE@å@åQEQEQEQEYEYEYEYEY†Y†a†a†Y†Y†Y†Y†YÉYÉa†a†YÉYÉbbI‡I‡@å@åI$I$8Ä8ä8Ä8ä!$!$0Ä0ã(ä(ä8Ä8ä8Ä8äIEIE8Ä8ä0Ä0ä8ä8ã(ä(ä0Ä0ä0Ä0ä8Ä8ä(ä(ä8Ä8ä8Ä8ä9$9$9E9E8Ä8ä@å@å0Ã0ä9$9$8Ä8ä@å@åY†Y†k/k/bbAGAGAGAGQEQEI‡I‡YEYEI‡I‡aÇaÇI‡I‡aÇaÇI‡I‡aÇaÇjŠjŠ{.{.YÉYÉQEQEAGAGQEQEA&A&QEQEQEQEYEYEAGAGYEYEYEYEI‡I‡YEYEY†Y†Y†Y†AGAGI$I$A&A&iÇiÇrÍjÍAGAGHäHä0Ä0ä0Ä0ã0Ä0ã(ä(ä0Ä0ä@ä@ä8ä8ã@å@å8ã8ä8ã8ä8Ä8ä(ä(ä8Ä8ä(ä(ä8Ä8ä8Ä8ä1$1$8Ä8ä9$9$@å@åA$A$8Ä8ä8Ä8ä8Ä8ä8Ä8äQEQEjjs/k/I‡I‡QEQEQEQEAGAGYEYEI‡I‡aÇaÇI‡I‡aÇaÇI‡I‡aÇaÇYÉYÉ{,{,bŒbŒY†Y†AGAGQEQEA&A&QEQEQEQE@å@åQEQEQEQEYEYEYEYEY†Y†a†a†Y†Y†Y†Y†YÉYÉa†a†YÉYÉbbI‡I‡@å@åI$I$8Ä8ä8Ä8ä!$!$0Ä0ã(ä(ä8Ä8ä8Ä8äIEIE8Ä8ä0Ä0ä8ä8ã(ä(ä0Ä0ä0Ä0ä8Ä8ä(ä(ä8Ä8ä8Ä8ä9$9$9E9E8Ä8ä@å@å0Ã0ä9$9$8Ä8ä@å@åY†Y†k/k/bbAGAGAGAGQEQEI‡I‡YEYEI‡I‡aÇaÇI‡I‡aÇaÇI‡I‡aÇaÇjŠjŠ{.{.YÉYÉQEQEAGAGQEQEA&A&QEQEQEQEYEYEAGAGYEYEYEYEI‡I‡YEYEY†Y†Y†Y†A&A&@å@å8Ä8äZZbŒbŒY†Y†8Ä8ä0Ä0ä0Ä0ã(ä(ä0Ä0ã(ä(ä8Ä8ä8Ä8äIEIE8Ä8äA$A$8Ä8ä(ä(ä8Ä8ä8Ä8ä(ä(ä9$9$8Ä8ä9$9$8Ä8ä9E9EA&A&8ã8ä8Ä8ä8Ä8ä9$9$@å@åZZ{.{.YÇYÇaÇaÇI‡I‡YEYEI‡I‡I‡I‡YEYEI‡I‡aÇaÇI‡I‡I‡I‡a†a†{.{.k/k/QEQEQEQEA&A&AEAEA&A&AGAGQEQEI‡I‡A&A&I‡I‡QEQEAGAGaÇaÇYÉYÉaÇaÇYÉYÉYÉYÉYÉYÉjjI‡I‡@å@å8Ä8ä9$9$0Ä0ä0Ä0ã(ä(ä0Ä0ä0Ä0ä8Ä8ä9E9E@å@å8ã8ä@å@å0Ã0ä8Ä8ä(ä(ä8Ä8ä0å0å9$9$8Ä8ä8Ä8ä@å@å9E9E@å@å8ã8ä8Ä8ä9$9$@å@åQEQEk/k/bJZJa†a†Y†Y†I‡I‡A&A&I‡I‡I‡I‡aÇaÇI‡I‡aÇaÇI‡I‡Y†Y†jŠjŠ{oƒpI‡I‡QEQEQEQE@å@å9E9EAGAGAGAGAGAGQEQEY†Y†I‡I‡YEYEI‡I‡aÇaÇY†Y†A&A&@å@å8Ä8äZZbŒbŒY†Y†8Ä8ä0Ä0ä0Ä0ã(ä(ä0Ä0ã(ä(ä8Ä8ä8Ä8äIEIE8Ä8äA$A$8Ä8ä(ä(ä8Ä8ä8Ä8ä(ä(ä9$9$8Ä8ä9$9$8Ä8ä9E9EA&A&8ã8ä8Ä8ä8Ä8ä9$9$@å@åZZ{.{.YÇYÇaÇaÇI‡I‡YEYEI‡I‡I‡I‡YEYEI‡I‡aÇaÇI‡I‡I‡I‡a†a†{.{.k/k/QEQEQEQEA&A&AEAEA&A&AGAGQEQEI‡I‡A&A&I‡I‡QEQEAGAGaÇaÇYÉYÉaÇaÇYÉYÉYÉYÉYÉYÉjjI‡I‡@å@å8Ä8ä9$9$0Ä0ä0Ä0ã(ä(ä0Ä0ä0Ä0ä8Ä8ä9E9E@å@å8ã8ä@å@å0Ã0ä8Ä8ä(ä(ä8Ä8ä0å0å9$9$8Ä8ä8Ä8ä@å@å9E9E@å@å8ã8ä8Ä8ä9$9$@å@åQEQEk/k/bJZJa†a†Y†Y†I‡I‡A&A&I‡I‡I‡I‡aÇaÇI‡I‡aÇaÇI‡I‡Y†Y†jŠjŠ{oƒpI‡I‡QEQEQEQE@å@å9E9EAGAGAGAGAGAGQEQEY†Y†I‡I‡YEYEI‡I‡aÇaÇQÇQÇI‡I‡A&A&@å@åbbk/k/Y†Y†@ä@ä0Ä0ä0Ä0ã(ä(ä(ä(ä8Ä8ä(ä(ä8Ä8ä8Ä8ä8Ä8ä9$9$8Ä8ä(ä(ä8Ä8ä(ä(ä0å0å8Ä8ä(ä(ä8Ä8äA$A$8Ä8äIEIE8Ä8ä8Ä8ä(ä(ä@å@åIEIEYÇYÇk-k-YÇYÇYÉYÉYEYEI‡I‡A&A&I‡I‡I‡I‡aÇaÇI‡I‡I‡I‡aÇaÇYÉYÉjËjËbŒbŒA$A$0æ0æ(ä(ä(ä(ä(ä(ä0æ0æ(ä(ä9E9EA&A&YEYEAGAGa†a†YÉYÉYÉYÉYÉYÉZZYÉYÉQÇQÇZJbJYÉYÉHäHä0Ä0ã(ä(ä0Ä0ä0Ä0ä(ä(ä0Ä0ã(ä(ä8Ä8ä8Ä8ä@å@å8ã8ä8Ä8ä8Ä8ä(ä(ä8Ä8ä(ä(ä8Ä8ä(ä(äA$A$8Ä8ä9$9$9E9E@å@å8Ä8ä8Ä8ä(ä(äIEIEQEQEjÍjÍbbYÉYÉY†Y†I‡I‡YEYEI‡I‡YEYEI‡I‡I‡I‡I‡I‡Y†Y†YÉYÉjIjIƒo{pAFAG9E9E0æ0æ!$!$(ä(ä å å8Ä8ä9E9EA&A&AGAGYÇYÇAGAGA&A&ZZQÇQÇI‡I‡A&A&@å@åbbk/k/Y†Y†@ä@ä0Ä0ä0Ä0ã(ä(ä(ä(ä8Ä8ä(ä(ä8Ä8ä8Ä8ä8Ä8ä9$9$8Ä8ä(ä(ä8Ä8ä(ä(ä0å0å8Ä8ä(ä(ä8Ä8äA$A$8Ä8äIEIE8Ä8ä8Ä8ä(ä(ä@å@åIEIEYÇYÇk-k-YÇYÇYÉYÉYEYEI‡I‡A&A&I‡I‡I‡I‡aÇaÇI‡I‡I‡I‡aÇaÇYÉYÉjËjËbŒbŒA$A$0æ0æ(ä(ä(ä(ä(ä(ä0æ0æ(ä(ä9E9EA&A&YEYEAGAGa†a†YÉYÉYÉYÉYÉYÉZZYÉYÉQÇQÇZJbJYÉYÉHäHä0Ä0ã(ä(ä0Ä0ä0Ä0ä(ä(ä0Ä0ã(ä(ä8Ä8ä8Ä8ä@å@å8ã8ä8Ä8ä8Ä8ä(ä(ä8Ä8ä(ä(ä8Ä8ä(ä(äA$A$8Ä8ä9$9$9E9E@å@å8Ä8ä8Ä8ä(ä(äIEIEQEQEjÍjÍbbYÉYÉY†Y†I‡I‡YEYEI‡I‡YEYEI‡I‡I‡I‡I‡I‡Y†Y†YÉYÉjIjIƒo{pAFAG9E9E0æ0æ!$!$(ä(ä å å8Ä8ä9E9EA&A&AGAGYÇYÇAGAGA&A&ZZYÇYÇAGAGI$I$@å@åZZk/k/QEQEHäHä0Ä0ä0Ä0ä0Ä0ã(ä(ä0Ä0ä0Ä0ä8ä8ã@å@å8ã8ä0Ã0ä8Ä8ä8Ä8ä8ä8ã8Ä8äA$A$8Ä8ä8Ä8äA$A$0Ä0ã8Ä8äA$A$8Ä8ä8Ä8ä8ä8ãHäHäHäHäYÇYÇc,c,jjYÉYÉYÇYÇI‡I‡aÇaÇI‡I‡I‡I‡YÉYÉaÇaÇI‡I‡aÇaÇaÇaÇZJbJZJbJ(ä(ä9E9E0æ0æ å å å å!$!$ å å(ä(ä(ä(ä8Ä8äA&A&AGAGbbYÇYÇYÉYÉYÇYÇYÉYÉYÇYÇZJbJRR@ä@ä ä ã0Ä0ä0Ä0ã ä ä0Ä0ã(ä(ä@ä@ä0Ä0ä8ä8ãHäHä0Ä0äA$A$0Ä0ã8ä8ã8Ä8ä8ä8ã8Ä8äA$A$8Ä8ä0Ä0ã0Ä0ã@å@åI$I$0Ã0ä8ã8ä@å@åHäHäIEIEbŒbŒbIbIiÇiÇYÉYÉI‡I‡I‡I‡I‡I‡I‡I‡YÉYÉaÇaÇYÉYÉI‡I‡aÇaÇbbk/k/9E9E0å0å0æ0æ å å å å å å(å(å å å!$!$0Ä0äA†A†8Ä8ä8Ä8äAÇAÇYÇYÇAGAGI$I$@å@åZZk/k/QEQEHäHä0Ä0ä0Ä0ä0Ä0ã(ä(ä0Ä0ä0Ä0ä8ä8ã@å@å8ã8ä0Ã0ä8Ä8ä8Ä8ä8ä8ã8Ä8äA$A$8Ä8ä8Ä8äA$A$0Ä0ã8Ä8äA$A$8Ä8ä8Ä8ä8ä8ãHäHäHäHäYÇYÇc,c,jjYÉYÉYÇYÇI‡I‡aÇaÇI‡I‡I‡I‡YÉYÉaÇaÇI‡I‡aÇaÇaÇaÇZJbJZJbJ(ä(ä9E9E0æ0æ å å å å!$!$ å å(ä(ä(ä(ä8Ä8äA&A&AGAGbbYÇYÇYÉYÉYÇYÇYÉYÉYÇYÇZJbJRR@ä@ä ä ã0Ä0ä0Ä0ã ä ä0Ä0ã(ä(ä@ä@ä0Ä0ä8ä8ãHäHä0Ä0äA$A$0Ä0ã8ä8ã8Ä8ä8ä8ã8Ä8äA$A$8Ä8ä0Ä0ã0Ä0ã@å@åI$I$0Ã0ä8ã8ä@å@åHäHäIEIEbŒbŒbIbIiÇiÇYÉYÉI‡I‡I‡I‡I‡I‡I‡I‡YÉYÉaÇaÇYÉYÉI‡I‡aÇaÇbbk/k/9E9E0å0å0æ0æ å å å å å å(å(å å å!$!$0Ä0äA†A†8Ä8ä8Ä8äAÇAÇQÇQÇI‡I‡AGAGI†I†ZJbJk/k/R -R -AGAGAGAG9E9E0æ0æ0æ0æ9$9$0å0å(ä(ä0Ä0ã(ä(ä(ä(ä8Ä8ä1†1†(ä(ä8Ä8ä0æ0æ9E9EA†A†8æ8æ0æ0æAGAGAGAGA†A†AGAGAÇAÇI‡I‡I‡I‡R‹R‹bŒbŒI‡I‡AGAGAGAGQÇQÇAGAGI‡I‡Y†Y†I‡I‡AGAGAGAGA&A&QEQE{.{.k/k/(ä(äIEIEAÇAÇA&A&A&A&AGAGQEQEA&A&I†I†IEIEYÉYÉYÇYÇJJZJbJbbZJbJbIbIR -R -{.{.bŒbŒAÇAÇI‡I‡AGAG0æ0æA&A&1†1†(ä(ä0å0å8Ä8ä(ä(ä0Ä0ä!$!$0Ä0ã0æ0æ1$1$0æ0æ(ä(ä9E9EA&A&A&A&0æ0æ9†9†AGAGAGAGAGAGAGAGI‡I‡I‡I‡R -R -ZÌZÌR -R -I‡I‡AGAGQÇQÇY†Y†AGAGI‡I‡Y†Y†AGAGAGAGQEQEA&A&bbƒÒƒÑAGAG9E9EAGAGI‡I‡IEIEA&A&AGAGA†A†QEQEIEIEAGAGI‡I‡AÇAÇI†I†QÇQÇI‡I‡AGAGI†I†ZJbJk/k/R -R -AGAGAGAG9E9E0æ0æ0æ0æ9$9$0å0å(ä(ä0Ä0ã(ä(ä(ä(ä8Ä8ä1†1†(ä(ä8Ä8ä0æ0æ9E9EA†A†8æ8æ0æ0æAGAGAGAGA†A†AGAGAÇAÇI‡I‡I‡I‡R‹R‹bŒbŒI‡I‡AGAGAGAGQÇQÇAGAGI‡I‡Y†Y†I‡I‡AGAGAGAGA&A&QEQE{.{.k/k/(ä(äIEIEAÇAÇA&A&A&A&AGAGQEQEA&A&I†I†IEIEYÉYÉYÇYÇJJZJbJbbZJbJbIbIR -R -{.{.bŒbŒAÇAÇI‡I‡AGAG0æ0æA&A&1†1†(ä(ä0å0å8Ä8ä(ä(ä0Ä0ä!$!$0Ä0ã0æ0æ1$1$0æ0æ(ä(ä9E9EA&A&A&A&0æ0æ9†9†AGAGAGAGAGAGAGAGI‡I‡I‡I‡R -R -ZÌZÌR -R -I‡I‡AGAGQÇQÇY†Y†AGAGI‡I‡Y†Y†AGAGAGAGQEQEA&A&bbƒÒƒÑAGAG9E9EAGAGI‡I‡IEIEA&A&AGAGA†A†QEQEIEIEAGAGI‡I‡AÇAÇI†I†{,{,{,{,jÍjÍrËjËjËjË{.{.jËjËbJZJbŒbŒjŠjŠZJbJR -R -bJZJZIZIZÌZÌk/k/bJZJbŒbŒZIZIZJbJZJbJbŒbŒZIZIbŒbŒR‹R‹bŒbŒjËjËc,c,k/k/{.{.k,k,s/k/jÍjÍc,c,jËjËs-k-jÎjÍRŠRŠbbR -R -R‹R‹ZJbJZJbJR -R -bŒbŒbŒbŒZJbJZÌZ̃ЃÐ{.{.{Ï{Ïc/c/{,{,{.{.jËj˃o{p{.{.ƒÐƒÐ{oƒp{oƒp{o{oƒÐƒÐ{oƒpƒÐƒÐ{oƒp{.{.{.{.{,{,{,{,{,{,k-k-bJZJc,c,jŠjŠZJbJR -R -bbR‹R‹ZJbJc/c/bŒbŒZJbJR‹R‹bbZJbJbŒbŒZJbJRŠRŠbŒbŒRŠRŠk-k-bŒbŒk,k,ƒÐƒÐk-k-c,c,k-k-c,c,jËjËs-k-jËjËbŒbŒZIZIR -R -R -R -R‹R‹ZJbJR -R -R‹R‹bŒbŒZJbJbŒbŒk/k/ƒÐƒÐ{oƒpk/k/c,c,{,{,jÍjÍ{,{,{oƒp{oƒp{o{oƒp{oƒp{o“Ï‹Ï{.{.{oƒp{,{,{,{,jÍjÍrËjËjËjË{.{.jËjËbJZJbŒbŒjŠjŠZJbJR -R -bJZJZIZIZÌZÌk/k/bJZJbŒbŒZIZIZJbJZJbJbŒbŒZIZIbŒbŒR‹R‹bŒbŒjËjËc,c,k/k/{.{.k,k,s/k/jÍjÍc,c,jËjËs-k-jÎjÍRŠRŠbbR -R -R‹R‹ZJbJZJbJR -R -bŒbŒbŒbŒZJbJZÌZ̃ЃÐ{.{.{Ï{Ïc/c/{,{,{.{.jËj˃o{p{.{.ƒÐƒÐ{oƒp{oƒp{o{oƒÐƒÐ{oƒpƒÐƒÐ{oƒp{.{.{.{.{,{,{,{,{,{,k-k-bJZJc,c,jŠjŠZJbJR -R -bbR‹R‹ZJbJc/c/bŒbŒZJbJR‹R‹bbZJbJbŒbŒZJbJRŠRŠbŒbŒRŠRŠk-k-bŒbŒk,k,ƒÐƒÐk-k-c,c,k-k-c,c,jËjËs-k-jËjËbŒbŒZIZIR -R -R -R -R‹R‹ZJbJR -R -R‹R‹bŒbŒZJbJbŒbŒk/k/ƒÐƒÐ{oƒpk/k/c,c,{,{,jÍjÍ{,{,{oƒp{oƒp{o{oƒp{oƒp{o“Ï‹Ï{.{.{oƒp@å@å9E9EI$I$QEQEQEQEQEQE@ä@ä@å@åHäHäA$A$9E9E@å@åIEIEQEQEbbZJbJA†A†YEYEYEYEQEQEQEQEYEYEQEQEQEQEIEIEQEQEIEIEQEQEAÇAÇbŒbŒZZY†Y†AGAGQEQEAGAGI$I$A&A&QEQEA&A&IEIE9E9EAGAGAGAGQEQEQÇQÇQÇQÇYÇYÇI‡I‡QÇQÇI‡I‡QÇQÇQÇQÇI‡I‡QÇQÇYÉYÉQÇQÇYÇYÇbbZJbJY†Y†Y†Y†YÇYÇYEYEAGAGIEIEI$I$QEQE@å@å9E9EI$I$A&A&HäHä8ä8ãA&A&AEAE@å@åAEAEQEQEY†Y†bŒbŒI‡I‡Q…Q…YEYEQEQEQEQEYEYEQEQEYEYEIEIEIEIEQ…Q…IEIEQEQER‹R‹bbQÇQÇAGAGYEYEA&A&QEQEIEIEIEIEIEIE9E9EIEIEA&A&I†I†AGAGY†Y†QÇQÇQÇQÇYÉYÉQÇQÇI†I†QÇQÇQÇQÇYÉYÉI‡I‡YÇYÇQÇQÇYÇYÇYÉYÉjŠjŠbbQEQEAGAG0Ã0ä9E9E@å@å9E9EI$I$QEQEQEQEQEQE@ä@ä@å@åHäHäA$A$9E9E@å@åIEIEQEQEbbZJbJA†A†YEYEYEYEQEQEQEQEYEYEQEQEQEQEIEIEQEQEIEIEQEQEAÇAÇbŒbŒZZY†Y†AGAGQEQEAGAGI$I$A&A&QEQEA&A&IEIE9E9EAGAGAGAGQEQEQÇQÇQÇQÇYÇYÇI‡I‡QÇQÇI‡I‡QÇQÇQÇQÇI‡I‡QÇQÇYÉYÉQÇQÇYÇYÇbbZJbJY†Y†Y†Y†YÇYÇYEYEAGAGIEIEI$I$QEQE@å@å9E9EI$I$A&A&HäHä8ä8ãA&A&AEAE@å@åAEAEQEQEY†Y†bŒbŒI‡I‡Q…Q…YEYEQEQEQEQEYEYEQEQEYEYEIEIEIEIEQ…Q…IEIEQEQER‹R‹bbQÇQÇAGAGYEYEA&A&QEQEIEIEIEIEIEIE9E9EIEIEA&A&I†I†AGAGY†Y†QÇQÇQÇQÇYÉYÉQÇQÇI†I†QÇQÇQÇQÇYÉYÉI‡I‡YÇYÇQÇQÇYÇYÇYÉYÉjŠjŠbbQEQEAGAG0Ã0ä9E9E8Ä8ä@å@å9E9E@å@åA&A&@ä@ä@å@å8Ä8ä9$9$0å0åA&A&8Ä8äQEQEQEQEbbc/c/Y†Y†YEYEa†a†YEYEaÇaÇYEYEYÇYÇY†Y†Y†Y†I†I†AGAGAGAGIÇIÇk-k-YÉYÉQEQEA&A&A&A&QEQEA&A&A&A&@å@åAEAE@å@å9E9EA&A&I$I$A&A&QEQEA&A&QEQEA&A&AGAGAEAEA&A&8Ä8ä0å0åA&A&QEQEAGAGYEYEYÉYÉZZYEYEI‡I‡QEQEA&A&QEQEQEQEA&A&@å@åAEAE@å@å@å@åA$A$8Ä8ä9E9E8Ä8ä@å@åA$A$@å@åQEQEI‡I‡{,{,ZZY†Y†YEYEY†Y†YEYEaÇaÇY†Y†YÇYÇY†Y†I†I†AGAGQÇQÇA&A&bŒbŒZJbJI‡I‡QEQEA&A&A&A&IEIE@å@åA&A&@å@å9E9E@å@å9E9EA&A&QEQEA&A&QEQEA&A&QEQEA&A&QEQEA&A&0å0å0å0å9E9EA&A&AGAGYEYEYEYEbbI‡I‡YEYE@å@å0å0å8Ä8ä8ä8Ä@å@å9E9E@å@åA&A&@ä@ä@å@å8Ä8ä9$9$0å0åA&A&8Ä8äQEQEQEQEbbc/c/Y†Y†YEYEa†a†YEYEaÇaÇYEYEYÇYÇY†Y†Y†Y†I†I†AGAGAGAGIÇIÇk-k-YÉYÉQEQEA&A&A&A&QEQEA&A&A&A&@å@åAEAE@å@å9E9EA&A&I$I$A&A&QEQEA&A&QEQEA&A&AGAGAEAEA&A&8Ä8ä0å0åA&A&QEQEAGAGYEYEYÉYÉZZYEYEI‡I‡QEQEA&A&QEQEQEQEA&A&@å@åAEAE@å@å@å@åA$A$8Ä8ä9E9E8Ä8ä@å@åA$A$@å@åQEQEI‡I‡{,{,ZZY†Y†YEYEY†Y†YEYEaÇaÇY†Y†YÇYÇY†Y†I†I†AGAGQÇQÇA&A&bŒbŒZJbJI‡I‡QEQEA&A&A&A&IEIE@å@åA&A&@å@å9E9E@å@å9E9EA&A&QEQEA&A&QEQEA&A&QEQEA&A&QEQEA&A&0å0å0å0å9E9EA&A&AGAGYEYEYEYEbbI‡I‡YEYE@å@å0å0å8Ä8ä8Ä8ä9E9E8Ä8ä@å@å@å@å9E9E(ä(ä@å@å9E9E8Ä8ä9E9EA&A&@å@åI†I†ZJbJbŒbŒHäHäYEYEYÇYÇY†Y†Y†Y†Y†Y†Y†Y†aÇaÇI‡I‡QÇQÇI‡I‡AÇAÇAGAGbŒbŒbbIEIEA&A&IEIEA&A&8Ä8äIEIE9E9E@å@å@å@å9E9EA&A&IEIEA&A&AGAGQEQEA&A&AGAGQEQEA&A&A&A&@å@å9E9EA&A&A&A&QEQEAGAGa†a†YÉYÉAGAGYEYEAGAGQEQE@å@åA&A&QEQE@å@å@å@åA$A$9E9E8Ä8ä9E9E0å0å@å@å9$9$9E9E@å@åA&A&YÇYÇjÍjÍA&A&YEYEY†Y†aÇaÇY†Y†YEYEa†a†aÇaÇI‡I‡Y†Y†I‡I‡I‡I‡9†9†ZJbJbbAGAGAGAGIEIEA&A&A&A&8Ä8äIEIE@å@å9E9EA&A&A&A&A&A&@å@åQEQEA&A&QEQEA&A&I†I†A&A&A&A&9E9E@å@åA&A&A&A&QEQEAGAGYEYEbbI‡I‡YEYEI‡I‡@å@åA$A$8ä8Ä9E9E8ä8Ä@å@å@å@å9E9E(ä(ä@å@å9E9E8ä8Ä9E9EA&A&@å@åI†I†ZJbJbŒbŒHäHäYEYEYÇYÇY†Y†Y†Y†Y†Y†Y†Y†aÇaÇI‡I‡QÇQÇI‡I‡AÇAÇAGAGbŒbŒbbIEIEA&A&IEIEA&A&8Ä8äIEIE9E9E@å@å@å@å9E9EA&A&IEIEA&A&AGAGQEQEA&A&AGAGQEQEA&A&A&A&@å@å9E9EA&A&A&A&QEQEAGAGa†a†YÉYÉAGAGYEYEAGAGQEQE@å@åA&A&QEQE@å@å@å@åA$A$9E9E8Ä8ä9E9E0å0å@å@å9$9$9E9E@å@åA&A&YÇYÇjÍjÍA&A&YEYEY†Y†aÇaÇY†Y†YEYEa†a†aÇaÇI‡I‡Y†Y†I‡I‡I‡I‡9†9†ZJbJbbAGAGAGAGIEIEA&A&A&A&8Ä8äIEIE@å@å9E9EA&A&A&A&A&A&@å@åQEQEA&A&QEQEA&A&I†I†A&A&A&A&9E9E@å@åA&A&A&A&QEQEAGAGYEYEbbI‡I‡YEYEI‡I‡@å@åA$A$8Ä8ä(ä(ä@å@å9E9E8Ä8ä8Ä8ä(ä(ä9E9E8å8å@å@å9E9E@å@å9E9EA&A&bbZJbJIEIEQEQEa†a†Y†Y†a†a†aÇaÇaÇaÇa†a†aÇaÇAGAGI‡I‡A†A†AÇAÇZJbJYÉYÉIEIEA&A&IEIE@å@åA&A&9E9E8å8åA&A&8Ä8äIEIEA&A&A&A&IEIEA&A&IEIEA&A&QEQEA&A&A&A&9E9E8Ä8ä9E9EA&A&IEIEA&A&YEYEaÇaÇYÉYÉYEYEI‡I‡A&A&YEYEAGAGQEQE8å8åA&A&8Ä8ä8Ä8ä0å0å8Ä8ä(ä(äIEIE0å0å@å@å9E9E@å@å9E9EI‡I‡jÎjÍAGAGQ…Q…YEYEaÇaÇY†Y†aÇaÇaÇaÇa†a†aÇaÇI‡I‡I‡I‡AGAG9$9$R‹R‹bbAGAGQEQEIEIE@å@å9E9E@å@å9E9E@å@å9E9E@å@å9E9EA&A&QEQEA&A&IEIEA&A&A&A&I†I†A&A&@å@å@å@å1$1$A&A&AGAGAEAEQEQEI‡I‡jjI‡I‡I‡I‡I$I$0å0å8Ä8ä8ä8Ä(ä(ä@å@å9E9E8ä8Ä8ä8Ä(ä(ä9E9E8å8å@å@å9E9E@å@å9E9EA&A&bbZJbJIEIEQEQEa†a†Y†Y†a†a†aÇaÇaÇaÇa†a†aÇaÇAGAGI‡I‡A†A†AÇAÇZJbJYÉYÉIEIEA&A&IEIE@å@åA&A&9E9E8å8åA&A&8Ä8äIEIEA&A&A&A&IEIEA&A&IEIEA&A&QEQEA&A&A&A&9E9E8Ä8ä9E9EA&A&IEIEA&A&YEYEaÇaÇYÉYÉYEYEI‡I‡A&A&YEYEAGAGQEQE8å8åA&A&8Ä8ä8Ä8ä0å0å8Ä8ä(ä(äIEIE0å0å@å@å9E9E@å@å9E9EI‡I‡jÎjÍAGAGQ…Q…YEYEaÇaÇY†Y†aÇaÇaÇaÇa†a†aÇaÇI‡I‡I‡I‡AGAG9$9$R‹R‹bbAGAGQEQEIEIE@å@å9E9E@å@å9E9E@å@å9E9E@å@å9E9EA&A&QEQEA&A&IEIEA&A&A&A&I†I†A&A&@å@å@å@å1$1$A&A&AGAGAEAEQEQEI‡I‡jjI‡I‡I‡I‡I$I$0å0å8Ä8ä8Ä8ä9$9$0å0å8Ä8ä0å0å9E9E8Ä8ä0å0å@å@å8Ä8ä9E9E@å@å8Ä8äIEIEYÉYÉZÌZÌY†Y†YÇYÇiÇiÇrjzzzzzzzzYÉYÉY†Y†AGAG9†9†AÇAÇZJbJI‡I‡QEQEA&A&A&A&9E9E@å@å@å@å9E9E@å@å9E9E@å@åA†A†@å@åA&A&IEIEA&A&A&A&AGAGIEIE@å@å0å0å8Ä8ä9$9$A&A&A&A&QEQEA&A&a†a†ZJbJI‡I‡QEQEA&A&A&A&AGAGQEQEA&A&@å@åA$A$8Ä8ä9E9E8Ä8ä0å0å0å0åA$A$0å0åA&A&8Ä8äIEIEAGAGbŒbŒbbY†Y†iÇiÇa†a†zzzzzzzziÇiÇI‡I‡QÇQÇAGAGI‡I‡bŒbŒIÇIÇAGAGAGAGA&A&IEIE@å@å9E9E@å@å@å@å9E9EA&A&A&A&A&A&A&A&QEQE@å@åAGAGIEIEA&A&@å@å9E9E0å0å8Ä8ä9E9EA&A&QEQEA&A&YEYEZJbJYÉYÉQEQE8å8å@ä@ä8Ä8ä8ä8Ä9$9$0å0å8Ä8ä0å0å9E9E8Ä8ä0å0å@å@å8Ä8ä9E9E@å@å8Ä8äIEIEYÉYÉZÌZÌY†Y†YÇYÇiÇiÇrjzzzzzzzzYÉYÉY†Y†AGAG9†9†AÇAÇZJbJI‡I‡QEQEA&A&A&A&9E9E@å@å@å@å9E9E@å@å9E9E@å@åA†A†@å@åA&A&IEIEA&A&A&A&AGAGIEIE@å@å0å0å8Ä8ä9$9$A&A&A&A&QEQEA&A&a†a†ZJbJI‡I‡QEQEA&A&A&A&AGAGQEQEA&A&@å@åA$A$8Ä8ä9E9E8Ä8ä0å0å0å0åA$A$0å0åA&A&8Ä8äIEIEAGAGbŒbŒbbY†Y†iÇiÇa†a†zzzzzzzziÇiÇI‡I‡QÇQÇAGAGI‡I‡bŒbŒIÇIÇAGAGAGAGA&A&IEIE@å@å9E9E@å@å@å@å9E9EA&A&A&A&A&A&A&A&QEQE@å@åAGAGIEIEA&A&@å@å9E9E0å0å8Ä8ä9E9EA&A&QEQEA&A&YEYEZJbJYÉYÉQEQE8å8å@ä@ä8Ä8ä8Ä8ä8Ä8ä8Ä8ä9$9$8Ä8ä8Ä8ä0Ä0ã8Ä8ä8Ä8ä9E9E8Ä8ä9E9EA&A&QEQEYÉYÉbŒbŒAÇAÇI‡I‡AGAGY†Y†YÉYÉjjYÉYÉY†Y†Y†Y†0å0å9E9E@å@åR -R -R -R -QEQEA&A&IEIE@å@å9E9E@å@å8Ä8ä9E9E8Ä8ä9E9EA&A&8Ä8äIEIEIEIEA&A&QEQEA&A&IEIE8Ä8ä9E9E@å@åA$A$9E9EA&A&A&A&QEQEYEYEYÉYÉbŒbŒQEQEQEQEA&A&YEYEA&A&A&A&QEQE@ä@ä8Ä8ä8Ä8äAEAE0Ä0ä8Ä8ä8Ä8ä9E9E8Ä8äA$A$9E9EQEQEI‡I‡ZJbJR -R -QÇQÇAGAGQÇQÇI‡I‡jjYÉYÉaÇaÇI‡I‡QEQE(å(å9E9EI‡I‡R‹R‹Y†Y†IEIEA&A&@å@åA$A$@å@å0å0å9E9E8Ä8ä@å@å9E9E@å@åAEAE@å@åIEIEQEQEIEIE@å@åA&A&9E9E@å@åAEAE8Ä8äA&A&IEIEQEQEA&A&a†a†ZJbJYÉYÉQEQEQEQE8Ä8ä@å@å8ä8Ä8ä8Ä8ä8Ä9$9$8Ä8ä8Ä8ä0Ä0ã8Ä8ä8Ä8ä9E9E8Ä8ä9E9EA&A&QEQEYÉYÉbŒbŒAÇAÇI‡I‡AGAGY†Y†YÉYÉjjYÉYÉY†Y†Y†Y†0å0å9E9E@å@åR -R -R -R -QEQEA&A&IEIE@å@å9E9E@å@å8Ä8ä9E9E8Ä8ä9E9EA&A&8Ä8äIEIEIEIEA&A&QEQEA&A&IEIE8Ä8ä9E9E@å@åA$A$9E9EA&A&A&A&QEQEYEYEYÉYÉbŒbŒQEQEQEQEA&A&YEYEA&A&A&A&QEQE@ä@ä8Ä8ä8Ä8äAEAE0Ä0ä8Ä8ä8Ä8ä9E9E8Ä8äA$A$9E9EQEQEI‡I‡ZJbJR -R -QÇQÇAGAGQÇQÇI‡I‡jjYÉYÉaÇaÇI‡I‡QEQE(å(å9E9EI‡I‡R‹R‹Y†Y†IEIEA&A&@å@åA$A$@å@å0å0å9E9E8Ä8ä@å@å9E9E@å@åAEAE@å@åIEIEQEQEIEIE@å@åA&A&9E9E@å@åAEAE8Ä8äA&A&IEIEQEQEA&A&a†a†ZJbJYÉYÉQEQEQEQE8Ä8ä@å@åAGAGAGAGAÇAÇAÇAÇ9E9EA&A&AÇAÇA†A†AÇAÇAGAG0æ0æAGAGAGAGAGAGR‹R‹ZJbJ å å0Ä0ä ä ä££Ä Ä0æ0æ0æ0æ!$!$AGAGBBR‹R‹R -R -c/c/R‹R‹AGAGAGAG9†9†AGAGAGAG0æ0æ0æ0æ9E9E@å@å8æ8æ0æ0æAÇAÇAGAGAGAGAGAGA&A&A&A&AGAGAGAG@å@åIEIE0å0å8æ8æAGAGI‡I‡YÉYÉI‡I‡YÉYÉjÍjÍbJZJYÉYÉbbR -R -I‡I‡I‡I‡A&A&8æ8æ9E9E0æ0æ(ä(ä(ä(ä(ä(ä(ä(äA&A&0æ0æAGAGA†A†AGAGI‡I‡c.c-AÇAÇ Ä Ä ä ä ä ä Ä Ä(å(å0æ0æ å å0æ0æJJR‹R‹BBBBbŒbŒAGAGAGAGAGAGAGAG9†9†AGAG0å0å@å@å9E9E0æ0æ0å0åAGAGAGAGAGAGAGAGA&A&AGAGA&A&AGAGIEIE0å0å9E9E@å@åA†A†AGAGI‡I‡YÉYÉY†Y†bŒbŒbŒbŒYÉYÉYÉYÉYÉYÉJJAGAGAGAGAÇAÇAÇAÇ9E9EA&A&AÇAÇA†A†AÇAÇAGAG0æ0æAGAGAGAGAGAGR‹R‹ZJbJ å å0Ä0ä ä ä££Ä Ä0æ0æ0æ0æ!$!$AGAGBBR‹R‹R -R -c/c/R‹R‹AGAGAGAG9†9†AGAGAGAG0æ0æ0æ0æ9E9E@å@å8æ8æ0æ0æAÇAÇAGAGAGAGAGAGA&A&A&A&AGAGAGAG@å@åIEIE0å0å8æ8æAGAGI‡I‡YÉYÉI‡I‡YÉYÉjÍjÍbJZJYÉYÉbbR -R -I‡I‡I‡I‡A&A&8æ8æ9E9E0æ0æ(ä(ä(ä(ä(ä(ä(ä(äA&A&0æ0æAGAGA†A†AGAGI‡I‡c.c-AÇAÇ Ä Ä ä ä ä ä Ä Ä(å(å0æ0æ å å0æ0æJJR‹R‹BBBBbŒbŒAGAGAGAGAGAGAGAG9†9†AGAG0å0å@å@å9E9E0æ0æ0å0åAGAGAGAGAGAGAGAGA&A&AGAGA&A&AGAGIEIE0å0å9E9E@å@åA†A†AGAGI‡I‡YÉYÉY†Y†bŒbŒbŒbŒYÉYÉYÉYÉYÉYÉJJk/k/rËjËk/k/rËjËbŒbŒƒÐƒÐk/k/bIbIbŒbŒZIZIR‹R‹ZJbJZJbJc,c,bŒbŒjËjËbJZJR‹R‹ZJbJZJbJR‹R‹bŒbŒk-k-c,c,{oƒp{oƒpk-k-k-s.{,{,{,{,k-k-k.s-k-k-k/s/jËj˓ЋЃo{pc,c,c/c/c,c,k-k-ƒÐƒÐk/k/s-k-jÎjÍs-k-k/k/rËjËc,c,{.{.ƒÒƒÑ{Ð{Ðk/k/{.{.{oƒp{.{.{.{.{.{.{.{.{.{.{.{.{.{.k-k-{.{.k-k-bŒbŒjÍjÍc/c/ZJbJR -R -bJZJR‹R‹R -R -bŒbŒc,c,ZJbJZJbJZÌZÌbŒbŒjËjËbŒbŒZJbJR‹R‹bŒbŒbIbIZÌZÌk-k-rÎjÍk,k,ƒÐƒÐ{.{.{,{,{.{.{.{.k-k-s.k-k-k-s.k-k-k-s/k/ƒÒƒÑk,k,c/c/k-k-bŒbŒ{Ï{σЃÐc,c,k/k/s-k-k.k-s-k-bŒbŒk-k-ƒÐƒÐƒÒƒÑk/k/{.{.ƒÐƒÐ{oƒp{.{.{.{.{.{.{oƒps,{,{.{.k/k/{.{.k/s/jËjËk/s/jËjËbŒbŒƒÐƒÐk/k/bIbIbŒbŒZIZIR‹R‹ZJbJZJbJc,c,bŒbŒjËjËbJZJR‹R‹ZJbJZJbJR‹R‹bŒbŒk-k-c,c,{oƒp{oƒpk-k-k-s.{,{,{,{,k-k-k.s-k-k-k/s/jËj˓ЋЃo{pc,c,c/c/c,c,k-k-ƒÐƒÐk/k/s-k-jÎjÍs-k-k/k/rËjËc,c,{.{.ƒÒƒÑ{Ð{Ðk/k/{.{.{oƒp{.{.{.{.{.{.{.{.{.{.{.{.{.{.k-k-{.{.k-k-bŒbŒjÍjÍc/c/ZJbJR -R -bJZJR‹R‹R -R -bŒbŒc,c,ZJbJZJbJZÌZÌbŒbŒjËjËbŒbŒZJbJR‹R‹bŒbŒbIbIZÌZÌk-k-rÎjÍk,k,ƒÐƒÐ{.{.{,{,{.{.{.{.k-k-s.k-k-k-s.k-k-k-s/k/ƒÒƒÑk,k,c/c/k-k-bŒbŒ{Ï{σЃÐc,c,k/k/s-k-k.k-s-k-bŒbŒk-k-ƒÐƒÐƒÒƒÑk/k/{.{.ƒÐƒÐ{oƒp{.{.{.{.{.{.{oƒps,{,{.{.k/k/{.{.QÇQÇQEQEY†Y†YEYEY†Y†ƒÐƒÐRŠRŠ@å@åIEIEI$I$A&A&@å@åAEAEIEIEIEIEQEQEI†I†AGAGI†I†AGAGQEQEI†I†I†I†I‡I‡Y†Y†I†I†QEQEA&A&IEIEQEQEIEIEIEIEQEQEY†Y†QEQEjËj˓ГÐR -R -QEQEAGAGQEQEAGAGAEAEQEQEIEIEIEIEI†I†QEQEYEYEYÉYɃЃÐjIjIbbYÇYÇQÇQÇYÇYÇYÇYÇY†Y†QÇQÇQEQEAGAGQÇQÇQEQEI‡I‡QÇQÇQEQEjj{.{.QEQEA&A&IEIEQEQEQEQEA&A&IEIE@å@åAEAEQEQEQEQEA&A&QEQEAGAGY†Y†AGAGQEQEAGAGQEQEQÇQÇQÇQÇI†I†QEQEA&A&QEQEA&A&IEIEIEIEQEQEYEYEQÇQÇaÇaǃσÏbŒbŒY†Y†AGAGQEQEAGAGAEAEQEQEIEIEIEIEA&A&QEQEY†Y†Y†Y†jÍjÍ{.{.bbQÇQÇI‡I‡Y†Y†bbY†Y†I‡I‡QEQEI†I†I†I†QEQEY†Y†QÇQÇQEQEY†Y†YEYEY†Y†ƒÐƒÐRŠRŠ@å@åIEIEI$I$A&A&@å@åAEAEIEIEIEIEQEQEI†I†AGAGI†I†AGAGQEQEI†I†I†I†I‡I‡Y†Y†I†I†QEQEA&A&IEIEQEQEIEIEIEIEQEQEY†Y†QEQEjËj˓ГÐR -R -QEQEAGAGQEQEAGAGAEAEQEQEIEIEIEIEI†I†QEQEYEYEYÉYɃЃÐjIjIbbYÇYÇQÇQÇYÇYÇYÇYÇY†Y†QÇQÇQEQEAGAGQÇQÇQEQEI‡I‡QÇQÇQEQEjj{.{.QEQEA&A&IEIEQEQEQEQEA&A&IEIE@å@åAEAEQEQEQEQEA&A&QEQEAGAGY†Y†AGAGQEQEAGAGQEQEQÇQÇQÇQÇI†I†QEQEA&A&QEQEA&A&IEIEIEIEQEQEYEYEQÇQÇaÇaǃσÏbŒbŒY†Y†AGAGQEQEAGAGAEAEQEQEIEIEIEIEA&A&QEQEY†Y†Y†Y†jÍjÍ{.{.bbQÇQÇI‡I‡Y†Y†bbY†Y†I‡I‡QEQEI†I†I†I†QEQEY†Y†QEQEQEQEYEYEAGAGY†Y†jÍjÍbbIEIEA&A&I$I$I$I$IEIEQEQEQEQEA&A&I$I$A&A&QEQEQEQEA&A&I†I†YEYEI‡I‡QEQEAGAGQEQEA&A&QEQE@å@åAEAEI$I$AGAGYEYEY†Y†Y†Y†jŠjŠƒÐƒÐbbAGAGIEIEQEQEQEQEIEIEAGAGQEQEQEQEA&A&YEYEI‡I‡iÇiÇs/k/I‡I‡QEQEQEQEY†Y†A&A&QEQEY†Y†A&A&I†I†QEQEA&A&AGAGA†A†QEQEQEQEjjrÍjÍA&A&HäHäI$I$A&A&I$I$QEQEI$I$A&A&I$I$QEQEA&A&QEQEA&A&IEIEQEQEIEIEA&A&I†I†YEYEA&A&Y†Y†AGAGQEQEIEIEA&A&IEIEI$I$IEIEQEQEY†Y†Y†Y†aÇaǃЃÐk-k-QEQEAGAGI$I$AGAGQEQEQEQEAGAGI$I$AGAGQEQEYEYEYEYEk/k/bJZJIEIEYEYEQEQEYEYEA&A&Y†Y†QEQEA&A&I†I†AGAGQEQEYEYEQEQEQEQEYEYEAGAGY†Y†jÍjÍbbIEIEA&A&I$I$I$I$IEIEQEQEQEQEA&A&I$I$A&A&QEQEQEQEA&A&I†I†YEYEI‡I‡QEQEAGAGQEQEA&A&QEQE@å@åAEAEI$I$AGAGYEYEY†Y†Y†Y†jŠjŠƒÐƒÐbbAGAGIEIEQEQEQEQEIEIEAGAGQEQEQEQEA&A&YEYEI‡I‡iÇiÇs/k/I‡I‡QEQEQEQEY†Y†A&A&QEQEY†Y†A&A&I†I†QEQEA&A&AGAGA†A†QEQEQEQEjjrÍjÍA&A&HäHäI$I$A&A&I$I$QEQEI$I$A&A&I$I$QEQEA&A&QEQEA&A&IEIEQEQEIEIEA&A&I†I†YEYEA&A&Y†Y†AGAGQEQEIEIEA&A&IEIEI$I$IEIEQEQEY†Y†Y†Y†aÇaǃЃÐk-k-QEQEAGAGI$I$AGAGQEQEQEQEAGAGI$I$AGAGQEQEYEYEYEYEk/k/bJZJIEIEYEYEQEQEYEYEA&A&Y†Y†QEQEA&A&I†I†AGAGQEQEYEYEQEQEY†Y†A&A&QEQEYEYEZJbJJJI$I$QEQE@ä@äQEQEHäHäQEQEA&A&I$I$QEQEQEQEA&A&I$I$QEQEA&A&QEQEQEQEQEQEQEQEY†Y†QEQEA&A&IEIEQEQEQEQEYEYEaÇaÇY…Y…QEQEjËj˃o{pI‡I‡QEQEAGAGI$I$A&A&QEQEA&A&QEQEA&A&QEQEAGAGHäHäaÇaǃ҃ÑQÇQÇYEYEQEQEYEYEAGAGQEQEYEYEY†Y†AGAGQEQEA&A&I†I†QEQEA&A&YEYEZJbJZÌZÌQEQEHäHä@å@åI$I$A&A&HãHäQEQEQEQEI$I$A&A&I$I$QEQEI$I$IEIEA&A&I$I$IEIEA&A&QEQEYEYEI†I†YEYEQEQEIEIEA&A&QEQEQEQEQEQEY†Y†Y…Y…QEQEbbƒÐƒÐZJbJQEQEAGAGQEQEA&A&IEIEQEQEA&A&QEQEA&A&QEQEAGAGYEYE{,{,bŒbŒYEYEYEYEY†Y†AGAGQEQEYEYEI†I†QEQEYEYEAGAGQEQEAGAGQEQEY†Y†A&A&QEQEYEYEZJbJJJI$I$QEQE@ä@äQEQEHäHäQEQEA&A&I$I$QEQEQEQEA&A&I$I$QEQEA&A&QEQEQEQEQEQEQEQEY†Y†QEQEA&A&IEIEQEQEQEQEYEYEaÇaÇY…Y…QEQEjËj˃o{pI‡I‡QEQEAGAGI$I$A&A&QEQEA&A&QEQEA&A&QEQEAGAGHäHäaÇaǃ҃ÑQÇQÇYEYEQEQEYEYEAGAGQEQEYEYEY†Y†AGAGQEQEA&A&I†I†QEQEA&A&YEYEZJbJZÌZÌQEQEHäHä@å@åI$I$A&A&HãHäQEQEQEQEI$I$A&A&I$I$QEQEI$I$IEIEA&A&I$I$IEIEA&A&QEQEYEYEI†I†YEYEQEQEIEIEA&A&QEQEQEQEQEQEY†Y†Y…Y…QEQEbbƒÐƒÐZJbJQEQEAGAGQEQEA&A&IEIEQEQEA&A&QEQEA&A&QEQEAGAGYEYE{,{,bŒbŒYEYEYEYEY†Y†AGAGQEQEYEYEI†I†QEQEYEYEAGAGQEQEAGAGQEQEIEIEAGAGQEQEA&A&ZJbJYÉYÉA&A&I$I$I$I$I$I$QEQEQEQEQEQEQEQEQEQE@å@åIEIEI$I$A&A&I$I$QEQEQEQEQEQEY†Y†QEQEQEQEQEQEQEQEYEYEY…Y…aÇaÇY…Y…Y†Y†Y…Y…k-k-ƒp{oI‡I‡QEQEA&A&IEIEA&A&QEQEA&A&AEAEI$I$A&A&QEQEQEQEYÇYÇ{oƒpYÈYÉYEYEYEYEQEQEYEYEY†Y†YEYEQEQEYEYEAGAGQEQEA&A&I†I†AGAGAGAGZZjÍjÍQEQE@ä@ä@ä@äHäHäIEIEI$I$HäHäQEQEQEQEQEQEQEQEA&A&I$I$QEQE@å@åQEQEA&A&QEQEQEQEQEQEYEYEY†Y†QEQEQEQEQEQEQEQEY…Y…aÇaÇYEYEaÇaÇY…Y…bb{Ð{ÐZJbJIEIEIEIEA&A&I$I$A&A&QEQEA&A&IEIEA&A&IEIEQEQEQEQE{,{,bŒbŒYEYEYEYEQEQEYEYEYEYEYEYEYEYEYEYEAGAGQEQEA&A&QEQEQEQEIEIEAGAGQEQEA&A&ZJbJYÉYÉA&A&I$I$I$I$I$I$QEQEQEQEQEQEQEQEQEQE@å@åIEIEI$I$A&A&I$I$QEQEQEQEQEQEY†Y†QEQEQEQEQEQEQEQEYEYEY…Y…aÇaÇY…Y…Y†Y†Y…Y…k-k-ƒp{oI‡I‡QEQEA&A&IEIEA&A&QEQEA&A&AEAEI$I$A&A&QEQEQEQEYÇYÇ{oƒpYÈYÉYEYEYEYEQEQEYEYEY†Y†YEYEQEQEYEYEAGAGQEQEA&A&I†I†AGAGAGAGZZjÍjÍQEQE@ä@ä@ä@äHäHäIEIEI$I$HäHäQEQEQEQEQEQEQEQEA&A&I$I$QEQE@å@åQEQEA&A&QEQEQEQEQEQEYEYEY†Y†QEQEQEQEQEQEQEQEY…Y…aÇaÇYEYEaÇaÇY…Y…bb{Ð{ÐZJbJIEIEIEIEA&A&I$I$A&A&QEQEA&A&IEIEA&A&IEIEQEQEQEQE{,{,bŒbŒYEYEYEYEQEQEYEYEYEYEYEYEYEYEYEYEAGAGQEQEA&A&QEQEIEIEQEQEA&A&QEQEYEYER -R -bbI$I$HäHäI$I$QEQEQEQEHäHäQEQEQEQEHäHäI$I$QEQEQEQEQEQEQEQEQEQEQEQEYEYEY†Y†Y†Y†QEQEY†Y†YEYEY†Y†YEYEY†Y†Y†Y†aÇaÇY…Y…jŠjŠ{Ð{ÐYÉYÉIEIEIEIEA&A&QEQE@å@åIEIEA&A&IEIEA&A&QEQEAGAGa†a†k/k/aÇaÇY…Y…a†a†YEYEQEQEQEQEYEYEY†Y†QEQEQEQEA&A&I†I†YEYEAGAGQEQEZJbJk/k/I$I$@ä@ä@ä@äHäHäI$I$HäHäHäHäQEQEQEQEQEQEHäHäQEQEI$I$QEQEI$I$QEQEQEQEQEQEHäHäYEYEa†a†Y…Y…Y†Y†QEQEY†Y†YEYEY†Y†YEYEaÇaÇY…Y…Y†Y†bbk/k/c,c,QEQEA&A&QEQEA&A&IEIE@å@åIEIEA&A&IEIEA&A&QEQEQEQEjËjËbŒbŒYEYEY…Y…YEYEYEYEY†Y†QEQEYEYEY†Y†QEQEAGAGQEQEA&A&IEIEQEQEA&A&QEQEYEYER -R -bbI$I$HäHäI$I$QEQEQEQEHäHäQEQEQEQEHäHäI$I$QEQEQEQEQEQEQEQEQEQEQEQEYEYEY†Y†Y†Y†QEQEY†Y†YEYEY†Y†YEYEY†Y†Y†Y†aÇaÇY…Y…jŠjŠ{Ð{ÐYÉYÉIEIEIEIEA&A&QEQE@å@åIEIEA&A&IEIEA&A&QEQEAGAGa†a†k/k/aÇaÇY…Y…a†a†YEYEQEQEQEQEYEYEY†Y†QEQEQEQEA&A&I†I†YEYEAGAGQEQEZJbJk/k/I$I$@ä@ä@ä@äHäHäI$I$HäHäHäHäQEQEQEQEQEQEHäHäQEQEI$I$QEQEI$I$QEQEQEQEQEQEHäHäYEYEa†a†Y…Y…Y†Y†QEQEY†Y†YEYEY†Y†YEYEaÇaÇY…Y…Y†Y†bbk/k/c,c,QEQEA&A&QEQEA&A&IEIE@å@åIEIEA&A&IEIEA&A&QEQEQEQEjËjËbŒbŒYEYEY…Y…YEYEYEYEY†Y†QEQEYEYEY†Y†QEQEAGAGQEQEA&A&A&A&I$I$QEQEQEQEYÉYÉjjJJ@å@å@å@å@å@åHäHäIEIEQEQEI$I$QEQEQEQE@å@å@å@åIEIEHäHäQEQEQEQEYEYEYEYEa†a†QEQEQEQEY†Y†QEQEY†Y†QEQEaÇaÇQ…Q…QEQEYEYEZIZIƒÐƒÐRRA&A&QEQEA&A&@å@åIEIEA&A&@å@åQEQEIEIEA&A&QEQEIEIEbŒbŒYÉYÉYEYEYEYEYEYEY†Y†YEYEYEYEY†Y†a†a†QEQEQEQEQEQEA&A&QEQE@å@åZZk/k/QEQE@Ã@Ä@ä@ä@ä@äHäHäI$I$AEAEI$I$QEQEQEQEI$I$QEQE@ä@äI$I$A&A&I$I$QEQEQEQEYEYEYEYEY…Y…Y…Y…QEQEQEQEY†Y†QEQEY†Y†Y…Y…Y†Y†Y…Y…QEQEQÇQÇk-k-rÎjÍHäHäAGAGI$I$A&A&IEIEA&A&A&A&AEAEI$I$AGAGQEQE@å@åZJbJZJbJYEYEYEYEY†Y†YEYEYEYEYEYEY†Y†YEYEY†Y†IEIE@å@åHäHäA&A&I$I$QEQEQEQEYÉYÉjjJJ@å@å@å@å@å@åHäHäIEIEQEQEI$I$QEQEQEQE@å@å@å@åIEIEHäHäQEQEQEQEYEYEYEYEa†a†QEQEQEQEY†Y†QEQEY†Y†QEQEaÇaÇQ…Q…QEQEYEYEZIZIƒÐƒÐRRA&A&QEQEA&A&@å@åIEIEA&A&@å@åQEQEIEIEA&A&QEQEIEIEbŒbŒYÉYÉYEYEYEYEYEYEY†Y†YEYEYEYEY†Y†a†a†QEQEQEQEQEQEA&A&QEQE@å@åZZk/k/QEQE@Ã@Ä@ä@ä@ä@äHäHäI$I$AEAEI$I$QEQEQEQEI$I$QEQE@ä@äI$I$A&A&I$I$QEQEQEQEYEYEYEYEY…Y…Y…Y…QEQEQEQEY†Y†QEQEY†Y†Y…Y…Y†Y†Y…Y…QEQEQÇQÇk-k-rÎjÍHäHäAGAGI$I$A&A&IEIEA&A&A&A&AEAEI$I$AGAGQEQE@å@åZJbJZJbJYEYEYEYEY†Y†YEYEYEYEYEYEY†Y†YEYEY†Y†IEIE@å@åHäHäA&A&I‡I‡I‡I‡I‡I‡ZJbJbŒbŒbŒbŒAGAGAGAGA&A&AGAGA&A&AGAGAGAGJJI‡I‡I‡I‡RRI‡I‡JJYÉYÉI‡I‡YÉYÉRRAGAGRRAGAGI‡I‡I‡I‡I‡I‡YÉYÉZIZIZJbJjŠjŠjÍjÍrÎjÍc,c,ZJbJA&A&AGAGAGAGI‡I‡BBBBI‡I‡BBI‡I‡BBbŒbŒjÍjÍs/k/ZJbJI‡I‡I‡I‡I‡I‡I‡I‡JJI‡I‡YÉYÉJJR -R -R -R -bJZJR -R -bJZJbJZJs.k-ƒÒƒÑbbYÉYÉYÉYÉJJAGAGAGAGA&A&AGAGAGAGAGAGI‡I‡BBI‡I‡I‡I‡JJI‡I‡YÉYÉJJYÉYÉYÉYÉAÇAÇI‡I‡AGAGI‡I‡I‡I‡I‡I‡RRYÉYÉR -R -bJZJrËjË{.{.c,c,jÍjÍAGAGAGAGI‡I‡AGAGAÇAÇBBAGAGI‡I‡BBI‡I‡R -R -rÍjÍk/k/s/k/I‡I‡I‡I‡I‡I‡I‡I‡I‡I‡R -R -I‡I‡R -R -YÉYÉR -R -R -R -JJA&A&I‡I‡I‡I‡I‡I‡ZJbJbŒbŒbŒbŒAGAGAGAGA&A&AGAGA&A&AGAGAGAGJJI‡I‡I‡I‡RRI‡I‡JJYÉYÉI‡I‡YÉYÉRRAGAGRRAGAGI‡I‡I‡I‡I‡I‡YÉYÉZIZIZJbJjŠjŠjÍjÍrÎjÍc,c,ZJbJA&A&AGAGAGAGI‡I‡BBBBI‡I‡BBI‡I‡BBbŒbŒjÍjÍs/k/ZJbJI‡I‡I‡I‡I‡I‡I‡I‡JJI‡I‡YÉYÉJJR -R -R -R -bJZJR -R -bJZJbJZJs.k-ƒÒƒÑbbYÉYÉYÉYÉJJAGAGAGAGA&A&AGAGAGAGAGAGI‡I‡BBI‡I‡I‡I‡JJI‡I‡YÉYÉJJYÉYÉYÉYÉAÇAÇI‡I‡AGAGI‡I‡I‡I‡I‡I‡RRYÉYÉR -R -bJZJrËjË{.{.c,c,jÍjÍAGAGAGAGI‡I‡AGAGAÇAÇBBAGAGI‡I‡BBI‡I‡R -R -rÍjÍk/k/s/k/I‡I‡I‡I‡I‡I‡I‡I‡I‡I‡R -R -I‡I‡R -R -YÉYÉR -R -R -R -JJk/k/ƒÐƒÐ{Ð{Ð{oƒp{oƒpƒÐƒÐ{.{.k/k/s/k/{Ï{Ïk/k/{Ï{Ïk/k/s/k/k-k-rÎjÍbŒbŒk-k-bŒbŒk-k-c,c,bŒbŒk-k-s/k/k/k/c,c,{oƒp{Ð{ЃЃÐk/k/{Ï{Ï{Ï{σЃÐ{oƒpŒ0”0‹Ï“σЃÐ{.{.ƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÐ{oƒpƒÑƒÒƒÑƒÒƒÐƒÐ{oƒp{.{.‹Ð“М“œ“ƒÐƒÐ{oƒp{Ï{Ï{.{.ƒÐƒÐƒÐƒÐƒÒƒÑƒÐƒÐ{Ï{σ҃уЃД“Œ“œ“œ“”“Œ““ЋМ“œ“œ“œ“œ“œ“ƒÏƒÏƒÐƒÐk/k/{Ï{Ïk/k/s/k/{Ï{Ïk/k/s/k/k,k,s/k/jÍjÍc,c,jÍjÍbŒbŒk/k/c,c,bŒbŒbŒbŒk,k,s/k/k/k/{Ï{σЃÐ{oƒp{oƒpsÎ{Ïk/k/ƒÏƒÏƒÏƒÏ“ЋД0Œ0“ЋЃЃÐk/k/{Ï{σЃЃЃÐ{oƒpƒÑƒÒ“ЋЃ҃у҃Ñk/k/ƒÏƒÏ”0Œ0“ЋЃσσЃÐk/k/ƒÐƒÐƒÐƒÐƒÐƒÐ{Ð{ЃЃЃЃÐ{Ï{Ï”“Œ“œ“œ“ƒÐƒÐk/s/ƒÐƒÐ{Ð{Ð{oƒp{oƒpƒÐƒÐ{.{.k/k/s/k/{Ï{Ïk/k/{Ï{Ïk/k/s/k/k-k-rÎjÍbŒbŒk-k-bŒbŒk-k-c,c,bŒbŒk-k-s/k/k/k/c,c,{oƒp{Ð{ЃЃÐk/k/{Ï{Ï{Ï{σЃÐ{oƒpŒ0”0‹Ï“σЃÐ{.{.ƒÐƒÐƒÐƒÐƒÐƒÐƒÐƒÐ{oƒpƒÑƒÒƒÑƒÒƒÐƒÐ{oƒp{.{.‹Ð“М“œ“ƒÐƒÐ{oƒp{Ï{Ï{.{.ƒÐƒÐƒÐƒÐƒÒƒÑƒÐƒÐ{Ï{σ҃уЃД“Œ“œ“œ“”“Œ““ЋМ“œ“œ“œ“œ“œ“ƒÏƒÏƒÐƒÐk/k/{Ï{Ïk/k/s/k/{Ï{Ïk/k/s/k/k,k,s/k/jÍjÍc,c,jÍjÍbŒbŒk/k/c,c,bŒbŒbŒbŒk,k,s/k/k/k/{Ï{σЃÐ{oƒp{oƒpsÎ{Ïk/k/ƒÏƒÏƒÏƒÏ“ЋД0Œ0“ЋЃЃÐk/k/{Ï{σЃЃЃÐ{oƒpƒÑƒÒ“ЋЃ҃у҃Ñk/k/ƒÏƒÏ”0Œ0“ЋЃσσЃÐk/k/ƒÐƒÐƒÐƒÐƒÐƒÐ{Ð{ЃЃЃЃÐ{Ï{Ï”“Œ“œ“œ“ƒÐƒÐIEIEAEAEIEIEIEIEA&A&IEIE9E9EQEQE9E9EI†I†QÇQÇbŒbŒAEAEHäHäI$I$IEIEI$I$AEAEHäHäIEIE@å@åI$I$AEAEY…Y…QÇQÇYÉYÉAÇAÇI†I†I‡I‡AGAGA†A†IEIEAGAGA†A†QEQEI‡I‡YÇYÇIÇIÇQÇQÇI†I†QÇQÇY†Y†I‡I‡QÇQÇQEQEI†I†AGAGQEQEI†I†A&A&A†A†I†I†Y†Y†Y†Y†ZJbJR -R -A†A†9$9$9E9E9E9EA&A&A†A†8Ä8äA†A†AEAEAEAEAEAEQEQEAGAGIEIE9E9EQEQEIEIEIEIEAGAGbIbIRR@å@åI$I$IEIEIEIEHäHäIEIEHäHäIEIEHäHäAEAEQEQEbbI‡I‡RRAGAGAÇAÇAGAGA†A†A†A†AGAGA†A†QEQEI‡I‡QÇQÇQÇQÇQÇQÇQÇQÇI†I†QÇQÇY†Y†I‡I‡QÇQÇQEQEAGAGQEQEQÇQÇA&A&A†A†QEQEAGAGQÇQÇbbZJbJAÇAÇ@å@å9E9E9E9E9E9EA&A&9E9EIEIEIEIEAEAEIEIEIEIEA&A&IEIE9E9EQEQE9E9EI†I†QÇQÇbŒbŒAEAEHäHäI$I$IEIEI$I$AEAEHäHäIEIE@å@åI$I$AEAEY…Y…QÇQÇYÉYÉAÇAÇI†I†I‡I‡AGAGA†A†IEIEAGAGA†A†QEQEI‡I‡YÇYÇIÇIÇQÇQÇI†I†QÇQÇY†Y†I‡I‡QÇQÇQEQEI†I†AGAGQEQEI†I†A&A&A†A†I†I†Y†Y†Y†Y†ZJbJR -R -A†A†9$9$9E9E9E9EA&A&A†A†8Ä8äA†A†AEAEAEAEAEAEQEQEAGAGIEIE9E9EQEQEIEIEIEIEAGAGbIbIRR@å@åI$I$IEIEIEIEHäHäIEIEHäHäIEIEHäHäAEAEQEQEbbI‡I‡RRAGAGAÇAÇAGAGA†A†A†A†AGAGA†A†QEQEI‡I‡QÇQÇQÇQÇQÇQÇQÇQÇI†I†QÇQÇY†Y†I‡I‡QÇQÇQEQEAGAGQEQEQÇQÇA&A&A†A†QEQEAGAGQÇQÇbbZJbJAÇAÇ@å@å9E9E9E9E9E9EA&A&9E9EIEIE@å@åHäHä8ä8ã@å@å8ã8ä@å@å8ã8ä@å@åHäHä8ä8ãY†Y†ZJbJHäHäHäHäI$I$8ã8äHäHä@ä@ãHäHä8ä8ã8ä8ãHäHä8ä8ãAEAEYDYDjŠjŠA&A&A&A&8ã8ä8Ä8ä8Ä8ä8Ä8äAEAE@å@åAEAE@å@åHäHäAEAEQEQEQEQEQEQEQEQEQEQEHäHäQEQEIEIEQEQEA&A&I$I$@å@å9E9EA&A&A&A&QEQEk-k-I‡I‡8Ä8äIEIE8å8å8Ä8äIEIE0å0åAEAEHãHäHäHä@ä@ä@ä@ä@ä@ä@ä@ä8ä8ã8Ä8ä8ä8ã8Ä8ä@å@åIEIEbbAGAGI$I$HäHäHäHä8ä8ãHäHä@ä@ãHäHä0Ä0ãHäHä8ä8ãHäHäI$I$ZZR -R -8ã8äAEAE@ä@ä0Ä0ä8ä8ã@å@åAEAE@å@åI$I$8Ä8äQEQEA&A&QEQEQEQEQEQEQEQEHäHäQEQEA&A&IEIEIEIE@å@åAEAE@å@åAEAEIEIE@å@åj‰j‰bJZJ@å@åA$A$@å@å8Ä8ä9E9E@ä@ä@å@å8Ä8ä@å@åHäHä8ä8ã@å@å8ã8ä@å@å8ã8ä@å@åHäHä8ä8ãY†Y†ZJbJHäHäHäHäI$I$8ã8äHäHä@ä@ãHäHä8ä8ã8ä8ãHäHä8ä8ãAEAEYDYDjŠjŠA&A&A&A&8ã8ä8Ä8ä8Ä8ä8Ä8äAEAE@å@åAEAE@å@åHäHäAEAEQEQEQEQEQEQEQEQEQEQEHäHäQEQEIEIEQEQEA&A&I$I$@å@å9E9EA&A&A&A&QEQEk-k-I‡I‡8Ä8äIEIE8å8å8Ä8äIEIE0å0åAEAEHãHäHäHä@ä@ä@ä@ä@ä@ä@ä@ä8ä8ã8Ä8ä8ä8ã8Ä8ä@å@åIEIEbbAGAGI$I$HäHäHäHä8ä8ãHäHä@ä@ãHäHä0Ä0ãHäHä8ä8ãHäHäI$I$ZZR -R -8ã8äAEAE@ä@ä0Ä0ä8ä8ã@å@åAEAE@å@åI$I$8Ä8äQEQEA&A&QEQEQEQEQEQEQEQEHäHäQEQEA&A&IEIEIEIE@å@åAEAE@å@åAEAEIEIE@å@åj‰j‰bJZJ@å@åA$A$@å@å8Ä8ä9E9E@ä@ä@å@å8Ä8äHäHä8ä8ã@å@åHäHäHäHä8ä8ãHäHä8ä8ã@ä@ãHäHäI†I†bb8Ä8äI$I$HäHäI$I$HäHäA$A#HäHä8ä8ãI$I$8ã8ä@å@å@ã@äI$I$ZJbJIEIE8Ä8äAEAE8Ä8äAEAE8Ä8äAEAE@å@åHäHäAEAEIEIEI$I$A&A&I$I$A&A&YEYEQEQEQEQEIEIEA&A&A&A&@å@åQEQE9E9E8Ä8äIEIE@å@åQEQEk-k-YÉYÉ8Ä8äAEAE8Ä8ä9E9E8Ä8äA&A&HäHä@ä@ä@ä@ä8ä8ã@ä@äHäHäHäHä8ä8ãHäHä8ä8ãHäHä8ä8ãI$I$ZJbJAGAG@ã@äI$I$HäHä@ä@ãI$I$I$I$8ã8äA$A$8ä8ãI$I$0Ã0äI$I$ZZRR8Ä8ä@å@å8ã8äIEIE8Ä8ä8Ä8äAEAE@å@åAEAEIEIEI$I$A&A&I$I$A&A&QEQEYEYEYEYEIEIEA&A&I$I$IEIEA&A&AEAE8Ä8äIEIE0å0åQEQEbIbIbŒbŒIEIE@å@å8Ä8ä9E9EA&A&HäHä@ä@ä8ä8ãHäHä8ä8ã@å@åHäHäHäHä8ä8ãHäHä8ä8ã@ä@ãHäHäI†I†bb8Ä8äI$I$HäHäI$I$HäHäA$A#HäHä8ä8ãI$I$8ã8ä@å@å@ã@äI$I$ZJbJIEIE8Ä8äAEAE8Ä8äAEAE8Ä8äAEAE@å@åHäHäAEAEIEIEI$I$A&A&I$I$A&A&YEYEQEQEQEQEIEIEA&A&A&A&@å@åQEQE9E9E8Ä8äIEIE@å@åQEQEk-k-YÉYÉ8Ä8äAEAE8Ä8ä9E9E8Ä8äA&A&HäHä@ä@ä@ä@ä8ä8ã@ä@äHäHäHäHä8ä8ãHäHä8ä8ãHäHä8ä8ãI$I$ZJbJAGAG@ã@äI$I$HäHä@ä@ãI$I$I$I$8ã8äA$A$8ä8ãI$I$0Ã0äI$I$ZZRR8Ä8ä@å@å8ã8äIEIE8Ä8ä8Ä8äAEAE@å@åAEAEIEIEI$I$A&A&I$I$A&A&QEQEYEYEYEYEIEIEA&A&I$I$IEIEA&A&AEAE8Ä8äIEIE0å0åQEQEbIbIbŒbŒIEIE@å@å8Ä8ä9E9EA&A&HäHä@ä@ä8ä8ãHäHäHäHä8ä8ã@ä@ã@ä@ã@ä@ã8ä8ãHäHã@ä@ãHäHäQÇQÇZJbJ8Ä8äI$I$I$I$8ã8äI$I$I$I$HäHäA$A$8ä8ãHäHäA$A$HäHäI$I$ZJbJ9E9E8Ä8äA$A$8Ä8ä8Ä8ä8Ä8äA$A$8Ä8äAEAEHäHäAEAEQEQEA&A&I$I$QEQEHäHäQEQEA&A&QEQE8Ä8ä@å@åI$I$A$A$@å@å8Ä8äIEIEIEIEQEQEjÍjÍIÇIÇ8Ä8ä8Ä8äA$A$@å@å@å@å8Ä8ä8Ä8ä8ä8ã8ä8ãHäHä@ä@ä8ä8ãHäHä8ä8ã@ä@ãHäHä@ä@ãHäHäI$I$ZJbJAGAGI$I$HäHäI$I$I$I$HäHäA$A#HäHä8ä8ãHäHä8ä8ãAEAEHäHäbbI‡I‡8Ä8äA$A$8Ä8ä8Ä8ä9$9$8Ä8äA$A$8Ä8äAEAEI$I$AGAGI$I$A&A&HäHäQEQEI$I$A&A&QEQE@å@å8Ä8äIEIE@ä@ä@å@åA$A$8Ä8äQEQEQEQEbbZÌZÌ8Ä8ä8Ä8äA$A$@å@å8Ä8ä8ä8ã8ä8ã@å@åHäHäHäHä8ä8ã@ä@ã@ä@ã@ä@ã8ä8ãHäHã@ä@ãHäHäQÇQÇZJbJ8Ä8äI$I$I$I$8ã8äI$I$I$I$HäHäA$A$8ä8ãHäHäA$A$HäHäI$I$ZJbJ9E9E8Ä8äA$A$8Ä8ä8Ä8ä8Ä8äA$A$8Ä8äAEAEHäHäAEAEQEQEA&A&I$I$QEQEHäHäQEQEA&A&QEQE8Ä8ä@å@åI$I$A$A$@å@å8Ä8äIEIEIEIEQEQEjÍjÍIÇIÇ8Ä8ä8Ä8äA$A$@å@å@å@å8Ä8ä8Ä8ä8ä8ã8ä8ãHäHä@ä@ä8ä8ãHäHä8ä8ã@ä@ãHäHä@ä@ãHäHäI$I$ZJbJAGAGI$I$HäHäI$I$I$I$HäHäA$A#HäHä8ä8ãHäHä8ä8ãAEAEHäHäbbI‡I‡8Ä8äA$A$8Ä8ä8Ä8ä9$9$8Ä8äA$A$8Ä8äAEAEI$I$AGAGI$I$A&A&HäHäQEQEI$I$A&A&QEQE@å@å8Ä8äIEIE@ä@ä@å@åA$A$8Ä8äQEQEQEQEbbZÌZÌ8Ä8ä8Ä8äA$A$@å@å8Ä8ä8ä8ã8ä8ã@å@åHäHä8ä8ã@ä@ãHäHãI$I$8ã8äHãHäHäHä@ä@ãI$I$QEQEbŒbŒI$I$AEAEHäHäHäHäI$I$I$I$I$I$I$I$8ã8äAEAE@ã@äHäHäI$I$RR@å@å8Ä8äA$A$0Ä0ã9$9$8Ä8ä9$9$8Ä8äAEAEI$I$QEQEA&A&I$I$QEQE@å@åI$I$QEQE@å@åI$I$@å@åI$I$A$A$A&A&AEAEHäHäAEAEQEQEQEQEjËjËI‡I‡8Ä8ä(ä(ä8Ä8ä9E9E8Ä8äA$A$8Ä8äAEAEHäHä8ä8ãHäHäHäHä@ä@ã@ä@ã@ä@ã@ä@ã@ä@ãHäHäI$I$jŠjŠAÇAÇHäHäI$I$8ã8äI$I$I$I$I$I$I$I$AEAEHäHäI$I$HäHäHäHäQÇQÇA†A†8Ä8ä8Ä8äA$A$0Ä0ä0Ä0ãA$A$8Ä8äAEAEI$I$QEQEA&A&HäHäQEQEQEQE@ä@äQEQEQEQE@ä@äQEQE@å@åHäHäAEAEI$I$8Ä8äIEIEIEIEQEQEYÉYÉbŒbŒ0Ä0ä8Ä8ä8Ä8ä9$9$9$9$0å0åHäHä8ä8ãHäHä8ä8ã@ä@ãHäHãI$I$8ã8äHãHäHäHä@ä@ãI$I$QEQEbŒbŒI$I$AEAEHäHäHäHäI$I$I$I$I$I$I$I$8ã8äAEAE@ã@äHäHäI$I$RR@å@å8Ä8äA$A$0Ä0ã9$9$8Ä8ä9$9$8Ä8äAEAEI$I$QEQEA&A&I$I$QEQE@å@åI$I$QEQE@å@åI$I$@å@åI$I$A$A$A&A&AEAEHäHäAEAEQEQEQEQEjËjËI‡I‡8Ä8ä(ä(ä8Ä8ä9E9E8Ä8äA$A$8Ä8äAEAEHäHä8ä8ãHäHäHäHä@ä@ã@ä@ã@ä@ã@ä@ã@ä@ãHäHäI$I$jŠjŠAÇAÇHäHäI$I$8ã8äI$I$I$I$I$I$I$I$AEAEHäHäI$I$HäHäHäHäQÇQÇA†A†8Ä8ä8Ä8äA$A$0Ä0ä0Ä0ãA$A$8Ä8äAEAEI$I$QEQEA&A&HäHäQEQEQEQE@ä@äQEQEQEQE@ä@äQEQE@å@åHäHäAEAEI$I$8Ä8äIEIEIEIEQEQEYÉYÉbŒbŒ0Ä0ä8Ä8ä8Ä8ä9$9$9$9$0å0åHäHä8ä8ãHäHä@ä@ã@ä@ã@ä@ã@ä@ãHäHã8ä8ã@ä@ãHäHã@ä@ãIEIEjŠjŠ8Ä8äHäHäI$I$I$I$@ã@äI$I$I$I$I$I$HäHäI$I$HäHäI$I$I$I$AÇAÇ8Ä8äA$A$8ä8ã8Ä8ä8ä8ãAEAEHäHäIEIEI$I$QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEYEYEQEQEQEQEQEQEHäHäIEIEI$I$QEQEQEQEA&A&HäHäbŒbŒAÇAÇ@ä@ä0Ä0ä8ä8ã8Ä8ä8Ä8ä9$9$8ä8ãHäHä8ä8ãHäHã@ä@ãHäHã@ä@ãHäHã@ä@ã@ä@ã@ä@ãHäHã@ä@ãjŠjŠI‡I‡@ä@äHäHäI$I$@ã@äI$I$I$I$I$I$HäHäHäHäI$I$A$A$A$A#QEQEA&A&8Ä8äA$A$8ä8ã8Ä8äI$I$8Ä8äIEIEI$I$QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEHäHäQEQEHäHäIEIEI$I$QEQEQEQEA&A&YÇYÇZJbJ@ä@ä0Ä0ã8Ä8ä(ä(ä8Ä8ä0Ä0ã8ä8ãHäHäHäHä@ä@ã@ä@ã@ä@ã@ä@ãHäHã8ä8ã@ä@ãHäHã@ä@ãIEIEjŠjŠ8Ä8äHäHäI$I$I$I$@ã@äI$I$I$I$I$I$HäHäI$I$HäHäI$I$I$I$AÇAÇ8Ä8äA$A$8ä8ã8Ä8ä8ä8ãAEAEHäHäIEIEI$I$QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEYEYEQEQEQEQEQEQEHäHäIEIEI$I$QEQEQEQEA&A&HäHäbŒbŒAÇAÇ@ä@ä0Ä0ä8ä8ã8Ä8ä8Ä8ä9$9$8ä8ãHäHä8ä8ãHäHã@ä@ãHäHã@ä@ãHäHã@ä@ã@ä@ã@ä@ãHäHã@ä@ãjŠjŠI‡I‡@ä@äHäHäI$I$@ã@äI$I$I$I$I$I$HäHäHäHäI$I$A$A$A$A#QEQEA&A&8Ä8äA$A$8ä8ã8Ä8äI$I$8Ä8äIEIEI$I$QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEHäHäQEQEHäHäIEIEI$I$QEQEQEQEA&A&YÇYÇZJbJ@ä@ä0Ä0ã8Ä8ä(ä(ä8Ä8ä0Ä0ã8ä8ãHäHäAGAGAGAGY†Y†I‡I‡I‡I‡AGAGAGAGA&A&A&A&A&A&YÉYÉc/c/R -R -QEQEIEIEA&A&IEIEQEQEA&A&AGAG@å@åAEAE8Ä8äIEIEA&A&ZJbJRRAGAGAGAGI†I†@å@å@å@åIEIE@å@åIEIEI$I$A&A&HäHäA&A&A&A&@å@åA&A&HäHäA&A&QEQEA&A&QEQEI‡I‡I‡I‡A&A&I‡I‡I‡I‡AGAGYÉYÉZÌZÌR -R -AGAGAGAGAGAGAGAG1†1†AGAGAGAGI‡I‡AGAGAGAGYEYEAGAGI‡I‡YÉYÉA&A&A&A&A&A&A&A&I†I†bŒbŒbŒbŒI†I†A&A&IEIEQEQEA&A&QEQEA&A&IEIE8Ä8ä9E9EA&A&I$I$YÉYÉR‹R‹A†A†AGAGI†I†A&A&8Ä8äQEQEIEIEA&A&I$I$@å@åQEQE8æ8æA&A&@å@å@å@åA&A&HäHäAGAGQEQEA&A&YEYEI‡I‡AGAGI‡I‡I‡I‡AGAGI‡I‡bŒbŒbŒbŒAGAG1†1†AGAGAGAG9†9†0æ0æAGAGAGAGAGAGAGAGY†Y†I‡I‡I‡I‡AGAGAGAGA&A&A&A&A&A&YÉYÉc/c/R -R -QEQEIEIEA&A&IEIEQEQEA&A&AGAG@å@åAEAE8Ä8äIEIEA&A&ZJbJRRAGAGAGAGI†I†@å@å@å@åIEIE@å@åIEIEI$I$A&A&HäHäA&A&A&A&@å@åA&A&HäHäA&A&QEQEA&A&QEQEI‡I‡I‡I‡A&A&I‡I‡I‡I‡AGAGYÉYÉZÌZÌR -R -AGAGAGAGAGAGAGAG1†1†AGAGAGAGI‡I‡AGAGAGAGYEYEAGAGI‡I‡YÉYÉA&A&A&A&A&A&A&A&I†I†bŒbŒbŒbŒI†I†A&A&IEIEQEQEA&A&QEQEA&A&IEIE8Ä8ä9E9EA&A&I$I$YÉYÉR‹R‹A†A†AGAGI†I†A&A&8Ä8äQEQEIEIEA&A&I$I$@å@åQEQE8æ8æA&A&@å@å@å@åA&A&HäHäAGAGQEQEA&A&YEYEI‡I‡AGAGI‡I‡I‡I‡AGAGI‡I‡bŒbŒbŒbŒAGAG1†1†AGAGAGAG9†9†0æ0æAGAGAGAGc,c,{oƒpk/k/{.{.{oƒp{oƒpc.c/bŒbŒZJbJZÌZÌk/k/{.{.{Ï{Ïk/k/s-k-jËjË{.{.ƒÐƒÐ{Ï{Ï{oƒp{oƒpsm{m{pƒo{oƒpsÏ{Ï{.{.{.{.ƒÏƒÏ{.{.k-k-bJZJc,c,bŒbŒbŒbŒk-k-rÎjÍk/k/s/k/jÍjÍs/k/jÍjÍrÎjÍc/c/bŒbŒbŒbŒbŒbŒbŒbŒc/c/{oƒp{oƒp{o{oƒp{oƒp{o{oƒp{oƒp{o{o{Ð{Ðk/k/ƒÐƒÐƒÒƒÑƒÒƒÑƒÒƒÑƒÒƒÑ{Ð{Ð{oƒpc/c/k/k/s/k/jÍjÍbŒbŒc/c/bŒbŒZJbJZÌZÌjÍjÍs/k/{oƒp{.{.k/k/k-s-k.k-ƒo{p{Ï{Ï{oƒp{.{.ƒÐƒÐ{.{.{oƒp{Ï{Ï{.{.{.{.{oƒp{o{p{.{.jŠjŠZÌZÌbŒbŒbŒbŒbŒbŒk/k/s/k/c/c/k/k/s/k/jÍjÍrÎjÍjÍjÍc/c/bŒbŒbŒbŒbŒbŒc/c/k/k/ƒo{pƒo{p{oƒoƒÒƒÒk.k/ƒo{pk/s/ƒÑƒÒ{Ð{Ðk/k/ƒÒƒÑk/k/c/c/c/c/c/c/c,c,{oƒpk/k/{.{.{oƒp{oƒpc.c/bŒbŒZJbJZÌZÌk/k/{.{.{Ï{Ïk/k/s-k-jËjË{.{.ƒÐƒÐ{Ï{Ï{oƒp{oƒpsm{m{pƒo{oƒpsÏ{Ï{.{.{.{.ƒÏƒÏ{.{.k-k-bJZJc,c,bŒbŒbŒbŒk-k-rÎjÍk/k/s/k/jÍjÍs/k/jÍjÍrÎjÍc/c/bŒbŒbŒbŒbŒbŒbŒbŒc/c/{oƒp{oƒp{o{oƒp{oƒp{o{oƒp{oƒp{o{o{Ð{Ðk/k/ƒÐƒÐƒÒƒÑƒÒƒÑƒÒƒÑƒÒƒÑ{Ð{Ð{oƒpc/c/k/k/s/k/jÍjÍbŒbŒc/c/bŒbŒZJbJZÌZÌjÍjÍs/k/{oƒp{.{.k/k/k-s-k.k-ƒo{p{Ï{Ï{oƒp{.{.ƒÐƒÐ{.{.{oƒp{Ï{Ï{.{.{.{.{oƒp{o{p{.{.jŠjŠZÌZÌbŒbŒbŒbŒbŒbŒk/k/s/k/c/c/k/k/s/k/jÍjÍrÎjÍjÍjÍc/c/bŒbŒbŒbŒbŒbŒc/c/k/k/ƒo{pƒo{p{oƒoƒÒƒÒk.k/ƒo{pk/s/ƒÑƒÒ{Ð{Ðk/k/ƒÒƒÑk/k/c/c/c/c/c/c/YÇYÇYEYEaÇaÇaÇaÇZJbJ{.{.QEQEI$I$IEIE8Ä8äIEIE8Ä8äA$A$8Ä8äAEAEQEQE8Ä8äA†A†IEIEIEIEQEQEIEIEIEIEIEIE8Ä8äAEAE8ã8äI†I†QEQE8Ä8ä9E9EA&A&AEAEQEQEjŠjŠ{.{.bŒbŒj‰j‰jŠjŠbŒbŒjŠjŠjËjËrÍjÍjËjËrÍjÍjËjËbŒbŒjËjËrÍjÍbŒbŒjŠjŠZZYÉYÉbbbbZZbIbIjIjIbIbIjIjIbIbIjIjIbIbIbIbIjjbJZJrjbŒbŒZZ@å@åIEIEHäHäQEQEQEQE@å@åA$A$A$A$8Ä8äAEAEAEAEI$I$A$A$IEIEQEQEA†A†QEQEIEIEIEIEA&A&@å@å8ã8äA†A†IEIEAEAEHäHäA$A$9E9EQEQEYÇYÇ{oƒpbŒbŒj‰j‰jŠjŠjŠjŠjËjËbŒbŒjËjËrËjËjÍjÍrËjËjËjËrËjËjÍjÍ”2”2s.{.bbYÇYÇYÇYÇYÉYÉbbbbj‰j‰rIjIbbj‰j‰bIbIjIjIrIjIYÇYÇYEYEaÇaÇaÇaÇZJbJ{.{.QEQEI$I$IEIE8Ä8äIEIE8Ä8äA$A$8Ä8äAEAEQEQE8Ä8äA†A†IEIEIEIEQEQEIEIEIEIEIEIE8Ä8äAEAE8ã8äI†I†QEQE8Ä8ä9E9EA&A&AEAEQEQEjŠjŠ{.{.bŒbŒj‰j‰jŠjŠbŒbŒjŠjŠjËjËrÍjÍjËjËrÍjÍjËjËbŒbŒjËjËrÍjÍbŒbŒjŠjŠZZYÉYÉbbbbZZbIbIjIjIbIbIjIjIbIbIjIjIbIbIbIbIjjbJZJrjbŒbŒZZ@å@åIEIEHäHäQEQEQEQE@å@åA$A$A$A$8Ä8äAEAEAEAEI$I$A$A$IEIEQEQEA†A†QEQEIEIEIEIEA&A&@å@å8ã8äA†A†IEIEAEAEHäHäA$A$9E9EQEQEYÇYÇ{oƒpbŒbŒj‰j‰jŠjŠjŠjŠjËjËbŒbŒjËjËrËjËjÍjÍrËjËjËjËrËjËjÍjÍ”2”2s.{.bbYÇYÇYÇYÇYÉYÉbbbbj‰j‰rIjIbbj‰j‰bIbIjIjIrIjIY†Y†A&A&@ä@äI$I$YÉYÉjÍjÍQEQE@ä@ä@ä@ä8Ä8ä(ä(ä8Ä8ä(ä(ä8ä8ã@å@åIEIEHäHä0Ä0äHäHä0Ä0ä0Ä0ã8Ä8ä8Ä8ä8Ä8äA$A$8Ä8ä8Ä8ä9E9EA&A&8ã8ä8Ä8ä8Ä8ä@å@åQEQEbb{.{.Y†Y†QEQEA&A&QEQEQEQEYEYEI‡I‡Y†Y†aÇaÇI‡I‡Y†Y†a†a†{.{.c,c,A&A&QEQEHäHäQEQEHäHäQEQEYDYDQEQEHäHäYEYEYEYEYEYEYEYEYEYEI‡I‡YEYEYEYEI‡I‡YÉYÉI$I$QEQEA&A&HäHä0Ä0ä0Ä0ã(ä(ä8Ä8ä8Ä8ä8ä8ã@å@åAEAE@ä@ä0Ä0ä8Ä8ä8Ä8ä8Ä8ä(ä(ä8Ä8ä8ä8ã8Ä8ä8ä8ã8Ä8äQEQE8Ä8ä8Ä8ä8Ä8ä8Ä8äQEQEYEYEk/k/bIbIQEQEQEQEQEQEQEQEQEQEI‡I‡YEYEaÇaÇI‡I‡Y†Y†Y†Y†jŠjŠ{oƒpbbQEQE@å@åQEQEI$I$I$I$QEQEYEYEHäHäYEYEYEYEYEYEYEYEQEQEY†Y†A&A&@ä@äI$I$YÉYÉjÍjÍQEQE@ä@ä@ä@ä8Ä8ä(ä(ä8Ä8ä(ä(ä8ä8ã@å@åIEIEHäHä0Ä0äHäHä0Ä0ä0Ä0ã8Ä8ä8Ä8ä8Ä8äA$A$8Ä8ä8Ä8ä9E9EA&A&8ã8ä8Ä8ä8Ä8ä@å@åQEQEbb{.{.Y†Y†QEQEA&A&QEQEQEQEYEYEI‡I‡Y†Y†aÇaÇI‡I‡Y†Y†a†a†{.{.c,c,A&A&QEQEHäHäQEQEHäHäQEQEYDYDQEQEHäHäYEYEYEYEYEYEYEYEYEYEI‡I‡YEYEYEYEI‡I‡YÉYÉI$I$QEQEA&A&HäHä0Ä0ä0Ä0ã(ä(ä8Ä8ä8Ä8ä8ä8ã@å@åAEAE@ä@ä0Ä0ä8Ä8ä8Ä8ä8Ä8ä(ä(ä8Ä8ä8ä8ã8Ä8ä8ä8ã8Ä8äQEQE8Ä8ä8Ä8ä8Ä8ä8Ä8äQEQEYEYEk/k/bIbIQEQEQEQEQEQEQEQEQEQEI‡I‡YEYEaÇaÇI‡I‡Y†Y†Y†Y†jŠjŠ{oƒpbbQEQE@å@åQEQEI$I$I$I$QEQEYEYEHäHäYEYEYEYEYEYEYEYEQEQEY†Y†AGAGI$I$@å@åbbbŒbŒY†Y†8Ä8ä8Ä8ä0Ä0ã(ä(ä(ä(ä8Ä8ä8Ä8ä8Ä8äAEAE0Ä0ä8ä8ã8Ä8ä(ä(ä0Ä0ä8Ä8ä(ä(ä0å0å8Ä8ä0Ä0ãA$A$0å0åAEAEHäHä0Ä0ã9$9$8Ä8äI$I$jjs/k/QÇQÇYEYEAGAGQEQEI‡I‡aÇaÇAGAGY†Y†YÉYÉY†Y†YÉYÉaÇaÇ{,{,jÍjÍAGAGQEQEQEQEA&A&QEQEQEQE@å@åQEQEYEYEQEQEQEQEYEYEI‡I‡YEYEa†a†Y†Y†QEQEAGAGZZHäHäQEQEI$I$I$I$(ä(ä8Ä8ä0Ä0ã(ä(ä(ä(ä8Ä8äIEIE8Ä8ä0Ä0ã8Ä8ä8Ä8ä(ä(ä8Ä8ä(ä(ä8Ä8ä8Ä8ä9$9$8Ä8ä9$9$9E9E@ä@ä8Ä8ä9$9$8Ä8ä@å@åY†Y†k/k/bbYEYEAGAGA&A&YEYEI‡I‡aÇaÇI‡I‡aÇaÇI‡I‡Y†Y†YÉYÉjIjIƒo{pI‡I‡YEYEA&A&QEQEA&A&AGAGQEQEQEQEQEQEYEYEI‡I‡YEYEYEYEI‡I‡Y†Y†AGAGI$I$@å@åbbbŒbŒY†Y†8Ä8ä8Ä8ä0Ä0ã(ä(ä(ä(ä8Ä8ä8Ä8ä8Ä8äAEAE0Ä0ä8ä8ã8Ä8ä(ä(ä0Ä0ä8Ä8ä(ä(ä0å0å8Ä8ä0Ä0ãA$A$0å0åAEAEHäHä0Ä0ã9$9$8Ä8äI$I$jjs/k/QÇQÇYEYEAGAGQEQEI‡I‡aÇaÇAGAGY†Y†YÉYÉY†Y†YÉYÉaÇaÇ{,{,jÍjÍAGAGQEQEQEQEA&A&QEQEQEQE@å@åQEQEYEYEQEQEQEQEYEYEI‡I‡YEYEa†a†Y†Y†QEQEAGAGZZHäHäQEQEI$I$I$I$(ä(ä8Ä8ä0Ä0ã(ä(ä(ä(ä8Ä8äIEIE8Ä8ä0Ä0ã8Ä8ä8Ä8ä(ä(ä8Ä8ä(ä(ä8Ä8ä8Ä8ä9$9$8Ä8ä9$9$9E9E@ä@ä8Ä8ä9$9$8Ä8ä@å@åY†Y†k/k/bbYEYEAGAGA&A&YEYEI‡I‡aÇaÇI‡I‡aÇaÇI‡I‡Y†Y†YÉYÉjIjIƒo{pI‡I‡YEYEA&A&QEQEA&A&AGAGQEQEQEQEQEQEYEYEI‡I‡YEYEYEYEI‡I‡Y†Y†A&A&@å@å8Ä8äZZk/k/YEYE8Ä8ä8Ä8ä(ä(ä(ä(ä0Ä0ã(ä(ä8Ä8ä8Ä8äIEIE8Ä8ä8Ä8ä8Ä8ä8Ä8ä(ä(ä8Ä8ä(ä(ä9$9$8Ä8ä9$9$8Ä8ä9E9E@å@åHäHä(ä(ä8Ä8ä8Ä8äIEIEbbc/c/YÉYÉY†Y†I‡I‡YEYEI‡I‡AGAGY†Y†aÇaÇI‡I‡aÇaÇI‡I‡aÇaÇ{.{.jÍjÍQEQEQEQE@å@å9E9EA&A&AGAGAGAGAGAGQEQEQEQEAGAGQEQEI‡I‡YÉYÉY†Y†YÉYÉYEYEYÉYÉbb@ä@äQEQEHäHä8Ä8ä(ä(ä8Ä8ä(ä(ä(Ä(Ã8Ä8ä8Ä8äA&A&8ã8ä@å@åA$A$0Ä0ä0Ä0ä(ä(ä8Ä8ä1†1†0Ã0ä8Ä8ä9$9$0å0åIEIE8Ä8ä8Ä8ä(ä(ä8Ä8äIEIEQEQEk/k/bJZJY†Y†I‡I‡YEYEAGAGI‡I‡YEYEI‡I‡aÇaÇI‡I‡YÉYÉYEYEjŠjŠƒÒƒÑI‡I‡YEYEA&A&IEIE9E9EAGAGQEQEA&A&I‡I‡YEYEI‡I‡I‡I‡YEYEI‡I‡Y†Y†A&A&@å@å8Ä8äZZk/k/YEYE8Ä8ä8Ä8ä(ä(ä(ä(ä0Ä0ã(ä(ä8Ä8ä8Ä8äIEIE8Ä8ä8Ä8ä8Ä8ä8Ä8ä(ä(ä8Ä8ä(ä(ä9$9$8Ä8ä9$9$8Ä8ä9E9E@å@åHäHä(ä(ä8Ä8ä8Ä8äIEIEbbc/c/YÉYÉY†Y†I‡I‡YEYEI‡I‡AGAGY†Y†aÇaÇI‡I‡aÇaÇI‡I‡aÇaÇ{.{.jÍjÍQEQEQEQE@å@å9E9EA&A&AGAGAGAGAGAGQEQEQEQEAGAGQEQEI‡I‡YÉYÉY†Y†YÉYÉYEYEYÉYÉbb@ä@äQEQEHäHä8Ä8ä(ä(ä8Ä8ä(ä(ä(Ä(Ã8Ä8ä8Ä8äA&A&8ã8ä@å@åA$A$0Ä0ä0Ä0ä(ä(ä8Ä8ä1†1†0Ã0ä8Ä8ä9$9$0å0åIEIE8Ä8ä8Ä8ä(ä(ä8Ä8äIEIEQEQEk/k/bJZJY†Y†I‡I‡YEYEAGAGI‡I‡YEYEI‡I‡aÇaÇI‡I‡YÉYÉYEYEjŠjŠƒÒƒÑI‡I‡YEYEA&A&IEIE9E9EAGAGQEQEA&A&I‡I‡YEYEI‡I‡I‡I‡YEYEI‡I‡QÇQÇY†Y†@å@å9E9Ejjc/c/YEYE8Ä8ä8Ä8ä(ä(ä(ä(ä(ä(ä8Ä8ä0Ä0ã8Ä8ä8Ä8ä9$9$8Ä8ä9$9$(ä(ä8Ä8ä(ä(ä8Ä8ä1$1$8Ä8ä0å0å8Ä8äA$A$IEIE8Ä8ä8Ä8ä8Ä8äA$A$A&A&YÇYÇjÍjÍqÇiÇI‡I‡aÇaÇI‡I‡AGAGYEYEI‡I‡I‡I‡aÇaÇI‡I‡I‡I‡a†a†jÍjÍbŒbŒA$A$0æ0æ!$!$(ä(ä å å0æ0æ9$9$0å0åA&A&AGAGYEYEAGAGYEYEI‡I‡YÉYÉI‡I‡AGAGZZZJbJHäHäI$I$@å@å@ä@ä0Ä0ã(ä(ä(ä(ä(ä(ä8Ä8ä(ä(ä@å@å8ã8ä8Ä8ä8Ä8ä8Ä8ä(ä(ä0Ä0ã8Ä8ä(ä(ä8Ä8ä8Ä8ä8Ä8ä8Ä8äIEIE8Ä8äA$A$8Ä8ä8Ä8ä9E9EQEQEjÍjÍbbjjI‡I‡I‡I‡YEYEI‡I‡AGAGaÇaÇI‡I‡I‡I‡Y†Y†YÉYÉjjƒo{pAFAG9E9E å å(å(å(ä(ä(å(å0æ0æ9E9E0å0åAGAGbbA&A&AGAGZZQÇQÇY†Y†@å@å9E9Ejjc/c/YEYE8Ä8ä8Ä8ä(ä(ä(ä(ä(ä(ä8Ä8ä0Ä0ã8Ä8ä8Ä8ä9$9$8Ä8ä9$9$(ä(ä8Ä8ä(ä(ä8Ä8ä1$1$8Ä8ä0å0å8Ä8äA$A$IEIE8Ä8ä8Ä8ä8Ä8äA$A$A&A&YÇYÇjÍjÍqÇiÇI‡I‡aÇaÇI‡I‡AGAGYEYEI‡I‡I‡I‡aÇaÇI‡I‡I‡I‡a†a†jÍjÍbŒbŒA$A$0æ0æ!$!$(ä(ä å å0æ0æ9$9$0å0åA&A&AGAGYEYEAGAGYEYEI‡I‡YÉYÉI‡I‡AGAGZZZJbJHäHäI$I$@å@å@ä@ä0Ä0ã(ä(ä(ä(ä(ä(ä8Ä8ä(ä(ä@å@å8ã8ä8Ä8ä8Ä8ä8Ä8ä(ä(ä0Ä0ã8Ä8ä(ä(ä8Ä8ä8Ä8ä8Ä8ä8Ä8äIEIE8Ä8äA$A$8Ä8ä8Ä8ä9E9EQEQEjÍjÍbbjjI‡I‡I‡I‡YEYEI‡I‡AGAGaÇaÇI‡I‡I‡I‡Y†Y†YÉYÉjjƒo{pAFAG9E9E å å(å(å(ä(ä(å(å0æ0æ9E9E0å0åAGAGbbA&A&AGAGZZQÇQÇI‡I‡A&A&HãHäbbc/c/YEYE@ä@ä@ä@ä0Ä0ã(ä(ä(Ä(Ã0Ä0ä0Ä0ä8ä8ã@å@å0Ã0ä8ã8ä8Ä8ä8ä8ã8Ä8ä8ä8ã8Ä8ä8Ä8äA$A$8ä8ã0Ä0ä8ä8ã@å@åHäHä0Ä0ã8ä8ã8ä8ãI$I$YÉYÉbŒbŒaÇaÇbbI‡I‡I‡I‡aÇaÇI‡I‡I‡I‡YÉYÉaÇaÇI‡I‡YÉYÉY†Y†jŠjŠR -R -(ä(ä9E9E8æ8æ å å å å!$!$(å(å!$!$(ä(ä8Ä8äA&A&A†A†AGAGY†Y†I†I†I‡I‡YÇYÇbbR -R -0Ä0äHäHä8Ä8à ä ã(Ä(Ã0Ä0ã(Ä(Ä(Ä(Ã@ä@ä0Ä0ä8ä8ãHäHä1$1$8ä8ã0Ä0ã8Ä8ä8ä8ã8Ä8ä8ä8ã@å@åA$A$0Ä0ã0Ä0ã@å@åI$I$0Ã0ä0Ã0ä8ã8äI$I$QEQEbŒbŒbIbIYÉYÉiÇiÇI‡I‡I‡I‡I‡I‡YÉYÉI‡I‡aÇaÇI‡I‡YÉYÉaÇaÇbb{oƒp0æ0æ0å0å0æ0æ(å(å å å å å!$!$ å å ä ä0Ä0äA†A†8Ä8ä8Ä8äAGAGQÇQÇI‡I‡A&A&HãHäbbc/c/YEYE@ä@ä@ä@ä0Ä0ã(ä(ä(Ä(Ã0Ä0ä0Ä0ä8ä8ã@å@å0Ã0ä8ã8ä8Ä8ä8ä8ã8Ä8ä8ä8ã8Ä8ä8Ä8äA$A$8ä8ã0Ä0ä8ä8ã@å@åHäHä0Ä0ã8ä8ã8ä8ãI$I$YÉYÉbŒbŒaÇaÇbbI‡I‡I‡I‡aÇaÇI‡I‡I‡I‡YÉYÉaÇaÇI‡I‡YÉYÉY†Y†jŠjŠR -R -(ä(ä9E9E8æ8æ å å å å!$!$(å(å!$!$(ä(ä8Ä8äA&A&A†A†AGAGY†Y†I†I†I‡I‡YÇYÇbbR -R -0Ä0äHäHä8Ä8à ä ã(Ä(Ã0Ä0ã(Ä(Ä(Ä(Ã@ä@ä0Ä0ä8ä8ãHäHä1$1$8ä8ã0Ä0ã8Ä8ä8ä8ã8Ä8ä8ä8ã@å@åA$A$0Ä0ã0Ä0ã@å@åI$I$0Ã0ä0Ã0ä8ã8äI$I$QEQEbŒbŒbIbIYÉYÉiÇiÇI‡I‡I‡I‡I‡I‡YÉYÉI‡I‡aÇaÇI‡I‡YÉYÉaÇaÇbb{oƒp0æ0æ0å0å0æ0æ(å(å å å å å!$!$ å å ä ä0Ä0äA†A†8Ä8ä8Ä8äAGAGQÇQÇI‡I‡AGAGI‡I‡ZJbJc/c/ZJbJI‡I‡AGAGAGAG0æ0æ9E9E8æ8æ9E9E(ä(ä8Ä8ä(ä(ä(ä(ä1†1†0å0å9E9E0æ0æ9$9$9†9†AGAG0æ0æ0æ0æI‡I‡AGAGAÇAÇAGAGI‡I‡JJI‡I‡bŒbŒbŒbŒJJI‡I‡I†I†I‡I‡AGAGQÇQÇAGAGAGAGAGAGI†I†A&A&AGAG{oƒp{.{.0æ0æ9†9†AGAGI†I†AGAGAGAGAGAGAGAGQEQEI†I†ZZbbI‡I‡R -R -bJZJbbZJbJk/k/ƒo{pR -R -JJBBI‡I‡0æ0æAGAG0æ0æ0æ0æ9E9E(å(å8Ä8ä(ä(ä(ä(ä(ä(ä9E9E0å0å0å0å9E9E0æ0æAGAGA†A†8æ8æ9†9†AGAGAGAGAÇAÇAGAGR -R -I‡I‡R -R -ZÌZÌR -R -AGAGAGAGQÇQÇI‡I‡I‡I‡YEYEI‡I‡I‡I‡I‡I‡A&A&A&A&bbƒÒƒÑAÇAÇ9E9EAÇAÇI‡I‡AGAGQEQEA&A&AGAGY†Y†AGAGI†I†I‡I‡AÇAÇI‡I‡QÇQÇI‡I‡AGAGI‡I‡ZJbJc/c/ZJbJI‡I‡AGAGAGAG0æ0æ9E9E8æ8æ9E9E(ä(ä8Ä8ä(ä(ä(ä(ä1†1†0å0å9E9E0æ0æ9$9$9†9†AGAG0æ0æ0æ0æI‡I‡AGAGAÇAÇAGAGI‡I‡JJI‡I‡bŒbŒbŒbŒJJI‡I‡I†I†I‡I‡AGAGQÇQÇAGAGAGAGAGAGI†I†A&A&AGAG{oƒp{.{.0æ0æ9†9†AGAGI†I†AGAGAGAGAGAGAGAGQEQEI†I†ZZbbI‡I‡R -R -bJZJbbZJbJk/k/ƒo{pR -R -JJBBI‡I‡0æ0æAGAG0æ0æ0æ0æ9E9E(å(å8Ä8ä(ä(ä(ä(ä(ä(ä9E9E0å0å0å0å9E9E0æ0æAGAGA†A†8æ8æ9†9†AGAGAGAGAÇAÇAGAGR -R -I‡I‡R -R -ZÌZÌR -R -AGAGAGAGQÇQÇI‡I‡I‡I‡YEYEI‡I‡I‡I‡I‡I‡A&A&A&A&bbƒÒƒÑAÇAÇ9E9EAÇAÇI‡I‡AGAGQEQEA&A&AGAGY†Y†AGAGI†I†I‡I‡AÇAÇI‡I‡{,{,{,{,jÍjÍjŠjŠjÍjÍ{,{,bŒbŒbbZÌZÌZJbJZJbJR -R -ZIZIZJbJZJbJk/k/ZÌZÌZJbJZJbJbbZJbJRŠRŠbŒbŒjŠjŠZJbJbŒbŒc,c,jËjËs/k/{oƒpk-k-c,c,jÍjÍbŒbŒc,c,jËjËc,c,ZJbJZJbJRRZJbJZJbJZJbJR‹R‹bŒbŒbŒbŒbŒbŒjËjË{.{.{Ï{Ï{.{.{.{.{.{.{,{,{,{,{,{,{oƒp‹Ï“Ï{oƒp{o{oƒp{o“ЋЃЃÐk-k-ƒp{o{,{,jÍjÍ{,{,{,{,{.{.jÍjÍR -R -bJZJbŒbŒRŠRŠbIbIZIZIR‹R‹ZJbJk.k-ZÌZÌbŒbŒZJbJbbbŒbŒZJbJZJbJRŠRŠjŠjŠZJbJZÌZÌk-k-s.k-k/k/ƒo{pc,c,bŒbŒk-k-bŒbŒjËjËs-k-jŠjŠR‹R‹YÉYÉR -R -R‹R‹ZJbJZJbJZJbJZJbJZÌZÌbŒbŒk/k/ƒo{p{Ï{Ï{.{.k/k/{,{,jËjË{.{.{oƒp{oƒp{o{oƒp{oƒp{o“Ï‹Ï{oƒp{.{.{,{,{,{,jÍjÍjŠjŠjÍjÍ{,{,bŒbŒbbZÌZÌZJbJZJbJR -R -ZIZIZJbJZJbJk/k/ZÌZÌZJbJZJbJbbZJbJRŠRŠbŒbŒjŠjŠZJbJbŒbŒc,c,jËjËs/k/{oƒpk-k-c,c,jÍjÍbŒbŒc,c,jËjËc,c,ZJbJZJbJRRZJbJZJbJZJbJR‹R‹bŒbŒbŒbŒbŒbŒjËjË{.{.{Ï{Ï{.{.{.{.{.{.{,{,{,{,{,{,{oƒp‹Ï“Ï{oƒp{o{oƒp{o“ЋЃЃÐk-k-ƒp{o{,{,jÍjÍ{,{,{,{,{.{.jÍjÍR -R -bJZJbŒbŒRŠRŠbIbIZIZIR‹R‹ZJbJk.k-ZÌZÌbŒbŒZJbJbbbŒbŒZJbJZJbJRŠRŠjŠjŠZJbJZÌZÌk-k-s.k-k/k/ƒo{pc,c,bŒbŒk-k-bŒbŒjËjËs-k-jŠjŠR‹R‹YÉYÉR -R -R‹R‹ZJbJZJbJZJbJZJbJZÌZÌbŒbŒk/k/ƒo{p{Ï{Ï{.{.k/k/{,{,jËjË{.{.{oƒp{oƒp{o{oƒp{oƒp{o“Ï‹Ï{oƒp{.{.8Ä8äA&A&HäHäQEQEHäHäQEQE@å@å8Ä8äAEAE@å@åAEAEHäHäAEAEQEQEbbR‹R‹QEQEY†Y†QEQEYEYEYEYEQEQEQEQEQEQEAEAEIEIEQEQEAEAEI‡I‡bŒbŒbbAGAGQEQEI†I†AGAGI$I$A&A&I$I$A&A&IEIE@å@åA†A†AGAGQEQEY†Y†I‡I‡QÇQÇY†Y†I‡I‡QÇQÇI†I†YÇYÇI‡I‡I‡I‡QÇQÇYÇYÇaÇaÇYÉYÉZJbJQÇQÇYEYEQÇQÇQEQEAGAGQEQEHäHäYEYEI$I$QEQEQEQEA&A&HäHä8Ä8äAEAE@å@åAEAE@å@åQEQEY†Y†bŒbŒQÇQÇIEIEYEYEQEQEQEQEYEYEQEQEYEYEIEIEIEIEIEIEIEIEQEQER‹R‹bIbII‡I‡YEYEI†I†AGAGI$I$A&A&QEQEA&A&AEAEAEAEIEIEA&A&I†I†AGAGQÇQÇY†Y†QÇQÇI‡I‡I†I†Y†Y†I‡I‡I‡I‡I‡I‡QÇQÇYÇYÇaÇaÇI‡I‡bŒbŒaÇaÇQEQEIEIE8Ä8ä9$9$8ä8ÄA&A&HäHäQEQEHäHäQEQE@å@å8Ä8äAEAE@å@åAEAEHäHäAEAEQEQEbbR‹R‹QEQEY†Y†QEQEYEYEYEYEQEQEQEQEQEQEAEAEIEIEQEQEAEAEI‡I‡bŒbŒbbAGAGQEQEI†I†AGAGI$I$A&A&I$I$A&A&IEIE@å@åA†A†AGAGQEQEY†Y†I‡I‡QÇQÇY†Y†I‡I‡QÇQÇI†I†YÇYÇI‡I‡I‡I‡QÇQÇYÇYÇaÇaÇYÉYÉZJbJQÇQÇYEYEQÇQÇQEQEAGAGQEQEHäHäYEYEI$I$QEQEQEQEA&A&HäHä8Ä8äAEAE@å@åAEAE@å@åQEQEY†Y†bŒbŒQÇQÇIEIEYEYEQEQEQEQEYEYEQEQEYEYEIEIEIEIEIEIEIEIEQEQER‹R‹bIbII‡I‡YEYEI†I†AGAGI$I$A&A&QEQEA&A&AEAEAEAEIEIEA&A&I†I†AGAGQÇQÇY†Y†QÇQÇI‡I‡I†I†Y†Y†I‡I‡I‡I‡I‡I‡QÇQÇYÇYÇaÇaÇI‡I‡bŒbŒaÇaÇQEQEIEIE8Ä8ä9$9$8Ä8ä9E9EA&A&@å@åAEAE@å@å8Ä8äAEAE8Ä8ä8Ä8ä9E9E8Ä8äQEQEA&A&jjrÍjÍI‡I‡YEYEYEYEY†Y†I‡I‡YEYEa†a†YÇYÇI†I†I‡I‡Y†Y†AGAGAÇAÇk-k-YÇYÇAGAGAGAG@å@åQEQE@å@åIEIEA&A&@å@å9E9E@å@åA&A&IEIEIEIEA&A&QEQEA&A&AGAGQEQE@å@åA&A&9E9EIEIEA&A&A&A&AGAGYEYEaÇaÇYÉYÉQEQEY†Y†A&A&AGAGQEQEQEQEQEQE@å@å@å@åA&A&@ä@ä8Ä8ä@å@å9$9$0å0å8Ä8äIEIE8Ä8äI†I†Y†Y†jÍjÍZZYEYEa†a†YEYEY†Y†Y†Y†Y†Y†YÇYÇY†Y†AGAGQÇQÇI†I†A&A&ZÌZÌjIjII‡I‡AGAG@å@åIEIEA&A&A&A&@å@åAEAE@å@å8Ä8äIEIEA&A&A&A&QEQEA&A&QEQEA&A&AGAGQEQEA&A&0å0å8Ä8ä9E9EA&A&A&A&YEYEY†Y†bbI‡I‡YEYE@å@å0å0å8Ä8ä8ä8Ä9E9EA&A&@å@åAEAE@å@å8Ä8äAEAE8Ä8ä8Ä8ä9E9E8Ä8äQEQEA&A&jjrÍjÍI‡I‡YEYEYEYEY†Y†I‡I‡YEYEa†a†YÇYÇI†I†I‡I‡Y†Y†AGAGAÇAÇk-k-YÇYÇAGAGAGAG@å@åQEQE@å@åIEIEA&A&@å@å9E9E@å@åA&A&IEIEIEIEA&A&QEQEA&A&AGAGQEQE@å@åA&A&9E9EIEIEA&A&A&A&AGAGYEYEaÇaÇYÉYÉQEQEY†Y†A&A&AGAGQEQEQEQEQEQE@å@å@å@åA&A&@ä@ä8Ä8ä@å@å9$9$0å0å8Ä8äIEIE8Ä8äI†I†Y†Y†jÍjÍZZYEYEa†a†YEYEY†Y†Y†Y†Y†Y†YÇYÇY†Y†AGAGQÇQÇI†I†A&A&ZÌZÌjIjII‡I‡AGAG@å@åIEIEA&A&A&A&@å@åAEAE@å@å8Ä8äIEIEA&A&A&A&QEQEA&A&QEQEA&A&AGAGQEQEA&A&0å0å8Ä8ä9E9EA&A&A&A&YEYEY†Y†bbI‡I‡YEYE@å@å0å0å8Ä8ä8Ä8ä8Ä8äA$A$@å@å9$9$@å@å(ä(ä9E9E@å@å8Ä8ä9E9EA&A&A&A&QEQEZJbJZJbJAEAEYEYEa†a†Y†Y†a†a†a†a†aÇaÇaÇaÇI‡I‡Y†Y†AÇAÇAGAGAÇAÇbŒbŒZZQEQEA&A&IEIE@å@å9E9E@å@å9E9E@å@å9E9EA&A&9E9EA&A&QEQEA&A&IEIEA&A&AGAGQEQE@å@åA†A†A&A&A&A&A&A&IEIEA&A&YEYEYÉYÉI‡I‡Y†Y†YEYEI‡I‡QEQEAGAGQEQEA&A&A&A&8Ä8ä8Ä8äIEIE(ä(ä0å0åIEIE8Ä8ä9E9E@å@åIEIEA&A&aÇaÇbŒbŒAGAGQEQEa†a†Y†Y†Y†Y†a†a†a†a†aÇaÇI‡I‡QÇQÇI†I†I‡I‡A†A†ZJbJZJbJAGAGQEQEA&A&IEIE@å@åA$A$9E9EA&A&8Ä8äA&A&9E9EA&A&QEQEA&A&QEQEA&A&QEQEA&A&IEIEA&A&A&A&9$9$A&A&A&A&QEQEAGAGYEYEbbI‡I‡YEYEAGAGIEIE@å@å8ä8Ä8ä8ÄA$A$@å@å9$9$@å@å(ä(ä9E9E@å@å8Ä8ä9E9EA&A&A&A&QEQEZJbJZJbJAEAEYEYEa†a†Y†Y†a†a†a†a†aÇaÇaÇaÇI‡I‡Y†Y†AÇAÇAGAGAÇAÇbŒbŒZZQEQEA&A&IEIE@å@å9E9E@å@å9E9E@å@å9E9EA&A&9E9EA&A&QEQEA&A&IEIEA&A&AGAGQEQE@å@åA†A†A&A&A&A&A&A&IEIEA&A&YEYEYÉYÉI‡I‡Y†Y†YEYEI‡I‡QEQEAGAGQEQEA&A&A&A&8Ä8ä8Ä8äIEIE(ä(ä0å0åIEIE8Ä8ä9E9E@å@åIEIEA&A&aÇaÇbŒbŒAGAGQEQEa†a†Y†Y†Y†Y†a†a†a†a†aÇaÇI‡I‡QÇQÇI†I†I‡I‡A†A†ZJbJZJbJAGAGQEQEA&A&IEIE@å@åA$A$9E9EA&A&8Ä8äA&A&9E9EA&A&QEQEA&A&QEQEA&A&QEQEA&A&IEIEA&A&A&A&9$9$A&A&A&A&QEQEAGAGYEYEbbI‡I‡YEYEAGAGIEIE@å@å8Ä8ä9$9$0æ0æ8Ä8ä9E9E8Ä8ä8Ä8ä9E9E0å0å9E9E8å8å@å@å8Ä8äIEIEbbZÌZÌ@å@åY…Y…a†a†Y†Y†a†a†aÇaÇa†a†aÇaÇaÇaÇAGAGI‡I‡9†9†YÉYÉbŒbŒQÇQÇAGAGQEQE@å@åA&A&9E9E@å@å@å@å9E9EA&A&8Ä8äIEIEA&A&A&A&IEIEA&A&IEIEA&A&AGAGA&A&8Ä8äAGAGAEAEA&A&A&A&QEQEA&A&a†a†ZJbJAGAGQEQEA&A&QEQEAGAGA&A&QEQE8å8åA&A&8Ä8ä0å0å8Ä8ä8Ä8ä9E9E@å@å0å0å9E9E@å@å@å@åAGAGk-k-AGAGQ…Q…a†a†YEYEaÇaÇa†a†aÇaÇaÇaÇa†a†I‡I‡QÇQÇA&A&AÇAÇbŒbŒbbAGAGA&A&A&A&A&A&AEAE@å@å@å@å9E9E@å@å9E9EA&A&A&A&QEQEA&A&IEIEA&A&A&A&I†I†A&A&@å@å9E9E(ä(äA&A&AGAGA&A&QEQEYEYER -R -I‡I‡YEYEA&A&8Ä8ä8Ä8ä8ä8Ä9$9$0æ0æ8Ä8ä9E9E8Ä8ä8Ä8ä9E9E0å0å9E9E8å8å@å@å8Ä8äIEIEbbZÌZÌ@å@åY…Y…a†a†Y†Y†a†a†aÇaÇa†a†aÇaÇaÇaÇAGAGI‡I‡9†9†YÉYÉbŒbŒQÇQÇAGAGQEQE@å@åA&A&9E9E@å@å@å@å9E9EA&A&8Ä8äIEIEA&A&A&A&IEIEA&A&IEIEA&A&AGAGA&A&8Ä8äAGAGAEAEA&A&A&A&QEQEA&A&a†a†ZJbJAGAGQEQEA&A&QEQEAGAGA&A&QEQE8å8åA&A&8Ä8ä0å0å8Ä8ä8Ä8ä9E9E@å@å0å0å9E9E@å@å@å@åAGAGk-k-AGAGQ…Q…a†a†YEYEaÇaÇa†a†aÇaÇaÇaÇa†a†I‡I‡QÇQÇA&A&AÇAÇbŒbŒbbAGAGA&A&A&A&A&A&AEAE@å@å@å@å9E9E@å@å9E9EA&A&A&A&QEQEA&A&IEIEA&A&A&A&I†I†A&A&@å@å9E9E(ä(äA&A&AGAGA&A&QEQEYEYER -R -I‡I‡YEYEA&A&8Ä8ä8Ä8ä8Ä8ä(ä(äA$A$0å0å8Ä8ä9E9E8Ä8ä8Ä8ä0å0å@å@å9E9E8Ä8äIEIEA&A&JJbŒbŒYÇYÇa†a†jjrjzzzzzzzzjjAGAGQÇQÇA&A&JJZJbJAGAGQEQEA&A&9E9EIEIE8å8å@å@å9E9E8å8åA&A&IEIE@å@å9E9EA&A&QEQEA&A&A&A&AGAG@å@åAEAEIEIE@å@å9E9E@å@åIEIEA&A&YEYEaÇaÇR -R -YEYEI‡I‡A&A&QEQEAGAGQEQE@å@å@ä@ä8Ä8ä8Ä8ä9E9E8Ä8ä9E9E0å0å8Ä8ä9E9E8å8å8Ä8äIEIEAGAGbŒbŒZZaÇaÇiÇiÇrjzzzzzzzzjjI‡I‡AGAGI†I†AGAGbŒbŒI‡I‡I†I†AGAGIEIE@å@å@å@å9E9E0å0åA&A&8Ä8äIEIE9E9EA&A&A&A&IEIEA&A&IEIEA&A&A&A&IEIE0å0å@å@å8Ä8ä9E9EA&A&QEQEA&A&a†a†ZJbJYÉYÉQEQE@å@å8Ä8äA$A$8ä8Ä(ä(äA$A$0å0å8Ä8ä9E9E8Ä8ä8Ä8ä0å0å@å@å9E9E8Ä8äIEIEA&A&JJbŒbŒYÇYÇa†a†jjrjzzzzzzzzjjAGAGQÇQÇA&A&JJZJbJAGAGQEQEA&A&9E9EIEIE8å8å@å@å9E9E8å8åA&A&IEIE@å@å9E9EA&A&QEQEA&A&A&A&AGAG@å@åAEAEIEIE@å@å9E9E@å@åIEIEA&A&YEYEaÇaÇR -R -YEYEI‡I‡A&A&QEQEAGAGQEQE@å@å@ä@ä8Ä8ä8Ä8ä9E9E8Ä8ä9E9E0å0å8Ä8ä9E9E8å8å8Ä8äIEIEAGAGbŒbŒZZaÇaÇiÇiÇrjzzzzzzzzjjI‡I‡AGAGI†I†AGAGbŒbŒI‡I‡I†I†AGAGIEIE@å@å@å@å9E9E0å0åA&A&8Ä8äIEIE9E9EA&A&A&A&IEIEA&A&IEIEA&A&A&A&IEIE0å0å@å@å8Ä8ä9E9EA&A&QEQEA&A&a†a†ZJbJYÉYÉQEQE@å@å8Ä8äA$A$8Ä8äA$A$8Ä8ä8Ä8äA$A$8Ä8ä0Ä0ä1$1$8Ä8ä8Ä8äA$A$9E9EA&A&QEQEYÉYÉbŒbŒAÇAÇY†Y†A&A&AGAGYÉYÉjjI‡I‡Y†Y†I‡I‡8Ä8ä0æ0æ9E9EJJR -R -QEQEA&A&IEIE@å@å@å@å9E9E0å0å@å@å8Ä8äA$A$0å0åIEIEA&A&I$I$A&A&QEQEA&A&IEIEA&A&8Ä8äIEIE@å@å0å0åIEIEA&A&QEQEQEQEYÉYÉjËjËAGAGQEQEQEQEA&A&QEQEA&A&QEQEA&A&@å@å8ã8äAEAE0Ä0ä0Ä0ä0Ä0ã9E9E8Ä8äA&A&AEAEQEQEAGAGbŒbŒYÉYÉAÇAÇQEQEA&A&YÉYÉYÉYÉYÉYÉY†Y†I‡I‡QEQE(ä(ä9E9EAGAGR‹R‹I†I†A&A&QEQE8Ä8äIEIE0å0å8Ä8ä@å@åA$A$9E9E@å@å@å@å9E9EI$I$A&A&QEQEA&A&QEQEA&A&8Ä8ä@å@åA$A$9E9EA&A&IEIEA&A&QEQEYEYEZJbJYÉYÉQEQEQEQE8Ä8ä8Ä8ä8ä8ÄA$A$8Ä8ä8Ä8äA$A$8Ä8ä0Ä0ä1$1$8Ä8ä8Ä8äA$A$9E9EA&A&QEQEYÉYÉbŒbŒAÇAÇY†Y†A&A&AGAGYÉYÉjjI‡I‡Y†Y†I‡I‡8Ä8ä0æ0æ9E9EJJR -R -QEQEA&A&IEIE@å@å@å@å9E9E0å0å@å@å8Ä8äA$A$0å0åIEIEA&A&I$I$A&A&QEQEA&A&IEIEA&A&8Ä8äIEIE@å@å0å0åIEIEA&A&QEQEQEQEYÉYÉjËjËAGAGQEQEQEQEA&A&QEQEA&A&QEQEA&A&@å@å8ã8äAEAE0Ä0ä0Ä0ä0Ä0ã9E9E8Ä8äA&A&AEAEQEQEAGAGbŒbŒYÉYÉAÇAÇQEQEA&A&YÉYÉYÉYÉYÉYÉY†Y†I‡I‡QEQE(ä(ä9E9EAGAGR‹R‹I†I†A&A&QEQE8Ä8äIEIE0å0å8Ä8ä@å@åA$A$9E9E@å@å@å@å9E9EI$I$A&A&QEQEA&A&QEQEA&A&8Ä8ä@å@åA$A$9E9EA&A&IEIEA&A&QEQEYEYEZJbJYÉYÉQEQEQEQE8Ä8ä8Ä8äAÇAÇAGAGI‡I‡BB0æ0æAÇAÇAGAGAÇAÇAÇAÇAÇAÇAGAGAGAGAGAGI‡I‡R‹R‹ZJbJ å å å å!$!$ Ä Ä ÄÄ0æ0æAGAG å åAGAGR‹R‹R -R -R -R -R‹R‹bŒbŒAÇAÇAGAGAGAGAÇAÇAGAGAGAG8æ8æ9E9E8æ8æ0æ0æAGAGAÇAÇAGAGAGAGAGAGAGAGAGAGA&A&I†I†A&A&AGAGA&A&A&A&AGAGI‡I‡YÉYÉI‡I‡jjs/k/ZJbJYÉYÉR -R -YÉYÉYÉYÉYÉYÉYÉYÉI‡I‡A&A&A&A&0æ0æ9†9†9E9EA&A&0æ0æAGAGA†A†AGAGAGAGZJbJk/k/JJ ä ä ÄÄ ä ä ÄÄ(ä(ä0æ0æ0æ0æ1†1†BBbŒbŒR -R -R -R -s-k-BBI‡I‡AGAGAGAGAGAGAGAG9†9†8æ8æ0æ0æ0æ0æA†A†AGAGAGAGAGAGAGAGAGAGAGAGA&A&AGAGA&A&A&A&A†A†8æ8æA†A†I‡I‡YÉYÉI‡I‡YÉYÉjËjËrÍjÍR -R -YÉYÉR -R -YÉYÉAÇAÇAGAGI‡I‡BB0æ0æAÇAÇAGAGAÇAÇAÇAÇAÇAÇAGAGAGAGAGAGI‡I‡R‹R‹ZJbJ å å å å!$!$ Ä Ä ÄÄ0æ0æAGAG å åAGAGR‹R‹R -R -R -R -R‹R‹bŒbŒAÇAÇAGAGAGAGAÇAÇAGAGAGAG8æ8æ9E9E8æ8æ0æ0æAGAGAÇAÇAGAGAGAGAGAGAGAGAGAGA&A&I†I†A&A&AGAGA&A&A&A&AGAGI‡I‡YÉYÉI‡I‡jjs/k/ZJbJYÉYÉR -R -YÉYÉYÉYÉYÉYÉYÉYÉI‡I‡A&A&A&A&0æ0æ9†9†9E9EA&A&0æ0æAGAGA†A†AGAGAGAGZJbJk/k/JJ ä ä ÄÄ ä ä ÄÄ(ä(ä0æ0æ0æ0æ1†1†BBbŒbŒR -R -R -R -s-k-BBI‡I‡AGAGAGAGAGAGAGAG9†9†8æ8æ0æ0æ0æ0æA†A†AGAGAGAGAGAGAGAGAGAGAGAGA&A&AGAGA&A&A&A&A†A†8æ8æA†A†I‡I‡YÉYÉI‡I‡YÉYÉjËjËrÍjÍR -R -YÉYÉR -R -YÉYÉk/k/rËjËk/k/rËjËbŒbŒƒÏƒÏk/k/bIbIbŒbŒZIZIR -R -R‹R‹ZJbJRŠRŠjÍjÍrËjËZJbJZJbJZJbJR -R -bJZJc,c,bŒbŒc/c/{.{.{Ï{Ïk-k-rËjË{.{.jËjËs/k/k-k-s.k-k-k-c,c,{oƒp{Ð{Ðk-k-c,c,k/k/c,c,{oƒpk/k/k/s/k-k-k-s.k-k-c,c,jÍjÍ{.{.“ЋÐ{Ð{Ðk/k/ƒo{pƒo{p{.{.{oƒp{.{.{.{.{,{,{.{.{.{.{.{.{,{,jÍjÍ{.{.jÍjÍ{,{,{Ð{ÐjŠjŠYÉYÉZJbJZIZIR‹R‹bbR‹R‹ZJbJZJbJc,c,jŠjŠbŒbŒbbbŒbŒR -R -R‹R‹bŒbŒjËjËs/k/k-k-ƒp{o{,{,jÍjÍs.k-jËjË{,{,k/k/s-k-k.k-s-k-k/k/ƒÒƒÑk,k,s/k/{,{,ZÌZÌk/k/{Ð{Ðk/k/s-k-k.k-s-k-k.k-bŒbŒk,k,“ГЃ҃Ñk-k-s/k/ƒÐƒÐ{.{.{oƒp{.{.{.{.{,{,{.{.{,{,k/k/{,{,k/s/jËjËk/s/jËjËbŒbŒƒÏƒÏk/k/bIbIbŒbŒZIZIR -R -R‹R‹ZJbJRŠRŠjÍjÍrËjËZJbJZJbJZJbJR -R -bJZJc,c,bŒbŒc/c/{.{.{Ï{Ïk-k-rËjË{.{.jËjËs/k/k-k-s.k-k-k-c,c,{oƒp{Ð{Ðk-k-c,c,k/k/c,c,{oƒpk/k/k/s/k-k-k-s.k-k-c,c,jÍjÍ{.{.“ЋÐ{Ð{Ðk/k/ƒo{pƒo{p{.{.{oƒp{.{.{.{.{,{,{.{.{.{.{.{.{,{,jÍjÍ{.{.jÍjÍ{,{,{Ð{ÐjŠjŠYÉYÉZJbJZIZIR‹R‹bbR‹R‹ZJbJZJbJc,c,jŠjŠbŒbŒbbbŒbŒR -R -R‹R‹bŒbŒjËjËs/k/k-k-ƒp{o{,{,jÍjÍs.k-jËjË{,{,k/k/s-k-k.k-s-k-k/k/ƒÒƒÑk,k,s/k/{,{,ZÌZÌk/k/{Ð{Ðk/k/s-k-k.k-s-k-k.k-bŒbŒk,k,“ГЃ҃Ñk-k-s/k/ƒÐƒÐ{.{.{oƒp{.{.{.{.{,{,{.{.{,{,k/k/{,{,QEQEY†Y†QEQEYEYEY†Y†ƒÐƒÐRŠRŠ@å@åIEIEI$I$@å@å@å@åAEAEQEQEQEQEIEIEA&A&AGAGI†I†I†I†AGAGI†I†AGAGQEQEQÇQÇQEQEA&A&I$I$IEIEIEIEIEIEAEAEQEQEYEYEQEQEjËj˃҃ÑYÉYÉQEQEA†A†QEQEIEIEIEIEIEIEIEIEA&A&QEQEQEQEQEQEYÇYÇ{oƒpjŠjŠQÇQÇQÇQÇY†Y†QÇQÇI‡I‡Y†Y†Y†Y†A&A&I†I†AGAGYEYEYÇYÇY†Y†YEYEY†Y†a†a†k/k/ZZI$I$A&A&I$I$QEQE@å@å@å@åAEAEQEQEA&A&QEQEIEIEAGAGI†I†AGAGQEQEA&A&QÇQÇQEQEQÇQÇAGAGIEIEI$I$A&A&IEIEQEQEA&A&QEQEYEYEQEQEbbƒÐƒÐbŒbŒQEQEAGAGQEQEA†A†QEQEIEIEA&A&AEAEQEQEIEIEQEQEY†Y†jÍjÍs,k,ZZYÇYÇI‡I‡Y†Y†I‡I‡Y†Y†Y†Y†AGAGQEQEAGAGQEQEY†Y†QEQEY†Y†QEQEYEYEY†Y†ƒÐƒÐRŠRŠ@å@åIEIEI$I$@å@å@å@åAEAEQEQEQEQEIEIEA&A&AGAGI†I†I†I†AGAGI†I†AGAGQEQEQÇQÇQEQEA&A&I$I$IEIEIEIEIEIEAEAEQEQEYEYEQEQEjËj˃҃ÑYÉYÉQEQEA†A†QEQEIEIEIEIEIEIEIEIEA&A&QEQEQEQEQEQEYÇYÇ{oƒpjŠjŠQÇQÇQÇQÇY†Y†QÇQÇI‡I‡Y†Y†Y†Y†A&A&I†I†AGAGYEYEYÇYÇY†Y†YEYEY†Y†a†a†k/k/ZZI$I$A&A&I$I$QEQE@å@å@å@åAEAEQEQEA&A&QEQEIEIEAGAGI†I†AGAGQEQEA&A&QÇQÇQEQEQÇQÇAGAGIEIEI$I$A&A&IEIEQEQEA&A&QEQEYEYEQEQEbbƒÐƒÐbŒbŒQEQEAGAGQEQEA†A†QEQEIEIEA&A&AEAEQEQEIEIEQEQEY†Y†jÍjÍs,k,ZZYÇYÇI‡I‡Y†Y†I‡I‡Y†Y†Y†Y†AGAGQEQEAGAGQEQEY†Y†QEQEY†Y†AGAGI†I†YEYEjÍjÍYÉYÉIEIEI$I$A&A&IEIEHäHäIEIEQEQEA&A&I$I$A&A&QEQEQEQEA&A&QEQEAGAGQEQEQEQEY†Y†AGAGQEQEIEIEA&A&QEQE@å@åQEQEY…Y…Y†Y†Y†Y†jŠjŠ“Ð‹ÐZZQEQEAGAGI$I$AGAGQEQEA&A&QEQEQEQEA&A&QEQEYEYEjjs/k/AGAGY†Y†QEQEYEYEAGAGQEQEYEYEA&A&I†I†AGAGQEQEA&A&YEYEYEYEY†Y†Y†Y†Y†Y†bŒbŒbbA&A&HäHäQEQEA&A&I$I$QEQE@å@åQEQEA&A&IEIEQEQEIEIEIEIEQEQEA&A&Y†Y†AGAGQEQEAGAGYEYEQEQEA&A&IEIEIEIE@å@åIEIEYEYEY†Y†Y…Y…bbƒÐƒÐjËjËQEQEI†I†QEQEQEQEA&A&QEQEAGAGHäHäQEQEAGAGYEYEYEYE{.{.ZJbJQEQEQEQEYEYEAGAGQEQEYEYEAGAGQEQEA&A&I†I†QEQEYEYEQEQEY†Y†AGAGI†I†YEYEjÍjÍYÉYÉIEIEI$I$A&A&IEIEHäHäIEIEQEQEA&A&I$I$A&A&QEQEQEQEA&A&QEQEAGAGQEQEQEQEY†Y†AGAGQEQEIEIEA&A&QEQE@å@åQEQEY…Y…Y†Y†Y†Y†jŠjŠ“Ð‹ÐZZQEQEAGAGI$I$AGAGQEQEA&A&QEQEQEQEA&A&QEQEYEYEjjs/k/AGAGY†Y†QEQEYEYEAGAGQEQEYEYEA&A&I†I†AGAGQEQEA&A&YEYEYEYEY†Y†Y†Y†Y†Y†bŒbŒbbA&A&HäHäQEQEA&A&I$I$QEQE@å@åQEQEA&A&IEIEQEQEIEIEIEIEQEQEA&A&Y†Y†AGAGQEQEAGAGYEYEQEQEA&A&IEIEIEIE@å@åIEIEYEYEY†Y†Y…Y…bbƒÐƒÐjËjËQEQEI†I†QEQEQEQEA&A&QEQEAGAGHäHäQEQEAGAGYEYEYEYE{.{.ZJbJQEQEQEQEYEYEAGAGQEQEYEYEAGAGQEQEA&A&I†I†QEQEYEYEQEQEI†I†QEQEA&A&YEYEZJbJYÉYÉ@å@åIEIEHäHäI$I$QEQEIEIEI$I$A&A&HäHäQEQEQEQEA&A&IEIEI$I$QEQEAGAGQEQEQEQEQEQEQEQEIEIEIEIEQEQEQEQEY†Y†Y†Y†Y…Y…YEYEjËj˃o{pI‡I‡I†I†QEQEA&A&QEQEA&A&QEQEA&A&A&A&QEQEAGAGQEQEYÉYÉ{oƒpYÆYÇYEYEYEYEYEYEAGAGQEQEYEYEY†Y†YEYEAGAGQEQEA&A&I†I†I‡I‡YEYEYÉYÉaÇaÇbŒbŒZJbJHäHäQEQEI$I$I$I$A&A&I$I$QEQEI$I$A&A&I$I$QEQEA&A&I$I$A&A&I$I$IEIEQEQEQEQEQEQEY†Y†IEIEIEIEAEAEQEQEQEQEYEYEY†Y†Y…Y…Y…Y…bb{oƒpZJbJQEQEAGAGQEQEA&A&QEQEA&A&QEQEQEQEA&A&QEQEQEQEYEYEjÍjÍbŒbŒYEYEYEYEYEYEYEYEAGAGY†Y†QEQEQEQEY†Y†A&A&AGAGQEQEQEQEI†I†QEQEA&A&YEYEZJbJYÉYÉ@å@åIEIEHäHäI$I$QEQEIEIEI$I$A&A&HäHäQEQEQEQEA&A&IEIEI$I$QEQEAGAGQEQEQEQEQEQEQEQEIEIEIEIEQEQEQEQEY†Y†Y†Y†Y…Y…YEYEjËj˃o{pI‡I‡I†I†QEQEA&A&QEQEA&A&QEQEA&A&A&A&QEQEAGAGQEQEYÉYÉ{oƒpYÆYÇYEYEYEYEYEYEAGAGQEQEYEYEY†Y†YEYEAGAGQEQEA&A&I†I†I‡I‡YEYEYÉYÉaÇaÇbŒbŒZJbJHäHäQEQEI$I$I$I$A&A&I$I$QEQEI$I$A&A&I$I$QEQEA&A&I$I$A&A&I$I$IEIEQEQEQEQEQEQEY†Y†IEIEIEIEAEAEQEQEQEQEYEYEY†Y†Y…Y…Y…Y…bb{oƒpZJbJQEQEAGAGQEQEA&A&QEQEA&A&QEQEQEQEA&A&QEQEQEQEYEYEjÍjÍbŒbŒYEYEYEYEYEYEYEYEAGAGY†Y†QEQEQEQEY†Y†A&A&AGAGQEQEQEQEA&A&QEQEQEQEAGAGjjR -R -I$I$I$I$I$I$QEQEI$I$QEQEQEQEQEQEQEQEI$I$A&A&HäHäIEIEIEIEQEQEQEQEYEYEYEYEQEQEQEQEQEQEQEQEY†Y†YEYEY†Y†Y†Y†Y†Y†Y…Y…k-k-ƒp{oI‡I‡QEQEA&A&A&A&I$I$A&A&QEQEIEIEA&A&QEQEIEIEQEQEaÇaÇ{.{.bbYEYEYEYEYEYEYEYEYEYEAGAGQEQEY†Y†QEQEA&A&AGAGAGAGQEQEI‡I‡I‡I‡YÉYÉjËjËR -R -HäHäI$I$QEQEHäHäHäHäQEQEQEQEQEQEQEQEQEQEHäHäQEQE@å@åQEQEA&A&QEQEHäHäYEYEYEYEQÇQÇQEQEQEQEQEQEYEYEYEYEaÇaÇY…Y…Y†Y†Y…Y…bIbIƒÐƒÐR‹R‹QEQEA&A&A&A&I$I$A&A&QEQEA&A&IEIEA&A&QEQEAGAGQEQE{,{,jËjËYEYEYEYEYEYEY†Y†QEQEQEQEYEYEY†Y†QEQEA&A&QEQEQEQEQEQEA&A&QEQEQEQEAGAGjjR -R -I$I$I$I$I$I$QEQEI$I$QEQEQEQEQEQEQEQEI$I$A&A&HäHäIEIEIEIEQEQEQEQEYEYEYEYEQEQEQEQEQEQEQEQEY†Y†YEYEY†Y†Y†Y†Y†Y†Y…Y…k-k-ƒp{oI‡I‡QEQEA&A&A&A&I$I$A&A&QEQEIEIEA&A&QEQEIEIEQEQEaÇaÇ{.{.bbYEYEYEYEYEYEYEYEYEYEAGAGQEQEY†Y†QEQEA&A&AGAGAGAGQEQEI‡I‡I‡I‡YÉYÉjËjËR -R -HäHäI$I$QEQEHäHäHäHäQEQEQEQEQEQEQEQEQEQEHäHäQEQE@å@åQEQEA&A&QEQEHäHäYEYEYEYEQÇQÇQEQEQEQEQEQEYEYEYEYEaÇaÇY…Y…Y†Y†Y…Y…bIbIƒÐƒÐR‹R‹QEQEA&A&A&A&I$I$A&A&QEQEA&A&IEIEA&A&QEQEAGAGQEQE{,{,jËjËYEYEYEYEYEYEY†Y†QEQEQEQEYEYEY†Y†QEQEA&A&QEQEQEQEIEIEQEQEA&A&QEQEI‡I‡jjR -R -@å@åI$I$I$I$QEQEQEQEQEQEQEQEQEQEI$I$A&A&QEQEIEIEHäHäYEYEQEQEQEQEY…Y…aÇaÇYEYEY†Y†Y†Y†QEQEY†Y†QEQEaÇaÇY…Y…aÇaÇY†Y†jŠjŠƒÐƒÐRRA&A&QEQEA&A&QEQEA&A&A&A&@å@åIEIEIEIEA&A&QEQEaÇaÇjÍjÍZZYEYEaÇaÇQEQEYEYEYEYEYEYEY†Y†QEQEQEQEA&A&I†I†AGAGQEQEAGAGY†Y†I‡I‡{.{.bIbIHäHäQEQEHäHäI$I$HäHäQEQEQEQEQEQEQEQEI$I$QEQE@å@åQEQEQEQEI$I$QEQEQEQEYEYEaÇaÇYEYEQEQEY†Y†YEYEY†Y†Y…Y…Y†Y†Y†Y†aÇaÇY…Y…ZZ{oƒpZJbJAGAGQEQEA&A&QEQEA&A&@å@åAEAEIEIEA&A&IEIEQEQEQEQEjËjËbŒbŒYEYEa†a†YEYEYEYEYEYEAGAGYEYEYEYEY†Y†A&A&I†I†A&A&IEIEQEQEA&A&QEQEI‡I‡jjR -R -@å@åI$I$I$I$QEQEQEQEQEQEQEQEQEQEI$I$A&A&QEQEIEIEHäHäYEYEQEQEQEQEY…Y…aÇaÇYEYEY†Y†Y†Y†QEQEY†Y†QEQEaÇaÇY…Y…aÇaÇY†Y†jŠjŠƒÐƒÐRRA&A&QEQEA&A&QEQEA&A&A&A&@å@åIEIEIEIEA&A&QEQEaÇaÇjÍjÍZZYEYEaÇaÇQEQEYEYEYEYEYEYEY†Y†QEQEQEQEA&A&I†I†AGAGQEQEAGAGY†Y†I‡I‡{.{.bIbIHäHäQEQEHäHäI$I$HäHäQEQEQEQEQEQEQEQEI$I$QEQE@å@åQEQEQEQEI$I$QEQEQEQEYEYEaÇaÇYEYEQEQEY†Y†YEYEY†Y†Y…Y…Y†Y†Y†Y†aÇaÇY…Y…ZZ{oƒpZJbJAGAGQEQEA&A&QEQEA&A&@å@åAEAEIEIEA&A&IEIEQEQEQEQEjËjËbŒbŒYEYEa†a†YEYEYEYEYEYEAGAGYEYEYEYEY†Y†A&A&I†I†A&A&I$I$A&A&QEQEQEQEY†Y†YÉYÉYÉYÉ8ã8ä@å@åHäHäHäHäAEAEI$I$HäHäQEQE@å@åI$I$I$I$QEQEIEIEQEQEYEYEYEYEYEYEYEYEQEQEIEIEQEQEYEYEY†Y†QEQEY…Y…Y†Y†QEQEYEYEZIZI{.{.R -R -AEAEQEQEA&A&@å@åIEIEA&A&AEAEQEQEA&A&QEQEA&A&QEQEjÍjÍYÉYÉYEYEYEYEYEYEY†Y†YEYEYEYEQEQEY†Y†YEYEQEQEA&A&QEQEA&A&Y†Y†A&A&QÇQÇbŒbŒbb@å@åHäHäI$I$@å@åI$I$@å@åIEIEI$I$HäHäQEQE@ä@äI$I$A&A&I$I$QEQEYEYEQEQEYEYEYEYEYEYEIEIEQEQEY†Y†YEYEY†Y†QEQEY…Y…Y…Y…QEQEYÇYÇk-k-s.k-HäHäQEQEA&A&@å@åA†A†I$I$@å@åIEIEIEIEA&A&AGAG@ä@äZJbJZJbJYEYEYEYEY†Y†YEYEY†Y†QEQEYEYEY…Y…YEYEQEQE@å@åHäHäI$I$A&A&QEQEQEQEY†Y†YÉYÉYÉYÉ8ã8ä@å@åHäHäHäHäAEAEI$I$HäHäQEQE@å@åI$I$I$I$QEQEIEIEQEQEYEYEYEYEYEYEYEYEQEQEIEIEQEQEYEYEY†Y†QEQEY…Y…Y†Y†QEQEYEYEZIZI{.{.R -R -AEAEQEQEA&A&@å@åIEIEA&A&AEAEQEQEA&A&QEQEA&A&QEQEjÍjÍYÉYÉYEYEYEYEYEYEY†Y†YEYEYEYEQEQEY†Y†YEYEQEQEA&A&QEQEA&A&Y†Y†A&A&QÇQÇbŒbŒbb@å@åHäHäI$I$@å@åI$I$@å@åIEIEI$I$HäHäQEQE@ä@äI$I$A&A&I$I$QEQEYEYEQEQEYEYEYEYEYEYEIEIEQEQEY†Y†YEYEY†Y†QEQEY…Y…Y…Y…QEQEYÇYÇk-k-s.k-HäHäQEQEA&A&@å@åA†A†I$I$@å@åIEIEIEIEA&A&AGAG@ä@äZJbJZJbJYEYEYEYEY†Y†YEYEY†Y†QEQEYEYEY…Y…YEYEQEQE@å@åHäHäAGAGI‡I‡I‡I‡YÉYÉbŒbŒjÍjÍZÌZÌI‡I‡AGAGAÇAÇAGAGAGAGAGAGJJR -R -I‡I‡JJI‡I‡R -R -I‡I‡bJZJI‡I‡YÉYÉJJI‡I‡JJI‡I‡JJI‡I‡RRYÉYÉR‹R‹ZJbJjËjË{,{,k/k/s-k-ZJbJA&A&I‡I‡I‡I‡AÇAÇJJBBI‡I‡R -R -BBBBbŒbŒk/k/ƒo{pbŒbŒjjbIbIYÉYÉiÇiÇbbbbR -R -rjbŒbŒZJbJZJbJYÉYÉI‡I‡ZJbJR‹R‹YÉYÉc,c,bŒbŒYÇYÇZZYÉYÉA&A&AÇAÇAGAGAGAGI‡I‡R -R -BBYÉYÉJJYÉYÉJJR -R -YÉYÉJJbbBBI‡I‡I‡I‡JJI‡I‡I‡I‡R -R -R -R -bJZJbŒbŒ{,{,k-k-rÎjÍc,c,AGAGAGAGRRAGAGBBR -R -BBR -R -I‡I‡BBZJbJjÎj̓o{pc/c/YÈYÉI‡I‡I‡I‡BBYÉYÉJJR -R -bbR -R -R -R -R -R -R -R -AGAGI‡I‡I‡I‡YÉYÉbŒbŒjÍjÍZÌZÌI‡I‡AGAGAÇAÇAGAGAGAGAGAGJJR -R -I‡I‡JJI‡I‡R -R -I‡I‡bJZJI‡I‡YÉYÉJJI‡I‡JJI‡I‡JJI‡I‡RRYÉYÉR‹R‹ZJbJjËjË{,{,k/k/s-k-ZJbJA&A&I‡I‡I‡I‡AÇAÇJJBBI‡I‡R -R -BBBBbŒbŒk/k/ƒo{pbŒbŒjjbIbIYÉYÉiÇiÇbbbbR -R -rjbŒbŒZJbJZJbJYÉYÉI‡I‡ZJbJR‹R‹YÉYÉc,c,bŒbŒYÇYÇZZYÉYÉA&A&AÇAÇAGAGAGAGI‡I‡R -R -BBYÉYÉJJYÉYÉJJR -R -YÉYÉJJbbBBI‡I‡I‡I‡JJI‡I‡I‡I‡R -R -R -R -bJZJbŒbŒ{,{,k-k-rÎjÍc,c,AGAGAGAGRRAGAGBBR -R -BBR -R -I‡I‡BBZJbJjÎj̓o{pc/c/YÈYÉI‡I‡I‡I‡BBYÉYÉJJR -R -bbR -R -R -R -R -R -R -R -k/k/ƒÐƒÐ{oƒpk/k/ƒÐƒÐ{.{.{.{.{Ï{Ïc,c,{oƒpk/k/ƒo{pk-k-c/c/jËjËs/k/bŒbŒc,c,bŒbŒk-k-bŒbŒbŒbŒc,c,k/k/s,k,c/c/{.{.ƒÒƒÑƒÐƒÐk/k/{.{.{Ï{σЃÐ{oƒp‹Ï“ϋГЃЃÐ{Ï{Ï{.{.ƒÐƒÐ{Ð{Ѓ҃Ñ{oƒp‹Ð“Ð{Ð{Ѓ҃Ñ{.{.{.{.“ЋГЋЃЃÐ{oƒp{Ï{Ï{,{,ƒÐƒÐ{Ð{Ѓ҃Ñ{.{.ƒÐƒÐƒÐƒÐƒÐƒÐ”0Œ0œ“œ“{Ð{ГЋЃ҃є0Œ0ƒÐƒÐc,c,{.{.{.{.{.{.k,k,ƒo{p{.{.ƒÐƒÐk-k-c/c/k-k-rËjËbŒbŒbŒbŒbŒbŒk-k-bŒbŒbŒbŒc,c,jÍjÍs/k/k/k/s/k/ƒÐƒÐƒÐƒÐk/k/{Ï{Ï{.{.ƒÏƒÏ{Ï{Ï{oƒpŒ0”0‹Ð“Ð{.{.ƒÐƒÐk/k/“ГЃЃЃЃЃЃÐ{oƒp{Ð{Ð{oƒps.{.ƒÐƒÐ“ЋЃσσЃÐ{.{.{Ï{Ï{oƒp{oƒpsÐ{Ð{oƒp{oƒpsÐ{Ð{Ð{Д2Œ1œ“œ“ƒÐƒÐk/s/ƒÐƒÐ{oƒpk/k/ƒÐƒÐ{.{.{.{.{Ï{Ïc,c,{oƒpk/k/ƒo{pk-k-c/c/jËjËs/k/bŒbŒc,c,bŒbŒk-k-bŒbŒbŒbŒc,c,k/k/s,k,c/c/{.{.ƒÒƒÑƒÐƒÐk/k/{.{.{Ï{σЃÐ{oƒp‹Ï“ϋГЃЃÐ{Ï{Ï{.{.ƒÐƒÐ{Ð{Ѓ҃Ñ{oƒp‹Ð“Ð{Ð{Ѓ҃Ñ{.{.{.{.“ЋГЋЃЃÐ{oƒp{Ï{Ï{,{,ƒÐƒÐ{Ð{Ѓ҃Ñ{.{.ƒÐƒÐƒÐƒÐƒÐƒÐ”0Œ0œ“œ“{Ð{ГЋЃ҃є0Œ0ƒÐƒÐc,c,{.{.{.{.{.{.k,k,ƒo{p{.{.ƒÐƒÐk-k-c/c/k-k-rËjËbŒbŒbŒbŒbŒbŒk-k-bŒbŒbŒbŒc,c,jÍjÍs/k/k/k/s/k/ƒÐƒÐƒÐƒÐk/k/{Ï{Ï{.{.ƒÏƒÏ{Ï{Ï{oƒpŒ0”0‹Ð“Ð{.{.ƒÐƒÐk/k/“ГЃЃЃЃЃЃÐ{oƒp{Ð{Ð{oƒps.{.ƒÐƒÐ“ЋЃσσЃÐ{.{.{Ï{Ï{oƒp{oƒpsÐ{Ð{oƒp{oƒpsÐ{Ð{Ð{Д2Œ1œ“œ“ƒÐƒÐAEAE@å@åAEAEAEAEIEIE8Ä8äA†A†I$I$@å@åAGAGQÇQÇR‹R‹IEIEHãHäI$I$I$I$AEAEHäHäI$I$AEAEHäHäI$I$A$A$Y…Y…QÇQÇYÉYÉAÇAÇQEQEAÇAÇQEQE9E9EIEIEIEIE9E9EAGAGY…Y…QÇQÇI†I†I‡I‡QÇQÇQEQEQÇQÇI†I†Y†Y†I†I†AGAGIEIEQEQEI†I†IEIEIEIEA&A&QÇQÇQEQEbŒbŒRRIEIE8Ä8ä9E9E8Ä8ä9E9EA&A&A$A$@å@å9†9†IEIE@å@å9E9EIEIEA&A&AEAEAEAE@å@åA†A†QEQEZJbJAÇAÇHäHäI$I$IEIEHäHäIEIEI$I$HäHäI$I$A$A$8Ä8äQEQEYÇYÇYÇYÇJJIEIEAGAGAÇAÇAEAEAEAEIEIEA&A&QEQEAGAGY…Y…I‡I‡QÇQÇQÇQÇA†A†Y†Y†I†I†Y†Y†I†I†AGAGQEQEA&A&I†I†QEQE9E9EAGAGQEQEI†I†jjR -R -AÇAÇA&A&8Ä8äA$A$9E9EA&A&9E9E@å@åAEAE@å@åAEAEAEAEIEIE8Ä8äA†A†I$I$@å@åAGAGQÇQÇR‹R‹IEIEHãHäI$I$I$I$AEAEHäHäI$I$AEAEHäHäI$I$A$A$Y…Y…QÇQÇYÉYÉAÇAÇQEQEAÇAÇQEQE9E9EIEIEIEIE9E9EAGAGY…Y…QÇQÇI†I†I‡I‡QÇQÇQEQEQÇQÇI†I†Y†Y†I†I†AGAGIEIEQEQEI†I†IEIEIEIEA&A&QÇQÇQEQEbŒbŒRRIEIE8Ä8ä9E9E8Ä8ä9E9EA&A&A$A$@å@å9†9†IEIE@å@å9E9EIEIEA&A&AEAEAEAE@å@åA†A†QEQEZJbJAÇAÇHäHäI$I$IEIEHäHäIEIEI$I$HäHäI$I$A$A$8Ä8äQEQEYÇYÇYÇYÇJJIEIEAGAGAÇAÇAEAEAEAEIEIEA&A&QEQEAGAGY…Y…I‡I‡QÇQÇQÇQÇA†A†Y†Y†I†I†Y†Y†I†I†AGAGQEQEA&A&I†I†QEQE9E9EAGAGQEQEI†I†jjR -R -AÇAÇA&A&8Ä8äA$A$9E9EA&A&9E9E@å@å@å@åHäHä8ä8ãI$I$8Ä8ä@å@å8ã8ä8ã8ä@å@åHäHäI†I†jŠjŠ@ä@ä@å@åHäHäHäHä@ä@ãHäHäHäHä8ä8ã8ä8ã8ä8ã@å@åI$I$IEIEjŠjŠA&A&IEIE8Ä8ä@å@å8Ä8ä8Ä8ä9E9EQEQE8Ä8äA&A&HäHäIEIEQEQEQEQEQEQEQEQEQEQEQEQEA&A&I$I$QEQEA&A&@å@åIEIE@å@å9E9EA&A&QEQE{,{,I‡I‡@å@å9E9E8Ä8äIEIE@å@å9E9E8Ä8ä9E9E@ä@ä@å@åHäHäHäHä8ä8ã@å@å8ã8ä8ã8äHäHä8ä8ãIEIEZJbJAGAGHäHäHäHäHäHä8ä8ãHäHãHäHä9$9$0Ä0ãHäHäA$A$8ä8ãI$I$bbYÉYÉA$A$@å@å8Ä8ä8Ä8ä8Ä8äAEAE8Ä8äIEIE@å@åAEAE@å@åIEIEQEQEQEQEQEQEQEQEQEQEQEQEA&A&IEIEIEIEI$I$A&A&@å@åA$A$9E9EQEQEZJbJbŒbŒHäHä8Ä8ä9E9E@å@å@å@å8Ä8ä@å@åA$A$@å@åHäHä8ä8ãI$I$8Ä8ä@å@å8ã8ä8ã8ä@å@åHäHäI†I†jŠjŠ@ä@ä@å@åHäHäHäHä@ä@ãHäHäHäHä8ä8ã8ä8ã8ä8ã@å@åI$I$IEIEjŠjŠA&A&IEIE8Ä8ä@å@å8Ä8ä8Ä8ä9E9EQEQE8Ä8äA&A&HäHäIEIEQEQEQEQEQEQEQEQEQEQEQEQEA&A&I$I$QEQEA&A&@å@åIEIE@å@å9E9EA&A&QEQE{,{,I‡I‡@å@å9E9E8Ä8äIEIE@å@å9E9E8Ä8ä9E9E@ä@ä@å@åHäHäHäHä8ä8ã@å@å8ã8ä8ã8äHäHä8ä8ãIEIEZJbJAGAGHäHäHäHäHäHä8ä8ãHäHãHäHä9$9$0Ä0ãHäHäA$A$8ä8ãI$I$bbYÉYÉA$A$@å@å8Ä8ä8Ä8ä8Ä8äAEAE8Ä8äIEIE@å@åAEAE@å@åIEIEQEQEQEQEQEQEQEQEQEQEQEQEA&A&IEIEIEIEI$I$A&A&@å@åA$A$9E9EQEQEZJbJbŒbŒHäHä8Ä8ä9E9E@å@å@å@å8Ä8ä@å@åA$A$HäHäI$I$8ã8ä@å@åHäHä8ä8ãHäHä8ä8ã@ä@ãHäHäI†I†bb8Ä8äI$I$HäHäA$A#HäHãI$I$8ã8äHäHä8ä8ãAEAEHäHä8ä8ãI$I$ZJbJIEIE@å@å8Ä8äA$A$9E9E8Ä8ä@å@å8Ä8äAEAEI$I$IEIEA&A&I$I$A&A&QEQEQEQEQEQEQEQEQEQEA&A&A&A&I$I$A&A&@å@åA$A$@å@å9E9EYEYEjÍjÍYÉYÉ8Ä8äAEAE8Ä8ä@å@å9$9$@å@å9E9EA&A&8Ä8äHäHä0Ä0ãIEIEHäHä@ä@ã8ä8ãHäHä8ä8ãHäHäHäHäbIbIAGAG@ã@äI$I$@ã@äHãHäI$I$I$I$8ã8äHäHä8ä8ã8ä8ã@å@åI$I$bbJJ8Ä8äA$A$8Ä8ä9E9E8Ä8ä@å@åAEAE@å@åAEAEHäHäIEIEIEIEI$I$A&A&QEQEQEQEQEQEQEQEA&A&I$I$A&A&@å@åIEIE8Ä8ä9E9EA&A&QEQEjjZÌZÌA&A&@å@å8Ä8äA$A$9E9EHäHä8ä8ãHäHäHäHäI$I$8ã8ä@å@åHäHä8ä8ãHäHä8ä8ã@ä@ãHäHäI†I†bb8Ä8äI$I$HäHäA$A#HäHãI$I$8ã8äHäHä8ä8ãAEAEHäHä8ä8ãI$I$ZJbJIEIE@å@å8Ä8äA$A$9E9E8Ä8ä@å@å8Ä8äAEAEI$I$IEIEA&A&I$I$A&A&QEQEQEQEQEQEQEQEQEQEA&A&A&A&I$I$A&A&@å@åA$A$@å@å9E9EYEYEjÍjÍYÉYÉ8Ä8äAEAE8Ä8ä@å@å9$9$@å@å9E9EA&A&8Ä8äHäHä0Ä0ãIEIEHäHä@ä@ã8ä8ãHäHä8ä8ãHäHäHäHäbIbIAGAG@ã@äI$I$@ã@äHãHäI$I$I$I$8ã8äHäHä8ä8ã8ä8ã@å@åI$I$bbJJ8Ä8äA$A$8Ä8ä9E9E8Ä8ä@å@åAEAE@å@åAEAEHäHäIEIEIEIEI$I$A&A&QEQEQEQEQEQEQEQEA&A&I$I$A&A&@å@åIEIE8Ä8ä9E9EA&A&QEQEjjZÌZÌA&A&@å@å8Ä8äA$A$9E9EHäHä8ä8ãHäHäHäHä8ä8ãHäHä8ä8ãHäHã8ä8ã@ä@ãHäHä@ä@ãI$I$QÇQÇZJbJ@å@åI$I$I$I$HäHäI$I$I$I$HäHäA$A$8ä8ãHäHäA$A$HäHäI$I$ZJbJ9E9E8Ä8äA$A$8Ä8ä8Ä8ä9$9$8Ä8äA$A$9E9EA&A&I$I$QEQEA&A&I$I$A&A&HäHäQEQEQEQE8å8å@å@å@å@åAEAEHäHäA$A$8Ä8äIEIEIEIEQEQEjÍjÍIÇIÇ8Ä8ä8Ä8äA$A$9E9E8Ä8ä9E9E@ä@ä8Ä8ä@å@åHäHä8ä8ãHäHäHäHä8ä8ã@ä@ã@ä@ãHäHãHäHäI$I$ZJbJAGAGI$I$HäHäI$I$I$I$I$I$HäHäA$A$8ä8ãI$I$8Ä8äI$I$HäHäZIZIAÇAÇ8Ä8äA$A$8Ä8ä8Ä8äA$A$8Ä8äA$A$8Ä8äAEAEIEIEI$I$QEQEA&A&I$I$QEQEHäHäA&A&QEQE8Ä8äA&A&HäHäA$A$IEIE8Ä8äA&A&I$I$QEQER -R -bŒbŒ@ä@ä8ä8ãA$A$0å0å@å@å8ã8ä8ã8ä@å@åHäHä8ä8ãHäHä8ä8ãHäHã8ä8ã@ä@ãHäHä@ä@ãI$I$QÇQÇZJbJ@å@åI$I$I$I$HäHäI$I$I$I$HäHäA$A$8ä8ãHäHäA$A$HäHäI$I$ZJbJ9E9E8Ä8äA$A$8Ä8ä8Ä8ä9$9$8Ä8äA$A$9E9EA&A&I$I$QEQEA&A&I$I$A&A&HäHäQEQEQEQE8å8å@å@å@å@åAEAEHäHäA$A$8Ä8äIEIEIEIEQEQEjÍjÍIÇIÇ8Ä8ä8Ä8äA$A$9E9E8Ä8ä9E9E@ä@ä8Ä8ä@å@åHäHä8ä8ãHäHäHäHä8ä8ã@ä@ã@ä@ãHäHãHäHäI$I$ZJbJAGAGI$I$HäHäI$I$I$I$I$I$HäHäA$A$8ä8ãI$I$8Ä8äI$I$HäHäZIZIAÇAÇ8Ä8äA$A$8Ä8ä8Ä8äA$A$8Ä8äA$A$8Ä8äAEAEIEIEI$I$QEQEA&A&I$I$QEQEHäHäA&A&QEQE8Ä8äA&A&HäHäA$A$IEIE8Ä8äA&A&I$I$QEQER -R -bŒbŒ@ä@ä8ä8ãA$A$0å0å@å@å8ã8ä8ã8ä@å@åHäHä@ä@ã8ä8ãHäHä@ä@ãHäHã@ä@ã@ä@ã@ä@ãI$I$QEQEbŒbŒHäHäI$I$8ã8äI$I$I$I$IEIEHãHäI$I$HäHäA$A#HäHäI$I$I$I$JJ8Ä8ä8Ä8äA$A$8Ä8ä1$1$0Ä0ãA$A$8Ä8äIEIEI$I$A&A&I$I$A&A&QEQEHäHäQEQEHäHäA&A&I$I$@å@åHäHäI$I$@å@åAEAE8Ä8äIEIEQEQEQEQEjËjËI‡I‡(ä(ä8Ä8ä8Ä8ä8Ä8ä@å@å8Ä8ä8Ä8äAEAEHäHä8ä8ãHäHä8ä8ãHäHä@ä@ã@ä@ã@ä@ã@ä@ãHäHäI$I$ZJbJI‡I‡@ä@ãI$I$I$I$8ã8äIEIEI$I$HäHäI$I$HäHäI$I$A$A$HäHäQÇQÇA&A&8Ä8ä8Ä8äA$A$0Ä0ä0Ä0ãA$A$8Ä8äAEAEI$I$QEQEA&A&I$I$QEQE@å@åQEQEQEQEHäHäQEQE@ä@ä@å@åI$I$@å@åAEAE@å@åAEAEI$I$QEQEbbbŒbŒ0Ã0ä8Ä8ä8Ä8ä9$9$8Ä8ä9E9E@ä@äHäHäHäHä@ä@ã8ä8ãHäHä@ä@ãHäHã@ä@ã@ä@ã@ä@ãI$I$QEQEbŒbŒHäHäI$I$8ã8äI$I$I$I$IEIEHãHäI$I$HäHäA$A#HäHäI$I$I$I$JJ8Ä8ä8Ä8äA$A$8Ä8ä1$1$0Ä0ãA$A$8Ä8äIEIEI$I$A&A&I$I$A&A&QEQEHäHäQEQEHäHäA&A&I$I$@å@åHäHäI$I$@å@åAEAE8Ä8äIEIEQEQEQEQEjËjËI‡I‡(ä(ä8Ä8ä8Ä8ä8Ä8ä@å@å8Ä8ä8Ä8äAEAEHäHä8ä8ãHäHä8ä8ãHäHä@ä@ã@ä@ã@ä@ã@ä@ãHäHäI$I$ZJbJI‡I‡@ä@ãI$I$I$I$8ã8äIEIEI$I$HäHäI$I$HäHäI$I$A$A$HäHäQÇQÇA&A&8Ä8ä8Ä8äA$A$0Ä0ä0Ä0ãA$A$8Ä8äAEAEI$I$QEQEA&A&I$I$QEQE@å@åQEQEQEQEHäHäQEQE@ä@ä@å@åI$I$@å@åAEAE@å@åAEAEI$I$QEQEbbbŒbŒ0Ã0ä8Ä8ä8Ä8ä9$9$8Ä8ä9E9E@ä@äHäHäHäHä@ä@ãHäHã@ä@ãHäHã@ä@ãHäHä@ä@ãHäHãHäHäIEIEc,c,HäHä8ä8ãI$I$HäHäHäHãI$I$I$I$HäHä@ä@ãI$I$I$I$8ã8äIEIEAGAGA$A$A$A$8ä8ã8ä8ã8Ä8äAEAEI$I$QEQEI$I$QEQEQEQEQEQEYEYEQEQEQEQEQEQEQEQEYEYEQEQEQEQEQEQEHäHäQEQEI$I$QEQEQEQEA&A&QEQEbŒbŒAGAG@å@åA$A$0Ä0ã9$9$(ä(ä9E9E8Ä8ä@å@å@ã@ä@ã@äHäHäHäHãHäHã@ä@ã@ä@ã@ä@ãHäHãHäHãHäHäjŠjŠAÇAÇHäHäHäHäI$I$@ã@äI$I$I$I$HãHäHäHä@ä@ãI$I$HäHäA$A#QEQEA†A†8ã8ä@å@å8ã8äA$A$8ä8ãAEAEI$I$QEQEHäHäQEQEYEYEQEQEAGAGYEYEHäHäYEYEA&A&YEYEQEQEYEYEQEQEHäHäIEIEHäHäQEQEYEYEA&A&YÉYÉZJbJ8ä8ã8Ä8ä9$9$(ä(ä8Ä8ä8Ä8ä0Ä0ãHäHäHäHä@ä@ãHäHã@ä@ãHäHã@ä@ãHäHä@ä@ãHäHãHäHäIEIEc,c,HäHä8ä8ãI$I$HäHäHäHãI$I$I$I$HäHä@ä@ãI$I$I$I$8ã8äIEIEAGAGA$A$A$A$8ä8ã8ä8ã8Ä8äAEAEI$I$QEQEI$I$QEQEQEQEQEQEYEYEQEQEQEQEQEQEQEQEYEYEQEQEQEQEQEQEHäHäQEQEI$I$QEQEQEQEA&A&QEQEbŒbŒAGAG@å@åA$A$0Ä0ã9$9$(ä(ä9E9E8Ä8ä@å@å@ã@ä@ã@äHäHäHäHãHäHã@ä@ã@ä@ã@ä@ãHäHãHäHãHäHäjŠjŠAÇAÇHäHäHäHäI$I$@ã@äI$I$I$I$HãHäHäHä@ä@ãI$I$HäHäA$A#QEQEA†A†8ã8ä@å@å8ã8äA$A$8ä8ãAEAEI$I$QEQEHäHäQEQEYEYEQEQEAGAGYEYEHäHäYEYEA&A&YEYEQEQEYEYEQEQEHäHäIEIEHäHäQEQEYEYEA&A&YÉYÉZJbJ8ä8ã8Ä8ä9$9$(ä(ä8Ä8ä8Ä8ä0Ä0ãHäHäA&A&A&A&A&A&IEIEAGAGA&A&0å0å8Ä8ä0Ä0ä8Ä8äAGAGbŒbŒJJAGAGQEQEA&A&Y†Y†QÇQÇI‡I‡I†I†AGAGA†A†AGAGI†I†Y†Y†R -R -R -R -QÇQÇAGAGA&A&0Ä0äHäHä8Ä8äA&A&@ä@äI$I$@å@å8Ä8ä@å@åA&A&8å8å@ä@ä@å@åA&A&I$I$@ä@äQEQEIEIEA&A&@å@åAGAGA&A&A&A&AGAGR‹R‹AGAG0Ã0ä ä ä0Ä0ä0Ä0ã0Ä0ã(Ä(Ã0Ä0äHäHäAEAEA&A&QEQEA&A&A&A&I‡I‡8å8å0å0å@ä@ä0Ä0ãA&A&ZJbJR‹R‹I‡I‡A&A&@å@åQEQEYÇYÇQÇQÇAGAGI†I†AGAGA†A†I†I†AGAGbbR -R -YÉYÉAÇAÇA&A&8Ä8ä8Ä8ä@å@å@å@å@å@åIEIE@ä@ä8Ä8ä@å@å@å@åA&A&@ä@äA&A&I$I$A&A&HäHä8Ä8äQEQEA&A&@å@åA&A&AGAGA&A&A&A&ZJbJR -R -0æ0æ0æ0æ9†9†I‡I‡ å å(ä(ä(å(å8æ8æA&A&A&A&A&A&IEIEAGAGA&A&0å0å8Ä8ä0Ä0ä8Ä8äAGAGbŒbŒJJAGAGQEQEA&A&Y†Y†QÇQÇI‡I‡I†I†AGAGA†A†AGAGI†I†Y†Y†R -R -R -R -QÇQÇAGAGA&A&0Ä0äHäHä8Ä8äA&A&@ä@äI$I$@å@å8Ä8ä@å@åA&A&8å8å@ä@ä@å@åA&A&I$I$@ä@äQEQEIEIEA&A&@å@åAGAGA&A&A&A&AGAGR‹R‹AGAG0Ã0ä ä ä0Ä0ä0Ä0ã0Ä0ã(Ä(Ã0Ä0äHäHäAEAEA&A&QEQEA&A&A&A&I‡I‡8å8å0å0å@ä@ä0Ä0ãA&A&ZJbJR‹R‹I‡I‡A&A&@å@åQEQEYÇYÇQÇQÇAGAGI†I†AGAGA†A†I†I†AGAGbbR -R -YÉYÉAÇAÇA&A&8Ä8ä8Ä8ä@å@å@å@å@å@åIEIE@ä@ä8Ä8ä@å@å@å@åA&A&@ä@äA&A&I$I$A&A&HäHä8Ä8äQEQEA&A&@å@åA&A&AGAGA&A&A&A&ZJbJR -R -0æ0æ0æ0æ9†9†I‡I‡ å å(ä(ä(å(å8æ8æR‹k/jÍrÍc/c/bŒR‹R -R‹bŒj̓p{ok-k/ƒÏ”2‹ÐƒÐ“ЃЃГЃЃЃГЃÐc,ZJbŒR‹bŒZÌbŒbŒR‹jÍR‹bŒR‹R‹R‹R -R -R‹bŒc-jÍc/k/k/c/bŒc/c/bŒR‹R -R‹R -R‹c/k/bJR -R‹bŒc/ZÌbŒR -R‹R‹bŒk/“Ðk/k-ƒÐƒÏ”2ƒÐƒÐƒÐƒÐƒÏ“ЃЃГЃÐk/bŒR‹ZJZÌZJZÌZÌbŒR‹jÍbŒR‹R‹R‹R -R -R‹R‹jÍZÌc/k/k/s/c/bŒk/c/c/ƒÏZJR‹R‹R -bbZbjË{.YÇAGQEAGAÇAGAEA†A†QEAÇI†QÇQÇI‡QÇQÇI†AGAEAEQÇAGAEAGA†I†YÇjŠk/k-rËk-{,jÍ{,{.{.k/k-rËjÍk-k/rËj‰bZjŠjËj‰rËjËjËjËrËjËjËjY†YEY†iÇk/bIY†A&QÇAGAÇA†IEAGA†QEAÇQÇQÇQÇQÇI†QÇI†AGA$AÇQÇIEIEAGAÇY†b{oc,jÍ{,jËk-s-{,{.k/k-{,jÍ{.œ“{.j‰jIbbIjŠjËjËr‰jËjŠjËjËbŒQE@åI$I$YÉk-QEHä@ä0Ä0ä0Ä0ã8ÄHäAEHä0ä@ä0Ä8ä8ä8Ä8ä8Ä8ä8äA$IE@ä0Ä0ä@åI$bI{.aÇQEQEQEQEAGYEaÇY†I‡aÇaÇbŒc,QEQE@åQEI$HäYEYEYDYEYEYEYEYEYEYEY†Y†Y†jÍb8Ä@ä@ä0ä0Ã8ä0Ä@äHäAE8Ä@ä0Ä@ä0ä0Ä8ä8Ä8ä8ä8ÄIE8ä8Ä0ä8ÄQEYEk/jYEA&QEQEQEYEI‡a†aÇI‡Y†jIƒÒZQE@äQEQEI$YEYDYEYDYEYEYEYEY†YEA&@åaÇjÍQE@ä8Ä0ä(ä(ä8Ä0ä8ÄAE@ä0ä0Ä8ä0Ä(ä8ä(ä9$8Ä8ä9E8Ä8ä8Ä8ä8äQEjk/I‡QEA&YEI‡Y†I‡Y†I‡aÇI‡a†{.bŒY†QEA&QEA&QEQEQEHäYEa†Y†Y†I‡Y†I‡YEY†Y†bŒR -Hä@ä0Ä(ä(ä(ä0ä@ä8Ä@å0ã8Ä0ä(ä0Ä8ä8Ä(ä8äA$8Ä9E@ä8äA$8Ä@åY†k/bAGQEAGYEI‡aÇI‡aÇI‡Y†YÉjIƒoI‡YEAGQEA&QEQEQEQEQEQEY†QEY†Y†A&@åA$YÉc,YE8Ä8ä ä0Ä0ä(ä8ÄA$@å8Ä8äA$(ä8Ä(ä8ä8Ä9$8Ä9$@åIE8Ä8ä9$8ÄIEZk/aÇI‡YEI‡AGY†I‡aÇI‡Y†I‡aÇ{.k/QEQEA&QEA&I†A&I‡QEAGYEAGaÇYÉaÇYÉaÇYÉI‡jÍj@ä8Ä ä0ä0Ä0ä8Ä8äA$A$8ÄA$(ä8Ä8ä(ä8Ä9$8Ä8ä9E@åAE0Ä0ã8ÄIEQEk/bJY†Y†YEI‡AGI‡Y†I‡aÇI‡Y†jŠ{oYÉQEA&@åQEA&AGA&I‡QEYÉQEAGY†QÇI‡A&@åbc/YE8Ä8ä(ä(ä8Ä0ä(ä8ÄA$8ÄA$8Ä(ä8ä(ä0å9$(ä8Ä8ä9E@åAE0Ä0ã8ÄQEYÉjËYÉaÇI‡YEI‡AGY†I‡YÉI‡aÇYÉjËbŒIE0æ(ä(ä å0å9EA&A&YEI‡aÇI‡YÉYÇYÉQÇYÉYÇjÍbJ@ä0Ä0ä0Ä(ä(ä0ä8Ä8äA$8Ä8ä8Ä(ä8ä(ä9$(ä8ÄA$8Ä9E@å8ã8ä8Ä9EQEjÍbYÉaÇAGI†I‡YEI‡YÉYEI‡YÉjIƒoAG9E0å(ä(ä(å9E0åA&AGYÇI‡YEYÉYÇAG@åI$Zk/YE8Ä8ä8Ä(ä(ä0ä8Ä8ä8ÄA$0Ä0ä8Ä8ä8ä8Ä8äA$8Ä0ä8ÄIEHä0ä8ä@åHäYÇc,jYÉaÇAGI‡I‡YÉaÇI‡aÇI‡a†ZJbJ(ä0å1†Ä å å0æ ä ä8ÄA&AGQÇI†I‡IEAGAGY†c/ZHã@ä0Ä0ä(ä(ä@ä0Ä8äA$8Ä9$0Ä8ä8ã8Ä8äA$8Ä8ä0ÄIE@å8ã8ä8äI$QEbŒbIjI‡aÇI‡I‡I‡YÉaÇI‡YÉY†jk/9E0å0æ å å(å å å(ä8ÄAÇ8Ä0åQÇY†AGI†A&YÉk/YÉAG9E0å8Ä(ä0å(ä0ä0Ä ä0ã0Ä0ä1$0Ä0ä9$9E0å8Ä0æA&9E0åAGAGI†ZJbŒI‡AGI†I‡aÇAGY†AGI‡YEA&AG{,k/0Ã9EI‡A&@åA$9EA&@åAEY†I‡A&I†A&IEA&9EI‡c/bŒAGIE0å0å(ä8Ä(ä(ä0ä0Ä ã0ä(ä8Ä(ä8ä1$0æ9E(ä0åA&@å0æAGAGAGYÉZÌYÉAGAGQÇI‡Y†I‡YEI‡AGAGQEbƒÒ9…0åQÇAGA$9E@å9E@åAEQEA&9EA&{.jËk-rËk-{.k-bJbŒbŒZJR -bJR‹ZJc,bJR‹ZJR‹ZJbJRŠbŒZJc,bŒk,k/{.{.k-k-s.c,k-bŒbŒJYÉZJR -R‹YÉR‹bŒR‹bŒ{oƒÐk/bŒk-jË{,{.{.{oƒp{,ƒÐ“ЃЃÐ{o{,k/k/s-{.{,bŒbŒbŒZJZIR‹ZJbJbŒZÌZJbJZJR‹ZJR‹jŠZJbŒZÌjËk/ƒÐk,k-s-k.bŒ{.k-bŒZIJR -bJZJR -R -ZÌZJbŒc/ƒÐ{.c,bŒ{.jË{.{.{oƒp{,{o“Ð{oƒpIEIEQEQEQEQEI$8ÄIEAEAE@åIEQEbZJAÇa†QEQEYEY†YEQEIEQEQEQÇIÇbŒZQÇQEY†AGQEQEA&I†AGA†I†I‡QÇYÇYÉbQÇYÇYÉRZZYÉYÇZZZJjŠbbYÇZZYÇY†Y†Y†QEQEQE8ÄAEI$A&IE@åQEY†bŒIÇQÇYEQEQEY†YEY†AEIEQEQEQÇR‹bIYÇY†I†Y†AGIEQEAGQEAGAGQÇI†YÉYÇYÉYÇRYÇYÉZIZIYÇRZZbbŒbbAGA$A†8Ä0å@åA&@å@å8Ä9E8ä@å@åA$IEA&jc/Y†YEa†YEY†Y†aÇY†AGQÇA†IEI‡c-ZAGQEA&IE@å9EA&@åAE8ÄA&IEA&QEA&QEA&AGAE@åA$8ÄA&AGAGYEYÉZYEA&YEA&QEA&QE@å@åQE@å8Ä9E8ä@å8Ä9EA&QEY†k/ZYEY†YEaÇYEI‡Y†QÇY†I†AGAGbŒZJI†A&AG@åQE@å9EA&8Ä9EA&A&@åIEIEIEA&I†A&IE0å8Ä@åA&AGQEY†bI‡QE@ä8Ä0å8äA$@åA$9E@å9$0å9E8Ä9EA&@åY†bbŒ@åYEY†aÇY†Y†Y†aÇI‡QÇAGI‡AÇbŒaÇI†A&IEA&@å@åIE@å9E@å9EA&QEA&QEA&AGQEA&IE0æ9EA&IEA&QEa†YÉAGYEI‡A&YEA&QE@å@å9$@å8Ä0å9E8ä9EA&@åIEI‡jÍI†YEY†Y†Y†a†a†aÇY†I‡I‡I‡9†ZIjŠI‡A&QE@å9EA&@åAE8ÄIE@å9EQEA&QEA&AGQE@åA&A&9$A&A&IEA&Y†YÉYEI‡YEA&8Ä8Ä0æ8ä9E8Ä0å8ä9E@å0åA$9E@åIER -bŒ8ãY†a†Y†a†a†aÇa†I‡QÇI‡AGZIZJYÉIEA&A&IE@å9E@å9E@å9EA&A&AGI$A&IEA&AG@å9E8Ä9EA&A&QEAGa†bI‡QEAGQEA&AGI$@å0å8Ä9E8ä0æA$0å@åA$9EA&YEjÍA&QEY†Y†a†a†aÇaÇaÇAGYÇA†A&R‹bI‡A&A&AEA&8ÄIE@å9E@å9EA&AGQEA&A&IEA&A&9E@å0åA†A&QEA&YEZJI‡YEA&8Ä@å8ä1$8Ä0æ8äA$(ä0å@å9$@å9E8åA&YÉZÌY†aÇa†iÇzzzjjAGI†A†YÉbŒQÇIEA&IEA&0å@å9E8åIEA&9EA&QEA&IEA&A&IE@å9E8Ä(äA&IEA&YEYÉR -YEAGQEA&QEAGQE8å8Ä9E8ä8Ä9$0å9E@å8Ä@å9EI‡bŒYÉY…iÇjqÇzzaÇiÇQÇAGAGI‡bŒYÉIEA&IE@å9E8å@å@å9EA&@åA&IEA&A&IEA&AGA&8Ä9E8ä9EA&QEQEY†ZJYÉQE@å8ÄA$8ÄA$8Ä8äA$8Ä8ä9$(ä@å9$@åIEIEYÉbŒQÇQÇAGYÉbzYÉa†aÇ@å9EA&R‹ZIIEA&QEA&@åA$0åIE8å@å9EA&@åQEA&QEA&IEA&@å0åIE@åA&IEAGQEa†bŒYEQEAGA&QEA&A&Hä8ã8ÄIE(ä8ä8Ä0åA$9EA&A&YEZÌYÉQÇI‡Y†YÉjjrYÉAG8Ä9†9ER‹I†AGQE@å9EA&8Ä9EA&8Ä9EIE@åIEA&QEA&IEA&@åA$9EA&@åIEA&QEYEZJYÉQEQE8Ä8äA&A&9†A&9E9E9E9EA†0æA&A†A&AGR -R‹(ä ä Ä Ã Ä(å0æ ä åJR -AÇbŒR‹A&0æA&0æ9†0å0å8Ä(ä0å@å0æAG9EA&A&A&A&@åAE8Ä8ä9EA&AGY†I‡YÉjÍR -YÉI‡YÉI‡I‡I‡A&AGAÇ9E@å1† ä8Ä9EA&A&AGI‡ZÌAÇ Ä ä£ ä(ä0æ Ä(äAGBBJjÍAGA&0æA†8æ0å@å8Ä8ä0æ8Ä0æAGA&A&9EA&A&I$@å0å8Ä8äA†AGI‡AGI‡bŒbŒI‡YÉI‡I‡k/c,k/jËbŒƒÐc,ZJc,jŠZJR -bŒbŒc,k-bJR -R‹JZJbŒc,j̓pƒÐk/k/{.{.k,{.k/k,s/{ok/c,jÍc,bŒ“Ðk/k/k-s-k.bŒjËk/ƒÐk/c/{.ƒÐk/{.{.{.{.{.{.{.{oƒp{.{,bŒjŠjŠbŒjŠI‡R -R‹ZJbJbŒZÌk-bŒR -R‹JR -ZÌbŒc/k/ƒÐ{o{.{.{.k,{.k,k/s-{.ƒÐZÌc,c/bŒ{σÐc,k/jÍs-jÎbŒk-ƒÐƒÐZÌk/ƒos.{.{.{.{o{.{.{.{oY†Y†Y†Y†QÇ{obŒ@åIEI$@å9EIEAGQEA&QÇI†I‡Y†AGI‡QÇQÇQÇQÇQEIEIEA†I†QEQÇaÇQEjË“ÐbI‡I‡QÇAÇQEAÇQEAGQÇQEYÇZƒÒjËbZYÇZZYÇYÇQÇI†I‡Y†Y†I‡YEYEYEYEYEjËAGQEA&@åAE@åQEI†QEAGQÇY†AGI‡I†QÇQÇYÇQÇAGQEIEQEAGQEQÇY†Y†Z“Ðc,I‡QÇI†I†I†I†I†I†I†Y†I†YÇ{,{obbYÉbbYÇjI†I‡Y†I†aÇQEQEY†AGYEk-bIEA&I$QEA&I$QEIEIEA&QEIEA&I†YEAGQEY†AGQEA&IEI$IEQEQEY†YEjË“ÐR -IEQE@åQEQEAGQEQEQEQEYEYÉ{.QÇQEQEYEAGQEQEAGQEA&AGQEQEQEQEQEYEaÇYEYÉAGI$@åQEI$IEQEA&QE@åQEIEA&QEI†YEAGQEAGIEQEA&AEIEIEQEY…Y†bƒÐjÍQEQEQEQEA&QEA&QEQEA&Y†YEjÍbJQEAGQEYEA&YEA&QEA&I†QEAGQEY†A&QEYEbŒI‡IEI$A&I$I$AGI$A&QEI$QEA&IEQEA&QEQEYEAGIEI$IEQEQEY†Y†Y…QEjŠ{ÐYÉIEQEIEIEA&QEIEA&A&QEYEYÇ{oI‡YEYEI‡QEYEAGYEY†QEA&I†AGQEA&Y†I‡YÉY†ZJAGHäQEI$QEA&I$QEA&IEIEQEA&I$A&QEQEQEQEA&I$IEQEQEQEY†Y†QEaǃÐZJQEAGQEA&QEA&QEQEA&QEYEYE{.bŒQEYEQEYEAGYEY†AGQEAGQEQEQEA&QEAGQEbR -@åI$I$QEQEI$QEQEQEQE@äA&I$QEQEIEQEYEQEQEQEY†YEY†Y†Y†QÇY…j˃ÒI…QEA&A&QEA&QEA&I$A&QEAGiǃoZYEYEQEQEYEYEQEYEA&I†AGQEQEAGAGY†YÉYÉbIQEI$I$I$QEI$QEQEQEI$@åI$QEA&QEIEQEQEQEQEQEQEYEY†Y†YEaÇY…Z{ÐbŒ@åIEA&I$A&QEA&A&I$A&Y†AGjËjÍYEYEYEYEY†AGQEYEQEAGQEQEIEQEA&QEAGZJb@åQEHãI$QEQEQEHäHäQEQEI$QEQEQEHäY…aÇYEY†QEY†YEQEY†Y…aÇa†jŠ{oRA&QEA&QE@å9EQEA&IEQEAGY†k/iÇY†YEYEYEYEAGYEY†QEA&I†AGQEA&Y†A&QÇYÇbŒQEQE@äI$QEQEQEQEHäI$QEQEQEI$QEQEYEYEYEYEI†YEY†QEY†Y†Y†Y…bƒÐZJQEA&QEIEA&A&AEIEA&IEQEYEjËbŒYEY…YEYEQEYEYEY†QEAGQEA&@åQEQEYEY†YÉYÉ@åHäI$A&HäQEQEQEQE@äI$A&QEQEQEY†Y…a†QEQEY†Y†Y†Y…Y†aÇQ…Q…ZƒÐYÉQEA&IEA&A&I$A&IEA&AGI$AGk-QÇY…Y†YEY†YEYEaÇYEYEQEAGQEQEIEAGQEQEA&ZJAGHã@åI$QEQEHäQEQEA&HäIEI$YEYEYEY†YEY†QEY†Y†Y†QEY…aÇY…YEY†k/c-@åQEQE@åAGAEI$A&QEAGQE@åZJbŒYEY…a†YEY†QEa†YEY†QE@åIEA&AGI‡AGYÉjÍR‹A&9E0åIEA&A&AGI‡AGAGI‡I‡AGI‡I‡YÉAGAGI†AGAGAGAGYÇRYÉbbŒbŒk-bJ0åA&AGA&AÇAGAGAGAGI‡ZJZÌ{.R -I‡A&AGAGYÉAGI‡YÉYÉYÉYÉRAGAGI‡AGI‡R -ZÌI‡8æ9E@å8æA&AGAGAGAGI‡I‡AGBI‡I‡I‡AGAGAGAGAGAGQÇYÉYÇR -jŠjËbŒk,A&AGAGA†AGAGAGAÇAGAGBbŒk/bŒI†I‡AGI‡I†I‡I‡I‡YÉI‡I‡I‡k/ƒÐ{oƒÐƒÐ{o{.{Ïk/{.{os.k/k/k-s-k-bŒk,k/c,bŒk-{.k/k,ƒÐƒÐk/{Ï{oƒÐ“ЃД0œ“{Ï{o{.ƒÐƒÐƒÐ{oƒÒƒÐƒÐ{Ð{o„0œ““σÐ{o{.ƒÐƒÐƒÐƒÐ{oƒÐ„0”“Œ“”“œ““ЃÐ{Ð{ЃÒ{Î{ps/{.{ok.s/k/k/k,s/jËc,k/jÍbŒk/s-k/k,ƒoƒÐ{Ï{.{o{σЃϓМ“ƒÏ{Ð{.ƒÐ{oƒÐ{oƒÐƒÐƒÒ{Ðk/“М““ЃσÒ{.{.ƒÐƒÒƒÐƒÐƒÐƒÐ”“Œ“”“QÇA†QEAGQÇA†QEAÇQEAÇZZJQÇAEQEIEIEQEIEIEIEI$IEYÇYÇJI‡IÇZIQÇAGA†I‡AÇQÇYÇYÇZIIÇZQÇZQÇZQÇQÇI‡QÇQÇA†I†AGYÇbZJZIAÇIEA†A†AGAÇAGQÇAÇA†I†I†AGQÇIEAGI†QÇQÇZJJIEQEQ…IEIEIEIEQEAEIEQEZYÉJQÇIÇYÉAÇAGQÇAÇQÇI‡ZZIYÇIÇYÉYÇIÇZIYÇIÇQÇAGYÇQÇAGQÇQÇQÇbZJZI9EA&A†A†AGAÇAG@ä8ã@åHä8ä8Ä8äHä8ä@åY†R‹HäHäHä@ä@ãHä8äHä8ã8Ä@åI$QEbŒA&AE@ä@ä0Ä8äAE@åHäAE@å@åQ…QEQEQEQEQEA&I$A&I$A&@åIE@åIEQEjÍI‡8Ä@å8ä9E8ÄA$8ÄA$8ÄIE8ä@åHä8ä8Ä8ãHä8äAEZJI†HãI$@äHä@äHä@ä0ÄHä8ã@åI$jR -8ãAE@ä0Ä8ä@å@åAEHä@åHäIEQEIEQEQEI$QEA&I$QEA&@åAE8ÄIE@åj‰bŒ8Ä8ä9E8ÄIE8ä8ÄA$HäHä8äHäI$8ã8äHä8ãHäI†ZJHä@äHäA#HäI$Hä8ãA$8äI$8ÄI$ZJA†Hä8Ä8äA$8ÄAE@åAE@åI$IEQEA&HäQEQEQEQEA&QE@åAEAE8ÄIE@åQEk-R@åA$9E8Ä9E@å9E@å8ä9E8ÄHä@äI$0ÃHä8äHäHäbIAGHäHäHä@äHãI$8ãHä8äHäA$@äZIÇ@å@å8ãA$8ÄAE8äAE@åIEIEIEQEA&QEQEQEQEA&QEA&HäAE8ÄIE@åA†jIbŒA&@å8ÄA$@å@å8ã@åHäHäA$8ãHä8äHä8ãHäHäY…R‹HäHäA$HäI$I$Hä8ãHäI$0ÃAEI$jŠ@å8ÄA$8Ä9E8ä8ÄAEHäAEIEI$A&I$QEQEQEA&I$8å@åAEI$@å8Ä9EQEAGjËYÉ8ÄA$8Ä9E@å8ä8ÄA$8Ä0å8ã@åHä@äHä8ã@äHäI$ZJA†HäHäA$HäI$@ãHäA$8äHäA$HäZR8ÄA$8ÄA$8Ä9$@åA$AEI$QEA&@åIEHäQEQEA&@åHäA$A$IE8Ä9EA&HäbIbŒ8ãAE8Ä9E8äI$8ã8ÄHä8ä@ãHä8ä@ãHä@ä@ãI$I†bŒHäI$HäI$I$I$I$I$8ãI$HäI$@åYÉ9$8ÄA$8Ä0ä9$0Ä@åI$@åIEI$A&I$@åI$QE@åQE8ÄI$@å@åAEHäAEI$YEjÍAÇ0Ä0ä8ä@å8Ä8ä9E8Ä9E8ä8ÄI$@ã@äA#@äHãI$HäRŠI‡HäI$I$I$I$I$I$8ãI$8ãIE@äQÇAG8ã8ÄA$(ä8Ä0äAE8ÄI$A&I$QEA&HäQEI$QE@å@åI$8ÄAE@å@åI$QEQEZbŒ0Ä0ä0ÄA&8Ä8ä8ÄHäHä@ä@ã@äHã@ä@ã@äHãHäQ…jŠ8ÄHäI$@ãI$I$HäI$HäA$I$8ãIEQE9E8ã8ÄA$8ä@åI$AEI$QEQEQEQEYEQEQEQEQEQEQEQEI$I$QEA&I$AGHäjŠI‡8Ä8ä8Ä9$8Ä9$(ä8Ä8ä0ÄA$8äHä@ã@ä@ãHäHäHäjIJ@ãHä@äI$HäI$I$HäI$HäHäI$A†IE8Ä8äHä0ÄAEHäHäIEI$QEQEQEQEQEQEQEQEQEHäQEQEI$QE@åIEQEQEYÉZJ8ã@å0Ä8ä9$8ÄA$8äA&A&I$A&QEA&8Ä8ä@ä8äAGbŒJQEA&I$QEI†Y†A&AEIEIEIEAGbI‡I‡AG8Ä8ã@åAEI$A&I$Hä@åA&QE@å@åHäQE@åHäQEA&A&@åQEA&QEI‡k/bJ9&0æ9$1†(ä(Ä0å0åAGAÇAGAGAGQE8å8Ä@ä0äAEZJR -AGIEI$IEI†YEA&IEAEIEIEQEYÉJAGI†A&8ã@åAEI$A&I$QE8ÄHäA&Hä@åHäQEA&HäIEHäAG@äQEA&A&A&ZJR‹8æ0æ9$A†(å ä(ÄA&bŒc/k/bŒk/k/bŒZÌZJR‹bŒc/{Ð{.k/k-ƒp‹Î“ЃЃÐ{.ƒÏ“ЃЃЃЃÐk,k/RŠbŒbŒbŒbŒc,ZÌjÍZÌbŒbŒbŒbŒR‹R‹R -R‹bŒk/k/s/{ok/{М“œ“{o{σЃÐk/c,k/ƒosЃғЃσÒc,bŒbŒR‹ZJbŒjÍs/ƒÐk/k-{.“ϋЃЃЃÐ{σЃÐ{.ƒÐ“ЃÐk-bŒZJbŒbŒbŒZÌbŒjÍjÍrÎZÌbŒbŒR‹R‹R -bŒbŒc/jÍk/ƒok/k/k/s/k/c/k/ƒÐZJbŒR‹R‹bY†bbjŠ{oY†IEA&QEAÇIE@åA†AEQEA†AGI†QÇQEAÇI†I†IE@åA$AÇI†QEIEA&AÇYEjŠ{orËjËjÍjËs-jËk/{,jÍ{,jÍ{,k-k-jŠbIZJbbbIjIjŠj‰jŠjŠjËj‰rIjËjËjIb{,bŒQEQEIEA&AGA†9†AE@åIEQEA†AÇI†QÇI†I†Y†IEA&A$AGI†AEAEA†QEI†b{.k-jŠc,jËk-rË{.jÍ{.{,jÍjË{.”0s.rIbIZbj‰j‰jŠjËj‰jŠjËjIbŒQEA&HäHäaÇk/QE@ä8Ä8ä(ä0Ä8ä0ÄHäAE@ä8Ä8ã8Ä8ä8Ä8ä8Ä8ä9$8ÄA$IE8Ä0ä0Ä@åQEjk/aÇQEQEQEQEYEI‡YEaÇaÇI‡a†jÍbŒQEQEI$QEHäHäYEHäYEYEYEYEYEY†QEYEYEYEbŒjŠ@ä8ÄHä0ä8Ä0ä0Ä0ä@äAE@å8ãHä0Ä@ä0ä0Ä8ä8Ä8ä0ÄA$IE8Ä8ä0Ä8äQEYEk/bIQEQEQEQEQEYEI‡Y†aÇYEI‡jI“ÐR -QE@åIEHäQEYDYEHäYEYEYEYEYEY†YEIE@åZjÍQE@ä8Ä0ä(ä(ä8Ä0ä8ÄAE@ä0ä0Ä8ä(ä8Ä(ä8ä9$8Ä8ä9E@å8Ä8ä9$8ÄI$bk/I‡QEA&YEI‡I‡I‡aÇI‡Y†I‡aÇ{.bŒY†AGQEA&QEQEAGYEQEQEYEa†Y†YEAGa†YÉYEbŒbŒHã8Ä8ä(ä0Ä(ä0ã0Ä8äIE@ä0Ä0ä8Ä0ã(ä8Ä(ä8ä9$8Ä8ä9E@ä8Ä8äA$@åY†k/bYEAGQEI‡I‡aÇI‡aÇI‡YÉY†jŠ{oQÇQEQEQEA&QEQEQEQEQEYEI‡YEYEY†A&@å8ÄZk/QE@ä(ä(ä0Ä0ä0Ã8ä@åA$8Ä8äA$(ä8Ä(ä8ä1$8Ä8ä9$@åA$8Ä9$8Ä8äIEbk/YÇaÇYEAGAGY†I‡aÇI‡YÉYEYÉ{,k/QEQEA&AEA&AGQEI†YEAGQEAGa†Y†YÉYEYÉiÇbJbŒHä0Ä8ä(ä8ä(ä0Ä8ä8Ä9E@ä8ä@å0Ã8ä(ä8Ä0å8ä9$8Ä9EA&Hä8Ä(ä8äA$YEk/bJY†I‡YEI‡AGYEI‡aÇI‡I‡Y†jŠ{oYÉQEA&@åA†QEA&I‡QEI‡Y†I‡YEI‡QÇI‡A&@åbc/YE8Ä8ä(ä(ä(ä8Ä0ä8Ä8ä9$8Ä8ä(ä8Ä(ä0å8ä1$0å8ÄA$9E@å0Ã8ä9EQEYÉbŒbI‡I‡I‡YEI‡I‡YEI‡aÇI‡YÉ{,bŒIE0æ(ä(ä(ä0æ1$0æA&Y†AGa†YÉYÉaÇYÉQÇQÇbŒjË@ä@ä8Ä8ä(ä(ä0Ä(ä8ä8Ä8äA$8Ä(ä8ä(ä8Ä1$(ä8ÄA$8Ä9E@å8ã8ä8ÄIEAGjËjYÉI‡YEI‡AGI‡aÇI‡Y†I‡aÇjIƒoAG9E0æ!$(ä(å0å0åA&AGYÉAGAGYÇYÇAG@åI$Zk/YE@ä@ä0Ä(ä(Ä0Ä0ä8ä@å0ÃA$0Ä8ä8ÄA$8ä8Ä8äHä0Ä8äIE8ä8ã8ä@ä@äYÉjËbjaÇI‡I‡I‡aÇYÉI‡YÉI‡a†{,bŒ(ä0å1†Ä å å å(ä(ä8ÄAGAÇY†I‡Y†AGQEIEbŒbŒ@ä(Ã0Ä(ä0ã(ä(ä8Ä0äA$8Ä0äA$8Ä8ä8ä8Ä8äAE@ä0Ä8Ä8ÄIE@ä0ã8äI$QEbŒZJqÇYÉI‡Y†I‡aÇI‡YÉaÇI‡YÉb{o0å0å0æ å å å0æ(ä(ä0ÄQÇ0Ã8äQÇQÇI‡I†A&ZJc/bAG8æ0å0å0å8Ä0å(ä0ã(ä0Ä(ä8ä1$(ä8Ä9†A&1†(äA&A&0æAGAGI‡AGZJbŒI‡AGI†I‡I‡YEAGAGQÇAGQEQE{.k/0ÃA&AGAGAEA&IEIEA&AEQÇZbZJbbJZJJk/k/I‡9†AG0æ0å0æ8Ä(ä8ä(ä0Ä ä(ä(ä8ä(ä8Ä9E8æ0å0å9EA&0æA†A&I‡AGJjÍYÉAÇI†I‡I‡Y†AGAGI‡AGYEA&bƒÒAF9EAGQÇ8ÄA†A&IE9EA&QEAGA†A&{,jÍjËrÍjË{.bŒbŒbŒbŒRŠbR‹ZJbŒc,bŒR‹ZJR‹jŠZJbJbŒR -bŒc,k-k/{Ï{,c,k/jËc,k/c,bJR -R -R -R‹ZJbJZJbŒR‹bŒ{σÐk/c,k-{,jË{.{oƒp{o{,“ЋД2‹ÐƒÐƒÐ{Ï{orË{.{.ZJbŒRŠbŒZIZIbŒR‹c,ZÌZJbJZJbJZJR‹bŒZJc,bŒc,{.{Ï{.k-k-s.jÍjËk-ZÌZJRR -R -R‹ZJbJZJZÌZJs/ƒÏk/k/c,{,jË{.{,{oƒp{o{.“σÐ{.IE@åQEIEQEQEQE@ä8ÄIEIE@åIEQEbZJAGY…YEQEYEY†QEQEAEQ…IEIEQÇbŒZYEAGY†AGQEIEIEA&A†IEAGY†AGQÇYÇYÉQÇQÇI‡YÇbI‡YÉYÇZYÇbbŒbQÇZbIYÇY†YEQEHäYEQEQE8Ä@åIEAE@åIEI$I‡jËI‡Y†Y†QEQEY†QEQEIEIEQ…QEAGZJbIQÇAGY†AGQEIEA&QEA&AGAGI†Y†AGZYÇYÉQÇQÇYÉYÇJYÉQÇYÉaÇZbŒbY†AGA$9E8Ä9E@å@åA&@å8ÄA$0å8Ä9E@åQEQEbc/YEY†YEY†Y†YEaÇY†I†AGQÇIEI‡c,YÉAGAGA&IEA&@åIE@å@å9EA&A&IEQEA&QEA&AGI$A&0å8ÄA†A&AGYEYÉZQEQEA&QE@åQEA&I$A&@å@å8ÄA$8Ä8ä9E@äA&QEYEjÍbYEYEYEY†YEaÇY†Y†I†I†I†AGbŒZJY†A&IEA&@åIE@å9EA&8ÄIEA&A&QEA&QEA&AGQE@å9E0å@åA&QEAGa†bI‡QEA&8Ä8ä8ä8Ä9E@å8äA$0å9$9E@å@åA$9EAGjbŒ@åYEaÇYEaÇY†Y†aÇI‡QÇAGI‡AÇbŒZYEA&IE@å9E@åA&8Ä9EA&A&@åIEA&QEA&AGQEA&A&9E0åAGIEA&QEa†YÉAGYEI‡QE@åA&QE8å@åA$9E8Ä9E0å9E8äIE@åA&YÉjÍAGQEa†aÇI‡YEa†aÇI‡QÇI‡AGA†R -jIAGI†A&IE@å9EA&@åA$9EA&@åQEA&QE9EAGQE@åA†@å0åAGIEA&QEYEYÉI†Y†YEA&@å8Ä9E8ä0åA$0å8Ä9E@å0å9$A&@åIEYÉZÌ8ÄYEaÇY†a†aÇaÇaÇI‡Y†I‡A†JbŒQÇAGQEA&@åIE0åIE@å9E@å9EA&I†A&IEIEA&A&IE0å8Ä9EA&AGI$YEYÉYÉQEI‡QEA&QE8åA&@å8Ä8ä9E8Ä0å@å9E@å0åIE@åI†k-AGQEYEaÇYEiÇYÉa†a†I‡QÇAGA†R -bAGI†A&@å9EA&8ÄIE@å@å9EA&A&QEA&IEA&AGA&@å9E8ÄA†A&IEA&YEZJI‡YEA&@å8Ä8ä(ä@å8Ä9E8ä(ä0å0åA$@å9E8Ä9EbZÌYÇa†iÇjzzziÇjAGQÇA&R -bJQÇA&AG@åIE0å@å9E@å9EA&IE@åA&QEA&A&AGIE@å9E8Ä8äA&IEA&YEYÉbI‡QEA&A&QEA&I$8ÄAE8ä@å(äA$0å@å9$@å8Ä9EAGbŒbY†aÇiÇzziÇziÇQÇAGI†AGbŒYÉA†QE9EA&A&8Ä9E8å@åA&9EIEA&IEA&A&AGQE@å9E0å8Ä9EA&A&YEY†ZJaÇA&A&@ä8Ä8Ä8ä9$8Ä8äA$8Ä8ä8Ä9E8ä9EA&QEYÉZÌI‡QÇAGaÇYÉjYÉa†I‡A&8ÄAÇI‡R -QEIEA&AE@å8Ä9E@å8ä9EA&8ÄIEIEA&QEA&IE@å@å9E@å9†@åIEA&YEYÉZJYEA&YEAGHäQE@å@åHä0ÃIE(ä8ä8Ä9E8ä9EIEA&Y†bŒRI‡I†I‡YÉbjYÉYÇAG8ÄA†A&R‹QÇA&QE@å9E@å8Ä@å9E8ä9EA&A&@åQEIEIEA&A&8Ä9EA&@å9EQEA&QEYEZJYÉQEQE8Ä8äAGA†AGA†9E9E9E9†AG9†A&A&AGAGZJR‹(ä(äÄ £ Ä(å0æÄ0æR -BBc/ZJAG0æA†A&AG0å0å@å0æ8Ä9EAGAGA&A&A&A&A&A&9E8å0å@åA†AGI‡I‡YÉjÍbJYÉYÉI‡I‡AGA&IE8Ä9E8ä(ä(ä(ä0å0æAGA&AGRc-AÇ ÄÄ Ä(ÃÄ0æ(ä åI‡BAÇR -c/AGA&AG0æAG0æ9E0å@å1†8ÄA&AGA&A&A&A&A&A&IE8å8Ä9EA&AGI‡I‡YÉjŠbŒYÉYÉYÉI‡k/jËs/jËbŒƒÐk/bJc,bR‹ZJbJZÌjËk-bJZJbJJZJbŒc/k-{σÐ{.{.{.{,k,k/s,k/c,ƒÒ{.c,c,c/bŒƒÐk/k,s/c,{.c,jÍk/ƒÐ{oc,ƒp{o{o{.{.{o{,{.{.{.k/jËs-jËjÍbŒZJR -R -JR -ZIbŒR‹RŠjÍjËbJR‹ZJR -bJbŒc,k-{.ƒÐ{os.k-{,k-k,s/k,k/{.ƒÐk-bŒk-ZÌ{oƒpc/k-k-s-k.bŒk-ƒÐƒÒbŒ{oƒp{.{.{.{.{o{.{.k-{.Y†Y†Y†AGY†ƒÐjŠ8ÄQEA&@åAEAEQEA&QEAGQÇAGI†AGQÇI†Y†QÇI†QEIEIEIEA&QEQÇY…Y†jŠ“ÐR -QÇQEI†I†AGI†AGQEI†YEY†YɃÐjŠbZQÇYÇYÉY†Y†I‡I†AGQÇY†YÉY†YÇ{,bŒIE@åI$AEI$A&8ãQEQEA&AGI†I‡Y†AGAGQÇI†Y†I‡QÇIEQEA&IEI†QEQEY†Y†ZƒÏk-Y†I†I†I†A&I†I†QEA&Y†Y†Y†k-{.bZQÇYÇYÉYÇaÇI†AGY†I†Y†QEQEY†AGYEk-R -IEI$I$QE@åQEQEA&QEA&QEIEA&QEAGQEAGQEYEA&IEA&IEIEQEYEY†YEjË{ÐbIQEA&QEQEA&QEQEQEA&YEAGiÇk/I†YEAGYEYEQEAGQEAGQEA&I†AGI†YEYEZJbŒHäHäHä8ä@åQEIE@åQEQEA&I$QEA&QEIEAGQEAGQEY†IEIEA&IEI$IEQEY†Y†bƒÐk-I$AGQEQEQEA&QEAGQEQEAGYE{,ZJQEQEYEI‡QEQEA&QEAGQEQEAGQEY†A&QEYEZJR@åQE@åI$QEQEA&I$QE@åIEI$IEA&IEQEQEY†QEQEA&IEQEQEYEY†QÇYEjŠƒÒI‡QEAGQEA&QEA&QEA&QEAGYEYǃÐI‡YEYEYEAGYEYEAGYEI†AGQEA&I†I‡YEjËbJI$@åHä0ÃA$IEI$QE@åIEIEI$QEIEA&IEI$AGQEQEQEQEA&IEQEQEQEY†Y†QEaǃÐZJAGQEQEA&A&QEQEA&QEIEYEYEjÍbŒYEYEYEAGQEYEYEI†YEA&I†QEQEA&QEA&YER -YÉ@åI$I$QEI$QEI$A&HäQEI$A&I$QEQEQEQEYEY†QEQEQEYEY†Y†Y†Y…Y…j˃ÐI‡A&I$A&I$A&QEA&AEA&IEQEa†{obYEYEY†QEYEAGYEYEQEAGIEA&AGQÇjbJbŒI$@ä@å8ãI$I$QEA&QEHäQEQE@åI$A&I$QEQEQEYEY†QEQEQEYEY†Y†Y†Y†Y…bIƒÐZJAEQE8åQEA&QE@åIEA&A&QEYE{,bŒYEY†YEQEYEAGQEYEAGQEA&QEIEQEA&QEI‡jbJ@äIEHãHäQEQEQEQEHäQEQEQEQEQEQEQEYEY†Y†QEY†QEY†YEaÇY…aÇY†bŒ{ÏYÉIEIEA&QEA&@åQEIEA&QEQEaÇjÍZa†YEYEYEYEQEYEY†QEA&QEAGIEY†I‡jÍbŒI$@ä@å8ã@åIEI$QEQEQEHäQEIEHäQEQEQEHäYEa†Y…Y†QEYEY†QEY†aÇY…a†bk/c,I$A&AGI$A&A&AEQEA&IEQEYEbŒbŒY…YEYEYEYEQEYEY†YEAGQEA&@åQEQEYEI‡bJI$@äI$A&QEI$QEI$QEI$@åIEI$QEYEYEYEaÇQEQEYEY†Y†Y…Y…QÇYEQ…bƒÐRA&QEA&A&QE@åIEIEA&AGI$A&c/aÇYEY†YEY†YEYEY†YEQEQEQEIEIEIE@åbŒbŒ@ãHä8Ä@ä8Ã8äI$QEQEI$QEI$I$QEI$QEQEY†Y…Y…Y†IEYEY†Y†Y…Y…Y†Y…QEY†k/k-HäYEA&IEA&I$A&IEA&QEA&A&bIbŒYEY…YEY†Y†YEY†Y…YEQEA&HäA&AGI‡AGZJbŒbŒAG8æA&A&A&AGAGJI‡AGRAGI‡I‡I‡YÉAÇI‡AGAGAÇI‡AGYÉRbZJrËjÍc,ZJA&AGAGA&I‡BAGBAGI‡R‹jÍ{.R -AGI‡AGI‡I‡JI‡YÉYÉJR -I‡JI‡R -ƒÐƒÐbJAGAG9EA&AGA&AGI‡AGI‡BI‡I‡I‡JI‡YÉAGI‡AGAÇAGAGYÉRYÉZJjŠk-c,jÍA&AGAGAGAGJAGI‡AGBR -bŒk/bŒI‡I‡AGI‡I‡I‡I‡YÉJYÉBI‡k/ƒÐƒÐƒÐƒÐ{o{.{pc-ƒÐk/{Ïc/k-{.bŒk/bŒk,k/c/bŒk-{.c/k-{.ƒÐ{os/{σЃσГЌ2ƒÐ{.{.ƒÐƒÐƒÐ{oƒÐƒÐ{Ð{Ð{o“Д0‹Ð“Ð{o{Ïk/“ЃÒ{Ð{ГЃҔ“Œ“œ“œ“œ“”“œ“”“ƒÐƒÐk/k/{.ƒÐk/k/s,k/k/k-bŒc,k/bŒk-bŒk/k/s,k/ƒÒƒÐ{.{Ï{oƒÐƒÏ“ÐŒ0“ЃÐk/{σЃЃÐ{Ѓ҃Ð{Ðk/ƒÐ”2‹Î“ЃÐk/ƒÐƒÐ{ГÐsЃЃҔ“œ“ƒÒA†QEA&AGA†IEAGA†IEAGYÇRŠQEIEIEQEI$IEIEIEI$AEAEY†Y†R -IÇQÇAÇQÇA†IEAGQÇAGYÇYÇRYÇIÇYÇYÇIÇYÉQÇI†I†I†I‡I†I†I†I‡Y†bŒZIAÇA$9EA&A†A†A&AÇIEAGAEA†A†QE9EI†AGQEAÇjŠI‡IEIEQEIEHäIEIEIE@åI$I†aÇRRAÇQÇQÇA&AGAÇQEAÇQÇQÇYÇRQÇQÇYÇQÇQÇQÇAGQÇQEI‡QÇA†I†QÇY†ZZJR9E9EIEA&AÇA&A†@åHä8ã@åHä8ä8ãHä8ä@åY…ZJ@åHäHä@äHä@ãHä0Ä8ãHä8äI$QEjŠA&AE@å@ä0Ä@åA$8ÄAE@åHäAEQEQEQEQEQEI$A&IEQEQE@åIE@å9EA&QE{,AG@åA$@å9E@å8Ä9E@ä8äHä8ÄHä8ä@å8ã@å8äHäAEbIAGHäHä@ä@ãHä@äHä8ãHä8äI$@åbR -8ã@å8ÄA$0ÄAE@å@åAEI$A&I$AGHäQEQEQEQEQEA&IEI$@å9E@åA&IEbIZJ8ÄIE8å8ä9E8Ä8äAEHä8ãI$8ã@åHä8ä8ã@äHäQÇR -I$8ãI$I$8ãI$I$8ã8ÄI$8ÄI$AEZJIE8Ä8äA$8ÄA$8ÄIE8äQEAEI$A&QEA&HäYEAGIEI$A&@åIE@å8Ä9EA&YEk-YÉA$8Ä9E8ä9E@å8Ä8äAE@ãHäHäHä8äHä8ã@ä8ãI$ZJA&HäI$HäA#HäI$8ã8äAE@ä8ãHäbIÇ@åAE8ã@å8ÄAE8äAEI$A&I$QEA&QEQEYEA&QEA&I$A&I$A&8ÄIE@åIEbIjÍ8ÄIE0å8äIE@äHä@äHäHä8äHä@ã8ä@ãHäHä@ãY…R‹8ãI$@åHäI$I$8ã@åA$HäA$8äQEZJ8ÄAE8ä8ÄA$8ÄA$A$9E@åIEQE@åI$QEQEQEA&I$@å@åAE@åAE8ãIEQEQEjÍI‡8ÄA$8Ä9E@å8ä9E8ÄHä0ä8äHäHä8ä@ãHä@äHäI$ZJAGI$I$HäA#I$HäHäA$@äHäA$@äbR8Ä8ä8ÄA$8Ä8äA$8ÄIE@åQEA&I$QE@äQEQEHäA&@å@åAE@åA$8ÄIEQEbZÌ8ÄA&8ã@å8Ä8ä8ä@åHä8ä@ã@äI$@ãHä8ä@ãI$QEbŒ@åI$A#HäI$I$I$I$HäA#HäI$@åR8Ä8äI$0Ä0ã9$8Ä8äIE@åIEI$QEA&HäI$QEA&I$@åHäHäAEHä8ÄQEA&QEjËI‡0Ä0äA$8Ä8ä9$8Ä8äHä8äHä8ãI$8ã@ä@ã@äHäI$jŠAÇHã@åI$I$HäI$I$HäA#8äI$HäIÇAG8ãA$8Ä0ä9$0ÄAE@åIEI$A&HäQE@åQEHäQEA&HäHäI$8ÄIE@åAEI$QEbbŒ0Ã8ä8Ä9$0åA$8äHäHä@ä@ãHä@ã@ä@ã@äHãHäIEbŒHä@äI$I$HãI$I$HäI$HäI$8ãI$I‡A$8ä8ÄA$8ä@åAEI$QEI$QEQEQEQEQEQEQEQEQEQEQEI$I$QEA&IEQEHäbŒI‡8ãA$(ä8Ä9$8Ä9$@åHä@äHäHä@äHãHä8äHãHäHäZJI‡Hä@äI$HãI$I$I$8ãHäI$HäI$QE9†@ä8ã8ÄA$8äAEHäIEHäYEQEQEYEQEQEQEQEQEQEHäQEIEHäIEQEQEQEYÉZJ8Ä8ä8Ä(ä8ä8Ä8äHäA&IEA&A&QEA&@å8Ä@ä8äAÇbŒYÉAGIEIEQEQÇY†IEIEIEA&QÇQEZJRI‡AGIE8ÄA$A&I$A&I$Hä@åA&A&Hä@å@åQE@åHäQEA&A&A&QEA&A&I‡ZJJ(Ä(Ã8Ä0ä(ä8Ä8ä@ä8ã@ä@ãHäHäHä8ä@ãHäHäI$RŠbŒA&QEIEAGY…QÇQEA&QEAGQEAGZIYÉI‡I‡IE8Ä8äQEA&HäIEI$@å@åIE@å@å@åI$A&I$QEA&QE@åA&AGA&A&R -R‹8æ0æ9EAG(å(ä(ä0æZÌk/k/rÍ{.k/jÍR‹R -bŒZÌc/ƒÐ{.k,{.ƒÐƒÐƒÐƒÐƒÐ{σЃЃÐ{.{Ï“Ðs.c,bŒbŒbŒbŒc,jÍjÍc.jÍc/jÍbŒbŒbŒbŒR‹bŒjÍc/{.{oƒpk/k/k/s/k/bŒZÌR -c/k-bŒbŒbŒjŠZJbŒ{,{.jËjŠZJR‹jŠc/{.ƒÐk,k/{.ƒÏ“ЃЃσÐ{σσσÐk/ƒÏƒÐk,ZÌbŒbŒbŒZÌk-bŒc/c,c/jÍZÌbŒbŒbŒR‹R‹bŒc/k/ƒo{p{os/k/k/{Ðk/k/“ÐZÌR‹ZÌZÌbQEaÇYÇjIƒoA†QEIE9EAGAEHäA$9EQE9EIEAGQEAGQEA†QE@åA$9EI†AGAE@åAEAEQEjŠk/jËbŒjŠjËjËrÍjËk-jËrÍjËjËc,k/jIbZIQÇbj‰jIr‰jIjËjËrËjŠ{,jËjIjIjŠ{,ZJIE@åIEA†IEIEA$@åA$A†IEIEAGA†I†AGIEI†A&AEHä9†QEIE8ÄA†AEQEb{.k-j‰rËjËjËjÍrË{.jËjÍjËrË{.Œ2{,bIZZbjIbIjIj‰rIjŠjŠjŠjIY†@åIEHäbk-QE@å8Ä8ä0Ä0ä0Ä0ä@åIE@ä0ÄHä0ä8Ä8ä(ä8Ä8ä8Ä8ä@åAEHä0ä0ÄAEHäjIk/YÇQEQEQEQEQEI‡Y†aÇY†I‡a†jÍbŒY†A&I$QEHäQEYEYEQEYEYEYEYEYEYEYEYEYEjAG8Ä8ä8Ä8ä0Ä8ä(ä8Ä8ä@åAE8ã@ä@ä0ä@ä0Ä8ä8Ä8ä8ä8ÄIE@å8ä8Ä8äQEYEk/bYEQEQEQEQEYEI‡Y†aÇI‡a†jIƒÒYÈHäI$QEQEHäHäYEHäYEYEYEYEYEY†AGI$A&iÇjÍAGHä0Ä0ä0Ã(ä0ä@ä8ä@å8ã8ä8Ä(ä8ä(ä8Ä8ä1$8Ä9$@åA$8Ä8ä8Ä8äQEjk/I‡QEQEAGYEI‡aÇI‡aÇI‡aÇYÉ{,bŒY†AGQEA&QEQE@åQEQEYEYEY†a†Y†Y†YÉa†YÉbI‡@åI$8Ä8ä!$0Ä(ä8ä8ÄIE8ä0Ä8ä(ä0ä0Ä8ä(ä8Ä8ä9$9E8Ä@å0ã9$8Ä@åY†k/bAGAGQEI‡YEI‡aÇI‡aÇI‡aÇjŠ{.YÉQEAGQEA&QEQEYEAGYEYEI‡YEY†Y†A&@å8ÄZbŒY†8Ä0ä0Ä(ä0ã(ä8Ä8äIE8ÄA$8Ä(ä8ä8Ä(ä9$8Ä9$8Ä9EA&8ã8Ä8ä9$@åZ{.YÇaÇI‡YEI‡I‡YEI‡aÇI‡I‡a†{.k/QEQEA&AEA&AGQEI‡A&I‡QEAGaÇYÉaÇYÉYÉYÉjI‡@å8Ä9$0Ä0ä(ä0Ä0ä8Ä9E@å8ã@å0ä8Ä(ä8ä0å9$8Ä8ä@å9E@å8ã8Ä9$@åQEk/bJa†Y†I‡A&I‡I‡aÇI‡aÇI‡Y†jŠ{oI‡QEQE@å9EAGAGAGQEY†I‡YEI‡aÇQÇI‡A&@åbk/Y†@ä0Ä0ä(ä(ä8Ä(ä8ä8Ä8ä9$8Ä(ä8ä(ä0å8Ä(ä8äA$8ÄIE8ä8Ä(ä@åIEYÇk-YÇYÉYEI‡A&I‡I‡aÇI‡I‡aÇYÉjËbŒA$0æ(ä(ä(ä0æ(ä9EA&YEAGa†YÉYÉYÉZYÉQÇZJYÉHä0Ã(ä0ä0Ä(ä0ä(ä8Ä8ä@å8ã8Ä8ä(ä8Ä(ä8ä(äA$8Ä9$9E@å8Ä8ä(äIEQEjÍbYÉY†I‡YEI‡YEI‡I‡I‡Y†YÉjIƒoAG9E0æ!$(ä å8Ä9EA&AGYÇAGA&ZYÇAGI$@åZk/QEHä0Ä0ä0Ä(ä0ä0Ä8ä@å8ã0ä8Ä8ä8ä8ÄA$8Ä8äA$0Ä8äA$8Ä8ä8äHäHäYÇc,jYÉYÇI‡aÇI‡I‡YÉaÇI‡aÇaÇZJbJ(ä9E0æ å å!$ å(ä(ä8ÄA&AGbYÇYÉYÇYÉYÇZJR@ä ã0Ä0ä ä0Ã(ä@ä0ä8äHä0ÄA$0Ä8ã8ä8ä8ÄA$8Ä0ä0Ã@åI$0Ã8ä@åHäIEbŒbIiÇYÉI‡I‡I‡I‡YÉaÇYÉI‡aÇbk/9E0å0æ å å å(å å!$0ÄA†8Ä8äAÇQÇI‡AGI†ZJs/R -AGAG9E0æ0æ9$0å(ä0Ã(ä(ä8ä1†(ä8Ä0æ9EA†8æ0æAGAGA†AGAÇI‡I‡R‹bŒI‡AGAGQÇAGI‡Y†I‡AGAGA&QE{.k/(äIEAÇA&A&AGQEA&I†IEYÉYÇJZJbbJbIR -{.bŒAÇI‡AG0æA&1†(ä0å8Ä(ä0ä!$0Ä0æ1$0æ(ä9EA&A&0æ9†AGAGAGAGI‡I‡R -ZÌR -I‡AGQÇY†AGI‡Y†AGAGQEA&bƒÒAF9EAGI‡IEA&AGA†QEIEAGI‡AÇI†{,{,jÍjËrË{.jËZJbŒjŠZJR -bJZIZÌk/bJbŒZIZJbJbŒZIbŒR‹bŒjËc,k/{.k,k/rÍc,jËk-rÍRŠbR -R‹ZJbJR -bŒbŒZJZ̃Ð{.{Ïc/{,{.j˃os.ƒÐ{oƒp{oƒÐ{oƒÐ{o{.{.{,{,{,k-bJc,jŠZJR -bR‹ZJc/bŒZJR‹bZJbŒbJRŠbŒRŠk-bŒk,ƒÐk-c,k-c,jËk-rËbŒZIR -R -R‹ZJR -R‹bŒZJbŒk/ƒÐ{os/c,{,jÍ{,{oƒp{oƒp{o“Ïs.ƒo@å9EI$QEQEQE@ä@åHäA$9E@åIEQEbZJA†YEYEQEQEYEQEQEIEQEIEQEAÇbŒZY†AGQEAGI$A&QEA&IE9EAGAGQEQÇQÇYÇI‡QÇI‡QÇQÇI‡QÇYÉQÇYÇbZJY†Y†YÇYEAGIEI$QE@å9EI$A&Hä8ãA&AE@åAEQEY†bŒI‡Q…YEQEQEYEQEYEIEIEQ…IEQER‹bQÇAGYEA&QEIEIEIE9EIEA&I†AGY†QÇQÇYÉQÇI†QÇQÇYÉI‡YÇQÇYÇYÉjŠbQEAG0Ã9E8Ä@å9E@åA&@ä@å8Ä9$0åA&8ÄQEQEbc/Y†YEa†YEaÇYEYÇY†Y†I†AGAGIÇk-YÉQEA&A&QEA&A&@åAE@å9EA&I$A&QEA&QEA&AGAEA&8Ä0åA&QEAGYEYÉZYEI‡QEA&QEQEA&@åAE@å@åA$8Ä9E8ä@åA$@åQEI‡{,ZY†YEY†YEaÇY†YÇY†I†AGQÇA&bŒZJI‡QEA&A&IE@åA&@å9E@å9EA&QEA&QEA&QEA&QEA&0å0å9EA&AGYEYEbI‡YE@å0å8Ä8ä9E8Ä@å@å9E(ä@å9E8ä9EA&@åI†ZJbŒHäYEYÇY†Y†Y†Y†aÇI‡QÇI‡AÇAGbŒbIEA&IEA&8ÄIE9E@å@å9EA&IEA&AGQEA&AGQEA&A&@å9EA&A&QEAGa†YÉAGYEAGQE@åA&QE@å@åA$9E8Ä9E0å@å9$9E@åA&YÇjÍA&YEY†aÇY†YEa†aÇI‡Y†I‡I‡9†ZJbAGAGIEA&A&8ÄIE@å9EA&A&A&@åQEA&QEA&I†A&A&9E@åA&A&QEAGYEbI‡YEI‡@åA$8Ä(ä@å9E8ä8Ä(ä9E8å@å9E@å9EA&bZJIEQEa†Y†a†aÇaÇa†aÇAGI‡A†AÇZJYÉIEA&IE@åA&9E8åA&8ÄIEA&A&IEA&IEA&QEA&A&9E8Ä9EA&IEA&YEaÇYÉYEI‡A&YEAGQE8åA&8Ä8ä0å8Ä(äIE0å@å9E@å9EI‡jÍAGQ…YEaÇY†aÇaÇa†aÇI‡I‡AG9$R‹bAGQEIE@å9E@å9E@å9E@å9EA&QEA&IEA&A&I†A&@å@å1$A&AGAEQEI‡jI‡I‡I$0å8Ä8ä9$0å8Ä0å9E8ä0å@å8Ä9E@å8äIEYÉZÌY†YÇiÇjzzzzYÉY†AG9†AÇZJI‡QEA&A&9E@å@å9E@å9E@åA†@åA&IEA&A&AGIE@å0å8Ä9$A&A&QEA&a†ZJI‡QEA&A&AGQEA&@åA$8Ä9E8ä0å0åA$0åA&8ÄIEAGbŒbY†iÇa†zzzziÇI‡QÇAGI‡bŒIÇAGAGA&IE@å9E@å@å9EA&A&A&A&QE@åAGIEA&@å9E0å8Ä9EA&QEA&YEZJYÉQE8å@ä8Ä8Ä8ä8Ä9$8Ä8ä0Ä8ä8Ä9E8ä9EA&QEYÉbŒAÇI‡AGY†YÉjYÉY†Y†0å9E@åR -R -QEA&IE@å9E@å8Ä9E8ä9EA&8ÄIEIEA&QEA&IE8Ä9E@åA$9EA&A&QEYEYÉbŒQEQEA&YEA&A&QE@ä8Ä8äAE0Ä8ä8Ä9E8äA$9EQEI‡ZJR -QÇAGQÇI‡jYÉaÇI‡QE(å9EI‡R‹Y†IEA&@åA$@å0å9E8Ä@å9E@åAE@åIEQEIE@åA&9E@åAE8ÄA&IEQEA&a†ZJYÉQEQE8Ä@åAGAGAÇAÇ9EA&AÇA†AÇAG0æAGAGAGR‹ZJ å0Ä ä£Ä0æ0æ!$AGBR‹R -c/R‹AGAG9†AGAG0æ0æ9E@å8æ0æAÇAGAGAGA&A&AGAG@åIE0å8æAGI‡YÉI‡YÉjÍbJYÉbR -I‡I‡A&8æ9E0æ(ä(ä(ä(äA&0æAGA†AGI‡c-AÇ Ä ä ä Ä(å0æ å0æJR‹BBbŒAGAGAGAG9†AG0å@å9E0æ0åAGAGAGAGA&AGA&AGIE0å9E@åA†AGI‡YÉY†bŒbŒYÉYÉYÉJk/jËs/jËbŒƒÐk/bIbŒZIR‹ZJbJc,bŒjËbJR‹ZJbJR‹bŒk-c,{oƒpk-k-{,{,k-k-s.k/jË“Ð{oc,c/c,k-ƒÐk/k-rÍk.k/jËc,{.ƒÒ{Ðk/{.{o{.{.{.{.{.{.{.k-{.k-bŒjÍc/ZJR -bJR‹R -bŒc,ZJbJZÌbŒjËbŒZJR‹bŒbIZÌk-jÍs,ƒÐ{.{,{.{.k-k-s.k-k-k/ƒÒk,c/k-bŒ{σÐc,k/k-s-k.bŒk-ƒÐƒÒk.{.ƒÐ{o{.{.{.{o{,{.k/{.QÇQEY†YEY†ƒÐRŠ@åIEI$A&@åAEIEIEQEI†AGI†AGQEI†I†I‡Y†I†QEA&IEQEIEIEQEY†QEjË“ÐR -QEAGQEAGAEQEIEIEI†QEYEYɃÐjIbYÇQÇYÇYÇY†QÇQEAGQÇQEI‡QÇQEj{.QEA&IEQEQEA&IE@åAEQEQEA&QEAGY†AGQEAGQEQÇQÇI†QEA&QEA&IEIEQEYEQÇaǃÏbŒY†AGQEAGAEQEIEIEA&QEY†Y†jÍ{.bQÇI‡Y†bY†I‡QEI†I†QEY†QEQEYEAGY†jÍbIEA&I$I$IEQEQEA&I$A&QEQEA&I†YEI‡QEAGQEA&QE@åAEI$AGYEY†Y†jŠƒÐbAGIEQEQEIEAGQEQEA&YEI‡iÇk/I‡QEQEY†A&QEY†A&I†QEA&AGA†QEQEjjÍA&HäI$A&I$QEI$A&I$QEA&QEA&IEQEIEA&I†YEA&Y†AGQEIEA&IEI$IEQEY†Y†aǃÐk-QEAGI$AGQEQEAGI$AGQEYEYEk/bJAEYEQEYEA&Y†QEA&I†AGQEYEQEY†A&QEYEZJJI$QE@äQEHäQEA&I$QEQEA&I$QEA&QEQEQEQEY†QEA&IEQEQEYEaÇY…QEj˃oI‡QEAGI$A&QEA&QEA&QEAGHäaǃÒQÆYEQEYEAGQEYEY†AGQEA&I†QEA&YEZJZÌQEHä@åI$A&HãQEQEI$A&I$QEI$IEA&I$IEA&QEYEI†YEQEIEA&QEQEQEY†Y…QEbƒÐZJQEAGQEA&IEQEA&QEA&QEAGYE{,bŒYEYEY†AGQEYEI†QEYEAGQEAGQEIEAGQEA&ZJYÉA&I$I$I$QEQEQEQEQE@åIEI$A&I$QEQEQEY†QEQEQEQEYEY…aÇY…Y†Y…k-ƒpI‡QEA&IEA&QEA&AEI$A&QEQEYÇ{oYÉYEYEQEYEY†YEQEYEAGQEA&I†AGAGZjÍQE@ä@äHäIEI$HäQEQEQEQEA&I$QE@åQEA&QEQEQEYEY†QEQEQEQEY…aÇYEaÇY…b{ÐZJIEIEA&I$A&QEA&IEA&IEQEQE{,bŒYEYEQEYEYEYEYEYEAGQEA&QEIEQEA&QEYER -bI$HäI$QEQEHäQEQEHäI$QEQEQEQEQEQEYEY†Y†QEY†YEY†YEY†Y†aÇY…jŠ{ÐYÉIEIEA&QE@åIEA&IEA&QEAGa†k/aÇY…a†YEQEQEYEY†QEQEA&I†YEAGQEZJs/I$@ä@äHäI$HäHäQEQEQEHäQEI$QEI$QEQEQEHäYEa†Y…Y†QEY†YEY†YEaÇY…Y†bk/c,QEA&QEA&IE@åIEA&IEA&QEQEjËbŒYEY…YEYEY†QEYEY†QEAGQEA&A&I$QEQEYÉjJ@å@å@åHäIEQEI$QEQE@å@åIEHäQEQEYEYEa†QEQEY†QEY†QEaÇQ…QEYEZIƒÐRA&QEA&@åIEA&@åQEIEA&QEIEbŒYÉYEYEYEY†YEYEY†a†QEQEQEA&QE@åZk/QE@Ã@ä@äHäI$AEI$QEQEI$QE@äI$A&I$QEQEYEYEY…Y…QEQEY†QEY†Y…Y†Y…QEQÇk-jÍHäAGI$A&IEA&A&AEI$AGQE@åZJbJYEYEY†YEYEYEY†YEY†IE@åHäA&I‡I‡I‡ZJbŒbŒAGAGA&AGA&AGAGJI‡I‡RI‡JYÉI‡YÉRAGRAGI‡I‡I‡YÉZIZJjŠjÍjÍc,bJ9&AGAGI‡BBI‡BI‡BbŒjÍk/bJI‡I‡I‡I‡JI‡YÉJR -R -bJR -bJZJs.ƒÑbYÉYÉJAGAGA&AGAGAGI‡BI‡I‡JI‡YÉJYÉYÉAÇI‡AGI‡I‡I‡RYÉR -bJjË{.c,jÍAGAGI‡AGAÇBAGI‡BI‡R -jÍs/k/I‡I‡I‡I‡I‡R -I‡R -YÉR -R -Jk/ƒÐ{Ð{oƒpƒÐ{.k/k/{Ïk/{Ïk/k/s-jÍbŒk-bŒk-c,bŒk-k/s/c,{o{ЃÐk/{Ï{σÐ{o”0“σÐ{.ƒÐƒÐƒÐƒÐ{oƒÒƒÒƒÐ{o{.“М“ƒÐ{o{Ï{.ƒÐƒÐƒÒƒÐ{σ҃Д“œ“”“‹Ðœ“œ“œ“ƒÏƒÐk/{Ïk/k/{Ïk/k/s,k/jÍc,jÍbŒk/c,bŒbŒk,k/s/{σÐ{oƒp{Ïk/ƒÏƒÏ“ÐŒ0“ЃÐk/{σЃÐ{oƒÒ“Ѓ҃Ñk/ƒÏ”0‹ÐƒÏƒÐk/ƒÐƒÐƒÐ{ЃЃÐ{Ï”“œ“ƒÐIEAEIEIEA&IE9EQE9EI†QÇbŒAEHäI$IEI$AEHäIE@åI$AEY…QÇYÉAÇI†I‡AGA†IEAGA†QEI‡YÇIÇQÇI†QÇY†I‡QÇQEI†AGQEI†A&A†I†Y†Y†ZJR -A†9$9E9EA&A†8ÄA†AEAEAEQEAGIE9EQEIEIEAGbIR@åI$IEIEHäIEHäIEHäAEQEbI‡RAGAÇAGA†A†AGA†QEI‡QÇQÇQÇQÇI†QÇY†I‡QÇQEAGQEQÇA&A†QEAGQÇbZJAÇ@å9E9E9EA&9EIE@åHä8ã@å8ä@å8ã@åHä8äY†ZJHäHäI$8ãHä@äHä8ã8äHä8ãAEYDjŠA&A&8ã8Ä8ä8ÄAE@åAE@åHäAEQEQEQEQEQEHäQEIEQEA&I$@å9EA&A&QEk-I‡8ÄIE8å8äIE0åAEHãHä@ä@ä@ä@ä8ä8Ä8ã8ä@åIEbAGI$HäHä8äHä@ãHä0ÄHä8ãHäI$ZR -8ãAE@ä0Ä8ä@åAE@åI$8ÄQEA&QEQEQEQEHäQEA&IEIE@åAE@åAEIE@åj‰bJ8åA$@å8Ä9E@ä@å8äHä8ã@åHäHä8äHä8ã@äHäI†b8ÄI$HäI$HäA#Hä8äI$8ã@å@äI$ZJIE8ÄAE8äAE8ÄAE@åHäAEIEI$A&I$A&YEQEQEIEA&A&@åQE9E8ÄIE@åQEk-YÉ8ÄAE8ä9E8ÄA&Hä@ä@ä8ä@äHäHä8äHä8ãHä8äI$ZJAG@ãI$Hä@äI$I$8ãA$8äI$0ÃI$ZR8Ä@å8ãIE8ä8ÄAE@åAEIEI$A&I$A&QEYEYEIEA&I$IEA&AE8ÄIE0åQEbIbŒIE@å8Ä9EA&Hä@ä8äHäHä8ä@ã@ä@ã8äHã@äHäQÇZJ8ÄI$I$8ãI$I$HäA$8äHäA$HäI$ZJ9E8ÄA$8Ä8ä8ÄA$8ÄAEHäAEQEA&I$QEHäQEA&QE8Ä@åI$A$@å8ÄIEIEQEjÍIÇ8Ä8äA$@å@å8Ä8ä8ä8ãHä@ä8äHä8ã@äHä@ãHäI$ZJAGI$HäI$I$HäA#Hä8äHä8ãAEHäbI‡8ÄA$8Ä8ä9$8ÄA$8ÄAEI$AGI$A&HäQEI$A&QE@å8ÄIE@ä@åA$8ÄQEQEbZÌ8Ä8äA$@å8Ä8ä8ã@åHä8ä@ãHäI$8ãHäHä@ãI$QEbŒI$AEHäHäI$I$I$I$8ãAE@äHäI$R@å8ÄA$0Ä9$8Ä9$8ÄAEI$QEA&I$QE@åI$QE@åI$@åI$A$A&AEHäAEQEQEjËI‡8Ä(ä8ä9E8ÄA$8ÄAEHä8äHäHä@ä@ã@ä@ã@äHäI$jŠAÇHäI$8ãI$I$I$I$AEHäI$HäHäQÇA†8Ä8äA$0Ä0äA$8ÄAEI$QEA&HäQEQE@äQEQE@äQE@åHäAEI$8ÄIEIEQEYÉbŒ0Ä8ä8Ä9$9$0åHä8äHä@ä@ã@ä@ãHä8ã@äHã@äIEjŠ8ÄHäI$I$@ãI$I$I$HäI$HäI$I$AÇ8ÄA$8ä8Ä8ãAEHäIEI$QEQEQEQEQEQEQEQEYEQEQEQEHäIEI$QEQEA&HäbŒAÇ@ä0Ä8ä8ä8Ä9$8äHä8ãHä@ãHä@ãHä@ã@ä@ãHä@ãjŠI‡@äHäI$@ãI$I$I$HäHäI$A$A#QEA&8ÄA$8ä8ÄI$8ÄIEI$QEQEQEQEQEQEQEQEQEQEQEHäQEHäIEI$QEQEA&YÇZJ@ä0Ä8ä(ä8Ä0ä8ãHäAGAGY†I‡I‡AGAGA&A&A&YÉc/R -QEIEA&IEQEA&AG@åAE8ÄIEA&ZJRAGAGI†@å@åIE@åIEI$A&HäA&A&@åA&HäA&QEA&QEI‡I‡A&I‡I‡AGYÉZÌR -AGAGAGAG1†AGAGI‡AGAGYEAGI‡YÉA&A&A&A&I†bŒbŒI†A&IEQEA&QEA&IE8Ä9EA&I$YÉR‹A†AGI†A&8ÄQEIEA&I$@åQE8æA&@å@åA&HäAGQEA&YEI‡AGI‡I‡AGI‡bŒbŒAG1†AGAG9†0æAGAGc,{os/{.{oƒpc/bŒZJZÌk/{.{Ïk/k-rË{.ƒÐ{Ï{oƒp{m{oƒpsÏ{.{.ƒÏ{.k-bJc,bŒbŒk-jÍs/k/jÍk/rÍjÍc/bŒbŒbŒbŒc/{oƒp{oƒp{o{oƒp{o{Ðk/ƒÐƒÒƒÑƒÒƒÑ{Ð{oc/k/s/jÍbŒc/bŒZJZÌjÍk/ƒo{.k/k-k-ƒp{Ï{o{.ƒÐ{.{o{Ï{.{.{oƒp{.jŠZÌbŒbŒbŒk/k/c/k/s/jÍjÍjÎc/bŒbŒbŒc/k/ƒo{p{oƒÒk/ƒok/ƒÒ{Ðk/ƒÒk.c/c/c/YÇYEaÇaÇZJ{.QEI$IE8ÄIE8äA$8ÄAEQE8äA†IEIEQEIEIEIE8ÄAE8ãI†QE8Ä9EA&AEQEjŠ{.bŒj‰jŠbŒjŠjËjÍrËjÍjËbŒjËjÍbŒjŠZYÉbbZbIjIbIjIbIjIbIbIjbJjbŒZ@åIEHäQEQE@åA$A$8ÄAEAEI$A$IEQEA†QEIEIEA&@å8ãA†IEAEHäA$9EQEYÇ{obŒj‰jŠjŠjËbŒjËjËrÍjËjËjËrÍŒ2{.bYÇYÇYÉbbj‰jIbj‰bIjIrIY†A&@äI$YÉjÍQE@ä@ä8Ä(ä8ä(ä8ä@åIEHä0ÄHä0ä0Ä8ä8Ä8äA$8Ä8ä9EA&8ã8Ä8ä@åQEb{.Y†QEA&QEQEYEI‡Y†aÇI‡Y†a†{.c,A&QEHäQEHäQEYDQEHäYEYEYEYEYEI‡YEYEI‡YÉI$QEA&Hä0Ä0ä(ä8Ä8ä8ä@åAE@ä0Ä8ä8Ä8ä(ä8Ä8ä8ä8ã8ÄQE8ä8Ä8ä8ÄQEYEk/bIQEQEQEQEQEI‡YEaÇI‡Y†Y†jŠ{obQE@åQEI$I$QEYEHäYEYEYEYEQEY†AGI$@åbbŒY†8Ä8ä0Ä(ä(ä8ä8Ä8äAE0Ä8ä8ä(ä0Ä8ä(ä0å8Ä0äA$0åAEHä0Ã9$8ÄI$jk/QÇYEAGQEI‡aÇAGY†YÉY†YÉaÇ{,jÍAGQEQEA&QEQE@åQEYEQEQEYEI‡YEa†Y†QEAGZHäQEI$I$(ä8Ä0ä(ä(ä8ÄIE8ä0Ä8ä8Ä(ä8ä(ä8Ä8ä9$8Ä9$9E@ä8Ä9$8Ä@åY†k/bYEAGA&YEI‡aÇI‡aÇI‡Y†YÉjIƒoI‡YEA&QEA&AGQEQEQEYEI‡YEYEI‡Y†A&@å8ÄZk/YE8Ä8ä(ä(ä0Ä(ä8ä8ÄIE8ä8Ä8ä8Ä(ä8ä(ä9$8Ä9$8Ä9E@åHä(ä8ä8ÄIEbc/YÉY†I‡YEI‡AGY†aÇI‡aÇI‡aÇ{.jÍQEQE@å9EA&AGAGAGQEQEAGQEI‡YÉY†YÉYEYÉb@äQEHä8Ä(ä8ä(ä(Ä8Ä8äA&8ã@åA$0Ä0ä(ä8Ä1†0Ã8ä9$0åIE8Ä8ä(ä8ÄIEQEk/bJY†I‡YEAGI‡YEI‡aÇI‡YÉYEjŠƒÒI‡YEA&IE9EAGQEA&I‡YEI‡I‡YEI‡QÇY†@å9Ejc/YE8Ä8ä(ä(ä(ä8Ä0ä8Ä8ä9$8Ä9$(ä8Ä(ä8ä1$8Ä0å8äA$IE8Ä8ä8ÄA$A&YÇjÍiÇI‡aÇI‡AGYEI‡I‡aÇI‡I‡a†jÍbŒA$0æ!$(ä å0æ9$0åA&AGYEAGYEI‡YÉI‡AGZZJHäI$@å@ä0Ã(ä(ä(ä8ä(ä@å8ä8Ä8ä8Ä(ä0ä8Ä(ä8ä8Ä8ä8ÄIE8äA$8Ä8ä9EQEjÍbjI‡I‡YEI‡AGaÇI‡I‡Y†YÉjƒoAG9E å(å(ä(å0æ9E0åAGbA&AGZQÇI‡A&Hãbc/YE@ä@ä0Ä(ä(Ã0Ä0ä8ä@å0Ã8ä8ä8ã8Ä8ä8ä8ÄA$8ä0Ä8ã@åHä0ä8ã8äI$YÉbŒaÇbI‡I‡aÇI‡I‡YÉaÇI‡YÉY†jŠR -(ä9E8æ å å!$(å!$(ä8ÄA&A†AGY†I†I‡YÇbR -0ÄHä8Ä ã(Ä0Ã(Ä(Ä@ä0Ä8äHä1$8ä0Ã8ä8ä8Ä8ã@åA$0Ä0ã@åI$0Ã0ä8ãI$QEbŒbIYÉiÇI‡I‡I‡YÉI‡aÇI‡YÉaÇb{o0æ0å0æ(å å å!$ å ä0ÄA†8Ä8äAGQÇI‡AGI‡ZJc/bJI‡AGAG0æ9E8æ9E(ä8Ä(ä(ä1†0å9E0æ9$9†AG0æ0æI‡AGAÇAGI‡JI‡bŒbŒJI‡I†I‡AGQÇAGAGAGI†A&AG{o{.0æ9†AGI†AGAGAGAGQEI†ZbI‡R -bJbZJs/{oR -JBI‡0æAG0æ0æ9E(å8Ä(ä(ä(ä9E0å0å9E0æAGA†8æ9†AGAGAÇAGR -I‡R -ZÌR -AGAGQÇI‡I‡YEI‡I‡I‡A&A&bƒÒAÆ9EAÇI‡AGQEA&AGY†AGI†I‡AÇI‡{,{,jÍjŠjÍ{,bŒbZÌZJbJR -ZIZJbJk/ZÌZJbJbZJRŠbŒjŠZJbŒc,jËk/ƒok.c,jÍbŒc,jËc,ZJbJRZJbJZJR‹bŒbŒbŒjË{.{Ï{.{.{.{,{,{,{o“Ï{oƒp{o“ЃÐk-ƒps,rÍ{,{,{.jÍR -bJbŒRŠbIZIR‹ZJs-ZÌbŒZJbbŒZJbJRŠjŠZJZÌk-k-s/{oc,bŒk-bŒjËk-jŠR‹YÉR -R‹ZJbJZJbJZÌbŒk/ƒosÏ{.k/{,jË{.{oƒp{oƒp{o“Ï{o{.8ÄA&HäQEHäQE@å8ÄAE@åAEHäAEQEbR‹QEY†QEYEYEQEQEQEAEIEQEAEI‡bŒbAGQEI†AGI$A&I$A&IE@åA†AGQEY†I‡QÇY†I‡QÇI†YÇI‡I‡QÇYÇaÇYÉZJQÇYEQÇQEAGQEHäYEI$QEQEA&Hä8ÄAE@åAE@åQEY†bŒQÇIEYEQEQEYEQEYEIEIEIEIEQER‹bII‡YEI†AGI$A&QEA&AEAEIEA&I†AGQÇY†QÇI‡I†Y†I‡I‡I‡QÇYÇaÇI‡bŒaÇQEIE8Ä9$8ä9EA&@åAE@å8ÄAE8ä8Ä9E8äQEA&jjÍI‡YEYEY†I‡YEa†YÇI†I‡Y†AGAÇk-YÇAGAG@åQE@åIEA&@å9E@åA&IEIEA&QEA&AGQE@åA&9EIEA&A&AGYEaÇYÉQEY†A&AGQEQEQE@å@åA&@ä8Ä@å9$0å8ÄIE8äI†Y†jÍZYEa†YEY†Y†Y†YÇY†AGQÇI†A&ZÌjII‡AG@åIEA&A&@åAE@å8ÄIEA&A&QEA&QEA&AGQEA&0å8Ä9EA&A&YEY†bI‡YE@å0å8Ä8Ä8äA$@å9$@å(ä9E@å8Ä9EA&A&QEZJbJAEYEa†Y†a†a†aÇaÇI‡Y†AÇAGAÇbŒZQEA&IE@å9E@å9E@å9EA&9EA&QEA&IEA&AGQE@åA†A&A&A&IEA&YEYÉI‡Y†YEI‡QEAGQEA&A&8Ä8äIE(ä0åIE8Ä9E@åIEA&aÇbŒAGQEa†Y†Y†a†a†aÇI‡QÇI†I‡A†ZJbJAGQEA&IE@åA$9EA&8ÄA&9EA&QEA&QEA&QEA&IEA&A&9$A&A&QEAGYEbI‡YEAGIE@å8ä9$0æ8Ä9E8ä8Ä9E0å9E8å@å8äIEbZÌ@åY…a†Y†a†aÇa†aÇaÇAGI‡9†YÉbŒQÇAGQE@åA&9E@å@å9EA&8ÄIEA&A&IEA&IEA&AGA&8ÄAGAEA&A&QEA&a†ZJAGQEA&QEAGA&QE8åA&8Ä0å8ä8Ä9E@å0å9E@å@åAGk-AGQ…a†YEaÇa†aÇaÇa†I‡QÇA&AÇbŒbAGA&A&A&AE@å@å9E@å9EA&A&QEA&IEA&A&I†A&@å9E(äA&AGA&QEYER -I‡YEA&8Ä8ä8Ä(äA$0å8Ä9E8ä8Ä0å@å9E8äIEA&JbŒYÇa†jjzzzzjAGQÇA&JZJAGQEA&9EIE8å@å9E8åA&IE@å9EA&QEA&A&AG@åAEIE@å9E@åIEA&YEaÇR -YEI‡A&QEAGQE@å@ä8Ä8ä9E8Ä9E0å8ä9E8å8ÄIEAGbŒZaÇiÇjzzzzjI‡AGI†AGbŒI‡I†AGIE@å@å9E0åA&8ÄIE9EA&A&IEA&IEA&A&IE0å@å8Ä9EA&QEA&a†ZJYÉQE@å8ÄA$8äA$8Ä8äA$8Ä0ä1$8Ä8äA$9EA&QEYÉbŒAÇY†A&AGYÉjI‡Y†I‡8Ä0æ9EJR -QEA&IE@å@å9E0å@å8ÄA$0åIEA&I$A&QEA&IEA&8ÄIE@å0åIEA&QEQEYÉjËAGQEQEA&QEA&QEA&@å8ãAE0Ä0ä0Ä9E8äA&AEQEAGbŒYÉAÇQEA&YÉYÉYÉY†I‡QE(ä9EAGR‹I†A&QE8ÄIE0å8ä@åA$9E@å@å9EI$A&QEA&QEA&8Ä@åA$9EA&IEA&QEYEZJYÉQEQE8Ä8äAÇAGI‡B0æAÇAGAÇAÇAÇAGAGAGI‡R‹ZJ å å!$ Ä Ä0æAG åAGR‹R -R -R‹bŒAÇAGAGAÇAGAG8æ9E8æ0æAGAÇAGAGAGAGAGA&I†A&AGA&A&AGI‡YÉI‡jk/bJYÉR -YÉYÉYÉYÉI‡A&A&0æ9†9EA&0æAGA†AGAGZJs/B ä Ä äÄ(ä0æ0æ1†BbŒR -R -s-:I‡AGAGAGAG9†8æ0æ0æA†AGAGAGAGAGAGA&AGA&A&A†8æA†I‡YÉI‡YÉjËjÍR -YÉR -YÉk/jËs/jËbŒƒÏk/bIbŒZIR -R‹ZJRŠjÍjËbJZJbJR -bJc,bŒc/{.{Ïk-jË{.jËk/s-k-k.c,{o{Ðk-c,k/c,{os/k/k-k-s.c,jÍ{.“ÐsÐs/{oƒps.ƒo{.{.{,{.{.{.{,jÍ{.jÍ{,{ÐjŠYÉZJZIR‹bR‹ZJbJc,jŠbŒbbŒR -R‹bŒjËk/s-{p{,jÍk-rË{,k/k-k-s.k/ƒÑk,k/{,ZÌk/{Ðk/k-s-k.k-bŒk,“ЃÒk-k/ƒÐ{.{o{.{.{,{.{,k/{,QEY†QEYEY†ƒÐRŠ@åIEI$@å@åAEQEQEIEA&AGI†I†AGI†AGQEQÇQEA&I$IEIEIEAEQEYEQEj˃ÒYÈQEA†QEIEIEIEIEA&QEQEQEYÇ{ojŠQÇQÇY†QÇI‡Y†Y†A&I†AGYEYÇY†YEY†a†k/ZI$A&I$QE@å@åAEQEA&QEIEAGI†AGQEA&QÇQEQÇAGIEI$A&IEQEA&QEYEQEbƒÐbŒQEAGQEA†QEIEA&AEQEIEQEY†jÍk,ZYÇI‡Y†I‡Y†Y†AGQEAGQEY†QEY†AGI†YEjÍYÉIEI$A&IEHäIEQEA&I$A&QEQEA&QEAGQEQEY†AGQEIEA&QE@åQEY…Y†Y†jŠ“ÐZQEAGI$AGQEA&QEQEA&QEYEjk/AGY†QEYEAGQEYEA&I†AGQEA&YEYEY†Y†Y†bŒbA&HäQEA&I$QE@åQEA&IEQEIEIEQEA&Y†AGQEAGYEQEA&IEIE@åIEYEY†Y…bƒÐjËQEI†QEQEA&QEAGHäQEAGYEYE{.ZJQEQEYEAGQEYEAGQEA&I†QEYEQEI†QEA&YEZJYÉ@åIEHäI$QEIEI$A&HäQEQEA&IEI$QEAGQEQEQEQEIEIEQEQEY†Y†Y…YEj˃oI‡I†QEA&QEA&QEA&A&QEAGQEYÉ{oYÇYEYEYEAGQEYEY†YEAGQEA&I†I‡YEYÉaÇbŒZJHäQEI$I$A&I$QEI$A&I$QEA&I$A&I$IEQEQEQEY†IEIEAEQEQEYEY†Y…Y…b{obJQEAGQEA&QEA&QEQEA&QEQEYEjÍbŒYEYEYEYEAGY†QEQEY†A&AGQEQEA&QEQEAGjR -I$I$I$QEI$QEQEQEQEI$A&HäIEIEQEQEYEYEQEQEQEQEY†YEY†Y†Y†Y…k-ƒpI‡QEA&A&I$A&QEIEA&QEIEQEaÇ{.bYEYEYEYEYEAGQEY†QEA&AGAGQEI‡I‡YÉjËR -HäI$QEHäHäQEQEQEQEQEHäQE@åQEA&QEHäYEYEQÇQEQEQEYEYEaÇY…Y†Y…bIƒÐR‹QEA&A&I$A&QEA&IEA&QEAGQE{,jËYEYEYEY†QEQEYEY†QEA&QEQEIEQEA&QEI‡jR -@åI$I$QEQEQEQEQEI$A&QEIEHäYEQEQEY…aÇYEY†Y†QEY†QEaÇY…aÇY†jŠƒÐRA&QEA&QEA&A&@åIEIEA&QEaÇjÍZYEaÇQEYEYEYEY†QEQEA&I†AGQEAGY†I‡{.bIHäQEHäI$HäQEQEQEQEI$QE@åQEQEI$QEQEYEaÇYEQEY†YEY†Y…Y†Y†aÇY…Z{obJAGQEA&QEA&@åAEIEA&IEQEQEjËbŒYEa†YEYEYEAGYEYEY†A&I†A&I$A&QEQEY†YÉYÉ8ã@åHäHäAEI$HäQE@åI$I$QEIEQEYEYEYEYEQEIEQEYEY†QEY…Y†QEYEZI{.R -AEQEA&@åIEA&AEQEA&QEA&QEjÍYÉYEYEYEY†YEYEQEY†YEQEA&QEA&Y†A&QÇbŒb@åHäI$@åI$@åIEI$HäQE@äI$A&I$QEYEQEYEYEYEIEQEY†YEY†QEY…Y…QEYÇk-k-HäQEA&@åA†I$@åIEIEA&AG@äZJbJYEYEY†YEY†QEYEY…YEQE@åHäAGI‡I‡YÉbŒjÍZÌI‡AGAÇAGAGAGJR -I‡JI‡R -I‡bJI‡YÉJI‡JI‡JI‡RYÉR‹ZJrË{,k/k-bJ9&I‡I‡AÇJBI‡R -BBbŒk/ƒobŒjbIYÉiÇbbR -jbŒbJZJYÉI‡ZJR‹YÉc,bŒYÇZYÉA&AÇAGAGI‡R -BYÉJYÉJR -YÉJbBI‡I‡JI‡I‡R -R -bJbŒ{,k-jÍc,AGAGRAGBR -BR -I‡BZJrÍ{pc/YÈI‡I‡BYÉJR -bR -R -R -R -k/ƒÐ{os/ƒÐ{.{.{Ïc,{os/{ok.c/jËs/bŒc,bŒk-bŒbŒc,k/k,c/{.ƒÒƒÐk/{.{σÐ{o“ϓЃÐ{Ï{.ƒÐ{ЃÒ{o“Ð{ЃÒ{.{.“ЋЃÐ{o{Ï{,ƒÐ{ЃÒ{.ƒÐƒÐƒÐ”0œ“{ГЃҔ0ƒÐc,{.{.{.k,ƒos.ƒÐk-c/k-jËbŒbŒbŒk-bŒbŒc,jÍk/s/k/ƒÐƒÐk/{Ï{.ƒÏ{Ï{o”0“Ðs.ƒÐk/“ЃЃЃÐ{o{Ð{o{.ƒÐ“ЃσÐ{.{Ï{oƒp{Ð{oƒpsÐ{Д2œ“ƒÐAE@åAEAEIE8ÄA†I$@åAGQÇR‹IEHãI$I$AEHäI$AEHäI$A$Y…QÇYÉAÇQEAÇQE9EIEIE9EAGY…QÇI†I‡QÇQEQÇI†Y†I†AGIEQEI†IEIEA&QÇQEbŒRIE8Ä9E8ä9EA&A$@å9†IE@å9EIEA&AEAE@åA†QEZJAÇHäI$IEHäIEI$HäI$A$8ÄQEYÇYÇJIEAGAÇAEAEIEA&QEAGY…I‡QÇQÇA†Y†I†Y†I†AGQEA&I†QE9EAGQEI†jR -AÇA&8ÄA$9EA&9E@å@åHä8ãI$8Ä@å8ã8ä@åHäI†jŠ@ä@åHäHä@äHäHä8ä8ã8ä@åI$IEjŠA&IE8Ä@å8ä8Ä9EQE8äA&HäIEQEQEQEQEQEQEA&I$QEA&@åIE@å9EA&QE{,I‡@å9E8ÄIE@å9E8ä9E@ä@åHäHä8ä@å8ã8äHä8ãIEZJAGHäHäHä8äHãHä9$0ÄHäA$8äI$bYÉA$@å8Ä8ä8ÄAE8äIE@åAE@åIEQEQEQEQEQEQEA&IEIEI$A&@åA$9EQEZJbŒHä8Ä9E@å@å8ä@åA$HäI$8ã@åHä8äHä8ã@äHäI†b8ÄI$HäA#HäI$8ãHä8äAEHä8ãI$ZJIE@å8ÄA$9E8Ä@å8äAEI$IEA&I$A&QEQEQEQEQEA&A&I$A&@åA$@å9EYEjÍYÉ8ÄAE8ä@å9$@å9EA&8ÄHä0äIEHä@ã8äHä8ãHäHäbIAG@ãI$@ãHäI$I$8ãHä8ä8ã@åI$bJ8ÄA$8Ä9E8ä@åAE@åAEHäIEIEI$A&QEQEQEQEA&I$A&@åIE8Ä9EA&QEjZÌA&@å8ÄA$9EHä8äHäHä8äHä8ãHä8ã@äHä@ãI$QÇZJ@åI$I$HäI$I$HäA$8äHäA$HäI$ZJ9E8ÄA$8Ä8ä9$8ÄA$9EA&I$QEA&I$A&HäQEQE8å@å@åAEHäA$8ÄIEIEQEjÍIÇ8Ä8äA$9E8Ä9E@ä8ä@åHä8äHäHä8ä@ã@äHãHäI$ZJAGI$HäI$I$I$HäA$8äI$8ÄI$HäZIAÇ8ÄA$8Ä8äA$8ÄA$8ÄAEIEI$QEA&I$QEHäA&QE8ÄA&HäA$IE8ÄA&I$QER -bŒ@ä8ãA$0å@å8ã8ä@åHä@ä8ãHä@äHã@ä@ã@äI$QEbŒHäI$8ãI$I$IEHãI$HäA$HäI$I$J8Ä8äA$8Ä1$0ÄA$8ÄIEI$A&I$A&QEHäQEHäA&I$@åHäI$@åAE8ÄIEQEQEjËI‡(ä8Ä8ä8Ä@å8ä8ÄAEHä8äHä8ãHä@ä@ã@ä@ãHäI$ZJI‡@äI$I$8ãIEI$HäI$HäI$A$HäQÇA&8Ä8äA$0Ä0äA$8ÄAEI$QEA&I$QE@åQEQEHäQE@ä@åI$@åAE@åAEI$QEbbŒ0Ã8ä8Ä9$8Ä9E@äHäHä@äHã@äHã@äHä@ãHäHäIEc,Hä8ãI$HäHäI$I$Hä@ãI$I$8ãIEAGA$A$8ä8ã8ÄAEI$QEI$QEQEQEYEQEQEQEQEYEQEQEQEHäQEI$QEQEA&QEbŒAG@åA$0Ã9$(ä9E8Ä@å@ã@äHäHãHä@ã@ä@ãHäHãHäjŠAÇHäHäI$@ãI$I$HãHä@äI$HäA#QEA†8ã@å8äA$8ãAEI$QEHäQEYEQEAGYEHäYEA&YEQEYEQEHäIEHäQEYEA&YÉZJ8ã8Ä9$(ä8Ä8ä0ÄHäA&A&A&IEAGA&0å8Ä0ä8ÄAGbŒJAGQEA&Y†QÇI‡I†AGA†AGI†Y†R -R -QÇAGA&0ÄHä8äA&@äI$@å8Ä@åA&8å@ä@åA&I$@äQEIEA&@åAGA&A&AGR‹AG0à ä0ä0Ä0ã(Ä0ÄHäAEA&QEA&A&I‡8å0å@ä0ÃA&ZJR‹I‡A&@åQEYÇQÇAGI†AGA†I†AGbR -YÉAÇA&8Ä8ä@å@å@åIE@ä8Ä@å@åA&@äA&I$A&Hä8ÄQEA&@åA&AGA&A&ZJR -0æ0æ9†I‡ å(ä(å8æbjbkkR QÈR -bjZJbËrËj¬j«b‹j«ZjQéR bÌbÌjìbÌbÍbŒb¬kjìb‹jÌjÌbŠb‹bÌb*QÈj¬ZJQÈJ bjZJb«jÌjËj«b‹b«b‹QéR j«bÍjÌbÌbÌbŒbÌsOríj«b¬jís bŠZkQEAjjI%0ä0ä0ÄA$8ä0ä0ä0ä8ä990äIj«QfQEIfY†Q‡a¦jÍQeI%I%QEY$YfYfQfY…b -If8ä0ä0ä@ä8ä0ä0ä8Ä0ä8ä98äAbJY§IEQfQ†a§Q‡zíQ†I%IEQEYEYeYeI†Ab‹I0ä0ä(äA8ä0ä0ä0å0ä9A0äAbkY§QfIgQ‡Q§Y§jíI%9%1%AFIFQfY¨YÈYÈb*Q†0ä(ä0ä8ä98ä0ä0ä0ä99%8ä9b*YèYfI‡QfY§Q‡ríIf199%IFQ§QgQgA%b‹IF10ä0ä0Ä0ä0ä0ä8ä90äA%9A%bjQ¨Q†Q‡Q‡Y‡Ifj¬11F119IfI†AFAFZKQ§9(ä0ä0ä0ä0ä0ä8ä90äA9A%Z -YÈQ§Q‡Q‡Q‡QfrÌ1%9F119AF9EZ)b(b*QÈQèI¨QÈbjRQÈYèYèRZ)b¬bŠbJZ)QéI§QÈQèZ*Z)j¬bjbjjŠj¬rËrÌjìjjbJb)YéQèQÇQÈb*R)YÈQèYèQèZbÌbŠbJZ*Z I§QÈQèZ Z -b«b‹bjbŠj«rÌj«bj8äA9999%I%bkQEa†Y†Y¦I‡IfRJQ§A%A%A%9%9I%IFA&AEA9%AFYfQ§QFI%IF@åA199%A%bJQ†YeY†Y†Q§IgIèYèAFA%99A%A%IEA&AEA&9A&QeY§IF8å0å98ä199%AZKQea†iÇiÇQ§Afb*I†A&99%A%9%AFA%A%A&99%A&Y†Y¨IFIEIF8å90å9%8ä9%b -Qfa¦iÇiÇY§IfQéQ§A&9%A9%9AFA%A&A&9%9%I%QFYéI%8ä999$9%1A%AFZ*9F9%IfAFAfA‡Zk9%A&9%90å9AFA%A&A99%IfY‡b*IgQgAfA9E10ä9%A&R)A‡9%AfIfAG9¦R)AFA&998å9A%AFA%A99%IFIfbKQfA&bJbIjíZ*ZI§QéZ)QèQèQéZjj«Z*bJZIbjj«s ZJbjZJZ*Z)bj{ob‹j«j‹bjbJjjjKbaèbJI‡IÈQÈZ)QéIÈR ZJb‹bJb*Z)bjbjsnZjZJZŠZJbJZIƒbŠjŒj‹j‹bJjkQeIFb Q†A%I$I%IEI%AEIFIEQfI%IEQeYebjÍIEI%IEIEIEY‡bkQEQfQEQfA&IeIEQfY†Q¨IIDI%IEI%AFIEQEIFI%AEIEYeY¦s.IEIEI&IEI%Yej­QEQEQFIFAFQEIEIFQ§Q‡I$QEQEI$I%I%QEIEYeQeYfYeY¦bb¬I%IFA%A%IEQgj«YeQEQEYeAFIfIEIfYÈYÈI$I$QEI%I$QEI%QEQEQeYeYfY†YÆsA%I%A%AFA%QejÌYeYEQeYeIFIEA&QfYéI§AA%IFIfI%IFIfQ‡QfIfQfY¦YÇZ)j¬A%A&AfAFAFQéb‹QfIfQfY‡Y‡Q‡IFIfI‡Qé9AI%IFAFIFQ†QfIfIfQfQ‡YÇbjíA%AFAFAFIFI¨b¬QfQfQ†QfQ‡IFb‹bkb«bŠZJj¬ZJZ)Z Z)RbJbŠb¬b«b‹j«s jËj«jÌjÌjËb¬jìj‹j‹s b«b‹bìk jìb«b¬bjbkb«ZkbIZ)Z)Z Z)b‹bËb‹b‹bËrìjìj‹j¬jÌjÌZ‹zìj«j‹jÌjÌb‹bÌk @ä@ä8ä@ä8äQèHäAA@ä8äAYÈA%8ä8äA%A%AIEQEQEA%I%A%AIEZj@å9$999@äA8ä@äQ§A%I@äA8äAQ†AfA8ä9A%A%IEIEQEI%IEA9$A%jk8å9A8ä@äA8ä@äAZIAI$IAAQ‡8ä919AIDA%I%I%AAA%9QEZJ8ä98å91@ä@äAAQ§AEII$I9AIfAE98ä9AI%A%I%QEAAA%9I%bJ198ä8äAAA8ä@äYèAEIIEI%A$A%Q†AF98äI$I%I%IEI%I%I%I%I%A%IFbj8å1%0ä0å9%A%A%8ä@äQ§I‡AIEI$I%I$IfAfA%9AI%I%I%I%I%I%I%I%A%IEZ*8å919bJbjsZ QÈR*ZJZ*b‹j«bŠj«bjb«ZIQèZ jìjÌbÌjÌbÌb¬bÌs.jÌj̃Ns {-jìrÌsNzìs-YéIÈZ ZkZ)bjj«j«b«bJb‹bjQèYéb«jÌjíbÌjÍb¬j¬sOs j«j¬jÌs b‹ZkQEAjkI$0Ä(ä0ÄA%8ä0ä0ä8ä9990äIj‹QfQEQfQ‡Y¦Y‡jÍQeI%I%Q%QEYeYeQfYfb‹8ä8ä0ä0ÄA$8ä8ä0ä0ä8ä8ä98äAbJY§IEQfQ‡Y¦Y‡{ Q‡IEI%QEQ%QeYEI†@åb‹I(ä0ä0Ä8ä8ä0ä0ä0å0ä998äA%bKYÇIfQfQ‡Y§Qˆs A%1%99EQFIfY§Y§YÇbŒ8ä8ä(ä0ä8ä8ä0ä0ä0å0ä9A0äAZ)aèQfIgQ†Y‡Q§rìIf19%9&IFQ‡QfQ‡A%b¬Qf0ä0å0ä0ä0ä0ä199%0å9A%A&bJY§Q§QgQ‡I‡Qfs 0ä1F19%9I§YèYÈQ§jí9%10å0ä0ä0ä0ä0ä8ä90å99%A%Z*YèI‡Q‡IgQ§QgrÌ9%9F191IEAFZ Zb)QÈQÉI§QèbjQéYèYèYÈQèZ)bÌbib*Z*RI¨IÈYÈZ Z*b«bŠbjbjr«rÌrÌzìj‹bjb)YèIÈQÈQÇZŠZ YÈYèQèRZ(b¬j‹ZJZ R Q§I¨QèZ Z)b‹bkbŠbjj‹rÍjjZJ8ä9A999IEbkQEYfY†a¦I‡IfRJQ‡AFA%A99%A%I&AFI%9&9%A&Y†Q‡IFI%I%A991AA&b*Q†aeQfa¦Q‡I†IÉYèAEAA%9%A%A%I&AEI&9%9A&QeQ¨QE8å18å9199%9bjQeaÇqÇiÇQ‡I†Z*I†A&A%9%9%A%A&A%AFA%19IEY‡Q§IFI%A%990å999Z)Q†a§iÇiÇY§IfIéQ§AE9&9A9%A&A%AFA%9%9%A%QFYéA%8å9%9%9%9%9E9AFZK9E9%AgAFAgA§Z*A&AE9919%IFA%A&999EIFQˆb*Q‡IFA&A9(ä19AFZJA†1%AFIgAf9†R*AFA&9%99%9A&A%A&A%99%IFQgbJQ‡IFbIZ*rìZ*QèIÈQèZ QèIÈYéZjb«b)b)Z)bjjËs ZJZJZJZ*bIbK{nj«j‹jkjjZJbjbJj«Z*I‡I¦I¨QèZ QèQÈQéZij‹bJZ)ZIbIbk{nZ)ZJZJZJZ*b){oj‹j‹jkjjbJbJQeIFbI‡I$I%IEI%A%IEAEQFQeI%IEQEY†bjÌIFIEI%IEIFY†b‹QEQFQEIFIFAFQfaèQÈ@ä8äIEI%IEI$IFIEIFQeIEIEIEYeY§sNIEIEI&IEIEQFj¬QEQfQEIEIFIeIEI&YÇQgI$I%QEIQEI%QEQEY…QeQeY†Y†b(j¬A%I%A%AEI&Y…j‹YeYeQFYeIFAEQfb*YÈ@ä9I%IEI%I%I%QEQ%Y…QeYeYfY¦aÇk A%I%A%AEA&QEj¬YeYEQEYeIFI%A&QfZ QÈAA%IFI†IFIFQfQ†QgIfQ†Y§YçbIbÌA&A&AfA†AGQèbŒQfQfQ†Q‡Q†I‡I†ZKbJAE9A%IEIFIfIfI†Y‡Q†IfIfY§YÇb)k I%AFAfIFAfI©j¬QfQfQ†Q‡Q¦Afbjb‹b‹ZJZjbÌZ)Z Z Z)R bIbkb‹b‹bŠb«rÌj«j‹jËj¬b«b‹jËj«j‹jíb«Z‹bÌjírìjìjÌZjb*bÌZJZ*YéZIQéZ)bŠb¬j‹Zkj«jËrÌb«jËjÌb¬bŠjÌj«b‹rìb«Z‹bÌjÌ@ä9@ä8ä@äYèAIA8äAAQÇA%8å8ä9AA$IEI%QEA%I%A%9IEbJ9999A@ä8ä@ä8äQÇAIAA9AQfAf98ä9A%I%I%IEQEIEA%I9%A%bjA0äAA@ä@äA@äAYèAAI$AAAQ§8ä8ä99A%IEA%Q$I&AAA%AIEZ*8ä98å8ä8ä@äA@ä@äYÇAEIIIAAIeAF8ä99AA%I%I%I%AAA9QEbJ8ä8ä8å8äAAA8ä@äR IFI$IEQ%I$AEQ‡AfA%8äA%I$I%I%I%I%I%I%A%IEI&R)0ä0ä0ä8ä@ä@äHä8äHäQÇI‡I$I%QeAI%I†IgA%8äA%I$I%I%I%I%I%I%I%AEI&Z*0å90ä0åZJjjs R QÈR*bJZ)bŠb‹b‹j‹ZJbŠZ*QÈQéjìjÍjÌjÌjÌb¬jÌk.rÌb‹j¬j«bjjíj«j‹bjrìYèIèZ ZJZ)bjb‹b‹bŠbŠZJbiIéYèjÌjÌjìjÌjÍb¬b«so{ j«j¬jÌzìZ‹b‹IFI%jjA%0Ä0ä0äA8ä0ä8ä0ä8ä9A0ÄA%r«QfIEQfQ‡Y¦Y§jÍIfI%QEQ%QEYeYeYfY†Y§8å8ä0ä0ä998ä0ä0ä8Ä9A0äAbJY§IEQfQ†Y§Y‡rìQgIEI%Q%QEQfYeI†@åbkI%0ä(ä0ä8ä90ä0ä0å0ä9A0äAbŠYÇQfIgQ†Q‡Y§jíA%19&AEIFIfYÈYÈYÈYè8ä0ä(ä0ä8å8ä8ä0ä0å18ä9%8ä9b)YèQ‡IfY‡Q‡Q§rìIf91%9&IFQfQ§Q‡AEb¬If9(å0ä0ä0ä10ä99%99%AEIFZŠQ¨Q‡Q‡Q‡I‡Y†j¬1%1&1%99%Q‡ZYèYèbk9E11%0ä0ä0ä0ä0å991A%9IFR*YèQ‡I‡Q‡Q‡Qfj¬9%9&1%1&9$AFAfZ(Zb)QÇQÈI§QÇbŒQèYÇYÈYèQèZ(b¬bjZ)Z QèQ§IÈQÈZ)Z b‹b‹bjbjr«j¬j«jkbJb)Z(QèQèI§QÇbkQéYÇYÈQçQèZ)b«bŠZ)Z ZI§IÈQÈZ Z b‹b‹bjbjjŒrÌjjZ*9998ä19IEbkQEY†Y†Y¦Q‡A‡Z*Q†A&A%A%A9%A%IFA&AEA9&IEQgQ§QfI%I%A9999$AbJQ†Y†Yea§Q†I‡IèQÈIEA&A9%9%A&I%IFAE9&9AFQEYÈQE8å0ä9118å9%A%Z*QeiÇiÇqÇQ‡A†R QfA&9%9%9A%A&A%AFA%19%I%YfYÈAFIFA%A10å99%9Z -Q†a¦iÇiÇY§IgIéI§IEA%9%9%A%A&A%A&A%99AEIFYèI%8å99f99E9F9AFZK9F1IfAFAgI¨ZkAFAF9%199&AFA&AF9A%9&QgQ‡bJQ‡I‡IF910ä19AfZ)A‡1EAFAGIf9§R*IfA&9%999%A&AEA&AE9%9%IfQ‡bKQ‡IfbIb)ríZ)QÈI¨RZIèQÈR ZJj‹Z)b)Z)bJj«s R*bjZ*Z)Z)bJ{oj‹j‹jjbJbJbJZ)jÍQ§QÈQÈQèQèYèQÉR QèbJbŠb)b*Z)b)bjsNZJZJbiZ*Z)b){pbŠj‹jkbJbJbJQeIFaéI¦I%I$IEI%I%IEIEQfQeI&AEQEY…bj¬IFI%AEIEIFY†bŒQEIFYeIfI%AfQEbkIA$I%I%I$IEA%IEAEQEQfIEA%QEYeY¦sNIFI%IEIEIFQEjÍQEQeQFIEIfQFIEIEQ¨Q†IQEI%QEI%I%QEQEYeQeYeY†Y†b(j¬AEI%A%AEI&Q†j‹YeQEYeQeIFIeAGb‹I@äI$I%QEI%I$I%IEQ%Y…QeQeY†a†YÆkIEA%I%A&AEQEjÌYeYEYeYeIFI%A&Qfb*I¨AA&IEI†IFIfQ‡Y†Q‡IfQfYÇYèbJbËA&AFA§AfA†Z blQfQfQ†Y§Q¨Q¨Q¨k QfIfA%A&IFI†IEIfQ‡Y‡Q†IfQfYÇYÈbIjíA&IFA†AFA†QÉj¬QfQfQ‡Q‡Q§IgbjbjbkZ*ZjbÌZ*Z ZYéQèZJbjb«bkZŠb‹j«j‹j«j«j¬b‹bJjÌb‹jŠjíb‹ZŠbÌjÌj«rìb‹ZjZ*b«ZJZ Z YéRZ bkb«b‹ZŠb‹j«rËb‹j«j‹j¬bkj«jŠb‹ríZ‹bŠZ«j«@ä@ä8ä@ä@äYÇAAA@äA9YÇA98åA%A%A$I%QEI%IEA%A%9%I%bk999A@ä@ä8ä8ä@äQ§A%IAA8äAQ†AfA99A%I$A%IEQ%AEIEA%AA%bjA9A8ä@ä@ãA@äAYèA$AI$I9AQ¦998ä9A%IEI%II%AA$A%AIEZJ0ä98ä9@ä@ä@ä@ä@äYÇAEIII$AAQf9%98ä9A%I%I%I$I%I%AA9QEZJ8Ä90ä@äA%IEA%AAZ)IFI$I%A%AAI‡AF9%AA%I$I%IFI%I%IEQEIFIfIFRJ9A%9%A&A%I%IFAAQèI§I%A$I%AA%IEA‡A%9I%I%I%I%I%I%IEI%IFIfIFbJ9%91A%bjjjsZ IÈZ Z*Z(ZJbjbjbjZJZIZ QèQéríjÌjÍjÌjÍj¬bÌsrÌj¬r¬jÌ{ s s j¬j¬Z -QéYèR Z*Z)Z)bjbjbJZJZJbJQÇQéjÌjÍjÌjÌjíj¬jÌ{os j‹jŒs rÌjÌj¬IfIbKI%8ä(ä0äA8ä0ä8Ä0ä8ä9A0äAr‹QeIFQfQ†Y§Y§s IEI%I%QEQ%YEQeYfIfQfIE8ä0ä0ä990Ä8ä0ä8ä8äA8äAbJY¦IFQeQ‡Y§Y†ríQ†I%A%QEQ%QeQfQ†9j‹I0ä(ä0ä8ä8ä0ä0ä10å9A0äAbkY§Q†IgY‡Y§Y‡jÍA%11&9&IEIFQ‡Y¨Q‡Q†I0ä0ä0Ä98ä8ä(ä18Ä0äA%0ä9b)aèQgIfQ‡Q‡Y§ríIf11%A&AFQ‡Q‡I§I&b¬Q‡9118ä(ä9199%9AF9%IfbKQÇI‡Q‡I‡I‡QgjÌ1%9&1&1&A%Q§Q‡QèbJR -Af10å10ä110å9A&1A%9%IfZ*QÈQ§I‡Q‡Q‡QgrÌ1E9F9&1%9%AfAfZYèb I‡QèI§QÇbkYèYÇQÇYèQèZ(b¬bjZ ZQèI§QÈQÈZ Z)b‹bjbJbir¬j¬j‹bjb)b b)Q¨IÈIÇQÇbkR Y§YèYÇQèZ)b‹b‹Z)YèZ I§IÈQÈQèZ)bkbŠbJbjj‹rÍjjZ)8äA99$8å9%I%bkQeYfY†a¦I‡IfRJQ†A&A%A%9%9%IEA&AFI%9FA%A&Y†Q‡QfIFIE8åA0ä99AEb*Q†YeY†a¦I‡I†IéYèA%A%9%A9%A%I&IEAF99%A&QeYÈI%90ä99919A%ZJQeiÇiÇqÇQ‡A†Z*IfA%9%A9%A9&IEA&A%A%9%I&YfQÈIFIFI%8å18å91%AR -Q¦i§iÇqçY§AfR -Q‡AFA999EA&A%A&AE91I&QEQéI%8äAE9F9%9F9EAFIFZK9E1AgAFI‡AˆRJAfAFAF98å9fI&AFA&A%A&9%QgY§bkQ‡Q‡Q‡A&91%99&IFZKA§1AFAGA†I¨RJA‡A&A&91%A&AEAFA&A&A%9&IgQ†bkQ‡Igb)b)rìZ)QÈIˆQçZ QÈQÈR R -bŠZZ)Z)b)j«s.ZIZJZ*Z)Z)bJ{nb‹jjjkb)bJjJb)jIjìQ‡QÇI‡QÈZQÈQÉQèbIbkZZ Z)b)bjsOb*R)bjR*Z)b){ob‹j‹jkbJb)bJQeAFaèIgI%I$IEAIEI%IEIFQeIEIEIEY†bj¬IeI%IFI%IFY†bkYeIFYEIeIFIFQfY§bJII$I%I%A%IEI%IEIEQfIEIEI%Y…YÆsIeIEI&IEIFYEj¬QEQEQfIEIFQEIEIEY§I‡I$QEQEQEA%I$QEQeYeQfYeYfY¦b(j¬I%A%A&A%IEY†j‹YeYEQEQfI%AgIfQ‡j‹II$I%QEQEI%I%IEQ%Y†QeYeY†Y†YækIEA%A&AEI%IFrËYeYeQFYeIFIEAFQfb*IÈAFA&IeIgIfI‡Y‡Q¦Q†I†Q‡QÇaèbŠj¬AFAFA§I‡A¦Z -j¬a§Y¦a§Y§YèQ§Q§IÈb‹QfIFAEIFI‡IfI†Q‡Y¦Q†I†QgQÇYèbik I&AfI§A‡A†QÉjÍQfQ§Q§Y§Q§IgZJZJbJZjZ*b¬Z)ZQèZ QÈZ)bjb‹b‹Zjbjr‹b«b‹j«j‹b‹b*j‹bkbŠk ZJbjb‹b‹b‹bŠZ)Z*ZJj«RJZYÈYéQèZ bkb‹Z‹ZjbŠj‹j‹b‹j«j«b‹bJj‹b‹bjr¬Z‹ZJb‹b«I9@ä8ä@äYç@äAI@ä9AQÇA%8å8äA%AA%IEQEQEA%I%A9%IEbJ9999%@äA@ä8ä@äQ§A%IAA8ä9Y†Af8ä8å9%A%A%IEIEQEI%AEA%9IEbk@å99A@ä@ä@ã@äAYèIAI$IAAQ¦8å919A%I%A%I%I%AAA%AIEZJ0ä999@ä@ä@ä@ã@äY§A%I$A$IAAQf9%98ä9A%I%IEI%IA$AA%9Q$bK0ä99@äAAA%8ä8äZ AEI%QEIEA%AEI‡I†99AI$AI%I%I%I$I%I%IEA&Qé10ä0ä8äAI$A%8ä@äQ§I¨AIEIEA%IEIfI‡9%8äAI%IA&II%I%I%A%I%A&Z -0å9E0å0äYÈZ)AgI§QÈQÈQÈI‡Z)Z Z)b)b‹YèYèbYÇZ*AfI§QÈIÈQÇI§Z Z)Z)Z)j¬Yèb)YèIFQÈ0ä0ä0ä8ä19QÈQ‡Q‡Q‡Qé1%A%Q‡Q‡Yé0ä0ä0ä0ä99I§Y§Q‡Q‡Z 1%9%IfI‡I‡AfYéQ§YÇQÇZJQ§I‡I‡Q§QèQÈb)b QÈI‡IfQÉYÇYÇQÇZJQ§I‡I‡Q§QèQÈb)QÈ919%Q¨IfY†I‡QÈ9%9A&A%9AFY¨IfA&99I§IfY§I†IÈA%9A%A&9%A%QÈI%YÇZ*I†Q§I‡Q§YèQÇb)bJQÈQÇbkaèYèYÈYÇYèIfQ‡I‡QÇYèQÇbb‹QÇQÈjjYèYèYèIFQ¨I$IEIFQeQfQ†açQéAEIFZ)QfYfIfIFQÈI$IEIEQfQeQfYÇZ)AFAFZ)YeQfIfQ§QÈRQ§I†Q‡Z IÈZYèZYèQèbJIÈRQèQÇQèQ§I§I‡ZIÈYèZZYèYèbJQÈQèA@äI†II%A$IF9A%I%I%A%A%YÈ90å9AIEIEI$A$If9A%I%I%AA%QÈ98åYÈZ)AgI§QÇI¨QÇI‡Z)Z b)Z)j‹b)b)b)jIZ)AgI§QÇIÈQ§I‡Z b)Z)b)j¬Yèb)YèIFYè0ä0ä0ä0ä99QÈQ§Q‡Q‡R 1%A%Q§Y§Qé0ä0ä0ä0ä99I§Y§Q‡Q‡Z 1%9&IfI‡I‡AfZ Q§YÇQÇZJQ§IgI‡Q§QèQÈb)b QÈI‡AfYèY§YÇQÈZ*Q§I‡IgQ§QèQÈb)QÈ919%QÈIfY‡I‡QÈA%9A%AF9AEYÈIFA19I¨IfY‡I†IÈA&99%A&A%A%YÈI&YÇZ*Q†Q§I†Q¨YèQÇb)bjQÈQÇjkYèYèQÈbQ‡AfQ‡I‡QÇYèQÇaèb‹QÈQÇjkYèYèYÈIFQÈI%IEIEQfQfQ†aèRAFIFb)QfQfIfYèQ‡A$IFIEQfQfQ†aÇZ)AFAFZ YfQfIfQ§Q§R Q‡I†Q‡RQÈQèYèZQèYèbJIÈQèYèQÈQèQ§I†I‡ZIÈQèYèZYèQèbJIÈQèAAIfI%I$A$If9A%I%I%IA%Q§0ä8ä@äAIEIEI%AIf9A%I%I%I%A%QÇ8å8äQÈb)AgI‡IÇI¨I§I‡Z)Z b)b)b‹YèYèb)aèYèAfI‡IÇIÇI§I‡Z Z)b)Z)r¬Yèb ZIFYè0å0ä0ä199QèQ§Q‡Q‡Qé1%A%Q¨YèI§10ä8ä0ä99Q§Y¨Q‡Q‡Z 1%A&I†I†IgAfZ Y¦Y§QÈZ*I§IfI‡Q§QèQÈb YèQ§I‡AfQèY§Y§QÇZ*Q§IfIgQ§QèQÈb)Q§919%QÈIfY‡I‡QÈ9%9A&AF9AFYÈIfA%0å9%I§I†Y‡I‡IÈA%9A&A%9&A%YÈAFYÇZ)IfQ§I‡QÇYÈQÇb(bJQÈQ§j‹YèYèQÈb)IfI‡Q†I‡Q§YèQ§Yèb‹QÇQ¨jkYèYÈYèIFQÈI%IEIFQfQfY†bQéAFIfb QfQ†Q†Z*I%I%IEIEQfQfQ†açZ*AFAFb)QfYfIfQ§I§Z Q‡I†I†Z IÇQèYèYèQèQèbJIÈQèYèI§QèQ§I†I†Z IÇQèYèYèYèQèbJIÈQÈAAI‡I%I$AAf9A%I%I%I%AEQÈ99AAIfIEI$AIf9A%I%I%I%A%YÈ99YÈZ)AgI‡I§I§I§I†Z)b Z)b*j‹Yèb b)b Q§AfI‡I§I§I‡I‡Z Z)b)b*r¬Yèb Z IFYé10å0ä999QÈQ§Q‡Q‡R 1%A&Q‡YÈI‡0ä0å90ä99QÇQ¨Q‡Q‡Z 1%A&IfI†IgAfYéY¦YÇQÇZJI§IfI‡Q§QÈQÈb)YèQ§IgAfQèY§Y§QÇZ*Q§IfI‡Q§QÈQÈb)Q§9%9%9%QÈIfY‡I‡QÈAE9A&AFA%AFYÈIfI&19%Q¨I†Y‡I‡IèA&9AEA&9%AFYÈIFQÇb)IfI‡I‡Q§QÇQÇb)bjQÇQ¨jjYèYÈYÈaèYéIfQ†I‡Q§YÇQ§bb‹QÇQ¨jjYèYÈYÇIFQÈI%IeIFQfQ†Q†bYéAfIfb*Y†Y†I‡Q‡YèI%IeIFQfQ†Q†açZ*AFIfZ*YfQ†QfQ§I§YèI†I†I‡ZI§QÈYèYèQÈQÈbII¨QèQÇI‡YèQ§IfIfZI¨QÈYèYèQÈQèb)I¨QÈA@äI†I%I$A%If9A%I%I%I$A%Q¨0ä8äAAIEIFI$A%If9AI%I%I%A%Q§98äQÈ9%AfAFYèYÈQèQ§YÈ9EAfAFQèYÈRQ§AFI‡Q†QèAFIfI‡YÈAfI‡Q§QÈAfIfI‡Q§QÇIfQ†Q§b I†Z Y§Q§IFQ†Q§b)I†Z Y§IfI†IfI‡Q†Q‡QÈAfIfI‡IEI‡I†Q‡QÈAfQÈ9%AfAFYèYÈR YÇZ 9%AfAFYèYÈR Q§AFI‡Q¦QÈAfIfI‡YÈAFI‡Q§QÈAfIfI‡Q§QÇIfQ†Q§b)I‡ZQ§YÈIEQ†Q§b)I‡YèY§IFI†IfI†I‡Q†QÈAfIfI†IFI†I‡Q†QÈAfQÈ9%AfAFYèYèQéQ§Yè9EAFAfYèYÈR Q§AFI‡Q¦QÈAfIfI‡YÈAFI‡Q§QÈAfIfI‡Q§QÇIfQ†Q§b)I‡aèQ§QÈIfQ†Q§b)I†aéQ§IfI‡IEI‡I†Q‡QÈAfIfQ‡IEI‡I†Q‡QÈAfQÈAEAFAFYèYÈQéQÇYÈ9%AFAFYèYÈR Q§AFI‡Q†QèAFIgI‡YÈAFI‡Q§QèAFIfI‡Q§QÇIfQ†Q§b)I‡bQ§YÈIfQ†Q§b)I‡bQ§IFI†IFI†I‡Q†QÈAfIFI†IEI‡I†Q‡Q§AfIfI‡I§QÈI‡I‡I§Q§I‡Q†Q§Q¨I†Q†Q§Q¨I†I‡Q§QÈI‡I†I§Q¨I‡Q†Q§Q§I‡Q†Q§Q§IfI‡Q§Q¨I†I‡Q§Q¨I‡Q†Q§QÇI‡Q†Q§Q§I†I‡Q§QÈIfI‡Q§Q¨I†Q‡Q§Q§Q‡I†Q§Q§I†Q¨I†Q¨I‡Q§I‡Q§I†Q§I‡Q§I†Q¨I†Q§Q§Q§Q‡I§Q§ \ No newline at end of file diff --git a/glide2x/sst1/glide/tests/sst1img.bat b/glide2x/sst1/glide/tests/sst1img.bat deleted file mode 100644 index 91d13fd..0000000 --- a/glide2x/sst1/glide/tests/sst1img.bat +++ /dev/null @@ -1,48 +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_SRCIMG%]==[] goto Default - -goto Output - -:Default -set FX_GLIDE_TEST_SRCIMG=%BUILD_ROOT_SST1%\glide\images - -:Output -set sdir=%FX_GLIDE_TEST_SRCIMG% - -@echo on -test00 -d %sdir%\test00.vgm -sleep 1 -test01 -d %sdir%\test01.vgm -sleep 1 -test02 -d %sdir%\test02.vgm -sleep 1 -test03 -d %sdir%\test03.vgm -sleep 1 -test04 -d %sdir%\test04.vgm -sleep 1 -test05 -d %sdir%\test05.vgm -sleep 1 -test06 -d %sdir%\test06.vgm -sleep 1 -test07 -d %sdir%\test07.vgm -sleep 1 -test08 -d %sdir%\test08.vgm -sleep 1 -test09 -d %sdir%\test09.vgm -sleep 1 -test10 -d %sdir%\test10.vgm -sleep 1 -test13 -d %sdir%\test13.vgm -sleep 1 -test16 -d %sdir%\test16.vgm -sleep 1 -test17 -d %sdir%\test17.vgm -sleep 1 -test18 -d %sdir%\test18.vgm -sleep 1 -test19 -d %sdir%\test19.vgm -sleep 1 diff --git a/glide2x/sst1/glide/tests/test00.c b/glide2x/sst1/glide/tests/test00.c deleted file mode 100644 index 7fa5b61..0000000 --- a/glide2x/sst1/glide/tests/test00.c +++ /dev/null @@ -1,136 +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 -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test00"; -static const char purpose[] = "Clear screen to blue"; -static const char usage[] = "-n -r -d "; - -void -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; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs ) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - return; - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, 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 ); - - tlConOutput( "Press a key to quit\n" ); - - while( frames-- && tlOkToRender()) { - grBufferClear( 0xff0000, 0, GR_WDEPTHVALUE_FARTHEST ); - tlConRender(); - grBufferSwap( 1 ); - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - return; -} - diff --git a/glide2x/sst1/glide/tests/test01.c b/glide2x/sst1/glide/tests/test01.c deleted file mode 100644 index 1ec144b..0000000 --- a/glide2x/sst1/glide/tests/test01.c +++ /dev/null @@ -1,157 +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 -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test01"; -static const char purpose[] = "draws a diagonal line of points from top-left to bottom-right"; -static const char usage[] = "-n -r -d "; - -void -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; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs ) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - return; - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, 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 - flat shading */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grConstantColorValue( 0xFFFFFF ); - - - tlConOutput( "Press a key to quit\n" ); - while( frames-- && tlOkToRender()) { - int i; - GrVertex vtx; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - grBufferClear( 0x0, 0, GR_WDEPTHVALUE_FARTHEST ); - - - for( i = 0; i < 100; i++ ) { - float pos = ((float)i)/100.0f; - - vtx.x = tlScaleX( pos ), vtx.y = tlScaleY( pos ); - grDrawPoint( &vtx ); - } - - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - return; -} - - - - - diff --git a/glide2x/sst1/glide/tests/test02.c b/glide2x/sst1/glide/tests/test02.c deleted file mode 100644 index b877afe..0000000 --- a/glide2x/sst1/glide/tests/test02.c +++ /dev/null @@ -1,159 +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 -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test02"; -static const char purpose[] = "draws a parabolic envelope of lines"; -static const char usage[] = "-n -r -d "; - -void 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; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs ) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - return; - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, 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, 0xff0000 ); - - /* Set up Render State - flat shading */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grConstantColorValue( 0xFFFFFF ); - - - tlConOutput( "Press a key to quit\n" ); - while( frames-- && tlOkToRender()) { - int i; - GrVertex vtxA, vtxB; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00, 0, GR_WDEPTHVALUE_FARTHEST ); - - for( i = 0; i < 100; i++ ) { - float pos = ((float)i)/100.0f; - - vtxA.x = tlScaleX( pos ), vtxA.y = tlScaleY( 0.0f ); - vtxB.x = tlScaleX( 1.0f), vtxB.y = tlScaleY( pos ); - - grDrawLine( &vtxA, &vtxB ); - } - - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - return; -} - - - - - diff --git a/glide2x/sst1/glide/tests/test03.c b/glide2x/sst1/glide/tests/test03.c deleted file mode 100644 index fde691d..0000000 --- a/glide2x/sst1/glide/tests/test03.c +++ /dev/null @@ -1,154 +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 -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test03"; -static const char purpose[] = "draws gouraud shaded lines"; -static const char usage[] = "-n -r -d "; - -void 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; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs ) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - return; - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, 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 - gouraud shading */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - - tlConOutput( "Press a key to quit\n" ); - while( frames-- && tlOkToRender() ) { - GrVertex vtxA, vtxB; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - - grBufferClear( 0x00, 0, GR_WDEPTHVALUE_FARTHEST ); - - vtxA.x = tlScaleX( 0.0f ), vtxA.y = tlScaleY( 0.0f ); - vtxA.r = 255.0f, vtxA.g = 0.0f, vtxA.b = 0.0f; - - vtxB.x = tlScaleX( 1.0f ), vtxB.y = tlScaleY( 1.0f ); - vtxB.r = 0.0f, vtxB.g = 255.0f, vtxB.b = 0.0f; - - grDrawLine( &vtxA, &vtxB ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - return; -} - - - - - diff --git a/glide2x/sst1/glide/tests/test04.c b/glide2x/sst1/glide/tests/test04.c deleted file mode 100644 index 1295b12..0000000 --- a/glide2x/sst1/glide/tests/test04.c +++ /dev/null @@ -1,157 +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 -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test04"; -static const char purpose[] = "draws gouraud shaded triangle"; -static const char usage[] = "-n -r -d "; - -void 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; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs ) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - return; - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, 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 - gouraud shading */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - - tlConOutput( "Press a key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00, 0, GR_WDEPTHVALUE_FARTHEST ); - - vtxA.x = tlScaleX( 0.3f ), vtxA.y = tlScaleY( 0.3f ); - vtxA.r = 255.0f, vtxA.g = 0.0f, vtxA.b = 0.0f; - - vtxB.x = tlScaleX( 0.8f ), vtxB.y = tlScaleY( 0.4f ); - vtxB.r = 0.0f, vtxB.g = 255.0f, vtxB.b = 0.0f; - - vtxC.x = tlScaleX( 0.5f ), vtxC.y = tlScaleY( 0.8f ); - vtxC.r = 0.0f, vtxC.g = 0.0f, vtxC.b = 255.0f; - - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - return; -} - - - - - diff --git a/glide2x/sst1/glide/tests/test05.c b/glide2x/sst1/glide/tests/test05.c deleted file mode 100644 index 739bc4a..0000000 --- a/glide2x/sst1/glide/tests/test05.c +++ /dev/null @@ -1,191 +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 -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test05"; -static const char purpose[] = "renders two interpenetrating triangles with z-buffering"; -static const char usage[] = "-n -r -d "; - -void -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; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs ) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - return; - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, 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 - flat shading + Z-buffering */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grDepthBufferMode( GR_DEPTHBUFFER_ZBUFFER ); - grDepthBufferFunction( GR_CMP_GREATER ); - grDepthMask( FXTRUE ); - - tlConOutput( "Press a key to quit\n" ); - - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - float zDist; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - grBufferClear( 0x00, 0, GR_ZDEPTHVALUE_FARTHEST ); - - vtxA.x = tlScaleX( 0.25f ), vtxA.y = tlScaleY( 0.21f ); - vtxB.x = tlScaleX( 0.75f ), vtxB.y = tlScaleY( 0.21f ); - vtxC.x = tlScaleX( 0.5f ), vtxC.y = tlScaleY( 0.79f ); - - /*----------------------------------------------------------- - Depth values should be scaled from reciprocated Depth Value - then scaled from 0 to 65535.0. - - ooz = ( 1.0f / Z ) * 65535.0f = 65535.0f / Z - -----------------------------------------------------------*/ - - zDist = 10.0f; - vtxA.ooz = vtxB.ooz = vtxC.ooz = ( 65535.0f / zDist ); - - grConstantColorValue( 0x00808080 ); - - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - - vtxA.x = tlScaleX( 0.86f ), vtxA.y = tlScaleY( 0.21f ); - vtxB.x = tlScaleX( 0.86f ), vtxB.y = tlScaleY( 0.79f ); - vtxC.x = tlScaleX( 0.14f ), vtxC.y = tlScaleY( 0.5f ); - - /*----------------------------------------------------------- - Depth values should be scaled from reciprocated Depth Value - then scaled to ( 0, 65535 ) - - ooz = ( 1.0f / Z ) * 65535.0f = 65535.0f / Z - -----------------------------------------------------------*/ - - zDist = 12.5f; - vtxA.ooz = vtxB.ooz = ( 65535.0f / zDist ); - zDist = 7.5f; - vtxC.ooz = ( 65535.0f / zDist ); - - grConstantColorValue( 0x0000FF00 ); - - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - return; -} - - - - - diff --git a/glide2x/sst1/glide/tests/test06.c b/glide2x/sst1/glide/tests/test06.c deleted file mode 100644 index 23761e9..0000000 --- a/glide2x/sst1/glide/tests/test06.c +++ /dev/null @@ -1,188 +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 -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test06"; -static const char purpose[] = "renders two interpenetrating triangles with w-buffering"; -static const char usage[] = "-n -r -d "; - -void 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; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs ) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - return; - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, remArgs[0]); - } - } - - 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 - flat shading + w-buffering */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grDepthBufferMode( GR_DEPTHBUFFER_WBUFFER ); - grDepthBufferFunction( GR_CMP_LESS ); - grDepthMask( FXTRUE ); - - tlConOutput( "Press a key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - float wDist; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00, 0, GR_WDEPTHVALUE_FARTHEST ); - - vtxA.x = tlScaleX( 0.25f ), vtxA.y = tlScaleY( 0.21f ); - vtxB.x = tlScaleX( 0.75f ), vtxB.y = tlScaleY( 0.21f ); - vtxC.x = tlScaleX( 0.5f ), vtxC.y = tlScaleY( 0.79f ); - - /*----------------------------------------------------------- - OOW Values are in the range (1,1/65535) - - This can be the exact same computed 1/W that you use - for texture mapping. This saves on host computation and - vertex data transferred across the PCI bus. - -----------------------------------------------------------*/ - wDist = 10.0f; - vtxA.oow = vtxB.oow = vtxC.oow = ( 1.0f / wDist ); - - grConstantColorValue( 0x00808080 ); - - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - - vtxA.x = tlScaleX( 0.86f ), vtxA.y = tlScaleY( 0.21f ); - vtxB.x = tlScaleX( 0.86f ), vtxB.y = tlScaleY( 0.79f ); - vtxC.x = tlScaleX( 0.14f ), vtxC.y = tlScaleY( 0.5f ); - - /*----------------------------------------------------------- - OOW Values are in the range (1,1/65535) - - This can be the exact same computed 1/W that you use - for texture mapping. This saves on host computation and - vertex data transferred across the PCI bus. - -----------------------------------------------------------*/ - wDist = 12.5f; - vtxA.oow = vtxB.oow = ( 1.0f / wDist ); - wDist = 7.5f; - vtxC.oow = ( 1.0f / wDist ); - - grConstantColorValue( 0x0000FF00 ); - - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - return; -} - - - - - diff --git a/glide2x/sst1/glide/tests/test07.c b/glide2x/sst1/glide/tests/test07.c deleted file mode 100644 index dd912b6..0000000 --- a/glide2x/sst1/glide/tests/test07.c +++ /dev/null @@ -1,171 +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 -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test07"; -static const char purpose[] = "alpha blending test"; -static const char usage[] = "-n -r -d "; - -void 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; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs ) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - return; - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, 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 - flat shading + alpha blend on constant alpha */ - 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_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_SRC_ALPHA, GR_BLEND_ONE_MINUS_SRC_ALPHA, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - - - tlConOutput( "Press a key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00, 0, 0 ); - - vtxA.x = tlScaleX( 0.25f ), vtxA.y = tlScaleY( 0.21f ); - vtxB.x = tlScaleX( 0.75f ), vtxB.y = tlScaleY( 0.21f ); - vtxC.x = tlScaleX( 0.5f ), vtxC.y = tlScaleY( 0.79f ); - - grConstantColorValue( 0xFF0000FF ); - - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - - vtxA.x = tlScaleX( 0.86f ), vtxA.y = tlScaleY( 0.21f ); - vtxB.x = tlScaleX( 0.86f ), vtxB.y = tlScaleY( 0.79f ); - vtxC.x = tlScaleX( 0.14f ), vtxC.y = tlScaleY( 0.5f ); - - grConstantColorValue( 0x80FF0000 ); - - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - return; -} - - - - - diff --git a/glide2x/sst1/glide/tests/test08.c b/glide2x/sst1/glide/tests/test08.c deleted file mode 100644 index 63f3130..0000000 --- a/glide2x/sst1/glide/tests/test08.c +++ /dev/null @@ -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 -** -*/ - -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test08"; -static const char purpose[] = "fogging"; -static const char usage[] = "-n -r -d "; - -void 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; - FxBool scrgrab = FXFALSE; - char filename[256]; - - GrFog_t fogtable[GR_FOG_TABLE_SIZE]; - - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs ) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - return; - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, 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 - gouraud shading + fog */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grFogMode( GR_FOG_WITH_TABLE ); - grFogColorValue( 0xff00ff00 ); - guFogGenerateExp( fogtable, .01f ); - grFogTable( fogtable ); - - tlConOutput( "Press a key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - float wDist; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00, 0, 0 ); - - vtxA.x = tlScaleX( 0.0f ), vtxA.y = tlScaleY( 0.0f ); - vtxA.r = 0.0f, vtxA.g = 0.0f, vtxA.b = 64.0f; - wDist = 20.0f; - vtxA.oow = ( 1.0f / wDist ); - - vtxB.x = tlScaleX( 0.016f ), vtxB.y = tlScaleY( 1.0f ); - vtxB.r = 0.0f, vtxB.g = 0.0f, vtxB.b = 128.0f; - wDist = 2000.0f; - vtxB.oow = ( 1.0f / wDist ); - - vtxC.x = tlScaleX( 1.0f ), vtxC.y = tlScaleY( 0.0208f ); - vtxC.r = 0.0f, vtxC.g = 0.0f, vtxC.b = 64.0f; - wDist = 20.0f; - vtxC.oow = ( 1.0f / wDist ); - - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - return; -} - - - - - diff --git a/glide2x/sst1/glide/tests/test09.c b/glide2x/sst1/glide/tests/test09.c deleted file mode 100644 index 065e648..0000000 --- a/glide2x/sst1/glide/tests/test09.c +++ /dev/null @@ -1,212 +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 -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test09"; -static const char purpose[] = "chromakey - render a red and blue" - " triangle but chromakey one out"; -static const char usage[] = "-n -r -d "; - -void 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; - FxBool scrgrab = FXFALSE; - char filename[256]; - FxU8 subframe = 0; - - unsigned long chromaColor; - - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs ) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - return; - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 2; - strcpy(filename, 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 - gouraud shading + enable chromakey on blue */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grChromakeyMode( GR_CHROMAKEY_ENABLE ); - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - - chromaColor = BLUE; - grChromakeyValue( chromaColor ); - - tlConOutput( "Press to toggle chomakey color\n" ); - tlConOutput( "Press any other key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - switch( chromaColor ) { - case RED: - tlConOutput( "Chromakey RED \r" ); - break; - case BLUE: - tlConOutput( "Chromakey BLUE\r" ); - break; - } - - grBufferClear( 0x00, 0, 0 ); - - vtxA.x = tlScaleX( 0.5f ), vtxA.y = tlScaleY( 0.1f ); - vtxB.x = tlScaleX( 0.8f ), vtxB.y = tlScaleY( 0.9f ); - vtxC.x = tlScaleX( 0.2f ), vtxC.y = tlScaleY( 0.9f ); - - grConstantColorValue( RED ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - grSstOrigin( GR_ORIGIN_LOWER_LEFT ); - - grConstantColorValue( BLUE ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - grSstOrigin( GR_ORIGIN_UPPER_LEFT ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - char fname[256], tmp[32]; - FxU16 cnt; - - cnt = strcspn(filename, "."); - strncpy(fname, filename, cnt); - fname[cnt] = 0; - sprintf(tmp,"_%d\0", subframe); - strcat(fname, tmp); - strcat(fname, filename+cnt); - if (!tlScreenDump(fname, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - - /* cycle through all mode */ - if ( chromaColor == RED ) - chromaColor = BLUE; - else - chromaColor = RED; - grChromakeyValue( chromaColor ); - - subframe++; - /* scrgrab = FXFALSE; */ - } - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case ' ': - if ( chromaColor == RED ) - chromaColor = BLUE; - else - chromaColor = RED; - grChromakeyValue( chromaColor ); - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - return; -} - - - - - diff --git a/glide2x/sst1/glide/tests/test10.c b/glide2x/sst1/glide/tests/test10.c deleted file mode 100644 index cf6b927..0000000 --- a/glide2x/sst1/glide/tests/test10.c +++ /dev/null @@ -1,207 +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 -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test10"; -static const char purpose[] = "culling test - render a red and blue" - " triangle but cull one out - red positive" - ", blue negative"; -static const char usage[] = "-n -r -d "; - -void 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; - FxBool scrgrab = FXFALSE; - char filename[256]; - FxU8 subframe = 0; - - GrCullMode_t cullMode; - - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs ) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - return; - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 2; - strcpy(filename, 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 */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - cullMode = GR_CULL_POSITIVE; - grCullMode( cullMode ); - - tlConOutput( "Press to toggle cull orientation\n" ); - tlConOutput( "Press any other key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - switch( cullMode ) { - case GR_CULL_POSITIVE: - tlConOutput( "CULL POSITIVE\r" ); - break; - case GR_CULL_NEGATIVE: - tlConOutput( "CULL NEGATIVE\r" ); - break; - } - - grBufferClear( 0x00, 0, 0 ); - - vtxA.x = tlScaleX( 0.5f ), vtxA.y = tlScaleY( 0.1f ); - vtxB.x = tlScaleX( 0.8f ), vtxB.y = tlScaleY( 0.9f ); - vtxC.x = tlScaleX( 0.2f ), vtxC.y = tlScaleY( 0.9f ); - - grConstantColorValue( 0x000000ff ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - grSstOrigin( GR_ORIGIN_LOWER_LEFT ); - - grConstantColorValue( 0x00ff0000 ); - grDrawTriangle( &vtxA, &vtxC, &vtxB ); - - grSstOrigin( GR_ORIGIN_UPPER_LEFT ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - char fname[256], tmp[32]; - FxU16 cnt; - - cnt = strcspn(filename, "."); - strncpy(fname, filename, cnt); - fname[cnt] = 0; - sprintf(tmp,"_%d\0", subframe); - strcat(fname, tmp); - strcat(fname, filename+cnt); - if (!tlScreenDump(fname, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - - /* cycle through all mode */ - if ( cullMode == GR_CULL_POSITIVE ) - cullMode = GR_CULL_NEGATIVE; - else - cullMode = GR_CULL_POSITIVE; - grCullMode( cullMode ); - - subframe++; - } - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case ' ': - if ( cullMode == GR_CULL_POSITIVE ) - cullMode = GR_CULL_NEGATIVE; - else - cullMode = GR_CULL_POSITIVE; - grCullMode( cullMode ); - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - return; -} - - - - - diff --git a/glide2x/sst1/glide/tests/test11.c b/glide2x/sst1/glide/tests/test11.c deleted file mode 100644 index b44b8c5..0000000 --- a/glide2x/sst1/glide/tests/test11.c +++ /dev/null @@ -1,260 +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 -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test11"; -static const char purpose[] = "simple lfb read/write test"; -static const char usage[] = "-n -r "; - -static int rRandom(int s, int e); -static unsigned int iRandom (unsigned int maxr); - -void 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; - - static unsigned short colorBuf[64][64]; - static unsigned short grabBuf[64][64]; - - int x,y; - - /* 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() ); - return; - } - 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_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - disable dithering*/ - grDitherMode( GR_DITHER_DISABLE ); - - - /* Create Source Bitmap to be copied to framebuffer */ - for( y = 0; y < 64; y++ ) { - for( x = 0; x < 64; x++ ) { - FxU8 red = x << 2; - FxU8 grn = y << 2; - FxU8 blu = ( x + y )<<1; - colorBuf[y][x] = (red & 0xF8) << 8; - colorBuf[y][x] |= (grn & 0xFC) << 3; - colorBuf[y][x] |= (blu & 0xF8) >> 3; - } - } - - - tlConOutput( "Press any key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrLfbInfo_t info; - int startX, startY; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00, 0, 0 ); - - /* prepare info structure */ - info.size = sizeof( GrLfbInfo_t ); - - /* lock back buffer */ - if ( grLfbLock( GR_LFB_WRITE_ONLY, - GR_BUFFER_BACKBUFFER, - GR_LFBWRITEMODE_565, - GR_ORIGIN_UPPER_LEFT, - FXFALSE, - &info )==FXFALSE) { - tlConOutput( "Error, failed to take write lock\n" ); - break; - } - - if ( tlScaleX(1.0f) < 64.0 || - tlScaleY(1.0f) < 64.0 ) - return; - - /* generate random start position */ - startX = (int)rRandom( 64, (int)tlScaleX(1.0f) - 65 ); - startY = (int)rRandom( 64, (int)tlScaleY(1.0f) - 65 ); - - /* render image to back buffer */ - for( y = 0; y < 64; y++ ) { - for( x = 0; x < 64; x++ ) { - FxU16 *pixel = - (FxU16*)(((char*)info.lfbPtr) + - (y+startY)*info.strideInBytes+ - (x+startX)*2); - *pixel = colorBuf[y][x]; - } - } - /* unlock the backbuffer */ - grLfbUnlock( GR_LFB_WRITE_ONLY, GR_BUFFER_BACKBUFFER ); - - /* swap to front buffer */ - grBufferSwap( 1 ); - grBufferClear( 0,0,0 ); - - tlSleep( 1 ); - - /* lock the front buffer */ - if ( grLfbLock( GR_LFB_READ_ONLY, - GR_BUFFER_FRONTBUFFER, - GR_LFBWRITEMODE_ANY, - GR_ORIGIN_UPPER_LEFT, - FXFALSE, - &info )==FXFALSE) { - tlConOutput( "Error, failed to take read lock\n" ); - break; - } - - /* grab the source image out of the front buffer */ - for( y = 0; y < 64; y++ ) { - for( x = 0; x < 64; x++ ) { - FxU16 *pixel = - (FxU16*)(((char*)info.lfbPtr) + - (y+startY)*info.strideInBytes+ - (x+startX)*2); - grabBuf[y][x] = *pixel; - } - } - /* unlock the front buffer */ - grLfbUnlock( GR_LFB_READ_ONLY, GR_BUFFER_FRONTBUFFER ); - - tlConClear(); - - /* compare the source image to the readback image */ - if ( memcmp( colorBuf, grabBuf, sizeof( colorBuf ) ) ) { - tlConOutput( "Failed readback test\n" ); - } else { - tlConOutput( "Passed readback test\n" ); - } - - grBufferSwap( 1 ); - tlConOutput( "Press any key to quit\n" ); - tlConRender(); - grBufferSwap( 1 ); - - tlSleep( 1 ); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - return; -} - -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); -} - - - diff --git a/glide2x/sst1/glide/tests/test12.c b/glide2x/sst1/glide/tests/test12.c deleted file mode 100644 index c7fbd45..0000000 --- a/glide2x/sst1/glide/tests/test12.c +++ /dev/null @@ -1,345 +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 -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test12"; -static const char purpose[] = "lfb write modes, render buffer, pixpipe, yorigin test"; -static const char usage[] = "-n -r "; - - -static const char *originString[] = { - "GR_ORIGIN_UPPER_LEFT ", - "GR_ORIGIN_LOWER_RIGHT" -}; - -static const char *renderBufferString[] = { - "GR_BUFFER_FRONTBUFFER", - "GR_BUFFER_BACKBUFFER " -}; - -static const char *writeModeString[] = { - "GR_LFBWRITEMODE_565 ", - "GR_LFBWRITEMODE_555 ", - "GR_LFBWRITEMODE_1555 ", - "GR_LFBWRITEMODE_RESERVED1 ", - "GR_LFBWRITEMODE_888 ", - "GR_LFBWRITEMODE_8888 ", - "GR_LFBWRITEMODE_RESERVED2 ", - "GR_LFBWRITEMODE_RESERVED3 ", - "GR_LFBWRITEMODE_RESERVED4 ", - "GR_LFBWRITEMODE_RESERVED5 ", - "GR_LFBWRITEMODE_RESERVED6 ", - "GR_LFBWRITEMODE_RESERVED7 ", - "GR_LFBWRITEMODE_565_DEPTH ", - "GR_LFBWRITEMODE_555_DEPTH ", - "GR_LFBWRITEMODE_1555_DEPTH", - "GR_LFBWRITEMODE_ZA16 " -}; - -static const char *pixPipeString[] = { - "PIXELPIPE DISABLED", - "PIXELPIPE ENABLED " -}; - -void -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; - - TlTexture texture; - - GrOriginLocation_t lfbOrigin; - GrOriginLocation_t sstOrigin; - GrLfbWriteMode_t writeMode; - GrBuffer_t lfbBuffer; - GrBuffer_t sstBuffer; - GrBuffer_t curBuffer; - GrLfbInfo_t info; - FxBool pixPipe; - - /* 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() ); - return; - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - } - } - - if ( resolution == GR_RESOLUTION_NONE ) { - tlErrorMessage( "Error!: Frontbuffer rendering not supported in a window\n" ); - return; - } - - 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, 0.5f, - 60, 15, 0xffffff ); - - - /* Load source bitmap from a .3df file */ - assert( tlLoadTexture( "decal1.3df", - &texture.info, - &texture.tableType, - &texture.tableData ) ); - - lfbOrigin = GR_ORIGIN_UPPER_LEFT; - sstOrigin = GR_ORIGIN_UPPER_LEFT; - lfbBuffer = GR_BUFFER_BACKBUFFER; - sstBuffer = GR_BUFFER_BACKBUFFER; - curBuffer = GR_BUFFER_BACKBUFFER; - pixPipe = FXFALSE; - writeMode = GR_LFBWRITEMODE_565; - - info.size = sizeof( info ); - - while( frames-- && tlOkToRender()) { - - static const char *console = { - "Current Buffer: %s\n" - "1 - lock yOrigin (%s)\n" - "2 - glide yOrigin (%s)\n" - "3 - lfb render buffer (%s)\n" - "4 - glide render buffer (%s)\n" - "5 - pixpipe enable (%s)\n" - "6 - lfb write mode (%s)\n" - "Press any other key to quit\n" - }; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grRenderBuffer( GR_BUFFER_BACKBUFFER ); - grBufferClear( 0, 0, 0 ); - grRenderBuffer( GR_BUFFER_FRONTBUFFER ); - grBufferClear( 0, 0, 0 ); - grRenderBuffer( GR_BUFFER_BACKBUFFER ); - - - /* set Glide State */ - grRenderBuffer( sstBuffer ); - grSstOrigin( sstOrigin ); - - /* Attempt Lock */ - if ( grLfbLock( GR_LFB_WRITE_ONLY, - lfbBuffer, - writeMode, - lfbOrigin, - pixPipe, - &info ) ) { - int x, y; - FxU32 *longData = info.lfbPtr; - FxU16 *shortData = info.lfbPtr; - FxU16 *srcData = texture.info.data; - FxU32 longStride = info.strideInBytes >> 2; - FxU32 shortStride = info.strideInBytes >> 1; - FxU32 longColor; - FxU16 shortColor; - for( y = 0; y < 256; y++ ) - for( x = 0; x < 256; x++ ) { - switch( writeMode ) { - case GR_LFBWRITEMODE_565: - shortData[y*shortStride+x] = - srcData[y*256+x]; - break; - case GR_LFBWRITEMODE_555: - case GR_LFBWRITEMODE_1555: - shortColor = srcData[y*256+x]; - shortColor = - (0x8000) | // Alpha == 1 - ((shortColor >> 1) & 0x7C00) | - ((shortColor >> 1) & 0x03E0) | - ((shortColor) & 0x1f); - shortData[y*shortStride+x] = - shortColor; - break; - case GR_LFBWRITEMODE_888: - case GR_LFBWRITEMODE_8888: - longColor = srcData[y*256+x]; - longColor = - (0xFF000000) | - ((longColor<<8)&0x00F80000) | - ((longColor<<5)&0x0000FC00) | - ((longColor<<3)&0x000000F8); - longData[y*longStride+x] = longColor; - break; - case GR_LFBWRITEMODE_565_DEPTH: - longColor = srcData[y*256+x]; - longData[y*longStride+x] = longColor; - break; - case GR_LFBWRITEMODE_1555_DEPTH: - case GR_LFBWRITEMODE_555_DEPTH: - longColor = srcData[y*256+x]; - longColor = - (0x00008000) | - ((longColor>>1) & 0x00007C00) | - ((longColor>>1) & 0x000003E0) | - ((longColor ) & 0x0000001f); - longData[y*longStride+x] = longColor; - default: - break; - } - - } - - grLfbUnlock( GR_LFB_WRITE_ONLY, - lfbBuffer ); - - grRenderBuffer( GR_BUFFER_BACKBUFFER ); - - tlConClear(); - curBuffer = GR_BUFFER_BACKBUFFER; - tlConOutput( console, - renderBufferString[curBuffer], - originString[lfbOrigin], - originString[sstOrigin], - renderBufferString[lfbBuffer], - renderBufferString[sstBuffer], - pixPipeString[pixPipe], - writeModeString[writeMode] ); - tlConRender(); - grBufferSwap( 1 ); - tlSleep( 1 ); - tlConClear(); - curBuffer = GR_BUFFER_FRONTBUFFER; - tlConOutput( console, - renderBufferString[curBuffer], - originString[lfbOrigin], - originString[sstOrigin], - renderBufferString[lfbBuffer], - renderBufferString[sstBuffer], - pixPipeString[pixPipe], - writeModeString[writeMode] ); - tlConRender(); - grBufferSwap( 1 ); - tlSleep( 1 ); - } else { - grRenderBuffer( GR_BUFFER_BACKBUFFER ); - tlConClear(); - tlConOutput( console, - renderBufferString[curBuffer], - originString[lfbOrigin], - originString[sstOrigin], - renderBufferString[lfbBuffer], - renderBufferString[sstBuffer], - pixPipeString[pixPipe], - writeModeString[writeMode] ); - tlConOutput( "\nLock Failed....no output\n" ); - tlConRender(); - grBufferSwap( 1 ); - tlSleep( 1 ); - } - - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case '1': - lfbOrigin = !lfbOrigin; - break; - case '2': - sstOrigin = !sstOrigin; - break; - case '3': - lfbBuffer = !lfbBuffer; - break; - case '4': - sstBuffer = !sstBuffer; - break; - case '5': - pixPipe = !pixPipe; - break; - case '6': - writeMode++; - if ( writeMode > GR_LFBWRITEMODE_ZA16 ) - writeMode = GR_LFBWRITEMODE_565; - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - return; -} /* main */ - - - diff --git a/glide2x/sst1/glide/tests/test13.c b/glide2x/sst1/glide/tests/test13.c deleted file mode 100644 index 5dbf098..0000000 --- a/glide2x/sst1/glide/tests/test13.c +++ /dev/null @@ -1,174 +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 -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test13"; -static const char purpose[] = "iterated alpha test - blue triangle fades towards one vertex\n"; -static const char usage[] = "-n -r -d "; - -void 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; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs ) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - return; - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, 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, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - iterated alpha + constant color */ - 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 ); - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - - tlConOutput( "Press any key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00, 0, 0 ); - - vtxA.x = tlScaleX( 0.5f ), vtxA.y = tlScaleY( 0.1f ); - vtxB.x = tlScaleX( 0.8f ), vtxB.y = tlScaleY( 0.9f ); - vtxC.x = tlScaleX( 0.2f ), vtxC.y = tlScaleY( 0.9f ); - vtxA.a = vtxB.a = vtxC.a = 255.0f; - - grConstantColorValue( RED ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - grSstOrigin( GR_ORIGIN_LOWER_LEFT ); - - vtxA.a = 0.0f; - grConstantColorValue( BLUE ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - grSstOrigin( GR_ORIGIN_UPPER_LEFT ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - while( tlKbHit() ) { - switch( tlGetCH() ) { - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - return; -} diff --git a/glide2x/sst1/glide/tests/test14.c b/glide2x/sst1/glide/tests/test14.c deleted file mode 100644 index 1fb0a50..0000000 --- a/glide2x/sst1/glide/tests/test14.c +++ /dev/null @@ -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 -** -*/ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test14"; -static const char purpose[] = "depth bias test: vary depth bias \n" - "over time with two interpenetrating triangles"; -static const char usage[] = "-n -r "; - -void 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; - - short zBias; - short zDelta; - - /* 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() ); - return; - } - 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_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - iterated alpha + z buffering */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grDepthBufferMode( GR_DEPTHBUFFER_ZBUFFER ); - grDepthBufferFunction( GR_CMP_GREATER ); - grDepthMask( FXTRUE ); - - zBias = 0; - zDelta = 10; - -#define RED 0x000000ff -#define GREEN 0x0000ff00 -#define BLUE 0x00ff0000 -#define GRAY 0x00808080 - -#define MAX_ZBIAS 500 -#define MIN_ZBIAS -500 - - tlConOutput( "Press any key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - float zDist; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - if ( ( zBias > MAX_ZBIAS ) || - ( zBias < MIN_ZBIAS ) ) { - zDelta = -zDelta; - } - zBias += zDelta; - - tlConOutput( "DepthBiasLevel: %+.03d \r", zBias ); - - grBufferClear( 0x00, 0, GR_ZDEPTHVALUE_FARTHEST ); - - vtxA.x = tlScaleX( 0.25f ), vtxA.y = tlScaleY( 0.21f ); - vtxB.x = tlScaleX( 0.75f ), vtxB.y = tlScaleY( 0.21f ); - vtxC.x = tlScaleX( 0.5f ), vtxC.y = tlScaleY( 0.79f ); - zDist = 10.0f; - vtxA.ooz = vtxB.ooz = vtxC.ooz = ( 65535.0f / zDist ); - - grConstantColorValue( GRAY ); - - grDepthBiasLevel( zBias ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - vtxA.x = tlScaleX( 0.86f ), vtxA.y = tlScaleY( 0.21f ); - vtxB.x = tlScaleX( 0.86f ), vtxB.y = tlScaleY( 0.79f ); - vtxC.x = tlScaleX( 0.14f ), vtxC.y = tlScaleY( 0.5f ); - zDist = 12.5f; - vtxA.ooz = vtxB.ooz = ( 65535.0f / zDist ); - zDist = 7.5f; - vtxC.ooz = ( 65535.0f / zDist ); - - grConstantColorValue( GREEN ); - - grDepthBiasLevel( 0 ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - return; -} diff --git a/glide2x/sst1/glide/tests/test15.c b/glide2x/sst1/glide/tests/test15.c deleted file mode 100644 index 429d3b0..0000000 --- a/glide2x/sst1/glide/tests/test15.c +++ /dev/null @@ -1,217 +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 -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test15"; -static const char purpose[] = "clip rectangle testing - clip rectangle travels around screen"; -static const char usage[] = "-n -r "; - -void 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; - - float clipX, clipY, clipSize, clipSizeDelta, clipPosDelta; - - /* 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() ); - return; - } - 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_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - iterated alpha + z buffering */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - - clipX = 0.2f; - clipY = 0.5f; - clipSize = 0.3f; - - clipSizeDelta = 0.005f; - clipPosDelta = 0.01f; - -#define CLIPSIZE_MIN 0.05f -#define CLIPSIZE_MAX 0.6f - -#define GRAY 0x00808080 -#define BLACK 0x00000000 - - tlConOutput( "+/- - grow/shrink clip rectangle\n" ); - tlConOutput( "a/d - clip window left/right \n" ); - tlConOutput( "w/s - clip window up/down \n" ); - tlConOutput( "Press any other key to quit\n" ); - while( frames-- && tlOkToRender()) { - int x, y; - GrVertex vtxA, vtxB, vtxC; - int minx, miny, maxx, maxy; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grClipWindow( (int)tlScaleX(0.0f),(int)tlScaleY(0.0f), - (int)tlScaleX(1.0f),(int)tlScaleY(1.0f) ); - grBufferClear( BLACK, 0, GR_ZDEPTHVALUE_FARTHEST ); - - /* Set Clipping Rectangle */ - minx = (int)tlScaleX(clipX); - miny = (int)tlScaleY(clipY); - if ( (clipX+clipSize)>1.0f ) - maxx = (int)tlScaleX( 1.0f ); - else - maxx = (int)tlScaleX( clipX + clipSize ); - if ( (clipY+clipSize)>1.0f ) - maxy = (int)tlScaleY( 1.0f ); - else - maxy = (int)tlScaleY( clipY + clipSize ); - grClipWindow( minx, miny, maxx, maxy ); - - /* Draw 10x10 grid of triangles */ - for( y = 0; y < 10; y++ ) { - for( x = 0; x < 10; x++ ) { - /* - A - |\ - B-C - */ - vtxA.x = vtxB.x = tlScaleX( ((float)x)/10.0f ); - vtxA.y = tlScaleY( ((float)y)/10.0f ); - vtxB.y = vtxC.y = tlScaleY( (((float)y)/10.0f) + 0.1f ); - vtxC.x = tlScaleX( (((float)x)/10.0f) + 0.1f ); - - grConstantColorValue( GRAY ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - } - } - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case '+': - if ( clipSize < CLIPSIZE_MAX ) - clipSize += clipSizeDelta; - break; - case '-': - if ( clipSize > CLIPSIZE_MIN ) - clipSize -= clipSizeDelta; - break; - case 'a': - case 'A': - if ( clipX > 0.0f ) - clipX -= clipPosDelta; - if ( clipX < 0.0f ) clipX = 0.0f; - break; - case 'd': - case 'D': - if ( clipX < 1.0f ) - clipX += clipPosDelta; - break; - case 'w': - case 'W': - if ( clipY > 0.0f ) - clipY -= clipPosDelta; - if ( clipY < 0.0f ) clipY = 0.0f; - break; - case 's': - case 'S': - if ( clipY < 1.0f ) - clipY += clipPosDelta; - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - return; -} diff --git a/glide2x/sst1/glide/tests/test16.c b/glide2x/sst1/glide/tests/test16.c deleted file mode 100644 index bc000b6..0000000 --- a/glide2x/sst1/glide/tests/test16.c +++ /dev/null @@ -1,201 +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 -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test16"; -static const char purpose[] = "test grShamelessPlug and grSplash"; -static const char usage[] = "-n -r -d "; - -void 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; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs ) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - return; - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, 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, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - flat shading */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - -#define BLUE 0x00ff0000 -#define RED 0x000000ff -#define BLACK 0x00000000 - - tlConOutput( "p - toggle shameless plug on/off\n" ); - tlConOutput( "s - run the splash screen\n" ); - tlConOutput( "r - render splash continuously\n" ); - tlConOutput( "Press any other key to quit\n" ); - while( frames-- && tlOkToRender()) { - int x, y; - GrVertex vtxA, vtxB, vtxC, vtxD; - static int plug; - static int render; - static int frame = 1; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( BLACK, 0, GR_ZDEPTHVALUE_FARTHEST ); - - /* Draw 10x10 grid of triangles */ - for( y = 0; y < 10; y++ ) { - for( x = 0; x < 10; x++ ) { - /* - A-D - |\| - B-C - */ - vtxA.x = vtxB.x = tlScaleX( ((float)x)/10.0f ); - vtxA.y = vtxD.y = tlScaleY( ((float)y)/10.0f ); - vtxB.y = vtxC.y = tlScaleY( (((float)y)/10.0f) + 0.1f ); - vtxC.x = vtxD.x = tlScaleX( (((float)x)/10.0f) + 0.1f ); - - grConstantColorValue( RED ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - grConstantColorValue( BLUE ); - grDrawTriangle( &vtxA, &vtxC, &vtxD ); - } - } - - - if ( render ) { - grSplash( tlScaleX( 0.0f ), tlScaleY( 0.79f ), - tlScaleX( 0.2f ), tlScaleY( 0.2f ), - frame ); - frame++; - } - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case 'p': - case 'P': - plug = !plug; - grGlideShamelessPlug( plug ); - break; - case 's': - case 'S': - grSplash( 0.0f, 0.0f, scrWidth, scrHeight, 0 ); - break; - case 'r': - case 'R': - render = !render; - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - return; -} diff --git a/glide2x/sst1/glide/tests/test17.c b/glide2x/sst1/glide/tests/test17.c deleted file mode 100644 index 5c3ace6..0000000 --- a/glide2x/sst1/glide/tests/test17.c +++ /dev/null @@ -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 -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test17"; -static const char purpose[] = "texturing example, decal, rgb lit, white lit, flat lit"; -static const char usage[] = "-n -r -d "; - -typedef enum { DECAL, FLATLIT, RGBLIT, WHITELIT, SPECALPHA } TextureMode; -const char *textureModeNames[] = { - "DECAL TEXTURE ", - "FLAT SHADING * TEXTURE ", - "ITERATED RGB * TEXTURE ", - "INTENSITY LIGHTING * TEXTURE ", - "(ITRGB * TEXTURE)+WHITE SPECULAR" -}; - -void 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; - FxBool scrgrab = FXFALSE; - char filename[256]; - FxU8 subframe = 0; - - TlTexture texture; - - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs ) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - return; - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 5; - strcpy(filename, 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, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - Decal Texture - color combine set in render loop */ - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_NONE, - GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - - /* Load texture data into system ram */ - assert( tlLoadTexture( "miro.3df", - &texture.info, - &texture.tableType, - &texture.tableData ) ); - /* Download texture data to TMU */ - grTexDownloadMipMap( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - if ( texture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - texture.tableType, - &texture.tableData ); - } - - /* Select Texture As Source of all texturing operations */ - grTexSource( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - - /* Enable Bilinear Filtering + Mipmapping */ - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR ); - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_NEAREST, - FXFALSE ); - - tlConOutput( "m - change lighting mode\n" ); - tlConOutput( "Press any other key to quit\n\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC, vtxD; - static TextureMode textureMode; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0, 0, GR_ZDEPTHVALUE_FARTHEST ); - - tlConOutput( "Current Texture Mode: %s\r", - textureModeNames[textureMode] ); - - switch( textureMode ) { - case DECAL: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - break; - case FLATLIT: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_LOCAL, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - break; - case RGBLIT: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_LOCAL, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - break; - case WHITELIT: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_LOCAL_ALPHA, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - break; - case SPECALPHA: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA, - GR_COMBINE_FACTOR_LOCAL, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - break; - } - - /*---- - A-B - |\| - C-D - -----*/ - vtxA.oow = 1.0f; - vtxB = vtxC = vtxD = vtxA; - - vtxA.x = vtxC.x = tlScaleX( 0.2f ); - vtxB.x = vtxD.x = tlScaleX( 0.8f ); - vtxA.y = vtxB.y = tlScaleY( 0.2f ); - vtxC.y = vtxD.y = tlScaleY( 0.8f ); - - vtxA.tmuvtx[0].sow = vtxC.tmuvtx[0].sow = 0.0f; - vtxB.tmuvtx[0].sow = vtxD.tmuvtx[0].sow = 255.0f; - vtxA.tmuvtx[0].tow = vtxB.tmuvtx[0].tow = 0.0f; - vtxC.tmuvtx[0].tow = vtxD.tmuvtx[0].tow = 255.0f; - - vtxA.r = 255.0f, vtxA.g = 0.0f, vtxA.b = 0.0f, vtxA.a = 255.0f; - vtxB.r = 0.0f, vtxB.g = 255.0f, vtxB.b = 0.0f, vtxB.a = 128.0f; - vtxC.r = 0.0f, vtxC.g = 0.0f, vtxC.b = 255.0f, vtxC.a = 128.0f; - vtxD.r = 0.0f, vtxD.g = 0.0f, vtxD.b = 0.0f, vtxD.a = 0.0f; - - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - - grConstantColorValue( 0x00ff0000 ); - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - /* grab the frame buffer */ - if (scrgrab) { - char fname[256], tmp[32]; - FxU16 cnt; - - cnt = strcspn(filename, "."); - strncpy(fname, filename, cnt); - fname[cnt] = 0; - sprintf(tmp,"_%d\0", subframe); - strcat(fname, tmp); - strcat(fname, filename+cnt); - if (!tlScreenDump(fname, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - - /* cycle through all mode */ - textureMode++; - if ( textureMode > SPECALPHA ) textureMode = DECAL; - - subframe++; - } - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case 'm': - case 'M': - textureMode++; - if ( textureMode > SPECALPHA ) textureMode = DECAL; - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - return; -} diff --git a/glide2x/sst1/glide/tests/test18.c b/glide2x/sst1/glide/tests/test18.c deleted file mode 100644 index 2baa300..0000000 --- a/glide2x/sst1/glide/tests/test18.c +++ /dev/null @@ -1,258 +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 -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test18"; -static const char purpose[] = "alpha texture test"; -static const char usage[] = "-n -r -d "; - -void 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; - FxBool scrgrab = FXFALSE; - char filename[256]; - - TlTexture texture; - - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs ) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - return; - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, 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, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - Decal Texture - alpha blend */ - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - - /* Load texture data into system ram */ - assert( tlLoadTexture( "alpha.3df", - &texture.info, - &texture.tableType, - &texture.tableData ) ); - /* Download texture data to TMU */ - grTexDownloadMipMap( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - if ( texture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - texture.tableType, - &texture.tableData ); - } - - /* Select Texture As Source of all texturing operations */ - grTexSource( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - - /* Enable Bilinear Filtering + Mipmapping */ - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR ); - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_NEAREST, - FXFALSE ); - - tlConOutput( "Press any key to quit\n\n" ); - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC, vtxD; - int x,y; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0, 0, GR_ZDEPTHVALUE_FARTHEST ); - - /* Draw 10x10 grid of triangles */ - - 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_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_ONE, - GR_BLEND_ZERO, - GR_BLEND_ZERO, - GR_BLEND_ZERO ); - for( y = 0; y < 10; y++ ) { - for( x = 0; x < 10; x++ ) { - /* - A-D - |\| - B-C - */ - vtxA.x = vtxB.x = tlScaleX( ((float)x)/10.0f ); - vtxA.y = vtxD.y = tlScaleY( ((float)y)/10.0f ); - vtxB.y = vtxC.y = tlScaleY( (((float)y)/10.0f) + 0.1f ); - vtxC.x = vtxD.x = tlScaleX( (((float)x)/10.0f) + 0.1f ); - - grConstantColorValue( RED ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - grConstantColorValue( BLUE ); - grDrawTriangle( &vtxA, &vtxC, &vtxD ); - } - } - - /*---- - A-B - |\| - C-D - -----*/ - vtxA.oow = 1.0f; - vtxB = vtxC = vtxD = vtxA; - - vtxA.x = vtxC.x = tlScaleX( 0.2f ); - vtxB.x = vtxD.x = tlScaleX( 0.8f ); - vtxA.y = vtxB.y = tlScaleY( 0.2f ); - vtxC.y = vtxD.y = tlScaleY( 0.8f ); - - vtxA.tmuvtx[0].sow = vtxC.tmuvtx[0].sow = 0.0f; - vtxB.tmuvtx[0].sow = vtxD.tmuvtx[0].sow = 255.0f; - vtxA.tmuvtx[0].tow = vtxB.tmuvtx[0].tow = 0.0f; - vtxC.tmuvtx[0].tow = vtxD.tmuvtx[0].tow = 255.0f; - - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grAlphaCombine( 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 ); - - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - while( tlKbHit() ) { - switch( tlGetCH() ) { - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - return; -} diff --git a/glide2x/sst1/glide/tests/test19.c b/glide2x/sst1/glide/tests/test19.c deleted file mode 100644 index 9d8e512..0000000 --- a/glide2x/sst1/glide/tests/test19.c +++ /dev/null @@ -1,369 +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 -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test19"; -static const char purpose[] = "texture filter modes test"; -static const char usage[] = "-n -r -d "; - -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; - -typedef struct { - GrTexInfo info; - GrTexTable_t tableType; - TextureTable tableData; -} Texture; - -#define NO_TABLE ((GrTexTable_t)(~0)) - -static int loadTexture( const char *filename, - GrTexInfo *info, - GrTexTable_t *tableType, - void *table ); -static GrTexTable_t texTableType( GrTextureFormat_t format ); - -void 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; - FxBool scrgrab = FXFALSE; - char filename[256]; - FxU8 subframe = 0; - - Texture texture; - - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs ) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - return; - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 4; - strcpy(filename, 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, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - Decal Texture - DISABLE mipmapping */ - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_DISABLE, - FXFALSE ); - - /* Load texture data into system ram */ - assert( loadTexture( "miro.3df", - &texture.info, - &texture.tableType, - &texture.tableData ) ); - /* Download texture data to TMU */ - grTexDownloadMipMap( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - if ( texture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - texture.tableType, - &texture.tableData ); - } - - /* Select Texture As Source of all texturing operations */ - grTexSource( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - - - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - - - tlConOutput( "m - toggle magnify/minify texture\n" ); - tlConOutput( "f - toggle pointSample/Bilinear\n" ); - tlConOutput( "Press any other key to quit\n\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC, vtxD; - - static int minify; - static int bilerp; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0, 0, GR_ZDEPTHVALUE_FARTHEST ); - - /*---- - A-B - |\| - C-D - -----*/ - vtxA.oow = 1.0f; - vtxB = vtxC = vtxD = vtxA; - - if ( minify ) { - vtxA.x = vtxC.x = tlScaleX( 0.0f ); - vtxB.x = vtxD.x = tlScaleX( 1.0f ); - vtxA.y = vtxB.y = tlScaleY( 0.0f ); - vtxC.y = vtxD.y = tlScaleY( 1.0f ); - } else { /* magnify */ - vtxA.x = vtxC.x = tlScaleX( 0.45f ); - vtxB.x = vtxD.x = tlScaleX( 0.55f ); - vtxA.y = vtxB.y = tlScaleY( 0.45f ); - vtxC.y = vtxD.y = tlScaleY( 0.55f ); - } - - vtxA.tmuvtx[0].sow = vtxC.tmuvtx[0].sow = 0.0f; - vtxB.tmuvtx[0].sow = vtxD.tmuvtx[0].sow = 255.0f; - vtxA.tmuvtx[0].tow = vtxB.tmuvtx[0].tow = 0.0f; - vtxC.tmuvtx[0].tow = vtxD.tmuvtx[0].tow = 255.0f; - - if ( bilerp ) { - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR ); - tlConOutput( "GR_TEXTUREFILTER_BILINEAR \r" ); - } else { - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_POINT_SAMPLED, - GR_TEXTUREFILTER_POINT_SAMPLED ); - tlConOutput( "GR_TEXTUREFILTER_POINT_SAMPLED\r" ); - } - - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - /* grab the frame buffer */ - if (scrgrab) { - char fname[256], tmp[32]; - FxU16 cnt; - - cnt = strcspn(filename, "."); - strncpy(fname, filename, cnt); - fname[cnt] = 0; - sprintf(tmp,"_%d\0", subframe); - strcat(fname, tmp); - strcat(fname, filename+cnt); - if (!tlScreenDump(fname, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - - subframe++; - - /* cycle through all mode */ - switch (subframe) - { - case 0: - minify = 0; - bilerp = 0; - break; - case 1: - minify = 0; - bilerp = 1; - break; - case 2: - minify = 1; - bilerp = 0; - break; - case 3: - minify = 1; - bilerp = 1; - break; - } - } - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case 'm': - case 'M': - minify = !minify; - break; - case 'f': - case 'F': - bilerp = !bilerp; - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - return; -} - - -/*------------------------------------------------------ - Load Texture - - This example loads textures from a .3df file. 3DF files - containe pre-computed mipmaps data along with any - necessary supplementary information, for example - palettes, ncc-tables, level-of-detail description, - aspect ratio or format - - The gu3dfGetInfo and gu3dfLoad APIs load A 3DF file - into Gu3DfInfo structure from a file on disk. Data - can then be extracted from the gu3DfInfo structure - to initialize a GrTexInfo structure used in the - glide texturing routines. Also note that texture table - ( either NCC or Palette ) management is left up to the - application programmer. - ------------------------------------------------------*/ -static int loadTexture( const char *filename, - GrTexInfo *info, - GrTexTable_t *tableType, - void *table ) { - Gu3dfInfo tdfInfo; - int rv = 0; - - assert( filename ); - assert( info ); - assert( tableType ); - assert( table ); - if ( gu3dfGetInfo( filename, &tdfInfo ) ) { - tdfInfo.data = malloc( tdfInfo.mem_required ); - assert( tdfInfo.data ); - if ( gu3dfLoad( filename, &tdfInfo ) ) { - info->smallLod = tdfInfo.header.small_lod; - info->largeLod = tdfInfo.header.large_lod; - info->aspectRatio = tdfInfo.header.aspect_ratio; - info->format = tdfInfo.header.format; - info->data = tdfInfo.data; - *tableType = texTableType( info->format ); - switch( *tableType ) { - case GR_TEXTABLE_NCC0: - case GR_TEXTABLE_NCC1: - case GR_TEXTABLE_PALETTE: - memcpy( table, &(tdfInfo.table), sizeof( TextureTable ) ); - break; - default: - break; - } - rv = 1; - } - } - return rv; -} - -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; -} diff --git a/glide2x/sst1/glide/tests/test20.c b/glide2x/sst1/glide/tests/test20.c deleted file mode 100644 index 21c0e94..0000000 --- a/glide2x/sst1/glide/tests/test20.c +++ /dev/null @@ -1,320 +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 -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test20"; -static const char purpose[] = "mipmap modes"; -static const char usage[] = "-n -r "; - -typedef enum { DISABLE, NEAREST, TRILINEAR } MipMapMode; - - -void 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; - - TlTexture texture; - TlVertex3D srcVerts[4]; - float distance, dDelta; - - MipMapMode mipMapMode; - - /* 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() ); - return; - } - 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 - Decal Texture - bilinear */ - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR ); - - /* Load texture data into system ram */ - assert( tlLoadTexture( "decal1.3df", - &texture.info, - &texture.tableType, - &texture.tableData ) ); - /* Download texture data to TMU */ - grTexDownloadMipMap( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - if ( texture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - texture.tableType, - &texture.tableData ); - } - - /* Select Texture As Source of all texturing operations */ - grTexSource( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - - /* Initialize Source 3D data - Rectangle on X/Z Plane - Centered about Y Axis - - 0--1 Z+ - | | | - 2--3 - X+ - - */ - srcVerts[0].x = -0.5f, srcVerts[0].y = 0.0f, srcVerts[0].z = 0.5f, srcVerts[0].w = 1.0f; - srcVerts[1].x = 0.5f, srcVerts[1].y = 0.0f, srcVerts[1].z = 0.5f, srcVerts[1].w = 1.0f; - srcVerts[2].x = -0.5f, srcVerts[2].y = 0.0f, srcVerts[2].z = -0.5f, srcVerts[2].w = 1.0f; - srcVerts[3].x = 0.5f, srcVerts[3].y = 0.0f, srcVerts[3].z = -0.5f, srcVerts[3].w = 1.0f; - - srcVerts[0].s = 0.0f, srcVerts[0].t = 0.0f; - srcVerts[1].s = 1.0f, srcVerts[1].t = 0.0f; - srcVerts[2].s = 0.0f, srcVerts[2].t = 1.0f; - srcVerts[3].s = 1.0f, srcVerts[3].t = 1.0f; - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - -#define MAX_DIST 2.5f -#define MIN_DIST 1.0f - - distance = 1.0f; - dDelta = 0.01f; - - mipMapMode = DISABLE; - - tlConOutput( "m - change mipmapping mode\n" ); - tlConOutput( "Press any other key to quit\n\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC, vtxD; - TlVertex3D xfVerts[4]; - TlVertex3D prjVerts[4]; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00404040, 0, GR_ZDEPTHVALUE_FARTHEST ); - - - switch( mipMapMode ) { - case DISABLE: - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_DISABLE, - FXFALSE ); - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - tlConOutput( "GR_MIPMAP_DISABLE \r" ); - break; - case NEAREST: - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_NEAREST, - FXFALSE ); - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - tlConOutput( "GR_MIPMAP_NEAREST \r" ); - break; - case TRILINEAR: - tlConOutput( "GR_MIPMAP_TRILINEAR\r" ); - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_NEAREST, - FXTRUE ); - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_BLEND_LOCAL, - GR_COMBINE_FACTOR_LOD_FRACTION, - GR_COMBINE_FUNCTION_BLEND_LOCAL, - GR_COMBINE_FACTOR_LOD_FRACTION, - FXFALSE, - FXFALSE ); - break; - } - - - /*---- - A-B - |\| - C-D - -----*/ - vtxA.oow = 1.0f; - vtxB = vtxC = vtxD = vtxA; - - distance += dDelta; - if ( distance > MAX_DIST || - distance < MIN_DIST ) { - dDelta *= -1.0f; - distance += dDelta; - } - - tlSetMatrix( tlIdentity() ); - tlMultMatrix( tlXRotation( -20.0f ) ); - tlMultMatrix( tlTranslation( 0.0f, -0.3f, distance ) ); - - tlTransformVertices( xfVerts, srcVerts, 4 ); - tlProjectVertices( prjVerts, xfVerts, 4 ); - - vtxA.x = tlScaleX( prjVerts[0].x ); - vtxA.y = tlScaleY( prjVerts[0].y ); - vtxA.oow = 1.0f / prjVerts[0].w; - - vtxB.x = tlScaleX( prjVerts[1].x ); - vtxB.y = tlScaleY( prjVerts[1].y ); - vtxB.oow = 1.0f / prjVerts[1].w; - - vtxC.x = tlScaleX( prjVerts[2].x ); - vtxC.y = tlScaleY( prjVerts[2].y ); - vtxC.oow = 1.0f / prjVerts[2].w; - - vtxD.x = tlScaleX( prjVerts[3].x ); - vtxD.y = tlScaleY( prjVerts[3].y ); - vtxD.oow = 1.0f / prjVerts[3].w; - - vtxA.tmuvtx[0].sow = prjVerts[0].s * 255.0f * vtxA.oow; - vtxA.tmuvtx[0].tow = prjVerts[0].t * 255.0f * vtxA.oow; - - vtxB.tmuvtx[0].sow = prjVerts[1].s * 255.0f * vtxB.oow; - vtxB.tmuvtx[0].tow = prjVerts[1].t * 255.0f * vtxB.oow; - - vtxC.tmuvtx[0].sow = prjVerts[2].s * 255.0f * vtxC.oow; - vtxC.tmuvtx[0].tow = prjVerts[2].t * 255.0f * vtxC.oow; - - vtxD.tmuvtx[0].sow = prjVerts[3].s * 255.0f * vtxD.oow; - vtxD.tmuvtx[0].tow = prjVerts[3].t * 255.0f * vtxD.oow; - - - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - - if ( mipMapMode == TRILINEAR ) { - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ONE, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_BLEND_LOCAL, - GR_COMBINE_FACTOR_ONE_MINUS_LOD_FRACTION, - GR_COMBINE_FUNCTION_BLEND_LOCAL, - GR_COMBINE_FACTOR_ONE_MINUS_LOD_FRACTION, - FXFALSE, - FXFALSE ); - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ZERO, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - } - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case 'm': - case 'M': - mipMapMode++; - mipMapMode%=3; - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - return; -} - - - diff --git a/glide2x/sst1/glide/tests/test21.c b/glide2x/sst1/glide/tests/test21.c deleted file mode 100644 index 78e23e3..0000000 --- a/glide2x/sst1/glide/tests/test21.c +++ /dev/null @@ -1,374 +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 -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test21"; -static const char purpose[] = "texture compositing"; -static const char usage[] = "-n -r "; - -typedef enum { LIGHTMAP, SPECULAR, DETAIL } Mode; - -void 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; - - TlTexture baseTexture; - unsigned long baseTextureAddr; - TlTexture lightTexture; - unsigned long lightTextureAddr; - TlTexture detailTexture; - unsigned long detailTextureAddr; - - TlVertex3D srcVerts[4]; - float distance, dDelta; - - Mode mode; - - /* 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() ); - return; - } - 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 - decal - bilinear - nearest mipmapping */ - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_NEAREST, - FXFALSE ); - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR ); - - /* Load texture data into system ram */ - assert( tlLoadTexture( "decal1.3df", - &baseTexture.info, - &baseTexture.tableType, - &baseTexture.tableData ) ); - assert( tlLoadTexture( "light.3df", - &lightTexture.info, - &lightTexture.tableType, - &lightTexture.tableData ) ); - assert( tlLoadTexture( "lava.3df", - &detailTexture.info, - &detailTexture.tableType, - &detailTexture.tableData ) ); - - /* Download texture data to TMU */ - baseTextureAddr = grTexMinAddress( GR_TMU0 ); - grTexDownloadMipMap( GR_TMU0, - baseTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &baseTexture.info ); - if ( baseTexture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - baseTexture.tableType, - &baseTexture.tableData ); - } - - lightTextureAddr = - baseTextureAddr + - grTexTextureMemRequired( GR_MIPMAPLEVELMASK_BOTH, - &baseTexture.info ); - grTexDownloadMipMap( GR_TMU0, - lightTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &lightTexture.info ); - if ( lightTexture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - lightTexture.tableType, - &lightTexture.tableData ); - } - - detailTextureAddr = - lightTextureAddr + - grTexTextureMemRequired( GR_MIPMAPLEVELMASK_BOTH, - &lightTexture.info ); - grTexDownloadMipMap( GR_TMU0, - detailTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &detailTexture.info ); - if ( detailTexture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - detailTexture.tableType, - &detailTexture.tableData ); - } - - /* Initialize Source 3D data - Rectangle on X/Z Plane - Centered about Y Axis - - 0--1 Z+ - | | | - 2--3 - X+ - - */ - srcVerts[0].x = -0.5f, srcVerts[0].y = 0.0f, srcVerts[0].z = 0.5f, srcVerts[0].w = 1.0f; - srcVerts[1].x = 0.5f, srcVerts[1].y = 0.0f, srcVerts[1].z = 0.5f, srcVerts[1].w = 1.0f; - srcVerts[2].x = -0.5f, srcVerts[2].y = 0.0f, srcVerts[2].z = -0.5f, srcVerts[2].w = 1.0f; - srcVerts[3].x = 0.5f, srcVerts[3].y = 0.0f, srcVerts[3].z = -0.5f, srcVerts[3].w = 1.0f; - - srcVerts[0].s = 0.0f, srcVerts[0].t = 0.0f; - srcVerts[1].s = 1.0f, srcVerts[1].t = 0.0f; - srcVerts[2].s = 0.0f, srcVerts[2].t = 1.0f; - srcVerts[3].s = 1.0f, srcVerts[3].t = 1.0f; - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - -#define MAX_DIST 2.5f -#define MIN_DIST 1.0f - - distance = 1.0f; - dDelta = 0.01f; - - mode = LIGHTMAP; - - tlConOutput( "m - change texture compositing mode\n" ); - tlConOutput( "Press any other key to quit\n\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC, vtxD; - TlVertex3D xfVerts[4]; - TlVertex3D prjVerts[4]; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00404040, 0, GR_ZDEPTHVALUE_FARTHEST ); - - - /* 3D Transformations */ - /*---- - A-B - |\| - C-D - -----*/ - vtxA.oow = 1.0f; - vtxB = vtxC = vtxD = vtxA; - - distance += dDelta; - if ( distance > MAX_DIST || - distance < MIN_DIST ) { - dDelta *= -1.0f; - distance += dDelta; - } - - tlSetMatrix( tlIdentity() ); - tlMultMatrix( tlXRotation( -20.0f ) ); - tlMultMatrix( tlTranslation( 0.0f, -0.3f, distance ) ); - - tlTransformVertices( xfVerts, srcVerts, 4 ); - tlProjectVertices( prjVerts, xfVerts, 4 ); - - vtxA.x = tlScaleX( prjVerts[0].x ); - vtxA.y = tlScaleY( prjVerts[0].y ); - vtxA.oow = 1.0f / prjVerts[0].w; - - vtxB.x = tlScaleX( prjVerts[1].x ); - vtxB.y = tlScaleY( prjVerts[1].y ); - vtxB.oow = 1.0f / prjVerts[1].w; - - vtxC.x = tlScaleX( prjVerts[2].x ); - vtxC.y = tlScaleY( prjVerts[2].y ); - vtxC.oow = 1.0f / prjVerts[2].w; - - vtxD.x = tlScaleX( prjVerts[3].x ); - vtxD.y = tlScaleY( prjVerts[3].y ); - vtxD.oow = 1.0f / prjVerts[3].w; - - vtxA.tmuvtx[0].sow = prjVerts[0].s * 255.0f * vtxA.oow; - vtxA.tmuvtx[0].tow = prjVerts[0].t * 255.0f * vtxA.oow; - - vtxB.tmuvtx[0].sow = prjVerts[1].s * 255.0f * vtxB.oow; - vtxB.tmuvtx[0].tow = prjVerts[1].t * 255.0f * vtxB.oow; - - vtxC.tmuvtx[0].sow = prjVerts[2].s * 255.0f * vtxC.oow; - vtxC.tmuvtx[0].tow = prjVerts[2].t * 255.0f * vtxC.oow; - - vtxD.tmuvtx[0].sow = prjVerts[3].s * 255.0f * vtxD.oow; - vtxD.tmuvtx[0].tow = prjVerts[3].t * 255.0f * vtxD.oow; - - /* Render First Pass */ - switch( mode ) { - case LIGHTMAP: - case SPECULAR: - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, - FXFALSE ); - break; - case DETAIL: - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_BLEND_LOCAL, - GR_COMBINE_FACTOR_DETAIL_FACTOR, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, - FXFALSE ); - grTexDetailControl( GR_TMU0, 2, 7, 1.0f ); - break; - } - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ZERO, - GR_BLEND_ONE, GR_BLEND_ZERO ); - grTexSource( GR_TMU0, - baseTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &baseTexture.info ); - - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - - /* Render Second Pass */ - switch( mode ) { - case LIGHTMAP: - grAlphaBlendFunction( GR_BLEND_DST_COLOR, GR_BLEND_ZERO, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - grTexSource( GR_TMU0, - lightTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &lightTexture.info ); - tlConOutput( "LIGHTMAP - TEXTURE MODULATE \r" ); - break; - case DETAIL: - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_BLEND_LOCAL, - GR_COMBINE_FACTOR_ONE_MINUS_DETAIL_FACTOR, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ONE, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - grTexSource( GR_TMU0, - detailTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &detailTexture.info ); - tlConOutput( "DETAIL - BLEND ON LOD \r" ); - break; - case SPECULAR: - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ONE, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - grTexSource( GR_TMU0, - lightTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &lightTexture.info ); - tlConOutput( "SPECULAR - TEXTURE ACCUMULATE\r" ); - break; - } - - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case 'm': - case 'M': - mode++; - mode%=3; - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - return; -} - - - diff --git a/glide2x/sst1/glide/tests/test22.c b/glide2x/sst1/glide/tests/test22.c deleted file mode 100644 index 64e1ae8..0000000 --- a/glide2x/sst1/glide/tests/test22.c +++ /dev/null @@ -1,306 +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 -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test22"; -static const char purpose[] = "fog with multi-pass texturing"; -static const char usage[] = "-n -r "; - -void 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; - - TlTexture baseTexture; - unsigned long baseTextureAddr; - TlTexture lightTexture; - unsigned long lightTextureAddr; - - GrFog_t fogtable[GR_FOG_TABLE_SIZE]; - - TlVertex3D srcVerts[4]; - float distance, dDelta; - - /* 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() ); - return; - } - 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 - decal - bilinear - nearest mipmapping - fogging */ - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_NEAREST, - FXFALSE ); - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR ); - grFogColorValue( 0x404040 ); - guFogGenerateExp( fogtable, .2f ); - grFogTable( fogtable ); - - /* Load texture data into system ram */ - assert( tlLoadTexture( "decal1.3df", - &baseTexture.info, - &baseTexture.tableType, - &baseTexture.tableData ) ); - assert( tlLoadTexture( "light.3df", - &lightTexture.info, - &lightTexture.tableType, - &lightTexture.tableData ) ); - - /* Download texture data to TMU */ - baseTextureAddr = grTexMinAddress( GR_TMU0 ); - grTexDownloadMipMap( GR_TMU0, - baseTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &baseTexture.info ); - if ( baseTexture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - baseTexture.tableType, - &baseTexture.tableData ); - } - - lightTextureAddr = - baseTextureAddr + - grTexTextureMemRequired( GR_MIPMAPLEVELMASK_BOTH, - &baseTexture.info ); - grTexDownloadMipMap( GR_TMU0, - lightTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &lightTexture.info ); - if ( lightTexture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - lightTexture.tableType, - &lightTexture.tableData ); - } - - /* Initialize Source 3D data - Rectangle on X/Z Plane - Centered about Y Axis - - 0--1 Z+ - | | | - 2--3 - X+ - - */ - srcVerts[0].x = -0.5f, srcVerts[0].y = 0.0f, srcVerts[0].z = 0.5f, srcVerts[0].w = 1.0f; - srcVerts[1].x = 0.5f, srcVerts[1].y = 0.0f, srcVerts[1].z = 0.5f, srcVerts[1].w = 1.0f; - srcVerts[2].x = -0.5f, srcVerts[2].y = 0.0f, srcVerts[2].z = -0.5f, srcVerts[2].w = 1.0f; - srcVerts[3].x = 0.5f, srcVerts[3].y = 0.0f, srcVerts[3].z = -0.5f, srcVerts[3].w = 1.0f; - - srcVerts[0].s = 0.0f, srcVerts[0].t = 0.0f; - srcVerts[1].s = 1.0f, srcVerts[1].t = 0.0f; - srcVerts[2].s = 0.0f, srcVerts[2].t = 1.0f; - srcVerts[3].s = 1.0f, srcVerts[3].t = 1.0f; - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - -#define MAX_DIST 10.0f -#define MIN_DIST 1.0f - - distance = 1.0f; - dDelta = 0.05f; - - tlConOutput( "Press any key to quit\n\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC, vtxD; - TlVertex3D xfVerts[4]; - TlVertex3D prjVerts[4]; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00404040, 0, GR_ZDEPTHVALUE_FARTHEST ); - - - /* 3D Transformations */ - /*---- - A-B - |\| - C-D - -----*/ - vtxA.oow = 1.0f; - vtxB = vtxC = vtxD = vtxA; - - distance += dDelta; - if ( distance > MAX_DIST || - distance < MIN_DIST ) { - dDelta *= -1.0f; - distance += dDelta; - } - - tlSetMatrix( tlIdentity() ); - tlMultMatrix( tlXRotation( -90.0f ) ); - tlMultMatrix( tlTranslation( 0.0f, 0.0f, distance ) ); - - tlTransformVertices( xfVerts, srcVerts, 4 ); - tlProjectVertices( prjVerts, xfVerts, 4 ); - - vtxA.x = tlScaleX( prjVerts[0].x ); - vtxA.y = tlScaleY( prjVerts[0].y ); - vtxA.oow = 1.0f / prjVerts[0].w; - - vtxB.x = tlScaleX( prjVerts[1].x ); - vtxB.y = tlScaleY( prjVerts[1].y ); - vtxB.oow = 1.0f / prjVerts[1].w; - - vtxC.x = tlScaleX( prjVerts[2].x ); - vtxC.y = tlScaleY( prjVerts[2].y ); - vtxC.oow = 1.0f / prjVerts[2].w; - - vtxD.x = tlScaleX( prjVerts[3].x ); - vtxD.y = tlScaleY( prjVerts[3].y ); - vtxD.oow = 1.0f / prjVerts[3].w; - - vtxA.tmuvtx[0].sow = prjVerts[0].s * 255.0f * vtxA.oow; - vtxA.tmuvtx[0].tow = prjVerts[0].t * 255.0f * vtxA.oow; - - vtxB.tmuvtx[0].sow = prjVerts[1].s * 255.0f * vtxB.oow; - vtxB.tmuvtx[0].tow = prjVerts[1].t * 255.0f * vtxB.oow; - - vtxC.tmuvtx[0].sow = prjVerts[2].s * 255.0f * vtxC.oow; - vtxC.tmuvtx[0].tow = prjVerts[2].t * 255.0f * vtxC.oow; - - vtxD.tmuvtx[0].sow = prjVerts[3].s * 255.0f * vtxD.oow; - vtxD.tmuvtx[0].tow = prjVerts[3].t * 255.0f * vtxD.oow; - - /* Render First Pass */ - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ZERO, - GR_BLEND_ONE, GR_BLEND_ZERO ); - grTexSource( GR_TMU0, - baseTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &baseTexture.info ); - - grFogMode( GR_FOG_ADD2 | GR_FOG_WITH_TABLE ); - - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - - /* Render Second Pass */ - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_PREFOG_COLOR, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - grTexSource( GR_TMU0, - lightTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &lightTexture.info ); - - grFogMode( GR_FOG_MULT2 | GR_FOG_WITH_TABLE ); - - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - return; -} - - - diff --git a/glide2x/sst1/glide/tests/test23.c b/glide2x/sst1/glide/tests/test23.c deleted file mode 100644 index 986c4c2..0000000 --- a/glide2x/sst1/glide/tests/test23.c +++ /dev/null @@ -1,260 +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 -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test23"; -static const char purpose[] = "anti-aliased points test"; -static const char usage[] = "-n -r "; - -static int rRandom(int s, int e); -static unsigned int iRandom (unsigned int maxr); - -typedef enum { NORMAL, ANTIALIASED } Mode; - -void 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; - - Mode mode; - int speed; - - int i; - 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() ); - return; - } - 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 ); - grFogMode( GR_FOG_WITH_TABLE ); - grFogColorValue( 0x0 ); - guFogGenerateExp( fogtable, .8f ); - grFogTable( fogtable ); - 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; - speed = 0; - - tlConOutput( "a - toggles anti-aliasing\n" ); - tlConOutput( "s - toggles speed of rotation\n" ); - tlConOutput( "Press any key to quit\n\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA; - static TlVertex3D xfVerts[100]; - static TlVertex3D prjVerts[100]; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x0, 0, GR_ZDEPTHVALUE_FARTHEST ); - - /* 3D Transformations */ - if ( speed ) { - angle += 1.0f; - } else { - angle += 0.05f; - } - if ( angle >= 360.0f ) angle -= 360.0f; - - tlSetMatrix( tlIdentity() ); - tlMultMatrix( tlYRotation( angle ) ); - tlMultMatrix( tlTranslation( 0.0f, 0.0f, 1.5f ) ); - - tlTransformVertices( xfVerts, srcVerts, 100 ); - tlProjectVertices( prjVerts, xfVerts, 100 ); - - grConstantColorValue( 0xffffffff ); - - switch( mode ) { - case NORMAL: - tlConOutput( "NORMAL POINTS \r" ); - break; - case ANTIALIASED: - tlConOutput( "ANTIALIASED POINTS \r" ); - break; - } - - for( i = 0; i < 100; i++ ) { - vtxA.x = tlScaleX( prjVerts[i].x ); - vtxA.y = tlScaleY( prjVerts[i].y ); - vtxA.oow = 1.0f / prjVerts[i].w; - vtxA.a = 255.0f; - switch( mode ) { - case NORMAL: - grDrawPoint( &vtxA ); - break; - case ANTIALIASED: - grAADrawPoint( &vtxA ); - break; - } - } - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case 'a': - case 'A': - mode++; - mode%=2; - break; - case 's': - case 'S': - speed = !speed; - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - return; -} - -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); -} - - - - diff --git a/glide2x/sst1/glide/tests/test24.c b/glide2x/sst1/glide/tests/test24.c deleted file mode 100644 index 69d7ae1..0000000 --- a/glide2x/sst1/glide/tests/test24.c +++ /dev/null @@ -1,255 +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 -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#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 -r "; - -static int rRandom(int s, int e); -static unsigned int iRandom (unsigned int maxr); - -typedef enum { NORMAL, ANTIALIASED } Mode; - -void 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; - - Mode mode; - - int i; - 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() ); - return; - } - 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 ); - grFogMode( GR_FOG_WITH_TABLE ); - grFogColorValue( 0x0 ); - guFogGenerateExp( fogtable, .9f ); - grFogTable( fogtable ); - 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 ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - 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)) - - 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; - } - } - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case 'a': - case 'A': - mode++; - mode%=2; - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - return; -} - -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); -} - - - - diff --git a/glide2x/sst1/glide/tests/test25.c b/glide2x/sst1/glide/tests/test25.c deleted file mode 100644 index eb61186..0000000 --- a/glide2x/sst1/glide/tests/test25.c +++ /dev/null @@ -1,897 +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 -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -#define SNAP_COORD(v) ( ( v ) = (( float )( ( long )( ( v ) * 16 ) )) / 16.0f ) - -#define WREFWIDTH 640.f -#define WREFHEIGHT 480.f - -#define WINSCALEX(x) ((x/WREFWIDTH) * wWidth) -#define WINSCALEY(y) ((y/WREFHEIGHT) * wHeight) - -#ifndef M_PI -#define M_PI 3.14159265358979323846f -#endif -#define DEG2RAD( x ) ( (x) * M_PI / 180.0f ) - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test25"; -static const char purpose[] = "anti-aliased triangle test"; -static const char usage[] = "-n -r -b -t -aalphavalue"; - - -static void doHelp( void ) { - grBufferClear( 0, 0, 0 ); - tlConOutput("Keymap:\n"); - tlConOutput(" A or a: toggle Antialiasing\n"); - tlConOutput(" C or c: toggle Compositing\n"); - tlConOutput(" B or b: toggle Bilinear\n"); - tlConOutput(" F or f: toggle Front buffer \n"); - tlConOutput(" H, h, or ?: Help\n"); - tlConOutput(" I or i: toggle background Image\n"); - tlConOutput(" L or l: Draw lines\n"); - tlConOutput(" N or n: print performance Numbers\n"); - tlConOutput(" P or p: Pause rendering\n"); - tlConOutput(" R or r: Print screen Resolution\n"); - tlConOutput(" Q or q or esc: Quit\n"); - tlConOutput(" S or s: toggle hidden Surface removal (backface culling)\n"); - tlConOutput(" T or t: toggle Texturing\n"); - tlConOutput(" U or u: toggle shameless Plug\n"); - tlConOutput(" V or v: toggle VGA/Voodoo\n"); - tlConOutput("Press a key to continue...\n"); - tlConRender(); - grBufferSwap( 1 ); - tlGetCH(); - tlConClear(); -} - -typedef float Matrix[4][4]; -typedef float Point[3]; - -void MatMakeXRot( Matrix m, float radians ) -{ - float c = (float)cos( radians ); - float s = (float)sin( radians ); - - m[0][0] = 1.0f; m[0][1] = 0.0f; m[0][2] = 0.0f; m[0][3] = 0.0f; - m[1][0] = 0.0f; m[1][1] = c; m[1][2] = s; m[1][3] = 0.0f; - m[2][0] = 0.0f; m[2][1] = -s; m[2][2] = c; m[2][3] = 0.0f; - m[3][0] = 0.0f; m[3][1] = 0.0f; m[3][2] = 0.0f; m[3][3] = 1.0f; -} - -void MatMakeYRot( Matrix m, float radians ) -{ - float c = (float)cos( radians ); - float s = (float)sin( radians ); - - m[0][0] = c; m[0][1] = 0.0f; m[0][2] = -s; m[0][3] = 0.0f; - m[1][0] = 0.0f; m[1][1] = 1.0f; m[1][2] = 0.0f; m[1][3] = 0.0f; - m[2][0] = s; m[2][1] = 0.0f; m[2][2] = c; m[2][3] = 0.0f; - m[3][0] = 0.0f; m[3][1] = 0.0f; m[3][2] = 0.0f; m[3][3] = 1.0f; -} - -void MatMakeZRot( Matrix m, float radians ) -{ - float c = (float)cos( radians ); - float s = (float)sin( radians ); - - m[0][0] = c; m[0][1] = s; m[0][2] = 0.0f; m[0][3] = 0.0f; - m[1][0] = -s; m[1][1] = c; m[1][2] = 0.0f; m[1][3] = 0.0f; - m[2][0] = 0.0f; m[2][1] = 0.0f; m[2][2] = 1.0f; m[2][3] = 0.0f; - m[3][0] = 0.0f; m[3][1] = 0.0f; m[3][2] = 0.0f; m[3][3] = 1.0f; -} - -void MatMakeIdent( Matrix m ) -{ - int i, j; - - for( i = 0; i < 4; i++ ) - { - for( j = 0; j < 4; j++ ) - { - if( i == j ) - m[i][j] = 1.0f; - else - m[i][j] = 0.0f; - } - } -} - -void PointMatMult( GrVertex *result, GrVertex *v, Matrix m ) -{ - float w; - GrVertex ptmp; - - ptmp = *v; - ptmp.x = ( v->x * m[0][0] ) + ( v->y * m[1][0] ) + - ( v->z * m[2][0] ) + m[3][0]; - ptmp.y = ( v->x * m[0][1] ) + ( v->y * m[1][1] ) + - ( v->z * m[2][1] ) + m[3][1]; - ptmp.z = ( v->x * m[0][2] ) + ( v->y * m[1][2] ) + - ( v->z * m[2][2] ) + m[3][2]; - w = ( v->x * m[0][3] ) + ( v->y * m[1][3] ) + - ( v->z * m[2][3] ) + m[3][3]; - if( w != 0.0f ) { ptmp.x /= w; ptmp.y /= w; ptmp.z /= w; } - *result = ptmp; -} - -static int screenFulls[] = { - 320*200, - 320*240, - 400*256, - 512*384, - 640*200, - 640*350, - 640*400, - 640*480, - 800*600, - 960*720, - 856*480 -}; - -#define NTRIS 1 -#define NFRAMES 20 -#define NVERTS 3 - -void 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; - - float - minColor = 10.f, /* Vertex min color */ - maxColor = 245.f; /* Vertex max color */ - - GrVertex - localVerts[3], /* Vertices in world coordinates */ - texVerts[4]; /* Texture vertices for background */ - - float - alpha = 192.0f, /* Alpha for blending tringle over background */ - y_angle = 0.0f; /* rotation amount */ - - int - firstTime; /* Used for performance calculations */ - - GrPassthruMode_t - passthruMode = GR_PASSTHRU_SHOW_SST1; /* For toggling passthru */ - - FxBool - plugging = FXFALSE, /* Show shameless plug */ - printPerf = FXFALSE, /* Print performance numbers */ - lines = FXFALSE, /* Draw lines instead of triangles */ - blend = FXFALSE, /* Blend the triangle over the background */ - texturing = FXFALSE, /* Texture the tiangle */ - antialias = FXTRUE, /* Antialias the triangle? */ - bilinear = FXTRUE, /* Perform bilinear filtering on the texture? */ - render = FXTRUE, /* Draw? */ - backbuffer = FXTRUE, /* Draw to backbuffer? */ - background = FXTRUE; /* Draw background? */ - - GrOriginLocation_t - origin = GR_ORIGIN_LOWER_LEFT; /* Origin */ - - FxU32 - swapDelay = 1, /* Arg to grBufferSwap */ - trisDrawn, /* # triangles drawn */ - trisProcessed, /* # triangles through pipeline */ - lastFrame, /* Number of last frame we did perf stats */ - frameNum = 0L; /* id of each frame drawn */ - - GrCullMode_t - cullMode = GR_CULL_DISABLE; /* backface culling */ - - - GrMipMapId_t - triDecal, /* Triangle decal texture */ - bgDecal; /* Background decal texture */ - - Gu3dfInfo - bgInfo, /* Info on background texture */ - triInfo; /* Info on triangle texture */ - - GrColorCombineFnc_t - ccFnc = GR_COLORCOMBINE_ITRGB; /* Start of w/ Gouraud shading */ - - char - *bgFileName = NULL, /* Name of background texture file */ - *triFileName = NULL; /* Name of triangle texture file */ - - int - frameCount = 0; - - - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "nrbtea", &match, &remArgs ) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - return; - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'b': - bgFileName = strdup( remArgs[0] ); - break; - case 't': - triFileName = strdup( remArgs[0] ); - break; - case 'a': - alpha = (float)atof( 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, - origin, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 80, 40, 0xffffff ); - - if(frames == -1) { - doHelp(); - } - - localVerts[0].x = 0.f; - localVerts[0].y = 0.75f; - localVerts[0].z = 0.0f; - localVerts[0].tmuvtx[0].sow = 255.f; - localVerts[0].tmuvtx[0].tow = 255.f; - localVerts[0].oow = 1.f; - localVerts[0].r = maxColor; - localVerts[0].g = minColor; - localVerts[0].b = minColor; - localVerts[0].a = 255.f; - - localVerts[1].x = -0.75f; - localVerts[1].y = -0.75f; - localVerts[1].z = 0.0f; - localVerts[1].tmuvtx[0].sow = 0.f; - localVerts[1].tmuvtx[0].tow = 255.f; - localVerts[1].oow = 1.f; - localVerts[1].r = minColor; - localVerts[1].g = maxColor; - localVerts[1].b = minColor; - localVerts[1].a = 255.f; - - localVerts[2].x = 0.75f; - localVerts[2].y = -0.75f; - localVerts[2].z = 0.0f; - localVerts[2].tmuvtx[0].sow = 255.f; - localVerts[2].tmuvtx[0].tow = 0.f; - localVerts[2].oow = 1.f; - localVerts[2].r = minColor; - localVerts[2].g = minColor; - localVerts[2].b = maxColor; - localVerts[2].a = 255.f; - - texVerts[0].x = 0.f; - texVerts[0].y = 0.f; - texVerts[0].a = 255.f; - texVerts[0].oow = 1.f; - texVerts[0].tmuvtx[0].sow = 0.f * texVerts[0].oow; - texVerts[0].tmuvtx[0].tow = 255.f * texVerts[0].oow; - - texVerts[1].x = scrWidth; - texVerts[1].y = 0.f; - texVerts[1].a = 255.f; - texVerts[1].oow = 1.f; - texVerts[1].tmuvtx[0].sow = 255.f * texVerts[1].oow; - texVerts[1].tmuvtx[0].tow = 255.f * texVerts[1].oow; - - texVerts[2].x = scrWidth; - texVerts[2].y = scrHeight; - texVerts[2].a = 255.f; - texVerts[2].oow = 1.f; - texVerts[2].tmuvtx[0].sow = 255.f * texVerts[2].oow; - texVerts[2].tmuvtx[0].tow = 0.f * texVerts[2].oow; - - texVerts[3].x = 0.f; - texVerts[3].y = scrHeight; - texVerts[3].a = 255.f; - texVerts[3].oow = 1.f; - texVerts[3].tmuvtx[0].sow = 0.f * texVerts[3].oow; - texVerts[3].tmuvtx[0].tow = 0.f * texVerts[3].oow; - - if (bgFileName == NULL) - bgFileName = "miro.3df"; - if (triFileName == NULL) - triFileName = "matt1.3df"; - - /* Read in background texture file */ - if ( gu3dfGetInfo( bgFileName, &bgInfo ) ) { - bgInfo.data = malloc( bgInfo.mem_required ); - - if ( bgInfo.data == 0 ) { - fprintf( stderr, "out of memory for texture file %s\n", bgFileName ); - grGlideShutdown(); - exit( -1 ); - } - - if ( !gu3dfLoad( bgFileName, &bgInfo ) ) { - fprintf( stderr, "could not load texture file %s\n", bgFileName ); - grGlideShutdown(); - exit( -1 ); - } - - bgDecal = guTexAllocateMemory( 0, GR_MIPMAPLEVELMASK_BOTH, - bgInfo.header.width, bgInfo.header.height, - bgInfo.header.format, - GR_MIPMAP_NEAREST, - bgInfo.header.small_lod, bgInfo.header.large_lod, - bgInfo.header.aspect_ratio, - GR_TEXTURECLAMP_WRAP, GR_TEXTURECLAMP_WRAP, - GR_TEXTUREFILTER_BILINEAR, GR_TEXTUREFILTER_BILINEAR, - 0.0F, - FXFALSE ); - if ( bgDecal == GR_NULL_MIPMAP_HANDLE ) { - fprintf( stderr, "could not allocate memory for texture file %s\n", bgFileName ); - grGlideShutdown(); - exit( -1 ); - } - guTexDownloadMipMap( bgDecal, bgInfo.data, &bgInfo.table.nccTable ); - free( bgInfo.data ); - } else { - fprintf( stderr, "could not get info on %s\n", bgFileName ); - grGlideShutdown(); - exit( -1 ); - } - - if ( gu3dfGetInfo( triFileName, &triInfo ) ) { - triInfo.data = malloc( triInfo.mem_required ); - - if ( triInfo.data == 0 ) { - fprintf( stderr, "out of memory for texture file %s\n", triFileName ); - grGlideShutdown(); - exit( -1 ); - } - - if ( !gu3dfLoad( triFileName, &triInfo ) ) { - fprintf( stderr, "could not load texture file %s\n", triFileName ); - grGlideShutdown(); - exit( -1 ); - } - - triDecal = guTexAllocateMemory( 0, GR_MIPMAPLEVELMASK_BOTH, - triInfo.header.width, - triInfo.header.height, - triInfo.header.format, - GR_MIPMAP_NEAREST, - triInfo.header.small_lod, - triInfo.header.large_lod, - triInfo.header.aspect_ratio, - GR_TEXTURECLAMP_WRAP, - GR_TEXTURECLAMP_WRAP, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR, - 0.0F, - FXFALSE ); - if ( triDecal == GR_NULL_MIPMAP_HANDLE ) { - fprintf( stderr, "could not allocate memory for %s\n", triFileName ); - grGlideShutdown(); - exit( -1 ); - } - guTexDownloadMipMap( triDecal, triInfo.data, &triInfo.table.nccTable ); - free( triInfo.data ); - } else { - fprintf( stderr, "could not get info on %s\n", triFileName ); - grGlideShutdown(); - exit( -1 ); - } - - grTexCombineFunction(GR_TMU0, GR_TEXTURECOMBINE_DECAL); - grRenderBuffer(backbuffer == FXTRUE ? GR_BUFFER_BACKBUFFER : GR_BUFFER_FRONTBUFFER); - - /* Set up alpha blending for AA and compositing... */ - guAlphaSource( GR_ALPHASOURCE_ITERATED_ALPHA ); - grAlphaBlendFunction( GR_BLEND_SRC_ALPHA, - GR_BLEND_ONE_MINUS_SRC_ALPHA, GR_BLEND_ONE, - GR_BLEND_ZERO ); - grAlphaTestFunction( GR_CMP_ALWAYS ); - - - while ( 1 ) { - Matrix rotm; - GrVertex xformedVerts[4]; - int i; - - - MatMakeYRot( rotm, DEG2RAD( y_angle ) ); - - if (resolution == GR_RESOLUTION_NONE) - tlGetResolutionConstant("0", - &scrWidth, - &scrHeight ); - - - for( i = 0; i < 4; i++ ) { - PointMatMult( &xformedVerts[i], &localVerts[i], rotm ); - xformedVerts[i].x = xformedVerts[i].x / ( xformedVerts[i].z + 2.0f ); - xformedVerts[i].y = xformedVerts[i].y / ( xformedVerts[i].z + 2.0f ); - xformedVerts[i].x *= scrWidth / 2.0f; - xformedVerts[i].y *= scrHeight / 2.0f; - xformedVerts[i].x += scrWidth / 2.0f; - xformedVerts[i].y += scrHeight / 2.0f; - xformedVerts[i].oow = 1.f / ((xformedVerts[i].z + 2) * scrHeight); - xformedVerts[i].tmuvtx[0].sow *= xformedVerts[i].oow; - xformedVerts[i].tmuvtx[0].tow *= xformedVerts[i].oow; - SNAP_COORD( xformedVerts[i].x ); - SNAP_COORD( xformedVerts[i].y ); - } - - guColorCombineFunction( ccFnc ); - - /* grLfbBypassMode(GR_LFBBYPASS_ENABLE); */ - - if (render == FXTRUE) { - ++frameNum; - if ((frameNum % NFRAMES) == 0) { - if (printPerf) { - if (!firstTime) { - GrSstPerfStats_t - pStats; - FxU32 - lfbWritePixels, - nFrames = frameNum - lastFrame, - fillPixels = nFrames * screenFulls[resolution], - totFail; - - lastFrame = frameNum; - - grSstPerfStats(&pStats); - grTriStats(&trisProcessed, &trisDrawn); - - totFail = pStats.chromaFail + pStats.zFuncFail + - pStats.aFuncFail; - - lfbWritePixels = pStats.pixelsOut - pStats.pixelsIn - fillPixels; - - tlConOutput("In the last %d frames:\n", nFrames); - tlConOutput(" Pixels Processed: %d\n", - pStats.pixelsIn); - tlConOutput(" Chroma Failures: %d\n", - pStats.chromaFail); - tlConOutput(" Z Compare Failures: %d\n", - pStats.zFuncFail); - tlConOutput(" Alpha Compare Failures: %d\n", - pStats.aFuncFail); - tlConOutput(" Fast Fill Pixels: %d\n", - fillPixels); - tlConOutput(" LFB Write Pixels: %d\n", - lfbWritePixels); - tlConOutput(" Total Pixels Drawn: %d\n", - pStats.pixelsOut); - tlConOutput(" Triangles Processed %d\n", - trisProcessed); - tlConOutput(" Triangles Drawn %d\n", - trisDrawn); - - if ( - (pStats.pixelsOut - lfbWritePixels - fillPixels - pStats.pixelsIn) != totFail) - tlConOutput("Error: %d != %d\n", - pStats.pixelsOut - lfbWritePixels - fillPixels, - totFail); - - grSstResetPerfStats(); - } else { - lastFrame = frameNum; - grSstResetPerfStats(); - firstTime = 0; - } - } - } - grBufferClear( 0xffffffff, 0, GR_WDEPTHVALUE_FARTHEST ); - - if (background == FXTRUE) { - GrState - oldState; - - texVerts[0].x = 0.f; - texVerts[0].y = 0.f; - - texVerts[1].x = scrWidth; - texVerts[1].y = 0.f; - - texVerts[1].x = scrWidth; - texVerts[1].y = 0.f; - - texVerts[2].x = scrWidth; - texVerts[2].y = scrHeight; - - texVerts[3].x = 0.f; - texVerts[3].y = scrHeight; - - grGlideGetState(&oldState); - - grAlphaBlendFunction( - GR_BLEND_ONE, GR_BLEND_ZERO, - GR_BLEND_ONE, GR_BLEND_ZERO); - - grColorCombine( - GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, FXFALSE - ); - - guTexSource(bgDecal); - - for (i = 0; i < NTRIS; i++) { - grDrawTriangle(&texVerts[0], &texVerts[1], &texVerts[2]); - grDrawTriangle(&texVerts[2], &texVerts[3], &texVerts[0]); - } - grGlideSetState(&oldState); - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - - } - - if (texturing == FXTRUE) - guTexSource(bgDecal); - - if (texturing) - guTexSource(triDecal); - - if (antialias == FXTRUE) { - if (lines == FXTRUE) { - grAADrawLine(&xformedVerts[0], &xformedVerts[1]); - grAADrawLine(&xformedVerts[1], &xformedVerts[2]); - grAADrawLine(&xformedVerts[2], &xformedVerts[0]); - } else { - grAADrawTriangle( - &xformedVerts[0], &xformedVerts[1], - &xformedVerts[2], FXTRUE, FXTRUE, FXTRUE - ); - } - } else { - if (lines == FXTRUE) { - grDrawLine(&xformedVerts[0], &xformedVerts[1]); - grDrawLine(&xformedVerts[1], &xformedVerts[2]); - grDrawLine(&xformedVerts[2], &xformedVerts[0]); - } else { - grDrawTriangle( - &xformedVerts[0], &xformedVerts[1], - &xformedVerts[2] - ); - } - } - - if (plugging) - grSplash(0.f, 0.f, scrWidth / 5.f, scrHeight / 5.f, frameNum); - - if (backbuffer) { - tlConRender(); - grBufferSwap( swapDelay ); - } - } - - if (tlKbHit()) { - char c = (char) tlGetCH(); - - switch (c) { - case 'a': - case 'A': - if (antialias == FXFALSE) { - tlConOutput("Turning ON Antialiasing\n"); - antialias = FXTRUE; - } else { - tlConOutput("Turning OFF Antialiasing\n"); - antialias = FXFALSE; - } - break; - case 'B': - case 'b': - if (bilinear == FXFALSE) { - bilinear = FXTRUE; - tlConOutput("Turning ON BiLinear blending\n"); - guTexChangeAttributes( - triDecal, bgInfo.header.width, - bgInfo.header.height, - bgInfo.header.format, GR_MIPMAP_NEAREST, - bgInfo.header.small_lod, - bgInfo.header.large_lod, - bgInfo.header.aspect_ratio, - GR_TEXTURECLAMP_WRAP, GR_TEXTURECLAMP_WRAP, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR); - } else { - bilinear = FXFALSE; - tlConOutput("Turning OFF BiLinear blending\n"); - guTexChangeAttributes( - triDecal, bgInfo.header.width, - bgInfo.header.height, - bgInfo.header.format, GR_MIPMAP_NEAREST, - bgInfo.header.small_lod, - bgInfo.header.large_lod, - bgInfo.header.aspect_ratio, - GR_TEXTURECLAMP_WRAP, GR_TEXTURECLAMP_WRAP, - GR_TEXTUREFILTER_POINT_SAMPLED, - GR_TEXTUREFILTER_POINT_SAMPLED); - } - break; - - case 'c': - case 'C': - if (blend == FXTRUE) { - blend = FXFALSE; - localVerts[0].a = 255.0f; - localVerts[1].a = 255.0f; - localVerts[2].a = 255.0f; - localVerts[3].a = 255.0f; - } else { - blend = FXTRUE; - localVerts[0].a = alpha; - localVerts[1].a = alpha; - localVerts[2].a = alpha; - localVerts[3].a = alpha; - } - break; - - case 'd': - case 'D': - tlConOutput("vtxa = (%.2f, %.2f), vtxb = (%.2f, %.2f), vtxc = (%.2f, %.2f)\n", - xformedVerts[0].x, xformedVerts[0].y, - xformedVerts[1].x, xformedVerts[1].y, - xformedVerts[2].x, xformedVerts[2].y - ); - break; - - case 'f': - case 'F': - if (backbuffer == FXTRUE) { - backbuffer = FXFALSE; - grRenderBuffer(GR_BUFFER_FRONTBUFFER); - } else { - backbuffer = FXTRUE; - grRenderBuffer(GR_BUFFER_BACKBUFFER); - } - break; - - case 'g': - case 'G': -#if 0 - grLfbBegin(); - - grLfbWriteMode(GR_LFBWRITEMODE_565); - grLfbOrigin(GR_ORIGIN_UPPER_LEFT); - grLfbGetReadPtr(GR_BUFFER_FRONTBUFFER); - tlConOutput("Press a key to get front buffer\n"); - while (!tlKbHit()); - c = (char) tlGetCH(); - guFbReadRegion(0,0,(int)wWidth,(int)scrHeight,scrnImage,(int)wWidth * sizeof(FxU16)); - tlConOutput("Press a key to put image in back buffer and swap\n"); - while (!tlKbHit()); - tlGetCH(); - - grLfbGetWritePtr(GR_BUFFER_BACKBUFFER); - guFbWriteRegion(0,0,(int)wWidth,(int)scrHeight,scrnImage,(int)wWidth * sizeof(FxU16)); - grBufferSwap(swapDelay); - - tlConOutput("Press a key to continue...\n"); - while (!tlKbHit()); - tlGetCH(); - - grLfbEnd(); -#endif - break; - - case 'h': - case 'H': - case '?': - doHelp(); - break; - - case 'i': - case 'I': - if (background == FXTRUE) { - background = FXFALSE; - tlConOutput("Turning off background\n"); - } else { - tlConOutput("Turning on background\n"); - background = FXTRUE; - } - break; - - case 'l': - case 'L': - if (lines == FXTRUE) { - lines = FXFALSE; - tlConOutput("Turning OFF lines\n"); - } else { - lines = FXTRUE; - tlConOutput("Turning ON lines\n"); - } - break; - case 'm': - case 'M': - ccFnc = GR_COLORCOMBINE_TEXTURE_TIMES_ITRGB; - break; - - case 'n': - case 'N': - if (printPerf == FXFALSE) { - printPerf = FXTRUE; - firstTime = 1; - grSstResetPerfStats(); - grResetTriStats(); - } else { - printPerf= FXFALSE; - } - break; - - case 'o': - case 'O': - if (origin == GR_ORIGIN_LOWER_LEFT) - origin = GR_ORIGIN_UPPER_LEFT; - else - origin = GR_ORIGIN_LOWER_LEFT; - - grSstOrigin(origin); - break; - - case 'p': - case 'P': - if (render == FXTRUE) - render = FXFALSE; - else - render = FXTRUE; - break; - - case 'q': - case 'Q': - case 27: - grGlideShutdown(); - exit(0); - break; - - case 'r': - case 'R': - tlConOutput("Screen Resolution is %s\n", tlGetResolutionString( resolution ) ); - break; - - case 'S': - case 's': - if (cullMode == GR_CULL_DISABLE) { - cullMode = GR_CULL_NEGATIVE; - tlConOutput("Turning ON backface culling (hidden Surface removal)\n"); - } else { - cullMode = GR_CULL_DISABLE; - tlConOutput("Turning OFF backface culling (hidden Surface removal)\n"); - } - grCullMode(cullMode); - break; - case 'T': - case 't': - if (texturing == FXFALSE) { - tlConOutput("Turning ON texturing\n"); - ccFnc = GR_COLORCOMBINE_DECAL_TEXTURE; - texturing = FXTRUE; - } else { - tlConOutput("Turning OFF texturing\n"); - ccFnc = GR_COLORCOMBINE_ITRGB; - texturing = FXFALSE; - } - break; - case 'u': - case 'U': - if (plugging == FXTRUE) - plugging = FXFALSE; - else - plugging = FXTRUE; - - grGlideShamelessPlug(plugging); - break; - - case 'v': - case 'V': - if (passthruMode == GR_PASSTHRU_SHOW_VGA) { - passthruMode = GR_PASSTHRU_SHOW_SST1; - tlConOutput("Changing Passthru to show Voodoo\n"); - } - else { - passthruMode = GR_PASSTHRU_SHOW_VGA; - tlConOutput("Changing Passthru to show VGA\n"); - } - /* grSstPassthruMode(passthruMode); */ - break; - - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case '0': - { - char str[256]; - swapDelay = (int) c - 0x30; - sprintf(str, "Swapdelay = %d\n", swapDelay); - tlConOutput(str); - } - break; - } - } - - if (render) { - y_angle += 2.f; - if( y_angle > 360.0f ) - y_angle -= 360.0f; - } - frameCount++; - if(frameCount < 0) - frameCount = 0; - if(frames == frameCount) - break; - } - grGlideShutdown(); -} diff --git a/glide2x/sst1/glide/tests/test26.c b/glide2x/sst1/glide/tests/test26.c deleted file mode 100644 index c96fbef..0000000 --- a/glide2x/sst1/glide/tests/test26.c +++ /dev/null @@ -1,375 +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 -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test26"; -static const char purpose[] = "tests grLfbWriteRegion, and grLfbReadRegion"; -static const char usage[] = "-b <# color buffers> -d <# aux buffers> -n -r "; - -static const char *renderBufferString[] = { - "GR_BUFFER_FRONTBUFFER", - "GR_BUFFER_BACKBUFFER " -}; - -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 " -}; - - -void 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; - int bufCount = 2; - int auxBuf = 1; - - TlTexture texture; - void *image; - void *readImage; - FxU32 bpp; - - GrLfbSrcFmt_t sourceFormat; - - static FxU32 imageWidth; - static FxU32 imageHeight; - - static void imageConvert( void *dst, - void *src, - GrLfbSrcFmt_t format, - FxU32 *bpp ); - - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "bdnr", &match, &remArgs ) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - return; - } - switch( match ) { - case 'b': - bufCount = atoi(remArgs[0]); - if (bufCount < 2) bufCount = 2; - if (bufCount > 3) bufCount = 3; - break; - - case 'd': - auxBuf = atoi(remArgs[0]); - if (auxBuf > 1) auxBuf = 1; - if (auxBuf < 0) auxBuf = 0; - break; - - 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_UPPER_LEFT, - bufCount, auxBuf ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xffffff ); - - /* Set up Render State - disable dithering */ - grDitherMode( GR_DITHER_DISABLE ); - - /* Load image from disk */ - assert( tlLoadTexture( "decal1.3df", - &texture.info, - &texture.tableType, - &texture.tableData ) ); - - imageWidth = 256; - imageHeight = 256; - image = calloc( imageWidth * imageHeight, sizeof( FxU32 ) ); - readImage = calloc( imageWidth * imageHeight, sizeof( FxU32 ) ); - - if ( ( imageWidth > (FxU32)scrWidth ) || - ( imageHeight > (FxU32)scrHeight ) ) { - char errMsg[1024]; - sprintf(errMsg, - "imgWidth: %d, imgHeight: %d\nscrWidth: %d, scrHeight: %d\n", - (int) imageWidth, (int) imageHeight, - (int) scrWidth, (int) scrHeight); - - tlErrorMessage(errMsg); - return; - } - - sourceFormat = GR_LFB_SRC_FMT_565; - - imageConvert( image, texture.info.data, sourceFormat, &bpp ); - - while( frames-- ) { - static int x = 0, y = 0; - - if (!tlOkToRender()) - continue; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00303030, 0, 0 ); - - - if ( ( imageWidth < (FxU32)tlScaleX(1.0f) ) && - ( imageHeight < (FxU32)tlScaleY(1.0f) ) && - grLfbWriteRegion( GR_BUFFER_BACKBUFFER, - x, y, sourceFormat, - imageWidth, imageHeight, 256*bpp, image ) ) { - tlConClear(); - tlConOutput( "Width - %d\n", imageWidth); - tlConOutput( "1 - lfb source format (%s)\n" - "+/- - change width of source image copied\n" - " any other key to quit\n\n", - sourceFormatString[sourceFormat] ); - - if ( sourceFormat == GR_LFB_SRC_FMT_565 ) { - memcpy(readImage, image, 256 * 256 * sizeof(FxU16)); - grLfbReadRegion( GR_BUFFER_BACKBUFFER, - x, y, imageWidth, imageHeight, - 256 * 2, readImage ); - if ( memcmp( image, readImage, 256*256*2 ) ) { - FILE* bufFile = fopen("fuckme.txt", "w"); - - if (bufFile != NULL) { - int i, j; - const FxU16* imagePtr = (const FxU16*)image; - const FxU16* readPtr = (const FxU16*)readImage; - - for(i = 0; i < 256; i++) { - for(j = 0; j < 256; j++) { - if (imagePtr[i * 256 + j] != readPtr[i * 256 + j]) { - fprintf(bufFile, "(0x%X 0x%X) : 0x%hX : 0x%hX\n", - j, i, imagePtr[i * 256 + j], readPtr[i * 256 + j]); - } - } - } - fclose(bufFile); - } - - grBufferSwap(1); - grBufferSwap(1); - - tlConOutput( "Failed Readback Test\n" ); - - grBufferClear(0x00303030, 0, 0); - grLfbWriteRegion(GR_BUFFER_BACKBUFFER, - x, y, sourceFormat, - imageWidth, imageHeight, - 256 * bpp, readImage); - - grBufferSwap(1); - grBufferSwap(1); - } else { - tlConOutput( "Passed Readback Test\n" ); - } - } - } else { - tlConClear(); - tlConOutput( "1 - lfb source format (%s)\n" - "+/- - change width of source image copied\n" - "any other key to quit\n\n", - sourceFormatString[sourceFormat] ); - tlConOutput( "grLfbWriteRegion Failed\n" ); - } - - x++; - if ( x + 256 >= (int)tlScaleX(1.0f) ) { - x = 0; y++; - } - if ( y + 256 >= (int)tlScaleY(1.0f) ) { - y = 0; - } - - tlConRender(); - grBufferSwap( 1 ); - while( tlKbHit() ) { - switch( tlGetCH() ) { - case '1': - sourceFormat++; - if ( sourceFormat > GR_LFB_SRC_FMT_ZA16 ) - sourceFormat = GR_LFB_SRC_FMT_565; - imageConvert( image, texture.info.data, sourceFormat, &bpp ); - break; - case '+': - if ( imageWidth < 256 ) imageWidth++; - break; - case '-': - if ( imageWidth > 0 ) imageWidth--; - break; - default: - frames = 0; - break; - } - - imageHeight = imageWidth; - } - } - - grGlideShutdown(); - return; -} - - -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 = 256; - FxU32 shortStride = 256; - 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 < 256; y++ ) { - for( x = 0; x < 256; x++ ) { - switch( format ) { - case GR_LFB_SRC_FMT_565: - shortData[y*shortStride+x] = srcData[y*256+x]; - break; - - case GR_LFB_SRC_FMT_555: - case GR_LFB_SRC_FMT_1555: - shortColor = srcData[y*256+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*256+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*256+x]; - longData[y*longStride+x] = longColor; - break; - - case GR_LFB_SRC_FMT_1555_DEPTH: - case GR_LFB_SRC_FMT_555_DEPTH: - longColor = srcData[y*256+x]; - longColor = ((0x00008000) | - ((longColor>>1) & 0x00007C00) | - ((longColor>>1) & 0x000003E0) | - ((longColor ) & 0x0000001f)); - longData[y*longStride+x] = longColor; - break; - - default: - break; - } - } - } -} - - - diff --git a/glide2x/sst1/glide/tests/test27.c b/glide2x/sst1/glide/tests/test27.c deleted file mode 100644 index 7267962..0000000 --- a/glide2x/sst1/glide/tests/test27.c +++ /dev/null @@ -1,203 +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 -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test27"; -static const char purpose[] = "Cycle the 3D hardware on and off"; -static const char usage[] = "-n -r "; - -static int rRandom(int s, int e); -static unsigned int iRandom (unsigned int maxr); - -#define SNAP_BIAS ((float)(3<<18)) - -void 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; - int doNothing = 0; - - int cycles; - - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "Nnr", &match, &remArgs ) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - return; - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'N': - doNothing = 1; - 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 ); - - - cycles = 0; - while( frames-- && tlOkToRender()) { - GrVertex a, b, c; - char inchar; - - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, - 1 ) ); - - /* - * Don't like gotos? In the immortal words of Schwarzenegger - * (Total Recall): "...so sue me d**khead" - */ - if (doNothing) goto doNothing; - - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xffffff ); - - - /* deal with dynamic resizing */ - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, &scrWidth, &scrHeight); - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - tlConOutput( "Press to cycle hardware\n" ); - tlConOutput( "Any other key to quit\n" ); - - grBufferClear( 0x000000, 0, GR_WDEPTHVALUE_FARTHEST ); - - a.r = a.g = a.b = 0.0f; - b = c = a; - - a.x = tlScaleX(((float)rRandom( 0, 100 ))/100.0f) + SNAP_BIAS; - a.y = tlScaleY(((float)rRandom( 0, 100 ))/100.0f) + SNAP_BIAS; - a.r = 255.0f; - - b.x = tlScaleX(((float)rRandom( 0, 100 ))/100.0f) + SNAP_BIAS; - b.y = tlScaleY(((float)rRandom( 0, 100 ))/100.0f) + SNAP_BIAS; - b.g = 255.0f; - - c.x = tlScaleX(((float)rRandom( 0, 100 ))/100.0f) + SNAP_BIAS; - c.y = tlScaleY(((float)rRandom( 0, 100 ))/100.0f) + SNAP_BIAS; - c.b = 255.0f; - - grDrawTriangle( &a, &b, &c ); - - tlConOutput( "Cycle: %d\r", cycles ); - tlConRender(); - grBufferSwap( 1 ); - -doNothing: - inchar = tlGetCH(); - if ( inchar != ' ' ) frames = 0; - - grSstWinClose(); - cycles++; - } - - grGlideShutdown(); - return; -} - -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); -} - - - diff --git a/glide2x/sst1/glide/tests/test28.c b/glide2x/sst1/glide/tests/test28.c deleted file mode 100644 index 7abc0cb..0000000 --- a/glide2x/sst1/glide/tests/test28.c +++ /dev/null @@ -1,229 +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 -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - -#include -#include - -#define PI 3.141592653589793 -#define RAD_TO_DEG(t) ((t) * 180.0 / PI) -#define DEG_TO_RAD(t) ((t) * PI / 180.0) - -typedef struct _RGB { - float r, g, b; -} RGB, *RGBPtr; - - -#define FUDGE(x) ((x) * 255.0f) -#define PHASE(x, y, m) (((x) + (y)) % (m)) - -static float -value(float n1, float n2, float hue) -{ - float retval; - - if (hue > 360.0f) hue -= 360.0f; - if (hue < 0.0f) hue += 360.0f; - - if (hue < 60.0f) { - retval = n1 + (n2 - n1) * hue / 60.0f; - } else if (hue < 180.0f) { - retval = n2; - } else if (hue < 240.0f) { - retval = n1 + (n2 - 1.0f) * (240.0f - hue) / 60.0f; - } else { - retval = n1; - } -// assert((retval >= 0.0f) && (retval <= 1.0f)); - if (retval < 0.0f) retval = 0.0f; - if (retval > 1.0f) retval = 1.0f; - return FUDGE(retval); -} - -static void -hlsToRGB(float h, float l, float s, RGBPtr color) -{ - float p1, p2; - - p2 = (l <= 0.5f) ? l * (1.0f + s) : l + s - l * s; - p1 = 2 * l - p2; - - if (s == 0.0f) { - color->r = color->g = color->b = l; - } else { - color->r = value(p1, p2, h+120.0f); - color->g = value(p1, p2, h); - color->b = value(p1, p2, h-120.0f); - } - -} /* end hlsToRGB() */ - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test28"; -static const char purpose[] = "planar polygon test"; -static const char usage[] = "-n -r "; - -void 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; -#define NVERT 5 - GrVertex vtx[NVERT]; - int index[NVERT]; - int frames = -1; - int i, idx; -#define NHUE 360 - RGB hues[NHUE]; - - /* 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() ); - return; - } - 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_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xffffff ); - - /* Set up Render State - gouraud shading */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - -// grRenderBuffer(GR_BUFFER_FRONTBUFFER); /* debug only */ - - tlConOutput( "Press a key to quit\n" ); - - /* init a table of hues */ - for (i=0; i -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test29"; -static const char purpose[] = "oow diff hint"; -static const char usage[] = "-n -r "; - -void 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; - - TlTexture texture; - TlVertex3D srcVerts[4]; - float distance, dDelta; - - /* 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() ); - return; - } - 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 - Decal Texture - bilinear */ - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_POINT_SAMPLED, - GR_TEXTUREFILTER_POINT_SAMPLED ); - - /* Load texture data into system ram */ - assert( tlLoadTexture( "decal1.3df", - &texture.info, - &texture.tableType, - &texture.tableData ) ); - /* Download texture data to TMU */ - grTexDownloadMipMap( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - if ( texture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - texture.tableType, - &texture.tableData ); - } - - /* Select Texture As Source of all texturing operations */ - grTexSource( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_NEAREST, - FXFALSE ); - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - - /* enable oow depth buffering */ - grDepthBufferMode( GR_DEPTHBUFFER_WBUFFER ); - grDepthBufferFunction( GR_CMP_LESS ); - grDepthMask( FXTRUE ); - - /* Set hint to separate w for depth and tex */ - grHints( GR_HINT_STWHINT, GR_STWHINT_W_DIFF_TMU0 ); - /* oow for the texture coords will be set to one - in effect disabling perspective correction */ - - /* Initialize Source 3D data - Rectangle on X/Z Plane - Centered about Y Axis - - 0--1 Z+ - | | | - 2--3 - X+ - - */ - srcVerts[0].x = -0.5f, srcVerts[0].y = 0.0f, srcVerts[0].z = 0.5f, srcVerts[0].w = 1.0f; - srcVerts[1].x = 0.5f, srcVerts[1].y = 0.0f, srcVerts[1].z = 0.5f, srcVerts[1].w = 1.0f; - srcVerts[2].x = -0.5f, srcVerts[2].y = 0.0f, srcVerts[2].z = -0.5f, srcVerts[2].w = 1.0f; - srcVerts[3].x = 0.5f, srcVerts[3].y = 0.0f, srcVerts[3].z = -0.5f, srcVerts[3].w = 1.0f; - - srcVerts[0].s = 0.0f, srcVerts[0].t = 0.0f; - srcVerts[1].s = 1.0f, srcVerts[1].t = 0.0f; - srcVerts[2].s = 0.0f, srcVerts[2].t = 1.0f; - srcVerts[3].s = 1.0f, srcVerts[3].t = 1.0f; - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - -#define MAX_DIST 2.5f -#define MIN_DIST 1.0f - - distance = 1.0f; - dDelta = 0.01f; - - tlConOutput( "Press any key to quit\n\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC, vtxD; - TlVertex3D xfVerts[4]; - TlVertex3D prjVerts[4]; - - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - - grBufferClear( 0x00404040, 0, GR_WDEPTHVALUE_FARTHEST ); - - - /*---- - A-B - |\| - C-D - -----*/ - vtxA.oow = 1.0f; - vtxB = vtxC = vtxD = vtxA; - - distance += dDelta; - if ( distance > MAX_DIST || - distance < MIN_DIST ) { - dDelta *= -1.0f; - distance += dDelta; - } - - tlSetMatrix( tlIdentity() ); - tlMultMatrix( tlXRotation( -20.0f ) ); - tlMultMatrix( tlTranslation( 0.0f, -0.3f, distance ) ); - - tlTransformVertices( xfVerts, srcVerts, 4 ); - tlProjectVertices( prjVerts, xfVerts, 4 ); - - vtxA.x = tlScaleX( prjVerts[0].x ); - vtxA.y = tlScaleY( prjVerts[0].y ); - vtxA.oow = 1.0f / prjVerts[0].w; - - vtxB.x = tlScaleX( prjVerts[1].x ); - vtxB.y = tlScaleY( prjVerts[1].y ); - vtxB.oow = 1.0f / prjVerts[1].w; - - vtxC.x = tlScaleX( prjVerts[2].x ); - vtxC.y = tlScaleY( prjVerts[2].y ); - vtxC.oow = 1.0f / prjVerts[2].w; - - vtxD.x = tlScaleX( prjVerts[3].x ); - vtxD.y = tlScaleY( prjVerts[3].y ); - vtxD.oow = 1.0f / prjVerts[3].w; - - vtxA.tmuvtx[0].oow = 1.0f; - vtxA.tmuvtx[0].sow = prjVerts[0].s * 255.0f * vtxA.tmuvtx[0].oow; - vtxA.tmuvtx[0].tow = prjVerts[0].t * 255.0f * vtxA.tmuvtx[0].oow; - - vtxB.tmuvtx[0].oow = 1.0f; - vtxB.tmuvtx[0].sow = prjVerts[1].s * 255.0f * vtxB.tmuvtx[0].oow; - vtxB.tmuvtx[0].tow = prjVerts[1].t * 255.0f * vtxB.tmuvtx[0].oow; - - vtxC.tmuvtx[0].oow = 1.0f; - vtxC.tmuvtx[0].sow = prjVerts[2].s * 255.0f * vtxC.tmuvtx[0].oow; - vtxC.tmuvtx[0].tow = prjVerts[2].t * 255.0f * vtxC.tmuvtx[0].oow; - - vtxD.tmuvtx[0].oow = 1.0f; - vtxD.tmuvtx[0].sow = prjVerts[3].s * 255.0f * vtxD.tmuvtx[0].oow; - vtxD.tmuvtx[0].tow = prjVerts[3].t * 255.0f * vtxD.tmuvtx[0].oow; - - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - return; -} - - - diff --git a/glide2x/sst1/glide/tests/testdesc.txt b/glide2x/sst1/glide/tests/testdesc.txt deleted file mode 100644 index 2bd5594..0000000 --- a/glide2x/sst1/glide/tests/testdesc.txt +++ /dev/null @@ -1,46 +0,0 @@ -************************************************* -TEST NAMES - -test00 - buffer clear -test01 - draw points -test02 - draw lines -test03 - gouraud lines -test04 - gouraud triangle -test05 - z buffer -test06 - w buffer -test07 - alpha blend -test08 - fog -test09 - chromakey -test10 - backface culling -test11 - lfb -test12 - lfb + renderbuffer + yorigin -test13 - iterated alpha -test14 - depth bias -test15 - clip rectangle -test16 - shameless plug and splash screen -test17 - decal texture - rgb lit texture - white lit texture -test18 - texture alpha -test19 - texture filters -test20 - mipmap modes ( nomip, mip, trilinear ) -test21 - texture compositing ( lightmap, detail, specular ) -test22 - multi-pass fog -test23 - anti-aliased points -test24 - anti-aliased lines -test25 - anti-aliased triangles -test26 - grLfbWriteRegion -test27 - cycle 3d hardware on and off, excersie open/close -test28 - planar polygon test -test29 - simple palette texture test -test30 - hints - separate texture, polygon oow -test32 - Mindlessly simple multiple board test - -qatest00 - Texture download, multibase, LOD downloads, Partial LODs -qatest01 - Alliance Buffer Swap bug - -Tests that should be done -* - anti-aliased polygons -* - clipped polygons -* - gratuitous c++ test -* - alpha test -* - alpha selects lighting -* - cockpit bit diff --git a/glide2x/sst1/glide/tests/testimg.bat b/glide2x/sst1/glide/tests/testimg.bat deleted file mode 100644 index 04431eb..0000000 --- a/glide2x/sst1/glide/tests/testimg.bat +++ /dev/null @@ -1,48 +0,0 @@ -@echo off -REM -REM if FX_GLIDE_TEST_DSTIMG is not initiated, the default directory is -REM \3dfx\devel\sst1\glide\images -REM -if [%FX_GLIDE_TEST_DSTIMG%]==[] goto Default - -goto Output - -:Default -set FX_GLIDE_TEST_DSTIMG=%BUILD_ROOT_SST1%\glide\images - -:Output -set tdir=%FX_GLIDE_TEST_DSTIMG% - -@echo on -test00 -d %tdir%\test00.tst -sleep 1 -test01 -d %tdir%\test01.tst -sleep 1 -test02 -d %tdir%\test02.tst -sleep 1 -test03 -d %tdir%\test03.tst -sleep 1 -test04 -d %tdir%\test04.tst -sleep 1 -test05 -d %tdir%\test05.tst -sleep 1 -test06 -d %tdir%\test06.tst -sleep 1 -test07 -d %tdir%\test07.tst -sleep 1 -test08 -d %tdir%\test08.tst -sleep 1 -test09 -d %tdir%\test09.tst -sleep 1 -test10 -d %tdir%\test10.tst -sleep 1 -test13 -d %tdir%\test13.tst -sleep 1 -test16 -d %tdir%\test16.tst -sleep 1 -test17 -d %tdir%\test17.tst -sleep 1 -test18 -d %tdir%\test18.tst -sleep 1 -test19 -d %tdir%\test19.tst -sleep 1 diff --git a/glide2x/sst1/glide/tests/tldata.inc b/glide2x/sst1/glide/tests/tldata.inc deleted file mode 100644 index c8682db..0000000 --- a/glide2x/sst1/glide/tests/tldata.inc +++ /dev/null @@ -1,69 +0,0 @@ - - -static unsigned char fontData[] = { -0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, -0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - diff --git a/glide2x/sst1/glide/tests/tlib.c b/glide2x/sst1/glide/tests/tlib.c deleted file mode 100644 index 825e08c..0000000 --- a/glide2x/sst1/glide/tests/tlib.c +++ /dev/null @@ -1,1863 +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 -#include -#ifndef __linux__ -#include -#else -#include -#endif -#include -#include -#include -#include -#include - -#include - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) -#include -#else -#endif - -#ifdef __DJGPP__ -#include -int crt0_startup_flags = _CRT0_FLAG_NONMOVE_SBRK; -#endif - -#include "tlib.h" - -static FxBool okToRender = FXTRUE; -static FxBool fullScreen = FXTRUE; - - -FxBool -tlOkToRender() -{ - return okToRender; -} /* tlOkToRender */ - -/*------------------------------------------------------------------- - Function:tlGetOpt - Date: 2/26 - Implementor(s): jdt - Library: Test Library - Description: - Incrementally search an argument list for matches. - Arguments: - argc - first argument to main - argv - second argument to main - tags - string of non-whitespace characters to be search for in the - argument string - match - pointer to storage for matched character - remArgs - pointer to storage for remaining arglist after any match - Return: - 1 if matched - 0 if no more arguments - -1 if unrecognized - -------------------------------------------------------------------*/ -int tlGetOpt( int argc, char *argv[], - const char *tags, char *match, - char **remArgs[] ){ - static int firstCall; - static int lastArg; - - int rv = 0; - - if ( !firstCall ) { - lastArg = 1; - firstCall = 1; - } - - while( (lastArg|[]{}! "; - -static const int fontWidth = 9*2; -static const int fontHeight = 12*2; -static const int charsPerLine = 14; - -static int fontInitialized; - -static void grabTex( FxU32 addr, void *storage ); -static void putTex( FxU32 addr, void *storage ); -static void consoleScroll( void ); -static void drawChar( char character, float x, float y, float w, float h ); - -#include "tldata.inc" - -/*------------------------------------------------------------------- - Function: tlSetConsole - Date: 2/28 - Implementor(s): jdt - Library: Test Library - Description: - Initialize Console for printing. The console will scroll text - 60 column text in the window described by minx, miny, maxx, maxy. - Arguments: - minX, minY - upper left corner of console - maxX, maxY - lower right corner of console - rows - rows of text to display - columns - columns to display before scroll - Return: - none - -------------------------------------------------------------------*/ -static char *consoleGrid; -static int consoleRows; -static int consoleColumns; -static int consoleX; -static int consoleY; -static int consoleColor; -static float consoleOriginX; -static float consoleOriginY; -static float consoleCharWidth; -static float consoleCharHeight; - -void tlConSet( float minX, float minY, - float maxX, float maxY, - int columns, int rows, - int color ) { - int entry; - char xCoord; - char yCoord; - - fontInfo.smallLod = GR_LOD_128; - fontInfo.largeLod = GR_LOD_128; - fontInfo.aspectRatio = GR_ASPECT_2x1; - fontInfo.format = GR_TEXFMT_ALPHA_8; - fontInfo.data = &fontData[0]; - - if ( getenv( "FX_GLIDE_NO_FONT" ) ) { - fontInitialized = 0; - return; - } - - for( entry = 1; entry < 128; entry++ ) { - char *hit = strchr( fontString, entry ); - if ( hit ) { - int offset = hit - fontString; - - xCoord = ( offset % charsPerLine ) * fontWidth; - yCoord = ( offset / charsPerLine ) * fontHeight; - - fontTable[entry][0] = xCoord; - fontTable[entry][1] = yCoord; - } - } - - if ( consoleGrid ) free( consoleGrid ); - - consoleGrid = calloc( sizeof( char ), rows * columns ); - memset( consoleGrid, 32, rows*columns ); - consoleRows = rows; - consoleColumns = columns; - consoleX = consoleY = 0; - - consoleColor = color; - consoleOriginX = minX; - consoleOriginY = minY; - consoleCharWidth = ( (maxX - minX)/(float)columns ); - consoleCharHeight = ( (maxY - minY)/(float)rows ); - - fontAddress = grTexMaxAddress( 0 ) - - grTexCalcMemRequired( fontInfo.smallLod, fontInfo.largeLod, - fontInfo.aspectRatio, fontInfo.format ); - - fontInitialized = 1; - - return; -}; - -#ifdef __linux__ -static void strupr(char *str) { - while (*str) { - if (islower(*str)) *str=toupper(*str); - str++; - } -} -#endif - -/*------------------------------------------------------------------- - Function: tlConOutput - Date: 2/28 - Implementor(s): jdt - Library: Test Library - Description: - Output a printf style string to the console - Arguments: - fmt - format string - ... - other args - Return: - int - number of chars printed - -------------------------------------------------------------------*/ -int tlConOutput( const char *fmt, ... ) { - static short tmpTex[256*256]; - int rv = 0; - va_list argptr; - - if( fontInitialized ) { - static char buffer[1024]; - const char *c; - - va_start( argptr, fmt ); - rv = vsprintf( buffer, fmt, argptr ); - va_end( argptr ); - - strupr( buffer ); - - c = buffer; - - /* update console grid */ - - while( *c ) { - switch( *c ) { - case '\n': - consoleY++; - case '\r': - consoleX = 0; - if ( consoleY >= consoleRows ) { - consoleY = consoleRows - 1; - consoleScroll(); - } - break; - default: - if ( consoleX >= consoleColumns ) { - consoleX = 0; - consoleY++; - if ( consoleY >= consoleRows ) { - consoleY = consoleRows - 1; - consoleScroll(); - } - } - consoleGrid[(consoleY*consoleColumns)+consoleX]=*c; - consoleX++; - break; - } - c++; - } - } - - return rv; -} - -/*------------------------------------------------------------------- - Function: tlConClear - Date: 3/1 - Implementor(s): jdt - Library: Test Library - Description: - Clear the console - Arguments: - none - Return: - none - -------------------------------------------------------------------*/ -void tlConClear() { - memset( consoleGrid, 32, consoleRows*consoleColumns ); - consoleX = consoleY = 0; - return; -} - - -/*------------------------------------------------------------------- - Function: tlConRender - Date: 2/28 - Implementor(s): jdt - Library: test library - Description: - Render the console - Arguments: - none - Return: - none - -------------------------------------------------------------------*/ -void tlConRender( void ) { - static short tmpTex[256*256]; - - if( fontInitialized ) { - int x, y; - - grGlideGetState( &state ); - - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_LOCAL, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_SRC_ALPHA, GR_BLEND_ONE_MINUS_SRC_ALPHA, - GR_BLEND_ONE, GR_BLEND_ZERO ); - grAlphaTestFunction( GR_CMP_ALWAYS ); - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR ); - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_DISABLE, - FXFALSE ); - grDepthBufferFunction( GR_CMP_ALWAYS ); - grAlphaTestReferenceValue( 0x1 ); - grSstOrigin( GR_ORIGIN_UPPER_LEFT ); - grCullMode( GR_CULL_DISABLE ); - grTexDownloadMipMap( 0, fontAddress, GR_MIPMAPLEVELMASK_BOTH, - &fontInfo ); - grTexSource( 0, fontAddress, - GR_MIPMAPLEVELMASK_BOTH, &fontInfo ); - grClipWindow( (int)tlScaleX(0.0f),(int)tlScaleY(0.0f), - (int)tlScaleX(1.0f),(int)tlScaleY(1.0f) ); - - for( y = 0; y < consoleRows; y++ ) { - float charX = consoleOriginX; - float charY = consoleOriginY+(consoleCharHeight*y); - for( x = 0; x < consoleColumns; x++ ) { - drawChar( consoleGrid[(y*consoleColumns)+x], - charX, charY, - consoleCharWidth, - consoleCharHeight ); - charX += consoleCharWidth; - } - } - - grGlideSetState(&state); - } - - return; -} - -/*------------------------------------------------------------------- - Function: tlSleep - Date: 3/1 - Implementor(s): jdt - Library: Test Library - Description: - Block for a number of seconds - Arguments: - seconds - number of seconds before function returns - Return: - none - -------------------------------------------------------------------*/ -void tlSleep( int seconds ) { - time_t time0 = time( 0 ); - while( (time(0)-time0) < seconds ); -} - -/*------------------------------------------------------------------- - Function: tlIdentity - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - Return an identity matrix - Arguments: - none - Return: - const pointer to identity matrix - -------------------------------------------------------------------*/ -static TlMatrix currentMatrix; - -#define DEGREE (.01745328f) - -const float *tlIdentity( void ) { - static TlMatrix m; - m[0][0] = 1.0f, m[0][1] = 0.0f, m[0][2] = 0.0f, m[0][3] = 0.0f; - m[1][0] = 0.0f, m[1][1] = 1.0f, m[1][2] = 0.0f, m[1][3] = 0.0f; - m[2][0] = 0.0f, m[2][1] = 0.0f, m[2][2] = 1.0f, m[2][3] = 0.0f; - m[3][0] = 0.0f, m[3][1] = 0.0f, m[3][2] = 0.0f, m[3][3] = 1.0f; - return &m[0][0]; -} - -/*------------------------------------------------------------------- - Function: tlXRotation - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - Generate a rotation about the x axis - Arguments: - degrees - number of degrees to rotate - Return: - const point to rotation matrix - -------------------------------------------------------------------*/ -const float *tlXRotation( float degrees ) { - static TlMatrix m; - float c = (float)cos( degrees * DEGREE ); - float s = (float)sin( degrees * DEGREE ); - m[0][0] = 1.0f, m[0][1] = 0.0f, m[0][2] = 0.0f, m[0][3] = 0.0f; - m[1][0] = 0.0f, m[1][1] = c, m[1][2] = s, m[1][3] = 0.0f; - m[2][0] = 0.0f, m[2][1] = -s, m[2][2] = c, m[2][3] = 0.0f; - m[3][0] = 0.0f, m[3][1] = 0.0f, m[3][2] = 0.0f, m[3][3] = 1.0f; - return &m[0][0]; -} - - -/*------------------------------------------------------------------- - Function: tlYRotation - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - Generate a rotation about the y axis - Arguments: - degrees - number of degrees to rotate - Return: - const point to rotation matrix - -------------------------------------------------------------------*/ -const float *tlYRotation( float degrees ) { - static TlMatrix m; - float c = (float)cos( degrees * DEGREE ); - float s = (float)sin( degrees * DEGREE ); - m[0][0] = c, m[0][1] = 0.0f, m[0][2] = -s, m[0][3] = 0.0f; - m[1][0] = 0.0f, m[1][1] = 1.0f, m[1][2] = 0.0f, m[1][3] = 0.0f; - m[2][0] = s, m[2][1] = 0.0f, m[2][2] = c, m[2][3] = 0.0f; - m[3][0] = 0.0f, m[3][1] = 0.0f, m[3][2] = 0.0f, m[3][3] = 1.0f; - return &m[0][0]; -} - - -/*------------------------------------------------------------------- - Function: tlZRotation - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - Generate about the z axis - Arguments: - degrees - number of degrees to rotate - Return: - const point to rotation matrix - -------------------------------------------------------------------*/ -const float *tlZRotation( float degrees ) { - static TlMatrix m; - float c = (float)cos( degrees * DEGREE ); - float s = (float)sin( degrees * DEGREE ); - m[0][0] = c, m[0][1] = s, m[0][2] = 0.0f, m[0][3] = 0.0f; - m[1][0] = -s, m[1][1] = c, m[1][2] = 0.0f, m[1][3] = 0.0f; - m[2][0] = 0.0f, m[2][1] = 0.0f, m[2][2] = 1.0f, m[2][3] = 0.0f; - m[3][0] = 0.0f, m[3][1] = 0.0f, m[3][2] = 0.0f, m[3][3] = 1.0f; - return &m[0][0]; -} - -/*------------------------------------------------------------------- - Function: tlTranslation - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - Generate a translation matrix - Arguments: - x, y, z - offsets to translate origin - Return: - const point to translation matrix - -------------------------------------------------------------------*/ -const float *tlTranslation( float x, float y, float z ) { - static TlMatrix m; - m[0][0] = 1.0f, m[0][1] = 0.0f, m[0][2] = 0.0f, m[0][3] = 0.0f; - m[1][0] = 0.0f, m[1][1] = 1.0f, m[1][2] = 0.0f, m[1][3] = 0.0f; - m[2][0] = 0.0f, m[2][1] = 0.0f, m[2][2] = 1.0f, m[2][3] = 0.0f; - m[3][0] = x, m[3][1] = y, m[3][2] = z, m[3][3] = 1.0f; - return &m[0][0]; -} - -/*------------------------------------------------------------------- - Function: tlSetMatrix - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - Set the current matrix. This matrix translates the object into - View space from local coordiantes during calls to transformVertices - All spaces are considered to by -1.0->1.0 normalized. - Arguments: - m - pointer to matrix - Return: - none - -------------------------------------------------------------------*/ -void tlSetMatrix( const float *m ) { - memcpy( currentMatrix, m, sizeof( TlMatrix ) ); - return; -} - -/*------------------------------------------------------------------- - Function: tlMultMatrix - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - Multiply the current matrix by the provided matrix - Arguments: - matrix to post-cat to the current matrix - Return: - none - -------------------------------------------------------------------*/ -void tlMultMatrix( const float *m ) { - TlMatrix result; - TlMatrix mat; - int i, j; - - memcpy( mat, m, sizeof( TlMatrix ) ); - - for( j = 0; j < 4; j++ ) { - for( i = 0; i < 4; i++ ) { - result[j][i] = - currentMatrix[j][0] * mat[0][i] + - currentMatrix[j][1] * mat[1][i] + - currentMatrix[j][2] * mat[2][i] + - currentMatrix[j][3] * mat[3][i]; - } - } - memcpy( currentMatrix, result, sizeof( TlMatrix ) ); - -} - -/*------------------------------------------------------------------- - Function: tlTransformVertices - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - Transform a list of vertices from model space into view space - Arguments: - dstVerts - memory to store transformed vertices - srcVerts - array of vertices to be transformed - length - number of vertices to transform - Return: - none - -------------------------------------------------------------------*/ -void tlTransformVertices( TlVertex3D *dstVerts, TlVertex3D *srcVerts, unsigned length ) { - TlVertex3D tmp, v; - TlMatrix m; - unsigned i; - - memcpy( m, currentMatrix, sizeof( TlMatrix ) ); - for( i = 0; i < length; i++ ) { - v = srcVerts[i]; - tmp = v; - tmp.x = v.x * m[0][0] + v.y * m[1][0] + v.z * m[2][0] + v.w * m[3][0]; - tmp.y = v.x * m[0][1] + v.y * m[1][1] + v.z * m[2][1] + v.w * m[3][1]; - tmp.z = v.x * m[0][2] + v.y * m[1][2] + v.z * m[2][2] + v.w * m[3][2]; - tmp.w = v.x * m[0][3] + v.y * m[1][3] + v.z * m[2][3] + v.w * m[3][3]; - dstVerts[i] = tmp; - } - return; -} - -/*------------------------------------------------------------------- - Function: tlProjectVertices - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - perspective project a set of vertices into normalized 2D space (0,1) - Arguments: - dstVerts - memory to store projected vertices - srcVerts - array of vertices to be transformed - length - number of vertices to transform - Return: - none - -------------------------------------------------------------------*/ -#define VP_OFFSET 1.0f -#define VP_SCALE 0.5f - -void tlProjectVertices( TlVertex3D *dstVerts, TlVertex3D *srcVerts, unsigned length ) { - TlVertex3D tmp, v; - TlMatrix m; - unsigned i; - - /* simplified perspective proj matrix assume unit clip volume */ - m[0][0] = 1.0f, m[0][1] = 0.0f, m[0][2] = 0.0f, m[0][3] = 0.0f; - m[1][0] = 0.0f, m[1][1] = 1.0f, m[1][2] = 0.0f, m[1][3] = 0.0f; - m[2][0] = 0.0f, m[2][1] = 0.0f, m[2][2] = 1.0f, m[2][3] = 1.0f; - m[3][0] = 0.0f, m[3][1] = 0.0f, m[3][2] = 0.0f, m[3][3] = 0.0f; - - for( i = 0; i < length; i++ ) { - v = srcVerts[i]; - tmp = v; - tmp.x = v.x * m[0][0] + v.y * m[1][0] + v.z * m[2][0] + v.w * m[3][0]; - tmp.y = v.x * m[0][1] + v.y * m[1][1] + v.z * m[2][1] + v.w * m[3][1]; - tmp.z = v.x * m[0][2] + v.y * m[1][2] + v.z * m[2][2] + v.w * m[3][2]; - tmp.w = v.x * m[0][3] + v.y * m[1][3] + v.z * m[2][3] + v.w * m[3][3]; - tmp.x /= tmp.w, tmp.y /= tmp.w, tmp.z /= tmp.w; - tmp.x += VP_OFFSET, tmp.x *= VP_SCALE; - tmp.y += VP_OFFSET, tmp.y *= VP_SCALE; - dstVerts[i] = tmp; - } -} - - -/*------------------------------------------------------------------- - Function: tlLoadTexture - Date: 3/3 - Implementor(s): jdt - Library: Test Libarary - Description: - Load Texture - - This example loads textures from a .3df file. 3DF files - containe pre-computed mipmaps data along with any - necessary supplementary information, for example - palettes, ncc-tables, level-of-detail description, - aspect ratio or format - - The gu3dfGetInfo and gu3dfLoad APIs load A 3DF file - into Gu3DfInfo structure from a file on disk. Data - can then be extracted from the gu3DfInfo structure - to initialize a GrTexInfo structure used in the - glide texturing routines. Also note that texture table - ( either NCC or Palette ) management is left up to the - application programmer. - Arguments: - filename - name of .3df file on disk - info - Pointer to GrTexInfo - tableType - pointer to tabletype - table - pointer to table data - Return: - 0 - fail - 1 - pass - -------------------------------------------------------------------*/ -static GrTexTable_t texTableType( GrTextureFormat_t format ); - -int tlLoadTexture( const char *filename, - GrTexInfo *info, - GrTexTable_t *tableType, - void *table ) { - Gu3dfInfo tdfInfo; - int rv = 0; - - assert( filename ); - assert( info ); - assert( tableType ); - assert( table ); - if ( gu3dfGetInfo( filename, &tdfInfo ) ) { - tdfInfo.data = malloc( tdfInfo.mem_required ); - assert( tdfInfo.data ); - if ( gu3dfLoad( filename, &tdfInfo ) ) { - info->smallLod = tdfInfo.header.small_lod; - info->largeLod = tdfInfo.header.large_lod; - info->aspectRatio = tdfInfo.header.aspect_ratio; - info->format = tdfInfo.header.format; - info->data = tdfInfo.data; - *tableType = texTableType( info->format ); - switch( *tableType ) { - case GR_TEXTABLE_NCC0: - case GR_TEXTABLE_NCC1: - case GR_TEXTABLE_PALETTE: - memcpy( table, &(tdfInfo.table), sizeof( TlTextureTable ) ); - break; - default: - break; - } - rv = 1; - } - } - return rv; -} - - - -/*-------------------------------------------------------------------- - Static Helpers - --------------------------------------------------------------------*/ - -static void consoleScroll( void ) { - memmove( consoleGrid, - consoleGrid + consoleColumns, - (consoleRows-1)*consoleColumns ); - memset( consoleGrid+(consoleRows-1)*consoleColumns, - 32, - consoleColumns ); -} - -static void drawChar( char character, float x, float y, float w, float h ) { - GrVertex a, b, c, d; - /* a---b - |\ | - | \ | - | \| - c---d */ - - if ( character == 32 ) return; - - a.oow = b.oow = c.oow = d.oow = 1.0f; - - a.x = c.x = tlScaleX(x); - a.y = b.y = tlScaleY(y); - d.x = b.x = tlScaleX(x+w); - d.y = c.y = tlScaleY(y+h); - - grConstantColorValue( consoleColor ); - - a.tmuvtx[0].sow = c.tmuvtx[0].sow = - (float)fontTable[character][0]; - a.tmuvtx[0].tow = b.tmuvtx[0].tow = - (float)fontTable[character][1]; - d.tmuvtx[0].sow = b.tmuvtx[0].sow = - a.tmuvtx[0].sow + (float)fontWidth; - d.tmuvtx[0].tow = c.tmuvtx[0].tow = - a.tmuvtx[0].tow + (float)fontHeight; - - grDrawTriangle( &a, &d, &c ); - grDrawTriangle( &a, &b, &d ); - return; -} - - - - -static void readRegion( void *data, - int x, int y, - int w, int h ); -static void writeRegion( void *data, - int x, int y, - int w, int h ); - - -static void putTex( FxU32 addr, void *storage ) { - GrTexInfo texInfo; - - texInfo.smallLod = GR_LOD_256; - texInfo.largeLod = GR_LOD_256; - texInfo.aspectRatio = GR_ASPECT_1x1; - texInfo.format = GR_TEXFMT_RGB_565; - texInfo.data = storage; - - grTexDownloadMipMap( 0, addr, GR_MIPMAPLEVELMASK_BOTH, &fontInfo ); -} - - -static void grabTex( FxU32 addr, void *storage ) { - static FxU16 tmpSpace[256][256]; - GrTexInfo texInfo; - GrVertex a, b, c, d; - - grGlideGetState( &state ); - grDitherMode( GR_DITHER_DISABLE ); - grColorMask( FXTRUE, FXFALSE ); - grSstOrigin( GR_ORIGIN_UPPER_LEFT ); - grCullMode( GR_CULL_DISABLE ); - - /* Grab Upper Left 256*256 of frame buffer */ - readRegion( tmpSpace, 0, 0, 256, 256 ); - - /* Grab First 256x256 MM in Texture Ram */ - texInfo.smallLod = GR_LOD_256; - texInfo.largeLod = GR_LOD_256; - texInfo.aspectRatio = GR_ASPECT_1x1; - texInfo.format = GR_TEXFMT_RGB_565; - texInfo.data = 0; - grTexMipMapMode( 0, GR_MIPMAP_DISABLE, FXFALSE ); - grTexFilterMode( 0, - GR_TEXTUREFILTER_POINT_SAMPLED, - GR_TEXTUREFILTER_POINT_SAMPLED ); - grTexCombine( 0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, - FXFALSE ); - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grTexSource( 0, addr, GR_MIPMAPLEVELMASK_BOTH, &texInfo ); - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ZERO, - GR_BLEND_ONE, GR_BLEND_ZERO); - grDepthBufferFunction( GR_DEPTHBUFFER_DISABLE ); - grAlphaTestFunction( GR_CMP_ALWAYS ); - grFogMode( GR_FOG_DISABLE ); - grCullMode( GR_CULL_DISABLE ); - grChromakeyMode( GR_CHROMAKEY_DISABLE ); - /*------------------- - A---B - | \ | - C---D - -------------------*/ - a.oow = a.tmuvtx[0].oow = 1.0f; - b = c = d = a; - a.x = c.x = a.y = b.y = 0.5f; - b.x = d.x = c.y = d.y = 255.6f; - a.tmuvtx[0].sow = c.tmuvtx[0].sow = a.tmuvtx[0].tow = b.tmuvtx[0].tow = - 0.5f; - b.tmuvtx[0].sow = d.tmuvtx[0].sow = c.tmuvtx[0].tow = d.tmuvtx[0].tow = - 0.5f; - grDrawTriangle( &a, &d, &c ); - grDrawTriangle( &a, &b, &d ); - readRegion( storage, 0, 0, 256, 256 ); - - /* Restore The Upper Left Hand of Frame Buffer */ - writeRegion( tmpSpace, 0, 0, 256, 256 ); - grGlideSetState( &state ); - return; -} - -static void readRegion( void *data, - int sx, int sy, - int w, int h ) { - int x; int y; - GrLfbInfo_t info; - - info.size = sizeof( info ); - - assert( grLfbLock( GR_LFB_READ_ONLY, - GR_BUFFER_BACKBUFFER, - GR_LFBWRITEMODE_ANY, - GR_ORIGIN_UPPER_LEFT, - FXFALSE, - &info ) ); - - for( y = 0; y < h; y++ ) { - unsigned short *dst = ((unsigned short *)data+ - (w*y)); - unsigned short *src = (unsigned short*)(((char*)info.lfbPtr) - +(info.strideInBytes*(sy+y)) - +(sx<<1)); - for( x = 0; x < w; x++ ) { - *dst++ = *src++; - } - } - - - assert( grLfbUnlock( GR_LFB_READ_ONLY, GR_BUFFER_BACKBUFFER ) ); - return; -} -static void writeRegion( void *data, - int sx, int sy, - int w, int h ) { - int x; int y; - GrLfbInfo_t info; - - info.size = sizeof( info ); - - assert( grLfbLock( GR_LFB_WRITE_ONLY, - GR_BUFFER_BACKBUFFER, - GR_LFBWRITEMODE_ANY, - GR_ORIGIN_UPPER_LEFT, - FXFALSE, - &info ) ); - - for( y = 0; y < h; y++ ) { - unsigned short *src = ((unsigned short *)data+ - (w*y)); - unsigned short *dst = (unsigned short*)(((char*)info.lfbPtr) - +(info.strideInBytes*(sy+y)) - +(sx<<1)); - for( x = 0; x < w; x++ ) { - *dst++ = *src++; - } - } - - assert( grLfbUnlock( GR_LFB_WRITE_ONLY, GR_BUFFER_BACKBUFFER ) ); - return; -} - - -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; -} - -/* - * SimpleRleDecode - * simple rle decoder - * Arguments: - * width : width of the image - * height : height of the image - * pixelsize : 1-4 - * *mem : compressed data - * *buff : uncompressed data - * Return: - * TRUE if decode sucessful. otherwise FALSE - * The simple rle file file format - * width: 2 bytes - * height: 2 bytes - * compression type: 1 byte (0: literal data, 1: rle) - * depth: 1 byte (16 for sst1) - * image data - * 1st byte: control byte. msb = 1 indicate a run, msb = 0 indicate a literal string - * bit 7-0 is counter. it is zero based. - * next depth/8 bytes: pixel data - */ -FxBool -SimpleRleDecode -( - FxU16 width, - FxU16 height, - FxU8 pixelsize, - FxU8 *mem, - FxU8 *buff -) -{ - FxU32 count = width * height; - FxU8 run, lit; - - while (count) { - if (*mem & 0x80) { - run = *mem & 0x7f; - run++; - mem++; - count -= run; - while (run) { - memcpy(buff, mem, pixelsize); - run--; - buff+=pixelsize; - } - mem+=pixelsize; - } - else { - lit = *mem; - lit++; - mem++; - count -= lit; - while (lit) { - memcpy(buff, mem, pixelsize); - lit--; - buff+=pixelsize; - mem+=pixelsize; - } - } - if (count < 0) - return FXFALSE; - } - return FXTRUE; -} - -/* - * WritePixel - * write rle run/literal strings - * Arguments: - * flag: TRUE if it is a run. otherwise it is a string - * count: number of run/literal (0 based) - * *buff: output area - * *tmp: source area - * pixelsize: pixel size (1-4) - * Return: - * none - */ -static void -WritePixel -( - FxBool flag, - FxU8 count, - FxU8 *buff, - FxU8 *tmp, - FxU8 pixelsize -) -{ - FxU8 val; - FxU32 i; - - if (flag) { - val = 0x80 | count; - count = 0; - } - else - val = count; - - *buff = val; - buff++; - for (i = 0; i <= count; i++) { - memcpy(buff, tmp, pixelsize); - buff+=pixelsize; - tmp+=4; - } -} - -/* - * SimpleRleEncode - * simple rle encoder - * Arguments: - * pixelcount : number of pixels - * pixelsize : 1-4 - * *mem : source image - * *buff : compressed data - * Return: - * none - */ -static FxU32 -SimpleRleEncode -( - FxU32 pixelcount, /* number of pixels */ - FxU8 pixelsize, /* size of pixel (in bytes) 1-4 */ - FxU8 *mem, /* src image */ - FxU8 *buff /* compressed data */ -) -{ - FxU8 *src = buff; - FxU8 run = 0, lit = 0; - FxU32 tmp[130]; - FxU32 pval = 0, cval = 0; - FxU32 i; - FxU32 tt; - FxBool flag = FXFALSE; - - /* determine run or literal */ - mem+=pixelsize; - - for (i = 1; i < pixelcount; i++) { - if (i > 300000) - tt = 1; - memcpy(&pval, mem-pixelsize, pixelsize); - memcpy(&cval, mem, pixelsize); - if (cval == pval) { - flag = FXFALSE; - if (lit) { - WritePixel(FXFALSE, (FxU8)(lit - 1), buff, (FxU8 *)&tmp[0], pixelsize); - buff += (1 + pixelsize * lit); - lit = 0; - } - run++; - if (run == 128) { - WritePixel(FXTRUE, (FxU8)(run - 1), buff, (FxU8 *)&tmp[0], pixelsize); - buff += (1 + pixelsize); - run -= 128; - } - memcpy(&tmp[0], mem, pixelsize); - } - else { - flag = FXTRUE; - if (run) { - WritePixel(FXTRUE, run, buff, (FxU8 *)&tmp[0], pixelsize); - buff += (1 + pixelsize); - run = 0; - } - else { - if (lit == 128) { - WritePixel(FXFALSE, (FxU8)(lit - 1), buff, (FxU8 *)&tmp[0], pixelsize); - buff += (1 + pixelsize * lit); - lit -= 128; - } - memcpy(&tmp[lit], mem-pixelsize, pixelsize); - lit++; - } - } - mem+=pixelsize; - } - /* last pixel */ - if (flag) { - if (lit == 128) { - WritePixel(FXFALSE, (FxU8)(lit - 1), buff, (FxU8 *)&tmp[0], pixelsize); - buff += (1 + pixelsize * lit); - lit -= 128; - } - memcpy(&tmp[lit], mem-pixelsize, pixelsize); - WritePixel(FXFALSE, (FxU8)lit, buff, (FxU8 *)&tmp[0], pixelsize); - lit++; - buff += (1 + pixelsize * lit); - lit = 0; - } - else if (run) { - WritePixel(FXTRUE, run, buff, (FxU8 *)&tmp[0], pixelsize); - buff += (1 + pixelsize); - run = 0; - } - - return( (FxU32) (buff - src)); -} - -/*------------------------------------------------------------------- - Function: tlScreenDump - Date: 6/6/97 - Implementor(s): - Library: test library - Description: - dump the lfb data - Arguments: - filename - filename - width - width for frame buffer - height - height for frame buffer - Return: - none - -------------------------------------------------------------------*/ -FxBool -tlScreenDump -( - const char *filename, - FxU16 width, - FxU16 height -) -{ - FILE *fp; - FxU16 *pixel, *region; - FxU8 *buff; - FxU32 count, signature; - FxU8 type, depth; - - fp = fopen(filename, "wb"); - if (fp == NULL) - return(FXFALSE); - - region = malloc(width * height * sizeof(FxU16)); - buff = malloc(width * height * sizeof(FxU16) * 2); - grLfbReadRegion( GR_BUFFER_FRONTBUFFER, - 0, 0, width, height, - width*2, region ); - - pixel = (FxU16 *)region; - - count = SimpleRleEncode( (FxU32)width * (FxU32)height, 2, (FxU8 *)region, (FxU8 *)buff); - - /* header of the file */ - type = LFB_DATA_RLE; - depth = 16; - signature = IMAGE_SRLE; - fwrite(&signature, sizeof(FxU32), 1, fp); - fwrite(&width, sizeof(FxU16), 1, fp); - fwrite(&height, sizeof(FxU16), 1, fp); - fwrite(&depth, sizeof(FxU8), 1, fp); - fwrite(&type, sizeof(FxU8), 1, fp); - - /* LFB data */ - fwrite(buff, count, 1, fp); - - free(buff); - free(region); - fclose(fp); - - return FXTRUE; -} - -#ifdef __linux__ -#include - -/*------------------------------------------------------------------- - Function: tlKbHit - Date: 2/28 - Implementor(s): jdt - Library: test library - Description: - Returns true if there are pending characters in the input queue - Arguments: - none - Return: - nonzero if keys in queue - -------------------------------------------------------------------*/ -int tlKbHit( void ) { - return lin_kbhit(); -} - -/*------------------------------------------------------------------- - Function: tlGetCH - Date: 2/28 - Implementor(s): jdt - Library: test library - Description: - Returns character from top of input fifo, blocks if fifo is empty - Arguments: - none - Return: - character - -------------------------------------------------------------------*/ -char tlGetCH( void ) { - return lin_getch(); -} - -FxBool -tlErrorMessage( char *err) { - fprintf(stderr, err); -} /* tlErrorMessage */ - -#else -#ifdef __DOS32__ -/*------------------------------------------------------------------- - Function: tlKbHit - Date: 2/28 - Implementor(s): jdt - Library: test library - Description: - Returns true if there are pending characters in the input queue - Arguments: - none - Return: - nonzero if keys in queue - -------------------------------------------------------------------*/ -int tlKbHit( void ) { - return kbhit(); -} - -/*------------------------------------------------------------------- - Function: tlGetCH - Date: 2/28 - Implementor(s): jdt - Library: test library - Description: - Returns character from top of input fifo, blocks if fifo is empty - Arguments: - none - Return: - character - -------------------------------------------------------------------*/ -char tlGetCH( void ) { - return getch(); -} - -FxBool -tlErrorMessage( char *err) { - fprintf(stderr, err); -} /* tlErrorMessage */ - -#else /* __WIN32__ */ - - -/* This segment simulates main() for Windows, creates a window, etc. */ -#define WIN32_LEAN_AND_MEAN -#include - -/* Forward declarations */ -HWND hWndMain; -char ** commandLineToArgv(LPSTR lpCmdLine, int *pArgc); - -/* - * MainWndproc - * - * Callback for all Windows messages - */ -static int qhead = 0; -static int qtail = 0; -static int queue[256] = {0}; - -long FAR PASCAL -MainWndproc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) -{ - PAINTSTRUCT ps; - HDC hdc; - - extern GrHwConfiguration hwconfig; - - switch( message ) - { - case WM_SETCURSOR: - if (Res != GR_RESOLUTION_NONE) { - SetCursor(NULL); - return 0; - } - break; - - case WM_CREATE: - break; - - case WM_PAINT: - hdc = BeginPaint( hWnd, &ps ); - EndPaint( hWnd, &ps ); - return 1; - - case WM_CLOSE: - queue[qhead++] = 'q'; qhead &= 255; - break; - - case WM_DESTROY: - break; - - case WM_MOVE: - if (!grSstControl(GR_CONTROL_MOVE)) { - PostMessage( hWndMain, WM_CLOSE, 0, 0 ); - return 0; - } - break; - - case WM_ACTIVATE: - if (hwconfig.SSTs[0].type == GR_SSTTYPE_VOODOO) { - if (wParam & WA_INACTIVE) - grSstControl(GR_CONTROL_DEACTIVATE); - else { - grSstControl(GR_CONTROL_ACTIVATE); -#if 0 - grHints(GR_HINT_H3DENABLE,1); -#endif - } - } else - return 0; - break; - - case WM_DISPLAYCHANGE: - case WM_SIZE: - { - extern void getWindowSize(float *width, float *height); - float width, height; - - getWindowSize(&width, &height); -#ifndef H3D - tlSetScreen( width, height); -#endif - } - if (!grSstControl(GR_CONTROL_RESIZE)) { - MessageBox( hWnd, "Resize failed due to lack of sufficient buffer memory.\n", "Allocation Failure", MB_OK | MB_APPLMODAL ); - PostMessage( hWndMain, WM_CLOSE, 0, 0 ); - okToRender = FXFALSE; - return 0; - } else { - okToRender = FXTRUE; - } - break; - - case WM_CHAR: - if (!isascii(wParam)) break; -#if 0 - printf("Posting keystroke %.02x\n", wParam); - fflush(stdout); -#endif - /* queue[qhead++] = tolower(wParam); */ - queue[qhead++] = wParam; - qhead &= 255; - break; - - default: - break; - } - return DefWindowProc(hWnd, message, wParam, lParam); - -} /* MainWndproc */ - -/* - * initApplication - * - * Do that Windows initialization stuff... - */ -static FxBool -initApplication( HANDLE hInstance, int nCmdShow ) -{ - WNDCLASS wc; - FxBool rc; - - wc.style = CS_DBLCLKS; - wc.lpfnWndProc = MainWndproc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = hInstance; - wc.hIcon = LoadIcon( NULL, IDI_APPLICATION); /* generic icon */ - wc.hCursor = LoadCursor( NULL, IDC_ARROW ); - wc.hbrBackground = GetStockObject( BLACK_BRUSH ); - wc.lpszMenuName = NULL; - wc.lpszClassName = "WinGlideClass"; - rc = RegisterClass( &wc ); - if( !rc ) { - return FALSE; - } - - hWndMain = - CreateWindowEx( -#if 0 - WS_EX_APPWINDOW gives you regular borders? - WS_EX_TOPMOST Works as advertised. -#endif - WS_EX_APPWINDOW, - "WinGlideClass", - "Glide Test", - WS_OVERLAPPED | - WS_CAPTION | - WS_THICKFRAME | - WS_MAXIMIZEBOX | - WS_MINIMIZEBOX | - WS_VISIBLE | /* so we don't have to call ShowWindow */ - WS_POPUP | /* non-app window */ - WS_SYSMENU, /* so we get an icon in the tray */ - CW_USEDEFAULT, - CW_USEDEFAULT, - 0x110, /* GetSystemMetrics(SM_CXSCREEN), */ - 0x120, /* GetSystemMetrics(SM_CYSCREEN), */ - NULL, - NULL, - hInstance, - NULL - ); - - if( !hWndMain ) { - return FALSE; - } - - SetCursor(NULL); - - ShowWindow( hWndMain, SW_NORMAL); - UpdateWindow( hWndMain ); - - return TRUE; - -} /* initApplication */ - -/* - * WinMain - */ -int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, - LPSTR lpCmdLine, int nCmdShow ) -{ - if( !initApplication(hInstance, nCmdShow) ) - return FALSE; - - { - /* - * Since printfs go into the bit bucket on Win32, - * put up a message in the window. - */ - HDC hDC = GetDC(hWndMain); - char *message = "Press any Key to continue!"; - RECT rect; - - GetClientRect(hWndMain, &rect); - SetTextColor(hDC, RGB(0, 255, 255)); - SetBkColor(hDC, RGB(0, 0, 0)); - SetTextAlign(hDC, TA_CENTER); - ExtTextOut(hDC, rect.right/2, rect.bottom/2, ETO_OPAQUE, &rect, - message, strlen(message), NULL); - ReleaseDC(hWndMain, hDC); - GdiFlush(); - } - - { - int argc; - char **argv; - extern int main(int argc, char **argv); - - argv = commandLineToArgv(lpCmdLine, &argc); - main(argc, argv); - } - - printf("Exiting winMain()\n"); - fflush(stdout); - - DestroyWindow(hWndMain); - return 0; - -} /* WinMain */ - -FxBool -tlErrorMessage( char *err) -{ - /* make the cursor visible */ - SetCursor(LoadCursor( NULL, IDC_ARROW )); - - /* - ** warn user if there is one - */ - printf("Error %s..\n", err); - fflush(stdout); - - MessageBox( hWndMain, err, "ERROR", MB_OK ); - return FALSE; -} /* tlErrorMessage */ - -/* - * Converts lpCmdLine to WinMain into argc, argv - */ -static char *fakeName = "WinTest"; -static char *argvbuf[32]; -static char cmdLineBuffer[1024]; -char ** -commandLineToArgv(LPSTR lpCmdLine, int *pArgc) -{ - char *p, *pEnd; - int argc = 0; - - argvbuf[argc++] = fakeName; - - if (lpCmdLine == NULL) { - *pArgc = argc; - return argvbuf; - } - - strcpy(cmdLineBuffer, lpCmdLine); - p = cmdLineBuffer; - pEnd = p + strlen(cmdLineBuffer); - if (pEnd >= &cmdLineBuffer[1022]) pEnd = &cmdLineBuffer[1022]; - - fflush(stdout); - - while (1) { - /* skip over white space */ - fflush(stdout); - - while (*p == ' ') p++; - if (p >= pEnd) break; - - argvbuf[argc++] = p; - if (argc >= 32) break; - - /* skip till there's a 0 or a white space */ - while (*p && (*p != ' ')) p++; - - if (*p == ' ') *p++ = 0; - } - - *pArgc = argc; - return argvbuf; -} - -/*------------------------------------------------------------------- - Function: tlKbHit - Date: 2/28 - Implementor(s): jdt - Library: test library - Description: - Returns true if there are pending characters in the input queue - Arguments: - none - Return: - nonzero if keys in queue - -------------------------------------------------------------------*/ -int -tlKbHit( void ) -{ - MSG msg; - - if (qhead != qtail) { - return 1; - } - - while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { - TranslateMessage(&msg); - DispatchMessage(&msg); /* this might change qhead */ - if (qhead != qtail) { - return 1; - } - } - return 0; -} - -/*------------------------------------------------------------------- - Function: tlGetCH - Date: 2/28 - Implementor(s): jdt - Library: test library - Description: - Returns character from top of input fifo, blocks if fifo is empty - Arguments: - none - Return: - character - -------------------------------------------------------------------*/ -char -tlGetCH( void ) -{ - MSG msg; - char rv; - - if (qtail != qhead) { - rv = queue[qtail++]; - qtail &= 255; - return rv; - } - - while (GetMessage( &msg, NULL, 0, 0 )) { - TranslateMessage(&msg); - DispatchMessage(&msg); - - if (qtail != qhead) { - rv = queue[qtail++]; - qtail &= 255; - return rv; - } - } - - /* Should never get here!! */ - /* printf("Bad exit..\n"); */ - /* fflush(stdout); */ -} - -void -tlExit() -{ - PostMessage( hWndMain, WM_CLOSE, 0, 0 ); -} - - -void -getWindowSize(float *width, float *height) -{ - RECT rect; - - if (fullScreen) { - GetWindowRect(hWndMain, &rect); - *width = (float) (rect.right-rect.left); - *height = (float) (rect.bottom-rect.top); - } - else { - GetClientRect(hWndMain, &rect); - *width = (float) (rect.right-rect.left); - *height = (float) (rect.bottom-rect.top); - } -} - - -#endif /* __DOS32__ */ -#endif /* __linux__ */ diff --git a/glide2x/sst1/glide/tests/tlib.h b/glide2x/sst1/glide/tests/tlib.h deleted file mode 100644 index 4467d1a..0000000 --- a/glide2x/sst1/glide/tests/tlib.h +++ /dev/null @@ -1,144 +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$ -** -*/ - - -#ifndef _TLIB_H_ -#define _TLIB_H_ -#ifdef __cplusplus -extern "C" { -#endif - - -/* If not debugging, change the meaning of the ANSI assert - * so that it is a harmless wrapper rather than ((void)0) as in - */ -#ifndef DEBUG -#ifdef assert -#undef assert -#endif -#define assert(exp) (exp) -#endif - -int tlGetOpt( int argc, char *argv[], const char *tags, char *match, char **remArgs[] ); - -int tlGetResolutionConstant( const char *identifier, float *width, float *height ); -void tlGetDimsByConst(const int res, float *w, float *h); -const char *tlGetResolutionString( int res ); -const char *tlGetResolutionList( void ); - -void tlSetScreen( float width, float height ); -float tlScaleX( float coord ); -float tlScaleY( float coord ); - -void tlConSet( float minX, float minY, - float maxX, float maxY, - int columns, int rows, - int color ); -int tlConOutput( const char *fmt, ... ); -void tlConClear(); -void tlConRender(); - -int tlKbHit( void ); -char tlGetCH( void ); - -void tlSleep( int seconds ); - -#define LFB_DATA_LITERAL 0 -#define LFB_DATA_RLE 1 -#define IMAGE_SRLE (((FxU32)'S' << 24) | ((FxU32)'R' << 16) | ((FxU32)'L' << 8) | ((FxU32)'E')) - -FxBool SimpleRleDecode(FxU16 width,FxU16 height,FxU8 pixelsize, FxU8 *mem,FxU8 *buff); -void tlGrabRect(void *memory, FxU32 minx, FxU32 miny, FxU32 maxx, FxU32 maxy); -FxBool tlScreenDump(const char *filename, FxU16 width, FxU16 height); - -typedef struct { - float x; - float y; - float z; - float w; - float s; - float t; - float r; - float g; - float b; - float a; -} TlVertex3D; - -typedef float TlMatrix[4][4]; - -const float *tlIdentity( void ); -const float *tlZRotation( float degrees ); -const float *tlYRotation( float degrees ); -const float *tlXRotation( float degrees ); -const float *tlTranslation( float x, float y, float z ); -void tlSetMatrix( const float *m ); -void tlMultMatrix( const float *m ); -void tlTransformVertices( TlVertex3D *dstList, - TlVertex3D *srcList, - unsigned length ); -void tlProjectVertices( TlVertex3D *dstList, - TlVertex3D *srcList, - unsigned length ); - -FxBool tlOkToRender(void); - -FxBool -tlErrorMessage(char *err); - -typedef FxU32 TlPalette[256]; -typedef struct { - FxU8 yRGB[16]; - FxI16 iRGB[4][3]; - FxI16 qRGB[4][3]; - FxU32 packed_data[12]; -} TlNCCTable; - -typedef union { - TlPalette palette; - TlNCCTable nccTable; -} TlTextureTable; - -typedef struct { - GrTexInfo info; - GrTexTable_t tableType; - TlTextureTable tableData; -} TlTexture; - -#define NO_TABLE ((GrTexTable_t)(~0)) - -int tlLoadTexture( const char *filename, - GrTexInfo *info, - GrTexTable_t *tableType, - void *table ); - -/* We are making function calls from within assert() */ -#ifdef NDEBUG -#undef NDEBUG -#endif - -#ifdef __cplusplus -} -#endif -#endif diff --git a/glide2x/sst1/glide/tests/yiq.3df b/glide2x/sst1/glide/tests/yiq.3df deleted file mode 100644 index 40b79d5..0000000 Binary files a/glide2x/sst1/glide/tests/yiq.3df and /dev/null differ diff --git a/glide2x/sst1/include/makefile.linux b/glide2x/sst1/include/makefile.linux deleted file mode 100644 index 11ef236..0000000 --- a/glide2x/sst1/include/makefile.linux +++ /dev/null @@ -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 = $(wildcard *.h) - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak diff --git a/glide2x/sst1/include/makefile.unix b/glide2x/sst1/include/makefile.unix deleted file mode 100644 index 11ef236..0000000 --- a/glide2x/sst1/include/makefile.unix +++ /dev/null @@ -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 = $(wildcard *.h) - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak diff --git a/glide2x/sst1/incsrc/makefile.linux b/glide2x/sst1/incsrc/makefile.linux deleted file mode 100644 index 731472a..0000000 --- a/glide2x/sst1/incsrc/makefile.linux +++ /dev/null @@ -1,25 +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 -# - -HEADERS = $(wildcard *.h) - -INSTALL_DESTINATION = $(BUILD_ROOT_HW) - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak diff --git a/glide2x/sst1/incsrc/makefile.sun b/glide2x/sst1/incsrc/makefile.sun deleted file mode 100644 index c74e707..0000000 --- a/glide2x/sst1/incsrc/makefile.sun +++ /dev/null @@ -1,29 +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$ -# - -HEADERS=*.h - -INSTALL_DESTINATION=$(BUILD_ROOT_SST1) - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak - diff --git a/glide2x/sst1/incsrc/makefile.unix b/glide2x/sst1/incsrc/makefile.unix deleted file mode 100644 index 8fe9b89..0000000 --- a/glide2x/sst1/incsrc/makefile.unix +++ /dev/null @@ -1,25 +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 -# - -HEADERS = $(wildcard *.h) - -INSTALL_DESTINATION = $(BUILD_ROOT_SST1) - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak diff --git a/glide2x/sst1/incsrc/ncc.h b/glide2x/sst1/incsrc/ncc.h deleted file mode 100644 index 677dacc..0000000 --- a/glide2x/sst1/incsrc/ncc.h +++ /dev/null @@ -1,41 +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 __NCC_H__ -#define __NCC_H__ - -/* -** $Revision$ -** $Date$ -*/ - -// translation tables for decompressing NCC format -typedef struct { - unsigned char yRGB[16]; - int iRGB[4][3]; - int qRGB[4][3]; -} NccTable; - -extern void yiq2rgb(NccTable *ncc, unsigned char *c888, unsigned char yiq); -extern void nccYIQtoRGB(unsigned int *array, long length); -extern unsigned char *nccRGBtoYIQ(const int xSize, const int ySize, - const unsigned int *from, float percent); -#endif /* !__NCC_H__ */ diff --git a/glide2x/sst1/incsrc/sst.h b/glide2x/sst1/incsrc/sst.h deleted file mode 100644 index 6b56d61..0000000 --- a/glide2x/sst1/incsrc/sst.h +++ /dev/null @@ -1,1107 +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 __SST_H__ -#define __SST_H__ - -/* -** $Revision$ -** $Date$ -*/ - -#include -#include "fx64.h" - -#ifdef __cplusplus -extern "C" { -#endif - -// this crazy macro fixes the binary point within a floating point -// number so that it has 'fracbits' to the right of the binary point -// it also adds a '1' bit to the MSB so that slightly negative numbers -// end up looking like twos complement numbers (they carry out from the '1') -#define FLOAT_FIX(f,fracbits) ((f)+(float)(3<<(22-(fracbits)))) - -#define SST_FLOAT(f,scale,shift) (unsigned long)((f)*((scale)*(float)(1<= 0; -1 if < 0) -#define ISIGN(x) (((x) | 0x40000000) >> 30) -#define FSIGN(f) ISIGN(*(long *)&f) - -typedef struct vertex_Rec { - unsigned long x; // 12.4 format - unsigned long y; // 12.4 -} vtxRec; - -// 256 color palette tables -typedef struct { - unsigned long argb[256]; -} Pal256; - -#define BIT(n) (1<<(n)) -#define SST_MASK(n) (0xFFFFFFFF >> (32-(n))) -#define SST_MASK64(n) FX_MASK64(n) - -//----------------- SST binary point locations --------------- -#define SST_LOD_SIZE 6 -#define SST_LOD_FRACBITS 2 -#define SST_XY_SIZE 16 -#define SST_XY_INTBITS 12 -#define SST_XY_FRACBITS 4 -#define SST_RGBA_SIZE 24 -#define SST_RGBA_INTBITS 8 -#define SST_RGBA_FRACBITS 12 -#define SST_Z_SIZE 32 -#define SST_Z_INTBITS 16 -#define SST_Z_FRACBITS 12 -// NOTE: below are ONLY for the fixed point registers -#define SST_ST_SIZE 32 -#define SST_ST_INTBITS 14 -#define SST_ST_FRACBITS 18 -#define SST_W_SIZE 32 -#define SST_W_INTBITS 2 -#define SST_W_FRACBITS 30 - -//----------------- SST lfbMode bits ----------------------- -#define SST_LFB_FORMAT_SHIFT 0 -#define SST_LFB_FORMAT (0xF< -#include "init.h" -#include - -/*---------------------------------------------------------------------------- - DATA DEFINITIONS - ----------------------------------------------------------------------------*/ -/*------------------------------------------------------------------- - Structure: InitContext - Date: 10/9 - Implementor(s): jdt, murali - Library: Init - Description: - Contains all device dependant functions for a given 3Dfx device - Members: - setVideo - initilize video - restoreVideo - undo setVideo - enableTransport - enable the command transport - disableTransport - disable the command transport - swapBuffers - function which executes a buffer swap - status - function which returns the status word from the 3D subsystem - busy - returns true if hardware busy - idle - returns when 3D subsystem is idle - getBufferPtr - get a pointer to a frame buffer - renderBuffer - set the current buffer for rendering - origin - set the y origin - ioCtl - CYA function - control - OS response functions - - gamma - initializes gamma table - sliPciOwner - sets ownership of PCI bus in SLI configuration - - info - hardware description - writeMethod - function for doing command transport writes to hardware - devNumber - enumerated order of device on bus - devPrivate - Private data for the device type - -------------------------------------------------------------------*/ -typedef struct { - FxBool (*setVideo) ( - FxU32 hWnd, - GrScreenResolution_t sRes, - GrScreenRefresh_t vRefresh, - InitColorFormat_t cFormat, - InitOriginLocation_t yOrigin, - int nColBuffers, - int nAuxBuffers, - int *xres, - int *yres, - int *fbStride, - sst1VideoTimingStruct *vidTimings); - void (*restoreVideo)( void ); - FxBool (*enableTransport)( InitFIFOData *info ); - void (*disableTransport)( void ); - - void (*swapBuffers)( FxU32 code ); - FxU32 (*status)( void ); - FxBool (*busy)(void); - void (*idle)( void ); - void *(*getBufferPtr)( InitBuffer_t buffer, int *strideBytes ); - void (*renderBuffer)( InitBuffer_t buffer ); - void (*origin)( InitOriginLocation_t origin ); - void (*ioCtl)( FxU32 token, void *argument ); - FxBool (*control) ( FxU32 code ); - FxBool (*wrapFIFO) (InitFIFOData *fD); - - void (*gamma)( double gamma ); - void (*sliPciOwner)( FxU32 *regbase, FxU32 owner ); - - /* - ** added interface for Glide 3 - */ - FxBool (*gammaRGB)( double r, double g, double b ); - FxBool (*initGammaTable)(FxU32 nentries, FxU32 *r, FxU32 *g, FxU32 *b); - sst1VideoTimingStruct * (*findVidTimingStruct) ( - GrScreenResolution_t sRes, - GrScreenRefresh_t vRefresh); - - InitDeviceInfo info; - InitWriteCallback *writeMethod; - void *devPrivate; -} InitContext; - -/* Global current context */ -extern InitContext *context; - -void vgDriverInit( InitContext *context ); -void vg96DriverInit( InitContext *context ); -void h3DriverInit( InitContext *context ); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/glide2x/sst1/init/h3drvr.c b/glide2x/sst1/init/h3drvr.c deleted file mode 100644 index afaa943..0000000 --- a/glide2x/sst1/init/h3drvr.c +++ /dev/null @@ -1,120 +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 <3dfx.h> -#include -#include "init.h" -#include "fxinit.h" - -static FxBool setVideo( FxU32 hWnd, - GrScreenResolution_t sRes, - GrScreenRefresh_t vRefresh, - InitColorFormat_t cFormat, - InitOriginLocation_t yOrigin, - int nColBuffers, - int nAuxBuffers, - int *xres, - int *yres, - int *fbStride, - sst1VideoTimingStruct *vidTimings) { - return FXFALSE; -} - -static void restoreVideo( void ) { -} - -static FxBool enableTransport( InitFIFOData *info ) { - FxBool rv = FXFALSE; - return rv; -} - -static void disableTransport( void ) { -} - -static InitSwapType_t swapBuffers( FxU32 code ) { - return 0; -} - -static FxU32 status( void ) { - return 0; -} - -static FxBool busy(void) { - return 0; -} - -static void idle( void ) { -} - -static void *getBufferPtr( InitBuffer_t buffer, int *strideBytes ) { - return 0; -} - -static void renderBuffer( InitBuffer_t buffer ) { - return; -} - -static void origin( InitOriginLocation_t origin ) { - return; -} - -static void ioCtl( FxU32 token, void *argument ) { - return; -} - -static FxBool control( FxU32 code ) { - return FXFALSE; -} - -static FxBool wrapFIFO(InitFIFOData *fd) { - return FXTRUE; -} - -static void gamma( double gamma ) { -} - -static void sliPciOwner( FxU32 *regbase, FxU32 owner ) { -} - -void h3DriverInit( InitContext *context ) { - context->setVideo = setVideo; - context->restoreVideo = restoreVideo; - context->enableTransport = enableTransport; - context->disableTransport = disableTransport; - context->swapBuffers = swapBuffers; - context->status = status; - context->busy = busy; - context->idle = idle; - context->getBufferPtr = getBufferPtr; - context->renderBuffer = renderBuffer; - context->origin = origin; - context->ioCtl = ioCtl; - context->control = control; - context->wrapFIFO = wrapFIFO; - - - context->gamma = gamma; - context->sliPciOwner = sliPciOwner; -} diff --git a/glide2x/sst1/init/init.c b/glide2x/sst1/init/init.c deleted file mode 100644 index a397afe..0000000 --- a/glide2x/sst1/init/init.c +++ /dev/null @@ -1,827 +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 "init.h" -#include "fxinit.h" - -#include -#include - -#if defined(__WATCOMC__) -#define _inp inp -#define _outp outp -#define _outpw outpw -#endif -#if defined(__linux__) - -#define _inp(port) pioInByte(port) -#define _outp(port, data) pioOutByte(port, data) -#define _outpw(port, data) pioOutWord(port, data); - -#endif - -#include -#include - -#ifdef _WIN32 -#define _WIN32_LEAN_AND_MEAN_ -#include -#endif - -#include -#include - -static const PciRegister PCI_VENDOR_ID = { 0x0, 2, READ_ONLY }; -static const PciRegister PCI_DEVICE_ID = { 0x2, 2, READ_ONLY }; - - -/*------------------------------------------------------------------- - Module Constants - -------------------------------------------------------------------*/ - - -static InitContext - contexts[NUM_3DFX_PRODUCTS]; /* pool of device contexts */ -InitContext - *context; /* Current device context */ -static InitDeviceInfo - hwInfo[INIT_MAX_DEVICES]; /* Info for all supported devices */ -static FxU32 - numDevicesInSystem, /* Number of supported devices. */ - numSst1s; /* # SST1s in system */ -static FxBool - libInitialized; /* Well, has it been? */ - -/*------------------------------------------------------------------- - Function: initEnumHardware - Date: 10/9 - Implementor(s): jdt - Library: init - Description: - Calls a user supplied function on an initialized InitDeviceInfo - structure for each device in the system. Calls a user supplied - callback repeatedly for each device in the system. The callback - can stop the enumeration cycle by return a value of FXTRUE. - Arguments: - cb - callback function of type INitHWEnumCallback which is called on - an initialzied InitDeviceInfo structure - Return: - none - -------------------------------------------------------------------*/ -void -initEnumHardware( InitHWEnumCallback *cb ) -{ - FxU32 busLocation; - FxU32 device; - if ( !libInitialized ) { - - /* When initializing the Library snoop out all 3Dfx devices - and fill a static data structure with pertinant data. */ - - numDevicesInSystem = 0; - numSst1s = 0; - if ( !pciOpen() ) return; - for( busLocation = 0; busLocation < MAX_PCI_DEVICES; busLocation++ ) { - if ( pciDeviceExists( busLocation ) ) { - FxU32 vId, dId; - pciGetConfigData( PCI_VENDOR_ID, busLocation, &vId ); - pciGetConfigData( PCI_DEVICE_ID, busLocation, &dId ); - - GDBG_INFO((80, "initEnumHardware: Vendor: 0x%x Device: 0x%x\n", vId, dId)); - -#if defined( SST1 ) - if ( (vId == TDFXVID) && - (dId == SST1DID) ) { /* Detect SST1 */ - FxU32 *base; - sst1DeviceInfoStruct info; - - /* Scanline interleave must be two boards back to back - if there is a second board in the system, - and the previous board was SLI, then this is the slave */ - if ( numDevicesInSystem > 0 ) { - if ( hwInfo[numDevicesInSystem-1].hwClass==INIT_VOODOO && - hwInfo[numDevicesInSystem-1].hwDep.vgInfo.sliDetect ) { - - hwInfo[numDevicesInSystem-1].hwDep.vgInfo.slaveBaseAddr = - (FxU32)sst1InitMapBoard( numSst1s ); - hwInfo[numDevicesInSystem-1].regs.hwDep.VGRegDesc.slavePtr = - (FxU32*)hwInfo[numDevicesInSystem-1].hwDep.vgInfo.slaveBaseAddr; - numSst1s++; - continue; - - } - } - - hwInfo[numDevicesInSystem].vendorID = (FxU16) vId; - hwInfo[numDevicesInSystem].deviceID = (FxU16) dId; - hwInfo[numDevicesInSystem].devNumber = numDevicesInSystem; - hwInfo[numDevicesInSystem].hwClass = INIT_VOODOO; - - /* On SST-1 We Have to Initialize the Registers - to Discover the configuration of the board */ -#if 0 - base = sst1InitMapBoard( numSst1s ); - sst1InitRegisters( base ); -#else - base = (FxU32*)initMapBoard(numSst1s); -#endif - sst1InitGetDeviceInfo( base, &info ); - - hwInfo[numDevicesInSystem].hwDep.vgInfo.vgBaseAddr = (FxU32) base; - hwInfo[numDevicesInSystem].hwDep.vgInfo.pfxRev = info.fbiRevision; - hwInfo[numDevicesInSystem].hwDep.vgInfo.pfxRam = info.fbiMemSize; - hwInfo[numDevicesInSystem].hwDep.vgInfo.nTFX = info.numberTmus; - hwInfo[numDevicesInSystem].hwDep.vgInfo.tfxRev = info.tmuRevision; - hwInfo[numDevicesInSystem].hwDep.vgInfo.tfxRam = info.tmuMemSize[0]; - hwInfo[numDevicesInSystem].hwDep.vgInfo.sliDetect = info.sstSliDetect; - hwInfo[numDevicesInSystem].hwDep.vgInfo.slaveBaseAddr = 0; - hwInfo[numDevicesInSystem].regs.hwDep.VGRegDesc.baseAddress = base; - hwInfo[numDevicesInSystem].regs.hwDep.VGRegDesc.slavePtr = 0; - - numSst1s++; - numDevicesInSystem++; - } -#elif defined(SST96) -#define IS_CHIP(name) (vId == name##VID && dId == name##DID) - - if (IS_CHIP(AT3D) || - IS_CHIP(MCRX)) { - - if (IS_CHIP(MCRX)) { - /* In the case of Macronix, look for 3d4/3f[2] == 1, as - they set that bit when we're attached. */ - FxU8 regVal; - _outp(0x3d4, 0x3f); - regVal = _inp(0x3d5); - - if (!(regVal & (1 << 2))) /* we're not there */ - continue; - } - - hwInfo[numDevicesInSystem].vendorID = (FxU16) vId; - hwInfo[numDevicesInSystem].deviceID = (FxU16) dId; - hwInfo[numDevicesInSystem].devNumber = numDevicesInSystem; - hwInfo[numDevicesInSystem].hwClass = INIT_VG96; - - /* SST-96 initialization also retrieves board configuration info */ -#if 0 - init96MapBoard(&hwInfo[numDevicesInSystem].regs, - &hwInfo[numDevicesInSystem].hwDep.vg96Info, - (FxU16) vId, (FxU16) dId); -#else - initMapBoard(numDevicesInSystem); -#endif - - hwInfo[numDevicesInSystem].hwDep.vg96Info.vgaBaseAddr = - (FxU32)hwInfo[numDevicesInSystem].regs.hwDep.VG96RegDesc.partnerRegPtr; - hwInfo[numDevicesInSystem].hwDep.vg96Info.vg96BaseAddr = - (FxU32)hwInfo[numDevicesInSystem].regs.hwDep.VG96RegDesc.baseAddress; - - numDevicesInSystem++; - } -#else -# error "Do hardware enumeration for this chip!" -#endif - } - } - - - /* Sanity Check for SLI detection */ - for( device = 0; device < numDevicesInSystem; device++ ) { - if ( hwInfo[device].hwClass == INIT_VOODOO && - hwInfo[device].hwDep.vgInfo.sliDetect && - hwInfo[device].hwDep.vgInfo.slaveBaseAddr == 0 ) { - hwInfo[device].hwDep.vgInfo.sliDetect = FXFALSE; - } - } - - /* Initialize all drivers */ - vgDriverInit( &contexts[INIT_VOODOO] ); - vg96DriverInit( &contexts[INIT_VG96] ); - h3DriverInit( &contexts[INIT_H3] ); - - - /* Mark the library as initialized */ - libInitialized = FXTRUE; - } - - if ( cb ) { - for( device = 0; device < numDevicesInSystem; device++ ) { - cb( &hwInfo[device] ); - } - } - return; -} /* initEnumHardware */ - -volatile FxU32* -initMapBoard(const FxU32 boardNum) -{ - volatile FxU32* retVal = NULL; - FxBool okP = (boardNum < INIT_MAX_DEVICES); - - if (okP) { - InitDeviceInfo* infoP = (hwInfo + boardNum); - const FxU32 vId = infoP->vendorID; - const FxU32 dId = infoP->deviceID; - -#if defined(SST1) - okP = ((vId == TDFXVID) && - (dId == SST1DID)); - - if (okP) { - retVal = sst1InitMapBoard(boardNum); - sst1InitRegisters((FxU32*)retVal); - } -#elif defined(SST96) - okP = (IS_CHIP(AT3D) || - IS_CHIP(MCRX)); - - if (okP) { - init96MapBoard(&infoP->regs, &infoP->hwDep.vg96Info, - (FxU16)vId, (FxU16)dId); - retVal = infoP->regs.hwDep.VG96RegDesc.baseAddress; - } -#else -#error "Need to define initMapBoard for this chip!" -#endif /* HW Check */ - } - - return retVal; -} - - -/*------------------------------------------------------------------- - Function: initClose - Date: 10/17 - Implementor(s): jdt - Library: init - Description: - Unmap all hardware and set library to unitialized state - Arguments: - none - Return: - none - -------------------------------------------------------------------*/ -void initClose( void ) { - if ( libInitialized ) { - unsigned i; - for ( i = 0; i < numDevicesInSystem; i++ ) { - /* Insert unmap code here */ /* FIXME!!!! */ - } - pciClose(); - libInitialized = FXFALSE; - } -} /* initClose */ - -/*------------------------------------------------------------------- - Function: initGetDeviceInfo - Date: 10/9 - Implementor(s): jdt - Library: init - Description: - Fills a user supplied area of memory with information describing - the a 3Dfx device. The device is identified on the bus by the unique - devNumber assigned by the library and revealed to the user through - initEnumHardware. - Arguments: - devNumber - number identifying device in system - info - pointer to user memory to be filled with dev info - Return: - FXTRUE - succeed - FXFALSE - one or both parameters invalid - -------------------------------------------------------------------*/ -FxBool -initGetDeviceInfo( FxU32 devNumber, InitDeviceInfo *info ) -{ - FxBool rv; - - if ( devNumber < numDevicesInSystem ) { - *info = hwInfo[devNumber]; - rv = FXTRUE; - } else { - rv = FXFALSE; - } - return rv; -} /* initGetDeviceInfo */ - - -/*------------------------------------------------------------------- - Function: initDeviceSelect - Date: 10/9 - Implementor(s): jdt - Library: init - Description: - Selects a 3Dfx device ( potentially from among many in the system ) and - initializes the internal init driver functions with behavior appropriate - to the type of the selected device. - Arguments: - devNumber - unique number assigned to each device by initEnumHardware - Return: - FXTRUE - success - FXFALSE - invalide device number - -------------------------------------------------------------------*/ - -FxBool -initDeviceSelect( FxU32 devNumber ) -{ - FxBool rv = FXFALSE; - - if ( devNumber < numDevicesInSystem ) { - context = &contexts[hwInfo[devNumber].hwClass]; - context->info = hwInfo[devNumber]; - rv = FXTRUE; - } - - return rv; - -}/* initDeviceSelect */ - -/*------------------------------------------------------------------- - Function: initSetWriteMethod - Date: 10/17 - Implementor(s): jdt - Library: init - Description: - Sets up a register write method that respects the fifo conventions - of the hardware. - Arguments: - wcb - callback to be used to do direct writes from init code - Return: - none - -------------------------------------------------------------------*/ -void initSetWriteMethod( InitWriteCallback *wcb ) { - if ( context ) - context->writeMethod = wcb; - return; -} /* initSetWriteMethod */ - - - -/*------------------------------------------------------------------- - Function: initSetVideo - Date: 10/9 - Implementor(s): jdt, murali - Library: init - Description: - This will initialize the video, and allocate color and aux buffers - prior to rendering. - Arguments: - hwnd - pointer to a window handle or null. If NULL, then - the application window handle will be inferred though - the GetActiveWindow() api. - resolution - either one of the pre-defined glide resolutions, - or GR_RESOLUTION_NONE, in which case the window - size is inferred from the size application window - refresh - requested fullscreen refresh rate, ignored in a window - format - requested ccolor format for glide packed color values - origin - location of coordinate origin either upper left or - lower right - nColBuffers - number of color buffers to attempt to allocate - 0 - meaningless - 1 - allocate a front buffer only - 2 - allocate a front and back buffer - 3 - allocate a front, back, aux buffer for tripple buffering - nAuxBuffers - number of aux buffers to attempt to allocate - 0 - no alpha or z buffers - 1 - allocate one aux buffer for alpha/depth buffering - 2 - allocate on depth and one alpha buffer ( unsup ) - xres - x resolution return val ( for user windows ) - yres - y resolution return val ( for user windows ) - fbStride - stride in pixels of frame buffer - Return: - FXTRUE - all resources requested where allocated - FXFALSE - some or all resources were not available. By comparing - desc before and after call, the user can determine which - resources were denied. - -------------------------------------------------------------------*/ -FxBool initSetVideo( FxU32 hWnd, - GrScreenResolution_t sRes, - GrScreenRefresh_t vRefresh, - InitColorFormat_t cFormat, - InitOriginLocation_t yOrigin, - int nColBuffers, - int nAuxBuffers, - int *xres, - int *yres, - int *fbStride, - sst1VideoTimingStruct *vidTimings) { - FxBool rv; - if ( context ) { - rv = context->setVideo( hWnd, sRes, vRefresh, cFormat, - yOrigin, nColBuffers, nAuxBuffers, - xres, yres, fbStride, vidTimings); - } else { - rv = FXFALSE; - } - return rv; -} /* initSetVideo */ - - -/*------------------------------------------------------------------- - Function: initRestoreVideo - Date: 10/16 - Implementor(s): jdt - Library: init - Description: - Restore video to its state prior to initSetVideo - Arguments: - none - Return: - none - -------------------------------------------------------------------*/ -void initRestoreVideo( void ) { - if ( context ) - context->restoreVideo(); -} /* initRestoreVideo */ - -/*------------------------------------------------------------------- - Function: initEnableTransport - Date: 10/17 - Implementor(s): jdt - Library: init - Description: - Enable the command transport mechanism for the underlying - hardware and return information about accessing the transport - to the caller - Arguments: - info - data structure describing state of transport - Return: - FXTRUE - successfully enabled the command transport - FXFALSE - failed ot enable the command transport - -------------------------------------------------------------------*/ -FxBool initEnableTransport( InitFIFOData *info ) { - FxBool rv; - if ( context ) { - rv = context->enableTransport( info ); - } else { - rv = FXFALSE; - } - return rv; -} /* initEnableTransport */ - -/*------------------------------------------------------------------- - Function: initDisableTransport - Date: 10/17 - Implementor(s): jdt - Library: init - Description: - Return transport control to reset state - Arguments: - none - Return: - none - -------------------------------------------------------------------*/ -void initDisableTransport( void ) { - if ( context ) - context->disableTransport(); -} /* initDisableTransport */ - -/*------------------------------------------------------------------- - Function: initSwapBuffers - Date: 10/9 - Implementor(s): jdt, murali - Library: init - Description: - Initiate a buffer swap. - Arguments: - code - code describing type of swap, wether to sync to vretrace, how - many vretraces to wait, etc. - -------------------------------------------------------------------*/ -void initSwapBuffers( FxU32 code ) { - if ( context ) - context->swapBuffers( code ); -} /* initSwapBuffers */ - -/*------------------------------------------------------------------- - Function: initStatus - Date: 10/9 - Implementor(s): jdt - Library: init - Description: - Returns the status word from the hardware - Arguments: - none - Return: - 32-bit status word ( chip specific ) - -------------------------------------------------------------------*/ -FxU32 initStatus( void ) { - FxU32 rv; - if ( context ) { - rv = context->status(); - } else { - rv = 0; - } - return rv; -} /* initStatus */ - -/*------------------------------------------------------------------- - Function: initBusy - Date: 10/9 - Implementor(s): jdt - Library: init - Description: - return true if hardware is busy rendering - Arguments: - none - Return: - FXTRUE - if busy - FXFALSE - if idle - -------------------------------------------------------------------*/ -FxBool initBusy( void ) { - FxBool rv; - if ( context ) { - rv = context->busy(); - } else { - rv = FXTRUE; - } - return rv; -} /* initBusy */ - -/*------------------------------------------------------------------- - Function: initIdle - Date: 10/9 - Implementor(s): jdt - Library: init - Description: - Returns only when graphics pipeline is completely idle. - May hang software if hardware is permanently busy. - Arguments: - none - Return: - none - -------------------------------------------------------------------*/ -void initIdle( void ) { - if ( context ) - context->idle(); -} /* initIdle */ - -/*------------------------------------------------------------------- - Function: initGetBufferPtr - Date: 2/25 - Implementor(s): jdt - Library: Init - Description: - Get the current pointer to a particular buffer - Arguments: - buffer - which buffer to get pointer to - Return: - integer pointer - -------------------------------------------------------------------*/ -void *initGetBufferPtr( InitBuffer_t buffer, int *strideBytes ) { - if ( context ) - return context->getBufferPtr( buffer, strideBytes ); - else - return 0; -} /* initGetBufferPtr */ - -/*------------------------------------------------------------------- - Function: initRenderBuffer - Date: 2/25 - Implementor(s): jdt - Library: init - Description: - Sets the current render buffer - Arguments: - buffer - which buffer to render to ( front or back ) - Return: - none - -------------------------------------------------------------------*/ -void initRenderBuffer( InitBuffer_t buffer ) { - if ( context ) context->renderBuffer( buffer ); - return; -} /* initRenderBuffer */ - -/*------------------------------------------------------------------- - Function: initOrigin - Date: 2/25 - Implementor(s): jdt - Library: init - Description: - Set the yorigin - Arguments: - origin - origin designation - Return: - none - -------------------------------------------------------------------*/ -void initOrigin( InitOriginLocation_t origin ) { - if ( context ) context->origin( origin ); - return; -} /* initOrigin */ - -/*------------------------------------------------------------------- - Function:initIOCtl - Date: 10/9 - Implementor(s): jdt - Library: init - Description: - CYA function so that emergency functionality may be added w/o - corrupting dll interface - Arguments: - token - describes IOCTL function - argument - pointer to arguments - Return: - none - -------------------------------------------------------------------*/ -void initIOCtl( FxU32 token, void *argument ) { - if ( context ) - context->ioCtl( token, argument ); -} /* initIOCtl */ - -/*------------------------------------------------------------------- - Function: initControl - Date: 10/9 - Implementor(s): murali - Library: init - Description: - This will re-attach new buffers for the rendering context, used - typically only in a windowing system where buffers need to move - and resize. Also, implicitly detach old associated buffers. - Arguments: - XXX - Return: - FXTRUE - all resources requested where allocated - FXFALSE - some or all resources were not available. By comparing - desc before and after call, the user can determine which - resources were denied. - -------------------------------------------------------------------*/ -FxBool initControl( FxU32 code) -{ - - FxBool rv; - - GDBG_INFO((80, "initControl: code = %d, context=%.08x\n", code, context)); - if ( context ) { - rv = context->control( code ); - } else { - rv = FXFALSE; - } - return rv; -} /* initControl */ - -/*------------------------------------------------------------------- - Function: initWrapFIFO - Date: 13-Feb-97 - Implementor(s): dow - Library: init - Description: - Reset the command transport when the fifo is full - Arguments: - pointer to fifo data - Return: - none - -------------------------------------------------------------------*/ -FxBool initWrapFIFO(InitFIFOData *fifoData) { - if ( context ) - return context->wrapFIFO(fifoData); - else - return FXFALSE; -} /* initWrapFIFO */ - -/*------------------------------------------------------------------- - Function: initGamma - Date: 10/9 - Implementor(s): jdt - Library: init - Description: - SST-1 holdover function which initializes the gamma table in some - video hardware to normalize monitor brightness - Arguments: - gamma - floating point gamma correction factor - Return: - none - -------------------------------------------------------------------*/ -void initGamma( double gamma ) { - if ( context ) - context->gamma( gamma ); -} /* initGamma */ - -/*------------------------------------------------------------------- - Function: initSliPciOwner - Date: 10/9 - Implementor(s): jdt - Library: init - Description: - Do some voodoo(tm) to change the owner of the PCI bus in an SLI - configuration - Arguments: - regbase - ask scott sellers - owner - ask scott sellers - Return: - none - -------------------------------------------------------------------*/ -void initSliPciOwner( FxU32 *regbase, FxU32 owner ) { - if ( context ) - context->sliPciOwner( regbase, owner ); -} /* initSliPciOwner */ - - -/*------------------------------------------------------------------- - Function: initNumBoardsInSystem - Date: 19970813 - Implementor(s): pgj - Library: init - Description: - Computes the number of boards compatible with the hardware the init - library is compiled for, i.e. this will count either the number - of VG xor Rush cards present. - Return: - number of boards found - -------------------------------------------------------------------*/ -FxU32 initNumBoardsInSystem(void) -{ - FxU32 numBoards, j, n; - - if(getenv(("SST_BOARDS"))) { - numBoards = atoi(getenv(("SST_BOARDS"))); - } else { - numBoards = 0; -#if defined(SST1) - for(j=0; jgammaRGB( r, g, b ); - return FXFALSE; -} /* initGammaRGB */ - -/*------------------------------------------------------------------- - Function: initGammaTable - Date: Mar-2-98 - Implementor(s): atai - Library: init - Description: - initialize Gamma table givin RGB table - Arguments: - Return: - none - -------------------------------------------------------------------*/ -FxBool initGammaTable(FxU32 nentries, FxU32 *r, FxU32 *g, FxU32 *b) { - if ( context ) - return context->initGammaTable( nentries, r, g, b ); - return FXFALSE; -} /* initGammaTable */ - -/*------------------------------------------------------------------- - Function: initFindVideoTimingStruct - Date: Mar-2-98 - Implementor(s): atai - Library: init - Description: - find video timing structure - Arguments: - Return: - none - -------------------------------------------------------------------*/ -sst1VideoTimingStruct *initFindVideoTimingStruct(GrScreenResolution_t sRes, GrScreenRefresh_t vRefresh) { - if ( context ) - return context->findVidTimingStruct( sRes, vRefresh ); - return NULL; -} /* initGamma */ - diff --git a/glide2x/sst1/init/init.h b/glide2x/sst1/init/init.h deleted file mode 100644 index f170f59..0000000 --- a/glide2x/sst1/init/init.h +++ /dev/null @@ -1,403 +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$ -** -*/ - -#ifndef _TINI_H_ -#define _TINI_H_ - -#include <3dfx.h> -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/*------------------------------------------------------- - Constants - -------------------------------------------------------*/ -/* - More slots than you will ever see in a consumer system - */ -#define INIT_MAX_DEVICES 8 - -/*--IOCTLs-----------------------------------------------*/ - /* An IOCTL value is appliacable on all systems where the the - associated value is ORed into the low eight bits. The reason for - this is so that code that calls the init code can do IOCTLs - without worrying about conditional compilation for device - dependance. So, the form of an IOCTL is: - - #define INIT_FOO_IOCTL \ - ((hw1 | hw2 | ... | hwn) | (number << INIT_OCTL_VALUE_SHIFT)) - - Remember, this isn't really an I/O control, but rather a back - door for whatever we've forgotten, or whatever may only apply to - a small-enough subset of 3Dfx hardware that it doesn't justify - modifying the init API. - */ -#define INIT_IOCTL_SST1 0x01 -#define INIT_IOCTL_SST96 0x02 -#define INIT_IOCTL_SST97 0x04 - - -#define INIT_IOCTL_VALUE_SHIFT 0x8 - -#define INIT_VIDTIMINGS_IOCTL \ - (INIT_IOCTL_SST1 | (0x1 << INIT_IOCTL_VALUE_SHIFT)) - - /* - Vendor IDs and Device IDs - */ -/* 3Dfx Voodoo Graphics */ -#define TDFXVID 0x121A -#define SST1DID 0x01 - -/* Alliance AT3D */ -#define AT3DVID 0x1142 -#define AT3DDID 0x643d - -/* Trident T96851 */ -#define T968VID 0x1023 -#define T968DID 0x9660 - -/* MRTI M510 */ -#define MRTIVID 0x1293 -#define MRTIDID 0x0510 - -/* Macronix MX86251 Fixme!!! these are bogus !!! XXX ??? */ -#define MCRXVID 0x10d9 -#define MCRXDID 0x8626 - -/* - * (* Murali's comments *) - * - * Note that *EVERY* one of the following 3 definitions have an exact - * counterpart in glide.h. - * - * We could have used the glide definitions, but that would affect layering - * glide/src/ * on top of this sst1/init/ * library. So, we use these - * redundant defintions, and let glide/src/ * translate from glide.h to - * init.h defintions. (Note that translation is simply a typecast). - * - * The only exception that proves this rule is sst1vid.h, where something - * used in the init library (GrScreenResolution_t, GrScreenRefresh_t) - * is exposed to the glide application from sst1vid.h, WHICH LIVES IN - * THIS DIRECTORY, so we can use these typedefs here directly. - * - * Here are the relevant counterparts in init.h and glide.h: - * - * initBuffer_t GrBuffer_t - * initOriginLocation_t GrOriginLocation_t - * initColorFormat_t GrColorFormat_t - * initBufDesc_t ??? (GrBufDesc_t) - * - * - * PLEASE PLEASE PLEASE - * Make sure that the correspondence is exact. - */ -typedef FxU32 InitBuffer_t; -#define INIT_BUFFER_FRONTBUFFER 0x0 -#define INIT_BUFFER_BACKBUFFER 0x1 -#define INIT_BUFFER_AUXBUFFER 0x2 -#define INIT_BUFFER_DEPTHBUFFER 0x3 -#define INIT_BUFFER_ALPHABUFFER 0x4 -#define INIT_BUFFER_TRIPLEBUFFER 0x5 - -#define INIT_BUFFER_FIFOBUFFER 0x6 -#define INIT_BUFFER_SCREENBUFFER 0x7 -#define INIT_BUFFER_TEXTUREBUFFER 0x8 -#define INIT_BUFFER_NONE 0xff - -typedef FxU32 InitOriginLocation_t; -#define INIT_ORIGIN_UPPER_LEFT 0x0 -#define INIT_ORIGIN_LOWER_LEFT 0x1 - -typedef FxI32 InitColorFormat_t; -#define INIT_COLORFORMAT_ARGB 0x0 -#define INIT_COLORFORMAT_ABGR 0x1 -#define INIT_COLORFORMAT_RGBA 0x2 -#define INIT_COLORFORMAT_BGRA 0x3 - -typedef FxI32 InitSmoothingMode_t; -#define INIT_SMOOTHING_DISABLE 0x0 -#define INIT_SMOOTHING_ENABLE 0x1 - -typedef FxU32 InitControl_t; -#define INIT_CONTROL_ACTIVATE 0x1 -#define INIT_CONTROL_DEACTIVATE 0x2 -#define INIT_CONTROL_RESIZE 0x3 -#define INIT_CONTROL_MOVE 0x4 - -typedef struct _InitBufDesc_t { - FxU32 bufMagic; - InitBuffer_t bufType; - FxU32 bufOffset; - FxI32 bufStride; - FxU32 bufBPP; /* bits per pixel */ -} InitBufDesc_t; - -/*------------------------------------------------------- - Data Structures - -------------------------------------------------------*/ - - -/*------------------------------------------------------------------- - Structure: VGInfo - Date: 10/4/96 - Implementor(s): jdt - Library: Init - Description: - Drescribes the capabilities of a standard Voodoo Graphics chip. - Members: - pfxRev - pixelFx chip rev - pfxRam - frame buffer ram - nTFX - number of texelFx chips - tfxRev - texelFx revision - tfxRam = texelFx ram - sliDetect - scan line interleave configuration detected - -------------------------------------------------------------------*/ -typedef struct _VGInfo { - FxU32 vgBaseAddr; - FxU32 pfxRev; - FxU32 pfxRam; - FxU32 nTFX; - FxU32 tfxRev; - FxU32 tfxRam; - FxBool sliDetect; - FxU32 slaveBaseAddr; -} VGInfo; - -/*------------------------------------------------------------------- - Structure: VG96Info - Date: 10/4/96 - Implementor(s): jdt - Library: Init - Description: - Describes the capabilities of VG 96 accelerated VGA board - Members: - vgaChip - code describing partner VGA part - 0 - undefined - 1 - Alliance AT3D - 2 - Trident T9685 - 3 - MRTI MR510 - 4 - Macronics MX 86251 - vg96Rev - revision of VG96 chip - vg96Ram - frame buffer ram - nTFX - number of texelFx chips - tfxRev - texelFx revision - tfxRam - texelFx ram - -------------------------------------------------------------------*/ -typedef struct _VG96Info { - FxU32 vgaBaseAddr; - FxU32 vg96BaseAddr; - FxU32 vgaChip; - FxU32 vg96Rev; - FxU32 vg96Ram; - FxU32 nTFX; - FxU32 tfxRev; - FxU32 tfxRam; -} VG96Info; - -/*------------------------------------------------------------------- - Structure: H3Info - Date: 10/4 - Implementor(s): jdt - Library: Init - Description: - Capabilities of H3 - Members: - h3Rev - revision of H3 - fbRam - frame buffer ram - texRam - texture ram - -------------------------------------------------------------------*/ -typedef struct _H3Info { - FxU32 h3Rev; - FxU32 fbRam; - FxU32 texRam; -} H3Info; - -typedef enum { INIT_VOODOO, - INIT_VG96, - INIT_H3, - NUM_3DFX_PRODUCTS -} TDFXHwClass; - -typedef struct _InitRegisterDesc { - union { - struct { - FxU32 - *baseAddress, /* Base address */ - *slavePtr; /* Scanline interleaved slave */ - } VGRegDesc; - struct { - volatile FxU32 - *baseAddress, /* Base address */ - *partnerRegPtr, /* Partners' registers */ - *serialStatus, /* Serial Status register */ - *fifoApertureBase; /* Ptr to base of FIFO apurture */ - - FxU8 mclockHi; - FxU8 mclockLo; - } VG96RegDesc; - struct { - FxU32 - *baseAddress; /* Base address */ - } BansheeRegDesc; - } hwDep; -} InitRegisterDesc; - -/*------------------------------------------------------------------- - Structure: InitDeviceInfo - Date: 10/4 - Implementor(s): jdt - Library: Init - Description: - Describes a 3Dfx enabled hardware device in a system. Includes - the device number which will uniquely identify this device in the - current system configuration - Members: - devNumber - unique device number - class - - -------------------------------------------------------------------*/ -typedef struct _InitDeviceInfo { - FxU32 devNumber; - TDFXHwClass hwClass; - FxU16 - vendorID, deviceID; - union { - VGInfo vgInfo; - VG96Info vg96Info; - H3Info h3Info; - } hwDep; - InitRegisterDesc regs; -} InitDeviceInfo; - - -typedef FxU32 InitSwapType_t; -#define INIT_SWAP_FLIP 0x0 -#define INIT_SWAP_BLT 0x1 - -typedef struct _InitFIFOData { - FxU32 - cpuType; /* 5 for Pentium, 6 for Pentium Pro */ - union { - struct { - FxU32 fifoFree; - FxU32 memFifoStatusLwm; - } vgFIFOData; - struct { - volatile FxU32 - *fifoVirt, /* linear address of FIFO Start */ - fifoMax, /* Max linear address in FIFO */ - fifoPhys, /* Physical location of FIFO */ - fifoCur, /* Current Wrap */ - *fifoPtr, /* Pointer to current FIFO entry */ - fifoSize; /* Size of FIFO in bytes */ - -#if SST96_ALT_FIFO_WRAP - /* dpc - 10 sep 1997 FixMe! - - * I need to pass the init code the block size that I want to - * write, but I don't want to change the interface out from - * everyone else. If we re-visit the init code interface then - * fix me then. - */ - FxI32 blockSize; - - FxU32 fifoRead; /* Last known hw read ptr */ - FxI32 roomToReadPtr; /* # of bytes to fifoRead */ - FxI32 roomToEnd; /* # of bytes to fifoEnd */ - - InitRegisterDesc* regDesc; -#endif /* SST96_ALT_FIFO_WRAP */ - - FxBool - fifoLfb; /* LFB FIFO or alternate? */ - } vg96FIFOData; - } hwDep; -} InitFIFOData; - -/*------------------------------------------------------- - Hardware Independant Setup Calls - -------------------------------------------------------*/ -typedef FxBool InitHWEnumCallback( const InitDeviceInfo *info ); -typedef void InitWriteCallback( FxU32 *linaddr, FxU32 val ); - -void initEnumHardware( InitHWEnumCallback *cb ); -volatile FxU32* initMapBoard(const FxU32 boardNum); -void initClose (void); -FxBool initGetDeviceInfo( FxU32 devNumber, InitDeviceInfo *info ); -FxBool initDeviceSelect( FxU32 devNumber ); - -/*------------------------------------------------------- - Driver Calls - -------------------------------------------------------*/ -void initSetWriteMethod( InitWriteCallback *wcb ); -FxBool initSetVideo( FxU32 hWnd, - GrScreenResolution_t sRes, - GrScreenRefresh_t vRefresh, - InitColorFormat_t cFormat, - InitOriginLocation_t yOrigin, - int nColBuffers, - int nAuxBuffers, - int *xres, - int *yres, - int *fbStride, - sst1VideoTimingStruct *vidTimings); -void initRestoreVideo( void ); - -FxBool initEnableTransport( InitFIFOData *info ); -void initDisableTransport( void ); - -void initSwapBuffers( FxU32 code ); -FxU32 initStatus( void ); -FxBool initBusy( void ); -void initIdle( void ); -void *initGetBufferPtr( InitBuffer_t buffer, int *strideBytes ); -void initRenderBuffer( InitBuffer_t buffer ); -void initOrigin( InitOriginLocation_t origin ); -void initIOCtl( FxU32 token, void *argument ); -FxBool initControl (FxU32 code); -FxBool initWrapFIFO(InitFIFOData *fifoData); - -/* SST-1 Flotsam */ -void initGamma( double gamma ); -void initSliPciOwner( FxU32 *regbase, FxU32 owner ); -FxU32 initNumBoardsInSystem( void ); - -const char* -myGetenv(const char*); - -/* -** Glide 3 init functions -*/ -FxBool initGammaRGB( double r, double g, double b ); -FxBool initGammaTable(FxU32 nentries, FxU32 *r, FxU32 *g, FxU32 *b); -sst1VideoTimingStruct *initFindVideoTimingStruct(GrScreenResolution_t sRes, GrScreenRefresh_t vRefresh) ; - -#ifdef __cplusplus -} -#endif - -#endif /* _TINI_H_ */ diff --git a/glide2x/sst1/init/init96/atvga.h b/glide2x/sst1/init/init96/atvga.h deleted file mode 100644 index accc8ba..0000000 --- a/glide2x/sst1/init/init96/atvga.h +++ /dev/null @@ -1,86 +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 __ATVGA_H__ -#define __ATVGA_H__ - -/* -** $Revision$ -** $Date$ -** -*/ - -#define VGA_REGISTER_INPUT_STATUS_1_MONO 0x3BA -#define VGA_REGISTER_INPUT_STATUS_1_COLOR 0x3DA -#define VR_IS1_DISPLAY_INACTIVE (1 << 0) -#define VR_IS1_DISPLAY_VRETRACE (1 << 3) - -#define VGA_REGISTER_SEQUENCER 0x3C4 -#define AR_SEQ_REMAP_CONTROL 0x1B /* 6 */ -#define AR_SEQ_FLAT_MODEL_CONTROL 0x1C /* 6 */ -#define AR_SEQ_ALTERNATE_ACCESS_POINTER 0x1D /* 8 */ -#define AR_SEQ_ALTERNATE_ACCESS_DECODE_LO_INDEX 0x1E /* 8 */ -#define AR_SEQ_ALTERNATE_ACCESS_DECODE_HI_INDEX 0x1F /* 8 */ - - -#define MMEXT_REGISTER_WINDOW0_CONTROL 0x082 -#define MMEXT_REGISTER_WINDOW0_BASE_ADDRESS 0x084 -#define MMEXT_REGISTER_WINDOW0_STRETCH_FACTOR_HORIZONTAL_1 0x086 -#define MMEXT_REGISTER_WINDOW0_STRETCH_FACTOR_HORIZONTAL_2 0x088 -#define MMEXT_REGISTER_WINDOW0_STRETCH_FACTOR_VERTICAL_1 0x08A -#define MMEXT_REGISTER_WINDOW0_STRETCH_FACTOR_VERTICAL_2 0x08C -#define MMEXT_REGISTER_WINDOW_SEQUENCE_CONTROL 0x08E - -#define MMEXT_REGISTER_DISPLAY_MEMORY_CONFIGURATION 0x0C4 /* 12 */ - -#define MMEXT_REGISTER_PIXEL_FIFO_REQUEST_POINT 0xD4 /* 24 */ -#define MMEXT_REGISTER_ENABLE_EXTENDED_REGISTERS 0x0DB /* 4 */ -#define AR_ENABLE_DOS_SPACE 0x01 -#define AR_ENABLE_LINEAR_SPACE 0x02 -#define AR_ENABLE_COPROCESSOR_APERTURE 0x04 -#define AR_ENABLE_SECOND_LINEAR_APERTURE 0x08 - -#define MMEXT_REGISTER_MCLK_CONTROL 0x0E8 /* 8 */ -#define MMEXT_REGISTER_MCLK_DENOMINATOR 0x0E9 /* 8 */ -#define MMEXT_REGISTER_MCLK_NUMERATOR 0x0EA /* 8 */ - -#define MMEXT_REGISTER_SERIAL_INPUT 0x1F4 /* 16 */ - -#define MMEXT_REGISTER_TILE 0x200 -#define TILE_REGISTER_CONTROL 0x00 -#define TILE_REGISTER_DISPLAY_POSITION_LEFT 0x02 -#define TILE_REGISTER_DISPLAY_POSITION_RIGHT 0x04 -#define TILE_REGISTER_DISPLAY_POSITION_BOTTOM 0x06 -#define TILE_REGISTER_DATA_WIDTH 0x08 -#define TILE_REGISTER_DATA_BASE_LOCATION_LO 0x0A -#define TILE_REGISTER_DATA_BASE_LOCATION_HI 0x0C - -#define VGA_CRTC_INDEX 0x3D4 -#define VGA_CRTC_DATA 0x3D5 -#define VCRTC_SERIAL_START_ADDRESS_HI 0x0C -#define VCRTC_SERIAL_START_ADDRESS_LO 0x0D -#define ATCRTC_SERIAL_OVERFLOW 0x1C -#define VGA_INPUT_STATUS_1C 0x3DA -#define VIS1C_PIXEL_DISPLAY_INACTIVE BIT(0) -#define VIS1C_VERTICAL_RETRACE_ACTIVE BIT(3) - -#endif - diff --git a/glide2x/sst1/init/init96/dxdrvr.c b/glide2x/sst1/init/init96/dxdrvr.c deleted file mode 100644 index b0cfd26..0000000 --- a/glide2x/sst1/init/init96/dxdrvr.c +++ /dev/null @@ -1,1006 +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 -** -** $Log$ - * - * 34 1/12/98 10:22p Dow - * H3D Stereo Support - * - * 33 11/06/97 9:51a Jdt - * Fixes window resize events to not crash/hang - * - * 32 10/01/97 3:21p Atai - * fix 819, DOS tests flicker on glide - * - * 31 9/08/97 12:05p Atai - * fixed resize problem in dxControl() - * - * 30 8/28/97 10:24a Odo - * moved debugging varaible - * - * 29 8/27/97 10:32a Dow - * added more debugging info - * - * 28 8/21/97 4:24p Dow - * Fixed @#$%! C++ Comments, Added Debugging info -** -** $Revision$ -** $Date$ -** -*/ - -/* 3Dfx Headers */ -#include <3dfx.h> -#include -#include -#include -#define FX_DLL_DEFINITION -#include -#include - -#ifdef __DOS32__ -#include -#endif - -#include - -/* Local Headers */ -#include "init96.h" -#include "fxinit96.h" - -#define VG96_BUF_MAGIC 0x666 - -FxBool tripleBuffering = 0; - -#ifdef GDBG_INFO_ON -static char *bufTypeNames[] = { - "INIT_BUFFER_FRONTBUFFER", - "INIT_BUFFER_BACKBUFFER", - "INIT_BUFFER_AUXBUFFER", - "INIT_BUFFER_DEPTHBUFFER", - "INIT_BUFFER_ALPHABUFFER", - "INIT_BUFFER_TRIPLEBUFFER", - "INIT_BUFFER_FIFOBUFFER", - "INIT_BUFFER_SCREENBUFFER", - "INIT_BUFFER_TEXTUREBUFFER" -}; -#endif - -#if defined( __WIN32__) && defined(INIT_ACCESS_DDRAW) -#define WIN32_LEAN_AND_MEAN -#include -#include - -#define NUM_BUFS 6 - -static HWND hWndApp = 0; -static FxU32 FifoOffset = 0; -static FxU32 Width = 0; -static FxU32 Height = 0; -static FxBool IsFullScreen = 0; -static InitBufDesc_t BufDesc[NUM_BUFS] = {0}; -#ifdef H3D -static int pageFlip = 0; -#endif - -/* Direct Draw stuff */ -static LPDIRECTDRAWCLIPPER lpClipper = NULL; -static LPDIRECTDRAWSURFACE lpFront = NULL; -static LPDIRECTDRAWSURFACE lpBack = NULL; -static LPDIRECTDRAWSURFACE lpAux = NULL; -static LPDIRECTDRAWSURFACE lpTriple = NULL; -static LPDIRECTDRAW2 lpDD = NULL; -static LPDIRECTDRAW lpDD1 = NULL; - - - -FxBool -ErrorMessage(HWND hWnd, char *err) -{ - GDBG_INFO((0, "Error %s \n", err)); -// MessageBox( hWnd, err, "ERROR", MB_OK ); - return FALSE; -} /* ErrorMessage */ - - - -/* - * Takes a DirectDraw Surface object (LPDIRECTDRAWSURFACE), looks up its - * description (DDSURFACEDESC), and returns a pointer to the surface and its - * stride value in pDesc. - */ -FxBool -_dxSurfaceToBufDesc(LPDIRECTDRAWSURFACE lpSurf, InitBufDesc_t *pDesc) -{ - DDSURFACEDESC ddsd; - - ddsd.dwSize = sizeof(ddsd); - if (IDirectDrawSurface2_Lock(lpSurf, NULL, &ddsd, DDLOCK_WAIT, NULL) - !=DD_OK) { - return ErrorMessage(hWndApp, "_dxSurfaceToBufDesc: DdrawSurface Lock failed\n"); - } - - /* pDesc->bufType should be filled in by caller */ - pDesc->bufOffset = (FxU32) (ddsd.lpSurface); /* virtual address. */ - pDesc->bufStride = (FxI32) (ddsd.lPitch); /* in bytes */ - pDesc->bufBPP = (FxI32) 16; - - IDirectDrawSurface2_Unlock(lpSurf, NULL); - return FXTRUE; -} /* _dxSurfaceToBufDesc */ - - - -/* - * Convert front, back and aux surfaces from DDraw to Glide bufDescriptors. - */ -FxBool -_dxDDrawToGlideDesc(InitBufDesc_t *pDesc) -{ - InitBufDesc_t *dFront = &pDesc[0]; - InitBufDesc_t *dBack = &pDesc[1]; - InitBufDesc_t *dAux = &pDesc[2]; - InitBufDesc_t *dFifo = &pDesc[3]; - InitBufDesc_t *dScreen = &pDesc[4]; - InitBufDesc_t *dTriple = &pDesc[5]; - - GDBG_INFO((80, "_dxDDrawToGlide entry\n")); - - /* Initialize all descriptors. */ - dScreen->bufMagic = VG96_BUF_MAGIC; - dScreen->bufType = INIT_BUFFER_SCREENBUFFER; - dScreen->bufOffset = 0; - dScreen->bufStride = 0; - dScreen->bufBPP = 0; - - /* Get info about screen (primary display) */ - dScreen->bufType = INIT_BUFFER_SCREENBUFFER; - if (!_dxSurfaceToBufDesc( lpFront, dScreen)) - return ErrorMessage(hWndApp, "Couldn't get Screen Info"); - - *dFront = *dBack = *dAux = *dFifo = - *dTriple = - *dScreen; - - dFront->bufType = INIT_BUFFER_FRONTBUFFER; - - /* Get info about back buffer */ - dBack->bufType = INIT_BUFFER_BACKBUFFER; - if (!_dxSurfaceToBufDesc( lpBack, dBack)) - return ErrorMessage(hWndApp, "Couldn't get Backbuffer Info"); - - /* Get info about aux buffer */ - dAux->bufType = INIT_BUFFER_AUXBUFFER; - if (!_dxSurfaceToBufDesc( lpAux, dAux)) - return ErrorMessage(hWndApp, "Couldn't get AuxBuffer Info"); - - /* Get info about triple buffer */ - if (tripleBuffering) { - dTriple->bufType = INIT_BUFFER_TRIPLEBUFFER; - if (!_dxSurfaceToBufDesc( lpTriple, dTriple)) - return ErrorMessage(hWndApp, "Couldn't get triple buffer Info"); - } - - /* Get info about cmdFifo */ - dFifo->bufType = INIT_BUFFER_FIFOBUFFER; - dFifo->bufOffset = FifoOffset; - dFifo->bufStride = 65536 << 1; /* Fixme!!! what's this? */ - - /* Now convert buf addresses for draw buffers into video memory offsets */ - dFront->bufOffset -= dScreen->bufOffset; - dBack ->bufOffset -= dScreen->bufOffset; - dAux ->bufOffset -= dScreen->bufOffset; - if (tripleBuffering) - dTriple->bufOffset -= dScreen->bufOffset; - - GDBG_INFO((80, "_dxDDrawToGlideDesc: dFront->bufOffset = 0x%x\n", dFront->bufOffset)); - GDBG_INFO((80, "_dxDDrawToGlideDesc: dBack->bufOffset = 0x%x\n", dBack->bufOffset)); - GDBG_INFO((80, "_dxDDrawToGlideDesc: dAux->bufOffset = 0x%x\n", dAux->bufOffset)); - GDBG_INFO((80, "_dxDDrawToGlideDesc: dFifo->bufOffset = 0x%x\n", dFifo->bufOffset)); - if (tripleBuffering) - GDBG_INFO((80, "_dxDDrawToGlideDesc: dTriple->bufOffset = 0x%x\n", dTriple->bufOffset)); - - GDBG_INFO((80, - "F:%.06x %5d B:%.06x %5d B2:%.06x %5d A:%.06x %5d, C:%.06x %5d\n", - dFront->bufOffset, dFront->bufStride, - dBack ->bufOffset, dBack ->bufStride, - dTriple->bufOffset, dTriple->bufStride, - dAux ->bufOffset, dAux ->bufStride, - dFifo ->bufOffset, dFifo ->bufStride)); - return TRUE; -} /* _dxDDrawToGlideDesc */ - - - -/* - * Allocate (or re-allocate for WM_SIZE) buffers from DDraw. - */ -FxBool -#ifdef H3D -_dxAllocSurfaces(int xRes, int yRes, int vRefresh, InitBufDesc_t *pDesc, int pageFlip) -#else -_dxAllocSurfaces(int xRes, int yRes, int vRefresh, InitBufDesc_t *pDesc) -#endif -{ - DDSURFACEDESC ddsd; - -#ifdef H3D - GDBG_INFO((80, "_dxAS: hWnd = %x, fs=%d, xRes=%d, yRes=%d, vRefresh=%d, pageFlip=%d\n", - hWndApp, IsFullScreen, xRes, yRes, vRefresh, pageFlip)); -#else - GDBG_INFO((80, "_dxAS: hWnd = %x, fs=%d, xRes=%d, yRes=%d, vRefresh=%d\n", - hWndApp, IsFullScreen, xRes, yRes, vRefresh)); -#endif - - if (lpDD1 == NULL) { - if (DirectDrawCreate( NULL, &lpDD1, NULL ) != DD_OK) { - return ErrorMessage(hWndApp, "DirectDrawCreate Failed!"); - } else { - GDBG_INFO((80, "_dxAS: DDraw Obj created!\n")); - } - } else { - GDBG_INFO((80, "_dxAS: DDraw Obj already existed!\n")); - } - - if (IDirectDraw_QueryInterface( lpDD1, &IID_IDirectDraw2, - (LPVOID*)&lpDD) !=DD_OK) { - - IDirectDraw_Release( lpDD1 ); - lpDD1 = NULL; - lpDD = NULL; - return ErrorMessage(hWndApp, "DDraw2 interface object failed!"); - } else { - GDBG_INFO((80, "_dxAS: DDraw2 Obj created!\n")); - } - - /* - * Make sure this is done after creating direct draw object!!! - * First time, only one time, get ourselves a command fifo. - * Fix me - XXX - */ - if (FifoOffset == 0) { - FifoOffset = init96GetFBVram() - 65536*3; /* fixme!!! why 3? */ - } - - /* - * If there are any previously allocated surfaces, free them now - * before asking for more. - */ - if( lpClipper) IDirectDrawSurface2_Release( lpClipper); - if( lpAux ) IDirectDrawSurface2_Release( lpAux ); - if( lpBack ) IDirectDrawSurface2_Release( lpBack ); - if( lpTriple ) IDirectDrawSurface2_Release( lpTriple ); - if( lpFront ) IDirectDrawSurface2_Release( lpFront ); - - lpClipper = NULL; - lpFront = NULL; - lpBack = NULL; - lpTriple = NULL; - lpAux = NULL; - - if ( !IsFullScreen ) { /* In a window */ - - GDBG_INFO((80, "_dxAS: Allocating buffers for a windowed mode\n")); - - /* Verify screen pixel format is 16bpp, and set cooperative level */ - ddsd.dwSize = sizeof( ddsd ); - if (IDirectDraw2_GetDisplayMode( lpDD, &ddsd ) != DD_OK) - return ErrorMessage(hWndApp, "Couldn't get display mode!"); - - if (ddsd.ddpfPixelFormat.dwRGBBitCount / 8 != 2) - return ErrorMessage(hWndApp, "Display is not in 16bpp format!"); - - if (IDirectDraw2_SetCooperativeLevel(lpDD,hWndApp, DDSCL_NORMAL ) != DD_OK) - return ErrorMessage(hWndApp, "Couldn't set cooperative level!"); - - /* Allocate Front Buffer Surface */ - ddsd.dwSize = sizeof( ddsd ); - ddsd.dwFlags = DDSD_CAPS; - ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_3DDEVICE; - - if (IDirectDraw2_CreateSurface( lpDD, &ddsd, &lpFront, 0 ) != DD_OK) - return ErrorMessage(hWndApp, "Couldn't allocate primary surface!"); - - GDBG_INFO((80, "_dxAS: Screen: xRes = %d, yRes = %d, stride = %d\n", - xRes, yRes, ddsd.lPitch)); - /* From jdt */ - if (IDirectDraw2_CreateClipper( lpDD, 0, &lpClipper, 0 ) != DD_OK) - return ErrorMessage(hWndApp, "Create Clipper failed!\n"); - - if (IDirectDrawClipper_SetHWnd( lpClipper, 0, hWndApp ) != DD_OK) - return ErrorMessage(hWndApp, "Clipper SethWnd failed!\n"); - - if (IDirectDrawSurface2_SetClipper( lpFront, lpClipper ) != DD_OK) - return ErrorMessage(hWndApp, "Set Clipper failed!\n"); - - /* Always allocate back buffer. - */ - ddsd.dwSize = sizeof( ddsd ); - ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; - ddsd.dwWidth = xRes; - ddsd.dwHeight = yRes; - ddsd.ddsCaps.dwCaps = - DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY | DDSCAPS_3DDEVICE; - - if (IDirectDraw2_CreateSurface( lpDD, &ddsd, &lpBack, 0 ) != DD_OK) - return ErrorMessage(hWndApp, "Couldn't allocate secondary surface!" ); - - GDBG_INFO((80, "_dxAS: Back buffer allocated!\n")); - - /* - * Always allocate Aux Buffer Surface - * XXX - (use nAuxBuffers, and deal with 8bpp for alpha) - */ - ddsd.dwSize = sizeof( ddsd ); - ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; - ddsd.dwWidth = xRes; - ddsd.dwHeight = yRes; - ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY - | DDSCAPS_3DDEVICE; - - if (IDirectDraw2_CreateSurface( lpDD, &ddsd, &lpAux, 0 ) != DD_OK) - return ErrorMessage(hWndApp, "Couldn't allocate aux surface" ); - - GDBG_INFO((80, "_dxAS: Aux Buffer allocated!\n")); - - } else { - - /* Full screen - Set Exclusive Mode, change resolution, */ - GDBG_INFO((80, "_dxAS: Setting Full screen exclusive mode!\n")); - - if (IDirectDraw2_SetCooperativeLevel(lpDD, hWndApp, - DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN ) != DD_OK) - return ErrorMessage(hWndApp, "Couldn't set cooperative level!"); - - if (IDirectDraw2_SetDisplayMode( lpDD, xRes, yRes, 16, 0,0) != DD_OK) - return ErrorMessage(hWndApp, "Couldn't set display mode!"); - - /* Allocate Front/Back Buffer Surfaces, skip triple buffer XXX */ - ddsd.dwSize = sizeof( ddsd ); - ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT; - ddsd.dwBackBufferCount = 1; - ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | - DDSCAPS_FLIP | - DDSCAPS_COMPLEX | - DDSCAPS_VIDEOMEMORY | DDSCAPS_3DDEVICE; - - if (IDirectDraw2_CreateSurface( lpDD, &ddsd, &lpFront, 0 ) != DD_OK) - return ErrorMessage(hWndApp, "Couldn't allocate primary surface!"); - - /* Get back buffer information */ - ddsd.ddsCaps.dwCaps = DDSCAPS_BACKBUFFER; - if (IDirectDrawSurface2_GetAttachedSurface( lpFront, &ddsd.ddsCaps, - &lpBack) != DD_OK) - return ErrorMessage(hWndApp, "Couldn't get back buffer info!\n"); - - GDBG_INFO((80, "_dxAS: Full Screen: front/back buffer allocated!\n")); - - /* Allocate Aux Buffer Surface - XXX */ - ddsd.dwSize = sizeof( ddsd ); - ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; - ddsd.dwWidth = xRes; - ddsd.dwHeight = yRes; - ddsd.ddsCaps.dwCaps = - DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY | DDSCAPS_3DDEVICE; - - if (IDirectDraw2_CreateSurface( lpDD, &ddsd, &lpAux, 0 ) != DD_OK) - return ErrorMessage(hWndApp, "Couldn't allocate aux surface" ); - - GDBG_INFO((80, "_dxAS: Full Screen: aux buffer allocated!\n")); - -/* - * Triple buffer hack: full-screen only for now. Allocate as Aux DD surf, - * after everything else N.B. Allocation order may be important!!! - * god knows how DD would implement dwBackBufferCount == 2 - */ - if (tripleBuffering) { - if (IDirectDraw2_CreateSurface( lpDD, &ddsd, &lpTriple, 0 ) != DD_OK) - return ErrorMessage(hWndApp, "Couldn't allocate triple buffer" ); - - GDBG_INFO((80, "_dxAS: Triple buffer allocated!\n")); - } - } - - /* Convert direct draw surfaces to Glide's idea of buffer descriptors */ - return _dxDDrawToGlideDesc(pDesc); -} /* _dxAllocSurfaces */ - -FxBool -_dxReallocSurfaces(int xRes, int yRes, int vRefresh, InitBufDesc_t *pDesc) - -{ - DDSURFACEDESC ddsd; - const char *errorMessage = "no error"; - - /* for now this is a goddamn baseball bat - it can be trimmed down */ - if ( !IsFullScreen ) { /* this *REALLY* should be called for fullscreen */ - if( lpClipper) IDirectDrawClipper_Release( lpClipper); - if( lpAux ) IDirectDrawSurface2_Release( lpAux ); - if( lpBack ) IDirectDrawSurface2_Release( lpBack ); - if( lpTriple ) IDirectDrawSurface2_Release( lpTriple ); - if( lpFront ) IDirectDrawSurface2_Release( lpFront ); - - lpClipper = NULL; - lpFront = NULL; - lpBack = NULL; - lpTriple = NULL; - lpAux = NULL; - - /* Verify screen pixel format is 16bpp, and set cooperative level */ - ddsd.dwSize = sizeof( ddsd ); - - /* Allocate Front Buffer Surface */ - ddsd.dwSize = sizeof( ddsd ); - ddsd.dwFlags = DDSD_CAPS; - ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_3DDEVICE; - - if (IDirectDraw2_CreateSurface( lpDD, &ddsd, &lpFront, 0 ) != DD_OK) { - errorMessage = "Couldn't allocate primary surface!"; - goto FUBAR; - } - - /* From jdt */ - if (IDirectDraw2_CreateClipper( lpDD, 0, &lpClipper, 0 ) != DD_OK) { - errorMessage = "Create Clipper failed!\n"; - goto FUBAR; - } - - if (IDirectDrawClipper_SetHWnd( lpClipper, 0, hWndApp ) != DD_OK) { - errorMessage = "Clipper SethWnd failed!\n"; - goto FUBAR; - } - - if (IDirectDrawSurface2_SetClipper( lpFront, lpClipper ) != DD_OK) { - errorMessage = "Set Clipper failed!\n"; - goto FUBAR; - } - - /* Always allocate back buffer. - */ - ddsd.dwSize = sizeof( ddsd ); - ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; - ddsd.dwWidth = xRes; - ddsd.dwHeight = yRes; - ddsd.ddsCaps.dwCaps = - DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY | DDSCAPS_3DDEVICE; - - if (IDirectDraw2_CreateSurface( lpDD, &ddsd, &lpBack, 0 ) != DD_OK) { - errorMessage = "Couldn't allocate secondary surface!"; - goto FUBAR; - } - - /* - * Always allocate Aux Buffer Surface - * XXX - (use nAuxBuffers, and deal with 8bpp for alpha) - */ - ddsd.dwSize = sizeof( ddsd ); - ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; - ddsd.dwWidth = xRes; - ddsd.dwHeight = yRes; - ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY - | DDSCAPS_3DDEVICE; - - if (IDirectDraw2_CreateSurface( lpDD, &ddsd, &lpAux, 0 ) != DD_OK) { - errorMessage = "Couldn't allocate aux surface"; - goto FUBAR; - } - } - return _dxDDrawToGlideDesc(pDesc); -FUBAR: - /* if you don't free these you can't make another attempt */ - if( lpClipper) IDirectDrawClipper_Release( lpClipper); - if( lpAux ) IDirectDrawSurface2_Release( lpAux ); - if( lpBack ) IDirectDrawSurface2_Release( lpBack ); - if( lpTriple ) IDirectDrawSurface2_Release( lpTriple ); - if( lpFront ) IDirectDrawSurface2_Release( lpFront ); - lpClipper = NULL; - lpFront = NULL; - lpBack = NULL; - lpTriple = NULL; - lpAux = NULL; - return ErrorMessage( hWndApp, (char*)errorMessage ); -} /* _dxReallocSurfaces */ - -/* - * Restore lost surfaces, or move the window. - * Note: Resizing is done by deleting and re-allocation, and is done in - * _dxAllocSurfaces(); - */ -static FxBool -_dxRestoreSurfaces(InitBufDesc_t *pDesc) -{ - if (lpDD == NULL) return TRUE; - - if (IDirectDrawSurface2_IsLost(lpFront) == DDERR_SURFACELOST) { - if (IDirectDrawSurface2_Restore(lpFront) != DD_OK) - return ErrorMessage(hWndApp, "Front Buffer restore failure\n"); - } - - if (!IsFullScreen) { - if (IDirectDrawSurface2_IsLost(lpBack) == DDERR_SURFACELOST) { - if (IDirectDrawSurface2_Restore(lpBack) != DD_OK) - return ErrorMessage(hWndApp, "Back Buffer restore failure\n"); - } - } - - if (IDirectDrawSurface2_IsLost(lpAux) == DDERR_SURFACELOST) { - if (IDirectDrawSurface2_Restore(lpAux) != DD_OK) - return ErrorMessage(hWndApp, "Aux Buffer restore failure\n"); - } - - if (!IsFullScreen) { - if (IDirectDrawSurface2_IsLost(lpTriple) == DDERR_SURFACELOST) { - if (IDirectDrawSurface2_Restore(lpTriple) != DD_OK) - return ErrorMessage(hWndApp, "Back Buffer restore failure\n"); - } - } - - GDBG_INFO((80, "_dxRS: restore surfaces OK\n")); - return _dxDDrawToGlideDesc(pDesc); -} /* _dxRestoreSurfaces */ - -FxBool -dxOpen( - FxU32 hWindow, - GrScreenResolution_t sRes, - GrScreenRefresh_t vRefresh, - InitColorFormat_t cFormat, - InitOriginLocation_t yOrigin, - int nColBuffers, - int nAuxBuffers, - InitBufDesc_t *pBufDesc, // return values - int *width, - int *height, - InitSwapType_t *swapType -) -{ - int i; - -#ifdef H3D - pageFlip = GR_RESOLUTION_IS_AUTOFLIPPED(sRes); - GDBG_INFO((80, "dxOpen: hWnd = %x, sRes=%d, yOrg=%d, ncb=%d, nab=%d, pageFlip=%d\n", - hWindow, sRes, yOrigin, nColBuffers, nAuxBuffers, pageFlip )); -#else - GDBG_INFO((80, "dxOpen: hWnd = %x, sRes=%d, yOrg=%d, ncb=%d, nab=%d\n", - hWindow, sRes, yOrigin, nColBuffers, nAuxBuffers)); -#endif - - /* - * Get ourselves a valid window handle - */ - hWndApp = (hWindow == 0) ? GetActiveWindow() : (HWND) hWindow; - - if (hWndApp == NULL) { - return ErrorMessage(hWndApp, "VRush needs a valid window handle!\n"); - } - - if (sRes == GR_RESOLUTION_NONE ) { /* In a window */ - RECT rect; - - /* Find out how big the window is */ - GetClientRect(hWndApp, &rect); - IsFullScreen = FXFALSE; - Width = rect.right; - Height = rect.bottom; - } else { - /* Full screen mode - convert resolution to Width, Height */ - static int _w[] = {320,320,400,512,640,640,640,640,800,960,856,512}; - static int _h[] = {200,240,256,384,200,350,400,480,600,720,480,256}; -#ifdef H3D - static int _w1[] = {640,800}; - static int _h1[] = {480,600}; -#endif - -#ifdef H3D - if ((sRes < GR_RESOLUTION_MIN) || - (sRes > GR_RESOLUTION_MAX) && - (!GR_RESOLUTION_IS_AUTOFLIPPED(sRes)) ) -#else - if ((sRes < GR_RESOLUTION_320x200) || - (sRes > GR_RESOLUTION_512x256)) -#endif - return ErrorMessage(hWndApp, "Bad Fullscreen resolution"); - - tripleBuffering = (nColBuffers == 3); - - IsFullScreen = FXTRUE; -#ifdef H3D - if (GR_RESOLUTION_IS_AUTOFLIPPED(sRes)) { - Width = _w1[sRes-GR_RESOLUTION_AUTOFLIPPED_MIN]; - Height = _h1[sRes-GR_RESOLUTION_AUTOFLIPPED_MIN]; - } else { - Width = _w[sRes]; - Height = _h[sRes]; - } -#else - Width = _w[sRes]; - Height = _h[sRes]; -#endif - } - - GDBG_INFO((80, "dxOpen: W=%d, H=%d, FullScr=%d, vRefresh=%d\n", - Width, Height, IsFullScreen, vRefresh)); - -#ifdef H3D - if (!_dxAllocSurfaces(Width, Height, vRefresh, BufDesc, pageFlip)) - return ErrorMessage(hWndApp, "failed dxOpen"); -#else - if (!_dxAllocSurfaces(Width, Height, vRefresh, BufDesc)) - return ErrorMessage(hWndApp, "failed dxOpen"); -#endif - - - GDBG_INFO((80, "_dxAllocSurfaces OK!!!\n")); - - for (i=0; i< NUM_BUFS; i++) { - pBufDesc[i] = BufDesc[i]; - GDBG_INFO((80, "dxOpen: pBufDesc[%d]: \n", i)); - GDBG_INFO((80, "\tbufMagic = 0x%x\n", pBufDesc[i].bufMagic)); - GDBG_INFO((80, "\tbufType = 0x%x\n", pBufDesc[i].bufType)); - GDBG_INFO((80, "\tbufOffset = 0x%x\n", pBufDesc[i].bufOffset)); - GDBG_INFO((80, "\tbufStride = 0x%x\n", pBufDesc[i].bufStride)); - GDBG_INFO((80, "\tbufBPP = 0x%x\n", pBufDesc[i].bufBPP)); - } - - *width = Width; - *height = Height; - *swapType = (IsFullScreen) ? INIT_SWAP_FLIP : INIT_SWAP_BLT; - - if ( curHALData->initSetVideo ) { - curHALData->initSetVideo( sRes, vRefresh, - (FxU32*)width, (FxU32*)height ); - } - - GDBG_INFO((80, "dxOpen: Returning TRUE\n")); - - return FXTRUE; - -} /* dxOpen */ - -FxBool -dxControl(FxU32 code, InitBufDesc_t *pBufDesc, int *width, int *height) -{ - RECT rect; - int i; - - GDBG_INFO((80, "dxControl: code = %d\n", code)); - - /* dx is not initizized */ - if ( lpDD== NULL ) { - return TRUE; - } - - /* Why was I called? */ - switch(code) { - case INIT_CONTROL_RESIZE: /* recreate surfaces */ - GetClientRect(hWndApp, &rect); - if ((Width != (FxU32) rect.right) || (Height != (FxU32) rect.bottom)) { - Width = rect.right; - Height = rect.bottom; - GDBG_INFO((120, "W and H changed to %d %d\n", - Width, Height)); - - if (!_dxReallocSurfaces(Width, Height, 0, BufDesc)) { - /* - Let's find some other way to do this! - ErrorMessage(hWndApp, "dxControl: Resize failed\n"); */ - return FXFALSE; - } - } - break; - - case INIT_CONTROL_MOVE: - break; - - case INIT_CONTROL_ACTIVATE: - GDBG_INFO((120, "dxControl: Activate\n")); - break; - - case INIT_CONTROL_DEACTIVATE: - GDBG_INFO((120, "dxControl: DeActivate\n")); - break; - - default: - GDBG_INFO((120, "dxControl: Strange control %d\n", code)); - return FXFALSE; - break; - } - for (i=0; i<5; i++) pBufDesc[i] = BufDesc[i]; - *width = Width; - *height = Height; - GDBG_INFO((80, "dxControl: code = %d, w = %d, h = %d\n", code, - Width, Height)); - - return FXTRUE; -} /* dxControl */ - -FxBool -dxClose() -{ - GDBG_INFO((80, "dxClose:\n")); -/* - * fixme! nulling out this code fixes bug 541... why is unclear??? XXX - * A little more information... the problem is releasing lpDD1, and - * only in fullscreen mode. Temporary refined hack is to not release - * lpDD1 in fullscreen mode. Also rearrange code in dxAllocSurfaces - * to only create lpDD1 once per application execution. /PGJ - */ -#if 1 - // Release any allocated buffers - if( lpClipper) IDirectDrawSurface2_Release( lpClipper); - if( lpFront ) IDirectDrawSurface2_Release( lpFront ); - if(!IsFullScreen) { - if( lpBack ) IDirectDrawSurface2_Release( lpBack ); - } - if( lpAux ) IDirectDrawSurface2_Release( lpAux ); - if( lpDD ) IDirectDraw2_Release( lpDD ); - if (1 /* !IsFullScreen */) { - if( lpDD1 ) IDirectDraw_Release( lpDD1 ); - lpDD1 = NULL; - } - - lpClipper = NULL; - lpFront = NULL; - lpBack = NULL; - lpTriple = NULL; - lpAux = NULL; - lpDD = NULL; - -#endif /* 0 */ - GDBG_INFO((80, "dxClose: Returning TRUE\n")); - return FXTRUE; -} /* dxClose */ - -void -dxSwap(FxU32 code) -{ - static RECT dest, src; - static POINT point; - static HRESULT hr; - - GDBG_INFO((80, "dxSwap:\n")); - if ( !IsFullScreen ) { - GDBG_INFO((120, "Swap: using BLTs\n")); - - src.left = 0; - src.right = Width-1; - src.top = 0; - src.bottom = Height-1; - - dest = src; - point.x = 0; - point.y = 0; - ClientToScreen( hWndApp, &point ); - dest.left += point.x; - dest.right += point.x; - dest.top += point.y; - dest.bottom += point.y; - - hr = IDirectDrawSurface_Blt( lpFront, - &dest, - lpBack, - &src, - DDBLT_WAIT, - NULL ); - - while( IDirectDrawSurface_GetBltStatus( lpFront, DDGBS_ISBLTDONE ) != - DD_OK ); - - if ( hr != DD_OK ) { - ErrorMessage(hWndApp, "Couldn't blit!\n"); - } - } - return; - -} /* dxSwap */ -#else /* it's either DOS or the Hoopti Lab Setup */ -FxBool -dxOpen( - FxU32 hWindow, - GrScreenResolution_t sRes, - GrScreenRefresh_t vRefresh, - InitColorFormat_t cFormat, - InitOriginLocation_t yOrigin, - int nColBuffers, - int nAuxBuffers, - InitBufDesc_t *pBufDesc, // return values - int *width, - int *height, - InitSwapType_t *swapType -) -{ -#define FN_NAME "dxOpen" - InitBufDesc_t *dFront = &pBufDesc[0]; - InitBufDesc_t *dBack = &pBufDesc[1]; - InitBufDesc_t *dAux = &pBufDesc[2]; - InitBufDesc_t *dFifo = &pBufDesc[3]; - InitBufDesc_t *dScreen = &pBufDesc[4]; - InitBufDesc_t *dTriple = &pBufDesc[5]; - FxBool rv = FXTRUE; - FxU32 endAddr; - - /* !!! FIXME - this is a hack to get murali's bufferdesc into the code - * this whole file needs to be subsumed into init96.c. - * Still a hack, but I put some rouge on it /PGJ - */ - - GDBG_INFO((80, "%s: Resolution == 0x%x\n", FN_NAME, sRes)); - - switch (sRes) { - case GR_RESOLUTION_640x480: - *width = 640; - *height = 480; - break; - case GR_RESOLUTION_800x600: - *width = 800; - *height = 600; - break; - case GR_RESOLUTION_320x200: - *width = 320; - *height = 200; - break; - case GR_RESOLUTION_320x240: - *width = 320; - *height = 240; - break; - case GR_RESOLUTION_512x384: - *width = 512; - *height = 384; - break; - case GR_RESOLUTION_400x256: - case GR_RESOLUTION_640x200: - case GR_RESOLUTION_640x350: - case GR_RESOLUTION_640x400: - case GR_RESOLUTION_960x720: - case GR_RESOLUTION_856x480: - case GR_RESOLUTION_512x256: - case GR_RESOLUTION_NONE: - default: - GDBG_INFO((80, "%s: Unimplemented resolution\n", FN_NAME)); - break; - } - - -#define WAITLOOP {\ - volatile int waitfoo;\ - int waitcount;\ - for (waitcount = 0; waitcount < 500000; waitcount++){waitfoo = waitcount;}\ -} - -/* AT3D buffers need to be 4K (Intel) page-aligned */ -#define BUMP(x, y) (((x) + ((y)-1)) & ~((y)-1)) -#define BUMP_PAGE(x) (BUMP(x, 1<<12)) - - if ( curHALData->initSetVideo ) { - rv = curHALData->initSetVideo( sRes, vRefresh, - (FxU32*)width, (FxU32*)height ); - if ( !rv ) goto BAIL; - } - - /* Initialize all descriptors. */ - dFront->bufMagic = VG96_BUF_MAGIC; - dFront->bufType = INIT_BUFFER_FRONTBUFFER; - dFront->bufOffset = 0; - dFront->bufStride = (*width)*2; - dFront->bufBPP = 16; - endAddr = BUMP_PAGE((*width)*(*height)*2); - - dBack->bufMagic = VG96_BUF_MAGIC; - dBack->bufType = INIT_BUFFER_BACKBUFFER; - dBack->bufOffset = endAddr; - dBack->bufStride = (*width)*2; - dBack->bufBPP = 16; - endAddr = BUMP_PAGE(endAddr + (*width)*(*height)*2); - - tripleBuffering = (nColBuffers == 3); - if (tripleBuffering) { - dTriple->bufMagic = VG96_BUF_MAGIC; - dTriple->bufType = INIT_BUFFER_TRIPLEBUFFER; - dTriple->bufOffset = endAddr; - dTriple->bufStride = (*width)*2; - dTriple->bufBPP = 16; - endAddr = BUMP_PAGE(endAddr + (*width)*(*height)*2); - } - - dAux->bufMagic = VG96_BUF_MAGIC; - dAux->bufType = INIT_BUFFER_AUXBUFFER; - dAux->bufOffset = endAddr; - dAux->bufStride = (*width)*2; - dAux->bufBPP = 16; - endAddr = BUMP_PAGE(endAddr + (*width)*(*height)*2); - - dFifo->bufMagic = VG96_BUF_MAGIC; - dFifo->bufType = INIT_BUFFER_FIFOBUFFER; - dFifo->bufOffset = endAddr; - dFifo->bufStride = 65536; - dFifo->bufBPP = 16; - - dScreen->bufMagic = VG96_BUF_MAGIC; - dScreen->bufType = INIT_BUFFER_SCREENBUFFER; - dScreen->bufOffset = 0; - dScreen->bufStride = 0; - dScreen->bufBPP = 0; - - GDBG_INFO((80, "%s: dFront = 0x%x, dBack = 0x%x, dAux = 0x%x\n", - FN_NAME, dFront, dBack, dAux, dFifo)); - GDBG_INFO((80, "dxOpen: F:%.06x %5d B:%.06x %5d A:%.06x %5d, C:%.06x %5d\n", - dFront->bufOffset, dFront->bufStride, - dBack ->bufOffset, dBack ->bufStride, - dAux ->bufOffset, dAux ->bufStride, - dFifo ->bufOffset, dFifo ->bufStride)); - -#ifdef GDBG_INFO_ON - { - int i; - - for (i = 0; i < 5; i++) { - GDBG_INFO((80, "%s: pBufDesc[%d] = 0x%x:\n", - FN_NAME, i, &pBufDesc[i])); - GDBG_INFO((80, "%s: pBufDesc.bufType = %s\n", - FN_NAME, bufTypeNames[pBufDesc[i].bufType])); - GDBG_INFO((80, "%s: pBufDesc.bufOffset = 0x%x\n", - FN_NAME, pBufDesc[i].bufOffset )); - GDBG_INFO((80, "%s: pBufDesc.bufStride = 0x%x\n", - FN_NAME, pBufDesc[i].bufStride)); - GDBG_INFO((80, "%s: pBufDesc.bufBPP = 0x%x\n", - FN_NAME, pBufDesc[i].bufBPP)); - } - } -#endif - - *swapType = INIT_SWAP_FLIP; - -BAIL: - return rv; -#undef FN_NAME -} /* dxOpen */ - -FxBool -dxControl(FxU32 code, InitBufDesc_t *pBufDesc, int *width, int *height) -{ - return FXTRUE; -} /* dxControl */ -FxBool -dxClose() -{ -#define FN_NAME "dxClose" - GDBG_INFO((80, "%s: Setting up VESA mode 640*480*\n", FN_NAME)); -#ifdef __DOS32__ - { - union REGS r; - - memset(&r, 0, sizeof(r)); - - r.w.ax = 0x4f02; - r.w.bx = 0x3; - int386( 0x10, &r, &r ); - } -#endif - return FXTRUE; -#undef FN_NAME -} /* dxClose */ - -void -dxSwap(FxU32 code) -{ -} /* dxSwap */ -#endif /* __DOS32__ || (defined(__WIN32__) && !defined(INIT_ACCESS_DDRAW) */ - - diff --git a/glide2x/sst1/init/init96/fxinit96.h b/glide2x/sst1/init/init96/fxinit96.h deleted file mode 100644 index 60da89a..0000000 --- a/glide2x/sst1/init/init96/fxinit96.h +++ /dev/null @@ -1,136 +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$ -** -*/ - - -#ifndef _FXINIT96_H_ -#define _FXINIT96_H_ - -#include <3dfx.h> -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef __linux__ -FxBool dxOpen( - FxU32 hWindow, - GrScreenResolution_t sRes, - GrScreenRefresh_t vRefresh, - InitColorFormat_t cFormat, - InitOriginLocation_t yOrigin, - int nCol, - int nAux, - InitBufDesc_t *pBufDesc, - int *width, - int *height, - InitSwapType_t *swapType -); -FxBool dxControl(FxU32 control, InitBufDesc_t *pDesc, int *w, int *h); -FxBool dxClose(); -void dxSwap(FxU32 code); - -#else - -FxBool linOpen( - FxU32 hWindow, - GrScreenResolution_t sRes, - GrScreenRefresh_t vRefresh, - InitColorFormat_t cFormat, - InitOriginLocation_t yOrigin, - int nCol, - int nAux, - InitBufDesc_t *pBufDesc, - int *width, - int *height, - InitSwapType_t *swapType -); -FxBool linControl(FxU32 control, InitBufDesc_t *pDesc, int *w, int *h); -FxBool linClose(); -void linSwap(FxU32 code); -void linFlip(FxU32 buffer); - -#endif - -typedef struct { - FxU32 memSize; - FxBool (FX_CSTYLE *initAperture) (InitRegisterDesc *rd); - FxBool (FX_CSTYLE *initSetVideo)( GrScreenResolution_t res, GrScreenRefresh_t refresh, FxU32 *xr, FxU32 *yr ); - FxBool (FX_CSTYLE *initEnableRegs)(InitRegisterDesc*rd); - FxBool (FX_CSTYLE *initDisableRegs)(InitRegisterDesc*rd); - FxBool (FX_CSTYLE *wrapFIFO) (InitRegisterDesc *rd, InitFIFOData *fifoData ); -#ifdef H3D - int (FX_CSTYLE *initUseTiles) (InitRegisterDesc *rd, FxU32 *buffers, FxU32 nBuffers, FxU32 stride, FxU32 Width, FxU32 Height, FxU32 AutoFlipped); -#else - int (FX_CSTYLE *initUseTiles) (InitRegisterDesc *rd, FxU32 *buffers, FxU32 nBuffers, FxU32 stride, FxU32 Width, FxU32 Height); -#endif - FxBool (FX_CSTYLE *initGetInfo)(VG96Info *info); - FxBool (FX_CSTYLE *initSwapTiles) (InitRegisterDesc *rd); - void *devPriv; /* Just in case */ -} Init96HALData; - -extern Init96HALData *curHALData; - -extern char *iRegNames[]; - -extern volatile FxU32 *sstHW; -extern volatile Sstregs *sstPtr; - -/*----------------- SST96 access macros----------------------*/ - -/* NOTE: - - This code is HIGHLY important to debugging. Delete it at your - extreme peril. - */ -#define GETINDEX(a) ((((FxU32) &a) - (((FxU32) sstHW) + 0x400000)) >> 2) -/* This is the ONE TRUE WAY to read FBI Jr. registers. Don't mess - with it!!! */ -#define GETREADADDR(s) ((FxU32 *) (((FxU32) sstHW) + 0x400000 + (GETINDEX(s) << 12))) -#define GETINDEXFROMADDR(a) ((((FxU32) a) - (((FxU32) sstHW + 0x400000))) >> 2) -#define GETREADADDR2(s) ((FxU32 *) (((FxU32) sstHW) + 0x400000 + (GETINDEXFROMADDR(s) << 12))) - -#undef SET -#undef GET -#undef SETF -#undef GETF - -#ifdef GDBG_INFO_ON -#define SET(d,s)\ -GDBG_INFO((80, "SET: Register: %s (0x%x) = 0x%x\n",\ - iRegNames[GETINDEX(d)], GETINDEX(d), s));\ -(d) = (s); -#define GET(s) get96(&s) - -#else -#define SET(d,s) (d) = (s) -#define GET(s) *(GETREADADDR(s)) -#endif - - -#ifdef __cplusplus -} -#endif -#endif diff --git a/glide2x/sst1/init/init96/init96.c b/glide2x/sst1/init/init96/init96.c deleted file mode 100644 index 7024d40..0000000 --- a/glide2x/sst1/init/init96/init96.c +++ /dev/null @@ -1,2241 +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$ - ** - */ -static char revString[] = "@#%$Workfile: INIT96.C $ $Revision$"; - -/* ANSI Headers */ -#include -#include -#include - -#if defined(__DOS32__) || defined(INIT96VGASWAP) -#include -#endif - -#ifdef __DOS32__ -#include -#endif - -#ifdef __WIN32__ -#include -#endif - -#ifdef INIT96VGASWAP -#include "initvga.h" -#endif - -#if defined(__WATCOMC__) -#define _inp inp -#define _outp outp -#endif - -/* 3Dfx Headers */ -#include <3dfx.h> -#include -#include -#include -#define FX_DLL_DEFINITION -#include - -#include - -/* Local Headers */ -#include "init96.h" -#include "fxinit96.h" - -#include "initat3d.h" -#if 0 -#include "init9685.h" -#include "initmrti.h" -#endif -#include "initmcrx.h" - -#ifdef GDBG_INFO_ON -static char *bufTypeNames[] = { - "INIT_BUFFER_FRONTBUFFER", - "INIT_BUFFER_BACKBUFFER", - "INIT_BUFFER_AUXBUFFER", - "INIT_BUFFER_DEPTHBUFFER", - "INIT_BUFFER_ALPHABUFFER", - "INIT_BUFFER_TRIPLEBUFFER", - "INIT_BUFFER_FIFOBUFFER", - "INIT_BUFFER_SCREENBUFFER", - "INIT_BUFFER_TEXTUREBUFFER" -}; -#endif - - -/*==================== Local Constants ====================*/ -#define NUM_BUFS 6 - -#define SST96_MEMMAP_TEXTURE_MEMORY_OFFSET (0x6 << 20) /* +5 MB */ - -#define SST96_COMMAND_REGS(X) ( ((char*)(X))+(4<<20) ) - -#define MAXTRIES 10000 - -#define FIFOLAG 128 - -/*------------------------------------------------------------------- - Module Data - -------------------------------------------------------------------*/ -volatile FxU32 *sstHW; -volatile Sstregs *sstPtr; - -typedef struct _BufInfo { - /* DISPLAY Stuff */ - FxI32 dfb; /* Was fbN */ - FxI32 dfbBase; /* Base of Buffers */ - FxI32 dfbTop; /* Tops of Buffers */ - FxI32 dfbStride; /* Strides */ - /* RENDER stuff */ - FxI32 rfb; /* was rfbN */ -} BufInfo, *BufInfoPtr; - - -#define RFB 0 -#define DFB 1 - - -extern FxBool tripleBuffering; - -#define ADVANCE_BUFFERS(kind)\ -{\ - kind##FrontIdx = (kind##FrontIdx < maxBufIdx) ? kind##FrontIdx + 1 : 0;\ - kind##BackIdx = (kind##BackIdx < maxBufIdx) ? kind##BackIdx + 1 : 0;\ - kind##RenderIdx = (kind##RenderIdx < maxBufIdx) ? kind##RenderIdx + 1 : 0;\ -} - -#define rfbTripleIdx ((rfbBackIdx + 1) % maxBuffer) -#define MAX_BUF 3 - -BufInfo bI[MAX_BUF]; - -static FxI32 - maxBuffer = 2, - maxBufIdx, - /* DISPLAY Stuff */ - /* The following two are indices into the above */ - dfbFrontIdx = 0, - dfbBackIdx = 1, - dfbRenderIdx = 1, - /* RENDER stuff */ - rfbFrontIdx = 0, - rfbBackIdx = 1, - rfbRenderIdx = 1; - -static FxI32 -ab0, ab0Top, ab0Base, ab0Stride; - -static InitOriginLocation_t cachedYOrigin; -static InitSwapType_t cachedSwapType; - -static FxU32 fifoStart, fifoEnd; -volatile FxU32 *fifovirt; /* start virtual address */ -volatile FxU32 fifophys; /* start physical address */ -volatile FxU32 fifomax; /* in bytes */ -volatile FxU32 fifocur; /* how much used up so far */ -volatile FxU32 *fifoptr; /* current pointer */ -volatile FxU32 fifosize; /* how much of 4kbytes used up */ -volatile FxU32 fifolfb; /* use LFB, use hostblt if 0. */ - -#if SST96_ALT_FIFO_WRAP && GDBG_INFO_ON -/* Statistics about how many times we wrapped/waited for - * the fifo. - */ -static FxU32 numWraps; -static FxU32 numJuJuStalls; -static FxU32 numStalls; -#endif /* GDBG_INFO_ON && SST96_ALT_FIFO_WRAP */ - -Init96HALData *curHALData; - -static FxU16 -oldVidMode; - -static FxU32 -devNum, -physAddr, -fifoMTRRNum = 0xffffffff; - -/*-----------Debuging Info Data------------------------------*/ -#ifdef GDBG_INFO_ON -/* NOTE: - - This array is HIGHLY important to debugging. Delete it at your - extreme peril. - */ -char *iRegNames[] = { - "status", /* 0x00 */ - "reserved001", /* 0x01 */ - "vAx", /* 0x02 */ - "vAy", /* 0x03 */ - "vBx", /* 0x04 */ - "vBy", /* 0x05 */ - "vCx", /* 0x06 */ - "vCy", /* 0x07 */ - "r", /* 0x08 */ - "drdx", /* 0x09 */ - "drdy", /* 0x0a */ - "g", /* 0x0b */ - "dgdx", /* 0x0c */ - "dgdy", /* 0x0d */ - "b", /* 0x0e */ - "dbdx", /* 0x0f */ - "dbdy", /* 0x10 */ - "z", /* 0x11 */ - "dzdx", /* 0x12 */ - "dzdy", /* 0x13 */ - "a", /* 0x14 */ - "dadx", /* 0x15 */ - "dady", /* 0x16 */ - "s", /* 0x17 */ - "dsdx", /* 0x18 */ - "dsdy", /* 0x19 */ - "t", /* 0x1a */ - "dtdx", /* 0x1b */ - "dtdy", /* 0x1c */ - "w", /* 0x1d */ - "dwdx", /* 0x1e */ - "dwdy", /* 0x1f */ - "triangleCMD", /* 0x20 */ - "reserved021", /* 0x21 */ - "FvAx", /* 0x22 */ - "FvAy", /* 0x23 */ - "FvBx", /* 0x24 */ - "FvBy", /* 0x25 */ - "FvCx", /* 0x26 */ - "FvCy", /* 0x27 */ - "Fr", /* 0x28 */ - "Fdrdx", /* 0x29 */ - "Fdrdy", /* 0x2a */ - "Fg", /* 0x2b */ - "Fdgdx", /* 0x2c */ - "Fdgdy", /* 0x2d */ - "Fb", /* 0x2e */ - "Fdbdx", /* 0x2f */ - "Fdbdy", /* 0x30 */ - "Fz", /* 0x31 */ - "Fdzdx", /* 0x32 */ - "Fdzdy", /* 0x33 */ - "Fa", /* 0x34 */ - "Fdadx", /* 0x35 */ - "Fdady", /* 0x36 */ - "Fs", /* 0x37 */ - "Fdsdx", /* 0x38 */ - "Fdsdy", /* 0x39 */ - "Ft", /* 0x3a */ - "Fdtdx", /* 0x3b */ - "Fdtdy", /* 0x3c */ - "Fw", /* 0x3d */ - "Fdwdx", /* 0x3e */ - "Fdwdy", /* 0x3f */ - "FtriangleCMD", /* 0x40 */ - "reserved041", /* 0x41 */ - "nopCMD", /* 0x42 */ - "reserved043", /* 0x43 */ - "fastfillCMD", /* 0x44 */ - "reserved045", /* 0x45 */ - "swapbufferCMD", /* 0x46 */ - "reserved047", /* 0x47 */ - "swappendCMD", /* 0x48 */ - "reserved049", /* 0x49 */ - "reserved04A", /* 0x4a */ - "reserved04B", /* 0x4b */ - "reserved04C", /* 0x4c */ - "reserved04D", /* 0x4d */ - "reserved04E", /* 0x4e */ - "reserved04F", /* 0x4f */ - "fbzColorPath", /* 0x50 */ - "fogMode", /* 0x51 */ - "alphaMode", /* 0x52 */ - "reserved053", /* 0x53 */ - "fbzMode", /* 0x54 */ - "stipple", /* 0x55 */ - "color0", /* 0x56 */ - "color1", /* 0x57 */ - "fogColor", /* 0x58 */ - "zaColor", /* 0x59 */ - "chromaKey", /* 0x5a */ - "chromaRange", /* 0x5b */ - "reserved05C", /* 0x5c */ - "reserved05D", /* 0x5d */ - "reserved05E", /* 0x5e */ - "reserved05F", /* 0x5f */ - "colBufferSetup", /* 0x60 */ - "auxBufferSetup", /* 0x61 */ - "clipLeftRight0", /* 0x62 */ - "clipTopBottom0", /* 0x63 */ - "clipLeftRight1", /* 0x64 */ - "clipTopBottom1", /* 0x65 */ - "reserved066", /* 0x66 */ - "reserved067", /* 0x67 */ - "reserved068", /* 0x68 */ - "reserved069", /* 0x69 */ - "reserved06A", /* 0x6a */ - "reserved06B", /* 0x6b */ - "reserved06C", /* 0x6c */ - "reserved06D", /* 0x6d */ - "reserved06E", /* 0x6e */ - "reserved06F", /* 0x6f */ - "fogTable0001", /* 0x70 */ - "fogTable0203", /* 0x71 */ - "fogTable0405", /* 0x72 */ - "fogTable0607", /* 0x73 */ - "fogTable0809", /* 0x74 */ - "fogTable0A0B", /* 0x75 */ - "fogTable0C0D", /* 0x76 */ - "fogTable0E0F", /* 0x77 */ - "fogTable1011", /* 0x78 */ - "fogTable1213", /* 0x79 */ - "fogTable1415", /* 0x7a */ - "fogTable1617", /* 0x7b */ - "fogTable1819", /* 0x7c */ - "fogTable1A1B", /* 0x7d */ - "fogTable1C1D", /* 0x7e */ - "fogTable1E1F", /* 0x7f */ - "fogTable2021", /* 0x80 */ - "fogTable2223", /* 0x81 */ - "fogTable2425", /* 0x82 */ - "fogTable2627", /* 0x83 */ - "fogTable2829", /* 0x84 */ - "fogTable2A2B", /* 0x85 */ - "fogTable2C2D", /* 0x86 */ - "fogTable2E2F", /* 0x87 */ - "fogTable3031", /* 0x88 */ - "fogTable3233", /* 0x89 */ - "fogTable3435", /* 0x8a */ - "fogTable3637", /* 0x8b */ - "fogTable3839", /* 0x8c */ - "fogTable3A3B", /* 0x8d */ - "fogTable3C3D", /* 0x8e */ - "fogTable3E3F", /* 0x8f */ - "fbijrInit0", /* 0x90 */ - "fbijrInit1", /* 0x91 */ - "fbijrInit2", /* 0x92 */ - "fbijrInit3", /* 0x93 */ - "fbijrInit4", /* 0x94 */ - "fbijrInit5", /* 0x95 */ - "reserved096", /* 0x96 */ - "reserved097", /* 0x97 */ - "reserved098", /* 0x98 */ - "reserved099", /* 0x99 */ - "reserved09A", /* 0x9a */ - "reserved09B", /* 0x9b */ - "reserved09C", /* 0x9c */ - "reserved09D", /* 0x9d */ - "reserved09E", /* 0x9e */ - "reserved09F", /* 0x9f */ - "fbijrVersion", /* 0xa0 */ - "fbiPixelsIn", /* 0xa1 */ - "fbiChromaFail", /* 0xa2 */ - "fbiZfuncFail", /* 0xa3 */ - "fbiAfuncFail", /* 0xa4 */ - "fbiPixelsOut", /* 0xa5 */ - "reserved0A6", /* 0xa6 */ - "reserved0A7", /* 0xa7 */ - "reserved0A8", /* 0xa8 */ - "reserved0A9", /* 0xa9 */ - "reserved0AA", /* 0xaa */ - "reserved0AB", /* 0xab */ - "reserved0AC", /* 0xac */ - "reserved0AD", /* 0xad */ - "reserved0AE", /* 0xae */ - "reserved0AF", /* 0xaf */ - "reserved0B0", /* 0xb0 */ - "reserved0B1", /* 0xb1 */ - "reserved0B2", /* 0xb2 */ - "reserved0B3", /* 0xb3 */ - "reserved0B4", /* 0xb4 */ - "reserved0B5", /* 0xb5 */ - "reserved0B6", /* 0xb6 */ - "reserved0B7", /* 0xb7 */ - "reserved0B8", /* 0xb8 */ - "reserved0B9", /* 0xb9 */ - "reserved0BA", /* 0xba */ - "reserved0BB", /* 0xbb */ - "reserved0BC", /* 0xbc */ - "reserved0BD", /* 0xbd */ - "reserved0BE", /* 0xbe */ - "texChipSel", /* 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 */ -}; -#endif - -#define VG96STRIDE(stride) (((stride >> 3) & 0x1ff )<< 22) - -#ifdef GDBG_INFO_ON -FxU32 -get96(FxU32 *addr) -{ - FxU32 - index, - ret; - char *regName; - - ret = *GETREADADDR2(addr); - - index = GETINDEXFROMADDR(addr); - - regName = iRegNames[index]; - - GDBG_INFO((120, "GET: Register: %s (0x%x) Address: 0x%x Value: 0x%x\n", - regName, GETINDEXFROMADDR(addr), addr, ret)); - - return ret; -} /* get96 */ -#endif - -/* structure offset */ -#define SETO(base,offset,value) (*(((FxU32 *)(base))+((offset) >> 2)) = (value)) -#define GETO(base,offset) (*(((FxU32 *)(base))+((offset) << 8))) - -/* register indices */ -#define SETI(base,index,value) (*(((FxU32 *)(base))+(index)) = (value)) -#define GETI(base,index) (*(((FxU32 *)(base))+((index) << 10))) - -/* structure field names */ -#define SETF(base2,field,value) (((Sstregs*)(base2))->field = (value)) -#define GETF(base,field) (GETO(base,offsetof(Sstregs,field))) - - -#define GETREGVALFROMENV(val, envStr, constant)\ -{\ - const char *envVal;\ - val = constant;\ - if ((envVal = myGetenv(envStr)) != NULL) {\ - sscanf(envVal, "%x", &val);\ - GDBG_INFO((80,\ - "%s: The environment variable %s == 0x%x overloaded a register value\n", \ - FN_NAME, envStr, val));\ - }\ -} - -static FxBool -init96LoadBufRegs(int nBuffers, - InitBufDesc_t *pBufDesc, - int xRes, int yRes, - InitRegisterDesc *rd); - -#define XY_ONE (1<vA.x, x); - SET(sstPtr->vA.y, y); - SET(sstPtr->vB.x, x+XY_ONE*tSize); - SET(sstPtr->vB.y, y); - SET(sstPtr->vC.x, x); - SET(sstPtr->vC.y, y+XY_ONE*tSize/2); - - SET(sstPtr->s, 0); - SET(sstPtr->t, 0); - SET(sstPtr->w, 1); - SET(sstPtr->dsdx, 255); - SET(sstPtr->dtdx, 0); - SET(sstPtr->dwdx, 0); - SET(sstPtr->dsdy, 255); - SET(sstPtr->dtdy, 0); - SET(sstPtr->dwdy, 0); - SET(sstPtr->triangleCMD, 1); -} - -#define SENSE0 0xbaaf -#define SENSE1 0xabcd - -#define VG96_TEXTURE_OFFSET 0x600000 -#define SST96_TEX_PTR(a) \ - ((FxU32 *) (((FxU32) a) + VG96_TEXTURE_OFFSET)) - -static FxBool sense(FxU32 *sstbase, VG96Info *info, FxU32 tmu, - FxU32 mem, FxU32 init) -{ - volatile Sstregs *sst = (Sstregs *) sstbase; - FxU32 *texAddr = (FxU32 *)SST96_TEX_PTR(sstbase); - FxBool same = FXFALSE; - FxU16 fmem, orgmem; - - - /* set the Init0 register to enable ? MBytes of memory */ -#define WAITLOOP {\ -int nWaits;\ - FxU32 waitRes;\ - for (nWaits = 0; nWaits < 50000; nWaits++) {\ - waitRes = sstHW[0x100000];\ - if (waitRes & 0x80000000) break;\ - }\ -} - - orgmem = *(FxU16 *)sstbase; - - WAITLOOP; - - /* base address for lod0 */ - mem = mem - ((FXBIT(14) + FXBIT(12) + FXBIT(10) + FXBIT(8) + FXBIT(6) + FXBIT(4) + FXBIT(2) + 1)*8); /* 8X */ - - SET(sstPtr->texBaseAddr, mem>>3); - - *(texAddr + (8 << 15)) = init; - /* - write to 2 consequtive locations in lod0 to alter the data - on the memory signals - */ - WAITLOOP; - *(texAddr + (0)) = 0xffffffff; - WAITLOOP; - *(texAddr + (1)) = 0xffffffff; - - WAITLOOP; - - drawTriangle(sst,0,0,2); /* draw a 4x4 right triangle */ - WAITLOOP; - - fmem = *(FxU16 *)sstbase; - - WAITLOOP; - - if (fmem == init) - same = FXTRUE; - - *(FxU16 *)sstbase = orgmem; - - return same; -} - -FX_EXPORT FxBool FX_CSTYLE -Init96GetTmuMemory(FxU32 *sstbase, VG96Info *info, FxU32 tmu, - FxU32 *TmuMemorySize) -{ - FxU32 data; - - if(myGetenv(("SST96_TMUMEM_SIZE"))) { - *TmuMemorySize = atoi(myGetenv(("SST96_TMUMEM_SIZE"))); - return(FXTRUE); - } - SET(sstPtr->trexInit0, 0x05441); - - SET(sstPtr->colBufferSetup, 0x28000000); /* color buffer */ - SET(sstPtr->fbzMode, SST_RGBWRMASK); - SET(sstPtr->fbzColorPath, SST_RGBSEL_TREXOUT | SST_CC_PASS | SST_ENTEXTUREMAP); - SET(sstPtr->textureMode, SST_RGB565 | SST_TC_REPLACE | SST_TCA_REPLACE); - /* set lod8 */ - SET(sstPtr->tLOD, ((8 << 2) | (8 << 7))); - - /* - first see if we have 4 Mbytes by writing a texel at 2MB followed by - a texel at 1MB and 0MB and then rendering using the texel at 2MB - if we have less memory it should not render correctly since we trash - the memory locations it would wrap to - */ - - data = sense(sstbase,info,tmu,0x200000, SENSE0); - if (data) { - data = sense(sstbase,info,tmu,0x200000, SENSE1); - if (data) { - *TmuMemorySize = 4; - return(FXTRUE); - } - } - - data = sense(sstbase,info,tmu,0x100000, SENSE0); - if (data) { - data = sense(sstbase,info,tmu,0x100000, SENSE1); - if (data) { - *TmuMemorySize = 2; - return(FXTRUE); - } - } - - data = sense(sstbase,info,tmu,0x000000, SENSE0); - if (data) { - data = sense(sstbase,info,tmu,0x000000, SENSE1); - if (data) { - *TmuMemorySize = 1; - return(FXTRUE); - } - } - -#undef WAITLOOP - - return(FXFALSE); -} - -/*--------------------------------------------------------------------------- - NOTES: - assumes that board and registers are initialized - destroys part of the framebuffer - ---------------------------------------------------------------------------*/ -FX_EXPORT FxBool FX_CSTYLE -sst96InitGetTmuInfo(FxU32 *sstbase, VG96Info *info) -{ - sstPtr = - (volatile Sstregs *)(SST96_COMMAND_REGS(sstbase)); - - if(Init96GetTmuMemory(sstbase, info, 0, &info->tfxRam) == FXFALSE) - return(FXFALSE); - return(FXTRUE); -} - -/*------------------------------------------------------------------- - Function: init96MapBoard - Date: 10/17 - Implementor(s): jdt, dow - Library: init96 - Description: - Looks for an SST-96 enabled VGA board on the system and maps that - boards physical address into linear memory. - Arguments: - rd: Register descriptions - vID: Vendor ID - dID: Device ID - Return: - linear pointer to base of VGA board. 0 if fail - -------------------------------------------------------------------*/ -INITVG96ENTRY(init96MapBoard, FxBool , (void *rd, void *info, FxU16 vID, FxU16 dID) ) -{ -#define FN_NAME "init96MapBoard" - - InitRegisterDesc - *regDesc = (InitRegisterDesc *) rd; - - VG96Info *vg96Info = (VG96Info *) info; - - FxU32 - vendorID = vID, - deviceID = dID; - - GDBG_INFO((80, "SST-96 Initialization code %s\n", revString)); - - /* Watcom warning suppression */ - revString[0] = revString[0]; - - /* !!! FIXME hack for vxd bug */ - putenv( "SST_DUALHEAD=1" ); - - switch (vID) { - case AT3DVID: -#if 0 - curHALData = initAT3DGetHALData(); -#endif - break; - case MCRXVID: - curHALData = initMCRXGetHALData(); - break; - } - - - GDBG_INFO((80, "init96MapBoard: Mapping card into linear memory\n")); - - regDesc->hwDep.VG96RegDesc.baseAddress = - pciMapCardMulti( vendorID, deviceID, curHALData->memSize, &devNum, 0 , 0); - - - if (regDesc->hwDep.VG96RegDesc.baseAddress == NULL) { -#ifdef __WIN32__ - MessageBox(NULL, pciGetErrorString(), NULL, MB_OK); -#else - { -#ifdef __linux__ - fprintf(stderr, "Failed to map board: %s\n", pciGetErrorString()); - exit(1); -#else - /* Set Mode 3 before going */ - union REGS - inR, outR; - - inR.w.ax = 0x0003; - int386(0x10, &inR, &outR); - fprintf(stderr, "%s\n", pciGetErrorString()); -#endif - } -#endif /* __WIN32__ */ - exit(1); - return FXFALSE; - } - - /* need to initialize sstHW ASAP */ - sstHW = regDesc->hwDep.VG96RegDesc.baseAddress; - - GDBG_INFO((80, "%s: Mapped Voodoo Rush board at 0x%x\n", - FN_NAME, regDesc->hwDep.VG96RegDesc.baseAddress)); - - if (curHALData->initGetInfo) - (*curHALData->initGetInfo)(vg96Info); - - fifoptr = regDesc->hwDep.VG96RegDesc.fifoApertureBase; - - GDBG_INFO((88, "init96MapBoard sstHW = %x\n", sstHW)); - - /* CHD NOTE: The routine init96SetupRendering MUST Be called from this - routine or all hell brakes loose. - */ - - /* detect tmu memory size */ -#ifdef __linux__ - { - FxBool rv=FXTRUE; - GrScreenResolution_t res = GR_RESOLUTION_640x480; - static void init96SetupRendering(InitRegisterDesc *regDesc, - GrScreenResolution_t sRes); - - if (curHALData->initAperture) - (*curHALData->initAperture)(regDesc); - if ( curHALData->initEnableRegs ) - rv = curHALData->initEnableRegs( regDesc ); - if ( !rv ) - return FXFALSE; - - init96SetupRendering(regDesc, res); - - sst96InitGetTmuInfo((FxU32 *)sstHW, vg96Info); - } -#else -#ifdef(__DOS32__) - { - /* In dos mode, we do it the way it is supposed to be. - In windows mode, calling initEnableRegs() will change the clock - rate and it makes the refresh looks bad. So we still use the - init96SetVideo() to set up the rendering mode etc. - */ - GrScreenResolution_t res = GR_RESOLUTION_640x480; - FxBool rv = FXTRUE; - - if (curHALData->initAperture) - (*curHALData->initAperture)(regDesc); - - { - union REGS - inR, outR; - - inR.w.ax = 0x4f03; - int386(0x10, &inR, &outR); - - oldVidMode = outR.w.bx; - GDBG_INFO((80, "%s: Saving Current video mode (0x%x).\n", - FN_NAME, oldVidMode)); - } - - if ( !rv ) - return FXFALSE; - - if ( curHALData->initEnableRegs ) - rv = curHALData->initEnableRegs( regDesc ); - if ( !rv ) - return FXFALSE; - - init96SetupRendering(regDesc, res); - - sst96InitGetTmuInfo((FxU32 *)sstHW, vg96Info); - } -#else - { - int xres=1, yres=1, fbStride; - GrScreenResolution_t res = GR_RESOLUTION_NONE; - init96SetVideo(0, res, - 0, 2, 1, - 2, 1, regDesc, - &xres, &yres, &fbStride ); - sst96InitGetTmuInfo((FxU32 *)sstHW, vg96Info); - init96RestoreVideo(regDesc); - } -#endif -#endif - - GDBG_INFO((80, "init96MapBoard: returning FXTRUE\n")); - - return FXTRUE; - -#undef FN_NAME -} /* init96MapBoard */ - - -#ifndef GDBG_INFO_ON -#define WAITLOOP {\ -int nWaits;\ -volatile FxU32 waitRes;\ - for (nWaits = 0; nWaits < 100000; nWaits++) {\ - waitRes = GET(sstHW[0x90 + 0x100000]);\ - if (waitRes & 0x80000000) break;\ - }\ -} -#else -#define WAITLOOP {\ -int nWaits;\ - volatile FxU32 waitRes;\ - for (nWaits = 0; nWaits < 50000; nWaits++) {\ - waitRes = sstHW[0x100000];\ - if (waitRes & 0x80000000) break;\ - }\ -} -#endif - -#define SWAPPENDING(status) ((status & 0x70) >> 4) - -/*------------------------------------------------------------------- - Function: init96SetupRendering - Date: 03-Sep-97 - Implementor(s): dow - Library: Init Code for 96 - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -static void -init96SetupRendering(InitRegisterDesc *regDesc, GrScreenResolution_t sRes) -{ -#define FN_NAME "init96SetupRendering" - FxU32 regVal; - - sstHW = regDesc->hwDep.VG96RegDesc.baseAddress; - sstPtr = - (volatile Sstregs *)(SST96_COMMAND_REGS(regDesc->hwDep.VG96RegDesc.baseAddress)); - - /*------------------------------------------------------------ - Initialize Jr and TMU - ------------------------------------------------------------*/ - GDBG_INFO((80, "%s: Software reset\n", FN_NAME)); - SET(sstHW[0x90 + 0x100000], 0xf601); /* (0xf601) init0, sw reset. */ - - WAITLOOP; - - GDBG_INFO((80, "%s: Zero Out CMD FIFO registers\n", FN_NAME)); - SET(sstHW[0x100000 + 0x95], 0); - SET(sstHW[0x100000 + 0x94], 0); - SET(sstHW[0x100000 + 0x93], 0); - - GDBG_INFO((80, "%s: Setting up Mem FIFO\n", FN_NAME)); - - GETREGVALFROMENV(regVal, "SST96_FBIJRINIT2", 0x70d20); - - SET(sstHW[0x92 + 0x100000], regVal); - - /* Off for Host Blt, On for LFB command traffic - Low Priority Request Aging - wait 64 cycles - before answering low priority requests from - AT3D on PUMA - 3F may not be optimal, should - be tweaked later, !!JDT - [24] - PUMA Texture Address Space Mode - 0x1 - 2MB - [23] - PUMA Texture Base Address Mode - 0x1 - 6MB - [12:7] - PUMA Low Priority Grant Limit Cnt - 0x0 - [6] - PUMA Low Prorirty Grant Limit Enable - 0x0 - [5:0] - PUMA Low Priority Request Delay Cnt - 0x1f - 32 ccls - Setting to 0x3f ( max ) seems to cripple windows/d3d - maybe blt operations suffer??? - */ - GDBG_INFO((80, "%s: Setting low priority request aging.\n", FN_NAME)); - /* - * If we're running at a high resolution, don't starve AT3D's - * video refresh. XXX FIXME for AT3d only - */ - if (sRes == GR_RESOLUTION_NONE) { - /* set the lpr delay to 0. It was 0x10 and the video refresh was not correct */ - GETREGVALFROMENV(regVal, "SST96_FBIJRINIT1", 0x01800000); - SET(sstHW[0x91 + 0x100000], regVal); - } else { - GETREGVALFROMENV(regVal, "SST96_FBIJRINIT1", 0x0180003f); - - if (myGetenv("SST96_MEMORYHINT")) { - regVal |= (0x1f << 13); - } - SET(sstHW[0x91 + 0x100000],regVal); - } - - /* Come out of Reset - [17] - Serial Status Xfer Mode - 0x0 - rising edge - [16:12] - TREX-To-FBI High Water Mark - 0xf - [11:8] - TREX-To-FBI Bus Clock Delay - 0x6 - */ - - GDBG_INFO((80, "%s: Coming out of FBI reset\n", FN_NAME)); - GETREGVALFROMENV(regVal, "SST96_FBIJRINIT0", 0xf600); - SET(sstHW[0x90 + 0x100000], regVal); /* Bit 1 disables tmu */ - - WAITLOOP; - - GDBG_INFO((80, "%s: Setting TMU FT & TF delays\n", FN_NAME)); - { - FxU32 trexinit0, trexinit1; - - if(myGetenv(("SST_TREX0INIT0"))) { - sscanf(myGetenv(("SST_TREX0INIT0")), "%i", &trexinit0); - } else { - trexinit0 = 0x05441; /* TREXINIT0 */ - } - - if(myGetenv(("SST_TREX0INIT1"))) { - sscanf(myGetenv(("SST_TREX0INIT1")), "%i", &trexinit1); - } else { - trexinit1 = 0x3643c; /* TREXINIT1 */ - } - - SET(sstHW[0xc7 + 0x100000], trexinit0); /* TREXINIT0 */ - SET(sstHW[0xc8 + 0x100000], trexinit1); /* TREXINIT1 */ - } - - WAITLOOP; - -#undef FN_NAME -} /* init96SetupRendering */ - -/*------------------------------------------------------------------- - Function: initSet96Video - Date: 10/17 - Implementor(s): jdt, murali - Library: init96 - Description: - - 1 - Set video mode - 2 - Enable Direct Writes to Jr - 3 - Put Jr registers in Reset - 3 - Set up Color Buffer Registers - - Arguments - - Return: - FXFALSE - fail - FXTRUE - pass - -------------------------------------------------------------------*/ -INITVG96ENTRY(init96SetVideo, FxBool , - ( FxU32 hWnd, - GrScreenResolution_t sRes, - GrScreenRefresh_t vRefresh, - InitColorFormat_t cFormat, - InitOriginLocation_t yOrigin, - int nColBuffers, - int nAuxBuffers, - InitRegisterDesc *regDesc, - int *xres, - int *yres, - int *fbStride) ) -{ -#define FN_NAME "init96SetVideo" - FxBool rv = FXTRUE; - InitSwapType_t swapType = 0; - InitBufDesc_t bufDesc[NUM_BUFS]; - FxU32 nTries = 0, status; - FxU32 regVal; - int i; - - for (i = 0; i < NUM_BUFS; i++) - bufDesc[i].bufType = INIT_BUFFER_NONE; - - if (myGetenv("SST96_FORCE_TRIPLE")) - nColBuffers = 3; - - GDBG_INFO((80, "%s: %d Color Buffers\n", FN_NAME, nColBuffers)); - - GDBG_INFO((80, "(%s) hWnd=%x, sRes=%d, yOrg=%d, ncb=%d, nab=%d\n", - FN_NAME, hWnd, sRes, yOrigin, nColBuffers, nAuxBuffers)); - - /* YO! Fix this comment - XXX this needs to be moved to post SetVideo code ??? */ - GDBG_INFO((80, "%s: Initializing Command Aperture\n", FN_NAME)); - - if (curHALData->initAperture) - (*curHALData->initAperture)(regDesc); - -#if defined( __DOS32__ ) - { - union REGS - inR, outR; - - inR.w.ax = 0x4f03; - int386(0x10, &inR, &outR); - - oldVidMode = outR.w.bx; - GDBG_INFO((80, "%s: Saving Current video mode (0x%x).\n", - FN_NAME, oldVidMode)); - } -#endif - - /*------------------------------------- - Set Video Mode - -------------------------------------*/ - /* this goes through the dxdrvr.c which is a misnomer - which will persist for the time being, in dos - this does not have anything to do with directX */ -#ifdef __linux__ - if (!linOpen(hWnd, sRes, vRefresh, cFormat, yOrigin, - nColBuffers, nAuxBuffers, bufDesc, - xres, yres, &swapType)) { -#else - if (!dxOpen(hWnd, sRes, vRefresh, cFormat, yOrigin, - nColBuffers, nAuxBuffers, bufDesc, - xres, yres, &swapType)) { -#endif - GDBG_INFO((80, "Failed dxOpen\n")); - rv = FXFALSE; - goto BAIL; - } - -#ifdef GDBG_INFO_ON - for (i = 0; i < nColBuffers; i++) { - GDBG_INFO((80, "%s: bufDesc[%d]:\n", FN_NAME, i)); - GDBG_INFO((80, "%s: bufDesc.bufType = %s\n", - FN_NAME, bufTypeNames[bufDesc[i].bufType])); - GDBG_INFO((80, "%s: bufDesc.bufOffset = 0x%x\n", - FN_NAME, bufDesc[i].bufOffset )); - GDBG_INFO((80, "%s: bufDesc.bufStride = 0x%x\n", - FN_NAME, bufDesc[i].bufStride)); - GDBG_INFO((80, "%s: bufDesc.bufBPP = 0x%x\n", - FN_NAME, bufDesc[i].bufBPP)); - } -#endif - - if ( !rv ) goto BAIL; - - /*------------------------------------- - Enable Direct Writes to JR - -------------------------------------*/ - if ( curHALData->initEnableRegs ) - rv = curHALData->initEnableRegs( regDesc ); - if ( !rv ) goto BAIL; - - - init96SetupRendering(regDesc, sRes); - - cachedYOrigin = yOrigin; /* Used later for init96Control */ - cachedSwapType = swapType; - - /* - ** Set Up Color Buffer Registers & triple buffering if necessary. - */ - maxBuffer = (nColBuffers < 2) ? 2 : nColBuffers; - maxBufIdx = maxBuffer - 1; - - GDBG_INFO((80, "%s: maxBuffer = %d, maxBufIdx = %d\n", - FN_NAME, maxBuffer, maxBufIdx)); - - /* Send as many swapbuffers as status says are necessary */ - { - FxU32 - pending = 7; /* # Swaps pending */ - - GDBG_INFO((80, - "%s: Sending %d swapbufferCMDs\n", - FN_NAME, - pending)); - while (pending) { - FxU32 - tries = 0; - - GDBG_INFO((80, "%s: %d swaps pending\n", FN_NAME, pending)) ; - - status = sstHW[0x100000]; - pending = SWAPPENDING(status); - - while (pending--) { - SET(sstPtr->swapbufferCMD, 1); - status = sstHW[0x100000]; /* bug #1152 */ - ADVANCE_BUFFERS(dfb); - WAITLOOP; - } - - do { - ++tries; - status = sstHW[0x100000]; - - GDBG_INFO((120, "%s: Serial status = 0x%x\n", FN_NAME, status)); - pending = SWAPPENDING(status); - if (tries > MAXTRIES) { - GDBG_INFO((80, "%s: Bailing out after %d tries to get swap buffer pending to decrement\n", FN_NAME, tries)); - rv = FXFALSE; - goto BAIL; - } - } while (pending); - } - - /* Clear counters with a NOP */ - SET(sstHW[0x42 + 0x100000], 1); /* NOP cmd */ - - /* Wait for idle */ - do { - if (nTries > MAXTRIES) { - GDBG_INFO((80, - "%s: Bailing out and returning false after %d checks for idle.\n", FN_NAME, nTries-1)); - return FXFALSE; - } - ++nTries; - status = sstHW[0x100000]; - - GDBG_INFO((80, - "%s: Serial status after soft reset: 0x%x\n", - FN_NAME, - status)); - } while (status & 0x1); - } /* end of swap buffer block */ - - - if (tripleBuffering) { - GETREGVALFROMENV(regVal, "SST96_FBIJRINIT0", 0xf600); - regVal |= (1 << 2); - GDBG_INFO((80, "%s: Enabling triple buffering.\n", FN_NAME)); - /* dram read to write fast timing enable. bit 7 */ - if (myGetenv("SST96_MEMORYHINT")) { - regVal |= (0x1 << 7); - } - SET(sstHW[0x90 + 0x100000], regVal); /* Bit 1 disables tmu */ - } - - /* Need to be converted to indices dfbFront.... rfbFront.... */ - - dfbFrontIdx = 0; - dfbBackIdx = 1; - dfbRenderIdx = dfbBackIdx; - - rfbFrontIdx = 0; - rfbBackIdx = 1; - rfbRenderIdx = rfbBackIdx; - - rv = init96LoadBufRegs(NUM_BUFS, bufDesc, *xres, *yres, regDesc); - if ( !rv ) { - GDBG_INFO((80, "Failed init96LoadBufRegs\n")); - goto BAIL; - } - - /*------------------------------------- - Set up Page Flipping - -------------------------------------*/ - WAITLOOP; -#if !defined( INIT96VGASWAP ) && !defined( __linux__ ) - { - FxU32 buf[MAX_BUF]; - int i; - - for (i=0; iinitSwapTiles = NULL; - - if (curHALData->initUseTiles && (swapType == INIT_SWAP_FLIP)) { -#ifdef H3D - (*curHALData->initUseTiles)(regDesc, - buf, - maxBuffer, - bI[0].dfbStride, - *xres, - *yres, - GR_RESOLUTION_IS_AUTOFLIPPED(sRes) ); -#else - (*curHALData->initUseTiles)(regDesc, - buf, - maxBuffer, - bI[0].dfbStride, - *xres, - *yres ); -#endif - } - } -#endif - - *fbStride = (bI[1].dfbStride>>1); - GDBG_INFO(( 200, "frame buffer stride: %d\n", *fbStride )); - - BAIL: - return rv; -#undef FN_NAME -} /* init96SetVideo */ - - -/*------------------------------------------------------------------- - Function: init96RestoreVideo - Date: 3/16 - Implementor(s): jdt - Library: init96 - Description: - - Disable Direct Hardware Access - Restore the video to it's initial state - - Arguments: - none - Return: - none - -------------------------------------------------------------------*/ -INITVG96ENTRY(init96RestoreVideo, void, ( InitRegisterDesc *regDesc )) { -#define FN_NAME "init96RestoreVideo" - if ( curHALData->initDisableRegs ) - curHALData->initDisableRegs( regDesc ); - -#if defined( __WIN32__ ) && !defined( INIT_HOOPTI ) - dxClose(); -#elif defined( __DOS32__ ) - { - static union REGS - inR, outR; - - GDBG_INFO((80, "%s: Restoring VESA Mode 0x%x\n", FN_NAME, oldVidMode)); - inR.w.ax = 0x4f02; - inR.w.bx = oldVidMode; - - int386( 0x10, &inR, &outR ); - } -#elif defined( __linux__ ) - linClose(); -#endif -#undef FN_NAME -} /* init96RestoreVideo */ - - -/*------------------------------------------------------------------- - Function: init96EnableTransport - Date: 3/17 - Implementor(s): jdt - Library: init96 - Description: - - Enable the JR command transport and return pertinant fifo - information to the caller - - Arguments: - info - structure to fill with info about the FIFO - Return: - FXTRUE - succeed - FXFALSE - fail - -------------------------------------------------------------------*/ -INITVG96ENTRY(init96EnableTransport, FxBool, ( InitFIFOData *info, InitRegisterDesc* regDesc)) -{ -#define FN_NAME "init96EnableTransport" - FxBool rv = FXTRUE; - FxU32 lo, hi, sz, th; - FxU32 - fifoPhysBaseAddress, - fifoPhysSize; - FxBool - res; - PciMemType - fifoMemType; - - GDBG_INFO((80, "%s\n", FN_NAME)); - - /*------------------------------------------------------------ - Enable the Off Chip Fifo - ------------------------------------------------------------*/ - - /* These are defined in sst.c for now */ - lo = (fifoStart >> 12); /* physaddr of 1st 4k page */ - hi = (fifoEnd >> 12); /* physaddr of last 4k page */ - sz = (hi - lo + 1) << 12; /* bytes */ - th = (hi - lo) - 3; /* threshold, in 4k pages. */ - - /* Generate virtual addresses for the pointers. */ - fifovirt = (FxU32 *)&sstHW[lo << 10]; - fifophys = lo << 12; - fifomax = sz; - fifocur = 0; - - fifoptr = fifovirt; - fifosize = 4096; /* initially, set to 4k */ - - fifolfb = 1; - - /* First disable the off-chip fifo */ - GDBG_INFO((80, "%s: Disabling off-chip FIFO\n", FN_NAME)); - SET(sstHW[0x100000 + 0x93], 0); - - /* FbijrInit4 - 0x94 - entry count */ - SET(sstHW[0x100000 + 0x94], 0); - - /* FbijrInit5 - 0x95 - read pointer */ - SET(sstHW[0x100000 + 0x95], lo << 9); - - /* Default size to page checking mode. - * - * NB: This will get overwritten later if we're using - * the other wrapping code. - */ - info->hwDep.vg96FIFOData.fifoSize = fifosize; - - /* Store fifo data to info */ - info->hwDep.vg96FIFOData.fifoVirt = (FxU32*)fifovirt; - info->hwDep.vg96FIFOData.fifoMax = fifomax; - info->hwDep.vg96FIFOData.fifoPhys = fifophys; - info->hwDep.vg96FIFOData.fifoCur = fifocur; - info->hwDep.vg96FIFOData.fifoLfb = fifolfb; - - /* Set up alternate wrapping values. - * - * NB: This *MUST* come before the processor dependent - * fifo ptr advancing that we do below. - */ -#if SST96_ALT_FIFO_WRAP - /* Assume hw is still at the start of the fifo */ - info->hwDep.vg96FIFOData.fifoRead = (FxU32)fifovirt; - - info->hwDep.vg96FIFOData.roomToEnd = fifomax; - - info->hwDep.vg96FIFOData.fifoSize = - info->hwDep.vg96FIFOData.roomToReadPtr = fifomax - sizeof(FxU32); - - info->hwDep.vg96FIFOData.regDesc = regDesc; -#endif /* SST96_ALT_FIFO_WRAP */ - - if (info->cpuType == 6) { - /* - ** Now, write 128 DWORDS of NULL to the FIFO, so the FIFO read - ** pointer trails the FIFO write pointer by 128 DWORDS. The state - ** setting code fences every 128 DWORDS. - */ - GDBG_INFO((125, "%s: Advancing write pointer 128 DWORDS beyond read.\n", - FN_NAME)); - do { - *fifoptr++ = 0L; - info->hwDep.vg96FIFOData.fifoSize -= 4; - } while (((FxU32) fifoptr) & 0xff); - } else { - GDBG_INFO((125, "%s: No need for write pointer advance.\n", - FN_NAME)); - } - - /* - ** NOTE TO ALL FOOLS WHO TREAD HERE - ** - ** It is VITALLY important to enable the FIFO AFTER the - ** P6 Lag Of Love(tm), instead of before, otherwise the FIFO will - ** become horribly corrupted. - */ - - /* FbiJrInit3 - 0x93 - Load up offchip fifo register */ - GDBG_INFO((80, "%s: Loading up of offchip fifo register\n", FN_NAME)); - SET(sstHW[0x100000 + 0x93], 1 | (lo << 1) | (hi << 11) | (th << 21)); - - /* Set the fifo ptr now that we really know where its going to start - * for the client code. - */ - info->hwDep.vg96FIFOData.fifoPtr = (FxU32*)fifoptr; - - /* Turn on Write combining for the FIFO */ - pciGetConfigData(PCI_BASE_ADDRESS_0, devNum, &physAddr); - - fifoPhysBaseAddress = physAddr + fifoStart; - fifoPhysSize = fifoEnd - fifoStart; - fifoMemType = PciMemTypeWriteCombining; - - res = pciFindMTRRMatch(fifoPhysBaseAddress, fifoPhysSize, - fifoMemType, &fifoMTRRNum); - - if (!res) { - res = pciFindFreeMTRR(&fifoMTRRNum); - } - - if (res) - pciSetMTRR(fifoMTRRNum, fifoPhysBaseAddress, fifoPhysSize, fifoMemType); - else - GDBG_INFO((80, "%s: Couldn't get free or used MTRR!\n")); - - - return rv; - -#undef FN_NAME -} /* init96EnableTransport */ - -/*------------------------------------------------------------------- - Function: init96DisableTransport - Date: 3/16 - Implementor(s): jdt - Library: init96 - Description: - Put the command transport in a safe state - Arguments: - Return: - -------------------------------------------------------------------*/ -INITVG96ENTRY(init96DisableTransport, void, ( void )) -{ -#define FN_NAME "init96DisableTransport" - while (*(volatile FxU32 *)sstPtr & 1); - - SET(sstHW[0x100000 + 0x90], 0xf601); /* (0xf601) init0, sw reset. */ - SET(sstHW[0x100000 + 0x95], 0); - SET(sstHW[0x100000 + 0x94], 0); - SET(sstHW[0x100000 + 0x93], 0); - -#if SST96_ALT_FIFO_WRAP - GDBG_INFO((80, "%s: Fifo Statistics - Wrapped:%ld Stalled:%ld\n", - numWraps, numStalls)); -#endif /* SST96_ALT_FIFO_WRAP */ - - /* Clear the MTRR */ - pciSetMTRR(fifoMTRRNum, 0, 0, 0); -#undef FN_NAME -} /* init96DisableTransport */ - -/*------------------------------------------------------------------- - Function: init96Swap - Date: 13-Feb-97 - Implementor(s): jdt, dow, murali - Library: Init Code for VG96 - Description: - Performs VG96 buffer swap - Arguments: - code: usually vsync wait option - wcb: method for writing to hardware - Return: - -------------------------------------------------------------------*/ -INITVG96ENTRY(init96Swap, void , - (FxU32 code, InitRegisterDesc *rd, Init96WriteMethod *wcb) ) -{ -#define FN_NAME "init96Swap" - FxU32 status; - - static FxBool gotEnv; - static FxBool overrideSwap; - static FxU32 overrideVal; - - GDBG_INFO((80, "init96Swap()\n")); - - /* - * For improved speed we take the following steps - * 1. remove the status checking - * 2. modify grBufferNumPending so it does not need to do P6 nudge code - * 3. add one p6 nudge code - * Here is step 1. Goto grBufferNumPending() in gglide.c to continue. - * - do { - GDBG_INFO((120, "%s: Serial status = 0x%x\n", FN_NAME, status)); - status = *rd->hwDep.VG96RegDesc.serialStatus; - } while (status & 0x1); - */ - - if (cachedSwapType == INIT_SWAP_FLIP) { -#ifdef __linux__ - - FxU32 - offset; - /* Wait for idle */ - do { - status = sstHW[0x100000]; - } while (status & 0x1); - - offset = bI[rfbRenderIdx].dfbBase; - linFlip(offset); - -#else -#ifndef INIT96VGASWAP - /* Direct Write to the Swap Pending register */ - GDBG_INFO((80, "init96Swap: Sending sapppendCMD\n")); - GDBG_INFO((80, " Direct Write of register 0x%x with value 0x%x\n", ((((FxU32) (&sstPtr->swappendCMD)) - (((FxU32) sstPtr) + 0x100000)) >> 2), 1)); - - sstPtr->swappendCMD = 0x1; - - - if (gotEnv == FXFALSE) { - const char *envVal; - if ((envVal = myGetenv("SST96_INITSWAPCOUNT")) != NULL) { - sscanf(envVal, "%x", &overrideVal); - GDBG_INFO((80, "%s: environment SST96_INITSWAPCOUNT (0x%x) overrode code\n", - FN_NAME, overrideVal)); - overrideSwap = FXTRUE; - - } - gotEnv = FXTRUE; - } - - if (overrideSwap == FXTRUE) - code = overrideVal; - - GDBG_INFO((80, "%s: Sending swapbufferCMD (0x%x) via FIFO callback\n", - FN_NAME, code)); - - wcb( (FxU32*)&(sstPtr->swapbufferCMD), 1 ); - status = sstHW[0x100000]; /* bug #1152 */ - - /* Use arrays & rotate for triple buffering */ - -#else /* Swapping With VGA */ - /* - * This is for swapping by changing the VGA serial start register. - * a.k.a "Page flipping" - */ - FxU32 - offset; - FxU8 - tmp, - serialOverflow; - - GDBG_INFO((210, "%s: Swapping With VGA\n", FN_NAME)); - - /* Wait for idle */ - do { - status = sstPtr->status & 0x1; - } while (status & 0x1); - - offset = bI[rfbRenderIdx].dfb; - - GDBG_INFO((80, "%s: Swapping to offset 0x%x\n", FN_NAME, offset)); - /* Fetch serial overflow and clear low nibble for serial start */ - CRTC_GET(AR_CRTC_SERIAL_OVERFLOW_INDEX, serialOverflow); - serialOverflow &= 0xF0; - - /* Make sure scanout within active display */ - do { - INP(VGA_INPUT_STATUS_1C, tmp); - } while (tmp & VIS1C_PIXEL_DISPLAY_INACTIVE); - - /* Set serial address */ - /* For some reason unknown to me, this is set to the byte offset / 4, - or perhaps the offset in dwords */ - - /* Top nibble */ - tmp = (FxU8) ((offset >> (2+16)) & 0x0F); - CRTC_SET(AR_CRTC_SERIAL_OVERFLOW_INDEX, serialOverflow | tmp); - - /* Middle byte */ - tmp = (FxU8) ((offset >> (2+8)) & 0xFF); - CRTC_SET(VR_CRTC_SERIAL_START_ADDRESS_HI_INDEX, tmp); - - /* Low byte */ - tmp = (FxU8) ((offset >> 2) & 0xFF); - CRTC_SET(VR_CRTC_SERIAL_START_ADDRESS_LO_INDEX, tmp); - - /* Save away */ - do { - INP(VGA_INPUT_STATUS_1C, tmp); - } while (tmp & VIS1C_VERTICAL_RETRACE_ACTIVE); - - do { - INP(VGA_INPUT_STATUS_1C, tmp); - } while (!(tmp & VIS1C_VERTICAL_RETRACE_ACTIVE)); -#endif -#endif - - /* dpc - 26 jan 1998 - * Some hw, macronix, requires that we diddle w/ even more bits - * when we do the swap. - */ - if(curHALData->initSwapTiles != NULL) (*curHALData->initSwapTiles)(rd); - - ADVANCE_BUFFERS(rfb); - - GDBG_INFO((80, "%s: Setting colBufferSetup (0x%x, 0%x) via FIFO callback\n", - FN_NAME, bI[rfbRenderIdx].rfb, - bI[rfbRenderIdx].rfb)); - wcb( (FxU32*)&(sstPtr->colBufferSetup), bI[rfbRenderIdx].rfb ); - - - } else { - while ((*rd->hwDep.VG96RegDesc.serialStatus) & 0x1); -#ifdef __linux__ - do { - status = sstHW[0x100000]; - } while (status & 0x1); - linSwap(code); -#else - dxSwap(code); -#endif - } - GDBG_INFO((80, "%s: returning\n", FN_NAME)); - return; -#undef FN_NAME -} /* init96Swap */ - - - -/*------------------------------------------------------------------- - Function: init96Idle - Date: 13-Feb-97 - Implementor(s): dow, jdt, murali - Library: Init Code for VG96 - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -INITVG96ENTRY(init96Idle, void , (Init96WriteMethod *wcb) ) -{ -#define FN_NAME "init96Idle" - - volatile FxU32 *statReg = (volatile FxU32 *) &sstPtr->status; - - wcb((FxU32*)&sstPtr->nopCMD, 0); - - while ( (*statReg) & 0x1 ) { }; - -#undef FN_NAME -} /* init96Idle */ - -/*------------------------------------------------------------------- - Function: init96GetBufferPtr - Date: 2/25 - Implementor(s): jdt - Library: init code for vg96 - Description: - Get a pointer to a specified buffer ( changes at swaps ) - Arguments: - buffer - constant defining buffer - Return: - void opinter to buffer - -------------------------------------------------------------------*/ -#define LFB_OFFSET( X ) ( X & 0x3fffff ) - -INITVG96ENTRY(init96GetBufferPtr, void*, (InitBuffer_t buffer, int *strideBytes)) -{ -#define FN_NAME "init96GetBufferPtr" - void *rv = 0; - - GDBG_INFO((80,"%s\n", FN_NAME)); - - switch( buffer ) { - case INIT_BUFFER_FRONTBUFFER: - GDBG_INFO((80, " get front buffer pointer" )); - rv = (void*)(((char*)sstHW)+bI[rfbFrontIdx].dfbBase); - *strideBytes = bI[rfbFrontIdx].dfbStride; - break; - case INIT_BUFFER_TRIPLEBUFFER: - rv = (void*)(((char*)sstHW)+bI[rfbTripleIdx].dfbBase); - *strideBytes = bI[rfbTripleIdx].dfbStride; - GDBG_INFO((80, " get triple buffer pointer" )); - break; - case INIT_BUFFER_BACKBUFFER: - rv = (void*)(((char*)sstHW)+bI[rfbBackIdx].dfbBase); - *strideBytes = bI[rfbBackIdx].dfbStride; - GDBG_INFO((80, " get back buffer pointer" )); - break; - - case INIT_BUFFER_AUXBUFFER: - rv = (void*)(((char*)sstHW) + LFB_OFFSET(ab0)); - *strideBytes = ab0Stride; - GDBG_INFO((80, " get aux buffer pointer" )); - break; - } - - GDBG_INFO((80, "%s: strideBytes %.05d\n", FN_NAME, *strideBytes )); - GDBG_INFO((80, "%s: returning 0x%x\n", FN_NAME, rv )); - - return rv; -#undef FN_NAME -} /* init96GetBufferPtr */ -#undef LFB_OFFSET - -/*------------------------------------------------------------------- - Function: init96RenderBuffer - Date: 2/25 - Implementor(s): jdt - Library: init96 - Description: - Set the current render buffer - Arguments: - buffer - which buffer to send render ops to - Return: - none - -------------------------------------------------------------------*/ -INITVG96ENTRY(init96RenderBuffer, void, (InitBuffer_t buffer,Init96WriteMethod *wcb)) -{ -#define FN_NAME "init96RenderBuffer" - GDBG_INFO((80,"%s\n", FN_NAME)); - - /* Mess around with indeces here i.e. rfbRender = rfbBack ....*/ - switch( buffer ) { - case INIT_BUFFER_BACKBUFFER: - rfbRenderIdx = rfbBackIdx; - break; - case INIT_BUFFER_FRONTBUFFER: - rfbRenderIdx = rfbFrontIdx; - break; - } - wcb( (FxU32*)&(sstPtr->colBufferSetup), bI[rfbRenderIdx].rfb ); - -#undef FN_NAME -} /* init96RenderBuffer */ - -/*------------------------------------------------------------------- - Function: init96Origin - Date: 2/26 - Implementor(s): jdt - Library: init96 - Description: - Set the yOrigin - Arguments: - origin - Return: - none - -------------------------------------------------------------------*/ -INITVG96ENTRY(init96Origin, void, (InitOriginLocation_t origin,Init96WriteMethod *wcb)) -{ -#define FN_NAME "init96Origin" - int i; - GDBG_INFO((80,"%s\n", FN_NAME)); - - /* Once the bases and tops are set, this is pretty straight forward */ - switch ( origin ) { - case INIT_ORIGIN_UPPER_LEFT: - for (i=0; icolBufferSetup), bI[rfbRenderIdx].rfb); - wcb( (FxU32*)&(sstPtr->auxBufferSetup), ab0 ); -#undef FN_NAME -} /* init96Origin */ - -/*------------------------------------------------------------------- - Function: init96ResyncBuffers - Date: 07-Mar-97 - Implementor(s): murali - Library: Init Code for VG96 - Description: - Performs VG96 buffer resync buffers - Arguments: - Return: - -------------------------------------------------------------------*/ -INITVG96ENTRY(init96Control, FxBool , ( FxU32 code, InitRegisterDesc *regDesc)) -{ -#define FN_NAME "init96Control" - int xRes, yRes; - InitBufDesc_t bufDesc[5]; - - GDBG_INFO((80, "(%s)\n", FN_NAME)); - - if ( !sstHW ) return FXFALSE; - -#ifdef __linux__ - if (!linControl(code, bufDesc, &xRes, &yRes)) { -#else - if (!dxControl(code, bufDesc, &xRes, &yRes)) { -#endif - GDBG_INFO((80, "dxControl failed!\n")); - return FXFALSE; - } - - if (!init96LoadBufRegs(NUM_BUFS, bufDesc, xRes, yRes, regDesc)) { - GDBG_INFO((80, "init96LoadBufRegs failed\n")); - } - - GDBG_INFO((80, "%s: Returning TRUE\n", FN_NAME)); - return (yRes << 16) | (xRes); -#undef FN_NAME -} /* init96Control */ - -#if SST96_ALT_FIFO_WRAP - -#define MIN(__x, __y) (((__x) < (__y)) ? (__x) : (__y)) -#define MAX(__x, __y) (((__x) < (__y)) ? (__y) : (__x)) - -/* Macro to get the hw's read ptr located somewhere in the frame - * buffer address space. - */ -#define SST96_HW_FIFO(__hwP, __regP) ((FxU32)(__hwP) + \ - (*((volatile FxU32*)(((FxU32)(__regP)) + (0x95 << 12))) << 3)) - -INITVG96ENTRY(init96WrapFIFO, - FxBool, - (InitRegisterDesc* rd, InitFIFOData* fifoP)) -{ -#define FN_NAME "init96WrapFIFO" - const FxI32 blockSize = fifoP->hwDep.vg96FIFOData.blockSize; - -#if GDBG_INFO_ON - /* no ASSERT macro. Just die if debugging is on. */ - if (blockSize == 0xDEADBEEF) *(FxU32*)NULL = 0x00; -#endif - - { - const FxI32 writes = (MIN(fifoP->hwDep.vg96FIFOData.roomToReadPtr, - fifoP->hwDep.vg96FIFOData.roomToEnd) - - fifoP->hwDep.vg96FIFOData.fifoSize); - - fifoP->hwDep.vg96FIFOData.roomToReadPtr -= writes; - fifoP->hwDep.vg96FIFOData.roomToEnd -= writes; - } - -again: - /* do we need to stall? */ - { - FxU32 lastHwRead = fifoP->hwDep.vg96FIFOData.fifoRead; - FxI32 roomToReadPtr = fifoP->hwDep.vg96FIFOData.roomToReadPtr; - - while (roomToReadPtr < blockSize) { - const FxU32 curReadPtr = SST96_HW_FIFO(sstHW, sstPtr); - const FxU32 curReadDist = curReadPtr - lastHwRead; - - roomToReadPtr += curReadDist; - if (lastHwRead > curReadPtr) roomToReadPtr += fifoP->hwDep.vg96FIFOData.fifoMax; - - lastHwRead = curReadPtr; - } - - GDBG_INFO((80, FN_NAME"_Wait : (0x%X : 0x%X) : (0x%X : 0x%X)\n", - (FxU32)fifoP->hwDep.vg96FIFOData.fifoPtr, blockSize, - fifoP->hwDep.vg96FIFOData.roomToReadPtr, - fifoP->hwDep.vg96FIFOData.roomToEnd)); - - fifoP->hwDep.vg96FIFOData.fifoRead = lastHwRead; - fifoP->hwDep.vg96FIFOData.roomToReadPtr = roomToReadPtr; - } - - /* wrap to front */ - if (fifoP->hwDep.vg96FIFOData.roomToEnd <= blockSize) { - /* Pad out all of the fifo, save the last entry, w/ NUL ops. The - * last entry is written once we know that we are not going to - * overflow the entry count. Oh, for the cvg JMP packet type. - */ -#define kFifoPadDelay (sizeof(FxU32) << 1) -#if GDBG_INFO_ON -#define JU_JU_STALL numJuJuStalls++ -#else -#define JU_JU_STALL /* Do Nothing */ -#endif - { - volatile FxU32* fifoPtr = fifoP->hwDep.vg96FIFOData.fifoPtr; - const FxU32 wrapAddr = ((FxU32)fifoP->hwDep.vg96FIFOData.fifoVirt + - fifoP->hwDep.vg96FIFOData.fifoMax); - - /* Do the padding up to the last entry or so. */ - while((FxU32)fifoPtr < wrapAddr - kFifoPadDelay) *fifoPtr++ = 0x00UL; - - /* Bad ju-ju awaits the person who wraps the fifo when the hw - * ptr is at the start of the fifo. (I've seen it happen, and - * it is not pretty.) - */ - { - volatile FxU32* serialStatus = - fifoP->hwDep.vg96FIFOData.regDesc->hwDep.VG96RegDesc.serialStatus; - - if ((*serialStatus & 0x80) != 0x00) { - GDBG_INFO((85, FN_NAME": fifo close to full. Waiting(0x%X)...\n", numJuJuStalls)); - while((*serialStatus & 0x80) != 0x00) JU_JU_STALL; - GDBG_INFO((85, FN_NAME": fifo drained (0x%X)\n", numJuJuStalls)); - } - } - - /* Finish the padding of the rest of the fifo to the end */ - while((FxU32)fifoPtr < wrapAddr) *fifoPtr++ = 0x00UL; - } -#undef JU_JU_STALL -#undef kFifoPadDelay - - GDBG_INFO((80, FN_NAME"_Wrap : (0x%X : 0x%X) : (0x%X : 0x%X)\n", - (FxU32)fifoP->hwDep.vg96FIFOData.fifoPtr, blockSize, - fifoP->hwDep.vg96FIFOData.roomToReadPtr, - fifoP->hwDep.vg96FIFOData.roomToEnd)); - - fifoP->hwDep.vg96FIFOData.roomToReadPtr -= fifoP->hwDep.vg96FIFOData.roomToEnd; - fifoP->hwDep.vg96FIFOData.roomToEnd = fifoP->hwDep.vg96FIFOData.fifoMax; - - /* Reset fifo ptr to start */ - fifoP->hwDep.vg96FIFOData.fifoPtr = fifoP->hwDep.vg96FIFOData.fifoVirt; - goto again; - } - - /* compute room left */ - fifoP->hwDep.vg96FIFOData.roomToEnd -= blockSize; - fifoP->hwDep.vg96FIFOData.roomToReadPtr -= blockSize; - fifoP->hwDep.vg96FIFOData.fifoSize = MIN(fifoP->hwDep.vg96FIFOData.roomToReadPtr, - fifoP->hwDep.vg96FIFOData.roomToEnd) + blockSize; - - GDBG_INFO((80, FN_NAME": (0x%X : 0x%X) : (0x%X : 0x%X) : 0x%X\n", - (FxU32)fifoP->hwDep.vg96FIFOData.fifoPtr, blockSize, - fifoP->hwDep.vg96FIFOData.roomToReadPtr, - fifoP->hwDep.vg96FIFOData.roomToEnd, - fifoP->hwDep.vg96FIFOData.fifoSize)); - -#if GDBG_INFO_ON - fifoP->hwDep.vg96FIFOData.blockSize = 0xDEADBEEF; -#endif - - return FXTRUE; -#undef FN_NAME -} -#else /* !SST96_ALT_FIFO_WRAP */ - -/*------------------------------------------------------------------- - Function: init96FIFOWait - Date: 12-Jun-97 - Implementor(s): dow - Library: Init Code for VG96 - Description: - Waits for 0x80 in status - Arguments: - rd: Description of registers. - Return: - Nothing - -------------------------------------------------------------------*/ -static void -init96FIFOWait(InitRegisterDesc *rd) -{ -#define FN_NAME "init96FIFOWait" - volatile FxU32 *pstatus; - - - /* Check for more room. */ - pstatus = (volatile FxU32 *) rd->hwDep.VG96RegDesc.serialStatus; - - if (*pstatus & 0x80) { /* 0x80 is the FIFO threshold */ - int timeout; - - again: - for (timeout = 0; timeout < 10000000; timeout++) { - if ((*pstatus & 0x80) == 0) break; - } - if (*pstatus & 0x80) { - GDBG_INFO((80, "Lost patience in %s. Status is 0x%x\n", - FN_NAME, *pstatus)); - goto again; - } - } -#undef FN_NAME -} /* init96FIFOWait */ - -/*------------------------------------------------------------------- - Function: init96WrapFIFO - Date: 13-Feb-97 - Implementor(s): dow - Library: Init Code for VG96 - Description: - Wraps the VG96 FIFO - Arguments: - rd: Description of registers. - Return: - FXTRUE if successful. - -------------------------------------------------------------------*/ -INITVG96ENTRY(init96WrapFIFO, FxBool , (InitRegisterDesc *rd, InitFIFOData *fifoData) ) -{ -#define FN_NAME "init96WrapFIFO" - FxBool rVal; - - GDBG_INFO((80,"%s\n", FN_NAME)); - - while (fifoData->hwDep.vg96FIFOData.fifoSize > 0) { - *fifoData->hwDep.vg96FIFOData.fifoPtr++ = 0L; - fifoData->hwDep.vg96FIFOData.fifoSize -= 4; - } - - - fifoData->hwDep.vg96FIFOData.fifoCur += 4096; - - /* Wrap back to beginning? */ - if (fifoData->hwDep.vg96FIFOData.fifoCur >= fifoData->hwDep.vg96FIFOData.fifoMax ) { - static int fifowraps = 0; - - fifoData->hwDep.vg96FIFOData.fifoCur = 0; - if ((fifowraps = (fifowraps + 1) & 0xf) == 0) { - GDBG_INFO((80, "%s: Wrapping %s FIFO\n", - FN_NAME, - (fifoData->hwDep.vg96FIFOData.fifoLfb - ? "LFB" - : "Video Aperture"))); - } - - if (fifoData->hwDep.vg96FIFOData.fifoLfb) - fifoData->hwDep.vg96FIFOData.fifoPtr = fifoData->hwDep.vg96FIFOData.fifoVirt; - } - - /* */ - { - FxU32 - fbiJrInit5; - - GDBG_INFO((125, "%s: Write = 0x%x\n", FN_NAME, - (FxU32) fifoData->hwDep.vg96FIFOData.fifoPtr - - (FxU32) fifoData->hwDep.vg96FIFOData.fifoVirt)); - - fbiJrInit5 = *((volatile FxU32 *) (((FxU32) sstPtr) + (0x95 << 12))); - - GDBG_INFO((125, "%s: Read = 0x%x\n", FN_NAME, - (fbiJrInit5 << 3) - - ( - (FxU32) fifoData->hwDep.vg96FIFOData.fifoVirt - - (FxU32) rd->hwDep.VG96RegDesc.baseAddress - ) - )); - - } - - GDBG_INFO((80, "%s: Waiting for more room.\n", FN_NAME)); - init96FIFOWait(rd); - - /* - ** if we get here, then there's room in the FIFO - */ - - GDBG_INFO((80, "%s: Got more room.\n", FN_NAME)); - - /* At this point, we have atleast 1 more page of fifo. */ - fifoData->hwDep.vg96FIFOData.fifoSize = 4096; - - rVal = FXTRUE; - - GDBG_INFO((80, "%s: returning %s\n", FN_NAME, rVal ? "FXTRUE" : "FXFALSE")); - - return rVal; - -#undef FN_NAME -} /* init96WrapFIFO */ - -#endif /* !SST96_ALT_FIFO_WRAP */ - -/* - * This function is used only locally, so none of Chris's decorations - * Load colbufSetup and auxBufSetup registers, given a InitBufDesc_t - */ -static FxBool -init96LoadBufRegs(int nBuffers, InitBufDesc_t *pBufDesc, int xRes, - int yRes, InitRegisterDesc *rd) -{ -#define FN_NAME "init96LoadBufRegs" - InitBufDesc_t *pFront = NULL; - InitBufDesc_t *pBack = NULL; - InitBufDesc_t *pTriple = NULL; - InitBufDesc_t *pAux = NULL; - InitBufDesc_t *pFifo = NULL; - int i; - - GDBG_INFO((80, "(%s) w = %d, h = %d, n = %d\n", - FN_NAME, xRes, yRes, nBuffers)); - - if ( !sstHW ) return FXFALSE; - - /* Take pBufDesc apart */ - while (nBuffers-- > 0) { - switch (pBufDesc->bufType) { - case INIT_BUFFER_FRONTBUFFER: - GDBG_INFO((80, "%s: %s: 0x%x\n", - FN_NAME, bufTypeNames[pBufDesc->bufType], pBufDesc)); - pFront = pBufDesc; - break; - case INIT_BUFFER_BACKBUFFER: - GDBG_INFO((80, "%s: %s: 0x%x\n", - FN_NAME, bufTypeNames[pBufDesc->bufType], pBufDesc)); - pBack = pBufDesc; - break; - case INIT_BUFFER_AUXBUFFER: - GDBG_INFO((80, "%s: %s: 0x%x\n", - FN_NAME, bufTypeNames[pBufDesc->bufType], pBufDesc)); - pAux = pBufDesc; - break; - case INIT_BUFFER_FIFOBUFFER: - GDBG_INFO((80, "%s: %s: 0x%x\n", - FN_NAME, bufTypeNames[pBufDesc->bufType], pBufDesc)); - pFifo = pBufDesc; - break; - case INIT_BUFFER_TRIPLEBUFFER: - GDBG_INFO((80, "%s: %s: 0x%x\n", - FN_NAME, bufTypeNames[pBufDesc->bufType], pBufDesc)); - pTriple = pBufDesc; - break; - default: - break; - } - pBufDesc++; - } - if (pFront == NULL) return FXFALSE; - if (pBack == NULL) pBack = pFront; - if (pTriple == NULL) pTriple = pFront; - if (pAux == NULL) pAux = pFront; - - GDBG_INFO((80,"pFront = %.08x, pBack = %.08x, pTriple = %.08x, pAux = %.08x, pFifo = %.08x\n", - pFront, pBack, pTriple, pAux, pFifo)); - - if (myGetenv("SST96_FORCEALIGN")) { - FxU32 F, B, T, A; - - sscanf(myGetenv("SST96_FORCEALIGN"), "%x,%x,%x,%x", &F, &B, &T, &A); - GDBG_INFO((80, "!!!!!GROSS HACK... forcing values!!!!!\n")); - pFront->bufOffset = F; - pBack->bufOffset = B; - pTriple->bufOffset = T; - pAux->bufOffset = A; - } - - if (pFront) - GDBG_INFO((80,"F = %.08x, s= %6d\n", pFront->bufOffset, pFront->bufStride)); - if (pBack) - GDBG_INFO((80,"B = %.08x, s= %6d\n", pBack ->bufOffset, pBack ->bufStride)); - if (pTriple) - GDBG_INFO((80,"T = %.08x, s= %6d\n", pTriple ->bufOffset, pTriple ->bufStride)); - if (pAux) - GDBG_INFO((80,"A = %.08x, s= %6d\n", pAux ->bufOffset, pAux ->bufStride)); - if (pFifo) - GDBG_INFO((80,"C = %.08x, s= %6d\n", pFifo ->bufOffset, pFifo ->bufStride)); - - /* Fill the arrays here */ - bI[0].dfbBase = pFront->bufOffset; - bI[0].dfbStride = pFront->bufStride; - bI[0].dfbTop = pFront->bufOffset + (yRes-1) * pFront->bufStride; - - bI[1].dfbBase = pBack->bufOffset; - bI[1].dfbStride = pBack->bufStride; - bI[1].dfbTop = pBack->bufOffset + (yRes-1) * pBack->bufStride; - - if (pTriple) { - bI[2].dfbBase = pTriple->bufOffset; - bI[2].dfbStride = pTriple->bufStride; - bI[2].dfbTop = pTriple->bufOffset + (yRes-1) * pTriple->bufStride; - } - - ab0Base = pAux->bufOffset; - ab0Stride = pAux ->bufStride; - ab0Top = pAux->bufOffset + (yRes-1) * pAux->bufStride; - - for (i=0; ibufOffset; - fifoEnd = pFifo->bufOffset + pFifo->bufStride; - } - - GDBG_INFO((80, "%s: Returning TRUE\n", FN_NAME)); - return FXTRUE; -#undef FN_NAME -} /* init96LoadBufRegs */ - -/*------------------------------------------------------------------- - Function: init96GetFBVram - Date: 24-Apr-97 - Implementor(s): pgj - Library: Test for 2Mb or 4Mb board - Description: This routine returns the number of bytes of VRAM - on the board. Currently only 2 or 4 MB are returned on - success. Zero is returned of the board is not mapped. - XXX This should be refined in the future. XXX - - Arguments: none - - Return: n, where n == available VRAM in bytes on the board - -------------------------------------------------------------------*/ -INITVG96ENTRY(init96GetFBVram, FxU32 , (void) ) -{ -#define FN_NAME "init96GetFBVram" - VG96Info info; - - if (curHALData->initGetInfo) { - (*curHALData->initGetInfo)(&info); - GDBG_INFO((80, "%s: returning %d bytes\n", FN_NAME, info.vg96Ram)); - return info.vg96Ram; - } else { - GDBG_INFO((80, "%s: curHALData not valid!!!\n", FN_NAME)); - return 0; - } - -#undef FN_NAME -} /* init96GetFBVram */ diff --git a/glide2x/sst1/init/init96/init96.h b/glide2x/sst1/init/init96/init96.h deleted file mode 100644 index f9d1067..0000000 --- a/glide2x/sst1/init/init96/init96.h +++ /dev/null @@ -1,69 +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$ -** -** SST-96 Initialization library -*/ - - -#ifndef __INIT96_H__ -#define __INIT96_H__ - -/* Partners' Chips */ -#define AT3D 1 /* Alliance Semiconductor AT3D*/ -#define T9685 2 /* Trident 9685 */ -#define MR510 3 /* MRTI MR510 */ -#define MX86251 4 /* Macronics MX 86251 */ - -#ifndef INIT96_LIB -#define INITVG96ENTRY(name, retType, args) FX_ENTRY retType FX_CALL name args -#else -#define INITVG96ENTRY(name, retType, args) FX_EXPORT retType FX_CSTYLE name args -#endif - -typedef void Init96WriteMethod( FxU32 *addr, FxU32 data ); - -INITVG96ENTRY(init96MapBoard, FxBool, - (void *rD, void *info, FxU16 vID, FxU16 dID) ); -INITVG96ENTRY(init96SetVideo, FxBool , - (FxU32 hWnd, GrScreenResolution_t sRes, - GrScreenRefresh_t vRefresh, InitColorFormat_t cFormat, - InitOriginLocation_t yOrigin,int nColBuffers, - int nAuxBuffers, InitRegisterDesc *rd, int *xres, - int *yres, int *fbStride)); -INITVG96ENTRY(init96RestoreVideo, void, ( InitRegisterDesc *regDesc )); -INITVG96ENTRY(init96EnableTransport, FxBool, ( InitFIFOData *info, InitRegisterDesc* regDesc)); -INITVG96ENTRY(init96DisableTransport, void, ( void )); -INITVG96ENTRY(init96Swap, void , - (FxU32 code, InitRegisterDesc *regDesc, - Init96WriteMethod *wcb) ); -INITVG96ENTRY(init96Idle, void , (Init96WriteMethod *wcb) ); -INITVG96ENTRY(init96GetBufferPtr, void*, - (InitBuffer_t buffer, int *strideBytes )); -INITVG96ENTRY(init96RenderBuffer, void, - (InitBuffer_t buffer,Init96WriteMethod *wcb)); -INITVG96ENTRY(init96Origin, void, - (InitOriginLocation_t origin, Init96WriteMethod *wcb)); -INITVG96ENTRY(init96Control, FxBool , (FxU32 code, InitRegisterDesc *rd) ); -INITVG96ENTRY(init96WrapFIFO, FxBool , - (InitRegisterDesc *rd, InitFIFOData *fifoData) ); -INITVG96ENTRY(init96GetFBVram, FxU32 , (void) ); -#endif /* __INIT96_H__ */ diff --git a/glide2x/sst1/init/init96/initat3d.h b/glide2x/sst1/init/init96/initat3d.h deleted file mode 100644 index 7a65ddf..0000000 --- a/glide2x/sst1/init/init96/initat3d.h +++ /dev/null @@ -1,51 +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$ -** -*/ -#ifndef __INITAT3D_H__ -#define __INITAT3D_H__ - -#define AT3D_IN_VSYNC (_inp(INPUT_STATUS_1) & VERTICAL_RETRACE_ACTIVE) - -#ifdef INIT_AT3D_LIB -#define INITAT3DENTRY(fun, type, args) FX_EXPORT type FX_CALL fun args -#else -#define INITAT3DENTRY(fun, type, args) FX_ENTRY type FX_CSTYLE fun args -#endif -INITAT3DENTRY(initAT3DGetHALData, Init96HALData *, (void) ); -INITAT3DENTRY(initAT3DAperture, FxBool, (InitRegisterDesc *rd) ); -INITAT3DENTRY(initAT3DSetVideo, FxBool, ( GrScreenResolution_t res, GrScreenRefresh_t refresh, FxU32 *xr, FxU32 *yr )); -INITAT3DENTRY(initAT3DEnableRegs, FxBool,(InitRegisterDesc *rd)); -INITAT3DENTRY(initAT3DDisableRegs,FxBool,(InitRegisterDesc *rd)); -#ifdef H3D -INITAT3DENTRY(initAT3DUseTiles, int, (InitRegisterDesc *rd, - FxU32 *buffers, FxU32 nBuffers, - FxU32 strideInBytes, FxU32 width, FxU32 height, FxU32 pageFlipping)); -#else -INITAT3DENTRY(initAT3DUseTiles, int, (InitRegisterDesc *rd, - FxU32 *buffers, FxU32 nBuffers, - FxU32 strideInBytes, FxU32 width, FxU32 height)); -#endif -INITAT3DENTRY(initAT3DGetInfo, FxBool,(VG96Info *info)); -#endif /* __INITAT3D_H__ */ - diff --git a/glide2x/sst1/init/init96/initmcrx.c b/glide2x/sst1/init/init96/initmcrx.c deleted file mode 100644 index d8d454f..0000000 --- a/glide2x/sst1/init/init96/initmcrx.c +++ /dev/null @@ -1,612 +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$ -** -*/ -static char revString[] = "@#%$Workfile: initmcrx.c $ $Revision$"; - -#include <3dfx.h> - -#include -#include -#include -#ifndef __linux__ -#include -#else -#include -#define _inp(port) pioInByte(port); -#define _outp(port,data) pioOutByte(port, data); -#define _outpw(port,data) pioOutWord(port, data); -#endif -#ifdef __DOS32__ -#include -#endif - -#ifdef __WIN32__ -#include -#endif /* __WIN32__ */ - -#define INIT_MCRX_LIB -#define FX_DLL_DEFINITION -#include -#include -#include - - -#include -#include "fxinit96.h" -#include "initmcrx.h" - -#ifndef BIT -#define BIT(a) (1 << a) -#endif - -/* Global Data */ -static Init96HALData mcrxHALData = { - 0x2000000, - initMCRXAperture, - initMCRXSetVideo, - initMCRXEnableRegs, - initMCRXDisableRegs, - initMCRXWrapFIFO, - initMCRXUseTiles, - initMCRXGetInfo, - NULL /* initMCRXSwapTiles */ -}; - - -#if 0 /* ??? needed??? XXX */ -static FxBool tiling; -#endif - -/*------------------------------------------------------------------- - Function: intiMCRXGetHALData - Date: 09-May-97 - Implementor(s): dow - Library: Init Code for MCRX - Description: - - Arguments: - - Return: - address of mcrxHALData - -------------------------------------------------------------------*/ -INITMCRXENTRY(initMCRXGetHALData, Init96HALData *, (void) ) -{ -#define FN_NAME "intiMCRXGetHALData" - return &mcrxHALData; -#undef FN_NAME -} /* intiMCRXGetHALData */ - -/*------------------------------------------------------------------- - Function: initMCRXAperture - Date: 3-May-97 - Implementor(s): dow - Library: Init Code for MCRX - Description: - Initialize rd pointers to access apertures - Arguments: - - Return: - -------------------------------------------------------------------*/ -INITMCRXENTRY(initMCRXAperture, FxBool , (InitRegisterDesc *rd) ) -{ -#define FN_NAME "initMCRXAperture" - FxBool - rVal = FXTRUE; - - GDBG_INFO((80, "%s:\n", FN_NAME)); - - rd->hwDep.VG96RegDesc.partnerRegPtr = (FxU32 *) - ((FxU32) rd->hwDep.VG96RegDesc.baseAddress + - 0x2000000 - 0x20000); - - GDBG_INFO((80, "%s: Setting partnerRegPtr to 0x%x\n", - FN_NAME, rd->hwDep.VG96RegDesc.partnerRegPtr)); - -#if 1 - rd->hwDep.VG96RegDesc.serialStatus = (FxU32 *) - ((FxU32) rd->hwDep.VG96RegDesc.partnerRegPtr + 0x700); -#else - GDBG_INFO((80, "%s: Working around invalid serial status\n", FN_NAME)); - rd->hwDep.VG96RegDesc.serialStatus = - &rd->hwDep.VG96RegDesc.baseAddress[0x100000]; -#endif - GDBG_INFO((80, "%s: Setting seial status to 0x%x\n", FN_NAME, rd->hwDep.VG96RegDesc.serialStatus)); - - /* BOGUS */ - rd->hwDep.VG96RegDesc.fifoApertureBase = - (FxU32 *) (((FxU32)rd->hwDep.VG96RegDesc.baseAddress) + 0x400000); - - GDBG_INFO((80, "%s: returning TRUE\n", FN_NAME)); - - return rVal; - -#undef FN_NAME -} /* initMCRXAperture */ - -/* FIXME !! jdt - need to add more resolutions to dos */ -INITMCRXENTRY(initMCRXSetVideo, FxBool, (GrScreenResolution_t res, GrScreenRefresh_t refresh, FxU32 *xr, FxU32 *yr )) -{ -#define FN_NAME "initMCRXSetVideo" - FxBool rv = FXTRUE; -#if defined(INIT_ACCESS_DIRECT) && defined( __DOS32__ ) - union REGS r0, r1; -#endif - - GDBG_INFO((80, "%s: \n", FN_NAME)); - -#if defined(INIT_ACCESS_DIRECT) && defined( __DOS32__ ) - switch( res ) { - case GR_RESOLUTION_320x200: - /* Set up VESA Mode 0x136 - 320x200x16 */ - r1.w.ax = 0x4f02; - r1.w.bx = 0x0136; - *xr = 320; - *yr = 200; - rv = FXTRUE; - break; - case GR_RESOLUTION_320x240: - /* Set up VESA Mode 0x137 - 320x240x16 */ - r1.w.ax = 0x4f02; - r1.w.bx = 0x0137; - *xr = 320; - *yr = 240; - rv = FXTRUE; - break; - case GR_RESOLUTION_512x384: - /* Set up VESA Mode 0x139 - 512x384x16 */ - r1.w.ax = 0x4f02; - r1.w.bx = 0x0139; - *xr = 512; - *yr = 384; - rv = FXTRUE; - break; - case GR_RESOLUTION_640x480: - /* Set up VESA Mode 0x111 - 640x480x16 */ - r1.w.ax = 0x4f02; - r1.w.bx = 0x0111; - *xr = 640; - *yr = 480; - rv = FXTRUE; - break; - case GR_RESOLUTION_800x600: - /* Set up VESA Mode 0x114 - 800x600x16 */ - r1.w.ax = 0x4f02; - r1.w.bx = 0x0114; - *xr = 800; - *yr = 600; - rv = FXTRUE; - break; - default: - rv = FXFALSE; - break; - } - - if (rv == FXTRUE) { - GDBG_INFO((80, "initMCRXSetVideo: Enabling VESA modes\n")); - r0.w.ax = 0x6483; - r0.w.bx = 0x0060; - int386( 0x10, &r0, &r0 ); - - GDBG_INFO((80, "initMCRXSetVideo: Setting video mode %dx%dx16\n", - *xr, *yr)); - int386( 0x10, &r1, &r1 ); - } - -#endif - GDBG_INFO((80, "%s: returning %s\n", FN_NAME, rv?"TRUE":"FALSE")); - return rv; -#undef FN_NAME -} /* initMCRXSetVideo */ - -/*------------------------------------------------------------------- - Function: initMCRXEnableRegs - Date: 07-Feb-97 - Implementor(s): dow - Library: Init Code for MCRX - Description: - - Do all setup necessary to enable direct writes to JR Space - - Arguments: - rd - pointer to register description - - Return: - True if success, False if Failure - -------------------------------------------------------------------*/ -INITMCRXENTRY(initMCRXEnableRegs, FxBool, (InitRegisterDesc *rd)) -{ -#define FN_NAME "initMCRXEnableRegs" - FxU32 - tmp; - FxU8 - crtcIndex; - FxU16 - protState; - - const char *envVal; - - GDBG_INFO((80, "%s:\n", FN_NAME)); - - GDBG_INFO((80, "%s: Unprotect\n", FN_NAME)); - - GDBG_INFO((80, "%s: Save CRTC Index\n", FN_NAME)); - INP(0x3c4, crtcIndex); - - GDBG_INFO((80, "%s: Save Extended Registers Protection State\n", - FN_NAME)); - - OUTP(0x3d4, 0x19); - INP(0x3d5, protState); - - protState <<= 8; - protState |= 0x19; - - GDBG_INFO((80, "%s: Enabling Access to Extended Registers\n", FN_NAME)); - OUTPW(0x3d4, 0x8819); - - /* Getting initial values of the mclock for later restore */ - GDBG_INFO((80, "%s: Getting macronix mclock registers\n", FN_NAME)); - OUTP(0x3C4, 0x1A); - INP(0x3C5, rd->hwDep.VG96RegDesc.mclockHi); - - OUTP(0x3C4, 0x1B); - INP(0x3C5, rd->hwDep.VG96RegDesc.mclockLo); - GDBG_INFO((80, "%s: mclock registers: (0x%X : 0x%X)\n", FN_NAME, - (FxU32)rd->hwDep.VG96RegDesc.mclockHi, (FxU32)rd->hwDep.VG96RegDesc.mclockHi)); - - GDBG_INFO((80, "%s: Enabling FBI Jr.\n", FN_NAME)); - OUTPW(0x3C4, 0x001F); - - GDBG_INFO((80, "%s: Setting clock to 50MHz\n", FN_NAME)); - OUTPW(0x3c4, 0x011a); - OUTPW(0x3c4, 0x061b); - - /* Macronix reset propogation */ - GDBG_INFO((80, "%s: Macronix reset\n", FN_NAME)); - OUTPW(0x3c4, 0x081c); - OUTPW(0x3c4, 0x001c); - - GDBG_INFO((80, "%s: Hard Reset of FBI Jr.\n", FN_NAME)); - OUTPW(0x3d4, 0x0029); - OUTPW(0x3d4, 0x0129); - - GDBG_INFO((80, "%s: Enabling PUMA\n", FN_NAME)); - CRTC_GET(0x28, tmp); - tmp |= 1; - if (envVal = myGetenv("MCRX_28")) sscanf(envVal, "%x", &tmp); - CRTC_SET(0x28, tmp); - - GDBG_INFO((80, "%s: Restoring Protection\n", FN_NAME)); - OUTP(0x3d4, protState); - - GDBG_INFO((80, "%s: Restoring Sequencer Index\n", FN_NAME)); - OUTP(0x3c4, crtcIndex); - - return FXTRUE; - -#undef FN_NAME -} /* initMCRXEnableRegs */ - - -/* FIXME!!! jdt - puma/ram timing fixes need to go here */ -INITMCRXENTRY(initMCRXDisableRegs,FxBool,(InitRegisterDesc *rd)) -{ -#define FN_NAME "initMCRXDisableRegs" - FxU8 - seqSave, crtcSave; - - FxU16 - protState; - - FxU32 - tmp; - - GDBG_INFO((80, "%s:\n", FN_NAME)); - - GDBG_INFO((80, "%s: Saving Sequencer Index\n", FN_NAME)); - INP(0x3c4, seqSave); - - GDBG_INFO((80, "%s: Saving CRTC Index\n", FN_NAME)); - INP(0x3d4, crtcSave); - - GDBG_INFO((80, "%s: Saving Protection State\n", FN_NAME)); - OUTP(0x3d4, 0x19); - INP(0x3d5, protState); - - protState <<= 9; - protState |= 0x19; - - GDBG_INFO((80, "%s: Enabling access to extended registers\n", FN_NAME)); - OUTPW(0x3d4, 0x8819); - - /* Reset 3Dfx chip via macronix */ - GDBG_INFO((80, "%s: Reset 3Dfx via macronix\n", FN_NAME)); - OUTPW(0x3d4, 0x0029); - OUTPW(0x3d4, 0x0129); - - GDBG_INFO((80, "%s: Disabling PUMA\n", FN_NAME)); - CRTC_GET(0x28, tmp); - GDBG_INFO((80, "%s: crtc 0x28: 0x%X\n", FN_NAME, tmp)); - tmp &= ~1; - CRTC_SET(0x28, tmp); - - GDBG_INFO((80, "%s: Turning off FBI Jr.\n", FN_NAME)); - OUTPW(0x3c4, 0x061f); - - /* Restore the mclock */ - { - FxU16 tempMclock; - - GDBG_INFO((80, "%s: Restoring mclock\n", FN_NAME)); - tempMclock = (0x1A | (rd->hwDep.VG96RegDesc.mclockHi << 8)); - OUTPW(0x3C4, tempMclock); - - tempMclock = (0x1B | (rd->hwDep.VG96RegDesc.mclockLo << 8)); - OUTPW(0x3C4, tempMclock); - - /* Macronix MCLK reset propogation */ - OUTPW(0x3C4, 0x081C); - OUTPW(0x3C4, 0x001C); - } - - GDBG_INFO((80, "%s: Restoring Protection\n", FN_NAME)); - OUTPW(0x3df, protState); - - GDBG_INFO((80, "%s: Restoring CRTC Index\n", FN_NAME)); - OUTP(0x3d4, crtcSave); - - GDBG_INFO((80, "%s: Restoring Sequencer Index\n", FN_NAME)); - OUTP(0x3c4, seqSave); - - return FXTRUE; - -#undef FN_NAME -} /* initMCRXDisableRegs */ - -/*------------------------------------------------------------------- - Function: initMCRXWrapFIFO - Date: 20-Feb-97 - Implementor(s): tarolli - Library: Init Code for MCRX - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -INITMCRXENTRY(initMCRXWrapFIFO, FxBool, (InitRegisterDesc *rd, InitFIFOData *fd) ) -{ -#define FN_NAME "initMCRXWrapFIFO" - return FXFALSE; -#undef FN_NAME -} /* initMCRXWrapFIFO */ - -#define MAX_BUF 3 - -static unsigned char magic[MAX_BUF][3] = { - { 0x0d, 0x0c, 0x21 }, - { 0x71, 0x72, 0x73 }, - /* chd - Fixme! - * Bogus numbers. Does triple buffering work on Macronix? - * - * dpc - 23 jan 1998 - - * Donny just told me this so hopefully this will work. - */ - { 0x74, 0x75, 0x76 } -}; - -INITMCRXENTRY(initMCRXSwapTiles, FxBool, (InitRegisterDesc* rd)) -{ -#define FN_NAME "initMCRXSwapTiles" - FxU8 crtcSwapStatus; - FxU8 crtcSwapControl; - - /* Get the # of buffers swapping */ - OUTP(0x3D4, 0x70); - INP(0x3D5, crtcSwapControl); - - /* Get the current active buffer setting */ - OUTP(0x3D4, 0x7A); - INP(0x3D5, crtcSwapStatus); - - /* Bits 0-1 indicate the current active buffer. Check to see if we - * need to wrap this and go to the next buffer. - */ - { - const FxU8 bufferBits = (crtcSwapStatus & 0x03); - const FxU8 maxBufferBits = (((crtcSwapControl & 0x08) == 0) ? 1 : 2); - - crtcSwapStatus = ((crtcSwapStatus & ~0x03) | - ((bufferBits == maxBufferBits) ? 0x00 : bufferBits + 1)); - CRTC_SET(0x7A, crtcSwapStatus); - } - - /* We have no way of knowing that this worked so of course we always - * return success. - */ - return FXTRUE; -#undef FN_NAME -} - -/*------------------------------------------------------------------- - Function: initMCRXUseTiles - Date: 07-Feb-97 (Moved into initMCRX from init96) - Implementor(s): pgj, dow - Library: Init Code for MCRX - Description: - - Arguments: - atmm: Pointer to base of MCRX - buffers: Pointer to array of offsets to buffers - nBuffers: Total number of buffers - backBuffer: FB offset of back buffer - strideInBytes: Tile width in bytes - - Return: - 1 if successful, 2 if renderbuffers need to be swapped. - -------------------------------------------------------------------*/ -#ifdef H3D -INITMCRXENTRY(initMCRXUseTiles, int, (InitRegisterDesc *rd, - FxU32 *buffers, - FxU32 nBuffers, - FxU32 strideInBytes, - FxU32 Width, FxU32 Height, FxU32 PageFlipping)) -#else -INITMCRXENTRY(initMCRXUseTiles, int, (InitRegisterDesc *rd, - FxU32 *buffers, - FxU32 nBuffers, - FxU32 strideInBytes, - FxU32 Width, FxU32 Height)) -#endif -{ -#define FN_NAME "initMCRXUseTiles" - - int ret = 1; - unsigned int i; - - FxU32 - dwordOffset; - - FxU8 - regVal; - - FxU32 - tmp; - - const char *envVal; - - GDBG_INFO((80, "%s:\n", FN_NAME)); - - regVal = _inp(VGA_MISC_OUTPUT_READ); - /* Mask off bit 7 */ - regVal |= (1<<7); - _outp(VGA_MISC_OUTPUT_WRITE, regVal); - - /*--------------------------------- - CONFIGURE TILES - ---------------------------------*/ - for (i=0; i < nBuffers; i++) { - FxU32 - buf = buffers[i]; - - GDBG_INFO((80, "%s: Setting up buffer %d\n", FN_NAME, i)); - - dwordOffset = buf >> 2; - - GDBG_INFO((80, "%s: Buffer[%d] = 0x%x, dwordOffset = 0x%x\n", - FN_NAME, i, buf, dwordOffset)); - - GDBG_INFO((80, "%s: Writing bits 0-7 of buffer 0 offset\n", FN_NAME)); - tmp = (FxU8) (dwordOffset & 0xff); - - CRTC_SET(magic[i][0], tmp); - - GDBG_INFO((80, "%s: Writing bits 8-15 of buffer 0 offset\n", FN_NAME)); - tmp = (FxU8) ((dwordOffset >> 8) & 0xff); - CRTC_SET(magic[i][1], tmp); - - GDBG_INFO((80, "%s: Writing bits 16-19 of buffer 0 offset\n", FN_NAME)); - tmp = (FxU8) ((dwordOffset >> 16) & 0xf); - CRTC_SET(magic[i][2], tmp); - } - - GDBG_INFO((80, "%s: Setting up Swap Control\n", FN_NAME)); - tmp = 0x01; - - /* dpc - 26 han 1998 - * If we are triple buffering we need to enable this on the actual - * macronix part as well. This is set by enabling bit 3 of the crtc - * register. - */ - if (nBuffers == 3) tmp |= 0x08; - mcrxHALData.initSwapTiles = initMCRXSwapTiles; - - if (envVal = myGetenv("MRCX_71")) - sscanf(envVal, "%x", &tmp); - CRTC_SET(0x70, tmp); - - /* Reset the current display buffer bits (0-1) */ - { - FxU8 crtcSwapBuffer; - - OUTP(0x3D4, 0x7A); - INP(0x3D5, crtcSwapBuffer); - - crtcSwapBuffer &= ~0x03; - CRTC_SET(0x7A, crtcSwapBuffer); - } - - return ret; - -#undef FN_NAME -} /* initMCRXUseTiles */ - - -/*------------------------------------------------------------------- - Function: initMCRXGetInfo - Date: 28-Apr-97 - Implementor(s): pgj, dow - Library: Init Code for MCRX - Description: - - get information about MCRX - - Arguments: - info - pointer to info struct - - Return: - True if success, False if Failure - -------------------------------------------------------------------*/ -INITMCRXENTRY(initMCRXGetInfo,FxBool,(VG96Info *info)) -{ -#define FN_NAME "initMCRXGetInfo" - FxU32 mBytesPow; - FxU8 res; - - GDBG_INFO((80, "%s:\n", FN_NAME)); - - CRTC_GET(0x1a, res); - - /* We care about bit 5 & 6 */ - mBytesPow = ((res >> 5) & 3); - - /* Watcom warning suppression */ - revString[0] = revString[0]; - - info->vgaChip = 0; - info->vg96Rev = 0; - info->nTFX = 1; - info->tfxRev = 1; - info->tfxRam = 2; - - info->vg96Ram = (0x100000 << mBytesPow); - - GDBG_INFO((80, "%s: frame buffer has 0x%x bytes\n", FN_NAME, info->vg96Ram)); - - return FXTRUE; - -#undef FN_NAME -} /* initMCRXGetInfo */ - - diff --git a/glide2x/sst1/init/init96/initmcrx.h b/glide2x/sst1/init/init96/initmcrx.h deleted file mode 100644 index 1a9589e..0000000 --- a/glide2x/sst1/init/init96/initmcrx.h +++ /dev/null @@ -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 -** -** -** $Revision$ -** $Date$ -** -*/ -#ifndef __INITMCRX_H__ -#define __INITMCRX_H__ -#define SETMCRX(d,s) d = s -#define GETMCRX(s) s - -#ifdef INIT_MCRX_LIB -#define INITMCRXENTRY(fun, type, args) FX_EXPORT type FX_CALL fun args -#else -#define INITMCRXENTRY(fun, type, args) FX_ENTRY type FX_CSTYLE fun args -#endif -INITMCRXENTRY(initMCRXGetHALData, Init96HALData *, (void) ); -INITMCRXENTRY(initMCRXAperture, FxBool, (InitRegisterDesc *rd) ); -INITMCRXENTRY(initMCRXSetVideo, FxBool, ( GrScreenResolution_t res, GrScreenRefresh_t refresh, FxU32 *xr, FxU32 *yr )); -INITMCRXENTRY(initMCRXEnableRegs, FxBool,(InitRegisterDesc *rd)); -INITMCRXENTRY(initMCRXDisableRegs,FxBool,(InitRegisterDesc *rd)); -INITMCRXENTRY(initMCRXWrapFIFO, FxBool , (InitRegisterDesc *rd, InitFIFOData *fd) ); -#ifdef H3D -INITMCRXENTRY(initMCRXUseTiles, int, (InitRegisterDesc *rd, - FxU32 *buffers, FxU32 nBuffers, - FxU32 strideInBytes, FxU32 width, FxU32 height, FxU32 PageFlipped)); -#else -INITMCRXENTRY(initMCRXUseTiles, int, (InitRegisterDesc *rd, - FxU32 *buffers, FxU32 nBuffers, - FxU32 strideInBytes, FxU32 width, FxU32 height)); -#endif -INITMCRXENTRY(initMCRXGetInfo, FxBool,(VG96Info *info)); -#endif /* __INITMCRX_H__ */ - diff --git a/glide2x/sst1/init/init96/initvga.h b/glide2x/sst1/init/init96/initvga.h deleted file mode 100644 index 4f33098..0000000 --- a/glide2x/sst1/init/init96/initvga.h +++ /dev/null @@ -1,121 +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$ -** -*/ - -#ifndef _INITPIO_H_ -#define _INITPIO_H_ - -#if defined(__WATCOMC__) -#define _inp inp -#define _outp outp -#define _outpw outpw -#endif - -/* -** Some Standard VGA Registers -*/ -/* Reading */ -#define VGA_MISC_OUTPUT_READ 0x3cc - -/* Writing */ -#define VGA_MISC_OUTPUT_WRITE 0x3c2 - -/* Read/Write */ -#define VGA_REGISTER_INPUT_STATUS_1_MONO 0x3BA -#define VGA_REGISTER_INPUT_STATUS_1_COLOR 0x3DA -#define VGA_INPUT_STATUS_1C 0x3DA -#define VIS1C_PIXEL_DISPLAY_INACTIVE BIT(0) -#define VIS1C_VERTICAL_RETRACE_ACTIVE BIT(3) - -#define VGA_REGISTER_CRTC 0x3D4 -#define VR_CRTC_SERIAL_START_ADDRESS_HI_INDEX 0x0C -#define VR_CRTC_SERIAL_START_ADDRESS_LO_INDEX 0x0D -#define AR_CRTC_SERIAL_OVERFLOW_INDEX 0x1C - -/* General Port I/O */ -#ifdef GDBG_INFO_ON - -#define OUTP(port,val)\ -GDBG_INFO((80, "%s: Writing 0x%x to port 0x%x\n", FN_NAME, val, port));\ -_outp(port, val) - -#define OUTPW(port,val)\ -GDBG_INFO((80, "%s: Writing 0x%x to port 0x%x\n", FN_NAME, val, port));\ -_outpw(port, val) - - -#define INP(port, val)\ -val = _inp(port);\ -GDBG_INFO((80, "%s: Read 0x%x from port 0x%x\n", FN_NAME, val, port)) - -#define INPW(port, val)\ -val = _inpW(port);\ -GDBG_INFO((80, "%s: Read 0x%x from port 0x%x\n", FN_NAME, val, port)) - -#else - -#define OUTP(port, val) _outp(port, val) -#define INP(port, val) val = _inp(port) - -#define OUTPW(port, val) _outpw(port, val) -#define INPW(port, val) val = _inpw(port) - -#endif - -/* Macros for Sequencer registers */ -#define SEQU_INDEX 0x3c4 -#define SEQU_DATA 0x3c5 - -/* Macros for CRTC registers */ -#define CRTC_INDEX 0x3d4 -#define CRTC_DATA 0x3d5 - -#ifdef GDBG_INFO_ON - -#define SEQU_SET(reg,val)\ -GDBG_INFO((80, "%s: Writing 0x%x to Sequencer Index 0x%x\n", FN_NAME, val, reg));\ -_outp(SEQU_INDEX, reg); _outp(SEQU_DATA, val) -#define SEQU_GET(reg,val)\ -_outp(SEQU_INDEX, reg);val = _inp(SEQU_DATA);\ -GDBG_INFO((80, "%s: Read 0x%x from Sequencer Index 0x%x\n", val, reg)); - -#define CRTC_SET(reg,val)\ -GDBG_INFO((80, "%s: Writing 0x%x to CRTC Index 0x%x\n", FN_NAME, val, reg));\ -_outp(CRTC_INDEX, reg); _outp(CRTC_DATA, val) -#define CRTC_GET(reg,val)\ -_outp(CRTC_INDEX, reg); val = _inp(CRTC_DATA);\ -GDBG_INFO((80, "%s: Read 0x%x from CRTC Index 0x%x\n", FN_NAME, val, reg)) - -#else - -#define SEQU_SET(reg,val) _outp(SEQU_INDEX, reg); _outp(SEQU_DATA, val) -#define SEQU_GET(reg,val) _outp(SEQU_INDEX, reg); val = _inp(SEQU_DATA) - -#define CRTC_SET(reg,val) _outp(CRTC_INDEX, reg); _outp(CRTC_DATA, val) -#define CRTC_GET(reg,d) _outp(CRTC_INDEX, reg); d = _inp(CRTC_DATA) - -#endif - - -#endif /* _INITPIO_H_ */ diff --git a/glide2x/sst1/init/init96/lindrvr.c b/glide2x/sst1/init/init96/lindrvr.c deleted file mode 100644 index 14621a0..0000000 --- a/glide2x/sst1/init/init96/lindrvr.c +++ /dev/null @@ -1,575 +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 -#include -#include -#ifndef DUMMY -#include -#endif -#include -#include -#include -#include -#include -#include -#include - -/* 3Dfx Headers */ -#include <3dfx.h> -#include -#include -#include -#define FX_DLL_DEFINITION -#include -#include - -#include - -/* Local Headers */ -#include "init96.h" -#include "fxinit96.h" - -#define VG96_BUF_MAGIC 0x666 -#define FIFOSIZE (65536<<1) - -FxBool tripleBuffering = 0; - -#define NUM_BUFS 6 - -#ifndef DUMMY -static Display *dpy = 0; -static int screenNum = 0; -static int screenWidth = 0; -static void* screenPhys = 0; -static int screenMem = 0; -static GC xgc = 0; -static Window hWndApp = 0; -static FxU32 Width = 0; -static FxU32 Height = 0; -static FxBool IsFullScreen = 0; -static InitBufDesc_t BufDesc[NUM_BUFS] = {0}; -static XF86VidModeModeInfo **vidModes = 0; - -static Pixmap pixBack = 0; -static Pixmap pixAux = 0; -static Pixmap pixTriple = 0; -static Pixmap pixFifo = 0; -static void *addrFront = 0; -static void *addrBack = 0; -static void *addrAux = 0; -static void *addrTriple = 0; -static void *addrFifo = 0; -#endif - -#ifdef DUMMY -FxBool -linOpen( - FxU32 hWindow, - GrScreenResolution_t sRes, - GrScreenRefresh_t vRefresh, - InitColorFormat_t cFormat, - InitOriginLocation_t yOrigin, - int nColBuffers, - int nAuxBuffers, - InitBufDesc_t *pBufDesc, // return values - int *width, - int *height, - InitSwapType_t *swapType -) -{ - return FXFALSE; -} - -FxBool linClose() -{ - return FXFALSE; -} - -FxBool -linControl(FxU32 code, InitBufDesc_t *pBufDesc, int *width, int *height) -{ - return FXFALSE; -} - -void -linSwap(FxU32 code) -{} - -void -linFlip(FxU32 buffer) -{} - -#else - -static FxBool -ErrorMessage(Window win, char *err) -{ - fprintf(stderr, "Error %s \n", err); - return FXFALSE; -} /* ErrorMessage */ - -FxBool linSetup() { - int eventbase, errorbase; - int banksize; - - if (dpy!=0) return FXTRUE; - dpy=XOpenDisplay(""); - if (!dpy) - return ErrorMessage(hWndApp, "Linux VRush only runs under local X\n"); - if (XF86DGAQueryExtension(dpy, &eventbase, &errorbase)) { - int major, minor; - XF86DGAQueryVersion(dpy, &major, &minor); - if (major>1 && minor<0) { - XCloseDisplay(dpy); - return ErrorMessage(hWndApp, "Linux VRush requires DGA version 1.0\n"); - } - } - if (XF86RushQueryExtension(dpy, &eventbase, &errorbase)) { - int major, minor; - XF86RushQueryVersion(dpy, &major, &minor); - if (major>1 && minor<0) { - XCloseDisplay(dpy); - return ErrorMessage(hWndApp, "Linux VRush requires Rush version 1.0\n"); - } - } - screenNum=XDefaultScreen(dpy); - XF86DGAGetVideoLL(dpy, screenNum, (int*)&screenPhys, &screenWidth, &banksize, - &screenMem); - screenMem*=1024; - return FXTRUE; -} - -static FxBool -cvtAddrToBufDesc(void *pixAddr, InitBufDesc_t *pDesc) { - pDesc->bufOffset = (FxU32)pixAddr; - pDesc->bufStride = (FxI32)(2*screenWidth); - pDesc->bufBPP = (FxI32)16; - return FXTRUE; -} - -static int -cvtXToGlideDesc(InitBufDesc_t *pDesc) { - InitBufDesc_t *dFront = &pDesc[0]; - InitBufDesc_t *dBack = &pDesc[1]; - InitBufDesc_t *dAux = &pDesc[2]; - InitBufDesc_t *dFifo = &pDesc[3]; - InitBufDesc_t *dScreen = &pDesc[4]; - InitBufDesc_t *dTriple = &pDesc[5]; - - dScreen->bufMagic = VG96_BUF_MAGIC; - dScreen->bufType = INIT_BUFFER_SCREENBUFFER; - dScreen->bufOffset = 0; - dScreen->bufStride = 0; - dScreen->bufBPP = 0; - - *dFront = *dBack = *dAux = *dFifo = *dTriple = *dScreen; - - /* Get info about screen (framebuffer) */ - if (!cvtAddrToBufDesc(screenPhys, dScreen)) - return ErrorMessage(hWndApp, "Couldn't get Screen Info"); - - /* Get info about the front buffer (window) */ - dFront->bufType = INIT_BUFFER_FRONTBUFFER; - if (!cvtAddrToBufDesc(addrFront, dFront)) - return ErrorMessage(hWndApp, "Couldn't get Frontbuffer Info"); - dFront->bufOffset -= dScreen->bufOffset; - - /* Get info about back buffer (pixmap) */ - dBack->bufType = INIT_BUFFER_BACKBUFFER; - if (!cvtAddrToBufDesc(addrBack, dBack)) - return ErrorMessage(hWndApp, "Couldn't get Backbuffer Info"); - dBack->bufOffset -= dScreen->bufOffset; - - /* Get info about aux buffer (pixmap) */ - dAux->bufType = INIT_BUFFER_AUXBUFFER; - if (!cvtAddrToBufDesc(addrAux, dAux)) - return ErrorMessage(hWndApp, "Couldn't get AuxBuffer Info"); - dAux->bufOffset -= dScreen->bufOffset; - - /* Get info about triple buffer (pixmap if used) */ - if (tripleBuffering) { - dTriple->bufType = INIT_BUFFER_TRIPLEBUFFER; - if (!cvtAddrToBufDesc(addrTriple, dTriple)) - return ErrorMessage(hWndApp, "Couldn't get triple buffer Info"); - dTriple->bufOffset -= dScreen->bufOffset; - } - - /* Get info about cmdFifo (pixmap) */ - dFifo->bufType = INIT_BUFFER_FIFOBUFFER; - dFifo->bufOffset = (int)addrFifo-dScreen->bufOffset; - dFifo->bufStride = FIFOSIZE; - - GDBG_INFO((80, "cvtXToGlideDesc: dFront->bufOffset = 0x%x\n", dFront->bufOffset)); - GDBG_INFO((80, "cvtXToGlideDesc: dBack->bufOffset = 0x%x\n", dBack->bufOffset)); - GDBG_INFO((80, "cvtXToGlideDesc: dAux->bufOffset = 0x%x\n", dAux->bufOffset)); - GDBG_INFO((80, "cvtXToGlideDesc: dFifo->bufOffset = 0x%x\n", dFifo->bufOffset)); - if (tripleBuffering) - GDBG_INFO((80, "cvtXToGlideDesc: dTriple->bufOffset = 0x%x\n", dTriple->bufOffset)); - - GDBG_INFO((80, - "F:%.06x %5d B:%.06x %5d B2:%.06x %5d A:%.06x %5d, C:%.06x %5d\n", - dFront->bufOffset, dFront->bufStride, - dBack ->bufOffset, dBack ->bufStride, - dTriple->bufOffset, dTriple->bufStride, - dAux ->bufOffset, dAux ->bufStride, - dFifo ->bufOffset, dFifo ->bufStride)); - return FXTRUE; -} - -static void -doReleasePixmaps() { - if (!dpy) return; - XF86RushUnlockAllPixmaps(dpy); - if (pixAux) XFreePixmap(dpy, pixAux); - if (pixBack) XFreePixmap(dpy, pixBack); - if (pixTriple) XFreePixmap(dpy, pixTriple); - if (pixFifo) XFreePixmap(dpy, pixFifo); - pixAux=pixBack=pixTriple=pixFifo=0; -} - -static void -findWindow(Display *dpy, Window hWndApp, void **addrFront) { - XWindowAttributes attr; - int x=0, y=0, num; - Window root=-1, parent, *children; - - do { - XQueryTree(dpy, hWndApp, &root, &parent, &children, &num); - /* Find out how big the window is */ - if (!XGetWindowAttributes(dpy, hWndApp, &attr)) { - ErrorMessage(hWndApp, "Failed to get window attributes\n"); - return; - } - x+=attr.x; - y+=attr.y; - if (hWndApp!=root) hWndApp=parent; - } while (hWndApp!=root); - *addrFront=screenPhys+(y*screenWidth+x)*2; -} - -static int -doAllocPixmaps(int xRes, int yRes, int vRefresh, - InitBufDesc_t *pDesc) { - GDBG_INFO((80, "doAllocPixmaps: hWnd = %x, fs=%d, xRes=%d, yRes=%d, vRefresh=%d\n", - hWndApp, IsFullScreen, xRes, yRes, vRefresh)); - - doReleasePixmaps(); - - pixFifo=XCreatePixmap(dpy, hWndApp, screenWidth, - (FIFOSIZE/2+4096+screenWidth-1)/screenWidth, 16); - if ((XF86RushLockPixmap(dpy, screenNum, pixFifo, &addrFifo)==FXFALSE) - || !addrFifo) { - doReleasePixmaps(); - return ErrorMessage(hWndApp, "Failed to lock fifo pixmap\n"); - } - xRes = (xRes+3)&~3; - yRes = (yRes+3)&~3; - - findWindow(dpy, hWndApp, &addrFront); - pixBack=XCreatePixmap(dpy, hWndApp, xRes, yRes, 16); - if ((XF86RushLockPixmap(dpy, screenNum, pixBack, - &addrBack)==FXFALSE) || !addrBack) { - doReleasePixmaps(); - return ErrorMessage(hWndApp, "Failed to lock back pixmap\n"); - } - pixAux=XCreatePixmap(dpy, hWndApp, xRes, yRes, 16); - if ((XF86RushLockPixmap(dpy, screenNum, pixAux, - &addrAux)==FXFALSE) || !addrAux) { - doReleasePixmaps(); - return ErrorMessage(hWndApp, "Failed to lock aux pixmap\n"); - } - if (tripleBuffering) { - pixTriple=XCreatePixmap(dpy, hWndApp, xRes, yRes, 16); - if ((XF86RushLockPixmap(dpy, screenNum, pixTriple, - &addrTriple)==FXFALSE) || !addrTriple) { - doReleasePixmaps(); - return ErrorMessage(hWndApp, "Failed to lock triple pixmap\n"); - } - } - cvtXToGlideDesc(pDesc); - return FXTRUE; -} - -static FxBool -getWindowSize(int *width, int *height) { - XWindowAttributes attr; - - /* Find out how big the window is */ - if (!XGetWindowAttributes(dpy, hWndApp, &attr)) - return ErrorMessage(hWndApp, "Failed to get window attributes\n"); - - *width=attr.width; - *height=attr.height; - return FXTRUE; -} - -FxBool -linOpen( - FxU32 hWindow, - GrScreenResolution_t sRes, - GrScreenRefresh_t vRefresh, - InitColorFormat_t cFormat, - InitOriginLocation_t yOrigin, - int nColBuffers, - int nAuxBuffers, - InitBufDesc_t *pBufDesc, // return values - int *width, - int *height, - InitSwapType_t *swapType -) -{ - int i, flags, numModes; - XWindowAttributes attr; - - GDBG_INFO((80, "linOpen: hWnd = %x, sRes=%d, yOrg=%d, ncb=%d, nab=%d\n", - hWindow, sRes, yOrigin, nColBuffers, nAuxBuffers)); - - if (!linSetup()) return FXFALSE; - atexit(linClose); - - if (sRes == GR_RESOLUTION_NONE ) { /* In a window */ - - /* - * Get ourselves a valid window handle - */ - hWndApp = (Window)hWindow; - if (hWndApp == 0) - return ErrorMessage(hWndApp, "Linux VRush needs a valid window id!\n"); - xgc=XCreateGC(dpy, hWndApp, 0, 0); - XSetFunction(dpy, xgc, GXcopy); - XSetPlaneMask(dpy, xgc, AllPlanes); - - if (!XGetWindowAttributes(dpy, hWndApp, &attr)) - return ErrorMessage(hWndApp, "Failed to get window attributes\n"); - if (attr.depth!=16) - return ErrorMessage(hWndApp, "Screen depth must be 16\n"); - screenNum=XScreenNumberOfScreen(attr.screen); - Width=attr.width; - Height=attr.height; - IsFullScreen = FXFALSE; - } else { - /* Full screen mode - convert resolution to Width, Height */ - static int _w[] = {320,320,400,512,640,640,640,640,800,960,856,512}; - static int _h[] = {200,240,256,384,200,350,400,480,600,720,480,256}; - - if ((sRes < GR_RESOLUTION_320x200) || - (sRes > GR_RESOLUTION_512x256)) - return ErrorMessage(hWndApp, "Bad Fullscreen resolution"); - - tripleBuffering = (nColBuffers == 3); - - IsFullScreen = FXTRUE; - Width = _w[sRes]; - Height = _h[sRes]; - - hWndApp=DefaultRootWindow(dpy); - if (!XGetWindowAttributes(dpy, hWndApp, &attr)) - return ErrorMessage(hWndApp, "Failed to get window attributes\n"); - if (attr.depth!=16) - return ErrorMessage(hWndApp, "Screen depth must be 16\n"); - if (XF86DGAQueryDirectVideo(dpy, DefaultScreen(dpy), &flags)==False || - !flags) { - GDBG_INFO((0, "Could query Direct Video")); - return ErrorMessage(hWndApp, "Direct video not supported\n"); - } - if (XF86VidModeGetAllModeLines(dpy, DefaultScreen(dpy), &numModes, - &vidModes)==False) { - return ErrorMessage(hWndApp, "Couldn't query vidmode list\n"); - return 1; - } - for (i=0; ihdisplay==Width) && (vidModes[i]->vdisplay==Height)) - break; - if (i==numModes) { - return ErrorMessage(hWndApp, "Server doesn't support requested resolution\n"); - if (vidModes) { - XFree(vidModes); - vidModes=0; - } - return 1; - } - if (XF86VidModeSwitchToMode(dpy, DefaultScreen(dpy), vidModes[i])==False) { - return ErrorMessage(hWndApp, "Failed to set required video mode\n"); - return 1; - } - } - - GDBG_INFO((80, "linOpen: W=%d, H=%d, FullScr=%d, vRefresh=%d\n", - Width, Height, IsFullScreen, vRefresh)); - - if (!doAllocPixmaps(Width, Height, vRefresh, BufDesc)) { - doReleasePixmaps(); - return ErrorMessage(hWndApp, "failed linOpen"); - } - GDBG_INFO((80, "doAllocPixmaps OK!\n")); - for (i=0; i< NUM_BUFS; i++) { - pBufDesc[i] = BufDesc[i]; - GDBG_INFO((80, "linOpen: pBufDesc[%d]: \n", i)); - GDBG_INFO((80, "\tbufMagic = 0x%x\n", pBufDesc[i].bufMagic)); - GDBG_INFO((80, "\tbufType = 0x%x\n", pBufDesc[i].bufType)); - GDBG_INFO((80, "\tbufOffset = 0x%x\n", pBufDesc[i].bufOffset)); - GDBG_INFO((80, "\tbufStride = 0x%x\n", pBufDesc[i].bufStride)); - GDBG_INFO((80, "\tbufBPP = 0x%x\n", pBufDesc[i].bufBPP)); - } - - *width = Width; - *height = Height; - *swapType = (IsFullScreen) ? INIT_SWAP_FLIP : INIT_SWAP_BLT; - - if (IsFullScreen) { - if (XF86DGADirectVideo(dpy, DefaultScreen(dpy), XF86DGADirectGraphics)==False) { - GDBG_INFO((0, "Couldn't set direct graphics mode")); - return ErrorMessage(hWndApp, "Couldn't enable direct video\n"); - } - if (XF86DGASetViewPort(dpy, DefaultScreen(dpy), 0, 0)==False) { - GDBG_INFO((0, "Failed to set viewport\n")); - } - XSync(dpy, False); - GDBG_INFO((80, "Fullscreen mode switched\n")); - } - - if ( curHALData->initSetVideo ) { - curHALData->initSetVideo( sRes, vRefresh, - (FxU32*)width, (FxU32*)height ); - } - - GDBG_INFO((80, "linOpen: Returning TRUE\n")); - return FXTRUE; - -} /* linOpen */ - -FxBool -linControl(FxU32 code, InitBufDesc_t *pBufDesc, int *width, int *height) -{ - int i, w, h; - - GDBG_INFO((80, "linControl: code = %d\n", code)); - - if (IsFullScreen) return FXTRUE; - /* Why was I called? */ - switch(code) { - case INIT_CONTROL_RESIZE: /* recreate surfaces */ - getWindowSize(&w, &h); - if ((Width != w) || (Height != h)) { - GDBG_INFO((120, "W and H changed to %d %d\n", - Width, Height)); - - if (!doAllocPixmaps(w, h, 0, BufDesc)) { - w=Width; - h=Height; - if (!doAllocPixmaps(w, h, 0, BufDesc)) { - /* ErrorMessage(hWndApp, "linControl: Resize failed\n"); */ - return FXFALSE; - } - } - Width = w; - Height = h; - } - break; - - case INIT_CONTROL_MOVE: - findWindow(dpy, hWndApp, &addrFront); - cvtAddrToBufDesc(addrFront, &BufDesc[0]); - GDBG_INFO((120, "linControl: Move\n")); - break; - - case INIT_CONTROL_ACTIVATE: - GDBG_INFO((120, "linControl: Activate\n")); - break; - - case INIT_CONTROL_DEACTIVATE: - GDBG_INFO((120, "linControl: DeActivate\n")); - break; - - default: - GDBG_INFO((120, "linControl: Strange control %d\n", code)); - return FXFALSE; - break; - } - for (i=0; i<5; i++) pBufDesc[i] = BufDesc[i]; - *width = Width; - *height = Height; - GDBG_INFO((80, "linControl: code = %d, w = %d, h = %d\n", code, - Width, Height)); - - return FXTRUE; -} /* linControl */ - -FxBool -linClose() -{ - GDBG_INFO((80, "linClose:\n")); - if (!dpy) return FXTRUE; - if (IsFullScreen) { - if (XF86VidModeSwitchToMode(dpy, DefaultScreen(dpy), vidModes[0])==False) { - GDBG_INFO((80, "Failed to return to previous video mode\n")); - } - XF86DGADirectVideo(dpy, DefaultScreen(dpy), 0); - if (vidModes) { - XFree(vidModes); - vidModes=0; - } - } - doReleasePixmaps(); - if (xgc) XFreeGC(dpy, xgc); - xgc=0; - dpy=0; - GDBG_INFO((80, "linClose: Returning TRUE\n")); - return FXTRUE; -} /* linClose */ - -void -linSwap(FxU32 code) -{ - if (IsFullScreen) return; - XCopyArea(dpy, pixBack, hWndApp, xgc, 0, 0, Width, Height, 0, 0); - XSync(dpy, False); -} /* linSwap */ - -void -linFlip(FxU32 buffer) -{ - int x, y; - - y=buffer/(2*screenWidth); - x=(buffer-y*2*screenWidth)/2; - if (XF86DGASetViewPort(dpy, DefaultScreen(dpy), x, y)==False) { - GDBG_INFO((0, "Failed to set viewport\n")); - } - /* - We really are supposed to wait for the port changed call in a while - loop I guess, but at the moment, this is a no-op in the - server. Since this requires and extra round-trip to the X server it - really eats into performance. I'd argue DGA is broken. Setting the - viewport should enforce the switch before returning to avoid this. - */ -#if 0 - if (XF86DGAViewPortChanged(dpy, DefaultScreen(dpy), 2)==False) { - GDBG_INFO((0, "Failed to wait for viewport change\n")); - } -#endif -} /* linFlip */ - -#endif - - diff --git a/glide2x/sst1/init/init96/makefile.linux b/glide2x/sst1/init/init96/makefile.linux deleted file mode 100644 index db382ed..0000000 --- a/glide2x/sst1/init/init96/makefile.linux +++ /dev/null @@ -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 -# -# $Revision$ -# $Date$ -# - -# local defines, options, includes - -LCDEFS = -DSST96 -ifeq ($(FX_SST96_ALT_FIFO),1) -LCDEFS += -DSST96_ALT_FIFO_WRAP -endif - -PARTNERCFILES = initmcrx.c -#init8625.c - -ifeq ($(DEBUG),1) -DBGOPTS = -DGDBG_INFO_ON -endif - -ifneq ($(FX_GLIDE_HW),SST96) -LCDEFS += -DDUMMY -endif - -LCOPTS += $(DBGOPTS) \ - -I$(BUILD_ROOT_SWLIBS)/include \ - -I$(BUILD_ROOT_HW)/include - -# sources -HEADERS = init96.h initvga.h -PRIVATE_HEADERS = atvga.h fxinit96.h initat3d.h initmcrx.h -INSTALL_DESTINATION = $(BUILD_ROOT_HW) -CFILES = $(PARTNERCFILES) init96.c lindrvr.c - -# targets -LIBRARIES = libinit96.a - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak - diff --git a/glide2x/sst1/init/init96/makefile.unix b/glide2x/sst1/init/init96/makefile.unix deleted file mode 100644 index c4ca502..0000000 --- a/glide2x/sst1/init/init96/makefile.unix +++ /dev/null @@ -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 -# -# $Revision$ -# $Date$ -# - -# local defines, options, includes - -LCDEFS = -DSST96 -ifeq ($(FX_SST96_ALT_FIFO),1) -LCDEFS += -DSST96_ALT_FIFO_WRAP -endif - -PARTNERCFILES = initmcrx.c -#init8625.c - -ifeq ($(DEBUG),1) -DBGOPTS = -DGDBG_INFO_ON -endif - -ifneq ($(FX_GLIDE_HW),SST96) -LCDEFS += -DDUMMY -endif - -LCOPTS += $(DBGOPTS) \ - -I$(BUILD_ROOT_SWLIBS)/include \ - -I$(BUILD_ROOT_SST1)/include - -# sources -HEADERS = init96.h initvga.h -PRIVATE_HEADERS = atvga.h fxinit96.h initat3d.h initmcrx.h -INSTALL_DESTINATION = $(BUILD_ROOT_SST1) -CFILES = $(PARTNERCFILES) init96.c lindrvr.c - -# targets -LIBRARIES = libinit96.a - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak - diff --git a/glide2x/sst1/init/init96/readme.txt b/glide2x/sst1/init/init96/readme.txt deleted file mode 100644 index 0f941d1..0000000 --- a/glide2x/sst1/init/init96/readme.txt +++ /dev/null @@ -1,37 +0,0 @@ -Different Build Environments For VG96: - -Lab: -FX_GLIDE_HW=SST96 -FX_GLIDE_CTRISETUP=1 -FX_GLIDE_NO_SPLASH=1 -INIT_ACCESS_DDRAW= - - -Direct Draw Window: -FX_GLIDE_HW=SST96 -FX_GLIDE_CTRISETUP=1 -FX_GLIDE_NO_SPLASH=1 -INIT_ACCESS_DDRAW=1 -SST_VG_MODE=WIN -*demos* ARCADE_RES_OVERRIDE=1 - -Direct Draw Fullscreen: -FX_GLIDE_HW=SST96 -FX_GLIDE_CTRISETUP=1 -FX_GLIDE_NO_SPLASH=1 -INIT_ACCESS_DDRAW=1 -SST_VG_MODE= -*demos* ARCADE_RES_OVERRIDE= - -This mode sucks because you can't get any input to your application -and it is slow because you have to do sucky synchronized swapping. - - -DOS Fullscreen: -FX_GLIDE_HW=SST96 -FX_GLIDE_CTRISETUP=1 -FX_GLIDE_NO_SPLASH=1 -*demos* ARCADE_RES_OVERRIDE= -INIT_ACCESS_DDRAW= -SST_VG_MODE= - diff --git a/glide2x/sst1/init/initvg/MAKEFILE.new b/glide2x/sst1/init/initvg/MAKEFILE.new deleted file mode 100644 index b42a4ae..0000000 --- a/glide2x/sst1/init/initvg/MAKEFILE.new +++ /dev/null @@ -1,53 +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 = -DGDBG_INFO_ON -DINIT_DOS -LCOPTS = -WX -LCINCS = -I$(BUILD_ROOT_SWLIBS)\include -I$(BUILD_ROOT_SST1)\include - -!if "$(FX_SST96_PAGE_FIFO)" != "1" -LCDEFS = $(LCDEFS) -DSST96_ALT_FIFO_WRAP -!endif - -# sources -HEADERS = sst1init.h gdebug.h -INSTALL_DESTINATION = $(BUILD_ROOT_SST1) -CFILES = sst1init.c info.c print.c parse.c gamma.c util.c \ - sli.c video.c dac.c gdebug.c - -!if "$(FX_DLL_BUILDSST1INIT)" == "1" -SUBLIBRARIES = $(BUILD_ROOT_SWLIBS)\lib\fxpci.lib -FX_DLL_LIBRARY = 1 -!else -SUBLIBRARIES = -!endif - -# targets -LIBRARIES = sst1init.lib -RCFILE = init.rc - -!include $(BUILD_ROOT_SWLIBS)/include/nmake/3dfx.mak - -init.res: rcver.h -sst1init.obj: rcver.h diff --git a/glide2x/sst1/init/initvg/dac.c b/glide2x/sst1/init/initvg/dac.c deleted file mode 100644 index 5b63744..0000000 --- a/glide2x/sst1/init/initvg/dac.c +++ /dev/null @@ -1,1211 +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$ -** -** Initialization code for initializing supported SST-1 DACs -** -*/ -#pragma optimize ("",off) -#include -#include -#include -#include -#define FX_DLL_DEFINITION -#include -#include -#include - -/* -** sst1InitDacRd(): -** Read external DAC registers -** NOTE: The video unit of FBI must be in reset before calling this routine. -** The rendering engines of FBI and TREX must be idle before calling -** this routine. -** fbiInit23 register remapping (PCI config. initEnable[2]=1) must be -** enabled before calling this routine -** -** Valid addresses are 0 <= addr <= 3 -** -*/ -FX_EXPORT FxU32 FX_CSTYLE sst1InitDacRd(FxU32 *sstbase, FxU32 addr) -{ - volatile Sstregs *sst = (Sstregs *) sstbase; - FxU32 retVal; - static FxBool firstPass = FXTRUE; - static int helper; - - if(firstPass == FXTRUE) { - firstPass = FXFALSE; - helper = (GETENV(("SST_DEBUGDAC"))) ? 1 : 0; - } - - ISET(sst->dacData, ((addr) << SST_DACDATA_ADDR_SHIFT) | SST_DACDATA_RD); - sst1InitIdleFBINoNOP(sstbase); - retVal = IGET(sst->fbiInit2) & SST_DACDATA_DATA; - if(helper) - INIT_PRINTF(("dacRd(0x%x,0x%x)\n", addr, retVal)); - - return(retVal); -} - -/* -** sst1InitDacWr(): -** Write to external DAC registers -** NOTE: The video unit of FBI must be in reset before calling this routine. -** The rendering engines of FBI and TREX must be idle before calling -** this routine. -** -** Valid addresses are 0 <= addr <= 3 -** -*/ -FX_EXPORT void FX_CSTYLE sst1InitDacWr(FxU32 *sstbase, FxU32 addr, FxU32 data) -{ - volatile Sstregs *sst = (Sstregs *) sstbase; - static FxBool firstPass = FXTRUE; - static int helper; - - if(firstPass == FXTRUE) { - firstPass = FXFALSE; - helper = (GETENV(("SST_DEBUGDAC"))) ? 1 : 0; - } - - ISET(sst->dacData, - (data & SST_DACDATA_DATA) | - ((addr) << SST_DACDATA_ADDR_SHIFT) | - SST_DACDATA_WR); - sst1InitIdleFBINoNOP(sstbase); - - if(helper) - INIT_PRINTF(("dacWr(0x%x,0x%x)\n", addr, data)); -} - -/* -** sst1InitExecuteDacRdWr(): -** Execute DAC read/write command sequence defined in "voodoo.ini" file -** -*/ -FxBool sst1InitExecuteDacRdWr(FxU32 *sstbase, sst1InitDacRdWrStruct - *dacRdWrBase) -{ - sst1InitDacRdWrStruct *dacRdWrPtr = dacRdWrBase; - FxU32 data; - FxBool retVal = FXTRUE; - int helper = (GETENV(("SST_DEBUGDAC"))) ? 1 : 0; - - while(dacRdWrPtr) { - if(dacRdWrPtr->type == DACRDWR_TYPE_WR) { - sst1InitDacWr(sstbase, dacRdWrPtr->addr, dacRdWrPtr->data); - } else if(dacRdWrPtr->type == DACRDWR_TYPE_RDMODWR) { - data = sst1InitDacRd(sstbase, dacRdWrPtr->addr); - if(helper) - INIT_PRINTF(("dacRdWr(Read=0x%x)\n", data)); - data &= dacRdWrPtr->mask; - sst1InitDacWr(sstbase, dacRdWrPtr->addr, (data | dacRdWrPtr->data)); - } else if(dacRdWrPtr->type == DACRDWR_TYPE_WRMOD_POP) { - data = iniStack[--iniStackPtr]; - if(iniStackPtr < 0) { - retVal = FXFALSE; - break; - } - if(helper) - INIT_PRINTF(("dacWrModPop(Stack=0x%x,Mask=0x%x)\n", data, - dacRdWrPtr->mask)); - data &= dacRdWrPtr->mask; - sst1InitDacWr(sstbase, dacRdWrPtr->addr, (data | dacRdWrPtr->data)); - } else if(dacRdWrPtr->type == DACRDWR_TYPE_RDNOCHECK) { - sst1InitDacRd(sstbase, dacRdWrPtr->addr); - } else if(dacRdWrPtr->type == DACRDWR_TYPE_RDPUSH) { - data = sst1InitDacRd(sstbase, dacRdWrPtr->addr); - iniStack[iniStackPtr++] = data; - if(iniStackPtr == DACRDWR_MAX_PUSH) { - retVal = FXFALSE; - break; - } - } else if(dacRdWrPtr->type == DACRDWR_TYPE_RDCHECK) { - if(sst1InitDacRd(sstbase, dacRdWrPtr->addr) != dacRdWrPtr->data) { - retVal = FXFALSE; - break; - } - } else { - retVal = FXFALSE; - break; - } - dacRdWrPtr = dacRdWrPtr->nextRdWr; - } - return(retVal); -} - -/* -** sst1InitDacDetect(): -** Detect type of on-board DAC -** NOTE: sst1InitDacDetect() resets the PCI fifo and the graphics subsystem -** of FBI -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitDacDetect(FxU32 * sstbase) -{ - FxU32 n; - FxU32 fbiInit1_save; - FxU32 fbiInit2_save; - volatile Sstregs *sst = (Sstregs *) sstbase; - FxBool retVal = FXFALSE; - int helper = (GETENV(("SST_DEBUGDAC"))) ? 1 : 0; - - if(!sst) - return(FXFALSE); - - if(helper) - INIT_PRINTF(("sst1InitDacDetect(): Entered...\n")); - - sst1InitIdleFBINoNOP(sstbase); - - /* Save init register states before overwriting them */ - fbiInit1_save = IGET(sst->fbiInit1); - fbiInit2_save = IGET(sst->fbiInit2); - - /* Reset video unit to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_RESET); - /* Turn off dram refresh to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit2, IGET(sst->fbiInit2) & ~SST_EN_DRAM_REFRESH); - sst1InitIdleFBINoNOP(sstbase); - - /* Enable reads from the DAC (multiplexed on the fbiInit2 address) */ - /* Disallow writes to pass through the PCI FIFO */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, SST_INITWR_EN | SST_FBIINIT23_REMAP); - sst1InitIdleFBINoNOP(sstbase); - - if(sst1InitUseVoodooFile == FXTRUE) { - retVal = sst1InitDacDetectINI(sstbase); - } else { - if((retVal = sst1InitDacDetectICS(sstbase)) == FXTRUE) - goto done; - if((retVal = sst1InitDacDetectATT(sstbase)) == FXTRUE) - goto done; - retVal = sst1InitDacDetectTI(sstbase); - } - -done: - /* Disable fbiinit23 address remapping */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, SST_INITWR_EN | SST_PCI_FIFOWR_EN); - - /* Restore init register states */ - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit1, fbiInit1_save); - ISET(sst->fbiInit2, fbiInit2_save); - sst1InitIdleFBINoNOP(sstbase); - return(retVal); -} - -/* -** sst1InitDacDetectINI(): -** Detect DAC based on rules supplied in "voodoo.ini" -** -*/ -FxBool sst1InitDacDetectINI(FxU32 * sstbase) -{ - sst1InitDacStruct *dacPtr; - FxU32 j; - FxBool retVal = FXFALSE; - - dacPtr = dacStructBase; - while(dacPtr) { - if(dacPtr->detect) { - /* Loop multiple times, as some DACs go into never-never land... */ - for(j=0; j<100; j++) { - if((retVal = sst1InitExecuteDacRdWr(sstbase, dacPtr->detect)) - == FXTRUE) { - iniDac = dacPtr; - break; - } - } - if(retVal == FXTRUE) - break; - } - dacPtr = dacPtr->nextDac; - } - return(retVal); -} - -FxBool sst1InitDacDetectATT(FxU32 * sstbase) -{ - FxU32 n, j, dacmir, dacdir; - int helper = (GETENV(("SST_DEBUGDAC"))) ? 1 : 0; - - if(helper) - INIT_PRINTF(("sst1InitDacDetectATT(): Entered...\n")); - - /* Detect ATT */ - /* Sometimes the DACs seem to go into never-never land, so */ - /* try and initialize the DAC multiple times */ - n = 0; - while(1) { - if(++n > 100) - break; - - /* Must guarantee that no rendering is being performed */ - sst1InitIdleFBINoNOP(sstbase); - - /* Reset current state of DAC command register 0 (CR0) via the read */ - /* mask register (RMR) */ - sst1InitDacWr(sstbase, SST_DACREG_WMA, 0x0); /* reset backdoor fsm */ - sst1InitDacRd(sstbase, SST_DACREG_RMR); /* RMR must be read 5 times */ - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); /* Returns contents of CR0 */ - - /* Enable indexed programming by setting CR0[0] = 1 */ - sst1InitDacWr(sstbase, SST_DACREG_WMA, 0x0); /* reset backdoor fsm */ - sst1InitDacRd(sstbase, SST_DACREG_RMR); /* RMR must be read 4 times */ - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacWr(sstbase, SST_DACREG_RMR, - SST_DACREG_CR0_INDEXED_ADDRESSING | SST_DACREG_CR0_8BITDAC); - - /* NOW DAC IS IN INDEXED ADDRESS MODE... */ - - /* Check the manufacturing ID */ - j = 0; - DAC_INDEXWRADDR(SST_DACREG_INDEX_MIR); - dacmir = DAC_INDEXRD(); - if(dacmir == SST_DACREG_INDEX_MIR_ATT_DEFAULT) - j++; - else - continue; - - /* Check the device ID */ - DAC_INDEXWRADDR(SST_DACREG_INDEX_DIR); - dacdir = DAC_INDEXRD(); - if(dacmir == SST_DACREG_INDEX_MIR_ATT_DEFAULT && - dacdir == SST_DACREG_INDEX_DIR_ATT_DEFAULT) - j++; - else - continue; - if(j == 2) { - /* Found ATT DAC... */ - sst1CurrentBoard->fbiDacType = SST_FBI_DACTYPE_ATT; - sst1InitIdleFBINoNOP(sstbase); - /* Disable indexed-mode addressing */ - sst1InitDacWr(sstbase, SST_DACREG_INDEXADDR, SST_DACREG_INDEX_CR0); - sst1InitDacWr(sstbase, SST_DACREG_INDEXDATA, - sst1InitDacRd(sstbase, SST_DACREG_INDEXDATA) & - ~SST_DACREG_CR0_INDEXED_ADDRESSING); - if(helper) - INIT_PRINTF(("sst1InitDacDetectATT(): Exiting...\n")); - return(FXTRUE); - } - } - if(helper) - INIT_PRINTF(("sst1InitDacDetectATT(): Exiting...\n")); - return(FXFALSE); -} - -FxBool sst1InitDacDetectTI(FxU32 * sstbase) -{ - FxU32 n, j, dacmir, dacdir; - int helper = (GETENV(("SST_DEBUGDAC"))) ? 1 : 0; - - if(helper) - INIT_PRINTF(("sst1InitDacDetectTI(): Entered...\n")); - - /* Detect TI */ - /* Sometimes the DACs seem to go into never-never land, so */ - /* try and initialize the DAC multiple times */ - n = 0; - while(1) { - if(++n > 100) - break; - - /* Must guarantee that no rendering is being performed */ - sst1InitIdleFBINoNOP(sstbase); - - /* Reset current state of DAC command register 0 (CR0) via the read */ - /* mask register (RMR) */ - sst1InitDacWr(sstbase, SST_DACREG_WMA, 0x0); /* reset backdoor fsm */ - sst1InitDacRd(sstbase, SST_DACREG_RMR); /* RMR must be read 5 times */ - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); /* Returns contents of CR0 */ - - /* Enable indexed programming by setting CR0[0] = 1 */ - sst1InitDacWr(sstbase, SST_DACREG_WMA, 0x0); /* reset backdoor fsm */ - sst1InitDacRd(sstbase, SST_DACREG_RMR); /* RMR must be read 4 times */ - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacWr(sstbase, SST_DACREG_RMR, - SST_DACREG_CR0_INDEXED_ADDRESSING | SST_DACREG_CR0_8BITDAC); - - /* NOW DAC IS IN INDEXED ADDRESS MODE... */ - - /* Check the manufacturing ID */ - j = 0; - DAC_INDEXWRADDR(SST_DACREG_INDEX_MIR); - dacmir = DAC_INDEXRD(); - if(dacmir == SST_DACREG_INDEX_MIR_TI_DEFAULT) - j++; - else - continue; - - /* Check the device ID */ - DAC_INDEXWRADDR(SST_DACREG_INDEX_DIR); - dacdir = DAC_INDEXRD(); - if(dacmir == SST_DACREG_INDEX_MIR_TI_DEFAULT && - dacdir == SST_DACREG_INDEX_DIR_TI_DEFAULT) - j++; - else - continue; - if(j == 2) { - /* Found TI DAC... */ - sst1CurrentBoard->fbiDacType = SST_FBI_DACTYPE_TI; - sst1InitIdleFBINoNOP(sstbase); - /* Disable indexed-mode addressing */ - sst1InitDacWr(sstbase, SST_DACREG_INDEXADDR, SST_DACREG_INDEX_CR0); - sst1InitDacWr(sstbase, SST_DACREG_INDEXDATA, - sst1InitDacRd(sstbase, SST_DACREG_INDEXDATA) & - ~SST_DACREG_CR0_INDEXED_ADDRESSING); - if(helper) - INIT_PRINTF(("sst1InitDacDetectTI(): Exiting...\n")); - return(FXTRUE); - } - } - if(helper) - INIT_PRINTF(("sst1InitDacDetectTI(): Exiting...\n")); - return(FXFALSE); -} - -FxBool sst1InitDacDetectICS(FxU32 * sstbase) -{ - FxU32 n; - int helper = (GETENV(("SST_DEBUGDAC"))) ? 1 : 0; - - if(helper) - INIT_PRINTF(("sst1InitDacDetectICS(): Entered...\n")); - - /* Detect ICS... */ - /* Sometimes the DACs seem to go into never-never land, so */ - /* try and initialize the DAC multiple times */ - n = 0; - while(1) { - FxU32 gclk1, vclk1, vclk7; - - if(++n > 100) - break; - /* Must guarantee that no rendering is being performed */ - sst1InitIdleFBINoNOP(sstbase); - - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_RD, - SST_DACREG_ICS_PLLADDR_GCLK1); - gclk1 = sst1InitDacRd(sstbase, SST_DACREG_ICS_PLLADDR_DATA); - sst1InitDacRd(sstbase, SST_DACREG_ICS_PLLADDR_DATA); - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_RD, - SST_DACREG_ICS_PLLADDR_VCLK1); - vclk1 = sst1InitDacRd(sstbase, SST_DACREG_ICS_PLLADDR_DATA); - sst1InitDacRd(sstbase, SST_DACREG_ICS_PLLADDR_DATA); - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_RD, - SST_DACREG_ICS_PLLADDR_VCLK7); - vclk7 = sst1InitDacRd(sstbase, SST_DACREG_ICS_PLLADDR_DATA); - sst1InitDacRd(sstbase, SST_DACREG_ICS_PLLADDR_DATA); - if((gclk1 == SST_DACREG_ICS_PLLADDR_GCLK1_DEFAULT) && - (vclk1 == SST_DACREG_ICS_PLLADDR_VCLK1_DEFAULT) && - (vclk7 == SST_DACREG_ICS_PLLADDR_VCLK7_DEFAULT)) { - /* found ICS DAC... */ - sst1CurrentBoard->fbiDacType = SST_FBI_DACTYPE_ICS; - if(helper) - INIT_PRINTF(("sst1InitDacDetectICS(): Exiting...\n")); - return(FXTRUE); - } - } - if(helper) - INIT_PRINTF(("sst1InitDacDetectICS(): Exiting...\n")); - return(FXFALSE); -} - -/* -** sst1InitCalcGrxClk(): -** Determine graphics clock frequency -** NOTE: sst1InitCalcGrxClk() must be called prior to sst1InitGrxClk() -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitCalcGrxClk(FxU32 *sstbase) -{ - FxU32 clkFreq; - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - if(GETENV(("SST_GRXCLK"))) { - INIT_PRINTF(("sst1InitCalcGrxClk(): Overriding default clk frequency with SST_GRXCLK\n")); - clkFreq = ATOI(GETENV(("SST_GRXCLK"))); - if(clkFreq < 16) - clkFreq = 16; - } else { - /* Setup memory clock frequency based on board strapping bits... */ - if(sst1CurrentBoard->fbiBoardID == 0x0) { - /* Obsidian GE Fab */ - clkFreq = 40 + (((sst1CurrentBoard->tmuConfig >> 3) & 0x7) << 2) + - (sst1CurrentBoard->fbiConfig & 0x3); - } else { - /* Obsidian Pro Fab */ - clkFreq = 40 + (((sst1CurrentBoard->tmuConfig >> 3) & 0x7) << 2) + - (sst1CurrentBoard->fbiConfig & 0x3); - /* Fix for legacy/existing boards */ - if(clkFreq == 54) - clkFreq = 50; - } - } - sst1CurrentBoard->grxClkFreq = clkFreq; - return(FXTRUE); -} - -/* -** sst1InitGrxClk(): -** Initialize FBI and TREX Memory clocks -** NOTE: sst1InitCalcGrxClk() must be called prior to sst1InitGrxClk() -** NOTE: sst1InitGrxClk() resets the PCI fifo and the graphics subsystem of FBI -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitGrxClk(FxU32 *sstbase) -{ - sst1ClkTimingStruct sstGrxClk; - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - if(sst1CurrentBoard->initGrxClkDone) - return(FXTRUE); - sst1CurrentBoard->initGrxClkDone = 1; - - INIT_PRINTF(("sst1InitGrxClk(): Setting up %d MHz Graphics Clock...\n", - sst1CurrentBoard->grxClkFreq)); - if(sst1InitComputeClkParams((float) sst1CurrentBoard->grxClkFreq, - &sstGrxClk) == FXFALSE) - return(FXFALSE); - - return(sst1InitSetGrxClk(sstbase, &sstGrxClk)); -} - -/* -** sst1InitComputeClkParams(): -** Compute PLL parameters for given clock frequency -** -*/ -FxBool sst1InitComputeClkParams(float freq, sst1ClkTimingStruct - *clkTiming) -{ - float vcoFreqDivide, freqMultRatio, clkError; - float clkErrorMin; - FxU32 p, n, m, nPlusTwo; - int mPlusTwo; - - /* Calculate P parameter */ - p = 4; - if(((freq * (float) 1.) >= (float) 120.) && - ((freq * (float) 1.) <= (float) 240.)) { - vcoFreqDivide = (float) 1.; - p = 0; - } - if(((freq * (float) 2.) >= (float) 120.) && - ((freq * (float) 2.) <= (float) 240.)) { - vcoFreqDivide = (float) 2.; - p = 1; - } - if(((freq * (float) 4.) >= (float) 120.) && - ((freq * (float) 4.) <= (float) 240.)) { - vcoFreqDivide = (float) 4.; - p = 2; - } - if(((freq * (float) 8.) >= (float) 120.) && - ((freq * (float) 8.) <= (float) 240.)) { - vcoFreqDivide = (float) 8.; - p = 3; - } - if(p > 3) - return(FXFALSE); - - /* Divide by 14.318 */ - freqMultRatio = (freq * vcoFreqDivide) * (float) 0.06984216; - - /* Calculate proper N and M parameters which yield the lowest error */ - clkErrorMin = (float) 9999.; n = 0; - for(nPlusTwo = 3; nPlusTwo < 32; nPlusTwo++) { -#ifdef DIRECTX - mPlusTwo = FTOL( (((float) nPlusTwo * freqMultRatio) + (float) 0.5) ); - clkError = ((float) mPlusTwo * ITOF_INV( nPlusTwo ) ) - freqMultRatio; -#else - mPlusTwo = (int) (((float) nPlusTwo * freqMultRatio) + (float) 0.5); - clkError = ((float) mPlusTwo / (float) nPlusTwo) - freqMultRatio; -#endif - if(clkError < (float) 0.0) - clkError = -clkError; - if((clkError < clkErrorMin) && ((mPlusTwo - 2) < 127)) { - clkErrorMin = clkError; - n = nPlusTwo - 2; - m = mPlusTwo - 2; - } - } - if(n == 0) - return(FXFALSE); - - clkTiming->freq = freq; - clkTiming->clkTiming_M = m; - clkTiming->clkTiming_P = p; - clkTiming->clkTiming_N = n; - if(freq < (float) 37.) { - clkTiming->clkTiming_L = 0xa; - clkTiming->clkTiming_IB = 0x6; - } else if(freq < (float) 45.) { - clkTiming->clkTiming_L = 0xc; - clkTiming->clkTiming_IB = 0x4; - } else if(freq < (float) 58.) { - clkTiming->clkTiming_L = 0x8; - clkTiming->clkTiming_IB = 0x4; - } else if(freq < (float) 66.) { - clkTiming->clkTiming_L = 0xa; - clkTiming->clkTiming_IB = 0x6; - } else { - clkTiming->clkTiming_L = 0xa; - clkTiming->clkTiming_IB = 0x8; - } -#if 0 - { - float calc; - - calc = ((float) 14.318 * (float) (m + 2)) / - ((float) (n + 2) * vcoFreqDivide); - printf("freq:%.3f calc:%.3f\n", freq, calc); - printf("m:%d p:%d n:%d\n", m, p, n); - fflush(stdout); - } -#endif - return(FXTRUE); -} - -/* -** sst1InitSetVidClkATT(): -** Set video clock for ATT Dacs -** -*/ -FxBool sst1InitSetVidClkATT(FxU32 *sstbase, sst1ClkTimingStruct - *sstVidClk) -{ - if(sst1InitDacIndexedEnable(sstbase, 1) == FXFALSE) - return(FXFALSE); - - DAC_INDEXWRADDR(SST_DACREG_INDEX_AD0); - DAC_INDEXWR((sstVidClk->clkTiming_M) << SST_DACREG_CLKREG_MSHIFT); - DAC_INDEXWRADDR(SST_DACREG_INDEX_AD1); - DAC_INDEXWR(((sstVidClk->clkTiming_P) << SST_DACREG_CLKREG_PSHIFT) | - ((sstVidClk->clkTiming_N) - << SST_DACREG_CLKREG_NSHIFT)); - DAC_INDEXWRADDR(SST_DACREG_INDEX_AD2); - DAC_INDEXWR(((sstVidClk->clkTiming_L) << SST_DACREG_CLKREG_LSHIFT) | - ((sstVidClk->clkTiming_IB) << SST_DACREG_CLKREG_IBSHIFT)); - DAC_INDEXWRADDR(SST_DACREG_INDEX_CC); - DAC_INDEXWR((DAC_INDEXRD() | (0x3 << SST_DACREG_CC_ACLK_SEL_SHIFT) | - SST_DACREG_CC_ACLK_SELECT_AD)); - DAC_INDEXWRADDR(SST_DACREG_INDEX_CC); - - if(sst1InitDacIndexedEnable(sstbase, 0) == FXFALSE) - return(FXFALSE); - - return(FXTRUE); -} - -/* -** sst1InitSetVidClkICS(): -** Set video clock for ICS Dacs -** -*/ -FxBool sst1InitSetVidClkICS(FxU32 *sstbase, sst1ClkTimingStruct - *sstVidClk) -{ - FxU32 n, fbiInit1_save, fbiInit2_save, pllCtrl; - volatile Sstregs *sst = (Sstregs *) sstbase; - - sst1InitIdleFBINoNOP(sstbase); - - /* Save init register states before overwriting them */ - fbiInit1_save = IGET(sst->fbiInit1); - fbiInit2_save = IGET(sst->fbiInit2); - - /* Reset video unit to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_RESET); - /* Turn off dram refresh to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit2, IGET(sst->fbiInit2) & ~SST_EN_DRAM_REFRESH); - sst1InitIdleFBINoNOP(sstbase); - - /* Enable reads from the DAC (multiplexed on the fbiInit2 address) */ - /* Disallow writes to pass through the PCI FIFO */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, SST_INITWR_EN | SST_FBIINIT23_REMAP); - sst1InitIdleFBINoNOP(sstbase); - - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_RD, - SST_DACREG_ICS_PLLADDR_CTRL); - pllCtrl = sst1InitDacRd(sstbase, SST_DACREG_ICS_PLLADDR_DATA); - - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_WR, - SST_DACREG_ICS_PLLADDR_VCLK0); - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_DATA, - sstVidClk->clkTiming_M); - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_DATA, - (((sstVidClk->clkTiming_P) << 5) | sstVidClk->clkTiming_N)); - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_WR, - SST_DACREG_ICS_PLLADDR_CTRL); - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_DATA, - ((pllCtrl & ~SST_DACREG_ICS_PLLCTRL_CLK0FREQ) | - SST_DACREG_ICS_PLLCTRL_CLK0SEL)); - sst1InitIdleFBINoNOP(sstbase); - - /* Disable fbiinit23 address remapping */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, SST_INITWR_EN | SST_PCI_FIFOWR_EN); - - /* Restore init register states */ - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit1, fbiInit1_save); - ISET(sst->fbiInit2, fbiInit2_save); - sst1InitIdleFBINoNOP(sstbase); - - return(FXTRUE); -} - -/* -** sst1InitSetVidClkINI(): -** Set video clock for DACs defined in "voodoo.ini" -** -*/ -FxBool sst1InitSetVidClkINI(FxU32 *sstbase, FxU32 width, - FxU32 height, FxU32 refresh, FxU32 video16BPP) -{ - FxU32 n, fbiInit1_save, fbiInit2_save; - sst1InitDacSetVideoStruct *setVideo; - volatile Sstregs *sst = (Sstregs *) sstbase; - int helper = (GETENV(("SST_DEBUGDAC"))) ? 1 : 0; - FxBool retVal = FXFALSE; - - if(helper) - INIT_PRINTF(("sst1InitSetVidClkINI(): Entered...\n")); - - if(iniDac == (sst1InitDacStruct *) NULL) - return(FXFALSE); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - sst1InitIdleFBINoNOP(sstbase); - - /* Save init register states before overwriting them */ - fbiInit1_save = IGET(sst->fbiInit1); - fbiInit2_save = IGET(sst->fbiInit2); - - /* Reset video unit to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_RESET); - /* Turn off dram refresh to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit2, IGET(sst->fbiInit2) & ~SST_EN_DRAM_REFRESH); - sst1InitIdleFBINoNOP(sstbase); - - /* Enable reads from the DAC (multiplexed on the fbiInit2 address) */ - /* Disallow writes to pass through the PCI FIFO */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, SST_INITWR_EN | SST_FBIINIT23_REMAP); - sst1InitIdleFBINoNOP(sstbase); - - setVideo = iniDac->setVideo; - while(setVideo) { - if((setVideo->width == width) && (setVideo->height == height) && - (setVideo->refresh == refresh) && - (setVideo->video16BPP == video16BPP)) { - if((retVal = sst1InitExecuteDacRdWr(sstbase, - setVideo->setVideoRdWr)) == FXTRUE) { - retVal = FXTRUE; - break; - } - } - setVideo = setVideo->nextSetVideo; - } - - /* Disable fbiinit23 address remapping */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, SST_INITWR_EN | SST_PCI_FIFOWR_EN); - - /* Restore init register states */ - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit1, fbiInit1_save); - ISET(sst->fbiInit2, fbiInit2_save); - sst1InitIdleFBINoNOP(sstbase); - - return(retVal); -} - -/* -** sst1InitSetGrxClkATT(): -** Set graphics clock for ATT Dacs -** NOTE: sst1InitSetGrxClkATT() resets the PCI fifo and the graphics subsystem -** of FBI -** -*/ -FxBool sst1InitSetGrxClkATT(FxU32 *sstbase, sst1ClkTimingStruct - *sstGrxClk) -{ - FxU32 n; - volatile Sstregs *sst = (Sstregs *) sstbase; - - /* Reset graphics unit before we change grx clk */ - ISET(sst->fbiInit0, IGET(sst->fbiInit0) | - (SST_GRX_RESET | SST_PCI_FIFO_RESET)); - sst1InitIdleFBINoNOP(sstbase); - - /* Enable DAC indexed addressing */ - /* sst1InitDacIndexedEnable resets the video module, turns off dram refresh */ - /* and disallows writes to the PCI fifo */ - if(sst1InitDacIndexedEnable(sstbase, 1) == FXFALSE) - return(FXFALSE); - - DAC_INDEXWRADDR(SST_DACREG_INDEX_BD0); - DAC_INDEXWR((sstGrxClk->clkTiming_M) << SST_DACREG_CLKREG_MSHIFT); - DAC_INDEXWRADDR(SST_DACREG_INDEX_BD1); - DAC_INDEXWR(((sstGrxClk->clkTiming_P) << SST_DACREG_CLKREG_PSHIFT) | - ((sstGrxClk->clkTiming_N) << SST_DACREG_CLKREG_NSHIFT)); - DAC_INDEXWRADDR(SST_DACREG_INDEX_BD2); - DAC_INDEXWR(((sstGrxClk->clkTiming_L) << SST_DACREG_CLKREG_LSHIFT) | - ((sstGrxClk->clkTiming_IB) << SST_DACREG_CLKREG_IBSHIFT)); - DAC_INDEXWRADDR(SST_DACREG_INDEX_CC); - DAC_INDEXWR((DAC_INDEXRD() | (0x3 << SST_DACREG_CC_BCLK_SEL_SHIFT) | - SST_DACREG_CC_BCLK_SELECT_BD)); - sst1InitIdleFBINoNOP(sstbase); - - /* Turn off DAC indexed addressing */ - - /* Disabling dac indexed mode re-enables writes to pass through the */ - /* PCI fifo (and restores video refresh and dram refresh if previously */ - /* enabled) */ - if(sst1InitDacIndexedEnable(sstbase, 0) == FXFALSE) - return(FXFALSE); - - /* Wait for graphics clock to stabilize */ - for(n=0; n<200000; n++) - sst1InitReturnStatus(sstbase); - - /* Unreset PCI FIFO and graphic subsystem */ - ISET(sst->fbiInit0, IGET(sst->fbiInit0) & ~SST_PCI_FIFO_RESET); - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit0, IGET(sst->fbiInit0) & ~SST_GRX_RESET); - sst1InitIdleFBINoNOP(sstbase); - - return(FXTRUE); -} - -/* -** sst1InitSetGrxClkICS(): -** Set graphics clock for ICS Dacs -** NOTE: sst1InitSetGrxClkICS() resets the PCI fifo and the graphics subsystem -** of FBI -** -*/ -FxBool sst1InitSetGrxClkICS(FxU32 *sstbase, sst1ClkTimingStruct - *sstGrxClk) -{ - FxU32 n, fbiInit1_save, fbiInit2_save, pllCtrl; - volatile Sstregs *sst = (Sstregs *) sstbase; - - /* Reset graphics unit before we change grx clk */ - ISET(sst->fbiInit0, IGET(sst->fbiInit0) | - (SST_GRX_RESET | SST_PCI_FIFO_RESET)); - sst1InitIdleFBINoNOP(sstbase); - - /* Save init register states before overwriting them */ - fbiInit1_save = IGET(sst->fbiInit1); - fbiInit2_save = IGET(sst->fbiInit2); - - /* Reset video unit to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_RESET); - /* Turn off dram refresh to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit2, IGET(sst->fbiInit2) & ~SST_EN_DRAM_REFRESH); - sst1InitIdleFBINoNOP(sstbase); - - /* Enable reads from the DAC (multiplexed on the fbiInit2 address) */ - /* Disallow writes to pass through the PCI FIFO */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, SST_INITWR_EN | SST_FBIINIT23_REMAP); - sst1InitIdleFBINoNOP(sstbase); - - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_RD, - SST_DACREG_ICS_PLLADDR_CTRL); - pllCtrl = sst1InitDacRd(sstbase, SST_DACREG_ICS_PLLADDR_DATA); - - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_WR, - SST_DACREG_ICS_PLLADDR_GCLK0); - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_DATA, - sstGrxClk->clkTiming_M); - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_DATA, - (((sstGrxClk->clkTiming_P) << 5) | sstGrxClk->clkTiming_N)); - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_WR, - SST_DACREG_ICS_PLLADDR_CTRL); - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_DATA, - (pllCtrl & ~SST_DACREG_ICS_PLLCTRL_CLK1SEL)); - sst1InitIdleFBINoNOP(sstbase); - - /* Disable fbiinit23 address remapping */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, SST_INITWR_EN | SST_PCI_FIFOWR_EN); - - /* Restore init register states */ - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit1, fbiInit1_save); - ISET(sst->fbiInit2, fbiInit2_save); - sst1InitIdleFBINoNOP(sstbase); - - /* Wait for graphics clock to stabilize */ - for(n=0; n<200000; n++) - sst1InitReturnStatus(sstbase); - - /* Unreset PCI FIFO and graphic subsystem */ - ISET(sst->fbiInit0, IGET(sst->fbiInit0) & ~SST_PCI_FIFO_RESET); - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit0, IGET(sst->fbiInit0) & ~SST_GRX_RESET); - sst1InitIdleFBINoNOP(sstbase); - - return(FXTRUE); -} - -/* -** sst1InitSetGrxClkINI(): -** Set graphics clock for dac specified in "voodoo.ini" file -** NOTE: sst1InitSetGrxClkINI() resets the PCI fifo and the graphics subsystem -** of FBI -** -*/ -FxBool sst1InitSetGrxClkINI(FxU32 *sstbase, sst1ClkTimingStruct - *sstGrxClk) -{ - FxU32 n, fbiInit1_save, fbiInit2_save; - sst1InitDacSetMemClkStruct *setMemClk; - FxBool retVal = FXFALSE; - volatile Sstregs *sst = (Sstregs *) sstbase; - - if(iniDac == (sst1InitDacStruct *) NULL) - return(FXFALSE); - - /* Reset graphics unit before we change grx clk */ - ISET(sst->fbiInit0, IGET(sst->fbiInit0) | - (SST_GRX_RESET | SST_PCI_FIFO_RESET)); - sst1InitIdleFBINoNOP(sstbase); - - /* Save init register states before overwriting them */ - fbiInit1_save = IGET(sst->fbiInit1); - fbiInit2_save = IGET(sst->fbiInit2); - - /* Reset video unit to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_RESET); - /* Turn off dram refresh to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit2, IGET(sst->fbiInit2) & ~SST_EN_DRAM_REFRESH); - sst1InitIdleFBINoNOP(sstbase); - - /* Enable reads from the DAC (multiplexed on the fbiInit2 address) */ - /* Disallow writes to pass through the PCI FIFO */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, SST_INITWR_EN | SST_FBIINIT23_REMAP); - sst1InitIdleFBINoNOP(sstbase); - - setMemClk = iniDac->setMemClk; - while(setMemClk) { -#ifdef DIRECTX - if(setMemClk->frequency == FTOL(sstGrxClk->freq) ) { -#else - if(setMemClk->frequency == (FxU32) sstGrxClk->freq) { -#endif - if((retVal = sst1InitExecuteDacRdWr(sstbase, - setMemClk->setMemClkRdWr)) == FXTRUE) { - retVal = FXTRUE; - break; - } - } - setMemClk = setMemClk->nextSetMemClk; - } - /* Disable fbiinit23 address remapping */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, SST_INITWR_EN | SST_PCI_FIFOWR_EN); - - /* Restore init register states */ - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit1, fbiInit1_save); - - ISET(sst->fbiInit2, fbiInit2_save); - sst1InitIdleFBINoNOP(sstbase); - - /* Wait for graphics clock to stabilize */ - if(retVal == FXTRUE) { - for(n=0; n<200000; n++) - sst1InitReturnStatus(sstbase); - } - - /* Unreset PCI FIFO and graphic subsystem */ - ISET(sst->fbiInit0, IGET(sst->fbiInit0) & ~SST_PCI_FIFO_RESET); - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit0, IGET(sst->fbiInit0) & ~SST_GRX_RESET); - sst1InitIdleFBINoNOP(sstbase); - - return(retVal); -} - -/* -** sst1InitSetVidModeATT(): -** Set video Mode for ATT dacs -** -*/ -FxBool sst1InitSetVidModeATT(FxU32 *sstbase, FxU32 video16BPP) -{ - if(sst1InitDacIndexedEnable(sstbase, 1) == FXFALSE) - return(FXFALSE); - - /* Set 16 or 24-bit pixel output */ - if(video16BPP) { - DAC_INDEXWRADDR(SST_DACREG_INDEX_CR0); - DAC_INDEXWR((DAC_INDEXRD() & ~SST_DACREG_CR0_COLOR_MODE) | - SST_DACREG_CR0_COLOR_MODE_16BPP | SST_DACREG_CR0_8BITDAC); - } else { - DAC_INDEXWRADDR(SST_DACREG_INDEX_CR0); - DAC_INDEXWR((DAC_INDEXRD() & ~SST_DACREG_CR0_COLOR_MODE) | - SST_DACREG_CR0_COLOR_MODE_24BPP | SST_DACREG_CR0_8BITDAC); - } - - if(sst1InitDacIndexedEnable(sstbase, 0) == FXFALSE) - return(FXFALSE); - - - return(FXTRUE); -} - -/* -** sst1InitSetVidModeICS(): -** Set video Mode for ICS dacs -** -*/ -FxBool sst1InitSetVidModeICS(FxU32 *sstbase, FxU32 video16BPP) -{ - FxU32 n, fbiInit1_save, fbiInit2_save; - volatile Sstregs *sst = (Sstregs *) sstbase; - - sst1InitIdleFBINoNOP(sstbase); - - /* Save init register states before overwriting them */ - fbiInit1_save = IGET(sst->fbiInit1); - fbiInit2_save = IGET(sst->fbiInit2); - - /* Reset video unit to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_RESET); - /* Turn off dram refresh to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit2, IGET(sst->fbiInit2) & ~SST_EN_DRAM_REFRESH); - sst1InitIdleFBINoNOP(sstbase); - - /* Enable reads from the DAC (multiplexed on the fbiInit2 address) */ - /* Disallow writes to pass through the PCI FIFO */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, SST_INITWR_EN | SST_FBIINIT23_REMAP); - sst1InitIdleFBINoNOP(sstbase); - - if(video16BPP) - sst1InitDacWr(sstbase, SST_DACREG_ICS_CMD, - SST_DACREG_ICS_COLORMODE_16BPP); - else - sst1InitDacWr(sstbase, SST_DACREG_ICS_CMD, - SST_DACREG_ICS_COLORMODE_24BPP); - sst1InitIdleFBINoNOP(sstbase); - - /* Disable fbiinit23 address remapping */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, SST_INITWR_EN | SST_PCI_FIFOWR_EN); - - /* Restore init register states */ - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit1, fbiInit1_save); - ISET(sst->fbiInit2, fbiInit2_save); - sst1InitIdleFBINoNOP(sstbase); - - return(FXTRUE); -} - -/* -** sst1InitSetVidModeINI(): -** Set video Mode for DACs defined in "voodoo.ini" -** -*/ -FxBool sst1InitSetVidModeINI(FxU32 *sstbase, FxU32 video16BPP) -{ - FxU32 n, fbiInit1_save, fbiInit2_save; - sst1InitDacSetVideoModeStruct *setVideoMode; - FxBool retVal = FXFALSE; - volatile Sstregs *sst = (Sstregs *) sstbase; - - if(iniDac == (sst1InitDacStruct *) NULL) - return(FXFALSE); - - sst1InitIdleFBINoNOP(sstbase); - - /* Save init register states before overwriting them */ - fbiInit1_save = IGET(sst->fbiInit1); - fbiInit2_save = IGET(sst->fbiInit2); - - /* Reset video unit to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_RESET); - /* Turn off dram refresh to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit2, IGET(sst->fbiInit2) & ~SST_EN_DRAM_REFRESH); - sst1InitIdleFBINoNOP(sstbase); - - /* Enable reads from the DAC (multiplexed on the fbiInit2 address) */ - /* Disallow writes to pass through the PCI FIFO */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, SST_INITWR_EN | SST_FBIINIT23_REMAP); - sst1InitIdleFBINoNOP(sstbase); - - setVideoMode = iniDac->setVideoMode; - while(setVideoMode) { - if(setVideoMode->video16BPP == video16BPP) { - if((retVal = sst1InitExecuteDacRdWr(sstbase, - setVideoMode->setVideoModeRdWr)) == FXTRUE) { - retVal = FXTRUE; - break; - } - } - setVideoMode = setVideoMode->nextSetVideoMode; - } - sst1InitIdleFBINoNOP(sstbase); - - /* Disable fbiinit23 address remapping */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, SST_INITWR_EN | SST_PCI_FIFOWR_EN); - - /* Restore init register states */ - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit1, fbiInit1_save); - ISET(sst->fbiInit2, fbiInit2_save); - sst1InitIdleFBINoNOP(sstbase); - - return(retVal); -} - -/* -** sst1InitDacIndexedEnable(): -** Initialize DAC for indexed-mode addressing -** NOTE: When DAC indexed-mode addressing is enabled, video timing and -** DRAM refresh are both reset (disabled) -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitDacIndexedEnable(FxU32 *sstbase, - FxU32 Enable) -{ - FxU32 n, j, dacmir, dacdir, cr0_save; - static FxU32 fbiInit1_save = 0; - static FxU32 fbiInit2_save = 0; - volatile Sstregs *sst = (Sstregs *) sstbase; - - if(!sst) - return(FXFALSE); - - sst1InitIdleFBINoNOP(sstbase); - if(!Enable) { - /* Disable indexed-mode addressing */ - sst1InitDacWr(sstbase, SST_DACREG_INDEXADDR, SST_DACREG_INDEX_CR0); - sst1InitDacWr(sstbase, SST_DACREG_INDEXDATA, - sst1InitDacRd(sstbase, SST_DACREG_INDEXDATA) & - ~SST_DACREG_CR0_INDEXED_ADDRESSING); - - /* Disable fbiinit23 address remapping */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, SST_INITWR_EN | SST_PCI_FIFOWR_EN); - - /* Restore init register states */ - sst1InitIdleFBINoNOP(sstbase); - if(fbiInit1_save) /* Have we previously enabled indexed addressing? */ - ISET(sst->fbiInit1, fbiInit1_save); - if(fbiInit2_save) /* Have we previously enabled indexed addressing? */ - ISET(sst->fbiInit2, fbiInit2_save); - sst1InitIdleFBINoNOP(sstbase); - return(FXTRUE); - } - - /* Save init register states before overwriting them */ - fbiInit1_save = IGET(sst->fbiInit1); - fbiInit2_save = IGET(sst->fbiInit2); - - /* Reset video unit to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_RESET); - /* Turn off dram refresh to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit2, IGET(sst->fbiInit2) & ~SST_EN_DRAM_REFRESH); - sst1InitIdleFBINoNOP(sstbase); - - /* Enable reads from the DAC (multiplexed on the fbiInit2 address) */ - /* Disallow writes to pass through the PCI FIFO */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, SST_INITWR_EN | SST_FBIINIT23_REMAP); - sst1InitIdleFBINoNOP(sstbase); - - /* Sometimes the DACs seem to go into never-never land, so */ - /* try and initialize the DAC multiple times */ - n = 0; - while(1) { - if(++n > 100) { - INIT_PRINTF(("sst1InitDacIndexedEnable() ERROR: Could not Initialize DAC\n")); - return(FXFALSE); - } - - /* Must guarantee that no rendering is being performed */ - sst1InitIdleFBINoNOP(sstbase); - - /* Reset current state of DAC command register 0 (CR0) via the read */ - /* mask register (RMR) */ - sst1InitDacWr(sstbase, SST_DACREG_WMA, 0x0); /* reset backdoor fsm */ - sst1InitDacRd(sstbase, SST_DACREG_RMR); /* RMR must be read 5 times */ - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); - cr0_save = sst1InitDacRd(sstbase, SST_DACREG_RMR); - - /* Enable indexed programming by setting CR0[0] = 1 */ - sst1InitDacWr(sstbase, SST_DACREG_WMA, 0x0); /* reset backdoor fsm */ - sst1InitDacRd(sstbase, SST_DACREG_RMR); /* RMR must be read 4 times */ - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacWr(sstbase, SST_DACREG_RMR, ((cr0_save & 0xf0) | - SST_DACREG_CR0_INDEXED_ADDRESSING | SST_DACREG_CR0_8BITDAC)); - - /* NOW DAC IS IN INDEXED ADDRESS MODE... */ - - /* Check the manufacturing ID for sanity */ - j = 0; - DAC_INDEXWRADDR(SST_DACREG_INDEX_MIR); - dacmir = DAC_INDEXRD(); - - if((dacmir == SST_DACREG_INDEX_MIR_ATT_DEFAULT) || - (dacmir == SST_DACREG_INDEX_MIR_TI_DEFAULT)) - j++; - else - continue; - - /* Check the device ID for sanity */ - DAC_INDEXWRADDR(SST_DACREG_INDEX_DIR); - dacdir = DAC_INDEXRD(); - if((dacmir == SST_DACREG_INDEX_MIR_ATT_DEFAULT && - dacdir == SST_DACREG_INDEX_DIR_ATT_DEFAULT) || - (dacmir == SST_DACREG_INDEX_MIR_TI_DEFAULT && - dacdir == SST_DACREG_INDEX_DIR_TI_DEFAULT)) - j++; - else - continue; - if(j == 2) - break; - } - sst1InitIdleFBINoNOP(sstbase); - return(FXTRUE); -} - -#pragma optimize ("",on) diff --git a/glide2x/sst1/init/initvg/gamma.c b/glide2x/sst1/init/initvg/gamma.c deleted file mode 100644 index b1c6c74..0000000 --- a/glide2x/sst1/init/initvg/gamma.c +++ /dev/null @@ -1,256 +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$ -** -** Initialization code for loading SST-1 gamma tables -** -*/ -#pragma optimize ("",off) -#include -#include -#include -#include -#define FX_DLL_DEFINITION -#include -#include -#include - -/* -** sst1InitGamma(): -** Load the video color-lookup tables with the specified gamma function -** -** Returns: -** FXTRUE if successfully initializes SST-1 gamma tables -** FXFALSE if cannot initialize SST-1 gamma tables -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitGamma(FxU32 *sstbase, double gamma) -{ - static FxBool calledBefore = FXFALSE; - static FxBool overRideR = FXFALSE; - static FxBool overRideG = FXFALSE; - static FxBool overRideB = FXFALSE; - static double gammaR, gammaG, gammaB; - - if(!sstbase) - return(FXFALSE); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - if(overRideR == FXFALSE) - gammaR = gamma; - if(overRideG == FXFALSE) - gammaG = gamma; - if(overRideB == FXFALSE) - gammaB = gamma; - - if(calledBefore == FXFALSE) { - calledBefore = FXTRUE; - if(GETENV(("SST_RGAMMA"))) { - overRideR = FXTRUE; - gammaR = (double) ATOF(GETENV(("SST_RGAMMA"))); - } - if(GETENV(("SST_GGAMMA"))) { - overRideG = FXTRUE; - gammaG = (double) ATOF(GETENV(("SST_GGAMMA"))); - } - if(GETENV(("SST_BGAMMA"))) { - overRideB = FXTRUE; - gammaB = (double) ATOF(GETENV(("SST_BGAMMA"))); - } - if(GETENV(("SST_GAMMA"))) { - overRideR = FXTRUE; - overRideG = FXTRUE; - overRideB = FXTRUE; - gammaR = (double) ATOF(GETENV(("SST_GAMMA"))); - gammaG = gammaR; - gammaB = gammaR; - } - } - return(sst1InitGammaRGB(sstbase, gammaR, gammaG, gammaB)); -} - -FX_EXPORT FxBool FX_CSTYLE sst1InitGammaRGB(FxU32 *sstbase, double gammaR, - double gammaG, double gammaB) -{ - FxU32 x, n; - FxU32 gammaTableR[256]; - FxU32 gammaTableG[256]; - FxU32 gammaTableB[256]; - FxBool sstVideoIsReset; - static FxBool calledBefore = FXFALSE; - volatile Sstregs *sst = (Sstregs *) sstbase; - - if(!sstbase) - return(FXFALSE); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - /* Enable video clock */ - if(calledBefore == FXFALSE && !sst1InitSliEnabled) { - if(SLI_DRIVEOK()) { - INIT_PRINTF(("sst1InitGammaRGB(): Enabling Video Clock...\n")); - PCICFG_WR(SST1_PCI_VCLK_ENABLE, 0x0); - } - INIT_PRINTF(("sst1InitGammaRGB(): Setting GammaRGB = (%.2f,%.2f,%.2f)\n", - gammaR, gammaG, gammaB)); - } - - /* Initialize the gamma table */ - for(x=0; x<256; x++) { - gammaTableR[x] = FTOL (POW(x/255.0F, 1.0F/gammaR) * 255.0F + 0.5F); - gammaTableG[x] = FTOL (POW(x/255.0F, 1.0F/gammaG) * 255.0F + 0.5F); - gammaTableB[x] = FTOL (POW(x/255.0F, 1.0F/gammaB) * 255.0F + 0.5F); - } - - /* SST-1 video reset must be inactive to load gamma tables */ - sst1InitIdleFBINoNOP(sstbase); - if(!sst1InitSliEnabled) { - if(IGET(sst->fbiInit1) & SST_VIDEO_RESET) - sstVideoIsReset = FXTRUE; - else - sstVideoIsReset = FXFALSE; - - ISET(sst->fbiInit1, IGET(sst->fbiInit1) & ~SST_VIDEO_RESET); - /* wait for video reset to be deasserted */ - sst1InitIdleFBINoNOP(sstbase); - } - - /* SST-1 requires every eighth entry of the gamma table to be loaded, */ - /* so only 32 basic writes are required. A 33rd write is used to load */ - /* the top entry of the gamma table. The 33rd entry is necessary because */ - /* SST-1 performs linear interpolation between each gamma table entry to */ - /* generate 256 unique gamma-corrected values. */ - for(x=0; x<32; x++) { - FxU32 gcR = gammaTableR[(x<<3)]; - FxU32 gcG = gammaTableG[(x<<3)]; - FxU32 gcB = gammaTableB[(x<<3)]; - ISET(sst->clutData, ((x<clutData, (32<fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_RESET); - } - - if(calledBefore == FXFALSE) { - calledBefore = FXTRUE; - INIT_PRINTF(("sst1InitGammaRGB() exiting with status %d...\n", FXTRUE)); - } - return(FXTRUE); -} - -FX_EXPORT FxBool FX_CSTYLE sst1InitGammaTable(FxU32 *sstbase, FxU32 nentries, -FxU32 *r, FxU32 *g, FxU32 *b) -{ - FxU32 x, n; - FxU32 gammaTableR[256]; - FxU32 gammaTableG[256]; - FxU32 gammaTableB[256]; - FxBool sstVideoIsReset; - static FxBool calledBefore = FXFALSE; - volatile Sstregs *sst = (Sstregs *) sstbase; - - if(!sstbase) - return(FXFALSE); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - /* Enable video clock */ - if(calledBefore == FXFALSE && !sst1InitSliEnabled) { - if(SLI_DRIVEOK()) { - INIT_PRINTF(("sst1InitGammaRGB(): Enabling Video Clock...\n")); - PCICFG_WR(SST1_PCI_VCLK_ENABLE, 0x0); - } - } - - /* Initialize the gamma table */ - for(x=0; xfbiInit1) & SST_VIDEO_RESET) - sstVideoIsReset = FXTRUE; - else - sstVideoIsReset = FXFALSE; - - ISET(sst->fbiInit1, IGET(sst->fbiInit1) & ~SST_VIDEO_RESET); - /* wait for video reset to be deasserted */ - sst1InitIdleFBINoNOP(sstbase); - } - - /* SST-1 requires every eighth entry of the gamma table to be loaded, */ - /* so only 32 basic writes are required. A 33rd write is used to load */ - /* the top entry of the gamma table. The 33rd entry is necessary because */ - /* SST-1 performs linear interpolation between each gamma table entry to */ - /* generate 256 unique gamma-corrected values. */ - for(x=0; x<32; x++) { - FxU32 gcR = gammaTableR[(x<<3)]; - FxU32 gcG = gammaTableG[(x<<3)]; - FxU32 gcB = gammaTableB[(x<<3)]; - ISET(sst->clutData, ((x<clutData, (32<fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_RESET); - } - - if(calledBefore == FXFALSE) { - calledBefore = FXTRUE; - INIT_PRINTF(("sst1InitGammaRGB() exiting with status %d...\n", FXTRUE)); - } - return(FXTRUE); -} - -#pragma optimize ("",on) diff --git a/glide2x/sst1/init/initvg/gdebug.c b/glide2x/sst1/init/initvg/gdebug.c deleted file mode 100644 index b1903f0..0000000 --- a/glide2x/sst1/init/initvg/gdebug.c +++ /dev/null @@ -1,264 +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 -#include - -#include -#include - -#ifdef __WIN32__ -#define WIN32_LEAN_AND_MEAN -#include -#endif - -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include "gdebug.h" - -#define GETENV getenv - -static char *gdbg_myname = "gd"; // default library name -static char gdbg_debuglevel[GDBG_MAX_LEVELS]; // array of debuglevel controls - -static long gdbg_errors = 0; - -static FxBool UseDebugString; - -static FILE *gdbg_msgfile = NULL; /*stdout;*/ // GDBG info/error file - -//---------------------------------------------------------------------- -// initialize gdbg_level from an environment variable -//---------------------------------------------------------------------- -static char *setRange(char *buf, int val) -{ - int r0,r1,pos; - - sscanf(buf,"%i%n",&r0,&pos); // parse the first integer - if (buf[pos]=='-' || buf[pos]==':') // if there's a second - sscanf(buf+pos+1,"%i%n",&r1,&pos); // then parse it - else - r1 = r0; - - if (r0 < 0) r0 = 0; // sanity checks - if (r1 >= GDBG_MAX_LEVELS) r1 = GDBG_MAX_LEVELS-1; - if (r1 < r0) r1 = r0; - - while (r0 <= r1) // now set the debuglevel levels - gdbg_debuglevel[r0++] = val; - - return buf + pos; // and return rest of string -} - -static void parse(char *env) -{ - int level, pos; - - do { - if (env[0] == ',') // advance past commas - env++; - if (env[0] == '+') // if + then enable a range - env = setRange(env+1,1); - else if (env[0] == '-') // if - then disable a range - env = setRange(env+1,0); - else { // else just a number - if (EOF == sscanf(env,"%i%n",&level,&pos)) return; - if (pos==0) return; // oops, guess not - if (level >= GDBG_MAX_LEVELS) level = GDBG_MAX_LEVELS-1; - while (level >= 0) // enable the range [0,#] - gdbg_debuglevel[level--] = 1; - env += pos; - } - } while (env[0] == ','); -} - -void FX_EXPORT FX_CSTYLE -gdbg_init(void) -{ - static int done=0; // only execute once - char *env; - - if (done) return; - - /* I can't init gdbg_msgfile to stdout since it isn't constant so - * I do it now */ - gdbg_msgfile = stdout; - - done = 1; - gdbg_debuglevel[0] = 1; // always enable level 0 - env = GETENV("GDBG_FILE"); - if (env != NULL) GDBG_SET_FILE(env); - env = GETENV("GDBG_LEVEL"); - if (env == NULL) env = "0"; - parse(env); - gdbg_info(1,"gdbg_init(): debug level = %s\n",env); -} - -void FX_EXPORT FX_CSTYLE -gdbg_shutdown(void) -{ - gdbg_info(1,"gdbg_shutdown()\n"); - if (gdbg_msgfile != stdout) { // close any existing output file - fclose(gdbg_msgfile); - gdbg_msgfile = stdout; - } -} - -//---------------------------------------------------------------------- -// the MAIN message display suboutine - ALL messages come thru here -//---------------------------------------------------------------------- -void FX_EXPORT FX_CSTYLE -gdbg_vprintf (const char *format,va_list args) -{ - - if (gdbg_msgfile != NULL) { - if (!UseDebugString) { - - vfprintf(gdbg_msgfile,format,args); - - fflush(gdbg_msgfile); - } -#ifdef __WIN32__ - else { - char msgString[1024]; - - vsprintf(msgString, format, args); - OutputDebugString(msgString); - } -#endif - } -} - -void FX_EXPORT FX_CSTYLE -gdbg_printf (const char *format, ...) -{ - va_list args; - - va_start(args, format); - gdbg_vprintf(format,args); - va_end(args); -} - -//---------------------------------------------------------------------- -// INFO message subroutines -//---------------------------------------------------------------------- - -//---------------------------------------------------------------------- -// display an INFO message if level <= debug level and return whether -// debug level high enough to allow display -//---------------------------------------------------------------------- -int FX_EXPORT FX_CSTYLE -gdbg_info (const int level, const char *format, ...) -{ - va_list args; - char newformat[4095]; - - if (!gdbg_debuglevel[level>=GDBG_MAX_LEVELS ? GDBG_MAX_LEVELS-1 : level]) - return(0); - va_start(args, format); - sprintf(newformat, "%s.%d:\t", gdbg_myname,level); - strcat(newformat,format); - gdbg_vprintf(newformat,args); - va_end(args); - return (1); -} - -//---------------------------------------------------------------------- -// same as gdbg_info but does not display INFO header -//---------------------------------------------------------------------- -int FX_EXPORT FX_CSTYLE -gdbg_info_more (const int level, const char *format, ...) -{ - va_list args; - - if (!gdbg_debuglevel[level>=GDBG_MAX_LEVELS ? GDBG_MAX_LEVELS-1 : level]) - return(0); - va_start(args, format); - gdbg_vprintf(format,args); - va_end(args); - return (1); -} - -//---------------------------------------------------------------------- -// ALL errors must come thru here, this subroutine adds a preamble -// and then displays the message and increments the error counter -//---------------------------------------------------------------------- -void FX_EXPORT FX_CSTYLE -gdbg_error (const char *kind, const char *format, ...) -{ - va_list args; - - char newformat[1024]; - - va_start(args, format); - sprintf(newformat, "%s error (%s): ", gdbg_myname,kind); - strcat(newformat,format); // add a preamble to message - gdbg_vprintf(newformat,args); - gdbg_errors++; // increment the error counter - va_end(args); -} - -// return the error counter -int FX_EXPORT FX_CSTYLE -gdbg_get_errors(void) -{ - return gdbg_errors; -} - -// return a debuglevel level -int FX_EXPORT FX_CSTYLE -gdbg_get_debuglevel(const int level) -{ - return gdbg_debuglevel[level>=GDBG_MAX_LEVELS ? GDBG_MAX_LEVELS-1 : level]; -} - -// set a debuglevel level -void FX_EXPORT FX_CSTYLE -gdbg_set_debuglevel(const int level, const int value) -{ - gdbg_debuglevel[level>=GDBG_MAX_LEVELS ? GDBG_MAX_LEVELS-1 : level] = value; -} - -// open up a new output file -int FX_EXPORT FX_CSTYLE -gdbg_set_file(const char *name) -{ - FILE *outf; - - if (gdbg_msgfile != stdout) { // close any existing output file - fclose(gdbg_msgfile); - gdbg_msgfile = stdout; - } -#ifdef __WIN32__ - else if (!strcmp(name, "DEBUG")) { - gdbg_msgfile = (FILE *) 1; - UseDebugString = 1; - } -#endif - else { - outf = fopen(name,"w"); // open up a new one - if (outf) gdbg_msgfile = outf; - return outf != NULL; - } -} diff --git a/glide2x/sst1/init/initvg/gdebug.h b/glide2x/sst1/init/initvg/gdebug.h deleted file mode 100644 index bb61280..0000000 --- a/glide2x/sst1/init/initvg/gdebug.h +++ /dev/null @@ -1,68 +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 __GDEBUG_H__ -#define __GDEBUG_H__ - -/* -** $Revision$ -** $Date$ -*/ - -#include -#include <3dfx.h> - -#define GDBG_MAX_LEVELS 512 - -// if debug info turned on then GDBG_INFO does something -#ifdef GDBG_INFO_ON - -#define GDBG_INFO(a) gdbg_info a -#define GDBG_INFO_MORE(a) gdbg_info_more a -#define GDBG_PRINTF(a) gdbg_printf a - -// otherwise GDBG_INFO does nothing -#else - -#define GDBG_INFO(a) -#define GDBG_INFO_MORE(a) -#define GDBG_PRINTF(a) - -#endif - -#define GDBG_INIT gdbg_init -#define GDBG_ERROR gdbg_error -#define GDBG_GET_ERRORS gdbg_get_errors -#define GDBG_GET_DEBUGLEVEL gdbg_get_debuglevel -#define GDBG_SET_DEBUGLEVEL gdbg_set_debuglevel -#define GDBG_SET_FILE gdbg_set_file - -FX_ENTRY void FX_CALL gdbg_init(void); -FX_ENTRY void FX_CALL gdbg_vprintf(const char *format, va_list); -FX_ENTRY void FX_CALL gdbg_printf(const char *format, ...); -FX_ENTRY int FX_CALL gdbg_info(const int level, const char *format, ...); -FX_ENTRY int FX_CALL gdbg_info_more(const int level, const char *format, ...); -FX_ENTRY void FX_CALL gdbg_error(const char *name, const char *format, ...); -FX_ENTRY int FX_CALL gdbg_get_errors(void); -FX_ENTRY int FX_CALL gdbg_get_debuglevel(const int level); -FX_ENTRY void FX_CALL gdbg_set_debuglevel(const int level, const int value); -FX_ENTRY int FX_CALL gdbg_set_file(const char *name); - -#endif /* !__GDEBUG_H__ */ diff --git a/glide2x/sst1/init/initvg/info.c b/glide2x/sst1/init/initvg/info.c deleted file mode 100644 index 23c7426..0000000 --- a/glide2x/sst1/init/initvg/info.c +++ /dev/null @@ -1,589 +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$ -** -** Routines to detect memory size, strapping pin, and other initialization -** configuration information. -** -*/ -#pragma optimize ("",off) -#include -#include -#include -#define FX_DLL_DEFINITION -#include -#include -#include - -#define XY_ONE (1<lfbMode, SST_LFB_RGBALANES_ARGB | SST_LFB_READFRONTBUFFER); - sst1InitIdle(sstbase); - if (x & 1) { - INIT_PRINTF(("ERROR: readAndSum4x4 must have an even X (%d)\n", x)); - return(FXFALSE); - } - - /* get 16 pixels (4 x 4 array) from frame buffer and sum the colors */ - *r_sum = 0; - *g_sum = 0; - *b_sum = 0; - - for (rd_y = 0; rd_y < 4; rd_y++) { /* read 4 scanlines */ - for (rd_x = 0; rd_x < 4; rd_x ++) { - if ((rd_x & 1)==0) { /* read 2 pixels at a time */ - rd_col = - IGET(sstbase[(SST_LFB_ADDR + (y+rd_y)*2048 + (x+rd_x)*2) >> 2]); - } - else rd_col >>= 16; - rd_r = ((rd_col >> 11) & 0x1f) << 3; - rd_g = ((rd_col >> 5) & 0x3f) << 2; - rd_b = ((rd_col >> 0) & 0x1f) << 3; - *r_sum += rd_r; - *g_sum += rd_g; - *b_sum += rd_b; - INIT_INFO((4,"%d,%d = rd_col: 0x%04x rgb: %02x %02x %02x\n", - rd_x, rd_y, (rd_col & 0xffff), rd_r, rd_g, rd_b)); - } - } - INIT_INFO((3,"sums: r_sum=0x%03x g_sum=0x%03x b_sum=0x%03x\n", - *r_sum, *g_sum, *b_sum)); - return(FXTRUE); -} - -/* xxx - Give these guys some meaningful comments */ -static FxI32 rb_tbl[0xFFF+1]; -static FxI32 g_tbl[0xFFF+1]; - -/* draw a right angle triangle */ -static void -drawTriangle(volatile Sstregs *sst, int x, int y, int tSize) -{ - ISET(sst->vA.x,x); - ISET(sst->vA.y,y); - ISET(sst->vB.x,x+XY_ONE*tSize); - ISET(sst->vB.y,y); - ISET(sst->vC.x,x); - ISET(sst->vC.y,y+XY_ONE*tSize); - ISET(sst->s,0); - ISET(sst->t,0); - ISET(sst->w,0); - ISET(sst->dsdx,1<dtdx,0); - ISET(sst->dwdx,0); - ISET(sst->dsdy,0); - ISET(sst->dtdy,1<dwdy,0); - ISET(sst->triangleCMD,0); -} - -static FxBool -initSumTables(FxU32 *sstbase) -{ - int x=0,y=0; - FxU32 tst_color; - FxU32 r_sum, g_sum, b_sum; - volatile Sstregs *sst = (Sstregs *) sstbase; - - /* init sum array */ - for (r_sum = 0; r_sum <= 0xfff; r_sum++) { - rb_tbl[r_sum] = -1; - g_tbl[r_sum] = -1; - } - - ISET(sst->fbzColorPath, SST_RGBSEL_C1 | SST_CC_PASS); - ISET(sst->fbzMode, SST_DRAWBUFFER_FRONT | SST_RGBWRMASK | SST_ENDITHER); - - /* fill sum array */ - for (tst_color = 0; tst_color <= 255; tst_color++) { - INIT_INFO((2,"tst_color=0x%02x\n", tst_color)); - ISET(sst->c1, (tst_color << 16) | (tst_color << 8) | tst_color); - - drawTriangle(sst, x,y,36); - if(readAndSum4x4(sstbase, x,y, &r_sum,&g_sum,&b_sum) == FXFALSE) - return(FXFALSE); - - /* check sums for uniqueness and then store away */ - if (r_sum != b_sum) { - INIT_PRINTF(("ERROR: b_sum=0x%03x r_sum=0x%03x\n", r_sum, b_sum)); - return(FXFALSE); - } - if (rb_tbl[r_sum] != -1) { - INIT_PRINTF(("ERROR: non-unique r/b_sum=0x%03x\n", r_sum)); - return(FXFALSE); - } - rb_tbl[r_sum] = tst_color; - if (g_tbl[g_sum] != -1) { - INIT_PRINTF(("ERROR: non-unique g_sum=0x%03x\n", g_sum)); - return(FXFALSE); - } - g_tbl[g_sum] = tst_color; - } - return(FXTRUE); -} - -/* remove dither to derive actual 24-bit RGB value */ -static FxBool -unDither(FxU32 r_sum, FxU32 g_sum, FxU32 b_sum, FxU32 *result) -{ - if (rb_tbl[r_sum] == -1 || g_tbl[g_sum] == -1 || rb_tbl[b_sum] == -1) - { - INIT_PRINTF(("ERROR: unDither: invalid color sum\n")); - return(FXFALSE); - } - *result = (rb_tbl[r_sum] << 16) | (g_tbl[g_sum] << 8) | rb_tbl[b_sum]; - return(FXTRUE); -} - -static FxBool -getTmuConfigData(FxU32 *sstbase, sst1DeviceInfoStruct *info) -{ - int x=0, y=0; - FxU32 r_sum, g_sum, b_sum; - volatile Sstregs *sst = (Sstregs *) sstbase; - - /* set trex's (all 3) to output configuration bits */ - ISET(SST_TREX(sst,0)->trexInit1, info->tmuInit1[0] | (1 << 18)); - ISET(SST_TREX(sst,1)->trexInit1, info->tmuInit1[1] | (1 << 18)); - ISET(SST_TREX(sst,2)->trexInit1, info->tmuInit1[2] | (1 << 18)); - - /* render into the frame buffer */ - ISET(sst->fbzColorPath, - SST_RGBSEL_TREXOUT | SST_CC_PASS | SST_ENTEXTUREMAP); - ISET(sst->texBaseAddr, 0); - ISET(sst->textureMode, SST_AI88 | SST_TC_PASS | SST_TCA_PASS); - ISET(sst->tLOD, 0); - drawTriangle(sst,x,y,36); - - readAndSum4x4(sstbase, x,y, &r_sum,&g_sum,&b_sum); - if(unDither(r_sum,g_sum,b_sum,&info->tmuConfig) == FXFALSE) - return(FXFALSE); - if(GETENV(("SST_TMUCFG"))) - SSCANF(GETENV(("SST_TMUCFG")), "%i", &info->tmuConfig); - - /* reset trex's init registers */ - ISET(SST_TREX(sst,0)->trexInit1, info->tmuInit1[0]); - ISET(SST_TREX(sst,1)->trexInit1, info->tmuInit1[1]); - ISET(SST_TREX(sst,2)->trexInit1, info->tmuInit1[2]); - - return(FXTRUE); -} - -#define SENSE2 0x92F56EB0 -#define SENSE1 0xF2A916B5 -#define SENSE0 0xBADBEEF1 - -static FxU32 sense(FxU32 *sstbase, sst1DeviceInfoStruct *info, FxU32 tmu, - FxU32 mem, FxU32 init) -{ - volatile Sstregs *sst = (Sstregs *) sstbase; - FxU32 *texAddr = (tmu<<(21-2)) + (FxU32 *)SST_TEX_ADDRESS(sst); - - /* set the Init0 register to enable ? MBytes of memory */ - sst1InitIdle(sstbase); - ISET(SST_TREX(sst,tmu)->trexInit0, init | (info->tmuInit0[tmu] & ~0x7000)); - sst1InitIdle(sstbase); - - ISET(sst->texBaseAddr, 0x200000>>3); /* set to 2 MB */ - texAddr[0] = SENSE2; /* write a random value */ - ISET(sst->texBaseAddr, 0x100000>>3); /* set to 1 MB */ - texAddr[0] = SENSE1; /* write a random value */ - ISET(sst->texBaseAddr, 0x000000>>3); /* set to 0 MB */ - texAddr[0] = SENSE0; /* write a random value */ - - ISET(sst->texBaseAddr, mem>>3); /* reset to 2 MB */ - drawTriangle(sst,0,0,4); /* draw a 4x4 right triangle */ - sst1InitIdle(sstbase); - - mem = IGET(sstbase[SST_LFB_ADDR>>2]); - INIT_INFO((2,"data=0x%08x\n", mem)); - - /* reset the Init0 register back to its previous value */ - sst1InitIdle(sstbase); - ISET(SST_TREX(sst,tmu)->trexInit0, info->tmuInit0[tmu]); - sst1InitIdle(sstbase); - return mem; -} - -FX_EXPORT FxBool FX_CSTYLE -sst1InitGetTmuMemory(FxU32 *sstbase, sst1DeviceInfoStruct *info, FxU32 tmu, - FxU32 *TmuMemorySize) -{ - FxU32 i,data; - volatile Sstregs *sst = (Sstregs *) sstbase; - - INIT_INFO((1,"sst1InitGetTmuMemory(0x%x, , %d)\n", sstbase,tmu)); - - if(GETENV(("SST_TMUMEM_SIZE"))) { - *TmuMemorySize = ATOI(GETENV(("SST_TMUMEM_SIZE"))); - return(FXTRUE); - } - - ISET(sst->lfbMode, SST_LFB_RGBALANES_ARGB | SST_LFB_READFRONTBUFFER); - ISET(sst->fbzMode, SST_DRAWBUFFER_FRONT | SST_RGBWRMASK); - ISET(sst->fbzColorPath, - SST_RGBSEL_TREXOUT | SST_CC_PASS | SST_ENTEXTUREMAP); - ISET(sst->textureMode, SST_RGB565 | SST_TC_REPLACE | SST_TCA_REPLACE); - ISET(sst->tLOD, 0); - - /* setup all downstream TMUs to be in pass-thru mode */ - for (i=0; itextureMode, SST_TC_PASS | SST_TCA_PASS); - - /* first see if we have 4 Mbytes by writing a texel at 2MB followed by - a texel at 1MB and 0MB and then rendering using the texel at 2MB - if we have less memory it should not render correctly since we trash - the memory locations it would wrap to - */ - - data = sense(sstbase,info,tmu,0x200000, 0x5000); - if (data == SENSE2) {*TmuMemorySize = 4; return(FXTRUE);} - - /* set the Init0 register to enable 2 MBytes of memory and repeat test */ - data = sense(sstbase,info,tmu,0x100000, 0x2000); - if (data == SENSE1) {*TmuMemorySize = 2; return(FXTRUE);} - - /* set the Init0 register to enable 1 MBytes of memory and repeat test */ - data = sense(sstbase,info,tmu,0x000000, 0x2000); - if (data == SENSE0) {*TmuMemorySize = 1; return(FXTRUE);} - - INIT_PRINTF(("sst1InitGetTmuMemory() ERROR: Could not detect memory size.\n")); - return(FXFALSE); -} - -/*--------------------------------------------------------------------------- - NOTES: - assumes that board and registers are initialized - destroys part of the framebuffer - ---------------------------------------------------------------------------*/ -FX_EXPORT FxBool FX_CSTYLE -sst1InitGetTmuInfo(FxU32 *sstbase, sst1DeviceInfoStruct *info) -{ - FxU32 trev; - - if(initSumTables(sstbase) == FXFALSE) - return(FXFALSE); - if(getTmuConfigData(sstbase,info) == FXFALSE) - return(FXFALSE); - - /* TMU memory speed */ - /* tmuClkFixed is no longer used... */ - info->tmuClkFixed = 0x0; - /* tmuMemSpeed is legacy, and is not used by either Obsidian GE or Pro Fab */ - info->tmuMemSpeed = 0; - - /* count the TMUs and verify that all TMUs are the same revision */ - info->tmuRevision = info->tmuConfig & 0x7; - info->numberTmus = 1; - if(sst1InitGetTmuMemory(sstbase, info, 0, &info->tmuMemSize[0]) == FXFALSE) - return(FXFALSE); - INIT_INFO((1,"TMU0 memory = %d MB\n", info->tmuMemSize[0])); - if (info->tmuConfig & FXBIT(6)) { /* if TMU 1 exists */ - info->numberTmus++; /* increment TMU count */ - trev = (info->tmuConfig>>7) & 0x7; /* get its revision */ - if (info->tmuRevision != trev) { - INIT_PRINTF(("sst1InitGetDeviceInfo: ERROR, multiple different TMU revision IDs detected\n")); - return(FXFALSE); - } - if(sst1InitGetTmuMemory(sstbase, info, 1, &info->tmuMemSize[1]) == FXFALSE) - return(FXFALSE); - } - if (info->tmuConfig & FXBIT(13)) { /* if TMU 2 exists */ - info->numberTmus++; /* increment TMU count */ - trev = (info->tmuConfig>>14) & 0x7; /* get its revision */ - if (info->tmuRevision != trev) { - INIT_PRINTF(("sst1InitGetDeviceInfo: ERROR, multiple different TMU revision IDs detected\n")); - return(FXFALSE); - } - if(sst1InitGetTmuMemory(sstbase, info, 2, &info->tmuMemSize[2]) == FXFALSE) - return(FXFALSE); - } - INIT_INFO((1,"numberTMus = %d\n", info->numberTmus)); - return(FXTRUE); -} - -/* -** fbiMemSize(): -** Returns size (in MBytes) of FBI frame buffer memory -** Returns 0 on error -** NOTE: fbiMemSize() destroys the contents in memory -** -*/ -#define LFB_PUTPIXEL(X, Y, DATA) \ - ISET(lfbptr[((SST_LFB_ADDR+(X<<1)+(Y<<11))>>1)], DATA) -#define LFB_GETPIXEL(X, Y) \ - IGET(lfbptr[((SST_LFB_ADDR+(X<<1)+(Y<<11))>>1)]) - -static int fbiMemSize(FxU32 *sstbase) -{ - volatile Sstregs *sst = (Sstregs *) sstbase; - volatile unsigned short *lfbptr = (unsigned short *) sstbase; - FxU32 init0Save = IGET(sst->fbiInit0); - FxU32 init1Save = IGET(sst->fbiInit1); - FxU32 init2Save = IGET(sst->fbiInit2); - int retval = 0; - - if(GETENV(("SST_FBIMEM_SIZE"))) - return(ATOI(GETENV(("SST_FBIMEM_SIZE")))); - - /* Enable dram refresh, disable memory fifo, and setup memory */ - /* for rendering */ - ISET(sst->fbiInit0, IGET(sst->fbiInit0) & ~SST_MEM_FIFO_EN); - ISET(sst->fbiInit2, IGET(sst->fbiInit2) | SST_EN_DRAM_REFRESH); - sst1InitIdleFBI(sstbase); - - /* Setup Basic rendering datapath */ - ISET(sst->fbzColorPath, SST_CC_MONE); - ISET(sst->fogMode, 0x0); - ISET(sst->fbzMode, SST_RGBWRMASK | SST_ZAWRMASK | SST_DRAWBUFFER_FRONT); - sst1InitIdleFBI(sstbase); - - if(sst1InitSliDetect(sstbase)) - /* SLI cannot support 4 MBytes... */ - goto check2MByte; - sst1InitSetResolution(sstbase, &SST_VREZ_800X600_60, 1); - sst1InitIdleFBI(sstbase); - - ISET(sst->lfbMode, SST_LFB_ZZ | SST_LFB_WRITEFRONTBUFFER | - SST_LFB_READDEPTHABUFFER); - sst1InitIdleFBI(sstbase); - - /* Check for 4 MBytes... */ - /* Write to Zbuffer in 800x600 resolution in upper 2 MBytes of memory */ - LFB_PUTPIXEL(128, 100, 0xdead); /* maps to row:0x216, col:0x80, bank:0x1 */ - LFB_PUTPIXEL(0, 0, 0x0); - LFB_PUTPIXEL(798, 599, 0xffff); - LFB_PUTPIXEL(200, 200, 0x55aa); /* maps to row:0x23d, col:0x104, bank:0x0 */ - LFB_PUTPIXEL(20, 20, 0xffff); - LFB_PUTPIXEL(400, 400, 0x0); - sst1InitIdleFBI(sstbase); - if((LFB_GETPIXEL(128, 100) == 0xdead) && - (LFB_GETPIXEL(200, 200) == 0x55aa)) { - retval = 4; - ISET(sst->lfbMode, (SST_LFB_565 | SST_LFB_READBACKBUFFER)); - sst1InitIdleFBI(sstbase); - goto fbiMemSizeDone; - } - -check2MByte: - /* Check for 2 MBytes... */ - /* Write to color buffer in 640x480 resolution */ - sst1InitSetResolution(sstbase, &SST_VREZ_640X480_60, 0); - ISET(sst->lfbMode, SST_LFB_565 | SST_LFB_WRITEFRONTBUFFER | - SST_LFB_READFRONTBUFFER); - sst1InitIdleFBI(sstbase); - LFB_PUTPIXEL(50, 100, 0xdead); /* maps to row:0x1e, col:0x99, bank:0x0 */ - LFB_PUTPIXEL(0, 0, 0x0); - LFB_PUTPIXEL(638, 479, 0xffff); - ISET(sst->lfbMode, SST_LFB_565 | SST_LFB_WRITEBACKBUFFER | - SST_LFB_READFRONTBUFFER); - sst1InitIdleFBI(sstbase); - LFB_PUTPIXEL(178, 436, 0xaa55); /* maps to row:0x11e, col:0x99, bank:0x0 */ - LFB_PUTPIXEL(20, 20, 0x0); - LFB_PUTPIXEL(400, 400, 0xffff); - sst1InitIdleFBI(sstbase); - if(LFB_GETPIXEL(50, 100) != 0xdead) - goto check1MByte; - ISET(sst->lfbMode, (SST_LFB_565 | SST_LFB_READBACKBUFFER)); - sst1InitIdleFBI(sstbase); - if(LFB_GETPIXEL(178, 436) == 0xaa55) { - retval = 2; - goto fbiMemSizeDone; - } - -check1MByte: - ISET(sst->lfbMode, SST_LFB_565 | SST_LFB_WRITEFRONTBUFFER | - SST_LFB_READFRONTBUFFER); - sst1InitIdleFBI(sstbase); - LFB_PUTPIXEL(10, 10, 0xdead); /* maps to row:0x0, col:0x145, bank:0x0 */ - LFB_PUTPIXEL(8, 8, 0x0); - LFB_PUTPIXEL(340, 340, 0xffff); - LFB_PUTPIXEL(100, 200, 0x5a5a); /* maps to row:0x3c, col:0x112, bank:0x1 */ - LFB_PUTPIXEL(66, 0, 0x0); - LFB_PUTPIXEL(360, 360, 0xffff); - sst1InitIdleFBI(sstbase); - if((LFB_GETPIXEL(10, 10) == 0xdead) && - (LFB_GETPIXEL(100, 200) == 0x5a5a)) - retval = 1; - -fbiMemSizeDone: - /* Restore init registers to original state */ - ISET(sst->fbiInit0, init0Save); - ISET(sst->fbiInit1, init1Save); - ISET(sst->fbiInit2, init2Save); - sst1InitIdleFBI(sstbase); - - return(retval); -} - -FX_EXPORT FxBool FX_CSTYLE -sst1InitGetFbiInfo(FxU32 *sstbase, sst1DeviceInfoStruct *info) -{ - volatile Sstregs *sst = (Sstregs *) sstbase; - - info->fbiMemSize = fbiMemSize(sstbase); - - /* Detect board identification and memory speed */ - if(GETENV(("SST_FBICFG"))) - SSCANF(GETENV(("SST_FBICFG")), "%i", &info->fbiConfig); - else - info->fbiConfig = (IGET(sst->fbiInit3) & SST_FBI_MEM_TYPE) >> - SST_FBI_MEM_TYPE_SHIFT; - - info->fbiBoardID = (info->fbiConfig >> 2) & 0x1; - /* fbiMemSpeed is legacy, and is not used by either Obsidian GE or Pro Fab */ - info->fbiMemSpeed = 0; - - /* Detect scanline interleaving */ - info->sstSliDetect = sst1InitSliDetect(sstbase); - - return FXTRUE; -} - -/* -** sst1InitGetDeviceInfo(): -** Read device specific information -** NOTE: info pointer must point to an Info structure which has already -** been allocated -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitGetDeviceInfo(FxU32 *sstbase, - sst1DeviceInfoStruct *info) -{ - FxBool retval; - - if((retval = sst1InitCheckBoard(sstbase)) == FXTRUE) - *info = *sst1CurrentBoard; - return(retval); -} - -/* -** sst1InitFillDeviceInfo(): -** Fill in device information -** NOTE: This routine destroys current contents in frame buffer memory -** -** -*/ -FxBool sst1InitFillDeviceInfo(FxU32 *sstbase, sst1DeviceInfoStruct *info) -{ - if(!sstbase) - return(FXFALSE); - - if(info->tmuRevision != 0xdead) - return FXTRUE; /* if already got it, return */ - - if(GETENV(("SST_NODEVICEINFO"))) { - /* fill device info struct with sane values... */ - INIT_PRINTF(("sst1DeviceInfo: Filling info Struct with default values...\n")); - - if(GETENV(("SST_FBICFG"))) - SSCANF(GETENV(("SST_FBICFG")), "%i", &info->fbiConfig); - else - info->fbiConfig = 0x0; - - if(GETENV(("SST_TMUCFG"))) - SSCANF(GETENV(("SST_TMUCFG")), "%i", &info->tmuConfig); - else - info->tmuConfig = 0x0; - - info->numberTmus = 1; - if (info->tmuConfig & FXBIT(6)) /* if TMU 1 exists */ - info->numberTmus++; - if (info->tmuConfig & FXBIT(13)) /* if TMU 2 exists */ - info->numberTmus++; - - info->tmuRevision = info->tmuConfig & 0x7; - - if(GETENV(("SST_FBIMEM_SIZE"))) - info->fbiMemSize = ATOI(GETENV(("SST_FBIMEM_SIZE"))); - else - info->fbiMemSize = 2; - - if(GETENV(("SST_TMUMEM_SIZE"))) - info->tmuMemSize[0] = ATOI(GETENV(("SST_TMUMEM_SIZE"))); - else - info->tmuMemSize[0] = 2; - info->tmuMemSize[1] = info->tmuMemSize[0]; - info->tmuMemSize[2] = info->tmuMemSize[0]; - } else { - int i; - - for(i=0; i<5; i++) { - if(i) - INIT_PRINTF(("sst1InitFillDeviceInfo(): Retry #%d for chip GetInfo()...\n", i)); - /* GetFbiInfo() must be called before GetTmuInfo() */ - if(sst1InitGetFbiInfo(sstbase, info) == FXFALSE) - continue; - /* get the revision ID of each TMU and verify that they are all the - same */ - if(sst1InitGetTmuInfo(sstbase, info) == FXFALSE) - continue; - break; - } - if(i == 5) - return(FXFALSE); - } - INIT_PRINTF(("sst1DeviceInfo: Board ID: Obsidian %s\n", - (info->fbiBoardID) ? "PRO" : "GE")); - INIT_PRINTF(("sst1DeviceInfo: FbiConfig:0x%x, TmuConfig:0x%x\n", - info->fbiConfig, info->tmuConfig)); - INIT_PRINTF(("sst1DeviceInfo: FBI Revision:%d, TMU Revison:%d, Num TMUs:%d\n", - info->fbiRevision, info->tmuRevision, info->numberTmus)); - INIT_PRINTF(("sst1DeviceInfo: FBI Memory:%d, TMU[0] Memory:%d", - info->fbiMemSize, info->tmuMemSize[0])); - if(info->numberTmus > 1) - INIT_PRINTF((", TMU[1] Memory:%d", info->tmuMemSize[1])); - if(info->numberTmus > 2) - INIT_PRINTF((", TMU[2] Memory:%d", info->tmuMemSize[2])); - INIT_PRINTF(("\n")); - if(sst1InitUseVoodooFile == FXTRUE) { - if(iniDac == (sst1InitDacStruct *) NULL) - INIT_PRINTF(("sst1DeviceInfo: Dac Type: Unknown")); - else - INIT_PRINTF(("sst1DeviceInfo: Dac Type: %s %s\n", - iniDac->dacManufacturer, iniDac->dacDevice)); - } else { - INIT_PRINTF(("sst1DeviceInfo: Dac Type: ")); - if(info->fbiDacType == SST_FBI_DACTYPE_ATT) - INIT_PRINTF(("AT&T ATT20C409\n")); - else if(info->fbiDacType == SST_FBI_DACTYPE_ICS) - INIT_PRINTF(("ICS ICS5342\n")); - else if(info->fbiDacType == SST_FBI_DACTYPE_TI) - INIT_PRINTF(("TI TVP3409\n")); - else - INIT_PRINTF(("Unknown\n")); - } - INIT_PRINTF(("sst1DeviceInfo: SliDetect:%d\n", info->sstSliDetect)); - - return(FXTRUE); -} -#pragma optimize ("",on) diff --git a/glide2x/sst1/init/initvg/init.rc b/glide2x/sst1/init/initvg/init.rc deleted file mode 100644 index 5e37b40..0000000 --- a/glide2x/sst1/init/initvg/init.rc +++ /dev/null @@ -1,65 +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 -#include "rcver.h" - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// -#define VERSIONNAME "sst1init.dll\0" - -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. InitCode DLL\0" - VALUE "FileVersion", VERSIONSTR - VALUE "InternalName", VERSIONNAME - VALUE "LegalCopyright", "Copyright \251 3Dfx Interactive, Inc. 1996\0" - VALUE "OriginalFilename", VERSIONNAME - VALUE "ProductName", "InitCode for Voodoo Graphics\251 and Windows\256 95\0" - VALUE "ProductVersion", VERSIONSTR - END - END - BLOCK "VarFileInfo" - BEGIN - /* the following line should be extended for localized versions */ - VALUE "Translation", 0x409, 1252 - END -END diff --git a/glide2x/sst1/init/initvg/makefile.linux b/glide2x/sst1/init/initvg/makefile.linux deleted file mode 100644 index 94902c9..0000000 --- a/glide2x/sst1/init/initvg/makefile.linux +++ /dev/null @@ -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 -# -# $Revision$ -# $Date$ -# - -# local defines, options, includes -LCDEFS = -DGDBG_INFO_ON -DINIT_LINUX -LCOPTS = -LCINC = -I$(BUILD_ROOT_SWLIBS)/include -I$(BUILD_ROOT_HW)/include - -ifeq ($(FX_SST96_PAGE_FIFO),1) -LCDEFS += -DSST96_ALT_FIFO_WRAP -endif - -# sources -HEADERS = sst1init.h gdebug.h -INSTALL_DESTINATION = $(BUILD_ROOT_HW) -CFILES = sst1init.c info.c print.c parse.c gamma.c util.c \ - sli.c video.c dac.c gdebug.c - -ifeq ($(FX_DLL_BUILDSST1INIT),1) -SUBLIBRARIES = $(BUILD_ROOT_SWLIBS)/lib/libfxpci.a -else -SUBLIBRARIES = -endif - -# targets -LIBRARIES = libsst1.a - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak - -# -# This library must be compiled without the big optimization options -# for some strange reason -# -ifndef DEBUG -CFLAGS = -O -m486 -fomit-frame-pointer $(LCDEFS) $(LCOPTS) $(LCINC) -endif diff --git a/glide2x/sst1/init/initvg/makefile.unix b/glide2x/sst1/init/initvg/makefile.unix deleted file mode 100644 index 9f54f76..0000000 --- a/glide2x/sst1/init/initvg/makefile.unix +++ /dev/null @@ -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 -# -# $Revision$ -# $Date$ -# - -# local defines, options, includes -LCDEFS = -DGDBG_INFO_ON -DINIT_LINUX -LCOPTS = -LCINC = -I$(BUILD_ROOT_SWLIBS)/include -I$(BUILD_ROOT_SST1)/include - -ifeq ($(FX_SST96_PAGE_FIFO),1) -LCDEFS += -DSST96_ALT_FIFO_WRAP -endif - -# sources -HEADERS = sst1init.h gdebug.h -INSTALL_DESTINATION = $(BUILD_ROOT_SST1) -CFILES = sst1init.c info.c print.c parse.c gamma.c util.c \ - sli.c video.c dac.c gdebug.c - -ifeq ($(FX_DLL_BUILDSST1INIT),1) -SUBLIBRARIES = $(BUILD_ROOT_SWLIBS)/lib/libfxpci.a -else -SUBLIBRARIES = -endif - -# targets -LIBRARIES = libsst1.a - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak - -# -# This library must be compiled without the big optimization options -# for some strange reason -# -ifndef DEBUG -CFLAGS = -O -m486 -fomit-frame-pointer $(LCDEFS) $(LCOPTS) $(LCINC) -endif diff --git a/glide2x/sst1/init/initvg/parse.c b/glide2x/sst1/init/initvg/parse.c deleted file mode 100644 index 5f8a5db..0000000 --- a/glide2x/sst1/init/initvg/parse.c +++ /dev/null @@ -1,920 +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$ -** -** Parsing code for grabbing information from "voodoo.ini" initialization file -** -*/ -#pragma optimize ("",off) -#include -#include -#include -#include -#include -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include -#include - -static int sst1InitFgets(char *, FILE *); -static int sst1InitFgetc(FILE *); -static int sst1InitParseFieldDac(char *); -static int sst1InitParseFieldCfg(char *); -static int sst1InitParseDacRdWrString(char *, sst1InitDacStruct *); -static int sst1InitParseDacRdWr(char *, sst1InitDacRdWrStruct *); -static int sst1InitParseSetVideoString(char *, sst1InitDacStruct *); -static int sst1InitParseSetMemClkString(char *, sst1InitDacStruct *); -static int sst1InitParseSetVideoModeString(char *, sst1InitDacStruct *); -static void sst1InitPrintDacRdWr(sst1InitDacRdWrStruct *, char *); -static void sst1InitToLower(char *string); -static void sst1InitFixFilename(char *dst, char *src); - -#ifndef INIT_LINUX -/* -** sst1InitVoodooFile(): -** Find and setup "voodoo.ini" file if possible -** -** Returns: -** FxTRUE if "voodoo.ini" file is found and opened with no errors -** FXFALSE if cannot find file or error opening file -** -*/ -FX_ENTRY FxBool FX_CALL sst1InitVoodooFile() -{ -#ifndef __DOS32__ - return(FXFALSE); -#else - char filename[256], fixedFilename[512], *tmpPtr; - char path[512]; - FILE *file = (FILE *) NULL; - char buffer[1024]; - int inCfg, inDac; - int i; - int helper = (GETENV(("SST_DEBUGDAC"))) ? 1 : 0; - - if(getenv("VOODOO_FILE")) { - /* Override voodoo.ini name */ - strcpy(filename, getenv("VOODOO_FILE")); - if(!(file = fopen(filename, "r"))) - return(FXFALSE); - } else { - /* Override path setting */ - if(getenv("VOODOO_PATH")) - strcpy(path, getenv("VOODOO_PATH")); - else if(getenv("PATH")) { - strcpy(path, ".;"); - strcat(path, getenv("PATH")); - } else - strcpy(path, ".;"); - - i = 0; - while(1) { - if(!i) { - if((tmpPtr = strtok(path, ";")) == NULL) - break; - } else { - if((tmpPtr = strtok(NULL, ";")) == NULL) - break; - } - strcpy(filename, tmpPtr); - sst1InitFixFilename(fixedFilename, filename); - if(fixedFilename[strlen(fixedFilename)-1] == '\\') - sprintf(filename, "%svoodoo.ini", filename); - else - sprintf(filename, "%s\\voodoo.ini", filename); - i++; - if((file = fopen(filename, "r"))) - break; - } - } - if(file == (FILE *) NULL) - return(FXFALSE); - - inCfg = inDac = 0; - while(sst1InitFgets(buffer, file)) { - buffer[strlen(buffer)-1] = (char) NULL; - if(!strcmp(buffer, "[CFG]")) { - inCfg = 1; inDac = 0; - continue; - } else if (!strcmp(buffer, "[DAC]")) { - inCfg = 0; inDac = 1; - continue; - } else if(buffer[0] == '[') { - inCfg = 0; inDac = 0; - continue; - } - if(inCfg) { - if(!sst1InitParseFieldCfg(buffer)) { - if(helper) - INIT_PRINTF(("sst1InitVoodooFile(): ERROR in [CFG] section of .ini file...\n")); - return(FXFALSE); - } - } else if(inDac) { - if(!sst1InitParseFieldDac(buffer)) { - if(helper) - INIT_PRINTF(("sst1InitVoodooFile(): ERROR in [DAC] section of .ini file...\n")); - return(FXFALSE); - } - } - } - fclose(file); - INIT_PRINTF(("sst1Init Routines(): Using Initialization file '%s'\n", filename)); - - return(FXTRUE); -#endif -} - -#else - -/* -** sst1InitVoodooFile(): -** Find and setup "voodoo2.ini" file if possible -** -** Returns: -** FxTRUE if "voodoo2.ini" file is found, opened with no errors, and -** constains the dac programming data. -** FXFALSE if cannot find file, error opening file, or has no dac data in it. -** -*/ -FX_ENTRY FxBool FX_CALL sst1InitVoodooFile() { - static FxBool retVal = FXFALSE; - int inCfg, inDac; - FILE *file = 0; - char buffer[1024], filename[256]; - char *tmpPtr; - char path[512]; - int i; - int helper = (GETENV(("SST_DEBUGDAC"))) ? 1 : 0; - - if (getenv("VOODOO_FILE")) { - /* Override voodoo.ini name */ - strcpy(filename, getenv("VOODOO_FILE")); - if (!(file = fopen(filename, "r"))) - goto __errExit; - } else { - /* Override path setting */ - if (getenv("VOODOO_PATH")) { - strcpy(path, getenv("VOODOO_PATH")); - } else { - strcpy(path, "/etc/conf.3dfx"); - } - - i = 0; - while(1) { - if (!i) { - if ((tmpPtr = strtok(path, ":")) == NULL) - break; - } else { - if ((tmpPtr = strtok(NULL, ":")) == NULL) - break; - } - strcpy(filename, tmpPtr); - if (filename[strlen(filename)-1] == '\\') - sprintf(filename, "%voodoo", filename); - else - sprintf(filename, "%s/voodoo", filename); - i++; - if ((file = fopen(filename, "r"))) - break; - } - } - if (!file) { - retVal = FXFALSE; - goto __errExit; - } - while(sst1InitFgets(buffer, file)) { - buffer[strlen(buffer)-1] = 0; - if (buffer[0]=='#') continue; - if (!sst1InitParseFieldCfg(buffer)) { - retVal = FXFALSE; - break; - } - } - INIT_PRINTF(("sst1Init Routines(): Using Initialization file '%s'\n", filename)); - -__errExit: - if (file) fclose(file); - - return retVal; -} -#endif - -#if defined(INIT_DOS) || defined(INIT_LINUX) - -#if __WIN32__ -#include -#endif /* __WIN32__ */ - -/* Get the definition of myGetenv for glide builds */ -#include - -/* void main(int argc, char **argv) */ -static void foo(int argc, char **argv) -{ - char buffer[2048]; /* buffer for command line inputs */ - int inCfg, inDac; - sst1InitEnvVarStruct *envVarsPtr; - sst1InitDacStruct *dacPtr; - sst1InitDacSetVideoStruct *setVideo; - sst1InitDacSetMemClkStruct *setMemClk; - FILE *file = fopen(argv[1], "r"); - - inCfg = inDac = 0; - while(sst1InitFgets(buffer, file)) { - buffer[strlen(buffer)-1] = (char) NULL; - if(!strcmp(buffer, "[CFG]")) { - inCfg = 1; inDac = 0; - continue; - } else if (!strcmp(buffer, "[DAC]")) { - inCfg = 0; inDac = 1; - continue; - } else if(buffer[0] == '[') { - inCfg = 0; inDac = 0; - continue; - } - if(inCfg) { - if(!sst1InitParseFieldCfg(buffer)) - /* Error processing .ini file */ - exit(1); - } else if(inDac) { - if(!sst1InitParseFieldDac(buffer)) - /* Error processing .ini file */ - exit(1); - } - } - - /* Dump CFG Data... */ - envVarsPtr = envVarsBase; - while(envVarsPtr) { - printf("ENV VAR:%s VALUE:%s\n", envVarsPtr->envVariable, - envVarsPtr->envValue); - envVarsPtr = (sst1InitEnvVarStruct *) envVarsPtr->nextVar; - } - - /* Dump Dac Data... */ - dacPtr = dacStructBase; - while(dacPtr) { - printf("DAC MANU:%s DEVICE:%s\n", dacPtr->dacManufacturer, - dacPtr->dacDevice); - if(dacPtr->detect) { - printf("\tDetect:\n"); - sst1InitPrintDacRdWr(dacPtr->detect, "\t\t"); - } - if(dacPtr->setVideo) { - setVideo = dacPtr->setVideo; - while(1) { - printf("\tsetVideo (%dx%d @ %d Hz)\n", - setVideo->width, setVideo->height, setVideo->refresh); - sst1InitPrintDacRdWr(setVideo->setVideoRdWr, "\t\t"); - if(!setVideo->nextSetVideo) - break; - else - setVideo = setVideo->nextSetVideo; - } - } - if(dacPtr->setMemClk) { - setMemClk = dacPtr->setMemClk; - while(1) { - printf("\tsetMemClk (%d MHz)\n", setMemClk->frequency); - sst1InitPrintDacRdWr(setMemClk->setMemClkRdWr, "\t\t"); - if(!setMemClk->nextSetMemClk) - break; - else - setMemClk = setMemClk->nextSetMemClk; - } - } - dacPtr = dacPtr->nextDac; - } - fclose(file); -} - -static void sst1InitFixFilename(char *dst, char *src) -{ - while(*src) { - *dst++ = *src; - if(*src == '\\') - *dst++ = *src; - src++; - } - *dst = (char) NULL; -} - - -static int sst1InitFgets(char *string, FILE *stream) -{ - int validChars = 0; - char *ptr = string; - int charRead; - - while((charRead = sst1InitFgetc(stream))) { - *ptr++ = (char) charRead; - validChars++; - if(charRead == '\n') { - *ptr++ = (char) NULL; - break; - } - } - return(validChars); -} - -static int sst1InitFgetc(FILE *stream) -{ - static int column = 0; - static int validChars = 0; - int charRead, charReadL; - int inComment; - - inComment = 0; - while(1) { - charRead = fgetc(stream); - if(inComment == 1) { - if(charRead <= 0) - return(0); - else if(charRead == '\n') - inComment = 0; - column = 0; - validChars = 0; - continue; - } else if(column == 0 && charRead == '#') { - /* Comment line */ - inComment = 1; - column = 0; - validChars = 0; - } else if(charRead <= 0) { - return(0); - } else { - if(charRead == '\n') { - if(validChars > 0) { - validChars = 0; - column = 0; - return(charRead); - } else - continue; - } else { - if(isspace(charRead)) - continue; - validChars++; - column++; - charReadL = (islower(charRead)) ? toupper(charRead) : charRead; - return(charReadL); - } - } - } -} - -static int sst1InitParseFieldCfg(char *string) -{ - char *envName, *envVal; - sst1InitEnvVarStruct *envVarsPtr; - - if((envName = strtok(string, "=")) == NULL) - return(0); - if((envVal = strtok((char *) NULL, "=")) == NULL) - /* Valid environment variable, NULL value */ - return(1); - sst1InitToLower(envVal); - - if(envVarsBase == (sst1InitEnvVarStruct *) NULL) { - if((envVarsPtr = malloc(sizeof(sst1InitEnvVarStruct))) == - (sst1InitEnvVarStruct *) NULL) - return(0); - envVarsBase = envVarsPtr; - } else { - envVarsPtr = envVarsBase; - while(1) { - if(envVarsPtr->nextVar == (sst1InitEnvVarStruct *) NULL) - break; - else - envVarsPtr = envVarsPtr->nextVar; - } - if((envVarsPtr->nextVar = malloc(sizeof(sst1InitEnvVarStruct))) == - (sst1InitEnvVarStruct *) NULL) - return(0); - envVarsPtr = envVarsPtr->nextVar; - } - envVarsPtr->nextVar = (sst1InitEnvVarStruct *) NULL; - strcpy(envVarsPtr->envVariable, envName); - strcpy(envVarsPtr->envValue, envVal); - - return(1); -} - -static int sst1InitParseFieldDac(char *string) -{ - char *dacFieldReference, *dacFieldValue; - static sst1InitDacStruct *dacPtr = (sst1InitDacStruct *) NULL; - - if((dacFieldReference = strtok(string, "=")) == NULL) - return(0); - if(!strcmp(dacFieldReference, "MANUFACTURER")) { - /* Add new dac device */ - if(dacStructBase == (sst1InitDacStruct *) NULL) { - if((dacPtr = malloc(sizeof(sst1InitDacStruct))) == - (sst1InitDacStruct *) NULL) - return(0); - dacStructBase = dacPtr; - } else { - dacPtr = dacStructBase; - while(1) { - if(dacPtr->nextDac == (sst1InitDacStruct *) NULL) - break; - else - dacPtr = dacPtr->nextDac; - } - if((dacPtr->nextDac = malloc(sizeof(sst1InitDacStruct))) == - (sst1InitDacStruct *) NULL) - return(0); - dacPtr = dacPtr->nextDac; - } - dacPtr->nextDac = (sst1InitDacStruct *) NULL; - dacPtr->dacManufacturer[0] = (char) NULL; - dacPtr->dacDevice[0] = (char) NULL; - dacPtr->detect = (sst1InitDacRdWrStruct *) NULL; - dacPtr->setVideo = (sst1InitDacSetVideoStruct *) NULL; - dacPtr->setMemClk = (sst1InitDacSetMemClkStruct *) NULL; - dacPtr->setVideoMode = (sst1InitDacSetVideoModeStruct *) NULL; - if((dacFieldValue = strtok((char *) NULL, "=")) == NULL) - return(0); - strcpy(dacPtr->dacManufacturer, dacFieldValue); - } else if(!strcmp(dacFieldReference, "DEVICE")) { - if((dacFieldValue = strtok((char *) NULL, "=")) == NULL) - return(0); - strcpy(dacPtr->dacDevice, dacFieldValue); - } else if(!strcmp(dacFieldReference, "DETECT")) { - if((dacFieldValue = strtok((char *) NULL, "=")) == NULL) - return(0); - sst1InitToLower(dacFieldValue); - if(!sst1InitParseDacRdWrString(dacFieldValue, dacPtr)) - return(0); - } else if(!strcmp(dacFieldReference, "SETVIDEO")) { - if((dacFieldValue = strtok((char *) NULL, "=")) == NULL) - return(0); - sst1InitToLower(dacFieldValue); - if(!sst1InitParseSetVideoString(dacFieldValue, dacPtr)) - return(0); - } else if(!strcmp(dacFieldReference, "SETMEMCLK")) { - if((dacFieldValue = strtok((char *) NULL, "=")) == NULL) - return(0); - sst1InitToLower(dacFieldValue); - if(!sst1InitParseSetMemClkString(dacFieldValue, dacPtr)) - return(0); - } else if(!strcmp(dacFieldReference, "SETVIDEOMODE")) { - if((dacFieldValue = strtok((char *) NULL, "=")) == NULL) - return(0); - sst1InitToLower(dacFieldValue); - if(!sst1InitParseSetVideoModeString(dacFieldValue, dacPtr)) - return(0); - } else - return(0); - - return(1); -} - -static int sst1InitParseDacRdWrString(char *string, sst1InitDacStruct *dacBase) -{ - int cntr = 0; - int i; - sst1InitDacRdWrStruct *dacRdWrPtr; - char *dacRdWrCmd; - char stringCpy[2048]; - - while(1) { - strcpy(stringCpy, string); - if((dacRdWrCmd = strtok(stringCpy, ";")) == NULL) - return(0); - if(cntr == 0) { - if(!(dacBase->detect = malloc(sizeof(sst1InitDacRdWrStruct)))) - return(0); - dacRdWrPtr = dacBase->detect; - } else { - for(i=0; i<(cntr-1); i++) { - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) - return(0); - } - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) { - break; - } - if(!(dacRdWrPtr->nextRdWr = malloc(sizeof(sst1InitDacRdWrStruct)))) - return(0); - - dacRdWrPtr = dacRdWrPtr->nextRdWr; - } - dacRdWrPtr->nextRdWr = (sst1InitDacRdWrStruct *) NULL; - if(!sst1InitParseDacRdWr(dacRdWrCmd, dacRdWrPtr)) - return(0); - cntr++; - } - return(1); -} - -static int sst1InitParseDacRdWr(char *string, sst1InitDacRdWrStruct *dacRdWrPtr) -{ - char *addr, *data, *mask, *addrDataCmd; - char stringCpy[2048]; - - strcpy(stringCpy, string); - - if(stringCpy[5] == '(') { - stringCpy[5] = (char) NULL; - addrDataCmd = &stringCpy[6]; - } else if(stringCpy[7] == '(') { - stringCpy[7] = (char) NULL; - addrDataCmd = &stringCpy[8]; - } else if(stringCpy[8] == '(') { - stringCpy[8] = (char) NULL; - addrDataCmd = &stringCpy[9]; - } else if(stringCpy[9] == '(') { - stringCpy[9] = (char) NULL; - addrDataCmd = &stringCpy[10]; - } else - return(0); - - if(!strcmp(stringCpy, "dacwr")) { - if((addr = strtok(addrDataCmd, ",")) == NULL) - return(0); - if((data = strtok(NULL, ",")) == NULL) - return(0); - if(data[strlen(data)-1] != ')') - return(0); - data[strlen(data)-1] = (char) NULL; - dacRdWrPtr->type = DACRDWR_TYPE_WR; - SSCANF(addr, "%i", &dacRdWrPtr->addr); - SSCANF(data, "%i", &dacRdWrPtr->data); - } else if(!strcmp(stringCpy, "dacwrpop")) { - if((addr = strtok(addrDataCmd, ",")) == NULL) - return(0); - if((mask = strtok(NULL, ",")) == NULL) - return(0); - if((data = strtok(NULL, ",")) == NULL) - return(0); - if(data[strlen(data)-1] != ')') - return(0); - data[strlen(data)-1] = (char) NULL; - dacRdWrPtr->type = DACRDWR_TYPE_WRMOD_POP; - SSCANF(addr, "%i", &dacRdWrPtr->addr); - SSCANF(mask, "%i", &dacRdWrPtr->mask); - SSCANF(data, "%i", &dacRdWrPtr->data); - } else if(!strcmp(stringCpy, "dacrdwr")) { - if((addr = strtok(addrDataCmd, ",")) == NULL) - return(0); - if((mask = strtok(NULL, ",")) == NULL) - return(0); - if((data = strtok(NULL, ",")) == NULL) - return(0); - if(data[strlen(data)-1] != ')') - return(0); - data[strlen(data)-1] = (char) NULL; - dacRdWrPtr->type = DACRDWR_TYPE_RDMODWR; - SSCANF(addr, "%i", &dacRdWrPtr->addr); - SSCANF(mask, "%i", &dacRdWrPtr->mask); - SSCANF(data, "%i", &dacRdWrPtr->data); - } else if(!strcmp(stringCpy, "dacrd")) { - if((addr = strtok(addrDataCmd, ",")) == NULL) - return(0); - if(addr[strlen(addr)-1] == ')') { - dacRdWrPtr->type = DACRDWR_TYPE_RDNOCHECK; - SSCANF(addr, "%i", &dacRdWrPtr->addr); - } else { - dacRdWrPtr->type = DACRDWR_TYPE_RDCHECK; - if((data = strtok(NULL, ",")) == NULL) - return(0); - if(data[strlen(data)-1] != ')') - return(0); - data[strlen(data)-1] = (char) NULL; - SSCANF(addr, "%i", &dacRdWrPtr->addr); - SSCANF(data, "%i", &dacRdWrPtr->data); - } - } else if(!strcmp(stringCpy, "dacrdpush")) { - if((addr = strtok(addrDataCmd, ",")) == NULL) - return(0); - if(addr[strlen(addr)-1] == ')') { - dacRdWrPtr->type = DACRDWR_TYPE_RDPUSH; - SSCANF(addr, "%i", &dacRdWrPtr->addr); - } else - return(0); - } else { - return(0); - } - - return(1); -} - -static void sst1InitPrintDacRdWr(sst1InitDacRdWrStruct *dacRdWrBase, - char *prefix) -{ - sst1InitDacRdWrStruct *dacRdWrPtr = dacRdWrBase; - - while(dacRdWrPtr) { - if(dacRdWrPtr->type == DACRDWR_TYPE_WR) { - printf("%sDacWR", prefix); - printf("(0x%x,0x%x)\n", dacRdWrPtr->addr, dacRdWrPtr->data); - } else if(dacRdWrPtr->type == DACRDWR_TYPE_RDMODWR) { - printf("%sDacRD-MOD-WR", prefix); - printf("(0x%x,0x%x,0x%x)\n", dacRdWrPtr->addr, dacRdWrPtr->mask, - dacRdWrPtr->data); - } else if(dacRdWrPtr->type == DACRDWR_TYPE_RDNOCHECK) { - printf("%sDacRD-NOCHECK", prefix); - printf("(0x%x)\n", dacRdWrPtr->addr); - } else if(dacRdWrPtr->type == DACRDWR_TYPE_RDCHECK) { - printf("%sDacRD-CHECK", prefix); - printf("(0x%x,0x%x)\n", dacRdWrPtr->addr, dacRdWrPtr->data); - } else - printf("%sDAC???", prefix); - dacRdWrPtr = dacRdWrPtr->nextRdWr; - } -} - -static int sst1InitParseSetVideoString(char *string, sst1InitDacStruct *dacBase) -{ - int cntr = 0; - int i; - sst1InitDacRdWrStruct *dacRdWrPtr; - sst1InitDacSetVideoStruct *dacSetVideoPtr; - char *dacRdWrCmd; - char stringCpy[2048]; - - while(1) { - strcpy(stringCpy, string); - if((dacRdWrCmd = strtok(stringCpy, ";")) == NULL) - return(0); - if(cntr == 0) { - if(!dacBase->setVideo) { - if(!(dacBase->setVideo = - malloc(sizeof(sst1InitDacSetVideoStruct)))) - return(0); - dacSetVideoPtr = dacBase->setVideo; - } else { - dacSetVideoPtr = dacBase->setVideo; - while(1) { - if(!dacSetVideoPtr->nextSetVideo) - break; - dacSetVideoPtr = dacSetVideoPtr->nextSetVideo; - } - if(!(dacSetVideoPtr->nextSetVideo = - malloc(sizeof(sst1InitDacSetVideoStruct)))) - return(0); - dacSetVideoPtr = dacSetVideoPtr->nextSetVideo; - } - dacSetVideoPtr->nextSetVideo = (sst1InitDacSetVideoStruct *) NULL; - /* Width */ - SSCANF(dacRdWrCmd, "%i", &dacSetVideoPtr->width); - /* Height */ - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) - return(0); - SSCANF(dacRdWrCmd, "%i", &dacSetVideoPtr->height); - /* Refresh */ - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) - return(0); - SSCANF(dacRdWrCmd, "%i", &dacSetVideoPtr->refresh); - /* video16BPP */ - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) - return(0); - SSCANF(dacRdWrCmd, "%i", &dacSetVideoPtr->video16BPP); - /* First DacRdWr */ - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) - return(0); - if(!(dacSetVideoPtr->setVideoRdWr = - malloc(sizeof(sst1InitDacRdWrStruct)))) - return(0); - dacRdWrPtr = dacSetVideoPtr->setVideoRdWr; - } else { - for(i=0; i<(cntr+3); i++) { - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) - return(0); - } - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) { - break; - } - if(!(dacRdWrPtr->nextRdWr = malloc(sizeof(sst1InitDacRdWrStruct)))) - return(0); - dacRdWrPtr = dacRdWrPtr->nextRdWr; - } - dacRdWrPtr->nextRdWr = (sst1InitDacRdWrStruct *) NULL; - if(!sst1InitParseDacRdWr(dacRdWrCmd, dacRdWrPtr)) - return(0); - cntr++; - } - return(1); -} - -static int sst1InitParseSetMemClkString(char *string, - sst1InitDacStruct *dacBase) -{ - int cntr = 0; - int i; - sst1InitDacRdWrStruct *dacRdWrPtr; - sst1InitDacSetMemClkStruct *dacSetMemClkPtr; - char *dacRdWrCmd; - char stringCpy[2048]; - - while(1) { - strcpy(stringCpy, string); - if((dacRdWrCmd = strtok(stringCpy, ";")) == NULL) - return(0); - if(cntr == 0) { - if(!dacBase->setMemClk) { - if(!(dacBase->setMemClk = - malloc(sizeof(sst1InitDacSetMemClkStruct)))) - return(0); - dacSetMemClkPtr = dacBase->setMemClk; - } else { - dacSetMemClkPtr = dacBase->setMemClk; - while(1) { - if(!dacSetMemClkPtr->nextSetMemClk) - break; - dacSetMemClkPtr = dacSetMemClkPtr->nextSetMemClk; - } - if(!(dacSetMemClkPtr->nextSetMemClk = - malloc(sizeof(sst1InitDacSetMemClkStruct)))) - return(0); - dacSetMemClkPtr = dacSetMemClkPtr->nextSetMemClk; - } - dacSetMemClkPtr->nextSetMemClk = (sst1InitDacSetMemClkStruct *) - NULL; - /* Frequency */ - SSCANF(dacRdWrCmd, "%i", &dacSetMemClkPtr->frequency); - - /* First DacRdWr */ - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) - return(0); - if(!(dacSetMemClkPtr->setMemClkRdWr = - malloc(sizeof(sst1InitDacRdWrStruct)))) - return(0); - dacRdWrPtr = dacSetMemClkPtr->setMemClkRdWr; - } else { - for(i=0; i<(cntr); i++) { - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) - return(0); - } - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) { - break; - } - if(!(dacRdWrPtr->nextRdWr = malloc(sizeof(sst1InitDacRdWrStruct)))) - return(0); - dacRdWrPtr = dacRdWrPtr->nextRdWr; - } - dacRdWrPtr->nextRdWr = (sst1InitDacRdWrStruct *) NULL; - if(!sst1InitParseDacRdWr(dacRdWrCmd, dacRdWrPtr)) - return(0); - cntr++; - } - return(1); -} - -static int sst1InitParseSetVideoModeString(char *string, - sst1InitDacStruct *dacBase) -{ - int cntr = 0; - int i; - sst1InitDacRdWrStruct *dacRdWrPtr; - sst1InitDacSetVideoModeStruct *dacSetVideoModePtr; - char *dacRdWrCmd; - char stringCpy[2048]; - - while(1) { - strcpy(stringCpy, string); - if((dacRdWrCmd = strtok(stringCpy, ";")) == NULL) - return(0); - if(cntr == 0) { - if(!dacBase->setVideoMode) { - if(!(dacBase->setVideoMode = - malloc(sizeof(sst1InitDacSetVideoModeStruct)))) - return(0); - dacSetVideoModePtr = dacBase->setVideoMode; - } else { - dacSetVideoModePtr = dacBase->setVideoMode; - while(1) { - if(!dacSetVideoModePtr->nextSetVideoMode) - break; - dacSetVideoModePtr = dacSetVideoModePtr->nextSetVideoMode; - } - if(!(dacSetVideoModePtr->nextSetVideoMode = - malloc(sizeof(sst1InitDacSetVideoModeStruct)))) - return(0); - dacSetVideoModePtr = dacSetVideoModePtr->nextSetVideoMode; - } - dacSetVideoModePtr->nextSetVideoMode = - (sst1InitDacSetVideoModeStruct *) NULL; - /* video16BPP */ - SSCANF(dacRdWrCmd, "%i", &dacSetVideoModePtr->video16BPP); - - /* First DacRdWr */ - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) - return(0); - if(!(dacSetVideoModePtr->setVideoModeRdWr = - malloc(sizeof(sst1InitDacRdWrStruct)))) - return(0); - dacRdWrPtr = dacSetVideoModePtr->setVideoModeRdWr; - } else { - for(i=0; i<(cntr); i++) { - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) - return(0); - } - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) { - break; - } - if(!(dacRdWrPtr->nextRdWr = malloc(sizeof(sst1InitDacRdWrStruct)))) - return(0); - dacRdWrPtr = dacRdWrPtr->nextRdWr; - } - dacRdWrPtr->nextRdWr = (sst1InitDacRdWrStruct *) NULL; - if(!sst1InitParseDacRdWr(dacRdWrCmd, dacRdWrPtr)) - return(0); - cntr++; - } - return(1); -} - -static void sst1InitToLower(char *string) -{ - char *ptr = string; - - while(*ptr) { - *ptr = (isupper(*ptr)) ? tolower(*ptr) : *ptr; - ptr++; - } -} - -/* -** sst1InitGetenv(): -** Getenv() for INIT routines. -** -** If the actual environment variable exists (determined by a call to -** the system getenv() routine), then that pointer is returned. Otherwise, -** if the variable is defined in the [CFG] section of "voodoo.ini", then -** a pointer to the value defined in "voodoo.ini" is returned. Otherwise, -** NULL is returned -** -*/ -FX_ENTRY char * FX_CALL sst1InitGetenv(char *string) -{ - sst1InitEnvVarStruct *envVarsPtr; - char *retVal = (char *) NULL; - - /* Does the real environment variable exist? */ - if(myGetenv(string)) - return((char*)myGetenv(string)); - - /* Does the requested environment variable exist in "voodoo.ini"? */ - /* Dump CFG Data... */ - envVarsPtr = envVarsBase; - while(envVarsPtr) { - if(!strcmp(string, envVarsPtr->envVariable)) { - retVal = envVarsPtr->envValue; - break; - } - envVarsPtr = (sst1InitEnvVarStruct *) envVarsPtr->nextVar; - } - return(retVal); -} -#endif - -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); -} - -#pragma optimize ("",on) diff --git a/glide2x/sst1/init/initvg/print.c b/glide2x/sst1/init/initvg/print.c deleted file mode 100644 index c7d0aa2..0000000 --- a/glide2x/sst1/init/initvg/print.c +++ /dev/null @@ -1,81 +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$ -** -** Print functions for SST-1 Initialization routines -*/ -#pragma optimize ("",off) -#include -#include -#include -#include -#include -#define FX_DLL_DEFINITION -#include -#include - -#ifdef INIT_OUTPUT - -FX_ENTRY void FX_CALL sst1InitVPrintf(const char *, va_list); - -FX_ENTRY void FX_CALL sst1InitPrintf(const char *format, ...) -{ - va_list args; - static FxBool firstPass = FXTRUE; - static FxBool printIt = FXFALSE; - - if(firstPass == FXTRUE) { - firstPass = FXFALSE; - if (sst1InitMsgFile == NULL) - { - /* I couldn't initialize to stdout because stdout is not constant */ - sst1InitMsgFile = stdout; - } - if(GETENV(("SST_INITDEBUG"))) - printIt = FXTRUE; - if(GETENV(("SST_INITDEBUG_FILE"))) { - if((sst1InitMsgFile = fopen(GETENV(("SST_INITDEBUG_FILE")), "w"))) - printIt = FXTRUE; - else { - fprintf(stderr, "sst1InitPrintf(): Could not open file '%s' for logging...\n", GETENV(("SST_INITDEBUG_FILE"))); - printIt = FXFALSE; - } - } - } - - if(printIt == FXFALSE) - return; - - va_start(args, format); - sst1InitVPrintf(format, args); - va_end(args); -} - -FX_ENTRY void FX_CALL sst1InitVPrintf(const char *format, va_list args) -{ - vfprintf(sst1InitMsgFile, format, args); - fflush(sst1InitMsgFile); -} - -#endif - -#pragma optimize ("",on) diff --git a/glide2x/sst1/init/initvg/rcver.h b/glide2x/sst1/init/initvg/rcver.h deleted file mode 100644 index 86e239a..0000000 --- a/glide2x/sst1/init/initvg/rcver.h +++ /dev/null @@ -1,25 +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 1 -#define MANREVISION 1 -#define BUILD_NUMBER 1 - -#define VERSIONSTR "InitCode " "$Revision$" "\0" diff --git a/glide2x/sst1/init/initvg/sli.c b/glide2x/sst1/init/initvg/sli.c deleted file mode 100644 index 0691f82..0000000 --- a/glide2x/sst1/init/initvg/sli.c +++ /dev/null @@ -1,544 +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$ -** -** Initialization code for initializing scanline interleaving -** -*/ -#pragma optimize ("",off) -#include -#include -#include -#include -#define FX_DLL_DEFINITION -#include -#include -#include - -/* -** sst1InitSli(): -** Setup Multiple SST-1 subsystems for Scanline Interleaving -** sstbase0 defined to be the SLI Master -** sstbase1 defined to be the SLI Slave -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitSli(FxU32 *sstbase0, FxU32 *sstbase1) -{ - FxU32 j, n, MasterPhysAddr, cntr; - volatile Sstregs *sstMaster = (Sstregs *) sstbase0; - volatile Sstregs *sstSlave = (Sstregs *) sstbase1; - FxU32 MasterInit1, SlaveInit1; - FxU32 memOffset; - FxU32 masterVInClkDel, masterVOutClkDel; - FxU32 slaveVInClkDel, slaveVOutClkDel; - FxU32 masterPVOutClkDel, slavePVOutClkDel; - FxU32 pciFifoLwm, memFifoLwm; - FxU32 clkFreqMaster; - - /* Check to make sure master and slave are installed properly */ - /* Master should have a clock frequency setting of 54 MHz */ - /* Slave should have a clock frequency setting of 50 MHz */ - /* sst1InitCalcGrxClk() will actually setup the master to run at 54 MHz, */ - /* even though the default strapping is 54 MHz. The 54 MHz strapping is */ - /* implemented to allow software detection of which SLI board is the */ - /* SLI Master */ - if(sst1InitCheckBoard(sstbase0) == FXFALSE) - return(FXFALSE); - clkFreqMaster = 40 + (((sst1CurrentBoard->tmuConfig >> 3) & 0x7) << 2) + - (sst1CurrentBoard->fbiConfig & 0x3); - if(!(GETENV(("SST_IGNORE_SLI_CHECK")))) { - if(clkFreqMaster != 54) { - INIT_PRINTF(("sst1InitSli(): SLI Slave board installed as SLI Master.\n")); - INIT_PRINTF((" Please power-down, swap SLI boards and re-boot.\n")); - return(FXFALSE); - } - } else - INIT_PRINTF(("sst1InitSli(): WARNING: Bypassing check for proper SLI installation...\n")); - - INIT_PRINTF(("sst1InitSli(): Enabling Scanline Interleaving...\n")); - - /* Setup SLI Slave... */ - cntr = 0; - while(1) { - if(sst1InitCheckBoard(sstbase1) == FXFALSE) - return(FXFALSE); - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); - PCICFG_WR(SST1_PCI_INIT_ENABLE, - (j | SST_SCANLINE_SLV_OWNPCI | SST_SCANLINE_SLI_SLV)); - ISET(sstSlave->fbiInit1, IGET(sstSlave->fbiInit1) | - (SST_VIDEO_RESET | SST_EN_SCANLINE_INTERLEAVE)); - sst1InitIdleFBINoNOP(sstbase1); - PCICFG_WR(SST1_PCI_VCLK_DISABLE, 0x0); /* Disable video clock */ - ISET(SST_TREX(sstSlave,0)->trexInit1, sst1CurrentBoard->tmuInit1[0] | - SST_EN_TEX_SCANLINE_INTERLEAVE | SST_TEX_SCANLINE_INTERLEAVE_SLAVE); - sst1InitIdle(sstbase1); - ISET(SST_TREX(sstSlave,1)->trexInit1, sst1CurrentBoard->tmuInit1[1] | - SST_EN_TEX_SCANLINE_INTERLEAVE | SST_TEX_SCANLINE_INTERLEAVE_SLAVE); - sst1InitIdle(sstbase1); - ISET(SST_TREX(sstSlave,2)->trexInit1, sst1CurrentBoard->tmuInit1[2] | - SST_EN_TEX_SCANLINE_INTERLEAVE | SST_TEX_SCANLINE_INTERLEAVE_SLAVE); - sst1InitIdle(sstbase1); - sst1InitIdleFBINoNOP(sstbase1); - ISET(sstSlave->fbiInit2, (IGET(sstSlave->fbiInit2) & - ~(SST_EN_DRAM_BANKED | SST_SWAP_ALGORITHM)) | SST_SWAP_DACDATA0); - sst1InitIdleFBINoNOP(sstbase1); - /* Initialize Y-Origin */ - ISET(sstSlave->fbiInit3, (IGET(sstSlave->fbiInit3) & ~SST_YORIGIN_TOP) | - ((sst1CurrentBoard->fbiVideoHeight - 1) << SST_YORIGIN_TOP_SHIFT)); - sst1InitIdleFBINoNOP(sstbase1); - memOffset = ((IGET(sstSlave->fbiInit2) & SST_VIDEO_BUFFER_OFFSET) >> - SST_VIDEO_BUFFER_OFFSET_SHIFT) + 16; - if(memOffset & 0x1) { - if((memOffset + 1) & 0x3) /* not divisible by 4... */ - memOffset = (memOffset + 1) >> 1; - else - memOffset = (memOffset + 3) >> 1; - } else { - if(memOffset & 0x3) /* not divisible by 4... */ - memOffset = (memOffset + 2) >> 1; - else - memOffset = memOffset >> 1; - } - if(sst1CurrentBoard->fbiVideoWidth == 960) { - memOffset = 170; - ISET(sstSlave->fbiInit0, IGET(sstSlave->fbiInit0) & - ~SST_MEM_FIFO_EN); - INIT_PRINTF(("sst1InitSli(): Disabling memory fifo...\n")); - } - ISET(sstSlave->fbiInit2, (IGET(sstSlave->fbiInit2) & - ~SST_VIDEO_BUFFER_OFFSET) | - (memOffset << SST_VIDEO_BUFFER_OFFSET_SHIFT)); - sst1InitIdleFBINoNOP(sstbase1); - ISET(sstSlave->fbiInit0, (IGET(sstSlave->fbiInit0) & - ~SST_MEM_FIFO_HWM) | (0x100 << SST_MEM_FIFO_HWM_SHIFT)); - sst1InitIdleFBINoNOP(sstbase1); - ISET(sstSlave->fbiInit4, (IGET(sstSlave->fbiInit4) & - ~SST_MEM_FIFO_ROW_BASE) | - ((3*memOffset) << SST_MEM_FIFO_ROW_BASE_SHIFT)); - sst1InitIdleFBINoNOP(sstbase1); - //slaveVInClkDel = 0; - //slaveVOutClkDel = 1; - //slavePVOutClkDel = 1; - slaveVInClkDel = 2; - slaveVOutClkDel = 0; - slavePVOutClkDel = 3; - if(GETENV(("SST_SLIS_VOUT_CLKDEL"))) - SSCANF(GETENV(("SST_SLIS_VOUT_CLKDEL")), "%i", &slaveVOutClkDel); - if(GETENV(("SST_SLIS_PVOUT_CLKDEL"))) - SSCANF(GETENV(("SST_SLIS_PVOUT_CLKDEL")), "%i", &slavePVOutClkDel); - if(GETENV(("SST_SLIS_VIN_CLKDEL"))) - SSCANF(GETENV(("SST_SLIS_VIN_CLKDEL")), "%i", &slaveVInClkDel); - INIT_PRINTF(("sst1InitSli(): slaveVinClkdel=0x%x, slaveVOutClkDel=0x%x, slavePVOutClkDel=0x%x\n", - slaveVInClkDel, slaveVOutClkDel, slavePVOutClkDel)); - if(sst1CurrentBoard->fbiVideo16BPP) - /* 16-bit Video Output */ - ISET(sstSlave->fbiInit1, (IGET(sstSlave->fbiInit1) & - ~(SST_VIDEO_VCLK_2X_OUTPUT_DEL | SST_VIDEO_VCLK_DEL)) | - SST_EN_SCANLINE_INTERLEAVE | - /* SST_VIDEO_VID_CLK_SLAVE | */ - SST_VIDEO_VID_CLK_2X | - /* SST_VIDEO_INVERT_VID_CLK_2X | */ - SST_PCI_WRWS_1 | - (slaveVInClkDel << SST_VIDEO_VCLK_DEL_SHIFT) | - (slaveVOutClkDel << SST_VIDEO_VCLK_2X_OUTPUT_DEL_SHIFT) | - (slavePVOutClkDel << SST_VIDEO_VCLK_2X_INPUT_DEL_SHIFT)); - else - /* 24-bit Video Output */ - ISET(sstSlave->fbiInit1, (IGET(sstSlave->fbiInit1) & - ~(SST_VIDEO_VCLK_2X_OUTPUT_DEL | SST_VIDEO_VCLK_DEL | - SST_VIDEO_VCLK_SEL | SST_VIDEO_VCLK_2X_INPUT_DEL)) | - SST_EN_SCANLINE_INTERLEAVE | - /* SST_VIDEO_VID_CLK_SLAVE | */ - SST_VIDEO_VID_CLK_2X | - /* SST_VIDEO_INVERT_VID_CLK_2X | */ - (0x0 << SST_VIDEO_VCLK_SEL_SHIFT) | - SST_PCI_WRWS_1 | - (slaveVInClkDel << SST_VIDEO_VCLK_DEL_SHIFT) | - (slaveVOutClkDel << SST_VIDEO_VCLK_2X_OUTPUT_DEL_SHIFT) | - (slavePVOutClkDel << SST_VIDEO_VCLK_2X_INPUT_DEL_SHIFT)); - sst1InitIdleFBINoNOP(sstbase1); - ISET(sstSlave->fbiInit1, IGET(sstSlave->fbiInit1) & - ~(SST_VIDEO_DATA_OE_EN | - SST_VIDEO_BLANK_OE_EN | - SST_VIDEO_DCLK_OE_EN | - SST_VIDEO_HVSYNC_OE_EN)); - sst1InitIdleFBINoNOP(sstbase1); - /* Initialize pci and memory fifos... */ - pciFifoLwm = 16; - memFifoLwm = 26; - if(!GETENV(("SST_PCIFIFO_LWM"))) - ISET(sstSlave->fbiInit0, (IGET(sstSlave->fbiInit0) & - ~SST_PCI_FIFO_LWM) | (pciFifoLwm << SST_PCI_FIFO_LWM_SHIFT)); - sst1InitIdleFBINoNOP(sstbase1); - if(!GETENV(("SST_MEMFIFO_LWM"))) - ISET(sstSlave->fbiInit4, (IGET(sstSlave->fbiInit4) & - ~SST_MEM_FIFO_LWM) | (memFifoLwm << SST_MEM_FIFO_LWM_SHIFT)); - sst1InitIdleFBINoNOP(sstbase1); - INIT_PRINTF(("sst1InitSli(): Slave pciFifoLwm:%d, memFifoLwm:%d\n", - ((IGET(sstSlave->fbiInit0) & SST_PCI_FIFO_LWM) >> - SST_PCI_FIFO_LWM_SHIFT), - ((IGET(sstSlave->fbiInit4) & SST_MEM_FIFO_LWM) >> - SST_MEM_FIFO_LWM_SHIFT))); - sst1InitIdleFBINoNOP(sstbase1); - sst1InitIdleFBINoNOP(sstbase1); - ISET(sstSlave->fbiInit1, IGET(sstSlave->fbiInit1) | - (SST_EN_SCANLINE_INTERLEAVE | SST_VIDEO_RESET)); - sst1InitIdleFBINoNOP(sstbase1); - sst1InitIdleFBINoNOP(sstbase1); - sst1InitIdleFBINoNOP(sstbase1); - ISET(sstSlave->fbiInit1, IGET(sstSlave->fbiInit1) & ~SST_VIDEO_RESET); - sst1InitIdleFBINoNOP(sstbase1); - sst1InitIdleFBINoNOP(sstbase1); - if(IGET(sstSlave->fbiInit1) & SST_VIDEO_RESET) { - INIT_PRINTF(("sst1InitSli(): Could not unReset Slave Video...\n")); - if(++cntr < 10) - continue; - else - return(FXFALSE); - } - if(!(IGET(sstSlave->fbiInit1) & SST_EN_SCANLINE_INTERLEAVE)) { - INIT_PRINTF(("sst1InitSli(): Could not setup SLI Slave...\n")); - if(++cntr < 10) - continue; - else - return(FXFALSE); - } - SlaveInit1 = IGET(sstSlave->fbiInit1); - break; - } - - /* Setup SLI Master... */ - ISET(sstMaster->fbiInit1, IGET(sstMaster->fbiInit1) | SST_VIDEO_RESET); - ISET(SST_TREX(sstMaster,0)->trexInit1, sst1CurrentBoard->tmuInit1[0] | - SST_EN_TEX_SCANLINE_INTERLEAVE); - sst1InitIdle(sstbase0); - ISET(SST_TREX(sstMaster,1)->trexInit1, sst1CurrentBoard->tmuInit1[1] | - SST_EN_TEX_SCANLINE_INTERLEAVE); - sst1InitIdle(sstbase0); - ISET(SST_TREX(sstMaster,2)->trexInit1, sst1CurrentBoard->tmuInit1[2] | - SST_EN_TEX_SCANLINE_INTERLEAVE); - sst1InitIdle(sstbase0); - sst1InitIdleFBINoNOP(sstbase0); - ISET(sstMaster->fbiInit2, (IGET(sstMaster->fbiInit2) & - ~(SST_EN_DRAM_BANKED | SST_SWAP_ALGORITHM)) | SST_SWAP_DACDATA0); - sst1InitIdleFBINoNOP(sstbase0); - /* Initialize Y-Origin */ - ISET(sstMaster->fbiInit3, (IGET(sstMaster->fbiInit3) & ~SST_YORIGIN_TOP) | - ((sst1CurrentBoard->fbiVideoHeight) << SST_YORIGIN_TOP_SHIFT)); - sst1InitIdleFBINoNOP(sstbase0); - if(sst1CurrentBoard->fbiVideoWidth == 960) - ISET(sstMaster->fbiInit0, IGET(sstMaster->fbiInit0) & ~SST_MEM_FIFO_EN); - ISET(sstMaster->fbiInit2, (IGET(sstMaster->fbiInit2) & - ~SST_VIDEO_BUFFER_OFFSET) | (memOffset << SST_VIDEO_BUFFER_OFFSET_SHIFT)); - sst1InitIdleFBINoNOP(sstbase0); - ISET(sstMaster->fbiInit0, (IGET(sstMaster->fbiInit0) & ~SST_MEM_FIFO_HWM) | - (0x100 << SST_MEM_FIFO_HWM_SHIFT)); - sst1InitIdleFBINoNOP(sstbase0); - ISET(sstMaster->fbiInit4, (IGET(sstMaster->fbiInit4) & - ~SST_MEM_FIFO_ROW_BASE) | ((3*memOffset) << SST_MEM_FIFO_ROW_BASE_SHIFT)); - sst1InitIdleFBINoNOP(sstbase0); - //masterVInClkDel = 1; - //masterVOutClkDel = 1; - //masterPVOutClkDel = 1; - masterVInClkDel = 2; - masterVOutClkDel = 0; - masterPVOutClkDel = 3; - if(GETENV(("SST_SLIM_VOUT_CLKDEL"))) - SSCANF(GETENV(("SST_SLIM_VOUT_CLKDEL")), "%i", &masterVOutClkDel); - if(GETENV(("SST_SLIM_PVOUT_CLKDEL"))) - SSCANF(GETENV(("SST_SLIM_PVOUT_CLKDEL")), "%i", &masterPVOutClkDel); - if(GETENV(("SST_SLIM_VIN_CLKDEL"))) - SSCANF(GETENV(("SST_SLIM_VIN_CLKDEL")), "%i", &masterVInClkDel); - INIT_PRINTF(("sst1InitSli(): masterVinClkdel=0x%x, masterVOutClkDel=0x%x, masterPVOutClkDel=0x%x\n", - masterVInClkDel, masterVOutClkDel, masterPVOutClkDel)); - if(sst1CurrentBoard->fbiVideo16BPP) - /* 16-bit Video Output */ - ISET(sstMaster->fbiInit1, (IGET(sstMaster->fbiInit1) & - ~(SST_VIDEO_VCLK_2X_OUTPUT_DEL | SST_VIDEO_VCLK_DEL)) | - SST_EN_SCANLINE_INTERLEAVE | - SST_VIDEO_VID_CLK_2X | - /* SST_VIDEO_INVERT_VID_CLK_2X | */ - SST_PCI_WRWS_1 | - (masterVInClkDel << SST_VIDEO_VCLK_DEL_SHIFT) | - (masterVOutClkDel << SST_VIDEO_VCLK_2X_OUTPUT_DEL_SHIFT) | - (masterPVOutClkDel << SST_VIDEO_VCLK_2X_INPUT_DEL_SHIFT)); - else - /* 24-bit Video Output */ - ISET(sstMaster->fbiInit1, (IGET(sstMaster->fbiInit1) & - ~(SST_VIDEO_VCLK_2X_OUTPUT_DEL | SST_VIDEO_VCLK_DEL | - SST_VIDEO_VCLK_SEL | SST_VIDEO_VCLK_2X_INPUT_DEL)) | - SST_EN_SCANLINE_INTERLEAVE | - SST_VIDEO_VID_CLK_2X | - /*SST_VIDEO_INVERT_VID_CLK_2X | */ - (0x0 << SST_VIDEO_VCLK_SEL_SHIFT) | - SST_PCI_WRWS_1 | - (masterVInClkDel << SST_VIDEO_VCLK_DEL_SHIFT) | - (masterVOutClkDel << SST_VIDEO_VCLK_2X_OUTPUT_DEL_SHIFT) | - (masterPVOutClkDel << SST_VIDEO_VCLK_2X_INPUT_DEL_SHIFT)); - sst1InitIdleFBINoNOP(sstbase0); - /* Initialize pci and memory fifos... */ - pciFifoLwm = 16; - memFifoLwm = 26; - if(!GETENV(("SST_PCIFIFO_LWM"))) - ISET(sstMaster->fbiInit0, (IGET(sstMaster->fbiInit0) & - ~SST_PCI_FIFO_LWM) | (pciFifoLwm << SST_PCI_FIFO_LWM_SHIFT)); - sst1InitIdleFBINoNOP(sstbase0); - if(!GETENV(("SST_MEMFIFO_LWM"))) - ISET(sstMaster->fbiInit4, (IGET(sstMaster->fbiInit4) & - ~SST_MEM_FIFO_LWM) | (memFifoLwm << SST_MEM_FIFO_LWM_SHIFT)); - sst1InitIdleFBINoNOP(sstbase0); - INIT_PRINTF(("sst1InitSli(): Master pciFifoLwm:%d, memFifoLwm:%d\n", - ((IGET(sstMaster->fbiInit0) & SST_PCI_FIFO_LWM) >> - SST_PCI_FIFO_LWM_SHIFT), - ((IGET(sstMaster->fbiInit4) & SST_MEM_FIFO_LWM) >> - SST_MEM_FIFO_LWM_SHIFT))); - ISET(sstMaster->fbiInit1, IGET(sstMaster->fbiInit1) & ~SST_VIDEO_RESET); - sst1InitIdleFBINoNOP(sstbase0); - MasterInit1 = IGET(sstMaster->fbiInit1); - - /* Master */ - if(sst1InitCheckBoard(sstbase0) == FXFALSE) - return(FXFALSE); - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); - PCICFG_WR(SST1_PCI_INIT_ENABLE, - (j & ~(SST_SCANLINE_SLV_OWNPCI | SST_SCANLINE_SLI_SLV))); - MasterPhysAddr = sst1CurrentBoard->physAddr; - sst1InitReturnStatus(sstbase0); /* flush pci packer with reads */ - sst1InitReturnStatus(sstbase0); - sst1InitReturnStatus(sstbase0); - - /* Slave */ - if(sst1InitCheckBoard(sstbase1) == FXFALSE) - return(FXFALSE); - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); - PCICFG_WR(SST1_PCI_INIT_ENABLE, - ((j & ~(SST_SCANLINE_SLV_OWNPCI)) | SST_SCANLINE_SLI_SLV)); - /* Map both boards to same Master physical address */ - PCICFG_WR(PCI_BASE_ADDRESS_0, MasterPhysAddr); - sst1InitReturnStatus(sstbase0); /* flush pci packer with reads */ - sst1InitReturnStatus(sstbase0); - sst1InitReturnStatus(sstbase0); - - /* Reset Video units simultaneously */ - ISET(sstMaster->fbiInit1, MasterInit1 | SST_VIDEO_RESET); - sst1InitIdleFBINoNOP(sstbase0); - sst1InitIdleFBINoNOP(sstbase0); - sst1InitIdleFBINoNOP(sstbase0); - ISET(sstMaster->fbiInit1, MasterInit1); - if(sst1InitCheckBoard(sstbase0) == FXFALSE) - return(FXFALSE); - PCICFG_WR(SST1_PCI_INIT_ENABLE, 0x0); /* Disable writes to init regs */ - sst1InitReturnStatus(sstbase0); - ISET(sstMaster->fbiInit1, SlaveInit1); - sst1InitIdleFBINoNOP(sstbase0); - /* Enable writes to init regs */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, (SST_INITWR_EN | SST_PCI_FIFOWR_EN)); - sst1InitIdleFBINoNOP(sstbase0); - - if(sst1InitCheckBoard(sstbase1) == FXFALSE) - return(FXFALSE); - /* Disable writes to slave Init Registers */ - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); - PCICFG_WR(SST1_PCI_INIT_ENABLE, (j & ~SST_INITWR_EN)); - - if(sst1InitCheckBoard(sstbase0) == FXFALSE) - return(FXFALSE); - - /* Clear buffers as a result of new buffer offsets... */ - if(!GETENV(("SST_VIDEO_NOCLEAR"))) { - /* Clear Screen */ - FxU32 clearColor = 0x0; - - if(GETENV(("SST_VIDEO_CLEARCOLOR"))) - SSCANF(GETENV(("SST_VIDEO_CLEARCOLOR")), "%i", &clearColor); - ISET(sstMaster->c1, clearColor); - ISET(sstMaster->c0, clearColor); - ISET(sstMaster->zaColor, 0x0); - ISET(sstMaster->clipLeftRight, sst1CurrentBoard->fbiVideoWidth); - ISET(sstMaster->clipBottomTop, sst1CurrentBoard->fbiVideoHeight); - ISET(sstMaster->fbzMode, SST_RGBWRMASK | SST_ZAWRMASK); - ISET(sstMaster->fastfillCMD, 0x0); /* Frontbuffer & Z/A */ - ISET(sstMaster->fbzMode, SST_RGBWRMASK | SST_DRAWBUFFER_BACK); - ISET(sstMaster->fastfillCMD, 0x0); - ISET(sstMaster->nopCMD, 0x1); - } - sst1InitSliEnabled = 1; - sst1InitSliSlaveVirtAddr = sstbase1; - - sst1InitIdle(sstbase0); - - /* Synchronize Boards */ - for(j=0; j<3; j++) { - while(!(sst1InitReturnStatus(sstbase0) & SST_VRETRACE)) - ; - IGET(sstMaster->status); - ISET(sstMaster->swapbufferCMD, 0x0); - IGET(sstMaster->status); - sst1InitIdle(sstbase0); - } - while(!(sst1InitReturnStatus(sstbase0) & SST_VRETRACE)) - ; - IGET(sstMaster->status); - ISET(sstMaster->swapbufferCMD, 0x1); - IGET(sstMaster->status); - sst1InitIdle(sstbase0); - - return(FXTRUE); -} - -/* -** sst1InitShutdownSli(): -** Shutdown SLI configuration -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitShutdownSli(FxU32 *sstbase) -{ - volatile Sstregs *sstMaster = (Sstregs *) sstbase; - volatile Sstregs *sstSlave = (Sstregs *) sst1InitSliSlaveVirtAddr; - FxU32 n, j, cntr; - - if(sst1InitSliEnabled) { - INIT_PRINTF(("sst1InitShutdownSli(): Disabling Scanline Interleaving...\n")); - sst1InitSliEnabled = 0; - - cntr = 0; - while(1) { - if(sst1InitCheckBoard(sst1InitSliSlaveVirtAddr) == FXFALSE) - return(FXFALSE); - /* Remap slave to original physical address */ - PCICFG_WR(PCI_BASE_ADDRESS_0, sst1CurrentBoard->physAddr); - /* Turn off scanline interleaving in slave */ - /* Enable writes to init registers in slave */ - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); - PCICFG_WR(SST1_PCI_INIT_ENABLE, - (j | SST_SCANLINE_SLV_OWNPCI | SST_SCANLINE_SLI_SLV | - SST_INITWR_EN | SST_PCI_FIFOWR_EN)); - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); /* delay */ - ISET(sstSlave->fbiInit1, IGET(sstSlave->fbiInit1) & - ~SST_EN_SCANLINE_INTERLEAVE); - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); - PCICFG_WR(SST1_PCI_INIT_ENABLE, - (j & ~(SST_SCANLINE_SLV_OWNPCI | SST_SCANLINE_SLI_SLV))); - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); /* delay */ - sst1InitIdle((FxU32 *) sstSlave); - - - if(IGET(sstSlave->fbiInit1) & SST_EN_SCANLINE_INTERLEAVE) { - if(++cntr < 10) - continue; - else { - INIT_PRINTF(("sst1InitShutdown(): Could not disable Slave SLI...\n")); - return(FXFALSE); - } - } - break; - } - ISET(sstMaster->fbiInit1, IGET(sstMaster->fbiInit1) & - ~SST_EN_SCANLINE_INTERLEAVE); - sst1InitIdle((FxU32 *) sstMaster); - } - return(FXTRUE); -} - -/* -** sst1InitSliPciOwner(): -** Specify which SLI card owns PCI bus control -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitSliPciOwner(FxU32 *sstbase, FxU32 owner) -{ - FxU32 j, n; - static FxU32 masterIsOwner = 1; - - if(!sst1InitSliEnabled) - return(FXTRUE); - - /* Flush PCI packers... */ - sst1InitReturnStatus(sstbase); - sst1InitReturnStatus(sstbase); - sst1InitReturnStatus(sstbase); - - if(masterIsOwner) { - if(owner == SST_SLI_SLAVE_OWNPCI) { - masterIsOwner = 0; - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); - PCICFG_WR(SST1_PCI_INIT_ENABLE, ((j & ~SST_SLI_OWNPCI) | - SST_SLI_SLAVE_OWNPCI)); - if(sst1InitCheckBoard(sst1InitSliSlaveVirtAddr) == FXFALSE) - return(FXFALSE); - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); - PCICFG_WR(SST1_PCI_INIT_ENABLE, ((j & ~SST_SLI_OWNPCI) | - SST_SLI_SLAVE_OWNPCI)); - } else - return(FXTRUE); - } else { - if(owner == SST_SLI_MASTER_OWNPCI) { - masterIsOwner = 1; - if(sst1InitCheckBoard(sst1InitSliSlaveVirtAddr) == FXFALSE) - return(FXFALSE); - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); - PCICFG_WR(SST1_PCI_INIT_ENABLE, ((j & ~SST_SLI_OWNPCI) | - SST_SLI_MASTER_OWNPCI)); - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); - PCICFG_WR(SST1_PCI_INIT_ENABLE, ((j & ~SST_SLI_OWNPCI) | - SST_SLI_MASTER_OWNPCI)); - } else - return(FXTRUE); - } - return(FXTRUE); -} - -/* -** sst1InitSliDetect(): -** Determine if scanline interleave has been detected (either through -** power-up settings or through SST_SLIDETECT) -** -*/ -FX_ENTRY FxU32 FX_CALL sst1InitSliDetect(FxU32 *sstbase) -{ - static int firstTime = 1; - static FxU32 sliDetected = 0; - FxU32 fbiRev; - volatile Sstregs *sst; - - if(firstTime) { - firstTime = 0; - if(GETENV(("SST_SLIDETECT"))) - sliDetected = ATOI(GETENV(("SST_SLIDETECT"))); - else { - PCICFG_RD(PCI_REVISION_ID, fbiRev); - sst = (Sstregs *) sstbase; - if((IGET(sst->fbiInit1) & SST_SLI_DETECT) && (fbiRev > 1) && - (boardsInSystem) > 1 && - ((IGET(sst->fbiInit3) & SST_FBI_MEM_TYPE) >> - (SST_FBI_MEM_TYPE_SHIFT + 2))) - sliDetected = 1; - } - } - return(sliDetected); -} - -#pragma optimize ("",on) diff --git a/glide2x/sst1/init/initvg/sst1init.c b/glide2x/sst1/init/initvg/sst1init.c deleted file mode 100644 index ed0dd38..0000000 --- a/glide2x/sst1/init/initvg/sst1init.c +++ /dev/null @@ -1,916 +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$ -** -*/ - -/* -** Initialization code for SST-1 board. -** -** NOTE: This code must compiled with optimizations DISABLED!! -** -** The following environment variables can optionally be used to alter -** functionality (A value of X is a "don't care"): -** -** Variable Value Description -** -------- ----- ----------- -** SST_ARCADE X Allow special configs for arcade use -** SST_BACKPORCH hex Specify value of backPorch video register -** SST_BOARDS val Specify number of SST-1 boards in system -** SST_DEBUGDAC X Print out debug information for DAC -** reads and writes -** SST_DIMENSIONS hex Specify value of videoDimensions register -** SST_FASTMEM 1 Default. Enable fast memory timing -** SST_FASTMEM 0 Disable fast memory timing -** SST_FASTPCIRD X Enable fast PCI reads -** SST_FBICFG hex Specify FBI configuration strapping bits -** SST_FBIMEM_SIZE val Specify amount of frame buffer memory -** SST_FT_CLK_DEL hex Fbi-to-Trex clock delay value -** SST_GAMMA float Floating point value for gamma correction -** SST_GRXCLK val 16 <= Frequency < 80 (50 is default) -** SST_HSYNC hex Specify value of hSync video register -** SST_IGNORE_INIT_GAMMA X Bypass sst1InitGamma call and return -** SST_IGNORE_INIT_REGISTERS X Bypass sst1InitRegisters call and return -** SST_IGNORE_INIT_VIDEO X Bypass sst1InitVideo call and return -** SST_IGNORE_SLI_CHECK X Ignore checking for proper SLI install -** SST_INITDEBUG X Enable debug output -** SST_INITDEBUG_FILE file File to direct all debug output -** SST_MEMFIFO 0 Disable FBI Memory FIFO -** SST_MEMFIFO 1 Enable FBI Memory FIFO -** SST_MEMFIFO_ENTRIES hex Set number of entries in memory fifo -** SST_MEMFIFO_HWM hex Set memory fifo high water mark -** SST_MEMFIFO_LFB 0 or 1 Specify LFB writes through Memory FIFO -** SST_MEMFIFO_LWM hex Set memory fifo low water mark -** SST_MEMFIFO_TEX 0 or 1 Specify Texture writes through Mem FIFO -** SST_MEMOFFSET hex Specify value of memoffset video register -** SST_NOCHECKHANG X Do not Check for FBI Hangs for texturing -** SST_NODEVICEINFO X Ignore calls to sst1InitFillDeviceInfo() -** SST_NOSHUTDOWN X Do not turn off monitor refresh on call -** to sst1InitShutdown() -** SST_PCIFIFO_LWM hex Set pci fifo low water mark -** SST_PFT_CLK_DEL hex Preliminary Fbi-to-Trex clock delay value -** SST_PTF0_CLK_DEL hex Prelim TMU2Fbi clock delay value (TMU #0) -** SST_PTF1_CLK_DEL hex Prelim TMU2Fbi clock delay value (TMU #1) -** SST_PTF2_CLK_DEL hex Prelim TMU2Fbi clock delay value (TMU #2) -** SST_SLIDETECT 0 or 1 Specify Scanline Interleaving detection -** SST_SLIM_VIN_CLKDEL hex Specify FBI internal video clock delay -** (SLI Master) -** SST_SLIM_VOUT_CLKDEL hex Specify FBI external video clock delay -** (SLI Master) -** SST_SLIS_VIN_CLKDEL hex Specify FBI internal video clock delay -** (SLI Slave) -** SST_SLIS_VOUT_CLKDEL hex Specify FBI external video clock delay -** (SLI Slave) -** SST_SCREENREFRESH 60 Select 60Hz monitor refresh rate -** (overrides argument to sst1InitVideo) -** SST_SCREENREFRESH 75 Select 75Hz monitor refresh rate -** SST_SCREENREZ 512 Select 512x384 video resolution -** (overrides argument to sst1InitVideo) -** SST_SCREENREZ 640 Select 640x480 video resolution -** SST_SCREENREZ 800 Select 800x600 video resolution -** SST_SLOWPCIWR X Enable 1 wait-state PCI writes -** SST_TEXMAP_DISABLE X Disable texture mapping -** SST_TF0_CLK_DEL hex Trex-to-Fbi clock delay value (TMU #0) -** SST_TF1_CLK_DEL hex Trex-to-Fbi clock delay value (TMU #1) -** SST_TF2_CLK_DEL hex Trex-to-Fbi clock delay value (TMU #2) -** SST_TF_FIFO_THRESH hex Set TREX-to-FBI FIFO threshold -** SST_TILESINX hex Specify value of tilesInX video register -** SST_TMUCFG hex Specify TMU configuration strapping bits -** SST_TMUMEM X Enable accurate determination of TMU mem -** SST_TMUMEM_SIZE val Specify amount of texture memory -** SST_TREX0INIT0 hex Set trexInit0 register value - TMU #0 -** SST_TREX0INIT1 hex Set trexInit1 register value - TMU #0 -** SST_TREX1INIT0 hex Set trexInit0 register value - TMU #1 -** SST_TREX1INIT1 hex Set trexInit1 register value - TMU #1 -** SST_TREX2INIT0 hex Set trexInit0 register value - TMU #2 -** SST_TREX2INIT1 hex Set trexInit1 register value - TMU #2 -** SST_TRIPLE_BUFFER X Enable Triple Buffering -** SST_VIN_CLKDEL hex Specify FBI internal video clock delay -** SST_VOUT_CLKDEL hex Specify FBI external video clock delay -** SST_VGA_PASS 0,1 Force VGA_PASS output to {0,1} -** SST_VIDCLK2X val Video clock frequency (2x dot clock) -** SST_VIDEO_24BPP 0 Select 16-bit video output -** SST_VIDEO_24BPP 1 Select 24-bit video output -** SST_VIDEO_DISABLE X Turn off Video/Monitor refresh in FBI -** SST_VIDEO_FILTER_DISABLE X Disable video filtering -** SST_VIDEO_FILTER_THRESHOLD hex Set video filtering threshold -** SST_VIDEO_NOCLEAR X Do not clear buffers in sst1InitVideo() -** SST_VIDEO_CLEARCOLOR hex Clear screen color -** SST_VFIFO_THRESH 0-31 Select video fifo threshold -** SST_VSYNC hex Specify value of vSync video register -** -** VOODOO_FILE name Filename used in place of "voodoo.ini" -** VOODOO_PATH path Path used to locate "voodoo.ini" file -** -*/ - -#pragma optimize ("",off) -#include -#include -#include -#include -#include -#define SST1INIT_ALLOCATE /* Allocate variables in sst1init.h */ -#define FX_DLL_DEFINITION -#include -#include -#include -#include "rcver.h" - -#ifdef __WIN32__ -#include -#endif - -/* Allow SourceSafe to track Revision */ -static char codeIdent[] = "@#%" VERSIONSTR ; - -/* -** sst1InitMapBoard(): -** Find and map SST-1 board into virtual memory -** -** Returns: -** FxU32 pointer to base of SST-1 board if successful mapping occurs -** FXFALSE if cannot map or find SST-1 board -** -*/ -FX_EXPORT FxU32 * FX_CSTYLE sst1InitMapBoard(FxU32 BoardNumber) -{ - static FxU32 firstTime = 1; - FxU32 sizeOfCard = 0x1000000; /* 16 MBytes of addr space for SST-1 */ - FxU32 *sst; - volatile Sstregs *sstptr; - FxU32 n, j; - - if(firstTime) { - /* Make Watcom happy */ - codeIdent[0] = '@'; - headersIdent[0] = '@'; - - /* Find "voodoo.ini" file if it exists... */ - sst1InitUseVoodooFile = sst1InitVoodooFile(); - - if(!(boardsInSystem = sst1InitNumBoardsInSystem())) - return(NULL); - } - - if(BoardNumber == 0) { - INIT_PRINTF(("sst1Init Routines")); -#ifdef FX_DLL_ENABLE - INIT_PRINTF(("(DLL)")); -#endif - INIT_PRINTF((": %s\n", VERSIONSTR)); - INIT_PRINTF(("sst1InitMapBoard(): BoardsInSystem = %d\n", - boardsInSystem)); - - /* Clear board info structure */ - sst1InitClearBoardInfo(); - } - - if(firstTime) { - firstTime = 0; - sst1InitClearBoardInfo(); - - /* Map all boards in the system */ - /* Check that scanline interleaving is not enabled... */ - for(j=0; jfbiInit1) & SST_EN_SCANLINE_INTERLEAVE) && - sst1InitSliDetect(sst)) { - INIT_PRINTF(("sst1InitMapBoard(): Scanline Interleave detected at startup for board=%d\n", j)); - INIT_PRINTF((" System reboot required...\n")); - return(NULL); - } - } else { - FxU32 code = pciGetErrorCode(); - if (code == PCI_ERR_WRONGVXD) { -#ifdef __WIN32__ - MessageBox(NULL, pciGetErrorString(), NULL, MB_OK); -#endif /* __WIN32__ */ - exit(1); - } - sst1BoardInfo[j].virtAddr = (FxU32 *) NULL; - sst1BoardInfo[j].physAddr = (FxU32) NULL; - sst1BoardInfo[j].deviceNumber = 0xdead; - sst1BoardInfo[j].numBoardInsystem = 0xdead; - sst1BoardInfo[j].fbiRevision = 0xdead; - sst1BoardInfo[j].deviceID = 0xdead; - sst1BoardInfo[j].vendorID = 0xdead; - } - } - } - - /* Max number of supported boards in system */ - if(BoardNumber > SST1INIT_MAX_BOARDS) return(NULL); - - if(!(sst = sst1BoardInfo[BoardNumber].virtAddr)) - return (NULL); - - INIT_PRINTF(("sst1InitMapBoard(): vAddr:0x%x pAddr:0x%x Dev:0x%x Board:%d\n", - (FxU32) sst1BoardInfo[BoardNumber].virtAddr, - (FxU32) sst1BoardInfo[BoardNumber].physAddr, - (FxU32) sst1BoardInfo[BoardNumber].deviceNumber, BoardNumber)); - - sstptr = (Sstregs *) sst; - - /* Default settings */ - if((IGET(sstptr->fbiInit3) & SST_FBI_VGA_PASS_POWERON) && - (sst1BoardInfo[BoardNumber].fbiRevision > 0)) { - sst1BoardInfo[BoardNumber].vgaPassthruDisable = 0x0; - sst1BoardInfo[BoardNumber].vgaPassthruEnable = SST_EN_VGA_PASSTHRU; - sst1BoardInfo[BoardNumber].fbiRegulatorPresent = 0x1; - } else { - sst1BoardInfo[BoardNumber].vgaPassthruDisable = SST_EN_VGA_PASSTHRU; - sst1BoardInfo[BoardNumber].vgaPassthruEnable = 0x0; - sst1BoardInfo[BoardNumber].fbiRegulatorPresent = 0x0; - } - sst1BoardInfo[BoardNumber].fbiVideo16BPP = 0; - - if(GETENV(("SST_VGA_PASS"))) { - INIT_PRINTF(("sst1InitMapBoard(): Using SST_VGA_PASS=%d\n", - ATOI(GETENV(("SST_VGA_PASS"))))); - if(ATOI(GETENV(("SST_VGA_PASS")))) { - sst1BoardInfo[BoardNumber].vgaPassthruEnable = SST_EN_VGA_PASSTHRU; - sst1BoardInfo[BoardNumber].vgaPassthruDisable = 0x0; - } else { - sst1BoardInfo[BoardNumber].vgaPassthruDisable = SST_EN_VGA_PASSTHRU; - sst1BoardInfo[BoardNumber].vgaPassthruEnable = 0x0; - } - } - return(sst); -} - -/* -** sst1InitRegisters(): -** Initialize registers and memory and return to power-on state -** -** Returns: -** FXTRUE if successfully initializes SST-1 -** FXFALSE if cannot initialize SST-1 -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitRegisters(FxU32 *sstbase) -{ - FxU32 n, tf_fifo_thresh; - FxU32 ft_clk_del, tf0_clk_del, tf1_clk_del, tf2_clk_del; - sst1ClkTimingStruct sstGrxClk; - volatile Sstregs *sst = (Sstregs *) sstbase; - - if(!sst) - return(FXFALSE); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - if(GETENV(("SST_IGNORE_INIT_REGISTERS"))) { - INIT_PRINTF(("WARNING: Ignoring sst1InitRegisters()...\n")); - sst1InitIdleFBINoNOP(sstbase); - return(FXTRUE); - } - - /* Disable video clock */ - PCICFG_WR(SST1_PCI_VCLK_DISABLE, 0x0); - - /* Enable writes to the FBIINIT registers */ - /* Do not allow writes into the pci fifo until everything is reset */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, SST_INITWR_EN); - - /* Reset Snoop registers to default values */ -#if 0 - PCICFG_WR(SST1_PCI_BUS_SNOOP0, SST_PCI_BUS_SNOOP_DEFAULT); - PCICFG_WR(SST1_PCI_BUS_SNOOP1, SST_PCI_BUS_SNOOP_DEFAULT); -#else - PCICFG_WR(SST1_PCI_BUS_SNOOP_0, SST_PCI_BUS_SNOOP_DEFAULT); - PCICFG_WR(SST1_PCI_BUS_SNOOP_1, SST_PCI_BUS_SNOOP_DEFAULT); -#endif - sst1InitReturnStatus(sstbase); /* Stall - can't call IdleFbi because */ - /* FBI could be hung at this stage */ - sst1InitReturnStatus(sstbase); - sst1InitReturnStatus(sstbase); - - /* Adjust Fbi-to-Trex clock delay value */ - /* Adjust Trex-to-Fbi FIFO */ - if(GETENV(("SST_TF_FIFO_THRESH"))) - SSCANF(GETENV(("SST_TF_FIFO_THRESH")), "%i", &tf_fifo_thresh); - else - tf_fifo_thresh = 0x8; - INIT_PRINTF(("sst1InitRegisters(): Setting TREX-to-FBI FIFO THRESHOLD to 0x%x...\n", - tf_fifo_thresh)); - /* Set ft_clk_del for 16 MHz bringup */ - if(sst1CurrentBoard->fbiRevision == 2) - /* .5 micron */ - ft_clk_del = 0x8; /* Okay for 16 MHz startup... */ - else - /* .6 micron */ - ft_clk_del = 0xa; /* Okay for 16 MHz startup... */ - if(GETENV(("SST_PFT_CLK_DEL"))) - SSCANF(GETENV(("SST_PFT_CLK_DEL")), "%i", &ft_clk_del); - INIT_PRINTF(("sst1InitRegisters(): Setting PRELIM FT-CLK delay to 0x%x...\n", ft_clk_del)); - ISET(sst->fbiInit3, - (SST_FBIINIT3_DEFAULT & ~(SST_FT_CLK_DEL_ADJ | SST_TF_FIFO_THRESH)) | - (ft_clk_del << SST_FT_CLK_DEL_ADJ_SHIFT) | - (tf_fifo_thresh << SST_TF_FIFO_THRESH_SHIFT)); - - /* Wait for Fbi-to-Trex clock delay value to propogate */ - sst1InitReturnStatus(sstbase); /* Stall - can't call IdleFbi because */ - /* FBI could be hung at this stage */ - - sst1InitReturnStatus(sstbase); - sst1InitReturnStatus(sstbase); - - /* Reset graphics and video units */ - /* Must reset video unit before graphics unit, otherwise video unit could */ - /* potentially hang waiting for the graphics unit to respond */ - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_RESET); - - /* don't wait for idle b/c grx could be hung */ - sst1InitReturnStatus(sstbase); - sst1InitReturnStatus(sstbase); - sst1InitReturnStatus(sstbase); - ISET(sst->fbiInit0, - IGET(sst->fbiInit0) | (SST_GRX_RESET | SST_PCI_FIFO_RESET)); - - sst1InitIdleFBINoNOP(sstbase); - - /* Unreset PCI FIFO... */ - ISET(sst->fbiInit0, IGET(sst->fbiInit0) & ~SST_PCI_FIFO_RESET); - sst1InitIdleFBINoNOP(sstbase); - - /* Unreset graphics subsystem */ - /* THIS MUST BE PRESENT OTHERWISE THE PCI FIFO WILL NEVER DRAIN! */ - ISET(sst->fbiInit0, IGET(sst->fbiInit0) & ~SST_GRX_RESET); - sst1InitIdleFBINoNOP(sstbase); - - /* Reset all FBI and TREX Init registers */ - ISET(sst->fbiInit0, SST_FBIINIT0_DEFAULT); - ISET(sst->fbiInit1, SST_FBIINIT1_DEFAULT); - ISET(sst->fbiInit2, SST_FBIINIT2_DEFAULT); - ISET(sst->fbiInit3, - (SST_FBIINIT3_DEFAULT & ~(SST_FT_CLK_DEL_ADJ | SST_TF_FIFO_THRESH)) | - (ft_clk_del << SST_FT_CLK_DEL_ADJ_SHIFT) | - (tf_fifo_thresh << SST_TF_FIFO_THRESH_SHIFT)); - ISET(sst->fbiInit4, SST_FBIINIT4_DEFAULT); - sst1InitIdleFBINoNOP(sstbase); /* Wait until init regs are reset */ - - /* Enable writes to the FBIINIT registers and allow pushes onto PCI FIFO */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, (SST_INITWR_EN | SST_PCI_FIFOWR_EN)); - - /* Determine DAC Type */ - if(sst1InitDacDetect(sstbase) == FXFALSE) { - INIT_PRINTF(("sst1InitRegisters(): Could not detect DAC...\n")); - return(FXFALSE); - } - - /* set TREX0 init values */ - if(GETENV(("SST_TREX0INIT0"))) { - INIT_PRINTF(("sst1InitRegisters(): Using SST_TREX0INIT0 environment variable\n")); - SSCANF(GETENV(("SST_TREX0INIT0")), "%i", - &sst1CurrentBoard->tmuInit0[0]); - } else - sst1CurrentBoard->tmuInit0[0] = SST_TREX0INIT0_DEFAULT; - - INIT_PRINTF(("sst1InitRegisters(): Storing TREX0INIT0=0x%x\n", - sst1CurrentBoard->tmuInit0[0])); - if(GETENV(("SST_TREX0INIT1"))) { - - INIT_PRINTF(("sst1InitRegisters(): Using SST_TREX0INIT1 environment variable\n")); - SSCANF(GETENV(("SST_TREX0INIT1")), "%i", - &sst1CurrentBoard->tmuInit1[0]); - } else - sst1CurrentBoard->tmuInit1[0] = SST_TREX0INIT1_DEFAULT; - if(GETENV(("SST_PTF0_CLK_DEL"))) { - SSCANF(GETENV(("SST_PTF0_CLK_DEL")), "%i", &tf0_clk_del); - sst1CurrentBoard->tmuInit1[0] = (sst1CurrentBoard->tmuInit1[0] & - ~SST_TEX_TF_CLK_DEL_ADJ) | - (tf0_clk_del<tmuInit1[0])); - - ISET(SST_TREX(sst,0)->trexInit0, sst1CurrentBoard->tmuInit0[0]); - sst1InitIdleFBINoNOP(sstbase); - ISET(SST_TREX(sst,0)->trexInit1, sst1CurrentBoard->tmuInit1[0]); - sst1InitIdleFBINoNOP(sstbase); - - /* set TREX1 init values */ - if(GETENV(("SST_TREX1INIT0"))) { - INIT_PRINTF(("sst1InitRegisters(): Using SST_TREX1INIT0 environment variable\n")); - SSCANF(GETENV(("SST_TREX1INIT0")), "%i", - &sst1CurrentBoard->tmuInit0[1]); - } else - sst1CurrentBoard->tmuInit0[1] = SST_TREX1INIT0_DEFAULT; - INIT_PRINTF(("sst1InitRegisters(): Storing TREX1INIT0=0x%x\n", - sst1CurrentBoard->tmuInit0[1])); - if(GETENV(("SST_TREX1INIT1"))) { - INIT_PRINTF(("sst1InitRegisters(): Using SST_TREX1INIT1 environment variable\n")); - SSCANF(GETENV(("SST_TREX1INIT1")), "%i", - &sst1CurrentBoard->tmuInit1[1]); - } else - sst1CurrentBoard->tmuInit1[1] = SST_TREX1INIT1_DEFAULT; - if(GETENV(("SST_PTF1_CLK_DEL"))) { - SSCANF(GETENV(("SST_PTF1_CLK_DEL")), "%i", &tf1_clk_del); - sst1CurrentBoard->tmuInit1[1] = (sst1CurrentBoard->tmuInit1[1] & - ~SST_TEX_TF_CLK_DEL_ADJ) | - (tf1_clk_del<tmuInit1[1])); - - ISET(SST_TREX(sst,1)->trexInit0, sst1CurrentBoard->tmuInit0[1]); - sst1InitIdleFBINoNOP(sstbase); - ISET(SST_TREX(sst,1)->trexInit1, sst1CurrentBoard->tmuInit1[1]); - sst1InitIdleFBINoNOP(sstbase); - - /* set TREX2 init values */ - if(GETENV(("SST_TREX2INIT0"))) { - INIT_PRINTF(("sst1InitRegisters(): Using SST_TREX2INIT0 environment variable\n")); - SSCANF(GETENV(("SST_TREX2INIT0")), "%i", - &sst1CurrentBoard->tmuInit0[2]); - } else - sst1CurrentBoard->tmuInit0[2] = SST_TREX2INIT0_DEFAULT; - INIT_PRINTF(("sst1InitRegisters(): Storing TREX2INIT0=0x%x\n", - sst1CurrentBoard->tmuInit0[2])); - if(GETENV(("SST_TREX2INIT1"))) { - INIT_PRINTF(("sst1InitRegisters(): Using SST_TREX2INIT1 environment variable\n")); - SSCANF(GETENV(("SST_TREX2INIT1")), "%i", - &sst1CurrentBoard->tmuInit1[2]); - } else - sst1CurrentBoard->tmuInit1[2] = SST_TREX2INIT1_DEFAULT; - if(GETENV(("SST_PTF2_CLK_DEL"))) { - SSCANF(GETENV(("SST_PTF2_CLK_DEL")), "%i", &tf2_clk_del); - sst1CurrentBoard->tmuInit1[2] = (sst1CurrentBoard->tmuInit1[2] & - ~SST_TEX_TF_CLK_DEL_ADJ) | - (tf2_clk_del<tmuInit1[2])); - - ISET(SST_TREX(sst,2)->trexInit0, sst1CurrentBoard->tmuInit0[2]); - sst1InitIdleFBINoNOP(sstbase); - ISET(SST_TREX(sst,2)->trexInit1, sst1CurrentBoard->tmuInit1[2]); - sst1InitIdleFBINoNOP(sstbase); - - /* Set clock at 16 MHz to sense TREX configuration... */ - if(sst1InitComputeClkParams((float) 16.0, &sstGrxClk) == FXFALSE) - return(FXFALSE); - if(sst1InitSetGrxClk(sstbase, &sstGrxClk) == FXFALSE) - return(FXFALSE); - - /* Set PCI wait-states */ - if(GETENV(("SST_SLOWPCIWR"))) { - INIT_PRINTF(("sst1InitRegisters(): Setting up SLOW PCI Writes...\n")); - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_PCI_WRWS_1); - } else - ISET(sst->fbiInit1, IGET(sst->fbiInit1) & ~SST_PCI_WRWS_1); - - if(GETENV(("SST_FASTPCIRD"))) { - INIT_PRINTF(("sst1InitRegisters(): Setting up FAST PCI Reads...\n")); - ISET(sst->fbiInit4, IGET(sst->fbiInit4) & ~SST_PCI_RDWS_2); - } - sst1InitIdleFBINoNOP(sstbase); - - /* Enable Linear frame buffer reads */ - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_LFB_READ_EN); - - /* Swapbuffer algorithm is based on VSync initially */ - ISET(sst->fbiInit2, (IGET(sst->fbiInit2) & ~SST_SWAP_ALGORITHM) | - SST_SWAP_VSYNC); - - /* Enable LFB read-aheads */ - ISET(sst->fbiInit4, IGET(sst->fbiInit4) | SST_EN_LFB_RDAHEAD); - - /* Enable triangle alternate register mapping */ - ISET(sst->fbiInit3, IGET(sst->fbiInit3) | SST_ALT_REGMAPPING); - -#if 0 - /* Enable Endian Byte Swapping */ - /* Do not enable byte swapping due to potential bug in FBI... */ - ISET(sst->fbiInit0, IGET(sst->fbiInit0) | SST_EN_ENDIAN_SWAPPING); -#endif - - /* Setup DRAM Refresh */ - ISET(sst->fbiInit2, (IGET(sst->fbiInit2) & ~SST_DRAM_REFRESH_CNTR) | - SST_DRAM_REFRESH_16MS); - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit2, IGET(sst->fbiInit2) | SST_EN_DRAM_REFRESH); - sst1InitIdleFBINoNOP(sstbase); - - if(GETENV(("SST_FASTMEM"))) - n = ATOI(GETENV(("SST_FASTMEM"))); - else - n = 1; - - if(n) { - INIT_PRINTF(("sst1InitRegisters(): Setting up FAST DRAM Configuration\n")); - ISET(sst->fbiInit2, IGET(sst->fbiInit2) | (SST_EN_FAST_RAS_READ | - SST_EN_DRAM_RD_AHEAD_FIFO | SST_EN_FAST_RD_AHEAD_WR)); - } else - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_DISEN_RD_AHEAD_WR_RD); - - /* Return all other registers to their power-on state */ - sst1InitIdleFBINoNOP(sstbase); - sst1InitSetResolution(sstbase, &SST_VREZ_640X480_60, 0); - sst1InitIdleFBINoNOP(sstbase); - - /* Get DRAMs up and running (refresh is already enabled)... */ - ISET(sst->c1, 0x0); - ISET(sst->c0, 0x0); - ISET(sst->zaColor, 0x0); - ISET(sst->clipLeftRight, 100); /* draw into 50x50 area */ - ISET(sst->clipBottomTop, 100); - ISET(sst->fbzMode, SST_RGBWRMASK | SST_ZAWRMASK); - ISET(sst->fastfillCMD, 0x0); /* Frontbuffer & Z/A */ - ISET(sst->nopCMD, 0x1); /* Clear fbistat registers after clearing screen */ - sst1InitIdleFBINoNOP(sstbase); - - sst1InitRenderingRegisters(sstbase); - if(sst1InitFillDeviceInfo(sstbase, sst1CurrentBoard) == FXFALSE) { - INIT_PRINTF(("sst1InitRegisters(): ERROR filling DeviceInfo...\n")); - return(FXFALSE); - } - - sst1InitIdleFBINoNOP(sstbase); - sst1InitRenderingRegisters(sstbase); - sst1InitIdleFBINoNOP(sstbase); - - /* LFB writes stored in memory FIFO? */ - if(GETENV(("SST_MEMFIFO_LFB"))) - n = ATOI(GETENV(("SST_MEMFIFO_LFB"))); - else - n = 1; - if(n) { - INIT_PRINTF(("sst1InitRegisters(): LFB Writes go through memory FIFO...\n")); - ISET(sst->fbiInit0, IGET(sst->fbiInit0) | SST_EN_LFB_MEMFIFO); - sst1InitIdleFBINoNOP(sstbase); - } - - /* Texture memory writes stored in memory FIFO? */ - if(GETENV(("SST_MEMFIFO_TEX"))) - n = ATOI(GETENV(("SST_MEMFIFO_TEX"))); - else - n = 1; - if(n) { - INIT_PRINTF(("sst1InitRegisters(): TEXTURE Writes go through memory FIFO...\n")); - ISET(sst->fbiInit0, IGET(sst->fbiInit0) | SST_EN_TEX_MEMFIFO); - sst1InitIdleFBINoNOP(sstbase); - } - - ISET(sst->vRetrace, 0x0); - ISET(sst->backPorch, 0x0); - ISET(sst->videoDimensions, 0x0); - ISET(sst->hSync, 0x0); - ISET(sst->vSync, 0x0); - ISET(sst->videoFilterRgbThreshold, 0x0); - - sst1InitIdleFBINoNOP(sstbase); /* Wait until init regs are reset */ - - if(GETENV(("SST_TEXMAP_DISABLE"))) { - INIT_PRINTF(("sst1InitRegisters() WARNING: Disabling texture mapping\n")); - ISET(sst->fbiInit3, IGET(sst->fbiInit3) | SST_TEXMAP_DISABLE); - sst1InitIdleFBINoNOP(sstbase); - } - INIT_PRINTF(("sst1InitRegisters(): exiting with status %d...\n", FXTRUE)); - return(FXTRUE); -} - -FX_EXPORT void FX_CSTYLE sst1InitRenderingRegisters(FxU32 *sstbase) -{ - FxU32 i; - volatile Sstregs *sst = (Sstregs *) sstbase; - - ISET(sst->vA.x, 0x0); ISET(sst->vA.y, 0x0); - ISET(sst->vB.x, 0x0); ISET(sst->vB.y, 0x0); - ISET(sst->vC.x, 0x0); ISET(sst->vC.y, 0x0); - - ISET(sst->r, 0x0); ISET(sst->g, 0x0); - ISET(sst->b, 0x0); ISET(sst->z, 0x0); - ISET(sst->a, 0x0); ISET(sst->s, 0x0); - ISET(sst->t, 0x0); ISET(sst->w, 0x0); - - ISET(sst->drdx, 0x0); ISET(sst->dgdx, 0x0); - ISET(sst->dbdx, 0x0); ISET(sst->dzdx, 0x0); - ISET(sst->dadx, 0x0); ISET(sst->dsdx, 0x0); - ISET(sst->dtdx, 0x0); ISET(sst->dwdx, 0x0); - - ISET(sst->drdy, 0x0); ISET(sst->dgdy, 0x0); - ISET(sst->dbdy, 0x0); ISET(sst->dzdy, 0x0); - ISET(sst->dady, 0x0); ISET(sst->dsdy, 0x0); - ISET(sst->dtdy, 0x0); ISET(sst->dwdy, 0x0); - - ISET(sst->fbzColorPath, 0x0); - ISET(sst->fogMode, 0x0); - ISET(sst->alphaMode, 0x0); - ISET(sst->fbzMode, 0x0); - ISET(sst->lfbMode, 0x0); - ISET(sst->clipLeftRight, 0x0); - ISET(sst->clipBottomTop, 0x0); - - ISET(sst->fogColor, 0x0); - ISET(sst->zaColor, 0x0); - ISET(sst->chromaKey, 0x0); - ISET(sst->stipple, 0x0); - ISET(sst->c0, 0x0); - ISET(sst->c1, 0x0); - - ISET(sst->nopCMD, 0x1); /* Clear fbistat registers */ - - for(i=0; i<32; i++) - ISET(sst->fogTable[i], 0x0); - - /* clear TMU registers */ - ISET(sst->textureMode, 0x0); - ISET(sst->tLOD, 0x0); - ISET(sst->tDetail, 0x0); - ISET(sst->texBaseAddr, 0x0); - ISET(sst->texBaseAddr1, 0x0); - ISET(sst->texBaseAddr2, 0x0); - ISET(sst->texBaseAddr38, 0x0); - - for(i=0; i<12; i++) { - ISET(sst->nccTable0[i], 0x0); - ISET(sst->nccTable1[i], 0x0); - } - sst1InitIdle(sstbase); -} - -/* -** sst1InitShutdown(): -** Shutdown SST-1 -** Resets state of VGA_PASS to return monitor control back to the VGA -** Powers-down the DAC -** Resets the graphics clock in FBI to conserve power -** -** Returns: -** FXTRUE if successfully shuts down SST-1 -** FXFALSE if cannot shut down the SST-1 -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitShutdown(FxU32 *sstbase) -{ - volatile Sstregs *sstMaster = (Sstregs *) sstbase; - volatile Sstregs *sstSlave = (Sstregs *) sst1InitSliSlaveVirtAddr; - volatile Sstregs *sstPtr; - FxU32 n; - FxU32 SliEnable = sst1InitSliEnabled; - sst1ClkTimingStruct sstGrxClk; - - if(!sstbase) - return(FXFALSE); - - /* Wait for the SST-1 to finish rendering... */ - sst1InitIdle(sstbase); - - if(sst1InitSliEnabled) { - if(sst1InitShutdownSli(sstbase) == FXFALSE) - return(FXFALSE); - } -#ifdef __DOS32__ - /* - * HACK alert. -MS - * - * There's a pciClose(), but nobody calls it. This is needed by the - * DOS DPMI services to close fxmemmap.vxd. - * - * We need to move this to the "appropriate" place, wherever that may be. - */ - pciClose(); -#endif - - if(GETENV(("SST_NOSHUTDOWN"))) - INIT_PRINTF(("sst1InitShutdown(): Bypassing shutdown with SST_NOSHUTDOWN\n", n)); - - n = 0; - while(!GETENV(("SST_NOSHUTDOWN"))) { - if(!n) - sstPtr = sstMaster; - else - sstPtr = sstSlave; - - if(sst1InitCheckBoard((FxU32 *) sstPtr) == FXFALSE) - return(FXFALSE); - - INIT_PRINTF(("sst1InitShutdown(): Shutting down SST-1 #%d...\n", n)); - - /* Reset video unit to guarantee no contentions on the memory bus */ - /* Blank DAC so VGA Passthru works properly */ - ISET(sstPtr->fbiInit1, - IGET(sstPtr->fbiInit1) | (SST_VIDEO_RESET | SST_VIDEO_BLANK_EN)); - /* Turn off dram refresh to guarantee no contentions on the - memory bus */ - ISET(sstPtr->fbiInit2, IGET(sstPtr->fbiInit2) & ~SST_EN_DRAM_REFRESH); - - /* Reset graphics subsystem */ - ISET(sstPtr->fbiInit0, - IGET(sstPtr->fbiInit0) | (SST_GRX_RESET | SST_PCI_FIFO_RESET)); - sst1InitIdleFBINoNOP((FxU32 *) sstPtr); - ISET(sstPtr->fbiInit0, IGET(sstPtr->fbiInit0) & ~SST_PCI_FIFO_RESET); - sst1InitIdleFBINoNOP((FxU32 *) sstPtr); - ISET(sstPtr->fbiInit0, IGET(sstPtr->fbiInit0) & ~SST_GRX_RESET); - sst1InitIdleFBINoNOP((FxU32 *) sstPtr); - - /* Turnaround VGA_PASS to allow VGA monitor */ - sst1InitVgaPassCtrl((FxU32 *) sstPtr, 1); - - sst1InitIdleFBINoNOP((FxU32 *) sstPtr); - - /* Set clock at 30 MHz to reduce power consumption... */ - sst1InitComputeClkParams((float) 30.0, &sstGrxClk); - if(sst1InitSetGrxClk((FxU32 *) sstPtr, &sstGrxClk) == FXFALSE) - return(FXFALSE); - sst1CurrentBoard->initGrxClkDone = 0; - - if((++n > 1) || !SliEnable) - break; - } - sst1InitIdle(sstbase); - INIT_PRINTF(("sst1InitShutdown(): Returning with status %d...\n", FXTRUE)); -#ifdef INIT_OUTPUT - if ( sst1InitMsgFile != stdout && sst1InitMsgFile ) - fclose(sst1InitMsgFile); -#endif - return(FXTRUE); -} - -/* -** sst1InitCheckBoard(): -** Set internal global variables for multiple SST-1 support -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitCheckBoard(FxU32 *sstbase) -{ - FxU32 n; - FxBool return_val = FXFALSE; - - for(n=0; n -#endif - -#define MAX_NUM_TMUS 3 - -/* Following defines need to go in "sst.h" eventually */ -/*--------- SST PCI Configuration Command bits --------------*/ -#define SST_PCIMEM_ACCESS_EN BIT(1) - -/*------- SST PCI Configuration Register defaults -----------*/ -#define SST_PCI_INIT_ENABLE_DEFAULT 0x0 -#define SST_PCI_BUS_SNOOP_DEFAULT 0x0 - -/*--- SST PCI Init Enable Configuration Register defaults ---*/ -#define SST_SLI_OWNPCI SST_SCANLINE_SLV_OWNPCI -#define SST_SLI_MASTER_OWNPCI 0x0 -#define SST_SLI_SLAVE_OWNPCI SST_SCANLINE_SLV_OWNPCI - -/*----------------- SST fbiinit0 bits -----------------------*/ -#define SST_FBIINIT0_DEFAULT 0x00000410 -#define SST_GRX_RESET BIT(1) -#define SST_PCI_FIFO_RESET BIT(2) -#define SST_EN_ENDIAN_SWAPPING BIT(3) - -/*----------------- SST fbiinit1 bits -----------------------*/ -#define SST_FBIINIT1_DEFAULT 0x00201102 -#define SST_SLI_DETECT BIT(2) - -/*----------------- SST fbiinit2 bits -----------------------*/ -#define SST_FBIINIT2_DEFAULT 0x80000040 -#define SST_DRAM_REFRESH_16MS (0x30 << SST_DRAM_REFRESH_CNTR_SHIFT) - -/*----------------- SST fbiinit3 bits -----------------------*/ -#define SST_FBIINIT3_DEFAULT 0x001E4000 -#define SST_TEXMAP_DISABLE BIT(6) -#define SST_FBI_MEM_TYPE_SHIFT 8 -#define SST_FBI_MEM_TYPE (0x7<numBoardInsystem & 0x1) || \ - ((sst1CurrentBoard->numBoardInsystem & 0x1) && \ - (sst1InitSliDetect(sstbase) == 0))) - -/*-----------------------------------------------------------*/ - -/* -** SST-1 Initialization typedefs -** -*/ - -#ifdef __cplusplus -extern "C" { -#endif - - -typedef struct { - float freq; - FxU32 clkTiming_M; - FxU32 clkTiming_P; - FxU32 clkTiming_N; - FxU32 clkTiming_L; - FxU32 clkTiming_IB; -} sst1ClkTimingStruct; - -typedef struct { - FxU32 hSyncOn; - FxU32 hSyncOff; - FxU32 vSyncOn; - FxU32 vSyncOff; - FxU32 hBackPorch; - FxU32 vBackPorch; - FxU32 xDimension; - FxU32 yDimension; - FxU32 memOffset; - FxU32 memFifoEntries_1MB; - FxU32 memFifoEntries_2MB; - FxU32 memFifoEntries_4MB; - FxU32 tilesInX_Over2; - FxU32 vFifoThreshold; - FxBool video16BPPIsOK; - FxBool video24BPPIsOK; - float clkFreq16bpp; - float clkFreq24bpp; -} sst1VideoTimingStruct; - -typedef struct { - FxU32 *virtAddr; /* virtual memory base address */ - FxU32 physAddr; /* physical memory base address */ - FxU32 deviceNumber; /* PCI device number */ - FxU32 vendorID; /* PCI vendor ID */ - FxU32 deviceID; /* PCI device ID */ - FxU32 fbiRevision; /* FBI revision number */ - FxU32 fbiBoardID; /* FBI board ID (poweron strapping bits) */ - FxU32 fbiVideo16BPP; /* FBI video display mode */ - FxU32 fbiVideoWidth; /* FBI video display X-resolution */ - FxU32 fbiVideoHeight; /* FBI video display Y-resolution */ - FxU32 fbiMemoryFifoEn; /* FBI memory fifo enabled */ - FxU32 sstSliDetect; /* Scanline interleave detected */ - FxU32 tmuRevision; /* TMU revision number (for all TMUs) */ - FxU32 numberTmus; /* number of TMUs installed */ - FxU32 tmuConfig; /* TMU configuration bits */ - FxU32 fbiMemSize; /* FBI frame buffer memory (in MBytes) */ - FxU32 tmuMemSize[MAX_NUM_TMUS]; /* TMU texture memory (in MBytes) */ - - /* These cannot be read from the hardware, so we shadow them here */ - FxU32 tmuInit0[MAX_NUM_TMUS]; - FxU32 tmuInit1[MAX_NUM_TMUS]; - - /* Misc */ - FxU32 initGrxClkDone; - FxU32 vgaPassthruDisable; - FxU32 vgaPassthruEnable; - FxU32 fbiDacType; - FxU32 memFifoStatusLwm; - FxU32 numBoardInsystem; - FxU32 grxClkFreq; - FxU32 fbiMemSpeed; - FxU32 tmuMemSpeed; - FxU32 tmuClkFixed; - FxU32 fbiConfig; /* FBI strapping pins */ - FxU32 fbiVideoRefresh; /* FBI video refresh rate */ - FxU32 fbiRegulatorPresent; /* FBI voltage regulator detected */ - FxBool fbiTripleBufferingEnabled; /* Specify video triple buffering */ -} sst1DeviceInfoStruct; - -typedef struct { - unsigned char type; - unsigned char addr; - FxU32 data; - FxU32 mask; - void *nextRdWr; -} sst1InitDacRdWrStruct; - -typedef struct { - FxU32 width; - FxU32 height; - FxU32 refresh; - FxU32 video16BPP; - sst1InitDacRdWrStruct *setVideoRdWr; - void *nextSetVideo; -} sst1InitDacSetVideoStruct; - -typedef struct { - FxU32 frequency; - sst1InitDacRdWrStruct *setMemClkRdWr; - void *nextSetMemClk; -} sst1InitDacSetMemClkStruct; - -typedef struct { - FxU32 video16BPP; - sst1InitDacRdWrStruct *setVideoModeRdWr; - void *nextSetVideoMode; -} sst1InitDacSetVideoModeStruct; - -typedef struct { - char dacManufacturer[100]; - char dacDevice[100]; - sst1InitDacRdWrStruct *detect; - sst1InitDacSetVideoStruct *setVideo; - sst1InitDacSetMemClkStruct *setMemClk; - sst1InitDacSetVideoModeStruct *setVideoMode; - void *nextDac; -} sst1InitDacStruct; - -typedef struct { - char envVariable[100]; - char envValue[256]; - void *nextVar; -} sst1InitEnvVarStruct; - -FX_ENTRY FxU32 * FX_CALL sst1InitMapBoard(FxU32); -FX_ENTRY FxU32 FX_CALL sst1InitNumBoardsInSystem(void); -FX_ENTRY FxBool FX_CALL sst1InitRegisters(FxU32 *); -FX_ENTRY FxBool FX_CALL sst1InitGamma(FxU32 *, double); -FX_ENTRY FxBool FX_CALL sst1InitGammaRGB(FxU32 *, double, double, double); -FX_ENTRY FxBool FX_CALL sst1InitGammaTable(FxU32 *, FxU32, FxU32 *, FxU32 *, FxU32 *); -FX_ENTRY FxBool FX_CALL sst1InitVideo(FxU32 *, GrScreenResolution_t, - GrScreenRefresh_t, sst1VideoTimingStruct *); -FX_ENTRY sst1VideoTimingStruct * FX_CALL sst1InitFindVideoTimingStruct(GrScreenResolution_t screenResolution, - GrScreenRefresh_t screenRefresh); -FX_ENTRY FxBool FX_CALL sst1InitShutdown(FxU32 *); -FX_ENTRY FxBool FX_CALL sst1InitShutdownSli(FxU32 *); -FX_ENTRY FxBool FX_CALL sst1InitSli(FxU32 *, FxU32 *); -FX_ENTRY FxBool FX_CALL sst1InitGetDeviceInfo(FxU32 *, sst1DeviceInfoStruct *); - -/* Miscellaneous routines */ -FX_ENTRY void FX_CALL sst1InitWrite32(FxU32 *, FxU32); -FX_ENTRY FxU32 FX_CALL sst1InitRead32(FxU32 *); -FX_ENTRY FxBool FX_CALL sst1InitIdle(FxU32 *); -FX_ENTRY FxBool FX_CALL sst1InitIdleFBI(FxU32 *); -FX_ENTRY FxBool FX_CALL sst1InitIdleFBINoNOP(FxU32 *); -FX_ENTRY FxU32 FX_CALL sst1InitReturnStatus(FxU32 *); -FX_ENTRY FxU32 FX_CALL sst1InitDacRd(FxU32 *, FxU32); -FX_ENTRY void FX_CALL sst1InitDacWr(FxU32 *, FxU32, FxU32); -FxBool sst1InitExecuteDacRdWr(FxU32 *, sst1InitDacRdWrStruct *); -FX_ENTRY void FX_CALL sst1InitSetResolution(FxU32 *, sst1VideoTimingStruct *, - FxU32); -FX_ENTRY FxBool FX_CALL sst1InitDacIndexedEnable(FxU32 *, FxU32); -FX_ENTRY FxBool FX_CALL sst1InitGrxClk(FxU32 *); -FX_ENTRY FxBool FX_CALL sst1InitCalcGrxClk(FxU32 *); -FX_ENTRY FxBool FX_CALL sst1InitDacDetect(FxU32 *); -FxBool sst1InitDacDetectATT(FxU32 *); -FxBool sst1InitDacDetectTI(FxU32 *); -FxBool sst1InitDacDetectICS(FxU32 *); -FxBool sst1InitDacDetectINI(FxU32 *); -FX_ENTRY FxBool FX_CALL sst1InitSetGrxClk(FxU32 *, sst1ClkTimingStruct *); -FxBool sst1InitComputeClkParams(float, sst1ClkTimingStruct *); -FxBool sst1InitSetGrxClkATT(FxU32 *, sst1ClkTimingStruct *); -FxBool sst1InitSetGrxClkICS(FxU32 *, sst1ClkTimingStruct *); -FxBool sst1InitSetGrxClkINI(FxU32 *, sst1ClkTimingStruct *); -FX_ENTRY FxBool FX_CALL sst1InitSetVidClk(FxU32 *, float); -FxBool sst1InitSetVidClkATT(FxU32 *, sst1ClkTimingStruct *); -FxBool sst1InitSetVidClkICS(FxU32 *, sst1ClkTimingStruct *); -FxBool sst1InitSetVidClkINI(FxU32 *, FxU32, FxU32, FxU32, FxU32); -FxBool sst1InitSetVidMode(FxU32 *, FxU32); -FxBool sst1InitSetVidModeATT(FxU32 *, FxU32); -FxBool sst1InitSetVidModeICS(FxU32 *, FxU32); -FxBool sst1InitSetVidModeINI(FxU32 *, FxU32); -FX_ENTRY FxBool FX_CALL sst1InitCheckBoard(FxU32 *); -FX_ENTRY FxBool FX_CALL sst1InitGetFbiInfo(FxU32 *, sst1DeviceInfoStruct *); -FX_ENTRY FxBool FX_CALL sst1InitGetTmuInfo(FxU32 *, sst1DeviceInfoStruct *); -FX_ENTRY void FX_CALL sst1InitRenderingRegisters(FxU32 *); -FX_ENTRY FxBool FX_CALL sst1InitGetTmuMemory(FxU32 *sstbase, - sst1DeviceInfoStruct *info, FxU32 tmu, FxU32 *TmuMemorySize); -FX_ENTRY FxBool FX_CALL sst1InitClearSwapPending(FxU32 *); -FX_ENTRY FxBool FX_CALL sst1InitVgaPassCtrl(FxU32 *, FxU32); -FxBool sst1InitResetTmus(FxU32 *); -FX_ENTRY FxU32 FX_CALL sst1InitSliDetect(FxU32 *); -FX_ENTRY FxBool FX_CALL sst1InitSliPciOwner(FxU32 *, FxU32); -FX_ENTRY FxBool FX_CALL sst1InitVoodooFile(void); -FX_ENTRY char * FX_CALL sst1InitGetenv(char *); -FX_ENTRY FxU32 * FX_CALL sst1InitGetBaseAddr(FxU32); -FxBool sst1InitFillDeviceInfo(FxU32 *, sst1DeviceInfoStruct *); -void sst1InitIdleLoop(FxU32 *); -void sst1InitClearBoardInfo(void); -FX_ENTRY FxBool FX_CALL sst1InitSetTripleBuffering(FxU32 *, FxBool); -FX_ENTRY void FX_CALL sst1InitCachingOn(void); - -#ifdef __cplusplus -} -#endif - -/* Info/Print routines */ -#ifdef INIT_OUTPUT - -#ifdef __cplusplus -extern "C" { -#endif -FX_ENTRY void FX_CALL sst1InitPrintf(const char *, ...); -#ifdef __cplusplus -} -#endif - -#ifndef _FILE_DEFINED -#include -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef SST1INIT_ALLOCATE -FILE *sst1InitMsgFile = NULL; /*stdout;*/ -#else -extern FILE *sst1InitMsgFile; -#endif - -#ifdef __cplusplus -} -#endif - -#endif - -/* Maximum number of SST-1 boards supported in system */ -#define SST1INIT_MAX_BOARDS 16 - -/* Maximum number of read pushes in "voodoo.ini" file */ -#define DACRDWR_MAX_PUSH 16 - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef SST1INIT_ALLOCATE - static char headersIdent[] = "@#%InitHeaders $Revision$"; - FxBool sst1InitUseVoodooFile = FXFALSE; - sst1InitEnvVarStruct *envVarsBase = (sst1InitEnvVarStruct *) NULL; - sst1InitDacStruct *dacStructBase = (sst1InitDacStruct *) NULL; - sst1InitDacStruct *iniDac = (sst1InitDacStruct *) NULL; - sst1InitDacSetVideoStruct *iniVideo = (sst1InitDacSetVideoStruct *) NULL; - sst1InitDacSetMemClkStruct *iniMemClk = (sst1InitDacSetMemClkStruct *) NULL; - FxU32 iniStack[DACRDWR_MAX_PUSH]; - int iniStackPtr = 0; - sst1DeviceInfoStruct *sst1CurrentBoard; - FxU32 sst1InitDeviceNumber; - sst1DeviceInfoStruct sst1BoardInfo[SST1INIT_MAX_BOARDS]; - FxU32 boardsInSystem; - FxU32 sst1InitSliEnabled = 0; - FxU32 *sst1InitSliSlaveVirtAddr; - -#if 0 - /* In the newer revisions of swlibs these have moved to - newpci/pcilib/sst1_pci.c. Please make modifications there instead. */ - const PciRegister SST1_PCI_INIT_ENABLE = { 0x40, 4, READ_WRITE }; - const PciRegister SST1_PCI_BUS_SNOOP0 = { 0x44, 4, WRITE_ONLY }; - const PciRegister SST1_PCI_BUS_SNOOP1 = { 0x48, 4, WRITE_ONLY }; - const PciRegister SST1_PCI_CFG_STATUS = { 0x4c, 4, READ_ONLY }; - const PciRegister SST1_PCI_VCLK_ENABLE = { 0xc0, 4, WRITE_ONLY }; - const PciRegister SST1_PCI_VCLK_DISABLE = { 0xe0, 4, WRITE_ONLY }; -#else -#include -#endif - -#else - extern FxBool sst1InitUseVoodooFile; - extern sst1InitEnvVarStruct *envVarsBase; - extern sst1InitDacStruct *dacStructBase; - extern sst1InitDacStruct *iniDac; - extern sst1InitDacSetVideoStruct *iniVideo; - extern sst1InitDacSetMemClkStruct *iniMemClk; - extern FxU32 iniStack[]; - extern int iniStackPtr; - extern sst1DeviceInfoStruct *sst1CurrentBoard; - extern FxU32 sst1InitDeviceNumber; - extern sst1DeviceInfoStruct sst1BoardInfo[SST1INIT_MAX_BOARDS]; - extern FxU32 boardsInSystem; - extern FxU32 sst1InitSliEnabled; - extern FxU32 *sst1InitSliSlaveVirtAddr; - -#if 0 - /* In the newer revisions of swlibs these have moved to - newpci/pcilib/sst1_pci.h. Please make modification there instead. */ - extern PciRegister SST1_PCI_INIT_ENABLE; - extern PciRegister SST1_PCI_BUS_SNOOP0; - extern PciRegister SST1_PCI_BUS_SNOOP1; - extern PciRegister SST1_PCI_CFG_STATUS; - extern PciRegister SST1_PCI_VCLK_ENABLE; - extern PciRegister SST1_PCI_VCLK_DISABLE; -#else -#include -#endif - -#endif /* SST1INIT_ALLOCATE */ - -#ifdef __cplusplus -} -#endif - -#ifdef SST1INIT_VIDEO_ALLOCATE -/* SST1INIT_VIDEO_ALLOCATE is only #defined in video.c - - Define useful clock and video timings - Clocks generated are follows: - Clock Freq. (MHz) = - [14.318 * (clkTiming_M+2)] / [(clkTiming_N+2) * (2^clkTiming_P)] - - Solving for clkTiming_M yields: - clkTiming_M = - [ [(Clock Freq (Mhz)) * (clkTiming_N+2) * (2^clkTiming_P)] / 14.318 ] - 2 - - NOTE: [14.318 * (clkTiming_M+2)] / (clkTiming_N+2) should be between - 120 and 240 - NOTE: Max. M is 127 - NOTE: Max. N is 31 - NOTE: Max. P is 3 - NOTE: Max. L is 15 - NOTE: Max. IB is 15 -*/ - -/* 512x256@60 only syncs to Arcade-style monitors */ -sst1VideoTimingStruct SST_VREZ_512X256_60 = { - 41, /* hSyncOn */ - 626, /* hSyncOff */ - 4, /* vSyncOn */ - 286, /* vSyncOff */ - 65, /* hBackPorch */ - 24, /* vBackPorch */ - 512, /* xDimension */ - 256, /* yDimension */ - 64, /* memOffset */ - 0x410, /* memFifoEntries_1MB ... 32256 entries in memory fifo (no Z) */ - 0x100, /* memFifoEntries_2MB ... 57344 entries in memory fifo */ - 0x100, /* memFifoEntries_4MB ... 57344 entries in memory fifo */ - 8, /* tilesInX_Over2 */ - 23, /* vFifoThreshold */ - FXFALSE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 23.334F, /* clkFreq16bpp */ - 23.334F /* clkFreq24bpp */ -}; - -/* 512x384@60 only syncs to Arcade-style monitors */ -sst1VideoTimingStruct SST_VREZ_512X384_60 = { - 23, /* hSyncOn */ - 640, /* hSyncOff */ - 3, /* vSyncOn */ - 411, /* vSyncOff */ - 90, /* hBackPorch */ - 24, /* vBackPorch */ - 512, /* xDimension */ - 384, /* yDimension */ - 96, /* memOffset */ - 0x410, /* memFifoEntries_1MB ... 32256 entries in memory fifo (no Z) */ - 0x100, /* memFifoEntries_2MB ... 57344 entries in memory fifo */ - 0x100, /* memFifoEntries_4MB ... 57344 entries in memory fifo */ - 8, /* tilesInX_Over2 */ - 23, /* vFifoThreshold */ - FXFALSE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 33.0F, /* clkFreq16bpp */ - 33.0F /* clkFreq24bpp */ -}; - -/* Verified 10/21/96 */ -sst1VideoTimingStruct SST_VREZ_512X384_72 = { - 51, /* hSyncOn */ - 591, /* hSyncOff */ - 3, /* vSyncOn */ - 430, /* vSyncOff */ - 55, /* hBackPorch */ - 25, /* vBackPorch */ - 512, /* xDimension */ - 384, /* yDimension */ - 96, /* memOffset */ - 0x410, /* memFifoEntries_1MB ... 32256 entries in memory fifo (no Z) */ - 0x100, /* memFifoEntries_2MB ... 57344 entries in memory fifo */ - 0x100, /* memFifoEntries_4MB ... 57344 entries in memory fifo */ - 8, /* tilesInX_Over2 */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 20.093F, /* clkFreq16bpp .. 72 Hz refresh rate */ - 40.186F /* clkFreq24bpp */ -}; - -/* Verified 10/21/96 */ -sst1VideoTimingStruct SST_VREZ_512X384_75 = { - 44, /* hSyncOn */ - 616, /* hSyncOff */ - 3, /* vSyncOn */ - 415, /* vSyncOff */ - 55, /* hBackPorch */ - 25, /* vBackPorch */ - 512, /* xDimension */ - 384, /* yDimension */ - 96, /* memOffset */ - 0x410, /* memFifoEntries_1MB ... 32256 entries in memory fifo (no Z) */ - 0x100, /* memFifoEntries_2MB ... 57344 entries in memory fifo */ - 0x100, /* memFifoEntries_4MB ... 57344 entries in memory fifo */ - 8, /* tilesInX_Over2 */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 20.8F, /* clkFreq16bpp .. 72 Hz refresh rate */ - 41.6F /* clkFreq24bpp */ -}; - -/* Verified 10/21/96 */ -sst1VideoTimingStruct SST_VREZ_512X384_85 = { - 55, /* hSyncOn */ - 599, /* hSyncOff */ - 3, /* vSyncOn */ - 401, /* vSyncOff */ - 70, /* hBackPorch */ - 16, /* vBackPorch */ - 512, /* xDimension */ - 384, /* yDimension */ - 96, /* memOffset */ - 0x410, /* memFifoEntries_1MB ... 32256 entries in memory fifo (no Z) */ - 0x100, /* memFifoEntries_2MB ... 57344 entries in memory fifo */ - 0x100, /* memFifoEntries_4MB ... 57344 entries in memory fifo */ - 8, /* tilesInX_Over2 */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 22.527F, /* clkFreq16bpp .. 72 Hz refresh rate */ - 45.054F /* clkFreq24bpp */ -}; - -/* Verified 10/21/96 */ -sst1VideoTimingStruct SST_VREZ_512X384_120 = { - 25, /* hSyncOn */ - 650, /* hSyncOff */ - 3, /* vSyncOn */ - 409, /* vSyncOff */ - 110, /* hBackPorch */ - 25, /* vBackPorch */ - 512, /* xDimension */ - 384, /* yDimension */ - 96, /* memOffset */ - 0x410, /* memFifoEntries_1MB ... 32256 entries in memory fifo (no Z) */ - 0x100, /* memFifoEntries_2MB ... 57344 entries in memory fifo */ - 0x100, /* memFifoEntries_4MB ... 57344 entries in memory fifo */ - 8, /* tilesInX_Over2 */ - 20, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 33.5F, /* clkFreq16bpp .. 72 Hz refresh rate */ - 67.0F /* clkFreq24bpp */ -}; - -/* Verified 10/21/96 */ -sst1VideoTimingStruct SST_VREZ_640X400_70 = { - 96, /* hSyncOn */ - 704, /* hSyncOff */ - 2, /* vSyncOn */ - 447, /* vSyncOff */ - 48, /* hBackPorch */ - 35, /* vBackPorch */ - 640, /* xDimension */ - 400, /* yDimension */ - 150, /* memOffset */ - 0x0, /* memFifoEntries_1MB ... memory fifo not supported */ - 0x430, /* memFifoEntries_2MB ... 31232 entries in memory fifo */ - 0x100, /* memFifoEntries_4MB ... 57344 entries in memory fifo */ - 10, /* tilesInX_Over2 */ - 21, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 25.175F, /* clkFreq16bpp */ - 50.350F /* clkFreq24bpp */ -}; - -/* Verified 10/21/96 */ -sst1VideoTimingStruct SST_VREZ_640X400_75 = { - 99, /* hSyncOn */ - 733, /* hSyncOff */ - 3, /* vSyncOn */ - 429, /* vSyncOff */ - 52, /* hBackPorch */ - 25, /* vBackPorch */ - 640, /* xDimension */ - 400, /* yDimension */ - 150, /* memOffset */ - 0x0, /* memFifoEntries_1MB ... memory fifo not supported */ - 0x430, /* memFifoEntries_2MB ... 31232 entries in memory fifo */ - 0x100, /* memFifoEntries_4MB ... 57344 entries in memory fifo */ - 10, /* tilesInX_Over2 */ - 19, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 27.0F, /* clkFreq16bpp */ - 54.0F /* clkFreq24bpp */ -}; - -/* VESA Standard */ -/* Verified 10/21/96 */ -sst1VideoTimingStruct SST_VREZ_640X400_85 = { - 63, /* hSyncOn */ - 767, /* hSyncOff */ - 3, /* vSyncOn */ - 442, /* vSyncOff */ - 94, /* hBackPorch */ - 41, /* vBackPorch */ - 640, /* xDimension */ - 400, /* yDimension */ - 150, /* memOffset */ - 0x0, /* memFifoEntries_1MB ... memory fifo not supported */ - 0x430, /* memFifoEntries_2MB ... 31232 entries in memory fifo */ - 0x100, /* memFifoEntries_4MB ... 57344 entries in memory fifo */ - 10, /* tilesInX_Over2 */ - 18, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 31.5F, /* clkFreq16bpp */ - 63.0F /* clkFreq24bpp */ -}; - -/* Verified 10/21/96 */ -sst1VideoTimingStruct SST_VREZ_640X400_120 = { - 67, /* hSyncOn */ - 798, /* hSyncOff */ - 3, /* vSyncOn */ - 424, /* vSyncOff */ - 94, /* hBackPorch */ - 16, /* vBackPorch */ - 640, /* xDimension */ - 400, /* yDimension */ - 150, /* memOffset */ - 0x0, /* memFifoEntries_1MB ... memory fifo not supported */ - 0x430, /* memFifoEntries_2MB ... 31232 entries in memory fifo */ - 0x100, /* memFifoEntries_4MB ... 57344 entries in memory fifo */ - 10, /* tilesInX_Over2 */ - 18, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 44.47F, /* clkFreq16bpp */ - 88.94F /* clkFreq24bpp */ -}; - -/* VESA Standard */ -/* Verified 10/21/96 */ -sst1VideoTimingStruct SST_VREZ_640X480_60 = { - 96, /* hSyncOn */ - 704, /* hSyncOff */ - 2, /* vSyncOn */ - 523, /* vSyncOff */ - 38, /* hBackPorch */ - 25, /* vBackPorch */ - 640, /* xDimension */ - 480, /* yDimension */ - 150, /* memOffset */ - 0x0, /* memFifoEntries_1MB ... unsupported resolution */ - 0x430, /* memFifoEntries_2MB ... 31232 entries in memory fifo */ - 0x100, /* memFifoEntries_4MB ... 57344 entries in memory fifo */ - 10, /* tilesInX_Over2 */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 25.175F, /* clkFreq16bpp */ - 50.350F /* clkFreq24bpp */ -}; - -/* VESA Standard */ -/* Verified 10/21/96 */ -sst1VideoTimingStruct SST_VREZ_640X480_75 = { - 63, /* hSyncOn */ - 775, /* hSyncOff */ - 3, /* vSyncOn */ - 497, /* vSyncOff */ - 118, /* hBackPorch */ - 16, /* vBackPorch */ - 640, /* xDimension */ - 480, /* yDimension */ - 150, /* memOffset */ - 0x0, /* memFifoEntries_1MB ... unsupported resolution */ - 0x430, /* memFifoEntries_2MB ... 31232 entries in memory fifo */ - 0x100, /* memFifoEntries_4MB ... 57344 entries in memory fifo */ - 10, /* tilesInX_Over2 */ - 21, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 31.5F, /* clkFreq16bpp */ - 63.0F /* clkFreq24bpp */ -}; - -/* VESA Standard */ -/* Verified 10/21/96 */ -sst1VideoTimingStruct SST_VREZ_640X480_85 = { - 55, /* hSyncOn */ - 776, /* hSyncOff */ - 3, /* vSyncOn */ - 506, /* vSyncOff */ - 78, /* hBackPorch */ - 25, /* vBackPorch */ - 640, /* xDimension */ - 480, /* yDimension */ - 150, /* memOffset */ - 0x0, /* memFifoEntries_1MB ... unsupported resolution */ - 0x430, /* memFifoEntries_2MB ... 31232 entries in memory fifo */ - 0x100, /* memFifoEntries_4MB ... 57344 entries in memory fifo */ - 10, /* tilesInX_Over2 */ - 21, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 36.0F, /* clkFreq16bpp */ - 72.0F /* clkFreq24bpp */ -}; - -/* Verified 10/21/96 */ -sst1VideoTimingStruct SST_VREZ_640X480_120 = { - 45, /* hSyncOn */ - 785, /* hSyncOff */ - 3, /* vSyncOn */ - 506, /* vSyncOff */ - 100, /* hBackPorch */ - 18, /* vBackPorch */ - 640, /* xDimension */ - 480, /* yDimension */ - 150, /* memOffset */ - 0x0, /* memFifoEntries_1MB ... unsupported resolution */ - 0x430, /* memFifoEntries_2MB ... 31232 entries in memory fifo */ - 0x100, /* memFifoEntries_4MB ... 57344 entries in memory fifo */ - 10, /* tilesInX_Over2 */ - 17, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 50.82F, /* clkFreq16bpp */ - 101.64F /* clkFreq24bpp */ -}; - -#ifdef H3D -sst1VideoTimingStruct SST_VREZ_640X502_60 = { - 96, /* hSyncOn */ - 704, /* hSyncOff */ - 2, /* vSyncOn */ - 523, /* vSyncOff */ - 38, /* hBackPorch */ - 15, /* vBackPorch */ - 640, /* xDimension */ - 502, /* yDimension */ - // 150, /* memOffset */ - 160, /* memOffset */ - 0x0, /* memFifoEntries_1MB ... unsupported resolution */ - 0x610, /* memFifoEntries_2MB ... 31232 entries in memory fifo */ - 0x100, /* memFifoEntries_4MB ... 57344 entries in memory fifo */ - 10, /* tilesInX_Over2 */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 25.175F, /* clkFreq16bpp */ - 50.350F /* clkFreq24bpp */ -}; - -sst1VideoTimingStruct SST_VREZ_800X620_60 = { - 127, /* hSyncOn */ - 927, /* hSyncOff */ - 4, /* vSyncOn */ - 624, /* vSyncOff */ - 86, /* hBackPorch */ - 13, /* vBackPorch */ - 800, /* xDimension */ - 620, /* yDimension */ - 254, /* memOffset */ - 0x0, /* memFifoEntries_1MB ... unsupported resolution */ - 0x0, /* memFifoEntries_2MB ... 9152 entries in memory fifo (no Z) */ - 0x100, /* memFifoEntries_4MB ... 57344 entries in memory fifo */ - 13, /* tilesInX_Over2 */ - 14, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 40.0F, /* clkFreq16bpp */ - 80.0F /* clkFreq24bpp */ -}; - -#endif - -/* VESA Standard */ -/* Verified 10/21/96 */ -sst1VideoTimingStruct SST_VREZ_800X600_60 = { - 127, /* hSyncOn */ - 927, /* hSyncOff */ - 4, /* vSyncOn */ - 624, /* vSyncOff */ - 86, /* hBackPorch */ - 23, /* vBackPorch */ - 800, /* xDimension */ - 600, /* yDimension */ - 247, /* memOffset */ - 0x0, /* memFifoEntries_1MB ... unsupported resolution */ - 0x6e2, /* memFifoEntries_2MB ... 9152 entries in memory fifo (no Z) */ - 0x100, /* memFifoEntries_4MB ... 57344 entries in memory fifo */ - 13, /* tilesInX_Over2 */ - 14, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 40.0F, /* clkFreq16bpp */ - 80.0F /* clkFreq24bpp */ -}; - -/* VESA Standard */ -/* Verified 10/21/96 */ -sst1VideoTimingStruct SST_VREZ_800X600_75 = { - 79, /* hSyncOn */ - 975, /* hSyncOff */ - 3, /* vSyncOn */ - 622, /* vSyncOff */ - 158, /* hBackPorch */ - 21, /* vBackPorch */ - 800, /* xDimension */ - 600, /* yDimension */ - 247, /* memOffset */ - 0x0, /* memFifoEntries_1MB ... unsupported resolution */ - 0x6e2, /* memFifoEntries_2MB ... 9152 entries in memory fifo (no Z) */ - 0x100, /* memFifoEntries_4MB ... 57344 entries in memory fifo */ - 13, /* tilesInX_Over2 */ - 14, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 49.5F, /* clkFreq16bpp */ - 99.0F /* clkFreq24bpp */ -}; - -/* VESA Standard */ -/* Verified 10/21/96 */ -sst1VideoTimingStruct SST_VREZ_800X600_85 = { - 63, /* hSyncOn */ - 983, /* hSyncOff */ - 3, /* vSyncOn */ - 628, /* vSyncOff */ - 150, /* hBackPorch */ - 27, /* vBackPorch */ - 800, /* xDimension */ - 600, /* yDimension */ - 247, /* memOffset */ - 0x0, /* memFifoEntries_1MB ... unsupported resolution */ - 0x6e2, /* memFifoEntries_2MB ... 9152 entries in memory fifo (no Z) */ - 0x100, /* memFifoEntries_4MB ... 57344 entries in memory fifo */ - 13, /* tilesInX_Over2 */ - 14, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 56.25F, /* clkFreq16bpp */ - 112.5F /* clkFreq24bpp */ -}; - -sst1VideoTimingStruct SST_VREZ_856X480_60 = { - 136, /* hSyncOn */ - 1008, /* hSyncOff */ - 2, /* vSyncOn */ - 523, /* vSyncOff */ - 100, /* hBackPorch */ - 23, /* vBackPorch */ - 856, /* xDimension */ - 480, /* yDimension */ - 210, /* memOffset */ - 0x0, /* memFifoEntries_1MB ... unsupported resolution */ - 0x430, /* memFifoEntries_2MB ... 31232 entries in memory fifo */ - 0x100, /* memFifoEntries_4MB ... 57344 entries in memory fifo */ - 14, /* tilesInX_Over2 */ - 14, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 36.0F, /* clkFreq16bpp */ - 72.0F /* clkFreq24bpp */ -}; - -sst1VideoTimingStruct SST_VREZ_960X720_60 = { - 200, /* hSyncOn */ - 1013, /* hSyncOff */ - 4, /* vSyncOn */ - 750, /* vSyncOff */ - 30, /* hBackPorch */ - 23, /* vBackPorch */ - 960, /* xDimension */ - 720, /* yDimension */ - 338, /* memOffset (really 337.5) */ - 0x0, /* memFifoEntries_1MB ... unsupported resolution */ - 0x0, /* memFifoEntries_2MB ... unsupported resolution */ - 0x765, /* memFifoEntries_4MB ... 4959 entries in memory fifo */ - 15, /* tilesInX_Over2 */ - 14, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 56.0F, /* clkFreq16bpp */ - 112.0F /* clkFreq24bpp */ -}; - -#else /* SST1INIT_VIDEO_ALLOCATE */ - - -#ifdef __cplusplus -extern "C" { -#endif - -extern sst1VideoTimingStruct SST_VREZ_640X480_60; -extern sst1VideoTimingStruct SST_VREZ_800X600_60; - -#ifdef __cplusplus -} -#endif - -#endif /* SST1INIT_VIDEO_ALLOCATE */ - -#endif /* !__SST1INIT_H__ */ diff --git a/glide2x/sst1/init/initvg/util.c b/glide2x/sst1/init/initvg/util.c deleted file mode 100644 index 2bca87e..0000000 --- a/glide2x/sst1/init/initvg/util.c +++ /dev/null @@ -1,359 +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$ -** -** Utility routines for SST-1 Initialization code -** -*/ -#pragma optimize ("",off) -#include -#include -#include -#include -#define FX_DLL_DEFINITION -#include -#include -#include - -/* -** sst1InitIdle(): -** Return idle condition of SST-1 -** -** Returns: -** FXTRUE if SST-1 is idle (fifos are empty, graphics engines are idle) -** FXFALSE if SST-1 has not been mapped -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitIdle(FxU32 *sstbase) -{ - if(!sstbase) - return(FXFALSE); - - if(!sst1InitSliEnabled) - sst1InitIdleLoop(sstbase); - else { - FxU32 j, n; - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - /* Check idle for Master... */ - sst1InitIdleLoop(sstbase); - - /* Cause slave to drive PCI bus */ - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); - PCICFG_WR(SST1_PCI_INIT_ENABLE, j | SST_SCANLINE_SLV_OWNPCI); - if(sst1InitCheckBoard(sst1InitSliSlaveVirtAddr) == FXFALSE) - return(FXFALSE); - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); - PCICFG_WR(SST1_PCI_INIT_ENABLE, j | SST_SCANLINE_SLV_OWNPCI); - - /* Check idle for Slave... */ - sst1InitIdleLoop(sstbase); - - /* Restore normal SLI conditions */ - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); - PCICFG_WR(SST1_PCI_INIT_ENABLE, j & ~SST_SCANLINE_SLV_OWNPCI); - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); - PCICFG_WR(SST1_PCI_INIT_ENABLE, j & ~SST_SCANLINE_SLV_OWNPCI); - } - return(FXTRUE); -} - -void sst1InitIdleLoop(FxU32 *sstbase) -{ - FxU32 cntr; - volatile Sstregs *sst = (Sstregs *) sstbase; - - ISET(sst->nopCMD, 0x0); - cntr = 0; - while(1) { - if(!(sst1InitReturnStatus(sstbase) & SST_BUSY)) { - if(++cntr >= 3) - break; - } else - cntr = 0; - } -} - -/* -** sst1InitIdleFBI(): -** Return idle condition of FBI (ignoring idle status of TMU) -** -** Returns: -** FXTRUE if FBI is idle (fifos are empty, graphics engines are idle) -** FXFALSE if FBI has not been mapped -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitIdleFBI(FxU32 *sstbase) -{ - FxU32 cntr; - volatile Sstregs *sst = (Sstregs *) sstbase; - - if(!sst) - return(FXFALSE); - - ISET(sst->nopCMD, 0x0); - cntr = 0; - while(1) { - if(!(sst1InitReturnStatus(sstbase) & SST_FBI_BUSY)) { - if(++cntr >= 3) - break; - } else - cntr = 0; - } - return(FXTRUE); -} - -/* -** sst1InitIdleFBINoNOP(): -** Return idle condition of FBI (ignoring idle status of TMU) -** sst1InitIdleFBINoNOP() differs from sst1InitIdleFBI() in that no NOP command -** is issued to flush the graphics pipeline. -** -** Returns: -** FXTRUE if FBI is idle (fifos are empty, graphics engines are idle) -** FXFALSE if FBI has not been mapped -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitIdleFBINoNOP(FxU32 *sstbase) -{ - FxU32 cntr; - volatile Sstregs *sst = (Sstregs *) sstbase; - - if(!sst) - return(FXFALSE); - - /* ISET(sst->nopCMD, 0x0); */ - cntr = 0; - while(1) { - if(!(sst1InitReturnStatus(sstbase) & SST_FBI_BUSY)) { - if(++cntr > 5) - break; - } else - cntr = 0; - } - return(FXTRUE); -} - -/* Included so compiler doesn't optimize out loop code waiting on status bits */ -FX_EXPORT FxU32 FX_CSTYLE sst1InitReturnStatus(FxU32 *sstbase) -{ - volatile Sstregs *sst = (Sstregs *) sstbase; - - return(IGET(sst->status)); -} - - -/* -** sst1InitClearSwapPending(): -** Clear any swaps pending in the status register -** NOTE: The video unit of FBI must be initialized before calling this routine -** -** Returns: -** FXTRUE -** -*/ -FX_ENTRY FxBool FX_CALL sst1InitClearSwapPending(FxU32 *sstbase) -{ - volatile Sstregs *sst = (Sstregs *) sstbase; - FxU32 displayedBuffer, i; - - INIT_PRINTF(("sst1InitClearSwapPending() WARNING: Clearing pending swapbufferCMDs...\n")); - - sst1InitIdle(sstbase); - displayedBuffer = - (IGET(sst->status) & SST_DISPLAYED_BUFFER) >> - SST_DISPLAYED_BUFFER_SHIFT; - - /* Wait until vsync is inactive to guarantee that swaps queue in the */ - /* PCI fifo properly */ - while(!(IGET(sst->status) & SST_VRETRACE) || - ((IGET(sst->vRetrace) & 0xfff) > 100) || ((IGET(sst->vRetrace) & 0xfff) - < 10)) - ; - - /* First swap syncs to Vsync...Subsequent ones do not... */ - ISET(sst->swapbufferCMD, 0x1); - ISET(sst->nopCMD, 0x0); - for(i=0; i<17; i++) { - ISET(sst->swapbufferCMD, 0x0); - ISET(sst->nopCMD, 0x0); - } - if(displayedBuffer) { - ISET(sst->swapbufferCMD, 0x0); - ISET(sst->nopCMD, 0x0); - } - sst1InitIdle(sstbase); - - return(FXTRUE); -} - -/* -** sst1InitVgaPassCtrl(): -** Control VGA passthrough setting -** -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitVgaPassCtrl(FxU32 *sstbase, FxU32 enable) -{ - volatile Sstregs *sst = (Sstregs *) sstbase; - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - if(enable) { - /* VGA controls monitor */ - ISET(sst->fbiInit0, (IGET(sst->fbiInit0) & ~SST_EN_VGA_PASSTHRU) | - sst1CurrentBoard->vgaPassthruEnable); - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_BLANK_EN); - } else { - /* SST-1 controls monitor */ - ISET(sst->fbiInit0, (IGET(sst->fbiInit0) & ~SST_EN_VGA_PASSTHRU) | - sst1CurrentBoard->vgaPassthruDisable); - ISET(sst->fbiInit1, IGET(sst->fbiInit1) & ~SST_VIDEO_BLANK_EN); - } - - return(FXTRUE); -} - -/* -** sst1InitResetTmus(): -** Reset TMUs after changing graphics clocks -** Occasionally when changing the frequency of the graphics clock, the TMUs -** get in an unknown state. sst1InitResetTmus() cleans up the problem. -** -*/ -FxBool sst1InitResetTmus(FxU32 *sstbase) -{ - volatile Sstregs *sst = (Sstregs *) sstbase; - FxU32 n; - - /* Clear FBI registers */ - ISET(sst->fbzColorPath, 0x0); - ISET(sst->fogMode, 0x0); - ISET(sst->alphaMode, 0x0); - ISET(sst->fbzMode, 0x0); - ISET(sst->lfbMode, 0x0); - ISET(sst->fogColor, 0x0); - ISET(sst->zaColor, 0x0); - ISET(sst->chromaKey, 0x0); - ISET(sst->stipple, 0x0); - ISET(sst->c0, 0x0); - ISET(sst->c1, 0x0); - - /* clear TMU registers */ - ISET(sst->textureMode, 0x0); - ISET(sst->tLOD, 0x0); - ISET(sst->tDetail, 0x0); - ISET(sst->texBaseAddr, 0x0); - ISET(sst->texBaseAddr1, 0x0); - ISET(sst->texBaseAddr2, 0x0); - ISET(sst->texBaseAddr38, 0x0); - - /* Set downstream TMU to intentionally overflow TT Fifo... */ - ISET(SST_TREX(sst,0)->trexInit1, sst1CurrentBoard->tmuInit1[0] & - ~SST_TEX_TT_FIFO_SIL); - sst1InitIdleFBINoNOP(sstbase); - - /* Draw 256-pixel textured triangle to overflow TT fifo in downstream */ - /* TMU. Create numerous page misses in downstream TMU so upstream TMU */ - /* is always running faster */ - ISET(sst->fbzColorPath, SST_ENTEXTUREMAP); - ISET(sst->fbzMode, SST_DRAWBUFFER_FRONT); - ISET(sst->vA.x, 0); - ISET(sst->vA.y, 0); - ISET(sst->vB.x, (25<vB.y, 0); - ISET(sst->vC.x, 0); - ISET(sst->vC.y, (25<s, 0x0); - ISET(sst->t, 0x0); - ISET(sst->w, 0x0); - ISET(sst->dwdx, 0x0); - ISET(sst->dwdy, 0x0); - ISET(SST_TREX(sst,0)->dsdx, (69<dsdy, (69<dsdx, (69<dsdy, (69<dsdx, (0<dsdy, (0<dsdx, (0<dsdy, (0<triangleCMD, 0x0); - ISET(sst->nopCMD, 0x1); /* This will reset pixel counter registers... */ - - /* Wait for command to execute... */ - for(n=0; n<25000; n++) - sst1InitReturnStatus(sstbase); - - /* Upstream TMU is now idle */ - /* Set downstream TMU to always accept upstream data */ - /* This will flush pending pixels in the downstream TMU */ - ISET(SST_TREX(sst,0)->trexInit1, sst1CurrentBoard->tmuInit1[0] | - SST_TEX_RG_TTCII_INH | SST_TEX_USE_RG_TTCII_INH); - for(n=0; n<100; n++) - sst1InitReturnStatus(sstbase); - - /* Wait for command to execute... */ - for(n=0; n<25000; n++) - sst1InitReturnStatus(sstbase); - - /* Restore registers */ - ISET(SST_TREX(sst,0)->trexInit1, sst1CurrentBoard->tmuInit1[0]); - ISET(sst->fbzColorPath, 0x0); - ISET(sst->fbzMode, 0x0); - for(n=0; n<100; n++) - sst1InitReturnStatus(sstbase); - - if(sst1InitReturnStatus(sstbase) & SST_TREX_BUSY) { - INIT_PRINTF(("sst1InitResetTmus(): Could not reset TMUs...\n")); - return(FXFALSE); - } else - return(FXTRUE); -} - -/* -** sst1InitWrite32(): -** Write 32-bit Word to specified address -** -*/ -FX_EXPORT void FX_CSTYLE sst1InitWrite32(FxU32 *addr, FxU32 data) -{ - P6FENCE; - *addr = data; - P6FENCE; -} - -/* -** sst1InitRead32(): -** Read 32-bit Word from specified address -** -*/ -FX_EXPORT FxU32 FX_CSTYLE sst1InitRead32(FxU32 *addr) -{ - P6FENCE; - return(*addr); -} - -#pragma optimize ("",on) diff --git a/glide2x/sst1/init/initvg/video.c b/glide2x/sst1/init/initvg/video.c deleted file mode 100644 index b7bfec6..0000000 --- a/glide2x/sst1/init/initvg/video.c +++ /dev/null @@ -1,1106 +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$ -** -** Initialization code for initializing SST-1 video unit -** -*/ -#pragma optimize ("",off) -#include -#include -#include -#include -#define FX_DLL_DEFINITION -#include -#define SST1INIT_VIDEO_ALLOCATE /* allocate data structures for video timing */ -#include -#include - -/* -** sst1InitVideo(): -** Initialize video (including DAC setup) for the specified resolution -** -** Returns: -** FXTRUE if successfully initializes specified SST-1 video resolution -** FXFALSE if cannot initialize SST-1 to specified video resolution -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitVideo(FxU32 *sstbase, - GrScreenResolution_t screenResolution, GrScreenRefresh_t screenRefresh, - sst1VideoTimingStruct *altVideoTiming) -{ - FxU32 n, vtmp; - volatile Sstregs *sst = (Sstregs *) sstbase; - sst1VideoTimingStruct *sstVideoRez; - FxU32 sst1MonitorRefresh; - FxU32 sst1MonitorRez; - FxU32 video16BPP; - FxU32 memFifoEntries; - FxU32 memFifoLwm, memFifoHwm, pciFifoLwm; - FxU32 vInClkDel, vOutClkDel; - FxU32 tf0_clk_del, tf1_clk_del, tf2_clk_del; - FxU32 ft_clk_del; - - if(!sst) - return(FXFALSE); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - if(GETENV(("SST_IGNORE_INIT_VIDEO"))) { - INIT_PRINTF(("WARNING: Ignoring sst1InitVideo()...\n")); - sst1InitIdleFBINoNOP(sstbase); - return(FXTRUE); - } - - switch(screenResolution) { - case(GR_RESOLUTION_512x256): - sst1MonitorRez = 512256; - sst1CurrentBoard->fbiVideoWidth = 512; - sst1CurrentBoard->fbiVideoHeight = 256; - break; - case(GR_RESOLUTION_512x384): - sst1MonitorRez = 512; - sst1CurrentBoard->fbiVideoWidth = 512; - sst1CurrentBoard->fbiVideoHeight = 384; - break; - case(GR_RESOLUTION_640x400): - sst1MonitorRez = 640400; - sst1CurrentBoard->fbiVideoWidth = 640; - sst1CurrentBoard->fbiVideoHeight = 400; - break; - case(GR_RESOLUTION_640x480): - sst1MonitorRez = 640; - sst1CurrentBoard->fbiVideoWidth = 640; - sst1CurrentBoard->fbiVideoHeight = 480; - break; -#ifdef H3D - case(GR_RESOLUTION_640x240_AUTOFLIPPED): - sst1MonitorRez = 640502; - sst1CurrentBoard->fbiVideoWidth = 640; - sst1CurrentBoard->fbiVideoHeight = 502; - break; - case(GR_RESOLUTION_800x300_AUTOFLIPPED): - sst1MonitorRez = 800620; - sst1CurrentBoard->fbiVideoWidth = 800; - sst1CurrentBoard->fbiVideoHeight = 620; - break; -#endif - case(GR_RESOLUTION_800x600): - sst1MonitorRez = 800; - sst1CurrentBoard->fbiVideoWidth = 800; - sst1CurrentBoard->fbiVideoHeight = 600; - break; - case(GR_RESOLUTION_856x480): - sst1MonitorRez = 856; - sst1CurrentBoard->fbiVideoWidth = 856; - sst1CurrentBoard->fbiVideoHeight = 480; - break; - case(GR_RESOLUTION_960x720): - sst1MonitorRez = 960; - sst1CurrentBoard->fbiVideoWidth = 960; - sst1CurrentBoard->fbiVideoHeight = 720; - break; - default: - INIT_PRINTF(("sst1InitVideo(): Unsupported Resolution...\n")); - return(FXFALSE); - break; - } - - switch(screenRefresh) { - case(GR_REFRESH_60Hz): - sst1MonitorRefresh = 60; - break; - case(GR_REFRESH_70Hz): - sst1MonitorRefresh = 70; - break; - case(GR_REFRESH_72Hz): - sst1MonitorRefresh = 72; - break; - case(GR_REFRESH_75Hz): - sst1MonitorRefresh = 75; - break; - case(GR_REFRESH_80Hz): - sst1MonitorRefresh = 80; - break; - case(GR_REFRESH_85Hz): - sst1MonitorRefresh = 85; - break; - case(GR_REFRESH_90Hz): - sst1MonitorRefresh = 90; - break; - case(GR_REFRESH_100Hz): - sst1MonitorRefresh = 100; - break; - case(GR_REFRESH_120Hz): - sst1MonitorRefresh = 120; - break; - default: - INIT_PRINTF(("sst1InitVideo(): Unsupported Refresh Rate...\n")); - return(FXFALSE); - break; - } - - /* Override settings with environment variables */ - if(GETENV(("SST_SCREENREZ"))) { - if(ATOI(GETENV(("SST_SCREENREZ"))) == 640) { - sst1MonitorRez = 640; - sst1CurrentBoard->fbiVideoWidth = 640; - sst1CurrentBoard->fbiVideoHeight = 480; - } else if(ATOI(GETENV(("SST_SCREENREZ"))) == 640400) { - sst1MonitorRez = 640400; - sst1CurrentBoard->fbiVideoWidth = 640; - sst1CurrentBoard->fbiVideoHeight = 400; - } else if(ATOI(GETENV(("SST_SCREENREZ"))) == 800) { - sst1MonitorRez = 800; - sst1CurrentBoard->fbiVideoWidth = 800; - sst1CurrentBoard->fbiVideoHeight = 600; - } else if(ATOI(GETENV(("SST_SCREENREZ"))) == 512256) { - sst1MonitorRez = 512256; - sst1CurrentBoard->fbiVideoWidth = 512; - sst1CurrentBoard->fbiVideoHeight = 256; - } else if(ATOI(GETENV(("SST_SCREENREZ"))) == 512) { - sst1MonitorRez = 512; - sst1CurrentBoard->fbiVideoWidth = 512; - sst1CurrentBoard->fbiVideoHeight = 384; - } else if(ATOI(GETENV(("SST_SCREENREZ"))) == 856) { - sst1MonitorRez = 856; - sst1CurrentBoard->fbiVideoWidth = 856; - sst1CurrentBoard->fbiVideoHeight = 480; - } else if(ATOI(GETENV(("SST_SCREENREZ"))) == 960) { - sst1MonitorRez = 960; - sst1CurrentBoard->fbiVideoWidth = 960; - sst1CurrentBoard->fbiVideoHeight = 720; - } else { - sst1MonitorRez = 640; - sst1CurrentBoard->fbiVideoWidth = 640; - sst1CurrentBoard->fbiVideoHeight = 480; - } - } - if(GETENV(("SST_SCREENREFRESH"))) { - if(ATOI(GETENV(("SST_SCREENREFRESH"))) == 60) - sst1MonitorRefresh = 60; - else if(ATOI(GETENV(("SST_SCREENREFRESH"))) == 72) - sst1MonitorRefresh = 72; - else if(ATOI(GETENV(("SST_SCREENREFRESH"))) == 75) - sst1MonitorRefresh = 75; - else if(ATOI(GETENV(("SST_SCREENREFRESH"))) == 85) - sst1MonitorRefresh = 85; - else if(ATOI(GETENV(("SST_SCREENREFRESH"))) == 120) - sst1MonitorRefresh = 120; - else - sst1MonitorRefresh = 60; - } - - /* SLI only supports up to 60 Hz refresh at high resolutions */ - if(sst1CurrentBoard->sstSliDetect && sst1CurrentBoard->fbiBoardID == 0x1) - sst1MonitorRefresh = 60; - - if(altVideoTiming && !GETENV(("SST_SCREENREZ")) && - !GETENV(("SST_SCREENREFRESH"))) { - sstVideoRez = altVideoTiming; - sst1CurrentBoard->fbiVideoRefresh = 60; - sst1CurrentBoard->fbiVideoWidth = sstVideoRez->xDimension; - sst1CurrentBoard->fbiVideoHeight = sstVideoRez->yDimension; - } else { - switch(sst1MonitorRez) { - case(512256): - sstVideoRez = &SST_VREZ_512X256_60; - break; - case(512): - if(sst1MonitorRefresh == 120) - sstVideoRez = &SST_VREZ_512X384_120; - else if(sst1MonitorRefresh == 85) - sstVideoRez = &SST_VREZ_512X384_85; - else if(sst1MonitorRefresh == 75) - sstVideoRez = &SST_VREZ_512X384_75; - else if(sst1MonitorRefresh == 60 && GETENV(("SST_ARCADE"))) - sstVideoRez = &SST_VREZ_512X384_60; - else { - sst1MonitorRefresh = 72; - sstVideoRez = &SST_VREZ_512X384_72; - } - break; - case(640400): - if(sst1MonitorRefresh == 120) - sstVideoRez = &SST_VREZ_640X400_120; - else if(sst1MonitorRefresh == 85) - sstVideoRez = &SST_VREZ_640X400_85; - else if(sst1MonitorRefresh == 75) - sstVideoRez = &SST_VREZ_640X400_75; - else { - sst1MonitorRefresh = 70; - sstVideoRez = &SST_VREZ_640X400_70; - } - break; - case(640): - if(sst1MonitorRefresh == 120) - sstVideoRez = &SST_VREZ_640X480_120; - else if(sst1MonitorRefresh == 85) - sstVideoRez = &SST_VREZ_640X480_85; - else if(sst1MonitorRefresh == 75) - sstVideoRez = &SST_VREZ_640X480_75; - else { - sst1MonitorRefresh = 60; - sstVideoRez = &SST_VREZ_640X480_60; - } - break; -#ifdef H3D - case(640502): - sst1MonitorRefresh = 60; - sstVideoRez = &SST_VREZ_640X502_60; - break; - case(800620): - sst1MonitorRefresh = 60; - sstVideoRez = &SST_VREZ_800X620_60; - break; -#endif - case(800): - if(sst1MonitorRefresh == 85) - sstVideoRez = &SST_VREZ_800X600_85; - else if(sst1MonitorRefresh == 75) - sstVideoRez = &SST_VREZ_800X600_75; - else { - sst1MonitorRefresh = 60; - sstVideoRez = &SST_VREZ_800X600_60; - } - break; - case(856): - sst1MonitorRefresh = 60; - sstVideoRez = &SST_VREZ_856X480_60; - break; - case(960): - sst1MonitorRefresh = 60; - sstVideoRez = &SST_VREZ_960X720_60; - break; - default: - INIT_PRINTF(("sst1InitVideo(): Unsupported Resolution %d...\n", - screenResolution)); - return(FXFALSE); - break; - } - sst1CurrentBoard->fbiVideoRefresh = sst1MonitorRefresh; - } - - if(GETENV(("SST_VIDEO_24BPP"))) - sst1CurrentBoard->fbiVideo16BPP = - (ATOI(GETENV(("SST_VIDEO_24BPP")))) ^ 0x1; - else { - sst1CurrentBoard->fbiVideo16BPP = 0; - - if(sst1CurrentBoard->fbiVideo16BPP && (sstVideoRez->video16BPPIsOK == - FXFALSE)) - sst1CurrentBoard->fbiVideo16BPP = 0; - if(!sst1CurrentBoard->fbiVideo16BPP && (sstVideoRez->video24BPPIsOK == - FXFALSE)) - sst1CurrentBoard->fbiVideo16BPP = 1; - - if(altVideoTiming == (sst1VideoTimingStruct *) NULL) { - if(sst1CurrentBoard->sstSliDetect && - (sst1CurrentBoard->fbiBoardID == 0x1) && - (sstVideoRez->clkFreq24bpp > 52.0F)) { - sst1CurrentBoard->fbiVideo16BPP = 1; - } else if(sst1CurrentBoard->fbiBoardID == 0x1) { - // Obsidian Pro Board... - if(sstVideoRez->clkFreq24bpp > 81.0F) - sst1CurrentBoard->fbiVideo16BPP = 1; - } else { - if((sst1MonitorRefresh >= 85) || (sst1MonitorRez == 800) || - (sst1MonitorRez == 960)) - sst1CurrentBoard->fbiVideo16BPP = 1; - } - } -#if 0 -#if 0 - if(sst1CurrentBoard->fbiRevision == 2 && - (altVideoTiming == (sst1VideoTimingStruct *) NULL) && - (((sst1MonitorRez > 640) && (sst1MonitorRez != 512256) && - (sst1MonitorRez != 640400)) || (sst1MonitorRefresh > 85))) - sst1CurrentBoard->fbiVideo16BPP = 1; -#else - if((sst1MonitorRefresh >= 85) || (sst1MonitorRez == 800) || - (sst1MonitorRez == 960)) - sst1CurrentBoard->fbiVideo16BPP = 1; -#endif -#endif - } - video16BPP = sst1CurrentBoard->fbiVideo16BPP; - - /* Reset Video Refresh Unit */ - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_RESET); - - /* Enable video clock */ - if(SLI_DRIVEOK()) { - INIT_PRINTF(("sst1InitVideo(): Enabling Video Clock...\n")); - PCICFG_WR(SST1_PCI_VCLK_ENABLE, 0x0); - } - - /* Setup SST video timing registers */ - if(GETENV(("SST_HSYNC"))) { - SSCANF(GETENV(("SST_HSYNC")), "%i", &vtmp); - INIT_PRINTF(("sst1InitVideo(): Using SST_HSYNC=0x%x\n", vtmp)); - ISET(sst->hSync, vtmp); - } else - ISET(sst->hSync, ((sstVideoRez->hSyncOff << SST_VIDEO_HSYNC_OFF_SHIFT) | - (sstVideoRez->hSyncOn << SST_VIDEO_HSYNC_ON_SHIFT))); - if(GETENV(("SST_VSYNC"))) { - SSCANF(GETENV(("SST_VSYNC")), "%i", &vtmp); - INIT_PRINTF(("sst1InitVideo(): Using SST_VSYNC=0x%x\n", vtmp)); - ISET(sst->vSync, vtmp); - } else - ISET(sst->vSync, ((sstVideoRez->vSyncOff << SST_VIDEO_VSYNC_OFF_SHIFT) | - (sstVideoRez->vSyncOn << SST_VIDEO_VSYNC_ON_SHIFT))); - if(GETENV(("SST_BACKPORCH"))) { - SSCANF(GETENV(("SST_BACKPORCH")), "%i", &vtmp); - INIT_PRINTF(("sst1InitVideo(): Using SST_BACKPORCH=0x%x\n", vtmp)); - ISET(sst->backPorch, vtmp); - } else - ISET(sst->backPorch, - ((sstVideoRez->vBackPorch << SST_VIDEO_VBACKPORCH_SHIFT) | - (sstVideoRez->hBackPorch << SST_VIDEO_HBACKPORCH_SHIFT))); - if(GETENV(("SST_DIMENSIONS"))) { - SSCANF(GETENV(("SST_DIMENSIONS")), "%i", &vtmp); - INIT_PRINTF(("sst1InitVideo(): Using SST_DIMENSIONS=0x%x\n", vtmp)); - sstVideoRez->yDimension = (vtmp >> SST_VIDEO_YDIM_SHIFT) & 0x3ff; - sstVideoRez->xDimension = vtmp & 0x3ff; - } - ISET(sst->videoDimensions, - ((sstVideoRez->yDimension << SST_VIDEO_YDIM_SHIFT) | - ((sstVideoRez->xDimension-1) << SST_VIDEO_XDIM_SHIFT))); - if(GETENV(("SST_MEMOFFSET"))) { - SSCANF(GETENV(("SST_MEMOFFSET")), "%i", &vtmp); - INIT_PRINTF(("sst1InitVideo(): Using video memOffset=0x%x\n", vtmp)); - sstVideoRez->memOffset = vtmp; - } - if(GETENV(("SST_TILESINX"))) { - SSCANF(GETENV(("SST_TILESINX")), "%i", &vtmp); - INIT_PRINTF(("sst1InitVideo(): Using video tilesInX=0x%x\n", vtmp)); - sstVideoRez->tilesInX_Over2 = vtmp; - } - - /* Setup SST memory mapper for desired resolution */ - if(sst1CurrentBoard->fbiMemSize == 4) - sst1InitSetResolution(sstbase, sstVideoRez, 1); - else - sst1InitSetResolution(sstbase, sstVideoRez, 0); - - if((GETENV(("SST_TRIPLE_BUFFER"))) || - (sst1CurrentBoard->fbiTripleBufferingEnabled == FXTRUE)) { - INIT_PRINTF(("sst1InitVideo(): Enabling Triple Buffering\n")); - ISET(sst->fbiInit2, IGET(sst->fbiInit2) | SST_EN_TRIPLE_BUFFERING); - } - - /* Calculate graphics clock frequency */ - if(sst1InitCalcGrxClk(sstbase) == FXFALSE) - return(FXFALSE); - - /* Setup video fifo */ - /* NOTE: Lower values for the video fifo threshold improve video fifo */ - /* underflow problems */ - if(GETENV(("SST_VFIFO_THRESH"))) { - INIT_PRINTF(("sst1InitVideo(): Overriding Default Video Fifo Threshold %d and Storing %d\n", - sstVideoRez->vFifoThreshold, ATOI(GETENV(("SST_VFIFO_THRESH"))))); - ISET(sst->fbiInit3, (IGET(sst->fbiInit3) & ~SST_VIDEO_FIFO_THRESH) | - ((ATOI(GETENV(("SST_VFIFO_THRESH")))) - << SST_VIDEO_FIFO_THRESH_SHIFT)); - } else { - FxU32 vFifoThresholdVal = sstVideoRez->vFifoThreshold; - - if(sst1CurrentBoard->grxClkFreq < 45) - /* Lower threshold value for slower graphics clocks */ - vFifoThresholdVal = sstVideoRez->vFifoThreshold - 4; - ISET(sst->fbiInit3, (IGET(sst->fbiInit3) & ~SST_VIDEO_FIFO_THRESH) | - (vFifoThresholdVal << SST_VIDEO_FIFO_THRESH_SHIFT)); - } - - INIT_PRINTF(("sst1InitVideo() Setting up video for resolution (%d, %d), Refresh:%d Hz...\n", - sstVideoRez->xDimension, sstVideoRez->yDimension, sst1MonitorRefresh)); - INIT_PRINTF(("sst1InitVideo(): Video Fifo Threshold = %d\n", - (IGET(sst->fbiInit3) & SST_VIDEO_FIFO_THRESH) >> - SST_VIDEO_FIFO_THRESH_SHIFT)); - - /* Initialize Y-Origin */ - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit3, (IGET(sst->fbiInit3) & ~SST_YORIGIN_TOP) | - ((sstVideoRez->yDimension - 1) << SST_YORIGIN_TOP_SHIFT)); - - sst1InitIdleFBINoNOP(sstbase); - - memFifoLwm = 23; - if(GETENV(("SST_MEMFIFO_LWM"))) - SSCANF(GETENV(("SST_MEMFIFO_LWM")), "%i", &memFifoLwm); - memFifoHwm = 54; - if(GETENV(("SST_MEMFIFO_HWM"))) - SSCANF(GETENV(("SST_MEMFIFO_HWM")), "%i", &memFifoHwm); - pciFifoLwm = 13; - if(GETENV(("SST_PCIFIFO_LWM"))) - SSCANF(GETENV(("SST_PCIFIFO_LWM")), "%i", &pciFifoLwm); - INIT_PRINTF(("sst1InitVideo(): pciFifoLwm:%d memFifoLwm:%d memFifoHwm:%d\n", - pciFifoLwm, memFifoLwm, memFifoHwm)); - - /* Setup Memory FIFO */ - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit4, IGET(sst->fbiInit4) & - ~(SST_MEM_FIFO_ROW_BASE | SST_MEM_FIFO_ROW_ROLL | SST_MEM_FIFO_LWM)); - sst1InitIdleFBINoNOP(sstbase); - if(sst1CurrentBoard->fbiMemSize == 1) - ISET(sst->fbiInit4, IGET(sst->fbiInit4) | - (0xff << SST_MEM_FIFO_ROW_ROLL_SHIFT)); - else if (sst1CurrentBoard->fbiMemSize == 2) - ISET(sst->fbiInit4, IGET(sst->fbiInit4) | - (0x1ff << SST_MEM_FIFO_ROW_ROLL_SHIFT)); - else - /* 4 MBytes frame buffer memory... */ - ISET(sst->fbiInit4, IGET(sst->fbiInit4) | - (0x3ff << SST_MEM_FIFO_ROW_ROLL_SHIFT)); - sst1InitIdleFBINoNOP(sstbase); - - if((sst1CurrentBoard->fbiMemSize == 1 && sst1MonitorRez == 512) || - (sst1CurrentBoard->fbiMemSize == 1 && sst1MonitorRez == 512256) || - (sst1CurrentBoard->fbiMemSize == 2 && sst1MonitorRez == 800) || - (sst1CurrentBoard->fbiMemSize == 2 && sst1MonitorRez == 856)) - ISET(sst->fbiInit4, IGET(sst->fbiInit4) | - ((2*sstVideoRez->memOffset) << SST_MEM_FIFO_ROW_BASE_SHIFT)); - else if(sst1CurrentBoard->fbiMemSize < 4 && sst1MonitorRez == 960 && - sst1CurrentBoard->sstSliDetect == 0) - return(FXFALSE); - else - ISET(sst->fbiInit4, IGET(sst->fbiInit4) | - ((3*sstVideoRez->memOffset) << SST_MEM_FIFO_ROW_BASE_SHIFT)); - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit4, IGET(sst->fbiInit4) | - (memFifoLwm << SST_MEM_FIFO_LWM_SHIFT)); - sst1InitIdleFBINoNOP(sstbase); - - /* Set PCI FIFO LWM */ - ISET(sst->fbiInit0, (IGET(sst->fbiInit0) & ~SST_PCI_FIFO_LWM) | - (pciFifoLwm << SST_PCI_FIFO_LWM_SHIFT)); - sst1InitIdleFBINoNOP(sstbase); - - /* Enable Memory Fifo... */ - if(GETENV(("SST_MEMFIFO"))) - n = ATOI(GETENV(("SST_MEMFIFO"))); - else - n = 1; - - /* Prohibit illegal memory fifo settings... */ - if(sst1CurrentBoard->fbiMemSize == 1 && sstVideoRez->xDimension > 512) - n = 0; - - if(n) { - sst1CurrentBoard->fbiMemoryFifoEn = 1; - if(sst1CurrentBoard->fbiMemSize == 1) - memFifoEntries = sstVideoRez->memFifoEntries_1MB; - else if(sst1CurrentBoard->fbiMemSize == 2) - memFifoEntries = sstVideoRez->memFifoEntries_2MB; - else - memFifoEntries = sstVideoRez->memFifoEntries_4MB; - if(GETENV(("SST_MEMFIFO_ENTRIES"))) - SSCANF(GETENV(("SST_MEMFIFO_ENTRIES")), "%i", &memFifoEntries); - INIT_PRINTF(("sst1InitVideo(): Enabling Memory FIFO (Entries=%d)...\n", - 0xffff - (memFifoEntries << 5))); - - sst1CurrentBoard->memFifoStatusLwm = (memFifoEntries << 5) | 0x1f; - ISET(sst->fbiInit0, (IGET(sst->fbiInit0) & ~(SST_MEM_FIFO_EN | - SST_MEM_FIFO_HWM | SST_PCI_FIFO_LWM | SST_MEM_FIFO_BURST_HWM)) | - (memFifoEntries << SST_MEM_FIFO_HWM_SHIFT) | - (pciFifoLwm << SST_PCI_FIFO_LWM_SHIFT) | - (memFifoHwm << SST_MEM_FIFO_BURST_HWM_SHIFT) | - SST_MEM_FIFO_EN); - } - INIT_PRINTF(("sst1InitVideo(): Setting memory FIFO LWM to 0x%x (%d)\n", - sst1CurrentBoard->memFifoStatusLwm, - sst1CurrentBoard->memFifoStatusLwm)); - - vInClkDel = 0; - if((sst1MonitorRez == 960 && !video16BPP) || - (sst1MonitorRez == 640 && !video16BPP && sst1MonitorRefresh == 120) || - (sst1MonitorRez == 800 && !video16BPP && sst1MonitorRefresh == 75) || - (sst1MonitorRez == 800 && !video16BPP && sst1MonitorRefresh == 85)) - vInClkDel = 2; - if(sst1CurrentBoard->fbiRevision == 2) - vInClkDel = 0; - if(GETENV(("SST_VIN_CLKDEL"))) - SSCANF(GETENV(("SST_VIN_CLKDEL")), "%i", &vInClkDel); - - if(sst1CurrentBoard->fbiRevision == 2) - vOutClkDel = 2; - else - vOutClkDel = 0; - if(GETENV(("SST_VOUT_CLKDEL"))) - SSCANF(GETENV(("SST_VOUT_CLKDEL")), "%i", &vOutClkDel); - - INIT_PRINTF(("sst1InitVideo(): vInClkDel=0x%x vOutClkDel=0x%x\n", - vInClkDel, vOutClkDel)); - - /* Drive dac output signals and select input video clock */ - if(video16BPP) { - INIT_PRINTF(("sst1InitVideo(): Setting 16BPP video mode...\n")); - ISET(sst->fbiInit1, (IGET(sst->fbiInit1) & ~SST_VIDEO_MASK) | - (SST_VIDEO_DATA_OE_EN | - SST_VIDEO_BLANK_OE_EN | - SST_VIDEO_HVSYNC_OE_EN | - SST_VIDEO_DCLK_OE_EN | - SST_VIDEO_VID_CLK_2X | - (vInClkDel << SST_VIDEO_VCLK_DEL_SHIFT) | - (vOutClkDel << SST_VIDEO_VCLK_2X_OUTPUT_DEL_SHIFT) | - SST_VIDEO_VCLK_SEL)); - sst1InitIdleFBINoNOP(sstbase); - } else { - INIT_PRINTF(("sst1InitVideo(): Setting 24BPP video mode...\n")); - ISET(sst->fbiInit1, (IGET(sst->fbiInit1) & ~SST_VIDEO_MASK) | - (SST_VIDEO_DATA_OE_EN | - SST_VIDEO_BLANK_OE_EN | - SST_VIDEO_HVSYNC_OE_EN | - SST_VIDEO_DCLK_OE_EN | - SST_VIDEO_VID_CLK_2X | - SST_VIDEO_VCLK_DIV2 | - (vInClkDel << SST_VIDEO_VCLK_DEL_SHIFT) | - (vOutClkDel << SST_VIDEO_VCLK_2X_OUTPUT_DEL_SHIFT) | - SST_VIDEO_24BPP_EN)); - sst1InitIdleFBINoNOP(sstbase); - if(!GETENV(("SST_VIDEO_FILTER_DISABLE"))) { - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_FILTER_EN); - if(GETENV(("SST_VIDEO_FILTER_THRESHOLD"))) { - SSCANF(GETENV(("SST_VIDEO_FILTER_THRESHOLD")), "%i", &n); - INIT_PRINTF(("sst1InitVideo(): Setting Video Filtering Treshold to 0x%x...\n", n)); - - ISET(sst->videoFilterRgbThreshold, n); - } else - /* sst->videoFilterRgbThreshold = 0x180c18; */ - ISET(sst->videoFilterRgbThreshold, 0x080408); - } else - INIT_PRINTF(("sst1InitVideo(): Disabling Video Filtering...\n")); - } - - /* Adjust FT-clock delay */ - if(sst1CurrentBoard->fbiRevision == 2) { - /* .5 micron */ - if(sst1CurrentBoard->tmuRevision == 1) - ft_clk_del = SST_FT_CLK_DEL_ADJ_DEFAULT_R21; - else - ft_clk_del = SST_FT_CLK_DEL_ADJ_DEFAULT_R20; - } else { - /* .6 micron */ - if(sst1CurrentBoard->tmuRevision == 1) - ft_clk_del = SST_FT_CLK_DEL_ADJ_DEFAULT_R11; - else - ft_clk_del = SST_FT_CLK_DEL_ADJ_DEFAULT_R10; - } - - /* Adjust TF-clock delay */ - if(sst1CurrentBoard->tmuRevision == 1) { - if(sst1CurrentBoard->fbiRevision == 2) { - tf0_clk_del = SST_TEX_TF_CLK_DEL_ADJ_DEFAULT_R21; - tf1_clk_del = SST_TEX_TF_CLK_DEL_ADJ_DEFAULT_R21; - tf2_clk_del = SST_TEX_TF_CLK_DEL_ADJ_DEFAULT_R21; - } else { - tf0_clk_del = SST_TEX_TF_CLK_DEL_ADJ_DEFAULT_R11; - tf1_clk_del = SST_TEX_TF_CLK_DEL_ADJ_DEFAULT_R11; - tf2_clk_del = SST_TEX_TF_CLK_DEL_ADJ_DEFAULT_R11; - } - } else { - if(sst1CurrentBoard->fbiRevision == 2) { - tf0_clk_del = SST_TEX_TF_CLK_DEL_ADJ_DEFAULT_R20; - tf1_clk_del = SST_TEX_TF_CLK_DEL_ADJ_DEFAULT_R20; - tf2_clk_del = SST_TEX_TF_CLK_DEL_ADJ_DEFAULT_R20; - } else { - tf0_clk_del = SST_TEX_TF_CLK_DEL_ADJ_DEFAULT_R10; - tf1_clk_del = SST_TEX_TF_CLK_DEL_ADJ_DEFAULT_R10; - tf2_clk_del = SST_TEX_TF_CLK_DEL_ADJ_DEFAULT_R10; - } - } - /* Adjust clock delays for .5 micron to account for frequency - dependencies */ - if(sst1CurrentBoard->fbiRevision == 2 && sst1CurrentBoard->tmuRevision == 1) - { - if(sst1CurrentBoard->grxClkFreq >= 55) { - ft_clk_del = tf0_clk_del = tf1_clk_del = tf2_clk_del = 0x4; - } else if(sst1CurrentBoard->grxClkFreq >= 50) { - ft_clk_del = tf0_clk_del = tf1_clk_del = tf2_clk_del = 0x5; - } else if(sst1CurrentBoard->grxClkFreq >= 48) { - ft_clk_del = tf0_clk_del = tf1_clk_del = tf2_clk_del = 0x6; - } else if(sst1CurrentBoard->grxClkFreq >= 45) { - ft_clk_del = tf0_clk_del = tf1_clk_del = tf2_clk_del = 0x7; - } else if(sst1CurrentBoard->grxClkFreq >= 43) { - ft_clk_del = tf0_clk_del = tf1_clk_del = tf2_clk_del = 0x8; - } else { - ft_clk_del = tf0_clk_del = tf1_clk_del = tf2_clk_del = 0x9; - } - } - - /* Override with environment variables */ - if(GETENV(("SST_FT_CLK_DEL"))) - SSCANF(GETENV(("SST_FT_CLK_DEL")), "%i", &ft_clk_del); - if(GETENV(("SST_TF0_CLK_DEL"))) - SSCANF(GETENV(("SST_TF0_CLK_DEL")), "%i", &tf0_clk_del); - if(GETENV(("SST_TF1_CLK_DEL"))) - SSCANF(GETENV(("SST_TF1_CLK_DEL")), "%i", &tf1_clk_del); - if(GETENV(("SST_TF2_CLK_DEL"))) - SSCANF(GETENV(("SST_TF2_CLK_DEL")), "%i", &tf2_clk_del); - - INIT_PRINTF(("sst1InitVideo(): Setting FBI-to-TREX clock delay to 0x%x...\n", ft_clk_del)); - INIT_PRINTF(("sst1InitVideo(): Setting TREX#0 TREX-to-FBI clock delay to 0x%x\n", - tf0_clk_del)); - INIT_PRINTF(("sst1InitVideo(): Setting TREX#1 TREX-to-FBI clock delay to 0x%x\n", - tf1_clk_del)); - INIT_PRINTF(("sst1InitVideo(): Setting TREX#2 TREX-to-FBI clock delay to 0x%x\n", - tf2_clk_del)); - - ISET(sst->fbiInit3, (IGET(sst->fbiInit3) & ~SST_FT_CLK_DEL_ADJ) | - (ft_clk_del << SST_FT_CLK_DEL_ADJ_SHIFT)); - sst1InitIdleFBINoNOP(sstbase); - - sst1CurrentBoard->tmuInit1[0] = (sst1CurrentBoard->tmuInit1[0] & - ~SST_TEX_TF_CLK_DEL_ADJ) | (tf0_clk_del<tmuInit1[1] = (sst1CurrentBoard->tmuInit1[1] & - ~SST_TEX_TF_CLK_DEL_ADJ) | (tf1_clk_del<tmuInit1[2] = (sst1CurrentBoard->tmuInit1[2] & - ~SST_TEX_TF_CLK_DEL_ADJ) | (tf2_clk_del<trexInit1, sst1CurrentBoard->tmuInit1[0]); - /* sst1InitIdleFBINoNOP(sstbase); */ - /* Can't use sst1InitIdleFbi because changing the tf clock delay may */ - /* incorrectly put data into the TREX-to-FBI fifo */ - for(n=0; n<100; n++) sst1InitReturnStatus(sstbase); - ISET(SST_TREX(sst,1)->trexInit1, sst1CurrentBoard->tmuInit1[1]); - for(n=0; n<100; n++) sst1InitReturnStatus(sstbase); - ISET(SST_TREX(sst,2)->trexInit1, sst1CurrentBoard->tmuInit1[2]); - for(n=0; n<100; n++) sst1InitReturnStatus(sstbase); - - /* Setup graphics clock */ - if(sst1InitGrxClk(sstbase) == FXFALSE) - return(FXFALSE); - - /* Setup video mode */ - if(sst1InitSetVidMode(sstbase, video16BPP) == FXFALSE) - return(FXFALSE); - - /* Adjust Video Clock */ -#ifndef DIRECTX - if(GETENV(("SST_VIDCLK2X"))) { - float vidClkFreq; - - SSCANF(GETENV(("SST_VIDCLK2X")), "%f", &vidClkFreq); - if(sst1InitSetVidClk(sstbase, vidClkFreq) == FXFALSE) - return(FXFALSE); - } else { -#endif - if(sst1InitUseVoodooFile == FXTRUE) { - if(sst1InitSetVidClkINI(sstbase, sst1CurrentBoard->fbiVideoWidth, - sst1CurrentBoard->fbiVideoHeight, - sst1CurrentBoard->fbiVideoRefresh, video16BPP) == FXFALSE) - return(FXFALSE); - } else { - if(video16BPP) { - if(sst1InitSetVidClk(sstbase, sstVideoRez->clkFreq16bpp) == - FXFALSE) - return(FXFALSE); - } else { - if(sst1InitSetVidClk(sstbase, sstVideoRez->clkFreq24bpp) == - FXFALSE) - return(FXFALSE); - } - } -#ifndef DIRECTX - } -#endif - - /* Wait for video clock to stabilize */ - for(n=0; n<200000; n++) - sst1InitReturnStatus(sstbase); - - /* Run Video Reset Module */ - ISET(sst->fbiInit1, IGET(sst->fbiInit1) & ~SST_VIDEO_RESET); - sst1InitIdleFBINoNOP(sstbase); - - ISET(sst->fbiInit2, IGET(sst->fbiInit2) | SST_EN_DRAM_REFRESH); - - sst1InitIdleFBINoNOP(sstbase); - - if(!GETENV(("SST_VIDEO_NOCLEAR"))) { - /* Clear Screen */ - FxU32 clearColor = 0x0; - - if(GETENV(("SST_VIDEO_CLEARCOLOR"))) - SSCANF(GETENV(("SST_VIDEO_CLEARCOLOR")), "%i", &clearColor); - ISET(sst->c1, clearColor); - ISET(sst->c0, clearColor); - ISET(sst->zaColor, 0x0); - ISET(sst->clipLeftRight, sstVideoRez->xDimension); - ISET(sst->clipBottomTop, sstVideoRez->yDimension); - ISET(sst->fbzMode, SST_RGBWRMASK | SST_ZAWRMASK); - ISET(sst->fastfillCMD, 0x0); /* Frontbuffer & Z/A */ - ISET(sst->fbzMode, SST_RGBWRMASK | SST_DRAWBUFFER_BACK);/* Backbuffer */ - ISET(sst->fastfillCMD, 0x0); - /* Clear fbistat registers after clearing screen */ - ISET(sst->nopCMD, 0x1); - sst1InitIdleFBINoNOP(sstbase); - } else - INIT_PRINTF(("sst1InitVideo(): Not Clearing Frame Buffer(s)...\n")); - - sst1InitVgaPassCtrl(sstbase, 0); - - if(GETENV(("SST_VIDEO_DISABLE"))) { - INIT_PRINTF(("sst1InitVideo(): Disabling video timing...\n")); - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_RESET); - sst1InitIdleFBINoNOP(sstbase); - } - sst1InitIdle(sstbase); - - if(((IGET(sst->status) & SST_SWAPBUFPENDING) >> - SST_SWAPBUFPENDING_SHIFT) > 0) - sst1InitClearSwapPending(sstbase); - - INIT_PRINTF(("sst1InitVideo() exiting with status %d...\n", FXTRUE)); - return(FXTRUE); -} - -/* -** sst1InitFindVideoTimingStruct(): -** Returns: -** Video Timing Structure -*/ -FX_EXPORT sst1VideoTimingStruct * FX_CSTYLE sst1InitFindVideoTimingStruct(GrScreenResolution_t screenResolution, - GrScreenRefresh_t screenRefresh) -{ - sst1VideoTimingStruct *sstVideoRez = NULL; - FxU32 sst1MonitorRefresh; - FxU32 sst1MonitorRez; - - switch(screenResolution) { - case(GR_RESOLUTION_512x256): - sst1MonitorRez = 512256; - break; - case(GR_RESOLUTION_512x384): - sst1MonitorRez = 512; - break; - case(GR_RESOLUTION_640x400): - sst1MonitorRez = 640400; - break; - case(GR_RESOLUTION_640x480): - sst1MonitorRez = 640; - break; -#ifdef H3D - case(GR_RESOLUTION_640x240_AUTOFLIPPED): - sst1MonitorRez = 640502; - break; - case(GR_RESOLUTION_800x300_AUTOFLIPPED): - sst1MonitorRez = 800620; - break; -#endif - case(GR_RESOLUTION_800x600): - sst1MonitorRez = 800; - break; - case(GR_RESOLUTION_856x480): - sst1MonitorRez = 856; - break; - case(GR_RESOLUTION_960x720): - sst1MonitorRez = 960; - break; - default: - return(NULL); - break; - } - - switch(screenRefresh) { - case(GR_REFRESH_60Hz): - sst1MonitorRefresh = 60; - break; - case(GR_REFRESH_70Hz): - sst1MonitorRefresh = 70; - break; - case(GR_REFRESH_72Hz): - sst1MonitorRefresh = 72; - break; - case(GR_REFRESH_75Hz): - sst1MonitorRefresh = 75; - break; - case(GR_REFRESH_80Hz): - sst1MonitorRefresh = 80; - break; - case(GR_REFRESH_85Hz): - sst1MonitorRefresh = 85; - break; - case(GR_REFRESH_90Hz): - sst1MonitorRefresh = 90; - break; - case(GR_REFRESH_100Hz): - sst1MonitorRefresh = 100; - break; - case(GR_REFRESH_120Hz): - sst1MonitorRefresh = 120; - break; - default: - return(NULL); - break; - } - - /* Override settings with environment variables */ - if(GETENV(("SST_SCREENREZ"))) { - if(ATOI(GETENV(("SST_SCREENREZ"))) == 640) { - sst1MonitorRez = 640; - } else if(ATOI(GETENV(("SST_SCREENREZ"))) == 640400) { - sst1MonitorRez = 640400; - } else if(ATOI(GETENV(("SST_SCREENREZ"))) == 800) { - sst1MonitorRez = 800; - } else if(ATOI(GETENV(("SST_SCREENREZ"))) == 512256) { - sst1MonitorRez = 512256; - } else if(ATOI(GETENV(("SST_SCREENREZ"))) == 512) { - sst1MonitorRez = 512; - } else if(ATOI(GETENV(("SST_SCREENREZ"))) == 856) { - sst1MonitorRez = 856; - } else if(ATOI(GETENV(("SST_SCREENREZ"))) == 960) { - sst1MonitorRez = 960; - } else { - sst1MonitorRez = 640; - } - } - if(GETENV(("SST_SCREENREFRESH"))) { - if(ATOI(GETENV(("SST_SCREENREFRESH"))) == 60) - sst1MonitorRefresh = 60; - else if(ATOI(GETENV(("SST_SCREENREFRESH"))) == 72) - sst1MonitorRefresh = 72; - else if(ATOI(GETENV(("SST_SCREENREFRESH"))) == 75) - sst1MonitorRefresh = 75; - else if(ATOI(GETENV(("SST_SCREENREFRESH"))) == 85) - sst1MonitorRefresh = 85; - else if(ATOI(GETENV(("SST_SCREENREFRESH"))) == 120) - sst1MonitorRefresh = 120; - else - sst1MonitorRefresh = 60; - } - - switch(sst1MonitorRez) { - case(512256): - sstVideoRez = &SST_VREZ_512X256_60; - break; - case(512): - if(sst1MonitorRefresh == 120) - sstVideoRez = &SST_VREZ_512X384_120; - else if(sst1MonitorRefresh == 85) - sstVideoRez = &SST_VREZ_512X384_85; - else if(sst1MonitorRefresh == 75) - sstVideoRez = &SST_VREZ_512X384_75; - else if(sst1MonitorRefresh == 60 && GETENV(("SST_ARCADE"))) - sstVideoRez = &SST_VREZ_512X384_60; - else { - sstVideoRez = &SST_VREZ_512X384_72; - } - break; - case(640400): - if(sst1MonitorRefresh == 120) - sstVideoRez = &SST_VREZ_640X400_120; - else if(sst1MonitorRefresh == 85) - sstVideoRez = &SST_VREZ_640X400_85; - else if(sst1MonitorRefresh == 75) - sstVideoRez = &SST_VREZ_640X400_75; - else { - sstVideoRez = &SST_VREZ_640X400_70; - } - break; - case(640): - if(sst1MonitorRefresh == 120) - sstVideoRez = &SST_VREZ_640X480_120; - else if(sst1MonitorRefresh == 85) - sstVideoRez = &SST_VREZ_640X480_85; - else if(sst1MonitorRefresh == 75) - sstVideoRez = &SST_VREZ_640X480_75; - else { - sstVideoRez = &SST_VREZ_640X480_60; - } - break; -#ifdef H3D - case(640502): - sstVideoRez = &SST_VREZ_640X502_60; - break; - case(800620): - sstVideoRez = &SST_VREZ_800X620_60; - break; -#endif - case(800): - if(sst1MonitorRefresh == 85) - sstVideoRez = &SST_VREZ_800X600_85; - else if(sst1MonitorRefresh == 75) - sstVideoRez = &SST_VREZ_800X600_75; - else { - sstVideoRez = &SST_VREZ_800X600_60; - } - break; - case(856): - sstVideoRez = &SST_VREZ_856X480_60; - break; - case(960): - sstVideoRez = &SST_VREZ_960X720_60; - break; - default: - return(NULL); - break; - } - return(sstVideoRez); -} - -/* -** sst1InitSetVidMode(): -** Set video Mode -** -*/ -FxBool sst1InitSetVidMode(FxU32 *sstbase, FxU32 video16BPP) -{ - int helper = (GETENV(("SST_DEBUGDAC"))) ? 1 : 0; - - if(helper) - INIT_PRINTF(("sst1InitSetVidMode(): Entered...\n")); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - if(sst1InitUseVoodooFile == FXTRUE) { - return(sst1InitSetVidModeINI(sstbase, video16BPP)); - } else { - if((sst1CurrentBoard->fbiDacType == SST_FBI_DACTYPE_ATT) || - (sst1CurrentBoard->fbiDacType == SST_FBI_DACTYPE_TI)) - return(sst1InitSetVidModeATT(sstbase, video16BPP)); - else if(sst1CurrentBoard->fbiDacType == SST_FBI_DACTYPE_ICS) - return(sst1InitSetVidModeICS(sstbase, video16BPP)); - else - return(FXFALSE); - } -} - -/* -** sst1InitSetResolution(): -** Setup FBI video resolution registers -** This routine is used by sst1InitVideo() -** -** -*/ -FX_EXPORT void FX_CSTYLE sst1InitSetResolution(FxU32 *sstbase, - sst1VideoTimingStruct *sstVideoRez, FxU32 Banked) -{ - volatile Sstregs *sst = (Sstregs *) sstbase; - - if(Banked) - ISET(sst->fbiInit2, (IGET(sst->fbiInit2) & ~SST_VIDEO_BUFFER_OFFSET) | - (sstVideoRez->memOffset << SST_VIDEO_BUFFER_OFFSET_SHIFT) | - SST_DRAM_BANKING_CONFIG | SST_EN_DRAM_BANKED); - else - ISET(sst->fbiInit2, (IGET(sst->fbiInit2) & ~SST_VIDEO_BUFFER_OFFSET) | - (sstVideoRez->memOffset << SST_VIDEO_BUFFER_OFFSET_SHIFT)); - - ISET(sst->fbiInit1, (IGET(sst->fbiInit1) & ~SST_VIDEO_TILES_IN_X) | - (sstVideoRez->tilesInX_Over2 << SST_VIDEO_TILES_IN_X_SHIFT)); -} - -/* -** sst1InitSetVidClk(): -** Set video clock -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitSetVidClk(FxU32 *sstbase, float vidClkFreq) -{ - sst1ClkTimingStruct vidClkTiming; - int helper = (GETENV(("SST_DEBUGDAC"))) ? 1 : 0; - - if(helper) - - INIT_PRINTF(("sst1InitSetVidClk(): Entered...\n")); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - if(sst1InitComputeClkParams(vidClkFreq, &vidClkTiming) == FXFALSE) - return(FXFALSE); - - INIT_PRINTF(("sst1InitSetVidClk(): Setting up %.2f MHz Video Clock...\n", - vidClkFreq)); - - if((sst1CurrentBoard->fbiDacType == SST_FBI_DACTYPE_ATT) || - (sst1CurrentBoard->fbiDacType == SST_FBI_DACTYPE_TI)) - return(sst1InitSetVidClkATT(sstbase, &vidClkTiming)); - else if(sst1CurrentBoard->fbiDacType == SST_FBI_DACTYPE_ICS) - return(sst1InitSetVidClkICS(sstbase, &vidClkTiming)); - else - return(FXFALSE); -} - -/* -** sst1InitSetGrxClk(): -** Set graphics clock -** NOTE: sst1InitSetGrxClk() resets the PCI fifo and the graphics subsystem -** of FBI -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitSetGrxClk(FxU32 *sstbase, - sst1ClkTimingStruct *sstGrxClk) -{ - FxBool retVal = FXFALSE; - int helper = (GETENV(("SST_DEBUGDAC"))) ? 1 : 0; - - if(helper) - INIT_PRINTF(("sst1InitSetGrxClk(): Entered...\n")); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - if(sst1InitUseVoodooFile == FXTRUE) { - retVal = sst1InitSetGrxClkINI(sstbase, sstGrxClk); - } else { - if((sst1CurrentBoard->fbiDacType == SST_FBI_DACTYPE_ATT) || - (sst1CurrentBoard->fbiDacType == SST_FBI_DACTYPE_TI)) - retVal = sst1InitSetGrxClkATT(sstbase, sstGrxClk); - else if(sst1CurrentBoard->fbiDacType == SST_FBI_DACTYPE_ICS) - retVal = sst1InitSetGrxClkICS(sstbase, sstGrxClk); - } - if(retVal == FXFALSE) - return(FXFALSE); - - /* Fix problem where first Texture downloads to TMU weren't being - received properly */ - ISET(*(long *) (0xf00000 + (long) sstbase), 0xdeadbeef); - - if(sst1InitReturnStatus(sstbase) & SST_TREX_BUSY) { - INIT_PRINTF(("sst1InitSetGrxClk(): Resetting TMUs after clock change...\n")); - return(sst1InitResetTmus(sstbase)); - } - return(FXTRUE); -} - -/* -** sst1InitSetTripleBuffering(): -** Specify Video Triple Buffering -** NOTE: sst1InitSetTripleBuffering() must be called prior to calling -** sst1InitVideo() to properly setup Video Triple Buffering -** -*/ -FX_ENTRY FxBool FX_CALL sst1InitSetTripleBuffering(FxU32 *sstbase, - FxBool enableTripleBuffering) -{ - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - sst1CurrentBoard->fbiTripleBufferingEnabled = enableTripleBuffering; - - return(FXTRUE); -} - -#pragma optimize ("",on) diff --git a/glide2x/sst1/init/makefile.linux b/glide2x/sst1/init/makefile.linux deleted file mode 100644 index e73ea84..0000000 --- a/glide2x/sst1/init/makefile.linux +++ /dev/null @@ -1,51 +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=init -SUBDIRS=initvg init96 - -# local defines, options, includes -ifdef DEBUG -LCDEFS = -DGDBG_INFO_ON -endif -LCOPTS = -LCINCS = -I$(BUILD_ROOT_HW)/include - -ifeq ($(FX_GLIDE_HW),SST96) -INITHW = SST96 -else -INITHW = SST1 -endif - -# Turn on the alternate fifo handling code -ifeq ($(FX_SST96_PAGE_FIFO),1) -LCDEFS += -DSST96_ALT_FIFO_WRAP -endif - -LCDEFS += -D$(INITHW) - -HEADERS = init.h sst1vid.h -PRIVATE_HEADERS = fxinit.h -INSTALL_DESTINATION = $(BUILD_ROOT_HW) -CFILES = init.c vgdrvr.c vg96drvr.c h3drvr.c - -LIBRARIES = libinit.a - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak diff --git a/glide2x/sst1/init/makefile.unix b/glide2x/sst1/init/makefile.unix deleted file mode 100644 index cf87f55..0000000 --- a/glide2x/sst1/init/makefile.unix +++ /dev/null @@ -1,51 +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=init -SUBDIRS=initvg init96 - -# local defines, options, includes -ifdef DEBUG -LCDEFS = -DGDBG_INFO_ON -endif -LCOPTS = -LCINCS = -I$(BUILD_ROOT_SST1)/include - -ifeq ($(FX_GLIDE_HW),SST96) -INITHW = SST96 -else -INITHW = SST1 -endif - -# Turn on the alternate fifo handling code -ifeq ($(FX_SST96_PAGE_FIFO),1) -LCDEFS += -DSST96_ALT_FIFO_WRAP -endif - -LCDEFS += -D$(INITHW) - -HEADERS = init.h sst1vid.h -PRIVATE_HEADERS = fxinit.h -INSTALL_DESTINATION = $(BUILD_ROOT_SST1) -CFILES = init.c vgdrvr.c vg96drvr.c h3drvr.c - -LIBRARIES = libinit.a - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak diff --git a/glide2x/sst1/init/project.txt b/glide2x/sst1/init/project.txt deleted file mode 100644 index 035a4c9..0000000 --- a/glide2x/sst1/init/project.txt +++ /dev/null @@ -1,80 +0,0 @@ -What happens when glide initializes: - -* Identify Installed Hardware - - What if both an SST-1 and an AT3D are installed? - some behavior must be defined. We could have an - enumerate3DfxHardware? -* Locate and Load the correct DLL for the desired hardware. - - This requires that the interface be very well defined, - and we want it to be binary compatible across revisions. - - Under DOS either all init code must be statically linked in, - or we need a DOS DLL mechanism. -* Map the desired device into virtual memory -* Describe the selected hardware to the user/glide -* Do card soft reset. - - this sets all register state to desired power on defaults so - that future operations can proceed from a known, well-defined - hardware state -* Do card initialization: - - Under full screen this will involve setting up video timing - for the desired resolution and setting up whatever registers - are necessary to enable requrested color, alpha, depth buffers, - as well as configuring a command fifo if necessary. - - In a window this will negotiate with the operating system - for whatever shared resources are necessary. -* Initialize gamma correction - - Under Win95 this does nothing probably - - -What happens when glide shuts down: - -* Idle the graphics hardware -* Shut down graphics - - Win95 ( window ) - free all ddraw resources. - - Win95 ( full-screen ) - switch back to desktop - free all ddraw resources - - Dos ( full-screen ) - switch back to mode 3 -* Unmap card from virtual memory - - -What happens when the user wants to write to the LFB: -** Two approaches: -* Define a code region in which LFB accesses are permitted - - Win95 ( window ) - take a DDRAW lock on the surface and give pointer to users - lfbBegin( enum READWRITE ) - now returns a write pointer - do lfb writes - release ddraw lock - ( invalidates pointer ) - - Win95 ( fullscreen ) - same - - DOS ( fullscreen ) - return pointer to frame buffer that was mapped at init time - -* Don't ever allow user direct access to LFB - - All ugliness of lfb writes is - hidden in writepixel/writerect functions - -What happens when the user wants to read from the LFB: -** Two approaches: -* Define a code region in which LFB accesses are permitted - - Win95 ( window ) - take a readable DDRAW lock on the surface and give pointer to users - lfbBegin( enum READWRITE ) - now returns a readpointer pointer - do lfb writes - release ddraw lock - ( invalidates pointer ) - - Win95 ( fullscreen ) - same - - DOS ( fullscreen ) - return pointer to frame buffer that was mapped at init time - -* Don't ever allow user direct access to LFB - - All ugliness of lfb reads is - hidden in readpixel/readrect functions - - - - - diff --git a/glide2x/sst1/init/sst1vid.h b/glide2x/sst1/init/sst1vid.h deleted file mode 100644 index cc04865..0000000 --- a/glide2x/sst1/init/sst1vid.h +++ /dev/null @@ -1,109 +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 9/09/97 7:35p Sellers - * Added 400x300 resolution - * - * 3 8/24/97 9:31a Sellers - * moved new video timing to sst1vid.h - * redefined 1600x1280 to be 1600x1200 - * - * 2 6/05/97 11:14p Pgj - * - * 5 7/24/96 3:43p Sellers - * added 512x384 @ 60 Hz for arcade monitors - * added 512x256 @ 60 Hz for arcade monitors - * - * 4 7/18/96 10:58a Sellers - * fixed FT and TF clock delay values for lower frequencies with - * .5/.5 combos - * - * 3 6/18/96 6:54p Sellers - * added sst1InitShutdownSli() to fix Glide Splash screen problems with - * SLI - * - * 2 6/13/96 7:45p Sellers - * added "voodoo.ini" support - * added DirectX support - * misc cleanup - * - * 2 6/11/96 1:43p Sellers - * added support for 60, 75, 85, and 120 Hz refresh rates for "most" - * resolutions - * - * 1 5/08/96 5:43p Paik - * Video definitions -*/ -#ifndef __SST1VID_H__ -#define __SST1VID_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Video defines */ - -typedef FxI32 GrScreenRefresh_t; -#define GR_REFRESH_60Hz 0x0 -#define GR_REFRESH_70Hz 0x1 -#define GR_REFRESH_72Hz 0x2 -#define GR_REFRESH_75Hz 0x3 -#define GR_REFRESH_80Hz 0x4 -#define GR_REFRESH_90Hz 0x5 -#define GR_REFRESH_100Hz 0x6 -#define GR_REFRESH_85Hz 0x7 -#define GR_REFRESH_120Hz 0x8 -#define GR_REFRESH_NONE 0xff - -typedef FxI32 GrScreenResolution_t; -#define GR_RESOLUTION_320x200 0x0 -#define GR_RESOLUTION_320x240 0x1 -#define GR_RESOLUTION_400x256 0x2 -#define GR_RESOLUTION_512x384 0x3 -#define GR_RESOLUTION_640x200 0x4 -#define GR_RESOLUTION_640x350 0x5 -#define GR_RESOLUTION_640x400 0x6 -#define GR_RESOLUTION_640x480 0x7 -#define GR_RESOLUTION_800x600 0x8 -#define GR_RESOLUTION_960x720 0x9 -#define GR_RESOLUTION_856x480 0xa -#define GR_RESOLUTION_512x256 0xb -#define GR_RESOLUTION_1024x768 0xC -#define GR_RESOLUTION_1280x1024 0xD -#define GR_RESOLUTION_1600x1200 0xE -#define GR_RESOLUTION_400x300 0xF -#define GR_RESOLUTION_NONE 0xff - -#ifdef GR_RESOLUTION_MAX -#undef GR_RESOLUTION_MAX -#endif -#ifdef GR_RESOLUTION_MIN -#undef GR_RESOLUTION_MIN -#endif -#define GR_RESOLUTION_MIN GR_RESOLUTION_320x200 -#define GR_RESOLUTION_MAX GR_RESOLUTION_1600x1200 - -#ifdef __cplusplus -} -#endif - -#endif /* __SST1VID_H__ */ diff --git a/glide2x/sst1/init/tests/test_a.c b/glide2x/sst1/init/tests/test_a.c deleted file mode 100644 index 9691bb2..0000000 --- a/glide2x/sst1/init/tests/test_a.c +++ /dev/null @@ -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 -** -** -** $Revision$ -** $Date$ -** -*/ - -#include -#include - -#include -#include - -#define NUM_LINES 25 - -void morePrintf( FxU32 *lines, const char *fmt, ... ) { - va_list args; - - if ( *lines > NUM_LINES ) { - printf( "" ); - getch(); - *lines = 0; - } - - va_start( args, fmt ); - vfprintf( stdout, fmt, args ); - va_end( args ); - (*lines)++; - return; -} - -static FxU32 lineCount; - -static char *vgaChipNames[] = { - "Alliance Semiconductor AT3D" -}; - -void detectCallback( const InitDeviceInfo *info ) { - switch( info->hwClass ) { - case INIT_VOODOO: - morePrintf( &lineCount, - "Device: %d Type: Voodoo\n", - info->devNumber ); - morePrintf( &lineCount, - "- pfxRev: %.02d pfxRam: %.02d\n", - info->vgInfo.pfxRev, info->vgInfo.pfxRam ); - morePrintf( &lineCount, - "- nTFX: %.02d\n", - info->vgInfo.nTFX ); - morePrintf( &lineCount, - "- tfxRev: %.02d tfxRam: %.02d\n", - info->vgInfo.tfxRev, - info->vgInfo.tfxRam ); - morePrintf( &lineCount, - "- sli: %s\n", - info->vgInfo.sliDetect?"TRUE":"FALSE" ); - break; - case INIT_VG96: - morePrintf( &lineCount, - "Device: %d Type: VG96\n", - info->devNumber ); - morePrintf( &lineCount, - "- vgaChip: %s\n", - vgaChipNames[info->vg96Info.vgaChip] ); - morePrintf( &lineCount, - "- vg96Rev: %.02d vg96Ram: %.02d\n", - info->vg96Info.vg96Rev, info->vg96Info.vg96Ram ); - morePrintf( &lineCount, - "- nTFX: %.02d\n", - info->vg96Info.nTFX ); - morePrintf( &lineCount, - "- tfxRev: %.02d tfxRam: %.02d\n", - info->vg96Info.tfxRev, - info->vg96Info.tfxRam ); - break; - } - return; -} - -/*----------------------------------------------- - Detects the presence of 3DFX hardware and - prints out all info pertaining ot located boards. - -----------------------------------------------*/ -void main( void ) { - while( initEnumHardware( detectCallback ) ); - return; -} diff --git a/glide2x/sst1/init/tests/test_b.c b/glide2x/sst1/init/tests/test_b.c deleted file mode 100644 index 7a7de9e..0000000 --- a/glide2x/sst1/init/tests/test_b.c +++ /dev/null @@ -1,73 +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 -#include -#include - -#include - -static InitDeviceInfo devInfo; -static FxBool found = FXFALSE; - -FxBool detectCallback( const InitDeviceInfo *info ) { - if ( info->hwClass == INIT_VG96 ) { - devInfo = *info; - found = FXTRUE; - return FXTRUE; - } - return FXFALSE; -} - -void cb( FxU32 addr, FxU32 val ) { - return; -} - -/*----------------------------------------------- - Detects the presence of 3DFX hardware and - prints out all info pertaining ot located boards. - -----------------------------------------------*/ -int main( void ) { - FxU32 *hw; - InitBufferDesc desc; - - initEnumHardware( detectCallback ); - if ( found ) { - initDeviceSelect( devInfo.devNumber ); - hw = initMapDevice(); - if ( !hw ) { - puts( "initMapDevice failed." ); - exit( -1 ); - } - initResetRegisters(); - - if ( !initAllocBuffers( &desc ) ) { - puts( "intiAllocBuffers failed." ); - } - puts( "Press a key to exit." ); - getch(); - } - return 0; -} diff --git a/glide2x/sst1/init/vg96drvr.c b/glide2x/sst1/init/vg96drvr.c deleted file mode 100644 index aa1fdd7..0000000 --- a/glide2x/sst1/init/vg96drvr.c +++ /dev/null @@ -1,192 +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 <3dfx.h> -#include -#include "init.h" -#include -#include "fxinit.h" - -/* hack */ -#include -#include -#include -#include - -/* This is currently disabled, thus breaking rush, until we can get some - * sources from Aliance Semiconductor */ -#if 0 -static FxBool setVideo( FxU32 hWnd, - GrScreenResolution_t sRes, - GrScreenRefresh_t vRefresh, - InitColorFormat_t cFormat, - InitOriginLocation_t yOrigin, - int nColBuffers, - int nAuxBuffers, - int *xres, - int *yres, - int *fbStride, - sst1VideoTimingStruct *vidTimings) { - return init96SetVideo( hWnd, sRes, vRefresh, cFormat, yOrigin, - nColBuffers, nAuxBuffers, - &context->info.regs, - xres, yres, fbStride ); -} - -static void restoreVideo( void ) { - init96RestoreVideo( &context->info.regs ); -} - -static FxBool enableTransport( InitFIFOData *info ) { - return init96EnableTransport( info, &context->info.regs ); -} - -static void disableTransport( void ) { - init96DisableTransport(); -} - -static InitSwapType_t swapBuffers( FxU32 code ) { - if ( context && context->writeMethod ) - init96Swap( code, &context->info.regs, context->writeMethod ); - return INIT_SWAP_FLIP; -} - -static FxU32 status( void ) { - return *(context->info.regs.hwDep.VG96RegDesc.serialStatus); -} - -static FxBool busy(void) { - FxBool rv; - - rv = (status() & 0x1) ? FXTRUE : FXFALSE; - - return rv; -} - -static void idle( void ) { - init96Idle(context->writeMethod); -} - -static void *getBufferPtr( InitBuffer_t buffer, int *strideBytes ) { - return init96GetBufferPtr( buffer, strideBytes ); -} - -static void renderBuffer( InitBuffer_t buffer ) { - init96RenderBuffer( buffer, context->writeMethod ); - return; -} - -static void origin( InitOriginLocation_t origin ) { - init96Origin( origin, context->writeMethod ); - return; -} - -static void ioCtl( FxU32 token, void *argument ) { - return; -} - -static FxBool control( FxU32 code ) { - FxBool rv = FXFALSE; - GDBG_INFO((80, "vg96drvr: control: code = %d\n", code)); - if (context) - rv = init96Control( code, &context->info.regs); - return rv; -} - -static FxBool wrapFIFO(InitFIFOData *fd) { - return init96WrapFIFO(&(context->info.regs), fd); -} - -static void gamma( double gamma ) { -} - -static void sliPciOwner( FxU32 *regbase, FxU32 owner ) { -} - -static FxBool gammargb( double r, double g, double b ) { - return FXFALSE; -} - -static FxBool gammatable( FxU32 nentries, FxU32 *r, FxU32 *g, FxU32 *b ) { - return FXFALSE; -} - -static sst1VideoTimingStruct *findvidtiming( GrScreenResolution_t sRes, GrScreenRefresh_t vRefresh) { - return NULL; -} - -void vg96DriverInit( InitContext *context ) { - context->setVideo = setVideo; - context->restoreVideo = restoreVideo; - context->enableTransport = enableTransport; - context->disableTransport = disableTransport; - context->swapBuffers = swapBuffers; - context->status = status; - context->busy = busy; - context->idle = idle; - context->getBufferPtr = getBufferPtr; - context->renderBuffer = renderBuffer; - context->origin = origin; - context->ioCtl = ioCtl; - context->control = control; - context->wrapFIFO = wrapFIFO; - - context->gamma = gamma; - context->sliPciOwner = sliPciOwner; - - context->gammaRGB = gammargb; - context->initGammaTable = gammatable; - context->findVidTimingStruct = findvidtiming; -} -#else -/* I've got to stub this one to get the Voodoo Graphics glide to link */ -void vg96DriverInit( InitContext *context ) { - context->setVideo = NULL; - context->restoreVideo = NULL; - context->enableTransport = NULL; - context->disableTransport = NULL; - context->swapBuffers = NULL; - context->status = NULL; - context->busy = NULL; - context->idle = NULL; - context->getBufferPtr = NULL; - context->renderBuffer = NULL; - context->origin = NULL; - context->ioCtl = NULL; - context->control = NULL; - context->wrapFIFO = NULL; - - context->gamma = NULL; - context->sliPciOwner = NULL; - - context->gammaRGB = NULL; - context->initGammaTable = NULL; - context->findVidTimingStruct = NULL; - -} -#endif - - - diff --git a/glide2x/sst1/init/vgdrvr.c b/glide2x/sst1/init/vgdrvr.c deleted file mode 100644 index d832999..0000000 --- a/glide2x/sst1/init/vgdrvr.c +++ /dev/null @@ -1,201 +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 <3dfx.h> -#include -#include "init.h" -#include "fxinit.h" -#include -#include - -static FxBool setVideo( FxU32 hWnd, - GrScreenResolution_t sRes, - GrScreenRefresh_t vRefresh, - InitColorFormat_t cFormat, - InitOriginLocation_t yOrigin, - int nColBuffers, - int nAuxBuffers, - int *xres, - int *yres, - int *fbStride, - sst1VideoTimingStruct *vidTimings) { - FxBool rv; - static int _w[] = {320,320,400,512,640,640,640,640,800,960,856,512}; - static int _h[] = {200,240,256,384,200,350,400,480,600,720,480,256}; - - rv = sst1InitVideo( (FxU32*)context->info.hwDep.vgInfo.vgBaseAddr, - sRes, - vRefresh, - vidTimings ); - - if ( !rv ) goto BAIL; - - if ( context->info.hwDep.vgInfo.sliDetect ) { - rv = sst1InitRegisters((FxU32*)context->info.hwDep.vgInfo.slaveBaseAddr); - if ( !rv ) goto BAIL; - rv = sst1InitVideo( (FxU32*)context->info.hwDep.vgInfo.slaveBaseAddr, - sRes, - vRefresh, - vidTimings ); - if ( !rv ) goto BAIL; - rv = sst1InitSli( (FxU32*)context->info.hwDep.vgInfo.vgBaseAddr, - (FxU32*)context->info.hwDep.vgInfo.slaveBaseAddr ); - if ( !rv ) goto BAIL; - } - - if(vidTimings) { - *xres = vidTimings->xDimension; - *yres = vidTimings->yDimension; - } else { - *xres = _w[sRes]; - *yres = _h[sRes]; - } - *fbStride = 1024; /* 1024 always */ - -BAIL: - return rv; -} - -static void restoreVideo( void ) { - sst1InitShutdown( (FxU32*)context->info.hwDep.vgInfo.vgBaseAddr ); -} - -static FxBool enableTransport( InitFIFOData *info ) { - FxBool rv = FXFALSE; - sst1DeviceInfoStruct sstInfo; - - if ( info ) { - rv = sst1InitGetDeviceInfo( (FxU32*)context->info.hwDep.vgInfo.vgBaseAddr, - &sstInfo ); - info->hwDep.vgFIFOData.memFifoStatusLwm = sstInfo.memFifoStatusLwm; - } - - sst1InitCachingOn(); - - return rv; -} - -static void disableTransport( void ) { -} - -static InitSwapType_t swapBuffers( FxU32 code ) { - return INIT_SWAP_FLIP; -} - -static FxU32 status( void ) { - return sst1InitReturnStatus((FxU32 *) context->info.hwDep.vgInfo.vgBaseAddr); -} - -static FxBool busy(void) { - FxU32 stat = status(); - FxBool ret = (stat & SST_BUSY) ? FXTRUE : FXFALSE; - - return ret; -} - -static void idle( void ) { - sst1InitIdle((FxU32 *)context->info.hwDep.vgInfo.vgBaseAddr); -} - -static void *getBufferPtr( InitBuffer_t buffer, int *strideBytes ) { - return 0; -} - -static void renderBuffer( InitBuffer_t buffer ) { - return; -} - -static void origin( InitOriginLocation_t origin ) { - return; -} - -static void ioCtl( FxU32 token, void *argument ) { - return; -} - -static FxBool control( FxU32 code ) { - switch ( code ) { - case INIT_CONTROL_DEACTIVATE: - sst1InitVgaPassCtrl( (FxU32*)context->info.hwDep.vgInfo.vgBaseAddr, - FXTRUE ); - break; - case INIT_CONTROL_ACTIVATE: - sst1InitVgaPassCtrl( (FxU32*)context->info.hwDep.vgInfo.vgBaseAddr, - FXFALSE ); - break; - } - return FXTRUE; -} - -static FxBool wrapFIFO(InitFIFOData *fd) { - return FXTRUE; -} - -static void gamma( double gamma ) { - sst1InitGamma((FxU32 *) context->info.hwDep.vgInfo.vgBaseAddr, gamma); -} - -static void sliPciOwner( FxU32 *regbase, FxU32 owner ) { - sst1InitSliPciOwner(regbase, owner); -} - -static FxBool gammargb( double r, double g, double b ) { - return sst1InitGammaRGB((FxU32 *) context->info.hwDep.vgInfo.vgBaseAddr, r, g, b); -} - -static FxBool gammatable( FxU32 nentries, FxU32 *r, FxU32 *g, FxU32 *b ) { - return sst1InitGammaTable((FxU32 *) context->info.hwDep.vgInfo.vgBaseAddr, nentries, r, g, b); -} - -static sst1VideoTimingStruct *findvidtiming( GrScreenResolution_t sRes, GrScreenRefresh_t vRefresh) { - return sst1InitFindVideoTimingStruct(sRes, vRefresh); -} - -void vgDriverInit( InitContext *context ) { - context->setVideo = setVideo; - context->restoreVideo = restoreVideo; - context->enableTransport = enableTransport; - context->disableTransport = disableTransport; - context->swapBuffers = swapBuffers; - context->status = status; - context->busy = busy; - context->idle = idle; - context->getBufferPtr = getBufferPtr; - context->renderBuffer = renderBuffer; - context->origin = origin; - context->ioCtl = ioCtl; - context->control = control; - context->wrapFIFO = wrapFIFO; - - - context->gamma = gamma; - context->sliPciOwner = sliPciOwner; - - context->gammaRGB = gammargb; - context->initGammaTable = gammatable; - context->findVidTimingStruct = findvidtiming; - -} - diff --git a/glide2x/sst1/lib/makefile.linux b/glide2x/sst1/lib/makefile.linux deleted file mode 100644 index 728178d..0000000 --- a/glide2x/sst1/lib/makefile.linux +++ /dev/null @@ -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 = $(wildcard *.a *.so) - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak diff --git a/glide2x/sst1/lib/makefile.sun b/glide2x/sst1/lib/makefile.sun deleted file mode 100644 index 4df48c1..0000000 --- a/glide2x/sst1/lib/makefile.sun +++ /dev/null @@ -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 = *.a - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak diff --git a/glide2x/sst1/lib/makefile.unix b/glide2x/sst1/lib/makefile.unix deleted file mode 100644 index 728178d..0000000 --- a/glide2x/sst1/lib/makefile.unix +++ /dev/null @@ -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 = $(wildcard *.a *.so) - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak diff --git a/glide2x/sst1/libsrc/makefile.linux b/glide2x/sst1/libsrc/makefile.linux deleted file mode 100644 index e6e0607..0000000 --- a/glide2x/sst1/libsrc/makefile.linux +++ /dev/null @@ -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$ -# - -INSTALL_DESTINATION=$(BUILD_ROOT_HW) - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak diff --git a/glide2x/sst1/libsrc/makefile.unix b/glide2x/sst1/libsrc/makefile.unix deleted file mode 100644 index 5c6417d..0000000 --- a/glide2x/sst1/libsrc/makefile.unix +++ /dev/null @@ -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$ -# - -INSTALL_DESTINATION=$(BUILD_ROOT_SST1) - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak diff --git a/glide2x/sst1/makefile.linux b/glide2x/sst1/makefile.linux deleted file mode 100644 index 10eb27a..0000000 --- a/glide2x/sst1/makefile.linux +++ /dev/null @@ -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 = sst1 -SUBDIRS = incsrc libsrc binsrc include bin lib init glide cmd - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak diff --git a/glide2x/sst1/makefile.unix b/glide2x/sst1/makefile.unix deleted file mode 100644 index 10eb27a..0000000 --- a/glide2x/sst1/makefile.unix +++ /dev/null @@ -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 = sst1 -SUBDIRS = incsrc libsrc binsrc include bin lib init glide cmd - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak